Jump to content

mis à jour du stock produit


Recommended Posts

Bonjour

j'ai remarqué un problème au niveau de gestion du stock lorsque je passe une commande: si j'ai un produit comme suit

produit ---------attribut1--------- stock 0

produit ---------attribut2--------- stock 2

produit ---------attribut3--------- stock 0

et je commende tout le stock restant (ici 2 pour l'attribut2) a partir du BO a l'aide d'un module développé pour la création des commandes en BO.

la création du commande se fait convenablement. dans la fiche du commande j'ai le produit commandé ++ PU* ++ Qté 2 ++ remboursé 0 ++ Stock 0 ++ total...

comme vous voyez j'ai le stock nul mais lorsque je me rend sur la fiche produit j'ai toujours le stock en 2.

dans ce module(que j'ai amélioré sur mesure) j'ai une fonction pour mettre à jour la quantité du chaque attribut avant de passer la commande pour ne pas se rendre a la fiche produit pour en modifier la quantité.

voici le code qui gère l'ajout du commande

include_once(dirname(__FILE__).'/../../../config/config.inc.php');
include_once(PS_ADMIN_DIR.'/../classes/AdminTab.php');
$var = $_POST['attribute_'.$_POST['id_product']];
if(isset($_POST['id_product'], $_POST['quantity'])) // Si le formulaire est envoyé.
{
 if (!empty($_POST['id_product']) AND !empty($_POST['quantity']));// Si tous les champs ont été remplis correctement.
{ $sql = 'UPDATE '._DB_PREFIX_.'product_attribute SET '._DB_PREFIX_.'product_attribute.quantity='.$_POST['quantity'].' WHERE '._DB_PREFIX_.'product_attribute.id_product='.$_POST['id_product'].' AND '._DB_PREFIX_.'product_attribute.id_product_attribute ='.$var;
$rq = Db::getInstance()->ExecuteS($sql);
 $sel = 'SELECT SUM('._DB_PREFIX_.'product_attribute.quantity) AS total FROM '._DB_PREFIX_.'product_attribute WHERE '._DB_PREFIX_.'product_attribute.id_product='.$_POST['id_product'];
$req = Db::getInstance()->ExecuteS($sel);
foreach ($req as $line)
{
$upd = 'UPDATE '._DB_PREFIX_.'product SET '._DB_PREFIX_.'product.quantity='.$line['total'].' WHERE '._DB_PREFIX_.'product.id_product='.$_POST['id_product'];
$rq = Db::getInstance()->ExecuteS($upd);
}
}
}

je crois que le 1er bout de code s’exécute plus d'une fois.

Link to comment
Share on other sites

Salut,

 

Je ne sais pas où tu as trouvé ce module qui fait en effet plein de chose non conforme.

Il ajoute en outre des failles (je devrais dire gouffres) de sécurité.

A bannir.

 

Le premier segment de code ne s'exécute même pas dans le contexte de l'object AdminTab.

Il s'exécute donc à chaque fois sans contrôle des permission et même si il s'agit d'une annonce du BO.

A bannir.

 

Cdlt,

(d)oekia

Link to comment
Share on other sites

Je pense que tout le segment devrait entre dans la postProcess de la classe (à vérifier par rapport à ton code)

 

Sinon, SQL injection ici:

$sql = 'UPDATE '._DB_PREFIX_.'product_attribute SET '._DB_PREFIX_.'product_attribute.quantity='.$_POST['quantity'].' WHERE '._DB_PREFIX_.'product_attribute.id_product='.$_POST['id_product'].' AND '._DB_PREFIX_.'product_attribute.id_product_attribute ='.$var;

et là:

$upd = 'UPDATE '._DB_PREFIX_.'product SET '._DB_PREFIX_.'product.quantity='.$line['total'].' WHERE '._DB_PREFIX_.'product.id_product='.$_POST['id_product'];

et encore là:

$sel = 'SELECT SUM('._DB_PREFIX_.'product_attribute.quantity) AS total FROM '._DB_PREFIX_.'product_attribute WHERE '._DB_PREFIX_.'product_attribute.id_product='.$_POST['id_product'];

 

Quelque chose comme ça:

 $sel = 'SELECT SUM(coalesce(`quantity`,0) AS total FROM `'._DB_PREFIX_.'product_attribute` WHERE id_product='.(int)$_POST['id_product'];

 

Et ... si le produit n'a pas de déclinaison au fait?

Link to comment
Share on other sites

merci doekia

je vais m'expliquer plus:

ce module fait appel a 2 autres fichiers php en ajax : un pour la recherche clients et l'autre pour la recherche produits.

lorsque tu tape quelques lettres du nom du client ou nom du produit, une liste s'affiche sous le champ recherche a chaque saisie de caractère.

pour mon besoin j'ai modifier le fichier recherche produits en ajoutant un formulaire pour l'ajout quantité en stock (un bouton submit + champ quantité), ce formulaire envoi les données a un autre fichier que j'ai ajouté ajout_qty.php qui contient le premier segment du code dans mon premier post #1.

j'ai commenté un par un les bout de code ajoutés pour voir d'ou vient le source du problème et j'a découvert que c'est le nouveau formulaire que j'ai ajouté au fichier recherche produits

si je l'élimine tout ça marche nickel et après avoir enregistrer la commande le stock du produit diminue.

je voudrais savoir comment je peut ajouter ce formulaire sans qu'il influence sur le fonctionnement du module??

merci d'avance

Link to comment
Share on other sites

Que te dire?

Vérifier que ton formulaire est bien dans son propre <form> pas d'imbrication.

Que sais-je encore.

Ah si ... tu crois que ça veux dire quoi "./tabs/modules...."? Tu as bien quelque chose à cette adresse?

 

Il n'empèche que la sécurité laisse carrément à désirer et ça c'est carrément le premier problème

 

(d)oekia

Link to comment
Share on other sites

j'ai y presque, j'a ajouté un bout de code pour la mis à jour du stock et ça marche bien pour les produit séléctionnés pour ma commande voici le code

 foreach($productIDs AS $id_product)
 {
  $idProduct = intval($id_product);
  if(isset($_POST['attribute_'.$id_product]))
$idProductAttribute = intval($_POST['attribute_'.$id_product]);
  else
$idProductAttribute = 0;
// debut code ajoute
  if(!empty($_POST['quantite']))
  foreach($_POST['quantite'] as $id =>$valeur)
  {
 ......
}
  }
 }

mais je crois que c'est pas placé au bon endroit car après ce code j'ai des contrôles comme vous le voyez en haut. Lorsque je passe une commande en ajoutant du stock et j'ai un erreur "product is no longer available" pour le contrôle elseif (!$producToAdd->checkQty(intval($qty) le stock change malgré ce message ce que veut dire que j'ai mis le code au mauvais emplacement ou que j'ai oublié quelque contrôle pour que le stock s'ajoute sans messages d'erreur.

Link to comment
Share on other sites

<?php
foreach($productIDs AS $id_product)
{
 $idProduct = (int)$id_product;
 $idProductAttribute = (isset($_POST['attribute_'.$id_product])?(int)$_POST['attribute_'.$id_product]:0);
 if (!$idProduct) continue;

 if (isset($_POST['quantite']) && !empty($_POST['quantite']))
 {
 foreach($_POST['quantite'] as $id => &$valeur)
 {

   if ( (int)$id == $idProduct )
   {
	   $sql =  ' UPDATE `'._DB_PREFIX_.'product_attribute`'
			  .'    SET quantity = '.(int)$valeur
			  .'  WHERE id_product = '.$id
			  .'    AND id_product_attribute = '.$idProductAttribute;
	   $rq = Db::getInstance()->ExecuteS($sql);
	   $qty = intval(abs($_POST['amount_'.$id_product]));
	   /* Surement là ton erreur tu prends amount pour quantity ??
  $price = floatval($_POST['price_'.$id_product]);
  $totalProducts += ($qty * $price);
  */
  if ($qty == 0)
   $errors[] = Tools::displayError('null quantity');
  elseif (!$idProduct)
   $errors[] = Tools::displayError('product not found');
   }
   else
   {
	 $producToAdd = new Product((int)$idProduct, false, (int)$cookie->id_lang);
	 if (!Validate::isLoadedObject($productToAdd))
	   $errors[] = Tools::displayError('product is no longer available');
	 else
	 {
	   /* Check the quantity availability */
	   if ($idProductAttribute AND $idProductAttribute)
	   {
		 if (
				  !$producToAdd->isAvailableWhenOutOfStock($producToAdd->out_of_stock)
			  AND !Attribute::checkAttributeQty((int)$idProductAttribute) (int)$qty
		    )
		    $errors[] = Tools::displayError('product is no longer available');

	   }
	   elseif (!$producToAdd->checkQty((int)$qty))
		 $errors[] = Tools::displayError('product is no longer available');
	 }
	 if (!sizeof($errors))
	 {
	  //ADD PRODUCT TO CART
	  if ($qty >= 0)
	  {
	   if (!$cart->updateQty(intval($qty), intval($idProduct), intval($idProductAttribute)))
	    $errors[] = Tools::displayError('you already have the maximum quantity available for this product');
	  }
	 }
   }
  }
 }

Link to comment
Share on other sites

merci deokia pour la correction .

pour le champ amount_ c'est juste le nom du champ quantité a commander. :)

j'ai copier coller ce code mais j'ai une page blanche: il manque des (),des {} et des virgules (a cause de l'éditeur du forum), merci de me le renvoyé dans un doc texte en pièce jointe ou en PM.

Link to comment
Share on other sites

j'ai corrigé les erreurs dans ton code en conservant les test comme ils sont mais lorsque je commande avec un produit épuisé en lui ajoutant du stock (ex 2) j'ai bien la commande passée avec le prix du produit mais sans ajouter le produit (nom, PU, stock,...) en fiche commande en plus le stock est ajouté sans déduire la quantité commandée !!!

le problème c'est que l'ajout doit se faire avant la vérification du stock :c a d mettre le produit en stock puis faire les test en bas et lorsque il y a une erreur elle s'affiche mais après que le stock a été modifié :o

Link to comment
Share on other sites

je pense a faire un truc banale: l'ajout se fait dans tous les cas , si

-OK la commande sera créée et le stock changé

-KO le message d'erreur s'affiche + la quantité ajoutée sera déduite de nouveau du stock modifié, mais cette modif je vais le faire avec une commande UPDATE et SELECT imbriqué (2 en 1) a partir de la première requête UPDATE que j'ai fait.

 

je continu a faire des test pour voir si ça marche ou pas surtout l'affichage du message d'erreur

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