diff --git a/ChangeLog b/ChangeLog
index 228a2fd6291..ad00051939c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -507,7 +507,7 @@ NEW: Disabled users are striked.
NEW: Enhance navigation of project module
NEW: fichinter lines ordered by rang AND DATE
NEW: hidden conf to use input file multiple from mail form
-NEW: hidden feature: SUPPLIERORDER_WITH_NOPRICEDEFINED allow supplier order even if no supplier price defined
+NEW: hidden feature: SUPPLIER_ORDER_WITH_NOPRICEDEFINED allow supplier order even if no supplier price defined
NEW: Hidden option MAIN_LANDING_PAGE to choose the first page to show after login works as a "global" option (llx_const) and as a "per user" option (llx_user_param).
NEW: Holiday is a now a RH module. All RH module provides by default visilibity on users of its hierarchy.
NEW: If error is reported during migration process, you can ignore it to avoid to be locked.
diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php
index 59142e4c060..bad85dfac95 100644
--- a/htdocs/core/class/html.form.class.php
+++ b/htdocs/core/class/html.form.class.php
@@ -2207,10 +2207,6 @@ class Form
unset($producttmpselect);
}
- if (!empty($conf->global->SUPPLIER_ORDER_WITH_NOPRICEDEFINED))
- {
- print '';
- }
// mode=2 means suppliers products
$urloption=($socid > 0?'socid='.$socid.'&':'').'htmlname='.$htmlname.'&outjson=1&price_level='.$price_level.'&type='.$filtertype.'&mode=2&status='.$status.'&finished='.$finished.'&alsoproductwithnosupplierprice='.$alsoproductwithnosupplierprice;
print ajax_autocompleter($selected, $htmlname, DOL_URL_ROOT.'/product/ajax/products.php', $urloption, $conf->global->PRODUIT_USE_SEARCH_TO_SELECT, 0, $ajaxoptions);
@@ -2218,11 +2214,6 @@ class Form
}
else
{
- if (!empty($conf->global->SUPPLIER_ORDER_WITH_NOPRICEDEFINED))
- {
- print '';
- print '';
- }
print $this->select_produits_fournisseurs_list($socid,$selected,$htmlname,$filtertype,$filtre,'',-1,0,0,$alsoproductwithnosupplierprice);
}
}
diff --git a/htdocs/core/lib/ajax.lib.php b/htdocs/core/lib/ajax.lib.php
index e7d8a7cf538..f793bb2601d 100644
--- a/htdocs/core/lib/ajax.lib.php
+++ b/htdocs/core/lib/ajax.lib.php
@@ -40,6 +40,7 @@
* Ex: array('disabled'=>
* Ex: array('show'=>
* Ex: array('update_textarea'=>
+ * Ex: array('option_disabled'=> id to disable and warning to show if we select a disabled value (this is possible when using autocomplete ajax)
* @return string Script
*/
function ajax_autocompleter($selected, $htmlname, $url, $urloption='', $minLength=2, $autoselect=0, $ajaxoptions=array())
@@ -140,6 +141,7 @@ function ajax_autocompleter($selected, $htmlname, $url, $urloption='', $minLengt
$("#'.$htmlname.'").val(ui.item.id).trigger("change"); // Select new value
// Disable an element
if (options.option_disabled) {
+ console.log("Make action option_disabled on #"+options.option_disabled+" with disabled="+ui.item.disabled)
if (ui.item.disabled) {
$("#" + options.option_disabled).prop("disabled", true);
if (options.error) {
@@ -148,28 +150,32 @@ function ajax_autocompleter($selected, $htmlname, $url, $urloption='', $minLengt
if (options.warning) {
$.jnotify(options.warning, "warning", false); // Output with jnotify the warning message
}
- } else {
+ } else {
$("#" + options.option_disabled).removeAttr("disabled");
}
}
if (options.disabled) {
+ console.log("Make action disabled on each "+options.option_disabled)
$.each(options.disabled, function(key, value) {
$("#" + value).prop("disabled", true);
});
}
if (options.show) {
+ console.log("Make action show on each "+options.show)
$.each(options.show, function(key, value) {
$("#" + value).show().trigger("show");
});
}
// Update an input
if (ui.item.update) {
+ console.log("Make action update on each ui.item.update")
// loop on each "update" fields
$.each(ui.item.update, function(key, value) {
$("#" + key).val(value).trigger("change");
});
}
if (ui.item.textarea) {
+ console.log("Make action textarea on each ui.item.textarea")
$.each(ui.item.textarea, function(key, value) {
if (typeof CKEDITOR == "object" && typeof CKEDITOR.instances != "undefined" && CKEDITOR.instances[key] != "undefined") {
CKEDITOR.instances[key].setData(value);
@@ -181,12 +187,12 @@ function ajax_autocompleter($selected, $htmlname, $url, $urloption='', $minLengt
});
}
console.log("ajax_autocompleter new value selected, we trigger change on original component so field #search_'.$htmlname.'");
-
+
$("#search_'.$htmlname.'").trigger("change"); // We have changed value of the combo select, we must be sure to trigger all js hook binded on this event. This is required to trigger other javascript change method binded on original field by other code.
}
,delay: 500
}).data("ui-autocomplete")._renderItem = function( ul, item ) {
-
+
return $("
")
.data( "ui-autocomplete-item", item ) // jQuery UI > 1.10.0
.append( \'\' + item.label + "" )
diff --git a/htdocs/core/tpl/objectline_create.tpl.php b/htdocs/core/tpl/objectline_create.tpl.php
index 5e9786f2ba4..f14af2b838f 100644
--- a/htdocs/core/tpl/objectline_create.tpl.php
+++ b/htdocs/core/tpl/objectline_create.tpl.php
@@ -26,7 +26,7 @@
* $langs
* $dateSelector
* $forceall (0 by default, 1 for supplier invoices/orders)
- * $senderissupplier (0 by default, 1 for supplier invoices/orders)
+ * $senderissupplier (0 by default, 1 or 2 for supplier invoices/orders)
* $inputalsopricewithtax (0 by default, 1 to also show column with unit price including tax)
*/
@@ -52,7 +52,7 @@ if (in_array($object->element,array('propal', 'supplier_proposal','facture','fac
?>
-lines) == 0 || $forcetoshowtitlelines);
if ($nolinesbefore) {
?>
@@ -94,7 +94,7 @@ if ($nolinesbefore) {
global->MARGIN_TYPE == "1")
echo $langs->trans('BuyingPrice');
else
@@ -108,7 +108,7 @@ if ($nolinesbefore) {
?>
-
@@ -200,20 +200,22 @@ else {
}
else
{
+ // $senderissupplier=2 is same than 1 but disable test on minimum qty and disable autofill qty with minimum
if ($senderissupplier != 2)
{
$ajaxoptions=array(
'update' => array('qty'=>'qty','remise_percent' => 'discount','idprod' => 'idprod'), // html id tags that will be edited with which ajax json response key
- 'option_disabled' => 'addPredefinedProductButton', // html id to disable once select is done
- 'warning' => $langs->trans("NoPriceDefinedForThisSupplier") // translation of an error saved into var 'error'
+ 'option_disabled' => 'idthatdoesnotexists', // html id to disable once select is done
+ 'warning' => $langs->trans("NoPriceDefinedForThisSupplier") // translation of an error saved into var 'warning' (for exemple shown we select a disabled option into combo)
);
$alsoproductwithnosupplierprice=0;
}
- else
+ else
{
$ajaxoptions = array();
$alsoproductwithnosupplierprice=1;
}
+
$form->select_produits_fournisseurs($object->socid, GETPOST('idprodfournprice'), 'idprodfournprice', '', '', $ajaxoptions, 1, $alsoproductwithnosupplierprice);
}
echo '';
@@ -263,13 +265,13 @@ else {
">
-
+
multicurrency->enabled)) { $colspan++;?>
">
-
+
">
@@ -306,7 +308,7 @@ else {
rights->margins->creer)
{
if (! empty($conf->global->DISPLAY_MARGIN_RATES))
@@ -561,9 +563,9 @@ jQuery(document).ready(function() {
$("#idprod, #idprodfournprice").change(function()
{
console.log("#idprod, #idprodfournprice change triggered");
-
+
setforpredef(); // TODO Keep vat combo visible and set it to first entry into list that match result of get_default_tva
-
+
jQuery('#trlinefordates').show();
global->MARGIN_TYPE))
{
if ($conf->global->MARGIN_TYPE == '1') print 'bestsupplierprice';
@@ -598,7 +600,7 @@ jQuery(document).ready(function() {
if ($conf->global->MARGIN_TYPE == 'costprice') print 'costprice';
} ?>';
console.log("we will set the field for margin. defaultbuyprice="+defaultbuyprice);
-
+
var i = 0;
$(data).each(function() {
if (this.id != 'pmpprice' && this.id != 'costprice')
@@ -615,7 +617,7 @@ jQuery(document).ready(function() {
//console.log("id="+this.id+"-price="+this.price);
if ('pmp' == defaultbuyprice || 'costprice' == defaultbuyprice)
{
- if (this.price > 0) {
+ if (this.price > 0) {
defaultkey = this.id; defaultprice = this.price; pmppriceid = this.id; pmppricevalue = this.price;
//console.log("pmppricevalue="+pmppricevalue);
}
@@ -634,22 +636,22 @@ jQuery(document).ready(function() {
options += '';
});
options += '';
-
+
console.log("finally selected defaultkey="+defaultkey+" defaultprice="+defaultprice);
-
+
$("#fournprice_predef").html(options).show();
if (defaultkey != '')
{
$("#fournprice_predef").val(defaultkey);
}
-
+
/* At loading, no product are yet selected, so we hide field of buying_price */
$("#buying_price").hide();
-
+
/* Define default price at loading */
var defaultprice = $("#fournprice_predef").find('option:selected').attr("price");
$("#buying_price").val(defaultprice);
-
+
$("#fournprice_predef").change(function() {
console.log("change on fournprice_predef");
/* Hide field buying_price according to choice into list (if 'inputprice' or not) */
diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php
index e9da56d2093..1d099ee9265 100644
--- a/htdocs/fourn/class/fournisseur.commande.class.php
+++ b/htdocs/fourn/class/fournisseur.commande.class.php
@@ -1157,7 +1157,7 @@ class CommandeFournisseur extends CommonOrder
// insert products details into database
for ($i=0;$i<$num;$i++)
{
- $result = $this->addline( // This include test on qty if option SUPPLIERORDER_WITH_NOPRICEDEFINED is not set
+ $result = $this->addline( // This include test on qty if option SUPPLIER_ORDER_WITH_NOPRICEDEFINED is not set
$this->lines[$i]->desc,
$this->lines[$i]->subprice,
$this->lines[$i]->qty,
@@ -1393,7 +1393,7 @@ class CommandeFournisseur extends CommonOrder
if ($fk_product > 0)
{
- if (empty($conf->global->SUPPLIERORDER_WITH_NOPRICEDEFINED))
+ if (empty($conf->global->SUPPLIER_ORDER_WITH_NOPRICEDEFINED))
{
// Check quantity is enough
dol_syslog(get_class($this)."::addline we check supplier prices fk_product=".$fk_product." fk_prod_fourn_price=".$fk_prod_fourn_price." qty=".$qty." fourn_ref=".$fourn_ref);
diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php
index bbc91bc3871..74d96158f65 100644
--- a/htdocs/fourn/commande/card.php
+++ b/htdocs/fourn/commande/card.php
@@ -346,21 +346,29 @@ if (empty($reshook))
{
$productsupplier = new ProductFournisseur($db);
- if (empty($conf->global->SUPPLIER_ORDER_WITH_NOPRICEDEFINED))
+ if (empty($conf->global->SUPPLIER_ORDER_WITH_NOPRICEDEFINED)) // TODO this test seems useless
{
$idprod=0;
if (GETPOST('idprodfournprice') == -1 || GETPOST('idprodfournprice') == '') $idprod=-99; // Same behaviour than with combolist. When not select idprodfournprice is now -99 (to avoid conflict with next action that may return -1, -2, ...)
}
-
- if (GETPOST('idprodfournprice') > 0)
+ if (preg_match('/^idprod_([0-9]+)$/',GETPOST('idprodfournprice'), $reg))
+ {
+ $idprod=$reg[1];
+ $res=$productsupplier->fetch($idprod);
+ // Call to init properties of $productsupplier
+ // So if a supplier price already exists for another thirdparty (first one found), we use it as reference price
+ $productsupplier->get_buyprice(0, -1, $idprod, 'none'); // We force qty to -1 to be sure to find if a supplier price exist
+ }
+ elseif (GETPOST('idprodfournprice') > 0)
{
- $idprod=$productsupplier->get_buyprice(GETPOST('idprodfournprice'), $qty); // Just to see if a price exists for the quantity. Not used to found vat.
+ $qtytosearch=$qty; // Just to see if a price exists for the quantity. Not used to found vat.
+ //$qtytosearch=-1; // We force qty to -1 to be sure to find if a supplier price exist
+ $idprod=$productsupplier->get_buyprice(GETPOST('idprodfournprice'), $qtytosearch);
+ $res=$productsupplier->fetch($idprod);
}
if ($idprod > 0)
{
- $res=$productsupplier->fetch($idprod);
-
$label = $productsupplier->label;
$desc = $productsupplier->description;
@@ -381,8 +389,8 @@ if (empty($reshook))
$tva_tx,
$localtax1_tx,
$localtax2_tx,
+ $idprod,
$productsupplier->id,
- GETPOST('idprodfournprice'),
$productsupplier->fourn_ref,
$remise_percent,
'HT',
@@ -2074,6 +2082,7 @@ elseif (! empty($object->id))
// Add free products/services form
global $forceall, $senderissupplier, $dateSelector;
$forceall=1; $senderissupplier=1; $dateSelector=0;
+ if (! empty($conf->global->SUPPLIER_ORDER_WITH_NOPRICEDEFINED)) $senderissupplier=2; // $senderissupplier=2 is same than 1 but disable test on minimum qty and disable autofill qty with minimum.
// Show object lines
$inputalsopricewithtax=0;
diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php
index e90af97cfd9..8402b298f93 100644
--- a/htdocs/fourn/facture/card.php
+++ b/htdocs/fourn/facture/card.php
@@ -201,7 +201,7 @@ if (empty($reshook))
}
$model=$object->modelpdf;
$ret = $object->fetch($id); // Reload to get new records
-
+
$result=$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
if ($result < 0) dol_print_error($db,$result);
}
@@ -945,21 +945,30 @@ if (empty($reshook))
if (GETPOST('prod_entry_mode') != 'free' && empty($error)) // With combolist mode idprodfournprice is > 0 or -1. With autocomplete, idprodfournprice is > 0 or ''
{
- $idprod=0;
$productsupplier=new ProductFournisseur($db);
- if (GETPOST('idprodfournprice') == -1 || GETPOST('idprodfournprice') == '') $idprod=-2; // Same behaviour than with combolist. When not select idprodfournprice is now -2 (to avoid conflict with next action that may return -1)
+ $idprod=0;
+ if (GETPOST('idprodfournprice') == -1 || GETPOST('idprodfournprice') == '') $idprod=-99; // Same behaviour than with combolist. When not select idprodfournprice is now -99 (to avoid conflict with next action that may return -1, -2, ...)
- if (GETPOST('idprodfournprice') > 0)
+ if (preg_match('/^idprod_([0-9]+)$/',GETPOST('idprodfournprice'), $reg))
+ {
+ $idprod=$reg[1];
+ $res=$productsupplier->fetch($idprod);
+ // Call to init properties of $productsupplier
+ // So if a supplier price already exists for another thirdparty (first one found), we use it as reference price
+ $productsupplier->get_buyprice(0, -1, $idprod, 'none'); // We force qty to -1 to be sure to find if a supplier price exist
+ }
+ elseif (GETPOST('idprodfournprice') > 0)
{
- $idprod=$productsupplier->get_buyprice(GETPOST('idprodfournprice'), $qty); // Just to see if a price exists for the quantity. Not used to found vat.
+ $qtytosearch=$qty; // Just to see if a price exists for the quantity. Not used to found vat.
+ //$qtytosearch=-1; // We force qty to -1 to be sure to find if a supplier price exist
+ $idprod=$productsupplier->get_buyprice(GETPOST('idprodfournprice'), $qtytosearch);
+ $res=$productsupplier->fetch($idprod);
}
//Replaces $fk_unit with the product's
if ($idprod > 0)
{
- $result=$productsupplier->fetch($idprod);
-
$label = $productsupplier->label;
$desc = $productsupplier->description;
@@ -974,10 +983,29 @@ if (empty($reshook))
$type = $productsupplier->type;
$price_base_type = 'HT';
- // TODO Save the product supplier ref into database into field ref_supplier (must rename field ref into ref_supplier first)
- $result=$object->addline($desc, $productsupplier->fourn_pu, $tva_tx, $localtax1_tx, $localtax2_tx, $qty, $idprod, $remise_percent, $date_start, $date_end, 0, $tva_npr, $price_base_type, $type, -1, 0, $array_options, $productsupplier->fk_unit);
+ // TODO Save the product supplier ref into database (like done for supplier propal and order) into field ref_supplier (must rename field ref into ref_supplier first)
+ $result=$object->addline(
+ $desc,
+ $productsupplier->fourn_pu,
+ $tva_tx,
+ $localtax1_tx,
+ $localtax2_tx,
+ $qty,
+ $idprod,
+ $remise_percent,
+ $date_start,
+ $date_end,
+ 0,
+ $tva_npr,
+ $price_base_type,
+ $type,
+ -1,
+ 0,
+ $array_options,
+ $productsupplier->fk_unit
+ );
}
- if ($idprod == -2 || $idprod == 0)
+ if ($idprod == -99 || $idprod == 0)
{
// Product not selected
$error++;
@@ -1019,7 +1047,7 @@ if (empty($reshook))
}
$price_base_type = 'HT';
$pu_ht_devise = price2num($price_ht_devise, 'MU');
-
+
$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);
}
@@ -1518,7 +1546,7 @@ if ($action == 'create')
if ((empty($origin)) || ((($origin == 'propal') || ($origin == 'commande')) && (! empty($originid))))
{
// Deposit
- if (empty($conf->global->INVOICE_DISABLE_DEPOSIT))
+ if (empty($conf->global->INVOICE_DISABLE_DEPOSIT))
{
print '
';
$tmp=' ';
@@ -1548,12 +1576,12 @@ if ($action == 'create')
}
}
*/
-
+
/* Not yet supporter for supplier
if ($societe->id > 0)
{
// Replacement
- if (empty($conf->global->INVOICE_DISABLE_REPLACEMENT))
+ if (empty($conf->global->INVOICE_DISABLE_REPLACEMENT))
{
print '';
print '
';
@@ -1603,7 +1631,7 @@ if ($action == 'create')
if ($societe->id > 0)
{
// Credit note
- if (empty($conf->global->INVOICE_DISABLE_CREDIT_NOTE))
+ if (empty($conf->global->INVOICE_DISABLE_CREDIT_NOTE))
{
print '
';
}
}
@@ -2029,7 +2057,7 @@ else
$object->totalpaye = $alreadypaid; // To give a chance to dol_banner_tab to use already paid amount to show correct status
- dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
+ dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
print '
';
-
+
print ' ';
-
+
if (! empty($conf->global->MAIN_DISABLE_CONTACTS_TAB))
{
$blocname = 'contacts';
diff --git a/htdocs/supplier_proposal/card.php b/htdocs/supplier_proposal/card.php
index fee2d3b4a1c..26729ecf866 100644
--- a/htdocs/supplier_proposal/card.php
+++ b/htdocs/supplier_proposal/card.php
@@ -579,7 +579,7 @@ if (empty($reshook))
{
$productsupplier = new ProductFournisseur($db);
- if (empty($conf->global->SUPPLIER_PROPOSAL_WITH_NOPRICEDEFINED))
+ if (empty($conf->global->SUPPLIER_PROPOSAL_WITH_NOPRICEDEFINED)) // TODO this test seems useless
{
$idprod=0;
if (GETPOST('idprodfournprice') == -1 || GETPOST('idprodfournprice') == '') $idprod=-99; // Same behaviour than with combolist. When not select idprodfournprice is now -99 (to avoid conflict with next action that may return -1, -2, ...)
@@ -594,8 +594,9 @@ if (empty($reshook))
}
elseif (GETPOST('idprodfournprice') > 0)
{
- //$idprod=$productsupplier->get_buyprice(GETPOST('idprodfournprice'), $qty); // Just to see if a price exists for the quantity. Not used to found vat.
- $idprod=$productsupplier->get_buyprice(GETPOST('idprodfournprice'), -1); // We force qty to -1 to be sure to find if a supplier price exist
+ //$qtytosearch=$qty; // Just to see if a price exists for the quantity. Not used to found vat.
+ $qtytosearch=-1; // We force qty to -1 to be sure to find if a supplier price exist
+ $idprod=$productsupplier->get_buyprice(GETPOST('idprodfournprice'), $qtytosearch);
$res=$productsupplier->fetch($idprod);
}
@@ -605,7 +606,7 @@ if (empty($reshook))
$price_base_type = $productsupplier->fourn_price_base_type;
$type = $productsupplier->type;
$label = $productsupplier->label;
- $desc = $productsupplier->description;
+ $desc = $productsupplier->description;
if (trim($product_desc) != trim($desc)) $desc = dol_concatdesc($desc, $product_desc);
$tva_tx = get_default_tva($object->thirdparty, $mysoc, $productsupplier->id, GETPOST('idprodfournprice'));