diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 6a561ecffb3..64ea2132ea1 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -5,6 +5,7 @@ * Copyright (C) 2006 Andre Cianfarani * Copyright (C) 2010-2011 Juanjo Menent * Copyright (C) 2011 Jean Heimburger + * Copyright (C) 2012 Christophe Battarel * * 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 @@ -695,7 +696,9 @@ class Commande extends CommonOrder $this->lines[$i]->product_type, $this->lines[$i]->rang, $this->lines[$i]->special_code, - $fk_parent_line + $fk_parent_line, + $this->lines[$i]->fk_fournprice, + $this->lines[$i]->pa_ht ); if ($result < 0) { @@ -1002,7 +1005,7 @@ class Commande extends CommonOrder * par l'appelant par la methode get_default_tva(societe_vendeuse,societe_acheteuse,produit) * et le desc doit deja avoir la bonne valeur (a l'appelant de gerer le multilangue) */ - function addline($commandeid, $desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $info_bits=0, $fk_remise_except=0, $price_base_type='HT', $pu_ttc=0, $date_start='', $date_end='', $type=0, $rang=-1, $special_code=0, $fk_parent_line=0) + function addline($commandeid, $desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $info_bits=0, $fk_remise_except=0, $price_base_type='HT', $pu_ttc=0, $date_start='', $date_end='', $type=0, $rang=-1, $special_code=0, $fk_parent_line=0, $fk_fournprice=null, $pa_ht = 0) { dol_syslog("Commande::addline commandeid=$commandeid, desc=$desc, pu_ht=$pu_ht, qty=$qty, txtva=$txtva, fk_product=$fk_product, remise_percent=$remise_percent, info_bits=$info_bits, fk_remise_except=$fk_remise_except, price_base_type=$price_base_type, pu_ttc=$pu_ttc, date_start=$date_start, date_end=$date_end, type=$type", LOG_DEBUG); @@ -1022,6 +1025,7 @@ class Commande extends CommonOrder $qty=price2num($qty); $pu_ht=price2num($pu_ht); $pu_ttc=price2num($pu_ttc); + $pa_ht=price2num($pa_ht); $txtva = price2num($txtva); $txlocaltax1 = price2num($txlocaltax1); $txlocaltax2 = price2num($txlocaltax2); @@ -1098,6 +1102,10 @@ class Commande extends CommonOrder $this->line->date_start=$date_start; $this->line->date_end=$date_end; + // infos marge + $this->line->fk_fournprice = $fk_fournprice; + $this->line->pa_ht = $pa_ht; + // TODO Ne plus utiliser $this->line->price=$price; $this->line->remise=$remise; @@ -1417,7 +1425,7 @@ class Commande extends CommonOrder $this->lines=array(); $sql = 'SELECT l.rowid, l.fk_product, l.fk_parent_line, l.product_type, l.fk_commande, l.description, l.price, l.qty, l.tva_tx,'; - $sql.= ' l.localtax1_tx, l.localtax2_tx, l.fk_remise_except, l.remise_percent, l.subprice, l.marge_tx, l.marque_tx, l.rang, l.info_bits, l.special_code,'; + $sql.= ' l.localtax1_tx, l.localtax2_tx, l.fk_remise_except, l.remise_percent, l.subprice, l.fk_product_fournisseur_price as fk_fournprice, l.buy_price_ht as pa_ht, l.rang, l.info_bits, l.special_code,'; $sql.= ' l.total_ht, l.total_ttc, l.total_tva, l.total_localtax1, l.total_localtax2, l.date_start, l.date_end,'; $sql.= ' p.ref as product_ref, p.description as product_desc, p.fk_product_type, p.label as product_label'; $sql.= ' FROM '.MAIN_DB_PREFIX.'commandedet as l'; @@ -1459,8 +1467,11 @@ class Commande extends CommonOrder $line->remise_percent = $objp->remise_percent; $line->price = $objp->price; $line->fk_product = $objp->fk_product; - $line->marge_tx = $objp->marge_tx; - $line->marque_tx = $objp->marque_tx; + $line->fk_fournprice = $objp->fk_fournprice; + $marginInfos = getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $line->fk_fournprice, $objp->pa_ht); + $line->pa_ht = $marginInfos[0]; + $line->marge_tx = $marginInfos[1]; + $line->marque_tx = $marginInfos[2]; $line->rang = $objp->rang; $line->info_bits = $objp->info_bits; $line->special_code = $objp->special_code; @@ -2142,7 +2153,7 @@ class Commande extends CommonOrder * @param int $skip_update_total Skip update of total * @return int < 0 if KO, > 0 if OK */ - function updateline($rowid, $desc, $pu, $qty, $remise_percent, $txtva, $txlocaltax1=0,$txlocaltax2=0, $price_base_type='HT', $info_bits=0, $date_start='', $date_end='', $type=0, $fk_parent_line=0, $skip_update_total=0) + function updateline($rowid, $desc, $pu, $qty, $remise_percent=0, $txtva, $txlocaltax1=0,$txlocaltax2=0, $price_base_type='HT', $info_bits=0, $date_start='', $date_end='', $type=0, $fk_parent_line=0, $skip_update_total=0, $fk_fournprice=null, $pa_ht = 0) { global $conf; @@ -2164,6 +2175,7 @@ class Commande extends CommonOrder $remise_percent=price2num($remise_percent); $qty=price2num($qty); $pu = price2num($pu); + $pa_ht=price2num($pa_ht); $txtva=price2num($txtva); $txlocaltax1=price2num($txlocaltax1); $txlocaltax2=price2num($txlocaltax2); @@ -2224,6 +2236,10 @@ class Commande extends CommonOrder $this->line->fk_parent_line=$fk_parent_line; $this->line->skip_update_total=$skip_update_total; + // infos marge + $this->line->fk_fournprice = $fk_fournprice; + $this->line->pa_ht = $pa_ht; + // TODO deprecated $this->line->price=$price; $this->line->remise=$remise; @@ -2723,7 +2739,7 @@ class Commande extends CommonOrder $sql = 'SELECT l.rowid, l.fk_product, l.product_type, l.description, l.price, l.qty, l.tva_tx, '; $sql.= ' l.fk_remise_except, l.remise_percent, l.subprice, l.info_bits,l.rang,l.special_code,'; - $sql.= ' l.total_ht, l.total_tva, l.total_ttc,'; + $sql.= ' l.total_ht, l.total_tva, l.total_ttc, l.fk_product_fournisseur_price as fk_fournprice, l.buy_price_ht as pa_ht, l.localtax1_tx, l.localtax2_tx,'; $sql.= ' l.date_start,'; $sql.= ' l.date_end,'; $sql.= ' p.label as product_label, p.ref, p.fk_product_type, p.rowid as prodid, '; @@ -2764,6 +2780,11 @@ class Commande extends CommonOrder $this->lines[$i]->rang = $obj->rang; $this->lines[$i]->date_start = $this->db->jdate($obj->date_start); $this->lines[$i]->date_end = $this->db->jdate($obj->date_end); + $this->lines[$i]->fk_fournprice = $obj->fk_fournprice; + $marginInfos = getMarginInfos($obj->subprice, $obj->remise_percent, $obj->tva_tx, $obj->localtax1_tx, $obj->localtax2_tx, $this->lines[$i]->fk_fournprice, $obj->pa_ht); + $this->lines[$i]->pa_ht = $marginInfos[0]; + $this->lines[$i]->marge_tx = $marginInfos[1]; + $this->lines[$i]->marque_tx = $marginInfos[2]; $i++; } @@ -2809,6 +2830,8 @@ class OrderLine var $subprice; // U.P. HT (example 100) var $remise_percent; // % for line discount (example 20%) var $rang = 0; + var $fk_fournprice; + var $pa_ht; var $marge_tx; var $marque_tx; var $info_bits = 0; // Bit 0: 0 si TVA normal - 1 si TVA NPR @@ -2856,7 +2879,7 @@ class OrderLine { $sql = 'SELECT cd.rowid, cd.fk_commande, cd.fk_parent_line, cd.fk_product, cd.product_type, cd.description, cd.price, cd.qty, cd.tva_tx, cd.localtax1_tx, cd.localtax2_tx,'; $sql.= ' cd.remise, cd.remise_percent, cd.fk_remise_except, cd.subprice,'; - $sql.= ' cd.info_bits, cd.total_ht, cd.total_tva, cd.total_localtax1, cd.total_localtax2, cd.total_ttc, cd.marge_tx, cd.marque_tx, cd.rang, cd.special_code,'; + $sql.= ' cd.info_bits, cd.total_ht, cd.total_tva, cd.total_localtax1, cd.total_localtax2, cd.total_ttc, cd.fk_product_fournisseur_price as fk_fournprice, cd.buy_price_ht as pa_ht, cd.rang, cd.special_code,'; $sql.= ' p.ref as product_ref, p.label as product_libelle, p.description as product_desc,'; $sql.= ' cd.date_start, cd.date_end'; $sql.= ' FROM '.MAIN_DB_PREFIX.'commandedet as cd'; @@ -2887,8 +2910,11 @@ class OrderLine $this->total_localtax1 = $objp->total_localtax1; $this->total_localtax2 = $objp->total_localtax2; $this->total_ttc = $objp->total_ttc; - $this->marge_tx = $objp->marge_tx; - $this->marque_tx = $objp->marque_tx; + $this->fk_fournprice = $objp->fk_fournprice; + $marginInfos = getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $this->fk_fournprice, $objp->pa_ht); + $this->pa_ht = $marginInfos[0]; + $this->marge_tx = $marginInfos[1]; + $this->marque_tx = $marginInfos[2]; $this->special_code = $objp->special_code; $this->rang = $objp->rang; @@ -2970,6 +2996,14 @@ class OrderLine if (empty($this->special_code)) $this->special_code=0; if (empty($this->fk_parent_line)) $this->fk_parent_line=0; + if (empty($this->pa_ht)) $this->pa_ht=0; + + // si prix d'achat non renseigné et utilisé pour calcul des marges alors prix achat = prix vente (idem pour remises) + if ($this->pa_ht == 0) { + if ($this->subprice < 0 || ($conf->global->CalculateMarginsOnLinesWithoutBuyingPrice == 1)) + $this->pa_ht = $this->subprice * (1 - $this->remise_percent / 100); + } + // Check parameters if ($this->product_type < 0) return -1; @@ -2979,7 +3013,7 @@ class OrderLine $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'commandedet'; $sql.= ' (fk_commande, fk_parent_line, description, qty, tva_tx, localtax1_tx, localtax2_tx,'; $sql.= ' fk_product, product_type, remise_percent, subprice, price, remise, fk_remise_except,'; - $sql.= ' special_code, rang, marge_tx, marque_tx,'; + $sql.= ' special_code, rang, fk_product_fournisseur_price, buy_price_ht,'; $sql.= ' info_bits, total_ht, total_tva, total_localtax1, total_localtax2, total_ttc, date_start, date_end)'; $sql.= " VALUES (".$this->fk_commande.","; $sql.= " ".($this->fk_parent_line>0?"'".$this->fk_parent_line."'":"null").","; @@ -2999,10 +3033,10 @@ class OrderLine else $sql.= 'null,'; $sql.= ' '.$this->special_code.','; $sql.= ' '.$this->rang.','; - if (isset($this->marge_tx)) $sql.= ' '.$this->marge_tx.','; - else $sql.= ' null,'; - if (isset($this->marque_tx)) $sql.= ' '.$this->marque_tx.','; - else $sql.= ' null,'; + if (isset($this->fk_fournprice)) $sql.= ' '.$this->fk_fournprice.','; + else $sql.= ' null,'; + if (isset($this->pa_ht)) $sql.= ' '.price2num($this->pa_ht).','; + else $sql.= ' null,'; $sql.= " '".$this->info_bits."',"; $sql.= " '".price2num($this->total_ht)."',"; $sql.= " '".price2num($this->total_tva)."',"; @@ -3070,6 +3104,14 @@ class OrderLine if (empty($this->product_type)) $this->product_type=0; if (empty($this->fk_parent_line)) $this->fk_parent_line=0; + if (empty($this->pa_ht)) $this->pa_ht=0; + + // si prix d'achat non renseigné et utilisé pour calcul des marges alors prix achat = prix vente (idem pour remises) + if ($this->pa_ht == 0) { + if ($this->subprice < 0 || ($conf->global->CalculateMarginsOnLinesWithoutBuyingPrice == 1)) + $this->pa_ht = $this->subprice * (1 - $this->remise_percent / 100); + } + $this->db->begin(); // Mise a jour ligne en base @@ -3089,6 +3131,8 @@ class OrderLine $sql.= " , total_tva=".price2num($this->total_tva).""; $sql.= " , total_ttc=".price2num($this->total_ttc).""; } + $sql.= " , fk_product_fournisseur_price='".$this->fk_fournprice."'"; + $sql.= " , buy_price_ht='".price2num($this->pa_ht)."'"; $sql.= " , total_localtax1=".price2num($this->total_localtax1); $sql.= " , total_localtax2=".price2num($this->total_localtax2); $sql.= " , info_bits=".$this->info_bits; diff --git a/htdocs/commande/fiche.php b/htdocs/commande/fiche.php index 459b2f1540f..4c5b0d57fa8 100644 --- a/htdocs/commande/fiche.php +++ b/htdocs/commande/fiche.php @@ -49,6 +49,8 @@ $langs->load('bills'); $langs->load('propal'); $langs->load('deliveries'); $langs->load('products'); +if ($conf->marges->enabled) + $langs->load('marges'); $id = (GETPOST('id','int')?GETPOST('id','int'):GETPOST("orderid")); $ref = GETPOST('ref'); @@ -294,7 +296,9 @@ else if ($action == 'add' && $user->rights->commande->creer) $product_type, $lines[$i]->rang, $lines[$i]->special_code, - $fk_parent_line + $fk_parent_line, + $lines[$i]->fk_fournprice, + $lines[$i]->pa_ht ); if ($result < 0) @@ -607,6 +611,13 @@ else if ($action == 'addline' && $user->rights->commande->creer) $desc=dol_htmlcleanlastbr($desc); + // ajout prix achat + $fk_fournprice = $_POST['np_fournprice']; + if ( ! empty($_POST['np_buying_price']) ) + $pa_ht = $_POST['np_buying_price']; + else + $pa_ht = null; + $info_bits=0; if ($tva_npr) $info_bits |= 0x01; @@ -639,7 +650,9 @@ else if ($action == 'addline' && $user->rights->commande->creer) $type, -1, '', - $_POST['fk_parent_line'] + $_POST['fk_parent_line'], + $fk_fournprice, + $pa_ht ); if ($result > 0) @@ -668,6 +681,7 @@ else if ($action == 'addline' && $user->rights->commande->creer) unset($_POST['np_desc']); unset($_POST['np_price']); unset($_POST['np_tva_tx']); + unset($_POST['np_buying_price']); } else { @@ -701,6 +715,14 @@ else if ($action == 'updateligne' && $user->rights->commande->creer && $_POST['s $localtax1_rate=get_localtax($vat_rate,1,$object->client); $localtax2_rate=get_localtax($vat_rate,2,$object->client); + + // ajout prix d'achat + $fk_fournprice = $_POST['fournprice']; + if ( ! empty($_POST['buying_price']) ) + $pa_ht = $_POST['buying_price']; + else + $pa_ht = null; + // Check parameters if (empty($_POST['productid']) && $_POST["type"] < 0) { @@ -749,7 +771,10 @@ else if ($action == 'updateligne' && $user->rights->commande->creer && $_POST['s $date_start, $date_end, $type, - $_POST['fk_parent_line'] + $_POST['fk_parent_line'], + 0, + $fk_fournprice, + $pa_ht ); if ($result >= 0) @@ -768,6 +793,12 @@ else if ($action == 'updateligne' && $user->rights->commande->creer && $_POST['s { $ret=$object->fetch($object->id); // Reload to get new records commande_pdf_create($db, $object, $object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref, $hookmanager); + unset($_POST['qty']); + unset($_POST['type']); + unset($_POST['np_price']); + unset($_POST['dp_desc']); + unset($_POST['np_tva_tx']); + unset($_POST['np_buying_price']); } } else @@ -1955,7 +1986,15 @@ else // Total HT print ''.$langs->trans('AmountHT').''; print ''.price($object->total_ht).''; - print ''.$langs->trans('Currency'.$conf->currency).''; + print ''.$langs->trans('Currency'.$conf->currency).''; + + // Margin Infos + if ($conf->marges->enabled) { + print ''; + $object->displayMarginInfos(); + print ''; + } + print ''; // Total TVA print ''.$langs->trans('AmountVAT').''.price($object->total_tva).'';