Compare commits

...

6 Commits

Author SHA1 Message Date
Dolibot
06df40b89c PHPStan > Update baseline 2025-11-28 12:10:49 +00:00
Laurent Destailleur
66d79d69af Doc 2025-11-28 10:28:25 +01:00
Laurent Destailleur
65c199fbf1 Merge branch 'develop' of git@github.com:Dolibarr/dolibarr.git into develop 2025-11-28 09:44:45 +01:00
Laurent Destailleur
6c54e4792b CSS 2025-11-28 09:17:34 +01:00
Laurent Destailleur
cd5e0b7e9d Doc 2025-11-28 09:05:14 +01:00
Laurent Destailleur
09aca511e8 Debug v23 2025-11-28 08:55:11 +01:00
8 changed files with 40 additions and 125 deletions

View File

@@ -5676,48 +5676,6 @@ parameters:
count: 1
path: ../../../htdocs/core/class/html.form.class.php
-
message: '#^Property Form\:\:\$cache_conditions_paiements has no type specified\.$#'
identifier: missingType.property
count: 1
path: ../../../htdocs/core/class/html.form.class.php
-
message: '#^Property Form\:\:\$cache_demand_reason has no type specified\.$#'
identifier: missingType.property
count: 1
path: ../../../htdocs/core/class/html.form.class.php
-
message: '#^Property Form\:\:\$cache_invoice_subtype has no type specified\.$#'
identifier: missingType.property
count: 1
path: ../../../htdocs/core/class/html.form.class.php
-
message: '#^Property Form\:\:\$cache_transport_mode has no type specified\.$#'
identifier: missingType.property
count: 1
path: ../../../htdocs/core/class/html.form.class.php
-
message: '#^Property Form\:\:\$cache_types_fees has no type specified\.$#'
identifier: missingType.property
count: 1
path: ../../../htdocs/core/class/html.form.class.php
-
message: '#^Property Form\:\:\$cache_types_paiements has no type specified\.$#'
identifier: missingType.property
count: 1
path: ../../../htdocs/core/class/html.form.class.php
-
message: '#^Property Form\:\:\$cache_vatrates has no type specified\.$#'
identifier: missingType.property
count: 1
path: ../../../htdocs/core/class/html.form.class.php
-
message: '#^Return type of call to function dol_sort_array contains unresolvable type\.$#'
identifier: function.unresolvableReturnType
@@ -14064,18 +14022,6 @@ parameters:
count: 1
path: ../../../htdocs/reception/card.php
-
message: '#^Loose comparison using \=\= between ''''\|''CommandeFournisseur'' and ''commande'' will always evaluate to false\.$#'
identifier: equal.alwaysFalse
count: 2
path: ../../../htdocs/reception/card.php
-
message: '#^Loose comparison using \=\= between ''''\|''CommandeFournisseur'' and ''propal'' will always evaluate to false\.$#'
identifier: equal.alwaysFalse
count: 2
path: ../../../htdocs/reception/card.php
-
message: '#^Negated boolean expression is always true\.$#'
identifier: booleanNot.alwaysTrue
@@ -14088,12 +14034,6 @@ parameters:
count: 1
path: ../../../htdocs/reception/card.php
-
message: '#^Result of && is always false\.$#'
identifier: booleanAnd.alwaysFalse
count: 8
path: ../../../htdocs/reception/card.php
-
message: '#^Variable \$extrafields in empty\(\) always exists and is not falsy\.$#'
identifier: empty.variable
@@ -14244,24 +14184,6 @@ parameters:
count: 2
path: ../../../htdocs/reception/contact.php
-
message: '#^Loose comparison using \=\= between ''''\|''CommandeFournisseur'' and ''commande'' will always evaluate to false\.$#'
identifier: equal.alwaysFalse
count: 1
path: ../../../htdocs/reception/dispatch.php
-
message: '#^Loose comparison using \=\= between ''''\|''CommandeFournisseur'' and ''propal'' will always evaluate to false\.$#'
identifier: equal.alwaysFalse
count: 1
path: ../../../htdocs/reception/dispatch.php
-
message: '#^Result of && is always false\.$#'
identifier: booleanAnd.alwaysFalse
count: 4
path: ../../../htdocs/reception/dispatch.php
-
message: '#^Variable \$objectsrc might not be defined\.$#'
identifier: variable.undefined
@@ -16116,12 +16038,6 @@ parameters:
count: 1
path: ../../../htdocs/webhook/triggerhistory_list.php
-
message: '#^Loose comparison using \=\= between ''auto'' and ''auto'' will always evaluate to true\.$#'
identifier: equal.alwaysTrue
count: 1
path: ../../../htdocs/webportal/class/context.class.php
-
message: '#^Result of && is always false\.$#'
identifier: booleanAnd.alwaysFalse
@@ -16134,24 +16050,6 @@ parameters:
count: 1
path: ../../../htdocs/webportal/class/html.formcardwebportal.class.php
-
message: '#^Comparison operation "\<\=" between int\<2, max\> and 1 is always false\.$#'
identifier: smallerOrEqual.alwaysFalse
count: 1
path: ../../../htdocs/webportal/class/html.formlistwebportal.class.php
-
message: '#^Offset ''total'' on \*NEVER\* in isset\(\) always exists and is not nullable\.$#'
identifier: isset.offset
count: 1
path: ../../../htdocs/webportal/class/html.formlistwebportal.class.php
-
message: '#^Result of && is always false\.$#'
identifier: booleanAnd.alwaysFalse
count: 1
path: ../../../htdocs/webportal/class/html.formlistwebportal.class.php
-
message: '#^Call to function is_array\(\) with list\<string\> will always evaluate to true\.$#'
identifier: function.alreadyNarrowedType

View File

@@ -169,7 +169,7 @@ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x'
include DOL_DOCUMENT_ROOT.'/core/actions_linkedfiles.inc.php';
if (GETPOST('action') == 'upload' && $user->hasRight('blockedlog', 'read')) { // read is read/upload for blockedlog
if (GETPOST('action') == 'export' && $user->hasRight('blockedlog', 'read')) { // read is read/export for blockedlog
$error = 0;
$previoushash = '';
@@ -184,16 +184,20 @@ if (GETPOST('action') == 'upload' && $user->hasRight('blockedlog', 'read')) { /
$error++;
}
$dates = dol_get_first_day(GETPOSTINT('yeartoexport'), GETPOSTINT('monthtoexport') ? GETPOSTINT('monthtoexport') : 1);
$datee = dol_get_last_day(GETPOSTINT('yeartoexport'), GETPOSTINT('monthtoexport') ? GETPOSTINT('monthtoexport') : 12);
if ($datee >= dol_now()) {
setEventMessages($langs->trans("ErrorPeriodMustBePastToAllowExport"), null, "errors");
$error++;
}
if (!$error) {
// Get the ID of the first line qualified
$sql = "SELECT rowid,date_creation,tms,user_fullname,action,amounts,element,fk_object,date_object,ref_object,signature,fk_user,object_data";
$sql .= " FROM ".MAIN_DB_PREFIX."blockedlog";
$sql .= " WHERE entity = ".((int) $conf->entity);
if (GETPOSTINT('monthtoexport') > 0 || GETPOSTINT('yeartoexport') > 0) {
$dates = dol_get_first_day(GETPOSTINT('yeartoexport'), GETPOSTINT('monthtoexport') ? GETPOSTINT('monthtoexport') : 1);
$datee = dol_get_last_day(GETPOSTINT('yeartoexport'), GETPOSTINT('monthtoexport') ? GETPOSTINT('monthtoexport') : 12);
$sql .= " AND date_creation BETWEEN '".$db->idate($dates)."' AND '".$db->idate($datee)."'";
}
$sql .= " AND date_creation BETWEEN '".$db->idate($dates)."' AND '".$db->idate($datee)."'";
$sql .= " ORDER BY rowid ASC"; // Required so we get the first one
$sql .= $db->plimit(1);
@@ -518,7 +522,7 @@ if ($action == 'deletefile') {
print '<form method="POST" id="exportArchives" action="'.$_SERVER["PHP_SELF"].'?output=file">';
print '<input type="hidden" name="token" value="'.newToken().'">';
print '<input type="hidden" name="action" value="upload">';
print '<input type="hidden" name="action" value="export">';
print '<div class="right">';

View File

@@ -100,11 +100,6 @@ $cancel = GETPOST('cancel', 'alpha');
$backtopage = GETPOST('backtopage', 'alpha'); // if not set, a default page will be used
$backtopageforcancel = GETPOST('backtopageforcancel', 'alpha'); // if not set, $backtopage will be used
$lineid = GETPOSTINT('lineid');
$userid = GETPOSTINT('userid');
$search_ref = GETPOST('sf_ref', 'alpha') ? GETPOST('sf_ref', 'alpha') : GETPOST('search_ref', 'alpha');
$search_societe = GETPOST('search_societe', 'alpha');
$search_montant_ht = GETPOST('search_montant_ht', 'alpha');
$search_montant_ttc = GETPOST('search_montant_ttc', 'alpha');
$origin = GETPOST('origin', 'alpha');
$originid = (GETPOSTINT('originid') ? GETPOSTINT('originid') : GETPOSTINT('origin_id')); // For backward compatibility
$fac_rec = GETPOSTINT('fac_rec');
@@ -123,8 +118,6 @@ $hideref = (GETPOSTINT('hideref') ? GETPOSTINT('hideref') : (getDolGlobalString(
// Number of lines for predefined product/service choices
$NBLINES = 4;
$usehm = getDolGlobalInt('MAIN_USE_HOURMIN_IN_DATE_RANGE');
$object = new Facture($db);
$extrafields = new ExtraFields($db);
@@ -1274,7 +1267,7 @@ if (empty($reshook)) {
$sourceinvoice = GETPOSTINT('fac_avoir');
if (!($sourceinvoice > 0) && !getDolGlobalString('INVOICE_CREDIT_NOTE_STANDALONE')) {
$error++;
setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("CorrectInvoice")), null, 'errors');
setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("InvoiceAvoirAskCombo")), null, 'errors');
$action = 'create';
}
@@ -4309,7 +4302,7 @@ if ($action == 'create') {
});
</script>';
$text = '<label>'.$tmp.$langs->transnoentities("InvoiceAvoirAsk").'</label> ';
$text .= '<select class="flat valignmiddle" name="fac_avoir" id="fac_avoir"';
$text .= '<select class="flat valignmiddle minwidth200" name="fac_avoir" id="fac_avoir"';
if (!$optionsav || $invoice_predefined->id > 0) {
$text .= ' disabled';
}
@@ -4325,9 +4318,10 @@ if ($action == 'create') {
print $desc;
print '<div id="credit_note_options" class="clearboth paddingtop marginbottomonly">';
print '<div class="marginleftlarge"><input type="checkbox" name="invoiceAvoirWithLines" id="invoiceAvoirWithLines" value="1" onclick="$(\'#credit_note_options input[type=checkbox]\').not(this).prop(\'checked\', false);" '.(GETPOSTINT('invoiceAvoirWithLines') > 0 ? 'checked' : '').' /> <label for="invoiceAvoirWithLines" class="small">'.$langs->trans('invoiceAvoirWithLines')."</label></div>";
//print '<br>';
print '<div class="marginleftlarge"><input type="checkbox" name="invoiceAvoirWithPaymentRestAmount" id="invoiceAvoirWithPaymentRestAmount" value="1" onclick="$(\'#credit_note_options input[type=checkbox]\').not(this).prop(\'checked\', false);" '.(GETPOSTINT('invoiceAvoirWithPaymentRestAmount') > 0 ? 'checked' : '').' /> <label for="invoiceAvoirWithPaymentRestAmount" class="small">'.$langs->trans('invoiceAvoirWithPaymentRestAmount')."</label></div>";
print '<div class="marginleftlargeondesktop"><input type="checkbox" name="invoiceAvoirWithLines" id="invoiceAvoirWithLines" value="1" onclick="$(\'#credit_note_options input[type=checkbox]\').not(this).prop(\'checked\', false);" '.(GETPOSTINT('invoiceAvoirWithLines') > 0 ? 'checked' : '').' /> <label for="invoiceAvoirWithLines" class="small">'.$langs->trans('invoiceAvoirWithLines')."</label></div>";
print '<div class="marginleftlargeondesktop"><input type="checkbox" name="invoiceAvoirWithPaymentRestAmount" id="invoiceAvoirWithPaymentRestAmount" value="1" onclick="$(\'#credit_note_options input[type=checkbox]\').not(this).prop(\'checked\', false);" '.(GETPOSTINT('invoiceAvoirWithPaymentRestAmount') > 0 ? 'checked' : '').' /> <label for="invoiceAvoirWithPaymentRestAmount" class="small">'.$langs->trans('invoiceAvoirWithPaymentRestAmount')."</label></div>";
// Adding a checkbox: "Automatically consume the credit note to close the corrected invoice" is better to be into
// the confirm popup when we validate the credit note
print '</div>';
print '</div></div>'."\n";

View File

@@ -2107,7 +2107,7 @@ class Form
dol_syslog(get_class($this) . "::select_remises", LOG_DEBUG);
$resql = $this->db->query($sql);
if ($resql) {
print '<select id="select_' . $htmlname . '" class="flat maxwidthonsmartphone" name="' . $htmlname . '">';
print '<select id="select_' . $htmlname . '" class="flat maxwidth200onsmartphone" name="' . $htmlname . '">';
$num = $this->db->num_rows($resql);
$qualifiedlines = $num;

View File

@@ -30,7 +30,7 @@ InvoiceReplacementShort=Replacement
InvoiceReplacementAsk=Replacement invoice for invoice
InvoiceReplacementDesc=<b>Replacement invoice</b> is used to completely replace an invoice with no payment already received.<br><br>Note: Only invoices with no payment on it can be replaced. If the invoice you replace is not yet closed, it will be automatically closed to 'abandoned'.
InvoiceAvoir=Credit note
InvoiceAvoirAsk=Credit note
InvoiceAvoirAsk=Credit note from
InvoiceAvoirAskCombo=Invoice to correct
InvoiceAvoirDesc=The <b>credit note</b> is a negative invoice used to correct the fact that an invoice shows an amount that differs from the amount actually paid (eg the customer paid too much by mistake, or will not pay the complete amount since some products were returned).
invoiceAvoirWithLines=Create Credit Note with lines from the origin invoice

View File

@@ -49,6 +49,7 @@ TotalTTCIfInvoiceSeeCompleteDataForDetail=Amount of event. Total including tax i
TypeOfEvent=Type of event
TotalForAction=Total for event %s
SecretKey=Secret key
ErrorPeriodMustBePastToAllowExport=Export into archives is allowed only if period is completely past
## logTypes
logBILL_DELETE=Customer invoice logically deleted

View File

@@ -1241,6 +1241,9 @@ td.wordbreak img, td.wordbreakimp img {
.marginleftlarge {
margin-<?php print $left; ?>: 20px !important;
}
.marginleftlargeondesktop {
margin-<?php print $left; ?>: 20px;
}
.paddinglarge {
padding: 6px !important;
}
@@ -2280,6 +2283,10 @@ datalist {
font-size: <?php print is_numeric($fontsize) ? ((int) $fontsize + 3).'px' : $fontsize; ?> !important;
}
.marginleftlargeondesktop {
margin-<?php print $left; ?>: 0;
}
div#login_left, div#login_right {
min-width: 150px !important;
max-width: 240px !important;

View File

@@ -1397,6 +1397,9 @@ td.wordbreak img, td.wordbreakimp img {
.marginleftlarge {
margin-<?php print $left; ?>: 20px !important;
}
.marginleftlargeondesktop {
margin-<?php print $left; ?>: 20px;
}
.paddinglarge {
padding: 6px !important;
}
@@ -1587,8 +1590,12 @@ span.fa.fa-plus-circle.paddingleft {
margin-left: 1px;
}
.listofinvoicetype {
height: 28px;
min-height: 1.8em;
vertical-align: middle;
padding-top: 7px;
padding-bottom: 1px;
display: flex;
align-items: center;
}
.divsocialnetwork:not(:last-child) {
padding-<?php print $right; ?>: 20px;
@@ -2395,6 +2402,10 @@ select.widthcentpercentminusxx, span.widthcentpercentminusxx:not(.select2-select
font-size: <?php print is_numeric($fontsize) ? ($fontsize).'px' : $fontsize; ?> !important;
}
.marginleftlargeondesktop {
margin-<?php print $left; ?>: 0;
}
.login_vertical_align {
padding-left: 0;
}
@@ -2436,7 +2447,7 @@ select.widthcentpercentminusxx, span.widthcentpercentminusxx:not(.select2-select
height: 40px !important;
}
div.tabBar .listofinvoicetype table tr, div.tabBar .listofinvoicetype table tr td {
height: 28px !important;
height: 2.2em !important;
}
div.tabs div.tab a.tab {