From 9c6da78358b321c8de09f94d34cebca9eec743db Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Fri, 5 May 2006 15:12:48 +0000 Subject: [PATCH] =?UTF-8?q?d=E9but=20ajout=20de=20la=20gestion=20des=20bon?= =?UTF-8?q?s=20de=20livraison?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htdocs/langs/fr_FR/admin.lang | 2 +- htdocs/livraison/livraison.class.php | 546 +++++++++++++++++++++++++++ 2 files changed, 547 insertions(+), 1 deletion(-) create mode 100644 htdocs/livraison/livraison.class.php diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang index 07075115e65..63b6994bc27 100644 --- a/htdocs/langs/fr_FR/admin.lang +++ b/htdocs/langs/fr_FR/admin.lang @@ -451,7 +451,7 @@ ProductSetup=Configuration du module Produits NumberOfProductShowInSelect=Nombre de produits max dans les listes déroulantes (0=aucune limite) ##### Sendings ##### SendingsSetup=Configuration du module Expéditions/Livraisons -SendingsReceiptModel=Modèle du bordereau de livraison +SendingsReceiptModel=Modèle du bordereau d'expédition ##### Syslog ##### SyslogSetup=Configuration du module Syslog SyslogOutput=Sortie des log diff --git a/htdocs/livraison/livraison.class.php b/htdocs/livraison/livraison.class.php new file mode 100644 index 00000000000..439f7ba6cec --- /dev/null +++ b/htdocs/livraison/livraison.class.php @@ -0,0 +1,546 @@ + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Id$ + * $Source$ + * + */ + +/** + \file htdocs/expedition/expedition.class.php + \ingroup expedition + \brief Fichier de la classe de gestion des expeditions + \version $Revision$ +*/ + + +/** + \class Expedition + \brief Classe de gestion des expeditions +*/ +class Expedition +{ + var $db ; + var $id ; + var $brouillon; + var $entrepot_id; + + /** + * Initialisation + * + */ + function Expedition($DB) + { + $this->db = $DB; + $this->lignes = array(); + + $this->sources[0] = "Proposition commerciale"; + $this->sources[1] = "Internet"; + $this->sources[2] = "Courrier"; + $this->sources[3] = "Téléphone"; + $this->sources[4] = "Fax"; + + $this->statuts[-1] = "Annulée"; + $this->statuts[0] = "Brouillon"; + $this->statuts[1] = "Validée"; + + $this->products = array(); + } + + /** + * \brief Créé expédition en base + * \param user Objet du user qui cré + * \return int <0 si erreur, id expédition créée si ok + */ + function create($user) + { + require_once DOL_DOCUMENT_ROOT ."/product/stock/mouvementstock.class.php"; + $error = 0; + /* On positionne en mode brouillon la commande */ + $this->brouillon = 1; + + $this->user = $user; + + $this->db->begin(); + + $sql = "INSERT INTO ".MAIN_DB_PREFIX."expedition (date_creation, fk_user_author, date_expedition, fk_commande"; + if ($this->entrepot_id) $sql.= ", fk_entrepot"; + $sql.= ")"; + $sql.= " VALUES (now(), $user->id, ".$this->db->idate($this->date_expedition).",$this->commande_id"; + if ($this->entrepot_id) $sql.= ", $this->entrepot_id"; + $sql.= ")"; + + $resql=$this->db->query($sql); + if ($resql) + { + $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."expedition"); + + $sql = "UPDATE ".MAIN_DB_PREFIX."expedition SET ref='(PROV".$this->id.")' WHERE rowid=".$this->id; + if ($this->db->query($sql)) + { + + $this->commande = new Commande($this->db); + $this->commande->id = $this->commande_id; + $this->commande->fetch_lignes(); + + /* + * Insertion des produits dans la base + */ + for ($i = 0 ; $i < sizeof($this->lignes) ; $i++) + { + //TODO + if (! $this->create_line(0, $this->lignes[$i]->commande_ligne_id, $this->lignes[$i]->qty)) + { + $error++; + } + } + + /* + * + */ + $sql = "UPDATE ".MAIN_DB_PREFIX."commande SET fk_statut = 2 WHERE rowid=".$this->commande_id; + if (! $this->db->query($sql)) + { + $error++; + } + + if ($error==0) + { + $this->db->commit(); + return $this->id; + } + else + { + $error++; + $this->error=$this->db->error()." - sql=$sql"; + $this->db->rollback(); + return -3; + } + } + else + { + $error++; + $this->error=$this->db->error()." - sql=$sql"; + $this->db->rollback(); + return -2; + } + } + else + { + $error++; + $this->error=$this->db->error()." - sql=$sql"; + $this->db->rollback(); + return -1; + } + } + + /** + * + * + */ + function create_line($transaction, $commande_ligne_id, $qty) + { + $error = 0; + + $idprod = 0; + $j = 0; + while (($j < sizeof($this->commande->lignes)) && idprod == 0) + { + if ($this->commande->lignes[$j]->id == $commande_ligne_id) + { + $idprod = $this->commande->lignes[$j]->product_id; + } + $j++; + } + + $sql = "INSERT INTO ".MAIN_DB_PREFIX."expeditiondet (fk_expedition, fk_commande_ligne, qty)"; + $sql .= " VALUES ($this->id,".$commande_ligne_id.",".$qty.")"; + + if (! $this->db->query($sql) ) + { + $error++; + } + + if ($error == 0 ) + { + return 1; + } + } + /** + * + * Lit une commande + * + */ + function fetch ($id) + { + global $conf; + + $sql = "SELECT e.rowid, e.date_creation, e.ref, e.fk_user_author, e.fk_statut, e.fk_commande, e.fk_entrepot"; + $sql .= ", ".$this->db->pdate("e.date_expedition")." as date_expedition "; + $sql .= " FROM ".MAIN_DB_PREFIX."expedition as e"; + $sql .= " WHERE e.rowid = $id"; + + $result = $this->db->query($sql) ; + + if ( $result ) + { + $obj = $this->db->fetch_object($result); + + $this->id = $obj->rowid; + $this->ref = $obj->ref; + $this->statut = $obj->fk_statut; + $this->commande_id = $obj->fk_commande; + $this->user_author_id = $obj->fk_user_author; + $this->date = $obj->date_expedition; + $this->entrepot_id = $obj->fk_entrepot; + $this->db->free(); + + if ($this->statut == 0) $this->brouillon = 1; + + $file = $conf->expedition->dir_output . "/" .get_exdir($expedition->id) . "/" . $this->id.".pdf"; + $this->pdf_filename = $file; + + return 1; + } + else + { + $this->error=$this->db->error(); + return -1; + } + } + + /** + * \brief Valide l'expedition, et met a jour le stock si stock géré + * \param user Objet de l'utilisateur qui valide + * \return int + */ + function valid($user) + { + global $conf; + + require_once DOL_DOCUMENT_ROOT ."/product/stock/mouvementstock.class.php"; + + dolibarr_syslog("expedition.class.php::valid"); + + $this->db->begin(); + + $error = 0; + + if ($user->rights->expedition->valider) + { + $this->ref = "EXP".$this->id; + + // \todo Tester si non dejà au statut validé. Si oui, on arrete afin d'éviter + // de décrémenter 2 fois le stock. + + $sql = "UPDATE ".MAIN_DB_PREFIX."expedition SET ref='".$this->ref."', fk_statut = 1, date_valid=now(), fk_user_valid=$user->id"; + $sql .= " WHERE rowid = $this->id AND fk_statut = 0 ;"; + + if ($this->db->query($sql) ) + { + // Si module stock géré et que expedition faite depuis un entrepot + if ($conf->stock->enabled && $this->entrepot_id) + { + /* + * Enregistrement d'un mouvement de stock pour chaque produit de l'expedition + */ + + dolibarr_syslog("expedition.class.php::valid enregistrement des mouvements"); + + $sql = "SELECT cd.fk_product, ed.qty "; + $sql.= " FROM ".MAIN_DB_PREFIX."commandedet as cd, ".MAIN_DB_PREFIX."expeditiondet as ed"; + $sql.= " WHERE ed.fk_expedition = $this->id AND cd.rowid = ed.fk_commande_ligne"; + + $resql=$this->db->query($sql); + if ($resql) + { + $num = $this->db->num_rows($resql); + $i=0; + while($i < $num) + { + dolibarr_syslog("expedition.class.php::valid movment $i"); + + $obj = $this->db->fetch_object($resql); + + $mouvS = new MouvementStock($this->db); + $result=$mouvS->livraison($user, $obj->fk_product, $this->entrepot_id, $obj->qty); + if ($result < 0) + { + $this->db->rollback(); + $this->error=$this->db->error()." - sql=$sql"; + dolibarr_syslog("expedition.class.php::valid ".$this->error); + return -3; + } + $i++; + } + + } + else + { + $this->db->rollback(); + $this->error=$this->db->error()." - sql=$sql"; + dolibarr_syslog("expedition.class.php::valid ".$this->error); + return -2; + } + } + } + else + { + $this->db->rollback(); + $this->error=$this->db->error()." - sql=$sql"; + dolibarr_syslog("expedition.class.php::valid ".$this->error); + return -1; + } + } + else + { + $this->error="Non autorise"; + dolibarr_syslog("expedition.class.php::valid ".$this->error); + return -1; + } + + $this->db->commit(); + //dolibarr_syslog("expedition.class.php::valid commit"); + return 1; + } + + + /** + * Ajoute un produit + * + */ + function insert_product_generic($p_desc, $p_price, $p_qty, $p_tva_tx=19.6, $p_product_id=0, $remise_percent=0) + { + if ($this->statut == 0) + { + if (strlen(trim($p_qty)) == 0) + { + $p_qty = 1; + } + + $p_price = price2num($p_price); + + $price = $p_price; + $subprice = $p_price; + if ($remise_percent > 0) + { + $remise = round(($p_price * $remise_percent / 100), 2); + $price = $p_price - $remise; + } + + $sql = "INSERT INTO ".MAIN_DB_PREFIX."commandedet (fk_commande, fk_product, qty, price, tva_tx, description, remise_percent, subprice) VALUES "; + $sql .= " (".$this->id.", $p_product_id,". $p_qty.",". $price.",".$p_tva_tx.",'". addslashes($p_desc) ."',$remise_percent, $subprice) ; "; + + if ($this->db->query($sql) ) + { + + if ($this->update_price() > 0) + { + return 1; + } + else + { + return -1; + } + } + else + { + print $this->db->error(); + print "
".$sql; + return -2; + } + } + } + /** + * Ajoute une ligne + * + */ + function addline( $id, $qty ) + { + $num = sizeof($this->lignes); + $ligne = new ExpeditionLigne(); + + $ligne->commande_ligne_id = $id; + $ligne->qty = $qty; + + $this->lignes[$num] = $ligne; + } + + /** + * + * + */ + function delete_line($idligne) + { + if ($this->statut == 0) + { + $sql = "DELETE FROM ".MAIN_DB_PREFIX."commandedet WHERE rowid = $idligne"; + + if ($this->db->query($sql) ) + { + $this->update_price(); + + return 1; + } + else + { + return 0; + } + } + } + /** + * Supprime la fiche + * + */ + function delete() + { + $this->db->begin(); + + $sql = "DELETE FROM ".MAIN_DB_PREFIX."expeditiondet WHERE fk_expedition = $this->id ;"; + if ( $this->db->query($sql) ) + { + $sql = "DELETE FROM ".MAIN_DB_PREFIX."expedition WHERE rowid = $this->id;"; + if ( $this->db->query($sql) ) + { + $this->db->commit(); + return 1; + } + else + { + $this->db->rollback(); + return -2; + } + } + else + { + $this->db->rollback(); + return -1; + } + } + /** + * Classe la commande + * + * + */ + function classin($cat_id) + { + $sql = "UPDATE ".MAIN_DB_PREFIX."commande SET fk_projet = $cat_id"; + $sql .= " WHERE rowid = $this->id;"; + + if ($this->db->query($sql) ) + { + return 1; + } + else + { + print $this->db->error() . ' in ' . $sql; + } + } + + /** + * Genere le pdf + */ + function PdfWrite() + { + global $conf; + + //EXPEDITION_ADDON_PDF + if (defined("EXPEDITION_ADDON_PDF") && strlen(EXPEDITION_ADDON_PDF) > 0) + { + $module_file_name = DOL_DOCUMENT_ROOT."/expedition/mods/pdf/pdf_expedition_".EXPEDITION_ADDON_PDF.".modules.php"; + + $mod = "pdf_expedition_".EXPEDITION_ADDON_PDF; + $this->fetch_commande(); + + require_once($module_file_name); + + $pdf = new $mod($this->db); + + $dir = $conf->expedition->dir_output . "/" .get_exdir($this->id); + + if (! file_exists($dir)) + { + create_exdir($dir); + } + + $file = $dir . $this->id . ".pdf"; + + if (file_exists($dir)) + { + $pdf->generate($this, $file); + } + } + } + + /* + * Lit la commande associée + * + */ + function fetch_commande() + { + $this->commande =& new Commande($this->db); + $this->commande->fetch($this->commande_id); + } + + + function fetch_lignes() + { + $this->lignes = array(); + + $sql = "SELECT c.description, c.qty as qtycom, e.qty as qtyexp"; + $sql .= ", c.fk_product"; + $sql .= " FROM ".MAIN_DB_PREFIX."expeditiondet as e"; + $sql .= " , ".MAIN_DB_PREFIX."commandedet as c"; + + $sql .= " WHERE e.fk_expedition = ".$this->id; + $sql .= " AND e.fk_commande_ligne = c.rowid"; + + + $resql = $this->db->query($sql); + if ($resql) + { + $num = $this->db->num_rows($resql); + $i = 0; + while ($i < $num) + { + $ligne = new ExpeditionLigne(); + + $obj = $this->db->fetch_object($resql); + + $ligne->product_id = $obj->fk_product; + $ligne->qty_commande = $obj->qtycom; + $ligne->qty_expedition = $obj->qtyexp; + $ligne->description = stripslashes($obj->description); + + $this->lignes[$i] = $ligne; + $i++; + } + $this->db->free($resql); + } + + return $this->lignes; + } + +} + + +class ExpeditionLigne +{ + +} + +?>