4webs

Bug en cupones descuento en Prestashop 1.5.5 y 1.5.6

Estábamos esperando a ver si Prestashop corrigía el error en la nueva versión de Prestashop 1.5.6 ,pero no ha sido así… La versión 1.5.5 y 1.5.6 de Prestashop tienen un bug en el carrito de la compra en donde los usuarios solo pueden agregar un único cupón de descuento (VOUCHER) por pedido, por lo que nuestros clientes no podrán combinarlos entre sí y no podrán hacer varias reglas de descuento.

Para solucionar este problema habrá que modificar unas línea de código en el archivo cart.php de la carpeta classes, es recomendable sobre escribir la función con Override, por si en algún momento actualizamos la versión de Prestashop podamos actualizarla.

La línea que pone getValue se encarga de comprobar si hay algún cupón aplicado y en el caso que exista se sale de la función.

  • public function addCartRule($id_cart_rule){
    // You can’t add a cart rule that does not exist
    $cartRule = new CartRule($id_cart_rule, Context::getContext()->language->id);
    if (!Validate::isLoadedObject($cartRule))
    return false;if (Db::getInstance()->getValue(‘SELECT id_cart_rule FROM ‘._DB_PREFIX_.’cart_cart_rule WHERE id_cart = ‘.(int)$this->id))
    return false;// Add the cart rule to the cartif (!Db::getInstance()->insert(‘cart_cart_rule’, array(
    ‘id_cart_rule’ => (int)$id_cart_rule,
    ‘id_cart’ => (int)$this->id
    )))
    return false;Cache::clean(‘Cart::getCartRules’.$this->id.’-‘.CartRule::FILTER_ACTION_ALL);
    Cache::clean(‘Cart::getCartRules’.$this->id.’-‘.CartRule::FILTER_ACTION_SHIPPING);
    Cache::clean(‘Cart::getCartRules’.$this->id.’-‘.CartRule::FILTER_ACTION_REDUCTION);
    Cache::clean(‘Cart::getCartRules’.$this->id.’-‘.CartRule::FILTER_ACTION_GIFT);if ((int)$cartRule->gift_product)
    $this->updateQty(1, $cartRule->gift_product, $cartRule->gift_product_attribute, false, ‘up’, 0, null, false);
    return true;

    }

Habría que sustituirlo por el siguiente código:

  • public function addCartRule($id_cart_rule)
    {
    // You can’t add a cart rule that does not exist
    $cartRule = new CartRule($id_cart_rule, Context::getContext()->language->id);
    if (!Validate::isLoadedObject($cartRule))
    return false;// Add the cart rule to the cart
    if (!Db::getInstance()->insert(‘cart_cart_rule’, array(
    ‘id_cart_rule’ => (int)$id_cart_rule,
    ‘id_cart’ => (int)$this->id
    )))
    return false;Cache::clean(‘Cart::getCartRules’.$this->id.’-‘.CartRule::FILTER_ACTION_ALL);
    Cache::clean(‘Cart::getCartRules’.$this->id.’-‘.CartRule::FILTER_ACTION_SHIPPING);
    Cache::clean(‘Cart::getCartRules’.$this->id.’-‘.CartRule::FILTER_ACTION_REDUCTION);
    Cache::clean(‘Cart::getCartRules’.$this->id.’-‘.CartRule::FILTER_ACTION_GIFT);if ((int)$cartRule->gift_product)
    $this->updateQty(1, $cartRule->gift_product, $cartRule->gift_product_attribute, false, ‘up’, 0, null, false);return true;
    }

Como podéis ver lo que hemos hecho ha sido eliminar la línea de getValue para que compruebe todas las reglas que existen en el carrito, mientras las condiciones de los cupones se mantengan seguirá buscando nuevo cupones o combinándolos.