Jump to content

[HOW TO]Ajout automatique de bon de réduction en fonction du nombre d'article par catégorie


victa

Recommended Posts

Bonjour,

Je suis en train de mettre en place une boutique pro qui proposera des produits aux pharmaciens, pour calculer les réductions sur la quantité, j'ai modifié la requête du panier pour trier les produits par catégorie par défaut, ce qui correspond pour moi à des laboratoires pharmaceutiques.
Ensuite je somme les articles et si un "palier" de 12 articles par exemple est atteint pour un labo j'essaye d'ajouter un bon de réduction que j'ai crée dans le backoffice et stocké dans une table crée pour l'occasion comme suit :

id_palier    id_labo    valeur    reduc (l'id du bon)
   1    1    12    3
   2    1    24    4
   3    3    12    2



Dans le fichier OrderOpcController.php (je suis sur la 1.4.11 pour l'instant), j'ai mis ce code ci.

public function preProcess()
   {
       parent::preProcess();

       /**********************************************************************************************************/
       /*********************************** Liste des promos par labo/qte ****************************************/
       /**********************************************************************************************************/
       $result = Db::getInstance()->ExecuteS('SELECT labpal.valeur, labpal.reduc, SUM(cp.quantity) AS qte
                                   FROM `'._DB_PREFIX_.'labo` lab
                                   LEFT JOIN `'._DB_PREFIX_.'product` p ON p.id_category_default = lab.id_cat 
                                   LEFT JOIN `'._DB_PREFIX_.'cart_product` cp ON p.id_product = cp.id_product
                                   LEFT JOIN `'._DB_PREFIX_.'labo_palier` labpal ON lab.id_labo = labpal.id_labo
                                   WHERE cp.`id_cart` = '.(int)$this->cart->id.'
                                   GROUP BY p.id_category_default');
       foreach ($result as $row)
       {
           if( $this->cart->addDiscount( (int)$row['reduc'] ))
           {
               echo '<!-- numero de bon '.$row['reduc'].' -->';
           }
           else
           {
               echo '<!-- bug -->';
           }
       }    



Le code me retourne donc bien un commentaire "numéro de bon 3" en entête (avant la DTD). ce qui voudrais dire qu'il a ajouter la réduc au panier mais rien dans le panier, ni dans la base de donnée dans ps_cart_discount... quelqu'un aurait une idée ?

PS : hélas je ne peux vous donner accès au site qui est privatisé par le module "privateshop".

Link to comment
Share on other sites

J'ai essayé ces modifications que tu me suggère, par contre non, je ne surclasse pas n'étant pas trop sur de comment il faut procéder, tu aurais une piste ?

J'ai donc mis

if( $this->cart->addDiscount( (int)$row['reduc'] ))
           {
               $this->cart->update();}



Et rien ne change, ni bon dans le résumé du panier, ni dans la base de donnée...

Link to comment
Share on other sites

C'est bon ! Pour les personnes intéressés et qui tomberait ici je poste ma solution (vraiment perso)

Donc dans /override/controllers/OrderOpcController.php (éventuellement a créer) je met mon code maison

<?php

class OrderOpcController extends OrderOpcControllerCore
{
   public function preProcess()
   {
       parent::preProcess();

       /**********************************************************************************************************/
       /*********************************** Liste des promos par labo/qte ****************************************/
       /**********************************************************************************************************/

      $result = Db::getInstance()->ExecuteS('SELECT reduc
                                           FROM '._DB_PREFIX_.'labo_palier 
                                           INNER JOIN '._DB_PREFIX_.'labo ON '._DB_PREFIX_.'labo.id_labo = '._DB_PREFIX_.'labo_palier.id_labo
                                           INNER JOIN '._DB_PREFIX_.'product ON '._DB_PREFIX_.'labo.id_cat = '._DB_PREFIX_.'product.id_category_default
                                           INNER JOIN '._DB_PREFIX_.'cart_product ON '._DB_PREFIX_.'product.id_product = '._DB_PREFIX_.'cart_product.id_product
                                           WHERE '._DB_PREFIX_.'cart_product.id_cart = '.(int)$this->cart->id.' 
                                           AND '._DB_PREFIX_.'cart_product.quantity >= '._DB_PREFIX_.'labo_palier.valeur
                                           GROUP BY CONCAT('._DB_PREFIX_.'labo_palier.id_labo,\'|\',valeur)');                  

       $this->cart->deleteAllDiscount();
       foreach ($result as $row)
       {
           $this->cart->addDiscount( (int)($row['reduc']) )
       }    

       /***********************************************************************************************************/
   }
}

?>



Ce code a pour but de scanner deux tables maisons pour le panier courant et trouver les labos "contenus" dans le panier et leurs paliers de réduction. Chaque palier atteint donne droit à un bon de réduction créé dans le backoffice.
Je l'ajoute donc automatiquement et je met à jour (pas besoin d'autre chose puisque ont est dans le preprocess, le bon s'affichera donc dans la liste des bons du client.

Comme vous pouvez le voir aussi j'ai créé pour me simplifier la vie une nouvelle fonction au doux nom de deleteAllDiscount(), pour se faire dans le fichier /override/classes/Cart.php j'ai ajouté ceci :

<?php
   class Cart extends CartCore
   {
       /* Supprime tous les bons du panier */
       public function deleteAllDiscount()
       {      
           return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cart_discount` WHERE `id_cart` = '.(int)($this->id).'');
       }
   }
?>



Un peu violent je vous l'accord mais on pourrait imaginer une notation particulière des "bons automatiques" pour les exclure
de cette fonction...

Bon courage à tous.

Link to comment
Share on other sites

Oui je devais te répondre avant mais pas eu le temps.

Inutile donc que je te détaille la surcharge tu viens de le faire avec brio : je parie que ça va servir à beaucoup :)

Ma suggestion du $cart-update() , faite à l'aveugle, n'avait finalement aucun intérêt dans ce cas précis, si on regarde de près la fonction addDiscout :

    public    function addDiscount($id_discount)
   {
       return Db::getInstance()->AutoExecute(_DB_PREFIX_.'cart_discount', array('id_discount' => intval($id_discount), 'id_cart' => intval($this->id)), 'INSERT');
   }



L'insertion est fait directement et non en objet, pas besoin donc de recourir à update.
Cela signifiait donc que soit addDiscount($id_discount) n'etait pas exécutée soit que l'id était erroné...

Content que tu sois parvenu à tes fins.

Link to comment
Share on other sites

En fait la requete (que je viens de mettre à jour) fonctionne bien mais le soucis est que la réduction est affecté au total du panier (HT puisque ce sont des pros) mais pas au labo en question uniquement... forcément 5% sur 12 articles d'un labo n'équivaut pas à 5% sur une commande de 500€ au total... dont 12 articles d'un labo et le reste d'autres labos.

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...