Una persona ingresa $10, pero se le descuentan $9.87. No hay ningún problema. El carrito funciona exactamente como fue diseñado. La razón se encuentra en un nivel inferior a la pantalla.
¿Cómo funciona el proceso de pago de PrestaShop? Las preguntas suelen tener la misma respuesta: qué se ejecuta y cuál es su prioridad. Una vez que lo entiendas, los totales que parecían erróneos resultarán ser predecibles. A continuación, se describe el flujo del proceso de pago de PrestaShop desde el carrito hasta el pedido, utilizando el código que se envía en lugar de lo que sugiere la pantalla de configuración.
1.0 Qué sucede internamente durante el proceso de pago de PrestaShop
Al solicitar el total de un carrito, PrestaShop delega la tarea a una clase de calculadora. No se utiliza una sola fórmula. Son tres pasadas distintas, siempre en el mismo orden, cada una basándose en la anterior.

Primero las filas, luego las tarifas, luego los descuentos. Reorganizarlas no es una opción.
Primero se especifican las filas. Cada línea tiene su propio precio, cantidad y tasa impositiva, detalles que explican la mayor parte de lo que sigue. En segundo lugar, se aplican los gastos de envío y envoltura para regalo, calculados y separados de los productos para que un cupón cubra uno sin afectar al otro. Los descuentos se aplican al final.
Esa tercera posición es importante. Resuelve la mayoría de los problemas de cálculo del carrito de PrestaShop , ya que un cupón nunca afecta a los precios originales. Se aplica a cualquier configuración de las filas, incluidos los códigos de cupón aplicados previamente.
2.0 ¿Cómo calcula PrestaShop el total del carrito?
El total no es una cifra que la tienda guarde en algún lugar. Se calcula al momento de la compra, y el cliente indica qué partes desea: solo productos, solo descuentos, todo o todo excepto el envío.
Vale la pena saberlo, porque las piezas no siempre coinciden como se espera. Tomemos como ejemplo el umbral de envío gratuito. Se solicita el total sin incluir el envío, pero con los descuentos ya aplicados. Si se formula una pregunta diferente, se obtendrá una respuesta diferente. Ambas son correctas.
Por lo tanto, una cifra en pantalla puede no coincidir con la de un informe. Ninguna es incorrecta. Simplemente pueden estar solicitando diferentes partes del mismo carrito, así que verifique cuál es cuál antes de asumir que algo está averiado.
3.0 ¿Cómo funcionan las reglas del carrito en PrestaShop?
Las reglas del carrito de PrestaShop incluyen tanto el cupón que introduce el cliente como los descuentos automáticos que se aplican sin código. En el panel de administración, ambos son el mismo objeto. Por eso comparten una pantalla en el panel de administración y una única ruta a través del código.
Las reglas se aplican una a una, ordenadas por prioridad, de menor a mayor. La prioridad es un número que se asigna a la regla. Su función va más allá de ordenarlas: cuando dos reglas no se pueden combinar, la prioridad determina cuál prevalece.

Cada regla considera el carrito tal como lo dejó la regla anterior. Por lo tanto, dos cupones del 10 % en un carrito de 100 no descuentan 20. El primero descuenta 10. El segundo descuenta el 10 % de los 90 restantes, y el cliente ahorra 19. Comportamiento estándar, no un error de redondeo.
Las condiciones son las que la mayoría de los comerciantes ya conocen: rangos de fechas, importe mínimo, límites por cliente y exclusiones por país, grupo, empresa de transporte o producto. La documentación de las reglas del carrito de PrestaShop detalla cada campo, por lo que no tiene sentido volver a escribirlas.
4.0 ¿Cómo se aplican los cupones en PrestaShop?
Aquí es donde el sistema de cupones de PrestaShop se vuelve interesante. También es de donde proviene ese 9.87. Los descuentos porcentuales y los descuentos de importe fijo se gestionan de forma bastante diferente, y la diferencia no es meramente estética.

Un porcentaje es sencillo. Cada fila pierde ese porcentaje, así que un cupón del 10 % descuenta el 10 % del libro y el 10 % de los auriculares. Cada línea mantiene su propio porcentaje de descuento automáticamente.
Un importe fijo no funciona así, porque primero el carrito tiene que decidir de qué artículos se aplicará el descuento. PrestaShop lo distribuye proporcionalmente: cada artículo recibe una parte del descuento que corresponde a su porcentaje del carrito.

El 10 se divide según la contribución de cada línea, no de manera uniforme entre las líneas.
Ese es el núcleo del cálculo de descuentos en cupones de PrestaShop. Tiene una consecuencia importante que conviene conocer. Cada fila conserva su propio tipo impositivo, por lo que el impuesto descontado depende de los productos a los que se aplique el descuento. Si se mueve el mismo cupón de 10 a un carrito con diferente ponderación, el total de impuestos cambia, aunque el cliente haya ahorrado exactamente la misma cantidad.
Aquí también importa un segundo aspecto. ¿El importe del cupón incluye o excluye impuestos? Este indicador determina a partir de qué cifra se calculan las participaciones, de modo que, en un caso, el 10 se deduce de los precios con impuestos incluidos, y en el otro, se deduce antes de impuestos, por lo que el ahorro que percibe el cliente es ligeramente diferente.

5.0 ¿Cómo calcula PrestaShop los impuestos al finalizar la compra?
El cálculo de impuestos de PrestaShop se realiza por artículo, no sobre el carrito completo. Cada producto tiene un grupo de reglas de impuestos; dicho grupo determina una tasa impositiva para la dirección de entrega, y el artículo se grava según esa tasa.

Por lo tanto, un carrito de compra se compone de varias pequeñas cantidades de impuestos sumadas. Ningún sistema calcula el impuesto total de un solo pago. Por eso, el desglose de impuestos en una factura puede ocupar varias líneas, incluso para un pedido pequeño, y por eso esas líneas rara vez se dividen de forma equitativa.
El envío se grava por separado. Se aplica la normativa fiscal del transportista, no la de los productos, lo que suele generar sorpresas desagradables en los carritos de compra donde los productos están exentos de impuestos, pero el envío no.
6.0 ¿Por qué PrestaShop calcula un total de carrito diferente?
¿Dos totales difieren por un céntimo? La causa habitual es el redondeo, y PrestaShop te ofrece tres maneras de hacerlo.

Los mismos tres artículos obtienen dos totales diferentes dependiendo de una configuración.
Los precios se almacenan internamente con seis decimales. Por lo tanto, la única pregunta es dónde se produce el redondeo. Si se redondea cada artículo, el precio unitario se redondea antes de cualquier multiplicación. Si se redondea cada línea, se mantiene la precisión completa hasta que se totaliza la línea. Si se redondea el total, no se redondea nada hasta el final.
Ninguna de las tres opciones es incorrecta. Simplemente no coinciden. Redondear por línea es la recomendación habitual para las tiendas que necesitan que las facturas sumen exactamente, ya que mantiene la coherencia interna de cada línea y, al mismo tiempo, permite que la suma sea correcta. Las notas de cálculo de precios de PrestaShop explican el razonamiento con mayor detalle.
Antes de culpar al redondeo, descartemos las explicaciones más sencillas. Un total que cambia al cambiar la dirección se debe a impuestos, no a redondeo. Si cambia al añadir un cupón, es porque el cálculo del pedido de PrestaShop funciona correctamente. Las diferencias por redondeo son mínimas. Cualquier diferencia mayor tiene otra causa.
7.0 ¿Cómo calcula PrestaShop los descuentos y los impuestos conjuntamente?
En resumen: los descuentos se aplican después de que se haya calculado el impuesto por fila, y un descuento reduce tanto la fila como su impuesto proporcionalmente.
Ese orden es lo que hace que la lógica de pago de PrestaShop sea predecible. El impuesto nunca se recalcula desde cero después de un descuento. Cada fila ya conoce su tasa, por lo que al eliminar una parte de la fila, se elimina también la parte correspondiente del impuesto.
También responde a una pregunta frecuente. ¿Por qué el total de impuestos en un pedido con cupones no es simplemente la tasa impositiva aplicada al total con descuento? Porque es la suma de los importes que conservaban las filas, y esas filas comenzaron con porcentajes diferentes.
8.0 Creación de un módulo que ofrece un descuento
Tarde o temprano, alguien pedirá un descuento que PrestaShop no puede ofrecer por sí solo. Por ejemplo, si gastas una cantidad determinada, recibirás un producto gratis. Un programa de fidelización. Algo vinculado a un valor que la tienda no registra. La tentación es calcular el total manualmente y restarlo en algún lugar conveniente.
Resiste esa tentación. Un descuento aplicado fuera del sistema de reglas del carrito es invisible para cualquier sistema que lea el carrito. El resumen del pedido no lo detectará, la factura no lo mostrará y el desglose de impuestos será incorrecto, ya que los impuestos se calculan por fila y la deducción nunca afectó a las filas.
Crea una regla de carrito real. Tu módulo decide cuándo se aplica y cuál es su valor, y luego transfiere el descuento a PrestaShop como una regla válida. Todo lo demás funciona sin necesidad de ayuda adicional: el resumen, la factura, el impuesto por fila, la prioridad de ordenación frente a otros cupones.
El módulo aún necesita responder una pregunta que el núcleo no puede: ¿esta regla sigue vigente? Una regla creada por tu módulo debería dejar de aplicarse en el momento en que se desactive el módulo. PrestaShop no lo sabe, porque, para ellos, la regla es simplemente una fila más en la tabla.
9.0 Anular checkValidity de forma segura
El gancho para esto es CartRule::checkValidity() . PrestaShop lo llama cuando se agrega un cupón y nuevamente desde autoRemoveFromCart() en carritos que ya contienen reglas. Esta segunda llamada es la útil: si devuelve un error, la regla se elimina automáticamente del carrito.
Por lo tanto, la anulación es sencilla. Comprueba si la regla pertenece a tu módulo, comprueba si tu módulo está habilitado y, si no lo está, indícalo. Todo lo demás se aplica directamente al módulo padre.
Hay tres cosas que importan en cómo lo escribes.
Llama al padre en todos los demás casos. Una anulación que responde por sí misma, en lugar de delegar, descarta silenciosamente todas las comprobaciones que realiza PrestaShop: fechas, límites de cantidad, importes mínimos, restricciones de país y transportista. Es fácil olvidarlas y su pérdida resulta costosa.
Actúa únicamente según tus propias reglas. Identifícalas mediante algo permanente, como un prefijo de código propio de tu módulo o un registro en tu tabla. Una anulación que se aplique a todas las reglas del sistema supone un riesgo generalizado que se asume en nombre de un solo módulo.
Respeta la bandera alreadyInCart. PrestaShop omite deliberadamente las comprobaciones de vigencia y fecha para las reglas ya aplicadas, por lo que un cupón que era válido cuando el cliente lo usó no desaparece durante el proceso de compra. Tu comprobación es diferente: un módulo deshabilitado debería eliminar la regla incluso de un carrito que ya la tenga, que es precisamente para lo que sirve el pase de eliminación automática.
Asegúrate también de que el valor devuelto sea correcto. El método devuelve `false` cuando una regla es válida y un mensaje cuando no lo es. Si devuelves algo incorrecto, quienes llamen interpretarán tu rechazo como una aprobación.
10.0 Limpieza y la advertencia de anulación
Deshabilitar el módulo también debería impedir la creación de reglas. La anulación gestiona los casos en curso; el módulo en sí debería dejar de generar nuevas reglas mientras está desactivado, y al desinstalarlo debería desactivar o eliminar las que creó, en lugar de dejarlas para que la siguiente persona tenga que descifrarlas.
Una advertencia importante: solo una clase puede estar activa a la vez, por lo que dos módulos que sobrescriban CartRule entrarán en conflicto, y el segundo en instalarse generalmente pierde. Si su descuento se puede expresar mediante condiciones que el núcleo ya admite, utilice esas condiciones y omita la sobrescritura por completo. Recurra a ella solo cuando la regla dependa de algo que PrestaShop realmente no puede ver.
11.0 ¿Qué cambió entre PrestaShop 1.7 y 9?
Es útil saberlo si estás siguiendo una guía antigua o leyendo respuestas de foros escritas hace años. Parte de la información sigue vigente, pero otra parte ya no.
La calculadora descrita anteriormente se introdujo en la versión 1.7, y el orden de tres pasadas no ha cambiado desde entonces. Al comparar directamente el código de las versiones 8.2 y 9, la secuencia es idéntica. Las reglas se siguen aplicando en orden de prioridad. Los descuentos por importe se siguen distribuyendo proporcionalmente. Los tres modos de redondeo siguen funcionando como siempre.
Lo que ha cambiado es la interfaz. PrestaShop 9 continúa migrando las páginas del panel de administración a Symfony, por lo que las pantallas se han rediseñado y algunos campos se encuentran en una ubicación diferente a la habitual. Las rutas del menú para los descuentos permanecen sin cambios. Sin embargo, una captura de pantalla de un tutorial de la versión 1.7 no coincidirá con lo que ves en tu pantalla: los consejos sobre los cálculos siguen siendo válidos, pero los consejos sobre dónde hacer clic podrían no serlo.
12.0 Averiguar por qué un total parece incorrecto
Aquí tienes una breve guía para comprobar que todo esté correcto. Cada paso descarta los siguientes, lo que evita tener que buscar una configuración de redondeo cuando la respuesta es un descuento automático que nadie recordaba.
Comencemos con las reglas del carrito de compras. ¿Cuáles se aplicaron y en qué orden de prioridad? La respuesta más común a esta pregunta es que alguien olvidó que una regla era automática.
Luego, verifique si el cupón es un porcentaje o un importe fijo. Si es un importe fijo, compruebe si incluye o excluye impuestos. Este indicador por sí solo explica muchos de los informes que indican que el descuento es ligeramente incorrecto.
A continuación, fíjate en los tipos impositivos de cada producto individualmente, en lugar de en el total del carrito. Es perfectamente normal que haya tipos impositivos diferentes en un mismo carrito. Simplemente, esto hace que los cálculos parezcan más extraños de lo que son.
Solo entonces considere el redondeo. Y solo si la diferencia es de uno o dos centavos, ya que una diferencia mayor indica que hay algún otro problema. Verifique el modo de redondeo en su configuración y compárelo con el total esperado de la factura.
13.0 La versión corta
El proceso de pago de PrestaShop es más predecible de lo que parece. Primero se calculan los precios y se aplican los impuestos. Después se aplican las comisiones, luego los descuentos, y cada descuento se aplica sobre el saldo restante del anterior.
Los comprobantes de importe fijo se distribuyen entre las líneas según su peso, de modo que cada línea conserva su propio tipo impositivo. Los porcentajes son más sencillos y se aplican directamente a cada fila. Y cuando dos totales difieren en un céntimo, suele deberse a la configuración de redondeo y no a un error.
Gracias por leer.
Si tiene preguntas o necesita ayuda con el rendimiento o la migración de su sitio web, nuestros expertos están aquí para ayudarle. Póngase en contacto con el equipo de Knowband en [email protected] hoy mismo para obtener plugins de comercio electrónico fiables y adaptados a sus necesidades.
