Jump to content

Contrôle disponibilité produit


jplt

Recommended Posts

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

Oui c'est activé.

Plus précisément ma config dans BO >> Préférences >> Produits est:

Autoriser la commande de produits hors stock : non
Activer la gestion des stocks : oui
Display available quantities on product page : oui

Link to comment
Share on other sites

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

Donc 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

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

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