From 1d21f24fa79bcce6b3c66beb34f4db877fe9d5cb Mon Sep 17 00:00:00 2001 From: Maxime Kohlhaas Date: Mon, 1 Oct 2012 11:25:17 +0200 Subject: [PATCH 1/3] Task # 559 : Add possibility to define a discount for min quantity on supplier product prices --- .../fourn/class/fournisseur.product.class.php | 32 ++++++++++++++----- .../install/mysql/migration/3.2.0-3.3.0.sql | 4 +++ htdocs/langs/en_US/products.lang | 1 + htdocs/langs/fr_FR/products.lang | 1 + htdocs/product/fournisseurs.php | 20 +++++++++--- 5 files changed, 46 insertions(+), 12 deletions(-) diff --git a/htdocs/fourn/class/fournisseur.product.class.php b/htdocs/fourn/class/fournisseur.product.class.php index 02b6b92ab9e..fc02ba27d4a 100644 --- a/htdocs/fourn/class/fournisseur.product.class.php +++ b/htdocs/fourn/class/fournisseur.product.class.php @@ -44,6 +44,8 @@ class ProductFournisseur extends Product var $fourn_ref; // ref supplier var $fourn_qty; // quantity for price var $fourn_price; // price for quantity + var $fourn_remise_percent; // discount for quantity (percent) + var $fourn_remise; // discount for quantity (amount) var $product_fourn_id; // supplier id var $fk_availability; // availability delay var $fourn_unitprice; @@ -133,18 +135,20 @@ class ProductFournisseur extends Product /** * Modify the purchase price for a supplier * - * @param int $qty Min quantity for which price is valid - * @param float $buyprice Purchase price for the quantity min - * @param User $user Object user user made changes + * @param int $qty Min quantity for which price is valid + * @param float $buyprice Purchase price for the quantity min + * @param User $user Object user user made changes * @param string $price_base_type HT or TTC * @param Societe $fourn Supplier * @param int $availability Product availability * @param string $ref_fourn Supplier ref * @param float $tva_tx VAT rate * @param string $charges costs affering to product + * @param float $remise_percent Discount regarding qty (percent) + * @param float $remise Discount regarding qty (amount) * @return int >0 if KO, >0 if OK */ - function update_buyprice($qty, $buyprice, $user, $price_base_type, $fourn, $availability, $ref_fourn, $tva_tx, $charges=0) + function update_buyprice($qty, $buyprice, $user, $price_base_type, $fourn, $availability, $ref_fourn, $tva_tx, $charges=0, $remise_percent=0, $remise=0) { global $conf,$mysoc; @@ -177,6 +181,8 @@ class ProductFournisseur extends Product $sql.= " SET fk_user = " . $user->id." ,"; $sql.= " price = ".price2num($buyprice).","; $sql.= " quantity = ".$qty.","; + $sql.= " remise_percent = ".$remise_percent.","; + $sql.= " remise = ".$remise.","; $sql.= " unitprice = ".$unitBuyPrice.","; $sql.= " unitcharges = ".$unitCharges.","; $sql.= " tva_tx = ".$tva_tx.","; @@ -211,7 +217,7 @@ class ProductFournisseur extends Product { // Add price for this quantity to supplier $sql = "INSERT INTO ".MAIN_DB_PREFIX."product_fournisseur_price("; - $sql.= "datec, fk_product, fk_soc, ref_fourn, fk_user, price, quantity, unitprice, tva_tx, fk_availability, entity)"; + $sql.= "datec, fk_product, fk_soc, ref_fourn, fk_user, price, quantity, remise_percent, remise, unitprice, tva_tx, fk_availability, entity)"; $sql.= " values('".$this->db->idate($now)."',"; $sql.= " ".$this->id.","; $sql.= " ".$fourn->id.","; @@ -219,6 +225,8 @@ class ProductFournisseur extends Product $sql.= " ".$user->id.","; $sql.= " ".price2num($buyprice).","; $sql.= " ".$qty.","; + $sql.= " ".$remise_percent.","; + $sql.= " ".$remise.","; $sql.= " ".$unitBuyPrice.","; $sql.= " ".$tva_tx.","; $sql.= " ".$availability.","; @@ -280,7 +288,7 @@ class ProductFournisseur extends Product */ function fetch_product_fournisseur_price($rowid) { - $sql = "SELECT pfp.rowid, pfp.price, pfp.quantity, pfp.unitprice, pfp.tva_tx, pfp.fk_availability,"; + $sql = "SELECT pfp.rowid, pfp.price, pfp.quantity, pfp.unitprice, pfp.remise_percent, pfp.remise, pfp.tva_tx, pfp.fk_availability,"; $sql.= " pfp.fk_soc, pfp.ref_fourn, pfp.fk_product, pfp.charges, pfp.unitcharges"; $sql.= " FROM ".MAIN_DB_PREFIX."product_fournisseur_price as pfp"; $sql.= " WHERE pfp.rowid = ".$rowid; @@ -297,6 +305,8 @@ class ProductFournisseur extends Product $this->fourn_price = $obj->price; $this->fourn_charges = $obj->charges; $this->fourn_qty = $obj->quantity; + $this->fourn_remise_percent = $obj->remise_percent; + $this->fourn_remise = $obj->remise; $this->fourn_unitprice = $obj->unitprice; $this->fourn_unitcharges = $obj->unitcharges; $this->tva_tx = $obj->tva_tx; @@ -331,7 +341,7 @@ class ProductFournisseur extends Product $sql = "SELECT s.nom as supplier_name, s.rowid as fourn_id,"; $sql.= " pfp.rowid as product_fourn_pri_id, pfp.ref_fourn, pfp.fk_product as product_fourn_id,"; - $sql.= " pfp.price, pfp.quantity, pfp.unitprice, pfp.tva_tx, pfp.fk_availability, pfp.charges, pfp.unitcharges"; + $sql.= " pfp.price, pfp.quantity, pfp.unitprice, pfp.remise_percent, pfp.remise, pfp.tva_tx, pfp.fk_availability, pfp.charges, pfp.unitcharges"; $sql.= " FROM ".MAIN_DB_PREFIX."product_fournisseur_price as pfp"; $sql.= ", ".MAIN_DB_PREFIX."societe as s"; $sql.= " WHERE pfp.entity IN (".getEntity('product', 1).")"; @@ -356,6 +366,8 @@ class ProductFournisseur extends Product $prodfourn->fourn_ref = $record["ref_fourn"]; $prodfourn->fourn_price = $record["price"]; $prodfourn->fourn_qty = $record["quantity"]; + $prodfourn->fourn_remise_percent = $record["remise_percent"]; + $prodfourn->fourn_remise = $record["remise"]; $prodfourn->fourn_unitprice = $record["unitprice"]; $prodfourn->fourn_charges = $record["charges"]; $prodfourn->fourn_unitcharges = $record["unitcharges"]; @@ -406,6 +418,8 @@ class ProductFournisseur extends Product $this->fourn_ref = ''; $this->fourn_price = ''; $this->fourn_qty = ''; + $this->fourn_remise_percent = ''; + $this->fourn_remise = ''; $this->fourn_unitprice = ''; $this->fourn_id = ''; $this->fourn_name = ''; @@ -431,9 +445,11 @@ class ProductFournisseur extends Product $this->fourn_ref = $record["ref_fourn"]; $this->fourn_price = $record["price"]; $this->fourn_qty = $record["quantity"]; + $this->fourn_remise_percent = $record["remise_percent"]; + $this->fourn_remise = $record["remise"]; $this->fourn_unitprice = $record["unitprice"]; $this->fourn_charges = $record["charges"]; - $this->fourn_unitcharges = $record["unitcharges"]; + $this->fourn_unitcharges = $record["unitcharges"]; $this->fourn_tva_tx = $record["tva_tx"]; $this->fourn_id = $record["fourn_id"]; $this->fourn_name = $record["supplier_name"]; diff --git a/htdocs/install/mysql/migration/3.2.0-3.3.0.sql b/htdocs/install/mysql/migration/3.2.0-3.3.0.sql index baadd65d206..bf6229c859f 100755 --- a/htdocs/install/mysql/migration/3.2.0-3.3.0.sql +++ b/htdocs/install/mysql/migration/3.2.0-3.3.0.sql @@ -742,3 +742,7 @@ insert into llx_accountingaccount (rowid, fk_pcg_version, pcg_type, pcg_subtype, insert into llx_accountingaccount (rowid, fk_pcg_version, pcg_type, pcg_subtype, account_number, account_parent, label, active) VALUES (436,'PCG99-BASE','PROD', 'XXXXXX', '791','79', 'Transferts de charges d''exploitation ', '1'); insert into llx_accountingaccount (rowid, fk_pcg_version, pcg_type, pcg_subtype, account_number, account_parent, label, active) VALUES (437,'PCG99-BASE','PROD', 'XXXXXX', '796','79', 'Transferts de charges financières', '1'); insert into llx_accountingaccount (rowid, fk_pcg_version, pcg_type, pcg_subtype, account_number, account_parent, label, active) VALUES (438,'PCG99-BASE','PROD', 'XXXXXX', '797','79', 'Transferts de charges exceptionnelles', '1'); + +-- Add discount in product supplier price +ALTER TABLE llx_product_fournisseur_price ADD COLUMN remise_percent DOUBLE NOT NULL DEFAULT 0 AFTER quantity; +ALTER TABLE llx_product_fournisseur_price ADD COLUMN remise DOUBLE NOT NULL DEFAULT 0 AFTER remise_percent; diff --git a/htdocs/langs/en_US/products.lang b/htdocs/langs/en_US/products.lang index d5f67a57d11..f59a9e0bba6 100644 --- a/htdocs/langs/en_US/products.lang +++ b/htdocs/langs/en_US/products.lang @@ -146,6 +146,7 @@ ProductSpecial=Special QtyMin=Quantity minimum PriceQty=Price for this quantity PriceQtyMin=Price quantity min. +DiscountQtyMin=Discount quantity min. NoPriceDefinedForThisSupplier=No price/qty defined for this supplier/product NoSupplierPriceDefinedForThisProduct=No supplier price/qty defined for this product RecordedProducts=Products recorded diff --git a/htdocs/langs/fr_FR/products.lang b/htdocs/langs/fr_FR/products.lang index 4f5bb65ad4d..3c301e60168 100644 --- a/htdocs/langs/fr_FR/products.lang +++ b/htdocs/langs/fr_FR/products.lang @@ -146,6 +146,7 @@ ProductSpecial=Special QtyMin=Quantité minimum PriceQty=Prix pour la quantité PriceQtyMin=Prix quantité min. +DiscountQtyMin=Remise quantité min. NoPriceDefinedForThisSupplier=Aucun prix/qté défini pour ce fournisseur/produit NoSupplierPriceDefinedForThisProduct=Aucun prix/qté fournisseur défini pour ce produit RecordedProducts=Produits en vente diff --git a/htdocs/product/fournisseurs.php b/htdocs/product/fournisseurs.php index 397828dd5c2..08b7ab05410 100644 --- a/htdocs/product/fournisseurs.php +++ b/htdocs/product/fournisseurs.php @@ -94,6 +94,7 @@ if ($action == 'updateprice' && GETPOST('cancel') <> $langs->trans("Cancel")) $ref_fourn=GETPOST("ref_fourn"); if (empty($ref_fourn)) $ref_fourn=GETPOST("search_ref_fourn"); $quantity=GETPOST("qty"); + $remise_percent=price2num(GETPOST('remise_percent','alpha')); $tva_tx=price2num(GETPOST('tva_tx','alpha')); if (empty($quantity)) @@ -153,10 +154,10 @@ if ($action == 'updateprice' && GETPOST('cancel') <> $langs->trans("Cancel")) $supplier=new Fournisseur($db); $result=$supplier->fetch($id_fourn); - if (isset($_POST['ref_fourn_price_id'])) - $product->fetch_product_fournisseur_price($_POST['ref_fourn_price_id']); + if (isset($_POST['ref_fourn_price_id'])) + $product->fetch_product_fournisseur_price($_POST['ref_fourn_price_id']); - $ret=$product->update_buyprice($quantity, $_POST["price"], $user, $_POST["price_base_type"], $supplier, $_POST["oselDispo"], $ref_fourn, $tva_tx, $_POST["charges"]); + $ret=$product->update_buyprice($quantity, $_POST["price"], $user, $_POST["price_base_type"], $supplier, $_POST["oselDispo"], $ref_fourn, $tva_tx, $_POST["charges"], $remise_percent); if ($ret < 0) { $error++; @@ -346,7 +347,12 @@ if ($id || $ref) print ''; print ' '; print $form->select_PriceBaseType((GETPOST('price_base_type')?GETPOST('price_base_type'):$product->price_base_type), "price_base_type"); - print ''; + print ''; + + // Discount qty min + print ''.$langs->trans("DiscountQtyMin").''; + print ' %'; + print ''; print ''; // Charges ???? @@ -407,6 +413,7 @@ if ($id || $ref) // Charges ???? if (! empty($conf->margin->enabled)) print ''.$langs->trans("Charges").''; print_liste_field_titre($langs->trans("UnitPriceHT"),$_SERVER["PHP_SELF"],"pfp.unitprice","",$param,'align="right"',$sortfield,$sortorder); + print ''.$langs->trans("DiscountQtyMin").''; // Charges ???? if (! empty($conf->margin->enabled)) print ''.$langs->trans("UnitCharges").''; print ''; @@ -466,6 +473,11 @@ if ($id || $ref) print price($productfourn->fourn_unitprice); //print $objp->unitprice? price($objp->unitprice) : ($objp->quantity?price($objp->price/$objp->quantity):" "); print ''; + + // Discount + print ''; + print vatrate($productfourn->fourn_remise_percent, $langs); + print ''; // Unit Charges ??? if (! empty($conf->margin->enabled)) From ed2a140046c55fd9506a383483b55801b0632d24 Mon Sep 17 00:00:00 2001 From: Maxime Kohlhaas Date: Mon, 1 Oct 2012 11:45:28 +0200 Subject: [PATCH 2/3] Task # 559 : add display of discount in product list while adding line on supplier order --- htdocs/core/class/html.form.class.php | 13 ++++++++++--- htdocs/fourn/commande/fiche.php | 4 ++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 93017f18362..5a3482fac18 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -1408,7 +1408,7 @@ class Form $langs->load('stocks'); $sql = "SELECT p.rowid, p.label, p.ref, p.price, p.duration,"; - $sql.= " pfp.ref_fourn, pfp.rowid as idprodfournprice, pfp.price as fprice, pfp.quantity, pfp.unitprice,"; + $sql.= " pfp.ref_fourn, pfp.rowid as idprodfournprice, pfp.price as fprice, pfp.quantity, pfp.remise_percent, pfp.remise, pfp.unitprice,"; $sql.= " s.nom"; $sql.= " FROM ".MAIN_DB_PREFIX."product as p"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product_fournisseur_price as pfp ON p.rowid = pfp.fk_product"; @@ -1435,7 +1435,7 @@ class Form $sql .= " OR p.barcode LIKE '".$filterkey."'"; } } - $sql.= " ORDER BY pfp.ref_fourn DESC"; + $sql.= " ORDER BY pfp.ref_fourn DESC, pfp.quantity ASC"; // Build output string $outselect=''; @@ -1461,6 +1461,7 @@ class Form $outref=$objp->ref; $outval=''; $outqty=1; + $outdiscount=0; $opt = '