Bien gérer des règles de paniers est essentiel pour une boutique e-commerce. PrestaShop le fait grâce aux règles de paniers. Cependant, quand on possède un catalogue important avec de multiples règles, on peut décider de n'en rendre aucune cumulable. Et par défaut, ça coince...

La solution e-commerce PrestaShop offre la possibilité de déterminer des règles de panier. Cette fonctionnalité permet entre autres de créer des codes de réduction qui offrent des avantages aux clients ou encore l’ajout de produits cadeaux automatiques dans le panier. Très largement utilisée par les e-commerçants, PrestaShop propose également de rendre cumulables ou non, des règles de panier. Puis-je utiliser le code promo NEW16 et profiter du produit cadeau ? Autre point intéressant, il est également possible de prioriser les règles. Ainsi, celle de priorité 1 sera exécutée avant celle de priorité 2. Cependant, lorsque l’on crée une nouvelle règle de panier, cette dernière est par défaut cumulable avec l’ensemble des autres règles de paniers définies précédemment. Ce fonctionnement n’est pas paramétrable et peut poser certains problèmes à des e-commerçants possédant des gros stocks de règles et souhaitant contrôler le cumul des règles entre elles.

Si vous souhaitez pour votre boutique, que les règles de panier ne soient plus cumulables, vous pouvez utiliser la solution ci-dessous. Attention, celle-ci requiert des compétences techniques et l’accès aux fichiers sources de votre boutique.

Il faut effectuer deux modifications : dans la classe CartRule.php et dans le fichier du thème discount.tpl.

Dans le fichier CartRule.php, vous devez commenter ou supprimer l’ensemble de la condition suivante :

if ($this->cart_rule_restriction && $otherCartRule['cart_rule_restriction'] && $otherCartRule['id_cart_rule'] != $this->id) {
	...
}

Puis ajouter la portion de code suivante à la suite :

if ($otherCartRule['id_cart_rule'] != $this->id) { 
	$cart_rule = new CartRule((int)$otherCartRule['id_cart_rule'], $context->cart->id_lang);
	if ($cart_rule->priority <= $this->priority) {
		return (!$display_error) ? false : Tools::displayError('This voucher is not combinable with an other voucher already in your cart:').' '.$cart_rule->name;
	}  else {
		$context->cart->removeCartRule($cart_rule->id);
	}
}

Dans le fichier discount.tpl de votre thème actif, vous devez corriger les lignes suivantes :

<td class="discount_cumulative">
	{if $discountDetail.cumulable == 1}
		<i class="icon-ok icon"></i> {l s='Yes'}
	{else}
		<i class="icon-remove icon"></i> {l s='No'}
	{/if}
  </td>

par

<td class="discount_cumulative">
	<i class="icon-remove icon"></i> {l s='No'}
  </td>

Au final, lorsqu’un client ajoutera un deuxième code promotion à son panier, cela créera l’erreur suivante : Ce bon de réduction n’est pas cumulable avec un autre bon de réduction déjà présent dans votre panier. Si le client veut changer de code promotion, il faudra alors qu’il commence par supprimer celui déjà ajouté.

En ce qui concerne les contrôleurs et les classes propres de PrestaShop, il est conseillé de passer par un override. Si vous souhaitez utiliser un override pour votre boutique, n’oubliez pas de vérifier dans les Paramètres avancés (puis Performances) de votre boutique que vous autorisez ces surcharges. Vous devez avoir la même configuration que ci-dessous.

prestashop-autoriser-override

Vous pouvez également télécharger le fichier modifié CartRule.php avec la solution décrite ci-dessus. Il est à placer dans le dossier /override/classes/. Pour éviter toute source d’erreurs pensez à vider votre cache.

Cette solution a été testée et fonctionne avec la version 1.6.1.0 de PrestaShop.