Envío gratuito en PrestaShop dependiendo de la zona

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.

Configuración de gastos de envío gratuitos a partir de cierta cantidad en Prestashop

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:

  1. Que la compra tuviera un valor mínimo con el envío excluido.
  2. 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:

  1. 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.
  2. 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:

Esperamos que este aporte os sea de utilidad

Con esto y más ¡tu tienda online siempre preparada!

Te puede interesar

¿Necesitas ayuda más avanzada para solucionar tus problemas?

Contáctanos o echa un vistazo a nuestros servicios, entre los cuales podrás encontrar varios planes de mantenimiento de Prestahop.

Nuestros servicios

Impulsa la venta online y haz crecer tu negocio en poco tiempo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *