diff --git a/.travis.yml b/.travis.yml
index 709feaeaa37..0aa5594790a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -35,10 +35,6 @@ addons:
php:
- '5.6'
-- '7.0'
-- '7.1'
-- '7.2'
-- '7.3'
- '7.4'
- nightly
@@ -304,12 +300,13 @@ script:
echo
- |
- echo "Checking coding style (excluding Pull Requests builds)"
+ echo "Checking coding style (excluding Pull Requests builds to not overload travis, excluding also for some jobs to avoid duplicate tests)"
# Ensure we catch errors
set -e
# Exclusions are defined in the ruleset.xml file
- #phpcs -s -p -d memory_limit=-1 --extensions=php --colors --tab-width=4 --standard=dev/setup/codesniffer/ruleset.xml --encoding=utf-8 --runtime-set ignore_warnings_on_exit true .
- if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then phpcs -s -p -d memory_limit=-1 --extensions=php --colors --tab-width=4 --standard=dev/setup/codesniffer/ruleset.xml --encoding=utf-8 --runtime-set ignore_warnings_on_exit true .; fi
+ if [ "$TRAVIS_PULL_REQUEST" = "false" ] && [ "$TRAVIS_PHP_VERSION" = "7.4" ] && [ "$DB" = "mysql" ]; then
+ phpcs -s -p -d memory_limit=-1 --extensions=php --colors --tab-width=4 --standard=dev/setup/codesniffer/ruleset.xml --encoding=utf-8 --runtime-set ignore_warnings_on_exit true .;
+ fi
set +e
echo
diff --git a/htdocs/adherents/vcard.php b/htdocs/adherents/vcard.php
index 32b4a6de2d6..dbdbbc687ea 100644
--- a/htdocs/adherents/vcard.php
+++ b/htdocs/adherents/vcard.php
@@ -107,7 +107,9 @@ if ($company->id) {
}
// Si adherent lie a un tiers non de type "particulier"
- if ($adherent->typent_code != 'TE_PRIVATE') $v->setOrg($company->name);
+ if ($company->typent_code != 'TE_PRIVATE') {
+ $v->setOrg($company->name);
+ }
}
// Personal informations
diff --git a/htdocs/admin/system/security.php b/htdocs/admin/system/security.php
index a959aee2e54..2f0978ed266 100644
--- a/htdocs/admin/system/security.php
+++ b/htdocs/admin/system/security.php
@@ -66,14 +66,29 @@ print "PHP safe_mode = ".(ini_get('safe_mode') ? ini_get('safe_
print "PHP open_basedir = ".(ini_get('open_basedir') ? ini_get('open_basedir') : yn(0))."
\n";
print '
';
+// XDebug
+print ''.$langs->trans("XDebug").': ';
+$test = !function_exists('xdebug_is_enabled');
+if ($test) print img_picto('', 'tick.png').' '.$langs->trans("NotInstalled").' - '.$langs->trans("NotRiskOfLeakWithThis");
+else {
+ print img_picto('', 'warning').' '.$langs->trans("ModuleActivatedMayExposeInformation", $langs->transnoentities("XDebug"));
+ print ' - '.$langs->trans("MoreInformation").' XDebug admin page';
+}
+print '
';
+
print '
';
print load_fiche_titre($langs->trans("ConfigFile"), '', '');
print ''.$langs->trans("dolibarr_main_prod").': '.$dolibarr_main_prod;
if (empty($dolibarr_main_prod)) {
- print img_picto('', 'warning').' '.$langs->trans("IfYouAreOnAProductionSetThis");
+ print ' '.img_picto('', 'warning').' '.$langs->trans("IfYouAreOnAProductionSetThis", 1);
+}
+print '
';
+
+print ''.$langs->trans("dolibarr_nocsrfcheck").': '.$dolibarr_nocsrfcheck;
+if (!empty($dolibarr_nocsrfcheck)) {
+ print img_picto('', 'warning').' '.$langs->trans("IfYouAreOnAProductionSetThis", 0);
}
-// dolibarr_main_prod
print '
';
@@ -94,20 +109,9 @@ print '
';
print '
';
print '
';
-print load_fiche_titre($langs->trans("Modules"), '', '');
-
-// XDebug
-print ''.$langs->trans("XDebug").': ';
-$test = !function_exists('xdebug_is_enabled');
-if ($test) print img_picto('', 'tick.png').' '.$langs->trans("NotInstalled").' - '.$langs->trans("NotRiskOfLeakWithThis");
-else {
- print img_picto('', 'warning').' '.$langs->trans("ModuleActivatedMayExposeInformation", $langs->transnoentities("XDebug"));
- print ' - '.$langs->trans("MoreInformation").' XDebug admin page';
-}
-print '
';
+print load_fiche_titre($langs->trans("DolibarrModules"), '', '');
// Module log
-print '
';
print ''.$langs->trans("Syslog").': ';
$test = empty($conf->syslog->enabled);
if ($test) print img_picto('', 'tick.png').' '.$langs->trans("NotInstalled").' - '.$langs->trans("NotRiskOfLeakWithThis");
@@ -118,7 +122,6 @@ else {
print '
';
// Module debugbar
-print '
';
print ''.$langs->trans("DebugBar").': ';
$test = empty($conf->debugbar->enabled);
if ($test) print img_picto('', 'tick.png').' '.$langs->trans("NotInstalled").' - '.$langs->trans("NotRiskOfLeakWithThis");
@@ -130,7 +133,7 @@ print '
';
print '
';
print '
';
-print load_fiche_titre($langs->trans("SecuritySetup"), '', '');
+print load_fiche_titre($langs->trans("Menu").' '.$langs->trans("SecuritySetup"), '', '');
//print ''.$langs->trans("PasswordEncryption").': ';
print 'MAIN_SECURITY_HASH_ALGO = '.$conf->global->MAIN_SECURITY_HASH_ALGO." (Recommanded value: 'password_hash')
";
diff --git a/htdocs/core/class/commoninvoice.class.php b/htdocs/core/class/commoninvoice.class.php
index 12759b9fbf2..cb7944e1cac 100644
--- a/htdocs/core/class/commoninvoice.class.php
+++ b/htdocs/core/class/commoninvoice.class.php
@@ -753,7 +753,7 @@ abstract class CommonInvoice extends CommonObject
if (!$error) {
// Force payment mode of invoice to withdraw
- $payment_mode_id = dol_getIdFromCode($this->db, 'PRE', 'c_paiement', 'code', 'id', 1);
+ $payment_mode_id = dol_getIdFromCode($this->db, ($type == 'bank-transfer' ? 'VIR' : 'PRE'), 'c_paiement', 'code', 'id', 1);
if ($payment_mode_id > 0) {
$result = $this->setPaymentMethods($payment_mode_id);
}
diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php
index 5d6771d88df..2bd32df1f05 100644
--- a/htdocs/core/class/commonobject.class.php
+++ b/htdocs/core/class/commonobject.class.php
@@ -5009,7 +5009,7 @@ abstract class CommonObject
{
$value_arr = GETPOST($postfieldkey, 'array'); // check if an array
if (!empty($value_arr)) {
- $value_key = implode($value_arr, ',');
+ $value_key = implode(',', $value_arr);
} else {
$value_key = '';
}
@@ -5801,7 +5801,7 @@ abstract class CommonObject
*
* @param array $val Array of properties for field to show (used only if ->fields not defined)
* @param string $key Key of attribute
- * @param string $value Preselected value to show (for date type it must be in timestamp format, for amount or price it must be a php numeric value)
+ * @param string|array $value Preselected value to show (for date type it must be in timestamp format, for amount or price it must be a php numeric value, for array type must be array)
* @param string $moreparam To add more parameters on html input tag
* @param string $keysuffix Prefix string to add into name and id of field (can be used to avoid duplicate names)
* @param string $keyprefix Suffix string to add into name and id of field (can be used to avoid duplicate names)
diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php
index 43588ba0d0e..f8087dc396e 100644
--- a/htdocs/core/lib/functions.lib.php
+++ b/htdocs/core/lib/functions.lib.php
@@ -2490,7 +2490,7 @@ function dol_print_phone($phone, $countrycode = '', $cid = 0, $socid = 0, $addli
// Clean phone parameter
$phone = preg_replace("/[\s.-]/", "", trim($phone));
if (empty($phone)) { return ''; }
- if ($conf->global->MAIN_PHONE_SEPAR) $separ = $conf->global->MAIN_PHONE_SEPAR;
+ if (!empty($conf->global->MAIN_PHONE_SEPAR)) $separ = $conf->global->MAIN_PHONE_SEPAR;
if (empty($countrycode)) $countrycode = $mysoc->country_code;
// Short format for small screens
diff --git a/htdocs/core/modules/import/import_csv.modules.php b/htdocs/core/modules/import/import_csv.modules.php
index e070985fbfb..959cb45a77e 100644
--- a/htdocs/core/modules/import/import_csv.modules.php
+++ b/htdocs/core/modules/import/import_csv.modules.php
@@ -416,8 +416,7 @@ class ImportCsv extends ModeleImports
$newval = preg_replace('/^(id|ref):/i', '', $newval); // Remove id: or ref: that was used to force if field is id or ref
//print 'Val is now '.$newval.' and is type '.$isidorref."
\n";
- if ($isidorref == 'ref') // If value into input import file is a ref, we apply the function defined into descriptor
- {
+ if ($isidorref == 'ref') { // If value into input import file is a ref, we apply the function defined into descriptor
$file = (empty($objimport->array_import_convertvalue[0][$val]['classfile']) ? $objimport->array_import_convertvalue[0][$val]['file'] : $objimport->array_import_convertvalue[0][$val]['classfile']);
$class = $objimport->array_import_convertvalue[0][$val]['class'];
$method = $objimport->array_import_convertvalue[0][$val]['method'];
@@ -472,8 +471,7 @@ class ImportCsv extends ModeleImports
}
}
}
- } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'fetchidfromcodeandlabel')
- {
+ } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'fetchidfromcodeandlabel') {
$isidorref = 'id';
if (!is_numeric($newval) && $newval != '' && !preg_match('/^id:/i', $newval)) $isidorref = 'ref';
$newval = preg_replace('/^(id|ref):/i', '', $newval);
@@ -509,11 +507,9 @@ class ImportCsv extends ModeleImports
}
}
}
- } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'zeroifnull')
- {
+ } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'zeroifnull') {
if (empty($newval)) $newval = '0';
- } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'fetchidfromcodeunits' || $objimport->array_import_convertvalue[0][$val]['rule'] == 'fetchscalefromcodeunits')
- {
+ } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'fetchidfromcodeunits' || $objimport->array_import_convertvalue[0][$val]['rule'] == 'fetchscalefromcodeunits') {
$file = (empty($objimport->array_import_convertvalue[0][$val]['classfile']) ? $objimport->array_import_convertvalue[0][$val]['file'] : $objimport->array_import_convertvalue[0][$val]['classfile']);
$class = $objimport->array_import_convertvalue[0][$val]['class'];
$method = $objimport->array_import_convertvalue[0][$val]['method'];
@@ -545,8 +541,7 @@ class ImportCsv extends ModeleImports
$error++;
}
}
- } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'getcustomercodeifauto')
- {
+ } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'getcustomercodeifauto') {
if (strtolower($newval) == 'auto')
{
$this->thirpartyobject->get_codeclient(0, 0);
@@ -554,8 +549,7 @@ class ImportCsv extends ModeleImports
//print 'code_client='.$newval;
}
if (empty($newval)) $arrayrecord[($key - 1)]['type'] = -1; // If we get empty value, we will use "null"
- } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'getsuppliercodeifauto')
- {
+ } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'getsuppliercodeifauto') {
if (strtolower($newval) == 'auto')
{
$newval = $this->thirpartyobject->get_codefournisseur(0, 1);
@@ -563,8 +557,7 @@ class ImportCsv extends ModeleImports
//print 'code_fournisseur='.$newval;
}
if (empty($newval)) $arrayrecord[($key - 1)]['type'] = -1; // If we get empty value, we will use "null"
- } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'getcustomeraccountancycodeifauto')
- {
+ } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'getcustomeraccountancycodeifauto') {
if (strtolower($newval) == 'auto')
{
$this->thirpartyobject->get_codecompta('customer');
@@ -572,8 +565,7 @@ class ImportCsv extends ModeleImports
//print 'code_compta='.$newval;
}
if (empty($newval)) $arrayrecord[($key - 1)]['type'] = -1; // If we get empty value, we will use "null"
- } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'getsupplieraccountancycodeifauto')
- {
+ } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'getsupplieraccountancycodeifauto') {
if (strtolower($newval) == 'auto')
{
$this->thirpartyobject->get_codecompta('supplier');
@@ -582,8 +574,7 @@ class ImportCsv extends ModeleImports
//print 'code_compta_fournisseur='.$newval;
}
if (empty($newval)) $arrayrecord[($key - 1)]['type'] = -1; // If we get empty value, we will use "null"
- } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'getrefifauto')
- {
+ } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'getrefifauto') {
$defaultref = '';
// TODO provide the $modTask (module of generation of ref) as parameter of import_insert function
$obj = empty($conf->global->PROJECT_TASK_ADDON) ? 'mod_task_simple' : $conf->global->PROJECT_TASK_ADDON;
@@ -595,8 +586,7 @@ class ImportCsv extends ModeleImports
}
if (is_numeric($defaultref) && $defaultref <= 0) $defaultref = '';
$newval = $defaultref;
- } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'compute')
- {
+ } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'compute') {
$file = (empty($objimport->array_import_convertvalue[0][$val]['classfile']) ? $objimport->array_import_convertvalue[0][$val]['file'] : $objimport->array_import_convertvalue[0][$val]['classfile']);
$class = $objimport->array_import_convertvalue[0][$val]['class'];
$method = $objimport->array_import_convertvalue[0][$val]['method'];
@@ -614,9 +604,10 @@ class ImportCsv extends ModeleImports
$this->errors[$error]['type'] = 'FOREIGNKEY';
$errorforthistable++;
$error++;
+ } else {
+ $newval = $arrayrecord[($key - 1)]['val']; //We get new value computed.
}
- } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'numeric')
- {
+ } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'numeric') {
$newval = price2num($newval);
}
diff --git a/htdocs/core/modules/import/import_xlsx.modules.php b/htdocs/core/modules/import/import_xlsx.modules.php
index 14c78087e8c..5502508d350 100644
--- a/htdocs/core/modules/import/import_xlsx.modules.php
+++ b/htdocs/core/modules/import/import_xlsx.modules.php
@@ -450,8 +450,7 @@ class ImportXlsx extends ModeleImports
$newval = preg_replace('/^(id|ref):/i', '', $newval); // Remove id: or ref: that was used to force if field is id or ref
//print 'Val is now '.$newval.' and is type '.$isidorref."
\n";
- if ($isidorref == 'ref') // If value into input import file is a ref, we apply the function defined into descriptor
- {
+ if ($isidorref == 'ref') { // If value into input import file is a ref, we apply the function defined into descriptor
$file = (empty($objimport->array_import_convertvalue[0][$val]['classfile']) ? $objimport->array_import_convertvalue[0][$val]['file'] : $objimport->array_import_convertvalue[0][$val]['classfile']);
$class = $objimport->array_import_convertvalue[0][$val]['class'];
$method = $objimport->array_import_convertvalue[0][$val]['method'];
@@ -506,8 +505,7 @@ class ImportXlsx extends ModeleImports
}
}
}
- } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'fetchidfromcodeandlabel')
- {
+ } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'fetchidfromcodeandlabel') {
$isidorref = 'id';
if (!is_numeric($newval) && $newval != '' && !preg_match('/^id:/i', $newval)) $isidorref = 'ref';
$newval = preg_replace('/^(id|ref):/i', '', $newval);
@@ -543,11 +541,9 @@ class ImportXlsx extends ModeleImports
}
}
}
- } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'zeroifnull')
- {
+ } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'zeroifnull') {
if (empty($newval)) $newval = '0';
- } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'fetchidfromcodeunits' || $objimport->array_import_convertvalue[0][$val]['rule'] == 'fetchscalefromcodeunits')
- {
+ } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'fetchidfromcodeunits' || $objimport->array_import_convertvalue[0][$val]['rule'] == 'fetchscalefromcodeunits') {
$file = (empty($objimport->array_import_convertvalue[0][$val]['classfile']) ? $objimport->array_import_convertvalue[0][$val]['file'] : $objimport->array_import_convertvalue[0][$val]['classfile']);
$class = $objimport->array_import_convertvalue[0][$val]['class'];
$method = $objimport->array_import_convertvalue[0][$val]['method'];
@@ -579,8 +575,7 @@ class ImportXlsx extends ModeleImports
$error++;
}
}
- } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'getcustomercodeifauto')
- {
+ } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'getcustomercodeifauto') {
if (strtolower($newval) == 'auto')
{
$this->thirpartyobject->get_codeclient(0, 0);
@@ -588,8 +583,7 @@ class ImportXlsx extends ModeleImports
//print 'code_client='.$newval;
}
if (empty($newval)) $arrayrecord[($key - 1)]['type'] = -1; // If we get empty value, we will use "null"
- } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'getsuppliercodeifauto')
- {
+ } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'getsuppliercodeifauto') {
if (strtolower($newval) == 'auto')
{
$newval = $this->thirpartyobject->get_codefournisseur(0, 1);
@@ -597,8 +591,7 @@ class ImportXlsx extends ModeleImports
//print 'code_fournisseur='.$newval;
}
if (empty($newval)) $arrayrecord[($key - 1)]['type'] = -1; // If we get empty value, we will use "null"
- } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'getcustomeraccountancycodeifauto')
- {
+ } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'getcustomeraccountancycodeifauto') {
if (strtolower($newval) == 'auto')
{
$this->thirpartyobject->get_codecompta('customer');
@@ -606,8 +599,7 @@ class ImportXlsx extends ModeleImports
//print 'code_compta='.$newval;
}
if (empty($newval)) $arrayrecord[($key - 1)]['type'] = -1; // If we get empty value, we will use "null"
- } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'getsupplieraccountancycodeifauto')
- {
+ } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'getsupplieraccountancycodeifauto') {
if (strtolower($newval) == 'auto')
{
$this->thirpartyobject->get_codecompta('supplier');
@@ -616,8 +608,7 @@ class ImportXlsx extends ModeleImports
//print 'code_compta_fournisseur='.$newval;
}
if (empty($newval)) $arrayrecord[($key - 1)]['type'] = -1; // If we get empty value, we will use "null"
- } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'getrefifauto')
- {
+ } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'getrefifauto') {
$defaultref = '';
// TODO provide the $modTask (module of generation of ref) as parameter of import_insert function
$obj = empty($conf->global->PROJECT_TASK_ADDON) ? 'mod_task_simple' : $conf->global->PROJECT_TASK_ADDON;
@@ -629,8 +620,7 @@ class ImportXlsx extends ModeleImports
}
if (is_numeric($defaultref) && $defaultref <= 0) $defaultref = '';
$newval = $defaultref;
- } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'compute')
- {
+ } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'compute') {
$file = (empty($objimport->array_import_convertvalue[0][$val]['classfile']) ? $objimport->array_import_convertvalue[0][$val]['file'] : $objimport->array_import_convertvalue[0][$val]['classfile']);
$class = $objimport->array_import_convertvalue[0][$val]['class'];
$method = $objimport->array_import_convertvalue[0][$val]['method'];
@@ -648,9 +638,10 @@ class ImportXlsx extends ModeleImports
$this->errors[$error]['type'] = 'FOREIGNKEY';
$errorforthistable++;
$error++;
+ } else {
+ $newval = $arrayrecord[($key - 1)]['val']; //We get new value computed.
}
- } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'numeric')
- {
+ } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'numeric') {
$newval = price2num($newval);
}
diff --git a/htdocs/core/tpl/ajaxrow.tpl.php b/htdocs/core/tpl/ajaxrow.tpl.php
index de837b16edf..dea5ce60d6e 100644
--- a/htdocs/core/tpl/ajaxrow.tpl.php
+++ b/htdocs/core/tpl/ajaxrow.tpl.php
@@ -80,7 +80,12 @@ $(document).ready(function(){
console.log("tableDND end of ajax call");
if (reloadpage == 1) {
//console.log('');
- location.href = '';
+
+ location.href = '';
} else {
$("# .drag").each(
function( intIndex ) {
diff --git a/htdocs/install/mysql/data/llx_c_type_contact.sql b/htdocs/install/mysql/data/llx_c_type_contact.sql
index d7ec13f5833..f16cf5ca5df 100644
--- a/htdocs/install/mysql/data/llx_c_type_contact.sql
+++ b/htdocs/install/mysql/data/llx_c_type_contact.sql
@@ -74,13 +74,13 @@ insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) v
insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) values (150, 'dolresource','internal', 'USERINCHARGE', 'In charge of resource', 1);
insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) values (151, 'dolresource','external', 'THIRDINCHARGE', 'In charge of resource', 1);
--- All project code must start with 'PROJECT'
+-- All project code can start with 'PROJECT'
insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) values (160, 'project', 'internal', 'PROJECTLEADER', 'Chef de Projet', 1);
insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) values (161, 'project', 'internal', 'PROJECTCONTRIBUTOR', 'Intervenant', 1);
insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) values (170, 'project', 'external', 'PROJECTLEADER', 'Chef de Projet', 1);
insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) values (171, 'project', 'external', 'PROJECTCONTRIBUTOR', 'Intervenant', 1);
--- All task code must start with 'TASK'
+-- All task code can start with 'TASK'
insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) values (180, 'project_task', 'internal', 'TASKEXECUTIVE', 'Responsable', 1);
insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) values (181, 'project_task', 'internal', 'TASKCONTRIBUTOR', 'Intervenant', 1);
insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) values (190, 'project_task', 'external', 'TASKEXECUTIVE', 'Responsable', 1);
diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang
index 0309706312f..3da5c3aff62 100644
--- a/htdocs/langs/en_US/admin.lang
+++ b/htdocs/langs/en_US/admin.lang
@@ -1679,11 +1679,11 @@ StockSetup=Stock module setup
IfYouUsePointOfSaleCheckModule=If you use the Point of Sale module (POS) provided by default or an external module, this setup may be ignored by your POS module. Most POS modules are designed by default to create an invoice immediately and decrease stock irrespective of the options here. So if you need or not to have a stock decrease when registering a sale from your POS, check also your POS module setup.
##### Menu #####
MenuDeleted=Menu deleted
+Menu=Menu
Menus=Menus
TreeMenuPersonalized=Personalized menus
NotTopTreeMenuPersonalized=Personalized menus not linked to a top menu entry
NewMenu=New menu
-Menu=Selection of menu
MenuHandler=Menu handler
MenuModule=Source module
HideUnauthorizedMenu= Hide unauthorized menus (gray)
@@ -2037,7 +2037,7 @@ UseDebugBar=Use the debug bar
DEBUGBAR_LOGS_LINES_NUMBER=Number of last log lines to keep in console
WarningValueHigherSlowsDramaticalyOutput=Warning, higher values slows dramaticaly output
ModuleActivated=Module %s is activated and slows the interface
-IfYouAreOnAProductionSetThis=If you are on a production environment, you should set this property.
+IfYouAreOnAProductionSetThis=If you are on a production environment, you should set this property to %s.
AntivirusEnabledOnUpload=Antivirus enabled on uploaded files
EXPORTS_SHARE_MODELS=Export models are share with everybody
ExportSetup=Setup of module Export
diff --git a/htdocs/product/list.php b/htdocs/product/list.php
index cce41367024..0142e38698e 100644
--- a/htdocs/product/list.php
+++ b/htdocs/product/list.php
@@ -1103,7 +1103,7 @@ if ($resql)
// Label
if (!empty($arrayfields['p.label']['checked']))
{
- print '