Skip to content

Commit

Permalink
Merge pull request #8218 from OPEN-DSI/product_supplier_buyprice_mult…
Browse files Browse the repository at this point in the history
…icurrency

NEW Add multicurrency support for product buy price for supplier propales, orders and invoices
  • Loading branch information
eldy committed Mar 7, 2018
2 parents 7e6ba51 + d07cd8c commit cf45f78
Show file tree
Hide file tree
Showing 14 changed files with 290 additions and 37 deletions.
6 changes: 5 additions & 1 deletion htdocs/fourn/class/fournisseur.commande.class.php
Expand Up @@ -1535,13 +1535,17 @@ public function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0.0, $txlocalt
$txtva = preg_replace('/\s*\(.*\)/', '', $txtva); // Remove code into vatrate.
}

if ($conf->multicurrency->enabled && $pu_ht_devise > 0) {
$pu = 0;
}

$tabprice = calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $product_type, $this->thirdparty, $localtaxes_type, 100, $this->multicurrency_tx,$pu_ht_devise);
$total_ht = $tabprice[0];
$total_tva = $tabprice[1];
$total_ttc = $tabprice[2];
$total_localtax1 = $tabprice[9];
$total_localtax2 = $tabprice[10];
$pu_ht = $tabprice[3];
$pu = $pu_ht = $tabprice[3];

// MultiCurrency
$multicurrency_total_ht = $tabprice[16];
Expand Down
6 changes: 5 additions & 1 deletion htdocs/fourn/class/fournisseur.facture.class.php
Expand Up @@ -1387,7 +1387,7 @@ public function addline($desc, $pu, $txtva, $txlocaltax1, $txlocaltax2, $qty, $f
{
dol_syslog(get_class($this)."::addline $desc,$pu,$qty,$txtva,$fk_product,$remise_percent,$date_start,$date_end,$ventil,$info_bits,$price_base_type,$type,$fk_unit", LOG_DEBUG);
include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php';
global $mysoc;
global $mysoc, $conf;

// Clean parameters
if (empty($remise_percent)) $remise_percent=0;
Expand Down Expand Up @@ -1416,6 +1416,10 @@ public function addline($desc, $pu, $txtva, $txlocaltax1, $txlocaltax2, $qty, $f
$txlocaltax1=price2num($txlocaltax1);
$txlocaltax2=price2num($txlocaltax2);

if ($conf->multicurrency->enabled && $pu_ht_devise > 0) {
$pu = 0;
}

$tabprice = calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, $this->thirdparty, $localtaxes_type, 100, $this->multicurrency_tx, $pu_ht_devise);
$total_ht = $tabprice[0];
$total_tva = $tabprice[1];
Expand Down
113 changes: 94 additions & 19 deletions htdocs/fourn/class/fournisseur.product.class.php
Expand Up @@ -69,6 +69,13 @@ class ProductFournisseur extends Product
var $supplier_reputation; // reputation of supplier
var $reputations=array(); // list of available supplier reputations

// Multicurreny
var $fourn_multicurrency_id;
var $fourn_multicurrency_code;
var $fourn_multicurrency_tx;
var $fourn_multicurrency_price;
var $fourn_multicurrency_unitprice;

/**
* Constructor
*
Expand Down Expand Up @@ -169,25 +176,29 @@ function remove_product_fournisseur_price($rowid)
/**
* 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 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 New VAT Rate (For example 8.5. Should not be a string)
* @param string $charges costs affering to product
* @param float $remise_percent Discount regarding qty (percent)
* @param float $remise Discount regarding qty (amount)
* @param int $newnpr Set NPR or not
* @param int $delivery_time_days Delay in days for delivery (max). May be '' if not defined.
* @param string $supplier_reputation Reputation with this product to the defined supplier (empty, FAVORITE, DONOTORDER)
* @param array $localtaxes_array Array with localtaxes info array('0'=>type1,'1'=>rate1,'2'=>type2,'3'=>rate2) (loaded by getLocalTaxesFromRate(vatrate, 0, ...) function).
* @param string $newdefaultvatcode Default vat code
* @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 New VAT Rate (For example 8.5. Should not be a string)
* @param string $charges costs affering to product
* @param float $remise_percent Discount regarding qty (percent)
* @param float $remise Discount regarding qty (amount)
* @param int $newnpr Set NPR or not
* @param int $delivery_time_days Delay in days for delivery (max). May be '' if not defined.
* @param string $supplier_reputation Reputation with this product to the defined supplier (empty, FAVORITE, DONOTORDER)
* @param array $localtaxes_array Array with localtaxes info array('0'=>type1,'1'=>rate1,'2'=>type2,'3'=>rate2) (loaded by getLocalTaxesFromRate(vatrate, 0, ...) function).
* @param string $newdefaultvatcode Default vat code
* @param float $multicurrency_buyprice Purchase price for the quantity min in currency
* @param string $multicurrency_price_base_type HT or TTC in currency
* @param float $multicurrency_tx Rate currency
* @param string $multicurrency_code Currency code
* @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, $remise_percent=0, $remise=0, $newnpr=0, $delivery_time_days=0, $supplier_reputation='', $localtaxes_array=array(), $newdefaultvatcode='')
function update_buyprice($qty, $buyprice, $user, $price_base_type, $fourn, $availability, $ref_fourn, $tva_tx, $charges=0, $remise_percent=0, $remise=0, $newnpr=0, $delivery_time_days=0, $supplier_reputation='', $localtaxes_array=array(), $newdefaultvatcode='', $multicurrency_buyprice=0, $multicurrency_price_base_type='HT',$multicurrency_tx=1,$multicurrency_code='')
{
global $conf, $langs;
//global $mysoc;
Expand All @@ -205,6 +216,25 @@ function update_buyprice($qty, $buyprice, $user, $price_base_type, $fourn, $avai
$ttx = $tva_tx;
$buyprice = $buyprice/(1+($ttx/100));
}

// Multicurrency
if ($conf->multicurrency->enabled) {
if (empty($multicurrency_tx)) $multicurrency_tx=1;
if (empty($multicurrency_buyprice)) $multicurrency_buyprice=0;

if (empty($multicurrency_buyprice)) $multicurrency_buyprice=0;
if ($multicurrency_price_base_type == 'TTC')
{
$ttx = $tva_tx;
$multicurrency_buyprice = $multicurrency_buyprice/(1+($ttx/100));
}
$multicurrency_buyprice=price2num($multicurrency_buyprice,'MU');
$multicurrency_unitBuyPrice=price2num($multicurrency_buyprice/$qty,'MU');

$buyprice=$multicurrency_buyprice/$multicurrency_tx;
$fk_multicurrency = MultiCurrency::getIdFromCode($this->db, $multicurrency_code);
}

$buyprice=price2num($buyprice,'MU');
$charges=price2num($charges,'MU');
$qty=price2num($qty);
Expand Down Expand Up @@ -246,6 +276,11 @@ function update_buyprice($qty, $buyprice, $user, $price_base_type, $fourn, $avai
$sql.= " remise = ".$remise.",";
$sql.= " unitprice = ".$unitBuyPrice.",";
$sql.= " fk_availability = ".$availability.",";
$sql.= " multicurrency_price = ".(isset($multicurrency_buyprice)?"'".$this->db->escape(price2num($multicurrency_buyprice))."'":'null').",";
$sql.= " multicurrency_unitprice = ".(isset($multicurrency_unitBuyPrice)?"'".$this->db->escape(price2num($multicurrency_unitBuyPrice))."'":'null').",";
$sql.= " multicurrency_tx = ".(isset($multicurrency_tx)?"'".$this->db->escape($multicurrency_tx)."'":'1').",";
$sql.= " fk_multicurrency = ".(isset($fk_multicurrency)?"'".$this->db->escape($fk_multicurrency)."'":'null').",";
$sql.= " multicurrency_code = ".(isset($multicurrency_code)?"'".$this->db->escape($multicurrency_code)."'":'null').",";
$sql.= " entity = ".$conf->entity.",";
$sql.= " tva_tx = ".price2num($tva_tx).",";
// TODO Add localtax1 and localtax2
Expand Down Expand Up @@ -300,8 +335,15 @@ function update_buyprice($qty, $buyprice, $user, $price_base_type, $fourn, $avai
if ($resql) {
// Add price for this quantity to supplier
$sql = "INSERT INTO " . MAIN_DB_PREFIX . "product_fournisseur_price(";
$sql.= " multicurrency_price, multicurrency_unitprice, multicurrency_tx, fk_multicurrency, multicurrency_code,";
$sql .= "datec, fk_product, fk_soc, ref_fourn, fk_user, price, quantity, remise_percent, remise, unitprice, tva_tx, charges, fk_availability, default_vat_code, info_bits, entity, delivery_time_days, supplier_reputation)";
$sql .= " values('" . $this->db->idate($now) . "',";
$sql .= " values(";
$sql.= (isset($multicurrency_buyprice)?"'".$this->db->escape(price2num($multicurrency_buyprice))."'":'null').",";
$sql.= (isset($multicurrency_unitBuyPrice)?"'".$this->db->escape(price2num($multicurrency_unitBuyPrice))."'":'null').",";
$sql.= (isset($multicurrency_tx)?"'".$this->db->escape($multicurrency_tx)."'":'1').",";
$sql.= (isset($fk_multicurrency)?"'".$this->db->escape($fk_multicurrency)."'":'null').",";
$sql.= (isset($multicurrency_code)?"'".$this->db->escape($multicurrency_code)."'":'null').",";
$sql .= " '" . $this->db->idate($now) . "',";
$sql .= " " . $this->id . ",";
$sql .= " " . $fourn->id . ",";
$sql .= " '" . $this->db->escape($ref_fourn) . "',";
Expand Down Expand Up @@ -334,8 +376,15 @@ function update_buyprice($qty, $buyprice, $user, $price_base_type, $fourn, $avai
if (! $error && empty($conf->global->PRODUCT_PRICE_SUPPLIER_NO_LOG)) {
// Add record into log table
$sql = "INSERT INTO " . MAIN_DB_PREFIX . "product_fournisseur_price_log(";
$sql.= " multicurrency_price, multicurrency_unitprice, multicurrency_tx, fk_multicurrency, multicurrency_code,";
$sql .= "datec, fk_product_fournisseur,fk_user,price,quantity)";
$sql .= "values('" . $this->db->idate($now) . "',";
$sql .= "values(";
$sql.= (isset($multicurrency_buyprice)?"'".$this->db->escape(price2num($multicurrency_buyprice))."'":'null').",";
$sql.= (isset($multicurrency_unitBuyPrice)?"'".$this->db->escape(price2num($multicurrency_unitBuyPrice))."'":'null').",";
$sql.= (isset($multicurrency_tx)?"'".$this->db->escape($multicurrency_tx)."'":'1').",";
$sql.= (isset($fk_multicurrency)?"'".$this->db->escape($fk_multicurrency)."'":'null').",";
$sql.= (isset($multicurrency_code)?"'".$this->db->escape($multicurrency_code)."'":'null').",";
$sql .= " '" . $this->db->idate($now) . "',";
$sql .= " " . $this->product_fourn_id . ",";
$sql .= " " . $user->id . ",";
$sql .= " " . price2num($buyprice) . ",";
Expand Down Expand Up @@ -388,6 +437,7 @@ function fetch_product_fournisseur_price($rowid, $ignore_expression = 0)
$sql = "SELECT pfp.rowid, pfp.price, pfp.quantity, pfp.unitprice, pfp.remise_percent, pfp.remise, pfp.tva_tx, pfp.default_vat_code, pfp.fk_availability,";
$sql.= " pfp.fk_soc, pfp.ref_fourn, pfp.fk_product, pfp.charges, pfp.fk_supplier_price_expression, pfp.delivery_time_days,"; // , pfp.recuperableonly as fourn_tva_npr"; FIXME this field not exist in llx_product_fournisseur_price
$sql.= " pfp.supplier_reputation";
$sql.= " ,pfp.multicurrency_price, pfp.multicurrency_unitprice, pfp.multicurrency_tx, pfp.fk_multicurrency, pfp.multicurrency_code";
$sql.= " FROM ".MAIN_DB_PREFIX."product_fournisseur_price as pfp";
$sql.= " WHERE pfp.rowid = ".$rowid;

Expand Down Expand Up @@ -421,6 +471,12 @@ function fetch_product_fournisseur_price($rowid, $ignore_expression = 0)
$this->supplier_reputation = $obj->supplier_reputation;
$this->default_vat_code = $obj->default_vat_code;

$this->fourn_multicurrency_price = $obj->multicurrency_price;
$this->fourn_multicurrency_unitprice = $obj->multicurrency_unitprice;
$this->fourn_multicurrency_tx = $obj->multicurrency_tx;
$this->fourn_multicurrency_id = $obj->fk_multicurrency;
$this->fourn_multicurrency_code = $obj->multicurrency_code;

if (empty($ignore_expression) && !empty($this->fk_supplier_price_expression))
{
$priceparser = new PriceParser($this->db);
Expand Down Expand Up @@ -471,6 +527,7 @@ function list_product_fournisseur_price($prodid, $sortfield='', $sortorder='', $
$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, pfp.fk_supplier_price_expression,";
$sql.= " pfp.price, pfp.quantity, pfp.unitprice, pfp.remise_percent, pfp.remise, pfp.tva_tx, pfp.fk_availability, pfp.charges, pfp.info_bits, pfp.delivery_time_days, pfp.supplier_reputation";
$sql.= " ,pfp.multicurrency_price, pfp.multicurrency_unitprice, pfp.multicurrency_tx, pfp.fk_multicurrency, pfp.multicurrency_code";
$sql.= " FROM ".MAIN_DB_PREFIX."product_fournisseur_price as pfp";
$sql.= ", ".MAIN_DB_PREFIX."societe as s";
$sql.= " WHERE pfp.entity IN (".getEntity('productprice').")";
Expand Down Expand Up @@ -512,6 +569,12 @@ function list_product_fournisseur_price($prodid, $sortfield='', $sortorder='', $
$prodfourn->fk_supplier_price_expression = $record["fk_supplier_price_expression"];
$prodfourn->supplier_reputation = $record["supplier_reputation"];

$prodfourn->fourn_multicurrency_price = $record["multicurrency_price"];
$prodfourn->fourn_multicurrency_unitprice = $record["multicurrency_unitprice"];
$prodfourn->fourn_multicurrency_tx = $record["multicurrency_tx"];
$prodfourn->fourn_multicurrency_id = $record["fk_multicurrency"];
$prodfourn->fourn_multicurrency_code = $record["multicurrency_code"];

if (!empty($conf->dynamicprices->enabled) && !empty($prodfourn->fk_supplier_price_expression)) {
$priceparser = new PriceParser($this->db);
$price_result = $priceparser->parseProductSupplier($prodfourn);
Expand Down Expand Up @@ -577,10 +640,17 @@ function find_min_price_product_fournisseur($prodid, $qty=0, $socid=0)
$this->delivery_time_days = '';
$this->id = '';

$this->fourn_multicurrency_price = '';
$this->fourn_multicurrency_unitprice = '';
$this->fourn_multicurrency_tx = '';
$this->fourn_multicurrency_id = '';
$this->fourn_multicurrency_code = '';

$sql = "SELECT s.nom as supplier_name, s.rowid as fourn_id,";
$sql.= " pfp.rowid as product_fourn_price_id, pfp.ref_fourn,";
$sql.= " pfp.price, pfp.quantity, pfp.unitprice, pfp.tva_tx, pfp.charges,";
$sql.= " pfp.remise, pfp.remise_percent, pfp.fk_supplier_price_expression, pfp.delivery_time_days";
$sql.= " ,pfp.multicurrency_price, pfp.multicurrency_unitprice, pfp.multicurrency_tx, pfp.fk_multicurrency, pfp.multicurrency_code";
$sql.= " FROM ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."product_fournisseur_price as pfp";
$sql.= " WHERE s.entity IN (".getEntity('societe').")";
$sql.= " AND pfp.fk_product = ".$prodid;
Expand Down Expand Up @@ -654,6 +724,11 @@ function find_min_price_product_fournisseur($prodid, $qty=0, $socid=0)
$this->delivery_time_days = $record["delivery_time_days"];
$this->fk_supplier_price_expression = $record["fk_supplier_price_expression"];
$this->id = $prodid;
$this->fourn_multicurrency_price = $record["multicurrency_price"];
$this->fourn_multicurrency_unitprice = $record["multicurrency_unitprice"];
$this->fourn_multicurrency_tx = $record["multicurrency_tx"];
$this->fourn_multicurrency_id = $record["fk_multicurrency"];
$this->fourn_multicurrency_code = $record["multicurrency_code"];
$min = $fourn_unitprice;
}
}
Expand Down
3 changes: 2 additions & 1 deletion htdocs/fourn/commande/card.php
Expand Up @@ -419,7 +419,8 @@
$date_start,
$date_end,
$array_options,
$productsupplier->fk_unit
$productsupplier->fk_unit,
$productsupplier->fourn_multicurrency_unitprice
);
}
if ($idprod == -99 || $idprod == 0)
Expand Down
4 changes: 3 additions & 1 deletion htdocs/fourn/facture/card.php
Expand Up @@ -1018,7 +1018,9 @@
0,
$array_options,
$productsupplier->fk_unit,
$productsupplier->fourn_ref
0,
$productsupplier->fourn_multicurrency_unitprice,
$productsupplier->fourn_ref
);
}
if ($idprod == -99 || $idprod == 0)
Expand Down
3 changes: 3 additions & 0 deletions htdocs/install/mysql/migration/7.0.0-8.0.0.sql
Expand Up @@ -62,6 +62,9 @@ insert into llx_c_type_container (code,label,module,active) values ('banner',
insert into llx_c_type_container (code,label,module,active) values ('blogpost', 'BlogPost', 'system', 1);
insert into llx_c_type_container (code,label,module,active) values ('other', 'Other', 'system', 1);

-- For supplier product buy price in multicurency
ALTER TABLE llx_product_fournisseur_price CHANGE COLUMN multicurrency_price_ttc multicurrency_unitprice DOUBLE(24,8) NULL DEFAULT NULL;
ALTER TABLE llx_product_fournisseur_price_log CHANGE COLUMN multicurrency_price_ttc multicurrency_unitprice DOUBLE(24,8) NULL DEFAULT NULL;

ALTER TABLE llx_expensereport_det ADD COLUMN docnumber varchar(128) after fk_expensereport;

Expand Down
3 changes: 3 additions & 0 deletions htdocs/langs/en_US/main.lang
Expand Up @@ -325,8 +325,10 @@ Default=Default
DefaultValue=Default value
DefaultValues=Default values
Price=Price
PriceCurrency=Price (currency)
UnitPrice=Unit price
UnitPriceHT=Unit price (net)
UnitPriceHTCurrency=Unit price (net) (currency)
UnitPriceTTC=Unit price
PriceU=U.P.
PriceUHT=U.P. (net)
Expand Down Expand Up @@ -354,6 +356,7 @@ AmountLT2ES=Amount IRPF
AmountTotal=Total amount
AmountAverage=Average amount
PriceQtyMinHT=Price quantity min. (net of tax)
PriceQtyMinHTCurrency=Price quantity min. (net of tax) (currency)
Percentage=Percentage
Total=Total
SubTotal=Subtotal
Expand Down
1 change: 1 addition & 0 deletions htdocs/langs/en_US/products.lang
Expand Up @@ -123,6 +123,7 @@ ConfirmDeleteProductLine=Are you sure you want to delete this product line?
ProductSpecial=Special
QtyMin=Minimum Qty
PriceQtyMin=Price for this min. qty (w/o discount)
PriceQtyMinCurrency=Price for this min. qty (w/o discount) (currency)
VATRateForSupplierProduct=VAT Rate (for this supplier/product)
DiscountQtyMin=Default discount for qty
NoPriceDefinedForThisSupplier=No price/qty defined for this supplier/product
Expand Down
3 changes: 3 additions & 0 deletions htdocs/langs/fr_FR/main.lang
Expand Up @@ -325,8 +325,10 @@ Default=Défaut
DefaultValue=Valeur par défaut
DefaultValues=Valeurs par défaut
Price=Prix
PriceCurrency=Prix (devise)
UnitPrice=Prix unitaire
UnitPriceHT=Prix unitaire HT
UnitPriceHTCurrency=Prix unitaire HT (devise)
UnitPriceTTC=Prix unitaire TTC
PriceU=P.U.
PriceUHT=P.U. HT
Expand All @@ -353,6 +355,7 @@ AmountLT2ES=Montant IRPF
AmountTotal=Montant total
AmountAverage=Montant moyen
PriceQtyMinHT=Prix quantité min. HT
PriceQtyMinHTCurrency=Prix quantité min. HT (devise)
Percentage=Pourcentage
Total=Total
SubTotal=Sous-total
Expand Down

0 comments on commit cf45f78

Please sign in to comment.