diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php
index de8c4519a22..88fca7b536a 100644
--- a/htdocs/core/class/html.form.class.php
+++ b/htdocs/core/class/html.form.class.php
@@ -3120,7 +3120,7 @@ class Form
$sql = "SELECT p.rowid, p.ref, p.label, p.price, p.duration, p.fk_product_type, p.stock,";
$sql .= " pfp.ref_fourn, pfp.rowid as idprodfournprice, pfp.price as fprice, pfp.quantity, pfp.remise_percent, pfp.remise, pfp.unitprice,";
- $sql .= " pfp.fk_supplier_price_expression, pfp.fk_product, pfp.tva_tx, pfp.fk_soc, s.nom as name,";
+ $sql .= " pfp.fk_supplier_price_expression, pfp.fk_product, pfp.tva_tx, pfp.default_vat_code, pfp.fk_soc, s.nom as name,";
$sql .= " pfp.supplier_reputation";
// if we use supplier description of the products
if (!empty($conf->global->PRODUIT_FOURN_TEXTS)) {
@@ -3275,7 +3275,7 @@ class Form
$optlabel = $objp->ref;
if (!empty($objp->idprodfournprice) && ($objp->ref != $objp->ref_fourn)) {
- $optlabel .= ' ('.$objp->ref_fourn.')';
+ $optlabel .= ' ('.$objp->ref_fourn.')';
}
if (!empty($conf->barcode->enabled) && !empty($objp->barcode)) {
$optlabel .= ' ('.$outbarcode.')';
@@ -3416,7 +3416,6 @@ class Form
$opt .= "\n";
-
// Add new entry
// "key" value of json key array is used by jQuery automatically as selected value. Example: 'type' = product or service, 'price_ht' = unit price without tax
// "label" value of json key array is used by jQuery automatically as text for combo box
@@ -3427,7 +3426,11 @@ class Form
'value'=>$outref,
'label'=>$outval,
'qty'=>$outqty,
- 'price_ht'=>price2num($objp->unitprice, 'MT'),
+ 'price_qty_ht'=>price2num($objp->fprice, 'MU'), // Keep higher resolution for price for the min qty
+ 'price_unit_ht'=>price2num($objp->unitprice, 'MU'), // This is used to fill the Unit Price
+ 'price_ht'=>price2num($objp->unitprice, 'MU'), // This is used to fill the Unit Price (for compatibility)
+ 'tva_tx'=>$objp->tva_tx,
+ 'default_vat_code'=>$objp->default_vat_code,
'discount'=>$outdiscount,
'type'=>$outtype,
'duration_value'=>$outdurationvalue,
@@ -3662,7 +3665,7 @@ class Form
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
- * Charge dans cache la liste des délais de livraison possibles
+ * Load int a cache property th elist of possible delivery delays.
*
* @return int Nb of lines loaded, <0 if KO
*/
@@ -3671,7 +3674,7 @@ class Form
// phpcs:enable
global $langs;
- $num = count($this->cache_availability);
+ $num = count($this->cache_availability); // TODO Use $conf->cache['availability'] instead of $this->cache_availability
if ($num > 0) {
return 0; // Cache already loaded
}
@@ -3755,7 +3758,7 @@ class Form
{
global $langs;
- $num = count($this->cache_demand_reason);
+ $num = count($this->cache_demand_reason); // TODO Use $conf->cache['input_reason'] instead of $this->cache_demand_reason
if ($num > 0) {
return 0; // Cache already loaded
}
@@ -3851,7 +3854,7 @@ class Form
// phpcs:enable
global $langs;
- $num = count($this->cache_types_paiements);
+ $num = count($this->cache_types_paiements); // TODO Use $conf->cache['payment_mode'] instead of $this->cache_types_paiements
if ($num > 0) {
return $num; // Cache already loaded
}
@@ -4092,7 +4095,7 @@ class Form
// phpcs:enable
global $langs;
- $num = count($this->cache_transport_mode);
+ $num = count($this->cache_transport_mode); // TODO Use $conf->cache['payment_mode'] instead of $this->cache_transport_mode
if ($num > 0) {
return $num; // Cache already loaded
}
diff --git a/htdocs/core/lib/price.lib.php b/htdocs/core/lib/price.lib.php
index 28723ab87db..4375d14430b 100644
--- a/htdocs/core/lib/price.lib.php
+++ b/htdocs/core/lib/price.lib.php
@@ -404,7 +404,7 @@ function calcul_price_total($qty, $pu, $remise_percent_ligne, $txtva, $uselocalt
}
}
- // Recal function using the multicurrency price as reference price. We must set param $multicurrency_tx to 1 to avoid infinite loop.
+ // Recall function using the multicurrency price as reference price. We must set param $multicurrency_tx to 1 to avoid infinite loop.
$newresult = calcul_price_total($qty, $pu_devise, $remise_percent_ligne, $txtva, $uselocaltax1_rate, $uselocaltax2_rate, $remise_percent_global, $price_base_type, $info_bits, $type, $seller, $localtaxes_array, $progress, 1, 0, '');
if ($multicurrency_code) {
diff --git a/htdocs/core/tpl/objectline_create.tpl.php b/htdocs/core/tpl/objectline_create.tpl.php
index aeac5d038f3..8d21a789648 100644
--- a/htdocs/core/tpl/objectline_create.tpl.php
+++ b/htdocs/core/tpl/objectline_create.tpl.php
@@ -1013,7 +1013,7 @@ if (!empty($usemargins) && $user->rights->margins->creer) {
jQuery("#prod_entry_mode_free").prop('checked',true).change();
jQuery("#prod_entry_mode_predef").prop('checked',false).change();
jQuery("#search_idprod, #idprod, #search_idprodfournprice, #buying_price").val('');
- jQuery("#price_ht, #multicurrency_price_ht, #price_ttc, #price_ttc, #fourn_ref, #tva_tx, #buying_price, #title_fourn_ref, #title_vat, #title_up_ht, #title_up_ht_currency, #title_up_ttc, #title_up_ttc_currency").show();
+ jQuery("#price_ht, #multicurrency_price_ht, #price_ttc, #multicurrency_price_ttc, #fourn_ref, #tva_tx, #buying_price, #title_fourn_ref, #title_vat, #title_up_ht, #title_up_ht_currency, #title_up_ttc, #title_up_ttc_currency").show();
jQuery("#np_marginRate, #np_markRate, .np_marginRate, .np_markRate, #units, #title_units").show();
jQuery("#fournprice_predef").hide();
}
@@ -1032,7 +1032,17 @@ if (!empty($usemargins) && $user->rights->margins->creer) {
jQuery("#multicurrency_price_ht").val('').hide();
jQuery("#title_up_ht, #title_up_ht_currency").hide();
- jQuery("#price_ttc, #fourn_ref, #tva_tx, #title_fourn_ref, #title_vat, #title_up_ttc, #title_up_ttc_currency").hide();
+ global->MAIN_ENABLE_EDIT_PREDEF_PRICETTC)) { ?>
+ jQuery("#price_ttc").val('').hide();
+ jQuery("#multicurrency_price_ttc").val('').hide();
+ jQuery("#title_up_ttc, #title_up_ttc_currency").hide();
+
+ jQuery("#price_ttc").val('').show();
+ jQuery("#multicurrency_price_ttc").val('').show();
+ jQuery("#title_up_ttc, #title_up_ttc_currency").show();
+
+ jQuery("#fourn_ref, #tva_tx, #title_vat").hide();
+ /* jQuery("#title_fourn_ref").hide(); */
jQuery("#np_marginRate, #np_markRate, .np_marginRate, .np_markRate, #units, #title_units").hide();
jQuery("#buying_price").show();
jQuery('#trlinefordates, .divlinefordates').show();
diff --git a/htdocs/fourn/class/fournisseur.facture.class.php b/htdocs/fourn/class/fournisseur.facture.class.php
index d08031b5b69..e9db81e298f 100644
--- a/htdocs/fourn/class/fournisseur.facture.class.php
+++ b/htdocs/fourn/class/fournisseur.facture.class.php
@@ -1793,14 +1793,14 @@ class FactureFournisseur extends CommonInvoice
* @param array $array_options extrafields array
* @param string $fk_unit Code of the unit to use. Null to use the default one
* @param int $origin_id id origin document
- * @param double $pu_ht_devise Amount in currency
+ * @param double $pu_devise Amount in currency
* @param string $ref_supplier Supplier ref
* @param string $special_code Special code
* @param int $fk_parent_line Parent line id
* @param int $fk_remise_except Id discount used
* @return int >0 if OK, <0 if KO
*/
- public function addline($desc, $pu, $txtva, $txlocaltax1, $txlocaltax2, $qty, $fk_product = 0, $remise_percent = 0, $date_start = '', $date_end = '', $ventil = 0, $info_bits = '', $price_base_type = 'HT', $type = 0, $rang = -1, $notrigger = false, $array_options = 0, $fk_unit = null, $origin_id = 0, $pu_ht_devise = 0, $ref_supplier = '', $special_code = '', $fk_parent_line = 0, $fk_remise_except = 0)
+ public function addline($desc, $pu, $txtva, $txlocaltax1, $txlocaltax2, $qty, $fk_product = 0, $remise_percent = 0, $date_start = '', $date_end = '', $ventil = 0, $info_bits = '', $price_base_type = 'HT', $type = 0, $rang = -1, $notrigger = false, $array_options = 0, $fk_unit = null, $origin_id = 0, $pu_devise = 0, $ref_supplier = '', $special_code = '', $fk_parent_line = 0, $fk_remise_except = 0)
{
global $langs, $mysoc, $conf;
@@ -1906,7 +1906,7 @@ class FactureFournisseur extends CommonInvoice
$product_type = $type;
}
- if (!empty($conf->multicurrency->enabled) && $pu_ht_devise > 0) {
+ if (!empty($conf->multicurrency->enabled) && $pu_devise > 0) {
$pu = 0;
}
@@ -1925,7 +1925,7 @@ class FactureFournisseur extends CommonInvoice
// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker
// la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva.
- $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);
+ $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_devise);
$total_ht = $tabprice[0];
$total_tva = $tabprice[1];
$total_ttc = $tabprice[2];
@@ -2052,21 +2052,21 @@ class FactureFournisseur extends CommonInvoice
* @param integer $date_end Date end of service
* @param array $array_options extrafields array
* @param string $fk_unit Code of the unit to use. Null to use the default one
- * @param double $pu_ht_devise Amount in currency
+ * @param double $pu_devise Amount in currency
* @param string $ref_supplier Supplier ref
* @return int <0 if KO, >0 if OK
*/
- public function updateline($id, $desc, $pu, $vatrate, $txlocaltax1 = 0, $txlocaltax2 = 0, $qty = 1, $idproduct = 0, $price_base_type = 'HT', $info_bits = 0, $type = 0, $remise_percent = 0, $notrigger = false, $date_start = '', $date_end = '', $array_options = 0, $fk_unit = null, $pu_ht_devise = 0, $ref_supplier = '')
+ public function updateline($id, $desc, $pu, $vatrate, $txlocaltax1 = 0, $txlocaltax2 = 0, $qty = 1, $idproduct = 0, $price_base_type = 'HT', $info_bits = 0, $type = 0, $remise_percent = 0, $notrigger = false, $date_start = '', $date_end = '', $array_options = 0, $fk_unit = null, $pu_devise = 0, $ref_supplier = '')
{
global $mysoc, $langs;
- dol_syslog(get_class($this)."::updateline $id,$desc,$pu,$vatrate,$qty,$idproduct,$price_base_type,$info_bits,$type,$remise_percent,$notrigger,$date_start,$date_end,$fk_unit,$pu_ht_devise,$ref_supplier", LOG_DEBUG);
+ dol_syslog(get_class($this)."::updateline $id,$desc,$pu,$vatrate,$qty,$idproduct,$price_base_type,$info_bits,$type,$remise_percent,$notrigger,$date_start,$date_end,$fk_unit,$pu_devise,$ref_supplier", LOG_DEBUG);
include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php';
$pu = price2num($pu);
$qty = price2num($qty);
$remise_percent = price2num($remise_percent);
- $pu_ht_devise = price2num($pu_ht_devise);
+ $pu_devise = price2num($pu_devise);
// Check parameters
//if (! is_numeric($pu) || ! is_numeric($qty)) return -1;
@@ -2110,7 +2110,7 @@ class FactureFournisseur extends CommonInvoice
$vatrate = preg_replace('/\s*\(.*\)/', '', $vatrate); // Remove code into vatrate.
}
- $tabprice = calcul_price_total($qty, $pu, $remise_percent, $vatrate, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, $this->thirdparty, $localtaxes_type, 100, $this->multicurrency_tx, $pu_ht_devise);
+ $tabprice = calcul_price_total($qty, $pu, $remise_percent, $vatrate, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, $this->thirdparty, $localtaxes_type, 100, $this->multicurrency_tx, $pu_devise);
$total_ht = $tabprice[0];
$total_tva = $tabprice[1];
$total_ttc = $tabprice[2];
diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php
index 33e679e8216..122dbe8ea0a 100644
--- a/htdocs/fourn/facture/card.php
+++ b/htdocs/fourn/facture/card.php
@@ -1297,7 +1297,7 @@ if (empty($reshook)) {
$localtax2_tx = get_localtax($tva_tx, 2, $mysoc, $object->thirdparty);
$remise_percent = price2num(GETPOST('remise_percent'), '', 2);
- $pu_ht_devise = price2num(GETPOST('multicurrency_subprice'), 'MU', 2);
+ $pu_devise = price2num(GETPOST('multicurrency_subprice'), 'MU', 2);
// Extrafields Lines
$extralabelsline = $extrafields->fetch_name_optionals_label($object->table_element_line);
@@ -1309,7 +1309,7 @@ if (empty($reshook)) {
}
}
- $result = $object->updateline(GETPOST('lineid', 'int'), $label, $up, $tva_tx, $localtax1_tx, $localtax2_tx, price2num(GETPOST('qty'), 'MS'), GETPOST('productid', 'int'), $price_base_type, $info_bits, $type, $remise_percent, 0, $date_start, $date_end, $array_options, GETPOST('units'), $pu_ht_devise, GETPOST('fourn_ref', 'alpha'));
+ $result = $object->updateline(GETPOST('lineid', 'int'), $label, $up, $tva_tx, $localtax1_tx, $localtax2_tx, price2num(GETPOST('qty'), 'MS'), GETPOST('productid', 'int'), $price_base_type, $info_bits, $type, $remise_percent, 0, $date_start, $date_end, $array_options, GETPOST('units'), $pu_devise, GETPOST('fourn_ref', 'alpha'));
if ($result >= 0) {
unset($_POST['label']);
unset($_POST['fourn_ref']);
@@ -1355,17 +1355,18 @@ if (empty($reshook)) {
$prod_entry_mode = GETPOST('prod_entry_mode');
if ($prod_entry_mode == 'free') {
$idprod = 0;
- $price_ht = price2num(GETPOST('price_ht'), 'MU', 2);
- $tva_tx = (GETPOST('tva_tx') ? GETPOST('tva_tx') : 0);
} else {
$idprod = GETPOST('idprod', 'int');
- $price_ht = price2num(GETPOST('price_ht'), 'MU', 2);
- $tva_tx = '';
}
+ $tva_tx = (GETPOST('tva_tx') ? GETPOST('tva_tx') : 0); // Can be '1.2' or '1.2 (CODE)'
+
+ $price_ht = price2num(GETPOST('price_ht'), 'MU', 2);
+ $price_ht_devise = price2num(GETPOST('multicurrency_price_ht'), 'CU', 2);
+ $price_ttc = price2num(GETPOST('price_ttc'), 'MU', 2);
+ $price_ttc_devise = price2num(GETPOST('multicurrency_price_ttc'), 'CU', 2);
$qty = price2num(GETPOST('qty'.$predef, 'alpha'), 'MS');
$remise_percent = price2num(GETPOST('remise_percent'.$predef), 2);
- $price_ht_devise = price2num(GETPOST('multicurrency_price_ht'), 'MU', 2);
// Extrafields
$extralabelsline = $extrafields->fetch_name_optionals_label($object->table_element_line);
@@ -1455,8 +1456,8 @@ if (empty($reshook)) {
}
//If text set in desc is the same as product descpription (as now it's preloaded) whe add it only one time
- if ($product_desc==$desc && !empty($conf->global->PRODUIT_AUTOFILL_DESC)) {
- $product_desc='';
+ if (trim($product_desc) == trim($desc) && !empty($conf->global->PRODUIT_AUTOFILL_DESC)) {
+ $product_desc = '';
}
if (!empty($product_desc) && !empty($conf->global->MAIN_NO_CONCAT_DESCRIPTION)) {
$desc = $product_desc;
@@ -1465,32 +1466,39 @@ if (empty($reshook)) {
$desc = dol_concatdesc($desc, $product_desc, '', !empty($conf->global->MAIN_CHANGE_ORDER_CONCAT_DESCRIPTION));
}
- $type = $productsupplier->type;
- if (GETPOST('price_ht') != '' || GETPOST('price_ht_devise') != '') {
- $price_base_type = 'HT';
- $pu = price2num($price_ht, 'MU');
- $pu_ht_devise = price2num($price_ht_devise, 'CU');
- } else {
- $price_base_type = ($productsupplier->fourn_price_base_type ? $productsupplier->fourn_price_base_type : 'HT');
- if (empty($object->multicurrency_code) || ($productsupplier->fourn_multicurrency_code != $object->multicurrency_code)) { // If object is in a different currency and price not in this currency
- $pu = $productsupplier->fourn_pu;
- $pu_ht_devise = 0;
- } else {
- $pu = $productsupplier->fourn_pu;
- $pu_ht_devise = $productsupplier->fourn_multicurrency_unitprice;
- }
- }
-
$ref_supplier = $productsupplier->ref_supplier;
- $tva_tx = get_default_tva($object->thirdparty, $mysoc, $productsupplier->id, GETPOST('idprodfournprice', 'alpha'));
- $tva_npr = get_default_npr($object->thirdparty, $mysoc, $productsupplier->id, GETPOST('idprodfournprice', 'alpha'));
+ // Get vat rate
+ if (!GETPOSTISSET('tva_tx')) { // If vat rate not provided from the form (the form has the priority)
+ $tva_tx = get_default_tva($object->thirdparty, $mysoc, $productsupplier->id, GETPOST('idprodfournprice', 'alpha'));
+ $tva_npr = get_default_npr($object->thirdparty, $mysoc, $productsupplier->id, GETPOST('idprodfournprice', 'alpha'));
+ }
if (empty($tva_tx)) {
$tva_npr = 0;
}
$localtax1_tx = get_localtax($tva_tx, 1, $mysoc, $object->thirdparty, $tva_npr);
$localtax2_tx = get_localtax($tva_tx, 2, $mysoc, $object->thirdparty, $tva_npr);
+ $type = $productsupplier->type;
+ if (GETPOST('price_ht') != '' || GETPOST('price_ht_devise') != '') {
+ $price_base_type = 'HT';
+ $pu = price2num($price_ht, 'MU');
+ $pu_devise = price2num($price_ht_devise, 'CU');
+ } elseif (GETPOST('price_ttc') != '' || GETPOST('price_ttc_devise') != '') {
+ $price_base_type = 'TTC';
+ $pu = price2num($price_ttc, 'MU');
+ $pu_devise = price2num($price_ttc_devise, 'CU');
+ } else {
+ $price_base_type = ($productsupplier->fourn_price_base_type ? $productsupplier->fourn_price_base_type : 'HT');
+ if (empty($object->multicurrency_code) || ($productsupplier->fourn_multicurrency_code != $object->multicurrency_code)) { // If object is in a different currency and price not in this currency
+ $pu = $productsupplier->fourn_pu;
+ $pu_devise = 0;
+ } else {
+ $pu = $productsupplier->fourn_pu;
+ $pu_devise = $productsupplier->fourn_multicurrency_unitprice;
+ }
+ }
+
if (empty($pu)) {
$pu = 0; // If pu is '' or null, we force to have a numeric value
}
@@ -1515,7 +1523,7 @@ if (empty($reshook)) {
$array_options,
$productsupplier->fk_unit,
0,
- $pu_ht_devise,
+ $pu_devise,
$ref_supplier,
''
);
@@ -1557,9 +1565,9 @@ if (empty($reshook)) {
$pu_ht = price2num($pu_ttc / (1 + ($tva_tx / 100)), 'MU'); // $pu_ht must be rounded according to settings
}
$price_base_type = 'HT';
- $pu_ht_devise = price2num($price_ht_devise, 'CU');
+ $pu_devise = price2num($price_devise, 'CU');
- $result = $object->addline($product_desc, $pu_ht, $tva_tx, $localtax1_tx, $localtax2_tx, $qty, 0, $remise_percent, $date_start, $date_end, 0, $tva_npr, $price_base_type, $type, -1, 0, $array_options, $fk_unit, 0, $pu_ht_devise, $ref_supplier);
+ $result = $object->addline($product_desc, $pu_ht, $tva_tx, $localtax1_tx, $localtax2_tx, $qty, 0, $remise_percent, $date_start, $date_end, 0, $tva_npr, $price_base_type, $type, -1, 0, $array_options, $fk_unit, 0, $pu_devise, $ref_supplier);
}
//print "xx".$tva_tx; exit;
diff --git a/htdocs/product/ajax/products.php b/htdocs/product/ajax/products.php
index c6ce5fb5873..32c4c83378c 100644
--- a/htdocs/product/ajax/products.php
+++ b/htdocs/product/ajax/products.php
@@ -73,7 +73,7 @@ restrictedArea($user, 'produit|service', 0, 'product&product');
// print ''."\n";
// print_r($_GET);
-if (!empty($action) && $action == 'fetch' && !empty($id)) {
+if ($action == 'fetch' && !empty($id)) {
// action='fetch' is used to get product information on a product. So when action='fetch', id must be the product id.
require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
diff --git a/htdocs/product/fournisseurs.php b/htdocs/product/fournisseurs.php
index b79fe5fb843..d521f3b5eae 100644
--- a/htdocs/product/fournisseurs.php
+++ b/htdocs/product/fournisseurs.php
@@ -63,10 +63,9 @@ $error = 0;
$extrafields = new ExtraFields($db);
// If socid provided by ajax company selector
-if (!empty($_REQUEST['search_fourn_id'])) {
+if (GETPOST('search_fourn_id', 'int')) {
$_GET['id_fourn'] = GETPOST('search_fourn_id', 'int');
$_POST['id_fourn'] = GETPOST('search_fourn_id', 'int');
- $_REQUEST['id_fourn'] = GETPOST('search_fourn_id', 'int');
}
// Security check
@@ -518,7 +517,7 @@ if ($id > 0 || $ref) {
} else {
$events = array();
$events[] = array('method' => 'getVatRates', 'url' => dol_buildpath('/core/ajax/vatrates.php', 1), 'htmlname' => 'tva_tx', 'params' => array());
- print $form->select_company(GETPOST("id_fourn", 'alpha'), 'id_fourn', 'fournisseur=1', 'SelectThirdParty', 0, 0, $events);
+ print img_picto('', 'company', 'class="pictofixedwidth"').$form->select_company(GETPOST("id_fourn", 'alpha'), 'id_fourn', 'fournisseur=1', 'SelectThirdParty', 0, 0, $events);
$parameters = array('filtre'=>"fournisseur=1", 'html_name'=>'id_fourn', 'selected'=>GETPOST("id_fourn"), 'showempty'=>1, 'prod_id'=>$object->id);
$reshook = $hookmanager->executeHooks('formCreateThirdpartyOptions', $parameters, $object, $action);