[BUG] Prestashop réduction panier avec changement de groupe client

Photo by Markus Spiske on Unsplash

Souvent je découvre des bugs sur PrestaShop en essayant de mettre en place les demandes de mes clients. Chaque commerçant a sa vision du commerce et souvent, il pousse sa réflexion beaucoup plus loin que ce que l'on peut imaginer lorsque l'on croit maitriser un outil comme PrestaShop.

Mon client a donc un scénario tout simple.

Il propose des formations en ligne à des clients, puis, à l'issue de ces webinaires, il offre une sélection de produits à tarif préférentiel pour ses élèves. Jusque-là, rien de bien étrange à comprendre et donc la mise en oeuvre dans PrestaShop devrait être assez simple.

On va créer un groupe client spécifique pour y stocker les élèves de la formation.

On ajoute ce client à ce groupe en cochant la case correspondante dans son profil.

Et on ajoute la règle panier associée à ce groupe de clients pour proposer une réduction, en reprenant l'astuce déjà abordée dans un article précédent, sans associer de code de réduction pour qu'elle s'applique automatiquement sans saisir de code.

En ayant procédé de la sorte, chaque élève présent à la formation peut dès lors profiter de la réduction associée au groupe client.

Malheureusement, quelle que soit la version de PrestaShop ou de thirtybees et autres Fork à la date d'aujourd'hui, cela n'est absolument pas le cas.

Si un client est déjà connecté avant son association au nouveau groupe de clients, il ne pourra pas profiter simplement de la réduction offerte par cette règle de panier s'il ajoute simplement des produits au panier.

Solution diplomatique

La solution, sans intervention technique, est de soit proposer aux clients de se déconnecter puis se connecter de nouveau pour qu'il puisse profiter de sa réduction, sauf que cela entraine la perte de son panier laborieusement préparé, soit on lui dit qu'il lui suffit de faire la mise à jour de la quantité d'un produit présent dans son panier, dans l'espoir qu'il augmente la quantité et qu'il oublie de la réduire et donc on lui facture un produit en plus, mais cela n'est pas la meilleure solution si vous espérez conserver ce client et surtout qu'il donne une bonne note à votre boutique.

Solution technique

J'avoue, j'ai trouvé une solution pour PrestaShop 1.6 et de fait pour un Fork comme thirtybees basé sur cette version mais je n'ai pas pu pousser plus loin pour corriger la version 1.7 de PrestaShop et je n'ai même pas testé sur la version 1.5.

Cette solution technique s'est basée sur l'analyse du comportement lors de la mise à jour de la quantité d'un produit du panier qui faisait apparaitre la réduction alors qu'un simple rafraichissement du panier n'avait aucune incidence.

J'ai pris mon scaphandre pour plonger dans les grands fonds des Controllers et autres Classes du code pour identifier les actions pouvant justifier cette différence.

Bien m'en ai pris puisque j'ai trouvé, peut-être pas la meilleure solution, mais en tout cas, celle qui fonctionne.

Tout se passe dans le Controller Front ParentOrderController.php au niveau de la fonction _assignSummaryInformations() qui n'est pas comme la fonction appelée lors du changement de quantité qui elle est présente dans le Controller Front CartController.php au niveau de la fonction processChangeProductInCart().

À la fin de la fonction de rafraichissement du panier suite à un changement de produit comme l'indique clairement le nom de cette fonction (d'où l'importance de bien nommer ses fonctions), on trouve le code suivant :

        $removed = CartRule::autoRemoveFromCart();
        CartRule::autoAddToCart();

J'ai donc simplement rajouté ce code simplifié dans la fonction _assignSummaryInformations() et en rafraichissant simplement le panier le bon de réduction s'applique.

J'ai poursuivi mes tests en déconnectant, reconnectant avec panier avant, après, changeant de groupe client et dans tous les sens, cela semble fonctionner exactement comme désiré.

Solution finale

Il ne vous reste plus qu'à mettre en place la surcharge suivante sur votre boutique PrestaShop 1.6 en créant un fichier nommé ParentOrderController.php dans le répertoire /override/controllers/front/ avec le contenu suivant :

class ParentOrderController extends ParentOrderControllerCore
{
    /*
    * by: Mediacom87
    * date: 2020-07-01
    */
    protected function _assignSummaryInformations()
    {
        parent::_assignSummaryInformations();
        CartRule::autoRemoveFromCart();
        CartRule::autoAddToCart();
    }
}

Conclusion

Je suis toujours très étonné de trouver encore des "bugs" aussi grossiers dans la version 1.6 de PrestaShop en me disant que soit mes clients sont inventifs soit certains développeurs n'ont pas joué le jeu de l'open-source et ne font jamais remonter les solutions qu'ils trouvent aux problèmes de leurs clients.

Néanmoins, si vous n'arrivez pas à mettre en place la solution expliquée dans ce billet, n'hésitez pas à me commander cette prestation en prenant un ticket d'intervention sur Prestatoolbox, je m'occuperais personnellement de votre demande.

Pour les utilisateurs de version plus ancienne ou plus récente de PrestaShop ou pour ceux étant sur des Fork comme thirtybees, n'hésitez pas à vous manifester dans les commentaires si vous avez pu appliquer ma correction ainsi ou s'il fallait l'adapter.

Commentaires