Jump to content

Décrémentation du stock


Recommended Posts

Bonjour a tous

j'utilise prestashop depuis quelques temps pour ma boutique (voir ma signature) et j'en suis pleinement satisfait.
Il y a néanmoins un point qui me chagrine un peu.
C'est la décrémentation du stock. Ou plus exactement le moment ou le stock se décrémente par rapport au stade d'une commande.

Sur mon boutique j'ai deux parties.
la première la boutique ou les clients ne peuvent commander que si le produit est disponible.
La deuxième (partie réservation) ou le client peut commander (en fait un système de pré-commande) des produits non disponible que je commanderais chez mon fournisseur et pour lequel le client sait qu'il devra attendre quelques semaines.

Donc ma volonté pour la partie boutique c'est qu'aucun client ne puisse commander si le stock n'est pas suffisant. En refusant les commandes hors stock ça se gère très bien.

Par contre dans le cas d'une commande vidant le stock je rencontre un soucis.
Imaginons que sur un produit il reste 2 en quantité et que quelqu'un me les commande. Sa commande passe en paiement accepté (par exemple) mais pour autant le stock n'est pas décrémenté. Ni même lorsque je mets la commande en préparation.
Même en la mettant au stade livraison le stock est toujours la.
Je crois que le concepteur de prestashop n'a jamais fait de logistique, car je vous assure qu'il est extrêmement difficile d'avoir un le même produit chez le transporteur et encore dans son stock.

Pour ma part je souhaiterais que le stock soit décrémenté dès la validation de la commande (comme sur 99% des sites ecommerce).
Je présume que c'est un des status qui fait bouger le stock.

En fonction de cela est ce que quelqu'un pourrait me dire ce qu'il faut que je modifie pour que mon stock soit décrémenté au moment de la validation de la commande (validation du panier du client = décrémentation du stock) et ce quelque soit le moyen de paiement.

Merci d'avance pour votre aide.
Cordialement

Link to comment
Share on other sites

J'ai continué mon analyse de ce problème hier en attendant vos réponses, j'en suis sur pleine d'interet, et je me demande si le problème n'est pas ailleurs.
En effet lorsque je regarde une autre commande qui est également en cours de livraison (donc au même stade que celle pour laquelle la décrémentation du stock ne s'est pas faite) je constate que le stock concerné par cette autre commande c'est lui bien décrémenté.

J'ai donc tenté de trouver les différences sur les produits de ces deux commandes (nous dirons commande A = problème, commande B = pas de soucis).
je vois deux différences.

La première c'est que dans la commande A il n'y a que des produits avec déclinaisons alors que dans la commande B il y 1 produit a déclinaison et l'autre sans déclinaison.

La deuxième (et je me demande si le problème ne viendrait pas de la) c'est que dans la commande B tous les produits au moment de la commande étaient dispo alors que dans la commande A un des produits ne l'était pas.
Comme je vous l'ai dit dans mon premier message, il y a deux zones sur le site. Boutique (produit dispo sinon commande impossible) et Réservation (produit jamais dispo et commande toujours possible).

Dans le cas de la commande A le client a commandé 1 produit en réservation (première ligne) et les autres dans la boutique (voir ci-dessous)

Produit --------------------------------------------------- PU -------- Qté -- Remboursé -- Stock -- Total -- Rembourser
Arôme MLB - 10ml - Dosage en Nicotine : Moyen ------ 6,90 € ------- 1 --------- 0 ---------- 0 ------ 6,90 € 0/1
Réf : Rmlb10
Arôme Kamel - 10ml - Dosage en Nicotine : Haut ------ 6,90 € ------- 1 --------- 0 ---------- 2 ------ 6,90 € 0/1
Arôme Deluxe Tobacco - 30ml - Dosage --------------- 14,90 € ------- 1 --------- 0 ---------- 1 ----- 14,90 € 0/1
en Nicotine : Moyen
Arôme Winston Tobacco - 15ml VG - Dosage ------------ 9,90 € ------ 1 ---------- 0 ---------- 1 ------ 9,90 € 0/1
en Nicotine : Haut

Comme je venais de recevoir le produit de la première ligne j'ai pu mettre la commande en préparation.
Pour cela j'ai passé directement la commande du stade produit indisponible à paiement accepté, puis en prep etc (voir ci dessous)

21-05-2010 01:24:38  En cours de livraison  
20-05-2010 22:01:17  Préparation en cours 
20-05-2010 22:00:30  Paiement accepté 
20-05-2010 18:48:19  Produit(s) indisponibles 



Par contre je n'ai pas au préalable remis le stock qui était a zéro (sur l'arome Arôme MLB) a 1 (puisque ce stock est toujours sensé rester a zéro).

Est ce que la non décrémentation de mes produits sur le sotck pourrait venir de la.

En clair et pour résumer : Le fait de passer en prep un produit dont le stock est a zéro sans au préalable avoir mis le stock a niveau pourrait il bloquer la décrémentation des autres produits sur la même commande ?

merci d'avance

Link to comment
Share on other sites

Je me permets de remonter le message car il est déjà passé en page 2 sans que personne ne m'apporte un début de réponse.

Est-ce a dire que mes questions sont
1 - Idiotes :red:
2 -Trop complexes :coolsmirk:
3 - tout le monde s'en fout :lol:

En tout cas et plus sérieusement, je suis toujours aussi ennuyé avec mon problème et si quelqu'un qui s'y connait bien pouvait m'aider ce serait super sympa.

Merci d'avance

Link to comment
Share on other sites

  • 3 weeks later...

Bonjour Elteor

As-tu trouvé la solution à ton problème. Car je constate la même chose sur mon site.

J'ai eu le cas d'une commande de 3 différents articles. 2 ne sont pas en stock et le 3ème oui. Malheureusement, il ne décrémente pas le stock pour la marchandise qui est à disposition.

C'est très ennuyant.

Pour des commandes où les articles sont tous en stock, je n'ai pas ce problème, là tout fonctionne parfaitement.

Merci à tous pour votre aide!

Salutations

Link to comment
Share on other sites

Salut Linsi-tech

Non toujours pas. Mais au moins ton message me prouve que j'avais vu juste quant a la cause du problème.
Mais comme depuis plus de 15 jours que j'ai posté mon message je n'ai eu aucune réponse je me dis que tout le monde s'en fout.
Pour ma part j'ai passé mon week end a faire une inventaire et maintenant je croise les doigts pour ne plus avoir de clients qui commandent en même temps dans la partie boutique (produits dispo) et dans la partie réservation (pas dispo).

Je suis très surpris que ce problème n'ait jamais été évoqué sur ce forum car la gestion d'un stock c'est tout de meme quelque chose de primordiale

Link to comment
Share on other sites

  • 2 weeks later...

Bon je continue a discuter (presque) seul mais je ne désespère par qu'a un moment d'autres personnes se rendent compte de l'importance du problème.

J'ai réussi a comprendre ou été le bug. Par contre je ne trouve pas comment le corriger.

Donc le problème de non décrémentation d'un produit en stock lors d'une commande est directement lié au fait qu'un produit hors stock soit commandé avant.
Exemple :

produit---- qté en stock ---- qté cdé ----- stock après cde
A --------------- 10 ------------- 2 ------------- 8
B ------------ 2 ----------------- 2 -------------- 0
C ------------------ 0 ---------- 1 --------------- 0
D ------------- 11-------------- 2---------------- 11

En fait les produits se décrémentent parfaitement sauf que dès qu'un produit étant a zéro au niveau stock est commandé les produits suivant ne se décrémentent plus.

Est ce que quelqu'un aurait une idée de génie (même a la con si ca solutionne je prends aussi :lol: ) pour régler ce problème.

Link to comment
Share on other sites

des nouvelles la dessus, je me souviens avoir participe a plusieurs post similaires lan dernier...je voudrais bien savoir si cest regle, car jen ai marre de refaire des inventaires physique a tour de bras :)

Link to comment
Share on other sites

Hello,

Juste pour vous prévenir, un de mes client rencontre le même problème, je vais me pencher la dessus cette semaine.

J'ai cependant une question, que préfèreriez vous lors d'une commande de ce type :
1 - Tous les stocks sont décrémentés et les stocks peuvent passer en négatif
2 - Blocage à 0 pour les produits indisponibles

Merci d'avance,

Link to comment
Share on other sites

A priori si le produits est marque comme commandable si indisponible.le stock devrait decrementer jusqua devenir negatif, pour que quand je recois mon nouveau stock, les paires deja vendues sont ainsi deja enleve du stock.


Si le produit nest pas commandable quand il est indisponible, a ce moment la tout simplement la commande devrait etre bloque.. donc pas de decrementation de stock possible..non??

Link to comment
Share on other sites

Hello,

Juste pour vous prévenir, un de mes client rencontre le même problème, je vais me pencher la dessus cette semaine.

J'ai cependant une question, que préfèreriez vous lors d'une commande de ce type :
1 - Tous les stocks sont décrémentés et les stocks peuvent passer en négatif
2 - Blocage à 0 pour les produits indisponibles

Merci d'avance,


Une petite préférence pour la solution 2 au vu de la configuration de mon site.
Mais la solution 1 me conviendrait également.
Pour moi l'important est surtout que les produits en stocks se décrémentent ;-)

ps : Pour le moment pas encore de réponse de la part de Bruno Leveque.
Link to comment
Share on other sites

Alors, je pense avoir pas mal avancé sur le sujet :

Cependant avant de vous présenter mes solutions je vous averti que c'est sans aucune garantie. Les modifications touchent le coeur de prestashop, aussi elle seront effacée lors d'une mise a jour de prestashop. D'autre part, j'ai effectué mes modifications sur un prestashop Version 1.2.0.8, il est possible que dans votre version les fichiers que j'ai modifié soient différents.
Quoi qu'il en soit je ne m'engage pas à maintenir vos versions car je suis déjà très chargé en ce moment, cependant je resterais en suivi de ce message et j'essaierai de vous aider au mieux.
Dernier avertissement, j'effectue ces modifications sur le site d'un client en production, mais il se peut que des problèmes soient engendrés, mon client a insisté pour que j'effectue tout de même ces premières modifications, je vous tiendrais au courant si nous constatons des dommages collatéraux à corriger.

Voila après ces quelques précision :

1 - Pour simplement corriger le bug des produits qui ne sont pas décrémenté quand un produit est déjà à 0:
Le fichier à corriger est celui ci :
"DOSSIER_PRESTASHOP/classes/PaymentModule.php"

Et chercher ces lignes :

if ($id_order_state != _PS_OS_OUTOFSTOCK_ AND (($updateResult = Product::updateQuantity($product)) === false OR $updateResult === -1))
{
   $id_order_state = _PS_OS_OUTOFSTOCK_;
   $history = new OrderHistory();
   $history->id_order = intval($order->id);
   $history->changeIdOrderState(_PS_OS_OUTOFSTOCK_, intval($order->id));
   $history->addWithemail();
}



Corrigez les en :

if (($id_order_state != _PS_OS_OUTOFSTOCK_) AND (($updateResult = Product::updateQuantity($product)) === false OR $updateResult === -1))
{       
   $putOutOfStock = true;
}




Et quelques lignes plus loin recherchez ceci :

} // end foreach ($products)



Et ajoutez ceci juste en dessous :

if (isset($putOutOfStock)) 
{
   $id_order_state = _PS_OS_OUTOFSTOCK_;
   $history = new OrderHistory();
   $history->id_order = intval($order->id);
   $history->changeIdOrderState(_PS_OS_OUTOFSTOCK_, intval($order->id));
   $history->addWithemail();
}



Et pour expliquer a ceux qui ne comprennent pas bien le php, a cet endroit est mis a jour le stock de tous les produits un par un. Or la mise a jour des produits ne se fait pas pour une commande notée "Produits indisponibles", et le système passe la commande en "Produits indisponible" dès qu'un des produits est détecté en stock a zero.
Pour corriger ce problème, nous ne faisons la mise a jour du status de la commande qu'après avoir bouclé sur tous les produits.
Voila donc pour la solution 1.

Link to comment
Share on other sites

Ensuite pour la gestion des stocks négatifs. Je pense que ces modifications sont un peu plus risquées, disons que je m'attends a avoir d'autres modifications à effectuer pour que tout roule parfaitement. Je vous livre tout de même mon état d'avancement puisque j'arrive bien a avoir des stock négatifs.

2 - Gestion des stocks négatifs

Premièrement effectuez les modifications apportés dans la solution 1.

Ensuite direction votre base de donnée pour effectuer cette requête :

ALTER TABLE `ps_product` CHANGE `quantity` `quantity` INT( 10 ) NOT NULL DEFAULT '0'


(pensez a modifier le préfixe "ps_" par celui de votre base de donnée si vous n'utilisez pas celui par défaut)

Ensuite modifiez le fichier "DOSSIER_PRESTASHOP/classes/Product.php"

Recherchez la fonction appelée : "updateQuantity"
la voici :

public static function updateQuantity($product)
   {
       if (!is_array($product))
           die (Tools::displayError());

       $result = Db::getInstance()->getRow('
       SELECT `quantity`
       FROM `'._DB_PREFIX_.($product['id_product_attribute'] ? 'product_attribute' : 'product').'`
       WHERE `id_product` = '.intval($product['id_product']).($product['id_product_attribute'] ?
       ' AND `id_product_attribute` = '.intval($product['id_product_attribute']) : ''));

       if (!Configuration::get('PS_STOCK_MANAGEMENT'))
           return true;
       if (self::isAvailableWhenOutOfStock($product['out_of_stock']) AND intval($result['quantity']) == 0)
           return -1;

       if ($result['quantity'] < $product['quantity'])
       {
           Db::getInstance()->Execute('
           UPDATE `'._DB_PREFIX_.($product['id_product_attribute'] ? 'product_attribute' : 'product').'`
           SET `quantity` = 0
           WHERE `id_product` = '.intval($product['id_product']).($product['id_product_attribute'] ?
           ' AND `id_product_attribute` = '.intval($product['id_product_attribute']) : ''));
           return false;
       }

       Db::getInstance()->Execute('
       UPDATE `'._DB_PREFIX_.'product'.($product['id_product_attribute'] ? '_attribute' : '').'`
       SET `quantity` = `quantity`-'.intval($product['quantity']).'
       WHERE `id_product` = '.intval($product['id_product']).
       ($product['id_product_attribute'] ? ' AND `id_product_attribute` = '.intval($product['id_product_attribute']) : ''));
       return true;
   }



Remplacez la par celle ci légèrement modifiée :

public static function updateQuantity($product)
   {
       if (!is_array($product))
           die (Tools::displayError());

       $result = Db::getInstance()->getRow('
       SELECT `quantity`
       FROM `'._DB_PREFIX_.($product['id_product_attribute'] ? 'product_attribute' : 'product').'`
       WHERE `id_product` = '.intval($product['id_product']).($product['id_product_attribute'] ?
       ' AND `id_product_attribute` = '.intval($product['id_product_attribute']) : ''));

       if (!Configuration::get('PS_STOCK_MANAGEMENT'))
           return true;

       $update = Db::getInstance()->Execute('
       UPDATE `'._DB_PREFIX_.'product'.($product['id_product_attribute'] ? '_attribute' : '').'`
       SET `quantity` = `quantity`-'.intval($product['quantity']).'
       WHERE `id_product` = '.intval($product['id_product']).
       ($product['id_product_attribute'] ? ' AND `id_product_attribute` = '.intval($product['id_product_attribute']) : ''));


       if (self::isAvailableWhenOutOfStock($product['out_of_stock']) AND intval($result['quantity']) == 0) {
           return -1;
       }

       if ($result['quantity'] < $product['quantity'])
       {
           return false;
       }

       return $update;
   }



Et voila cela semble fonctionner, je vous conseille cependant d'attendre mon retour sur expérience avant de faire cette deuxième solution.

Et pour vous expliquer, premièrement vous autorisez que le stock soit négatif en base de donnée grâce à la requète. Ensuite la fonction met a jour les stocks des produits quelque soit les quantités demandées par le client et les stocks restant. Ensuite seulement je renvoie les mêmes résultats que la fonction initiale, ceci afin de bien passer la commande en "Produits indisponibles" si un stock passe à 0.


Voila j'espère avoir pu en aider certains.

Bon courage sur ces problèmes et n'hésitez pas à poster ici pour le suivi.

Thierry

Link to comment
Share on other sites

probleme similaire de gestion stock qui ne se fait pas version 1.2.5

1ere question :j ai eu sur ma boutique ma premiere commande, mais le decompte du stock ne s est pas faite?(ni en front ni en back)je l ai pourtant activé dans preferences, produits....

2 eme question, est il possible d'appliquer le decompte du moment que le client a passé la commande?
merci beaucoup

jerome

Link to comment
Share on other sites

Génial Culte :coolsmile: . Merci beaucoup. Je vais tester (ton premier message) sur mon local dès ce soir.

jerometast pour qu'on puisse t'aider et te dire si tu rencontres les memes soucis que nous il faudrait que tu donnes un peu plus de détails et en particulier le détail de ta commande.

Link to comment
Share on other sites

Solution 1 testée en local.
Ca fonctionne parfaitement et pour le moment je n'ai pas détecté de bug.
Du coup je l'ai transféré sur mon site.

Merci du coup de main Culte.


De rien ;)

Ca a l'air de fonctionner de mon coté aussi, et toujours pas de problèmes non plus avec les stocks négatifs pour l'instant.

Content d'avoir pu aider en tout cas.
Link to comment
Share on other sites

Bonjour tout le monde
ca fait longtemps que cherche à avoir les stock en négative
je suis sur presta 1.3
Pour la modif 1 le fichier PaymentModule.php est complètement modifié et aucune des lignes décrite précédemment n'est la je suppose que ce problème a été corrigé
pour la modif 2 rien n'as changé le fichier est le même j'ai appliqué la commande sql sur la base et fait la modification du fichier
j'ai fait un test
produit 1 : 1 en stock
produit 2 : 2 en stock
produit 3 : 0 en stock
et j'ai commandé les 3 produits avec des quantités supérieures à celle en stock
tout fonctionne bien mais dans l'admin j'ai 0 dans le stock des 3 produits :( je ne vois pas de quantités négatives
est ce que quelqu'un a esseyé l'astuce du stock négative et a un nombre négative du stock dans l'admin?
merci d'avance

Link to comment
Share on other sites

En effet la solution 1 est obsolète pour la version 1.3, le problème étant corrigé de la même manière.

Pour les stocks négatifs j'ai jeté un oeil rapide sur la version 1.3, et pour l instant je ne comprends pas pourquoi cela ne marcherais pas chez vous si la requete sql est bien passée et que vous autorisez bien la commande de produits hors stock.

J'essayerai de regarder plus ne profondeur a l'occasion.

Link to comment
Share on other sites

Alors, j'ai installé vite fait presta 1.3 pour tester de mon coté.

La fonction a un peu changé, elle gère maintenant les quantités des packs, enfin bref j'ai refait mes modifications à la volée :
1 -> l'update de la base de donnée pour retirer le "unsigned" sur le champ quantity
2 -> modifier la méthode "UpdateQuantity" pour qu'elle ressemble à ceci :

public static function updateQuantity($product)
       {
               if (!is_array($product))
                       die (Tools::displayError());

               if (Pack::isPack(intval($product['id_product'])))
               {
                       $products_pack = Pack::getItems(intval($product['id_product']), intval(Configuration::get('PS_LANG_DEFAULT')));
                       foreach($products_pack AS $product_pack)
                       {
                               $tab_product_pack['id_product'] = intval($product_pack->id);
                               $tab_product_pack['id_product_attribute'] = self::getDefaultAttribute($tab_product_pack['id_product'], 1);
                               $tab_product_pack['cart_quantity'] = intval($product_pack->pack_quantity * $product['cart_quantity']);
                               self::updateQuantity($tab_product_pack);
                       }
               }

               $result = Db::getInstance()->getRow('
               SELECT `quantity`
               FROM `'._DB_PREFIX_.($product['id_product_attribute'] ? 'product_attribute' : 'product').'`
               WHERE `id_product` = '.intval($product['id_product']).($product['id_product_attribute'] ?
               ' AND `id_product_attribute` = '.intval($product['id_product_attribute']) : ''));

               if (!Configuration::get('PS_STOCK_MANAGEMENT'))
                       return true;

               Db::getInstance()->Execute('
               UPDATE `'._DB_PREFIX_.'product'.($product['id_product_attribute'] ? '_attribute' : '').'`
               SET `quantity` = `quantity`-'.intval($product['cart_quantity']).'
               WHERE `id_product` = '.intval($product['id_product']).
               ($product['id_product_attribute'] ? ' AND `id_product_attribute` = '.intval($product['id_product_attribute']) : ''));


               if (self::isAvailableWhenOutOfStock($product['out_of_stock']) AND intval($result['quantity']) == 0)
                       return -1;

               if ($result['quantity'] < $product['cart_quantity'])
               {
                       return false;
               }

               return true;
       }



Et j'ai bien des stocks négatifs lors du passage d'une commande.

Donc pour moi, soit tu as déjà des modifications qui rentrent en conflit avec ce que je fais, soit je suis trop rouillé pour t'aider :P

Bon courage ;)

Link to comment
Share on other sites

cette fois ca à l'air de fonctionner à merveille :coolsmirk:
merci beaucoup :lol:


Ah bas tu m'en vois ravi :)

Par contre je n'ai rien testé dès que ça deviens un peu plus particulier, genre des retour et reinjections en stock... enfin bref si tu remarques des problèmes n'hésite pas à m'en parler ici, je reste en suivi de ce post.

Bon courage pour vos boutiques !

Culte
Link to comment
Share on other sites

il va falloir me décrire plus précisément le cas, nombre de produits pour chaque référence dans la commande + nbr en stock pour chacune des références et quels produits annulés et quelle quantité annulée.

Car je n'arrive pas a reproduire ton problème, mais j'ai parfois la ligne du produit en négatif qui disparait lors de l'annulation de mon coté.

Quoi qu'il en soit je ne pourrais pas voir cela rapidement, je sort ma boutique dans la semaine je suis donc assez occupé.

Bon courage

Link to comment
Share on other sites

je l'ai eu dans plusieurs cas mais voici un exemple
un produit en stock 4 :
je passe une commande avec 10 produits donc en stock en a - 6
toute fois je décide d'annuler la commande donc dans l'admin > commandes > la fiche de la commandes je coche la case devant le nom du produit et j'annule j'ai ce message
bonne chance pour ta boutique

Link to comment
Share on other sites

@choussamaster

Je suis désolé je n'ai pas encore eu le temps de me pencher sur ton problème, j'espère que les cas d'annulation de produits hors stock ne sont pas trop fréquent.
Il faut que je passe ma boutique en 1.3, une fois que ce sera fait je me pencherais la dessus.

@Elteor

Merci à toi, bonne chance de ton coté également ;)
Ma boutique propose des produits de décoration "design", ce n'est pas encore très fourni j'ai un fournisseur un peu capricieux, mais ça commence à prendre forme.
Et bien sur tu peux aller voir et diffuser le lien, toute publicité est bonne à prendre :P
Le lien est désormais dans ma signature.

a+

Link to comment
Share on other sites

  • 2 months later...
  • 4 weeks later...
  • 4 weeks later...
  • 1 month later...

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