Affinez les priorités de prix spécifiques sur Prestashop

Vous avez peut-être remarqué que lorsque vous cumulez remise quantitative et prix dédié à l’un de vos clients sur un même produit, Prestashop s’emmêle les pinceaux. Nous allons voir ensemble comment régler ce problème de prix spécifiques Prestashop.

Exemple de mauvaise gestion de la priorité des prix spécifiques

Je suis M. CHARTIER et je vais régler cet article 2.12 € car c’est le prix que le marchand m’a dédié. Mais ce dernier a aussi prévu d’accorder une remise à quiconque achèterait 75 exemplaires de ce produit. Le prix pour ces bons clients sera de 2.35 € l’unité au lieu de 2.50€.

Voici donc le rendu en Front Office (FO) et en Back Office (BO). Mon prix spécifique m’est bien proposé, mais si j’achète 75 exemplaires, que se passe-t-il ? Mon prix sera revu à la hausse, car la « réduction » est de –0,23 €.

Prix spécifiques en FO

Prix spécifiques Prestashop en BO

Vous remarquez l’incohérence à la fois fonctionnelle et d’affichage ? Faites le test !

Un client de mon agence web a rencontré cette problématique et voici comment nous l’avons traité. Attention, ce n’est peut-être pas la meilleure solution pour vous, mais le besoin de notre client était le suivant :

Si un prix spécifique s’applique à un client X alors les remises quantitatives ne doivent pas être prise en compte pour ce client.

Pour commencer, nous allons créer une surcharge de la classe SpecificPrice et c’est dans cet autre article que je vous explique pourquoi il est préférable de créer une surcharge plutôt que de modifier le coeur de Prestashop.

<?php
class SpecificPrice extends SpecificPriceCore {
}

Nous récupérons les fonctions getQuantityDiscounts et getQuantityDiscount et créons la fonction getCustomerSpecificPrice qui nous permettra de vérifier la présence d’une règle applicable à un client particulier.

public static function getCustomerSpecificPrice($id_product, $id_product_attribute,$id_customer) {
	$sql = 'SELECT `id_specific_price` FROM '._DB_PREFIX_.'specific_price WHERE `id_product`='.(int)$id_product.' AND `id_product_attribute`='.(int)$id_product_attribute.' AND `id_customer`='.(int)$id_customer;
	return (int)Db::getInstance()->getValue($sql);
}

Nous modifions le début des fonctions getQuantityDiscounts et getQuantityDiscount ainsi :

if (!SpecificPrice::isFeatureActive())
	return array();
if (SpecificPrice::getCustomerSpecificPrice($id_product, $id_product_attribute, $id_customer))
	return array();

Le problème de priorité des prix spécifiques Prestashop est résolu.