diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml
index 53383d31023a9..81ecb17f1cdb3 100644
--- a/.github/workflows/pre-commit.yml
+++ b/.github/workflows/pre-commit.yml
@@ -59,28 +59,15 @@ jobs:
key: pre-commit-4|${{ env.pythonLocation }}|${{ hashFiles('.pre-commit-config.yaml') }}
# Run all the precommit tools (defined in pre-commit-config.yaml).
- # We can force exclusion of some of them here.
- - name: Run pre-commit hooks
- env:
- # SKIP is used by pre-commit to not execute certain hooks
- SKIP: no-commit-to-branch,php-cs,php-cbf,trailing-whitespace,end-of-file-fixer
+ - name: Extract PHP version
+ id: extract-php-version
run: |
- set -o pipefail
- pre-commit gc
- pre-commit run --show-diff-on-failure --color=always --all-files | tee "${RAW_LOG}"
-
- # The next uses git, which is slow for a bit repo.
- # - name: Get all changed php files (if PR)
- # id: changed-php
- # uses: tj-actions/changed-files@v45
- # if: env.gh_event == 'pull_request'
- # with:
- # files: |
- # **.php
+ PHP_VERSION=$(sed -n 's/.*\$arrayphpmaxversionwarning\s*=\s*array\s*(\s*\([0-9]\+\)\s*,\s*\([0-9]\+\).*/\1.\2/p' htdocs/install/check.php)
+ echo "PHP_VERSION=$PHP_VERSION" >> $GITHUB_ENV
- name: Setup PHPCS
uses: shivammathur/setup-php@v2
- # Install when we're going to run phpcs
+ # Install proper php version, and also install phpcs which may be needed
if: |
! cancelled() &&
(
@@ -89,16 +76,36 @@ jobs:
(
env.gh_event == 'push'
&& (
- github.event.ref == 'refs/heads/develop'
- || endsWith(github.event.ref, '.0')
+ github.event.ref == 'refs/heads/develop'
+ || endsWith(github.event.ref, '.0')
)
)
)
with:
- php-version: 8.1
+ php-version: ${{ env.PHP_VERSION }} # Version from check.php
coverage: none # disable xdebug, pcov
tools: phpcs
+ # Run all the precommit tools (defined into pre-commit-config.yaml).
+ # We can force exclusion of some of them here.
+ - name: Run pre-commit hooks
+ env:
+ # SKIP is used by pre-commit to not execute certain hooks
+ SKIP: no-commit-to-branch,php-cs,php-cbf,trailing-whitespace,end-of-file-fixer
+ run: |
+ set -o pipefail
+ pre-commit gc
+ pre-commit run --show-diff-on-failure --color=always --all-files | tee "${RAW_LOG}"
+
+ # The next uses git, which is slow for a bit repo.
+ # - name: Get all changed php files (if PR)
+ # id: changed-php
+ # uses: tj-actions/changed-files@v45
+ # if: env.gh_event == 'pull_request'
+ # with:
+ # files: |
+ # **.php
+
- name: Run some pre-commit hooks on selected changed files only
if: "! cancelled() && steps.changed-php.outputs.any_changed == 'true'"
env:
diff --git a/htdocs/adherents/card.php b/htdocs/adherents/card.php
index c4ea3c8fbce51..3e9335a30d154 100644
--- a/htdocs/adherents/card.php
+++ b/htdocs/adherents/card.php
@@ -861,6 +861,27 @@
}
}
+ if ($action == 'update_extras' && $user->hasRight('adherent', 'creer')) {
+ $object->oldcopy = dol_clone($object, 2);
+ $attribute_name = GETPOST('attribute', 'restricthtml');
+
+ // Fill array 'array_options' with data from update form
+ $ret = $extrafields->setOptionalsFromPost(null, $object, $attribute_name);
+ if ($ret < 0) {
+ $error++;
+ }
+ if (!$error) {
+ $result = $object->updateExtraField($attribute_name, 'MEMBER_MODIFY');
+ if ($result < 0) {
+ setEventMessages($object->error, $object->errors, 'errors');
+ $error++;
+ }
+ }
+ if ($error) {
+ $action = 'edit_extras';
+ }
+ }
+
// SPIP Management
if (is_object($mailmanspip)) {
if ($user->hasRight('adherent', 'supprimer') && $action == 'confirm_del_spip' && $confirm == 'yes') {
diff --git a/htdocs/admin/ihm.php b/htdocs/admin/ihm.php
index af9b9ff5eec90..1ec7c21252fca 100644
--- a/htdocs/admin/ihm.php
+++ b/htdocs/admin/ihm.php
@@ -325,7 +325,12 @@
if ($mode == 'css') {
//file_put_contents(DOL_DATA_ROOT.'/admin/customcss.css', $data);
//dol_chmod(DOL_DATA_ROOT.'/admin/customcss.css');
- dolibarr_set_const($db, "MAIN_IHM_CUSTOM_CSS", GETPOST('MAIN_IHM_CUSTOM_CSS', 'restricthtml'), 'chaine', 0, '', $conf->entity);
+ $csscontent = GETPOST('MAIN_IHM_CUSTOM_CSS', 'restricthtml');
+ $csscontent = dol_string_nohtmltag($csscontent, 2);
+
+ dolibarr_set_const($db, "MAIN_IHM_CUSTOM_CSS", $csscontent, 'chaine', 0, '', $conf->entity);
+
+ setEventMessages($langs->trans("RecordSaved"), null);
}
$_SESSION["mainmenu"] = ""; // The menu manager may have changed
diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php
index bacf56cc3b495..392382ce3d4bb 100644
--- a/htdocs/commande/class/commande.class.php
+++ b/htdocs/commande/class/commande.class.php
@@ -336,7 +336,7 @@ class Commande extends CommonOrder
'fk_mode_reglement' => array('type' => 'integer', 'label' => 'PaymentMode', 'enabled' => 1, 'visible' => -1, 'position' => 185),
'date_livraison' => array('type' => 'date', 'label' => 'DateDeliveryPlanned', 'enabled' => 1, 'visible' => -1, 'position' => 190, 'csslist' => 'nowraponall'),
'fk_shipping_method' => array('type' => 'integer', 'label' => 'ShippingMethod', 'enabled' => 1, 'visible' => -1, 'position' => 195),
- 'fk_warehouse' => array('type' => 'integer:Entrepot:product/stock/class/entrepot.class.php', 'label' => 'Fk warehouse', 'enabled' => 'isModEnabled("stock")', 'visible' => -1, 'position' => 200),
+ 'fk_warehouse' => array('type' => 'integer:Entrepot:product/stock/class/entrepot.class.php', 'label' => 'DefaultWarehouse', 'enabled' => 'isModEnabled("stock")', 'visible' => -1, 'position' => 200, 'nodepth' => 1),
'fk_availability' => array('type' => 'integer', 'label' => 'Availability', 'enabled' => 1, 'visible' => -1, 'position' => 205),
'fk_input_reason' => array('type' => 'integer', 'label' => 'InputReason', 'enabled' => 1, 'visible' => -1, 'position' => 210),
//'fk_delivery_address' =>array('type'=>'integer', 'label'=>'DeliveryAddress', 'enabled'=>1, 'visible'=>-1, 'position'=>215),
@@ -857,7 +857,7 @@ public function cloture($user, $notrigger = 0)
*/
public function cancel($idwarehouse = -1)
{
- global $conf, $user, $langs;
+ global $user, $langs;
$error = 0;
diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php
index a17d7309b1559..238121bb53355 100644
--- a/htdocs/compta/facture/list.php
+++ b/htdocs/compta/facture/list.php
@@ -1415,7 +1415,7 @@
}
// Ref
if (!empty($arrayfields['f.ref']['checked'])) {
- print '
';
+ print ' ';
print ' ';
print ' ';
}
@@ -1439,7 +1439,7 @@
}
//$listtype[Facture::TYPE_PROFORMA]=$langs->trans("InvoiceProForma"); // A proformat invoice is not an invoice but must be an order.
// @phan-suppress-next-line PhanPluginSuspiciousParamOrder
- print $form->selectarray('search_type', $listtype, $search_type, 1, 0, 0, '', 0, 0, 0, '', 'maxwidth100');
+ print $form->selectarray('search_type', $listtype, $search_type, 1, 0, 0, '', 0, 0, 0, '', 'maxwidth75');
print '';
}
// Invoice Subtype
@@ -2505,7 +2505,7 @@
// Author
if (!empty($arrayfields['u.login']['checked'])) {
- print '';
+ print ' ';
if ($userstatic->id) {
print $userstatic->getNomUrl(-1);
} else {
diff --git a/htdocs/compta/index.php b/htdocs/compta/index.php
index 9df853c1c14f4..0d129b745a15e 100644
--- a/htdocs/compta/index.php
+++ b/htdocs/compta/index.php
@@ -455,7 +455,7 @@
print '';
print '';
print ''.$langs->trans("BoxTitleLastModifiedDonations", $max);
- print '... ';
+ print '... ';
print ' ';
print ''.$langs->trans("AmountTTC").' ';
print ''.$langs->trans("DateModificationShort").' ';
diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php
index f6719809fbbd1..e2961594ea4eb 100644
--- a/htdocs/contact/class/contact.class.php
+++ b/htdocs/contact/class/contact.class.php
@@ -120,12 +120,12 @@ class Contact extends CommonObject
'note_public' => array('type' => 'html', 'label' => 'NotePublic', 'enabled' => 1, 'visible' => 3, 'position' => 200, 'searchall' => 1),
'default_lang' => array('type' => 'varchar(6)', 'label' => 'Default lang', 'enabled' => 1, 'visible' => 3, 'position' => 205),
'canvas' => array('type' => 'varchar(32)', 'label' => 'Canvas', 'enabled' => 1, 'visible' => 3, 'position' => 210),
+ 'ip' => array('type' => 'ip', 'label' => 'IPAddress', 'enabled' => '1', 'position' => 700, 'notnull' => 0, 'visible' => '-2', 'comment' => 'ip used to create record (for public submission page)'),
'datec' => array('type' => 'datetime', 'label' => 'DateCreation', 'enabled' => 1, 'visible' => -1, 'position' => 300),
'tms' => array('type' => 'timestamp', 'label' => 'DateModification', 'enabled' => 1, 'visible' => -1, 'notnull' => 1, 'position' => 305),
'fk_user_creat' => array('type' => 'integer', 'label' => 'UserAuthor', 'enabled' => 1, 'visible' => 3, 'position' => 310),
'fk_user_modif' => array('type' => 'integer', 'label' => 'UserModif', 'enabled' => 1, 'visible' => 3, 'position' => 315),
'statut' => array('type' => 'tinyint(4)', 'label' => 'Status', 'enabled' => 1, 'visible' => 1, 'notnull' => 1, 'position' => 500),
- 'ip' => array('type' => 'varchar(250)', 'label' => 'Ip', 'enabled' => '1', 'position' => 700, 'notnull' => 0, 'visible' => '0', 'comment' => 'ip used to create record (for public submission page)'),
'import_key' => array('type' => 'varchar(14)', 'label' => 'ImportId', 'enabled' => 1, 'visible' => -1, 'position' => 1000),
);
diff --git a/htdocs/contact/list.php b/htdocs/contact/list.php
index 9661927d24018..527449dec4a6d 100644
--- a/htdocs/contact/list.php
+++ b/htdocs/contact/list.php
@@ -486,7 +486,7 @@
$sql = "SELECT s.rowid as socid, s.nom as name, s.name_alias as alias,";
$sql .= " p.rowid, p.ref_ext, p.lastname as lastname, p.statut, p.firstname, p.address, p.zip, p.town, p.poste, p.email, p.birthday,";
$sql .= " p.socialnetworks, p.photo,";
-$sql .= " p.phone as phone_pro, p.phone_mobile, p.phone_perso, p.fax, p.fk_pays, p.priv, p.datec as date_creation, p.tms as date_modification,";
+$sql .= " p.phone as phone_pro, p.phone_mobile, p.phone_perso, p.fax, p.fk_pays, p.priv, p.ip, p.datec as date_creation, p.tms as date_modification,";
$sql .= " p.import_key, p.fk_stcommcontact as stcomm_id, p.fk_prospectlevel,";
$sql .= " st.libelle as stcomm, st.picto as stcomm_picto,";
$sql .= " co.label as country, co.code as country_code";
@@ -1240,6 +1240,11 @@
$parameters = array('arrayfields' => $arrayfields);
$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
+// IP
+if (!empty($arrayfields['p.ip']['checked'])) {
+ print '';
+ print ' ';
+}
// Date creation
if (!empty($arrayfields['p.datec']['checked'])) {
print '';
@@ -1385,6 +1390,12 @@
$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder, 'totalarray' => &$totalarray);
$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
+// IP
+if (!empty($arrayfields['p.ip']['checked'])) {
+ print_liste_field_titre($arrayfields['p.ip']['label'], $_SERVER["PHP_SELF"], "p.ip", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
+ $totalarray['nbfield']++;
+}
+// Date creation
if (!empty($arrayfields['p.datec']['checked'])) {
print_liste_field_titre($arrayfields['p.datec']['label'], $_SERVER["PHP_SELF"], "p.datec", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
$totalarray['nbfield']++;
@@ -1754,6 +1765,17 @@
$parameters = array('arrayfields' => $arrayfields, 'object' => $object, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
$reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
+
+ // IP creation
+ if (!empty($arrayfields['p.ip']['checked'])) {
+ print ' ';
+ print dol_print_ip($obj->ip);
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
// Date creation
if (!empty($arrayfields['p.datec']['checked'])) {
print '';
diff --git a/htdocs/core/boxes/box_graph_product_distribution.php b/htdocs/core/boxes/box_graph_product_distribution.php
index e405727d7ffff..8abd76893bc96 100644
--- a/htdocs/core/boxes/box_graph_product_distribution.php
+++ b/htdocs/core/boxes/box_graph_product_distribution.php
@@ -222,6 +222,7 @@ public function loadBox($max = 5)
if (empty($data3)) {
$showpointvalue = 0;
$nocolor = 1;
+
$data3 = array(array(0 => $langs->trans("None"), 1 => 1));
}
diff --git a/htdocs/core/class/doleditor.class.php b/htdocs/core/class/doleditor.class.php
index 030713957a3eb..3129713147952 100644
--- a/htdocs/core/class/doleditor.class.php
+++ b/htdocs/core/class/doleditor.class.php
@@ -103,7 +103,7 @@ class DolEditor
* @param string $toolbarname Name of the toolbar set to use ('dolibarr_details[_encoded]'=the less featured, 'dolibarr_notes[_encoded]' for notes content, 'dolibarr_mailings[_encoded]' for emailing content, 'dolibarr_readonly').
* @param string $toolbarlocation Deprecated. Not used
* @param bool $toolbarstartexpanded Bar is visible or not at start
- * @param bool|int $uselocalbrowser Enabled to add links to local object with a local media filemanager. If false, only external images URL can be added into content, or images saved inline with src="data:..." with a cut/paste.
+ * @param bool|int $uselocalbrowser Enabled to add links to local object with a local media filemanager. -1=auto, false=only external images URL can be added into content, or images saved inline with src="data:..." with a cut/paste.
* @param bool|int|string $okforextendededitor 1 or True=Allow usage of extended editor tool if qualified (like ckeditor). If 'textarea', force use of simple textarea. If 'ace', force use of Ace.
* Warning: If you use 'ace', don't forget to also include ace.js in page header. Also, the button "save" must have class="buttonforacesave".
* @param int $rows Size of rows for textarea tool
diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php
index 29de7398bac4b..66008eb07dbe4 100644
--- a/htdocs/core/class/html.form.class.php
+++ b/htdocs/core/class/html.form.class.php
@@ -6906,12 +6906,31 @@ public function load_cache_vatrates($country_code)
public function load_tva($htmlname = 'tauxtva', $selectedrate = '', $societe_vendeuse = null, $societe_acheteuse = null, $idprod = 0, $info_bits = 0, $type = '', $options_only = false, $mode = 0, $type_vat = 0)
{
// phpcs:enable
- global $langs, $mysoc;
+ global $langs, $mysoc, $hookmanager;
$langs->load('errors');
$return = '';
-
+ // Bypass the default method
+ $hookmanager->initHooks(array('commonobject'));
+ $info_bits == 1 ? $is_npr = 1 : $is_npr = 0;
+ $parameters = array(
+ 'seller' => $societe_vendeuse,
+ 'buyer' => $societe_acheteuse,
+ 'idprod' => $idprod,
+ 'is_npr' => $is_npr,
+ 'type' => $type,
+ 'options_only' => $options_only,
+ 'mode' => $mode,
+ 'type_vat' => $type_vat
+ );
+ $reshook = $hookmanager->executeHooks('load_tva', $parameters);
+ if ($reshook > 0) {
+ return $hookmanager->resPrint;
+ } elseif ($reshook === 0) {
+ $return .= $hookmanager->resPrint;
+ }
+
// Define defaultnpr, defaultttx and defaultcode
$defaultnpr = ($info_bits & 0x01);
$defaultnpr = (preg_match('/\*/', $selectedrate) ? 1 : $defaultnpr);
@@ -9374,7 +9393,8 @@ public static function multiselectarray($htmlname, $array, $selected = array(),
escapeMarkup: function (markup) { return markup; }, // let our custom formatter work
// Specify format function for selected item
formatSelection: formatSelection,
- templateSelection: formatSelection /* For 4.0 */
+ templateSelection: formatSelection, /* For 4.0 */
+ language: select2arrayoflanguage
});
/* Add also morecss to the css .select2 that is after the #htmlname, for component that are show dynamically after load, because select2 set
diff --git a/htdocs/core/class/translate.class.php b/htdocs/core/class/translate.class.php
index 0c95a0d3d55b2..4a53e4ce571b3 100644
--- a/htdocs/core/class/translate.class.php
+++ b/htdocs/core/class/translate.class.php
@@ -682,6 +682,8 @@ public function trans($key, $param1 = '', $param2 = '', $param3 = '', $param4 =
}
}
+ $str = str_replace('%)', '__percent_parenthesis__', $str);
+
if (strpos($key, 'Format') !== 0) {
try {
// @phan-suppress-next-line PhanPluginPrintfVariableFormatString
@@ -691,6 +693,8 @@ public function trans($key, $param1 = '', $param2 = '', $param3 = '', $param4 =
}
}
+ $str = str_replace('__percent_parenthesis__', '%)', $str);
+
// We replace some HTML tags by __xx__ to avoid having them encoded by htmlentities because
// we want to keep '"' '' ' ' '' ' ' '' ' ' ' ' ' '' '' ' ' '' '< ' that are reliable HTML tags inside translation strings.
$str = str_replace(
diff --git a/htdocs/core/customreports.php b/htdocs/core/customreports.php
index 59a9f25598cc5..f0f1cd2271244 100644
--- a/htdocs/core/customreports.php
+++ b/htdocs/core/customreports.php
@@ -32,7 +32,7 @@
* include DOL_DOCUMENT_ROOT.'/core/customreports.php';
*/
- /**
+/**
* @var Conf $conf
* @var DoliDB $db
* @var HookManager $hookmanager
@@ -322,6 +322,7 @@
$MI = substr($langs->trans("Minute"), 0, 1).substr($langs->trans("Minute"), 0, 1);
$SS = substr($langs->trans("Second"), 0, 1).substr($langs->trans("Second"), 0, 1);
+$arrayoffilterfields = array();
$arrayofmesures = array();
$arrayofxaxis = array();
$arrayofgroupby = array();
@@ -375,6 +376,10 @@
}
}
+$count = 0;
+$arrayoffilterfields = fillArrayOfFilterFields($object, 't', $langs->trans($newarrayoftype[$objecttype]['label']), $arrayoffilterfields, 0, $count);
+$arrayoffilterfields = dol_sort_array($arrayoffilterfields, 'position', 'asc', 0, 0, 1);
+
$count = 0;
$arrayofmesures = fillArrayOfMeasures($object, 't', $langs->trans($newarrayoftype[$objecttype]['label']), $arrayofmesures, 0, $count);
$arrayofmesures = dol_sort_array($arrayofmesures, 'position', 'asc', 0, 0, 1);
@@ -387,10 +392,6 @@
$arrayofgroupby = fillArrayOfGroupBy($object, 't', $langs->trans($newarrayoftype[$objecttype]['label']), $arrayofgroupby, 0, $count);
$arrayofgroupby = dol_sort_array($arrayofgroupby, 'position', 'asc', 0, 0, 1);
-$count = 0;
-$arrayoffilterfields = fillArrayOfFilterFields($object, 't', $langs->trans($newarrayoftype[$objecttype]['label']), $arrayoffilterfields, 0, $count);
-$arrayoffilterfields = dol_sort_array($arrayoffilterfields, 'position', 'asc', 0, 0, 1);
-
// Check parameters
if ($action == 'viewgraph') {
diff --git a/htdocs/core/lib/company.lib.php b/htdocs/core/lib/company.lib.php
index 0d95003080db8..1e3f5fe9db276 100644
--- a/htdocs/core/lib/company.lib.php
+++ b/htdocs/core/lib/company.lib.php
@@ -2366,11 +2366,13 @@ function show_actions_done($conf, $langs, $db, $filterobj, $objcon = null, $nopr
$out .= dol_trunc($libelle, 120);
}
if (isset($histo[$key]['type']) && $histo[$key]['type'] == 'mailing') {
- $out .= ''.img_object($langs->trans("ShowEMailing"), "email").' ';
$transcode = $langs->trans("Action".$histo[$key]['acode']);
$libelle = ($transcode != "Action".$histo[$key]['acode'] ? $transcode : 'Send mass mailing');
+ $out .= ' ';
+ $out .= img_object($langs->trans("ShowEMailing"), "email").' ';
$out .= dol_trunc($libelle, 120);
+ $out .= ' ';
}
$out .= ' ';
diff --git a/htdocs/core/lib/customreports.lib.php b/htdocs/core/lib/customreports.lib.php
index 553e3f3681b5d..574faafeabb42 100644
--- a/htdocs/core/lib/customreports.lib.php
+++ b/htdocs/core/lib/customreports.lib.php
@@ -523,10 +523,12 @@ function fillArrayOfFilterFields($object, $tablealias, $labelofobject, &$arrayof
{
global $langs, $extrafields, $db;
+ $MAXLEVEL = 2;
+
if (empty($object)) { // Protection against bad use of method
return array();
}
- if ($level >= 3) { // Limit scan on 2 levels max
+ if ($level > $MAXLEVEL) { // Limit scan on 2 levels max
return $arrayoffields;
}
@@ -612,7 +614,11 @@ function fillArrayOfFilterFields($object, $tablealias, $labelofobject, &$arrayof
if (class_exists($newobject)) {
$tmpobject = new $newobject($db);
$count++;
- $arrayoffields = fillArrayOfFilterFields($tmpobject, $tablealias.'__'.$key, $langs->trans($val['label']), $arrayoffields, $level + 1, $count, $tablepath);
+ if (!empty($val['nodepth'])) {
+ $arrayoffields = fillArrayOfFilterFields($tmpobject, $tablealias.'__'.$key, $langs->trans($val['label']), $arrayoffields, $MAXLEVEL, $count, $tablepath);
+ } else {
+ $arrayoffields = fillArrayOfFilterFields($tmpobject, $tablealias.'__'.$key, $langs->trans($val['label']), $arrayoffields, $level + 1, $count, $tablepath);
+ }
} else {
print 'For property '.$object->element.'->'.$key.', type="'.$val['type'].'": Failed to find class '.$newobject." in file ".$tmptype[2]." \n";
}
diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php
index cb73d130f84aa..d38ea55a4ece6 100644
--- a/htdocs/core/lib/functions.lib.php
+++ b/htdocs/core/lib/functions.lib.php
@@ -21,8 +21,8 @@
* Copyright (C) 2022 Anthony Berton
* Copyright (C) 2022 Ferran Marcet
* Copyright (C) 2022 Charlene Benke
- * Copyright (C) 2023 Joachim Kueter
* Copyright (C) 2024-2025 MDW
+ * Copyright (C) 2023-2024 Joachim Kueter
* Copyright (C) 2024 Lenin Rivas
* Copyright (C) 2024 Josep Lluís Amador Teruel
* Copyright (C) 2024 Benoît PASCAL
@@ -8586,17 +8586,19 @@ function dol_htmlwithnojs($stringtoencode, $nouseofiframesandbox = 0, $check = '
// We replace chars from a/A to z/Z encoded with numeric HTML entities with the real char so we won't loose the chars at the next step (preg_replace).
// No need to use a loop here, this step is not to sanitize (this is done at next step, this is to try to save chars, even if they are
// using a non conventionnal way to be encoded, to not have them sanitized just after)
- $out = preg_replace_callback(
- '/(x?[0-9][0-9a-f]+;?)/i',
- /**
- * @param string[] $m
- * @return string
- */
- static function ($m) {
- return realCharForNumericEntities($m);
- },
- $out
- );
+ if (function_exists('realCharForNumericEntities')) { // May not exist when main.inc.php not loaded, for example in a CLI context
+ $out = preg_replace_callback(
+ '/(x?[0-9][0-9a-f]+;?)/i',
+ /**
+ * @param string[] $m
+ * @return string
+ */
+ static function ($m) {
+ return realCharForNumericEntities($m);
+ },
+ $out
+ );
+ }
// Now we remove all remaining HTML entities starting with a number. We don't want such entities.
$out = preg_replace('/?[0-9]+/i', '', $out); // For example if we have javascript with an entities without the ; to hide the 'a' of 'javascript'.
@@ -9172,23 +9174,33 @@ function getCommonSubstitutionArray($outputlangs, $onlykey = 0, $exclude = null,
$substitutionarray['__REF_SUPPLIER__'] = (isset($object->ref_supplier) ? $object->ref_supplier : null);
$substitutionarray['__NOTE_PUBLIC__'] = (isset($object->note_public) ? $object->note_public : null);
$substitutionarray['__NOTE_PRIVATE__'] = (isset($object->note_private) ? $object->note_private : null);
+
$substitutionarray['__DATE_CREATION__'] = (isset($object->date_creation) ? dol_print_date($object->date_creation, 'day', false, $outputlangs) : '');
$substitutionarray['__DATE_MODIFICATION__'] = (isset($object->date_modification) ? dol_print_date($object->date_modification, 'day', false, $outputlangs) : '');
$substitutionarray['__DATE_VALIDATION__'] = (isset($object->date_validation) ? dol_print_date($object->date_validation, 'day', false, $outputlangs) : '');
- $substitutionarray['__DATE_DELIVERY__'] = (isset($object->date_delivery) ? dol_print_date($object->date_delivery, 'day', false, $outputlangs) : '');
- $substitutionarray['__DATE_DELIVERY_DAY__'] = (isset($object->date_delivery) ? dol_print_date($object->date_delivery, "%d") : '');
- $substitutionarray['__DATE_DELIVERY_DAY_TEXT__'] = (isset($object->date_delivery) ? dol_print_date($object->date_delivery, "%A") : '');
- $substitutionarray['__DATE_DELIVERY_MON__'] = (isset($object->date_delivery) ? dol_print_date($object->date_delivery, "%m") : '');
- $substitutionarray['__DATE_DELIVERY_MON_TEXT__'] = (isset($object->date_delivery) ? dol_print_date($object->date_delivery, "%b") : '');
- $substitutionarray['__DATE_DELIVERY_YEAR__'] = (isset($object->date_delivery) ? dol_print_date($object->date_delivery, "%Y") : '');
- $substitutionarray['__DATE_DELIVERY_HH__'] = (isset($object->date_delivery) ? dol_print_date($object->date_delivery, "%H") : '');
- $substitutionarray['__DATE_DELIVERY_MM__'] = (isset($object->date_delivery) ? dol_print_date($object->date_delivery, "%M") : '');
- $substitutionarray['__DATE_DELIVERY_SS__'] = (isset($object->date_delivery) ? dol_print_date($object->date_delivery, "%S") : '');
+
+ // handle date_delivery: in customer order/supplier order, the property name is delivery_date, in shipment/reception it is date_delivery
+ $date_delivery = null;
+ if (property_exists($object, 'date_delivery')) {
+ $date_delivery = $object->date_delivery;
+ } elseif (property_exists($object, 'delivery_date')) {
+ $date_delivery = $object->delivery_date;
+ }
+ $substitutionarray['__DATE_DELIVERY__'] = (isset($date_delivery) ? dol_print_date($date_delivery, 'day', 0, $outputlangs) : '');
+ $substitutionarray['__DATE_DELIVERY_DAY__'] = (isset($date_delivery) ? dol_print_date($date_delivery, "%d") : '');
+ $substitutionarray['__DATE_DELIVERY_DAY_TEXT__'] = (isset($date_delivery) ? dol_print_date($date_delivery, "%A") : '');
+ $substitutionarray['__DATE_DELIVERY_MON__'] = (isset($date_delivery) ? dol_print_date($date_delivery, "%m") : '');
+ $substitutionarray['__DATE_DELIVERY_MON_TEXT__'] = (isset($date_delivery) ? dol_print_date($date_delivery, "%b") : '');
+ $substitutionarray['__DATE_DELIVERY_YEAR__'] = (isset($date_delivery) ? dol_print_date($date_delivery, "%Y") : '');
+ $substitutionarray['__DATE_DELIVERY_HH__'] = (isset($date_delivery) ? dol_print_date($date_delivery, "%H") : '');
+ $substitutionarray['__DATE_DELIVERY_MM__'] = (isset($date_delivery) ? dol_print_date($date_delivery, "%M") : '');
+ $substitutionarray['__DATE_DELIVERY_SS__'] = (isset($date_delivery) ? dol_print_date($date_delivery, "%S") : '');
// For backward compatibility (deprecated)
$substitutionarray['__REFCLIENT__'] = (isset($object->ref_client) ? $object->ref_client : (isset($object->ref_customer) ? $object->ref_customer : null));
$substitutionarray['__REFSUPPLIER__'] = (isset($object->ref_supplier) ? $object->ref_supplier : null);
- $substitutionarray['__SUPPLIER_ORDER_DATE_DELIVERY__'] = (isset($object->delivery_date) ? dol_print_date($object->delivery_date, 'day', false, $outputlangs) : '');
+
+ $substitutionarray['__SUPPLIER_ORDER_DATE_DELIVERY__'] = (isset($date_delivery) ? dol_print_date($date_delivery, 'day', false, $outputlangs) : '');
$substitutionarray['__SUPPLIER_ORDER_DELAY_DELIVERY__'] = (isset($object->availability_code) ? ($outputlangs->transnoentities("AvailabilityType".$object->availability_code) != 'AvailabilityType'.$object->availability_code ? $outputlangs->transnoentities("AvailabilityType".$object->availability_code) : $outputlangs->convToOutputCharset(isset($object->availability) ? $object->availability : '')) : '');
$substitutionarray['__EXPIRATION_DATE__'] = (isset($object->fin_validite) ? dol_print_date($object->fin_validite, 'daytext') : '');
diff --git a/htdocs/core/modules/commande/mod_commande_marbre.php b/htdocs/core/modules/commande/mod_commande_marbre.php
index 34ad5e13b4c8a..72dc4d55b90c5 100644
--- a/htdocs/core/modules/commande/mod_commande_marbre.php
+++ b/htdocs/core/modules/commande/mod_commande_marbre.php
@@ -60,7 +60,7 @@ public function __construct()
{
global $conf, $mysoc;
- if ((float) $conf->global->MAIN_VERSION_LAST_INSTALL >= 16.0 && $mysoc->country_code != 'FR') {
+ if ((float) getDolGlobalString('MAIN_VERSION_LAST_INSTALL') >= 16.0 && $mysoc->country_code != 'FR') {
$this->prefix = 'SO'; // We use correct standard code "SO = Sale Order"
}
}
diff --git a/htdocs/core/modules/mailings/modules_mailings.php b/htdocs/core/modules/mailings/modules_mailings.php
index e45bd655ef3f6..9605cbe901960 100644
--- a/htdocs/core/modules/mailings/modules_mailings.php
+++ b/htdocs/core/modules/mailings/modules_mailings.php
@@ -169,14 +169,14 @@ public function update_nb($mailing_id)
{
// phpcs:enable
// Mise a jour nombre de destinataire dans table des mailings
- $sql = "SELECT COUNT(*) nb FROM ".MAIN_DB_PREFIX."mailing_cibles";
+ $sql = "SELECT COUNT(*) nb FROM ".$this->db->prefix()."mailing_cibles";
$sql .= " WHERE fk_mailing = ".((int) $mailing_id);
$result = $this->db->query($sql);
if ($result) {
$obj = $this->db->fetch_object($result);
$nb = $obj->nb;
- $sql = "UPDATE ".MAIN_DB_PREFIX."mailing";
+ $sql = "UPDATE ".$this->db->prefix()."mailing";
$sql .= " SET nbemail = ".((int) $nb)." WHERE rowid = ".((int) $mailing_id);
if (!$this->db->query($sql)) {
dol_syslog($this->db->error());
@@ -208,7 +208,7 @@ public function addTargetsToDatabase($mailing_id, $cibles)
$num = count($cibles);
foreach ($cibles as $targetarray) {
if (!empty($targetarray['email'])) { // avoid empty email address
- $sql = "INSERT INTO ".MAIN_DB_PREFIX."mailing_cibles";
+ $sql = "INSERT INTO ".$this->db->prefix()."mailing_cibles";
$sql .= " (fk_mailing,";
$sql .= " fk_contact,";
$sql .= " lastname, firstname, email, other, source_url, source_id,";
@@ -244,27 +244,27 @@ public function addTargetsToDatabase($mailing_id, $cibles)
/*
//Update the status to show thirdparty mail that don't want to be contacted anymore'
- $sql = "UPDATE ".MAIN_DB_PREFIX."mailing_cibles";
+ $sql = "UPDATE ".$this->db->prefix()."mailing_cibles";
$sql .= " SET statut=3";
- $sql .= " WHERE fk_mailing = ".((int) $mailing_id)." AND email in (SELECT email FROM ".MAIN_DB_PREFIX."societe where fk_stcomm=-1)";
+ $sql .= " WHERE fk_mailing = ".((int) $mailing_id)." AND email in (SELECT email FROM ".$this->db->prefix()."societe where fk_stcomm=-1)";
$sql .= " AND source_type='thirdparty'";
dol_syslog(__METHOD__.": mailing update status to display thirdparty mail that do not want to be contacted");
$result=$this->db->query($sql);
//Update the status to show contact mail that don't want to be contacted anymore'
- $sql = "UPDATE ".MAIN_DB_PREFIX."mailing_cibles";
+ $sql = "UPDATE ".$this->db->prefix()."mailing_cibles";
$sql .= " SET statut=3";
- $sql .= " WHERE fk_mailing = ".((int) $mailing_id)." AND source_type='contact' AND (email in (SELECT sc.email FROM ".MAIN_DB_PREFIX."socpeople AS sc ";
- $sql .= " INNER JOIN ".MAIN_DB_PREFIX."societe s ON s.rowid=sc.fk_soc WHERE s.fk_stcomm=-1 OR no_email=1))";
+ $sql .= " WHERE fk_mailing = ".((int) $mailing_id)." AND source_type='contact' AND (email in (SELECT sc.email FROM ".$this->db->prefix()."socpeople AS sc ";
+ $sql .= " INNER JOIN ".$this->db->prefix()."societe s ON s.rowid=sc.fk_soc WHERE s.fk_stcomm=-1 OR no_email=1))";
dol_syslog(__METHOD__.": mailing update status to display contact mail that do not want to be contacted",LOG_DEBUG);
$result=$this->db->query($sql);
*/
if (empty($this->evenunsubscribe)) {
- $sql = "UPDATE ".MAIN_DB_PREFIX."mailing_cibles as mc";
+ $sql = "UPDATE ".$this->db->prefix()."mailing_cibles as mc";
$sql .= " SET mc.statut = 3";
$sql .= " WHERE mc.fk_mailing = ".((int) $mailing_id);
- $sql .= " AND EXISTS (SELECT rowid FROM ".MAIN_DB_PREFIX."mailing_unsubscribe as mu WHERE mu.email = mc.email and mu.entity = ".((int) $conf->entity).")";
+ $sql .= " AND EXISTS (SELECT rowid FROM ".$this->db->prefix()."mailing_unsubscribe as mu WHERE mu.email = mc.email and mu.entity = ".((int) $conf->entity).")";
dol_syslog(__METHOD__.":mailing update status to display emails that do not want to be contacted anymore", LOG_DEBUG);
$result = $this->db->query($sql);
@@ -291,7 +291,7 @@ public function addTargetsToDatabase($mailing_id, $cibles)
public function clear_target($mailing_id)
{
// phpcs:enable
- $sql = "DELETE FROM ".MAIN_DB_PREFIX."mailing_cibles";
+ $sql = "DELETE FROM ".$this->db->prefix()."mailing_cibles";
$sql .= " WHERE fk_mailing = ".((int) $mailing_id);
if (!$this->db->query($sql)) {
diff --git a/htdocs/core/modules/modAdherent.class.php b/htdocs/core/modules/modAdherent.class.php
index d35c7e5488930..1fae83e1c75f9 100644
--- a/htdocs/core/modules/modAdherent.class.php
+++ b/htdocs/core/modules/modAdherent.class.php
@@ -415,7 +415,7 @@ public function __construct($db)
'unitfrequency'=> 3600 * 24,
'priority'=>50,
'status'=>1,
- 'test'=>'$conf->adherent->enabled',
+ 'test'=>'isModEnabled("member")',
'datestart'=>$datestart
),
);
diff --git a/htdocs/core/modules/modStock.class.php b/htdocs/core/modules/modStock.class.php
index 62b15d2116ec5..2a49109ceceb3 100644
--- a/htdocs/core/modules/modStock.class.php
+++ b/htdocs/core/modules/modStock.class.php
@@ -527,7 +527,7 @@ public function __construct($db)
);
$this->import_updatekeys_array[$r] = array('ps.fk_product' => 'Product', 'ps.fk_entrepot' => "Warehouse");
$this->import_run_sql_after_array[$r] = array( // Because we may change data that are denormalized, we must update dernormalized data after.
- 'UPDATE '.MAIN_DB_PREFIX.'product as p SET p.stock = (SELECT SUM(ps.reel) FROM '.MAIN_DB_PREFIX.'product_stock ps WHERE ps.fk_product = p.rowid);'
+ 'UPDATE '.MAIN_DB_PREFIX.'product as p SET stock = (SELECT SUM(ps.reel) FROM '.MAIN_DB_PREFIX.'product_stock ps WHERE ps.fk_product = p.rowid);'
);
}
diff --git a/htdocs/core/modules/security/generate/modGeneratePassNone.class.php b/htdocs/core/modules/security/generate/modGeneratePassNone.class.php
index e5f1f77c00c8e..40817c5ca09a7 100644
--- a/htdocs/core/modules/security/generate/modGeneratePassNone.class.php
+++ b/htdocs/core/modules/security/generate/modGeneratePassNone.class.php
@@ -98,6 +98,8 @@ public function getNewGeneratedPassword()
*/
public function validatePassword($password)
{
+ dol_syslog("modGeneratePassNone::validatePassword");
+
return 1;
}
}
diff --git a/htdocs/core/modules/security/generate/modGeneratePassPerso.class.php b/htdocs/core/modules/security/generate/modGeneratePassPerso.class.php
index de7096bb1764e..a11f37e42377b 100644
--- a/htdocs/core/modules/security/generate/modGeneratePassPerso.class.php
+++ b/htdocs/core/modules/security/generate/modGeneratePassPerso.class.php
@@ -221,6 +221,8 @@ public function validatePassword($password)
$this->initAll(); // For the case this method is called alone
+ dol_syslog("modGeneratePassPerso::validatePassword");
+
$password_a = preg_split('//u', $password, 0, PREG_SPLIT_NO_EMPTY);
$maj = preg_split('//u', $this->Maj, 0, PREG_SPLIT_NO_EMPTY);
$num = preg_split('//u', $this->Nb, 0, PREG_SPLIT_NO_EMPTY);
diff --git a/htdocs/core/modules/security/generate/modGeneratePassStandard.class.php b/htdocs/core/modules/security/generate/modGeneratePassStandard.class.php
index 53f40260dbc7d..c363f1c050b3e 100644
--- a/htdocs/core/modules/security/generate/modGeneratePassStandard.class.php
+++ b/htdocs/core/modules/security/generate/modGeneratePassStandard.class.php
@@ -125,6 +125,8 @@ public function validatePassword($password)
{
global $langs;
+ dol_syslog("modGeneratePassStandard::validatePassword");
+
if (dol_strlen($password) < $this->length2) {
$langs->load("other");
$this->error = $langs->trans("YourPasswordMustHaveAtLeastXChars", $this->length2);
diff --git a/htdocs/core/tpl/extrafields_view.tpl.php b/htdocs/core/tpl/extrafields_view.tpl.php
index 8d17be75f402a..f643229c7d399 100644
--- a/htdocs/core/tpl/extrafields_view.tpl.php
+++ b/htdocs/core/tpl/extrafields_view.tpl.php
@@ -205,6 +205,9 @@
if ($object->element == 'salary') {
$permok = $user->hasRight('salaries', 'read');
}
+ if ($object->element == 'member') {
+ $permok = $user->hasRight('adherent', 'creer');
+ }
$isdraft = ((isset($object->statut) && $object->statut == 0) || (isset($object->status) && $object->status == 0));
if (($isdraft || !empty($extrafields->attributes[$object->table_element]['alwayseditable'][$tmpkeyextra]))
diff --git a/htdocs/core/triggers/interface_50_modNotification_Notification.class.php b/htdocs/core/triggers/interface_50_modNotification_Notification.class.php
index 86bf821cd365a..c3bdc97132888 100644
--- a/htdocs/core/triggers/interface_50_modNotification_Notification.class.php
+++ b/htdocs/core/triggers/interface_50_modNotification_Notification.class.php
@@ -99,6 +99,9 @@ public function runTrigger($action, $object, User $user, Translate $langs, Conf
$notify = new Notify($this->db);
$resultSend = $notify->send($action, $object);
if ($resultSend < 0) {
+ if (!isset($this->errors)) {
+ $this->errors = [];
+ }
$this->errors = array_merge($this->errors, $notify->errors);
return $resultSend;
}
diff --git a/htdocs/langs/en_US/website.lang b/htdocs/langs/en_US/website.lang
index 63725bae5cc4e..b839978b0a9f5 100644
--- a/htdocs/langs/en_US/website.lang
+++ b/htdocs/langs/en_US/website.lang
@@ -307,7 +307,7 @@ yourCompanyInformation=Your company information
emailAlreadyRegistered=This email is already registered.
firstnameContainsLettersOnly=Firstname must contain letters and spaces only
lastnameContainsLettersOnly=Lastname must contain letters and spaces only
-passwordCriteria=Password must meet the following criteria: - 12 characters - 1 uppercase letter - 1 digit - No special characters - Avoid repeating characters more than 3 times
+passwordCriteria=Password must meet the following criteria: - At least 12 characters - At lest 1 uppercase letter - At least 1 digit - At last 1 special characters - Avoid repeating characters more than 3 times
errorOccurred=An error has occurred.
accountCreation=Create an account
errorsOccurred=There are %s error%s
diff --git a/htdocs/loan/card.php b/htdocs/loan/card.php
index 33ba7e40e0021..709465adb0f36 100644
--- a/htdocs/loan/card.php
+++ b/htdocs/loan/card.php
@@ -117,8 +117,9 @@
if (!$cancel) {
$datestart = dol_mktime(12, 0, 0, GETPOSTINT('startmonth'), GETPOSTINT('startday'), GETPOSTINT('startyear'));
$dateend = dol_mktime(12, 0, 0, GETPOSTINT('endmonth'), GETPOSTINT('endday'), GETPOSTINT('endyear'));
- $capital = (float) price2num(GETPOST('capital'));
- $rate = (float) price2num(GETPOST('rate'));
+
+ $capital = GETPOSTFLOAT('capital');
+ $rate = GETPOSTFLOAT('rate');
if (!$capital) {
$error++;
@@ -152,7 +153,7 @@
$object->note_private = GETPOST('note_private', 'restricthtml');
$object->note_public = GETPOST('note_public', 'restricthtml');
$object->fk_project = GETPOSTINT('projectid');
- $object->insurance_amount = GETPOSTINT('insurance_amount');
+ $object->insurance_amount = GETPOSTFLOAT('insurance_amount');
$accountancy_account_capital = GETPOST('accountancy_account_capital');
$accountancy_account_insurance = GETPOST('accountancy_account_insurance');
@@ -192,7 +193,8 @@
$datestart = dol_mktime(12, 0, 0, GETPOSTINT('startmonth'), GETPOSTINT('startday'), GETPOSTINT('startyear'));
$dateend = dol_mktime(12, 0, 0, GETPOSTINT('endmonth'), GETPOSTINT('endday'), GETPOSTINT('endyear'));
- $capital = (float) price2num(GETPOST('capital'));
+
+ $capital = GETPOSTFLOAT('capital');
if (!$capital) {
setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("LoanCapital")), null, 'errors');
@@ -201,9 +203,10 @@
$object->datestart = $datestart;
$object->dateend = $dateend;
$object->capital = $capital;
- $object->nbterm = (float) price2num(GETPOSTINT("nbterm"));
- $object->rate = (float) price2num(GETPOST("rate", 'alpha'));
- $object->insurance_amount = (float) price2num(GETPOSTINT('insurance_amount'));
+
+ $object->nbterm = GETPOSTINT("nbterm");
+ $object->rate = price2num(GETPOST("rate", 'alpha'));
+ $object->insurance_amount = GETPOSTFLOAT('insurance_amount');
$accountancy_account_capital = GETPOST('accountancy_account_capital');
$accountancy_account_insurance = GETPOST('accountancy_account_insurance');
diff --git a/htdocs/loan/class/paymentloan.class.php b/htdocs/loan/class/paymentloan.class.php
index 98ba5d2bba2be..38c44eaa9e3fc 100644
--- a/htdocs/loan/class/paymentloan.class.php
+++ b/htdocs/loan/class/paymentloan.class.php
@@ -1,7 +1,7 @@
- * Copyright (C) 2015-2024 Frédéric France
- * Copyright (C) 2020 Maxime DEMAREST
+/* Copyright (C) 2014-2025 Alexandre Spangaro
+ * Copyright (C) 2015-2024 Frédéric France
+ * Copyright (C) 2020 Maxime DEMAREST
* Copyright (C) 2024 MDW
*
* This program is free software; you can redistribute it and/or modify
@@ -134,6 +134,7 @@ class PaymentLoan extends CommonObject
* @var int
*/
public $bank_account;
+
/**
* @var int
*/
@@ -159,8 +160,6 @@ public function __construct($db)
*/
public function create($user)
{
- global $conf, $langs;
-
$error = 0;
$now = dol_now();
@@ -257,7 +256,6 @@ public function create($user)
*/
public function fetch($id)
{
- global $langs;
$sql = "SELECT";
$sql .= " t.rowid,";
$sql .= " t.fk_loan,";
@@ -330,7 +328,6 @@ public function fetch($id)
*/
public function update($user = null, $notrigger = 0)
{
- global $conf, $langs;
$error = 0;
// Clean parameters
@@ -421,20 +418,17 @@ public function update($user = null, $notrigger = 0)
*/
public function delete($user, $notrigger = 0)
{
- global $conf, $langs;
$error = 0;
$this->db->begin();
- if (!$error) {
- $sql = "DELETE FROM ".MAIN_DB_PREFIX."bank_url";
- $sql .= " WHERE type='payment_loan' AND url_id=".((int) $this->id);
-
- dol_syslog(get_class($this)."::delete", LOG_DEBUG);
- $resql = $this->db->query($sql);
- if (!$resql) {
+ if ($this->bank_line > 0) {
+ $accline = new AccountLine($this->db);
+ $accline->fetch($this->bank_line);
+ $result = $accline->delete($user);
+ if ($result < 0) {
+ $this->errors[] = $accline->error;
$error++;
- $this->errors[] = "Error ".$this->db->lasterror();
}
}
@@ -465,22 +459,6 @@ public function delete($user, $notrigger = 0)
}
}
- //if (! $error)
- //{
- // if (! $notrigger)
- // {
- // Uncomment this and change MYOBJECT to your own tag if you
- // want this action call a trigger.
-
- //// Call triggers
- //include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
- //$interface=new Interfaces($this->db);
- //$result=$interface->run_triggers('MYOBJECT_DELETE',$this,$user,$langs,$conf);
- //if ($result < 0) { $error++; $this->errors=$interface->errors; }
- //// End call triggers
- // }
- //}
-
// Commit or rollback
if ($error) {
foreach ($this->errors as $errmsg) {
@@ -535,8 +513,6 @@ public function LibStatut($status, $mode = 0)
*/
public function addPaymentToBank($user, $fk_loan, $mode, $label, $accountid, $emetteur_nom, $emetteur_banque)
{
- global $conf;
-
$error = 0;
$this->db->begin();
diff --git a/htdocs/modulebuilder/template/admin/setup.php b/htdocs/modulebuilder/template/admin/setup.php
index d7d87fe8f1e22..306a28aa5b92e 100644
--- a/htdocs/modulebuilder/template/admin/setup.php
+++ b/htdocs/modulebuilder/template/admin/setup.php
@@ -478,7 +478,7 @@
// Load array def with activated templates
$def = array();
$sql = "SELECT nom";
- $sql .= " FROM ".MAIN_DB_PREFIX."document_model";
+ $sql .= " FROM ".$db->prefix()."document_model";
$sql .= " WHERE type = '".$db->escape($type)."'";
$sql .= " AND entity = ".$conf->entity;
$resql = $db->query($sql);
diff --git a/htdocs/modulebuilder/template/class/api_mymodule.class.php b/htdocs/modulebuilder/template/class/api_mymodule.class.php
index 960fd87c82c19..1ea207bca4a71 100644
--- a/htdocs/modulebuilder/template/class/api_mymodule.class.php
+++ b/htdocs/modulebuilder/template/class/api_mymodule.class.php
@@ -136,8 +136,8 @@ public function index($sortfield = "t.rowid", $sortorder = 'ASC', $limit = 100,
}
$sql = "SELECT t.rowid";
- $sql .= " FROM ".MAIN_DB_PREFIX.$tmpobject->table_element." AS t";
- $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$tmpobject->table_element."_extrafields AS ef ON (ef.fk_object = t.rowid)"; // Modification VMR Global Solutions to include extrafields as search parameters in the API GET call, so we will be able to filter on extrafields
+ $sql .= " FROM ".$this->db->prefix().$tmpobject->table_element." AS t";
+ $sql .= " LEFT JOIN ".$this->db->prefix().$tmpobject->table_element."_extrafields AS ef ON (ef.fk_object = t.rowid)"; // Modification VMR Global Solutions to include extrafields as search parameters in the API GET call, so we will be able to filter on extrafields
$sql .= " WHERE 1 = 1";
if ($tmpobject->ismultientitymanaged) {
$sql .= ' AND t.entity IN ('.getEntity($tmpobject->element).')';
@@ -148,9 +148,9 @@ public function index($sortfield = "t.rowid", $sortorder = 'ASC', $limit = 100,
// Search on sale representative
if ($search_sale && $search_sale != '-1') {
if ($search_sale == -2) {
- $sql .= " AND NOT EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = t.fk_soc)";
+ $sql .= " AND NOT EXISTS (SELECT sc.fk_soc FROM ".$this->db->prefix()."societe_commerciaux as sc WHERE sc.fk_soc = t.fk_soc)";
} elseif ($search_sale > 0) {
- $sql .= " AND EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = t.fk_soc AND sc.fk_user = ".((int) $search_sale).")";
+ $sql .= " AND EXISTS (SELECT sc.fk_soc FROM ".$this->db->prefix()."societe_commerciaux as sc WHERE sc.fk_soc = t.fk_soc AND sc.fk_user = ".((int) $search_sale).")";
}
}
if ($sqlfilters) {
diff --git a/htdocs/modulebuilder/template/class/myobject.class.php b/htdocs/modulebuilder/template/class/myobject.class.php
index 88f00e988549a..13236e1480336 100644
--- a/htdocs/modulebuilder/template/class/myobject.class.php
+++ b/htdocs/modulebuilder/template/class/myobject.class.php
@@ -592,7 +592,7 @@ public function validate($user, $notrigger = 0)
if (!empty($num)) {
// Validate
- $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
+ $sql = "UPDATE ".$this->db->prefix().$this->table_element;
$sql .= " SET ";
if (!empty($this->fields['ref'])) {
$sql .= " ref = '".$this->db->escape($num)."',";
@@ -630,14 +630,14 @@ public function validate($user, $notrigger = 0)
// Rename directory if dir was a temporary ref
if (preg_match('/^[\(]?PROV/i', $this->ref)) {
// Now we rename also files into index
- $sql = 'UPDATE '.MAIN_DB_PREFIX."ecm_files set filename = CONCAT('".$this->db->escape($this->newref)."', SUBSTR(filename, ".(strlen($this->ref) + 1).")), filepath = 'myobject/".$this->db->escape($this->newref)."'";
+ $sql = 'UPDATE '.$this->db->prefix()."ecm_files set filename = CONCAT('".$this->db->escape($this->newref)."', SUBSTR(filename, ".(strlen($this->ref) + 1).")), filepath = 'myobject/".$this->db->escape($this->newref)."'";
$sql .= " WHERE filename LIKE '".$this->db->escape($this->ref)."%' AND filepath = 'myobject/".$this->db->escape($this->ref)."' and entity = ".$conf->entity;
$resql = $this->db->query($sql);
if (!$resql) {
$error++;
$this->error = $this->db->lasterror();
}
- $sql = 'UPDATE '.MAIN_DB_PREFIX."ecm_files set filepath = 'myobject/".$this->db->escape($this->newref)."'";
+ $sql = 'UPDATE '.$this->db->prefix()."ecm_files set filepath = 'myobject/".$this->db->escape($this->newref)."'";
$sql .= " WHERE filepath = 'myobject/".$this->db->escape($this->ref)."' and entity = ".$conf->entity;
$resql = $this->db->query($sql);
if (!$resql) {
@@ -1031,7 +1031,7 @@ public function info($id)
if (!empty($this->fields['fk_user_valid'])) {
$sql .= ", fk_user_valid";
}
- $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element." as t";
+ $sql .= " FROM ".$this->db->prefix().$this->table_element." as t";
$sql .= " WHERE t.rowid = ".((int) $id);
$result = $this->db->query($sql);
diff --git a/htdocs/modulebuilder/template/core/modules/mailings/mailing_mymodule_selector1.modules.php b/htdocs/modulebuilder/template/core/modules/mailings/mailing_mymodule_selector1.modules.php
index a14f339306b72..b55fa3e6fe31a 100644
--- a/htdocs/modulebuilder/template/core/modules/mailings/mailing_mymodule_selector1.modules.php
+++ b/htdocs/modulebuilder/template/core/modules/mailings/mailing_mymodule_selector1.modules.php
@@ -111,7 +111,7 @@ public function add_to_target($mailing_id)
$j = 0;
$sql = "SELECT rowid as id, firstname, lastname, email";
- $sql .= " FROM ".MAIN_DB_PREFIX."myobject";
+ $sql .= " FROM ".$this->db->prefix()."myobject";
$sql .= " WHERE email IS NOT NULL AND email <> ''";
if (GETPOSTISSET('filter') && GETPOST('filter', 'alphanohtml') != 'none') {
$sql .= " AND status = '".$this->db->escape(GETPOST('filter', 'alphanohtml'))."'";
@@ -195,7 +195,7 @@ public function getSqlArrayForStats()
public function getNbOfRecipients($sql = '')
{
$sql = "SELECT COUNT(DISTINCT(email)) as nb";
- $sql .= " FROM ".MAIN_DB_PREFIX."myobject as p";
+ $sql .= " FROM ".$this->db->prefix()."myobject as p";
$sql .= " WHERE email IS NOT NULL AND email <> ''";
$a = parent::getNbOfRecipients($sql);
diff --git a/htdocs/modulebuilder/template/core/modules/modMyModule.class.php b/htdocs/modulebuilder/template/core/modules/modMyModule.class.php
index 9a0e08299724a..2a894544b8e07 100644
--- a/htdocs/modulebuilder/template/core/modules/modMyModule.class.php
+++ b/htdocs/modulebuilder/template/core/modules/modMyModule.class.php
@@ -228,7 +228,7 @@ public function __construct($db)
// Label of tables
'tablib' => array("Table1", "Table2", "Table3"),
// Request to select fields
- 'tabsql' => array('SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.MAIN_DB_PREFIX.'table1 as f', 'SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.MAIN_DB_PREFIX.'table2 as f', 'SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.MAIN_DB_PREFIX.'table3 as f'),
+ 'tabsql' => array('SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.$this->db->prefix().'table1 as f', 'SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.$this->db->prefix().'table2 as f', 'SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.$this->db->prefix().'table3 as f'),
// Sort order
'tabsqlsort' => array("label ASC", "label ASC", "label ASC"),
// List of fields (result of select to show dictionary)
@@ -411,8 +411,8 @@ public function __construct($db)
//$this->export_examplevalues_array[$r] = array('t.field' => 'Example');
//$this->export_help_array[$r] = array('t.field' => 'FieldDescHelp');
$this->export_sql_start[$r]='SELECT DISTINCT ';
- $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'mymodule_myobject as t';
- //$this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'mymodule_myobject_line as tl ON tl.fk_myobject = t.rowid';
+ $this->export_sql_end[$r] =' FROM '.$this->db->prefix().'mymodule_myobject as t';
+ //$this->export_sql_end[$r] .=' LEFT JOIN '.$this->db->prefix().'mymodule_myobject_line as tl ON tl.fk_myobject = t.rowid';
$this->export_sql_end[$r] .=' WHERE 1 = 1';
$this->export_sql_end[$r] .=' AND t.entity IN ('.getEntity('myobject').')';
$r++; */
@@ -426,7 +426,7 @@ public function __construct($db)
$this->import_code[$r] = $this->rights_class.'_'.$r;
$this->import_label[$r] = 'MyObjectLines'; // Translation key (used only if key ExportDataset_xxx_z not found)
$this->import_icon[$r] = $this->picto;
- $this->import_tables_array[$r] = array('t' => MAIN_DB_PREFIX.'mymodule_myobject', 'extra' => MAIN_DB_PREFIX.'mymodule_myobject_extrafields');
+ $this->import_tables_array[$r] = array('t' => $this->db->prefix().'mymodule_myobject', 'extra' => $this->db->prefix().'mymodule_myobject_extrafields');
$this->import_tables_creator_array[$r] = array('t' => 'fk_user_author'); // Fields to store import user id
$import_sample = array();
$keyforclass = 'MyObject'; $keyforclassfile='/mymodule/class/myobject.class.php'; $keyforelement='myobject@mymodule';
@@ -434,7 +434,7 @@ public function __construct($db)
$import_extrafield_sample = array();
$keyforselect='myobject'; $keyforaliasextra='extra'; $keyforelement='myobject@mymodule';
include DOL_DOCUMENT_ROOT.'/core/extrafieldsinimport.inc.php';
- $this->import_fieldshidden_array[$r] = array('extra.fk_object' => 'lastrowid-'.MAIN_DB_PREFIX.'mymodule_myobject');
+ $this->import_fieldshidden_array[$r] = array('extra.fk_object' => 'lastrowid-'.$this->db->prefix().'mymodule_myobject');
$this->import_regex_array[$r] = array();
$this->import_examplevalues_array[$r] = array_merge($import_sample, $import_extrafield_sample);
$this->import_updatekeys_array[$r] = array('t.ref' => 'Ref');
@@ -512,10 +512,10 @@ public function init($options = '')
}
$sql = array_merge($sql, array(
- "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = 'standard_".strtolower($myTmpObjectKey)."' AND type = '".$this->db->escape(strtolower($myTmpObjectKey))."' AND entity = ".((int) $conf->entity),
- "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('standard_".strtolower($myTmpObjectKey)."', '".$this->db->escape(strtolower($myTmpObjectKey))."', ".((int) $conf->entity).")",
- "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = 'generic_".strtolower($myTmpObjectKey)."_odt' AND type = '".$this->db->escape(strtolower($myTmpObjectKey))."' AND entity = ".((int) $conf->entity),
- "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('generic_".strtolower($myTmpObjectKey)."_odt', '".$this->db->escape(strtolower($myTmpObjectKey))."', ".((int) $conf->entity).")"
+ "DELETE FROM ".$this->db->prefix()."document_model WHERE nom = 'standard_".strtolower($myTmpObjectKey)."' AND type = '".$this->db->escape(strtolower($myTmpObjectKey))."' AND entity = ".((int) $conf->entity),
+ "INSERT INTO ".$this->db->prefix()."document_model (nom, type, entity) VALUES('standard_".strtolower($myTmpObjectKey)."', '".$this->db->escape(strtolower($myTmpObjectKey))."', ".((int) $conf->entity).")",
+ "DELETE FROM ".$this->db->prefix()."document_model WHERE nom = 'generic_".strtolower($myTmpObjectKey)."_odt' AND type = '".$this->db->escape(strtolower($myTmpObjectKey))."' AND entity = ".((int) $conf->entity),
+ "INSERT INTO ".$this->db->prefix()."document_model (nom, type, entity) VALUES('generic_".strtolower($myTmpObjectKey)."_odt', '".$this->db->escape(strtolower($myTmpObjectKey))."', ".((int) $conf->entity).")"
));
}
}
diff --git a/htdocs/modulebuilder/template/core/modules/mymodule/mod_myobject_standard.php b/htdocs/modulebuilder/template/core/modules/mymodule/mod_myobject_standard.php
index 4d2329d8a2f85..98d9b5fbffec7 100644
--- a/htdocs/modulebuilder/template/core/modules/mymodule/mod_myobject_standard.php
+++ b/htdocs/modulebuilder/template/core/modules/mymodule/mod_myobject_standard.php
@@ -93,7 +93,7 @@ public function canBeActivated($object)
$posindice = strlen($this->prefix) + 6;
$sql = "SELECT MAX(CAST(SUBSTRING(ref FROM ".$posindice.") AS SIGNED)) as max";
- $sql .= " FROM ".MAIN_DB_PREFIX."mymodule_myobject";
+ $sql .= " FROM ".$db->prefix()."mymodule_myobject";
$sql .= " WHERE ref LIKE '".$db->escape($this->prefix)."____-%'";
if ($object->ismultientitymanaged == 1) {
$sql .= " AND entity = ".$conf->entity;
@@ -131,7 +131,7 @@ public function getNextValue($object)
// first we get the max value
$posindice = strlen($this->prefix) + 6;
$sql = "SELECT MAX(CAST(SUBSTRING(ref FROM ".$posindice.") AS SIGNED)) as max";
- $sql .= " FROM ".MAIN_DB_PREFIX."mymodule_myobject";
+ $sql .= " FROM ".$db->prefix()."mymodule_myobject";
$sql .= " WHERE ref LIKE '".$db->escape($this->prefix)."____-%'";
if ($object->ismultientitymanaged == 1) {
$sql .= " AND entity = ".$conf->entity;
diff --git a/htdocs/modulebuilder/template/mymoduleindex.php b/htdocs/modulebuilder/template/mymoduleindex.php
index 8ac978ddfa6fb..892231a8f01dc 100644
--- a/htdocs/modulebuilder/template/mymoduleindex.php
+++ b/htdocs/modulebuilder/template/mymoduleindex.php
@@ -132,8 +132,8 @@
$sql = "SELECT c.rowid, c.ref, c.ref_client, c.total_ht, c.tva as total_tva, c.total_ttc, s.rowid as socid, s.nom as name, s.client, s.canvas";
$sql.= ", s.code_client";
- $sql.= " FROM ".MAIN_DB_PREFIX."commande as c";
- $sql.= ", ".MAIN_DB_PREFIX."societe as s";
+ $sql.= " FROM ".$db->prefix()."commande as c";
+ $sql.= ", ".$db->prefix()."societe as s";
$sql.= " WHERE c.fk_soc = s.rowid";
$sql.= " AND c.fk_statut = 0";
$sql.= " AND c.entity IN (".getEntity('commande').")";
@@ -204,7 +204,7 @@
// Last modified myobject
if (isModEnabled('mymodule') && $user->hasRight('mymodule', 'read')) {
$sql = "SELECT s.rowid, s.ref, s.label, s.date_creation, s.tms";
- $sql.= " FROM ".MAIN_DB_PREFIX."mymodule_myobject as s";
+ $sql.= " FROM ".$db->prefix()."mymodule_myobject as s";
$sql.= " WHERE s.entity IN (".getEntity($myobjectstatic->element).")";
//if ($socid) $sql.= " AND s.rowid = $socid";
$sql .= " ORDER BY s.tms DESC";
diff --git a/htdocs/modulebuilder/template/myobject_list.php b/htdocs/modulebuilder/template/myobject_list.php
index 864ad8adf9d04..85bf290801a42 100644
--- a/htdocs/modulebuilder/template/myobject_list.php
+++ b/htdocs/modulebuilder/template/myobject_list.php
@@ -317,10 +317,10 @@
$sqlfields = $sql; // $sql fields to remove for count total
-$sql .= " FROM ".MAIN_DB_PREFIX.$object->table_element." as t";
-//$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."anothertable as rc ON rc.parent = t.rowid";
+$sql .= " FROM ".$db->prefix().$object->table_element." as t";
+//$sql .= " LEFT JOIN ".$db->prefix()."anothertable as rc ON rc.parent = t.rowid";
if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
- $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (t.rowid = ef.fk_object)";
+ $sql .= " LEFT JOIN ".$db->prefix().$object->table_element."_extrafields as ef on (t.rowid = ef.fk_object)";
}
// Add table from hooks
$parameters = array();
@@ -378,9 +378,9 @@
// Search on sale representative
if ($search_sale && $search_sale != '-1') {
if ($search_sale == -2) {
- $sql .= " AND NOT EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = t.fk_soc)";
+ $sql .= " AND NOT EXISTS (SELECT sc.fk_soc FROM ".$db->prefix()."societe_commerciaux as sc WHERE sc.fk_soc = t.fk_soc)";
} elseif ($search_sale > 0) {
- $sql .= " AND EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = t.fk_soc AND sc.fk_user = ".((int) $search_sale).")";
+ $sql .= " AND EXISTS (SELECT sc.fk_soc FROM ".$db->prefix()."societe_commerciaux as sc WHERE sc.fk_soc = t.fk_soc AND sc.fk_user = ".((int) $search_sale).")";
}
}
// Search on socid
diff --git a/htdocs/modulebuilder/template/scripts/mymodule.php b/htdocs/modulebuilder/template/scripts/mymodule.php
index 24978ec7f1560..8b19deb0a5e57 100644
--- a/htdocs/modulebuilder/template/scripts/mymodule.php
+++ b/htdocs/modulebuilder/template/scripts/mymodule.php
@@ -184,7 +184,7 @@
// An example of a direct SQL read without using the fetch method
/*
$sql = "SELECT field1, field2";
-$sql.= " FROM ".MAIN_DB_PREFIX."myobject";
+$sql.= " FROM ".$db->prefix()."myobject";
$sql.= " WHERE field3 = 'xxx'";
$sql.= " ORDER BY field1 ASC";
diff --git a/htdocs/product/inventory/class/inventory.class.php b/htdocs/product/inventory/class/inventory.class.php
index be7b8398f46c8..6add004e1880d 100644
--- a/htdocs/product/inventory/class/inventory.class.php
+++ b/htdocs/product/inventory/class/inventory.class.php
@@ -270,7 +270,7 @@ public function validate(User $user, $notrigger = 0, $include_sub_warehouse = 0)
// Scan existing stock to prefill the inventory
$sql = "SELECT ps.rowid, ps.fk_entrepot as fk_warehouse, ps.fk_product, ps.reel,";
if (isModEnabled('productbatch')) {
- $sql .= " pb.batch as batch, pb.qty as qty,";
+ $sql .= " COALESCE(pb.batch, '') as batch, pb.qty as qty,";
} else {
$sql .= " '' as batch, 0 as qty,";
}
diff --git a/htdocs/reception/card.php b/htdocs/reception/card.php
index 04ab04f8332ad..f827643d2ea00 100644
--- a/htdocs/reception/card.php
+++ b/htdocs/reception/card.php
@@ -982,7 +982,7 @@
include_once DOL_DOCUMENT_ROOT.'/core/modules/reception/modules_reception.php';
$list = ModelePdfReception::liste_modeles($db);
- if (is_countable($list) && count($list) > 1) {
+ if (is_array($list) && count($list) > 1) {
print "".$langs->trans("DefaultModel")." ";
print '';
print $form->selectarray('model', $list, getDolGlobalString('RECEPTION_ADDON_PDF'));
diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php
index 1d7278399d1ce..fa785fc230c63 100644
--- a/htdocs/societe/class/societe.class.php
+++ b/htdocs/societe/class/societe.class.php
@@ -1440,6 +1440,9 @@ public function update($id, User $user, $call_trigger = 1, $allowmodcodeclient =
if (empty($id)) {
$id = $this->id;
}
+ if (empty($this->country_id) && !empty($this->country_code)) {
+ $this->country_id = dol_getIdFromCode($this->db, $this->country_code, 'c_country', 'code', 'rowid');
+ }
$error = 0;
diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php
index ab2571bfcfba1..ec7e8ba23a529 100644
--- a/htdocs/societe/list.php
+++ b/htdocs/societe/list.php
@@ -319,8 +319,9 @@
's.fk_prospectlevel' => array('label' => "ProspectLevel", 'position' => 62, 'checked' => $checkprospectlevel),
's.fk_stcomm' => array('label' => "StatusProsp", 'position' => 63, 'checked' => $checkstcomm),
's2.nom' => array('label' => 'ParentCompany', 'position' => 64, 'checked' => 0),
- 's.datec' => array('label' => "DateCreation", 'checked' => 0, 'position' => 500),
- 's.tms' => array('label' => "DateModificationShort", 'checked' => 0, 'position' => 500),
+ 's.ip' => array('type'=>'ip', 'label' => "IPAddress", 'checked' => -2, 'position' => 500),
+ 's.datec' => array('label' => "DateCreation", 'checked' => 0, 'position' => 501),
+ 's.tms' => array('label' => "DateModificationShort", 'checked' => 0, 'position' => 505),
's.note_public' => array('label' => 'NotePublic', 'checked' => 0, 'position' => 520, 'enabled' => (!getDolGlobalInt('MAIN_LIST_HIDE_PUBLIC_NOTES'))),
's.note_private' => array('label' => 'NotePrivate', 'checked' => 0, 'position' => 521, 'enabled' => (!getDolGlobalInt('MAIN_LIST_HIDE_PRIVATE_NOTES'))),
's.status' => array('label' => "Status", 'checked' => 1, 'position' => 1000),
@@ -569,7 +570,7 @@
$sql .= " s.entity,";
$sql .= " st.libelle as stcomm, st.picto as stcomm_picto, s.fk_stcomm as stcomm_id, s.fk_prospectlevel, s.prefix_comm, s.client, s.fournisseur, s.canvas, s.status as status, s.note_private, s.note_public,";
$sql .= " s.email, s.phone, s.phone_mobile, s.fax, s.url, s.siren as idprof1, s.siret as idprof2, s.ape as idprof3, s.idprof4 as idprof4, s.idprof5 as idprof5, s.idprof6 as idprof6, s.tva_intra, s.fk_pays,";
-$sql .= " s.tms as date_modification, s.datec as date_creation, s.import_key,";
+$sql .= " s.ip, s.tms as date_modification, s.datec as date_creation, s.import_key,";
$sql .= " s.code_compta, s.code_compta_fournisseur, s.parent as fk_parent,s.price_level,";
$sql .= " s2.nom as name2,";
$sql .= " typent.code as typent_code,";
@@ -1556,6 +1557,11 @@
$parameters = array('arrayfields' => $arrayfields);
$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
+// IP address
+if (!empty($arrayfields['s.ip']['checked'])) {
+ print ' ';
+ print ' ';
+}
// Creation date
if (!empty($arrayfields['s.datec']['checked'])) {
print '';
@@ -1773,6 +1779,12 @@
$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder);
$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
+// IP Address
+if (!empty($arrayfields['s.ip']['checked'])) {
+ print_liste_field_titre($arrayfields['s.ip']['label'], $_SERVER["PHP_SELF"], "s.ip", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
+ $totalarray['nbfield']++; // For the column action
+}
+// Date creation
if (!empty($arrayfields['s.datec']['checked'])) {
print_liste_field_titre($arrayfields['s.datec']['label'], $_SERVER["PHP_SELF"], "s.datec", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
$totalarray['nbfield']++; // For the column action
@@ -1845,6 +1857,8 @@
$companystatic->tva_intra = $obj->tva_intra;
$companystatic->country_code = $obj->country_code;
+ $companystatic->ip = $obj->ip;
+
$companystatic->code_compta_client = $obj->code_compta;
$companystatic->code_compta_fournisseur = $obj->code_compta_fournisseur;
$companystatic->note_public = $obj->note_public;
@@ -2227,6 +2241,15 @@
$parameters = array('arrayfields' => $arrayfields, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
$reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
+ // IP
+ if (!empty($arrayfields['s.ip']['checked'])) {
+ print ' ';
+ print dol_print_ip($obj->ip);
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
// Date creation
if (!empty($arrayfields['s.datec']['checked'])) {
print '';
diff --git a/htdocs/theme/dolistore_logo.jpg b/htdocs/theme/dolistore_logo.jpg
index 850ed55de9c0e..75a38060b4278 100644
Binary files a/htdocs/theme/dolistore_logo.jpg and b/htdocs/theme/dolistore_logo.jpg differ
diff --git a/htdocs/ticket/card.php b/htdocs/ticket/card.php
index 23e9de3c80458..fce2b25fe37ab 100644
--- a/htdocs/ticket/card.php
+++ b/htdocs/ticket/card.php
@@ -431,7 +431,7 @@
// Action to add a message (private or not, with email or not).
// This may also send an email (concatenated with email_intro and email footer if checkbox was selected)
if ($action == 'add_message' && GETPOSTISSET('btn_add_message') && $permissiontoread) {
- $ret = $object->newMessage($user, $action, (GETPOST('private_message', 'alpha') == "1" ? 1 : 0), 0);
+ $ret = $object->newMessage($user, $action, GETPOSTINT('private_message'), 0);
if ($ret > 0) {
if (!empty($backtopage)) {
diff --git a/htdocs/user/bank.php b/htdocs/user/bank.php
index c098ac3c762c4..0a9a378fb35bf 100644
--- a/htdocs/user/bank.php
+++ b/htdocs/user/bank.php
@@ -111,6 +111,8 @@
$permissiontowritehr = $user->hasRight('hrm', 'write_personal_information', 'write');
$permissiontosimpleedit = ($selfpermission || $usercanadd);
+$childids = $user->getAllChildIds(1);
+
// Ok if user->hasRight('salaries', 'readall') or user->hasRight('hrm', 'read')
//$result = restrictedArea($user, 'salaries|hrm', $object->id, 'user&user', $feature2);
$ok = false;
@@ -123,7 +125,10 @@
if ($user->hasRight('hrm', 'read')) {
$ok = true;
}
-if ($user->hasRight('expensereport', 'lire') && ($user->id == $object->id || $user->hasRight('expensereport', 'readall'))) {
+if ($user->hasRight('expensereport', 'readall') || ($user->hasRight('expensereport', 'readall') && in_array($object->id, $childids))) {
+ $ok = true;
+}
+if ($user->hasRight('holiday', 'readall') || ($user->hasRight('holiday', 'read') && in_array($object->id, $childids))) {
$ok = true;
}
if (!$ok) {
@@ -304,8 +309,6 @@
$form = new Form($db);
$formcompany = new FormCompany($db);
-$childids = $user->getAllChildIds(1);
-
$person_name = !empty($object->firstname) ? $object->lastname.", ".$object->firstname : $object->lastname;
$title = $person_name." - ".$langs->trans('BankAccounts');
$help_url = '';
diff --git a/test/phpunit/AllTests.php b/test/phpunit/AllTests.php
index ae5b2c0359574..e819ee4e73878 100644
--- a/test/phpunit/AllTests.php
+++ b/test/phpunit/AllTests.php
@@ -49,7 +49,7 @@
print "Error: Default language for company to run tests must be set to en_US or auto. Current is ".$langs->defaultlang."\n";
exit(1);
}
-if (!isModEnabled('adherent')) {
+if (!isModEnabled('member')) {
print "Error: Module member must be enabled to have significant results.\n";
exit(1);
}
diff --git a/test/phpunit/SocieteTest.php b/test/phpunit/SocieteTest.php
index eecefc38f23d4..79f40128c59eb 100644
--- a/test/phpunit/SocieteTest.php
+++ b/test/phpunit/SocieteTest.php
@@ -95,7 +95,12 @@ public function testSocieteCreate()
$localobject = new Societe($db);
$localobject->initAsSpecimen();
+
+ $localobject->country_id = 0;
+ $localobject->country_code = 'ES';
+
$result = $localobject->create($user);
+ var_dump($localobject);exit;
print __METHOD__." result=".$result."\n";
$this->assertLessThanOrEqual($result, 0);