Vous êtes ici » Home | Webdesign | Double tarification particulière Prestashop

Double tarification particulière Prestashop

Bon, un peu de technique de temps en temps ne fait pas de mal. Cette fois-ci, je vous présente une petite astuce que j’ai mis un peu de temps à trouver afin de proposer une double tarification dans une boutique Prestashop.

Quel intérêt me diriez-vous ? Il existe en effet déjà la notion de « groupes » dans Prestashop.
Cela se révèle être d’ailleurs très utile pour une double tarification particuliers/professionnels classique. On considère dans ce cas là que le second groupe (par exemple « professionnels ») propose des tarifs 30% moins chers que le premier groupe par exemple. Le seul hic est que toute la base produits est concernée. Tous les produits ont obligatoirement la même remise.

Dans l’absolu, c’est pratique, mais… imaginons que pour ce groupe « professionnels » par exemple, nous voulions appliquer des taux de remises différents selon les produits concernés. C’est envisageable n’est-ce pas ? La technique classique des groupes n’est alors plus applicable.

Voilà donc en 4 étapes la méthode qui permet de gérer cette double tarification Prestashop particulière.

1. Ajoutez une nouveau champ dans la table ps_product de Prestahop
Créer le nouveau champ dans dans votre table ps_product (avec PhpMyadmin par exemple)
Ici, il s’appelle « price_pro ».
J’ai conservé les mêmes attributs que le champ « price » classique.

Double tarification Prestashop

Ajout d'un champ dans la base

2. Ajoutez le champ dans votre backOffice (fichier \tabs\AdminProducts.php)

Double tarification Prestashop, modification du backoffice

Ajout du champ dans le backoffice Prestashop

3. En dessous du champ Prix, ajoutez les lignes suivantes (bien entendu, cela peut être adapté, j’ai fait au plus simple ! Ce n’est ni plus ni moins qu’un copier coller du champ du dessus avec le nom d’input différent):


<br />
<input size="11" maxlength="14" name="price_pro" type="text" value="'.$this->getFieldValue($obj, 'price_pro').'"/>'.($currency->format == 2 ? ' '.$currency->sign : '').'<span style="margin-left:13px">Tarif professionnel HT</span>

Avant :

code prestashop backoffice double tarification spécifique

Code du backoffice avant

Après :

code prestashop backoffice double tarification spécifique après

Code du backoffice après

3. Dans la classe « Product » (fichier \classes\Product.php), ajoutez les lignes suivantes :


/** @var float Price_pro in euros */
public $price_pro = 0;

Modification de la classe produit Prestashop

Modification de la classe "produit" Prestashop

4. Recherchez la fonction getFields()  et ajoutez :


$fields['price_pro'] = pSQL($this->price_pro);

Modification de la classe produit Prestashop à nouveau

Modification de la classe "produit" Prestashop

Théoriquement, cela fonctionne. Vous pouvez à présent ajouter un prix pro à une fiche produit.

Maintenant, il faut qu’en fonction du groupe du client, le bon prix s’affiche.
Pour cela, modifiez la classe Product comme suit :

Modif classe produit Prestashop pour double tarification

Dernière modification de la classe "produit" Prestashop

Et c’est bon !

Cela fonctionne sur les anciennes versions 1.3, mais j’imagine qu’avec un peu de bidouille cela ne devrait pas être éloigné sur les dernières versions 1.4 de Prestashop.

N’hésitez pas à laisser des commentaires.
Mat

13 Responses to " Double tarification particulière Prestashop "

  1. smbmultimedia dit :

    Bonjour,

    je tente d’appliquer cette méthode sur mon site en Prestashop 1.4.5. (je suis actuellement en prod donc en local)
    J’ai bien suivi tout le détail de vos explications mais j’ai un petit bug à l’affichage dans la fiche produit en back-office.
    - Dans le champ où l’on doit mettre le prix pro HT, ce message s’affiche :

    »‘.$this-

    et à côté du champ :

    getFieldValue($obj, ‘price_pro’).’ »/>’.($currency->format == 2 ? ‘ ‘.$currency->sign : »).’Tarif professionnel HT

    En plus j’ai remarqué que le fichier product.php n’a pas la même syntaxe que celui que vous affichez :

    FROM `’._DB_PREFIX_.’product` p
    ‘.($id_product_attribute ? ‘LEFT JOIN `’._DB_PREFIX_.’product_attribute` pa ON pa.`id_product_attribute` = ‘.(int)($id_product_attribute) :  »).’
    WHERE p.`id_product` = ‘.(int)($id_product));
    $result = self::$_pricesLevel2[$cacheId2];

    $price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['price'] : $specific_price['price'];

    Il n’y a pas la syntaxe floatval mais float uniquement. J’ai essayé en mettant float dans votre code, ça n’a rien changé…
    Je suis nulle en php donc je ne sais pas où et pourquoi il y a une erreur…
    Si vous pouviez m’éclairer ce serait vraiment sympa de votre part.

    Merci par avance.
    Sophie-Marianne

  2. matgrafiks dit :

    Bonsoir,
    J’ai l’impression que le formatage de l’article WordPress a remplacé les quotes par des caractères spéciaux non reconnus dans votre code. C’est normal. Donc cela n’est pas interprété correctement.

    J’ai remis ce code en état sur cette page afin que vous puissiez le recopier sans erreur.

    Je n’ai pas regardé dans les versions 1.4 de Prestashop la classe « Product.php ».
    J’imagine que certains points doivent être assez similaires. Essayez de repérer les bouts de code (ils ne seront pas aux mêmes lignes sans doute).

    Si vous n’y arrivez pas, revenez vers moi.
    Mat

  3. sema31 dit :

    Bonjour,

    pour un client, je dois créer un « prix public conseillé » qui ne rentre pas en compte dans la moulinette du panier, donc ce tutau est très bien.
    juste une fois le champs créer dans e back office (j’ai fait jusqu’à l’étape $fields['price_pro'] = pSQL($this->price_pro);, que j’ai validé), comment puis je faire pour juste afficher ce prix dans la fiche produit (donc dans le product.tpl il me semble? et que dois je mettre?
    merci d’avance

    • matgrafiks dit :

      Dans la classe Product.php, repérez la fonction
      getPriceStatic()

      Perso, pour aller au plus vite, j’ai créé tout bêtement une nouvelle fonction similaire à getPriceStatic().
      Je l’ai appelée getPriceProStatic()

      Voilà la fonction insérée dans la classe :

      public static function getPriceProStatic($id_product)
      {
      global $cookie, $cart;

      // Getting price
      $result = Db::getInstance()->getRow(‘
      SELECT p.`price`, p.`price_pro`, p.`reduction_price`, p.`reduction_percent`, p.`reduction_from`, p.`reduction_to`, p.`ecotax`, p.`id_tax`, t.`rate`,
      ‘.($id_product_attribute ? ‘pa.`price`’ : ‘IFNULL((SELECT pa.price FROM `’._DB_PREFIX_.’product_attribute` pa WHERE id_product = ‘.intval($id_product).’ AND default_on = 1), 0)’).’ AS attribute_price
      FROM `’._DB_PREFIX_.’product` p
      ‘.($id_product_attribute ? ‘LEFT JOIN `’._DB_PREFIX_.’product_attribute` pa ON pa.`id_product_attribute` = ‘.intval($id_product_attribute) :  »).’
      LEFT JOIN `’._DB_PREFIX_.’tax` AS t ON t.`id_tax` = p.`id_tax`
      WHERE p.`id_product` = ‘.intval($id_product));

      $price_pro = Tools::convertPrice(floatval($result['price_pro']), $currency);
      return $price_pro;
      }

      Ensuite, dans votre fichier product.php à la racine de votre site, récupérez cette nouvelle valeur.

      Repérez les lignes :

      $productPriceWithTax = Product::getPriceStatic($id_product, true, NULL, 6);
      if (Product::$_taxCalculationMethod == PS_TAX_INC)
      $productPriceWithTax = Tools::ps_round($productPriceWithTax, 2);

      et collez ces nouvelles lignes en dessous pour récupérer votre nouvelle valeur:

      $productPricePro = Product::getPriceProStatic($id_product, true, NULL, 6);
      $productPricePro = Tools::ps_round($productPricePro, 2);

      Il faut maintenant ajouter cette valeur au tableau smarty afin de la récupérer dans votre template.

      En dessous de cette ligne dans product.php :

      ‘productPriceWithoutEcoTax’ => floatval($productPriceWithoutEcoTax),

      j’ai ajouté :

      ‘productPricePro’ => floatval($productPricePro),

      Il ne reste plus qu’à afficher cette nouvelle valeur dans votre fichier product.tpl,
      par exemple juste en dessous du prix classique :

      {$productPricePro}

      Encore une fois, j’ai fait au plus vite par rapport à votre question.
      J’ai affiché le prix_pro tel quel.
      Essayez si cela fonctionne de votre côté.
      Je vous rappelle que je n’ai testé cela que sous une version 1.3
      Mais bon je pense que les adaptations pour la 1.4 doivent être mineures.

      Mat

  4. sema31 dit :

    Bonjour,
    et tout d’abord merci pour cette réponse rapide, juste pour le premier point, la fonction getPriceProStatic(), je l’insère a quelle endroit exactement dans la classe car cela me gènére une erreur.
    merci d’avance

    • matgrafiks dit :

      En fait, il suffit de rajouter cette fonction (qui encore une fois peut être améliorée, j’ai fait au plus simple pour que cela fonctionne) dans la classe Product.php après la fonction public static function getPriceStatic() par exemple :

      function getPriceStatic(…



      // Group reduction
      if ($usereduc)
      $price -= Tools::ps_round($price * Group::getReduction(((isset($id_customer) AND $id_customer) ? $id_customer : 0)) / 100, 2);
      $price = ($divisor AND $divisor != NULL) ? $price/$divisor : $price;
      $price = Tools::ps_round($price, $decimals);
      self::applyEcotax($price, $result['ecotax'], $usetax, $id_address_delivery, $currency);
      self::$_prices[$cacheId] = $price;
      return self::$_prices[$cacheId];
      }

      public static function getPriceProStatic($id_product)
      {
      global $cookie, $cart;

      // Getting price
      $result = Db::getInstance()->getRow(‘
      SELECT p.`price`, p.`price_pro`, p.`reduction_price`, p.`reduction_percent`, p.`reduction_from`, p.`reduction_to`, p.`ecotax`, p.`id_tax`, t.`rate`,
      ‘.($id_product_attribute ? ‘pa.`price`’ : ‘IFNULL((SELECT pa.price FROM `’._DB_PREFIX_.’product_attribute` pa WHERE id_product = ‘.intval($id_product).’ AND default_on = 1), 0)’).’ AS attribute_price
      FROM `’._DB_PREFIX_.’product` p
      ‘.($id_product_attribute ? ‘LEFT JOIN `’._DB_PREFIX_.’product_attribute` pa ON pa.`id_product_attribute` = ‘.intval($id_product_attribute) :  »).’
      LEFT JOIN `’._DB_PREFIX_.’tax` AS t ON t.`id_tax` = p.`id_tax`
      WHERE p.`id_product` = ‘.intval($id_product));

      $price_pro = Tools::convertPrice(floatval($result['price_pro']), $currency);
      return $price_pro;
      }

      Mathieu

      • sema31 dit :

        merci beaucoup!!!,

        je suis sur 1.4 donc j’ai fait des petites modifs : le ligne présente sur 1.3 sur la racine, je l’ai trouvé dans le product controler, donc je suis allé presque jusqu’au bout, il ne me reste plus qu’à l’afficher dans le product.tpl :j’essaie de le mettre par le « our_price_display » mais cela l’affiche mais que 0€, savez vous comment l’insérer exactement dans le product.tpl.
        désolé encore et merci d’avance.

        • matgrafiks dit :

          Bonjour,

          Il suffit de récupérer la variable &productPricePro et de la placer dans le template où vous souhaitez.




          {if $priceDisplay == 2}
          <br />
          <span id= »pretaxe_price »><span id= »pretaxe_price_display »>{convertPrice price=$product->getPrice(false, $smarty.const.NULL)}</span> {l s=’tax excl.’}</span>
          {/if}

          <br />
          <span class= »our_price_display »>{$productPricePro}</span>

  5. misterpink dit :

    Bonjour,

    j’ai voulu utiliser cette fonction qui me parait génial mais je n’arrive pas a la faire fonctionner sous prestashop 1.4.7, je bute sur le moment ou il faut rajouté dans la classe product car je ne trouve rien qui corresponde a ces lignes…
    pourriez vous jeter un oeil sur product.php de la version 1.4.7 et me dire ou modifié?
    et je me pose la question aussi sur la gestion des prix des attributs?
    merci d’avance

  6. mel27 dit :

    Bonjour,

    Je vous remercie pour ce tuto, par contre étant débutante sur prestashop, je ne sait pas si je m’y prends correctement … je suis sous la version 1.4, j’ai bien intégré le nouveau champ dans ma base, puis dans le back office, les valeurs sont bien intégrées dans la base de données, par contre après je n’arrive pas à faire passer le deuxième prix à la place du prix de base … Quelqu’un pourrait m’aider sur les manipulations pour la version 1.4 s’il vous plait ?

  7. mel dit :

    Bonjour,

    Merci pour ce tuto, je sens que j’y suis presque … Je suis sur la version 1.4.6 de Prestashop, pour les étapes 1 à 3 il n’y a pas de souci par contre le code est différent après la requête.

    J’ai tenté ceci :

    $groupforprice = $cookie->$id_group;
    if ($groupforprice = 2) {
    $price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['pricet14'] : $specific_price['price'];
    }
    else if ($groupforprice = 1) {
    $price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['price'] : $specific_price['price'];
    }

    depuis le code de base :
    $price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['price'] : $specific_price['price'];

    selon la façon dont je change le code, seul l’un des deux tarifs s’affichent (j’ai fait le test avec deux clients ayant les groupes différents), avec le code ci-dessus, seul le tarif14 s’affiche…

    J’ai bien vérifié si la valeur de $id_group passait avec un echo et de ce côté c’était bon. Pourriez-vous m’aider ?

Leave a Reply

Copyright © 2009 Blog Matgrafiks, webdesign et référencement. All rights reserved.
Designed by Theme Junkie. Powered by WordPress.