diff --git a/htdocs/comm/action/card.php b/htdocs/comm/action/card.php
index f0354cba285..4dc5221cea3 100644
--- a/htdocs/comm/action/card.php
+++ b/htdocs/comm/action/card.php
@@ -2400,6 +2400,20 @@ if ($id > 0) {
print '';
}
+ //mail information
+ if (!empty($object->email_msgid)) {
+ print '
| '.$langs->trans("Description").' | ';
print dol_string_onlythesehtmltags(dol_htmlentitiesbr($object->note_private));
diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php
index 47e178292eb..40e8fe385d7 100644
--- a/htdocs/comm/propal/class/propal.class.php
+++ b/htdocs/comm/propal/class/propal.class.php
@@ -3708,6 +3708,7 @@ class Propal extends CommonObject
global $conf, $langs, $user;
$datas = [];
+ $nofetch = !empty($params['nofetch']);
if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
return ['optimize' => $langs->trans("Proposal")];
@@ -3720,9 +3721,25 @@ class Propal extends CommonObject
if (!empty($this->ref)) {
$datas['ref'] = ' '.$langs->trans('Ref').': '.$this->ref;
}
+ if (!$nofetch) {
+ $langs->load('companies');
+ if (empty($this->thirdparty)) {
+ $this->fetch_thirdparty();
+ }
+ $datas['customer'] = ' '.$langs->trans('Customer').': '.$this->thirdparty->getNomUrl(1, '', 0, 1);
+ }
if (!empty($this->ref_client)) {
$datas['refcustomer'] = ' '.$langs->trans('RefCustomer').': '.$this->ref_client;
}
+ if (!$nofetch) {
+ $langs->load('project');
+ if (empty($this->project)) {
+ $res = $this->fetch_project();
+ if ($res > 0) {
+ $datas['project'] = ' '.$langs->trans('Project').': '.$this->project->getNomUrl(1, '', 0, 1);
+ }
+ }
+ }
if (!empty($this->total_ht)) {
$datas['amountht'] = ' '.$langs->trans('AmountHT').': '.price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency);
}
@@ -3767,6 +3784,7 @@ class Propal extends CommonObject
'id' => $this->id,
'objecttype' => $this->element,
'option' => $option,
+ 'nofetch' => 1,
];
$classfortooltip = 'classfortooltip';
$dataparams = '';
diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php
index 602e41d08e1..318ce32f115 100644
--- a/htdocs/commande/card.php
+++ b/htdocs/commande/card.php
@@ -2998,7 +2998,7 @@ if ($action == 'create' && $usercancreate) {
// Presend form
$modelmail = 'order_send';
$defaulttopic = 'SendOrderRef';
- $diroutput = $conf->commande->multidir_output[$object->entity];
+ $diroutput = getMultidirOutput($object);
$trackid = 'ord'.$object->id;
include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php';
diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php
index 6348d8e1325..2b11588b854 100644
--- a/htdocs/commande/class/commande.class.php
+++ b/htdocs/commande/class/commande.class.php
@@ -3728,6 +3728,7 @@ class Commande extends CommonOrder
global $conf, $langs, $user;
$datas = [];
+ $nofetch = !empty($params['nofetch']);
if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
return ['optimize' => $langs->trans("Order")];
@@ -3739,7 +3740,23 @@ class Commande extends CommonOrder
$datas[] = ' '.$this->getLibStatut(5);
}
$datas['Ref'] = ' '.$langs->trans('Ref').': '.$this->ref;
+ if (!$nofetch) {
+ $langs->load('companies');
+ if (empty($this->thirdparty)) {
+ $this->fetch_thirdparty();
+ }
+ $datas['customer'] = ' '.$langs->trans('Customer').': '.$this->thirdparty->getNomUrl(1, '', 0, 1);
+ }
$datas['RefCustomer'] = ' '.$langs->trans('RefCustomer').': '.(empty($this->ref_customer) ? (empty($this->ref_client) ? '' : $this->ref_client) : $this->ref_customer);
+ if (!$nofetch) {
+ $langs->load('project');
+ if (empty($this->project)) {
+ $res = $this->fetch_project();
+ if ($res > 0) {
+ $datas['project'] = ' '.$langs->trans('Project').': '.$this->project->getNomUrl(1, '', 0, 1);
+ }
+ }
+ }
if (!empty($this->total_ht)) {
$datas['AmountHT'] = ' '.$langs->trans('AmountHT').': '.price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency);
}
@@ -3811,6 +3828,7 @@ class Commande extends CommonOrder
'id' => $this->id,
'objecttype' => $this->element,
'option' => $option,
+ 'nofetch' => 1,
];
$classfortooltip = 'classfortooltip';
$dataparams = '';
@@ -3960,6 +3978,7 @@ class Commande extends CommonOrder
$this->id = 0;
$this->ref = 'SPECIMEN';
$this->specimen = 1;
+ $this->entity = $conf->entity;
$this->socid = 1;
$this->date = time();
$this->date_lim_reglement = $this->date + 3600 * 24 * 30;
diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php
index 3e3678fbcad..8e6c2ea0161 100644
--- a/htdocs/contrat/class/contrat.class.php
+++ b/htdocs/contrat/class/contrat.class.php
@@ -1995,6 +1995,7 @@ class Contrat extends CommonObject
$langs->load('contracts');
$datas = [];
+ $nofetch = !empty($params['nofetch']);
if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
return ['optimize' => $langs->trans("ShowContract")];
@@ -2006,7 +2007,23 @@ class Contrat extends CommonObject
$label .= ' '.$this->getLibStatut(5);
}*/
$datas['ref'] = ' '.$langs->trans('Ref').': '.($this->ref ? $this->ref : $this->id);
+ if (!$nofetch) {
+ $langs->load('companies');
+ if (empty($this->thirdparty)) {
+ $this->fetch_thirdparty();
+ }
+ $datas['customer'] = ' '.$langs->trans('Customer').': '.$this->thirdparty->getNomUrl(1, '', 0, 1);
+ }
$datas['refcustomer'] = ' '.$langs->trans('RefCustomer').': '. $this->ref_customer;
+ if (!$nofetch) {
+ $langs->load('project');
+ if (empty($this->project)) {
+ $res = $this->fetch_project();
+ if ($res > 0) {
+ $datas['project'] = ' '.$langs->trans('Project').': '.$this->project->getNomUrl(1, '', 0, 1);
+ }
+ }
+ }
$datas['refsupplier'] = ' '.$langs->trans('RefSupplier').': '.$this->ref_supplier;
if (!empty($this->total_ht)) {
$datas['amountht'] = ' '.$langs->trans('AmountHT').': '.price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency);
@@ -2052,6 +2069,7 @@ class Contrat extends CommonObject
$params = [
'id' => $this->id,
'objecttype' => $this->element,
+ 'nofetch' => 1,
];
$classfortooltip = 'classfortooltip';
$dataparams = '';
diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php
index cb5ddfcd395..8a07b83d15e 100644
--- a/htdocs/core/class/commonobject.class.php
+++ b/htdocs/core/class/commonobject.class.php
@@ -5496,171 +5496,165 @@ abstract class CommonObject
$parameters = array('modelspath'=>$modelspath, 'modele'=>$modele, 'outputlangs'=>$outputlangs, 'hidedetails'=>$hidedetails, 'hidedesc'=>$hidedesc, 'hideref'=>$hideref, 'moreparams'=>$moreparams);
$reshook = $hookmanager->executeHooks('commonGenerateDocument', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
- if (empty($reshook)) {
- dol_syslog("commonGenerateDocument modele=".$modele." outputlangs->defaultlang=".(is_object($outputlangs) ? $outputlangs->defaultlang : 'null'));
+ if (!empty($reshook)) {
+ return $reshook;
+ }
- if (empty($modele)) {
- $this->error = 'BadValueForParameterModele';
- return -1;
- }
+ dol_syslog("commonGenerateDocument modele=".$modele." outputlangs->defaultlang=".(is_object($outputlangs) ? $outputlangs->defaultlang : 'null'));
- // Increase limit for PDF build
- $err = error_reporting();
- error_reporting(0);
- @set_time_limit(120);
- error_reporting($err);
+ if (empty($modele)) {
+ $this->error = 'BadValueForParameterModele';
+ return -1;
+ }
- // If selected model is a filename template (then $modele="modelname" or "modelname:filename")
- $tmp = explode(':', $modele, 2);
- if (!empty($tmp[1])) {
- $modele = $tmp[0];
- $srctemplatepath = $tmp[1];
- }
+ // Increase limit for PDF build
+ $err = error_reporting();
+ error_reporting(0);
+ @set_time_limit(120);
+ error_reporting($err);
- // Search template files
- $file = '';
- $classname = '';
- $filefound = '';
- $dirmodels = array('/');
- if (is_array($conf->modules_parts['models'])) {
- $dirmodels = array_merge($dirmodels, $conf->modules_parts['models']);
- }
- foreach ($dirmodels as $reldir) {
- foreach (array('doc', 'pdf') as $prefix) {
- if (in_array(get_class($this), array('Adherent'))) {
- // Member module use prefix_modele.class.php
- $file = $prefix."_".$modele.".class.php";
- } else {
- // Other module use prefix_modele.modules.php
- $file = $prefix."_".$modele.".modules.php";
- }
+ // If selected model is a filename template (then $modele="modelname" or "modelname:filename")
+ $tmp = explode(':', $modele, 2);
+ if (!empty($tmp[1])) {
+ $modele = $tmp[0];
+ $srctemplatepath = $tmp[1];
+ }
- // On verifie l'emplacement du modele
- $file = dol_buildpath($reldir.$modelspath.$file, 0);
- if (file_exists($file)) {
- $filefound = $file;
- $classname = $prefix.'_'.$modele;
- break;
- }
+ // Search template files
+ $file = '';
+ $classname = '';
+ $filefound = '';
+ $dirmodels = array('/');
+ if (is_array($conf->modules_parts['models'])) {
+ $dirmodels = array_merge($dirmodels, $conf->modules_parts['models']);
+ }
+ foreach ($dirmodels as $reldir) {
+ foreach (array('doc', 'pdf') as $prefix) {
+ if (in_array(get_class($this), array('Adherent'))) {
+ // Member module use prefix_modele.class.php
+ $file = $prefix."_".$modele.".class.php";
+ } else {
+ // Other module use prefix_modele.modules.php
+ $file = $prefix."_".$modele.".modules.php";
}
- if ($filefound) {
+
+ // On verifie l'emplacement du modele
+ $file = dol_buildpath($reldir.$modelspath.$file, 0);
+ if (file_exists($file)) {
+ $filefound = $file;
+ $classname = $prefix.'_'.$modele;
break;
}
}
-
- // If generator was found
if ($filefound) {
- global $db; // Required to solve a conception default making an include of code using $db instead of $this->db just after.
+ break;
+ }
+ }
- require_once $file;
+ if (!$filefound) {
+ $this->error = $langs->trans("Error").' Failed to load doc generator with modelpaths='.$modelspath.' - modele='.$modele;
+ $this->errors[] = $this->error;
+ dol_syslog($this->error, LOG_ERR);
+ return -1;
+ }
- $obj = new $classname($this->db);
+ // If generator was found
+ global $db; // Required to solve a conception default making an include of code using $db instead of $this->db just after.
- // If generator is ODT, we must have srctemplatepath defined, if not we set it.
- if ($obj->type == 'odt' && empty($srctemplatepath)) {
- $varfortemplatedir = $obj->scandir;
- if ($varfortemplatedir && !empty($conf->global->$varfortemplatedir)) {
- $dirtoscan = $conf->global->$varfortemplatedir;
+ require_once $file;
- $listoffiles = array();
+ $obj = new $classname($this->db);
- // Now we add first model found in directories scanned
- $listofdir = explode(',', $dirtoscan);
- foreach ($listofdir as $key => $tmpdir) {
- $tmpdir = trim($tmpdir);
- $tmpdir = preg_replace('/DOL_DATA_ROOT/', DOL_DATA_ROOT, $tmpdir);
- if (!$tmpdir) {
- unset($listofdir[$key]);
- continue;
- }
- if (is_dir($tmpdir)) {
- $tmpfiles = dol_dir_list($tmpdir, 'files', 0, '\.od(s|t)$', '', 'name', SORT_ASC, 0);
- if (count($tmpfiles)) {
- $listoffiles = array_merge($listoffiles, $tmpfiles);
- }
- }
- }
+ // If generator is ODT, we must have srctemplatepath defined, if not we set it.
+ if ($obj->type == 'odt' && empty($srctemplatepath)) {
+ $varfortemplatedir = $obj->scandir;
+ if ($varfortemplatedir && !empty($conf->global->$varfortemplatedir)) {
+ $dirtoscan = $conf->global->$varfortemplatedir;
- if (count($listoffiles)) {
- foreach ($listoffiles as $record) {
- $srctemplatepath = $record['fullname'];
- break;
- }
+ $listoffiles = array();
+
+ // Now we add first model found in directories scanned
+ $listofdir = explode(',', $dirtoscan);
+ foreach ($listofdir as $key => $tmpdir) {
+ $tmpdir = trim($tmpdir);
+ $tmpdir = preg_replace('/DOL_DATA_ROOT/', DOL_DATA_ROOT, $tmpdir);
+ if (!$tmpdir) {
+ unset($listofdir[$key]);
+ continue;
+ }
+ if (is_dir($tmpdir)) {
+ $tmpfiles = dol_dir_list($tmpdir, 'files', 0, '\.od(s|t)$', '', 'name', SORT_ASC, 0);
+ if (count($tmpfiles)) {
+ $listoffiles = array_merge($listoffiles, $tmpfiles);
}
}
+ }
- if (empty($srctemplatepath)) {
- $this->error = 'ErrorGenerationAskedForOdtTemplateWithSrcFileNotDefined';
- return -1;
+ if (count($listoffiles)) {
+ foreach ($listoffiles as $record) {
+ $srctemplatepath = $record['fullname'];
+ break;
}
}
+ }
- if ($obj->type == 'odt' && !empty($srctemplatepath)) {
- if (!dol_is_file($srctemplatepath)) {
- dol_syslog("Failed to locate template file ".$srctemplatepath, LOG_WARNING);
- $this->error = 'ErrorGenerationAskedForOdtTemplateWithSrcFileNotFound';
- return -1;
- }
- }
-
- // We save charset_output to restore it because write_file can change it if needed for
- // output format that does not support UTF8.
- $sav_charset_output = empty($outputlangs->charset_output) ? '' : $outputlangs->charset_output;
-
- if (in_array(get_class($this), array('Adherent'))) {
- $resultwritefile = $obj->write_file($this, $outputlangs, $srctemplatepath, 'member', 1, 'tmp_cards', $moreparams);
- } else {
- $resultwritefile = $obj->write_file($this, $outputlangs, $srctemplatepath, $hidedetails, $hidedesc, $hideref, $moreparams);
- }
- // After call of write_file $obj->result['fullpath'] is set with generated file. It will be used to update the ECM database index.
-
- if ($resultwritefile > 0) {
- $outputlangs->charset_output = $sav_charset_output;
-
- // We delete old preview
- require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
- dol_delete_preview($this);
-
- // Index file in database
- if (!empty($obj->result['fullpath'])) {
- $destfull = $obj->result['fullpath'];
-
- // Update the last_main_doc field into main object (if document generator has property ->update_main_doc_field set)
- $update_main_doc_field = 0;
- if (!empty($obj->update_main_doc_field)) {
- $update_main_doc_field = 1;
- }
-
- $this->indexFile($destfull, $update_main_doc_field);
- } else {
- dol_syslog('Method ->write_file was called on object '.get_class($obj).' and return a success but the return array ->result["fullpath"] was not set.', LOG_WARNING);
- }
-
- // Success in building document. We build meta file.
- dol_meta_create($this);
-
- return 1;
- } else {
- $outputlangs->charset_output = $sav_charset_output;
- $this->error = $obj->error;
- $this->errors = $obj->errors;
- dol_syslog("Error generating document for ".__CLASS__.". Error: ".$obj->error, LOG_ERR);
- return -1;
- }
- } else {
- if (!$filefound) {
- $this->error = $langs->trans("Error").' Failed to load doc generator with modelpaths='.$modelspath.' - modele='.$modele;
- $this->errors[] = $this->error;
- dol_syslog($this->error, LOG_ERR);
- } else {
- $this->error = $langs->trans("Error")." ".$langs->trans("ErrorFileDoesNotExists", $filefound);
- $this->errors[] = $this->error;
- dol_syslog($this->error, LOG_ERR);
- }
+ if (empty($srctemplatepath)) {
+ $this->error = 'ErrorGenerationAskedForOdtTemplateWithSrcFileNotDefined';
return -1;
}
+ }
+
+ if ($obj->type == 'odt' && !empty($srctemplatepath)) {
+ if (!dol_is_file($srctemplatepath)) {
+ dol_syslog("Failed to locate template file ".$srctemplatepath, LOG_WARNING);
+ $this->error = 'ErrorGenerationAskedForOdtTemplateWithSrcFileNotFound';
+ return -1;
+ }
+ }
+
+ // We save charset_output to restore it because write_file can change it if needed for
+ // output format that does not support UTF8.
+ $sav_charset_output = empty($outputlangs->charset_output) ? '' : $outputlangs->charset_output;
+
+ if (in_array(get_class($this), array('Adherent'))) {
+ $resultwritefile = $obj->write_file($this, $outputlangs, $srctemplatepath, 'member', 1, 'tmp_cards', $moreparams);
} else {
- return $reshook;
+ $resultwritefile = $obj->write_file($this, $outputlangs, $srctemplatepath, $hidedetails, $hidedesc, $hideref, $moreparams);
+ }
+ // After call of write_file $obj->result['fullpath'] is set with generated file. It will be used to update the ECM database index.
+
+ if ($resultwritefile > 0) {
+ $outputlangs->charset_output = $sav_charset_output;
+
+ // We delete old preview
+ require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+ dol_delete_preview($this);
+
+ // Index file in database
+ if (!empty($obj->result['fullpath'])) {
+ $destfull = $obj->result['fullpath'];
+
+ // Update the last_main_doc field into main object (if document generator has property ->update_main_doc_field set)
+ $update_main_doc_field = 0;
+ if (!empty($obj->update_main_doc_field)) {
+ $update_main_doc_field = 1;
+ }
+
+ $this->indexFile($destfull, $update_main_doc_field);
+ } else {
+ dol_syslog('Method ->write_file was called on object '.get_class($obj).' and return a success but the return array ->result["fullpath"] was not set.', LOG_WARNING);
+ }
+
+ // Success in building document. We build meta file.
+ dol_meta_create($this);
+
+ return 1;
+ } else {
+ $outputlangs->charset_output = $sav_charset_output;
+ $this->error = $obj->error;
+ $this->errors = $obj->errors;
+ dol_syslog("Error generating document for ".__CLASS__.". Error: ".$obj->error, LOG_ERR);
+ return -1;
}
}
diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php
index bc26eb96553..c5fca0eff5c 100644
--- a/htdocs/core/lib/functions.lib.php
+++ b/htdocs/core/lib/functions.lib.php
@@ -71,6 +71,25 @@ if (!function_exists('utf8_decode')) {
}
}
+/**
+ * Return the full path of the directory where a module (or an object of a module) stores its files. Path may depends on the entity if a multicompany module is enabled.
+ *
+ * @param CommonObject $object Dolibarr common object
+ * @param string $module Override object element, for example to use 'mycompany' instead of 'societe'
+ * @return string|void The path of the relative directory of the module
+ * @since Dolibarr V18
+ */
+function getMultidirOutput($object, $module = '')
+{
+ global $conf;
+ if (!is_object($object) && empty($module)) {
+ return null;
+ }
+ if (empty($module) && !empty($object->element)) {
+ $module = $object->element;
+ }
+ return $conf->$module->multidir_output[(!empty($object->entity) ? $object->entity : $conf->entity)];
+}
/**
* Return dolibarr global constant string value
diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php
index 71c0cd7c0c6..2a38906e4de 100644
--- a/htdocs/core/lib/project.lib.php
+++ b/htdocs/core/lib/project.lib.php
@@ -1069,6 +1069,18 @@ function projectLinesa(&$inc, $parent, &$lines, &$level, $var, $showproject, &$t
if (count($arrayfields) > 0 && !empty($arrayfields['c.assigned']['checked'])) {
print ' | | ';
}
+
+ //Check if Extrafields is totalizable
+ foreach ($extrafields->attributes['projet_task']['totalizable'] as $key=>$value) {
+ if ($arrayfields['ef.'.$key]['checked'] == 1) {
+ print '';
+ if ($value == 1) {
+ print $totalarray['totalizable'][$key]['total'];
+ }
+ print ' | ';
+ }
+ }
+
print ' | ';
print '
';
}
diff --git a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php
index 78b3fa24a33..cb460cff14a 100644
--- a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php
+++ b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php
@@ -296,18 +296,18 @@ class pdf_eratosthene extends ModelePDFCommandes
- if ($conf->commande->multidir_output[$conf->entity]) {
+ if (getMultidirOutput($object)) {
$object->fetch_thirdparty();
$deja_regle = 0;
// Definition of $dir and $file
if ($object->specimen) {
- $dir = $conf->commande->multidir_output[$conf->entity];
+ $dir = getMultidirOutput($object);
$file = $dir."/SPECIMEN.pdf";
} else {
$objectref = dol_sanitizeFileName($object->ref);
- $dir = $conf->commande->multidir_output[$object->entity]."/".$objectref;
+ $dir = getMultidirOutput($object)."/".$objectref;
$file = $dir."/".$objectref.".pdf";
}
@@ -1447,7 +1447,7 @@ class pdf_eratosthene extends ModelePDFCommandes
protected function _pagehead(&$pdf, $object, $showaddress, $outputlangs, $outputlangsbis = null, $titlekey = "PdfOrderTitle")
{
// phpcs:enable
- global $conf, $langs, $hookmanager;
+ global $conf, $langs, $hookmanager, $mysoc;
$ltrdirection = 'L';
if ($outputlangs->trans("DIRECTION") == 'rtl') $ltrdirection = 'R';
@@ -1473,8 +1473,8 @@ class pdf_eratosthene extends ModelePDFCommandes
if (!getDolGlobalInt('PDF_DISABLE_MYCOMPANY_LOGO')) {
if ($this->emetteur->logo) {
$logodir = $conf->mycompany->dir_output;
- if (!empty($conf->mycompany->multidir_output[$object->entity])) {
- $logodir = $conf->mycompany->multidir_output[$object->entity];
+ if (!empty(getMultidirOutput($mysoc, 'mycompany'))) {
+ $logodir = getMultidirOutput($mysoc, 'mycompany');
}
if (!getDolGlobalInt('MAIN_PDF_USE_LARGE_LOGO')) {
$logo = $logodir.'/logos/thumbs/'.$this->emetteur->logo_small;
diff --git a/htdocs/install/mysql/migration/17.0.0-18.0.0.sql b/htdocs/install/mysql/migration/17.0.0-18.0.0.sql
index 54d1d4cb33c..9732c2d5386 100644
--- a/htdocs/install/mysql/migration/17.0.0-18.0.0.sql
+++ b/htdocs/install/mysql/migration/17.0.0-18.0.0.sql
@@ -37,7 +37,7 @@
-- VMYSQL4.3 ALTER TABLE llx_hrm_skillrank CHANGE COLUMN `rank` rankorder integer;
-- VPGSQL8.2 ALTER TABLE llx_hrm_skillrank CHANGE COLUMN rank rankorder integer;
-ALTER TABLE llx_accounting_system CHANGE COLUMN fk_pays fk_country integer;
+ALTER TABLE llx_accounting_system CHANGE COLUMN fk_pays fk_country integer;
ALTER TABLE llx_commande_fournisseurdet MODIFY COLUMN ref varchar(128);
ALTER TABLE llx_facture_fourn_det MODIFY COLUMN ref varchar(128);
@@ -376,4 +376,3 @@ UPDATE llx_c_country SET numeric_code = '716' WHERE code_iso = 'ZWE';
-- Generate documents on product batch
ALTER TABLE llx_product_lot ADD COLUMN model_pdf varchar(255) AFTER scrapping_date;
ALTER TABLE llx_product_lot ADD COLUMN last_main_doc varchar(255) AFTER model_pdf;
-
diff --git a/htdocs/product/list.php b/htdocs/product/list.php
index 15f8e93dd6b..ed0e0d22c91 100644
--- a/htdocs/product/list.php
+++ b/htdocs/product/list.php
@@ -95,6 +95,7 @@ $search_accountancy_code_buy = GETPOST("search_accountancy_code_buy", 'alpha');
$search_accountancy_code_buy_intra = GETPOST("search_accountancy_code_buy_intra", 'alpha');
$search_accountancy_code_buy_export = GETPOST("search_accountancy_code_buy_export", 'alpha');
$search_finished = GETPOST("search_finished", 'int');
+$search_units = GETPOST('search_units', 'int');
$optioncss = GETPOST('optioncss', 'alpha');
$type = GETPOST("type", "int");
$mode = GETPOST('mode', 'alpha');
@@ -353,6 +354,7 @@ if (empty($reshook)) {
$search_accountancy_code_buy_intra = '';
$search_accountancy_code_buy_export = '';
$search_array_options = array();
+ $search_units = '';
}
// Mass actions
@@ -571,6 +573,9 @@ if ($search_accountancy_code_buy_intra) {
if ($search_accountancy_code_buy_export) {
$sql .= natural_search($alias_product_perentity . '.accountancy_code_buy_export', $search_accountancy_code_buy_export);
}
+if (!empty($conf->global->PRODUCT_USE_UNITS) && $search_units) {
+ $sql .= natural_search('cu.rowid', $search_units);
+}
// Add where from extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
// Add where from hooks
@@ -1021,6 +1026,7 @@ if (!empty($arrayfields['p.volume_units']['checked'])) {
// Unit
if (!empty($arrayfields['cu.label']['checked'])) {
print '