Problema de descuento poco conocido en Magento y cómo solucionarlo

Hola, mi nombre es Pavel y la mayor parte de mi trabajo con Magento está relacionado con los descuentos. ¡Parece una confesión! Puedo decir que sé mucho sobre ellos, pero nuestros clientes sofisticados nunca me dejan descansar y hacer más y más preguntas sobre este tema.

Hace un par de días me encontré con un problema con los descuentos en Magento, y hoy quería explicarles este problema, dando también consejos para solucionarlo rápido.

Cómo encontramos el problema

De repente, nos enfrentamos a un comportamiento bastante inesperado de la extensión Amasty Special Promotions Pro, que también causó problemas para agregar elementos promocionales automáticamente . En resumen, los descuentos se calcularon todos mal.

Dado que estas dos extensiones son muy confiables y todas nuestras actualizaciones se prueban cuidadosamente, me preocupé mucho por el problema y comencé a investigar de inmediato.

Descubrí que no es un problema de compatibilidad, ya que el problema se reprodujo en una instalación local limpia de Magento 1.9.2.1 con solo dos extensiones de Amasty.

Más tarde se supo que el problema se esconde dentro de la lógica de Magento y, de hecho, puede estropear cualquier extensión que funcione con descuento.

El resumen del problema

Para mostrar un descuento, Magento utiliza un ciclo, que recorre todos los artículos del carrito y aplica todas las reglas de descuento a todos y cada uno de los artículos.

Elementos diferentes inician reglas para cada producto, mientras que varias piezas del mismo producto inician la colección de reglas solo una vez.

El problema estaba oculto en el campo «Se aplica el descuento por cantidad máxima» . Aquí hay un ejemplo simple.

Queremos ofrecer un 50 % de descuento en todos los artículos, además de un cupón del 10 % para dos artículos también. El cliente compró 10 cervezas, $10 por cerveza, $100 en total.

Hagamos algunos cálculos: el 50% de $100 es $50, el 10% para dos artículos ($5+$5)*10%=$1. Recuerde que una cerveza no cuesta $10, sino $5, porque ya hemos reducido el precio.

Ahora, calculamos el descuento total, que es de $51 . Veamos el número que calcula Magento.

que esta pasando en la realidad

Datos de entrada:

La primera regla: 50% de descuento para todo el carrito

La segunda regla: 10 % de descuento en el carrito y se aplica el descuento por cantidad máxima = 2

Magento calcula los descuentos con la siguiente fórmula:

[php]$ImporteDescuento = ($cantidad * $precioArtículo – $artículo->obtenerImporteDescuento() ) * $_rulePct;[/php]

En este caso, la cantidad es la cantidad de productos, si no está restringida por el campo «Se aplica el descuento por cantidad máxima» , de lo contrario, es el valor del campo «Se aplica el descuento por cantidad máxima» .

$item->getDiscountAmount() es el descuento, que ya se ha aplicado al producto.

Así es como lo calcula Magento:

La primera regla: ($10*10 – 0) * 50% = $50

La segunda regla: ($10*2 – 50$) * 10% = -$3

En esta situación Magento intenta tener en cuenta el descuento aplicado, pero su algoritmo tiene un problema grave al contar los descuentos aplicados para varias piezas de un producto, y de repente obtenemos un descuento de -$3 al aplicar la segunda regla.

Y el descuento total parece ser de $47. Sí, tienes razón, es incluso menos del 50% de descuento. Lo cual es, por supuesto, totalmente erróneo.

Pero eso no es todo. Si bajamos un poco, veremos una verificación de descuento, que se realiza para garantizar que la tienda no ofrezca un descuento superior al precio del artículo.

[php]$ImporteDescuento = min($artículoImporteDescuento + $ImporteDescuento, $precioArtículo * $cantidad);[/php]

Pero recordamos que $qty estaba restringido por “Se aplica descuento por cantidad máxima” , y su valor es 2 en este caso.

Por lo tanto, tenemos lo siguiente cuando se aplica la segunda regla.

$cantidaddescuento = min( 50 + (-3), 10*2)

La respuesta es $20. ¡Tada!

Dónde puedes encontrar este problema

Parece que este error tiene al menos cinco años, la primera versión que verifiqué fue la versión 1.4.0.1, agregada el 19 de febrero de 2010. Parece funcionar bien en las versiones anteriores.

Además, este error se puede reproducir en la versión Magento 2 (a partir del 23 de octubre de 2015).

La solución temporal del problema.

Para solucionar este problema, asegúrese de que todas las reglas con el campo «Cantidad máxima de descuento aplicada a» , diferente de cero, se apliquen desde el principio, use el campo Prioridad para eso.

Si tiene alguna pregunta sobre este tema, estaré encantado de discutirla en los comentarios.