Jump to content

Pbm : Product->getPriceWithoutReduct($notax)


TrogloGeek

Recommended Posts

Bonjour à tous,

Désolé pour le titre pas super clair mais je ne vois pas comment dire ça autrement.
J'ai besoin d'afficher les prix hors taxe tant qu'on est hors du parcours de commande.
J'utilise la version 1.2.5.0 et dans la classe Product je trouve :

    public function getPriceWithoutReduct($notax = false)
   {
       $res = Db::getInstance()->getRow('
           SELECT p.`price`, t.`rate`, t.`id_tax`
           FROM `'._DB_PREFIX_.$this->table.'` p
           LEFT JOIN `'._DB_PREFIX_.'tax`t ON (p.`id_tax` = t.`id_tax`)
           WHERE p.`id_product` = '.intval($this->id));
       if (!$res)
           return false;
       $tax = floatval(Tax::getApplicableTax(intval($res['id_tax']), floatval($res['rate'])));
       if (!Tax::excludeTaxeOption() || $notax)
           return ($res['price'] * (1 + $tax / 100));
       return ($res['price']);
   }



Je vois l'attribut $notax et je me dis génial, je vais pouvoir obtenir le prix sans réduction et sans taxe en passant TRUE. Et pourtant, j'obtiens un prix TTC.
Je regarde mieux le code :

        if (!Tax::excludeTaxeOption() || $notax)
           return ($res['price'] * (1 + $tax / 100));
       return ($res['price']);


Bon, ok, le nom du paramètre est trompeur, mais en lisant le code on comprend que c'est lorsque $notax = TRUE on applique la taxe, bon, passons...
Je mets FALSE et Tadam !!! Toujours du TTC. Je m'énèrve, frappe ma femme, mes enfants et mon chien pour me calmer (rassurez vous je n'ai rien de tout cela ;-) ) et relis le code : effectivement, si Tax::excludeTaxeOption() = FALSE, correspondant à la négation du paramètre PS_TAX en base, pas moyen d'obtenir le prix sans réduction hors taxe par cette fonction. Hors si je désactive la gestion des taxes prestashop (PS_TAX toujours), les clients achètent hors taxe. Le comportement voulu par le client est :
Tous les prix sont affichés hors taxe, la TVA n'est ajoutée qu'à la fin dans le récapitulatif.
J'avais donc déjà bien compris que j'allais devoir ruser un minimum, mais de là à recalculer le prix HT et divisant le prix TTC par 1.196 alors que le prix est stocké HT dans la base... Je trouve cela un peux crade, vive les erreurs d'arrondi.

Finalement, mes question (enfin, direz-vous) :

- Y a-t-il ici effectivement un bug dans cette fonction ou est-ce moi qui ne comprends pas la façon dont elle est censée être utilisée ?

- Puis-je obtenir le prix sans réduction HT autrement ?


Cordialement,
Damien.

Link to comment
Share on other sites

Si cela peut aider quelqu'un, l'alternative à cette méthode est Product->getPrice (ou son équivalent statique avec l'id produit en premier paramètre) :

    /**
   * Get product price
   * Same as static function getPriceStatic, no need to specify product id
   *
   * @param boolean $tax With taxes or not (optional)
   * @param integer $id_product_attribute Product attribute id (optional)
   * @param integer $decimals Number of decimals (optional)
   * @param integer $divisor Util when paying many time without frais (optional)
   * @return float Product price in euros
   */
   public function getPrice($tax = true, $id_product_attribute = NULL, $decimals = 6, $divisor = NULL, $only_reduc = false, $usereduc = true, $quantity = 1)
   {
           return self::getPriceStatic(intval($this->id), $tax, $id_product_attribute, $decimals, $divisor, $only_reduc, $usereduc, $quantity);
   }



Avec FALSE en premier et sixième paramètres on obtient bien le prix HT sans réduction.

Cela dit je suis toujours à l'écoute d'une explication sur l'utilisation de la méthode getPriceWithoutReduction.

Link to comment
Share on other sites

  • 1 month later...

J'ai partiellement (je dirais provisoirement) resolu mon problème car Urgent.

Dans la classe product.php

   public function getPriceWithoutReduct($notax = false)
   {
       $res = Db::getInstance()->getRow('
           SELECT p.`price`, t.`rate`, t.`id_tax`
           FROM `'._DB_PREFIX_.$this->table.'` p
           LEFT JOIN `'._DB_PREFIX_.'tax`t ON (p.`id_tax` = t.`id_tax`)
           WHERE p.`id_product` = '.intval($this->id));
       if (!$res)
           return false;
       $tax = floatval(Tax::getApplicableTax(intval($res['id_tax']), floatval($res['rate'])));
       if (!$notax)
           return ($res['price'] * (1 + $tax / 100));    
       return ($res['price']);
   }



J'ai donc supprimé le test
!Tax::excludeTaxeOption() ||
dans le 2eme if

en attendant d'avoir quelque chose de plus propre.

@+
Arnaud

Link to comment
Share on other sites

Désolé alphabravo8, dégouté par le manque de réponse de chacun de mes posts j'ai négligé d'indiquer la réponse que j'ai trouvé par la suite en continuant à fureter dans le code. Pour obtenir le prix sans réduction, proprement :
dans la classe Product

    /**
   * Get product price
   * Same as static function getPriceStatic, no need to specify product id
   *
   * @param boolean $tax With taxes or not (optional)
   * @param integer $id_product_attribute Product attribute id (optional)
   * @param integer $decimals Number of decimals (optional)
   * @param integer $divisor Util when paying many time without frais (optional)
   * @return float Product price in euros
   */
   public function getPrice($tax = true, $id_product_attribute = NULL, $decimals = 6, $divisor = NULL, $only_reduc = false, $usereduc = true, $quantity = 1)



Il suffit d'utiliser cette fonction avec en paramètres :
false pour $only_reduc
false pour $usereduc
true pour $tax pour le prix TTC, false pour le prix HT

La modification que tu as apportée à la fonction getPriceWithoutReduct risque de poser des problèmes à ton applicatif. J'ai d'ailleurs l'impression que cette fonction est deprecated et qu'elle n'existe encore que parce qu'elle est encore utilisée telle quelle par le noyau, d'où le risque de mauvais fonctionnement avec ta modification (il me semble que j'avais essayé et qu'effectivement le comportement de Prestashop avait par cela été corrompu.)

Bon courrage.

Link to comment
Share on other sites

  • 5 months later...

Bonjour NBC_Dumb

J'ai aussi le problème et je ne suis pas la seule.

J'ai mis le code que tu as écrit mais pour moi aucun changement dans le prix. L'ancien prix s'affiche toujours avec les taxes avec mention hors taxes.

As-tu modifié autre chose ailleurs pour que cela fonctionne?


Merci de ton aide.

Link to comment
Share on other sites

Bonjour NBC_Dumb

J'ai aussi le problème et je ne suis pas la seule.

J'ai mis le code que tu as écrit mais pour moi aucun changement dans le prix. L'ancien prix s'affiche toujours avec les taxes avec mention hors taxes.

As-tu modifié autre chose ailleurs pour que cela fonctionne?


Merci de ton aide.

Bonjour France,

Le code que j'ai inséré n'est pas un code que j'ai modifié mais l'en-tête d'une fonction de la classe Product que j'ai copiée pour illustrer mes propos. Il faut donc utiliser
$Product->getPrice(false, NULL, 6, NULL, false, false)


au lieu de

$Product->getPriceWithoutReduct(false)


pour obtenir le prix unitaire HT d'un produit ne tenant pas compte de la réduction.

Cela résout-il ton problème ?
Sinon merci de nous copier ton code pour que nous cernions mieux ton problème.

--edit--
J'aime beaucoup le design de ta boutique :)

Link to comment
Share on other sites

Bonjour NBC_DUMB

Merci de me répondre et merci pour le design de mon site.

Concernant mon fameux problème, je mets en réduction des produits mais l'ancien prix s'affiche avec taxes avec la mention hors taxes. Tous mes produits sur ma boutique est affiché hors taxes.


Un exemple:

http://aux-arts-de-la-table.com/vaisselle-jetable/626-verrine-kova-100-ml.html


Dans la page Classes/Product.php j'ai 2 Get Product Price. Lequel faut modifier et comment exactement? Je suis totalement nulle dans ce style de code.

Le 1er en ligne 1220

    * Get product price
   *
   * @param integer $id_product Product id
   * @param boolean $tax With taxes or not (optional)
   * @param integer $id_product_attribute Product attribute id (optional)
   * @param integer $decimals Number of decimals (optional)
   * @param integer $divisor Util when paying many time without fees (optional)
   * @return float Product price
   */


public static function getPriceStatic($id_product, $usetax = true, $id_product_attribute = NULL, $decimals = 6, $divisor = NULL, $only_reduc = false, $usereduc = true, $quantity = 1, $forceAssociatedTax = false)





Le 2ième en ligne 1297

    * Get product price
   * Same as static function getPriceStatic, no need to specify product id
   *
   * @param boolean $tax With taxes or not (optional)
   * @param integer $id_product_attribute Product attribute id (optional)
   * @param integer $decimals Number of decimals (optional)
   * @param integer $divisor Util when paying many time without frais (optional)
   * @return float Product price in euros
   */
   public function getPrice($tax = true, $id_product_attribute = NULL, $decimals = 6, $divisor = NULL, $only_reduc = false, $usereduc = true, $quantity = 1)
   {
           return self::getPriceStatic(intval($this->id), $tax, $id_product_attribute, $decimals, $divisor, $only_reduc, $usereduc, $quantity);
   }






Je tiens à dire que j'ai modifié dans cette page la ligne 1961 qui permet d'afficher l'ancien prix sans la taxe dans le module blocks specials

        $row['price_without_reduction'] = Product::getPriceStatic($row['id_product'], false, ((isset($row['id_product_attribute']) AND !empty($row['id_product_attribute'])) ? intval($row['id_product_attribute']) : NULL), 2, NULL, false, false); 




Voici le lien où j'ai trouvé cette solution pour le blockspecials mais qui ne modifie pas pour autant l'ancien prix dans la page du produit

http://www.prestashop.com/forums/viewthread/55065/configuring___using_prestashop/solved_specials_block_tax_not_included_price_dot_/



Merci beaucoup de ton aide

Link to comment
Share on other sites

Quelle version de Prestashop utilises-tu ?

Peux-tu poster ici (ou en PM si tu ne veux pas que tout le monde y ait accès) ton fichier template product.tpl ? Je pourrais ainsi directement t'indiquer le remplacement à faire.

Sinon tu peux utiliser la suggestion de alphabravo8, mais c'est assez risqué (il faudrait ensuite prendre le temps de refaire entièrement la recette de ton site pour vérifier qu'aucun effet de bord n'a été engendré). Je ne le suggère personnellement pas, mais cela est dû à ma façon de faire et ne constitue pas un réel jugement de valeur.

Link to comment
Share on other sites

Il y a beaucoup de monde qui ont ce problème d'affichage de prix lorsque le produit est en promotion donc en mettant mon product.tpl ici je pourrais en aider d'autres peut-être.



Oups! Je ne suis pas capable de mettre tout le code ici. On dirait qu'il y a une limite de ligne.

Je vais essayer par MP.


Merci

Link to comment
Share on other sites

Il ne faut pas en poster le contenu mais poster le fichier en pièce jointe (il faut pour cela utiliser la fonction répondre plutot que réponse rapide).

Je posterai en retour uniquement la partie modifiée et les ligne correspondante dans le corps de ma réponse ainsi que le fichier complet modifié en pièce jointe.

Link to comment
Share on other sites

Tu as changé de nom ? :-))

Je ne savais pas pour la pièce jointe.

J'ai un problème avec ça. Je fais parcourir et va chercher mon fichier dans mon localhost et je ne vois rien de différent dans mon message. Peut-être est-il plus gros que 4000KB.


Merci de ton aide très précieuse.

Link to comment
Share on other sites

Lol non, il y a fort peu de chance pour que ton fichier template pèse plus plus de 4Mo ^^

Que veux tu dire par "va chercher mon fichier dans mon localhost" ?

Je joins un fichier product.tpl pour vérifier qu'il n'y a pas de soucis avec les PJ. Fichier à ignorer donc.

--edit--

Bon, en effet, la fonction Pièces jointes semble ne pas fonctionner, je t'envoie mon adresse mail en PM.

Link to comment
Share on other sites

Le problème est que le prix réduit est avant taxes (pour moi c'est correct) mais l'ancien prix est avec taxes avec mention Hors taxes ce qui n'est pas correct.


Prestashop newbie a trouvé une solution temporaire qui marche

http://www.prestashop.com/forums/viewreply/267482/

Il place en commentaire les lignes 1315, 1316 et 1317 du fichier classes/Product.php


//$tax = floatval(Tax::getApplicableTax(intval($res['id_tax']), floatval($res['rate'])));
//if (!Tax::excludeTaxeOption() || $notax)
//    return ($res['price'] * (1 + $tax / 100)); 

Link to comment
Share on other sites

Cette solution est encore plus dangereuse que celle de alphabravo8 car elle ignore totalement la valeur du paramètre, ce qui risque de créer des effets de bord sur d'autres parties de la boutique.

J'ai bien reçu ton fichier et je travaille dessus

Link to comment
Share on other sites

ligne 220 :

{convertPrice price=$product->getPriceWithoutReduct(true)}


remplacer par :

{convertPrice price=$product->getPrice(false, NULL, 6, NULL, false, false)}


Cela devrait résoudre ce problème.

Avantage de cette solution :
règle le soucis sur cette page sans créer d'effet de bord sur une autre partie du site.
inconvénient :
ne corrige pas la fonction getPriceWithoutReduct()

Mais si c'est le seul endroit où tu as ce problème, je te suggère cette solution qui ne créera pas de nouveau problème ailleurs.

Car corriger une fonction d'API a un effet vicieux : une partie de l'application pourrait ne fonctionner que grâce au bug, auquel cas sa correction en entraine d'autres (ce que l'on appelle des effets de bord). Il vaut donc mieux laisser la team Prestashop s'occuper des corrections API ;-)

Je n'ai pas vérifié le correctif, il se peut donc que j'ai fait une erreur d'inattention, tiens nous au courant.

Link to comment
Share on other sites

À la ligne 220 de class/product.php j'ai ça


$fields['id_category_default'] = intval($this->id_category_default);



Donc pas rapport avec ce que tu me donnes comme code.

Où bien je n'ai pas la bonne page, ou bien tu ne m'as pas donné le bon numéro de ligne.


Merci

Link to comment
Share on other sites

J'ai trouvé la ligne en question qui est dans product.tpl

J'ai fait les modifications et enlever les commentaires que j'avais mis et l'ancien prix s'affiche sans les taxes. :-)


Pour le moment parmi les vérifications que j'ai fait tout semble fonctionné. Pas de bug trouvé.


Merci beaucoup!

Link to comment
Share on other sites

Je suis entrain de faire des tests et sous IE lorsque je viens pour commander j'arrive sur la page authentication.php

IE donne un message :
Pour protéger votre sécurité Internet Explorer a bloqué l'affichage du contenu présentant des erreurs de certificat de sécurité de ce site web.


Je n'avais pas ce problème avant donc pourquoi j'ai ce message?
J'ai ajouté le carrousel nouveau produits, le block specials et fait le changement de code.

Comment je peux faire pour voir ce que IE bloque, ce qui n'est pas conforme au certificat de sécurité?



Merci

Link to comment
Share on other sites

Le problème n'est pas lié à la modification de product.tpl : ce fichier n'est utilisé que sur la page produit (product.php)
J'ai vérifié sur ton site avec mon IE 7 sous XP SP3 pas de soucis.
As tu cette erreur sur :
1: https://aux-arts-de-la-table.com/authentication.php
ou
2 : http://aux-arts-de-la-table.com/authentication.php
ou
3 : les deux ?

1 :
Peut-être un problème de cache si ton certificat a été changé, essaye d'effacer les certificats enregistrés en allant dans menu Outils > Options Internet > onglet Contenu > bouton Effacer l'état SSL
2 :
Lorsque l'on consulte cette page en http non ssl, les éléments sont eux chargés en ssl, ce qui peut troubler ton navigateur
3 :
là je ne vois pas, quelle version d'IE et quelle version de windows as-tu ?

Au fait, on est off-topic là, il faudrait que tu en ouvres un nouveau pour ce problème.

Link to comment
Share on other sites

Je vais te répondre ici et après j'ouvrirai un autre topic.

Lorsque l'on arrive sur la page authentification.php elle devient automatiquement en https; donc pas moyen de la voir autrement.

J'ai vidé le cache comme tu me l'as suggéré et toujours le même problème.


Je navigue toujours avec FF mais je vais sur IE7 pour faire des tests et j'ai Windows XP.

Dernièrement j'avais ajouté une image à droite (mes infos avec numéro de tél et fax) dans la colonne de droite à l'aide du module libre et j'avais cette erreur que je n'avais pas remarqué et qui a été corrigé.

En fin de semaine j'ajoute le module Promotion à droite, le carrousel nouveau produit à gauche et je change le code. Donc j'ai pensé que cela pouvait avoir un rapport. J'ai enlevé les modules et refait un test et toujours ce problème sous IE.

Ça n'aide pas à faire passer des commandes ça!


Merci

Link to comment
Share on other sites

Cette solution est encore plus dangereuse que celle de alphabravo8 car elle ignore totalement la valeur du paramètre, ce qui risque de créer des effets de bord sur d'autres parties de la boutique.


Nous sommes bien d'accord et c'est pourquoi ce "paliatif" (et non solution) est toujours sur l'environnement de dev et non en prod. Ceci étant, l'analyse d'impact menée aujourd'hui montre que les risques sur la 1.2.5 sont minimes. Par contre, quid sur la 1.3.x... --> mieux vaut donc éviter.

TrogloGeek, je pense comme toi que la méthode getPriceWithoutReduct n'est pas cohérente et devrait être revue par son auteur. Dans l'attente, je vais opter pour le remplacement de getPriceWithoutReduct par getPrice dans les TPL lorsque nécessaire.
Link to comment
Share on other sites


Nous sommes bien d'accord et c'est pourquoi ce "paliatif" (et non solution) est toujours sur l'environnement de dev et non en prod. Ceci étant, l'analyse d'impact menée aujourd'hui montre que les risques sur la 1.2.5 sont minimes. Par contre, quid sur la 1.3.x... --> mieux vaut donc éviter.
TrogloGeek, je pense comme toi que la méthode getPriceWithoutReduct n'est pas cohérente et devrait être revue par son auteur. Dans l'attente, je vais opter pour le remplacement de getPriceWithoutReduct par getPrice dans les TPL lorsque nécessaire.

Après plus ample vérifications, sur la 1.3.1 cette fonction n'est utilisée que sur la page produit du front :
-> un appel depuis product.php pour le calcul de $quantity_discounts
'quantity_discounts' => QuantityDiscount::getQuantityDiscounts(intval($product->id), $product->getPriceWithoutReduct())


-> trois appels depuis le fichier themes/prestashop/product.tpl
deux pour affichage (lorsque le produit a une réduction active)

                

               {if !$priceDisplay || $priceDisplay == 2}
{convertPrice price=$product->getPriceWithoutReduct()}
                       {if $tax_enabled}{l s='tax incl.'}{/if}
               {/if}
               {if $priceDisplay == 1}
{convertPrice price=$product->getPriceWithoutReduct(true)}
                       {if $tax_enabled}{l s='tax excl.'}{/if}
               {/if}



et un pour alimenter une variable javascript

var productPriceWithoutReduction = {$product->getPriceWithoutReduct()|default:'null'};



------------------------------------------------------------------------------------------------------------------
solution propre pour la version 1.3.1 à valider (je n'ai pas le temps de la vérifier je travail sur un module ATOS plus stable que le gratuit qui circule et compatible avec le module GAnalytics, par contre je suivrais vos retour pour corriger si problème il y a)
------------------------------------------------------------------------------------------------------------------

Donc à priori cette fonction est je pense vouée à disparaitre au profit de getPrice. En attendant, la ligne fautive peut être corrigée comme suit :

        if (!Tax::excludeTaxeOption() && !$notax)
           return (Tools::convertPrice($res['price']) * (1 + $tax / 100));


Si l'on veut pousser l'optimisation cela donne (suppression des calculs inutiles pour la version HT) :

   public function getPriceWithoutReduct($notax = false)
   {
       $res = Db::getInstance()->getRow('
           SELECT p.`price`, t.`rate`, t.`id_tax`
           FROM `'._DB_PREFIX_.$this->table.'` p
           LEFT JOIN `'._DB_PREFIX_.'tax`t ON (p.`id_tax` = t.`id_tax`)
           WHERE p.`id_product` = '.intval($this->id));
       if (!$res)
           return false;
       if (Tax::excludeTaxeOption() || $notax)
           return (Tools::convertPrice($res['price']));
       $tax = floatval(Tax::getApplicableTax(intval($res['id_tax']), floatval($res['rate'])));
       return (Tools::convertPrice($res['price']) * (1 + $tax / 100));
   }



pour la version trunk actuelle même chose à une ligne près :

   public function getPriceWithoutReduct($notax = false)
   {
       $res = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
           SELECT p.`price`, t.`rate`, t.`id_tax`
           FROM `'._DB_PREFIX_.$this->table.'` p
           LEFT JOIN `'._DB_PREFIX_.'tax`t ON (p.`id_tax` = t.`id_tax`)
           WHERE p.`id_product` = '.intval($this->id));
       if (!$res)
           return false;
       if (Tax::excludeTaxeOption() || $notax)
           return (Tools::convertPrice($res['price']));
       $tax = floatval(Tax::getApplicableTax(intval($res['id_tax']), floatval($res['rate'])));
       return (Tools::convertPrice($res['price']) * (1 + $tax / 100));
   }



posté dans le bugtracker :
http://www.prestashop.com/bug_tracker/view/4922/

Link to comment
Share on other sites

je n'ai pas d'archive de la version 1.2.5 sous la main, mais j'en ai une je crois au bureau, j'essayerai de penser à en ramener une pour vous fournir l'audit de cette fonction correspondant à cette version si cela intéresse quelqu'un

Link to comment
Share on other sites

Ben moi je suis intéressée à ce que partout où l'ancien prix s'affiche avec les taxes de l'avoir sans les taxes lorsque je fais une promo.

J'ai essayé dans la product-list de faire afficher Prix réduit et l'ancien prix sans taxes et le nouveau prix sans taxes mais je n'ai pas réussi pour l'ancien prix donc je ne l'ai pas mis. Pour le module blockspecials j'ai réussi à faire afficher l'ancien prix sans les taxes mais pas pour le module carrousel promotion.

The best ce serait que cette fonction de réduction prenne en compte nos préférences que l'on a mis dans l'admin soit afficher les prix (ancien et nouveau) avec ou sans taxes.


Merci de ton aide précieuse

Link to comment
Share on other sites

J'ai 1.2.5

Lorsque l'on met un produit en réduction, non Presta ne prend pas en considération nos préférences de faire afficher les prix avec ou sans taxes pour les anciens prix et même les nouveaux. Dans certains cas, j'ai vu sur le forum que certaines personnes voulaient le prix en réduction avec les taxes mais que Presta ne le fait pas par défaut. Ces personnes doivent bidouiller dans le code comme toi tu as fait pour faire afficher l'ancien prix sans les taxes.

On en a la preuve avec la page produit et le module blockspecial.

En ce qui concerne la page product-list.tpl ça c'est un changement de code que l'on doit faire dans la page mais encore là c'est compliqué. J'avais trouvé un code mais tous les prix s'affichent avec taxes (ancien et nouveau) donc j'ai laissé comme c'était.

Pour le module carrousel promotion, aucun prix s'affiche sans les taxes mais ça c'est un module fait à part.

Link to comment
Share on other sites

J'ai eu le même soucis avec cette version. A l'époque j'avais préféré appeler getPrice depuis les templates plutôt que getPriceWithoutReduct mais la le correctif proposé juste au dessus pour la 1.3.1 est tout aussi valable pour la 1.2.5.0
Je vérifierai demain quand j'aurais accès à une archive de la version 1.2.5.0 qu'il n'y a pas de risque d'effet de bord.

Link to comment
Share on other sites

Pour les versions 1.2.4 et 1.2.5 il ne faut pas utiliser Tools::convertPrice() pour retourner la valeur.

   public function getPriceWithoutReduct($notax = false)
   {
       $res = Db::getInstance()->getRow('
           SELECT p.`price`, t.`rate`, t.`id_tax`
           FROM `'._DB_PREFIX_.$this->table.'` p
           LEFT JOIN `'._DB_PREFIX_.'tax`t ON (p.`id_tax` = t.`id_tax`)
           WHERE p.`id_product` = '.intval($this->id));
       if (!$res)
           return false;
       if (Tax::excludeTaxeOption() || $notax)
           return ($res['price']);
       $tax = floatval(Tax::getApplicableTax(intval($res['id_tax']), floatval($res['rate'])));
       return ($res['price'] * (1 + $tax / 100));
   }



toujours dans classes/Product.php modifier le corps de la fonction getProductProperties, remplacer la ligne :

        $row['price_without_reduction'] = Product::getPriceStatic($row['id_product'], true, ((isset($row['id_product_attribute']) AND !empty($row['id_product_attribute'])) ? intval($row['id_product_attribute']) : NULL), 2, NULL, false, false);


par

        $row['price_without_reduction'] = Product::getPriceStatic($row['id_product'], (!Tax::excludeTaxeOption() && (Configuration::get('PS_PRICE_DISPLAY') != 1)), ((isset($row['id_product_attribute']) AND !empty($row['id_product_attribute'])) ? intval($row['id_product_attribute']) : NULL), 2, NULL, false, false);

Link to comment
Share on other sites

Merci!

Et si je voulais faire afficher l'ancien prix dans la page product-list.php tout en conservant le terme Prix Réduit mais en affichant en plus l'ancien prix toujours sans les taxes, que faudrait-il changer dans ce code?

        {if $product.on_sale}

{l s='On sale!'}

               {elseif ($product.reduction_price != 0 || $product.reduction_percent != 0) && ($product.reduction_from == $product.reduction_to OR ($smarty.now|date_format:'%Y-%m-%d' <= $product.reduction_to && $smarty.now|date_format:'%Y-%m-%d' >= $product.reduction_from))}

{l s='Price lowered!'}

               {/if}

               {if !$priceDisplay || $priceDisplay == 2}{convertPrice price=$product.price}{if $priceDisplay == 2} {l s='+Tx'}{/if}{/if}

               {if $priceDisplay}{convertPrice price=$product.price_tax_exc}{if $priceDisplay == 2} {l s='-Tx'}{/if}{/if}

               {if ($product.allow_oosp OR $product.quantity > 0) && $product.customizable != 2}

{l s='Add to cart'}

               {else}

{l s='Add to cart'}

               {/if}

{l s='View'}

{if ($product.allow_oosp OR $product.quantity > 0)}{l s='Available'}{else}{l s='Out of stock'}{/if}




Merci beaucoup!

Link to comment
Share on other sites

Hmmm désolé mon serveur de développement est à la masse ce soir donc je ne peux pas vérifier mais ça devrait ressembler à :

                {assign var='lowered' value=false}
               {if $product.on_sale}

{l s='On sale!'}

               {elseif ($product.reduction_price != 0 || $product.reduction_percent != 0) && ($product.reduction_from == $product.reduction_to OR ($smarty.now|date_format:'%Y-%m-%d' <= $product.reduction_to && $smarty.now|date_format:'%Y-%m-%d' >= $product.reduction_from))}
                   {assign var='lowered' value=true}

{l s='Price lowered!'}
               {/if}

               {if $lowered}
{convertPrice price=$product.price_without_reduction}
(-{if $product.reduction_price != 0}{convertPrice price=$product.reduction_price}{else}{$product.reduction_percent}%{/if})
               {/if}

               {if !$priceDisplay || $priceDisplay == 2}{convertPrice price=$product.price}{if $priceDisplay == 2} {l s='+Tx'}{/if}{/if}

               {if $priceDisplay}{convertPrice price=$product.price_tax_exc}{if $priceDisplay == 2} {l s='-Tx'}{/if}{/if}

               {if ($product.allow_oosp OR $product.quantity > 0) && $product.customizable != 2}

{l s='Add to cart'}

               {else}

{l s='Add to cart'}

               {/if}

{l s='View'}

{if ($product.allow_oosp OR $product.quantity > 0)}{l s='Available'}{else}{l s='Out of stock'}{/if}


précision : Cette modification ne prend que ton cas en compte (prix HT uniquement) et pas les deux autres (HT; TTC & HT).
Ensuite à toi d'adapter la CSS en conséquence

Link to comment
Share on other sites

  • 2 months later...
@TrogloGeek: merci pour le correctif 1.3.1 et le suvi dans le trunk.
En effet, le remplacement getPriceWithoutReduct par getPrice dans le TPL ne fonctionne pas sur la 1.3.1 et je me suis repris le bug dans la figure après la migration 1.2.5 -> 1.3.1. Pfff...

Le remplacement des appels getPriceWithoutReduct par getPrice fonctionnent sur la 1.3.1 si tu utilises les bon paramètres.
Link to comment
Share on other sites

  • 2 months later...
  • 3 weeks later...

ouaip ça a été retouché ...
voici le code "officiel" qui marche

    public function getPriceWithoutReduct($notax = false)
   {
       $res = Db::getInstance()->getRow('
           SELECT p.`price`, t.`rate`, t.`id_tax`
           FROM `'._DB_PREFIX_.$this->table.'` p
           LEFT JOIN `'._DB_PREFIX_.'tax`t ON (p.`id_tax` = t.`id_tax`)
           WHERE p.`id_product` = '.intval($this->id));
       if (!$res)
           return false;

       if (!$notax)
       {
           $tax = floatval(Tax::getApplicableTax(intval($res['id_tax']), floatval($res['rate'])));
           if (!Tax::excludeTaxeOption())
               return (Tools::convertPrice($res['price']) * (1 + $tax / 100));
       }
       return (Tools::convertPrice($res['price']));
   }

Link to comment
Share on other sites

  • 2 months later...

Hello les cracks (si!si je suis impressionné, moi qui cherche et cherche et ne trouve pas...)

je suis sous 1.2.5
Dans un php, je souhaite "simplement" récupérer le prix "de base" c'est à dire le prix sans réduction, ni dégressif.

Comment puis-je m'y prendre ?
je vous signale que je ne sais pas me servir ou appliquer une fonction...

mon code ressemble à ça :

$totalProductsTibrut += floatVal($product['price']) * intVal($product['quantity']);




mais 'price' me retourne le prix déjà réduit (dans le cas d'un prix dégressif par exemple.
Or je souhaite justement calculer la différence entre le prix de départ et le prix dégressif.

la question se pose aussi pour les packs. je souhaite récupérer le prix du pack sans remise et le comparer au prix du pack (pour mettre en avant l'avantage prix)

merci (beaucoup !!) pour votre aide..

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...