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 ''; print ''; print ''; 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 ''; +} // Date creation if (!empty($arrayfields['p.datec']['checked'])) { print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Date creation if (!empty($arrayfields['p.datec']['checked'])) { print ''; 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('/&#x?[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 "
"; print ''; +} // Creation date if (!empty($arrayfields['s.datec']['checked'])) { print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } // Date creation if (!empty($arrayfields['s.datec']['checked'])) { print '
'.$langs->trans("BoxTitleLastModifiedDonations", $max); - print '...'; + print '...'; print ''.$langs->trans("AmountTTC").''.$langs->trans("DateModificationShort").''; + 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 ''; 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 .= '
".$langs->trans("DefaultModel")."'; 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 ''; @@ -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 ''; 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);