Hoy vamos con una entrada algo más técnica. El otro día nos surgió una cuestión con un mantenimiento en una tienda online: Necesitaban que los gastos de envío gratuitos a partir de x euros hicieran distinción por zona. Pero esto PrestaShop no lo permite de manera nativa. Sí que permite, desde preferencias del transporte, especificar los gastos de envío gratuitos a partir de x euros, pero esta configuración se aplica a todas las zonas de la tienda.

Pues para solucionarlo, hoy os contamos las 3 alternativas que valoramos y por la que finalmente optamos.
1. Cupones de descuento
La primera opción fue crear cupones de descuento (reglas de carrito) cuya acción fuese Envío gratuito. Entonces, en las condiciones de cada cupón, establecíamos unas limitaciones:
- Que la compra tuviera un valor mínimo con el envío excluido.
- Limitamos la validez de cada cupón a un país y transportista concreto.
Finalmente dejamos el cupón como resaltado, así el cliente a la hora de realizar su pedido, podía incluir el cupón en su carrito y, si este cumplía las condiciones, los gastos de envío eran gratis.
Esta primera opción fue descartada principalmente por dos razones:
- Requería una interacción del cliente, por lo tanto, no nos servía. Necesitábamos que el transporte gratuito se aplicará de manera automática según las condiciones del carrito.
- Prestashop sigue arrastrando problemas con este tipo de cupones y pedidos con varios tipos de IVA y crea desajustes en las facturas.
2. Sobrescribir el funcionamiento nativo de Prestashop
La segunda opción fue realizar un override al método getPackageShippingCost de la clase Cart.php.
Aproximadamente sobre la linea 3539 existe el siguiente condicional:
if (isset($configuration['PS_SHIPPING_FREE_PRICE'])) { $free_fees_price = Tools::convertPrice((float) $configuration['PS_SHIPPING_FREE_PRICE'], Currency::getCurrencyInstance((int) $this->id_currency)); }
Lo que tiene que hacer el override es cambiar de manera manual el valor de PS_SHIPPING_FREE_PRICE si se cumplen una serie de condiciones. En este punto de la función ya tenemos una variable que almacena la zona asociada al carrito: $id_zone.
Por lo tanto podemos crear nuestros condicionales previos, para alterar el valor de PS_SHIPPING_FREE_PRICE si cumple con los requerimientos que necesitamos.
En el siguiente ejemplo utilizamos un array con zonas, donde a la zona 65 indicamos que no tiene gastos de envío gratuitos, pero a la zona 66 indicamos que tiene gastos de envió gratuitos a partir de 200€.
$zonas = array( '65' => 0, '66' => 200, ); $configuration['PS_SHIPPING_FREE_PRICE'] = $zonas[$id_zone]; // Free fees $free_fees_price = 0; if (isset($configuration['PS_SHIPPING_FREE_PRICE'])) { $free_fees_price = Tools::convertPrice((float) $configuration['PS_SHIPPING_FREE_PRICE'], Currency::getCurrencyInstance((int) $this->id_currency)); }
Finalmente nos decantamos por esta opción, ya que nos permitía un control total sobre el proceso y el código utilizado era nuestro. De manera adicional, reutilizamos otro desarrollo que teníamos y añadimos una zona en el gestor de Prestashop para que el cliente pudiera gestionar esto de manera autónoma.
3. Compra de un módulo
Si te parece un lío todo esto de un override, cupones de descuento, etc. siempre puedes contar con un módulo desarrollado por terceros que cumpla con estos requisitos.
En PrestaShop Addons hemos visto que hay varios módulos que cumplen con esta funcionalidad, pero desde Tiendaprest os recomendamos un par de ellos:
- Módulo Envío Gratis por Zona, Transportista, Peso y Precio de Línea Gráfica. Válido desde la versión 1.5 a 1.7 de Prestashop.
- Gestor de envío gratuito por zonas para PrestaShop: Un aporte gratuito de nuestros colegas de Prestarmarketing. La única pega es que solo es para versiones 1.5 y 1.6
Esperamos que este aporte os sea de utilidad
Con esto y más ¡tu tienda online siempre preparada!