jplt Posted July 23, 2010 Share Posted July 23, 2010 J'ai un souci sur mon prestashop et je ne sais pas s'il s'agit d'une erreur de configuration de ma part ou d'un vrai bug.Le problème est simple: - j'ai un produit x avec une disponibilité de 100 pièces.- deux clients constituent en même temps un panier de 75 pièces chacun de ce produit. Pas d'erreur car chacun est en dessous des 100 pièces disponibles.- Les 2 clients valident leur commande, pas d'erreurs affichées et je me retrouve avec une disponibilité erronée (du genre 9676245686) au niveau de mon produit et mes stocks sont complètement faux !Normalement prestashop devrait accepter la première validation de commande qui a été effectuée et refuser la deuxième me semble-t-il...J'ai modifié mon code pour introduire ce contrôle juste avant la validation d'une commande dans mes modules de paiement (chèque et ATOS) mais avant de mettre en prod je fais ma petite enquête pour savoir s'il s'agit d'un bug ou d'une erreur de ma part... Link to comment Share on other sites More sharing options...
eltitos Posted July 23, 2010 Share Posted July 23, 2010 bonjour,question bete mais on sait jamais : as tu "Activer la gestion des stocks " dans le Bo ? Link to comment Share on other sites More sharing options...
jplt Posted July 23, 2010 Author Share Posted July 23, 2010 Oui c'est activé.Plus précisément ma config dans BO >> Préférences >> Produits est:Autoriser la commande de produits hors stock : nonActiver la gestion des stocks : ouiDisplay available quantities on product page : oui Link to comment Share on other sites More sharing options...
eltitos Posted July 23, 2010 Share Posted July 23, 2010 Les 2 clients valident leur commande Les clients valident exactement au meme moment ?Si le client 1 valide la commande, il est donc redirige vers le site de la banque, pour prestashop le stock est toujours a 100 jusqu'au retour sur la page validation.phpDonc pour le client 2 le stock est toujours a 100 jusqu'au retour sur la page validation.php du client 1. Si le client 2 valide ( et donc va sur le site de la banque) avant le retour du client 1 le probleme apparait. J’ai modifié mon code pour introduire ce contrôle juste avant la validation Je me demande bien ce que tu peux faire pour empecher cela ? Link to comment Share on other sites More sharing options...
jplt Posted July 24, 2010 Author Share Posted July 24, 2010 Il n'est pas nécessaire que les 2 clients valident au même moment. Il suffit que les 2 clients aient rajouté le même produit dans leur panier alors que le produit était disponible. Je n'ai pas l'impression qu'un contrôle de disponibilités soit effectué à nouveau au moment de la validation de la commande. J'ai parcouru le code et je ne vois pas où ce contrôle peut exister aujourd'hui.Pour répondre à la question, pour empêcher le problème j'ai donc modifié le fichier modules/cheques/validation.php et je pense aussi modifier le fichier modules/atos/call_request.php et rajouter le code suivant (je me suis largement inspiré du code de cart.php): foreach($cart->getProducts() as $product) { $product_list[] = $product; $quantities[$product['id_product']] += $product['quantity']; } foreach($product_list as $product) { $idProduct = $product['id_product']; $idProductAttribute = $product['id_product_attribute']; $qty = $quantities[$idProduct]; $productName = $product['name']; $producToAdd = new Product(intval($idProduct), false, intval($cookie->id_lang)); if (!$producToAdd->id OR !$producToAdd->active) $errors[] = Tools::displayError("Le produit {$productName} n\'est plus disponible"); else { /* Check the quantity availability */ if ($idProductAttribute AND is_numeric($idProductAttribute)) { if (!$producToAdd->isAvailableWhenOutOfStock($producToAdd->out_of_stock) AND !Attribute::checkAttributeQty(intval($idProductAttribute), intval($qty))) { $errors[] = Tools::displayError("Le produit {$productName} n\'est plus disponible"); } } elseif ($producToAdd->hasAttributes()) { $idProductAttribute = Product::getDefaultAttribute(intval($producToAdd->id), intval($producToAdd->out_of_stock) == 2 ? !intval(Configuration::get('PS_ORDER_OUT_OF_STOCK')) : !intval($producToAdd->out_of_stock)); if (!$idProductAttribute) { Tools::redirectAdmin($link->getProductLink($producToAdd)); } elseif (!$producToAdd->isAvailableWhenOutOfStock($producToAdd->out_of_stock) AND !Attribute::checkAttributeQty(intval($idProductAttribute), intval($qty))) { $errors[] = Tools::displayError("Le produit {$productName} n\'est plus disponible"); } } elseif (!$producToAdd->checkQty(intval($qty))) { $errors[] = Tools::displayError("Le produit {$productName} n\'est plus disponible"); } } } if (sizeof($errors)) { $smarty->assign('errors', $errors); $smarty->display(_PS_THEME_DIR_.'errors.tpl'); include(dirname(__FILE__).'/../../footer.php'); } else { $cheque = new Cheque(); $cheque->validateOrder($cart->id, _PS_OS_CHEQUE_, $total, $cheque->displayName, NULL, $mailVars, $currency->id); $order = new Order($cheque->currentOrder); Tools::redirectLink(__PS_BASE_URI__.'order-confirmation.php?id_cart='.$cart->id.'&id;_module='.$cheque->id.'&id;_order='.$cheque->currentOrder.'&key;='.$order->secure_key); } Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now