diff --git a/ChangeLog b/ChangeLog
index a9a42c8d878..3dd00815d51 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,62 @@ English Dolibarr ChangeLog
--------------------------------------------------------------
+
+***** ChangeLog for 16.0.0 compared to 15.0.0 *****
+
+For users:
+---------------
+
+NEW: ...
+
+
+ Modules
+NEW: Experimental module Event Organization Management
+NEW: Experimental module Workstations Management
+NEW: Experimental module Partnership Management
+
+
+For developers:
+---------------
+
+NEW:
+
+
+
+Following changes may create regressions for some external modules, but were necessary to make Dolibarr better:
+* verifCond('stringtoevaluate') now return false when string contains a bad syntax content instead of true.
+* The deprecated mdethod thirdparty_doc_create() has been removed. You can use the generateDocument() instead.
+
+
+
+***** ChangeLog for 15.0.1 compared to 15.0.0 *****
+FIX: #19777 #20281
+FIX: bad position of extrafields for interventions
+FIX: Blocking situation when a payment was deleted in bank.
+FIX: creation of the shipment if order contains services
+FIX: Drag and drop line of files on join files tab
+FIX: Error management on mass action "Approve holiday"
+FIX: error with php8
+FIX: in case of VAT refund, negative amount must be allowed
+FIX: invoice pdf: lines originating from deposits were not detailed anymore
+FIX: Invoice - When you create an invoice for a given thirdparty, fk_account is not retrieved from company card
+FIX: list of visible type of event was not correctly filtered
+FIX: Missing or bad permissions
+FIX: Missing the field date start/end in export supplier invoice/order
+FIX: On large proposal or invoice, fix n(n+1) sql into a n sql.
+FIX: options should not exists on invoices
+FIX: payment not completed when using Paypal.
+FIX: permission to download files of expense report with readall.
+FIX- Preview icon in documents list PDF in the admin page third-party
+FIX: shipping list, e.shipping_method_id should be e.fk_shipping_method.
+FIX: Show product photo on Supplier order Cornas model.
+FIX: User name in ManufacturingOrder
+FIX: viewimage.php blocks requests with multicompany from other enties
+FIX: #yogosha9048
+FIX: #yogosha9054
+FIX: #yogosha9095
+
+
***** ChangeLog for 15.0.0 compared to 14.0.0 *****
For users:
@@ -10,6 +66,7 @@ For users:
NEW: Online proposal signature
NEW: Can define some max limit on expense report (per period, per type or expense, ...)
+NEW: Provide a special pages for bookmarks and multicompany for a better use of some mobile applications (like DoliDroid)
NEW: Allow the use of __NEWREF__ to get for example the new reference a draft order will get after validation.
NEW: Add option to disable globaly some notifications emails.
NEW: #18401 Add __NEWREF__ subtitute to get new object reference.
diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php
index 67f521806cb..a760a550bef 100644
--- a/htdocs/accountancy/bookkeeping/list.php
+++ b/htdocs/accountancy/bookkeeping/list.php
@@ -190,7 +190,7 @@ $arrayfields = array(
't.date_creation'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0),
't.tms'=>array('label'=>$langs->trans("DateModification"), 'checked'=>0),
't.date_export'=>array('label'=>$langs->trans("DateExport"), 'checked'=>1),
- 't.date_validated'=>array('label'=>$langs->trans("DateValidation"), 'checked'=>1),
+ 't.date_validated'=>array('label'=>$langs->trans("DateValidationAndLock"), 'checked'=>1),
);
if (empty($conf->global->ACCOUNTING_ENABLE_LETTERING)) {
@@ -678,19 +678,28 @@ $formconfirm = '';
if ($action == 'export_file') {
$form_question = array();
+ // If 1 or not set, we check by default.
+ $checked = (!isset($conf->global->ACCOUNTING_DEFAULT_NOT_NOTIFIED_EXPORT_DATE) || !empty($conf->global->ACCOUNTING_DEFAULT_NOT_NOTIFIED_EXPORT_DATE));
$form_question['notifiedexportdate'] = array(
'name' => 'notifiedexportdate',
'type' => 'checkbox',
'label' => $langs->trans('NotifiedExportDate'),
- 'value' => (!empty($conf->global->ACCOUNTING_DEFAULT_NOT_NOTIFIED_EXPORT_DATE) ? 'false' : 'true'),
+ 'value' => $checked,
);
+
+ $form_question['separator'] = array('name'=>'separator', 'type'=>'separator');
+
+ // If 0 or not set, we NOT check by default.
+ $checked = (isset($conf->global->ACCOUNTING_DEFAULT_NOT_NOTIFIED_VALIDATION_DATE) || !empty($conf->global->ACCOUNTING_DEFAULT_NOT_NOTIFIED_VALIDATION_DATE));
$form_question['notifiedvalidationdate'] = array(
'name' => 'notifiedvalidationdate',
'type' => 'checkbox',
'label' => $langs->trans('NotifiedValidationDate'),
- 'value' => (!empty($conf->global->ACCOUNTING_DEFAULT_NOT_NOTIFIED_VALIDATION_DATE) ? 'false' : 'true'),
+ 'value' => $checked,
);
+ $form_question['separator2'] = array('name'=>'separator2', 'type'=>'separator');
+
$formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?'.$param, $langs->trans("ExportFilteredList").' ('.$listofformat[$formatexportset].')', $langs->trans('ConfirmExportFile'), 'export_fileconfirm', $form_question, '', 1, 300, 600);
}
@@ -823,7 +832,7 @@ if (!empty($arrayfields['t.piece_num']['checked'])) {
// Code journal
if (!empty($arrayfields['t.code_journal']['checked'])) {
print '
';
if (!$i) {
$totalarray['nbfield']++;
}
diff --git a/htdocs/accountancy/closure/index.php b/htdocs/accountancy/closure/index.php
index 6b578bcab71..f02eda61bf6 100644
--- a/htdocs/accountancy/closure/index.php
+++ b/htdocs/accountancy/closure/index.php
@@ -13,7 +13,6 @@
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
- *
*/
/**
diff --git a/htdocs/adherents/card.php b/htdocs/adherents/card.php
index caf2bbe61d6..5bdb99330f6 100644
--- a/htdocs/adherents/card.php
+++ b/htdocs/adherents/card.php
@@ -1719,8 +1719,6 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
print '
'.$langs->trans("MemberNature").'
'.$object->getmorphylib().'
';
print '
';
- print '';
-
// Company
print '
'.$langs->trans("Company").'
'.dol_escape_htmltag($object->company).'
';
@@ -1737,9 +1735,9 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
if ($user->admin) {
print '';
}
- print 'trans("Hidden").'';
+ print ''.$langs->trans("Hidden").'';
}
- if ((!empty($object->pass) || !empty($object->pass_crypted)) && empty($object->user_id)) {
+ if (!empty($object->pass_indatabase) && empty($object->user_id)) { // Show warning only for old password still in clear (does not happen anymore)
$langs->load("errors");
$htmltext = $langs->trans("WarningPasswordSetWithNoAccount");
print ' '.$form->textwithpicto('', $htmltext, 1, 'warning');
@@ -1778,7 +1776,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
print '
';
if ($object->pass) {
print preg_replace('/./i', '*', $object->pass);
} else {
if ($user->admin) {
- print $langs->trans("Crypted").': '.$object->pass_indatabase_crypted;
- } else {
- print $langs->trans("Hidden");
+ print '';
}
+ print ''.$langs->trans("Hidden").'';
}
- if ((!empty($object->pass) || !empty($object->pass_crypted)) && empty($object->user_id)) {
+ if (!empty($object->pass_indatabase) && empty($object->user_id)) { // Show warning only for old password still in clear (does not happen anymore)
$langs->load("errors");
$htmltext = $langs->trans("WarningPasswordSetWithNoAccount");
print ' '.$form->textwithpicto('', $htmltext, 1, 'warning');
@@ -546,15 +545,17 @@ if ($rowid > 0) {
print " ".img_warning($langs->trans("Late"));
}
} else {
- if (!$adht->subscription) {
+ if ($object->need_subscription == 0) {
+ print $langs->trans("SubscriptionNotNeeded");
+ } elseif (!$adht->subscription) {
print $langs->trans("SubscriptionNotRecorded");
- if ($object->statut > 0) {
- print " ".img_warning($langs->trans("Late")); // Display a delay picto only if it is not a draft and is not canceled
+ if (Adherent::STATUS_VALIDATED == $object->statut) {
+ print " ".img_warning($langs->trans("Late")); // displays delay Pictogram only if not a draft, not excluded and not resiliated
}
} else {
print $langs->trans("SubscriptionNotReceived");
- if ($object->statut > 0) {
- print " ".img_warning($langs->trans("Late")); // Display a delay picto only if it is not a draft and is not canceled
+ if (Adherent::STATUS_VALIDATED == $object->statut) {
+ print " ".img_warning($langs->trans("Late")); // displays delay Pictogram only if not a draft, not excluded and not resiliated
}
}
}
@@ -563,18 +564,13 @@ if ($rowid > 0) {
print '
';
+
+ // Text of email after creatio of a ticket
+ $mail_mesg_new = $conf->global->TICKET_MESSAGE_MAIL_NEW ? $conf->global->TICKET_MESSAGE_MAIL_NEW : $langs->trans('TicketNewEmailBody');
+ print '
';
// Label of social contribution
@@ -115,7 +115,7 @@ print '';
print ' ';
-print '
';
+print '
';
dol_print_object_info($object);
print '
';
diff --git a/htdocs/compta/sociales/note.php b/htdocs/compta/sociales/note.php
new file mode 100644
index 00000000000..cf9d0cbdec5
--- /dev/null
+++ b/htdocs/compta/sociales/note.php
@@ -0,0 +1,135 @@
+
+ *
+ * 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
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/**
+ * \file htdocs/compta/sociales/note.php
+ * \ingroup tax
+ * \brief Tab for notes on Taxes
+ */
+
+require '../../main.inc.php';
+require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/tax.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
+if (!empty($conf->projet->enabled)) {
+ include_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
+ include_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
+}
+
+// Load translation files required by the page
+$langs->loadLangs(array('compta', 'bills'));
+
+// Get parameters
+$id = GETPOST('id', 'int');
+$ref = GETPOST('ref', 'alpha');
+$action = GETPOST('action', 'aZ09');
+$cancel = GETPOST('cancel', 'aZ09');
+$backtopage = GETPOST('backtopage', 'alpha');
+
+$object = new ChargeSociales($db);
+if ($id > 0) {
+ $object->fetch($id);
+}
+
+// Security check
+$socid = GETPOST('socid', 'int');
+if ($user->socid) {
+ $socid = $user->socid;
+}
+$result = restrictedArea($user, 'tax', $object->id, 'chargesociales', 'charges');
+
+$permissiontoread = $user->rights->tax->charges->lire;
+$permissiontoadd = $user->rights->tax->charges->creer;
+$permissionnote = $user->rights->tax->charges->creer; // Used by the include of actions_setnotes.inc.php
+
+
+/*
+ * Actions
+ */
+
+$parameters = array();
+$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
+if ($reshook < 0) {
+ setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
+}
+if (empty($reshook)) {
+ include DOL_DOCUMENT_ROOT.'/core/actions_setnotes.inc.php'; // Must be include, not include_once
+}
+
+
+/*
+ * View
+ */
+
+$form = new Form($db);
+
+$title = $langs->trans("SocialContribution").' - '.$langs->trans("Note");
+$help_url = 'EN:Module_Taxes_and_social_contributions|FR:Module Taxes et dividendes|ES:Módulo Impuestos y cargas sociales (IVA, impuestos)';
+llxHeader('', $title, $help_url);
+
+if ($id > 0 || !empty($ref)) {
+ $object->fetch_thirdparty();
+
+ $head = tax_prepare_head($object);
+
+ print dol_get_fiche_head($head, 'note', $langs->trans("SocialContribution"), -1, $object->picto);
+
+ $morehtmlref = '
'."\n";
@@ -5200,6 +5202,7 @@ class Form
$out .= '';
$out .= '';
} else {
+ $out .= '';
if ($selected) {
$projet = new Project($this->db);
$projet->fetch($selected);
@@ -5207,6 +5210,7 @@ class Form
} else {
$out .= " ";
}
+ $out .= '';
}
if (empty($nooutput)) {
@@ -6676,7 +6680,7 @@ class Form
// phpcs:enable
global $langs;
- $retstring = '';
+ $retstring = '';
$hourSelected = 0;
$minSelected = 0;
@@ -6708,7 +6712,7 @@ class Form
if ($typehour != 'text') {
$retstring .= ' '.$langs->trans('HourShort');
} else {
- $retstring .= ':';
+ $retstring .= ':';
}
// Minutes
@@ -6736,7 +6740,7 @@ class Form
$retstring .= ' '.$langs->trans('MinuteShort');
}
- //$retstring.=" ";
+ $retstring.="";
if (!empty($nooutput)) {
return $retstring;
diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php
index 217bba55330..d8801d00dc7 100644
--- a/htdocs/core/class/html.formfile.class.php
+++ b/htdocs/core/class/html.formfile.class.php
@@ -360,8 +360,8 @@ class FormFile
* This also set the property $this->numoffiles
*
* @param string $modulepart Module the files are related to ('propal', 'facture', 'facture_fourn', 'mymodule', 'mymodule:MyObject', 'mymodule_temp', ...)
- * @param string $modulesubdir Existing (so sanitized) sub-directory to scan (Example: '0/1/10', 'FA/DD/MM/YY/9999'). Use '' if file is not into subdir of module.
- * @param string $filedir Directory to scan
+ * @param string $modulesubdir Existing (so sanitized) sub-directory to scan (Example: '0/1/10', 'FA/DD/MM/YY/9999'). Use '' if file is not into a subdir of module.
+ * @param string $filedir Directory to scan (must not end with a /). Example: '/mydolibarrdocuments/facture/FAYYMM-1234'
* @param string $urlsource Url of origin page (for return)
* @param int|string[] $genallowed Generation is allowed (1/0 or array list of templates)
* @param int $delallowed Remove is allowed (1/0)
@@ -1283,12 +1283,22 @@ class FormFile
}
print '
';
print '
';
- if (!$disablemove) {
+ if (empty($disablemove) && count($filearray) > 1) {
print '
';
}
print "\n";
}
+ // Get list of files stored into database for same relative directory
+ if ($relativedir) {
+ completeFileArrayWithDatabaseInfo($filearray, $relativedir);
+
+ //var_dump($sortfield.' - '.$sortorder);
+ if ($sortfield && $sortorder) { // If $sortfield is for example 'position_name', we will sort on the property 'position_name' (that is concat of position+name)
+ $filearray = dol_sort_array($filearray, $sortfield, $sortorder);
+ }
+ }
+
print '
\n";
- // Get list of files stored into database for same relative directory
- if ($relativedir) {
- completeFileArrayWithDatabaseInfo($filearray, $relativedir);
-
- //var_dump($sortfield.' - '.$sortorder);
- if ($sortfield && $sortorder) { // If $sortfield is for example 'position_name', we will sort on the property 'position_name' (that is concat of position+name)
- $filearray = dol_sort_array($filearray, $sortfield, $sortorder);
- }
- }
-
$nboffiles = count($filearray);
if ($nboffiles > 0) {
include_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
@@ -1510,18 +1510,18 @@ class FormFile
}
print "";
- if (empty($disablemove)) {
+ if (empty($disablemove) && count($filearray) > 1) {
if ($nboffiles > 1 && $conf->browser->layout != 'phone') {
print '