Productos sin IVA y PHP7

Recientemente hemos realizado un proyecto de un ecommerce con la peculiaridad de que los precios de los productos se debían de cargar sin IVA, lo que es muy común puesto que es así como los proveedores suelen enviarlos, pero en el frontend debían aparecer con los impuestos añadidos.

Esto no supone ningún problema, ya que Magento permite hacer esto por configuración desde  Sistema > Configuración > Ventas > Impuestos, para que Magento muestre correctamente los precios en el catálogo, carrito y checkout.

 

Nuestra sorpresa fue, cuando vimos que los precios no se mostraban correctamente en el resumen del carrito y del checkout.

 

Vamos a poner un ejemplo, si añadíamos un producto al carrito con un precio de 100 €, este aparecía correctamente en el listado del carrito con un precio de 121 €. Pero el total del carrito mostraba 100 €.

Comprobamos mil y una veces que la configuración de los impuestos era la correcta, además de compararla con otros desarrollos ya terminados que fucionan correctamente.

En PHP 7 el orden de los totales no era el correcto

Tras mucho indagar y perder horas debugeando el cálculo del total en el carrito, vimos que el órden en el cual se estaban calculando los totales de Magento no era el correcto.

[0] => nominal
[1] => subtotal
[2] => freeshipping
[3] => shipping
[4] => grand_total
[5] => msrp
[6] => tax_subtotal
[7] => weee
[8] => tax_shipping
[9] => discount
[10] => i4mrwes_cashondelivery_surcharge
[11] => phoenix_cashondelivery
[12] => tax
[13] => phoenix_cashondelivery_tax
[14] => sequra_sequrapayment

Como podemos ver, el cálculo del los impuestos se realizaba después de haber calculado el grand_total. Aparte de que muchos otros de los totales tampoco se estaban calculando cuando deberían. Este sería el orden correcto para calcular los totales.

[0] => nominal
[1] => subtotal
[2] => freeshipping
[3] => weee
[4] => tax_subtotal
[5] => tax_shipping
[6] => i4mrwes_cashondelivery_surcharge
[7] => discount
[8] => phoenix_cashondelivery
[9] => shipping
[10] => tax
[11] => sequra_sequrapayment
[12] => phoenix_cashondelivery_tax
[13] => grand_total
[14] => msrp

Tras realizar este descubrimiento decidimos buscar más información sobre por qué ocurría esto en la última versión de Magento, la 1.9.3.1.

Descubrimos que si los precios que introducimos en la administración no incluyen impuestos, pero configuramos la tienda para que se muestre todo con impuestos incluidos y estamos ejecutando Magento sobre PHP7 ocurre este fallo. Inmediatamente probamos con PHP 5.6.29 y todo funcionaba perfectamente.

Se podría crear un módulo para solucionar este error, indicando en el archivo etc/config.xml el órden en el cuál se deberían de calcular los totales. Pero esta solución no serviría para cualquier tienda. Ya que cada una tiene unos métodos de pago y de envío personalizados. Por otra parte si se decidiera modificar el proceso de checkout añadiendo otros pagos o envíos, tambíen se tendría que revisar esta solución, por que sería muy probable que causara más errores.

La solución más recomendada en estos casos es, volver a la última versión de PHP 5 estable, la 5.6.29. Aunque perdamos un poco de rendimiento.

Opt In Image
Suscríbete al boletín
Convierte tu tienda online en un negocio rentable.

Si te ha gustado lo que has leído suscríbete y recibirás en tu correo más trucos e ideas para sacarle el máximo provecho a tu tienda online.

Author:

CTO de Magestio Ecommerce