From 76b8a2d0ff885a18acf8a57722e142b2c4478d6a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 11 Jun 2005 12:10:25 +0000 Subject: [PATCH] =?UTF-8?q?Fix:=20La=20mise=20a=20jour=20des=20produits=20?= =?UTF-8?q?encapsul=E9=20dans=20transaction?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htdocs/product.class.php | 225 +++++++++++++++++++++++---------------- 1 file changed, 134 insertions(+), 91 deletions(-) diff --git a/htdocs/product.class.php b/htdocs/product.class.php index 35e51b5d9ce..cdaa78934d4 100644 --- a/htdocs/product.class.php +++ b/htdocs/product.class.php @@ -22,16 +22,16 @@ */ /** - \file htdocs/product.class.php - \ingroup produit - \brief Fichier de la classe des produits prédéfinis - \version $Revision$ + \file htdocs/product.class.php + \ingroup produit + \brief Fichier de la classe des produits prédéfinis + \version $Revision$ */ /** - \class Product - \brief Classe permettant la gestion des produits prédéfinis + \class Product + \brief Classe permettant la gestion des produits prédéfinis */ class Product @@ -49,6 +49,7 @@ class Product var $duration_value; var $duration_unit; + /** * \brief Constructeur de la classe * \param DB handler accès base de données @@ -62,6 +63,7 @@ class Product $this->envente = 0; } + /** * \brief Vérifie que la référence et libellé du produit est non null * \return int 1 si ok, 0 sinon @@ -89,6 +91,7 @@ class Product } } + /** * \brief Insère le produit en base * \param user utilisateur qui effectue l'insertion @@ -156,6 +159,7 @@ class Product } } + /** * \brief Mise à jour du produit en base * \param id id du produit @@ -204,6 +208,7 @@ class Product } } + /** * \brief Ajoute un changement de prix en base dans l'historique des prix * \param user utilisateur qui modifie le prix @@ -237,6 +242,7 @@ class Product } } + /** * \brief Lit le prix d'achat pour un fournisseur * \param id_fourn Id du fournisseur @@ -265,63 +271,79 @@ class Product } return $result; } + + /** * \brief Modifie le prix d'achat pour un fournisseur * \param id_fourn Id du fournisseur * \param qty Quantite pour lequel le prix est valide - * \param buyprice Prix d'achat + * \param buyprice Prix d'achat pour la quantité * \param user Objet user de l'utilisateur qui modifie - * */ function update_buyprice($id_fourn, $qty, $buyprice, $user) - { + { + $error=0; + $this->db->begin(); + + // Supprime prix courant du fournisseur pour cette quantité + $sql = "DELETE FROM ".MAIN_DB_PREFIX."product_fournisseur_price "; + $sql .= " WHERE "; + $sql .= " fk_product = ".$this->id; + $sql .= " AND fk_soc = ".$id_fourn; + $sql .= " AND quantity = ".$qty; - $sql = "DELETE FROM ".MAIN_DB_PREFIX."product_fournisseur_price "; - $sql .= " WHERE "; - $sql .= " fk_product = ".$this->id; - $sql .= " AND fk_soc = ".$id_fourn; - $sql .= " AND quantity = ".$qty; + if ($this->db->query($sql)) + { + // Ajoute prix courant du fournisseur pour cette quantité + $sql = "INSERT INTO ".MAIN_DB_PREFIX."product_fournisseur_price "; + $sql .= " SET datec = now()"; + $sql .= " ,fk_product = ".$this->id; + $sql .= " ,fk_soc = ".$id_fourn; + $sql .= " ,fk_user = ".$user->id; + $sql .= " ,price = ".ereg_replace(",",".",$buyprice); + $sql .= " ,quantity = ".$qty; - if ($this->db->query($sql) ) - { - $sql = "INSERT INTO ".MAIN_DB_PREFIX."product_fournisseur_price_log "; - $sql .= " SET datec = now()"; - $sql .= " ,fk_product = ".$this->id; - $sql .= " ,fk_soc = ".$id_fourn; - $sql .= " ,fk_user = ".$user->id; - $sql .= " ,price = ".ereg_replace(",",".",$buyprice); - $sql .= " ,quantity = ".$qty; - - if (!$this->db->query($sql) ) - { - $error++; - } + if (! $this->db->query($sql)) + { + $error++; + } + + if (! $error) { + // Ajoute modif dans table log + $sql = "INSERT INTO ".MAIN_DB_PREFIX."product_fournisseur_price_log "; + $sql .= " SET datec = now()"; + $sql .= " ,fk_product = ".$this->id; + $sql .= " ,fk_soc = ".$id_fourn; + $sql .= " ,fk_user = ".$user->id; + $sql .= " ,price = ".ereg_replace(",",".",$buyprice); + $sql .= " ,quantity = ".$qty; + if (! $this->db->query($sql)) + { + $error++; + } + } + + if (! $error) + { + $this->db->commit(); + return 0; + } + else + { + $this->error=$this->db->error()." ($sql)"; + $this->db->rollback(); + return -2; + } + } + else + { + $this->error=$this->db->error()." ($sql)"; + $this->db->rollback(); + return -1; + } + } - $sql = "INSERT INTO ".MAIN_DB_PREFIX."product_fournisseur_price "; - $sql .= " SET datec = now()"; - $sql .= " ,fk_product = ".$this->id; - $sql .= " ,fk_soc = ".$id_fourn; - $sql .= " ,fk_user = ".$user->id; - $sql .= " ,price = ".ereg_replace(",",".",$buyprice); - $sql .= " ,quantity = ".$qty; - - if ($this->db->query($sql) ) - { - return 0; - } - else - { - dolibarr_print_error($this->db); - return 2; - } - } - else - { - dolibarr_print_error($this->db); - return 2; - } - } /** * \brief Modifie le prix d'un produit/service @@ -356,6 +378,7 @@ class Product } } + /** * \brief Charge le produit/service en mémoire * \param id id du produit/service à charger @@ -436,6 +459,7 @@ class Product } } + /** * \brief Renvoie le nombre de propale incluant le produit/service * \param socid id societe @@ -465,6 +489,7 @@ class Product } } + /** * \brief Renvoie le nombre de client avec propale incluant le produit/service * \param socid id societe @@ -494,6 +519,7 @@ class Product } } + /** * \brief Renvoie le nombre de facture incluant le produit/service * \param socid id societe @@ -524,6 +550,7 @@ class Product } } + /** * \brief Renvoie des stats * \param sql requete a exécuter @@ -577,6 +604,7 @@ class Product } + /** * \brief Renvoie le nombre de ventes du produit/service par mois * \param socid id societe @@ -597,6 +625,7 @@ class Product return $this->_get_stats($sql); } + /** * \brief Renvoie le nombre de factures dans lesquelles figure le produit par mois * \param socid id societe @@ -617,6 +646,7 @@ class Product return $this->_get_stats($sql); } + /** * \brief Renvoie le nombre de propales dans lesquelles figure le produit par mois * \param socid id societe @@ -637,50 +667,52 @@ class Product return $this->_get_stats($sql); } + /** - * \brief Lie un fournisseur au produit/service - * \param user utilisateur qui fait le lien - * \param id_fourn id du fournisseur - * \param ref_fourn reference chez le fournisseur + * \brief Lie un fournisseur au produit/service + * \param user Utilisateur qui fait le lien + * \param id_fourn Id du fournisseur + * \param ref_fourn Reference chez le fournisseur + * \return int < 0 si erreur, > 0 si ok */ function add_fournisseur($user, $id_fourn, $ref_fourn) { - $sql = "SELECT count(*) FROM ".MAIN_DB_PREFIX."product_fournisseur WHERE fk_product = $this->id AND fk_soc = $id_fourn"; - - if ($this->db->query($sql) ) - { - $row = $this->db->fetch_row(0); - $this->db->free(); - if ($row[0] == 0) - { - - $sql = "INSERT INTO ".MAIN_DB_PREFIX."product_fournisseur "; - $sql .= " (datec, fk_product, fk_soc, ref_fourn, fk_user_author)"; - $sql .= " VALUES (now(), $this->id, $id_fourn, '$ref_fourn', $user->id)"; - - if ($this->db->query($sql) ) - { - return 1; - } - else - { - - return -1; - } - } - else - { - return -2; - } - } - else - { - dolibarr_print_error($this->db); - return -3; - } + $sql = "SELECT count(*) as nb"; + $sql.= " FROM ".MAIN_DB_PREFIX."product_fournisseur"; + $sql.= " WHERE fk_product = ".$this->id." AND fk_soc = ".$id_fourn; + $sql.= " AND ref_fourn = '".$ref_fourn."'"; + + $resql=$this->db->query($sql); + if ($resql) + { + $obj = $this->db->fetch_object($resql); + if ($obj->nb == 0) + { + $sql = "INSERT INTO ".MAIN_DB_PREFIX."product_fournisseur "; + $sql .= " (datec, fk_product, fk_soc, ref_fourn, fk_user_author)"; + $sql .= " VALUES (now(), $this->id, $id_fourn, '$ref_fourn', $user->id)"; + + if ($this->db->query($sql)) + { + return 1; + } + else + { + $this->error=$this->db->error(); + return -1; + } + } + $this->db->free($resql); + } + else + { + $this->error=$this->db->error(); + return -2; + } } + /** * \brief Renvoie le nombre de fournisseurs * \return int nombre de fournisseur @@ -715,6 +747,7 @@ class Product } } + /** * * @@ -735,6 +768,7 @@ class Product } + /** * \brief Délie un fournisseur au produit/service * \param user utilisateur qui défait le lien @@ -757,6 +791,7 @@ class Product } } + /** * \brief Entre un nombre de piece du produit en stock dans un entrepôt * \param id_entrepot id de l'entrepot @@ -781,6 +816,7 @@ class Product } } + /** * \brief Ajuste le stock d'un entrepôt pour le produit à une valeure donnée * \param user utilisateur qui demande l'ajustement @@ -815,6 +851,7 @@ class Product } } + /** * \brief Augment ou réduit la valeur de stock pour le produit * \param user utilisateur qui demande l'ajustement @@ -873,11 +910,12 @@ class Product } } } + + /** * \brief Charge les informations relatives à un fournisseur * \param id id du fournisseur */ - function fetch_fourn_data ($id) { $sql = "SELECT rowid, ref_fourn"; @@ -894,6 +932,7 @@ class Product } } + /** * \brief Déplace fichier uploadé sous le nom $files dans le répertoire sdir * \param sdir Répertoire destination finale @@ -920,6 +959,7 @@ class Product } } + /** * \brief Affiche la première photo du produit * \param sdir Répertoire à scanner @@ -931,6 +971,7 @@ class Product return $this->show_photos($sdir,$size,1); } + /** * \brief Affiche toutes les photos du produit (nbmax maximum) * \param sdir Répertoire à scanner @@ -949,7 +990,7 @@ class Product { $handle=opendir($dir); - while (($file = readdir($handle))!==false) + while (($file = readdir($handle)) != false) { $photo=''; if (is_file($dir.$file)) $photo = $file; @@ -985,6 +1026,8 @@ class Product else print ' '; } } + + closedir($handle); } return $nbphoto;