Merge branch 'develop' of git@github.com:Dolibarr/dolibarr.git into develop

This commit is contained in:
Laurent Destailleur 2026-06-28 17:24:23 +02:00
commit b233176b72
77 changed files with 291 additions and 277 deletions

View file

@ -9,7 +9,7 @@
* Copyright (C) 2022 Lionel Vessiller <lvessiller@open-dsi.fr>
* Copyright (C) 2013-2017 Olivier Geffroy <jeff@jeffinfo.com>
* Copyright (C) 2017 Elarifr. Ari Elbaz <github@accedinfo.com>
* Copyright (C) 2017-2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2017-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2017 André Schild <a.schild@aarboard.ch>
* Copyright (C) 2020 Guillaume Alexandre <guillaume@tag-info.fr>
* Copyright (C) 2022 Joachim Kueter <jkueter@gmx.de>
@ -2242,7 +2242,7 @@ class AccountancyExport
foreach ($objectLines as $line) {
// TYPE C
if ($last_codeinvoice != $line->doc_ref) {
//recherche societe en fonction de son code client
//search company by customer code
$sql = "SELECT code_client, fk_forme_juridique, nom, address, zip, town, fk_pays, phone, siret FROM ".MAIN_DB_PREFIX."societe";
$sql .= " WHERE code_client = '".$this->db->escape($line->thirdparty_code)."'";
$resql = $this->db->query($sql);
@ -2662,22 +2662,22 @@ class AccountancyExport
} else {
$tab[] = substr(length_accountg($line->numero_compte), 0, 15);
}
//Libellé Auto
//Auto label
$tab[] = "";
//print '"'.dol_trunc(str_replace('"', '', $line->label_operation),40,'right','UTF-8',1).'"';
//Libellé manual
//Manual label
$tab[] = dol_trunc(str_replace('"', '', $invoice_ref . (!empty($company_name) ? ' - ' : '') . $company_name), 40, 'right', 'UTF-8', 1);
//Numéro de pièce
//Document number
$tab[] = dol_trunc(str_replace('"', '', (string) $line->piece_num), 10, 'right', 'UTF-8', 1);
//Devise
//Currency
$tab[] = 'EUR';
//Amount
$tab[] = price2num(abs($line->debit - $line->credit));
//Sens
//Direction
$tab[] = $line->sens;
//Code lettrage
//Matching code
$tab[] = "";
//Date Echéance
//Due date
$tab[] = $date_echeance;
$output = implode($separator, $tab).$end_line;
@ -2768,10 +2768,10 @@ class AccountancyExport
// Convert the UTF-8 string in latin9
$tab[] = mb_convert_encoding(str_replace(' - Compte auxiliaire', '', $line->label_operation), "Windows-1252", 'UTF-8');
//Calcul de la longueur des numéros de comptes
//Calculate account number length
$taille_numero = strlen(length_accountg($line->numero_compte));
//Création du numéro de client et fournisseur générique
//Build generic customer and supplier account number
$numero_cpt_client = '411';
$numero_cpt_fourn = '401';
for ($i = 1; $i <= ($taille_numero - 3); $i++) {
@ -2779,7 +2779,7 @@ class AccountancyExport
$numero_cpt_fourn .= '0';
}
//Création des comptes auxiliaire des clients et fournisseur
//Build auxiliary accounts for customers and suppliers
if (length_accountg($line->numero_compte) == $numero_cpt_client || length_accountg($line->numero_compte) == $numero_cpt_fourn) {
$tab[] = rtrim(length_accounta($line->subledger_account), "0");
} else {

View file

@ -3,7 +3,7 @@
* Copyright (C) 2009-2012 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2013 Juanjo Menent <jmenent@2byte.es>
* Copyright (C) 2016 Jonathan TISSEAU <jonathan.tisseau@86dev.fr>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -74,7 +74,7 @@ if (preg_match('/^mac/i', PHP_OS)) {
}
//$wikihelp = 'EN:Setup_EMails|FR:Paramétrage_EMails|ES:Configuración_EMails';
//$wikihelp = 'EN:Setup_EMails|FR:Parametrage_EMails|ES:Configuracion_EMails';
$wikihelp = '';
llxHeader('', $langs->trans("Setup"), $wikihelp, '', 0, 0, '', '', '', 'mod-admin page-mails_ingoing');

View file

@ -8,7 +8,7 @@
* Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr>
* Copyright (C) 2015 Raphaël Doursenaud <rdoursenaud@gpcsolutions.fr>
* Copyright (C) 2018 Nicolas ZABOURI <info@inovea-conseil.com>
* Copyright (C) 2021-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2021-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2026 Charlene Benke <charlene@patas-monkey.com>
*
@ -1663,7 +1663,7 @@ if ($mode == 'deploy') {
});
});
</script>'."\n";
// MAX_FILE_SIZE doit précéder le champ input de type file
// MAX_FILE_SIZE must come before the file input field
print '<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).'">';
}

View file

@ -4,7 +4,7 @@
* Copyright (C) 2012 J. Fernando Lagrange <fernando@demo-tic.org>
* Copyright (C) 2015 Raphaël Doursenaud <rdoursenaud@gpcsolutions.fr>
* Copyright (C) 2023 Eric Seigne <eric.seigne@cap-rel.fr>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -118,7 +118,7 @@ if (empty($instructions)) {
print dolPrintHTML($generatedContent); // Note that common HTML tags are NOT escaped (but a sanitization is done)
} else {
// We must not use dolPrintText because dolPrintText format data including accent in htmlentities for a HTML output. We need a non formatted output.
//print dol_string_onlythesehtmltags('"Ça va" est une expression française et ceci une balise <a> html', 1, 1, 1);
//print dol_string_onlythesehtmltags('"How are you" is a French expression and this is an HTML <a> tag', 1, 1, 1);
print dol_string_onlythesehtmltags($generatedContent, 1, 1, 1);
//print dol_string_nohtmltag($generatedContent);
}
@ -134,7 +134,7 @@ if (empty($instructions)) {
print dolPrintHTML($generatedContent);
} else {
// We must not use dolPrintText because dolPrintText format data including accent in htmlentities for a HTML output. We need a non formatted output.
//print dol_string_onlythesehtmltags('"Ça va" est une expression française et ceci une balise <a> html', 1, 1, 1);
//print dol_string_onlythesehtmltags('"How are you" is a French expression and this is an HTML <a> tag', 1, 1, 1);
print dol_string_onlythesehtmltags($generatedContent, 1, 1, 1);
}
}

View file

@ -1,6 +1,7 @@
<?php
/* Copyright (C) 2026 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2026 Nick Fragoulis
* Copyright (C) 2026 Frédéric France <frederic.france@free.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -659,7 +660,7 @@ class ToolProducts extends McpTool
*
* @param float $virtual_stock Current virtual stock (Physical + Incoming - Outgoing).
* @param float $min_stock_alert Minimum stock alert level (Seuil alerte).
* @param float $desired_stock Desired stock level (Stock désiré).
* @param float $desired_stock Desired stock level.
* @param float $dailyBurnRate Estimated daily consumption rate.
*
* @return array{action: string, urgency: string, suggested_qty: int, reason: string}

View file

@ -6,7 +6,7 @@
* Copyright (C) 2012 Juanjo Menent <jmenent@2byte.es>
* Copyright (C) 2013 Christophe Battarel <christophe.battarel@altairis.fr>
* Copyright (C) 2013 Cédric Salvado <csalvador@gpcsolutions.fr>
* Copyright (C) 2015-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2015-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2015 Marcos García <marcosgdf@gmail.com>
* Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr>
* Copyright (C) 2016-2023 Ferran Marcet <fmarcet@2byte.es>
@ -3013,7 +3013,7 @@ while ($i < $imaxinloop) {
print '</a>';
if (!empty($shippableInfos['warning'])) {
// On ne remonte plus le détail textwarning, mais on garde l’icône d’avertissement
// We no longer show the textwarning detail, but we keep the warning icon
print $form->textwithtooltip('', $langs->trans("NotEnoughForAllOrders"), 2, 1, img_picto('', 'error', '', 0, 0, 0, '', '2'), '', 2);
}
}

View file

@ -190,7 +190,7 @@ if (empty($user->socid)) {
$checkedtypetiers = 0;
$arrayfields = array(
// Détail commande
// Order detail
'rowid' => array('label' => 'LineID', 'checked' => '-1', 'position' => 1, 'enabled' => '1'),
'c.ref' => array('label' => "RefOrder", 'checked' => '1', 'position' => 5),
'pr.ref' => array('label' => 'ProductRef', 'checked' => '1', 'position' => 6),
@ -754,7 +754,7 @@ if ($resql) {
if ($search_id) {
$param .= '&search_id='.urlencode($search_id);
}
// Détail commande
// Order detail
if ($search_refProduct) {
$param .= '&search_refProduct='.urlencode($search_refProduct);
}
@ -1511,7 +1511,7 @@ if ($resql) {
$total_margin = 0;
// Détail commande
// Order detail
$totalqty = 0;
$oldref = null;

View file

@ -288,7 +288,7 @@ if ($result < 0) {
$error++;
setEventMessages($langs->trans("ErrorFailedToCreateDir"), null, 'errors');
} else {
// Calcul de $min et $max
// Calculate $min and $max
$sql = "SELECT MIN(b.datev) as min, MAX(b.datev) as max";
$sql .= " FROM ".MAIN_DB_PREFIX."bank as b";
$sql .= ", ".MAIN_DB_PREFIX."bank_account as ba";
@ -311,7 +311,7 @@ if ($result < 0) {
}
// CRED PART
// Chargement du tableau des années
// Load the year array
$tblyear = array();
'@phan-var-force array<array<string,int|float>> $tblyear';
$tblyear[0] = array();
@ -347,7 +347,7 @@ if ($result < 0) {
dol_print_error($db);
}
}
// Chargement de labels et data_xxx pour tableau 4 Movements
// Load labels and data_xxx for the 4 Movements chart
$labels = array();
$data_year_0 = array();
$data_year_1 = array();
@ -396,7 +396,7 @@ if ($result < 0) {
unset($tblyear[2]);
// DEDBT PART
// Chargement du tableau des années
// Load the year array
$tblyear[0] = array();
$tblyear[1] = array();
$tblyear[2] = array();
@ -431,7 +431,7 @@ if ($result < 0) {
}
}
// Chargement de labels et data_xxx pour tableau 4 Movements
// Load labels and data_xxx for the 4 Movements chart
$labels = array();
$data_year_0 = array();
$data_year_1 = array();

View file

@ -112,7 +112,7 @@ if ($result < 0) {
$error++;
setEventMessages($langs->trans("ErrorFailedToCreateDir"), null, 'errors');
} else {
// Calcul $min and $max
// Calculate $min and $max
$sql = "SELECT MIN(b.datev) as min, MAX(b.datev) as max";
$sql .= " FROM ".MAIN_DB_PREFIX."bank as b";
$sql .= ", ".MAIN_DB_PREFIX."bank_account as ba";
@ -470,7 +470,7 @@ if ($result < 0) {
dol_print_error($db);
}
// Calcul de $solde avant le debut du graphe
// Calculate $solde before the start of the graph
$solde = 0;
// Loading labels and datas for dashboard 3
@ -561,7 +561,7 @@ if ($result < 0) {
// Graph input/output - Credit/Debit for the month
if ($mode == 'standard') {
// Chargement du tableau $credits, $debits
// Load the $credits, $debits arrays
$credits = array();
$debits = array();
@ -682,7 +682,7 @@ if ($result < 0) {
// Tableau 4b - Credit/Debit
if ($mode == 'standard') {
// Chargement du tableau $credits, $debits
// Load the $credits, $debits arrays
$credits = array();
$debits = array();
$sql = "SELECT date_format(b.datev,'%m')";

View file

@ -6,7 +6,7 @@
* Copyright (C) 2017 Patrick Delcroix <pmpdelcroix@gmail.com>
* Copyright (C) 2019 Nicolas ZABOURI <info@inovea-conseil.com>
* Copyright (C) 2022 Alexandre Spangaro <aspangaro@open-dsi.fr>
* Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or modify
@ -481,7 +481,7 @@ if (empty($numref)) {
print '<td>&nbsp;</td>';
print "</tr>\n";
// Calcul du solde de depart du releve
// Calculate the opening balance of the statement
$sql = "SELECT sum(b.amount) as amount";
$sql .= " FROM ".MAIN_DB_PREFIX."bank as b";
$sql .= " WHERE b.num_releve < '".$db->escape($numref)."'";

View file

@ -1191,7 +1191,7 @@ if (empty($reshook)) {
$discount->multicurrency_total_tva = -((float) $multicurrency_amount_tva[$tva_tx]);
$discount->multicurrency_total_ttc = -((float) $multicurrency_amount_ttc[$tva_tx]);
} else {
//We keep the absolute value to be consistent with the function used to create the discount in case of deposit in the “create” function of the Payment class
//We keep the absolute value to be consistent with the function used to create the discount in case of deposit in the "create" function of the Payment class
$discount->amount_ht = abs((float) $amount_ht[$tva_tx]);
$discount->amount_tva = abs((float) $amount_tva[$tva_tx]);
$discount->amount_ttc = abs((float) $amount_ttc[$tva_tx]);
@ -3494,7 +3494,7 @@ if (empty($reshook)) {
// Change each progression percent on each lines
foreach ($object->lines as $line) {
// no traitement for special product
// no processing for special product
if ($line->product_type == 9) {
continue;
}
@ -4788,7 +4788,7 @@ if ($action == 'create') {
// TODO for compatibility
if ($origin == 'contrat') {
'@phan-var-force Contrat $objectsrc';
// Calcul contrat->price (HT), contrat->total (TTC), contrat->tva
// Recalculate contrat->price (excl. VAT), contrat->total (incl. VAT), contrat->tva
$objectsrc->update_price(1, 'auto', 1);
}
@ -5578,7 +5578,7 @@ if ($action == 'create') {
if (getDolGlobalString('INVOICE_POINTOFTAX_DATE')) {
// Date invoice point of tax (Leistungsdatum / service date for tax).
// Only editable while the invoice is a draft — once validated, the
// Only editable while the invoice is a draft -- once validated, the
// invoice is a legally issued document and date_pointoftax is the
// basis for the VAT-return period assignment under accrual taxation
// (Soll-Versteuerung). To correct, set the invoice back to draft or

View file

@ -5,7 +5,7 @@
* Copyright (C) 2012 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2011-2025 Alexandre spangaro <aspangaro@open-dsi.fr>
* Copyright (C) 2013 Marcos García <marcosgdf@gmail.com>
* Copyright (C) 2018-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2018-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or modify
@ -166,7 +166,7 @@ if ($result) {
$i = 0;
while ($i < $num) {
$obj = $db->fetch_object($result);
// contrôles
// checks
$compta_soc = (($obj->code_compta_fournisseur != "") ? $obj->code_compta_fournisseur : $cptfour);
$compta_prod = $obj->accountancy_code_buy;
if (empty($compta_prod)) {

View file

@ -4,7 +4,7 @@
* Copyright (C) 2005-2009 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2011-2016 Juanjo Menent <jmenent@2byte.es>
* Copyright (C) 2015 Marcos García <marcosgdf@gmail.com>
* Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or modify
@ -680,9 +680,9 @@ class RemiseCheque extends CommonObject
}
/**
* Mets a jour le montant total
* Update the total amount
*
* @return int 0 en cas de success
* @return int 0 on success
*/
public function updateAmount()
{

View file

@ -2,7 +2,7 @@
/* Copyright (C) 2002 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004-2007 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2022 Alexandre Spangaro <aspangaro@open-dsi.fr>
* Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or modify
@ -242,7 +242,7 @@ class PaymentSocialContribution extends CommonObject
if ($resql) {
$this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."paiementcharge");
// Insere tableau des montants / factures
// Insert amounts / invoices array
foreach ($this->amounts as $key => $amount) {
$contribid = $key;
if (is_numeric($amount) && $amount != 0) {

View file

@ -4,7 +4,7 @@
* Copyright (C) 2012-2023 Charlene BENKE <charlene@patas-monkey.com>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
* Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -188,7 +188,7 @@ print '<td align="center" nowrap >'.$langs->trans("DateEnd").'</td>';
print '<td align="right">'.$langs->trans("Progress").'</td>';
print '<td align="right" width="100">'.$langs->trans("Status").'</td>';
print '</tr>';
// on récupère la totalité des tickets liés au contrat
// retrieve all tickets linked to the contract
$allticketarray = $object->getTicketsArray();
if (is_array($allticketarray) && count($allticketarray) > 0) {
foreach ($allticketarray as $key => $value) {

View file

@ -1,6 +1,6 @@
<?php
/* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024 William Mead <william.mead@manchenumerique.fr>
*
* This program is free software; you can redistribute it and/or modify
@ -724,7 +724,7 @@ if ($action == "importSignature") {
}
foreach ($dirmodels as $reldir) {
$file = "pdf_" . $last_modelpdf . ".modules.php";
// On vérifie l'emplacement du modele
// Check the template location
$file = dol_buildpath($reldir . $modelpath . $file, 0);
if (file_exists($file)) {
$filefound = $file;

View file

@ -2,7 +2,7 @@
/* Copyright (C) 2003-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004-2010 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005-2009 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2015-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2015-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or modify
@ -22,7 +22,7 @@
/**
* \file htdocs/core/boxes/box_clients.php
* \ingroup invoice
* \brief Module d'affichage pour les encours dépassés
* \brief Display module for exceeded outstanding amounts
*/
include_once DOL_DOCUMENT_ROOT.'/core/boxes/modules_boxes.php';

View file

@ -1,7 +1,7 @@
<?php
/* Copyright (C) 2004-2009 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005-2009 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2015-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2015-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or modify
@ -218,7 +218,7 @@ class box_factures_fourn_imp extends ModeleBoxes
$objp = $this->db->fetch_object($result);
$totalamount = $objp->total_ht;
// Add the sum à the bottom of the boxes
// Add the sum to the bottom of the boxes
$this->info_box_contents[$line][] = array(
'tr' => 'class="liste_total_wrap"',
'td' => 'class="liste_total"',

View file

@ -2,7 +2,7 @@
/* Copyright (C) 2003-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004-2007 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005-2009 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2015-2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2015-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
*
@ -233,7 +233,7 @@ class box_factures_imp extends ModeleBoxes
$objp = $this->db->fetch_object($result);
$totalamount = $objp->total_ht;
// Add the sum à the bottom of the boxes
// Add the sum to the bottom of the boxes
$this->info_box_contents[$line][] = array(
'tr' => 'class="liste_total"',
'td' => 'class="liste_total"',

View file

@ -1,7 +1,7 @@
<?php
/* Copyright (C) 2012-2014 Charles-François BENKE <charles.fr@benke.fr>
* Copyright (C) 2014 Marcos García <marcosgdf@gmail.com>
* Copyright (C) 2015-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2015-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2016 Juan José Menent <jmenent@2byte.es>
* Copyright (C) 2020 Pierre Ardoin <mapiolca@me.com>
* Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
@ -183,7 +183,7 @@ class box_project extends ModeleBoxes
}
if ($num > 0) {
// Add the sum à the bottom of the boxes
// Add the sum to the bottom of the boxes
$this->info_box_contents[$i][] = array(
'tr' => 'class="liste_total_wrap"',
'td' => 'class="liste_total"',

View file

@ -1,7 +1,7 @@
<?php
/* Copyright (C) 2012-2014 Charles-François BENKE <charles.fr@benke.fr>
* Copyright (C) 2014 Marcos García <marcosgdf@gmail.com>
* Copyright (C) 2015-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2015-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2016 Juan José Menent <jmenent@2byte.es>
* Copyright (C) 2020 Pierre Ardoin <mapiolca@me.com>
* Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
@ -168,7 +168,7 @@ class box_project_opportunities extends ModeleBoxes
}
if ($num > 0) {
// Add the sum à the bottom of the boxes
// Add the sum to the bottom of the boxes
$this->info_box_contents[$i][] = array(
'tr' => 'class="liste_total_wrap"',
'td' => 'class="liste_total"',

View file

@ -2364,13 +2364,13 @@ abstract class CommonInvoice extends CommonObject
$complementaryinfo = '';
/*
Example: //S1/10/10201409/11/190512/20/1400.000-53/30/106017086/31/180508/32/7.7/40/2:10;0:30
/10/ Numéro de facture – 10201409
/11/ Date de facture – 12.05.2019
/20/ Référence client – 1400.000-53
/30/ Numéro IDE pour la TVA – CHE-106.017.086 TVA
/31/ Date de la prestation pour la comptabilisation de la TVA – 08.05.2018
/32/ Taux de TVA sur le montant total de la facture – 7.7%
/40/ Conditions – 2% d’escompte à 10 jours, paiement net à 30 jours
/10/ Invoice number -- 10201409
/11/ Invoice date -- 12.05.2019
/20/ Customer reference -- 1400.000-53
/30/ VAT IDE number -- CHE-106.017.086 TVA
/31/ Service date for VAT accounting -- 08.05.2018
/32/ VAT rate on total invoice amount -- 7.7%
/40/ Terms -- 2% discount at 10 days, net payment at 30 days
*/
$datestring = dol_print_date($this->date, '%y%m%d');
//$pricewithtaxstring = price($this->total_ttc, 0, $tmplang, 0, -1, 2);
@ -2391,7 +2391,7 @@ abstract class CommonInvoice extends CommonObject
$s .= "SPC\n";
$s .= "0200\n";
$s .= "1\n";
// Info Seller ("Compte / Payable à")
// Info Seller ("Account / Payable to")
if ($this->fk_account > 0) {
// Bank BAN if country is LI or CH. TODO Add a test to check than IBAN start with CH or LI
$bankaccount->fetch($this->fk_account);
@ -2420,7 +2420,7 @@ abstract class CommonInvoice extends CommonObject
$s .= dol_trunc($mysoc->town, 35, 'right', 'UTF-8', 1)."\n";
$s .= dol_trunc($mysoc->country_code, 2, 'right', 'UTF-8', 1)."\n";
}
// Final seller (Ultimate seller) ("Créancier final" = "En faveur de")
// Final seller (Ultimate seller) ("Final creditor" = "In favour of")
$s .= "\n";
$s .= "\n";
$s .= "\n";

View file

@ -1,7 +1,7 @@
<?php
/* Copyright (C) 2007-2011 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -464,13 +464,13 @@ class CUnits extends CommonDict
$value = (float) price2num($value);
$fk_unit = intval($fk_unit);
// Calcul en unité de base
// Calculate in base unit
$scaleUnitPow = $this->scaleOfUnitPow($fk_unit);
// convert to standard unit
$value *= $scaleUnitPow;
if ($fk_new_unit != 0) {
// Calcul en unité de base
// Calculate in base unit
$scaleUnitPow = $this->scaleOfUnitPow($fk_new_unit);
if (!empty($scaleUnitPow)) {
// convert to new unit

View file

@ -2,7 +2,7 @@
/* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004-2018 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2024 Alexandre Janniaux <alexandre.janniaux@gmail.com>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024 Noé Cendrier <noe.cendrier@altairis.fr>
* Copyright (C) 2026 Vincent de Grandpré <vincent@de-grandpre.quebec>
@ -1010,8 +1010,8 @@ class DiscountAbsolute extends CommonObject
}
if (empty($this->amount_ttc)) {
// Dans le cas où le montant ttc vient d'une remise scindée on le prend tel quel
// car de recalculer le montant ttc à partir du montant ht créé des erreurs de précision.
// If the total amount comes from a split discount, we take it as-is
// because recalculating the total amount from the net amount creates precision errors.
$this->amount_ttc = price2num((float) $this->amount_ht + (float) $this->amount_tva + $this->total_localtax1 + $this->total_localtax2, 'MT');
$this->multicurrency_amount_ttc = price2num(((float) $this->amount_ht + (float) $this->amount_tva + $this->total_localtax1 + $this->total_localtax2) * (float) $this->multicurrency_tx, 'MT');
}

View file

@ -1,7 +1,7 @@
<?php
/* Copyright (c) 2015-2019 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -123,7 +123,7 @@ class FormMargin
// calcul des marges
if (isset($line->fk_remise_except) && isset($conf->global->MARGIN_METHODE_FOR_DISCOUNT)) { // remise
if (getDolGlobalString('MARGIN_METHODE_FOR_DISCOUNT') == '1') { // remise globale considérée comme produit
if (getDolGlobalString('MARGIN_METHODE_FOR_DISCOUNT') == '1') { // global discount treated as product
$marginInfos['pa_products'] += $pa;
$marginInfos['pv_products'] += $pv;
$marginInfos['pa_total'] += $pa;
@ -135,7 +135,7 @@ class FormMargin
//}
//else
$marginInfos['margin_on_products'] += $pv - $pa;
} elseif (getDolGlobalString('MARGIN_METHODE_FOR_DISCOUNT') == '2') { // remise globale considérée comme service
} elseif (getDolGlobalString('MARGIN_METHODE_FOR_DISCOUNT') == '2') { // global discount treated as service
$marginInfos['pa_services'] += $pa;
$marginInfos['pv_services'] += $pv;
$marginInfos['pa_total'] += $pa;

View file

@ -6,7 +6,7 @@
* Copyright (C) 2005-2009 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2015 Raphaël Doursenaud <rdoursenaud@gpcsolutions.fr>
* Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -260,7 +260,7 @@ class DoliDBSqlite3 extends DoliDB
$line .= "CREATE ".(preg_match('/UNIQUE/', $reg[2]) ? 'UNIQUE ' : '')."INDEX ".$idxname." ON ".$tablename." (".$fieldlist.")";
}
if (preg_match('/ALTER\s+TABLE\s*(.*)\s*ADD\s+CONSTRAINT\s+(.*)\s*FOREIGN\s+KEY\s*\(([\w,\s]+)\)\s*REFERENCES\s+(\w+)\s*\(([\w,\s]+)\)/i', $line, $reg)) {
// Pour l'instant les contraintes ne sont pas créées
// Constraints are not yet created
dol_syslog(get_class().'::query line emptied');
$line = 'SELECT 0;';
}
@ -347,7 +347,7 @@ class DoliDBSqlite3 extends DoliDB
return false;
}
//print "Resultat fonction connect: ".$this->db;
//print "Result of connect function: ".$this->db;
return $this->db;
}
@ -417,8 +417,8 @@ class DoliDBSqlite3 extends DoliDB
// Convert MySQL syntax to SQLite syntax
$reg = array();
if (preg_match('/ALTER\s+TABLE\s*(.*)\s*ADD\s+CONSTRAINT\s+(.*)\s*FOREIGN\s+KEY\s*\(([\w,\s]+)\)\s*REFERENCES\s+(\w+)\s*\(([\w,\s]+)\)/i', $query, $reg)) {
// Ajout d'une clef étrangère à la table
// procédure de replacement de la table pour ajouter la contrainte
// Adding a foreign key to the table
// table replacement procedure to add the constraint
// Example : ALTER TABLE llx_adherent ADD CONSTRAINT adherent_fk_soc FOREIGN KEY (fk_soc) REFERENCES llx_societe (rowid)
// -> CREATE TABLE ( ... ,CONSTRAINT adherent_fk_soc FOREIGN KEY (fk_soc) REFERENCES llx_societe (rowid))
$foreignFields = $reg[5];
@ -619,8 +619,7 @@ class DoliDBSqlite3 extends DoliDB
if (preg_match("/^SELECT/i", $this->queryString)) {
return $this->num_rows($resultset);
}
// mysql necessite un link de base pour cette fonction contrairement
// a pqsql qui prend un resultset
// mysql requires a base link for this function, unlike pgsql which takes a resultset
return $this->db->changes();
}
@ -1350,8 +1349,8 @@ class DoliDBSqlite3 extends DoliDB
$result = array();
static $pragmas;
if (!isset($pragmas)) {
// Définition de la liste des pragmas utilisés qui ne retournent qu'une seule valeur
// indépendante de la base de données.
// Define the list of pragmas used that return only a single value
// independent of the database.
// cf. http://www.sqlite.org/pragma.html
$pragmas = array(
'application_id', 'auto_vacuum', 'automatic_index', 'busy_timeout', 'cache_size',
@ -1379,7 +1378,7 @@ class DoliDBSqlite3 extends DoliDB
//dol_syslog(get_class($this)."::select_db getServerParametersValues $var=". print_r($obj, true), LOG_DEBUG);
$result[$var] = $obj[0];
} else {
// TODO Récupérer le message
// TODO Retrieve the message
$result[$var] = 'FAIL';
}
}

View file

@ -1070,7 +1070,7 @@ function GETPOSTDATE($prefix, $hourTime = '', $gm = 'auto', $saverestore = '')
* 'restricthtmlallowiframe'
* 'restricthtmlallowlinkscript'
* @param int $method Type of method (0 = get then post, 1 = only get, 2 = only post, 3 = post then get)
* @param ?int $filter Filter to apply when $check is set to 'custom'. (See http://php.net/manual/en/filter.filters.php for détails)
* @param ?int $filter Filter to apply when $check is set to 'custom'. (See http://php.net/manual/en/filter.filters.php for details)
* @param mixed $options Options to pass to filter_var when $check is set to 'custom'
* @param int $noreplace Force disable of replacement of __xxx__ strings.
* @return string|array<mixed> Value found (string or array), or '' if check fails
@ -1355,7 +1355,7 @@ function GETPOST($paramname, $check = 'alphanohtml', $method = 0, $filter = null
*
* @param string|mixed[]|null $out Value to check/clear.
* @param string $check Type of check/sanitizing
* @param ?int $filter Filter to apply when $check is set to 'custom' (deprecated). (See http://php.net/manual/en/filter.filters.php for détails)
* @param ?int $filter Filter to apply when $check is set to 'custom' (deprecated). (See http://php.net/manual/en/filter.filters.php for details)
* @param ?mixed $options Options to pass to filter_var when $check is set to 'custom'
* @return string|array<mixed> Value sanitized (string or array). It may be '' if format check fails.
*/
@ -2416,7 +2416,7 @@ function dolPrintHTML($s, $allowiframe = 0, $moreallowedtags = array())
//$isAlreadyHTML = dol_textishtml($s);
// dol_htmlentitiesbr encode all chars except "'" if string is not already HTML, but
// encode only special char like é but not &, <, >, ", ' if already HTML.
// encode only special char like accented chars but not &, <, >, ", ' if already HTML.
$stringWithEntitesForSpecialChar = dol_htmlentitiesbr((string) $s);
$allowedtags = 'common';
@ -2530,7 +2530,7 @@ function dol_escape_htmltag($stringtoescape, $keepb = 0, $keepn = 0, $noescapeta
} else {
// We make a manipulation by calling the html_entity_decode() to convert content into NON HTML UTF8 string.
// Because content can be or not already HTML.
// For example, this decode &egrave; into è so string is UTF8 (but numbers entities like &#39; is not decoded).
// For example, this decode &egrave; into its UTF-8 char so string is UTF8 (but numbers entities like &#39; is not decoded).
// In a future, we should not need this
$tmp = (string) $stringtoescape;
@ -4897,7 +4897,7 @@ function dol_print_phone($phone, $countrycode = '', $contactid = 0, $socid = 0,
if (dol_strlen($phone) == 12) { //ex: +223 AB_CD_EF_GH
$newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 2) . $separ . substr($newphone, 6, 2) . $separ . substr($newphone, 8, 2) . $separ . substr($newphone, 10, 2);
}
} elseif (strtoupper($countrycode) == "TH") { //Thaïlande
} elseif (strtoupper($countrycode) == "TH") { //Thailand
if (dol_strlen($phone) == 11) { //ex: +66_ABC_DE_FGH
$newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 2) . $separ . substr($newphone, 8, 3);
} elseif (dol_strlen($phone) == 12) { //ex: +66_A_BCD_EF_GHI
@ -4928,7 +4928,7 @@ function dol_print_phone($phone, $countrycode = '', $contactid = 0, $socid = 0,
} elseif (dol_strlen($phone) == 14) { //ex: +971_ABC_DEF_GHIK
$newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 4);
}
} elseif (strtoupper($countrycode) == "DZ") { //Algérie
} elseif (strtoupper($countrycode) == "DZ") { //Algeria
if (dol_strlen($phone) == 13) { //ex: +213_ABC_DEF_GHI
$newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 3);
}
@ -4938,7 +4938,7 @@ function dol_print_phone($phone, $countrycode = '', $contactid = 0, $socid = 0,
} elseif (dol_strlen($phone) == 12) { //ex: +32_ABC_DEF_GHI
$newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 3);
}
} elseif (strtoupper($countrycode) == "PF") { //Polynésie française
} elseif (strtoupper($countrycode) == "PF") { //French Polynesia
if (dol_strlen($phone) == 12) { //ex: +689_AB_CD_EF_GH
$newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 2) . $separ . substr($newphone, 6, 2) . $separ . substr($newphone, 8, 2) . $separ . substr($newphone, 10, 2);
}
@ -4950,7 +4950,7 @@ function dol_print_phone($phone, $countrycode = '', $contactid = 0, $socid = 0,
if (dol_strlen($phone) == 12) { //ex: +962_A_BCD_EF_GH
$newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 1) . $separ . substr($newphone, 5, 3) . $separ . substr($newphone, 7, 2) . $separ . substr($newphone, 9, 2);
}
} elseif (strtoupper($countrycode) == "JM") { //Jamaïque
} elseif (strtoupper($countrycode) == "JM") { //Jamaica
if (dol_strlen($newphone) == 12) { //ex: +1867_ABC_DEFG
$newphone = substr($newphone, 0, 5) . $separ . substr($newphone, 5, 3) . $separ . substr($newphone, 8, 4);
}
@ -5516,15 +5516,15 @@ function dol_substr($string, $start, $length = null, $stringencoding = '', $trun
/**
* Truncate a string to a particular length adding '…' if string larger than length.
* If length = max length+1, we do no truncate to avoid having just 1 char replaced with '…'.
* Truncate a string to a particular length adding '...' if string larger than length.
* If length = max length+1, we do no truncate to avoid having just 1 char replaced with '...'.
* MAIN_DISABLE_TRUNC=1 can disable all truncings
*
* @param string $string String to truncate
* @param int $size Max string size visible (excluding …). 0 for no limit. WARNING: Final string size can have 3 more chars (if we added …, or if size was max+1 so it does not worse to replace with ...)
* @param int $size Max string size visible (excluding '...'). 0 for no limit. WARNING: Final string size can have 3 more chars (if we added '...', or if size was max+1 so it does not worse to replace with ...)
* @param string $trunc Where to trunc: 'right', 'left', 'middle' (size must be a 2 power), 'wrap'
* @param string $stringencoding Tell what is source string encoding
* @param int $nodot Truncation do not add … after truncation. So it's an exact truncation.
* @param int $nodot Truncation do not add '...' after truncation. So it's an exact truncation.
* @param int $display Trunc is used to display data and can be changed for small screen. TODO Remove this param (must be dealt with CSS)
* @return string Truncated string. WARNING: length is never higher than $size if $nodot is set, but can be 3 chars higher otherwise.
*/
@ -5548,7 +5548,7 @@ function dol_trunc($string, $size = 40, $trunc = 'right', $stringencoding = 'UTF
if ($trunc == 'right') {
$newstring = dol_textishtml($string) ? dol_string_nohtmltag($string, 1) : $string;
if (dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
// If nodot is 0 and size is 1 chars more, we don't trunc and don't add …
// If nodot is 0 and size is 1 chars more, we don't trunc and don't add '...'
return dol_substr($newstring, 0, $size, $stringencoding) . ($nodot ? '' : '…');
} else {
//return 'u'.$size.'-'.$newstring.'-'.dol_strlen($newstring,$stringencoding).'-'.$string;
@ -5566,7 +5566,7 @@ function dol_trunc($string, $size = 40, $trunc = 'right', $stringencoding = 'UTF
} elseif ($trunc == 'left') {
$newstring = dol_textishtml($string) ? dol_string_nohtmltag($string, 1) : $string;
if (dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
// If nodot is 0 and size is 1 chars more, we don't trunc and don't add …
// If nodot is 0 and size is 1 chars more, we don't trunc and don't add '...'
return '…' . dol_substr($newstring, dol_strlen($newstring, $stringencoding) - $size, $size, $stringencoding);
} else {
return $string;
@ -5588,7 +5588,7 @@ function dol_trunc($string, $size = 40, $trunc = 'right', $stringencoding = 'UTF
*
* @param string $key Key
* @param string $morecss Add more css to the object
* @return string Pïcto for the key
* @return string Picto for the key
*/
function getPictoForType($key, $morecss = '')
{
@ -7816,8 +7816,8 @@ function price($amount, $form = 0, $outlangs = '', $trunc = 1, $rounding = -1, $
* Default 0 if unknown.
* @return string Amount with universal numeric format (Example: '99.99999'), or error message.
* If conversion fails to return a numeric, it returns:
* - text unchanged or partial if ($rounding = ''): price2num('W9ç', '', 0) => '9ç', price2num('W9ç', '', 1) => 'W9ç', price2num('W9ç', '', 2) => '9ç'
* - '0' if ($rounding is defined): price2num('W9ç', 'MT', 0) => '9', price2num('W9ç', 'MT', 1) => '0', price2num('W9ç', 'MT', 2) => '9'
* - text unchanged or partial if ($rounding = ''): price2num('W9c', '', 0) => '9c', price2num('W9c', '', 1) => 'W9c', price2num('W9c', '', 2) => '9c'
* - '0' if ($rounding is defined): price2num('W9c', 'MT', 0) => '9', price2num('W9c', 'MT', 1) => '0', price2num('W9c', 'MT', 2) => '9'
* Note: The best way to guarantee a numeric value is to add a cast (float) before the price2num().
* If amount is null or '', it returns '' if $rounding = '', it returns '0' if $rounding is defined.
*
@ -12164,7 +12164,7 @@ function dol_eval_new($s)
];
$prohibited_token_arrangements = [
// Variable functions « $a( », « "$a"( », « 'FN_NAME'( », ('FN_NAME')()
// Variable functions "$a(", '"$a"(', "'FN_NAME'(", ('FN_NAME')()
' T_VARIABLE ( ',
' " ( ',
' \' ( ',
@ -15615,7 +15615,7 @@ function getElementProperties($elementType)
if ($reshook) {
$elementProperties = $hookmanager->resArray;
} elseif (!empty($hookmanager->resArray) && is_array($hookmanager->resArray)) { // resArray is always an array but for sécurity against misconfigured external modules
} elseif (!empty($hookmanager->resArray) && is_array($hookmanager->resArray)) { // resArray is always an array but for security against misconfigured external modules
$elementProperties = array_replace($elementProperties, $hookmanager->resArray);
}

View file

@ -7,7 +7,7 @@
* Copyright (C) 2015-2016 Raphaël Doursenaud <rdoursenaud@gpcsolutions.fr>
* Copyright (C) 2017 Juanjo Menent <jmenent@2byte.es>
* Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -921,7 +921,7 @@ function get_next_value($db, $mask, $table, $field, $where = '', $objsoc = '', $
$maskjournal_value = '';
}
// Personalized field {XXX-1} à {XXX-99}
// Personalized field {XXX-1} to {XXX-99}
$maskperso = array();
$maskpersonew = array();
$tmpmask = $mask;

View file

@ -1,7 +1,7 @@
<?php
/* Copyright (C) 2009-2010 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -651,7 +651,7 @@ function reWriteAllPermissions($file, $permissions, $key, $right, $objectname, $
// parcourir les objects
$o = 0;
foreach ($permissions as &$object) {
// récupérer la permission de l'objet
// get the object permission
$p = 1;
foreach ($object as &$obj) {
if (str_contains($obj[5], 'read')) {

View file

@ -1,6 +1,6 @@
<?php
/* Copyright (C) 2006-2011 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2022 Frédéric France <frederic.france@netlogic.fr>
* Copyright (C) 2022-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or modify
@ -104,7 +104,7 @@ function isValidSiret($siret, $lengthonly = 0)
/**
* Check the syntax validity of a Portuguese (PT) Tax Identification Number (TIN).
* (NIF = Número de Identificação Fiscal)
* (NIF = Numero de Identificacao Fiscal)
*
* @param string $str NIF to check
* @return boolean True if valid, False otherwise
@ -125,7 +125,7 @@ function isValidTinForPT($str)
/**
* Check the syntax validity of an Algerian (DZ) Tax Identification Number (TIN).
* (NIF = Numéro d'Identification Fiscale)
* (NIF = Tax Identification Number)
*
* @param string $str TIN to check
* @return boolean True if valid, False otherwise
@ -146,7 +146,7 @@ function isValidTinForDZ($str)
/**
* Check the syntax validity of a Belgium (BE) Tax Identification Number (TIN).
* (NN = Numéro National)
* (NN = National Number)
*
* @param string $str NN to check
* @return boolean True if valid, False otherwise
@ -168,9 +168,9 @@ function isValidTinForBE($str)
/**
* Check the syntax validity of a Spanish (ES) Tax Identification Number (TIN), where:
* - NIF = Número de Identificación Fiscal (used for residents only before 2008. Used for both residents and companies since 2008.)
* - CIF = Código de Identificación Fiscal (used for companies only before 2008. Replaced by NIF since 2008.)
* - NIE = Número de Identidad de Extranjero
* - NIF = Numero de Identificacion Fiscal (used for residents only before 2008. Used for both residents and companies since 2008.)
* - CIF = Codigo de Identificacion Fiscal (used for companies only before 2008. Replaced by NIF since 2008.)
* - NIE = Numero de Identidad de Extranjero
*
* @param string $str TIN to check
* @return int<-4,3> 1 if NIF ok, 2 if CIF ok, 3 if NIE ok, -1 if NIF bad, -2 if CIF bad, -3 if NIE bad, -4 if unexpected bad

View file

@ -1,6 +1,6 @@
<?php
/* Copyright (C) 2017 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or modify
@ -1422,7 +1422,7 @@ function getImageFromHtmlContent($htmlContent, $imageNumber = 1)
// Check if nb of image is valid
if ($imageNumber > 0 && $imageNumber <= $images->length) {
// Récupère l'image correspondante (index - 1 car $imageNumber est 1-based)
// Get the corresponding image (index - 1 because $imageNumber is 1-based)
$img = $images->item($imageNumber - 1);
if ($img instanceof DOMElement) {
return $img->getAttribute('src');

View file

@ -2,7 +2,7 @@
/* Copyright (C) 2015 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2015 Alexandre Spangaro <aspangaro@open-dsi.fr>
* Copyright (C) 2016-2023 Philippe Grand <philippe.grand@atoo-net.com>
* Copyright (C) 2018-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2018-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2018 Francis Appels <francis.appels@z-application.com>
* Copyright (C) 2019 Markus Welters <markus@welters.de>
* Copyright (C) 2019 Rafael Ingenleuf <ingenleuf@welters.de>
@ -676,7 +676,7 @@ class pdf_standard_expensereport extends ModeleExpenseReport
$default_font_size = pdf_getPDFFontSize($outputlangs);
/*
// ajout du fondu vert en bas de page à droite
// add green fade at bottom right of page
$image_fondue = $conf->mycompany->dir_output.'/fondu_vert_.jpg';
$pdf->Image($image_fondue,20,107,200,190);

View file

@ -1560,7 +1560,7 @@ class pdf_octopus extends ModelePDFFactures
// Show if Option VAT debit option is on also if transmitter is french
// Decret n°2099-1299 2022-10-07
// French mention : "Option pour le paiement de la taxe d'après les débits"
// French legal mention: "Option pour le paiement de la taxe d'apres les debits"
if ($this->emetteur->country_code == 'FR') {
if (getDolGlobalInt('TAX_MODE') == 1) {
$pdf->SetXY($this->marge_gauche, $posy);
@ -2747,10 +2747,10 @@ class pdf_octopus extends ModelePDFFactures
$form = new Form($db);
$tab_height -= 29; // Réduction de la hauteur global du tableau
$tab_height -= 29; // Reduce the overall table height
$displayWarranty = $this->displayRetainedWarranty($object);
if (!$displayWarranty) {
$tab_height -= 19; // Réduction de la hauteur global du tableau
$tab_height -= 19; // Reduce the overall table height
}
@ -2837,7 +2837,7 @@ class pdf_octopus extends ModelePDFFactures
}
// Output Rect
// KEEPTHIS => Affiche les bords extérieurs
// KEEPTHIS => Display outer borders
$this->printRoundedRectBtp($pdf, $this->marge_gauche, $tab_top, $this->page_largeur - $this->marge_gauche - $this->marge_droite, $tab_height, $this->corner_radius, $hidetop, $hidebottom, 'D'); // Rect prend une longueur en 3eme param et 4eme param
$pdf->line($this->posx_cumul_anterieur - 1, $tab_top, $this->posx_cumul_anterieur - 1, $tab_top + $tab_height);
@ -2942,7 +2942,7 @@ class pdf_octopus extends ModelePDFFactures
$pdf->SetXY($x, $tab_top + 8);
$pdf->MultiCell(32, 2, price($this->TDataSituation[$col]['HT'], 0, '', 1, -1, 2), '', 'R');
// Travaux supplémentaires
// Additional work
$pdf->SetXY($x, $tab_top + 12);
$pdf->MultiCell(32, 2, price($this->TDataSituation[$col]['travaux_sup'], 0, '', 1, -1, 2), '', 'R');
@ -3042,7 +3042,7 @@ class pdf_octopus extends ModelePDFFactures
$retenue_garantie = 0;
$retenue_garantie_anterieure = 0;
// Init tous les champs à 0
// Initialize all fields to 0
$TDataSituation['cumul_anterieur'] = array(
'HT' => 0, //montant HT normal
'TVA' => 0, //montant de la TVA sur le HTnet
@ -3063,7 +3063,7 @@ class pdf_octopus extends ModelePDFFactures
// Read each line to
// 1. recalculer le total_ht pour chaque taux de TVA
// 2. recalculer la TVA associée à ce montant HT
// 2. recalculate the VAT associated with this net amount
// 3. If applicable, store this information as "travaux_sup" (additional work) if this line is not linked to a line from the previous situation.
foreach ($previousInvoice->lines as $k => $l) {
$total_ht = (float) $l->total_ht;
@ -3135,7 +3135,7 @@ class pdf_octopus extends ModelePDFFactures
}
}
//Le nouveau cumul = cumul antérieur + current
// New cumulative = previous cumulative + current
$TDataSituation['nouveau_cumul'] = $this->sumSituation($TDataSituation['current'], $TDataSituation['cumul_anterieur']);
return $TDataSituation;
@ -3549,7 +3549,7 @@ class pdf_octopus extends ModelePDFFactures
$ref = $outputlangs->transnoentities("InvoiceSituation").$outputlangs->convToOutputCharset(" n°".$invoice->situation_counter);
// TODO Discuss whether to declare a final invoice as a DGD (definitive general statement like 'décompte général définitif') or not.
// TODO Discuss whether to declare a final invoice as a DGD (definitive general statement, "decompte general definitif") or not.
if (getDolGlobalInt('INVOICE_SITUATION_USE_DGD')) {
if ($invoice->situation_final) {
$ref .= ' - DGD';

View file

@ -1573,7 +1573,7 @@ class pdf_sponge extends ModelePDFFactures
// Show if Option VAT debit option is on also if transmitter is french
// Decret n°2099-1299 2022-10-07
// French mention : "Option pour le paiement de la taxe d'après les débits"
// French legal mention: "Option pour le paiement de la taxe d'apres les debits"
if ($this->emetteur->country_code == 'FR') {
if (getDolGlobalInt('TAX_MODE') == 1) {
$pdf->SetXY($this->marge_gauche, $posy);

View file

@ -2,7 +2,7 @@
/* Copyright (C) 2005-2011 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005-2009 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -40,7 +40,7 @@ class mailing_pomme extends MailingTargets
/**
* @var string This label is used if no translation is found for key XXX neither MailingModuleDescXXX where XXX=name is found
*/
public $desc = 'Dolibarr users with emails'; // Libelle utilise si aucune traduction pour MailingModuleDescXXX ou XXX=name trouvée
public $desc = 'Dolibarr users with emails'; // Label used if no translation found for MailingModuleDescXXX or XXX=name
/**
* @var string[] Module mailing actif si modules require_module actifs
@ -122,9 +122,9 @@ class mailing_pomme extends MailingTargets
/**
* Affiche formulaire de filtre qui apparait dans page de selection des destinataires de mailings
* Display filter form shown on the mailing recipient selection page
*
* @return string Retourne zone select
* @return string HTML select zone
*/
public function formFilter()
{

View file

@ -1,7 +1,7 @@
<?php
/* Copyright (C) 2005-2012 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2025-2026 Frédéric France <frederic.france@free.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -34,7 +34,7 @@ class mailing_xinputfile extends MailingTargets
{
public $name = 'EmailsFromFile'; // Identifiant du module mailing
// This label is used if no translation is found for key XXX neither MailingModuleDescXXX where XXX=name is found
public $desc = 'EMails from a file'; // Libelle utilise si aucune traduction pour MailingModuleDescXXX ou XXX=name trouvée
public $desc = 'EMails from a file'; // Label used if no translation found for MailingModuleDescXXX or XXX=name
/**
* @var string[] This module allows to select by categories must be also enabled if category module is not activated
@ -111,9 +111,9 @@ class mailing_xinputfile extends MailingTargets
/**
* Affiche formulaire de filtre qui apparait dans page de selection des destinataires de mailings
* Display filter form shown on the mailing recipient selection page
*
* @return string Retourne zone select
* @return string HTML select zone
*/
public function formFilter()
{

View file

@ -1,7 +1,7 @@
<?php
/* Copyright (C) 2005-2012 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2025-2026 Frédéric France <frederic.france@free.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -34,7 +34,7 @@ class mailing_xinputuser extends MailingTargets
{
public $name = 'EmailsFromUser'; // Identifiant du module mailing
// This label is used if no translation is found for key XXX neither MailingModuleDescXXX where XXX=name is found
public $desc = 'EMails input by user'; // Libelle utilise si aucune traduction pour MailingModuleDescXXX ou XXX=name trouvée
public $desc = 'EMails input by user'; // Label used if no translation found for MailingModuleDescXXX or XXX=name
/**
* @var string[] This module allows to select by categories must be also enabled if category module is not activated
@ -109,9 +109,9 @@ class mailing_xinputuser extends MailingTargets
/**
* Affiche formulaire de filtre qui apparait dans page de selection des destinataires de mailings
* Display filter form shown on the mailing recipient selection page
*
* @return string Retourne zone select
* @return string HTML select zone
*/
public function formFilter()
{

View file

@ -1,6 +1,6 @@
<?php
/* Copyright (C) 2025 Christophe Battarel <christophe@altairis.fr>
* Copyright (C) 2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2025-2026 Frédéric France <frederic.france@free.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -20,7 +20,7 @@
/**
* \file htdocs/core/modules/member/mod_member_custom.php
* \ingroup member
* \brief Fichier contenant la class du modele de numerotation d'ahérent Custom
* \brief File containing the class for the Custom member numbering model
*/
require_once DOL_DOCUMENT_ROOT.'/core/modules/member/modules_member.class.php';

View file

@ -2,6 +2,7 @@
/* Copyright (C) 2013-2014 Jean-François Ferry <jfefe@aternatik.fr>
* Copyright (C) 2015 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2026 Frédéric France <frederic.france@free.fr>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -202,7 +203,7 @@ class modResource extends DolibarrModules
$r++;
$this->menu[$r++] = array(
'fk_menu' => 'fk_mainmenu=agenda,fk_leftmenu=resource', //On utilise les ancres définis dans le menu parent déclaré au dessus
'fk_menu' => 'fk_mainmenu=agenda,fk_leftmenu=resource', // Uses anchors defined in the parent menu declared above
'type' => 'left', // Toujours un menu gauche
'titre' => 'MenuResourceAdd',
'mainmenu' => 'agenda',
@ -217,7 +218,7 @@ class modResource extends DolibarrModules
);
$this->menu[$r++] = array(
'fk_menu' => 'fk_mainmenu=agenda,fk_leftmenu=resource', //On utilise les ancres définis dans le menu parent déclaré au dessus
'fk_menu' => 'fk_mainmenu=agenda,fk_leftmenu=resource', // Uses anchors defined in the parent menu declared above
'type' => 'left', // Toujours un menu gauche
'titre' => 'List',
'mainmenu' => 'agenda',

View file

@ -3,7 +3,7 @@
* Copyright (C) 2004-2010 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2004 Eric Seigne <eric.seigne@ryxeo.com>
* Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or modify
@ -93,7 +93,7 @@ abstract class ModeleProductCode extends CommonNumRefGenerator
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* Renvoi la liste des modeles de numérotation
* Return the list of numbering models
*
* @param DoliDB $dbs Database handler
* @param int $maxfilenamelength Max length of value to show

View file

@ -4,7 +4,7 @@
* Copyright (C) 2005-2012 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2014-2015 Marcos García <marcosgdf@gmail.com>
* Copyright (C) 2018-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2018-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024 Nick Fragoulis
@ -611,7 +611,7 @@ class pdf_eagle extends ModelePDFStockTransfer
$pdf->SetFont('', '', $default_font_size - 1); // We reposition the default font
// Lot / série
// Batch / serial number
if (isModEnabled('productbatch')) {
$pdf->SetXY($this->posxlot, $curY);
$pdf->MultiCell(($this->posxweightvol - $this->posxlot), 3, $object->lines[$i]->batch, '', 'C');
@ -1075,7 +1075,7 @@ class pdf_eagle extends ModelePDFStockTransfer
$pdf->SetFont('', '', $default_font_size + 1);
// Date prévue depart
// Expected departure date
if (!empty($object->date_prevue_depart)) {
$posy += 4;
$pdf->SetXY($posx, $posy);
@ -1083,7 +1083,7 @@ class pdf_eagle extends ModelePDFStockTransfer
$pdf->MultiCell($w, 4, $outputlangs->transnoentities("DatePrevueDepart")." : ".dol_print_date($object->date_prevue_depart, "day", false, $outputlangs, true), '', 'R');
}
// Date prévue arrivée
// Expected arrival date
if (!empty($object->date_prevue_arrivee)) {
$posy += 4;
$pdf->SetXY($posx, $posy);
@ -1099,7 +1099,7 @@ class pdf_eagle extends ModelePDFStockTransfer
$pdf->MultiCell($w, 4, $outputlangs->transnoentities("DateReelleDepart")." : ".dol_print_date($object->date_reelle_depart, "day", false, $outputlangs, true), '', 'R');
}
// Date reelle arrivée
// Actual arrival date
if (!empty($object->date_reelle_arrivee)) {
$posy += 4;
$pdf->SetXY($posx, $posy);

View file

@ -8,7 +8,7 @@
* Copyright (C) 2012 Cedric Salvador <csalvador@gpcsolutions.fr>
* Copyright (C) 2015 Marcos García <marcosgdf@gmail.com>
* Copyright (C) 2017 Ferran Marcet <fmarcet@2byte.es>
* Copyright (C) 2018-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2018-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024 Nick Fragoulis
@ -1264,7 +1264,7 @@ class pdf_eagle_proforma extends ModelePDFStockTransfer
$pdf->SetFont('', '', $default_font_size + 1);
// Date prévue depart
// Expected departure date
if (!empty($object->date_prevue_depart)) {
$posy += 4;
$pdf->SetXY($posx, $posy);
@ -1272,7 +1272,7 @@ class pdf_eagle_proforma extends ModelePDFStockTransfer
$pdf->MultiCell($w, 4, $outputlangs->transnoentities("DatePrevueDepart")." : ".dol_print_date($object->date_prevue_depart, "day", false, $outputlangs, true), '', 'R');
}
// Date prévue arrivée
// Expected arrival date
if (!empty($object->date_prevue_arrivee)) {
$posy += 4;
$pdf->SetXY($posx, $posy);
@ -1288,7 +1288,7 @@ class pdf_eagle_proforma extends ModelePDFStockTransfer
$pdf->MultiCell($w, 4, $outputlangs->transnoentities("DateReelleDepart")." : ".dol_print_date($object->date_reelle_depart, "day", false, $outputlangs, true), '', 'R');
}
// Date reelle arrivée
// Actual arrival date
if (!empty($object->date_reelle_arrivee)) {
$posy += 4;
$pdf->SetXY($posx, $posy);

View file

@ -6,7 +6,7 @@
* Copyright (C) 2014 Florian Henry <florian.henry@open-concept.pro>
* Copyright (C) 2014 Raphaël Doursenaud <rdoursenaud@gpcsolutions.fr>
* Copyright (C) 2015-2016 Marcos García <marcosgdf@gmail.com>
* Copyright (C) 2018-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2018-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2018 Ferran Marcet <fmarcet@2byte.es>
* Copyright (C) 2019 Nicolas ZABOURI <info@inovea-conseil.com>
* Copyright (C) 2022 OpenDSI <support@open-dsi.fr>
@ -1376,7 +1376,7 @@ if (!empty($object->thirdparty)) {
"invoice_supplier_rec"
];
// seller.tva_assuj -> à injecter dans jsConf ou ailleurs
// seller.tva_assuj -> to inject into jsConf or elsewhere
if (supplierElements.includes(jsConf.docObject.element) && !jsConf.docObject.seller_tva_assuj) {
if (tva_tx !== 0) {
tva_tx = 0;

View file

@ -1,6 +1,6 @@
<?php
/* Copyright (C) 2018 Nicolas ZABOURI <info@inovea-conseil.com>
* Copyright (C) 2018-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2018-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024 William Mead <william.mead@manchenumerique.fr>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2025 Quentin VIAL--GOUTEYRON <quentin.vial-gouteyron@atm-consulting.fr>
@ -241,7 +241,7 @@ class DataPolicyCron
'sql_template' => $sqltemplate,
'class' => 'Adherent',
'file' => DOL_DOCUMENT_ROOT . '/adherents/class/adherent.class.php',
'anonymize_fields' => array('lastname' => 'MAKEANONYMOUS', 'firstname' => 'MAKEANONYMOUS', 'societe' => '---', 'address' => '---', 'town' => '---', 'zip' => '---', 'phone' => '---', 'phone_perso' => '---', 'phone_mobile' => '---', 'email' => 'anonymous+__ID__@example.com', 'birth' => dol_mktime(0, 0, 0, 1, 1, 1900), 'photo' => '', 'url' => '---', 'fax' => '---', 'socialnetworks' => [], 'ip' => '0.0.0.0', 'note_private' => '---', 'note_public' => '---', 'statut' => 0), // Force status to "canceled / résilié"
'anonymize_fields' => array('lastname' => 'MAKEANONYMOUS', 'firstname' => 'MAKEANONYMOUS', 'societe' => '---', 'address' => '---', 'town' => '---', 'zip' => '---', 'phone' => '---', 'phone_perso' => '---', 'phone_mobile' => '---', 'email' => 'anonymous+__ID__@example.com', 'birth' => dol_mktime(0, 0, 0, 1, 1, 1900), 'photo' => '', 'url' => '---', 'fax' => '---', 'socialnetworks' => [], 'ip' => '0.0.0.0', 'note_private' => '---', 'note_public' => '---', 'statut' => 0), // Force status to "canceled"
'call_params' => array(
'delete' => array('user'), // $object->delete($user)
'update' => array('user') // $object->update($user)

View file

@ -1,5 +1,5 @@
<?php
/* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
/* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
*
* This program is free software: you can redistribute it and/or modify
@ -149,9 +149,9 @@ function getAttachments($jk, $mbox)
/**
* Get content of a joined file from its position into a given email
*
* @param integer $jk numéro du mail
* @param string $fpos position de la pièce jointe
* @param integer $type type de la pièce jointe
* @param integer $jk mail number
* @param string $fpos attachment position
* @param integer $type attachment type
* @param \IMAP\Connection $mbox object connection imap
* @return string data
*/

View file

@ -7,7 +7,7 @@
* Copyright (C) 2014 Cedric Gross <c.gross@kreiz-it.fr>
* Copyright (C) 2016 Florian Henry <florian.henry@atm-consulting.fr>
* Copyright (C) 2017-2022 Ferran Marcet <fmarcet@2byte.es>
* Copyright (C) 2018-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2018-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2019-2020 Christophe Battarel <christophe@altairis.fr>
* Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
*
@ -1702,7 +1702,7 @@ if ($object->id > 0 || !empty($object->ref)) {
print $formother->getHTMLScannerForm("barcodescannerjs", 'all', 1);
}
// traitement entrepot par défaut
// default warehouse handling
print '<script type="text/javascript">
$(document).ready(function () {
$("select[name=fk_default_warehouse]").change(function() {

View file

@ -2698,7 +2698,7 @@ if ($action == 'create') {
print '</td>';
print '</tr>';
} // Fin si c'est payé/validé
} // End if paid/validated
print '</table>';
print '</div>';
@ -2739,7 +2739,7 @@ if ($action == 'create') {
path += "&vatrate="+tva;
path += "&qty="+qty;
if (type_fee == 4) { // frais_kilométriques
if (type_fee == 4) { // mileage expenses
if (tax_cat == "" || parseInt(tax_cat) <= 0){
return ;
}
@ -2820,9 +2820,9 @@ if ($action != 'create' && $action != 'edit' && $action != 'editline') {
}
/* If status is "Draft"
* ET user à droit "creer/supprimer"
* ET fk_user_author == user courant
* Afficher : "Enregistrer" / "Modifier" / "Supprimer"
* AND user has "create/delete" right
* AND fk_user_author == current user
* Show: "Save" / "Modify" / "Delete"
*/
if ($user->hasRight('expensereport', 'creer') && $object->status == ExpenseReport::STATUS_DRAFT) {
if (in_array($object->fk_user_author, $childids) || $user->hasRight('expensereport', 'writeall_advance')) {
@ -2836,10 +2836,10 @@ if ($action != 'create' && $action != 'edit' && $action != 'editline') {
}
}
/* If status if "Refused"
* ET user à droit "creer/supprimer"
* ET fk_user_author == user courant
* Afficher : "Enregistrer" / "Modifier" / "Supprimer"
/* If status is "Refused"
* AND user has "create/delete" right
* AND fk_user_author == current user
* Show: "Save" / "Modify" / "Delete"
*/
if ($user->hasRight('expensereport', 'creer') && $object->status == ExpenseReport::STATUS_REFUSED) {
if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
@ -2857,10 +2857,10 @@ if ($action != 'create' && $action != 'edit' && $action != 'editline') {
}
}
/* Si l'état est "En attente d'approbation"
* ET user à droit de "approve"
* ET fk_user_validator == user courant
* Afficher : "Valider" / "Refuser" / "Supprimer"
/* If status is "Pending approval"
* AND user has "approve" right
* AND fk_user_validator == current user
* Show: "Validate" / "Refuse" / "Delete"
*/
if ($object->status == ExpenseReport::STATUS_VALIDATED) {
if (in_array($object->fk_user_author, $childids)) {

View file

@ -6,7 +6,7 @@
* Copyright (c) 2018-2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2016-2020 Ferran Marcet <fmarcet@2byte.es>
* Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2025 William Mead <william@m34d.com>
*
* This program is free software; you can redistribute it and/or modify
@ -1467,7 +1467,7 @@ class ExpenseReport extends CommonObject
public function set_save_from_refuse($fuser)
{
// phpcs:enable
// Sélection de la date de début de la NDF
// Select the start date of the expense report
$sql = 'SELECT date_debut';
$sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element;
$sql .= " WHERE rowid = ".((int) $this->id);
@ -2107,7 +2107,7 @@ class ExpenseReport extends CommonObject
$this->error = 'ExpenseReportConstraintViolationError';
$this->errors[] = $this->error;
$new_current_total_ttc -= $amount_to_test - $rule->amount; // ex, entered 16€, limit 12€, subtracts 4€;
$new_current_total_ttc -= $amount_to_test - $rule->amount; // ex: entered 16 EUR, limit 12 EUR, subtracts 4 EUR
$rule_warning_message_tab[] = $langs->trans('ExpenseReportConstraintViolationError', $rule->id, price($amount_to_test, 0, $langs, 1, -1, -1, $conf->currency), price($rule->amount, 0, $langs, 1, -1, -1, $conf->currency));
} else {
$this->error = 'ExpenseReportConstraintViolationWarning';

View file

@ -153,7 +153,7 @@ if ($action == 'add' && $permissiontoadd) {
$error++;
}
// gestion des fréquences et des échéances
// frequency and due date management
$frequency = GETPOSTINT('frequency');
$rec_year = GETPOST('rec_year');
$rec_month = GETPOST('rec_month');

View file

@ -8,7 +8,7 @@
* Copyright (C) 2015 Marcos García <marcosgdf@gmail.com>
* Copyright (C) 2016-2018 Charlie Benke <charlie@patas-monkey.com>
* Copyright (C) 2024 William Mead <william.mead@manchenumerique.fr>
* Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or modify
@ -129,7 +129,7 @@ class FichinterRec extends Fichinter
{
$this->db = $db;
//status dans l'ordre de l'intervention
// status in intervention order
$this->labelStatus[0] = 'Draft';
$this->labelStatus[1] = 'Closed';
@ -875,7 +875,7 @@ class FichinterRec extends Fichinter
$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
$sql .= ' SET nb_gen_done = nb_gen_done + 1';
$sql .= ' , date_last_gen = now()';
// si on et arrivé à la fin des génération
// if we have reached the end of the generation cycle
if ($this->nb_gen_max <= $this->nb_gen_done + 1) {
$sql .= ' , status = 1';
}

View file

@ -1096,7 +1096,7 @@ if ((empty($id) && empty($ref)) || $action == 'create' || $action == 'add') {
</script>'."\n";
// Formulaire de demande
// Leave request form
print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'" name="demandeCP">'."\n";
print '<input type="hidden" name="token" value="'.newToken().'" />'."\n";
print '<input type="hidden" name="action" value="add" />'."\n";
@ -1589,18 +1589,18 @@ if ((empty($id) && empty($ref)) || $action == 'create' || $action == 'add') {
print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("TitleToValidCP"), $langs->trans("ConfirmToValidCP"), "confirm_send", '', 1, 1);
}
// Si validation de la demande
// If validating the request
if ($action == 'valid') {
print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("TitleValidCP"), $langs->trans("ConfirmValidCP"), "confirm_valid", '', 1, 1);
}
// Si refus de la demande
// If refusing the request
if ($action == 'refuse') {
$array_input = array(array('type' => "text", 'label' => $langs->trans('DetailRefusCP'), 'name' => "detail_refuse", 'size' => "50", 'value' => ""));
print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id."&action=confirm_refuse", $langs->trans("TitleRefuseCP"), $langs->trans('ConfirmRefuseCP'), "confirm_refuse", $array_input, 1, 0);
}
// Si annulation de la demande
// If cancelling the request
if ($action == 'cancel') {
print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("TitleCancelCP"), $langs->trans("ConfirmCancelCP"), "confirm_cancel", '', 1, 1);
}

View file

@ -286,7 +286,7 @@ if (empty($reshook)) {
}
}
foreach ($TusersToProcess as $u) {
// Check if there is already holiday for this period pour chaque user
// Check if there is already holiday for this period for each user
$verifCP = $object->verifDateHolidayCP($u, $date_debut, $date_fin, $halfday);
if (!$verifCP) {
//setEventMessages($langs->trans("alreadyCPexist"), null, 'errors');
@ -483,7 +483,7 @@ if ((empty($id) && empty($ref)) || $action == 'create' || $action == 'add') {
</script>'."\n";
// Formulaire de demande
// Leave request form
print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'" name="demandeCP">'."\n";
print '<input type="hidden" name="token" value="'.newToken().'" />'."\n";
print '<input type="hidden" name="action" value="add" />'."\n";
@ -570,7 +570,7 @@ if ((empty($id) && empty($ref)) || $action == 'create' || $action == 'add') {
print $form->textwithpicto($langs->trans("DateDebCP"), $langs->trans("FirstDayOfHoliday"));
print '</td>';
print '<td>';
// Si la demande ne vient pas de l'agenda
// If the request does not come from the agenda
if (!GETPOST('date_debut_')) {
print $form->selectDate(-1, 'date_debut_', 0, 0, 0, '', 1, 1);
} else {

View file

@ -294,7 +294,7 @@ class Holiday extends CommonObject
}
/**
* Créer un congés payés dans la base de données
* Create a paid leave entry in the database
*
* @param User $user User that create
* @param int $notrigger 0=launch triggers after, 1=disable triggers
@ -544,7 +544,7 @@ class Holiday extends CommonObject
$sql .= " FROM ".MAIN_DB_PREFIX."holiday as cp, ".MAIN_DB_PREFIX."user as uu, ".MAIN_DB_PREFIX."user as ua";
$sql .= " WHERE cp.entity IN (".getEntity('holiday').")";
$sql .= " AND cp.fk_user = uu.rowid AND cp.fk_validator = ua.rowid"; // Hack pour la recherche sur le tableau
$sql .= " AND cp.fk_user = uu.rowid AND cp.fk_validator = ua.rowid"; // Hack needed for search on the list
$sql .= " AND cp.fk_user IN (".$this->db->sanitize($user_id).")";
// Selection filter
@ -675,7 +675,7 @@ class Holiday extends CommonObject
$sql .= " FROM ".MAIN_DB_PREFIX."holiday as cp, ".MAIN_DB_PREFIX."user as uu, ".MAIN_DB_PREFIX."user as ua";
$sql .= " WHERE cp.entity IN (".getEntity('holiday').")";
$sql .= " AND cp.fk_user = uu.rowid AND cp.fk_validator = ua.rowid "; // Hack pour la recherche sur le tableau
$sql .= " AND cp.fk_user = uu.rowid AND cp.fk_validator = ua.rowid "; // Hack needed for search on the list
// Selection filtering
if (!empty($filter)) {
@ -1600,7 +1600,7 @@ class Holiday extends CommonObject
}
/**
* Met à jour une option du module Holiday Payés
* Update an option of the Holiday module
*
* @param string $name name settings parameter
* @param string $value true if update OK else false
@ -2291,7 +2291,7 @@ class Holiday extends CommonObject
*
* @param string $sqlorder SQL sort order
* @param string $sqlwhere SQL where
* @return int -1 si erreur, 1 si OK et 2 si pas de résultat
* @return int -1 if error, 1 if OK, 2 if no result
*/
public function fetchLog($sqlorder, $sqlwhere)
{

View file

@ -265,7 +265,7 @@ if ($id > 0) {
$search_employee = $user_id;
}
// Récupération des congés payés de l'utilisateur ou de tous les users de sa hierarchy
// Retrieve paid leave for the current user or for all users in their hierarchy
// Load array $object->holiday
$sql = "SELECT";
@ -328,7 +328,7 @@ if (isset($extrafields->attributes[$object->table_element]['label']) && is_array
}
$sql .= ", ".MAIN_DB_PREFIX."user as uu, ".MAIN_DB_PREFIX."user as ua";
$sql .= " WHERE cp.entity IN (".getEntity('holiday').")";
$sql .= " AND cp.fk_user = uu.rowid AND cp.fk_validator = ua.rowid "; // Hack pour la recherche sur le tableau
$sql .= " AND cp.fk_user = uu.rowid AND cp.fk_validator = ua.rowid "; // Hack needed for search on the list
// Search all
if (!empty($search_all)) {
$sql .= natural_search(array_keys($fieldstosearchall), $search_all);

View file

@ -4,7 +4,7 @@
* Copyright (C) 2021 Greg Rastklan <greg.rastklan@atm-consulting.fr>
* Copyright (C) 2021 Jean-Pascal BOUDET <jean-pascal.boudet@atm-consulting.fr>
* Copyright (C) 2021 Grégory BLEMAND <gregory.blemand@atm-consulting.fr>
* Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or modify
@ -1114,11 +1114,11 @@ class Skill extends CommonObject
$result = '';
switch ($code) {
case 0: $result = $langs->trans("TypeKnowHow");
break; //"Savoir Faire"
break; // "Know-how"
case 1: $result = $langs->trans("TypeHowToBe");
break; // "Savoir être"
break; // "Soft skills"
case 9: $result = $langs->trans("TypeKnowledge");
break; //"Savoir"
break; // "Knowledge"
}
return $result;
}
@ -1126,9 +1126,9 @@ class Skill extends CommonObject
/**
* Return clickable link of object (with eventually picto)
*
* @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link)
* @param ?array<string,mixed> $arraydata Array of data
* @return string HTML Code for Kanban thumb.
* @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link)
* @param ?array<string,mixed> $arraydata Array of data
* @return string HTML Code for Kanban thumb.
*/
public function getKanbanView($option = '', $arraydata = null)
{

View file

@ -483,7 +483,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php';
}
$conf->modules_parts['tpl']['hrm'] = '/hrm/core/tpl/'; // Pour utilisation du tpl hrm sur cet écran
$conf->modules_parts['tpl']['hrm'] = '/hrm/core/tpl/'; // To use the hrm tpl on this screen
print '<div class="div-table-responsive-no-min">';
if (!empty($object->lines) || ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action != 'selectlines' && $action != 'editline')) {

View file

@ -4,6 +4,7 @@
* Copyright (C) 2021 Jean-Pascal BOUDET <jean-pascal.boudet@atm-consulting.fr>
* Copyright (C) 2021 Grégory BLEMAND <gregory.blemand@atm-consulting.fr>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2026 Frédéric France <frederic.france@free.fr>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -112,7 +113,7 @@ function displayRankInfos($selected_rank, $fk_skill, $inputname = 'TNote', $mode
require_once DOL_DOCUMENT_ROOT . '/hrm/class/skill.class.php';
require_once DOL_DOCUMENT_ROOT . '/hrm/class/skilldet.class.php';
// On charge les différentes notes possibles pour la compétence $fk_skill
// Load the different possible ratings for skill $fk_skill
$skilldet = new Skilldet($db);
$Lines = $skilldet->fetchAll('ASC', 'rankorder', 0, 0, '(fk_skill:=:'.((int) $fk_skill).')');

View file

@ -4,7 +4,7 @@
* Copyright (C) 2021 Greg Rastklan <greg.rastklan@atm-consulting.fr>
* Copyright (C) 2021 Jean-Pascal BOUDET <jean-pascal.boudet@atm-consulting.fr>
* Copyright (C) 2021 Grégory BLEMAND <gregory.blemand@atm-consulting.fr>
* Copyright (C) 2023-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2023-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or modify
@ -274,7 +274,7 @@ if ($action == 'create') {
// SKILLDET ADD
//@todo je stop ici ... à continuer (affichage des 5 skilled input pour create action
//@todo stopped here ... to be continued (display of the 5 skill input fields for create action
//print $object->showInputField($val, $key, $value, '', '['']', '', 0);
print '</table>' . "\n";
@ -782,7 +782,7 @@ if ($action != "create" && $action != "edit") {
print $objectline->getLibStatut(5);
} elseif ($key == 'rowid') {
print $objectline->showOutputField($val, $key, (string) $objectline->id, '');
// ajout pencil
// add pencil icon
print '<a class="timeline-btn" href="' . DOL_MAIN_URL_ROOT . '/comm/action/skilldet_card.php?action=edit&id=' . $objectline->id . '"><i class="fa fa-pencil" title="' . $langs->trans("Modify") . '" ></i></a>';
} else {
print $objectline->showOutputField($val, $key, $objectline->$key, '');

View file

@ -4,7 +4,7 @@
* Copyright (C) 2021 Greg Rastklan <greg.rastklan@atm-consulting.fr>
* Copyright (C) 2021 Jean-Pascal BOUDET <jean-pascal.boudet@atm-consulting.fr>
* Copyright (C) 2021 Grégory BLEMAND <gregory.blemand@atm-consulting.fr>
* Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
* Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
*
@ -606,7 +606,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
}
// liste des evaluation liées
// list of linked evaluations
if ($objecttype == 'user' && $permissiontoadd) {
$evaltmp = new Evaluation($db);
$job = new Job($db);

View file

@ -3,7 +3,7 @@
* Copyright (C) 2018-2019 Nicolas ZABOURI <info@inovea-conseil.com>
* Copyright (C) 2023 Alexandre Janniaux <alexandre.janniaux@gmail.com>
* Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -279,7 +279,7 @@ function getLicenceHeader($user, $langs, $now)
*/
/**
* Post-generation validation — logs and displays a warning if residual myobject/mymodule tokens remain.
* Post-generation validation -- logs and displays a warning if residual myobject/mymodule tokens remain.
*
* @param string $destfile Path to the generated file
* @param NamingContract $nc Contract used for generation
@ -439,7 +439,7 @@ if ($dirins && $action == 'initmodule' && $modulename) { // Test on permission
'$this->picto = \'generic\';' => (empty($picto)) ? '$this->picto = \'generic\'' : '$this->picto = \'' . $picto . '\';',
'modulefamily' => $family,
// Key '500000' would be cast to int(500000) by PHP, then renumbered to 0 by
// array_merge — causing str_replace to search for '0' instead of '500000'.
// array_merge -- causing str_replace to search for '0' instead of '500000'.
// Use a string key that matches the exact assignment line to avoid this.
'$this->numero = 500000' => '$this->numero = '.$idmodule,
]
@ -6236,7 +6236,7 @@ if ($module == 'initmodule') {
value1 = $("#crud").val();
value2 = $("#permissionObj").val();
// Vérifie si les deux sélections sont faites
// Check if both selections are made
if (value1 && value2) {
switch(value1.toLowerCase()){
case "read":

View file

@ -1,6 +1,7 @@
<?php
/* Copyright (C) 2023 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) ---Replace with your own copyright and developer email---
* Copyright (C) 2026 Frédéric France <frederic.france@free.fr>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -352,7 +353,7 @@ class ActionsMyModule extends CommonHookActions
$counter = count($parameters['head']);
$element = $parameters['object']->element;
$id = $parameters['object']->id;
// verifier le type d'onglet comme member_stats où ça ne doit pas apparaitre
// check the tab type like member_stats where it should not appear
// if (in_array($element, ['societe', 'member', 'contrat', 'fichinter', 'project', 'propal', 'commande', 'facture', 'order_supplier', 'invoice_supplier'])) {
if (in_array($element, ['context1', 'context2'])) {
$datacount = 0;

View file

@ -1,11 +1,11 @@
<?php
/* Copyright (C) 2003-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004-2016 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2014 Juanjo Menent <jmenent@2byte.es>
* Copyright (C) 2014 Florian Henry <florian.henry@open-concept.pro>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2026 Jon Bendtsen <jon.bendtsen.github@jonb.dk>
/* Copyright (C) 2003-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004-2016 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2014 Juanjo Menent <jmenent@2byte.es>
* Copyright (C) 2014 Florian Henry <florian.henry@open-concept.pro>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2026 Jon Bendtsen <jon.bendtsen.github@jonb.dk>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -447,12 +447,14 @@ if ($id > 0 || !empty($ref)) {
print '</div>';
$i = 0;
$colspan = 3;
print '<div class="div-table-responsive">';
print '<table class="tagtable liste listwithfilterbefore" width="100%">';
print '<table class="tagtable liste listwithfilterbefore centpercent">';
print '<tr class="liste_titre">';
// Action column
if ($conf->main_checkbox_left_column) {
print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', 'align="center"', $sortfield, $sortorder, 'maxwidthsearch ');
$colspan++;
}
print_liste_field_titre("Ref", $_SERVER["PHP_SELF"], "s.rowid", "", $option, '', $sortfield, $sortorder);
print_liste_field_titre("Company", $_SERVER["PHP_SELF"], "s.nom", "", $option, '', $sortfield, $sortorder);
@ -547,7 +549,7 @@ if ($id > 0 || !empty($ref)) {
} else {
print '<td>'.$form->textwithpicto($langs->trans("Total"), $langs->trans("Totalforthispage")).'</td>';
}
print '<td colspan="3"></td>';
print '<td colspan="'.$colspan.'"></td>';
print '<td class="center">'.$total_qty.'</td>';
print '<td class="right">'.price($total_ht).'</td>';
print '<td></td>';

View file

@ -3,7 +3,7 @@
* Copyright (C) 2014-2020 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr>
* Copyright (C) 2015 Charlie BENKE <charlie@patas-monkey.com>
* Copyright (C) 2018-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2018-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
* Copyright (C) 2023 Maxime Nicolas <maxime@oarces.com>
* Copyright (C) 2023 Benjamin GREMBI <benjamin@oarces.com>
@ -296,7 +296,7 @@ if ($action == 'add' && empty($cancel) && $permissiontoadd) {
$paiement->chid = $object->id; // deprecated
$paiement->datep = $datep;
$paiement->datev = $datev;
$paiement->amounts = array($object->id => $amount); // Tableau de montant
$paiement->amounts = array($object->id => $amount); // Amount array
$paiement->fk_typepayment = $type_payment;
$paiement->num_payment = GETPOST("num_payment", 'alphanohtml');
$paiement->note_private = GETPOST("note", 'restricthtml');

View file

@ -2,7 +2,7 @@
/*
* Copyright (C) 2023 Marc Chenebaux <marc.chenebaux@maj44.com>
* Copyright (C) 2025 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2025-2026 Frédéric France <frederic.france@free.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -334,7 +334,7 @@ class Salaries extends DolibarrApi
*/
public function getPayments($pid)
{
// A payment of salary can be done on different salaires of didderent user, so only users with permission
// A payment of salary can be done on different salaries of different users, so only users with permission
// to read all area allowed.
// TODO To support read or readchild case, the get must be done with a SQL that include the paid user with
// a where on current user and childids of current user.

View file

@ -2,7 +2,7 @@
/* Copyright (C) 2011-2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
* Copyright (C) 2014 Juanjo Menent <jmenent@2byte.es>
* Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
* Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or modify
@ -255,7 +255,7 @@ class PaymentSalary extends CommonObject
$totalamount = (float) price2num($totalamount, 'MT'); // this is to ensure the following test is no biaised by a potential float equal to 0.0000000000001
if ($totalamount == 0) {
return -1;
} // On accepte les montants negatifs pour les rejets de prelevement mais pas null
} // Negative amounts are accepted (for direct debit rejections) but not null
$this->db->begin();
@ -799,7 +799,7 @@ class PaymentSalary extends CommonObject
public function LibStatut($status, $mode = 0)
{
// phpcs:enable
global $langs; // TODO Renvoyer le libelle anglais et faire traduction a affichage
global $langs; // TODO Return the English label and translate at display time
$langs->load('compta');
/*if ($mode == 0)

View file

@ -1,6 +1,6 @@
<?php
/* Copyright (C) 2004-2014 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2016-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2016-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
*
@ -116,7 +116,7 @@ if (($action == 'add_payment' || ($action == 'confirm_paiement' && $confirm == '
$paiement->fk_salary = $id;
$paiement->chid = $id; // deprecated
$paiement->datep = $datepaye;
$paiement->amounts = $amounts; // Tableau de montant
$paiement->amounts = $amounts; // Amount array
$paiement->fk_typepayment = GETPOSTINT("paiementtype");
$paiement->num_payment = GETPOST("num_payment", 'alphanohtml');
$paiement->note = GETPOST("note", 'restricthtml');
@ -164,7 +164,7 @@ llxHeader('', '', $help_url);
$salary = $object;
$sumpaid = 0.0;
// Formulaire de creation d'un paiement de charge
// Payment creation form
if ($action == 'create') {
$salary->accountid = $salary->fk_account ? $salary->fk_account : $salary->accountid;
$salary->fk_typepayment = $salary->mode_reglement_id ? $salary->mode_reglement_id : $salary->paiementtype;
@ -328,7 +328,7 @@ if ($action == 'create') {
print '<br>';
// Bouton Save payment
// Save payment button
print '<div class="center">';
print '<div class="paddingbottom"><input type="checkbox" checked name="closepaidsalary" id="closepaidsalary" class="marginrightonly"><label for="closepaidsalary" class="opacitymedium">'.$langs->trans("ClosePaidSalaryAutomatically").'</label></div>';
print $form->buttonsSaveCancel("ToMakePayment", "Cancel", array(), true);

View file

@ -524,6 +524,9 @@ if (empty($reshook)) {
$object->country_code = $tmparray['code'];
$object->country = $tmparray['label'];
}
if (empty($object->tva_intra)) {
$object->tva_intra = $object->calculateVATNumberFromProperties($object);
}
}
}

View file

@ -5391,15 +5391,22 @@ class Societe extends CommonObject
public function calculateVATNumberFromProperties($thirdparty)
{
if ($thirdparty->country_code == 'FR' && empty($thirdparty->tva_intra) && !empty($thirdparty->tva_assuj)) {
$siren = trim($thirdparty->idprof1);
if (empty($siren)) {
$siren = (int) substr(str_replace(' ', '', $thirdparty->idprof2), 0, 9);
require_once DOL_DOCUMENT_ROOT.'/core/lib/profid.lib.php';
$siren = preg_replace('/\s+/', '', (string) $thirdparty->idprof1);
$siret = preg_replace('/\s+/', '', (string) $thirdparty->idprof2);
if (!isValidSiren($siren)) {
if (!isValidSiret($siret)) {
return '';
}
$siren = substr($siret, 0, 9);
}
if (!empty($siren)) {
// [FR + key code + SIREN number ]
// Key VAT = [12 + 3 * (SIREN modulo 97)] modulo 97
$cle = (12 + 3 * $siren % 97) % 97;
$tva_intra = 'FR' . $cle . $siren;
$cle = (12 + 3 * (((int) $siren) % 97)) % 97;
$tva_intra = 'FR' . str_pad((string) $cle, 2, '0', STR_PAD_LEFT) . $siren;
}
}

View file

@ -1,7 +1,7 @@
<?php
/* Copyright (C) 2013-2018 Jean-François Ferry <hello@librethic.io>
* Copyright (C) 2016 Christophe Battarel <christophe@altairis.fr>
* Copyright (C) 2019-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2019-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2020 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2023-2025 Charlene Benke <charlene@patas-monkey.com>
* Copyright (C) 2023-2024 Benjamin Falière <benjamin.faliere@altairis.fr>
@ -1460,7 +1460,7 @@ class Ticket extends CommonObject
}
/**
* Charge dans cache la liste des sévérité de tickets (paramétrable dans dictionnaire)
* Load into cache the list of ticket severities (configurable in the dictionary)
*
* @return int Number of lines loaded, 0 if already loaded, <0 if KO
*/

View file

@ -3,7 +3,7 @@
* Copyright (C) 2011 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2016 Christophe Battarel <christophe@altairis.fr>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -118,7 +118,7 @@ if ($action == 'addcontact' && $user->hasRight('ticket', 'write')) {
$internal_contacts = $object->listeContact(-1, 'internal', 0, 'SUPPORTTEC');
foreach ($internal_contacts as $key => $contact) {
if ($contact['id'] !== $contactid) {
//print "user à effacer : ".$useroriginassign;
//print "user to delete: ".$useroriginassign;
$result = $object->delete_contact($contact['rowid']);
if ($result < 0) {
$error++;

View file

@ -4,7 +4,7 @@
* Copyright (C) 2005-2015 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2010 Juanjo Menent <jmenent@2byte.es>
* Copyright (C) 2013 Cédric Salvador <csalvador@gpcsolutions.fr>
* Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2025 MDW <mdeweerd@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or modify
@ -69,7 +69,7 @@ if (getDolGlobalString('MAIN_USE_ADVANCED_PERMS')) {
}
// Define value to know what current user can do on properties of edited user
if ($id) {
// $user est le user qui edite, $id est l'id de l'utilisateur edite
// $user is the user doing the edit, $id is the id of the user being edited
$permissiontoedit = ((($user->id == $id) && $user->hasRight("user", "self", "write")) || (($user->id != $id) && $user->hasRight("user", "user", "write")));
$permissiontoeditpassword = ((($user->id == $id) && $user->hasRight("user", "self", "password")) || (($user->id != $id) && $user->hasRight("user", "user", "password")));
}

View file

@ -39,7 +39,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'userhome'; // To manage different context of search
if (!$user->hasRight('user', 'user', 'lire') && !$user->admin) {
// Redirection vers la page de l'utilisateur
// Redirect to the user's own page
header("Location: card.php?id=".$user->id);
exit;
}

View file

@ -2,7 +2,7 @@
/* Copyright (C) 2006-2012 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2006-2021 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2024 William Mead <william.mead@manchenumerique.fr>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -21,7 +21,7 @@
/**
* \file htdocs/user/ldap.php
* \ingroup ldap
* \brief Page fiche LDAP utilisateur
* \brief LDAP user record page
*/
// Load Dolibarr environment

View file

@ -55,7 +55,7 @@ if (!isset($id) || empty($id)) {
}
'@phan-var-force int<1,max> $id';
// $user est le user qui edite, $id est l'id de l'utilisateur edite
// $user is the user doing the edit, $id is the id of the user being edited
$caneditfield = ((($user->id == $id) && $user->hasRight("user", "self", "write"))
|| (($user->id != $id) && $user->hasRight("user", "user", "write")));

View file

@ -3,7 +3,7 @@
/*
* Copyright (C) 2007-2016 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2015 Jean Heimburger <http://tiaris.eu>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2025 MDW <mdeweerd@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or modify
@ -114,7 +114,7 @@ function migrate_user_filespath($u)
{
global $conf;
// Les fichiers implodets des users sont toujours sur l'entité 1
// User files are always stored on entity 1
$dir = $conf->user->dir_output;
$origin = $dir.'/'.get_exdir($u->id, 2, 0, 0, $u, 'user');
$destin = $dir.'/'.$u->id;

View file

@ -4,7 +4,7 @@
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2006-2012 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2013 Maxime Kohlhaas <maxime@atm-consulting.fr>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2025 MDW <mdeweerd@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or modify
@ -42,12 +42,6 @@ if (substr($sapi_type, 0, 3) == 'cgi') {
}
require_once $path."../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT.'/core/lib/functionscli.lib.php';
require_once DOL_DOCUMENT_ROOT."/core/lib/date.lib.php";
require_once DOL_DOCUMENT_ROOT."/core/class/ldap.class.php";
require_once DOL_DOCUMENT_ROOT."/user/class/user.class.php";
require_once DOL_DOCUMENT_ROOT."/user/class/usergroup.class.php";
/**
* @var Conf $conf
* @var DoliDB $db
@ -55,6 +49,11 @@ require_once DOL_DOCUMENT_ROOT."/user/class/usergroup.class.php";
* @var Translate $langs
* @var User $user
*/
require_once DOL_DOCUMENT_ROOT.'/core/lib/functionscli.lib.php';
require_once DOL_DOCUMENT_ROOT."/core/lib/date.lib.php";
require_once DOL_DOCUMENT_ROOT."/core/class/ldap.class.php";
require_once DOL_DOCUMENT_ROOT."/user/class/user.class.php";
require_once DOL_DOCUMENT_ROOT."/user/class/usergroup.class.php";
$langs->loadLangs(array("main", "errors"));
@ -120,7 +119,7 @@ print "----- To Dolibarr database:\n";
print "type=".$conf->db->type."\n";
print "host=".$conf->db->host."\n";
print "port=".$conf->db->port."\n";
print "login=".$conf->db->user."\n";
print "login=".(string) $conf->db->user."\n";
print "database=".$conf->db->name."\n";
print "----- Options:\n";
print "commitiferror=".$forcecommit."\n";
@ -198,11 +197,11 @@ if ($result >= 0) {
if ($tmpkey === 'count') { // @phpstan-ignore-line
continue;
}
if (empty($userList[$userdn])) { // Récupération de l'utilisateur
// Schéma rfc2307: les membres sont listés dans l'attribut memberUid sous form de login uniquement
if (empty($userList[$userdn])) { // Fetch the user
// rfc2307 schema: members are listed in the memberUid attribute as login names only
if (getDolGlobalString('LDAP_GROUP_FIELD_GROUPMEMBERS') === 'memberUid') {
$userKey = array($userdn);
} else { // Pour les autres schémas, les membres sont listés sous forme de DN completes
} else { // For other schemas, members are listed as full DNs
$userFilter = explode(',', $userdn);
$userKey = $ldap->getAttributeValues('('.$userFilter[0].')', getDolGlobalString('LDAP_KEY_USERS'));
}
@ -213,9 +212,9 @@ if ($result >= 0) {
$fuser = new User($db);
if (getDolGlobalString('LDAP_KEY_USERS') == getDolGlobalString('LDAP_FIELD_SID')) {
$fuser->fetch(0, '', $userKey[0]); // Chargement du user concerné par le SID
$fuser->fetch(0, '', $userKey[0]); // Load the user matched by SID
} elseif (getDolGlobalString('LDAP_KEY_USERS') == getDolGlobalString('LDAP_FIELD_LOGIN')) {
$fuser->fetch(0, $userKey[0]); // Chargement du user concerné par le login
$fuser->fetch(0, $userKey[0]); // Load the user matched by login
}
$userList[$userdn] = $fuser;

View file

@ -3,7 +3,7 @@
/**
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2006-2012 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2025 MDW <mdeweerd@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or modify
@ -138,7 +138,7 @@ print "----- To Dolibarr database:\n";
print "type=".$conf->db->type."\n";
print "host=".$conf->db->host."\n";
print "port=".$conf->db->port."\n";
print "login=".$conf->db->user."\n";
print "login=".(string) $conf->db->user."\n";
print "database=".$conf->db->name."\n";
print "----- Options:\n";
print "commitiferror=".$forcecommit."\n";
@ -204,9 +204,9 @@ if ($result >= 0) {
$fuser = new User($db);
if (getDolGlobalString('LDAP_KEY_USERS') == getDolGlobalString('LDAP_FIELD_SID')) {
$fuser->fetch(0, '', $ldapuser[getDolGlobalString('LDAP_KEY_USERS')]); // Chargement du user concerné par le SID
$fuser->fetch(0, '', $ldapuser[getDolGlobalString('LDAP_KEY_USERS')]); // Load the user matched by SID
} elseif (getDolGlobalString('LDAP_KEY_USERS') == getDolGlobalString('LDAP_FIELD_LOGIN')) {
$fuser->fetch(0, $ldapuser[getDolGlobalString('LDAP_KEY_USERS')]); // Chargement du user concerné par le login
$fuser->fetch(0, $ldapuser[getDolGlobalString('LDAP_KEY_USERS')]); // Load the user matched by login
}
// Propriete membre