Una funcionalidad muy potente de Prestashop son las denominadas Reglas de Descuento (Cart Rules en inglés).
Estas nos permiten definir descuentos o cupones y configurar el número de veces que se puede utilizar, las fechas de validez e incluso si solamente son aplicables a un cliente en concreto.
Los códigos de cupón se pueden emplear en el proceso de pago del carrito. Habitualmente tenemos un apartado en el mismo que nos permite introducir el código de cupón para incorporar el descuento a nuestra compra.
El comportamiento por defecto de Prestashop consiste en permitir añadir más de un código de descuento a la compra. Si bien no es un mal sistema si no tenemos cuidado podemos llegar a perder dinero ofreciendo descuentos que reduzcan el preció de los artículos que vendamos por debajo de nuestro margen de beneficio.
Desde la configuración de las condiciones para aplicar el descuento podemos controlar este comportamiento marcando la opción Compatibilidad con otras reglas de compra pero no es muy intuitivo.
Al marcar la opción aparecen dos listas para seleccionar cuales de los otros descuentos son compatibles y combinables con el descuento que estamos creando.
Como vemos por defecto todas las reglas son combinables. Si quisiéramos crear un cupón que no se pudiera combinar con ningún otro deberíamos marcar todos los descuentos de Reglas de compra combinables y pulsar en Borrar.
Dejando de lado el arduo trabajo que debemos hacer cada vez que creamos un cupón de este tipo queda el problema que cada vez que generamos un cupón nuevo debemos editar todos los otros que no queremos que sean compatibles para añadirlo.
En nuestro caso, el cliente no quería que ningún cupón fuese nunca compatible con ningún otro.
Como ya aprendimos en el post para evitar crear pedidos múltiples para una sola compra nos tocará modificar las clases de Prestashop mediante los overrides e implementar la funcionalidad que deseamos.
Esta vez el objetivo pasa por modificar la función checkValidity() de la clase CartRule.php
[php]
public function checkValidity(Context $context, $alreadyInCart = false, $display_error = true)
{
$value = parent::checkValidity($context, $alreadyInCart, $display_error );
$error = false;
if ( $display_error && !is_null($value) ) { $error = true; }
if ( !$display_error && $value === false ) { $error = true; }
if ( !$error )
{
$otherCartRules = $context->cart->getCartRules();
if (count($otherCartRules))
foreach ($otherCartRules as $otherCartRule)
{
if ($otherCartRule[‘id_cart_rule’] == $this->id && !$alreadyInCart)
return (!$display_error) ? false : Tools::displayError(‘This voucher is already in your cart’);
if ($otherCartRule[‘id_cart_rule’] != $this->id)
{
$cart_rule = new CartRule((int)$otherCartRule[‘id_cart_rule’], $context->cart->id_lang);
return (!$display_error) ? false : Tools::displayError(‘This voucher is not combinable with an other voucher already in your cart:’);
}
}
}
return $value;
}
[/php]
Primero de todo llamamos a la función original de Prestashop para que haga todas las comprobaciones actuales y si no da error entonces ejecutamos nuestra propia regla. En caso de encontrar cupones de descuento simplemente mostramos el mensaje de que el cupón no es combinable con ninguno más.
Si necesitáramos tener cupones combinables y cupones sin combinar deberíamos ampliar esta comprobación para adaptarla a esa necesidad concreta, pero esto ya formará parte de otra entrada en el futuro.
Leave a Reply