Dans une boutique B2B on affiche les tarifs HT mais le panier est en TTC.

J’ai configuré un produit de la façon suivante :

prix-produit-presta-neuf

Mon groupe est configuré de la façon suivante :

Sauf que quand j’affiche mon produit je vois ceci :

C’est surtout sur la partie remisée qu’il faut s ‘attarder.

Je devrais avoir pour 10 produit un tarif unitaire de 90€ soit une économie de 10€ HT par produit et donc un gain total de 100€ HT

Sauf que là je me retrouve pour 10 produit à un tarif unitaire à 108€, donc la apparemment prestashop applique la réduction sur le prix TTC.

MAIS POURQUOI ? je lui indiqué partout que je voulais les prix HT …..

Ce qui est le plus étrange c’est que sur les versions 1.5 nous n’avons jamais eu ce problème.

En grattant un peu je suis remonté à la méthode formatQuantityDiscounts() qui gère cette partie, et là qu’est-ce que l’on voit ?

$cur_price = (!$row['reduction_tax'] ? $row['price'] : $row['price'] * (1 + $tax_rate / 100)) + (float)$ecotax_amount;

Et oui dans tous les cas il multiplie par la taxe !

Bug (erreur) ou fonctionnement normal je ne sais pas.
Mais voici la solution que je vous propose.

Si l’utilisateur est dans un groupe ou on souhaite qu’il ait l’affichage des prix HT
Alors je retourne le prix du produit sans la multiplication
Sinon
Je retourne ce qui était a l’origine.

Ce qui donne :

if(Group::getPriceDisplayMethod($this->context->customer->id_default_group) == 1)
     $cur_price = (!$row['reduction_tax'] ? $row['price'] : $row['price']) + (float)$ecotax_amount;
else
     $cur_price = (!$row['reduction_tax'] ? $row['price'] : $row['price'] * (1 + $tax_rate / 100)) + (float)$ecotax_amount;

Pour faire ce correctif, vous devez créer un fichier ProductController.php dans le répertoire override/controllers/front/

Copier-coller le contenu suivant dans le fichier ProductController

<?php
class ProductController extends ProductControllerCore
{

    protected function formatQuantityDiscounts($specific_prices, $price, $tax_rate, $ecotax_amount)
    {
        foreach ($specific_prices as $key => &$row) {
            $row['quantity'] = &$row['from_quantity'];
            if ($row['price'] >= 0) {
 
                if(Group::getPriceDisplayMethod($this->context->customer->id_default_group) == 1)
                    $cur_price = (!$row['reduction_tax'] ? $row['price'] : $row['price']) + (float)$ecotax_amount;
                else
                    $cur_price = (!$row['reduction_tax'] ? $row['price'] : $row['price'] * (1 + $tax_rate / 100)) + (float)$ecotax_amount;

                if ($row['reduction_type'] == 'amount') {
                    $cur_price -= ($row['reduction_tax'] ? $row['reduction'] : $row['reduction'] / (1 + $tax_rate / 100));
                    $row['reduction_with_tax'] = $row['reduction_tax'] ? $row['reduction'] : $row['reduction'] / (1 + $tax_rate / 100);
                } else {
                    $cur_price *= 1 - $row['reduction'];
                }

                $row['real_value'] = $price > 0 ? $price - $cur_price : $cur_price;
            } else {
                if ($row['reduction_type'] == 'amount') {
					if (Product::$_taxCalculationMethod == PS_TAX_INC) {
						$row['real_value'] = $row['reduction_tax'] == 1 ? $row['reduction'] : $row['reduction'] * (1 + $tax_rate / 100);
					} else {
						$row['real_value'] = $row['reduction_tax'] == 0 ? $row['reduction'] : $row['reduction'] / (1 + $tax_rate / 100);
					}
                    $row['reduction_with_tax'] = $row['reduction_tax'] ? $row['reduction'] : $row['reduction'] +  ($row['reduction'] *$tax_rate) / 100;
                } else {
                    $row['real_value'] = $row['reduction'] * 100;
                }
            }
            $row['nextQuantity'] = (isset($specific_prices[$key + 1]) ? (int)$specific_prices[$key + 1]['from_quantity'] : - 1);
        }
        return $specific_prices;
    }
}

La méthode formatQuantityDiscounts() du fichier ProductController.php viens écraser la méthode par défaut.

Il faut penser également :

  • Supprimer le cache
  • Supprimer ou modifier le fichier cache/class_index.php

Au final vous devez avoir le résultat voulu:

J’ai ouvert un topic sur le forum prestashop, mais je suis relativement déçu très peu de réponse de la part de la communauté bof bof 🙁