From ac872b6d3dc618b23b456fd7dccb9e9c1535e103 Mon Sep 17 00:00:00 2001 From: Anthony Berton <34568357+bb2a@users.noreply.github.com> Date: Fri, 24 Apr 2020 23:36:37 +0200 Subject: [PATCH 001/158] Update global.inc.php --- htdocs/theme/eldy/global.inc.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index e495a3bb4bc..7b8e1373df9 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -3360,6 +3360,7 @@ tr.liste_titre th, th.liste_titre, tr.liste_titre td, td.liste_titre, form.liste } tr.liste_titre th a, th.liste_titre a, tr.liste_titre td a, td.liste_titre a, form.liste_titre div a, div.liste_titre a { text-shadow: none !important; + color: unset; } tr.liste_titre_topborder td { border-top-width: px; From b5abb72c5b5b1ab74cce3700b20bc2c3cf03a9dd Mon Sep 17 00:00:00 2001 From: Marc Guenneugues Date: Sat, 2 May 2020 16:36:40 +0200 Subject: [PATCH 002/158] Add / as a delimiter for replacement pattern in select_produits* --- htdocs/core/class/html.form.class.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 5eaa7d5ede8..f48ce989a7a 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -2507,7 +2507,7 @@ class Form $label = $objp->label; if (!empty($objp->label_translated)) $label = $objp->label_translated; - if (!empty($filterkey) && $filterkey != '') $label = preg_replace('/('.preg_quote($filterkey).')/i', '$1', $label, 1); + if (!empty($filterkey) && $filterkey != '') $label = preg_replace('/('.preg_quote($filterkey, '/').')/i', '$1', $label, 1); $outkey = $objp->rowid; $outref = $objp->ref; @@ -2579,7 +2579,7 @@ class Form if ($outorigin && !empty($conf->global->PRODUCT_SHOW_ORIGIN_IN_COMBO)) $opt .= ' ('.getCountry($outorigin, 1).')'; $objRef = $objp->ref; - if (!empty($filterkey) && $filterkey != '') $objRef = preg_replace('/('.preg_quote($filterkey).')/i', '$1', $objRef, 1); + if (!empty($filterkey) && $filterkey != '') $objRef = preg_replace('/('.preg_quote($filterkey, '/').')/i', '$1', $objRef, 1); $outval .= $objRef; if ($outbarcode) $outval .= ' ('.$outbarcode.')'; $outval .= ' - '.dol_trunc($label, $maxlengtharticle); @@ -2948,11 +2948,11 @@ class Form } $objRef = $objp->ref; - if ($filterkey && $filterkey != '') $objRef = preg_replace('/('.preg_quote($filterkey).')/i', '$1', $objRef, 1); + if ($filterkey && $filterkey != '') $objRef = preg_replace('/('.preg_quote($filterkey, '/').')/i', '$1', $objRef, 1); $objRefFourn = $objp->ref_fourn; - if ($filterkey && $filterkey != '') $objRefFourn = preg_replace('/('.preg_quote($filterkey).')/i', '$1', $objRefFourn, 1); + if ($filterkey && $filterkey != '') $objRefFourn = preg_replace('/('.preg_quote($filterkey, '/').')/i', '$1', $objRefFourn, 1); $label = $objp->label; - if ($filterkey && $filterkey != '') $label = preg_replace('/('.preg_quote($filterkey).')/i', '$1', $label, 1); + if ($filterkey && $filterkey != '') $label = preg_replace('/('.preg_quote($filterkey, '/').')/i', '$1', $label, 1); $optlabel = $objp->ref; if (!empty($objp->idprodfournprice) && ($objp->ref != $objp->ref_fourn)) { From 1929f9132db3c67023ce284a935943a8c47b232a Mon Sep 17 00:00:00 2001 From: proprum <51385888+proprum@users.noreply.github.com> Date: Sat, 2 May 2020 17:25:22 +0200 Subject: [PATCH 003/158] MAIN_NO_CONCAT_DESCRIPTION in contrat/card.php Idem to propal/card.php --- htdocs/contrat/card.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index 3c64b627a5c..111a446d9ae 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -521,7 +521,8 @@ if (empty($reshook)) } $desc = $prod->description; - $desc = dol_concatdesc($desc, $product_desc, '', !empty($conf->global->MAIN_CHANGE_ORDER_CONCAT_DESCRIPTION)); + if (!empty($product_desc) && !empty($conf->global->MAIN_NO_CONCAT_DESCRIPTION)) $desc = $product_desc; + else $desc = dol_concatdesc($desc, $product_desc, '', !empty($conf->global->MAIN_CHANGE_ORDER_CONCAT_DESCRIPTION)); $fk_unit = $prod->fk_unit; } else From 81c808692e13f45922f7716b8c698e1537bc2e1a Mon Sep 17 00:00:00 2001 From: "jove@bisquerra.com" Date: Sat, 2 May 2020 22:00:04 +0200 Subject: [PATCH 004/158] NEW Bar Restaurant tab and Auto order --- htdocs/core/lib/takepos.lib.php | 8 ++ htdocs/langs/en_US/cashdesk.lang | 4 +- htdocs/takepos/admin/bar.php | 178 +++++++++++++++++++++++++++++++ htdocs/takepos/admin/setup.php | 55 ---------- htdocs/takepos/ajax/ajax.php | 6 ++ htdocs/takepos/auto_order.php | 29 +++++ htdocs/takepos/genimg/qr.php | 33 ++++++ htdocs/takepos/invoice.php | 7 +- htdocs/takepos/phone.php | 31 ++++-- 9 files changed, 287 insertions(+), 64 deletions(-) create mode 100644 htdocs/takepos/admin/bar.php create mode 100644 htdocs/takepos/auto_order.php create mode 100644 htdocs/takepos/genimg/qr.php diff --git a/htdocs/core/lib/takepos.lib.php b/htdocs/core/lib/takepos.lib.php index 8a883ceef91..729952916ad 100644 --- a/htdocs/core/lib/takepos.lib.php +++ b/htdocs/core/lib/takepos.lib.php @@ -42,6 +42,14 @@ function takepos_prepare_head() $head[$h][1] = $langs->trans("Receipt"); $head[$h][2] = 'receipt'; $h++; + + if ($conf->global->TAKEPOS_BAR_RESTAURANT) + { + $head[$h][0] = DOL_URL_ROOT.'/takepos/admin/bar.php'; + $head[$h][1] = $langs->trans("BarRestaurant"); + $head[$h][2] = 'bar'; + $h++; + } $numterminals = max(1, $conf->global->TAKEPOS_NUM_TERMINALS); for ($i = 1; $i <= $numterminals; $i++) diff --git a/htdocs/langs/en_US/cashdesk.lang b/htdocs/langs/en_US/cashdesk.lang index f2bc989b953..b22a7b83166 100644 --- a/htdocs/langs/en_US/cashdesk.lang +++ b/htdocs/langs/en_US/cashdesk.lang @@ -105,4 +105,6 @@ CashReport=Cash report MainPrinterToUse=Main printer to use OrderPrinterToUse=Order printer to use MainTemplateToUse=Main template to use -OrderTemplateToUse=Order template to use \ No newline at end of file +OrderTemplateToUse=Order template to use +BarRestaurant=Bar Restaurant +AutoOrder=Customer auto order \ No newline at end of file diff --git a/htdocs/takepos/admin/bar.php b/htdocs/takepos/admin/bar.php new file mode 100644 index 00000000000..16fccf85147 --- /dev/null +++ b/htdocs/takepos/admin/bar.php @@ -0,0 +1,178 @@ + + * Copyright (C) 2011-2017 Juanjo Menent + * + * 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/takepos/admin/bar.php + * \ingroup takepos + * \brief Setup page for TakePos module - Bar Restaurant features + */ + +require '../../main.inc.php'; // Load $user and permissions +require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; +require_once DOL_DOCUMENT_ROOT."/core/lib/takepos.lib.php"; + +// Security check +if (!$user->admin) accessforbidden(); + +$langs->loadLangs(array("admin", "cashdesk", "printing")); + +global $db; + +/* + * Actions + */ + +if (GETPOST('action', 'alpha') == 'set') +{ + $db->begin(); + + dol_syslog("admin/cashdesk: level ".GETPOST('level', 'alpha')); + + if (!$res > 0) $error++; + + if (!$error) + { + $db->commit(); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); + } + else + { + $db->rollback(); + setEventMessages($langs->trans("Error"), null, 'errors'); + } +} + + +/* + * View + */ + +$form = new Form($db); +$formproduct = new FormProduct($db); + +llxHeader('', $langs->trans("CashDeskSetup")); + +$linkback = ''.$langs->trans("BackToModuleList").''; +print load_fiche_titre($langs->trans("CashDeskSetup").' (TakePOS)', $linkback, 'title_setup'); +$head = takepos_prepare_head(); +dol_fiche_head($head, 'bar', 'TakePOS', -1); +print '
'; + + +// Mode +print '
'; +print ''; +print ''; + +print '
'; +print ''; +print ''; +print ''; +print "\n"; + +if ($conf->global->TAKEPOS_BAR_RESTAURANT && $conf->global->TAKEPOS_PRINT_METHOD != "browser") { + print ''; + + print ''; +} + +print ''; + +print ''; + +if ($conf->global->TAKEPOS_SUPPLEMENTS) +{ + print '\n"; +} + +print ''; + + +print '
'.$langs->trans("Parameters").''.$langs->trans("Value").'
'; + print $langs->trans("OrderPrinters").' ('.$langs->trans("Setup").')'; + print ''; + print ajax_constantonoff("TAKEPOS_ORDER_PRINTERS", array(), $conf->entity, 0, 0, 1, 0); + //print $form->selectyesno("TAKEPOS_ORDER_PRINTERS", $conf->global->TAKEPOS_ORDER_PRINTERS, 1); + print '
'; + print $langs->trans("OrderNotes"); + print ''; + print ajax_constantonoff("TAKEPOS_ORDER_NOTES", array(), $conf->entity, 0, 0, 1, 0); + //print $form->selectyesno("TAKEPOS_ORDER_NOTES", $conf->global->TAKEPOS_ORDER_NOTES, 1); + print '
'; +print $langs->trans("BasicPhoneLayout"); +print ''; +//print $form->selectyesno("TAKEPOS_PHONE_BASIC_LAYOUT", $conf->global->TAKEPOS_PHONE_BASIC_LAYOUT, 1); +print ajax_constantonoff("TAKEPOS_PHONE_BASIC_LAYOUT", array(), $conf->entity, 0, 0, 1, 0); +print '
'; +print $langs->trans("ProductSupplements"); +print ''; +//print $form->selectyesno("TAKEPOS_SUPPLEMENTS", $conf->global->TAKEPOS_SUPPLEMENTS, 1); +print ajax_constantonoff("TAKEPOS_SUPPLEMENTS", array(), $conf->entity, 0, 0, 1, 0); +print '
'; + print $langs->trans("SupplementCategory"); + print ''; + print $form->select_all_categories(Categorie::TYPE_PRODUCT, $conf->global->TAKEPOS_SUPPLEMENTS_CATEGORY, 'TAKEPOS_SUPPLEMENTS_CATEGORY', 64, 0, 0); + print ajax_combobox('TAKEPOS_SUPPLEMENTS_CATEGORY'); + print "
'; +print $langs->trans("AutoOrder"); +print ''; +print ajax_constantonoff("TAKEPOS_AUTO_ORDER", array(), $conf->entity, 0, 0, 1, 0); +print '
'; + +if ($conf->global->TAKEPOS_AUTO_ORDER) +{ + print '
'; + print ''; + print ''; + print ''; + print "\n"; + + //global $dolibarr_main_url_root; + $urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root)); + $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file + $sql = "SELECT rowid, entity, label, leftpos, toppos, floor FROM ".MAIN_DB_PREFIX."takepos_floor_tables"; + $resql = $db->query($sql); + $rows = array(); + while ($row = $db->fetch_array($resql)) { + print ''; + } + + print '
'.$langs->trans("Table").''.$langs->trans("URL").''.$langs->trans("QR").'
'; + print $langs->trans("Table")." ".$row['label']; + print ''; + print "".$urlwithroot."/takepos/auto_order.php?key=".dol_encode($row['rowid']).""; + print ''; + print ""; + print '
'; +} + +print '
'; + +print '
'; + +print '
'; + +print "
\n"; + +print '
'; + +llxFooter(); +$db->close(); diff --git a/htdocs/takepos/admin/setup.php b/htdocs/takepos/admin/setup.php index 3e12fdce5c9..59fe85e66ef 100644 --- a/htdocs/takepos/admin/setup.php +++ b/htdocs/takepos/admin/setup.php @@ -434,19 +434,6 @@ print "\n"; //print $form->selectarray('TAKEPOS_ADDON', $array, (empty($conf->global->TAKEPOS_ADDON) ? '0' : $conf->global->TAKEPOS_ADDON), 0); //print "\n"; -print ''; -print ''; - -print '
'; - -// Bar Restaurant mode -print '
'; -print ''; - -print ''; -print ''; -print "\n"; - print ''; @@ -455,48 +442,6 @@ print ajax_constantonoff("TAKEPOS_BAR_RESTAURANT", array(), $conf->entity, 0, 0, //print $form->selectyesno("TAKEPOS_BAR_RESTAURANT", $conf->global->TAKEPOS_BAR_RESTAURANT, 1); print "\n"; -if ($conf->global->TAKEPOS_BAR_RESTAURANT && $conf->global->TAKEPOS_PRINT_METHOD != "browser") { - print ''; - - print ''; -} - -if ($conf->global->TAKEPOS_BAR_RESTAURANT) -{ - print ''; - - print ''; - - if ($conf->global->TAKEPOS_SUPPLEMENTS) - { - print '\n"; - } -} print '
'.$langs->trans("Other").''.$langs->trans("Value").'
'; print $langs->trans("EnableBarOrRestaurantFeatures"); print '
'; - print $langs->trans("OrderPrinters").' ('.$langs->trans("Setup").')'; - print ''; - print ajax_constantonoff("TAKEPOS_ORDER_PRINTERS", array(), $conf->entity, 0, 0, 1, 0); - //print $form->selectyesno("TAKEPOS_ORDER_PRINTERS", $conf->global->TAKEPOS_ORDER_PRINTERS, 1); - print '
'; - print $langs->trans("OrderNotes"); - print ''; - print ajax_constantonoff("TAKEPOS_ORDER_NOTES", array(), $conf->entity, 0, 0, 1, 0); - //print $form->selectyesno("TAKEPOS_ORDER_NOTES", $conf->global->TAKEPOS_ORDER_NOTES, 1); - print '
'; - print $langs->trans("BasicPhoneLayout"); - print ''; - //print $form->selectyesno("TAKEPOS_PHONE_BASIC_LAYOUT", $conf->global->TAKEPOS_PHONE_BASIC_LAYOUT, 1); - print ajax_constantonoff("TAKEPOS_PHONE_BASIC_LAYOUT", array(), $conf->entity, 0, 0, 1, 0); - print '
'; - print $langs->trans("ProductSupplements"); - print ''; - //print $form->selectyesno("TAKEPOS_SUPPLEMENTS", $conf->global->TAKEPOS_SUPPLEMENTS, 1); - print ajax_constantonoff("TAKEPOS_SUPPLEMENTS", array(), $conf->entity, 0, 0, 1, 0); - print '
'; - print $langs->trans("SupplementCategory"); - print ''; - print $form->select_all_categories(Categorie::TYPE_PRODUCT, $conf->global->TAKEPOS_SUPPLEMENTS_CATEGORY, 'TAKEPOS_SUPPLEMENTS_CATEGORY', 64, 0, 0); - print ajax_combobox('TAKEPOS_SUPPLEMENTS_CATEGORY'); - print "
'; print '
'; diff --git a/htdocs/takepos/ajax/ajax.php b/htdocs/takepos/ajax/ajax.php index f3b5ba15716..d1f59325c1f 100644 --- a/htdocs/takepos/ajax/ajax.php +++ b/htdocs/takepos/ajax/ajax.php @@ -142,4 +142,10 @@ elseif ($action == 'search' && $term != '') { } echo json_encode($object); +} elseif ($action == 'thecheck') { + $place = GETPOST('place', 'alpha'); + require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; + require_once DOL_DOCUMENT_ROOT.'/core/class/dolreceiptprinter.class.php'; + $printer = new dolReceiptPrinter($db); + $printer->sendToPrinter($object, $conf->global->{'TAKEPOS_TEMPLATE_TO_USE_FOR_INVOICES'.$term}, $conf->global->{'TAKEPOS_PRINTER_TO_USE'.$term}); } diff --git a/htdocs/takepos/auto_order.php b/htdocs/takepos/auto_order.php new file mode 100644 index 00000000000..5305b4da81f --- /dev/null +++ b/htdocs/takepos/auto_order.php @@ -0,0 +1,29 @@ + + * + * 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/takepos/auto_order.php + * \ingroup takepos + * \brief Public orders for customers + */ + +if (!defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session) +if (!defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip + +$_SESSION["basiclayout"] = 1; +$_SESSION["publicterminal"] = true; // Is a public customer +require 'phone.php'; diff --git a/htdocs/takepos/genimg/qr.php b/htdocs/takepos/genimg/qr.php new file mode 100644 index 00000000000..23b033f3da5 --- /dev/null +++ b/htdocs/takepos/genimg/qr.php @@ -0,0 +1,33 @@ + + * + * 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 . + */ + +if (!defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session) +if (!defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip +if (!defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); +if (!defined('NOCSRFCHECK')) define('NOCSRFCHECK', '1'); +if (!defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); +if (!defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); +if (!defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); +if (!defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); + +require '../../main.inc.php'; // Load $user and permissions +require '../../core/modules/barcode/doc/tcpdfbarcode.modules.php'; + +$key = GETPOST('key'); + +$module = new modtcpdfbarcode($db); +$result = $module->buildBarCode("http://www.takepos.com", 'QRCODE', 'Y'); \ No newline at end of file diff --git a/htdocs/takepos/invoice.php b/htdocs/takepos/invoice.php index fa5ca2f83be..f59a3b5c97d 100644 --- a/htdocs/takepos/invoice.php +++ b/htdocs/takepos/invoice.php @@ -47,13 +47,16 @@ $idproduct = GETPOST('idproduct', 'int'); $place = (GETPOST('place', 'aZ09') ? GETPOST('place', 'aZ09') : 0); // $place is id of table for Bar or Restaurant $placeid = 0; // $placeid is ID of invoice -if (empty($user->rights->takepos->run)) { +if ($_SESSION["publicterminal"]) { + $_SESSION["takeposterminal"] = 1; // Use Terminal 1 for public customers +} +else if (empty($user->rights->takepos->run)) { accessforbidden(); } -if ($conf->global->TAKEPOS_PHONE_BASIC_LAYOUT == 1 && $conf->browser->layout == 'phone') +if (($conf->global->TAKEPOS_PHONE_BASIC_LAYOUT == 1 && $conf->browser->layout == 'phone') || $_SESSION["publicterminal"]) { // DIRECT LINK TO THIS PAGE FROM MOBILE AND NO TERMINAL SELECTED if ($_SESSION["takeposterminal"] == "") diff --git a/htdocs/takepos/phone.php b/htdocs/takepos/phone.php index b2526ef885e..224cf3dd1c3 100644 --- a/htdocs/takepos/phone.php +++ b/htdocs/takepos/phone.php @@ -37,7 +37,12 @@ require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php'; -$place = (GETPOST('place', 'aZ09') ? GETPOST('place', 'aZ09') : 0); // $place is id of table for Ba or Restaurant +if ($_SESSION["publicterminal"]){ + // Decode place if is a order from customer phone + $key = GETPOST('key'); + $place=dol_decode($key); +} +else $place = (GETPOST('place', 'aZ09') ? GETPOST('place', 'aZ09') : 0); // $place is id of table for Ba or Restaurant $action = GETPOST('action', 'alpha'); $setterminal = GETPOST('setterminal', 'int'); @@ -48,7 +53,10 @@ if ($setterminal > 0) $langs->loadLangs(array("bills", "orders", "commercial", "cashdesk", "receiptprinter")); -if (empty($user->rights->takepos->run)) { +if ($_SESSION["publicterminal"]) { + $_SESSION["takeposterminal"] = 1; // Use Terminal 1 for public customers +} +else if (empty($user->rights->takepos->run)) { accessforbidden(); } @@ -167,6 +175,14 @@ function Exit(){ window.location.href='../user/logout.php'; } +function CheckPlease(){ + console.log("Request the check to the waiter"); + $.ajax({ + type: "GET", + url: "", + }); +} + @@ -175,10 +191,13 @@ if ($conf->global->TAKEPOS_NUM_TERMINALS != "1" && $_SESSION["takeposterminal"] ?>
- - - - + '.strtoupper(substr($langs->trans('Floors'), 0, 3)).''; + print ''; + print ''; + print ''; + if ($_SESSION["publicterminal"]) print ''; + ?>
From 35713ef0046b22f31c848fef1ea6facbb004b712 Mon Sep 17 00:00:00 2001 From: andreubisquerra Date: Sun, 3 May 2020 00:05:59 +0200 Subject: [PATCH 005/158] Fix travis --- htdocs/takepos/genimg/qr.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/takepos/genimg/qr.php b/htdocs/takepos/genimg/qr.php index 23b033f3da5..f0c3bea82b9 100644 --- a/htdocs/takepos/genimg/qr.php +++ b/htdocs/takepos/genimg/qr.php @@ -30,4 +30,4 @@ require '../../core/modules/barcode/doc/tcpdfbarcode.modules.php'; $key = GETPOST('key'); $module = new modtcpdfbarcode($db); -$result = $module->buildBarCode("http://www.takepos.com", 'QRCODE', 'Y'); \ No newline at end of file +$result = $module->buildBarCode("http://www.takepos.com", 'QRCODE', 'Y'); From ac75cf318eba8edaa0be6ed9fd7bee7f8a31f1d8 Mon Sep 17 00:00:00 2001 From: andreubisquerra Date: Sun, 3 May 2020 00:07:04 +0200 Subject: [PATCH 006/158] Fix travis --- htdocs/takepos/invoice.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/takepos/invoice.php b/htdocs/takepos/invoice.php index f59a3b5c97d..b1641072829 100644 --- a/htdocs/takepos/invoice.php +++ b/htdocs/takepos/invoice.php @@ -50,7 +50,7 @@ $placeid = 0; // $placeid is ID of invoice if ($_SESSION["publicterminal"]) { $_SESSION["takeposterminal"] = 1; // Use Terminal 1 for public customers } -else if (empty($user->rights->takepos->run)) { +elseif (empty($user->rights->takepos->run)) { accessforbidden(); } From 32923daa9decc772155f713ea5aedfa9ff7c029b Mon Sep 17 00:00:00 2001 From: andreubisquerra Date: Sun, 3 May 2020 00:07:52 +0200 Subject: [PATCH 007/158] Fix travis --- htdocs/takepos/phone.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/takepos/phone.php b/htdocs/takepos/phone.php index 224cf3dd1c3..80d67513bf2 100644 --- a/htdocs/takepos/phone.php +++ b/htdocs/takepos/phone.php @@ -56,7 +56,7 @@ $langs->loadLangs(array("bills", "orders", "commercial", "cashdesk", "receiptpri if ($_SESSION["publicterminal"]) { $_SESSION["takeposterminal"] = 1; // Use Terminal 1 for public customers } -else if (empty($user->rights->takepos->run)) { +elseif (empty($user->rights->takepos->run)) { accessforbidden(); } From 8530db6dab7d7d8a068cac0705c47541f5062fc3 Mon Sep 17 00:00:00 2001 From: andreubisquerra Date: Sun, 3 May 2020 00:09:17 +0200 Subject: [PATCH 008/158] Fix travis --- htdocs/takepos/admin/bar.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/takepos/admin/bar.php b/htdocs/takepos/admin/bar.php index 16fccf85147..672041d3bb3 100644 --- a/htdocs/takepos/admin/bar.php +++ b/htdocs/takepos/admin/bar.php @@ -138,13 +138,13 @@ print ''; print ''; if ($conf->global->TAKEPOS_AUTO_ORDER) -{ +{ print '
'; print ''; print ''; print ''; print "\n"; - + //global $dolibarr_main_url_root; $urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root)); $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file From fe98e430ceaa18d98a26706c7515e3d09201b86e Mon Sep 17 00:00:00 2001 From: andreubisquerra Date: Sun, 3 May 2020 00:10:12 +0200 Subject: [PATCH 009/158] Fix travis --- htdocs/core/lib/takepos.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/takepos.lib.php b/htdocs/core/lib/takepos.lib.php index 729952916ad..d04fa5f77ef 100644 --- a/htdocs/core/lib/takepos.lib.php +++ b/htdocs/core/lib/takepos.lib.php @@ -42,7 +42,7 @@ function takepos_prepare_head() $head[$h][1] = $langs->trans("Receipt"); $head[$h][2] = 'receipt'; $h++; - + if ($conf->global->TAKEPOS_BAR_RESTAURANT) { $head[$h][0] = DOL_URL_ROOT.'/takepos/admin/bar.php'; From e0ebe85c134bebf41e794026af59b9b475648af7 Mon Sep 17 00:00:00 2001 From: Maxime Kohlhaas Date: Sun, 3 May 2020 09:15:12 +0200 Subject: [PATCH 010/158] Fix addline titles --- htdocs/core/tpl/objectline_create.tpl.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/htdocs/core/tpl/objectline_create.tpl.php b/htdocs/core/tpl/objectline_create.tpl.php index 160d323a2c2..5e99146bc53 100644 --- a/htdocs/core/tpl/objectline_create.tpl.php +++ b/htdocs/core/tpl/objectline_create.tpl.php @@ -813,7 +813,7 @@ if (!empty($usemargins) && $user->rights->margins->creer) jQuery("#prod_entry_mode_free").prop('checked',true).change(); jQuery("#prod_entry_mode_predef").prop('checked',false).change(); jQuery("#search_idprod, #idprod, #search_idprodfournprice, #buying_price").val(''); - jQuery("#price_ht, #multicurrency_price_ht, #price_ttc, #price_ttc, #fourn_ref, #tva_tx, #buying_price, #title_vat, #title_up_ht, #title_up_ht_currency, #title_up_ttc, #title_up_ttc_currency").show(); + jQuery("#price_ht, #multicurrency_price_ht, #price_ttc, #price_ttc, #fourn_ref, #tva_tx, #buying_price, #title_fourn_ref, #title_vat, #title_up_ht, #title_up_ht_currency, #title_up_ttc, #title_up_ttc_currency").show(); jQuery("#np_marginRate, #np_markRate, .np_marginRate, .np_markRate, #units, #title_units").show(); jQuery("#fournprice_predef").hide(); } @@ -825,11 +825,13 @@ if (!empty($usemargins) && $user->rights->margins->creer) global->MAIN_DISABLE_EDIT_PREDEF_PRICEHT)) { ?> jQuery("#price_ht").val('').show(); jQuery("#multicurrency_price_ht").val('').show(); + jQuery("#title_up_ht, #title_up_ht_currency").show(); jQuery("#price_ht").val('').hide(); jQuery("#multicurrency_price_ht").val('').hide(); + jQuery("#title_up_ht, #title_up_ht_currency").hide(); - jQuery("#price_ttc, #fourn_ref, #tva_tx, #title_vat, #title_up_ht_currency, #title_up_ttc, #title_up_ttc_currency").hide(); + jQuery("#price_ttc, #fourn_ref, #tva_tx, #title_fourn_ref, #title_vat, #title_up_ttc, #title_up_ttc_currency").hide(); jQuery("#np_marginRate, #np_markRate, .np_marginRate, .np_markRate, #units, #title_units").hide(); jQuery("#buying_price").show(); jQuery('#trlinefordates, .divlinefordates').show(); From c3521502deff79b1ca166a51aca9552b13708fcf Mon Sep 17 00:00:00 2001 From: Anthony Berton <34568357+bb2a@users.noreply.github.com> Date: Sun, 3 May 2020 10:34:56 +0200 Subject: [PATCH 011/158] Update global.inc.php --- htdocs/theme/eldy/global.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 7b8e1373df9..786bdbd431b 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -3360,7 +3360,7 @@ tr.liste_titre th, th.liste_titre, tr.liste_titre td, td.liste_titre, form.liste } tr.liste_titre th a, th.liste_titre a, tr.liste_titre td a, td.liste_titre a, form.liste_titre div a, div.liste_titre a { text-shadow: none !important; - color: unset; + color: rgb(); } tr.liste_titre_topborder td { border-top-width: px; From 87d86f32ee28ca4012a7a977fd4fdd17872b69a5 Mon Sep 17 00:00:00 2001 From: Anthony Berton <34568357+bb2a@users.noreply.github.com> Date: Sun, 3 May 2020 10:40:52 +0200 Subject: [PATCH 012/158] Update usergroups.lib.php --- htdocs/core/lib/usergroups.lib.php | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/htdocs/core/lib/usergroups.lib.php b/htdocs/core/lib/usergroups.lib.php index 5b7c923001b..003d1260252 100644 --- a/htdocs/core/lib/usergroups.lib.php +++ b/htdocs/core/lib/usergroups.lib.php @@ -732,7 +732,34 @@ function showSkins($fuser, $edit = 0, $foruserprofile = false) print ''; } + + // TextTitleLinkColor + if ($foruserprofile) + { + } + else + { + $default=(empty($colortexttitlelink) ? $langs->trans("Unknown") : colorArrayToHex(colorStringToArray($colortexttitlelink))); + print ''; + print ''; + print ''; + + print ''; + } + // BackgroundTableLineOddColor if ($foruserprofile) { From 5c1eb08b3fdbb6fcfa72203d90d58d7795781758 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Sun, 3 May 2020 08:42:45 +0000 Subject: [PATCH 013/158] Fixing style errors. --- htdocs/core/lib/usergroups.lib.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/lib/usergroups.lib.php b/htdocs/core/lib/usergroups.lib.php index 003d1260252..8be3e234273 100644 --- a/htdocs/core/lib/usergroups.lib.php +++ b/htdocs/core/lib/usergroups.lib.php @@ -732,7 +732,7 @@ function showSkins($fuser, $edit = 0, $foruserprofile = false) print ''; } - + // TextTitleLinkColor if ($foruserprofile) { @@ -759,7 +759,7 @@ function showSkins($fuser, $edit = 0, $foruserprofile = false) print ''; } - + // BackgroundTableLineOddColor if ($foruserprofile) { From f299f0f849d7a745cabcfdcc8d8b41347f59dbee Mon Sep 17 00:00:00 2001 From: Anthony Berton <34568357+bb2a@users.noreply.github.com> Date: Sun, 3 May 2020 10:42:49 +0200 Subject: [PATCH 014/158] Update theme_vars.inc.php --- htdocs/theme/eldy/theme_vars.inc.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/theme/eldy/theme_vars.inc.php b/htdocs/theme/eldy/theme_vars.inc.php index f6324f0146f..823b8168b4c 100644 --- a/htdocs/theme/eldy/theme_vars.inc.php +++ b/htdocs/theme/eldy/theme_vars.inc.php @@ -69,6 +69,7 @@ $colorbacklinebreak = '233,228,230'; // line break $colorbackbody = '255,255,255'; $colortexttitlenotab = '0,113,120'; // 150,90,121 140,80,10 or 10,140,80 #875a7b green=0,113,120, violet: 0,50,120 $colortexttitle = '0,0,0'; +$colortexttitlelink = '10, 20, 100'; $colortext = '0,0,0'; $colortextlink = '10, 20, 100'; $fontsize = '0.86em'; From 2f18b444d7946335604dfd2cd19a831540a2fd37 Mon Sep 17 00:00:00 2001 From: Anthony Berton <34568357+bb2a@users.noreply.github.com> Date: Sun, 3 May 2020 10:44:37 +0200 Subject: [PATCH 015/158] Update style.css.php --- htdocs/theme/eldy/style.css.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 39fcd003335..927d29e1919 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -128,6 +128,7 @@ $colorbacklinebreak = empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED) ? (emp $colorbackbody = empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED) ? (empty($conf->global->THEME_ELDY_BACKBODY) ? $colorbackbody : $conf->global->THEME_ELDY_BACKBODY) : (empty($user->conf->THEME_ELDY_BACKBODY) ? $colorbackbody : $user->conf->THEME_ELDY_BACKBODY); $colortexttitlenotab = empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED) ? (empty($conf->global->THEME_ELDY_TEXTTITLENOTAB) ? $colortexttitlenotab : $conf->global->THEME_ELDY_TEXTTITLENOTAB) : (empty($user->conf->THEME_ELDY_TEXTTITLENOTAB) ? $colortexttitlenotab : $user->conf->THEME_ELDY_TEXTTITLENOTAB); $colortexttitle = empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED) ? (empty($conf->global->THEME_ELDY_TEXTTITLE) ? $colortexttitle : $conf->global->THEME_ELDY_TEXTTITLE) : (empty($user->conf->THEME_ELDY_TEXTTITLE) ? $colortexttitle : $user->conf->THEME_ELDY_TEXTTITLE); +$colortexttitlelink = empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED) ? (empty($conf->global->THEME_ELDY_TEXTTITLELINK) ? $colortexttitlelink : $conf->global->THEME_ELDY_TEXTTITLELINK) : (empty($user->conf->THEME_ELDY_TEXTTITLELINK) ? $colortexttitlelink : $user->conf->THEME_ELDY_TEXTTITLELINK); $colortext = empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED) ? (empty($conf->global->THEME_ELDY_TEXT) ? $colortext : $conf->global->THEME_ELDY_TEXT) : (empty($user->conf->THEME_ELDY_TEXT) ? $colortext : $user->conf->THEME_ELDY_TEXT); $colortextlink = empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED) ? (empty($conf->global->THEME_ELDY_TEXTLINK) ? $colortextlink : $conf->global->THEME_ELDY_TEXTLINK) : (empty($user->conf->THEME_ELDY_TEXTLINK) ? $colortextlink : $user->conf->THEME_ELDY_TEXTLINK); $fontsize = empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED) ? (empty($conf->global->THEME_ELDY_FONT_SIZE1) ? $fontsize : $conf->global->THEME_ELDY_FONT_SIZE1) : (empty($user->conf->THEME_ELDY_FONT_SIZE1) ? $fontsize : $user->conf->THEME_ELDY_FONT_SIZE1); From 44bafb7225555aff485d418b6440ee01a82f694a Mon Sep 17 00:00:00 2001 From: Anthony Berton <34568357+bb2a@users.noreply.github.com> Date: Sun, 3 May 2020 10:46:48 +0200 Subject: [PATCH 016/158] Update ihm.php --- htdocs/admin/ihm.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/htdocs/admin/ihm.php b/htdocs/admin/ihm.php index ab67974c920..c83dd83a9c9 100644 --- a/htdocs/admin/ihm.php +++ b/htdocs/admin/ihm.php @@ -121,6 +121,10 @@ if ($action == 'update') $val = (implode(',', (colorStringToArray(GETPOST('THEME_ELDY_TEXTTITLE'), array())))); if ($val == '') dolibarr_del_const($db, 'THEME_ELDY_TEXTTITLE', $conf->entity); else dolibarr_set_const($db, 'THEME_ELDY_TEXTTITLE', $val, 'chaine', 0, '', $conf->entity); + + $val=(implode(',', (colorStringToArray(GETPOST('THEME_ELDY_TEXTTITLELINK'), array())))); + if ($val == '') dolibarr_del_const($db, 'THEME_ELDY_TEXTTITLELINK', $conf->entity); + else dolibarr_set_const($db, 'THEME_ELDY_TEXTTITLELINK', $val, 'chaine', 0, '', $conf->entity); $val = (implode(',', (colorStringToArray(GETPOST('THEME_ELDY_LINEIMPAIR1'), array())))); if ($val == '') dolibarr_del_const($db, 'THEME_ELDY_LINEIMPAIR1', $conf->entity); From 30cb4f0151133291de49b144a2c511a85a3c4bf7 Mon Sep 17 00:00:00 2001 From: Anthony Berton <34568357+bb2a@users.noreply.github.com> Date: Sun, 3 May 2020 10:48:16 +0200 Subject: [PATCH 017/158] Update admin.lang --- htdocs/langs/en_US/admin.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 58e5cecf39d..bb1b56d4465 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1803,6 +1803,7 @@ TopMenuDisableImages=Hide images in Top menu LeftMenuBackgroundColor=Background color for Left menu BackgroundTableTitleColor=Background color for Table title line BackgroundTableTitleTextColor=Text color for Table title line +BackgroundTableTitleTextlinkColor=Text color for Table title link line BackgroundTableLineOddColor=Background color for odd table lines BackgroundTableLineEvenColor=Background color for even table lines MinimumNoticePeriod=Minimum notice period (Your leave request must be done before this delay) From fdb98dd6ed66396087a139c508310b01a7be5a5f Mon Sep 17 00:00:00 2001 From: Anthony Berton <34568357+bb2a@users.noreply.github.com> Date: Sun, 3 May 2020 10:49:57 +0200 Subject: [PATCH 018/158] Update admin.lang --- htdocs/langs/fr_FR/admin.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang index 6363b8b710d..6545b71ede3 100644 --- a/htdocs/langs/fr_FR/admin.lang +++ b/htdocs/langs/fr_FR/admin.lang @@ -1803,6 +1803,7 @@ TopMenuDisableImages=Cacher les images du menu principal LeftMenuBackgroundColor=Couleur de fond pour le menu Gauche BackgroundTableTitleColor=Couleur de fond pour la ligne de titres des liste/tableaux BackgroundTableTitleTextColor=Couleur du texte pour la ligne de titre des tableaux +BackgroundTableTitleTextlinkColor=Couleur du texte pour la ligne de titre lien des tableaux BackgroundTableLineOddColor=Couleur de fond pour les lignes impaires des tables BackgroundTableLineEvenColor=Couleur de fond pour les lignes paires des tales MinimumNoticePeriod=Période de préavis minimum (Votre demande de congé doit être faite avant ce délai) From ef3f121c88a926d7b02a780bceb587bf67abafdf Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Sun, 3 May 2020 08:51:50 +0000 Subject: [PATCH 019/158] Fixing style errors. --- htdocs/admin/ihm.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/admin/ihm.php b/htdocs/admin/ihm.php index c83dd83a9c9..ba849a267e7 100644 --- a/htdocs/admin/ihm.php +++ b/htdocs/admin/ihm.php @@ -121,7 +121,7 @@ if ($action == 'update') $val = (implode(',', (colorStringToArray(GETPOST('THEME_ELDY_TEXTTITLE'), array())))); if ($val == '') dolibarr_del_const($db, 'THEME_ELDY_TEXTTITLE', $conf->entity); else dolibarr_set_const($db, 'THEME_ELDY_TEXTTITLE', $val, 'chaine', 0, '', $conf->entity); - + $val=(implode(',', (colorStringToArray(GETPOST('THEME_ELDY_TEXTTITLELINK'), array())))); if ($val == '') dolibarr_del_const($db, 'THEME_ELDY_TEXTTITLELINK', $conf->entity); else dolibarr_set_const($db, 'THEME_ELDY_TEXTTITLELINK', $val, 'chaine', 0, '', $conf->entity); From a31eaf2eb813fe7ef1b04b940d756b8176018a40 Mon Sep 17 00:00:00 2001 From: Anthony Berton <34568357+bb2a@users.noreply.github.com> Date: Sun, 3 May 2020 13:59:40 +0200 Subject: [PATCH 020/158] Update style.css.php --- htdocs/theme/md/style.css.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index dcc9ce34886..5c3de3d7612 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -130,6 +130,7 @@ $colorbacklinebreak = empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED) ? (emp $colorbackbody = empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED) ? (empty($conf->global->THEME_ELDY_BACKBODY) ? $colorbackbody : $conf->global->THEME_ELDY_BACKBODY) : (empty($user->conf->THEME_ELDY_BACKBODY) ? $colorbackbody : $user->conf->THEME_ELDY_BACKBODY); $colortexttitlenotab = empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED) ? (empty($conf->global->THEME_ELDY_TEXTTITLENOTAB) ? $colortexttitlenotab : $conf->global->THEME_ELDY_TEXTTITLENOTAB) : (empty($user->conf->THEME_ELDY_TEXTTITLENOTAB) ? $colortexttitlenotab : $user->conf->THEME_ELDY_TEXTTITLENOTAB); $colortexttitle = empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED) ? (empty($conf->global->THEME_ELDY_TEXTTITLE) ? $colortext : $conf->global->THEME_ELDY_TEXTTITLE) : (empty($user->conf->THEME_ELDY_TEXTTITLE) ? $colortexttitle : $user->conf->THEME_ELDY_TEXTTITLE); +$colortexttitlelink = empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED) ? (empty($conf->global->THEME_ELDY_TEXTTITLELINK) ? $colortexttitlelink : $conf->global->THEME_ELDY_TEXTTITLELINK) : (empty($user->conf->THEME_ELDY_TEXTTITLELINK) ? $colortexttitlelink : $user->conf->THEME_ELDY_TEXTTITLELINK); $colortext = empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED) ? (empty($conf->global->THEME_ELDY_TEXT) ? $colortext : $conf->global->THEME_ELDY_TEXT) : (empty($user->conf->THEME_ELDY_TEXT) ? $colortext : $user->conf->THEME_ELDY_TEXT); $colortextlink = empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED) ? (empty($conf->global->THEME_ELDY_TEXTLINK) ? $colortext : $conf->global->THEME_ELDY_TEXTLINK) : (empty($user->conf->THEME_ELDY_TEXTLINK) ? $colortextlink : $user->conf->THEME_ELDY_TEXTLINK); $fontsize = empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED) ? (empty($conf->global->THEME_ELDY_FONT_SIZE1) ? $fontsize : $conf->global->THEME_ELDY_FONT_SIZE1) : (empty($user->conf->THEME_ELDY_FONT_SIZE1) ? $fontsize : $user->conf->THEME_ELDY_FONT_SIZE1); From dabb2f4ad39e26438d8e528a78124a4eb4f2b41c Mon Sep 17 00:00:00 2001 From: Anthony Berton <34568357+bb2a@users.noreply.github.com> Date: Sun, 3 May 2020 14:01:42 +0200 Subject: [PATCH 021/158] Update theme_vars.inc.php --- htdocs/theme/md/theme_vars.inc.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/theme/md/theme_vars.inc.php b/htdocs/theme/md/theme_vars.inc.php index d15444acb6c..6cdd37fe913 100644 --- a/htdocs/theme/md/theme_vars.inc.php +++ b/htdocs/theme/md/theme_vars.inc.php @@ -65,6 +65,7 @@ $colorbacklinebreak = '214,218,220'; $colorbackbody = '248,248,248'; $colortexttitlenotab = '80,71,5'; $colortexttitle = '20,20,20'; +$colortexttitlelink = '0,0,120'; $colortext = '0,0,0'; $colortextlink = '0,0,120'; $fontsize = '14'; From d81ae29ab7723262a705e20cdf5af5ae3588ae2c Mon Sep 17 00:00:00 2001 From: Anthony Berton <34568357+bb2a@users.noreply.github.com> Date: Sun, 3 May 2020 14:05:18 +0200 Subject: [PATCH 022/158] Update style.css.php --- htdocs/theme/md/style.css.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 5c3de3d7612..2becbf57324 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -3399,6 +3399,7 @@ tr.liste_titre th, th.liste_titre, tr.liste_titre td, td.liste_titre, form.liste } tr.liste_titre th a, th.liste_titre a, tr.liste_titre td a, td.liste_titre a, form.liste_titre div a, div.liste_titre a { text-shadow: none !important; + color: rgb(); } tr.liste_titre_topborder td { border-top-width: px; From f42492764d9a6e8821cf6938025c68426dadf3dc Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Sun, 3 May 2020 17:16:25 +0200 Subject: [PATCH 023/158] Update html.formproduct.class.php DEFAULT_WAREHOUSE is not select in sherch --- htdocs/product/class/html.formproduct.class.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/htdocs/product/class/html.formproduct.class.php b/htdocs/product/class/html.formproduct.class.php index efde996b927..d6ae705b651 100644 --- a/htdocs/product/class/html.formproduct.class.php +++ b/htdocs/product/class/html.formproduct.class.php @@ -253,10 +253,12 @@ class FormProduct $comboenhancement = ajax_combobox($htmlname, $events); $out .= $comboenhancement; } - - if (empty($selected) && !empty($conf->global->MAIN_DEFAULT_WAREHOUSE)) $selected = $conf->global->MAIN_DEFAULT_WAREHOUSE; - if (empty($selected) && !empty($conf->global->MAIN_DEFAULT_WAREHOUSE_USER)) $selected = $user->fk_warehouse; - + + if ($htmlname != 'search_warehouse'){ + if (empty($selected) && !empty($conf->global->MAIN_DEFAULT_WAREHOUSE)) $selected = $conf->global->MAIN_DEFAULT_WAREHOUSE; + if (empty($selected) && !empty($conf->global->MAIN_DEFAULT_WAREHOUSE_USER)) $selected = $user->fk_warehouse; + } + $out .= ''; if ($empty) $out .= ''; foreach ($this->cache_warehouses as $id => $arraytypes) From 33669b6fd8e2300c64e3a6abec008309915739a6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 3 May 2020 21:15:23 +0200 Subject: [PATCH 025/158] Update html.formproduct.class.php --- htdocs/product/class/html.formproduct.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/class/html.formproduct.class.php b/htdocs/product/class/html.formproduct.class.php index 4887f749d60..0eeddd15c07 100644 --- a/htdocs/product/class/html.formproduct.class.php +++ b/htdocs/product/class/html.formproduct.class.php @@ -254,7 +254,7 @@ class FormProduct $out .= $comboenhancement; } - if ($htmlname != 'search_warehouse'){ + if (strpos($htmlname, 'search_') !== 0) { if (empty($selected) && !empty($conf->global->MAIN_DEFAULT_WAREHOUSE)) $selected = $conf->global->MAIN_DEFAULT_WAREHOUSE; if (empty($selected) && !empty($conf->global->MAIN_DEFAULT_WAREHOUSE_USER)) $selected = $user->fk_warehouse; } From 2eb027833c644a2e946f286f38bad9703c1bf642 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 3 May 2020 21:25:49 +0200 Subject: [PATCH 026/158] Update card.php --- htdocs/contrat/card.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index 111a446d9ae..e898ef9e8f4 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -523,6 +523,7 @@ if (empty($reshook)) $desc = $prod->description; if (!empty($product_desc) && !empty($conf->global->MAIN_NO_CONCAT_DESCRIPTION)) $desc = $product_desc; else $desc = dol_concatdesc($desc, $product_desc, '', !empty($conf->global->MAIN_CHANGE_ORDER_CONCAT_DESCRIPTION)); + $fk_unit = $prod->fk_unit; } else From ab20b5cb616f1e10add360171fd6e84a652072c9 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Sun, 3 May 2020 19:26:35 +0000 Subject: [PATCH 027/158] Fixing style errors. --- htdocs/contrat/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index e898ef9e8f4..21d46fb2974 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -523,7 +523,7 @@ if (empty($reshook)) $desc = $prod->description; if (!empty($product_desc) && !empty($conf->global->MAIN_NO_CONCAT_DESCRIPTION)) $desc = $product_desc; else $desc = dol_concatdesc($desc, $product_desc, '', !empty($conf->global->MAIN_CHANGE_ORDER_CONCAT_DESCRIPTION)); - + $fk_unit = $prod->fk_unit; } else From 4d6a45d491d3ad303cb6b060053303a44d216f6a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 3 May 2020 22:47:43 +0200 Subject: [PATCH 028/158] Major doxygen fix --- dev/setup/codesniffer/ruleset.xml | 62 +++------ htdocs/bom/class/bom.class.php | 1 - htdocs/core/class/html.formcategory.class.php | 4 + htdocs/core/class/html.formcompany.class.php | 4 + .../core/filemanagerdol/connectors/php/io.php | 31 ++++- .../modules/product/modules_product.class.php | 4 +- htdocs/ecm/class/ecmfiles.class.php | 4 +- htdocs/install/upgrade2.php | 11 +- .../template/class/myobject.class.php | 2 +- htdocs/mrp/class/mo.class.php | 2 +- htdocs/product/class/product.class.php | 16 +-- htdocs/product/index.php | 7 +- htdocs/public/stripe/confirm_payment.php | 4 +- htdocs/resource/class/dolresource.class.php | 6 +- htdocs/ticket/class/utils_diff.class.php | 125 ++++++++---------- htdocs/webservices/server_other.php | 7 +- htdocs/zapier/class/hook.class.php | 1 - test/phpunit/AccountingAccountTest.php | 12 +- test/phpunit/ActionCommTest.php | 12 +- test/phpunit/AdherentTest.php | 12 +- test/phpunit/AdminLibTest.php | 12 +- test/phpunit/BOMTest.php | 12 +- test/phpunit/BankAccountTest.php | 12 +- test/phpunit/BuildDocTest.php | 12 +- test/phpunit/CMailFileTest.php | 12 +- test/phpunit/CategorieTest.php | 12 +- test/phpunit/ChargeSocialesTest.php | 12 +- test/phpunit/CodingPhpTest.php | 12 +- test/phpunit/CodingSqlTest.php | 12 +- test/phpunit/CommandeFournisseurTest.php | 12 +- test/phpunit/CommandeTest.php | 12 +- test/phpunit/CommonInvoiceTest.php | 12 +- test/phpunit/CommonObjectTest.php | 12 +- test/phpunit/CompanyBankAccountTest.php | 12 +- test/phpunit/CompanyLibTest.php | 12 +- test/phpunit/ContactTest.php | 12 +- test/phpunit/ContratTest.php | 12 +- test/phpunit/CoreTest.php | 12 +- test/phpunit/DateLibTest.php | 12 +- test/phpunit/DateLibTzFranceTest.php | 12 +- test/phpunit/DiscountTest.php | 12 +- test/phpunit/EntrepotTest.php | 12 +- test/phpunit/ExpenseReportTest.php | 12 +- test/phpunit/ExportTest.php | 12 +- test/phpunit/FactureFournisseurTest.php | 12 +- test/phpunit/FactureRecTest.php | 12 +- test/phpunit/FactureTest.php | 12 +- test/phpunit/FactureTestRounding.php | 12 +- test/phpunit/FichinterTest.php | 12 +- test/phpunit/FilesLibTest.php | 12 +- test/phpunit/FormAdminTest.php | 12 +- test/phpunit/FormTest.php | 12 +- test/phpunit/Functions2LibTest.php | 12 +- test/phpunit/FunctionsLibTest.php | 12 +- test/phpunit/GetUrlLibTest.php | 12 +- test/phpunit/HolidayTest.php | 12 +- test/phpunit/ImagesLibTest.php | 12 +- test/phpunit/ImportTest.php | 12 +- test/phpunit/JsonLibTest.php | 12 +- test/phpunit/LangTest.php | 12 +- test/phpunit/LesscTest.php | 12 +- test/phpunit/LoanTest.php | 12 +- test/phpunit/MarginsLibTest.php | 12 +- test/phpunit/ModulesTest.php | 12 +- test/phpunit/MouvementStockTest.php | 12 +- test/phpunit/NumberingModulesTest.php | 12 +- test/phpunit/PaypalTest.php | 12 +- test/phpunit/PdfDocTest.php | 12 +- test/phpunit/PgsqlTest.php | 12 +- test/phpunit/PricesTest.php | 12 +- test/phpunit/ProductTest.php | 13 +- test/phpunit/ProjectTest.php | 12 +- test/phpunit/PropalTest.php | 12 +- test/phpunit/RestAPIDocumentTest.php | 12 +- test/phpunit/RestAPIUserTest.php | 12 +- test/phpunit/ScriptsTest.php | 12 +- test/phpunit/SecurityTest.php | 12 +- test/phpunit/SocieteTest.php | 12 +- test/phpunit/SupplierProposalTest.php | 12 +- test/phpunit/TicketTest.php | 12 +- test/phpunit/UserGroupTest.php | 12 +- test/phpunit/UserTest.php | 12 +- test/phpunit/UtilsTest.php | 12 +- test/phpunit/WebservicesOrdersTest.php | 12 +- test/phpunit/WebservicesOtherTest.php | 12 +- test/phpunit/WebservicesProductsTest.php | 13 +- test/phpunit/WebservicesThirdpartyTest.php | 12 +- test/phpunit/WebservicesUserTest.php | 12 +- test/phpunit/XCalLibTest.php | 12 +- 89 files changed, 871 insertions(+), 286 deletions(-) diff --git a/dev/setup/codesniffer/ruleset.xml b/dev/setup/codesniffer/ruleset.xml index 421acfeed1f..ad26c7f0bdc 100644 --- a/dev/setup/codesniffer/ruleset.xml +++ b/dev/setup/codesniffer/ruleset.xml @@ -187,6 +187,13 @@ + + + + + @@ -222,23 +229,16 @@ + - - - - - - 0 - + - - 0 - + 0 @@ -247,67 +247,38 @@ 0 - 0 - 0 - 0 - - - - - - 5 - - - - + 0 - 0 - - - - 0 - + - 0 + + + + 0 @@ -344,6 +315,7 @@ 0 + 0 diff --git a/htdocs/bom/class/bom.class.php b/htdocs/bom/class/bom.class.php index a9ed7ee3a00..c2c18dae6e5 100644 --- a/htdocs/bom/class/bom.class.php +++ b/htdocs/bom/class/bom.class.php @@ -979,7 +979,6 @@ class BOM extends CommonObject * * @return int 0 if OK, <>0 if KO (this function is used also by cron so only 0 is OK) */ - //public function doScheduledJob($param1, $param2, ...) public function doScheduledJob() { global $conf, $langs; diff --git a/htdocs/core/class/html.formcategory.class.php b/htdocs/core/class/html.formcategory.class.php index 4dd8bed247b..41e39cc93a2 100644 --- a/htdocs/core/class/html.formcategory.class.php +++ b/htdocs/core/class/html.formcategory.class.php @@ -23,6 +23,10 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php'; + +/** + * Class to manage forms for categories + */ class FormCategory extends Form { /** diff --git a/htdocs/core/class/html.formcompany.class.php b/htdocs/core/class/html.formcompany.class.php index 5f32f5063d6..6fb02454311 100644 --- a/htdocs/core/class/html.formcompany.class.php +++ b/htdocs/core/class/html.formcompany.class.php @@ -32,6 +32,10 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php'; + +/** + * Class of forms component to manage companies + */ class FormCompany extends Form { diff --git a/htdocs/core/filemanagerdol/connectors/php/io.php b/htdocs/core/filemanagerdol/connectors/php/io.php index 68aa46ef9fb..2a9ac9f146b 100644 --- a/htdocs/core/filemanagerdol/connectors/php/io.php +++ b/htdocs/core/filemanagerdol/connectors/php/io.php @@ -236,8 +236,11 @@ function GetRootPath() return substr($sRealPath, 0, $position); } -// Emulate the asp Server.mapPath function. -// given an url path return the physical directory that it corresponds to +/** + * Emulate the asp Server.mapPath function. + * @param string $path given an url path return the physical directory that it corresponds to + * @return string Path + */ function Server_MapPath($path) { // This function is available only for Apache @@ -338,7 +341,12 @@ function GetCurrentFolder() return $sCurrentFolder; } -// Do a cleanup of the folder name to avoid possible problems +/** + * Do a cleanup of the folder name to avoid possible problems + * + * @param string $sNewFolderName Folder + * @return string Folder sanitized + */ function SanitizeFolderName($sNewFolderName) { $sNewFolderName = stripslashes($sNewFolderName); @@ -349,7 +357,12 @@ function SanitizeFolderName($sNewFolderName) return $sNewFolderName; } -// Do a cleanup of the file name to avoid possible problems +/** + * Do a cleanup of the file name to avoid possible problems + * + * @param string $sNewFileName Folder + * @return string Folder sanitized + */ function SanitizeFileName($sNewFileName) { global $Config; @@ -366,7 +379,15 @@ function SanitizeFileName($sNewFileName) return $sNewFileName; } -// This is the function that sends the results of the uploading process. +/** + * This is the function that sends the results of the uploading process. + * + * @param string $errorNumber errorNumber + * @param string $fileUrl fileUrl + * @param string $fileName fileName + * @param string $customMsg customMsg + * @return void + */ function SendUploadResults($errorNumber, $fileUrl = '', $fileName = '', $customMsg = '') { // Minified version of the document.domain automatic fix script (#1919). diff --git a/htdocs/core/modules/product/modules_product.class.php b/htdocs/core/modules/product/modules_product.class.php index 5031b4079e4..80bc9f7ce0a 100644 --- a/htdocs/core/modules/product/modules_product.class.php +++ b/htdocs/core/modules/product/modules_product.class.php @@ -61,6 +61,9 @@ abstract class ModelePDFProduct extends CommonDocGenerator } } +/** + * Class template for classes of numbering product + */ abstract class ModeleProductCode { /** @@ -97,7 +100,6 @@ abstract class ModeleProductCode */ public function getExample($langs) { - $langs->load("bills"); return $langs->trans("NoExample"); } diff --git a/htdocs/ecm/class/ecmfiles.class.php b/htdocs/ecm/class/ecmfiles.class.php index 0c7c4c4cebb..6921b8aabd6 100644 --- a/htdocs/ecm/class/ecmfiles.class.php +++ b/htdocs/ecm/class/ecmfiles.class.php @@ -772,7 +772,6 @@ class EcmFiles extends CommonObject if (!empty($conf->dol_no_mouse_hover)) $notooltip = 1; // Force disable tooltips $result = ''; - $companylink = ''; $label = ''.$langs->trans("MyModule").''; $label .= '
'; @@ -867,6 +866,9 @@ class EcmFiles extends CommonObject } +/** + * Class of an index line of a document + */ class EcmfilesLine { /** diff --git a/htdocs/install/upgrade2.php b/htdocs/install/upgrade2.php index 0fb36466a02..765a8796a76 100644 --- a/htdocs/install/upgrade2.php +++ b/htdocs/install/upgrade2.php @@ -1,4 +1,6 @@ * Copyright (C) 2005-2018 Laurent Destailleur * Copyright (C) 2005-2011 Regis Houssin @@ -1185,8 +1187,13 @@ function migrate_contracts_date1($db, $langs, $conf) print ''; } -/* - * Mise a jour date contrat avec date min effective mise en service si inferieur +/** + * Update contracts with date min real if service date is lower + * + * @param DoliDB $db Database handler + * @param Translate $langs Language + * @param Conf $conf Conf + * @return void */ function migrate_contracts_date2($db, $langs, $conf) { diff --git a/htdocs/modulebuilder/template/class/myobject.class.php b/htdocs/modulebuilder/template/class/myobject.class.php index af707c3c87d..fad19564fdc 100644 --- a/htdocs/modulebuilder/template/class/myobject.class.php +++ b/htdocs/modulebuilder/template/class/myobject.class.php @@ -1047,10 +1047,10 @@ class MyObject extends CommonObject /** * Action executed by scheduler * CAN BE A CRON TASK. In such a case, parameters come from the schedule job setup field 'Parameters' + * Use public function doScheduledJob($param1, $param2, ...) to get parameters * * @return int 0 if OK, <>0 if KO (this function is used also by cron so only 0 is OK) */ - //public function doScheduledJob($param1, $param2, ...) public function doScheduledJob() { global $conf, $langs; diff --git a/htdocs/mrp/class/mo.class.php b/htdocs/mrp/class/mo.class.php index 65ba9597b8a..42d97ee81d9 100644 --- a/htdocs/mrp/class/mo.class.php +++ b/htdocs/mrp/class/mo.class.php @@ -1226,10 +1226,10 @@ class Mo extends CommonObject /** * Action executed by scheduler * CAN BE A CRON TASK. In such a case, parameters come from the schedule job setup field 'Parameters' + * Use public function doScheduledJob($param1, $param2, ...) to get parameters * * @return int 0 if OK, <>0 if KO (this function is used also by cron so only 0 is OK) */ - //public function doScheduledJob($param1, $param2, ...) public function doScheduledJob() { global $conf, $langs; diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 0db9a411b19..2499ee958de 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -1443,14 +1443,14 @@ class Product extends CommonObject } } - /* - * Sets an accountancy code for a product. - * Also calls PRODUCT_MODIFY trigger when modified - * - * @param string $type It can be 'buy', 'buy_intra', 'buy_export', 'sell', 'sell_intra' or 'sell_export' - * @param string $value Accountancy code - * @return int <0 KO >0 OK - */ + /** + * Sets an accountancy code for a product. + * Also calls PRODUCT_MODIFY trigger when modified + * + * @param string $type It can be 'buy', 'buy_intra', 'buy_export', 'sell', 'sell_intra' or 'sell_export' + * @param string $value Accountancy code + * @return int <0 KO >0 OK + */ public function setAccountancyCode($type, $value) { global $user, $langs, $conf; diff --git a/htdocs/product/index.php b/htdocs/product/index.php index 4d0f2e220b7..3067cc63733 100644 --- a/htdocs/product/index.php +++ b/htdocs/product/index.php @@ -101,7 +101,7 @@ if (!empty($conf->global->MAIN_SEARCH_FORM_ON_HOME_AREAS)) // This is useles foreach ($listofsearchfields as $key => $value) { if ($i == 0) print '
'; - print ''; + print ''; print ''; if ($i == 0) print ''; print ''; @@ -201,7 +201,7 @@ if (!empty($conf->categorie->enabled) && !empty($conf->global->CATEGORY_GRAPHSTA print '
'; print '
'.$langs->trans("Table").''.$langs->trans("URL").''.$langs->trans("QR").'
'.$langs->trans("BackgroundTableTitleTextlinkColor").''; + if ($edit) + { + print $formother->selectColor(colorArrayToHex(colorStringToArray($conf->global->THEME_ELDY_TEXTTITLELINK, array()), ''), 'THEME_ELDY_TEXTTITLELINK', 'formcolor', 1).' '; + } + else + { + print $formother->showColor($conf->global->THEME_ELDY_TEXTTITLELINK, $langs->trans("Default")); + } + print '   ('.$langs->trans("Default").': '.$default.') '; + print $form->textwithpicto('', $langs->trans("NotSupportedByAllThemes").', '.$langs->trans("PressF5AfterChangingThis")); + print ''; + print '
'.$langs->trans("Search").'
'; print ''; - print ''; } diff --git a/htdocs/takepos/auto_order.php b/htdocs/takepos/public/auto_order.php similarity index 83% rename from htdocs/takepos/auto_order.php rename to htdocs/takepos/public/auto_order.php index 5305b4da81f..c97edfdc0e7 100644 --- a/htdocs/takepos/auto_order.php +++ b/htdocs/takepos/public/auto_order.php @@ -16,14 +16,14 @@ */ /** - * \file htdocs/takepos/auto_order.php + * \file htdocs/takepos/public/auto_order.php * \ingroup takepos * \brief Public orders for customers */ if (!defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session) -if (!defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip +if (!defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip $_SESSION["basiclayout"] = 1; $_SESSION["publicterminal"] = true; // Is a public customer -require 'phone.php'; +require '../phone.php'; From abd37c78f92dbd968982700e574348d1d853638c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 4 May 2020 17:07:18 +0200 Subject: [PATCH 034/158] Fix responsive --- htdocs/contrat/index.php | 8 ++++---- htdocs/contrat/list.php | 7 +++++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/htdocs/contrat/index.php b/htdocs/contrat/index.php index 1f3a9fa5b99..2a7c9c0d91a 100644 --- a/htdocs/contrat/index.php +++ b/htdocs/contrat/index.php @@ -360,7 +360,7 @@ if ($result) $obj = $db->fetch_object($result); print ''; - print ''; - print ''; - print ''; - print ''; + + // Ref if (!empty($arrayfields['c.ref']['checked'])) { - print ''; } + if (!empty($arrayfields['c.ref_customer']['checked'])) { print ''; From 821e11ca3c0ba8bc15690835cb25aac56dd917bd Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 4 May 2020 17:13:31 +0200 Subject: [PATCH 035/158] Look and feel v12 --- htdocs/core/ajax/selectsearchbox.php | 4 ++-- htdocs/langs/en_US/main.lang | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/ajax/selectsearchbox.php b/htdocs/core/ajax/selectsearchbox.php index cd019b9ce38..2f8ad4ab5f7 100644 --- a/htdocs/core/ajax/selectsearchbox.php +++ b/htdocs/core/ajax/selectsearchbox.php @@ -56,7 +56,7 @@ $arrayresult = array(); if (!empty($conf->adherent->enabled) && empty($conf->global->MAIN_SEARCHFORM_ADHERENT_DISABLED) && $user->rights->adherent->lire) { - $arrayresult['searchintomember'] = array('position'=>8, 'shortcut'=>'M', 'img'=>'object_user', 'label'=>$langs->trans("SearchIntoMembers", $search_boxvalue), 'text'=>img_picto('', 'object_user').' '.$langs->trans("SearchIntoMembers", $search_boxvalue), 'url'=>DOL_URL_ROOT.'/adherents/list.php'.($search_boxvalue ? '?sall='.urlencode($search_boxvalue) : '')); + $arrayresult['searchintomember'] = array('position'=>8, 'shortcut'=>'M', 'img'=>'object_member', 'label'=>$langs->trans("SearchIntoMembers", $search_boxvalue), 'text'=>img_picto('', 'object_member').' '.$langs->trans("SearchIntoMembers", $search_boxvalue), 'url'=>DOL_URL_ROOT.'/adherents/list.php'.($search_boxvalue ? '?sall='.urlencode($search_boxvalue) : '')); } if (((!empty($conf->societe->enabled) && (empty($conf->global->SOCIETE_DISABLE_PROSPECTS) || empty($conf->global->SOCIETE_DISABLE_CUSTOMERS))) || !empty($conf->fournisseur->enabled)) && empty($conf->global->MAIN_SEARCHFORM_SOCIETE_DISABLED) && $user->rights->societe->lire) @@ -86,7 +86,7 @@ if (!empty($conf->projet->enabled) && empty($conf->global->MAIN_SEARCHFORM_PROJE } if (!empty($conf->projet->enabled) && empty($conf->global->MAIN_SEARCHFORM_TASK_DISABLED) && $user->rights->projet->lire) { - $arrayresult['searchintotasks'] = array('position'=>45, 'img'=>'object_task', 'label'=>$langs->trans("SearchIntoTasks", $search_boxvalue), 'text'=>img_picto('', 'object_task').' '.$langs->trans("SearchIntoTasks", $search_boxvalue), 'url'=>DOL_URL_ROOT.'/projet/tasks/list.php'.($search_boxvalue ? '?search_all='.urlencode($search_boxvalue) : '')); + $arrayresult['searchintotasks'] = array('position'=>45, 'img'=>'object_projecttask', 'label'=>$langs->trans("SearchIntoTasks", $search_boxvalue), 'text'=>img_picto('', 'object_projecttask').' '.$langs->trans("SearchIntoTasks", $search_boxvalue), 'url'=>DOL_URL_ROOT.'/projet/tasks/list.php'.($search_boxvalue ? '?search_all='.urlencode($search_boxvalue) : '')); } if (!empty($conf->propal->enabled) && empty($conf->global->MAIN_SEARCHFORM_CUSTOMER_PROPAL_DISABLED) && $user->rights->propal->lire) diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index 38a4bcd2bad..fb0808e0953 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -959,7 +959,7 @@ SearchIntoCustomerInvoices=Customer invoices SearchIntoSupplierInvoices=Vendor invoices SearchIntoCustomerOrders=Sales orders SearchIntoSupplierOrders=Purchase orders -SearchIntoCustomerProposals=Customer proposals +SearchIntoCustomerProposals=Commercial proposals SearchIntoSupplierProposals=Vendor proposals SearchIntoInterventions=Interventions SearchIntoContracts=Contracts From 6d894b7abd3bd0c7e47a4e98b817b9d954ca0f1b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 4 May 2020 19:08:31 +0200 Subject: [PATCH 036/158] Fix missing link in message --- htdocs/core/class/notify.class.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/notify.class.php b/htdocs/core/class/notify.class.php index db0e490a6c6..6c0ec1ec62b 100644 --- a/htdocs/core/class/notify.class.php +++ b/htdocs/core/class/notify.class.php @@ -528,7 +528,7 @@ class Notify $message.= $outputlangs->transnoentities("YouReceiveMailBecauseOfNotification2", $application, $mysoc->name)."\n"; $message.= "\n"; $message.= $mesg; - if ($link) $message.= "\n" . $urlwithroot . $link; + if ($link) $message.= "\n" . $urlwithroot . $link; // if link is already added around the ref into the translation text, then $link must be set to '' $parameters = array('notifcode'=>$notifcode, 'sendto'=>$sendto, 'replyto'=>$replyto, 'file'=>$filename_list, 'mimefile'=>$mimetype_list, 'filename'=>$mimefilename_list); if (!isset($action)) $action = ''; @@ -600,6 +600,7 @@ class Notify { foreach($conf->global as $key => $val) { + $reg = array(); if ($val == '' || ! preg_match('/^NOTIFICATION_FIXEDEMAIL_'.$notifcode.'_THRESHOLD_HIGHER_(.*)$/', $key, $reg)) continue; $threshold = (float) $reg[1]; @@ -743,7 +744,7 @@ class Notify $message.= $langs->transnoentities("YouReceiveMailBecauseOfNotification2", $application, $mysoc->name)."\n"; $message.= "\n"; $message.= $mesg; - //if ($link) $message.= "\n" . $urlwithroot . $link; // link already added around the ref into the text + if ($link) $message.= "\n" . $urlwithroot . $link; // if link is already added around the ref into the translation text, then $link must be set to '' $message = nl2br($message); From 5e4ef9266ee33bf3df042ed09091e98937686186 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 4 May 2020 20:30:02 +0200 Subject: [PATCH 037/158] Fix update template to use for notifications --- htdocs/admin/notification.php | 101 +++++++++++++++++++++++++++------- htdocs/core/lib/admin.lib.php | 10 +++- 2 files changed, 88 insertions(+), 23 deletions(-) diff --git a/htdocs/admin/notification.php b/htdocs/admin/notification.php index 97b09861a42..ba92aa1ec21 100644 --- a/htdocs/admin/notification.php +++ b/htdocs/admin/notification.php @@ -34,10 +34,12 @@ require_once DOL_DOCUMENT_ROOT.'/core/triggers/interface_50_modNotification_Noti $langs->loadLangs(array('admin', 'other', 'orders', 'propal', 'bills', 'errors', 'mails')); // Security check -if (!$user->admin) - accessforbidden(); +if (!$user->admin) { + accessforbidden(); +} $action = GETPOST('action', 'aZ09'); +$error = 0; /* @@ -45,27 +47,48 @@ $action = GETPOST('action', 'aZ09'); */ // Action to update or add a constant -if ($action == 'update' || $action == 'add') +if ($action == 'settemplates') { - $constlineid = GETPOST('rowid', 'int'); - $constname = GETPOST('constname', 'alpha'); + $db->begin(); - $constvalue = (GETPOSTISSET('constvalue_'.$constname) ? GETPOST('constvalue_'.$constname, 'alpha') : GETPOST('constvalue')); - $consttype = (GETPOSTISSET('consttype_'.$constname) ? GETPOST('consttype_'.$constname, 'alphanohtml') : GETPOST('consttype')); - $constnote = (GETPOSTISSET('constnote_'.$constname) ? GETPOST('constnote_'.$constname, 'none') : GETPOST('constnote')); + if (!$error && is_array($_POST)) + { + $reg = array(); + foreach ($_POST as $key => $val) + { + if (!preg_match('/^constvalue_(.*)_TEMPLATE/', $key, $reg)) continue; - $typetouse = empty($oldtypetonewone[$consttype]) ? $consttype : $oldtypetonewone[$consttype]; + $triggername = $reg[1]; + $constvalue = GETPOST($key, 'alpha'); + $consttype = 'emailtemplate:xxx'; + $tmparray=explode(':', $constvalue); + if (! empty($tmparray[0]) && ! empty($tmparray[1])) { + $constvalue = $tmparray[0]; + $consttype = 'emailtemplate:'.$tmparray[1]; + //var_dump($constvalue); + //var_dump($consttype); + $res = dolibarr_set_const($db, $triggername.'_TEMPLATE', $constvalue, $consttype, 0, '', $conf->entity); + if ($res < 0) { + $error++; + break; + } + } else { + $res = dolibarr_del_const($db, $triggername.'_TEMPLATE', $conf->entity); + } + } + } - $res = dolibarr_set_const($db, $constname, $constvalue, $typetouse, 0, $constnote, $conf->entity); - - if (!$res > 0) $error++; if (!$error) { + $db->commit(); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { + $db->rollback(); + setEventMessages($langs->trans("Error"), null, 'errors'); } } @@ -74,12 +97,31 @@ if ($action == 'setvalue' && $user->admin) { $db->begin(); - $result = dolibarr_set_const($db, "NOTIFICATION_EMAIL_FROM", $_POST["email_from"], 'chaine', 0, '', $conf->entity); + $result = dolibarr_set_const($db, "NOTIFICATION_EMAIL_FROM", GETPOST("email_from", "none"), 'chaine', 0, '', $conf->entity); if ($result < 0) $error++; + + if (!$error) + { + $db->commit(); + + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); + } + else + { + $db->rollback(); + + setEventMessages($langs->trans("Error"), null, 'errors'); + } +} + + +if ($action == 'setfixednotif' && $user->admin) +{ + $db->begin(); + if (!$error && is_array($_POST)) { - //var_dump($_POST); $reg = array(); foreach ($_POST as $key => $val) { @@ -101,7 +143,7 @@ if ($action == 'setvalue' && $user->admin) } elseif (preg_match('/^NOTIF_(.*)_new_key/', $key, $reg)) { - // Add a new entry + // Add a new entry $newkey = 'NOTIFICATION_FIXEDEMAIL_'.$reg[1].'_THRESHOLD_HIGHER_'.((int) GETPOST($shortkey.'_amount')); $newval = GETPOST($shortkey.'_key'); } @@ -168,9 +210,18 @@ print ''; print ''; print '
'.$langs->trans("Categories").'
'; + print '
'; $sql = "SELECT c.label, count(*) as nb"; $sql .= " FROM ".MAIN_DB_PREFIX."categorie_product as cs"; $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."categorie as c ON cs.fk_categorie = c.rowid"; @@ -413,7 +413,7 @@ llxFooter(); $db->close(); -/* +/** * Print html activity for product type * * @param int $product_type Type of product @@ -422,7 +422,6 @@ $db->close(); function activitytrim($product_type) { global $conf, $langs, $db; - global $bc; // We display the last 3 years $yearofbegindate = date('Y', dol_time_plus_duree(time(), -3, "y")); diff --git a/htdocs/public/stripe/confirm_payment.php b/htdocs/public/stripe/confirm_payment.php index 25cb358ccea..9a45a2cbeec 100644 --- a/htdocs/public/stripe/confirm_payment.php +++ b/htdocs/public/stripe/confirm_payment.php @@ -129,8 +129,8 @@ try { )); } -/* - * generate payment response +/** + * Generate payment response * * @param \Stripe\PaymentIntent $intent PaymentIntent * @return void diff --git a/htdocs/resource/class/dolresource.class.php b/htdocs/resource/class/dolresource.class.php index 4cda97b39d1..1b4223e1fff 100644 --- a/htdocs/resource/class/dolresource.class.php +++ b/htdocs/resource/class/dolresource.class.php @@ -871,10 +871,12 @@ class Dolresource extends CommonObject return $resources; } - /* + /** * Return an int number of resources linked to the element * - * @return int + * @param string $element Element type + * @param int $element_id Element id + * @return int Nb of resources loaded */ public function fetchElementResources($element, $element_id) { diff --git a/htdocs/ticket/class/utils_diff.class.php b/htdocs/ticket/class/utils_diff.class.php index 03dff5506b4..84075d395ab 100644 --- a/htdocs/ticket/class/utils_diff.class.php +++ b/htdocs/ticket/class/utils_diff.class.php @@ -20,24 +20,21 @@ class Diff const DELETED = 1; const INSERTED = 2; - /* Returns the diff for two strings. The return value is an array, each of + /** + * Returns the diff for two strings. The return value is an array, each of * whose values is an array containing two values: a line (or character, if * $compareCharacters is true), and one of the constants DIFF::UNMODIFIED (the * line or character is in both strings), DIFF::DELETED (the line or character * is only in the first string), and DIFF::INSERTED (the line or character is * only in the second string). The parameters are: * - * $string1 - the first string - * $string2 - the second string - * $compareCharacters - true to compare characters, and false to compare - * lines; this optional parameter defaults to false + * @param string $string1 First string + * @param string $string2 Second string + * @param string $compareCharacters true to compare characters, and false to compare lines; this optional parameter defaults to false + * @return array Array of diff */ - public static function compare( - $string1, - $string2, - $compareCharacters = false - ) { - + public static function compare($string1, $string2, $compareCharacters = false) + { // initialise the sequences and comparison start and end positions $start = 0; if ($compareCharacters) { @@ -90,12 +87,13 @@ class Diff return $diff; } - /* Returns the diff for two files. The parameters are: + /** + * Returns the diff for two files. The parameters are: * - * $file1 - the path to the first file - * $file2 - the path to the second file - * $compareCharacters - true to compare characters, and false to compare - * lines; this optional parameter defaults to false + * @param string $file1 Path to the first file + * @param string $file2 Path to the second file + * @param boolean $compareCharacters true to compare characters, and false to compare lines; this optional parameter defaults to false + * @return array Array of diff */ public static function compareFiles( $file1, @@ -111,23 +109,18 @@ class Diff ); } - /* Returns the table of longest common subsequence lengths for the specified - * sequences. The parameters are: + /** + * Returns the table of longest common subsequence lengths for the specified sequences. The parameters are: * - * $sequence1 - the first sequence - * $sequence2 - the second sequence - * $start - the starting index - * $end1 - the ending index for the first sequence - * $end2 - the ending index for the second sequence + * @param string $sequence1 the first sequence + * @param string $sequence2 the second sequence + * @param string $start the starting index + * @param string $end1 the ending index for the first sequence + * @param string $end2 the ending index for the second sequence + * @return array array of diff */ - private static function computeTable( - $sequence1, - $sequence2, - $start, - $end1, - $end2 - ) { - + private static function computeTable($sequence1, $sequence2, $start, $end1, $end2) + { // determine the lengths to be compared $length1 = $end1 - $start + 1; $length2 = $end2 - $start + 1; @@ -156,21 +149,18 @@ class Diff return $table; } - /* Returns the partial diff for the specificed sequences, in reverse order. - * The parameters are: + /** + * Returns the partial diff for the specificed sequences, in reverse order. + * The parameters are: * - * $table - the table returned by the computeTable function - * $sequence1 - the first sequence - * $sequence2 - the second sequence - * $start - the starting index + * @param string $table the table returned by the computeTable function + * @param string $sequence1 the first sequence + * @param string $sequence2 the second sequence + * @param string $start the starting index + * @return array array of diff */ - private static function generatePartialDiff( - $table, - $sequence1, - $sequence2, - $start - ) { - + private static function generatePartialDiff($table, $sequence1, $sequence2, $start) + { // initialise the diff $diff = array(); @@ -205,17 +195,17 @@ class Diff return $diff; } - /* Returns a diff as a string, where unmodified lines are prefixed by ' ', + /** + * Returns a diff as a string, where unmodified lines are prefixed by ' ', * deletions are prefixed by '- ', and insertions are prefixed by '+ '. The * parameters are: * - * $diff - the diff array - * $separator - the separator between lines; this optional parameter defaults - * to "\n" + * @param array $diff the diff array + * @param string $separator the separator between lines; this optional parameter defaults to "\n" + * @return string String */ public static function toString($diff, $separator = "\n") { - // initialise the string $string = ''; @@ -242,17 +232,17 @@ class Diff return $string; } - /* Returns a diff as an HTML string, where unmodified lines are contained + /** + * Returns a diff as an HTML string, where unmodified lines are contained * within 'span' elements, deletions are contained within 'del' elements, and * insertions are contained within 'ins' elements. The parameters are: * - * $diff - the diff array - * $separator - the separator between lines; this optional parameter defaults - * to '
' + * @param string $diff the diff array + * @param string $separator the separator between lines; this optional parameter defaults to '
' + * @return string HTML string */ public static function toHTML($diff, $separator = '
') { - // initialise the HTML $html = ''; @@ -283,17 +273,16 @@ class Diff return $html; } - /* Returns a diff as an HTML table. The parameters are: + /** + * Returns a diff as an HTML table. The parameters are: * - * $diff - the diff array - * $indentation - indentation to add to every line of the generated HTML; this - * optional parameter defaults to '' - * $separator - the separator between lines; this optional parameter - * defaults to '
' + * @param string $diff the diff array + * @param string $indentation indentation to add to every line of the generated HTML; this optional parameter defaults to '' + * @param string $separator the separator between lines; this optional parameter defaults to '
' + * @return string HTML string */ public static function toTable($diff, $indentation = '', $separator = '
') { - // initialise the HTML $html = $indentation."\n"; @@ -373,14 +362,16 @@ class Diff return $html.$indentation."
\n"; } - /* Returns the content of the cell, for use in the toTable function. The + /** + * Returns the content of the cell, for use in the toTable function. The * parameters are: * - * $diff - the diff array - * $indentation - indentation to add to every line of the generated HTML - * $separator - the separator between lines - * $index - the current index, passes by reference - * $type - the type of line + * @param string $diff the diff array + * @param string $indentation indentation to add to every line of the generated HTML + * @param string $separator the separator between lines + * @param string $index the current index, passes by reference + * @param string $type the type of line + * @return string HTML string */ private static function getCellContent($diff, $indentation, $separator, &$index, $type) { diff --git a/htdocs/webservices/server_other.php b/htdocs/webservices/server_other.php index 3944ef5befa..4ae702ade15 100644 --- a/htdocs/webservices/server_other.php +++ b/htdocs/webservices/server_other.php @@ -137,7 +137,12 @@ $server->register( -// Full methods code +/** + * Full methods code + * + * @param string $authentication Authentication string + * @return array Array of data + */ function getVersions($authentication) { global $db, $conf, $langs; diff --git a/htdocs/zapier/class/hook.class.php b/htdocs/zapier/class/hook.class.php index 32268b039b4..b985c77434e 100644 --- a/htdocs/zapier/class/hook.class.php +++ b/htdocs/zapier/class/hook.class.php @@ -715,7 +715,6 @@ class Hook extends CommonObject * * @return int 0 if OK, <>0 if KO (this function is used also by cron so only 0 is OK) */ - //public function doScheduledJob($param1, $param2, ...) public function doScheduledJob() { global $conf, $langs; diff --git a/test/phpunit/AccountingAccountTest.php b/test/phpunit/AccountingAccountTest.php index ea1651c5902..b4367e96f49 100644 --- a/test/phpunit/AccountingAccountTest.php +++ b/test/phpunit/AccountingAccountTest.php @@ -73,7 +73,11 @@ class AccountingAccountTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -84,7 +88,11 @@ class AccountingAccountTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/ActionCommTest.php b/test/phpunit/ActionCommTest.php index 34d67341afb..0dd4946f69c 100644 --- a/test/phpunit/ActionCommTest.php +++ b/test/phpunit/ActionCommTest.php @@ -73,7 +73,11 @@ class ActionCommTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -84,7 +88,11 @@ class ActionCommTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/AdherentTest.php b/test/phpunit/AdherentTest.php index 89e78b32bd9..f19e88c36a6 100644 --- a/test/phpunit/AdherentTest.php +++ b/test/phpunit/AdherentTest.php @@ -75,7 +75,11 @@ class AdherentTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -91,7 +95,11 @@ class AdherentTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/AdminLibTest.php b/test/phpunit/AdminLibTest.php index 7f3c9030725..e3c38c1df86 100644 --- a/test/phpunit/AdminLibTest.php +++ b/test/phpunit/AdminLibTest.php @@ -73,7 +73,11 @@ class AdminLibTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -82,7 +86,11 @@ class AdminLibTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/BOMTest.php b/test/phpunit/BOMTest.php index 41cbdd9f247..39268bdeaea 100644 --- a/test/phpunit/BOMTest.php +++ b/test/phpunit/BOMTest.php @@ -74,7 +74,11 @@ class BOMTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -83,7 +87,11 @@ class BOMTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/BankAccountTest.php b/test/phpunit/BankAccountTest.php index 416a17f0c0f..1007db02dad 100644 --- a/test/phpunit/BankAccountTest.php +++ b/test/phpunit/BankAccountTest.php @@ -75,7 +75,11 @@ class BankAccountTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -84,7 +88,11 @@ class BankAccountTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/BuildDocTest.php b/test/phpunit/BuildDocTest.php index 61d7b7f1199..de4da3790b5 100644 --- a/test/phpunit/BuildDocTest.php +++ b/test/phpunit/BuildDocTest.php @@ -103,7 +103,11 @@ class BuildDocTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -121,7 +125,11 @@ class BuildDocTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/CMailFileTest.php b/test/phpunit/CMailFileTest.php index 8029959c22b..d407b67d991 100755 --- a/test/phpunit/CMailFileTest.php +++ b/test/phpunit/CMailFileTest.php @@ -73,7 +73,11 @@ class CMailFileTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -82,7 +86,11 @@ class CMailFileTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/CategorieTest.php b/test/phpunit/CategorieTest.php index 3c81a7aee21..a62d362a972 100644 --- a/test/phpunit/CategorieTest.php +++ b/test/phpunit/CategorieTest.php @@ -74,7 +74,11 @@ class CategorieTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -83,7 +87,11 @@ class CategorieTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/ChargeSocialesTest.php b/test/phpunit/ChargeSocialesTest.php index b1a3fd87b30..33349449795 100644 --- a/test/phpunit/ChargeSocialesTest.php +++ b/test/phpunit/ChargeSocialesTest.php @@ -74,7 +74,11 @@ class ChargeSocialesTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -83,7 +87,11 @@ class ChargeSocialesTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/CodingPhpTest.php b/test/phpunit/CodingPhpTest.php index 733071c0f58..5c3c6d7d54e 100644 --- a/test/phpunit/CodingPhpTest.php +++ b/test/phpunit/CodingPhpTest.php @@ -86,7 +86,11 @@ class CodingPhpTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -95,7 +99,11 @@ class CodingPhpTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/CodingSqlTest.php b/test/phpunit/CodingSqlTest.php index b62b9befcc7..f56d00b5bcd 100644 --- a/test/phpunit/CodingSqlTest.php +++ b/test/phpunit/CodingSqlTest.php @@ -86,7 +86,11 @@ class CodingSqlTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -95,7 +99,11 @@ class CodingSqlTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/CommandeFournisseurTest.php b/test/phpunit/CommandeFournisseurTest.php index 7ccbf5d0b76..bebd65634bf 100644 --- a/test/phpunit/CommandeFournisseurTest.php +++ b/test/phpunit/CommandeFournisseurTest.php @@ -75,7 +75,11 @@ class CommandeFournisseurTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -84,7 +88,11 @@ class CommandeFournisseurTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/CommandeTest.php b/test/phpunit/CommandeTest.php index ad2920282b2..990ef41f0b7 100644 --- a/test/phpunit/CommandeTest.php +++ b/test/phpunit/CommandeTest.php @@ -73,7 +73,11 @@ class CommandeTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -84,7 +88,11 @@ class CommandeTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/CommonInvoiceTest.php b/test/phpunit/CommonInvoiceTest.php index 9f4b5998455..5e9c45825ec 100644 --- a/test/phpunit/CommonInvoiceTest.php +++ b/test/phpunit/CommonInvoiceTest.php @@ -73,7 +73,11 @@ class CommonInvoiceTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -82,7 +86,11 @@ class CommonInvoiceTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/CommonObjectTest.php b/test/phpunit/CommonObjectTest.php index e32952c167d..6c68423e8a9 100644 --- a/test/phpunit/CommonObjectTest.php +++ b/test/phpunit/CommonObjectTest.php @@ -74,7 +74,11 @@ class CommonObjectTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -83,7 +87,11 @@ class CommonObjectTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/CompanyBankAccountTest.php b/test/phpunit/CompanyBankAccountTest.php index 7410e1f15f9..1979f89fabb 100644 --- a/test/phpunit/CompanyBankAccountTest.php +++ b/test/phpunit/CompanyBankAccountTest.php @@ -74,7 +74,11 @@ class CompanyBankAccountTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -83,7 +87,11 @@ class CompanyBankAccountTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/CompanyLibTest.php b/test/phpunit/CompanyLibTest.php index c45f6ebd208..ab9eb414634 100644 --- a/test/phpunit/CompanyLibTest.php +++ b/test/phpunit/CompanyLibTest.php @@ -73,7 +73,11 @@ class CompanyLibTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -82,7 +86,11 @@ class CompanyLibTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/ContactTest.php b/test/phpunit/ContactTest.php index 8fdaea0cbe7..0c5687e67c9 100755 --- a/test/phpunit/ContactTest.php +++ b/test/phpunit/ContactTest.php @@ -82,7 +82,11 @@ class ContactTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -92,7 +96,11 @@ class ContactTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/ContratTest.php b/test/phpunit/ContratTest.php index 7c302105aa2..d364d6c9dff 100644 --- a/test/phpunit/ContratTest.php +++ b/test/phpunit/ContratTest.php @@ -74,7 +74,11 @@ class ContratTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -83,7 +87,11 @@ class ContratTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/CoreTest.php b/test/phpunit/CoreTest.php index c34bbffba95..87c43798a0f 100644 --- a/test/phpunit/CoreTest.php +++ b/test/phpunit/CoreTest.php @@ -76,7 +76,11 @@ class CoreTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -85,7 +89,11 @@ class CoreTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/DateLibTest.php b/test/phpunit/DateLibTest.php index dd32e02cee6..062bdb6dd11 100644 --- a/test/phpunit/DateLibTest.php +++ b/test/phpunit/DateLibTest.php @@ -74,7 +74,11 @@ class DateLibTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -83,7 +87,11 @@ class DateLibTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/DateLibTzFranceTest.php b/test/phpunit/DateLibTzFranceTest.php index 895599becde..7e96e39030e 100644 --- a/test/phpunit/DateLibTzFranceTest.php +++ b/test/phpunit/DateLibTzFranceTest.php @@ -74,7 +74,11 @@ class DateLibTzFranceTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -88,7 +92,11 @@ class DateLibTzFranceTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/DiscountTest.php b/test/phpunit/DiscountTest.php index 202c41958d0..9eba2460655 100644 --- a/test/phpunit/DiscountTest.php +++ b/test/phpunit/DiscountTest.php @@ -74,7 +74,11 @@ class DiscountTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -83,7 +87,11 @@ class DiscountTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/EntrepotTest.php b/test/phpunit/EntrepotTest.php index 2ab2fc2aff3..27fd3dabbf3 100644 --- a/test/phpunit/EntrepotTest.php +++ b/test/phpunit/EntrepotTest.php @@ -74,7 +74,11 @@ class EntrepotTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -86,7 +90,11 @@ class EntrepotTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/ExpenseReportTest.php b/test/phpunit/ExpenseReportTest.php index 67467ac6c81..3f6402262c3 100644 --- a/test/phpunit/ExpenseReportTest.php +++ b/test/phpunit/ExpenseReportTest.php @@ -74,7 +74,11 @@ class ExpenseReportTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -83,7 +87,11 @@ class ExpenseReportTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/ExportTest.php b/test/phpunit/ExportTest.php index 3abec2ee0e1..590accccbed 100644 --- a/test/phpunit/ExportTest.php +++ b/test/phpunit/ExportTest.php @@ -78,7 +78,11 @@ class ExportTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -87,7 +91,11 @@ class ExportTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/FactureFournisseurTest.php b/test/phpunit/FactureFournisseurTest.php index b277ba5c1b3..d9cd44a40d2 100644 --- a/test/phpunit/FactureFournisseurTest.php +++ b/test/phpunit/FactureFournisseurTest.php @@ -75,7 +75,11 @@ class FactureFournisseurTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -84,7 +88,11 @@ class FactureFournisseurTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/FactureRecTest.php b/test/phpunit/FactureRecTest.php index 71caddeb491..f89ab4b1f13 100644 --- a/test/phpunit/FactureRecTest.php +++ b/test/phpunit/FactureRecTest.php @@ -75,7 +75,11 @@ class FactureRecTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -84,7 +88,11 @@ class FactureRecTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/FactureTest.php b/test/phpunit/FactureTest.php index 4e361895fcc..47f3a639b29 100644 --- a/test/phpunit/FactureTest.php +++ b/test/phpunit/FactureTest.php @@ -74,7 +74,11 @@ class FactureTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -87,7 +91,11 @@ class FactureTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/FactureTestRounding.php b/test/phpunit/FactureTestRounding.php index 59ecc240461..f0165a88d0b 100644 --- a/test/phpunit/FactureTestRounding.php +++ b/test/phpunit/FactureTestRounding.php @@ -74,7 +74,11 @@ class FactureTestRounding extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -83,7 +87,11 @@ class FactureTestRounding extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/FichinterTest.php b/test/phpunit/FichinterTest.php index ba9408441a1..f78e9250471 100644 --- a/test/phpunit/FichinterTest.php +++ b/test/phpunit/FichinterTest.php @@ -74,7 +74,11 @@ class FichinterTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -83,7 +87,11 @@ class FichinterTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/FilesLibTest.php b/test/phpunit/FilesLibTest.php index fb3ce8f5814..9d476953381 100644 --- a/test/phpunit/FilesLibTest.php +++ b/test/phpunit/FilesLibTest.php @@ -75,7 +75,11 @@ class FilesLibTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -84,7 +88,11 @@ class FilesLibTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/FormAdminTest.php b/test/phpunit/FormAdminTest.php index e6b92b698d9..a434841930c 100644 --- a/test/phpunit/FormAdminTest.php +++ b/test/phpunit/FormAdminTest.php @@ -74,7 +74,11 @@ class FormAdminTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -83,7 +87,11 @@ class FormAdminTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/FormTest.php b/test/phpunit/FormTest.php index 59cfeb3fa3d..bec23048e9f 100644 --- a/test/phpunit/FormTest.php +++ b/test/phpunit/FormTest.php @@ -74,7 +74,11 @@ class FormTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -83,7 +87,11 @@ class FormTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/Functions2LibTest.php b/test/phpunit/Functions2LibTest.php index 4304251d7f1..21fa1f29257 100644 --- a/test/phpunit/Functions2LibTest.php +++ b/test/phpunit/Functions2LibTest.php @@ -77,7 +77,11 @@ class Functions2LibTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -86,7 +90,11 @@ class Functions2LibTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/FunctionsLibTest.php b/test/phpunit/FunctionsLibTest.php index dff6b3a7d06..e3dabff6df9 100644 --- a/test/phpunit/FunctionsLibTest.php +++ b/test/phpunit/FunctionsLibTest.php @@ -77,7 +77,11 @@ class FunctionsLibTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -88,7 +92,11 @@ class FunctionsLibTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/GetUrlLibTest.php b/test/phpunit/GetUrlLibTest.php index ba074459f44..268122c8d48 100644 --- a/test/phpunit/GetUrlLibTest.php +++ b/test/phpunit/GetUrlLibTest.php @@ -75,7 +75,11 @@ class GetUrlLibTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -84,7 +88,11 @@ class GetUrlLibTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/HolidayTest.php b/test/phpunit/HolidayTest.php index cd5a9f28138..e7e3e8749cd 100644 --- a/test/phpunit/HolidayTest.php +++ b/test/phpunit/HolidayTest.php @@ -76,7 +76,11 @@ class HolidayTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -86,7 +90,11 @@ class HolidayTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/ImagesLibTest.php b/test/phpunit/ImagesLibTest.php index 71474ba1847..3bfb676f3be 100644 --- a/test/phpunit/ImagesLibTest.php +++ b/test/phpunit/ImagesLibTest.php @@ -75,7 +75,11 @@ class ImagesLibTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -84,7 +88,11 @@ class ImagesLibTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/ImportTest.php b/test/phpunit/ImportTest.php index 9e6b973500a..ce689fda4a4 100644 --- a/test/phpunit/ImportTest.php +++ b/test/phpunit/ImportTest.php @@ -76,7 +76,11 @@ class ImportTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -85,7 +89,11 @@ class ImportTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/JsonLibTest.php b/test/phpunit/JsonLibTest.php index 0b5d3dd53e6..7d2678b0ec7 100644 --- a/test/phpunit/JsonLibTest.php +++ b/test/phpunit/JsonLibTest.php @@ -76,7 +76,11 @@ class JsonLibTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -85,7 +89,11 @@ class JsonLibTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/LangTest.php b/test/phpunit/LangTest.php index 3ff2917a9f2..f4a14373ebe 100644 --- a/test/phpunit/LangTest.php +++ b/test/phpunit/LangTest.php @@ -86,7 +86,11 @@ class LangTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -95,7 +99,11 @@ class LangTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/LesscTest.php b/test/phpunit/LesscTest.php index ca64853b381..a4ce302c540 100644 --- a/test/phpunit/LesscTest.php +++ b/test/phpunit/LesscTest.php @@ -86,7 +86,11 @@ class LesscTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -95,7 +99,11 @@ class LesscTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/LoanTest.php b/test/phpunit/LoanTest.php index 71a61c80ae0..253e779ac03 100644 --- a/test/phpunit/LoanTest.php +++ b/test/phpunit/LoanTest.php @@ -74,7 +74,11 @@ class LoanTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -83,7 +87,11 @@ class LoanTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/MarginsLibTest.php b/test/phpunit/MarginsLibTest.php index fc25d929b38..e451262546d 100644 --- a/test/phpunit/MarginsLibTest.php +++ b/test/phpunit/MarginsLibTest.php @@ -74,7 +74,11 @@ class MarginsLibTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -83,7 +87,11 @@ class MarginsLibTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/ModulesTest.php b/test/phpunit/ModulesTest.php index 5a43de21167..f8feaa8f829 100755 --- a/test/phpunit/ModulesTest.php +++ b/test/phpunit/ModulesTest.php @@ -73,7 +73,11 @@ class ModulesTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -82,7 +86,11 @@ class ModulesTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/MouvementStockTest.php b/test/phpunit/MouvementStockTest.php index 85137234a3b..23b6b2b0111 100644 --- a/test/phpunit/MouvementStockTest.php +++ b/test/phpunit/MouvementStockTest.php @@ -76,7 +76,11 @@ class MouvementStockTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -85,7 +89,11 @@ class MouvementStockTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/NumberingModulesTest.php b/test/phpunit/NumberingModulesTest.php index 099d6d2052c..089a2c2f4cf 100644 --- a/test/phpunit/NumberingModulesTest.php +++ b/test/phpunit/NumberingModulesTest.php @@ -73,7 +73,11 @@ class NumberingModulesTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -83,7 +87,11 @@ class NumberingModulesTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/PaypalTest.php b/test/phpunit/PaypalTest.php index 96bfbefdf17..47d8341f501 100644 --- a/test/phpunit/PaypalTest.php +++ b/test/phpunit/PaypalTest.php @@ -75,7 +75,11 @@ class PaypalTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -87,7 +91,11 @@ class PaypalTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/PdfDocTest.php b/test/phpunit/PdfDocTest.php index 9c9c0bb666f..276deada0c6 100644 --- a/test/phpunit/PdfDocTest.php +++ b/test/phpunit/PdfDocTest.php @@ -77,7 +77,11 @@ class PdfDocTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -86,7 +90,11 @@ class PdfDocTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/PgsqlTest.php b/test/phpunit/PgsqlTest.php index 4b2a5f98746..5a09e7fc55a 100644 --- a/test/phpunit/PgsqlTest.php +++ b/test/phpunit/PgsqlTest.php @@ -76,7 +76,11 @@ class PgsqlTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -86,7 +90,11 @@ class PgsqlTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/PricesTest.php b/test/phpunit/PricesTest.php index d7f9e310088..0c47ec4f275 100755 --- a/test/phpunit/PricesTest.php +++ b/test/phpunit/PricesTest.php @@ -81,7 +81,11 @@ class PricesTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -90,7 +94,11 @@ class PricesTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/ProductTest.php b/test/phpunit/ProductTest.php index 8a848416318..650d8a93e37 100644 --- a/test/phpunit/ProductTest.php +++ b/test/phpunit/ProductTest.php @@ -74,7 +74,11 @@ class ProductTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -85,7 +89,12 @@ class ProductTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // teardownafterclass + + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/ProjectTest.php b/test/phpunit/ProjectTest.php index 84a6411082f..8a7e0540b9a 100644 --- a/test/phpunit/ProjectTest.php +++ b/test/phpunit/ProjectTest.php @@ -75,7 +75,11 @@ class ProjectTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -84,7 +88,11 @@ class ProjectTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/PropalTest.php b/test/phpunit/PropalTest.php index 709c5bbcfb7..068fb53b052 100644 --- a/test/phpunit/PropalTest.php +++ b/test/phpunit/PropalTest.php @@ -74,7 +74,11 @@ class PropalTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -83,7 +87,11 @@ class PropalTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/RestAPIDocumentTest.php b/test/phpunit/RestAPIDocumentTest.php index 9ce14a4ac92..65b8c206c9d 100644 --- a/test/phpunit/RestAPIDocumentTest.php +++ b/test/phpunit/RestAPIDocumentTest.php @@ -76,7 +76,11 @@ class RestAPIDocumentTest extends PHPUnit\Framework\TestCase echo "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -85,7 +89,11 @@ class RestAPIDocumentTest extends PHPUnit\Framework\TestCase echo __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/RestAPIUserTest.php b/test/phpunit/RestAPIUserTest.php index ea3970e5a4b..9d49d10af73 100644 --- a/test/phpunit/RestAPIUserTest.php +++ b/test/phpunit/RestAPIUserTest.php @@ -80,7 +80,11 @@ class RestAPIUserTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -89,7 +93,11 @@ class RestAPIUserTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/ScriptsTest.php b/test/phpunit/ScriptsTest.php index e490054edfa..16884214418 100644 --- a/test/phpunit/ScriptsTest.php +++ b/test/phpunit/ScriptsTest.php @@ -86,7 +86,11 @@ class ScriptsTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -95,7 +99,11 @@ class ScriptsTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/SecurityTest.php b/test/phpunit/SecurityTest.php index 4130426d806..5a248006498 100644 --- a/test/phpunit/SecurityTest.php +++ b/test/phpunit/SecurityTest.php @@ -86,7 +86,11 @@ class SecurityTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -95,7 +99,11 @@ class SecurityTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/SocieteTest.php b/test/phpunit/SocieteTest.php index 070a8999bb2..4ed0771d668 100755 --- a/test/phpunit/SocieteTest.php +++ b/test/phpunit/SocieteTest.php @@ -74,7 +74,11 @@ class SocieteTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -88,7 +92,11 @@ class SocieteTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/SupplierProposalTest.php b/test/phpunit/SupplierProposalTest.php index 42d7e5842a6..27414ecab0a 100644 --- a/test/phpunit/SupplierProposalTest.php +++ b/test/phpunit/SupplierProposalTest.php @@ -77,7 +77,11 @@ class SupplierProposalTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -88,7 +92,11 @@ class SupplierProposalTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/TicketTest.php b/test/phpunit/TicketTest.php index fa7ea8df98f..c13bdcfb959 100644 --- a/test/phpunit/TicketTest.php +++ b/test/phpunit/TicketTest.php @@ -74,7 +74,11 @@ class TicketTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -83,7 +87,11 @@ class TicketTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/UserGroupTest.php b/test/phpunit/UserGroupTest.php index fe08af2bce7..7e3cdd24b3a 100644 --- a/test/phpunit/UserGroupTest.php +++ b/test/phpunit/UserGroupTest.php @@ -73,7 +73,11 @@ class UserGroupTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -82,7 +86,11 @@ class UserGroupTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/UserTest.php b/test/phpunit/UserTest.php index 3c89bd52d06..10b0bd7b0b7 100644 --- a/test/phpunit/UserTest.php +++ b/test/phpunit/UserTest.php @@ -73,7 +73,11 @@ class UserTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -85,7 +89,11 @@ class UserTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/UtilsTest.php b/test/phpunit/UtilsTest.php index a1b9eafa45e..dd5ba68ca8f 100644 --- a/test/phpunit/UtilsTest.php +++ b/test/phpunit/UtilsTest.php @@ -73,7 +73,11 @@ class UtilsTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -83,7 +87,11 @@ class UtilsTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/WebservicesOrdersTest.php b/test/phpunit/WebservicesOrdersTest.php index 8afd50a0394..33d842f6d39 100644 --- a/test/phpunit/WebservicesOrdersTest.php +++ b/test/phpunit/WebservicesOrdersTest.php @@ -77,7 +77,11 @@ class WebservicesOrdersTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -86,7 +90,11 @@ class WebservicesOrdersTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/WebservicesOtherTest.php b/test/phpunit/WebservicesOtherTest.php index 7304e2bf367..34686cbec92 100644 --- a/test/phpunit/WebservicesOtherTest.php +++ b/test/phpunit/WebservicesOtherTest.php @@ -77,7 +77,11 @@ class WebservicesOtherTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -86,7 +90,11 @@ class WebservicesOtherTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/WebservicesProductsTest.php b/test/phpunit/WebservicesProductsTest.php index 3d74deb721c..70a8c12a498 100644 --- a/test/phpunit/WebservicesProductsTest.php +++ b/test/phpunit/WebservicesProductsTest.php @@ -84,7 +84,11 @@ class WebservicesProductsTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -92,7 +96,12 @@ class WebservicesProductsTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/WebservicesThirdpartyTest.php b/test/phpunit/WebservicesThirdpartyTest.php index 9aefd6c5ce6..1106164b4ee 100644 --- a/test/phpunit/WebservicesThirdpartyTest.php +++ b/test/phpunit/WebservicesThirdpartyTest.php @@ -94,7 +94,11 @@ class WebservicesThirdpartyTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -103,7 +107,11 @@ class WebservicesThirdpartyTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/WebservicesUserTest.php b/test/phpunit/WebservicesUserTest.php index de51431b046..bb68f413741 100644 --- a/test/phpunit/WebservicesUserTest.php +++ b/test/phpunit/WebservicesUserTest.php @@ -77,7 +77,11 @@ class WebservicesUserTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -86,7 +90,11 @@ class WebservicesUserTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; diff --git a/test/phpunit/XCalLibTest.php b/test/phpunit/XCalLibTest.php index 26d5e25c54b..9fb1975a1fd 100644 --- a/test/phpunit/XCalLibTest.php +++ b/test/phpunit/XCalLibTest.php @@ -73,7 +73,11 @@ class XCalLibTest extends PHPUnit\Framework\TestCase print "\n"; } - // Static methods + /** + * setUpBeforeClass + * + * @return void + */ public static function setUpBeforeClass() { global $conf,$user,$langs,$db; @@ -82,7 +86,11 @@ class XCalLibTest extends PHPUnit\Framework\TestCase print __METHOD__."\n"; } - // tear down after class + /** + * tearDownAfterClass + * + * @return void + */ public static function tearDownAfterClass() { global $conf,$user,$langs,$db; From 4b34a6bd4acb766242eaaac072dbe68c9a9466d9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 4 May 2020 12:43:47 +0200 Subject: [PATCH 029/158] Look and feel --- htdocs/core/class/html.formfile.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index 075fb95066b..98d781a51c1 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -1393,7 +1393,7 @@ class FormFile if ($permtoeditline) { $paramsectiondir = (in_array($modulepart, array('medias', 'ecm')) ? '§ion_dir='.urlencode($relativepath) : ''); - print ''.img_edit('default', 0, 'class="paddingrightonly"').''; + print ''.img_edit('default', 0, 'class="paddingrightonly"').''; } } if ($permonobject) From 3857c082776324938d38fdb0a5d82ca1b156c640 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 4 May 2020 13:24:09 +0200 Subject: [PATCH 030/158] Fix quick search on MO --- htdocs/core/ajax/selectsearchbox.php | 21 ++++++++++++------- htdocs/langs/en_US/main.lang | 1 + .../modulebuilder/template/myobject_list.php | 2 +- htdocs/mrp/mo_list.php | 2 +- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/htdocs/core/ajax/selectsearchbox.php b/htdocs/core/ajax/selectsearchbox.php index bc5287a51f9..cd019b9ce38 100644 --- a/htdocs/core/ajax/selectsearchbox.php +++ b/htdocs/core/ajax/selectsearchbox.php @@ -75,9 +75,14 @@ if (((!empty($conf->product->enabled) && $user->rights->produit->lire) || (!empt $arrayresult['searchintoproduct'] = array('position'=>30, 'shortcut'=>'P', 'img'=>'object_product', 'label'=>$langs->trans("SearchIntoProductsOrServices", $search_boxvalue), 'text'=>img_picto('', 'object_product').' '.$langs->trans("SearchIntoProductsOrServices", $search_boxvalue), 'url'=>DOL_URL_ROOT.'/product/list.php'.($search_boxvalue ? '?sall='.urlencode($search_boxvalue) : '')); } +if (!empty($conf->mrp->enabled) && $user->rights->mrp->read && empty($conf->global->MAIN_SEARCHFORM_MRP_DISABLED)) +{ + $arrayresult['searchintomo'] = array('position'=>35, 'shortcut'=>'', 'img'=>'object_mrp', 'label'=>$langs->trans("SearchIntoMO", $search_boxvalue), 'text'=>img_picto('', 'object_mrp').' '.$langs->trans("SearchIntoMO", $search_boxvalue), 'url'=>DOL_URL_ROOT.'/mrp/mo_list.php'.($search_boxvalue ? '?search_all='.urlencode($search_boxvalue) : '')); +} + if (!empty($conf->projet->enabled) && empty($conf->global->MAIN_SEARCHFORM_PROJECT_DISABLED) && $user->rights->projet->lire) { - $arrayresult['searchintoprojects'] = array('position'=>40, 'shortcut'=>'Q', 'img'=>'object_projectpub', 'label'=>$langs->trans("SearchIntoProjects", $search_boxvalue), 'text'=>img_picto('', 'object_projectpub').' '.$langs->trans("SearchIntoProjects", $search_boxvalue), 'url'=>DOL_URL_ROOT.'/projet/list.php'.($search_boxvalue ? '?search_all='.urlencode($search_boxvalue) : '')); + $arrayresult['searchintoprojects'] = array('position'=>40, 'shortcut'=>'Q', 'img'=>'object_projectpub', 'label'=>$langs->trans("SearchIntoProjects", $search_boxvalue), 'text'=>img_picto('', 'object_project').' '.$langs->trans("SearchIntoProjects", $search_boxvalue), 'url'=>DOL_URL_ROOT.'/projet/list.php'.($search_boxvalue ? '?search_all='.urlencode($search_boxvalue) : '')); } if (!empty($conf->projet->enabled) && empty($conf->global->MAIN_SEARCHFORM_TASK_DISABLED) && $user->rights->projet->lire) { @@ -103,15 +108,15 @@ if (!empty($conf->facture->enabled) && empty($conf->global->MAIN_SEARCHFORM_CUST if (!empty($conf->supplier_proposal->enabled) && empty($conf->global->MAIN_SEARCHFORM_SUPPLIER_PROPAL_DISABLED) && $user->rights->supplier_proposal->lire) { - $arrayresult['searchintosupplierpropal'] = array('position'=>100, 'img'=>'object_propal', 'label'=>$langs->trans("SearchIntoSupplierProposals", $search_boxvalue), 'text'=>img_picto('', 'object_propal').' '.$langs->trans("SearchIntoSupplierProposals", $search_boxvalue), 'url'=>DOL_URL_ROOT.'/supplier_proposal/list.php'.($search_boxvalue ? '?sall='.urlencode($search_boxvalue) : '')); + $arrayresult['searchintosupplierpropal'] = array('position'=>100, 'img'=>'object_propal', 'label'=>$langs->trans("SearchIntoSupplierProposals", $search_boxvalue), 'text'=>img_picto('', 'object_supplier_proposal').' '.$langs->trans("SearchIntoSupplierProposals", $search_boxvalue), 'url'=>DOL_URL_ROOT.'/supplier_proposal/list.php'.($search_boxvalue ? '?sall='.urlencode($search_boxvalue) : '')); } if ((! empty($conf->fournisseur->enabled) && empty($conf->global->MAIN_SEARCHFORM_SUPPLIER_ORDER_DISABLED) || ! empty($conf->supplier_order->enabled)) && $user->rights->fournisseur->commande->lire) { - $arrayresult['searchintosupplierorder'] = array('position'=>110, 'img'=>'object_order', 'label'=>$langs->trans("SearchIntoSupplierOrders", $search_boxvalue), 'text'=>img_picto('', 'object_order').' '.$langs->trans("SearchIntoSupplierOrders", $search_boxvalue), 'url'=>DOL_URL_ROOT.'/fourn/commande/list.php'.($search_boxvalue ? '?search_all='.urlencode($search_boxvalue) : '')); + $arrayresult['searchintosupplierorder'] = array('position'=>110, 'img'=>'object_order', 'label'=>$langs->trans("SearchIntoSupplierOrders", $search_boxvalue), 'text'=>img_picto('', 'object_supplier_order').' '.$langs->trans("SearchIntoSupplierOrders", $search_boxvalue), 'url'=>DOL_URL_ROOT.'/fourn/commande/list.php'.($search_boxvalue ? '?search_all='.urlencode($search_boxvalue) : '')); } if ((! empty($conf->fournisseur->enabled) && empty($conf->global->MAIN_SEARCHFORM_SUPPLIER_INVOICE_DISABLED) || ! empty($conf->supplier_invoice->enabled)) && $user->rights->fournisseur->facture->lire) { - $arrayresult['searchintosupplierinvoice'] = array('position'=>120, 'img'=>'object_bill', 'label'=>$langs->trans("SearchIntoSupplierInvoices", $search_boxvalue), 'text'=>img_picto('', 'object_bill').' '.$langs->trans("SearchIntoSupplierInvoices", $search_boxvalue), 'url'=>DOL_URL_ROOT.'/fourn/facture/list.php'.($search_boxvalue ? '?sall='.urlencode($search_boxvalue) : '')); + $arrayresult['searchintosupplierinvoice'] = array('position'=>120, 'img'=>'object_bill', 'label'=>$langs->trans("SearchIntoSupplierInvoices", $search_boxvalue), 'text'=>img_picto('', 'object_supplier_invoice').' '.$langs->trans("SearchIntoSupplierInvoices", $search_boxvalue), 'url'=>DOL_URL_ROOT.'/fourn/facture/list.php'.($search_boxvalue ? '?sall='.urlencode($search_boxvalue) : '')); } if (!empty($conf->contrat->enabled) && empty($conf->global->MAIN_SEARCHFORM_CONTRACT_DISABLED) && $user->rights->contrat->lire) @@ -122,6 +127,10 @@ if (!empty($conf->ficheinter->enabled) && empty($conf->global->MAIN_SEARCHFORM_F { $arrayresult['searchintointervention'] = array('position'=>140, 'img'=>'object_intervention', 'label'=>$langs->trans("SearchIntoInterventions", $search_boxvalue), 'text'=>img_picto('', 'object_intervention').' '.$langs->trans("SearchIntoInterventions", $search_boxvalue), 'url'=>DOL_URL_ROOT.'/fichinter/list.php'.($search_boxvalue ? '?sall='.urlencode($search_boxvalue) : '')); } +if (!empty($conf->ticket->enabled) && empty($conf->global->MAIN_SEARCHFORM_TICKET_DISABLED) && $user->rights->ticket->read) +{ + $arrayresult['searchintotickets'] = array('position'=>145, 'img'=>'object_ticket', 'label'=>$langs->trans("SearchIntoTickets", $search_boxvalue), 'text'=>img_picto('', 'object_ticket').' '.$langs->trans("SearchIntoTickets", $search_boxvalue), 'url'=>DOL_URL_ROOT.'/ticket/list.php?mainmenu=ticket'.($search_boxvalue ? '&sall='.urlencode($search_boxvalue) : '')); +} // HR if (!empty($conf->user->enabled) && empty($conf->global->MAIN_SEARCHFORM_USER_DISABLED) && $user->rights->user->user->lire) @@ -136,10 +145,6 @@ if (!empty($conf->holiday->enabled) && empty($conf->global->MAIN_SEARCHFORM_HOLI { $arrayresult['searchintoleaves'] = array('position'=>220, 'img'=>'object_holiday', 'label'=>$langs->trans("SearchIntoLeaves", $search_boxvalue), 'text'=>img_picto('', 'object_holiday').' '.$langs->trans("SearchIntoLeaves", $search_boxvalue), 'url'=>DOL_URL_ROOT.'/holiday/list.php?mainmenu=hrm'.($search_boxvalue ? '&sall='.urlencode($search_boxvalue) : '')); } -if (!empty($conf->ticket->enabled) && empty($conf->global->MAIN_SEARCHFORM_TICKET_DISABLED) && $user->rights->ticket->read) -{ - $arrayresult['searchintotickets'] = array('position'=>220, 'img'=>'object_ticket', 'label'=>$langs->trans("SearchIntoTickets", $search_boxvalue), 'text'=>img_picto('', 'object_ticket').' '.$langs->trans("SearchIntoTickets", $search_boxvalue), 'url'=>DOL_URL_ROOT.'/ticket/list.php?mainmenu=ticket'.($search_boxvalue ? '&sall='.urlencode($search_boxvalue) : '')); -} /* Do we really need this. We already have a select for users, and we should be able to filter into user list on employee flag diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index 7cb9b21791a..38a4bcd2bad 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -953,6 +953,7 @@ SearchIntoMembers=Members SearchIntoUsers=Users SearchIntoProductsOrServices=Products or services SearchIntoProjects=Projects +SearchIntoMO=Manufacturing Orders SearchIntoTasks=Tasks SearchIntoCustomerInvoices=Customer invoices SearchIntoSupplierInvoices=Vendor invoices diff --git a/htdocs/modulebuilder/template/myobject_list.php b/htdocs/modulebuilder/template/myobject_list.php index 18c0b1bda2b..a0fcb744bb1 100644 --- a/htdocs/modulebuilder/template/myobject_list.php +++ b/htdocs/modulebuilder/template/myobject_list.php @@ -108,7 +108,7 @@ if (!$sortfield) $sortfield = "t.".key($object->fields); // Set here default sea if (!$sortorder) $sortorder = "ASC"; // Initialize array of search criterias -$search_all = trim(GETPOST("search_all", 'alpha')); +$search_all = GETPOST('search_all', 'alphanohtml') ? trim(GETPOST('search_all', 'alphanohtml')) : trim(GETPOST('sall', 'alphanohtml')); $search = array(); foreach ($object->fields as $key => $val) { diff --git a/htdocs/mrp/mo_list.php b/htdocs/mrp/mo_list.php index b51171e6684..4807c47fb53 100644 --- a/htdocs/mrp/mo_list.php +++ b/htdocs/mrp/mo_list.php @@ -107,7 +107,7 @@ if ($user->socid > 0) // Protection if external user // Initialize array of search criterias -$search_all = trim(GETPOST("search_all", 'alpha')); +$search_all = GETPOST('search_all', 'alphanohtml') ? trim(GETPOST('search_all', 'alphanohtml')) : trim(GETPOST('sall', 'alphanohtml')); $search = array(); foreach ($object->fields as $key => $val) { From 358bc6d5df27ea701b5d3b6cfde6cd06ee9ea501 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 4 May 2020 14:29:25 +0200 Subject: [PATCH 031/158] Fix search on entities --- htdocs/website/index.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/htdocs/website/index.php b/htdocs/website/index.php index ebfbc7a2ac3..0db6aad1d1c 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -282,6 +282,7 @@ $searchkey = GETPOST('searchstring', 'none'); if ($action == 'replacesiteconfirm') { $listofpages = getPagesFromSearchCriterias('', $algo, $searchkey, 1000, $sortfield, $sortorder); + var_dump($listofpages); } @@ -3531,9 +3532,10 @@ if ($action == 'replacesite' || $action == 'replacesiteconfirm' || $massaction = print $langs->trans("SearchString"); print ''; print '
'; - print ''; - print ''; + print ''; + + print ''; print '
'; print ''; From f6e055309360eb518754e1e84626d7385234f61c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 4 May 2020 14:29:57 +0200 Subject: [PATCH 032/158] fix var_dump --- htdocs/website/index.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/website/index.php b/htdocs/website/index.php index 0db6aad1d1c..690dc0efe3b 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -282,7 +282,6 @@ $searchkey = GETPOST('searchstring', 'none'); if ($action == 'replacesiteconfirm') { $listofpages = getPagesFromSearchCriterias('', $algo, $searchkey, 1000, $sortfield, $sortorder); - var_dump($listofpages); } From f4a9490e7fa3c7bf54bb204cd2e73c742531524f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 4 May 2020 16:55:53 +0200 Subject: [PATCH 033/158] Fix a page with NOLOGIN const set to 1 must be into "public" dir. --- htdocs/takepos/admin/bar.php | 4 ++-- htdocs/takepos/{ => public}/auto_order.php | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) rename htdocs/takepos/{ => public}/auto_order.php (83%) diff --git a/htdocs/takepos/admin/bar.php b/htdocs/takepos/admin/bar.php index 672041d3bb3..7b6e1d9a98c 100644 --- a/htdocs/takepos/admin/bar.php +++ b/htdocs/takepos/admin/bar.php @@ -155,9 +155,9 @@ if ($conf->global->TAKEPOS_AUTO_ORDER) print '
'; print $langs->trans("Table")." ".$row['label']; print ''; - print "".$urlwithroot."/takepos/auto_order.php?key=".dol_encode($row['rowid']).""; + print "".$urlwithroot."/takepos/public/auto_order.php?key=".dol_encode($row['rowid']).""; print ''; - print ""; + print ""; print '
'; + print ''; $staticcontrat->ref = ($obj->ref ? $obj->ref : $obj->cid); $staticcontrat->id = $obj->cid; print $staticcontrat->getNomUrl(1, 16); @@ -425,7 +425,7 @@ if ($resql) $obj = $db->fetch_object($resql); print '
'; + print ''; $staticcontrat->ref = ($obj->ref ? $obj->ref : $obj->fk_contrat); $staticcontrat->id = $obj->fk_contrat; print $staticcontrat->getNomUrl(1, 16); @@ -506,7 +506,7 @@ if ($resql) print '
'; + print ''; $staticcontrat->ref = ($obj->ref ? $obj->ref : $obj->fk_contrat); $staticcontrat->id = $obj->fk_contrat; print $staticcontrat->getNomUrl(1, 16); @@ -586,7 +586,7 @@ if ($resql) print '
'; + print ''; $staticcontrat->ref = ($obj->ref ? $obj->ref : $obj->fk_contrat); $staticcontrat->id = $obj->fk_contrat; print $staticcontrat->getNomUrl(1, 16); diff --git a/htdocs/contrat/list.php b/htdocs/contrat/list.php index 70ab37c0380..4b163480035 100644 --- a/htdocs/contrat/list.php +++ b/htdocs/contrat/list.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2019 Laurent Destailleur + * Copyright (C) 2004-2020 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2013 Cédric Salvador * Copyright (C) 2014-2019 Juanjo Menent @@ -612,9 +612,11 @@ while ($i < min($num, $limit)) } print '
'; + print ''; print $contracttmp->getNomUrl(1); if ($obj->nb_late) print img_warning($langs->trans("Late")); if (!empty($obj->note_private) || !empty($obj->note_public)) { @@ -631,6 +633,7 @@ while ($i < min($num, $limit)) print ''.$contracttmp->getFormatedCustomerRef($obj->ref_customer).'
'; +print '
'; + +print ''; + + print '

'; +print '
'; +print ''; +print ''; + // Notification per contacts $title = $langs->trans("ListOfNotificationsPerUser"); if (!empty($conf->societe->enabled)) $title = $langs->trans("ListOfNotificationsPerUserOrContact"); @@ -211,7 +262,7 @@ if ($conf->global->MAIN_FEATURES_LEVEL >= 2) { } $helptext = ''; - form_constantes($constantes, 0, $helptext); + form_constantes($constantes, 2, $helptext); } else { print ''; print ''; @@ -248,14 +299,18 @@ if ($conf->global->MAIN_FEATURES_LEVEL >= 2) { print '
'; } -print '
'; -print '* '.$langs->trans("GoOntoUserCardToAddMore").'
'; -if (!empty($conf->societe->enabled)) print '** '.$langs->trans("GoOntoContactCardToAddMore").'
'; +print '
'; + +print ''; + -print '
'; print '

'; +print '
'; +print ''; +print ''; + print load_fiche_titre($langs->trans("ListOfFixedNotifications"), '', ''); print ''; @@ -333,6 +388,12 @@ foreach ($listofnotifiedevents as $notifiedevent) } print '
'; +print '
'; +print '* '.$langs->trans("GoOntoUserCardToAddMore").'
'; +if (!empty($conf->societe->enabled)) print '** '.$langs->trans("GoOntoContactCardToAddMore").'
'; + +print '
'; + print '
'; print '
'; diff --git a/htdocs/core/lib/admin.lib.php b/htdocs/core/lib/admin.lib.php index f2e8e94ab78..b78c0478370 100644 --- a/htdocs/core/lib/admin.lib.php +++ b/htdocs/core/lib/admin.lib.php @@ -1409,7 +1409,7 @@ function complete_elementList_with_modules(&$elementList) * * @param array $tableau Array of constants array('key'=>array('type'=>type, 'label'=>label) * where type can be 'string', 'text', 'textarea', 'html', 'yesno', 'emailtemplate:xxx', ... - * @param int $strictw3c 0=Include form into table (deprecated), 1=Form is outside table to respect W3C (no form into table), 2=No form nor button at all (form is output by caller, recommanded) + * @param int $strictw3c 0=Include form into table (deprecated), 1=Form is outside table to respect W3C (deprecated), 2=No form nor button at all (form is output by caller, recommended) * @param string $helptext Help * @return void */ @@ -1420,6 +1420,9 @@ function form_constantes($tableau, $strictw3c = 0, $helptext = '') $form = new Form($db); + if (empty($strictw3c)) { + dol_syslog("Warning: Function form_constantes is calle with parameter strictw3c = 0, this is deprecated. Value must be 2 now.", LOG_DEBUG); + } if (!empty($strictw3c) && $strictw3c == 1) { print "\n".''; @@ -1584,12 +1587,13 @@ function form_constantes($tableau, $strictw3c = 0, $helptext = '') //var_dump($modelmail); $moreonlabel = ''; if (!empty($arrayofmessagename[$modelmail->label])) $moreonlabel = ' ('.$langs->trans("SeveralLangugeVariatFound").')'; - $arrayofmessagename[$modelmail->label] = $langs->trans(preg_replace('/\(|\)/', '', $modelmail->label)).$moreonlabel; + // The 'label' is the key that is unique if we exclude the language + $arrayofmessagename[$modelmail->label.':'.$tmp[1]] = $langs->trans(preg_replace('/\(|\)/', '', $modelmail->label)).$moreonlabel; } } //var_dump($arraydefaultmessage); //var_dump($arrayofmessagename); - print $form->selectarray('constvalue_'.$obj->name, $arrayofmessagename, $obj->value, 'None', 1, 0, '', 0, 0, 0, '', '', 1); + print $form->selectarray('constvalue_'.$obj->name, $arrayofmessagename, $obj->value.':'.$tmp[1], 'None', 0, 0, '', 0, 0, 0, '', '', 1); } else // type = 'string' ou 'chaine' { From 2afd38e2f65c555579dd661dd728f15c98e0e3e0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 4 May 2020 21:59:31 +0200 Subject: [PATCH 038/158] FIX Combo list of available users to filter on the list of leaves. --- htdocs/core/class/html.form.class.php | 54 +++++++++++++-------------- htdocs/holiday/list.php | 8 ++-- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 39a006e0342..93061d200d8 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -1574,16 +1574,16 @@ class Form // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps /** - * Return select list of users + * Return the HTML select list of users * - * @param string $selected Id user preselected - * @param string $htmlname Field name in form - * @param int $show_empty 0=liste sans valeur nulle, 1=ajoute valeur inconnue - * @param array $exclude Array list of users id to exclude - * @param int $disabled If select list must be disabled - * @param array $include Array list of users id to include - * @param int $enableonly Array list of users id to be enabled. All other must be disabled - * @param string $force_entity '0' or Ids of environment to force + * @param string $selected Id user preselected + * @param string $htmlname Field name in form + * @param int $show_empty 0=liste sans valeur nulle, 1=ajoute valeur inconnue + * @param array $exclude Array list of users id to exclude + * @param int $disabled If select list must be disabled + * @param array|string $include Array list of users id to include. User '' for all users or 'hierarchy' to have only supervised users or 'hierarchyme' to have supervised + me + * @param int $enableonly Array list of users id to be enabled. All other must be disabled + * @param string $force_entity '0' or Ids of environment to force * @return void * @deprecated Use select_dolusers instead * @see select_dolusers() @@ -1598,24 +1598,24 @@ class Form /** * Return select list of users * - * @param string $selected User id or user object of user preselected. If 0 or < -2, we use id of current user. If -1, keep unselected (if empty is allowed) - * @param string $htmlname Field name in form - * @param int $show_empty 0=list with no empty value, 1=add also an empty value into list - * @param array $exclude Array list of users id to exclude - * @param int $disabled If select list must be disabled - * @param array|string $include Array list of users id to include or 'hierarchy' to have only supervised users or 'hierarchyme' to have supervised + me - * @param array $enableonly Array list of users id to be enabled. If defined, it means that others will be disabled - * @param string $force_entity '0' or Ids of environment to force - * @param int $maxlength Maximum length of string into list (0=no limit) - * @param int $showstatus 0=show user status only if status is disabled, 1=always show user status into label, -1=never show user status - * @param string $morefilter Add more filters into sql request (Example: 'employee = 1') - * @param integer $show_every 0=default list, 1=add also a value "Everybody" at beginning of list - * @param string $enableonlytext If option $enableonlytext is set, we use this text to explain into label why record is disabled. Not used if enableonly is empty. - * @param string $morecss More css - * @param int $noactive Show only active users (this will also happened whatever is this option if USER_HIDE_INACTIVE_IN_COMBOBOX is on). - * @param int $outputmode 0=HTML select string, 1=Array - * @param bool $multiple add [] in the name of element and add 'multiple' attribut - * @return string HTML select string + * @param string $selected User id or user object of user preselected. If 0 or < -2, we use id of current user. If -1, keep unselected (if empty is allowed) + * @param string $htmlname Field name in form + * @param int $show_empty 0=list with no empty value, 1=add also an empty value into list + * @param array $exclude Array list of users id to exclude + * @param int $disabled If select list must be disabled + * @param array|string $include Array list of users id to include. User '' for all users or 'hierarchy' to have only supervised users or 'hierarchyme' to have supervised + me + * @param array $enableonly Array list of users id to be enabled. If defined, it means that others will be disabled + * @param string $force_entity '0' or Ids of environment to force + * @param int $maxlength Maximum length of string into list (0=no limit) + * @param int $showstatus 0=show user status only if status is disabled, 1=always show user status into label, -1=never show user status + * @param string $morefilter Add more filters into sql request (Example: 'employee = 1') + * @param integer $show_every 0=default list, 1=add also a value "Everybody" at beginning of list + * @param string $enableonlytext If option $enableonlytext is set, we use this text to explain into label why record is disabled. Not used if enableonly is empty. + * @param string $morecss More css + * @param int $noactive Show only active users (this will also happened whatever is this option if USER_HIDE_INACTIVE_IN_COMBOBOX is on). + * @param int $outputmode 0=HTML select string, 1=Array + * @param bool $multiple add [] in the name of element and add 'multiple' attribut + * @return string HTML select string * @see select_dolgroups() */ public function select_dolusers($selected = '', $htmlname = 'userid', $show_empty = 0, $exclude = null, $disabled = 0, $include = '', $enableonly = '', $force_entity = '0', $maxlength = 0, $showstatus = 0, $morefilter = '', $show_every = 0, $enableonlytext = '', $morecss = '', $noactive = 0, $outputmode = 0, $multiple = false) diff --git a/htdocs/holiday/list.php b/htdocs/holiday/list.php index 2361edf8a27..2277563aaa0 100644 --- a/htdocs/holiday/list.php +++ b/htdocs/holiday/list.php @@ -1,9 +1,9 @@ - * Copyright (C) 2013-2018 Laurent Destailleur + * Copyright (C) 2013-2020 Laurent Destailleur * Copyright (C) 2012-2016 Regis Houssin * Copyright (C) 2018 Charlene Benke - * Copyright (C) 2019 Frédéric France + * Copyright (C) 2019 Frédéric France * * 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 @@ -476,7 +476,7 @@ if ($resql) $include = ''; - if (!empty($user->rights->holiday->read_all)) $include = 'hierarchyme'; // Can see all + if (empty($user->rights->holiday->read_all)) $include = 'hierarchyme'; // Can see only its hierarchyl print '
'; print ''."\n"; @@ -488,7 +488,7 @@ if ($resql) if (!empty($arrayfields['cp.ref']['checked'])) { print ''; } From 93e69d515d66542609e281fa2293c82790d108b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Tue, 5 May 2020 06:38:24 +0200 Subject: [PATCH 039/158] nowtime is not defined --- htdocs/core/js/lib_notification.js.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/core/js/lib_notification.js.php b/htdocs/core/js/lib_notification.js.php index 769e0a36157..250eb0231a6 100644 --- a/htdocs/core/js/lib_notification.js.php +++ b/htdocs/core/js/lib_notification.js.php @@ -37,8 +37,9 @@ if (!($_SERVER['HTTP_REFERER'] === $dolibarr_main_url_root.'/' || $_SERVER['HTTP top_httphead('text/javascript; charset=UTF-8'); print 'var login = \''.$_SESSION['dol_login'].'\';'."\n"; + print 'var nowtime = Date.now();'; print 'var time_auto_update = '.$conf->global->MAIN_BROWSER_NOTIFICATION_FREQUENCY.';'."\n"; // Always defined - print 'var time_js_next_test = (Date.now() + time_auto_update);'."\n"; + print 'var time_js_next_test = (nowtime + time_auto_update);'."\n"; ?> /* Check if permission ok */ From c0b9fef22907d7cc747b28f142a345702e75ae79 Mon Sep 17 00:00:00 2001 From: Pierre Ardoin <32256817+mapiolca@users.noreply.github.com> Date: Tue, 5 May 2020 08:40:30 +0200 Subject: [PATCH 040/158] Fix issue in status name Before : $commandestatic->LibStatut($obj->nb) shows bad value because bad param Now : $commandestatic->LibStatut($obj->fk_statut) shows good value. --- htdocs/fourn/commande/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/fourn/commande/index.php b/htdocs/fourn/commande/index.php index 78d6c01679f..dd50efc7591 100644 --- a/htdocs/fourn/commande/index.php +++ b/htdocs/fourn/commande/index.php @@ -189,7 +189,7 @@ if ($resql) $obj = $db->fetch_object($resql); print ''; - print ''; + print ''; print ''; print "\n"; From d6de46cc05abc417b72624534c84a8075642edf1 Mon Sep 17 00:00:00 2001 From: oscim Date: Tue, 5 May 2020 08:54:52 +0200 Subject: [PATCH 041/158] Update list.php Add massaction for payment invoice --- htdocs/compta/facture/list.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index ed773b038bb..7caef50c223 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -297,7 +297,16 @@ if (empty($reshook)) include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php'; } -if ($massaction == 'withdrawrequest') +if($massaction == 'reglement'){ + + $arrayofselected=is_array($toselect)?$toselect:array(); + + $loc = dol_buildpath('/compta/paiement.php', 2).'?facids='.implode(',', $arrayofselected); + + header('Location: '.$loc); + exit; +} +elseif ($massaction == 'withdrawrequest') { $langs->load("withdrawals"); @@ -657,6 +666,7 @@ if ($resql) 'generate_doc'=>$langs->trans("ReGeneratePDF"), 'builddoc'=>$langs->trans("PDFMerge"), 'presend'=>$langs->trans("SendByMail"), + 'reglement'=>$langs->trans("InvoicePaymentsLimits"), ); if ($conf->prelevement->enabled) { $langs->load("withdrawals"); From 204c788dec7fae27cfe6e0da5d1a6afa34baba67 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Tue, 5 May 2020 06:56:54 +0000 Subject: [PATCH 042/158] Fixing style errors. --- htdocs/compta/facture/list.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index 7caef50c223..a06230ab60b 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -298,7 +298,6 @@ if (empty($reshook)) } if($massaction == 'reglement'){ - $arrayofselected=is_array($toselect)?$toselect:array(); $loc = dol_buildpath('/compta/paiement.php', 2).'?facids='.implode(',', $arrayofselected); From c7753dd2e0198a5a0d8c08684aff391cf1e1571c Mon Sep 17 00:00:00 2001 From: oscim Date: Tue, 5 May 2020 09:44:46 +0200 Subject: [PATCH 043/158] Update list.php --- htdocs/compta/facture/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index a06230ab60b..3d7493312d1 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -300,7 +300,7 @@ if (empty($reshook)) if($massaction == 'reglement'){ $arrayofselected=is_array($toselect)?$toselect:array(); - $loc = dol_buildpath('/compta/paiement.php', 2).'?facids='.implode(',', $arrayofselected); + $loc = dol_buildpath('/compta/paiement.php', 2).'?action=create&facids='.implode(',', $arrayofselected); header('Location: '.$loc); exit; From c14b6884e3f71de24cd27dc4da3d1e0db04bb13d Mon Sep 17 00:00:00 2001 From: gauthier Date: Tue, 5 May 2020 10:02:36 +0200 Subject: [PATCH 044/158] FIX : missing hook init + table class + $page not set --- htdocs/compta/prelevement/bons.php | 1 + htdocs/compta/prelevement/list.php | 1 + htdocs/compta/prelevement/rejets.php | 4 +++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/htdocs/compta/prelevement/bons.php b/htdocs/compta/prelevement/bons.php index 2b67b73c95b..27654de1ad0 100644 --- a/htdocs/compta/prelevement/bons.php +++ b/htdocs/compta/prelevement/bons.php @@ -53,6 +53,7 @@ $search_ref = GETPOST('search_ref', 'alpha'); $search_amount = GETPOST('search_amount', 'alpha'); $bon=new BonPrelevement($db, ""); +$hookmanager->initHooks(array('withdrawalsreceiptslist')); /* diff --git a/htdocs/compta/prelevement/list.php b/htdocs/compta/prelevement/list.php index 81e58e19cca..eb741b981d9 100644 --- a/htdocs/compta/prelevement/list.php +++ b/htdocs/compta/prelevement/list.php @@ -56,6 +56,7 @@ $search_company = GETPOST('search_company', 'alpha'); $statut = GETPOST('statut', 'int'); $bon=new BonPrelevement($db, ""); +$hookmanager->initHooks(array('withdrawalsreceiptslineslist')); $ligne=new LignePrelevement($db, $user); diff --git a/htdocs/compta/prelevement/rejets.php b/htdocs/compta/prelevement/rejets.php index 333d07a4617..7611945a40d 100644 --- a/htdocs/compta/prelevement/rejets.php +++ b/htdocs/compta/prelevement/rejets.php @@ -40,6 +40,7 @@ $result = restrictedArea($user, 'prelevement', '', '', 'bons'); // Get supervariables $page = GETPOST('page', 'int'); +if (empty($page) || $page == -1) { $page = 0; } // If $page is not defined, or '' or -1 $sortorder = GETPOST('sortorder', 'alpha'); $sortfield = GETPOST('sortfield', 'alpha'); @@ -57,6 +58,7 @@ if ($sortorder == "") $sortorder="DESC"; if ($sortfield == "") $sortfield="p.datec"; $rej = new RejetPrelevement($db, $user); +$hookmanager->initHooks(array('withdrawalsreceiptsrejectedlist')); $ligne = new LignePrelevement($db, $user); /* @@ -85,7 +87,7 @@ if ($result) print_barre_liste($langs->trans("WithdrawsRefused"), $page, $_SERVER["PHP_SELF"], $urladd, $sortfield, $sortorder, '', $num); print"\n\n"; - print '
'; - print ''; + print ''; print '
'.$commandestatic->LibStatut($obj->nb).''.$commandestatic->LibStatut($obj->fk_statut).''.$obj->nb.' '.$commandestatic->LibStatut($obj->fk_statut, 3).'
'; + print '
'; print ''; print_liste_field_titre("Line", $_SERVER["PHP_SELF"], "p.ref", '', $urladd); print_liste_field_titre("ThirdParty", $_SERVER["PHP_SELF"], "s.nom", '', $urladd); From 78a427c9967a398e0fd8d3aaeaa4c1b723a487db Mon Sep 17 00:00:00 2001 From: atm-lena Date: Tue, 5 May 2020 14:35:03 +0200 Subject: [PATCH 045/158] FIX wrong user right's name to top menu "commercial" --- htdocs/core/menus/standard/eldy.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index 84555ba23cf..f1859c0fcc5 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -234,7 +234,7 @@ function print_eldy_menu($db, $atarget, $type_user, &$tabMenu, &$menu, $noout = ) ? 1 : 0, 'perms'=>(!empty($user->rights->propal->lire) || !empty($user->rights->commande->lire) || - !empty($user->rights->supplier_order->lire) || + !empty($user->rights->fournisseur->lire) || !empty($user->rights->supplier_proposal->lire) || !empty($user->rights->contrat->lire) || !empty($user->rights->ficheinter->lire) From db591cdcd8b9920455af51ce28267b075cbebf13 Mon Sep 17 00:00:00 2001 From: kamel Date: Tue, 5 May 2020 14:47:31 +0200 Subject: [PATCH 046/158] FIX: show value of the extrafields in the bank list --- htdocs/compta/bank/list.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/htdocs/compta/bank/list.php b/htdocs/compta/bank/list.php index eaefdfb6573..457a5986dea 100644 --- a/htdocs/compta/bank/list.php +++ b/htdocs/compta/bank/list.php @@ -556,6 +556,12 @@ foreach ($accounts as $key=>$type) } // Extra fields + if (is_array($objecttmp->array_options)) { + $obj = new stdClass(); + foreach ($objecttmp->array_options as $k => $v) { + $obj->$k = $v; + } + } include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook $parameters = array('arrayfields'=>$arrayfields); From 7e6b5a384d00ea1d92a6b66f84f1a7e11c4df1a1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 5 May 2020 15:16:30 +0200 Subject: [PATCH 047/158] Code comment --- htdocs/core/class/html.form.class.php | 36 +++++++++++++-------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index f48ce989a7a..7073fd41989 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -1669,24 +1669,24 @@ class Form /** * Return select list of users * - * @param string $selected User id or user object of user preselected. If 0 or < -2, we use id of current user. If -1, keep unselected (if empty is allowed) - * @param string $htmlname Field name in form - * @param int $show_empty 0=list with no empty value, 1=add also an empty value into list - * @param array $exclude Array list of users id to exclude - * @param int $disabled If select list must be disabled - * @param array|string $include Array list of users id to include or 'hierarchy' to have only supervised users or 'hierarchyme' to have supervised + me - * @param array $enableonly Array list of users id to be enabled. If defined, it means that others will be disabled - * @param string $force_entity '0' or Ids of environment to force - * @param int $maxlength Maximum length of string into list (0=no limit) - * @param int $showstatus 0=show user status only if status is disabled, 1=always show user status into label, -1=never show user status - * @param string $morefilter Add more filters into sql request (Example: 'employee = 1') - * @param integer $show_every 0=default list, 1=add also a value "Everybody" at beginning of list - * @param string $enableonlytext If option $enableonlytext is set, we use this text to explain into label why record is disabled. Not used if enableonly is empty. - * @param string $morecss More css - * @param int $noactive Show only active users (this will also happened whatever is this option if USER_HIDE_INACTIVE_IN_COMBOBOX is on). - * @param int $outputmode 0=HTML select string, 1=Array - * @param bool $multiple add [] in the name of element and add 'multiple' attribut - * @return string HTML select string + * @param string $selected User id or user object of user preselected. If 0 or < -2, we use id of current user. If -1, keep unselected (if empty is allowed) + * @param string $htmlname Field name in form + * @param int $show_empty 0=list with no empty value, 1=add also an empty value into list + * @param array $exclude Array list of users id to exclude + * @param int $disabled If select list must be disabled + * @param array|string $include Array list of users id to include. User '' for all users or 'hierarchy' to have only supervised users or 'hierarchyme' to have supervised + me + * @param array $enableonly Array list of users id to be enabled. If defined, it means that others will be disabled + * @param string $force_entity '0' or Ids of environment to force + * @param int $maxlength Maximum length of string into list (0=no limit) + * @param int $showstatus 0=show user status only if status is disabled, 1=always show user status into label, -1=never show user status + * @param string $morefilter Add more filters into sql request (Example: 'employee = 1') + * @param integer $show_every 0=default list, 1=add also a value "Everybody" at beginning of list + * @param string $enableonlytext If option $enableonlytext is set, we use this text to explain into label why record is disabled. Not used if enableonly is empty. + * @param string $morecss More css + * @param int $noactive Show only active users (this will also happened whatever is this option if USER_HIDE_INACTIVE_IN_COMBOBOX is on). + * @param int $outputmode 0=HTML select string, 1=Array + * @param bool $multiple add [] in the name of element and add 'multiple' attribut + * @return string HTML select string * @see select_dolgroups() */ public function select_dolusers($selected = '', $htmlname = 'userid', $show_empty = 0, $exclude = null, $disabled = 0, $include = '', $enableonly = '', $force_entity = '0', $maxlength = 0, $showstatus = 0, $morefilter = '', $show_every = 0, $enableonlytext = '', $morecss = '', $noactive = 0, $outputmode = 0, $multiple = false) From 36a0780f148c684e3172a689e2d8e550d0473b52 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 5 May 2020 15:20:40 +0200 Subject: [PATCH 048/158] More complete fix for #13817 --- htdocs/core/menus/standard/eldy.lib.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index f1859c0fcc5..17edca45676 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -227,19 +227,21 @@ function print_eldy_menu($db, $atarget, $type_user, &$tabMenu, &$menu, $noout = $tmpentry = array( 'enabled'=>(!empty($conf->propal->enabled) || !empty($conf->commande->enabled) || - !empty($conf->supplier_order->enabled) || - !empty($conf->supplier_proposal->enabled) || - !empty($conf->contrat->enabled) || + !empty($conf->fournisseur->enabled) || + !empty($conf->supplier_proposal->enabled) || + !empty($conf->supplier_order->enabled) || + !empty($conf->contrat->enabled) || !empty($conf->ficheinter->enabled) ) ? 1 : 0, 'perms'=>(!empty($user->rights->propal->lire) || !empty($user->rights->commande->lire) || !empty($user->rights->fournisseur->lire) || !empty($user->rights->supplier_proposal->lire) || + !empty($user->rights->supplier_order->lire) || !empty($user->rights->contrat->lire) || !empty($user->rights->ficheinter->lire) ), - 'module'=>'propal|commande|supplier_order|supplier_proposal|contrat|ficheinter' + 'module'=>'propal|commande|supplier_proposal|supplier_order|contrat|ficheinter' ); $onlysupplierorder = ! empty($user->rights->fournisseur->commande->lire) && From 797beef79f7c351e59cb566f5909cafc81c23c92 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 5 May 2020 15:26:41 +0200 Subject: [PATCH 049/158] Fix --- htdocs/compta/facture/list.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index 3d7493312d1..c5a3d60f99c 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -297,7 +297,7 @@ if (empty($reshook)) include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php'; } -if($massaction == 'reglement'){ +if ($massaction == 'makepayment'){ $arrayofselected=is_array($toselect)?$toselect:array(); $loc = dol_buildpath('/compta/paiement.php', 2).'?action=create&facids='.implode(',', $arrayofselected); @@ -665,7 +665,7 @@ if ($resql) 'generate_doc'=>$langs->trans("ReGeneratePDF"), 'builddoc'=>$langs->trans("PDFMerge"), 'presend'=>$langs->trans("SendByMail"), - 'reglement'=>$langs->trans("InvoicePaymentsLimits"), + //'makepayment'=>$langs->trans("InvoicePaymentsLimits"), TODO Blank page when using this ); if ($conf->prelevement->enabled) { $langs->load("withdrawals"); From 1b35380dda4b47606d4ee8172c4152770af65a63 Mon Sep 17 00:00:00 2001 From: atm-quentin Date: Mon, 4 May 2020 14:55:24 +0200 Subject: [PATCH 050/158] NEW stats invoice graph with 3 bars --- htdocs/compta/facture/stats/index.php | 4 ++-- htdocs/core/class/dolgraph.class.php | 10 +++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/htdocs/compta/facture/stats/index.php b/htdocs/compta/facture/stats/index.php index f5472196cc2..1a771c8e60b 100644 --- a/htdocs/compta/facture/stats/index.php +++ b/htdocs/compta/facture/stats/index.php @@ -58,8 +58,8 @@ if ($user->socid > 0) $nowyear = strftime("%Y", dol_now()); $year = GETPOST('year') > 0 ?GETPOST('year') : $nowyear; -//$startyear=$year-2; -$startyear = $year - 1; +if(!empty($conf->global->INVOICE_STATS_GRAPHS_SHOW_2_YEARS)) $startyear=$year-2; +else $startyear=$year-1; $endyear = $year; diff --git a/htdocs/core/class/dolgraph.class.php b/htdocs/core/class/dolgraph.class.php index 8af46154223..3f1bfa245fb 100644 --- a/htdocs/core/class/dolgraph.class.php +++ b/htdocs/core/class/dolgraph.class.php @@ -894,7 +894,15 @@ class DolGraph if ($i > $firstlot) $this->stringtoshow .= ', '."\n"; $color = sprintf("%02x%02x%02x", $this->datacolor[$i][0], $this->datacolor[$i][1], $this->datacolor[$i][2]); $this->stringtoshow .= '{ '; - if (!isset($this->type[$i]) || $this->type[$i] == 'bars') $this->stringtoshow .= 'bars: { lineWidth: 1, show: true, align: "'.($i == $firstlot ? 'center' : 'left').'", barWidth: 0.5 }, '; + if (! isset($this->type[$i]) || $this->type[$i] == 'bars') { + if($nblot == 3) { + if($i == $firstlot) $align = 'right'; + else if($i == $firstlot+1) $align = 'center'; + else $align = 'left'; + $this->stringtoshow.='bars: { lineWidth: 1, show: true, align: "'.$align.'", barWidth: 0.45 }, '; + } + else $this->stringtoshow.='bars: { lineWidth: 1, show: true, align: "'.($i==$firstlot?'center':'left').'", barWidth: 0.5 }, '; + } if (isset($this->type[$i]) && ($this->type[$i] == 'lines' || $this->type[$i] == 'linesnopoint')) $this->stringtoshow .= 'lines: { show: true, fill: false }, points: { show: '.($this->type[$i] == 'linesnopoint' ? 'false' : 'true').' }, '; $this->stringtoshow .= 'color: "#'.$color.'", label: "'.(isset($this->Legend[$i]) ? dol_escape_js($this->Legend[$i]) : '').'", data: d'.$i.' }'; $i++; From eab69c3a598e7d826ce1fbf31b8402ad0063d8b3 Mon Sep 17 00:00:00 2001 From: atm-quentin Date: Mon, 4 May 2020 15:19:45 +0200 Subject: [PATCH 051/158] NEW multiselect categorie client stats facturation --- htdocs/compta/facture/stats/index.php | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/htdocs/compta/facture/stats/index.php b/htdocs/compta/facture/stats/index.php index 1a771c8e60b..4c0d23c90e2 100644 --- a/htdocs/compta/facture/stats/index.php +++ b/htdocs/compta/facture/stats/index.php @@ -32,6 +32,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facturestats.class.php'; +if(!empty($conf->category->enabled)) require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; $WIDTH = DolGraph::getDefaultGraphSizeForStats('width'); $HEIGHT = DolGraph::getDefaultGraphSizeForStats('height'); @@ -49,6 +50,7 @@ $categ_id = GETPOST('categ_id', 'categ_id'); $userid = GETPOST('userid', 'int'); $socid = GETPOST('socid', 'int'); +$custcats = GETPOST('custcats', 'array'); // Security check if ($user->socid > 0) { @@ -66,7 +68,7 @@ $endyear = $year; /* * View */ - +if(!empty($conf->category->enabled)) $langs->load('categories'); $form = new Form($db); $formcompany = new FormCompany($db); $formother = new FormOther($db); @@ -93,6 +95,10 @@ $stats = new FactureStats($db, $socid, $mode, ($userid > 0 ? $userid : 0), ($typ if ($mode == 'customer') { if ($object_status != '' && $object_status >= 0) $stats->where .= ' AND f.fk_statut IN ('.$db->escape($object_status).')'; + if (is_array($custcats) && !empty($custcats)) { + $stats->from .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_societe as cat ON (f.fk_soc = cat.fk_soc)'; + $stats->where .= ' AND cat.fk_categorie IN ('.implode(',', $custcats).')'; + } } if ($mode == 'supplier') { @@ -256,6 +262,13 @@ if ($mode == 'customer') $filter = 's.client in (1,2,3)'; if ($mode == 'supplier') $filter = 's.fournisseur = 1'; print $form->selectarray('socid', $companies, $socid, 1, 0, 0, 'style="width: 95%"', 0, 0, 0, '', '', 1); print ''; +if(!empty($conf->category->enabled) && $mode == 'customer') { + // Customer Category + print ''; + } // ThirdParty Type print ''; print ''; + // MO + if (!empty($conf->mrp->enabled) && $user->rights->mrp->read) + { + $nblines++; + //$ret = $product->load_stats_mo($socid); + if ($ret < 0) dol_print_error($db); + $langs->load("orders"); + print ''; + print ''; + } // Customer proposals if (!empty($conf->propal->enabled) && $user->rights->propale->lire) { @@ -379,7 +397,7 @@ function show_stats_for_company($product, $socid) if ($ret < 0) dol_print_error($db); $langs->load("propal"); print ''; print ''; } - // MO - if (!empty($conf->mrp->enabled) && $user->rights->mrp->read) - { - $nblines++; - //$ret = $product->load_stats_mo($socid); - if ($ret < 0) dol_print_error($db); - $langs->load("orders"); - print ''; - print ''; - } // Customer invoices if (!empty($conf->facture->enabled) && $user->rights->facture->lire) { @@ -469,7 +469,7 @@ function show_stats_for_company($product, $socid) if ($ret < 0) dol_print_error($db); $langs->load("bills"); print ''; - print ''; + print ''; print ''; if ($object->statut == Holiday::STATUS_REFUSED) From db8596743c7c081674420aa3a53edc68c75dd851 Mon Sep 17 00:00:00 2001 From: Vaadasch Date: Thu, 7 May 2020 22:09:55 +0200 Subject: [PATCH 093/158] Update facture.class.php Auto-update dates (if not empty) of services when cloning facture. Actual code is only for month by month. If empty (start or end) => do nothing If set, update for next month if there is only 1d between what had been set and the start (or end) of the month. If there is more than one day from start or end of the month => do nothing, because we're not sure the service is by month Worst case scenario : the facture is cloned, the service is updated with new unwanted dates User need to manually updates date : he would have done that either way --- htdocs/compta/facture/class/facture.class.php | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 90ed560b3cf..395de47d443 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -1177,6 +1177,30 @@ class Facture extends CommonInvoice { unset($object->lines[$i]); unset($object->products[$i]); // Tant que products encore utilise + } + // Bloc to update dates of service (month by month only if previously filled at 1d near start or end of month) + // If it's a service with start and end dates + if ($line->product_type == 1 && !empty($line->date_start) && !empty($line->date_end) ) { + // Get the dates + $start = dol_getdate($line->date_start); + $end = dol_getdate($line->date_end); + + // Get the first and last day of the month + $first = dol_get_first_day($start['year'], $start['mon']); + $last = dol_get_first_day($end['year'], $end['mon']); + + // Get diff betweend start/end of month and previously filled + $diffFirst = num_between_day($first, dol_mktime($start['hours'], $start['minutes'], $start['seconds'], $start['mon'], $start['mday'], $start['year'], 'user')); + $diffLast = num_between_day(dol_mktime($end['hours'], $end['minutes'], $end['seconds'], $end['mon'], $end['mday'], $end['year'], 'user'), $last); + + // If there is <= 1d (or 2?) of start/or/end of month + if ($diffFirst <= 2 && $diffLast <= 2) { + $nextMonth = dol_get_next_month($end['mon'], $end['year']); + $newFirst = dol_get_first_day($nextMonth['year'],$nextMonth['month']); + $newLast = dol_get_last_day($nextMonth['year'],$nextMonth['month']); + $object->lines[$i]->date_start = $newFirst; + $object->lines[$i]->date_end = $newLast; + } } } From 7514a625fdb17a9226185ddc9a7fda64b84f625e Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Thu, 7 May 2020 20:11:59 +0000 Subject: [PATCH 094/158] Fixing style errors. --- htdocs/compta/facture/class/facture.class.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 395de47d443..ffa96fe5237 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -1184,7 +1184,7 @@ class Facture extends CommonInvoice // Get the dates $start = dol_getdate($line->date_start); $end = dol_getdate($line->date_end); - + // Get the first and last day of the month $first = dol_get_first_day($start['year'], $start['mon']); $last = dol_get_first_day($end['year'], $end['mon']); @@ -1196,8 +1196,8 @@ class Facture extends CommonInvoice // If there is <= 1d (or 2?) of start/or/end of month if ($diffFirst <= 2 && $diffLast <= 2) { $nextMonth = dol_get_next_month($end['mon'], $end['year']); - $newFirst = dol_get_first_day($nextMonth['year'],$nextMonth['month']); - $newLast = dol_get_last_day($nextMonth['year'],$nextMonth['month']); + $newFirst = dol_get_first_day($nextMonth['year'], $nextMonth['month']); + $newLast = dol_get_last_day($nextMonth['year'], $nextMonth['month']); $object->lines[$i]->date_start = $newFirst; $object->lines[$i]->date_end = $newLast; } From 206b16410ebd615c87ed7fbf120804f53c5d980e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 7 May 2020 22:52:32 +0200 Subject: [PATCH 095/158] Revert the option to avoid to introduce a feature that is duplicate with already existing view "Events/Agenda". It also keeps a common behaviour between other tools. Maxi debug on messages of tickets --- htdocs/comm/action/class/actioncomm.class.php | 3 +- htdocs/comm/action/list.php | 39 +++++++----- htdocs/contrat/card.php | 5 +- htdocs/core/class/html.formactions.class.php | 63 +++++++++++-------- htdocs/core/lib/functions.lib.php | 6 +- htdocs/core/lib/ticket.lib.php | 2 +- .../install/mysql/migration/11.0.0-12.0.0.sql | 2 +- htdocs/langs/en_US/main.lang | 1 + htdocs/public/ticket/view.php | 2 +- htdocs/societe/card.php | 2 +- htdocs/theme/eldy/timeline.inc.php | 2 +- htdocs/ticket/card.php | 20 ++++-- htdocs/ticket/class/actions_ticket.class.php | 3 +- htdocs/ticket/class/ticket.class.php | 2 +- 14 files changed, 88 insertions(+), 64 deletions(-) diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index fac4dc45715..7141d875567 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -405,7 +405,6 @@ class ActionComm extends CommonObject $this->userassigned[$tmpid] = array('id'=>$tmpid, 'transparency'=>$this->transparency); } - $userownerid = $this->userownerid; $userdoneid = $this->userdoneid; @@ -484,7 +483,7 @@ class ActionComm extends CommonObject $sql .= (strval($this->datef) != '' ? "'".$this->db->idate($this->datef)."'" : "null").", "; $sql .= ((isset($this->durationp) && $this->durationp >= 0 && $this->durationp != '') ? "'".$this->db->escape($this->durationp)."'" : "null").", "; // deprecated $sql .= (isset($this->type_id) ? $this->type_id : "null").","; - $sql .= ($code ? ("'".$code."'") : "null").", "; + $sql .= ($code ? ("'".$this->db->escape($code)."'") : "null").", "; $sql .= ($this->ref_ext ? ("'".$this->db->idate($this->ref_ext)."'") : "null").", "; $sql .= ((isset($this->socid) && $this->socid > 0) ? $this->socid : "null").", "; $sql .= ((isset($this->fk_project) && $this->fk_project > 0) ? $this->fk_project : "null").", "; diff --git a/htdocs/comm/action/list.php b/htdocs/comm/action/list.php index a4b1a9618fb..ef6e21c39cd 100644 --- a/htdocs/comm/action/list.php +++ b/htdocs/comm/action/list.php @@ -242,7 +242,7 @@ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php'; $sql = "SELECT"; if ($usergroup > 0) $sql .= " DISTINCT"; $sql .= " s.nom as societe, s.rowid as socid, s.client, s.email as socemail,"; -$sql .= " a.id, a.label, a.note, a.datep as dp, a.datep2 as dp2, a.fulldayevent, a.location,"; +$sql .= " a.id, a.code, a.label, a.note, a.datep as dp, a.datep2 as dp2, a.fulldayevent, a.location,"; $sql .= ' a.fk_user_author,a.fk_user_action,'; $sql .= " a.fk_contact, a.note, a.percent as percent,"; $sql .= " a.fk_element, a.elementtype, a.datec, a.tms as datem,"; @@ -385,14 +385,8 @@ if ($resql) print ''; $nav = ''; - //if ($actioncode) $nav.=''; - //if ($resourceid) $nav.=''; if ($filter) $nav .= ''; - //if ($filtert) $nav.=''; - //if ($socid) $nav.=''; if ($showbirthday) $nav .= ''; - //if ($pid) $nav.=''; - //if ($usergroup) $nav.=''; print $nav; dol_fiche_head($head, $tabactive, $langs->trans('Agenda'), 0, 'action'); @@ -548,6 +542,7 @@ if ($resql) $actionstatic->id = $obj->id; $actionstatic->ref = $obj->id; + $actionstatic->code = $obj->code; $actionstatic->type_code = $obj->type_code; $actionstatic->type_label = $obj->type_label; $actionstatic->type_picto = $obj->type_picto; @@ -583,21 +578,31 @@ if ($resql) if (!empty($arrayfields['c.libelle']['checked'])) { print ''; } diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index 52144d44d34..25857767e80 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -2227,13 +2227,12 @@ else $MAXEVENT = 10; - $morehtmlright = dolGetButtonTitle($langs->trans('SeeAll'), '', 'fa fa-list-alt', DOL_URL_ROOT.'/contrat/agenda.php?id='.$object->id); + $morehtmlcenter = dolGetButtonTitle($langs->trans('SeeAll'), '', 'fa fa-list-alt imgforviewmode', DOL_URL_ROOT.'/contrat/agenda.php?id='.$object->id); // List of actions on element include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php'; $formactions = new FormActions($db); - $somethingshown = $formactions->showactions($object, 'contract', $socid, 1, 'listactions', $MAXEVENT, '', $morehtmlright); - + $somethingshown = $formactions->showactions($object, 'contract', $socid, 1, 'listactions', $MAXEVENT, '', $morehtmlcenter); print ''; } diff --git a/htdocs/core/class/html.formactions.class.php b/htdocs/core/class/html.formactions.class.php index b06877c8c3b..352fcebb06b 100644 --- a/htdocs/core/class/html.formactions.class.php +++ b/htdocs/core/class/html.formactions.class.php @@ -165,13 +165,12 @@ class FormActions * @param string $morecss More css on table * @param int $max Max number of record * @param string $moreparambacktopage More param for the backtopage - * @param string $morehtmlright More html text on right of title line + * @param string $morehtmlcenter More html text on center of title line * @return int <0 if KO, >=0 if OK */ - public function showactions($object, $typeelement, $socid = 0, $forceshowtitle = 0, $morecss = 'listactions', $max = 0, $moreparambacktopage = '', $morehtmlright = '') + public function showactions($object, $typeelement, $socid = 0, $forceshowtitle = 0, $morecss = 'listactions', $max = 0, $moreparambacktopage = '', $morehtmlcenter = '') { global $langs, $conf, $user; - global $bc; require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php'; @@ -208,8 +207,9 @@ class FormActions $newcardbutton .= dolGetButtonTitle($langs->trans("AddEvent"), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/comm/action/card.php?action=create&datep='.dol_print_date(dol_now(), 'dayhourlog').'&origin='.$typeelement.'&originid='.$object->id.($object->socid > 0 ? '&socid='.$object->socid : ($socid > 0 ? '&socid='.$socid : '')).($projectid > 0 ? '&projectid='.$projectid : '').'&backtopage='.urlencode($urlbacktopage)); } + print ''."\n"; - print load_fiche_titre($title, $newcardbutton, '', 0, 0, '', $morehtmlright); + print load_fiche_titre($title, $newcardbutton, '', 0, 0, '', $morehtmlcenter); $page = 0; $param = ''; @@ -230,29 +230,29 @@ class FormActions $cacheusers = array(); $cursorevent = 0; - foreach ($listofactions as $action) + foreach ($listofactions as $actioncomm) { if ($max && $cursorevent >= $max) break; - $ref = $action->getNomUrl(1, -1); - $label = $action->getNomUrl(0, 38); + $ref = $actioncomm->getNomUrl(1, -1); + $label = $actioncomm->getNomUrl(0, 38); print ''; // Ref print ''; // Onwer print ''; + // Type print ''; // Label print ''; // Date - print ''; print ''; print ''; diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 43cee63c1ed..bcf47a58eef 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -3155,7 +3155,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $ 'intervention', 'label', 'language', 'list', 'listlight', 'lot', 'map-marker-alt', 'money-bill-alt', 'mrp', 'note', 'object_accounting', 'object_action', 'object_account', 'object_barcode', 'object_bill', 'object_billa', 'object_billd', 'object_bom', - 'object_category', 'object_bookmark', 'object_bug', 'object_dolly', 'object_dollyrevert', 'object_generic', 'object_folder', + 'object_category', 'object_conversation', 'object_bookmark', 'object_bug', 'object_dolly', 'object_dollyrevert', 'object_generic', 'object_folder', 'object_list-alt', 'object_calendar', 'object_calendarweek', 'object_calendarmonth', 'object_calendarday', 'object_calendarperuser', 'object_cash-register', 'object_company', 'object_contact', 'object_contract', 'object_donation', 'object_dynamicprice', 'object_holiday', 'object_hrm', 'object_invoice', 'object_intervention', 'object_label', @@ -3190,7 +3190,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $ $arrayconvpictotofa = array( 'account'=>'university', 'accountancy'=>'money-check-alt', 'action'=>'calendar-alt', 'address'=> 'address-book', 'bank_account'=>'university', 'bill'=>'file-invoice-dollar', 'billa'=>'file-excel', 'billd'=>'file-medical', 'bom'=>'cubes', - 'company'=>'building', 'contact'=>'address-book', 'contract'=>'suitcase', 'donation'=>'file-alt', 'dynamicprice'=>'hand-holding-usd', + 'company'=>'building', 'contact'=>'address-book', 'contract'=>'suitcase', 'conversation'=>'comments', 'donation'=>'file-alt', 'dynamicprice'=>'hand-holding-usd', 'setup'=>'cog', 'companies'=>'building', 'products'=>'cube', 'commercial'=>'suitcase', 'invoicing'=>'coins', 'accounting'=>'chart-line', 'category'=>'tag', 'dollyrevert'=>'dolly', 'hrm'=>'umbrella-beach', 'margin'=>'calculator', 'members'=>'users', 'ticket'=>'ticket-alt', 'globe'=>'external-link-alt', 'lot'=>'barcode', @@ -3263,7 +3263,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $ $arrayconvpictotomorcess = array( 'action'=>'bg-infobox-action', 'account'=>'bg-infobox-bank_account', 'accountancy'=>'bg-infobox-bank_account', 'bank_account'=>'bg-infobox-bank_account', 'bill'=>'bg-infobox-commande', 'billa'=>'bg-infobox-commande', 'billd'=>'bg-infobox-commande', - 'cash-register'=>'bg-infobox-bank_account', 'contract'=>'bg-infobox-contrat', 'check'=>'font-status4', + 'cash-register'=>'bg-infobox-bank_account', 'contract'=>'bg-infobox-contrat', 'check'=>'font-status4', 'conversation'=>'bg-infobox-contrat', 'donation'=>'bg-infobox-commande', 'dollyrevert'=>'flip', 'ecm'=>'bg-infobox-action', 'hrm'=>'bg-infobox-adherent', 'group'=>'bg-infobox-adherent', 'intervention'=>'bg-infobox-contrat', 'multicurrency'=>'bg-infobox-bank_account', diff --git a/htdocs/core/lib/ticket.lib.php b/htdocs/core/lib/ticket.lib.php index e12531b3846..0a50eb7407f 100644 --- a/htdocs/core/lib/ticket.lib.php +++ b/htdocs/core/lib/ticket.lib.php @@ -709,7 +709,7 @@ function show_ticket_messaging($conf, $langs, $db, $filterobj, $objcon = '', $no $out .= $histo[$key]['id']; $out .= ' '; } else { - $out .= $actionstatic->getNomUrl(1, -1).' '; + $out .= $actionstatic->getNomUrl(1, -1, 'valignmiddle').' '; } //if ($user->rights->agenda->allactions->read || $actionstatic->authorid == $user->id) diff --git a/htdocs/install/mysql/migration/11.0.0-12.0.0.sql b/htdocs/install/mysql/migration/11.0.0-12.0.0.sql index 0730511ad99..38d0acb97fa 100644 --- a/htdocs/install/mysql/migration/11.0.0-12.0.0.sql +++ b/htdocs/install/mysql/migration/11.0.0-12.0.0.sql @@ -275,4 +275,4 @@ ALTER TABLE llx_prelevement_facture ADD COLUMN fk_facture_fourn INTEGER NULL; ALTER TABLE llx_menu MODIFY COLUMN module varchar(255); - +ALTER TABLE llx_actioncomm SET fk_action = 50 where fk_action = 40 AND code = 'TICKET_MSG'; diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index fb0808e0953..8c992bf91ca 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -426,6 +426,7 @@ Modules=Modules/Applications Option=Option List=List FullList=Full list +FullConversation=Full conversation Statistics=Statistics OtherStatistics=Other statistics Status=Status diff --git a/htdocs/public/ticket/view.php b/htdocs/public/ticket/view.php index 1938c68de3e..af656e69ab0 100644 --- a/htdocs/public/ticket/view.php +++ b/htdocs/public/ticket/view.php @@ -370,7 +370,7 @@ if ($action == "view_ticket" || $action == "presend" || $action == "close" || $a } // Message list - print load_fiche_titre($langs->trans('TicketMessagesList'), '', 'messages@ticket'); + print load_fiche_titre($langs->trans('TicketMessagesList'), '', 'object_conversation'); $object->viewTicketMessages(false, true, $object->dao); } else diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php index b5400db04b3..195d4df88bb 100644 --- a/htdocs/societe/card.php +++ b/htdocs/societe/card.php @@ -2826,7 +2826,7 @@ else $MAXEVENT = 10; - $morehtmlright = dolGetButtonTitle($langs->trans('SeeAll'), '', 'fa fa-list-alt', DOL_URL_ROOT.'/societe/agenda.php?socid='.$object->id); + $morehtmlright = dolGetButtonTitle($langs->trans('SeeAll'), '', 'fa fa-list-alt imgforviewmode', DOL_URL_ROOT.'/societe/agenda.php?socid='.$object->id); // List of actions on element include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php'; diff --git a/htdocs/theme/eldy/timeline.inc.php b/htdocs/theme/eldy/timeline.inc.php index 21e683e42f0..eb13821c221 100644 --- a/htdocs/theme/eldy/timeline.inc.php +++ b/htdocs/theme/eldy/timeline.inc.php @@ -154,7 +154,7 @@ a.timeline-btn:hover border-radius: 50%; text-align: center; left: 18px; - top: 0; + top: 5px; } .timeline > .time-label > span { font-weight: 600; diff --git a/htdocs/ticket/card.php b/htdocs/ticket/card.php index 7d5ab5fe228..6e400b3eeaa 100644 --- a/htdocs/ticket/card.php +++ b/htdocs/ticket/card.php @@ -143,6 +143,7 @@ if (empty($reshook)) { $action = 'view'; } + // Action to add an action (not a message) if (GETPOST('add', 'alpha') && $user->rights->ticket->write) { $error = 0; @@ -381,6 +382,7 @@ if (empty($reshook)) { $action = 'view'; } + // Action to add an action (not a message) if ($action == 'add_message' && GETPOSTISSET('btn_add_message') && $user->rights->ticket->read) { $ret = $object->newMessage($user, $action, (GETPOST('private_message', 'alpha') == "on" ? 1 : 0)); @@ -1218,7 +1220,8 @@ if (empty($action) || $action == 'view' || $action == 'addlink' || $action == 'd if (GETPOSTISSET('actionbis') && $action == 'presend') $action = 'presend_addmessage'; // add a message - if ($action == 'presend' || $action == 'presend_addmessage') { + if ($action == 'presend' || $action == 'presend_addmessage') + { $action = 'add_message'; // action to use to post the message $modelmail = 'ticket_send'; @@ -1293,8 +1296,8 @@ if (empty($action) || $action == 'view' || $action == 'addlink' || $action == 'd print ''; } - // Show messages on card - if (empty($conf->global->TICKET_HIDE_MESSAGES_ON_CARD)) { + // Show messages on card (Note: this is a duplicate of the view Events/Agenda but on the main tab) + if (! empty($conf->global->TICKET_SHOW_MESSAGES_ON_CARD)) { $param = '&id='.$object->id; if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param .= '&contextpage='.$contextpage; if ($limit > 0 && $limit != $conf->liste_limit) $param .= '&limit='.$limit; @@ -1337,16 +1340,23 @@ if (empty($action) || $action == 'view' || $action == 'addlink' || $action == 'd print showDirectPublicLink($object).'
'; print ''; - if (!empty($conf->global->TICKET_HIDE_MESSAGES_ON_CARD)) { + if (empty($conf->global->TICKET_SHOW_MESSAGES_ON_CARD)) { print '
'; + $MAXEVENT = 10; + + $morehtmlcenter = dolGetButtonTitle($langs->trans('FullConversation'), '', 'fa fa-comments imgforviewmode', DOL_URL_ROOT.'/ticket/messaging.php?id='.$object->id); + $morehtmlcenter .= ' '; + $morehtmlcenter .= dolGetButtonTitle($langs->trans('FullList'), '', 'fa fa-list-alt imgforviewmode', DOL_URL_ROOT.'/ticket/agenda.php?id='.$object->id); + // List of actions on element include_once DOL_DOCUMENT_ROOT . '/core/class/html.formactions.class.php'; $formactions = new FormActions($db); - $somethingshown = $formactions->showactions($object, 'ticket', $socid, 1); + $somethingshown = $formactions->showactions($object, 'ticket', $socid, 1, 'listactions', $MAXEVENT, '', $morehtmlcenter); print '
'; } + print ''; } } diff --git a/htdocs/ticket/class/actions_ticket.class.php b/htdocs/ticket/class/actions_ticket.class.php index 9a67c3dd574..9931b12ffa2 100644 --- a/htdocs/ticket/class/actions_ticket.class.php +++ b/htdocs/ticket/class/actions_ticket.class.php @@ -272,6 +272,7 @@ class ActionsTicket print $langs->trans('User'); print ''; } + print ''; foreach ($this->dao->cache_msgs_ticket as $id => $arraymsgs) { if (!$arraymsgs['private'] @@ -280,7 +281,7 @@ class ActionsTicket //print ''; print ''; print ''; if ($show_user) { print ''; } diff --git a/htdocs/takepos/admin/setup.php b/htdocs/takepos/admin/setup.php index 59fe85e66ef..85406c46faa 100644 --- a/htdocs/takepos/admin/setup.php +++ b/htdocs/takepos/admin/setup.php @@ -274,7 +274,7 @@ if (!empty($conf->service->enabled)) print '\n"; diff --git a/htdocs/takepos/genimg/qr.php b/htdocs/takepos/genimg/qr.php index f0c3bea82b9..c73e874a465 100644 --- a/htdocs/takepos/genimg/qr.php +++ b/htdocs/takepos/genimg/qr.php @@ -29,5 +29,5 @@ require '../../core/modules/barcode/doc/tcpdfbarcode.modules.php'; $key = GETPOST('key'); -$module = new modtcpdfbarcode($db); +$module = new modTcpdfbarcode($db); $result = $module->buildBarCode("http://www.takepos.com", 'QRCODE', 'Y'); diff --git a/htdocs/takepos/phone.php b/htdocs/takepos/phone.php index 80d67513bf2..eac1f40bfd1 100644 --- a/htdocs/takepos/phone.php +++ b/htdocs/takepos/phone.php @@ -31,14 +31,14 @@ if (!defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); if (!defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); if (!defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); -require '../main.inc.php'; // Load $user and permissions +if (!defined('INCLUDE_PHONEPAGE_FROM_PUBLIC_PAGE')) require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php'; -if ($_SESSION["publicterminal"]){ - // Decode place if is a order from customer phone +if (defined('INCLUDE_PHONEPAGE_FROM_PUBLIC_PAGE')) { + // Decode place if it is an order from customer phone $key = GETPOST('key'); $place=dol_decode($key); } @@ -53,7 +53,7 @@ if ($setterminal > 0) $langs->loadLangs(array("bills", "orders", "commercial", "cashdesk", "receiptprinter")); -if ($_SESSION["publicterminal"]) { +if (defined('INCLUDE_PHONEPAGE_FROM_PUBLIC_PAGE')) { $_SESSION["takeposterminal"] = 1; // Use Terminal 1 for public customers } elseif (empty($user->rights->takepos->run)) { diff --git a/htdocs/takepos/public/auto_order.php b/htdocs/takepos/public/auto_order.php index c97edfdc0e7..5b463959b69 100644 --- a/htdocs/takepos/public/auto_order.php +++ b/htdocs/takepos/public/auto_order.php @@ -24,6 +24,10 @@ if (!defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session) if (!defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip +require '../../main.inc.php'; + $_SESSION["basiclayout"] = 1; $_SESSION["publicterminal"] = true; // Is a public customer -require '../phone.php'; + +define('INCLUDE_PHONEPAGE_FROM_PUBLIC_PAGE', 1); +include '../phone.php'; From 790bef98e5e271cc3750d2f9ff5749b590262ebb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 7 May 2020 23:45:33 +0200 Subject: [PATCH 099/158] Look and feel v12 --- htdocs/ticket/class/actions_ticket.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/ticket/class/actions_ticket.class.php b/htdocs/ticket/class/actions_ticket.class.php index 147f6228005..0fb5835cb4c 100644 --- a/htdocs/ticket/class/actions_ticket.class.php +++ b/htdocs/ticket/class/actions_ticket.class.php @@ -281,7 +281,7 @@ class ActionsTicket //print ''; print ''; print ''; if ($show_user) { print ''; @@ -531,8 +531,8 @@ if ($mode == 'searchkey') { $obj = $db->fetch_object($result); } - print ''.img_edit().''; - print '  '; + print ''.img_edit().''; + print ' '; print ''.img_delete().''; print '  '; $htmltext = $langs->trans("OriginalValueWas", $newlangfileonly->tab_translate[$key]); @@ -541,7 +541,7 @@ if ($mode == 'searchkey') elseif (!empty($conf->global->MAIN_ENABLE_OVERWRITE_TRANSLATION)) { //print $key.'-'.$val; - print ''.img_edit_add($langs->trans("Overwrite")).''; + print ''.img_edit_add($langs->trans("Overwrite")).''; } if (!empty($conf->global->MAIN_FEATURES_LEVEL)) diff --git a/htdocs/comm/action/list.php b/htdocs/comm/action/list.php index ef6e21c39cd..e804213cdce 100644 --- a/htdocs/comm/action/list.php +++ b/htdocs/comm/action/list.php @@ -625,7 +625,7 @@ if ($resql) $formatToUse = $obj->fulldayevent ? 'day' : 'dayhour'; // Start date if (!empty($arrayfields['a.datep']['checked'])) { - print ''; } diff --git a/htdocs/core/lib/agenda.lib.php b/htdocs/core/lib/agenda.lib.php index 8dc2e418cc8..474a4f03696 100644 --- a/htdocs/core/lib/agenda.lib.php +++ b/htdocs/core/lib/agenda.lib.php @@ -27,7 +27,7 @@ /** * Show filter form in agenda view * - * @param Object $form Form object + * @param Form $form Form object * @param int $canedit Can edit filter fields * @param int $status Status * @param int $year Year @@ -123,7 +123,7 @@ function print_actions_filter($form, $canedit, $status, $year, $month, $day, $sh print $langs->trans("ThirdParty").'   '; print ''; } From a649dcecf767cd63a5b30234916b1c7b6613fac9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 8 May 2020 03:01:51 +0200 Subject: [PATCH 103/158] Look and field --- htdocs/takepos/admin/bar.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/takepos/admin/bar.php b/htdocs/takepos/admin/bar.php index 5c255dc89c7..2508ab56040 100644 --- a/htdocs/takepos/admin/bar.php +++ b/htdocs/takepos/admin/bar.php @@ -85,7 +85,7 @@ print ''; print '
'; print '
'.$langs->trans("CustomersProspectsCategoriesShort").''; + $cate_arbo = $form->select_all_categories(Categorie::TYPE_CUSTOMER, null, 'parent', null, null, 1); + print $form->multiselectarray('custcats', $cate_arbo, GETPOST('custcats', 'array'), null, null, null, null, "90%"); + print '
'.$langs->trans("ThirdPartyType").''; $sortparam_typent = (empty($conf->global->SOCIETE_SORT_ON_TYPEENT) ? 'ASC' : $conf->global->SOCIETE_SORT_ON_TYPEENT); // NONE means we keep sort of original array, so we sort on position. ASC, means next function will sort on label. From b2a9791dca9bd3872ba359a77439290167820ce9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 5 May 2020 16:33:02 +0200 Subject: [PATCH 052/158] Fix pagination on pages "Related items" --- htdocs/core/lib/product.lib.php | 42 +++++++++---------- htdocs/product/stats/commande.php | 22 ++++------ htdocs/product/stats/commande_fournisseur.php | 20 ++++----- htdocs/product/stats/contrat.php | 21 ++++------ htdocs/product/stats/facture.php | 20 ++++----- htdocs/product/stats/facture_fournisseur.php | 22 ++++------ htdocs/product/stats/mo.php | 22 ++++------ htdocs/product/stats/propal.php | 20 ++++----- htdocs/product/stats/supplier_proposal.php | 22 ++++------ 9 files changed, 90 insertions(+), 121 deletions(-) diff --git a/htdocs/core/lib/product.lib.php b/htdocs/core/lib/product.lib.php index a6ee33e9a65..0615ff127b0 100644 --- a/htdocs/core/lib/product.lib.php +++ b/htdocs/core/lib/product.lib.php @@ -353,6 +353,24 @@ function show_stats_for_company($product, $socid) print ''.$langs->trans("TotalQuantity").'
'; + print ''.img_object('', 'mrp').' '.$langs->trans("MO").''; + print ''; + print $product->stats_mo['suppliers']; + print ''; + print $product->stats_mo['nb']; + print ''; + print $product->stats_mo['qty']; + print '
'; - print ''.img_object('', 'propal').' '.$langs->trans("SupplierProposals").''; + print ''.img_object('', 'supplier_proposal').' '.$langs->trans("SupplierProposals").''; print ''; print $product->stats_proposal_supplier['suppliers']; print ''; @@ -415,7 +433,7 @@ function show_stats_for_company($product, $socid) if ($ret < 0) dol_print_error($db); $langs->load("orders"); print '
'; - print ''.img_object('', 'order').' '.$langs->trans("SuppliersOrders").''; + print ''.img_object('', 'supplier_order').' '.$langs->trans("SuppliersOrders").''; print ''; print $product->stats_commande_fournisseur['suppliers']; print ''; @@ -425,24 +443,6 @@ function show_stats_for_company($product, $socid) print '
'; - print ''.img_object('', 'mrp').' '.$langs->trans("MO").''; - print ''; - print $product->stats_mo['suppliers']; - print ''; - print $product->stats_mo['nb']; - print ''; - print $product->stats_mo['qty']; - print '
'; - print ''.img_object('', 'bill').' '.$langs->trans("SuppliersInvoices").''; + print ''.img_object('', 'supplier_invoice').' '.$langs->trans("SuppliersInvoices").''; print ''; print $product->stats_facture_fournisseur['suppliers']; print ''; diff --git a/htdocs/product/stats/commande.php b/htdocs/product/stats/commande.php index 71c1b0f1ef7..9898c13f21b 100644 --- a/htdocs/product/stats/commande.php +++ b/htdocs/product/stats/commande.php @@ -164,26 +164,22 @@ if ($id > 0 || !empty($ref)) { $num = $db->num_rows($result); - if (!empty($id)) - $option .= '&id='.$product->id; - if (!empty($search_month)) - $option .= '&search_month='.$search_month; - if (!empty($search_year)) - $option .= '&search_year='.$search_year; - if ($limit > 0 && $limit != $conf->liste_limit) $option .= '&limit='.urlencode($limit); + if ($limit > 0 && $limit != $conf->liste_limit) $option .= '&limit='.urlencode($limit); + if (!empty($id)) $option .= '&id='.$product->id; + if (!empty($search_month)) $option .= '&search_month='.urlencode($search_month); + if (!empty($search_year)) $option .= '&search_year='.urlencode($search_year); print ''."\n"; if (!empty($sortfield)) print ''; if (!empty($sortorder)) print ''; - if (!empty($page)) { - print ''; - $option .= '&page='.$page; - } - print_barre_liste($langs->trans("CustomersOrders"), $page, $_SERVER["PHP_SELF"], "&id=".$product->id, $sortfield, $sortorder, '', $num, $totalofrecords, '', 0, '', '', $limit); - print '
'; + print_barre_liste($langs->trans("CustomersOrders"), $page, $_SERVER["PHP_SELF"], $option, $sortfield, $sortorder, '', $num, $totalofrecords, '', 0, '', '', $limit, 0, 0, 1); + + if (!empty($page)) $option .= '&page='.urlencode($page); + + print '
'; print '
'; print $langs->trans('Period').' ('.$langs->trans("OrderDate").') - '; print $langs->trans('Month').': '; diff --git a/htdocs/product/stats/commande_fournisseur.php b/htdocs/product/stats/commande_fournisseur.php index 7a5b88000e1..61024cdd7ff 100644 --- a/htdocs/product/stats/commande_fournisseur.php +++ b/htdocs/product/stats/commande_fournisseur.php @@ -172,26 +172,22 @@ if ($id > 0 || !empty($ref)) { if ($result) { $num = $db->num_rows($result); - if (!empty($id)) - $option .= '&id='.$product->id; - if (!empty($search_month)) - $option .= '&search_month='.$search_month; - if (!empty($search_year)) - $option .= '&search_year='.$search_year; if ($limit > 0 && $limit != $conf->liste_limit) $option .= '&limit='.urlencode($limit); + if (!empty($id)) $option .= '&id='.$product->id; + if (!empty($search_month)) $option .= '&search_month='.urlencode($search_month); + if (!empty($search_year)) $option .= '&search_year='.urlencode($search_year); print ''."\n"; if (!empty($sortfield)) print ''; if (!empty($sortorder)) print ''; - if (!empty($page)) { - print ''; - $option .= '&page='.$page; - } - print_barre_liste($langs->trans("SuppliersOrders"), $page, $_SERVER["PHP_SELF"], "&id=".$product->id, $sortfield, $sortorder, '', $num, $totalofrecords, '', 0, '', '', $limit); - print '
'; + print_barre_liste($langs->trans("SuppliersOrders"), $page, $_SERVER["PHP_SELF"], $option, $sortfield, $sortorder, '', $num, $totalofrecords, '', 0, '', '', $limit, 0, 0, 1); + + if (!empty($page)) $option .= '&page='.urlencode($page); + + print '
'; print '
'; print $langs->trans('Period').' ('.$langs->trans("OrderDate").') - '; print $langs->trans('Month').': '; diff --git a/htdocs/product/stats/contrat.php b/htdocs/product/stats/contrat.php index 8e61446a834..8f88044d913 100644 --- a/htdocs/product/stats/contrat.php +++ b/htdocs/product/stats/contrat.php @@ -153,27 +153,24 @@ if ($id > 0 || !empty($ref)) if ($result) { $num = $db->num_rows($result); - if (!empty($id)) - $option .= '&id='.$product->id; - if (!empty($search_month)) - $option .= '&search_month='.$search_month; - if (!empty($search_year)) - $option .= '&search_year='.$search_year; + if ($limit > 0 && $limit != $conf->liste_limit) $option .= '&limit='.urlencode($limit); + if (!empty($id)) $option .= '&id='.$product->id; + if (!empty($search_month)) $option .= '&search_month='.urlencode($search_month); + if (!empty($search_year)) $option .= '&search_year='.urlencode($search_year); print ''."\n"; + if (!empty($sortfield)) print ''; if (!empty($sortorder)) print ''; - if (!empty($page)) { - print ''; - $option .= '&page='.$page; - } - print_barre_liste($langs->trans("Contrats"), $page, $_SERVER["PHP_SELF"], "&id=".$product->id, $sortfield, $sortorder, '', $num, $totalofrecords, '', 0, '', '', $limit); + print_barre_liste($langs->trans("Contrats"), $page, $_SERVER["PHP_SELF"], $option, $sortfield, $sortorder, '', $num, $totalofrecords, '', 0, '', '', $limit, 0, 0, 1); - $i = 0; + if (!empty($page)) $option .= '&page='.urlencode($page); + + $i = 0; print '
'; print ''; diff --git a/htdocs/product/stats/facture.php b/htdocs/product/stats/facture.php index e42afd9f28c..342cd3058a2 100644 --- a/htdocs/product/stats/facture.php +++ b/htdocs/product/stats/facture.php @@ -32,7 +32,7 @@ require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; // Load translation files required by the page -$langs->loadLangs(array('companies', 'bills', 'products')); +$langs->loadLangs(array('companies', 'bills', 'products', 'supplier_proposal')); $id = GETPOST('id', 'int'); $ref = GETPOST('ref', 'alpha'); @@ -185,25 +185,21 @@ if ($id > 0 || !empty($ref)) { $num = $db->num_rows($result); - if (!empty($id)) - $option .= '&id='.$product->id; - if (!empty($search_month)) - $option .= '&search_month='.$search_month; - if (!empty($search_year)) - $option .= '&search_year='.$search_year; if ($limit > 0 && $limit != $conf->liste_limit) $option .= '&limit='.urlencode($limit); + if (!empty($id)) $option .= '&id='.$product->id; + if (!empty($search_month)) $option .= '&search_month='.urlencode($search_month); + if (!empty($search_year)) $option .= '&search_year='.urlencode($search_year); print ''."\n"; if (!empty($sortfield)) print ''; if (!empty($sortorder)) print ''; - if (!empty($page)) { - print ''; - $option .= '&page='.$page; - } - print_barre_liste($langs->trans("CustomersInvoices"), $page, $_SERVER["PHP_SELF"], "&id=".$product->id, $sortfield, $sortorder, '', $num, $totalofrecords, '', 0, '', '', $limit); + print_barre_liste($langs->trans("CustomersInvoices"), $page, $_SERVER["PHP_SELF"], $option, $sortfield, $sortorder, '', $num, $totalofrecords, '', 0, '', '', $limit, 0, 0, 1); + + if (!empty($page)) $option .= '&page='.urlencode($page); + print '
'; print '
'; print $langs->trans('Period').' ('.$langs->trans("DateInvoice").') - '; diff --git a/htdocs/product/stats/facture_fournisseur.php b/htdocs/product/stats/facture_fournisseur.php index 29774709e5e..f39d4ab73b3 100644 --- a/htdocs/product/stats/facture_fournisseur.php +++ b/htdocs/product/stats/facture_fournisseur.php @@ -32,7 +32,7 @@ require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; // Load translation files required by the page -$langs->loadLangs(array('companies', 'bills', 'products', 'companies')); +$langs->loadLangs(array('companies', 'bills', 'products', 'companies', 'supplier_proposal')); $id = GETPOST('id', 'int'); $ref = GETPOST('ref', 'alpha'); @@ -165,26 +165,22 @@ if ($id > 0 || !empty($ref)) { $num = $db->num_rows($result); - if (!empty($id)) - $option .= '&id='.$product->id; - if (!empty($search_month)) - $option .= '&search_month='.$search_month; - if (!empty($search_year)) - $option .= '&search_year='.$search_year; if ($limit > 0 && $limit != $conf->liste_limit) $option .= '&limit='.urlencode($limit); + if (!empty($id)) $option .= '&id='.$product->id; + if (!empty($search_month)) $option .= '&search_month='.urlencode($search_month); + if (!empty($search_year)) $option .= '&search_year='.urlencode($search_year); print ''."\n"; if (!empty($sortfield)) print ''; if (!empty($sortorder)) print ''; - if (!empty($page)) { - print ''; - $option .= '&page='.$page; - } - print_barre_liste($langs->trans("SuppliersInvoices"), $page, $_SERVER["PHP_SELF"], "&id=$product->id", $sortfield, $sortorder, '', $num, $totalofrecords, '', 0, '', '', $limit); - print '
'; + print_barre_liste($langs->trans("SuppliersInvoices"), $page, $_SERVER["PHP_SELF"], $option, $sortfield, $sortorder, '', $num, $totalofrecords, '', 0, '', '', $limit, 0, 0, 1); + + if (!empty($page)) $option .= '&page='.urlencode($page); + + print '
'; print '
'; print $langs->trans('Period').' ('.$langs->trans("DateInvoice").') - '; print $langs->trans('Month').': '; diff --git a/htdocs/product/stats/mo.php b/htdocs/product/stats/mo.php index 0a148ad2c8a..51e91aeaaac 100644 --- a/htdocs/product/stats/mo.php +++ b/htdocs/product/stats/mo.php @@ -150,27 +150,23 @@ if ($id > 0 || !empty($ref)) if ($result) { $num = $db->num_rows($result); - if (!empty($id)) - $option .= '&id='.$product->id; - if (!empty($search_month)) - $option .= '&search_month='.urlencode($search_month); - if (!empty($search_year)) - $option .= '&search_year='.urlencode($search_year); - if ($limit > 0 && $limit != $conf->liste_limit) $option .= '&limit='.urlencode($limit); + + if ($limit > 0 && $limit != $conf->liste_limit) $option .= '&limit='.urlencode($limit); + if (!empty($id)) $option .= '&id='.$product->id; + if (!empty($search_month)) $option .= '&search_month='.urlencode($search_month); + if (!empty($search_year)) $option .= '&search_year='.urlencode($search_year); print ''."\n"; if (!empty($sortfield)) print ''; if (!empty($sortorder)) print ''; - if (!empty($page)) { - print ''; - $option .= '&page='.$page; - } - print_barre_liste($langs->trans("Mos"), $page, $_SERVER["PHP_SELF"], "&id=".$product->id, $sortfield, $sortorder, '', $num, $totalofrecords, '', 0, '', '', $limit); + print_barre_liste($langs->trans("Mos"), $page, $_SERVER["PHP_SELF"], $option, $sortfield, $sortorder, '', $num, $totalofrecords, '', 0, '', '', $limit, 0, 0, 1); - $i = 0; + if (!empty($page)) $option .= '&page='.urlencode($page); + + $i = 0; print '
'; print '
'; diff --git a/htdocs/product/stats/propal.php b/htdocs/product/stats/propal.php index d65b88ccabc..35b93cac8b9 100644 --- a/htdocs/product/stats/propal.php +++ b/htdocs/product/stats/propal.php @@ -169,26 +169,22 @@ if ($id > 0 || !empty($ref)) { $num = $db->num_rows($result); - if (!empty($id)) - $option .= '&id='.$product->id; - if (!empty($search_month)) - $option .= '&search_month='.$search_month; - if (!empty($search_year)) - $option .= '&search_year='.$search_year; if ($limit > 0 && $limit != $conf->liste_limit) $option .= '&limit='.urlencode($limit); + if (!empty($id)) $option .= '&id='.$product->id; + if (!empty($search_month)) $option .= '&search_month='.urlencode($search_month); + if (!empty($search_year)) $option .= '&search_year='.urlencode($search_year); print ''."\n"; if (!empty($sortfield)) print ''; if (!empty($sortorder)) print ''; - if (!empty($page)) { - print ''; - $option .= '&page='.$page; - } - print_barre_liste($langs->trans("Proposals"), $page, $_SERVER["PHP_SELF"], "&id=".$product->id, $sortfield, $sortorder, '', $num, $totalofrecords, '', 0, '', '', $limit); - print '
'; + print_barre_liste($langs->trans("Proposals"), $page, $_SERVER["PHP_SELF"], $option, $sortfield, $sortorder, '', $num, $totalofrecords, '', 0, '', '', $limit, 0, 0, 1); + + if (!empty($page)) $option .= '&page='.urlencode($page); + + print '
'; print '
'; print $langs->trans('Period').' ('.$langs->trans("DatePropal").') - '; print $langs->trans('Month').': '; diff --git a/htdocs/product/stats/supplier_proposal.php b/htdocs/product/stats/supplier_proposal.php index a7fede51aa1..5a59cbb9c83 100644 --- a/htdocs/product/stats/supplier_proposal.php +++ b/htdocs/product/stats/supplier_proposal.php @@ -31,7 +31,7 @@ require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; // Load translation files required by the page -$langs->loadLangs(array('products', 'companies')); +$langs->loadLangs(array('products', 'companies', 'supplier_proposal')); $id = GETPOST('id', 'int'); $ref = GETPOST('ref', 'alpha'); @@ -169,26 +169,22 @@ if ($id > 0 || !empty($ref)) { $num = $db->num_rows($result); - if (!empty($id)) - $option .= '&id='.$product->id; - if (!empty($search_month)) - $option .= '&search_month='.$search_month; - if (!empty($search_year)) - $option .= '&search_year='.$search_year; if ($limit > 0 && $limit != $conf->liste_limit) $option .= '&limit='.urlencode($limit); + if (!empty($id)) $option .= '&id='.$product->id; + if (!empty($search_month)) $option .= '&search_month='.urlencode($search_month); + if (!empty($search_year)) $option .= '&search_year='.urlencode($search_year); print ''."\n"; if (!empty($sortfield)) print ''; if (!empty($sortorder)) print ''; - if (!empty($page)) { - print ''; - $option .= '&page='.$page; - } - print_barre_liste($langs->trans("Proposals"), $page, $_SERVER["PHP_SELF"], "&id=".$product->id, $sortfield, $sortorder, '', $num, $totalofrecords, '', 0, '', '', $limit); - print '
'; + print_barre_liste($langs->trans("Proposals"), $page, $_SERVER["PHP_SELF"], $option, $sortfield, $sortorder, '', $num, $totalofrecords, '', 0, '', '', $limit, 0, 0, 1); + + if (!empty($page)) $option .= '&page='.urlencode($page); + + print '
'; print '
'; print $langs->trans('Period').' ('.$langs->trans("DatePropal").') - '; print $langs->trans('Month').': '; From e871e736ebc18b39473b2227b631160444b07498 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 5 May 2020 17:54:01 +0200 Subject: [PATCH 053/158] Fix for #5824 --- htdocs/modulebuilder/template/myobject_card.php | 2 +- htdocs/mrp/class/mo.class.php | 2 +- htdocs/mrp/mo_card.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/modulebuilder/template/myobject_card.php b/htdocs/modulebuilder/template/myobject_card.php index 336b410022a..c0b33be2bf8 100644 --- a/htdocs/modulebuilder/template/myobject_card.php +++ b/htdocs/modulebuilder/template/myobject_card.php @@ -533,7 +533,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea */ // Delete (need delete permission, or if draft, just need create/modify permission) - if ($permissiontodelete) + if ($permissiontodelete || ($object->status == $object::STATUS_DRAFT && $permissiontoadd)) { print ''.$langs->trans('Delete').''."\n"; } diff --git a/htdocs/mrp/class/mo.class.php b/htdocs/mrp/class/mo.class.php index 42d97ee81d9..07c6eae52a1 100644 --- a/htdocs/mrp/class/mo.class.php +++ b/htdocs/mrp/class/mo.class.php @@ -1008,7 +1008,7 @@ class Mo extends CommonObject } $url = dol_buildpath('/mrp/mo_card.php', 1).'?id='.$this->id; - if ($option = 'production') $url = dol_buildpath('/mrp/mo_production.php', 1).'?id='.$this->id; + if ($option == 'production') $url = dol_buildpath('/mrp/mo_production.php', 1).'?id='.$this->id; if ($option != 'nolink') { diff --git a/htdocs/mrp/mo_card.php b/htdocs/mrp/mo_card.php index 59dd5ed7a7c..92f68785856 100644 --- a/htdocs/mrp/mo_card.php +++ b/htdocs/mrp/mo_card.php @@ -639,7 +639,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea } // Delete (need delete permission, or if draft, just need create/modify permission) - if ($permissiontodelete) + if ($permissiontodelete || ($object->status == $object::STATUS_DRAFT && $permissiontoadd)) { print ''.$langs->trans('Delete').''."\n"; } From ea145188b90b5515e6d1fd4bcb5c0de9c1cc3729 Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Tue, 5 May 2020 18:14:38 +0200 Subject: [PATCH 054/158] fix filter on date service contrat with hour --- htdocs/contrat/services_list.php | 33 ++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/htdocs/contrat/services_list.php b/htdocs/contrat/services_list.php index b8ab4cfe1ce..b250ea23378 100644 --- a/htdocs/contrat/services_list.php +++ b/htdocs/contrat/services_list.php @@ -247,22 +247,31 @@ if ($search_name) $sql .= " AND s.nom LIKE '%".$db->escape($search_name)."%' if ($search_contract) $sql .= " AND c.ref LIKE '%".$db->escape($search_contract)."%' "; if ($search_service) $sql .= " AND (p.ref LIKE '%".$db->escape($search_service)."%' OR p.description LIKE '%".$db->escape($search_service)."%' OR cd.description LIKE '%".$db->escape($search_service)."%')"; if ($socid > 0) $sql .= " AND s.rowid = ".$socid; -$filter_dateouvertureprevue = dol_mktime(0, 0, 0, $opouvertureprevuemonth, $opouvertureprevueday, $opouvertureprevueyear); -if ($filter_dateouvertureprevue != '' && $filter_opouvertureprevue == -1) $filter_opouvertureprevue = '='; -$filter_date1 = dol_mktime(0, 0, 0, $op1month, $op1day, $op1year); -if ($filter_date1 != '' && $filter_op1 == -1) $filter_op1 = '='; +$filter_dateouvertureprevue_start=dol_mktime(0, 0, 0, $opouvertureprevuemonth, $opouvertureprevueday, $opouvertureprevueyear); +$filter_dateouvertureprevue_end=dol_mktime(23, 59, 59, $opouvertureprevuemonth, $opouvertureprevueday, $opouvertureprevueyear); +if ($filter_dateouvertureprevue_start != '' && $filter_opouvertureprevue == -1) $filter_opouvertureprevue = ' BETWEEN '; -$filter_date2 = dol_mktime(0, 0, 0, $op2month, $op2day, $op2year); -if ($filter_date2 != '' && $filter_op2 == -1) $filter_op2 = '='; +$filter_date1_start =dol_mktime(0, 0, 0, $op1month, $op1day, $op1year); +$filter_date1_end =dol_mktime(23, 59, 59, $op1month, $op1day, $op1year); +if ($filter_date1_start != '' && $filter_op1 == -1) $filter_op1 = ' BETWEEN '; -$filter_datecloture = dol_mktime(0, 0, 0, $opcloturemonth, $opclotureday, $opclotureyear); -if ($filter_datecloture != '' && $filter_opcloture == -1) $filter_opcloture = '='; +$filter_date2_start=dol_mktime(0, 0, 0, $op2month, $op2day, $op2year); +$filter_date2_end=dol_mktime(23, 59, 59, $op2month, $op2day, $op2year); +if ($filter_date2_start != '' && $filter_op2 == -1) $filter_op2 = ' BETWEEN '; -if (!empty($filter_opouvertureprevue) && $filter_opouvertureprevue != -1 && $filter_dateouvertureprevue != '') $sql .= " AND cd.date_ouverture_prevue ".$filter_opouvertureprevue." '".$db->idate($filter_dateouvertureprevue)."'"; -if (!empty($filter_op1) && $filter_op1 != -1 && $filter_date1 != '') $sql .= " AND cd.date_ouverture ".$filter_op1." '".$db->idate($filter_date1)."'"; -if (!empty($filter_op2) && $filter_op2 != -1 && $filter_date2 != '') $sql .= " AND cd.date_fin_validite ".$filter_op2." '".$db->idate($filter_date2)."'"; -if (!empty($filter_opcloture) && $filter_opcloture != -1 && $filter_datecloture != '') $sql .= " AND cd.date_cloture ".$filter_opcloture." '".$db->idate($filter_datecloture)."'"; +$filter_datecloture_start=dol_mktime(0, 0, 0, $opcloturemonth, $opclotureday, $opclotureyear); +$filter_datecloture_end=dol_mktime(23, 59, 59, $opcloturemonth, $opclotureday, $opclotureyear); +if ($filter_datecloture_start != '' && $filter_opcloture == -1) $filter_opcloture = ' BETWEEN '; + +if (! empty($filter_opouvertureprevue) && $filter_opouvertureprevue != -1 && $filter_opouvertureprevue != ' BETWEEN ' && $filter_dateouvertureprevue_start != '') $sql.= " AND cd.date_ouverture_prevue ".$filter_opouvertureprevue." '".$db->idate($filter_dateouvertureprevue_start)."'"; +if (! empty($filter_opouvertureprevue) && $filter_opouvertureprevue == ' BETWEEN ') $sql.= " AND '".$db->idate($filter_dateouvertureprevue_end)."'"; +if (! empty($filter_op1) && $filter_op1 != -1 && $filter_op1 != ' BETWEEN ' && $filter_date1_start != '') $sql.= " AND cd.date_ouverture ".$filter_op1." '".$db->idate($filter_date1_start)."'"; +if (! empty($filter_op1) && $filter_op1==' BETWEEN ') $sql.= " AND '".$db->idate($filter_date1_end)."'"; +if (! empty($filter_op2) && $filter_op2 != -1 && $filter_op2 != ' BETWEEN ' && $filter_date2_start != '') $sql.= " AND cd.date_fin_validite ".$filter_op2." '".$db->idate($filter_date2_start)."'"; +if (! empty($filter_op2) && $filter_op2==' BETWEEN ') $sql.= " AND '".$db->idate($filter_date2_end)."'"; +if (! empty($filter_opcloture) && $filter_opcloture != ' BETWEEN ' && $filter_opcloture != -1 && $filter_datecloture_start != '') $sql.= " AND cd.date_cloture ".$filter_opcloture." '".$db->idate($filter_datecloture_start)."'"; +if (! empty($filter_opcloture) && $filter_opcloture==' BETWEEN ') $sql.= " AND '".$db->idate($filter_datecloture_end)."'"; // Add where from extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php'; $sql .= $db->order($sortfield, $sortorder); From 49f9e88cc179162ffcc510a82f95011eefd9f126 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 5 May 2020 18:16:30 +0200 Subject: [PATCH 055/158] Look and feel v12 --- htdocs/core/lib/usergroups.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/usergroups.lib.php b/htdocs/core/lib/usergroups.lib.php index 3be6a5b44ba..f25d8058e8f 100644 --- a/htdocs/core/lib/usergroups.lib.php +++ b/htdocs/core/lib/usergroups.lib.php @@ -745,7 +745,7 @@ function showSkins($fuser, $edit = 0, $foruserprofile = false) { print $formother->showColor($conf->global->THEME_ELDY_TEXTTITLELINK, $langs->trans("Default")); } - print '   ('.$langs->trans("Default").': '.$default.') '; + print '   '.$langs->trans("Default").': '.$default.' '; print $form->textwithpicto('', $langs->trans("NotSupportedByAllThemes").', '.$langs->trans("PressF5AfterChangingThis")); print ''; print ''; From e354e714256ab661736b2edd7f1ef6376d640b35 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 5 May 2020 18:19:48 +0200 Subject: [PATCH 056/158] Fix link to themes on dolistore --- htdocs/core/lib/usergroups.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/usergroups.lib.php b/htdocs/core/lib/usergroups.lib.php index f25d8058e8f..9ac9383e516 100644 --- a/htdocs/core/lib/usergroups.lib.php +++ b/htdocs/core/lib/usergroups.lib.php @@ -359,7 +359,7 @@ function showSkins($fuser, $edit = 0, $foruserprofile = false) print $form->textwithpicto($langs->trans("DefaultSkin"), $langs->trans("ThemeDir").' : '.$dirthemestring); print ''; print '
'; } + /* + * Various Payments + */ + + if (!empty($conf->global->ACCOUNTING_REPORTS_INCLUDE_VARPAY) && !empty($conf->banque->enabled) && ($modecompta == 'CREANCES-DETTES' || $modecompta == "RECETTES-DEPENSES")) + { + $subtotal_ht = 0; + $subtotal_ttc = 0; + + print ''; + + // Debit + $sql = "SELECT SUM(p.amount) AS amount FROM ".MAIN_DB_PREFIX."payment_various as p"; + $sql .= ' WHERE 1 = 1'; + if (!empty($date_start) && !empty($date_end)) + $sql .= " AND p.datep >= '".$db->idate($date_start)."' AND p.datep <= '".$db->idate($date_end)."'"; + $sql .= ' GROUP BY p.sens'; + $sql .= ' ORDER BY p.sens'; + + dol_syslog('get various payments', LOG_DEBUG); + $result = $db->query($sql); + if ($result) + { + + // Debit + $obj = $db->fetch_object($result); + if (isset($obj->amount)) + { + $subtotal_ht += -$obj->amount; + $subtotal_ttc += -$obj->amount; + } + print ''; + print "\n"; + if ($modecompta == 'CREANCES-DETTES') print ''; + print '\n"; + print "\n"; + + // Credit + $obj = $db->fetch_object($result); + if (isset($obj->amount)) + { + $subtotal_ht += $obj->amount; + $subtotal_ttc += $obj->amount; + } + print ''; + print "\n"; + if ($modecompta == 'CREANCES-DETTES') print ''; + print '\n"; + print "\n"; + + // Total + $total_ht += $subtotal_ht; + $total_ttc += $subtotal_ttc; + print ''; + if ($modecompta == 'CREANCES-DETTES') + print ''; + print ''; + print ''; + + } + else dol_print_error($db); + } + + /* + * Payement Loan + */ + + if (!empty($conf->global->ACCOUNTING_REPORTS_INCLUDE_LOAN) && !empty($conf->loan->enabled) && ($modecompta == 'CREANCES-DETTES' || $modecompta == "RECETTES-DEPENSES")) + { + $subtotal_ht = 0; + $subtotal_ttc = 0; + + print ''; + + $sql = 'SELECT l.rowid as id, l.label AS label, SUM(p.amount_capital + p.amount_insurance + p.amount_interest) as amount FROM '.MAIN_DB_PREFIX.'payment_loan as p'; + $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'loan AS l ON l.rowid = p.fk_loan'; + $sql .= ' WHERE 1 = 1'; + if (!empty($date_start) && !empty($date_end)) + $sql .= " AND p.datep >= '".$db->idate($date_start)."' AND p.datep <= '".$db->idate($date_end)."'"; + $sql .= ' GROUP BY p.fk_loan'; + $sql .= ' ORDER BY p.fk_loan'; + + dol_syslog('get loan payments', LOG_DEBUG); + $result = $db->query($sql); + if ($result) + { + require_once DOL_DOCUMENT_ROOT.'/loan/class/loan.class.php'; + $loan_static = new Loan($db); + while ($obj = $db->fetch_object($result)) + { + $loan_static->id = $obj->id; + $loan_static->ref = $obj->id; + $loan_static->label = $obj->label; + print ''; + print "\n"; + if ($modecompta == 'CREANCES-DETTES') print ''; + print '\n"; + print "\n"; + $subtotal_ht -= $obj->amount; + $subtotal_ttc -= $obj->amount; + } + + $total_ht += $subtotal_ht; + $total_ttc += $subtotal_ttc; + print ''; + if ($modecompta == 'CREANCES-DETTES') + print ''; + print ''; + print ''; + } + else dol_print_error($db); + } + /* * VAT diff --git a/htdocs/compta/resultat/index.php b/htdocs/compta/resultat/index.php index d462007d273..ed3befce56c 100644 --- a/htdocs/compta/resultat/index.php +++ b/htdocs/compta/resultat/index.php @@ -6,6 +6,7 @@ * Copyright (C) 2014 Juanjo Menent * Copyright (C) 2014 Florian Henry * Copyright (C) 2018 Frédéric France + * Copyright (C) 2020 Maxime DEMAREST * * 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 @@ -794,6 +795,117 @@ elseif ($modecompta == 'BOOKKEEPING') { // Nothing from this table } +/* + * Various Payments + */ + +if (!empty($conf->global->ACCOUNTING_REPORTS_INCLUDE_VARPAY) && !empty($conf->banque->enabled) && ($modecompta == 'CREANCES-DETTES' || $modecompta == "RECETTES-DEPENSES")) +{ + + // decaiss + + $sql = "SELECT date_format(p.datep, '%Y-%m') AS dm, SUM(p.amount) AS amount FROM ".MAIN_DB_PREFIX."payment_various as p"; + $sql .= ' WHERE p.sens = 0'; + if (!empty($date_start) && !empty($date_end)) + $sql .= " AND p.datep >= '".$db->idate($date_start)."' AND p.datep <= '".$db->idate($date_end)."'"; + $sql .= ' GROUP BY dm'; + + dol_syslog("get various payments"); + $result = $db->query($sql); + if ($result) + { + $num = $db->num_rows($result); + $i = 0; + if ($num) + { + while ($i < $num) + { + $obj = $db->fetch_object($result); + if (!isset($decaiss_ttc[$obj->dm])) $decaiss_ttc[$obj->dm] = 0; + if (isset($obj->amount)) $decaiss_ttc[$obj->dm] += $obj->amount; + $i++; + } + } + } + else + { + dol_print_error($db); + } + + // encaiss + + $sql = "SELECT date_format(p.datep, '%Y-%m') AS dm, SUM(p.amount) AS amount FROM ".MAIN_DB_PREFIX."payment_various AS p"; + $sql .= ' WHERE p.sens = 1'; + if (!empty($date_start) && !empty($date_end)) + $sql .= " AND p.datep >= '".$db->idate($date_start)."' AND p.datep <= '".$db->idate($date_end)."'"; + $sql .= ' GROUP BY dm'; + + dol_syslog("get various payments"); + $result = $db->query($sql); + if ($result) + { + $num = $db->num_rows($result); + $i = 0; + if ($num) + { + while ($i < $num) + { + $obj = $db->fetch_object($result); + if (!isset($encaiss_ttc[$obj->dm])) $encaiss_ttc[$obj->dm] = 0; + if (isset($obj->amount)) $encaiss_ttc[$obj->dm] += $obj->amount; + $i++; + } + } + } + else + { + dol_print_error($db); + } + +} +elseif ($modecompta == 'BOOKKEEPING') { + // Useless with BOOKKEEPING +} + +/* + * Payement Loan + */ + +if (!empty($conf->global->ACCOUNTING_REPORTS_INCLUDE_LOAN) && !empty($conf->loan->enabled) && ($modecompta == 'CREANCES-DETTES' || $modecompta == "RECETTES-DEPENSES")) +{ + + $sql = "SELECT date_format(p.datep, '%Y-%m') AS dm, SUM(p.amount_capital + p.amount_insurance + p.amount_interest) AS amount FROM ".MAIN_DB_PREFIX."payment_loan AS p"; + $sql .= ' WHERE 1 = 1'; + if (!empty($date_start) && !empty($date_end)) + $sql .= " AND p.datep >= '".$db->idate($date_start)."' AND p.datep <= '".$db->idate($date_end)."'"; + $sql .= ' GROUP BY dm'; + + dol_syslog("get loan payments"); + $result = $db->query($sql); + if ($result) + { + $num = $db->num_rows($result); + $i = 0; + if ($num) + { + while ($i < $num) + { + $obj = $db->fetch_object($result); + if (!isset($decaiss_ttc[$obj->dm])) $decaiss_ttc[$obj->dm] = 0; + if (isset($obj->amount)) $decaiss_ttc[$obj->dm] += $obj->amount; + $i++; + } + } + } + else + { + dol_print_error($db); + } + +} +elseif ($modecompta == 'BOOKKEEPING') { + // Not use with BOOKKEEPING +} /* diff --git a/htdocs/langs/en_US/compta.lang b/htdocs/langs/en_US/compta.lang index 6cd046c5607..8a8c837ac87 100644 --- a/htdocs/langs/en_US/compta.lang +++ b/htdocs/langs/en_US/compta.lang @@ -262,3 +262,5 @@ RulesPurchaseTurnoverIn=- It includes all the effective payments of invoices don RulesPurchaseTurnoverTotalPurchaseJournal=It includes all debit lines from the purchase journal. ReportPurchaseTurnover=Purchase turnover invoiced ReportPurchaseTurnoverCollected=Purchase turnover collected +IncludeVarpaysInResults = Include various payments in reports +IncludeLoansInResults = Include loans in reports diff --git a/htdocs/langs/fr_FR/compta.lang b/htdocs/langs/fr_FR/compta.lang index c60c79513c5..d4c59754898 100644 --- a/htdocs/langs/fr_FR/compta.lang +++ b/htdocs/langs/fr_FR/compta.lang @@ -262,3 +262,5 @@ RulesPurchaseTurnoverIn=- It includes all the effective payments of invoices don RulesPurchaseTurnoverTotalPurchaseJournal=It includes all debit lines from the purchase journal. ReportPurchaseTurnover=Purchase turnover invoiced ReportPurchaseTurnoverCollected=Purchase turnover collected +IncludeVarpaysInResults = Inclure les payments divers dans les rapports +IncludeLoansInResults = Inclure les emprunts dans les rapports From bf8cd51a5aaf32db3dd66bf73c1021ce08f38f4b Mon Sep 17 00:00:00 2001 From: "DEMAREST Maxime (Indelog)" Date: Wed, 6 May 2020 13:37:24 +0200 Subject: [PATCH 072/158] Fix somes code formating errors --- htdocs/compta/resultat/clientfourn.php | 8 ++------ htdocs/compta/resultat/index.php | 14 ++++++-------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/htdocs/compta/resultat/clientfourn.php b/htdocs/compta/resultat/clientfourn.php index 59b7999e4ef..27bc4526a3e 100644 --- a/htdocs/compta/resultat/clientfourn.php +++ b/htdocs/compta/resultat/clientfourn.php @@ -977,7 +977,6 @@ else $result = $db->query($sql); if ($result) { - // Debit $obj = $db->fetch_object($result); if (isset($obj->amount)) @@ -987,7 +986,7 @@ else } print ''; print "\n"; - if ($modecompta == 'CREANCES-DETTES') print ''; + if ($modecompta == 'CREANCES-DETTES') print ''; print '\n"; print "\n"; @@ -1000,7 +999,7 @@ else } print ''; print "\n"; - if ($modecompta == 'CREANCES-DETTES') print ''; + if ($modecompta == 'CREANCES-DETTES') print ''; print '\n"; print "\n"; @@ -1012,7 +1011,6 @@ else print ''; print ''; print ''; - } else dol_print_error($db); } @@ -1055,7 +1053,6 @@ else $subtotal_ht -= $obj->amount; $subtotal_ttc -= $obj->amount; } - $total_ht += $subtotal_ht; $total_ttc += $subtotal_ttc; print ''; @@ -1067,7 +1064,6 @@ else else dol_print_error($db); } - /* * VAT */ diff --git a/htdocs/compta/resultat/index.php b/htdocs/compta/resultat/index.php index ed3befce56c..10d0f31fe72 100644 --- a/htdocs/compta/resultat/index.php +++ b/htdocs/compta/resultat/index.php @@ -801,7 +801,6 @@ elseif ($modecompta == 'BOOKKEEPING') { if (!empty($conf->global->ACCOUNTING_REPORTS_INCLUDE_VARPAY) && !empty($conf->banque->enabled) && ($modecompta == 'CREANCES-DETTES' || $modecompta == "RECETTES-DEPENSES")) { - // decaiss $sql = "SELECT date_format(p.datep, '%Y-%m') AS dm, SUM(p.amount) AS amount FROM ".MAIN_DB_PREFIX."payment_various as p"; @@ -863,9 +862,9 @@ if (!empty($conf->global->ACCOUNTING_REPORTS_INCLUDE_VARPAY) && !empty($conf->ba } } -elseif ($modecompta == 'BOOKKEEPING') { - // Useless with BOOKKEEPING -} +// Useless with BOOKKEEPING +//elseif ($modecompta == 'BOOKKEEPING') { +//} /* * Payement Loan @@ -873,7 +872,6 @@ elseif ($modecompta == 'BOOKKEEPING') { if (!empty($conf->global->ACCOUNTING_REPORTS_INCLUDE_LOAN) && !empty($conf->loan->enabled) && ($modecompta == 'CREANCES-DETTES' || $modecompta == "RECETTES-DEPENSES")) { - $sql = "SELECT date_format(p.datep, '%Y-%m') AS dm, SUM(p.amount_capital + p.amount_insurance + p.amount_interest) AS amount FROM ".MAIN_DB_PREFIX."payment_loan AS p"; $sql .= ' WHERE 1 = 1'; if (!empty($date_start) && !empty($date_end)) @@ -903,9 +901,9 @@ if (!empty($conf->global->ACCOUNTING_REPORTS_INCLUDE_LOAN) && !empty($conf->loan } } -elseif ($modecompta == 'BOOKKEEPING') { - // Not use with BOOKKEEPING -} +// Useless with BOOKKEEPING +//elseif ($modecompta == 'BOOKKEEPING') { +//} /* From 7bf037ab2ff568e45096d86b5de1d64df7b0239c Mon Sep 17 00:00:00 2001 From: "DEMAREST Maxime (Indelog)" Date: Wed, 6 May 2020 13:46:24 +0200 Subject: [PATCH 073/158] Fix blank line at end of control structure --- htdocs/compta/resultat/index.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/htdocs/compta/resultat/index.php b/htdocs/compta/resultat/index.php index 10d0f31fe72..ad81a3943c1 100644 --- a/htdocs/compta/resultat/index.php +++ b/htdocs/compta/resultat/index.php @@ -860,7 +860,6 @@ if (!empty($conf->global->ACCOUNTING_REPORTS_INCLUDE_VARPAY) && !empty($conf->ba { dol_print_error($db); } - } // Useless with BOOKKEEPING //elseif ($modecompta == 'BOOKKEEPING') { @@ -899,7 +898,6 @@ if (!empty($conf->global->ACCOUNTING_REPORTS_INCLUDE_LOAN) && !empty($conf->loan { dol_print_error($db); } - } // Useless with BOOKKEEPING //elseif ($modecompta == 'BOOKKEEPING') { From 889e5db4fbbf8e081f9ab4f6fe34e581bd6477a2 Mon Sep 17 00:00:00 2001 From: "DEMAREST Maxime (Indelog)" Date: Wed, 6 May 2020 13:55:38 +0200 Subject: [PATCH 074/158] Fix use Form::selectyesno() for added options in admin/compta.php --- htdocs/admin/compta.php | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/htdocs/admin/compta.php b/htdocs/admin/compta.php index b3c66af76ca..3ccc2a213ac 100644 --- a/htdocs/admin/compta.php +++ b/htdocs/admin/compta.php @@ -177,20 +177,14 @@ foreach ($list as $key) print ''."\n"; print ''."\n"; print ''; // Option to include loan in results print ''."\n"; print ''."\n"; print ''; print "
'; - $url = 'https://www.dolistore.com/4-skins'; + $url = 'https://www.dolistore.com/9-skins'; print ''; print $langs->trans('DownloadMoreSkins'); print ''; From 41aaf5363dd3b4807bc52e86a568a94f7d78d825 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 5 May 2020 18:53:41 +0200 Subject: [PATCH 057/158] Fix templates --- .../template/myobject_agenda.php | 70 +++++++++-------- .../modulebuilder/template/myobject_card.php | 72 +++++++++--------- .../template/myobject_document.php | 40 ++++++++++ .../modulebuilder/template/myobject_note.php | 76 +++++++++---------- htdocs/mrp/mo_agenda.php | 2 +- htdocs/mrp/mo_card.php | 5 +- htdocs/mrp/mo_document.php | 2 +- htdocs/mrp/mo_note.php | 2 +- 8 files changed, 153 insertions(+), 116 deletions(-) diff --git a/htdocs/modulebuilder/template/myobject_agenda.php b/htdocs/modulebuilder/template/myobject_agenda.php index 559c5ed47b0..9b71971b6cf 100644 --- a/htdocs/modulebuilder/template/myobject_agenda.php +++ b/htdocs/modulebuilder/template/myobject_agenda.php @@ -148,44 +148,42 @@ if ($object->id > 0) $morehtmlref = '
'; /* - // Ref customer - $morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1); - $morehtmlref.=$form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1); - // Thirdparty - $morehtmlref.='
'.$langs->trans('ThirdParty') . ' : ' . $object->thirdparty->getNomUrl(1); - // Project - if (! empty($conf->projet->enabled)) - { - $langs->load("projects"); - $morehtmlref.='
'.$langs->trans('Project') . ' '; - if ($permissiontoadd) - { - if ($action != 'classify') - //$morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : '; - $morehtmlref.=' : '; - if ($action == 'classify') { - //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1); - $morehtmlref.=''; - $morehtmlref.=''; - $morehtmlref.=''; - $morehtmlref.=$formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1); - $morehtmlref.=''; - $morehtmlref.=''; + // Ref customer + $morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1); + $morehtmlref.=$form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1); + // Thirdparty + $morehtmlref.='
'.$langs->trans('ThirdParty') . ' : ' . (is_object($object->thirdparty) ? $object->thirdparty->getNomUrl(1) : ''); + // Project + if (! empty($conf->projet->enabled)) + { + $langs->load("projects"); + $morehtmlref.='
'.$langs->trans('Project') . ' '; + if ($permissiontoadd) + { + if ($action != 'classify') + //$morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : '; + $morehtmlref.=' : '; + if ($action == 'classify') { + //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1); + $morehtmlref.='
'; + $morehtmlref.=''; + $morehtmlref.=''; + $morehtmlref.=$formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1); + $morehtmlref.=''; + $morehtmlref.='
'; + } else { + $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1); + } } else { - $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1); + if (! empty($object->fk_project)) { + $proj = new Project($db); + $proj->fetch($object->fk_project); + $morehtmlref .= ': '.$proj->getNomUrl(); + } else { + $morehtmlref .= ''; + } } - } else { - if (! empty($object->fk_project)) { - $proj = new Project($db); - $proj->fetch($object->fk_project); - $morehtmlref.=''; - $morehtmlref.=$proj->ref; - $morehtmlref.=''; - } else { - $morehtmlref.=''; - } - } - }*/ + }*/ $morehtmlref .= '
'; diff --git a/htdocs/modulebuilder/template/myobject_card.php b/htdocs/modulebuilder/template/myobject_card.php index c0b33be2bf8..e92c88f1364 100644 --- a/htdocs/modulebuilder/template/myobject_card.php +++ b/htdocs/modulebuilder/template/myobject_card.php @@ -331,42 +331,42 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea $morehtmlref = '
'; /* - // Ref bis - $morehtmlref.=$form->editfieldkey("RefBis", 'ref_client', $object->ref_client, $object, $user->rights->mymodule->myobject->creer, 'string', '', 0, 1); - $morehtmlref.=$form->editfieldval("RefBis", 'ref_client', $object->ref_client, $object, $user->rights->mymodule->myobject->creer, 'string', '', null, null, '', 1); - // Thirdparty - $morehtmlref.='
'.$langs->trans('ThirdParty') . ' : ' . (is_object($object->thirdparty) ? $object->thirdparty->getNomUrl(1) : ''); - // Project - if (! empty($conf->projet->enabled)) - { - $langs->load("projects"); - $morehtmlref.='
'.$langs->trans('Project') . ' '; - if ($permissiontoadd) - { - if ($action != 'classify') - $morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : '; - if ($action == 'classify') { - //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1); - $morehtmlref.='
'; - $morehtmlref.=''; - $morehtmlref.=''; - $morehtmlref.=$formproject->select_projects($object->socid, $object->fk_project, 'projectid', 0, 0, 1, 0, 1, 0, 0, '', 1); - $morehtmlref.=''; - $morehtmlref.='
'; - } else { - $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1); - } - } else { - if (! empty($object->fk_project)) { - $proj = new Project($db); - $proj->fetch($object->fk_project); - $morehtmlref.=$proj->getNomUrl(); - } else { - $morehtmlref.=''; - } - } - } - */ + // Ref customer + $morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1); + $morehtmlref.=$form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1); + // Thirdparty + $morehtmlref.='
'.$langs->trans('ThirdParty') . ' : ' . (is_object($object->thirdparty) ? $object->thirdparty->getNomUrl(1) : ''); + // Project + if (! empty($conf->projet->enabled)) + { + $langs->load("projects"); + $morehtmlref.='
'.$langs->trans('Project') . ' '; + if ($permissiontoadd) + { + if ($action != 'classify') + //$morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : '; + $morehtmlref.=' : '; + if ($action == 'classify') { + //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1); + $morehtmlref.='
'; + $morehtmlref.=''; + $morehtmlref.=''; + $morehtmlref.=$formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1); + $morehtmlref.=''; + $morehtmlref.='
'; + } else { + $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1); + } + } else { + if (! empty($object->fk_project)) { + $proj = new Project($db); + $proj->fetch($object->fk_project); + $morehtmlref .= ': '.$proj->getNomUrl(); + } else { + $morehtmlref .= ''; + } + } + }*/ $morehtmlref .= '
'; diff --git a/htdocs/modulebuilder/template/myobject_document.php b/htdocs/modulebuilder/template/myobject_document.php index 5f3cdf02684..63b114ffc10 100644 --- a/htdocs/modulebuilder/template/myobject_document.php +++ b/htdocs/modulebuilder/template/myobject_document.php @@ -129,6 +129,46 @@ if ($object->id) // ------------------------------------------------------------ $linkback = ''.$langs->trans("BackToList").''; + $morehtmlref = '
'; + /* + // Ref customer + $morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1); + $morehtmlref.=$form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1); + // Thirdparty + $morehtmlref.='
'.$langs->trans('ThirdParty') . ' : ' . (is_object($object->thirdparty) ? $object->thirdparty->getNomUrl(1) : ''); + // Project + if (! empty($conf->projet->enabled)) + { + $langs->load("projects"); + $morehtmlref.='
'.$langs->trans('Project') . ' '; + if ($permissiontoadd) + { + if ($action != 'classify') + //$morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : '; + $morehtmlref.=' : '; + if ($action == 'classify') { + //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1); + $morehtmlref.='
'; + $morehtmlref.=''; + $morehtmlref.=''; + $morehtmlref.=$formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1); + $morehtmlref.=''; + $morehtmlref.='
'; + } else { + $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1); + } + } else { + if (! empty($object->fk_project)) { + $proj = new Project($db); + $proj->fetch($object->fk_project); + $morehtmlref .= ': '.$proj->getNomUrl(); + } else { + $morehtmlref .= ''; + } + } + }*/ + $morehtmlref .= '
'; + dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref); print '
'; diff --git a/htdocs/modulebuilder/template/myobject_note.php b/htdocs/modulebuilder/template/myobject_note.php index f116bf51f5b..aece1f98f29 100644 --- a/htdocs/modulebuilder/template/myobject_note.php +++ b/htdocs/modulebuilder/template/myobject_note.php @@ -103,45 +103,43 @@ if ($id > 0 || !empty($ref)) $morehtmlref = '
'; /* - // Ref customer - $morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1); - $morehtmlref.=$form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1); - // Thirdparty - $morehtmlref.='
'.$langs->trans('ThirdParty') . ' : ' . $object->thirdparty->getNomUrl(1); - // Project - if (! empty($conf->projet->enabled)) - { - $langs->load("projects"); - $morehtmlref.='
'.$langs->trans('Project') . ' '; - if ($permissiontoadd) - { - if ($action != 'classify') - //$morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : '; - $morehtmlref.=' : '; - if ($action == 'classify') { - //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1); - $morehtmlref.='
'; - $morehtmlref.=''; - $morehtmlref.=''; - $morehtmlref.=$formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1); - $morehtmlref.=''; - $morehtmlref.='
'; - } else { - $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1); - } - } else { - if (! empty($object->fk_project)) { - $proj = new Project($db); - $proj->fetch($object->fk_project); - $morehtmlref.=''; - $morehtmlref.=$proj->ref; - $morehtmlref.=''; - } else { - $morehtmlref.=''; - } - } - }*/ - $morehtmlref .= '
'; + // Ref customer + $morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1); + $morehtmlref.=$form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1); + // Thirdparty + $morehtmlref.='
'.$langs->trans('ThirdParty') . ' : ' . (is_object($object->thirdparty) ? $object->thirdparty->getNomUrl(1) : ''); + // Project + if (! empty($conf->projet->enabled)) + { + $langs->load("projects"); + $morehtmlref.='
'.$langs->trans('Project') . ' '; + if ($permissiontoadd) + { + if ($action != 'classify') + //$morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : '; + $morehtmlref.=' : '; + if ($action == 'classify') { + //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1); + $morehtmlref.='
'; + $morehtmlref.=''; + $morehtmlref.=''; + $morehtmlref.=$formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1); + $morehtmlref.=''; + $morehtmlref.='
'; + } else { + $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1); + } + } else { + if (! empty($object->fk_project)) { + $proj = new Project($db); + $proj->fetch($object->fk_project); + $morehtmlref .= ': '.$proj->getNomUrl(); + } else { + $morehtmlref .= ''; + } + } + }*/ + $morehtmlref .= '
'; dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref); diff --git a/htdocs/mrp/mo_agenda.php b/htdocs/mrp/mo_agenda.php index 6da02f8d5bd..eee839c8a83 100644 --- a/htdocs/mrp/mo_agenda.php +++ b/htdocs/mrp/mo_agenda.php @@ -169,7 +169,7 @@ if ($object->id > 0) if (!empty($object->fk_project)) { $proj = new Project($db); $proj->fetch($object->fk_project); - $morehtmlref .= $proj->getNomUrl(); + $morehtmlref .= ': '.$proj->getNomUrl(); } else { $morehtmlref .= ''; } diff --git a/htdocs/mrp/mo_card.php b/htdocs/mrp/mo_card.php index 92f68785856..86b2b886dea 100644 --- a/htdocs/mrp/mo_card.php +++ b/htdocs/mrp/mo_card.php @@ -427,7 +427,8 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea $morehtmlref.=$form->editfieldkey("RefBis", 'ref_client', $object->ref_client, $object, $user->rights->mrp->creer, 'string', '', 0, 1); $morehtmlref.=$form->editfieldval("RefBis", 'ref_client', $object->ref_client, $object, $user->rights->mrp->creer, 'string', '', null, null, '', 1);*/ // Thirdparty - $morehtmlref .= $langs->trans('ThirdParty').' : '.(is_object($object->thirdparty) ? $object->thirdparty->getNomUrl(1) : ''); + $morehtmlref .= $langs->trans('ThirdParty').' '; + $morehtmlref .= ': '.(is_object($object->thirdparty) ? $object->thirdparty->getNomUrl(1) : ''); // Project if (!empty($conf->projet->enabled)) { @@ -452,7 +453,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea if (!empty($object->fk_project)) { $proj = new Project($db); $proj->fetch($object->fk_project); - $morehtmlref .= $proj->getNomUrl(); + $morehtmlref .= ' : '.$proj->getNomUrl(); } else { $morehtmlref .= ''; } diff --git a/htdocs/mrp/mo_document.php b/htdocs/mrp/mo_document.php index a7baa2d9144..48031b6f372 100644 --- a/htdocs/mrp/mo_document.php +++ b/htdocs/mrp/mo_document.php @@ -147,7 +147,7 @@ if ($object->id) if (!empty($object->fk_project)) { $proj = new Project($db); $proj->fetch($object->fk_project); - $morehtmlref .= $proj->getNomUrl(); + $morehtmlref .= ': '.$proj->getNomUrl(); } else { $morehtmlref .= ''; } diff --git a/htdocs/mrp/mo_note.php b/htdocs/mrp/mo_note.php index e22d3e4b610..d8b72fc348c 100644 --- a/htdocs/mrp/mo_note.php +++ b/htdocs/mrp/mo_note.php @@ -122,7 +122,7 @@ if ($id > 0 || !empty($ref)) if (!empty($object->fk_project)) { $proj = new Project($db); $proj->fetch($object->fk_project); - $morehtmlref .= $proj->getNomUrl(); + $morehtmlref .= ' : '.$proj->getNomUrl(); } else { $morehtmlref .= ''; } From d6c8988cec406432a4aa45834bbef5745a5074a4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 5 May 2020 19:29:47 +0200 Subject: [PATCH 058/158] Look and field v12 --- htdocs/contrat/card.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index 21d46fb2974..52144d44d34 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -1644,13 +1644,13 @@ else } if ($user->rights->contrat->creer && ($object->statut >= 0)) { - print ''; + print ''; print img_edit(); print ''; } if ($user->rights->contrat->creer && ($object->statut >= 0)) { - print ''; + print ''; print img_delete(); print ''; } From ebe169b9ef0b97282cf1c2f9c254ae72ca57355a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 5 May 2020 20:51:29 +0200 Subject: [PATCH 059/158] Fix objects used for profit calculation. --- htdocs/projet/element.php | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/htdocs/projet/element.php b/htdocs/projet/element.php index 34dace09e93..23fa6551656 100644 --- a/htdocs/projet/element.php +++ b/htdocs/projet/element.php @@ -526,6 +526,32 @@ $listofreferent = array( */ ); +// Change rules for benefit calculation +if (! empty($conf->global->PROJECT_ELEMENTS_FOR_PLUS_MARGIN)) { + foreach($listofreferent as $key => $element) { + if ($listofreferent[$key]['margin'] == 'add') { + unset($listofreferent[$key]['margin']); + } + } + $newelementforplusmargin = explode(',', $conf->global->PROJECT_ELEMENTS_FOR_PLUS_MARGIN); + foreach($newelementforplusmargin as $value) { + $listofreferent[$value]['margin']='add'; + } +} +if (! empty($conf->global->PROJECT_ELEMENTS_FOR_MINUS_MARGIN)) { + foreach($listofreferent as $key => $element) { + if ($listofreferent[$key]['margin'] == 'add') { + unset($listofreferent[$key]['margin']); + } + } + $newelementforplusmargin = explode(',', $conf->global->PROJECT_ELEMENTS_FOR_MINUS_MARGIN); + foreach($newelementforplusmargin as $value) { + $listofreferent[$value]['margin']='minus'; + } +} + + + $parameters = array('listofreferent'=>$listofreferent); $resHook = $hookmanager->executeHooks('completeListOfReferent', $parameters, $object, $action); From 07178fb6c09458801bad16e4e0618e77e96fc583 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 5 May 2020 20:52:50 +0200 Subject: [PATCH 060/158] Fix look and feel --- htdocs/admin/const.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/admin/const.php b/htdocs/admin/const.php index 9f3accfe549..bc22a2020fb 100644 --- a/htdocs/admin/const.php +++ b/htdocs/admin/const.php @@ -328,10 +328,10 @@ if ($conf->use_javascript_ajax) { print '
'; print '
'; - print ''; + print ''; print '
'; print '
'; - print ''; + print ''; print '
'; } From 650096ea0f4a95b4dd5542f7b2e801e9e94fedcd Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 5 May 2020 21:27:40 +0200 Subject: [PATCH 061/158] Fix look and feel v12 --- htdocs/modulebuilder/index.php | 49 +++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index 5b90f2a8f98..1be2ac09971 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -2122,7 +2122,7 @@ elseif (!empty($module)) print '
'; print ' '.$langs->trans("DescriptorFile").' : '.$pathtofile.''; - print ' '.img_picto($langs->trans("Edit"), 'edit').''; + print ' '.img_picto($langs->trans("Edit"), 'edit').''; print '
'; print ' '.$langs->trans("LanguageFile").' : '; if (!is_array($dicts) || empty($dicts)) print ''.$langs->trans("NoDictionaries").''; @@ -2867,7 +2867,7 @@ elseif (!empty($module)) print '
'; print ' '.$langs->trans("DescriptorFile").' : '.$pathtofile.''; - print ' '.img_picto($langs->trans("Edit"), 'edit').''; + print ' '.img_picto($langs->trans("Edit"), 'edit').''; print '
'; print '
'; @@ -3007,7 +3007,7 @@ elseif (!empty($module)) print '
'; print ' '.$langs->trans("DescriptorFile").' : '.$pathtofile.''; - print ' '.img_picto($langs->trans("Edit"), 'edit').''; + print ' '.img_picto($langs->trans("Edit"), 'edit').''; print '
'; print '
'; @@ -3099,12 +3099,13 @@ elseif (!empty($module)) print ''.$langs->trans("HooksDefDesc").'
'; print '
'; - print ''; + print ''; print ''; } else @@ -3279,7 +3292,7 @@ elseif (!empty($module)) if (dol_is_file($dirins.'/'.$pathtohook)) { print ''.$pathtohook.''; - print ''; + print ''; print ''; } else @@ -3335,7 +3348,7 @@ elseif (!empty($module)) $pathtofile = $widget['relpath']; print ''; print ''; } @@ -3473,7 +3486,7 @@ elseif (!empty($module)) print '
'; print ' '.$langs->trans("DescriptorFile").' : '.$pathtofile.''; - print ' '.img_picto($langs->trans("Edit"), 'edit').''; + print ' '.img_picto($langs->trans("Edit"), 'edit').''; print '
'; print '
'; @@ -3602,7 +3615,7 @@ elseif (!empty($module)) if (preg_match('/\.md$/i', $spec['name'])) $format = 'markdown'; print ''; + print ''; print ''; print ''; } @@ -3657,7 +3670,7 @@ elseif (!empty($module)) // HTML print ' '.$langs->trans("PathToModuleDocumentation", "HTML").' : '; - if (!dol_is_file($outputfiledoc)) print ''.$langs->trans("FileNotYetGenerated").''; + if (!dol_is_file($outputfiledoc)) print ''.$langs->trans("FileNotYetGenerated").''; else { print ''; print ''; @@ -3670,7 +3683,7 @@ elseif (!empty($module)) // PDF print ' '.$langs->trans("PathToModuleDocumentation", "PDF").' : '; - if (!dol_is_file($outputfiledocpdf)) print ''.$langs->trans("FileNotYetGenerated").''; + if (!dol_is_file($outputfiledocpdf)) print ''.$langs->trans("FileNotYetGenerated").''; else { print ''; print ''; @@ -3744,7 +3757,7 @@ elseif (!empty($module)) print '
'; print ' '.$langs->trans("PathToModulePackage").' : '; - if (!dol_is_file($outputfilezip)) print ''.$langs->trans("FileNotYetGenerated").''; + if (!dol_is_file($outputfilezip)) print ''.$langs->trans("FileNotYetGenerated").''; else { $relativepath = $modulelowercase.'/bin/'.$FILENAMEZIP; print '
'.$outputfilezip.''; From eacb1b3b2e399d365bab45e58e3cf184b3d42af7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 5 May 2020 21:45:10 +0200 Subject: [PATCH 062/158] Debug modulebuilder --- htdocs/core/lib/files.lib.php | 11 ++++++++++- htdocs/modulebuilder/index.php | 2 ++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index 941cb03d6c4..dbea182fb9b 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -761,8 +761,17 @@ function dolCopyDir($srcfile, $destfile, $newmask, $overwriteifexists, $arrayrep if (is_dir($ossrcfile."/".$file)) { if (empty($excludesubdir) || ($excludesubdir == 2 && strlen($file) == 2)) { + $newfile = $file; + // Replace destination filename with a new one + if (is_array($arrayreplacement)) + { + foreach ($arrayreplacement as $key => $val) + { + $newfile = str_replace($key, $val, $newfile); + } + } //var_dump("xxx dolCopyDir $srcfile/$file, $destfile/$file, $newmask, $overwriteifexists"); - $tmpresult = dolCopyDir($srcfile."/".$file, $destfile."/".$file, $newmask, $overwriteifexists, $arrayreplacement, $excludesubdir); + $tmpresult = dolCopyDir($srcfile."/".$file, $destfile."/".$newfile, $newmask, $overwriteifexists, $arrayreplacement, $excludesubdir); } } else diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index 1be2ac09971..d813c3b291b 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -180,8 +180,10 @@ if ($dirins && $action == 'initmodule' && $modulename) dol_delete_file($destdir.'/sql/llx_'.strtolower($modulename).'_myobject.sql'); dol_delete_file($destdir.'/sql/llx_'.strtolower($modulename).'_myobject_extrafields.sql'); dol_delete_file($destdir.'/sql/llx_'.strtolower($modulename).'_myobject.key.sql'); + dol_delete_file($destdir.'/sql/llx_'.strtolower($modulename).'_myobject_extrafields.key.sql'); dol_delete_file($destdir.'/img/object_myobject.png'); dol_delete_file($destdir.'/class/myobject.class.php'); + dol_delete_dir($destdir.'/class'); dol_delete_dir($destdir.'/sql'); } From fa305fdaca1b7b32e51c8f80233693a2625eec4e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 5 May 2020 21:49:46 +0200 Subject: [PATCH 063/158] Prepare version 11.0.4 --- ChangeLog | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/ChangeLog b/ChangeLog index 3b81e0555d5..a7d0282fba5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,84 @@ English Dolibarr ChangeLog -------------------------------------------------------------- +***** ChangeLog for 11.0.4 compared to 11.0.3 ***** +FIX: #13749 +FIX: #7594 +FIX: #7594 Expense report multi pagebreak +FIX: Access to undeclared static property: Contact::$table_element +FIX: actions on supplier proposal not saved (bad trigger name) +FIX: Add function "completeTabsHead" to "addreplace" type hook. +FIX: All forms must use newToken() +FIX: Another "Access to undeclared static property: Contact::$table_element" && "Societe::$table_element" +FIX: author search supplier proposal list +FIX: A variable was erased by a temporary variable +FIX: Avoid infinite loop when a fetch is inside a compute field. +FIX: Backto link +FIX: Bad position of total in column +FIX: bad value in currency into discount created from down payment +FIX: buyprice extrafield langfile and tooltip +FIX: Buyprice was updated only if min price for this qty had same qty +FIX: Can switch from double to price type for extrafields +FIX: Can use decimal value in virtual products +FIX: child categories only with good entity rights +FIX: cloning of emailing when no content selected +FIX: closing tags +FIX: Combo list of available users to filter on the list of leaves. +FIX: Compatibility with multicompany, bad numerotation of task. +FIX: consistency of price w/wo vat wrong when price entered with tax +FIX: default value of selectMasssAction broken +FIX: draftordered replenish virtual stock +FIX: Error update SQL into stock reception +FIX: expensereport status in generated pdf +FIX: extra date field incorrect check +FIX: Extrafields of type price must be '' and not '0' if not defined +FIX: Foreign currency lost when splitting a discount +FIX: get remain to pay with rounding decimals +FIX: gzip and bzip2 must use option -f +FIX: IHM, unexpected quote +FIX: keep viewstatut for doli 3.5 +FIX: Link missing into email of some notification +FIX: Look and feel v11 +FIX: md stylesheet to be included by external modules like eldy +FIX: missing array option +FIX: missing default accountancy product buy code +FIX: missing fk_bank during export of suppliers invoices +FIX: missing member entity +FIX: missing selectedlines on supplier order but checkbox are displayed +FIX: Missing token and take into account max date when it can. +FIX: model export list must be sorted by label +FIX: multicurrency manage on hidden conf SUPPLIER_PROPOSAL_UPDATE_PRICE_ON_SUPPlIER_PROPOSAL +FIX: Must escape shell +FIX: Must exclude logs and some dirs for compressed backup +FIX: ordered stock already in $stock +FIX: picture migration script from doli 9.0 +FIX: print pictures on shipment docs +FIX: product get purchase prices +FIX: product purchase prices +FIX: Protection when database has a corrupted product id +FIX: remove unused var, $usercancreate can be change by Multicompany +FIX: replenish stock to buy +FIX: Sanitizing menu parameter +FIX: Send email from bulk action of list of thirdparties +FIX: setup of suggested payment mode on proposals and orders +FIX: Several pb in export of documents +FIX: Situation invoice take into account the credit notes. +FIX: some others modules (like subtotal) use other product_type than 0 or 1 AND must not be considered in this report +FIX: sort by default role makes no sense +FIX: sort on company on member list +FIX: TakePOS buying price +FIX: text version of html emailing (removed the body style) +FIX: The "test smtp connectivity" failed on page to setup mass emailing +FIX: Error logs an Orderline::delete error, but this is an Orderline::insert error +FIX: Translation of tooltips of extrafields +FIX: Use getNomURL instead of hard coded link. Fix limit. +FIX: Use of image into free text for PDF if DOL_DATA_DIR is outside of +FIX: viewstatut to search status +FIX: we must export company mail address on contact vcard only if contact email address is empty +FIX: when we filter a list on a view status, we want this filter to be on bookmark that we create +FIX: Wrong Sql on getListOfTowns api method +FIX: wrong user right's name to top menu "commercial" +FIX: XSS Vulnerability ***** ChangeLog for 11.0.3 compared to 11.0.2 ***** FIX: unit price for selected supplier products not set. NaN was used. From 9f176c5e2d8733114ed712f7d2f8ba8b3b69801a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 6 May 2020 01:41:10 +0200 Subject: [PATCH 064/158] Fix trans --- htdocs/langs/en_US/companies.lang | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/companies.lang b/htdocs/langs/en_US/companies.lang index f8b3d0354e2..0fad58c9389 100644 --- a/htdocs/langs/en_US/companies.lang +++ b/htdocs/langs/en_US/companies.lang @@ -325,7 +325,8 @@ CompanyDeleted=Company "%s" deleted from database. ListOfContacts=List of contacts/addresses ListOfContactsAddresses=List of contacts/addresses ListOfThirdParties=List of Third Parties -ShowContact=Show contact +ShowCompany=Third Party +ShowContact=Contact-Address ContactsAllShort=All (No filter) ContactType=Contact type ContactForOrders=Order's contact From d9cef1c8d79ac971641fc4304355f5cb44d5b5f3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 6 May 2020 01:49:19 +0200 Subject: [PATCH 065/158] Fix packager to publish on new web site --- build/makepack-dolibarr.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/makepack-dolibarr.pl b/build/makepack-dolibarr.pl index c6b8cd330c8..933c5b8f994 100755 --- a/build/makepack-dolibarr.pl +++ b/build/makepack-dolibarr.pl @@ -19,7 +19,7 @@ use Term::ANSIColor; # Change this to defined target for option 98 and 99 $PROJECT="dolibarr"; $PUBLISHSTABLE="eldy,dolibarr\@frs.sourceforge.net:/home/frs/project/dolibarr"; -$PUBLISHBETARC="dolibarr\@vmprod1.dolibarr.org:/home/dolibarr/dolibarr.org/httpdocs/files"; +$PUBLISHBETARC="dolibarr\@vmprod1.dolibarr.org:/home/dolibarr/asso.dolibarr.org/dolibarr_documents/website/www.dolibarr.org/files"; #@LISTETARGET=("TGZ","ZIP","RPM_GENERIC","RPM_FEDORA","RPM_MANDRIVA","RPM_OPENSUSE","DEB","EXEDOLIWAMP","SNAPSHOT"); # Possible packages From 247acdd27446434927a8727506cacdd58985fc8f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 6 May 2020 03:47:28 +0200 Subject: [PATCH 066/158] Fix position of custom groups of modules --- htdocs/admin/company.php | 2 +- htdocs/admin/modules.php | 10 ++++++---- htdocs/core/lib/functions.lib.php | 1 + htdocs/core/modules/DolibarrModules.class.php | 2 +- htdocs/theme/eldy/info-box.inc.php | 5 +++++ htdocs/theme/eldy/progress.inc.php | 2 +- htdocs/theme/md/info-box.inc.php | 4 ++++ 7 files changed, 19 insertions(+), 7 deletions(-) diff --git a/htdocs/admin/company.php b/htdocs/admin/company.php index d4664a13de1..f33a3ea6f93 100644 --- a/htdocs/admin/company.php +++ b/htdocs/admin/company.php @@ -693,7 +693,7 @@ print '
'; // Sales taxes (VAT, IRPF, ...) -print load_fiche_titre($langs->trans("TypeOfSaleTaxes")); +print load_fiche_titre($langs->trans("TypeOfSaleTaxes"), '', 'object_payment'); print '
'; + print ''; $pathtofile = $listofmodules[strtolower($module)]['moduledescriptorrelpath']; + print ''; print ''; - print ''; + print ''; + print ''; } else { print ''.$langs->trans("FileNotYetGenerated").''; - print ''; + print ''; + print ''; } print ''; } @@ -3163,6 +3166,14 @@ elseif (!empty($module)) print '
'; print '
'; print ' '.$langs->trans("DescriptorFile").' : '.$pathtofile.''; print ''; - print ''.img_picto($langs->trans("Edit"), 'edit').''; + print ''.img_picto($langs->trans("Edit"), 'edit').''; print '
'; @@ -3113,13 +3114,15 @@ elseif (!empty($module)) if (dol_is_file($dirins.'/'.$pathtohook)) { print ''.$pathtohook.''; - print ''.img_picto($langs->trans("Edit"), 'edit').''.img_picto($langs->trans("Delete"), 'delete').''.img_picto($langs->trans("Edit"), 'edit').' '; + print ''.img_picto($langs->trans("Delete"), 'delete').'
'; + + $pathtofile = $listofmodules[strtolower($module)]['moduledescriptorrelpath']; + print ''; + if (!empty($triggers)) { foreach ($triggers as $trigger) @@ -3171,7 +3182,7 @@ elseif (!empty($module)) print ''; + print ''; print ''; print ''; } @@ -3180,9 +3191,11 @@ elseif (!empty($module)) { print ''; + print ''; + print ''; print ''; } + print '
'; + print ' '.$langs->trans("DescriptorFile").' : '.$pathtofile.''; + print ''; + print ''.img_picto($langs->trans("Edit"), 'edit').''; + print '
'; print ' '.$langs->trans("TriggersFile").' : '.$pathtofile.''; - print ''.img_picto($langs->trans("Edit"), 'edit').''.img_picto($langs->trans("Edit"), 'edit').''.img_picto($langs->trans("Delete"), 'delete').'
'; print ' '.$langs->trans("NoTrigger"); - print '
'; } else @@ -3227,7 +3240,7 @@ elseif (!empty($module)) if (dol_is_file($dirins.'/'.$pathtohook)) { print ''.$pathtohook.''; - print '
'.img_picto($langs->trans("Edit"), 'edit').''.img_picto($langs->trans("Edit"), 'edit').''.img_picto($langs->trans("Delete"), 'delete').''.img_picto($langs->trans("Edit"), 'edit').''.img_picto($langs->trans("Edit"), 'edit').''.img_picto($langs->trans("Delete"), 'delete').'
'.$langs->trans("WidgetFile").' : '.$pathtofile.''; - print ''.img_picto($langs->trans("Edit"), 'edit').''; + print ''.img_picto($langs->trans("Edit"), 'edit').''; print ''.img_picto($langs->trans("Delete"), 'delete').'
'; print ' '.$langs->trans("SpecificationFile").' : '.$pathtofile.''; - print ''.img_picto($langs->trans("Edit"), 'edit').''.img_picto($langs->trans("Edit"), 'edit').''.img_picto($langs->trans("Delete"), 'delete').'
'; print ''; diff --git a/htdocs/admin/modules.php b/htdocs/admin/modules.php index 926a4c34f70..6a0ff450346 100644 --- a/htdocs/admin/modules.php +++ b/htdocs/admin/modules.php @@ -412,11 +412,13 @@ foreach ($modulesdir as $dir) } $familyposition = $familyinfo[$familykey]['position']; - if ($external) + $listOfOfficialModuleGroups = array('hr', 'technic', 'interface', 'technic', 'portal', 'financial', 'crm', 'base', 'products', 'srm', 'ecm', 'projects', 'other'); + if ($external && ! in_array($familykey, $listOfOfficialModuleGroups)) { - // TODO Find a solution so modules with their own family are always at end - //var_dump($familyposition); - //$familyposition += 100; + // If module is extern and into a custom group (not into an official predefined one), it must appear at end (custom groups should not be before official groups). + if (is_numeric($familyposition)) { + $familyposition = sprintf("%03d", (int) $familyposition + 100); + } } $orders[$i] = $familyposition."_".$familykey."_".$moduleposition."_".$j; // Sort by family, then by module position then number diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 14531947574..f456ec311ac 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -3268,6 +3268,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $ 'payment'=>'bg-infobox-bank_account', 'poll'=>'bg-infobox-adherent', 'project'=>'bg-infobox-project', 'projecttask'=>'bg-infobox-project', 'propal'=>'bg-infobox-propal', 'resource'=>'bg-infobox-action', 'supplier_invoice'=>'bg-infobox-order_supplier', 'supplier_order'=>'bg-infobox-order_supplier', 'supplier_proposal'=>'bg-infobox-supplier_proposal', 'ticket'=>'bg-infobox-contrat', 'title_accountancy'=>'bg-infobox-bank_account', 'title_hrm'=>'bg-infobox-holiday', 'trip'=>'bg-infobox-expensereport', 'title_agenda'=>'bg-infobox-action', + //'title_setup'=>'bg-infobox-action', 'tools'=>'bg-infobox-action', 'list-alt'=>'imgforviewmode', 'calendar'=>'imgforviewmode', 'calendarweek'=>'imgforviewmode', 'calendarmonth'=>'imgforviewmode', 'calendarday'=>'imgforviewmode', 'calendarperuser'=>'imgforviewmode' ); if (!empty($arrayconvpictotomorcess[$pictowithouttext])) { diff --git a/htdocs/core/modules/DolibarrModules.class.php b/htdocs/core/modules/DolibarrModules.class.php index cd3fe7922ee..c592cb69959 100644 --- a/htdocs/core/modules/DolibarrModules.class.php +++ b/htdocs/core/modules/DolibarrModules.class.php @@ -2279,7 +2279,7 @@ class DolibarrModules // Can not be abstract, because we need to instantiate it $const_name = 'MAIN_MODULE_'.strtoupper(preg_replace('/^mod/i', '', get_class($this))); print ' -
+
'; diff --git a/htdocs/theme/eldy/info-box.inc.php b/htdocs/theme/eldy/info-box.inc.php index 028039f6c8b..7f62fe39689 100644 --- a/htdocs/theme/eldy/info-box.inc.php +++ b/htdocs/theme/eldy/info-box.inc.php @@ -6,6 +6,11 @@ if (!defined('ISLOADEDBYSTEELSHEET')) die('Must be call by steelsheet'); ?> * Component: Info Box * ------------------- */ + +.info-box-module-external span.info-box-icon-version { + background: #999; +} + .info-box { display: block; position: relative; diff --git a/htdocs/theme/eldy/progress.inc.php b/htdocs/theme/eldy/progress.inc.php index b0bd96df1d2..71f25ff35ba 100644 --- a/htdocs/theme/eldy/progress.inc.php +++ b/htdocs/theme/eldy/progress.inc.php @@ -123,7 +123,7 @@ if (!defined('ISLOADEDBYSTEELSHEET')) die('Must be call by steelsheet'); ?> width: 3px; } .progress-group .progress-text { - font-weight: 600; + /* font-weight: 600; */ } .progress-group .progress-number { float: right; diff --git a/htdocs/theme/md/info-box.inc.php b/htdocs/theme/md/info-box.inc.php index d9b467f130b..d866cab96a6 100644 --- a/htdocs/theme/md/info-box.inc.php +++ b/htdocs/theme/md/info-box.inc.php @@ -7,6 +7,10 @@ if (!defined('ISLOADEDBYSTEELSHEET')) die('Must be call by steelsheet'); ?> * ------------------- */ +.info-box-module-external span.info-box-icon-version { + background: #999; +} + span.info-box-icon-text { /* hide box text number due to problems */ display: none; } From 30fede216c7cb7b95e5db3d26cf338b88ad62b61 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 6 May 2020 04:03:07 +0200 Subject: [PATCH 067/158] Fix Add '_pw' var as var sensibles. --- htdocs/api/class/api_setup.class.php | 2 +- htdocs/core/class/commondocgenerator.class.php | 2 +- htdocs/core/lib/functions.lib.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/api/class/api_setup.class.php b/htdocs/api/class/api_setup.class.php index ec7a6b89596..fd6432b553f 100644 --- a/htdocs/api/class/api_setup.class.php +++ b/htdocs/api/class/api_setup.class.php @@ -1429,7 +1429,7 @@ class Setup extends DolibarrApi if (!preg_match('/^[a-zA-Z0-9_]+$/', $constantname) || !isset($conf->global->$constantname)) { throw new RestException(500, 'Error Bad or unknown value for constantname'); } - if (preg_match('/(_pass|password|secret|_key|key$)/i', $constantname)) { + if (preg_match('/(_pass|_pw|password|secret|_key|key$)/i', $constantname)) { throw new RestException(403, 'Forbidden'); } diff --git a/htdocs/core/class/commondocgenerator.class.php b/htdocs/core/class/commondocgenerator.class.php index 1f5ef0a5a9e..df80aab7a1f 100644 --- a/htdocs/core/class/commondocgenerator.class.php +++ b/htdocs/core/class/commondocgenerator.class.php @@ -325,7 +325,7 @@ abstract class CommonDocGenerator foreach ($conf->global as $key => $val) { - if (preg_match('/(_pass|password|secret|_key|key$)/i', $key)) $newval = '*****forbidden*****'; + if (preg_match('/(_pass|_pw|password|secret|_key|key$)/i', $key)) $newval = '*****forbidden*****'; else $newval = $val; $array_other['__['.$key.']__'] = $newval; } diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index f456ec311ac..28a44562b28 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -6523,7 +6523,7 @@ function make_substitutions($text, $substitutionarray, $outputlangs = null) if (dol_textishtml($text, 1)) $msgishtml = 1; $keyfound = $reg[1]; - if (preg_match('/(_pass|password|secret|_key|key$)/i', $keyfound)) $newval = '*****forbidden*****'; + if (preg_match('/(_pass|_pw|password|secret|_key|key$)/i', $keyfound)) $newval = '*****forbidden*****'; else $newval = empty($conf->global->$keyfound) ? '' : $conf->global->$keyfound; $text = preg_replace('/__\['.preg_quote($keyfound, '/').'\]__/', $msgishtml ?dol_htmlentitiesbr($newval) : $newval, $text); } From b09f179a16759ee8213c51ebf0726f57decf3a3c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 6 May 2020 04:32:48 +0200 Subject: [PATCH 068/158] NEW Website logs are now into a separated log file. --- htdocs/core/lib/functions.lib.php | 7 +++++++ htdocs/core/lib/website2.lib.php | 5 ++++- htdocs/core/website.inc.php | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 28a44562b28..1a4ab00b7d6 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -1078,6 +1078,13 @@ function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename = // If syslog module enabled if (empty($conf->syslog->enabled)) return; + // Check if we are into execution of code of a website + if (defined('USEEXTERNALSERVER') && ! defined('USEDOLIBARRSERVER') && ! defined('USEDOLIBARREDITOR')) { + global $website, $websitekey; + if (is_object($website) && ! empty($website->ref)) $suffixinfilename.='_website_'.$website->ref; + elseif (! empty($websitekey)) $suffixinfilename.='_website_'.$websitekey; + } + if ($ident < 0) { foreach ($conf->loghandlers as $loghandlerinstance) diff --git a/htdocs/core/lib/website2.lib.php b/htdocs/core/lib/website2.lib.php index 6ef17220283..fc56a489d75 100644 --- a/htdocs/core/lib/website2.lib.php +++ b/htdocs/core/lib/website2.lib.php @@ -39,7 +39,10 @@ function dolSaveMasterFile($filemaster) $mastercontent = ''."\n"; $result = file_put_contents($filemaster, $mastercontent); if (!empty($conf->global->MAIN_UMASK)) diff --git a/htdocs/core/website.inc.php b/htdocs/core/website.inc.php index b90da632fac..3e54f6ec2ad 100644 --- a/htdocs/core/website.inc.php +++ b/htdocs/core/website.inc.php @@ -19,7 +19,7 @@ /** * \file htdocs/core/website.inc.php * \brief Common file loaded by all website pages (after master.inc.php). It set the new object $weblangs, using parameter 'l'. - * This file is included in top of all container pages. + * This file is included in top of all container pages and is run only when a web page is called. * The global variable $websitekey must be defined. */ From a8222c2651591a657767b8bf95cc04fa37752866 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 6 May 2020 05:10:42 +0200 Subject: [PATCH 069/158] Look and feel v12 --- htdocs/admin/menus/index.php | 4 ++-- htdocs/admin/tools/purge.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/admin/menus/index.php b/htdocs/admin/menus/index.php index 56251e48f7b..97f0246ac88 100644 --- a/htdocs/admin/menus/index.php +++ b/htdocs/admin/menus/index.php @@ -277,8 +277,8 @@ print '
'; print ''; print ''; -print ''; +print ''; print ''; print ''; diff --git a/htdocs/admin/tools/purge.php b/htdocs/admin/tools/purge.php index 43cf81b41ba..9898e290ddc 100644 --- a/htdocs/admin/tools/purge.php +++ b/htdocs/admin/tools/purge.php @@ -78,7 +78,7 @@ $form = new Form($db); print load_fiche_titre($langs->trans("Purge"), '', 'title_setup'); -print $langs->trans("PurgeAreaDesc", $dolibarr_main_data_root).'
'; +print ''.$langs->trans("PurgeAreaDesc", $dolibarr_main_data_root).'
'; print '
'; From b6aa766c72078988a0e74d8b5305b96eb9d6d509 Mon Sep 17 00:00:00 2001 From: atm-quentin Date: Wed, 6 May 2020 09:37:17 +0200 Subject: [PATCH 070/158] FIX stickler --- htdocs/compta/facture/stats/index.php | 14 +++++++------- htdocs/core/class/dolgraph.class.php | 10 +++++----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/htdocs/compta/facture/stats/index.php b/htdocs/compta/facture/stats/index.php index 4c0d23c90e2..8606e619740 100644 --- a/htdocs/compta/facture/stats/index.php +++ b/htdocs/compta/facture/stats/index.php @@ -262,13 +262,13 @@ if ($mode == 'customer') $filter = 's.client in (1,2,3)'; if ($mode == 'supplier') $filter = 's.fournisseur = 1'; print $form->selectarray('socid', $companies, $socid, 1, 0, 0, 'style="width: 95%"', 0, 0, 0, '', '', 1); print '
'; -if(!empty($conf->category->enabled) && $mode == 'customer') { - // Customer Category - print ''; - } +if(! empty($conf->category->enabled) && $mode == 'customer') { + // Customer Category + print ''; +} // ThirdParty Type print ''; } +// Option to include various payment in results +print ''."\n"; +print ''."\n"; +print ''; + +// Option to include loan in results +print ''."\n"; +print ''."\n"; +print ''; + print "
'.$langs->trans("TreeMenuPersonalized").'
'.$langs->trans("CustomersProspectsCategoriesShort").''; - $cate_arbo = $form->select_all_categories(Categorie::TYPE_CUSTOMER, null, 'parent', null, null, 1); - print $form->multiselectarray('custcats', $cate_arbo, GETPOST('custcats', 'array'), null, null, null, null, "90%"); - print '
'.$langs->trans("CustomersProspectsCategoriesShort").''; + $cate_arbo = $form->select_all_categories(Categorie::TYPE_CUSTOMER, null, 'parent', null, null, 1); + print $form->multiselectarray('custcats', $cate_arbo, GETPOST('custcats', 'array'), null, null, null, null, "90%"); + print '
'.$langs->trans("ThirdPartyType").''; $sortparam_typent = (empty($conf->global->SOCIETE_SORT_ON_TYPEENT) ? 'ASC' : $conf->global->SOCIETE_SORT_ON_TYPEENT); // NONE means we keep sort of original array, so we sort on position. ASC, means next function will sort on label. diff --git a/htdocs/core/class/dolgraph.class.php b/htdocs/core/class/dolgraph.class.php index 3f1bfa245fb..551fe2b82c0 100644 --- a/htdocs/core/class/dolgraph.class.php +++ b/htdocs/core/class/dolgraph.class.php @@ -895,11 +895,11 @@ class DolGraph $color = sprintf("%02x%02x%02x", $this->datacolor[$i][0], $this->datacolor[$i][1], $this->datacolor[$i][2]); $this->stringtoshow .= '{ '; if (! isset($this->type[$i]) || $this->type[$i] == 'bars') { - if($nblot == 3) { - if($i == $firstlot) $align = 'right'; - else if($i == $firstlot+1) $align = 'center'; - else $align = 'left'; - $this->stringtoshow.='bars: { lineWidth: 1, show: true, align: "'.$align.'", barWidth: 0.45 }, '; + if($nblot == 3) { + if($i == $firstlot) $align = 'right'; + elseif($i == $firstlot + 1) $align = 'center'; + else $align = 'left'; + $this->stringtoshow .= 'bars: { lineWidth: 1, show: true, align: "'.$align.'", barWidth: 0.45 }, '; } else $this->stringtoshow.='bars: { lineWidth: 1, show: true, align: "'.($i==$firstlot?'center':'left').'", barWidth: 0.5 }, '; } From 128ec6fd78fa91569f80636a83f90dd8171ad1a1 Mon Sep 17 00:00:00 2001 From: "DEMAREST Maxime (Indelog)" Date: Wed, 6 May 2020 08:38:36 +0200 Subject: [PATCH 071/158] Add include various payments and loans in accounting report For simplified accouning, behaviour not enable by default and must be enabed in simplified accounting module admin page (or by global settings ACCOUNTING_REPORTS_INCLUDE_VARPAY and ACCOUNTING_REPORTS_INCLUDE_LOAN). --- htdocs/admin/compta.php | 35 ++++++++ htdocs/compta/resultat/clientfourn.php | 116 ++++++++++++++++++++++++- htdocs/compta/resultat/index.php | 112 ++++++++++++++++++++++++ htdocs/langs/en_US/compta.lang | 2 + htdocs/langs/fr_FR/compta.lang | 2 + 5 files changed, 266 insertions(+), 1 deletion(-) diff --git a/htdocs/admin/compta.php b/htdocs/admin/compta.php index cdfa15d9069..b3c66af76ca 100644 --- a/htdocs/admin/compta.php +++ b/htdocs/admin/compta.php @@ -5,6 +5,7 @@ * Copyright (C) 2011-2013 Juanjo Menent * Copyright (C) 2013-2017 Philippe Grand * Copyright (C) 2014 Marcos García + * Copyright (C) 2020 Maxime DEMAREST * * 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 @@ -83,6 +84,20 @@ if ($action == 'update') } } + $report_include_varpay = GETPOST('ACCOUNTING_REPORTS_INCLUDE_VARPAY', 'alpha'); + if (!empty($report_include_varpay)) + if ($report_include_varpay == 'yes') + if (!dolibarr_set_const($db, 'ACCOUNTING_REPORTS_INCLUDE_VARPAY', 1, 'chaine', 0, '', $conf->entity)) $error++; + if ($report_include_varpay == 'no') + if (!dolibarr_del_const($db, 'ACCOUNTING_REPORTS_INCLUDE_VARPAY', $conf->entity)) $error++; + + $report_include_loan = GETPOST('ACCOUNTING_REPORTS_INCLUDE_LOAN', 'alpha'); + if (!empty($report_include_loan)) + if ($report_include_loan == 'yes') + if (!dolibarr_set_const($db, 'ACCOUNTING_REPORTS_INCLUDE_LOAN', 1, 'chaine', 0, '', $conf->entity)) $error++; + if ($report_include_loan == 'no') + if (!dolibarr_del_const($db, 'ACCOUNTING_REPORTS_INCLUDE_LOAN', $conf->entity)) $error++; + if (!$error) { setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); @@ -158,6 +173,26 @@ foreach ($list as $key) print '
'."\n"; +print ''."\n"; +print '
'."\n"; +print ''."\n"; +print '
\n"; print '

'; diff --git a/htdocs/compta/resultat/clientfourn.php b/htdocs/compta/resultat/clientfourn.php index 44be66a2218..59b7999e4ef 100644 --- a/htdocs/compta/resultat/clientfourn.php +++ b/htdocs/compta/resultat/clientfourn.php @@ -8,6 +8,7 @@ * Copyright (C) 2014 Juanjo Menent * Copyright (C) 2014 Florian Henry * Copyright (C) 2018 Frédéric France + * Copyright (C) 2020 Maxime DEMAREST * * 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 @@ -38,7 +39,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountancycategory.class.php'; // Load translation files required by the page -$langs->loadLangs(array('compta', 'bills', 'donation', 'salaries', 'accountancy')); +$langs->loadLangs(array('compta', 'bills', 'donation', 'salaries', 'accountancy', 'loan')); $date_startmonth = GETPOST('date_startmonth', 'int'); $date_startday = GETPOST('date_startday', 'int'); @@ -953,6 +954,119 @@ else print '
'.$langs->trans("VariousPayment").'
 ".$langs->trans("Debit")."'.price(-$obj->amount).''.price(-$obj->amount)."
 ".$langs->trans("Credit")."'.price($obj->amount).''.price($obj->amount)."
'.price($subtotal_ht).''.price($subtotal_ttc).'
'.$langs->trans("PaymentLoan").'
 ".$loan_static->getNomUrl(1).' - '.$obj->label."'.price(-$obj->amount).''.price(-$obj->amount)."
'.price($subtotal_ht).''.price($subtotal_ttc).'
 ".$langs->trans("Debit")."'.price(-$obj->amount).''.price(-$obj->amount).''.price(-$obj->amount)."
 ".$langs->trans("Credit")."'.price($obj->amount).''.price($obj->amount).''.price($obj->amount)."
'.price($subtotal_ht).''.price($subtotal_ttc).'
'."\n"; -print ''."\n"; +print $form->selectyesno('ACCOUNTING_REPORTS_INCLUDE_VARPAY', (!empty($conf->global->ACCOUNTING_REPORTS_INCLUDE_VARPAY))); print '
'."\n"; -print ''."\n"; +print $form->selectyesno('ACCOUNTING_REPORTS_INCLUDE_LOAN', (!empty($conf->global->ACCOUNTING_REPORTS_INCLUDE_LOAN))); print '
\n"; From 3dbe9a4af1d18cdf3a9c8404b25d1209d94d07d9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 6 May 2020 13:59:15 +0200 Subject: [PATCH 075/158] Fix label --- htdocs/product/admin/stock_extrafields.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/admin/stock_extrafields.php b/htdocs/product/admin/stock_extrafields.php index 0e8f7289b77..22ad53cd0e8 100644 --- a/htdocs/product/admin/stock_extrafields.php +++ b/htdocs/product/admin/stock_extrafields.php @@ -68,7 +68,7 @@ print load_fiche_titre($langs->trans("StockSetup"), $linkback, 'title_setup'); $head = stock_admin_prepare_head(); -dol_fiche_head($head, 'attributes', $langs->trans("Warehouses"), -1, 'stock'); +dol_fiche_head($head, 'attributes', $langs->trans("StockSetup"), -1, 'stock'); require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; From bfd4ebd49d40942d8cf8bfa2a2cbd2ff6f5f125e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 6 May 2020 14:28:24 +0200 Subject: [PATCH 076/158] FIX Changing password message not visible if a background is set --- htdocs/user/passwordforgotten.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/user/passwordforgotten.php b/htdocs/user/passwordforgotten.php index 461ab8e7b4a..0afa158ec58 100644 --- a/htdocs/user/passwordforgotten.php +++ b/htdocs/user/passwordforgotten.php @@ -133,7 +133,7 @@ if ($action == 'buildnewpassword' && $username) // Success if ($edituser->send_password($edituser, $newpassword, 1) > 0) { - $message = '
'.$langs->trans("PasswordChangeRequestSent", $edituser->login, dolObfuscateEmail($edituser->email)).'
'; + $message = ''; $username = ''; } else From e7ae9c752ea54a59d0ae9406d1043d4d0afb6cf5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 6 May 2020 14:48:02 +0200 Subject: [PATCH 077/158] Fix missing trackid --- htdocs/user/class/user.class.php | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 23d42ba3e65..09f78a7d044 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -1972,12 +1972,12 @@ class User extends CommonObject /** * Send new password by email * - * @param User $user Object user that send email + * @param User $fuser Object user that send email * @param string $password New password * @param int $changelater 0=Send clear passwod into email, 1=Change password only after clicking on confirm email. @todo Add method 2 = Send link to reset password * @return int < 0 si erreur, > 0 si ok */ - public function send_password($user, $password = '', $changelater = 0) + public function send_password($fuser, $password = '', $changelater = 0) { // phpcs:enable global $conf, $langs; @@ -1997,8 +1997,8 @@ class User extends CommonObject { // If user has defined its own language (rare because in most cases, auto is used) $outputlangs->getDefaultLang($this->conf->MAIN_LANG_DEFAULT); } - if ($user->conf->MAIN_LANG_DEFAULT) { - $outputlangs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT); + if ($fuser->conf->MAIN_LANG_DEFAULT) { + $outputlangs->setDefaultLang($fuser->conf->MAIN_LANG_DEFAULT); } else { // If user has not defined its own language, we used current language @@ -2028,7 +2028,7 @@ class User extends CommonObject $mesg .= $outputlangs->transnoentitiesnoconv("ClickHereToGoTo", $appli).': '.$url."\n\n"; $mesg .= "--\n"; - $mesg .= $user->getFullName($outputlangs); // Username that make then sending + $mesg .= $fuser->getFullName($outputlangs); // Username that make then sending dol_syslog(get_class($this)."::send_password changelater is off, url=".$url); } @@ -2048,6 +2048,8 @@ class User extends CommonObject dol_syslog(get_class($this)."::send_password changelater is on, url=".$url); } + $trackid = 'use'.$fuser->id; + $mailfile = new CMailFile( $subject, $this->email, @@ -2059,7 +2061,10 @@ class User extends CommonObject '', '', 0, - $msgishtml + $msgishtml, + '', + '', + $trackid ); if ($mailfile->sendfile()) From abdb0cc8c025359c8eb05cc705cd36820bbd46e0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 6 May 2020 15:03:57 +0200 Subject: [PATCH 078/158] Fix use correct trackid --- htdocs/user/class/user.class.php | 13 +++++++------ htdocs/user/passwordforgotten.php | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 09f78a7d044..e20c1ca527b 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -1972,12 +1972,12 @@ class User extends CommonObject /** * Send new password by email * - * @param User $fuser Object user that send email + * @param User $user Object user that send the email (not the user we send too) * @param string $password New password * @param int $changelater 0=Send clear passwod into email, 1=Change password only after clicking on confirm email. @todo Add method 2 = Send link to reset password * @return int < 0 si erreur, > 0 si ok */ - public function send_password($fuser, $password = '', $changelater = 0) + public function send_password($user, $password = '', $changelater = 0) { // phpcs:enable global $conf, $langs; @@ -1997,8 +1997,9 @@ class User extends CommonObject { // If user has defined its own language (rare because in most cases, auto is used) $outputlangs->getDefaultLang($this->conf->MAIN_LANG_DEFAULT); } - if ($fuser->conf->MAIN_LANG_DEFAULT) { - $outputlangs->setDefaultLang($fuser->conf->MAIN_LANG_DEFAULT); + + if ($this->conf->MAIN_LANG_DEFAULT) { + $outputlangs->setDefaultLang($this->conf->MAIN_LANG_DEFAULT); } else { // If user has not defined its own language, we used current language @@ -2028,7 +2029,7 @@ class User extends CommonObject $mesg .= $outputlangs->transnoentitiesnoconv("ClickHereToGoTo", $appli).': '.$url."\n\n"; $mesg .= "--\n"; - $mesg .= $fuser->getFullName($outputlangs); // Username that make then sending + $mesg .= $user->getFullName($outputlangs); // Username that send email dol_syslog(get_class($this)."::send_password changelater is off, url=".$url); } @@ -2048,7 +2049,7 @@ class User extends CommonObject dol_syslog(get_class($this)."::send_password changelater is on, url=".$url); } - $trackid = 'use'.$fuser->id; + $trackid = 'use'.$this->id; $mailfile = new CMailFile( $subject, diff --git a/htdocs/user/passwordforgotten.php b/htdocs/user/passwordforgotten.php index 0afa158ec58..81e6779b80b 100644 --- a/htdocs/user/passwordforgotten.php +++ b/htdocs/user/passwordforgotten.php @@ -131,7 +131,7 @@ if ($action == 'buildnewpassword' && $username) else { // Success - if ($edituser->send_password($edituser, $newpassword, 1) > 0) + if ($edituser->send_password($user, $newpassword, 1) > 0) { $message = ''; $username = ''; From 1ec8b31e46e7ef1d1036f08b4814170ed501618c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 6 May 2020 15:15:12 +0200 Subject: [PATCH 079/158] Fix remove action param in url to allow a second try without the error message --- htdocs/core/tpl/passwordforgotten.tpl.php | 1 + htdocs/user/class/user.class.php | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/core/tpl/passwordforgotten.tpl.php b/htdocs/core/tpl/passwordforgotten.tpl.php index ab12b48aa08..63ff6a8a0a7 100644 --- a/htdocs/core/tpl/passwordforgotten.tpl.php +++ b/htdocs/core/tpl/passwordforgotten.tpl.php @@ -40,6 +40,7 @@ if (!empty($conf->dol_use_jmobile)) $conf->use_javascript_ajax = 1; $php_self = $_SERVER['PHP_SELF']; $php_self .= dol_escape_htmltag($_SERVER["QUERY_STRING"]) ? '?'.dol_escape_htmltag($_SERVER["QUERY_STRING"]) : ''; +$php_self = str_replace('action=validatenewpassword', '', $php_self); $titleofpage = $langs->trans('SendNewPassword'); diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index e20c1ca527b..11d0cec3654 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -1838,7 +1838,7 @@ class User extends CommonObject /** * Change password of a user * - * @param User $user Object user of user making change + * @param User $user Object user of user requesting the change (not the user for who we change the password). May be unknown. * @param string $password New password in clear text (to generate if not provided) * @param int $changelater 1=Change password only after clicking on confirm email * @param int $notrigger 1=Does not launch triggers @@ -2029,7 +2029,7 @@ class User extends CommonObject $mesg .= $outputlangs->transnoentitiesnoconv("ClickHereToGoTo", $appli).': '.$url."\n\n"; $mesg .= "--\n"; - $mesg .= $user->getFullName($outputlangs); // Username that send email + $mesg .= $user->getFullName($outputlangs); // Username that send the email (not the user for who we want to reset password) dol_syslog(get_class($this)."::send_password changelater is off, url=".$url); } From 485896614b4e1cb831b8fcbd84e6e1ce56737bb0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 6 May 2020 15:30:00 +0200 Subject: [PATCH 080/158] Add message during password reset --- htdocs/langs/en_US/users.lang | 1 + htdocs/user/passwordforgotten.php | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/users.lang b/htdocs/langs/en_US/users.lang index aea4e7676e4..9b75a2ff37e 100644 --- a/htdocs/langs/en_US/users.lang +++ b/htdocs/langs/en_US/users.lang @@ -78,6 +78,7 @@ UserWillBeExternalUser=Created user will be an external user (because linked to IdPhoneCaller=Id phone caller NewUserCreated=User %s created NewUserPassword=Password change for %s +NewPasswordValidated=Your new password have been validated and must be used now to login. EventUserModified=User %s modified UserDisabled=User %s disabled UserEnabled=User %s activated diff --git a/htdocs/user/passwordforgotten.php b/htdocs/user/passwordforgotten.php index 81e6779b80b..f8c035779d2 100644 --- a/htdocs/user/passwordforgotten.php +++ b/htdocs/user/passwordforgotten.php @@ -77,7 +77,8 @@ if ($action == 'validatenewpassword' && $username && $passwordhash) { if (dol_verifyHash($edituser->pass_temp, $passwordhash)) { - $newpassword = $edituser->setPassword($user, $edituser->pass_temp, 0); + setEventMessages('NewPasswordValidated', null, 'mesgs'); + $newpassword = $edituser->setPassword($user, $edituser->pass_temp, 0); dol_syslog("passwordforgotten.php new password for user->id=".$edituser->id." validated in database"); header("Location: ".DOL_URL_ROOT.'/'); exit; From 5e6b7fb6b4cb598e5ff1980d2a20b43cf7f01c3c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 6 May 2020 15:36:14 +0200 Subject: [PATCH 081/158] Show message after pass reset --- htdocs/user/passwordforgotten.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/htdocs/user/passwordforgotten.php b/htdocs/user/passwordforgotten.php index f8c035779d2..7f8ad45a06d 100644 --- a/htdocs/user/passwordforgotten.php +++ b/htdocs/user/passwordforgotten.php @@ -77,7 +77,10 @@ if ($action == 'validatenewpassword' && $username && $passwordhash) { if (dol_verifyHash($edituser->pass_temp, $passwordhash)) { - setEventMessages('NewPasswordValidated', null, 'mesgs'); + // Clear session + $_SESSION['dol_login'] = ''; + $_SESSION['dol_loginmesg'] = $langs->trans('NewPasswordValidated'); // Save message for the session page + $newpassword = $edituser->setPassword($user, $edituser->pass_temp, 0); dol_syslog("passwordforgotten.php new password for user->id=".$edituser->id." validated in database"); header("Location: ".DOL_URL_ROOT.'/'); From 4c04ace9d8305da6e4bdca000ae8d333f2ba5217 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 6 May 2020 15:39:07 +0200 Subject: [PATCH 082/158] fix reset of session --- htdocs/user/passwordforgotten.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/user/passwordforgotten.php b/htdocs/user/passwordforgotten.php index 7f8ad45a06d..b0f3a5aab6c 100644 --- a/htdocs/user/passwordforgotten.php +++ b/htdocs/user/passwordforgotten.php @@ -78,7 +78,7 @@ if ($action == 'validatenewpassword' && $username && $passwordhash) if (dol_verifyHash($edituser->pass_temp, $passwordhash)) { // Clear session - $_SESSION['dol_login'] = ''; + unset($_SESSION['dol_login']); $_SESSION['dol_loginmesg'] = $langs->trans('NewPasswordValidated'); // Save message for the session page $newpassword = $edituser->setPassword($user, $edituser->pass_temp, 0); From b3a064d309e2533c911bbf45f246f98309a1e2b8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 6 May 2020 16:02:34 +0200 Subject: [PATCH 083/158] Fix dup --- ChangeLog | 1 - 1 file changed, 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index a7d0282fba5..bcbfb1a959c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,7 +4,6 @@ English Dolibarr ChangeLog ***** ChangeLog for 11.0.4 compared to 11.0.3 ***** FIX: #13749 -FIX: #7594 FIX: #7594 Expense report multi pagebreak FIX: Access to undeclared static property: Contact::$table_element FIX: actions on supplier proposal not saved (bad trigger name) From 326dc7d36743779fde215dc23a63ea03796dcf1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Wed, 6 May 2020 17:59:40 +0200 Subject: [PATCH 084/158] fix html file:///home/fred/Images/S%C3%A9lection_078.png --- htdocs/bookmarks/bookmarks.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/bookmarks/bookmarks.lib.php b/htdocs/bookmarks/bookmarks.lib.php index 46e9ca315a5..93283cab815 100644 --- a/htdocs/bookmarks/bookmarks.lib.php +++ b/htdocs/bookmarks/bookmarks.lib.php @@ -60,7 +60,7 @@ function printDropdownBookmarksList() } $searchForm = ''."\n"; - $searchForm .= '
global->MAIN_OPTIMIZEFORTEXTBROWSER) ? 'onsubmit="return false"' : '').'>'; + $searchForm .= 'global->MAIN_OPTIMIZEFORTEXTBROWSER) ? ' onsubmit="return false"' : '').'>'; $searchForm .= ''; From 91dcf103757d4c8d5898af031bed620b7c186c61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Wed, 6 May 2020 23:56:02 +0200 Subject: [PATCH 085/158] session_cache_limiter before starting session --- htdocs/modulebuilder/template/css/mymodule.css.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/htdocs/modulebuilder/template/css/mymodule.css.php b/htdocs/modulebuilder/template/css/mymodule.css.php index a7ce9fce677..af1566c0869 100644 --- a/htdocs/modulebuilder/template/css/mymodule.css.php +++ b/htdocs/modulebuilder/template/css/mymodule.css.php @@ -32,6 +32,11 @@ if (!defined('NOLOGIN')) define('NOLOGIN', 1); // File must be accessed if (!defined('NOREQUIREHTML')) define('NOREQUIREHTML', 1); if (!defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); +session_cache_limiter('public'); +// false or '' = keep cache instruction added by server +// 'public' = remove cache instruction added by server +// and if no cache-control added later, a default cache delay (10800) will be added by PHP. + // Load Dolibarr environment $res = 0; // Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) @@ -48,10 +53,6 @@ if (!$res) die("Include of main fails"); require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; -session_cache_limiter('public'); -// false or '' = keep cache instruction added by server -// 'public' = remove cache instruction added by server and if no cache-control added later, a default cache delay (10800) will be added by PHP. - // Load user to have $user->conf loaded (not done by default here because of NOLOGIN constant defined) and load permission if we need to use them in CSS /*if (empty($user->id) && ! empty($_SESSION['dol_login'])) { From d4400cf80fce889f4836338ca40a8bff0080ee2e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 7 May 2020 11:39:32 +0200 Subject: [PATCH 086/158] FIX links into emails of notifications --- htdocs/core/class/notify.class.php | 56 ++++++++++++++---------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/htdocs/core/class/notify.class.php b/htdocs/core/class/notify.class.php index 6c0ec1ec62b..8a03196beef 100644 --- a/htdocs/core/class/notify.class.php +++ b/htdocs/core/class/notify.class.php @@ -416,34 +416,34 @@ class Notify switch ($notifcode) { case 'BILL_VALIDATE': - $link='/compta/facture/card.php?facid='.$object->id; + $link = '' . $newref . ''; $dir_output = $conf->facture->dir_output; $object_type = 'facture'; - $mesg = $outputlangs->transnoentitiesnoconv("EMailTextInvoiceValidated", $newref); + $mesg = $outputlangs->transnoentitiesnoconv("EMailTextInvoiceValidated", $link); break; case 'BILL_PAYED': - $link='/compta/facture/card.php?facid='.$object->id; + $link ='' . $newref . ''; $dir_output = $conf->facture->dir_output; $object_type = 'facture'; - $mesg = $outputlangs->transnoentitiesnoconv("EMailTextInvoicePayed", $newref); + $mesg = $outputlangs->transnoentitiesnoconv("EMailTextInvoicePayed", $link); break; case 'ORDER_VALIDATE': - $link='/commande/card.php?id='.$object->id; + $link = '' . $newref . ''; $dir_output = $conf->commande->dir_output; $object_type = 'order'; - $mesg = $outputlangs->transnoentitiesnoconv("EMailTextOrderValidated", $newref); + $mesg = $outputlangs->transnoentitiesnoconv("EMailTextOrderValidated", $link); break; case 'PROPAL_VALIDATE': - $link='/comm/propal/card.php?id='.$object->id; + $link = '' . $newref . ''; $dir_output = $conf->propal->multidir_output[$object->entity]; $object_type = 'propal'; - $mesg = $outputlangs->transnoentitiesnoconv("EMailTextProposalValidated", $newref); + $mesg = $outputlangs->transnoentitiesnoconv("EMailTextProposalValidated", $link); break; case 'PROPAL_CLOSE_SIGNED': - $link='/comm/propal/card.php?id='.$object->id; + $link = '' . $newref . ''; $dir_output = $conf->propal->multidir_output[$object->entity]; $object_type = 'propal'; - $mesg = $outputlangs->transnoentitiesnoconv("EMailTextProposalClosedSigned", $newref); + $mesg = $outputlangs->transnoentitiesnoconv("EMailTextProposalClosedSigned", $link); break; case 'FICHINTER_ADD_CONTACT': $link='/fichinter/card.php?id='.$object->id; @@ -452,17 +452,17 @@ class Notify $mesg = $outputlangs->transnoentitiesnoconv("EMailTextInterventionAddedContact", $newref); break; case 'FICHINTER_VALIDATE': - $link='/fichinter/card.php?id='.$object->id; + $link = '' . $newref . ''; $dir_output = $conf->ficheinter->dir_output; $object_type = 'ficheinter'; - $mesg = $outputlangs->transnoentitiesnoconv("EMailTextInterventionValidated", $newref); + $mesg = $outputlangs->transnoentitiesnoconv("EMailTextInterventionValidated", $link); break; case 'ORDER_SUPPLIER_VALIDATE': $link='/fourn/commande/card.php?id='.$object->id; $dir_output = $conf->fournisseur->commande->dir_output; $object_type = 'order_supplier'; $mesg = $outputlangs->transnoentitiesnoconv("Hello").",\n\n"; - $mesg.= $outputlangs->transnoentitiesnoconv("EMailTextOrderValidatedBy", $newref, $user->getFullName($outputlangs)); + $mesg.= $outputlangs->transnoentitiesnoconv("EMailTextOrderValidatedBy", $link, $user->getFullName($outputlangs)); $mesg.= "\n\n".$outputlangs->transnoentitiesnoconv("Sincerely").".\n\n"; break; case 'ORDER_SUPPLIER_APPROVE': @@ -470,46 +470,46 @@ class Notify $dir_output = $conf->fournisseur->commande->dir_output; $object_type = 'order_supplier'; $mesg = $outputlangs->transnoentitiesnoconv("Hello").",\n\n"; - $mesg.= $outputlangs->transnoentitiesnoconv("EMailTextOrderApprovedBy", $newref, $user->getFullName($outputlangs)); + $mesg.= $outputlangs->transnoentitiesnoconv("EMailTextOrderApprovedBy", $link, $user->getFullName($outputlangs)); $mesg.= "\n\n".$outputlangs->transnoentitiesnoconv("Sincerely").".\n\n"; break; case 'ORDER_SUPPLIER_REFUSE': - $link='/fourn/commande/card.php?id='.$object->id; + $link = '' . $newref . ''; $dir_output = $conf->fournisseur->commande->dir_output; $object_type = 'order_supplier'; $mesg = $outputlangs->transnoentitiesnoconv("Hello").",\n\n"; - $mesg.= $outputlangs->transnoentitiesnoconv("EMailTextOrderRefusedBy", $newref, $user->getFullName($outputlangs)); + $mesg.= $outputlangs->transnoentitiesnoconv("EMailTextOrderRefusedBy", $link, $user->getFullName($outputlangs)); $mesg.= "\n\n".$outputlangs->transnoentitiesnoconv("Sincerely").".\n\n"; break; case 'SHIPPING_VALIDATE': $link = ''.$newref.''; $dir_output = $conf->expedition->dir_output.'/sending/'; $object_type = 'expedition'; - $mesg = $outputlangs->transnoentitiesnoconv("EMailTextExpeditionValidated", $newref); + $mesg = $outputlangs->transnoentitiesnoconv("EMailTextExpeditionValidated", $link); break; case 'EXPENSE_REPORT_VALIDATE': $link = ''.$newref.''; $dir_output = $conf->expensereport->dir_output; $object_type = 'expensereport'; - $mesg = $outputlangs->transnoentitiesnoconv("EMailTextExpenseReportValidated", $newref); + $mesg = $outputlangs->transnoentitiesnoconv("EMailTextExpenseReportValidated", $link); break; case 'EXPENSE_REPORT_APPROVE': $link = ''.$newref.''; $dir_output = $conf->expensereport->dir_output; $object_type = 'expensereport'; - $mesg = $outputlangs->transnoentitiesnoconv("EMailTextExpenseReportApproved", $newref); + $mesg = $outputlangs->transnoentitiesnoconv("EMailTextExpenseReportApproved", $link); break; case 'HOLIDAY_VALIDATE': $link = ''.$newref.''; $dir_output = $conf->holiday->dir_output; $object_type = 'holiday'; - $mesg = $outputlangs->transnoentitiesnoconv("EMailTextHolidayValidated", $newref); + $mesg = $outputlangs->transnoentitiesnoconv("EMailTextHolidayValidated", $link); break; case 'HOLIDAY_APPROVE': $link = ''.$newref.''; $dir_output = $conf->holiday->dir_output; $object_type = 'holiday'; - $mesg = $outputlangs->transnoentitiesnoconv("EMailTextHolidayApproved", $newref); + $mesg = $outputlangs->transnoentitiesnoconv("EMailTextHolidayApproved", $link); break; } $ref = dol_sanitizeFileName($newref); @@ -528,7 +528,6 @@ class Notify $message.= $outputlangs->transnoentities("YouReceiveMailBecauseOfNotification2", $application, $mysoc->name)."\n"; $message.= "\n"; $message.= $mesg; - if ($link) $message.= "\n" . $urlwithroot . $link; // if link is already added around the ref into the translation text, then $link must be set to '' $parameters = array('notifcode'=>$notifcode, 'sendto'=>$sendto, 'replyto'=>$replyto, 'file'=>$filename_list, 'mimefile'=>$mimetype_list, 'filename'=>$mimefilename_list); if (!isset($action)) $action = ''; @@ -655,7 +654,7 @@ class Notify break; case 'FICHINTER_ADD_CONTACT': $link = '' . $newref . ''; - $dir_output = $conf->facture->dir_output; + $dir_output = $conf->ficheinter->dir_output; $object_type = 'ficheinter'; $mesg = $langs->transnoentitiesnoconv("EMailTextInterventionAddedContact", $link); break; @@ -701,31 +700,31 @@ class Notify $link = ''.$newref.''; $dir_output = $conf->expedition->dir_output.'/sending/'; $object_type = 'order_supplier'; - $mesg = $langs->transnoentitiesnoconv("EMailTextExpeditionValidated", $newref); + $mesg = $langs->transnoentitiesnoconv("EMailTextExpeditionValidated", $link); break; case 'EXPENSE_REPORT_VALIDATE': $link = ''.$newref.''; $dir_output = $conf->expensereport->dir_output; $object_type = 'expensereport'; - $mesg = $langs->transnoentitiesnoconv("EMailTextExpenseReportValidated", $newref); + $mesg = $langs->transnoentitiesnoconv("EMailTextExpenseReportValidated", $link); break; case 'EXPENSE_REPORT_APPROVE': $link = ''.$newref.''; $dir_output = $conf->expensereport->dir_output; $object_type = 'expensereport'; - $mesg = $langs->transnoentitiesnoconv("EMailTextExpenseReportApproved", $newref); + $mesg = $langs->transnoentitiesnoconv("EMailTextExpenseReportApproved", $link); break; case 'HOLIDAY_VALIDATE': $link = ''.$newref.''; $dir_output = $conf->holiday->dir_output; $object_type = 'holiday'; - $mesg = $langs->transnoentitiesnoconv("EMailTextHolidayValidated", $newref); + $mesg = $langs->transnoentitiesnoconv("EMailTextHolidayValidated", $link); break; case 'HOLIDAY_APPROVE': $link = ''.$newref.''; $dir_output = $conf->holiday->dir_output; $object_type = 'holiday'; - $mesg = $langs->transnoentitiesnoconv("EMailTextHolidayApproved", $newref); + $mesg = $langs->transnoentitiesnoconv("EMailTextHolidayApproved", $link); break; } $ref = dol_sanitizeFileName($newref); @@ -744,7 +743,6 @@ class Notify $message.= $langs->transnoentities("YouReceiveMailBecauseOfNotification2", $application, $mysoc->name)."\n"; $message.= "\n"; $message.= $mesg; - if ($link) $message.= "\n" . $urlwithroot . $link; // if link is already added around the ref into the translation text, then $link must be set to '' $message = nl2br($message); From 03fddd48af55363089ad6082be122d407922ced5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 7 May 2020 12:14:45 +0200 Subject: [PATCH 087/158] Clean some constructors --- htdocs/compta/prelevement/bons.php | 2 +- htdocs/compta/prelevement/card.php | 4 ++-- .../compta/prelevement/class/bonprelevement.class.php | 10 ++++------ .../prelevement/class/ligneprelevement.class.php | 4 +--- .../prelevement/class/rejetprelevement.class.php | 3 ++- htdocs/compta/prelevement/factures.php | 2 +- htdocs/compta/prelevement/fiche-rejet.php | 2 +- htdocs/compta/prelevement/fiche-stat.php | 4 ++-- htdocs/compta/prelevement/line.php | 4 ++-- htdocs/compta/prelevement/list.php | 4 ++-- htdocs/compta/prelevement/rejets.php | 2 +- htdocs/compta/prelevement/stats.php | 2 +- 12 files changed, 20 insertions(+), 23 deletions(-) diff --git a/htdocs/compta/prelevement/bons.php b/htdocs/compta/prelevement/bons.php index 7f0bd46c450..c7c717e702b 100644 --- a/htdocs/compta/prelevement/bons.php +++ b/htdocs/compta/prelevement/bons.php @@ -54,7 +54,7 @@ $statut = GETPOST('statut', 'int'); $search_ref = GETPOST('search_ref', 'alpha'); $search_amount = GETPOST('search_amount', 'alpha'); -$bon = new BonPrelevement($db, ""); +$bon = new BonPrelevement($db); $hookmanager->initHooks(array('withdrawalsreceiptslist')); diff --git a/htdocs/compta/prelevement/card.php b/htdocs/compta/prelevement/card.php index 68f40999aa7..4dcd9f33388 100644 --- a/htdocs/compta/prelevement/card.php +++ b/htdocs/compta/prelevement/card.php @@ -58,7 +58,7 @@ $pagenext = $page + 1; if (!$sortfield) $sortfield = 'pl.fk_soc'; if (!$sortorder) $sortorder = 'DESC'; -$object = new BonPrelevement($db, ""); +$object = new BonPrelevement($db); // Load object include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals @@ -321,7 +321,7 @@ if ($id > 0 || $ref) } - $ligne = new LignePrelevement($db, $user); + $ligne = new LignePrelevement($db); /* * Lines into withdraw request diff --git a/htdocs/compta/prelevement/class/bonprelevement.class.php b/htdocs/compta/prelevement/class/bonprelevement.class.php index 0a033e2df53..0c21a3e6d2b 100644 --- a/htdocs/compta/prelevement/class/bonprelevement.class.php +++ b/htdocs/compta/prelevement/class/bonprelevement.class.php @@ -83,18 +83,16 @@ class BonPrelevement extends CommonObject * Constructor * * @param DoliDB $db Database handler - * @param string $filename Filename of withdraw receipt */ - public function __construct($db, $filename = '') + public function __construct($db) { global $conf, $langs; - $error = 0; $this->db = $db; - $this->filename = $filename; + $this->filename = ''; - $this->date_echeance = time(); + $this->date_echeance = dol_now(); $this->raison_sociale = ""; $this->reference_remise = ""; @@ -892,7 +890,7 @@ class BonPrelevement extends CommonObject if ($bac->verif() >= 1) { $factures_prev[$i] = $fac; - /* second tableau necessaire pour BonPrelevement */ + /* second array necessary for BonPrelevement */ $factures_prev_id[$i] = $fac[0]; $i++; //dol_syslog(__METHOD__."::RIB is ok", LOG_DEBUG); diff --git a/htdocs/compta/prelevement/class/ligneprelevement.class.php b/htdocs/compta/prelevement/class/ligneprelevement.class.php index dd24ad9522c..88b612554df 100644 --- a/htdocs/compta/prelevement/class/ligneprelevement.class.php +++ b/htdocs/compta/prelevement/class/ligneprelevement.class.php @@ -48,14 +48,12 @@ class LignePrelevement * Constructor * * @param DoliDb $db Database handler - * @param User $user Objet user */ - public function __construct($db, $user) + public function __construct($db) { global $conf, $langs; $this->db = $db; - $this->user = $user; // List of language codes for status diff --git a/htdocs/compta/prelevement/class/rejetprelevement.class.php b/htdocs/compta/prelevement/class/rejetprelevement.class.php index 74626baed13..8c033353637 100644 --- a/htdocs/compta/prelevement/class/rejetprelevement.class.php +++ b/htdocs/compta/prelevement/class/rejetprelevement.class.php @@ -247,6 +247,7 @@ class RejetPrelevement $sendto = $emuser->getFullName($langs)." <".$emuser->email.">"; $from = $this->user->getFullName($langs)." <".$this->user->email.">"; $msgishtml = 1; + $trackid = 'use'.$emuser->id; $arr_file = array(); $arr_mime = array(); @@ -258,7 +259,7 @@ class RejetPrelevement $message = $langs->trans("InfoRejectMessage", $facref, $socname, $amount, $userinfo); - $mailfile = new CMailFile($subject, $sendto, $from, $message, $arr_file, $arr_mime, $arr_name, '', '', 0, $msgishtml, $this->user->email); + $mailfile = new CMailFile($subject, $sendto, $from, $message, $arr_file, $arr_mime, $arr_name, '', '', 0, $msgishtml, $this->user->email, '', $trackid); $result = $mailfile->sendfile(); if ($result) diff --git a/htdocs/compta/prelevement/factures.php b/htdocs/compta/prelevement/factures.php index ec004717946..fb0a5548426 100644 --- a/htdocs/compta/prelevement/factures.php +++ b/htdocs/compta/prelevement/factures.php @@ -53,7 +53,7 @@ $pagenext = $page + 1; if (!$sortfield) $sortfield = 'p.ref'; if (!$sortorder) $sortorder = 'DESC'; -$object = new BonPrelevement($db, ""); +$object = new BonPrelevement($db); diff --git a/htdocs/compta/prelevement/fiche-rejet.php b/htdocs/compta/prelevement/fiche-rejet.php index 44be3d1cd01..1cc454a3d4d 100644 --- a/htdocs/compta/prelevement/fiche-rejet.php +++ b/htdocs/compta/prelevement/fiche-rejet.php @@ -51,7 +51,7 @@ $offset = $limit * $page; $pageprev = $page - 1; $pagenext = $page + 1; -$object = new BonPrelevement($db, ""); +$object = new BonPrelevement($db); diff --git a/htdocs/compta/prelevement/fiche-stat.php b/htdocs/compta/prelevement/fiche-stat.php index 6e8e8390ae8..18028e2059a 100644 --- a/htdocs/compta/prelevement/fiche-stat.php +++ b/htdocs/compta/prelevement/fiche-stat.php @@ -50,7 +50,7 @@ $pageprev = $page - 1; $pagenext = $page + 1; -$object = new BonPrelevement($db, ""); +$object = new BonPrelevement($db); /* @@ -142,7 +142,7 @@ if ($prev_id > 0 || $ref) /* * Stats */ - $ligne = new LignePrelevement($db, $user); + $ligne = new LignePrelevement($db); $sql = "SELECT sum(pl.amount), pl.statut"; $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_lignes as pl"; diff --git a/htdocs/compta/prelevement/line.php b/htdocs/compta/prelevement/line.php index 6eef29d1e3e..29bb5c435e3 100644 --- a/htdocs/compta/prelevement/line.php +++ b/htdocs/compta/prelevement/line.php @@ -90,7 +90,7 @@ if ($action == 'confirm_rejet') if (!$error) { - $lipre = new LignePrelevement($db, $user); + $lipre = new LignePrelevement($db); if ($lipre->fetch($id) == 0) @@ -132,7 +132,7 @@ $h++; if ($id) { - $lipre = new LignePrelevement($db, $user); + $lipre = new LignePrelevement($db); if ($lipre->fetch($id) == 0) { diff --git a/htdocs/compta/prelevement/list.php b/htdocs/compta/prelevement/list.php index bebb838652d..48f9bcc7c54 100644 --- a/htdocs/compta/prelevement/list.php +++ b/htdocs/compta/prelevement/list.php @@ -64,8 +64,8 @@ $search_code = GETPOST('search_code', 'alpha'); $search_company = GETPOST('search_company', 'alpha'); $statut = GETPOST('statut', 'int'); -$bon = new BonPrelevement($db, ""); -$line = new LignePrelevement($db, $user); +$bon = new BonPrelevement($db); +$line = new LignePrelevement($db); $company = new Societe($db); $hookmanager->initHooks(array('withdrawalsreceiptslineslist')); diff --git a/htdocs/compta/prelevement/rejets.php b/htdocs/compta/prelevement/rejets.php index 928aaba51b1..6d1994b7a4b 100644 --- a/htdocs/compta/prelevement/rejets.php +++ b/htdocs/compta/prelevement/rejets.php @@ -57,7 +57,7 @@ if ($sortorder == "") $sortorder = "DESC"; if ($sortfield == "") $sortfield = "p.datec"; $rej = new RejetPrelevement($db, $user); -$line = new LignePrelevement($db, $user); +$line = new LignePrelevement($db); $hookmanager->initHooks(array('withdrawalsreceiptsrejectedlist')); diff --git a/htdocs/compta/prelevement/stats.php b/htdocs/compta/prelevement/stats.php index c19603df967..c6d1962ff46 100644 --- a/htdocs/compta/prelevement/stats.php +++ b/htdocs/compta/prelevement/stats.php @@ -73,7 +73,7 @@ if ($resql) print '
'; print load_fiche_titre($langs->trans("WithdrawStatistics"), '', ''); -$ligne = new LignePrelevement($db, $user); +$ligne = new LignePrelevement($db); $sql = "SELECT sum(pl.amount), count(pl.amount), pl.statut"; $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_lignes as pl"; From ad489ab1b409b11f2e39552d63e2fb6cff603115 Mon Sep 17 00:00:00 2001 From: VESSILLER Date: Thu, 7 May 2020 12:22:13 +0200 Subject: [PATCH 088/158] NEW show messages on ticket card --- htdocs/ticket/card.php | 919 +++++++++++++++++++++-------------------- 1 file changed, 479 insertions(+), 440 deletions(-) diff --git a/htdocs/ticket/card.php b/htdocs/ticket/card.php index b9459a0e161..3d37c46eb90 100644 --- a/htdocs/ticket/card.php +++ b/htdocs/ticket/card.php @@ -55,6 +55,17 @@ $action = GETPOST('action', 'aZ09'); $notifyTiers = GETPOST("notify_tiers_at_create", 'alpha'); +$sortfield = GETPOST('sortfield', 'alpha'); +$sortorder = GETPOST('sortorder', 'alpha'); + +if (GETPOST('actioncode', 'array')) { + $actioncode = GETPOST('actioncode', 'array', 3); + if (!count($actioncode)) $actioncode = '0'; +} else { + $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); +} +$search_agenda_label = GETPOST('search_agenda_label'); + // Initialize technical object to manage hooks of ticket. Note that conf->hooks_modules contains array array $hookmanager->initHooks(array('ticketcard', 'globalcard')); @@ -116,493 +127,486 @@ $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 ($cancel) -{ - if (!empty($backtopage)) +if (empty($reshook)) { + // Purge search criteria + if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) // All test are required to be compatible with all browsers{ { - header("Location: ".$backtopage); - exit; - } - $action = 'view'; -} - -if (GETPOST('add', 'alpha') && $user->rights->ticket->write) { - $error = 0; - - if (!GETPOST("subject", 'alpha')) { - $error++; - setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Subject")), null, 'errors'); - $action = 'create'; - } elseif (!GETPOST("message", 'alpha')) { - $error++; - setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Message")), null, 'errors'); - $action = 'create'; + $actioncode = ''; + $search_agenda_label = ''; } - if (!$error) { - $db->begin(); + if ($cancel) { + if (!empty($backtopage)) { + header("Location: " . $backtopage); + exit; + } + $action = 'view'; + } - $object->ref = GETPOST("ref", 'alpha'); - $object->fk_soc = GETPOST("socid", 'int') > 0 ? GETPOST("socid", 'int') : 0; - $object->subject = GETPOST("subject", 'alpha'); - $object->message = GETPOST("message", 'none'); + if (GETPOST('add', 'alpha') && $user->rights->ticket->write) { + $error = 0; - $object->type_code = GETPOST("type_code", 'alpha'); - $object->category_code = GETPOST("category_code", 'alpha'); - $object->severity_code = GETPOST("severity_code", 'alpha'); - $notifyTiers = GETPOST("notify_tiers_at_create", 'alpha'); - $object->notify_tiers_at_create = empty($notifyTiers) ? 0 : 1; - - $object->fk_project = GETPOST('projectid', 'int'); - - $ret = $extrafields->setOptionalsFromPost(null, $object); - - $id = $object->create($user); - if ($id <= 0) { + if (!GETPOST("subject", 'alpha')) { $error++; - setEventMessage($object->error, $object->errors, 'errors'); + setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Subject")), null, 'errors'); + $action = 'create'; + } elseif (!GETPOST("message", 'alpha')) { + $error++; + setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Message")), null, 'errors'); $action = 'create'; } - if (!$error) - { - // Add contact - $contactid = GETPOST('contactid', 'int'); - $type_contact = GETPOST("type", 'alpha'); + if (!$error) { + $db->begin(); - if ($contactid > 0 && $type_contact) { - $result = $object->add_contact($contactid, GETPOST("type"), 'external'); + $object->ref = GETPOST("ref", 'alpha'); + $object->fk_soc = GETPOST("socid", 'int') > 0 ? GETPOST("socid", 'int') : 0; + $object->subject = GETPOST("subject", 'alpha'); + $object->message = GETPOST("message", 'none'); + + $object->type_code = GETPOST("type_code", 'alpha'); + $object->category_code = GETPOST("category_code", 'alpha'); + $object->severity_code = GETPOST("severity_code", 'alpha'); + $notifyTiers = GETPOST("notify_tiers_at_create", 'alpha'); + $object->notify_tiers_at_create = empty($notifyTiers) ? 0 : 1; + + $object->fk_project = GETPOST('projectid', 'int'); + + $ret = $extrafields->setOptionalsFromPost(null, $object); + + $id = $object->create($user); + if ($id <= 0) { + $error++; + setEventMessage($object->error, $object->errors, 'errors'); + $action = 'create'; } - // altairis: link ticket to project - if (GETPOST('projectid') > 0) { - $object->setProject(GETPOST('projectid')); - } + if (!$error) { + // Add contact + $contactid = GETPOST('contactid', 'int'); + $type_contact = GETPOST("type", 'alpha'); - // Auto assign user - if ($conf->global->TICKET_AUTO_ASSIGN_USER_CREATE) { - $result = $object->assignUser($user, $user->id, 1); - $object->add_contact($user->id, "SUPPORTTEC", 'internal'); - } + if ($contactid > 0 && $type_contact) { + $result = $object->add_contact($contactid, GETPOST("type"), 'external'); + } - // Auto assign contrat - $contractid = 0; - if ($conf->global->TICKET_AUTO_ASSIGN_CONTRACT_CREATE) { - $contrat = new Contrat($db); - $contrat->socid = $object->fk_soc; - $list = $contrat->getListOfContracts(); + // altairis: link ticket to project + if (GETPOST('projectid') > 0) { + $object->setProject(GETPOST('projectid')); + } - if (is_array($list) && !empty($list)) { - if (count($list) == 1) { - $contractid = $list[0]->id; - $object->setContract($contractid); - } else { + // Auto assign user + if ($conf->global->TICKET_AUTO_ASSIGN_USER_CREATE) { + $result = $object->assignUser($user, $user->id, 1); + $object->add_contact($user->id, "SUPPORTTEC", 'internal'); + } + + // Auto assign contrat + $contractid = 0; + if ($conf->global->TICKET_AUTO_ASSIGN_CONTRACT_CREATE) { + $contrat = new Contrat($db); + $contrat->socid = $object->fk_soc; + $list = $contrat->getListOfContracts(); + + if (is_array($list) && !empty($list)) { + if (count($list) == 1) { + $contractid = $list[0]->id; + $object->setContract($contractid); + } else { + } + } + } + + // Auto create fiche intervention + if ($conf->global->TICKET_AUTO_CREATE_FICHINTER_CREATE) { + $fichinter = new Fichinter($db); + $fichinter->socid = $object->fk_soc; + $fichinter->fk_project = GETPOST('projectid', 'int'); + $fichinter->fk_contrat = $contractid; + $fichinter->author = $user->id; + $fichinter->modelpdf = 'soleil'; + $fichinter->origin = $object->element; + $fichinter->origin_id = $object->id; + + // Extrafields + $extrafields->fetch_name_optionals_label($fichinter->table_element); + $array_options = $extrafields->getOptionalsFromPost($fichinter->table_element); + $fichinter->array_options = $array_options; + + $id = $fichinter->create($user); + if ($id <= 0) { + setEventMessages($fichinter->error, null, 'errors'); } } } - // Auto create fiche intervention - if ($conf->global->TICKET_AUTO_CREATE_FICHINTER_CREATE) - { - $fichinter = new Fichinter($db); - $fichinter->socid = $object->fk_soc; - $fichinter->fk_project = GETPOST('projectid', 'int'); - $fichinter->fk_contrat = $contractid; - $fichinter->author = $user->id; - $fichinter->modelpdf = 'soleil'; - $fichinter->origin = $object->element; - $fichinter->origin_id = $object->id; + if (!$error) { + // File transfer + $object->copyFilesForTicket(); + } - // Extrafields - $extrafields->fetch_name_optionals_label($fichinter->table_element); - $array_options = $extrafields->getOptionalsFromPost($fichinter->table_element); - $fichinter->array_options = $array_options; + if (!$error) { + $db->commit(); - $id = $fichinter->create($user); - if ($id <= 0) { - setEventMessages($fichinter->error, null, 'errors'); + if (!empty($backtopage)) { + $url = $backtopage; + } else { + $url = 'card.php?track_id=' . $object->track_id; } - } - } - if (!$error) - { - // File transfer - $object->copyFilesForTicket(); - } - - if (!$error) - { - $db->commit(); - - if (!empty($backtopage)) { - $url = $backtopage; + header("Location: " . $url); + exit; } else { - $url = 'card.php?track_id='.$object->track_id; + $db->rollback(); + setEventMessages($object->error, $object->errors, 'errors'); } - - header("Location: ".$url); - exit; } else { - $db->rollback(); setEventMessages($object->error, $object->errors, 'errors'); } - } else { - setEventMessages($object->error, $object->errors, 'errors'); - } -} - -if ($action == 'edit' && $user->rights->ticket->write) { - $error = 0; - - if ($object->fetch(GETPOST('id', 'int')) < 0) { - $error++; - array_push($object->errors, $langs->trans("ErrorTicketIsNotValid")); - $_GET["action"] = $_POST["action"] = ''; - } -} - -if (GETPOST('update', 'alpha') && GETPOST('id', 'int') && $user->rights->ticket->write) { - $error = 0; - - $ret = $object->fetch(GETPOST('id', 'int')); - if ($ret < 0) { - $error++; - array_push($object->errors, $langs->trans("ErrorTicketIsNotValid")); - $action = ''; - } elseif (!GETPOST("label")) { - $error++; - array_push($object->errors, $langs->trans("ErrorFieldRequired", $langs->transnoentities("Label"))); - $action = 'edit'; - } elseif (!GETPOST("subject")) { - $error++; - array_push($object->errors, $langs->trans("ErrorFieldRequired", $langs->transnoentities("Subject"))); - $action = 'edit'; } - if (!$error) { - $db->begin(); + if ($action == 'edit' && $user->rights->ticket->write) { + $error = 0; - $object->label = GETPOST("label", 'alphanohtml'); - $object->description = GETPOST("description", 'none'); - - //... - $ret = $object->update($user); - if ($ret <= 0) { + if ($object->fetch(GETPOST('id', 'int')) < 0) { $error++; - setEventMessage($object->error, $object->errors, 'errors'); + array_push($object->errors, $langs->trans("ErrorTicketIsNotValid")); + $_GET["action"] = $_POST["action"] = ''; + } + } + + if (GETPOST('update', 'alpha') && GETPOST('id', 'int') && $user->rights->ticket->write) { + $error = 0; + + $ret = $object->fetch(GETPOST('id', 'int')); + if ($ret < 0) { + $error++; + array_push($object->errors, $langs->trans("ErrorTicketIsNotValid")); + $action = ''; + } elseif (!GETPOST("label")) { + $error++; + array_push($object->errors, $langs->trans("ErrorFieldRequired", $langs->transnoentities("Label"))); + $action = 'edit'; + } elseif (!GETPOST("subject")) { + $error++; + array_push($object->errors, $langs->trans("ErrorFieldRequired", $langs->transnoentities("Subject"))); $action = 'edit'; } - if (!$error && $ret > 0) { - $db->commit(); - } else { - $db->rollback(); - } - } -} + if (!$error) { + $db->begin(); -// Mark as Read -if ($action == "mark_ticket_read" && $user->rights->ticket->write) { - $object->fetch('', '', GETPOST("track_id", 'alpha')); + $object->label = GETPOST("label", 'alphanohtml'); + $object->description = GETPOST("description", 'none'); - if ($object->markAsRead($user) > 0) - { - setEventMessages($langs->trans('TicketMarkedAsRead'), null, 'mesgs'); + //... + $ret = $object->update($user); + if ($ret <= 0) { + $error++; + setEventMessage($object->error, $object->errors, 'errors'); + $action = 'edit'; + } - header("Location: card.php?track_id=".$object->track_id."&action=view"); - exit; - } else { - setEventMessages($object->error, $object->errors, 'errors'); - } - $action = 'view'; -} - -// Assign to someone -if ($action == "assign_user" && GETPOST('btn_assign_user', 'alpha') && $user->rights->ticket->write) { - $object->fetch('', '', GETPOST("track_id", 'alpha')); - $useroriginassign = $object->fk_user_assign; - $usertoassign = GETPOST('fk_user_assign', 'int'); - - /*if (! ($usertoassign > 0)) { - $error++; - array_push($object->errors, $langs->trans("ErrorFieldRequired", $langs->transnoentities("AssignedTo"))); - $action = 'view'; - }*/ - - if (!$error) - { - $ret = $object->assignUser($user, $usertoassign); - if ($ret < 0) $error++; - } - - if (!$error) // Update list of contacts - { - // Si déjà un user assigné on le supprime des contacts - if ($useroriginassign > 0) { - $internal_contacts = $object->listeContact(-1, 'internal'); - - foreach ($internal_contacts as $key => $contact) { - if ($contact['code'] == "SUPPORTTEC" && $contact['id'] == $useroriginassign) { - } - { - //print "user à effacer : ".$useroriginassign; - $object->delete_contact($contact['rowid']); - } + if (!$error && $ret > 0) { + $db->commit(); + } else { + $db->rollback(); } } - - if ($usertoassign > 0) $object->add_contact($usertoassign, "SUPPORTTEC", 'internal', $notrigger = 0); } - if (!$error) - { - // Log action in ticket logs table - $object->fetch_user($usertoassign); - $log_action = $langs->trans('TicketLogAssignedTo', $object->user->getFullName($langs)); + // Mark as Read + if ($action == "mark_ticket_read" && $user->rights->ticket->write) { + $object->fetch('', '', GETPOST("track_id", 'alpha')); - setEventMessages($langs->trans('TicketAssigned'), null, 'mesgs'); + if ($object->markAsRead($user) > 0) { + setEventMessages($langs->trans('TicketMarkedAsRead'), null, 'mesgs'); - header("Location: card.php?track_id=".$object->track_id."&action=view"); - exit; - } else { - array_push($object->errors, $object->error); - } - $action = 'view'; -} - -if ($action == 'add_message' && GETPOSTISSET('btn_add_message') && $user->rights->ticket->read) { - $ret = $object->newMessage($user, $action, (GETPOST('private_message', 'alpha') == "on" ? 1 : 0)); - - if ($ret > 0) { - if (!empty($backtopage)) { - $url = $backtopage; - } else { - $url = 'card.php?action=view&track_id='.$object->track_id; - } - - header("Location: ".$url); - exit; - } else { - setEventMessages($object->error, null, 'errors'); - $action = 'presend'; - } -} - -if ($action == "confirm_close" && GETPOST('confirm', 'alpha') == 'yes' && $user->rights->ticket->write) -{ - $object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')); - - if ($object->close($user)) { - setEventMessages($langs->trans('TicketMarkedAsClosed'), null, 'mesgs'); - - $url = 'card.php?action=view&track_id='.GETPOST('track_id', 'alpha'); - header("Location: ".$url); - } else { - $action = ''; - setEventMessages($object->error, $object->errors, 'errors'); - } -} - -if ($action == "confirm_public_close" && GETPOST('confirm', 'alpha') == 'yes') { - $object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')); - if ($_SESSION['email_customer'] == $object->origin_email || $_SESSION['email_customer'] == $object->thirdparty->email) { - $object->close($user); - - // Log action in ticket logs table - $log_action = $langs->trans('TicketLogClosedBy', $_SESSION['email_customer']); - - setEventMessages('
'.$langs->trans('TicketMarkedAsClosed').'
', null, 'mesgs'); - - $url = 'card.php?action=view_ticket&track_id='.GETPOST('track_id', 'alpha'); - header("Location: ".$url); - } else { - setEventMessages($object->error, $object->errors, 'errors'); - $action = ''; - } -} - -if ($action == 'confirm_delete_ticket' && GETPOST('confirm', 'alpha') == "yes" && $user->rights->ticket->delete) { - if ($object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')) >= 0) { - if ($object->delete($user) > 0) { - setEventMessages('
'.$langs->trans('TicketDeletedSuccess').'
', null, 'mesgs'); - Header("Location: ".DOL_URL_ROOT."/ticket/list.php"); + header("Location: card.php?track_id=" . $object->track_id . "&action=view"); exit; } else { - $langs->load("errors"); - $mesg = '
'.$langs->trans($object->error).'
'; + setEventMessages($object->error, $object->errors, 'errors'); + } + $action = 'view'; + } + + // Assign to someone + if ($action == "assign_user" && GETPOST('btn_assign_user', 'alpha') && $user->rights->ticket->write) { + $object->fetch('', '', GETPOST("track_id", 'alpha')); + $useroriginassign = $object->fk_user_assign; + $usertoassign = GETPOST('fk_user_assign', 'int'); + + /*if (! ($usertoassign > 0)) { + $error++; + array_push($object->errors, $langs->trans("ErrorFieldRequired", $langs->transnoentities("AssignedTo"))); + $action = 'view'; + }*/ + + if (!$error) { + $ret = $object->assignUser($user, $usertoassign); + if ($ret < 0) $error++; + } + + if (!$error) // Update list of contacts + { + // Si déjà un user assigné on le supprime des contacts + if ($useroriginassign > 0) { + $internal_contacts = $object->listeContact(-1, 'internal'); + + foreach ($internal_contacts as $key => $contact) { + if ($contact['code'] == "SUPPORTTEC" && $contact['id'] == $useroriginassign) { + } + { + //print "user à effacer : ".$useroriginassign; + $object->delete_contact($contact['rowid']); + } + } + } + + if ($usertoassign > 0) $object->add_contact($usertoassign, "SUPPORTTEC", 'internal', $notrigger = 0); + } + + if (!$error) { + // Log action in ticket logs table + $object->fetch_user($usertoassign); + $log_action = $langs->trans('TicketLogAssignedTo', $object->user->getFullName($langs)); + + setEventMessages($langs->trans('TicketAssigned'), null, 'mesgs'); + + header("Location: card.php?track_id=" . $object->track_id . "&action=view"); + exit; + } else { + array_push($object->errors, $object->error); + } + $action = 'view'; + } + + if ($action == 'add_message' && GETPOSTISSET('btn_add_message') && $user->rights->ticket->read) { + $ret = $object->newMessage($user, $action, (GETPOST('private_message', 'alpha') == "on" ? 1 : 0)); + + if ($ret > 0) { + if (!empty($backtopage)) { + $url = $backtopage; + } else { + $url = 'card.php?action=view&track_id=' . $object->track_id; + } + + header("Location: " . $url); + exit; + } else { + setEventMessages($object->error, null, 'errors'); + $action = 'presend'; + } + } + + if ($action == "confirm_close" && GETPOST('confirm', 'alpha') == 'yes' && $user->rights->ticket->write) { + $object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')); + + if ($object->close($user)) { + setEventMessages($langs->trans('TicketMarkedAsClosed'), null, 'mesgs'); + + $url = 'card.php?action=view&track_id=' . GETPOST('track_id', 'alpha'); + header("Location: " . $url); + } else { + $action = ''; + setEventMessages($object->error, $object->errors, 'errors'); + } + } + + if ($action == "confirm_public_close" && GETPOST('confirm', 'alpha') == 'yes') { + $object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')); + if ($_SESSION['email_customer'] == $object->origin_email || $_SESSION['email_customer'] == $object->thirdparty->email) { + $object->close($user); + + // Log action in ticket logs table + $log_action = $langs->trans('TicketLogClosedBy', $_SESSION['email_customer']); + + setEventMessages('
' . $langs->trans('TicketMarkedAsClosed') . '
', null, 'mesgs'); + + $url = 'card.php?action=view_ticket&track_id=' . GETPOST('track_id', 'alpha'); + header("Location: " . $url); + } else { + setEventMessages($object->error, $object->errors, 'errors'); $action = ''; } } -} -// Set parent company -if ($action == 'set_thirdparty' && $user->rights->societe->creer) { - if ($object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')) >= 0) { - $result = $object->setCustomer(GETPOST('editcustomer', 'int')); - $url = 'card.php?action=view&track_id='.GETPOST('track_id', 'alpha'); - header("Location: ".$url); - exit(); - } -} - -if ($action == 'set_progression' && $user->rights->ticket->write) { - if ($object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')) >= 0) { - $result = $object->setProgression(GETPOST('progress', 'alpha')); - - $url = 'card.php?action=view&track_id='.$object->track_id; - header("Location: ".$url); - exit(); - } -} - -if ($action == 'setsubject') { - if ($object->fetch(GETPOST('id', 'int'))) { - if ($action == 'setsubject') { - $object->subject = trim(GETPOST('subject', 'alpha')); - } - - if ($action == 'setsubject' && empty($object->subject)) { - $mesg .= ($mesg ? '
' : '').$langs->trans("ErrorFieldRequired", $langs->transnoentities("Subject")); - } - - if (!$mesg) { - if ($object->update($user) >= 0) { - header("Location: ".$_SERVER['PHP_SELF']."?track_id=".$object->track_id); + if ($action == 'confirm_delete_ticket' && GETPOST('confirm', 'alpha') == "yes" && $user->rights->ticket->delete) { + if ($object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')) >= 0) { + if ($object->delete($user) > 0) { + setEventMessages('
' . $langs->trans('TicketDeletedSuccess') . '
', null, 'mesgs'); + Header("Location: " . DOL_URL_ROOT . "/ticket/list.php"); exit; + } else { + $langs->load("errors"); + $mesg = '
' . $langs->trans($object->error) . '
'; + $action = ''; } - $mesg = $object->error; } } -} -if ($action == 'confirm_reopen' && $user->rights->ticket->manage && !GETPOST('cancel')) { - if ($object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')) >= 0) { - // prevent browser refresh from reopening ticket several times - if ($object->fk_statut == Ticket::STATUS_CLOSED) { - $res = $object->setStatut(Ticket::STATUS_ASSIGNED); + // Set parent company + if ($action == 'set_thirdparty' && $user->rights->societe->creer) { + if ($object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')) >= 0) { + $result = $object->setCustomer(GETPOST('editcustomer', 'int')); + $url = 'card.php?action=view&track_id=' . GETPOST('track_id', 'alpha'); + header("Location: " . $url); + exit(); + } + } + + if ($action == 'set_progression' && $user->rights->ticket->write) { + if ($object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')) >= 0) { + $result = $object->setProgression(GETPOST('progress', 'alpha')); + + $url = 'card.php?action=view&track_id=' . $object->track_id; + header("Location: " . $url); + exit(); + } + } + + if ($action == 'setsubject') { + if ($object->fetch(GETPOST('id', 'int'))) { + if ($action == 'setsubject') { + $object->subject = trim(GETPOST('subject', 'alpha')); + } + + if ($action == 'setsubject' && empty($object->subject)) { + $mesg .= ($mesg ? '
' : '') . $langs->trans("ErrorFieldRequired", $langs->transnoentities("Subject")); + } + + if (!$mesg) { + if ($object->update($user) >= 0) { + header("Location: " . $_SERVER['PHP_SELF'] . "?track_id=" . $object->track_id); + exit; + } + $mesg = $object->error; + } + } + } + + if ($action == 'confirm_reopen' && $user->rights->ticket->manage && !GETPOST('cancel')) { + if ($object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')) >= 0) { + // prevent browser refresh from reopening ticket several times + if ($object->fk_statut == Ticket::STATUS_CLOSED) { + $res = $object->setStatut(Ticket::STATUS_ASSIGNED); + if ($res) { + // Log action in ticket logs table + $log_action = $langs->trans('TicketLogReopen'); + + $url = 'card.php?action=view&track_id=' . $object->track_id; + header("Location: " . $url); + exit(); + } + } + } + } // Categorisation dans projet + elseif ($action == 'classin' && $user->rights->ticket->write) { + if ($object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')) >= 0) { + $object->setProject(GETPOST('projectid', 'int')); + $url = 'card.php?action=view&track_id=' . $object->track_id; + header("Location: " . $url); + exit(); + } + } // Categorisation dans contrat + elseif ($action == 'setcontract' && $user->rights->ticket->write) { + if ($object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')) >= 0) { + $object->setContract(GETPOST('contractid', 'int')); + $url = 'card.php?action=view&track_id=' . $object->track_id; + header("Location: " . $url); + exit(); + } + } elseif ($action == "set_message" && $user->rights->ticket->manage) { + // altairis: manage cancel button + if (!GETPOST('cancel')) { + $object->fetch('', '', GETPOST('track_id', 'alpha')); + $oldvalue_message = $object->message; + $fieldtomodify = GETPOST('message_initial'); + + $object->message = $fieldtomodify; + $ret = $object->update($user); + if ($ret > 0) { + $log_action = $langs->trans('TicketInitialMessageModified') . " \n"; + // include the Diff class + dol_include_once('/ticket/class/utils_diff.class.php'); + // output the result of comparing two files as plain text + $log_action .= Diff::toString(Diff::compare(strip_tags($oldvalue_message), strip_tags($object->message))); + + setEventMessages($langs->trans('TicketMessageSuccesfullyUpdated'), null, 'mesgs'); + } + } + + $action = 'view'; + } // Reopen ticket + elseif ($action == 'confirm_set_status' && $user->rights->ticket->write && !GETPOST('cancel')) { + if ($object->fetch(GETPOST('id', 'int'), GETPOST('track_id', 'alpha')) >= 0) { + $new_status = GETPOST('new_status', 'int'); + $old_status = $object->fk_statut; + $res = $object->setStatut($new_status); if ($res) { // Log action in ticket logs table - $log_action = $langs->trans('TicketLogReopen'); + $log_action = $langs->trans('TicketLogStatusChanged', $langs->transnoentities($object->statuts_short[$old_status]), $langs->transnoentities($object->statuts_short[$new_status])); - $url = 'card.php?action=view&track_id='.$object->track_id; - header("Location: ".$url); + $url = 'card.php?action=view&track_id=' . $object->track_id; + header("Location: " . $url); exit(); } } } -} // Categorisation dans projet -elseif ($action == 'classin' && $user->rights->ticket->write) { - if ($object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')) >= 0) { - $object->setProject(GETPOST('projectid', 'int')); - $url = 'card.php?action=view&track_id='.$object->track_id; - header("Location: ".$url); - exit(); - } -} // Categorisation dans contrat -elseif ($action == 'setcontract' && $user->rights->ticket->write) { - if ($object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')) >= 0) { - $object->setContract(GETPOST('contractid', 'int')); - $url = 'card.php?action=view&track_id='.$object->track_id; - header("Location: ".$url); - exit(); - } -} elseif ($action == "set_message" && $user->rights->ticket->manage) { - // altairis: manage cancel button - if (!GETPOST('cancel')) { - $object->fetch('', '', GETPOST('track_id', 'alpha')); - $oldvalue_message = $object->message; - $fieldtomodify = GETPOST('message_initial'); - $object->message = $fieldtomodify; + // Action to update one extrafield + if ($action == "update_extras" && !empty($permissiontoadd)) { + $object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')); + $attributekey = GETPOST('attribute', 'alpha'); + $attributekeylong = 'options_' . $attributekey; + $object->array_options['options_' . $attributekey] = GETPOST($attributekeylong, ' alpha'); + + $result = $object->insertExtraFields(empty($triggermodname) ? '' : $triggermodname, $user); + if ($result > 0) { + setEventMessages($langs->trans('RecordSaved'), null, 'mesgs'); + $action = 'view'; + } else { + setEventMessages($object->error, $object->errors, 'errors'); + $action = 'edit_extras'; + } + } + + if ($action == "change_property" && GETPOST('btn_update_ticket_prop', 'alpha') && $user->rights->ticket->write) { + $object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')); + + $object->type_code = GETPOST('update_value_type', 'aZ09'); + $object->severity_code = GETPOST('update_value_severity', 'aZ09'); + $object->category_code = GETPOST('update_value_category', 'aZ09'); + $ret = $object->update($user); if ($ret > 0) { - $log_action = $langs->trans('TicketInitialMessageModified')." \n"; - // include the Diff class - dol_include_once('/ticket/class/utils_diff.class.php'); - // output the result of comparing two files as plain text - $log_action .= Diff::toString(Diff::compare(strip_tags($oldvalue_message), strip_tags($object->message))); + $log_action = $langs->trans('TicketLogPropertyChanged', $oldvalue_label, $newvalue_label); - setEventMessages($langs->trans('TicketMessageSuccesfullyUpdated'), null, 'mesgs'); + setEventMessages($langs->trans('TicketUpdated'), null, 'mesgs'); } - } - - $action = 'view'; -} // Reopen ticket -elseif ($action == 'confirm_set_status' && $user->rights->ticket->write && !GETPOST('cancel')) { - if ($object->fetch(GETPOST('id', 'int'), GETPOST('track_id', 'alpha')) >= 0) { - $new_status = GETPOST('new_status', 'int'); - $old_status = $object->fk_statut; - $res = $object->setStatut($new_status); - if ($res) { - // Log action in ticket logs table - $log_action = $langs->trans('TicketLogStatusChanged', $langs->transnoentities($object->statuts_short[$old_status]), $langs->transnoentities($object->statuts_short[$new_status])); - - $url = 'card.php?action=view&track_id='.$object->track_id; - header("Location: ".$url); - exit(); - } - } -} - -// Action to update one extrafield -if ($action == "update_extras" && !empty($permissiontoadd)) -{ - $object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')); - $attributekey = GETPOST('attribute', 'alpha'); - $attributekeylong = 'options_'.$attributekey; - $object->array_options['options_'.$attributekey] = GETPOST($attributekeylong, ' alpha'); - - $result = $object->insertExtraFields(empty($triggermodname) ? '' : $triggermodname, $user); - if ($result > 0) - { - setEventMessages($langs->trans('RecordSaved'), null, 'mesgs'); $action = 'view'; } - else - { - setEventMessages($object->error, $object->errors, 'errors'); - $action = 'edit_extras'; - } + + + $permissiondellink = $user->rights->ticket->write; + include DOL_DOCUMENT_ROOT . '/core/actions_dellink.inc.php'; // Must be include, not include_once + + // Actions to build doc + $upload_dir = $conf->ticket->dir_output; + $permissiontoadd = $user->rights->ticket->write; + include DOL_DOCUMENT_ROOT . '/core/actions_builddoc.inc.php'; + + // Actions to send emails + $triggersendname = 'TICKET_SENTBYMAIL'; + $paramname = 'id'; + $autocopy = 'MAIN_MAIL_AUTOCOPY_TICKET_TO'; // used to know the automatic BCC to add + $trackid = 'tic' . $object->id; + include DOL_DOCUMENT_ROOT . '/core/actions_sendmails.inc.php'; + + // Set $action to correct value for the case we used presend action to add a message + if (GETPOSTISSET('actionbis') && $action == 'presend') $action = 'presend_addmessage'; } -if ($action == "change_property" && GETPOST('btn_update_ticket_prop', 'alpha') && $user->rights->ticket->write) -{ - $object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')); - - $object->type_code = GETPOST('update_value_type', 'aZ09'); - $object->severity_code = GETPOST('update_value_severity', 'aZ09'); - $object->category_code = GETPOST('update_value_category', 'aZ09'); - - $ret = $object->update($user); - if ($ret > 0) { - $log_action = $langs->trans('TicketLogPropertyChanged', $oldvalue_label, $newvalue_label); - - setEventMessages($langs->trans('TicketUpdated'), null, 'mesgs'); - } - $action = 'view'; -} - - -$permissiondellink = $user->rights->ticket->write; -include DOL_DOCUMENT_ROOT.'/core/actions_dellink.inc.php'; // Must be include, not include_once - -// Actions to build doc -$upload_dir = $conf->ticket->dir_output; -$permissiontoadd = $user->rights->ticket->write; -include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php'; - -// Actions to send emails -$triggersendname = 'TICKET_SENTBYMAIL'; -$paramname = 'id'; -$autocopy = 'MAIN_MAIL_AUTOCOPY_TICKET_TO'; // used to know the automatic BCC to add -$trackid = 'tic'.$object->id; -include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php'; - -// Set $action to correct value for the case we used presend action to add a message -if (GETPOSTISSET('actionbis') && $action == 'presend') $action = 'presend_addmessage'; - - /* * View */ @@ -1213,30 +1217,8 @@ if (empty($action) || $action == 'view' || $action == 'addlink' || $action == 'd // Set $action to correct value for the case we used presend action to add a message if (GETPOSTISSET('actionbis') && $action == 'presend') $action = 'presend_addmessage'; - if ($action != 'presend' && $action != 'presend_addmessage') - { - print '
'; - print ''; // ancre - - // Show links to link elements - $linktoelem = $form->showLinkToObjectBlock($object, null, array('ticket')); - $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem); - - // Show direct link to public interface - print '
'."\n"; - print showDirectPublicLink($object).'
'; - - print '
'; - - // List of actions on element - include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php'; - $formactions = new FormActions($db); - $somethingshown = $formactions->showactions($object, 'ticket', $socid, 1); - - print '
'; - } - else - { + // add a message + if ($action == 'presend' || $action == 'presend_addmessage') { $action = 'add_message'; // action to use to post the message $modelmail = 'ticket_send'; @@ -1310,6 +1292,63 @@ if (empty($action) || $action == 'view' || $action == 'addlink' || $action == 'd $formticket->showMessageForm('100%'); print '
'; } + + // Show messages on card + if (empty($conf->global->TICKET_HIDE_MESSAGES_ON_CARD)) { + $param = '&id='.$object->id; + if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param .= '&contextpage='.$contextpage; + if ($limit > 0 && $limit != $conf->liste_limit) $param .= '&limit='.$limit; + if ($actioncode) $param .= '&actioncode='.urlencode($actioncode); + if ($search_agenda_label) $param .= '&search_agenda_label='.urlencode($search_agenda_label); + + $morehtmlright = ''; + + $messagingUrl = DOL_URL_ROOT . '/ticket/agenda.php?track_id=' . $object->track_id; + $morehtmlright .= dolGetButtonTitle($langs->trans('MessageListViewType'), '', 'fal fa-list-alt imgforviewmode', $messagingUrl, '', 1); + + // Show link to add a message (if read and not closed) + $btnstatus = $object->fk_statut < Ticket::STATUS_CLOSED && $action != "presend" && $action != "presend_addmessage" && $action != "add_message"; + $url = 'card.php?track_id=' . $object->track_id . '&action=presend_addmessage&mode=init'; + $morehtmlright .= dolGetButtonTitle($langs->trans('TicketAddMessage'), '', 'fal fa-comment-dots', $url, 'add-new-ticket-title-button', $btnstatus); + + // Show link to add event (if read and not closed) + $btnstatus = $object->fk_statut < Ticket::STATUS_CLOSED && $action != "presend" && $action != "presend_addmessage" && $action != "add_message";; + $url = dol_buildpath('/comm/action/card.php', 1) . '?action=create&datep=' . date('YmdHi') . '&origin=ticket&originid=' . $object->id . '&projectid=' . $object->fk_project . '&backtopage=' . urlencode($_SERVER["PHP_SELF"] . '?track_id=' . $object->track_id); + $morehtmlright .= dolGetButtonTitle($langs->trans('AddAction'), '', 'fal fa-plus-circle', $url, 'add-new-ticket-even-button', $btnstatus); + + print_barre_liste($langs->trans("ActionsOnTicket"), 0, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', 0, -1, '', 0, $morehtmlright, '', 0, 1, 1); + + // List of all actions + $filters = array(); + $filters['search_agenda_label'] = $search_agenda_label; + show_ticket_messaging($conf, $langs, $db, $object, null, 0, $actioncode, '', $filters, $sortfield, $sortorder); + } + + if ($action != 'presend' && $action != 'presend_addmessage') { + print '
'; + print ''; // ancre + + // Show links to link elements + $linktoelem = $form->showLinkToObjectBlock($object, null, array('ticket')); + $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem); + + // Show direct link to public interface + print '
'."\n"; + print showDirectPublicLink($object).'
'; + print '
'; + + if (!empty($conf->global->TICKET_HIDE_MESSAGES_ON_CARD)) { + print '
'; + + // List of actions on element + include_once DOL_DOCUMENT_ROOT . '/core/class/html.formactions.class.php'; + $formactions = new FormActions($db); + $somethingshown = $formactions->showactions($object, 'ticket', $socid, 1); + + print '
'; + } + print '
'; + } } } From 7e8cd565f482fcc7e58fa64f67fe4107c63b21cc Mon Sep 17 00:00:00 2001 From: VESSILLER Date: Thu, 7 May 2020 14:35:04 +0200 Subject: [PATCH 089/158] NEW not show linked table on add message action --- htdocs/ticket/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/ticket/card.php b/htdocs/ticket/card.php index 3d37c46eb90..7d5ab5fe228 100644 --- a/htdocs/ticket/card.php +++ b/htdocs/ticket/card.php @@ -1324,7 +1324,7 @@ if (empty($action) || $action == 'view' || $action == 'addlink' || $action == 'd show_ticket_messaging($conf, $langs, $db, $object, null, 0, $actioncode, '', $filters, $sortfield, $sortorder); } - if ($action != 'presend' && $action != 'presend_addmessage') { + if ($action != 'presend' && $action != 'presend_addmessage' && $action != 'add_message') { print '
'; print ''; // ancre From dd1d29f983c4625b4866fb1c61a80f1907cf5f54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Thu, 7 May 2020 15:37:32 +0200 Subject: [PATCH 090/158] add some substitutions for date datetime --- htdocs/core/lib/functions.lib.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 1a4ab00b7d6..c3da7d0ade4 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -6358,6 +6358,17 @@ function getCommonSubstitutionArray($outputlangs, $onlykey = 0, $exclude = null, { foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $label) { $substitutionarray['__EXTRAFIELD_'.strtoupper($key).'__'] = $object->array_options['options_'.$key]; + if ($extrafields->attribute_type[$key] == 'date') { + $substitutionarray['__EXTRAFIELD_' . strtoupper($key) . '__'] = dol_print_date($object->array_options['options_' . $key], 'day'); + $substitutionarray['__EXTRAFIELD_' . strtoupper($key) . '_LOCALE__'] = dol_print_date($object->array_options['options_' . $key], 'day', 'tzserver', $outputlangs); + $substitutionarray['__EXTRAFIELD_' . strtoupper($key) . '_RFC__'] = dol_print_date($object->array_options['options_' . $key],'dayrfc'); + } elseif ($extrafields->attribute_type[$key] == 'datetime') { + $datetime = $object->array_options['options_'.$key]; + $substitutionarray['__EXTRAFIELD_' . strtoupper($key) . '__'] = ($datetime!="0000-00-00 00:00:00" ? dol_print_date($datetime,'dayhour') : ''); + $substitutionarray['__EXTRAFIELD_' . strtoupper($key) . '_LOCALE__'] = ($datetime!="0000-00-00 00:00:00" ? dol_print_date($datetime, 'dayhour', 'tzserver', $outputlangs) : ''); + $substitutionarray['__EXTRAFIELD_' . strtoupper($key) . '_DAY_LOCALE__'] = ($datetime != "0000-00-00 00:00:00" ? dol_print_date($datetime, 'day', 'tzserver', $outputlangs) : ''); + $substitutionarray['__EXTRAFIELD_' . strtoupper($key) . '_RFC__'] = ($datetime != "0000-00-00 00:00:00" ? dol_print_date($datetime, 'dayhourrfc') : ''); + } } } } From c28e6630bb9bf6fe4a3020e01f8fbb640ce2347f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Thu, 7 May 2020 15:41:21 +0200 Subject: [PATCH 091/158] Update functions.lib.php --- htdocs/core/lib/functions.lib.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index c3da7d0ade4..43cee63c1ed 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -6361,11 +6361,11 @@ function getCommonSubstitutionArray($outputlangs, $onlykey = 0, $exclude = null, if ($extrafields->attribute_type[$key] == 'date') { $substitutionarray['__EXTRAFIELD_' . strtoupper($key) . '__'] = dol_print_date($object->array_options['options_' . $key], 'day'); $substitutionarray['__EXTRAFIELD_' . strtoupper($key) . '_LOCALE__'] = dol_print_date($object->array_options['options_' . $key], 'day', 'tzserver', $outputlangs); - $substitutionarray['__EXTRAFIELD_' . strtoupper($key) . '_RFC__'] = dol_print_date($object->array_options['options_' . $key],'dayrfc'); + $substitutionarray['__EXTRAFIELD_' . strtoupper($key) . '_RFC__'] = dol_print_date($object->array_options['options_' . $key], 'dayrfc'); } elseif ($extrafields->attribute_type[$key] == 'datetime') { $datetime = $object->array_options['options_'.$key]; - $substitutionarray['__EXTRAFIELD_' . strtoupper($key) . '__'] = ($datetime!="0000-00-00 00:00:00" ? dol_print_date($datetime,'dayhour') : ''); - $substitutionarray['__EXTRAFIELD_' . strtoupper($key) . '_LOCALE__'] = ($datetime!="0000-00-00 00:00:00" ? dol_print_date($datetime, 'dayhour', 'tzserver', $outputlangs) : ''); + $substitutionarray['__EXTRAFIELD_' . strtoupper($key) . '__'] = ($datetime != "0000-00-00 00:00:00" ? dol_print_date($datetime, 'dayhour') : ''); + $substitutionarray['__EXTRAFIELD_' . strtoupper($key) . '_LOCALE__'] = ($datetime != "0000-00-00 00:00:00" ? dol_print_date($datetime, 'dayhour', 'tzserver', $outputlangs) : ''); $substitutionarray['__EXTRAFIELD_' . strtoupper($key) . '_DAY_LOCALE__'] = ($datetime != "0000-00-00 00:00:00" ? dol_print_date($datetime, 'day', 'tzserver', $outputlangs) : ''); $substitutionarray['__EXTRAFIELD_' . strtoupper($key) . '_RFC__'] = ($datetime != "0000-00-00 00:00:00" ? dol_print_date($datetime, 'dayhourrfc') : ''); } From 0cd05887ce95de5496924a941a92f31155a0ed2e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 7 May 2020 17:21:27 +0200 Subject: [PATCH 092/158] FIX count of open day when date and start are not open should be 0 --- htdocs/core/lib/date.lib.php | 10 +++++++++- htdocs/holiday/card.php | 4 +++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/htdocs/core/lib/date.lib.php b/htdocs/core/lib/date.lib.php index 123e3297f11..56dfee3988c 100644 --- a/htdocs/core/lib/date.lib.php +++ b/htdocs/core/lib/date.lib.php @@ -896,15 +896,23 @@ function num_open_day($timestampStart, $timestampEnd, $inhour = 0, $lastday = 0, if ($timestampStart < $timestampEnd) { $numdays = num_between_day($timestampStart, $timestampEnd, $lastday); + $numholidays = num_public_holiday($timestampStart, $timestampEnd, $country_code, $lastday); $nbOpenDay = $numdays - $numholidays; - $nbOpenDay.= " " . $langs->trans("Days"); + $nbOpenDay.= ' '.$langs->trans("Days"); if ($inhour == 1 && $nbOpenDay <= 3) $nbOpenDay = $nbOpenDay*24 . $langs->trans("HourShort"); return $nbOpenDay - (($inhour == 1 ? 12 : 0.5) * abs($halfday)); } elseif ($timestampStart == $timestampEnd) { + $numholidays = 0; + if ($lastday) { + $numholidays = num_public_holiday($timestampStart, $timestampEnd, $country_code, $lastday); + if ($numholidays == 1) return 0; + } + $nbOpenDay=$lastday; + if ($inhour == 1) $nbOpenDay = $nbOpenDay*24 . $langs->trans("HourShort"); return $nbOpenDay - (($inhour == 1 ? 12 : 0.5) * abs($halfday)); } diff --git a/htdocs/holiday/card.php b/htdocs/holiday/card.php index 9cc287cd28a..6dd218255e5 100644 --- a/htdocs/holiday/card.php +++ b/htdocs/holiday/card.php @@ -1291,7 +1291,9 @@ else if ($includesunday) $htmlhelp.='
'.$langs->trans("DayIsANonWorkingDay", $langs->trans("Sunday")); print $form->textwithpicto($langs->trans('NbUseDaysCP'), $htmlhelp); print '
'.num_open_day($object->date_debut_gmt, $object->date_fin_gmt, 0, 1, $object->halfday).''; + print num_open_day($object->date_debut_gmt, $object->date_fin_gmt, 0, 1, $object->halfday); + print '
'; + $actioncomm = $actionstatic; + // TODO Code common with code into showactions + $imgpicto = ''; if (!empty($conf->global->AGENDA_USE_EVENT_TYPE)) { - if ($actionstatic->type_picto) print img_picto('', $actionstatic->type_picto); - else { - if ($actionstatic->type_code == 'AC_RDV') print img_picto('', 'object_group', '', false, 0, 0, '', '').' '; - elseif ($actionstatic->type_code == 'AC_TEL') print img_picto('', 'object_phoning', '', false, 0, 0, '', '').' '; - elseif ($actionstatic->type_code == 'AC_FAX') print img_picto('', 'object_phoning_fax', '', false, 0, 0, '', '').' '; - elseif ($actionstatic->type_code == 'AC_EMAIL') print img_picto('', 'object_email', '', false, 0, 0, '', '').' '; - elseif ($actionstatic->type_code == 'AC_INT') print img_picto('', 'object_intervention', '', false, 0, 0, '', '').' '; - elseif (!preg_match('/_AUTO/', $actionstatic->type_code)) print img_picto('', 'object_other', '', false, 0, 0, '', '').' '; - } + if ($actioncomm->type_picto) { + $imgpicto = img_picto('', $actioncomm->type_picto); + } + else { + if ($actioncomm->type_code == 'AC_RDV') $imgpicto = img_picto('', 'object_group', '', false, 0, 0, '', 'paddingright').' '; + elseif ($actioncomm->type_code == 'AC_TEL') $imgpicto = img_picto('', 'object_phoning', '', false, 0, 0, '', 'paddingright').' '; + elseif ($actioncomm->type_code == 'AC_FAX') $imgpicto = img_picto('', 'object_phoning_fax', '', false, 0, 0, '', 'paddingright').' '; + elseif ($actioncomm->type_code == 'AC_EMAIL') $imgpicto = img_picto('', 'object_email', '', false, 0, 0, '', 'paddingright').' '; + elseif ($actioncomm->type_code == 'AC_INT') $imgpicto = img_picto('', 'object_intervention', '', false, 0, 0, '', 'paddingright').' '; + elseif ($actioncomm->type_code == 'AC_OTH' && $actioncomm->code == 'TICKET_MSG') $imgpicto = img_picto('', 'object_conversation', '', false, 0, 0, '', 'paddingright').' '; + elseif (!preg_match('/_AUTO/', $actioncomm->type_code)) $imgpicto = img_picto('', 'object_other', '', false, 0, 0, '', 'paddingright').' '; + } } + print $imgpicto; + $labeltype = $obj->type_code; if (empty($conf->global->AGENDA_USE_EVENT_TYPE) && empty($arraylist[$labeltype])) $labeltype = 'AC_OTH'; - if (!empty($arraylist[$labeltype])) $labeltype = $arraylist[$labeltype]; + if ($actioncomm->type_code == 'AC_OTH' && $actioncomm->code == 'TICKET_MSG') { + $labeltype = $langs->trans("Message"); + } elseif (!empty($arraylist[$labeltype])) $labeltype = $arraylist[$labeltype]; print dol_trunc($labeltype, 28); print '
'.$ref.''; - if (!empty($action->userownerid)) + if (!empty($actioncomm->userownerid)) { - if (is_object($cacheusers[$action->userownerid])) + if (is_object($cacheusers[$actioncomm->userownerid])) { - $tmpuser = $cacheusers[$action->userownerid]; + $tmpuser = $cacheusers[$actioncomm->userownerid]; } else { $tmpuser = new User($this->db); - $tmpuser->fetch($action->userownerid); - $cacheusers[$action->userownerid] = $tmpuser; + $tmpuser->fetch($actioncomm->userownerid); + $cacheusers[$actioncomm->userownerid] = $tmpuser; } if ($tmpuser->id > 0) { @@ -260,41 +260,50 @@ class FormActions } } print ''; + // TODO Code common with code into comm/action/list.php $imgpicto = ''; if (!empty($conf->global->AGENDA_USE_EVENT_TYPE)) { - if ($action->type_picto) $imgpicto = img_picto('', $action->type_picto); + if ($actioncomm->type_picto) { + $imgpicto = img_picto('', $actioncomm->type_picto); + } else { - if ($action->type_code == 'AC_RDV') $imgpicto = img_picto('', 'object_group', '', false, 0, 0, '', 'paddingright').' '; - elseif ($action->type_code == 'AC_TEL') $imgpicto = img_picto('', 'object_phoning', '', false, 0, 0, '', 'paddingright').' '; - elseif ($action->type_code == 'AC_FAX') $imgpicto = img_picto('', 'object_phoning_fax', '', false, 0, 0, '', 'paddingright').' '; - elseif ($action->type_code == 'AC_EMAIL') $imgpicto = img_picto('', 'object_email', '', false, 0, 0, '', 'paddingright').' '; - elseif ($action->type_code == 'AC_INT') $imgpicto = img_picto('', 'object_intervention', '', false, 0, 0, '', 'paddingright').' '; - elseif (!preg_match('/_AUTO/', $action->type_code)) $imgpicto = img_picto('', 'object_action', '', false, 0, 0, '', 'paddingright').' '; + if ($actioncomm->type_code == 'AC_RDV') $imgpicto = img_picto('', 'object_group', '', false, 0, 0, '', 'paddingright').' '; + elseif ($actioncomm->type_code == 'AC_TEL') $imgpicto = img_picto('', 'object_phoning', '', false, 0, 0, '', 'paddingright').' '; + elseif ($actioncomm->type_code == 'AC_FAX') $imgpicto = img_picto('', 'object_phoning_fax', '', false, 0, 0, '', 'paddingright').' '; + elseif ($actioncomm->type_code == 'AC_EMAIL') $imgpicto = img_picto('', 'object_email', '', false, 0, 0, '', 'paddingright').' '; + elseif ($actioncomm->type_code == 'AC_INT') $imgpicto = img_picto('', 'object_intervention', '', false, 0, 0, '', 'paddingright').' '; + elseif ($actioncomm->type_code == 'AC_OTH' && $actioncomm->code == 'TICKET_MSG') $imgpicto = img_picto('', 'object_conversation', '', false, 0, 0, '', 'paddingright').' '; + elseif (!preg_match('/_AUTO/', $actioncomm->type_code)) $imgpicto = img_picto('', 'object_action', '', false, 0, 0, '', 'paddingright').' '; } } print $imgpicto; - print $action->type_short ? $action->type_short : $action->type; + if ($actioncomm->type_code == 'AC_OTH' && $actioncomm->code == 'TICKET_MSG') { + print $langs->trans("Message"); + } else { + print $actioncomm->type_short ? $actioncomm->type_short : $actioncomm->type; + } print ''.$label.''.dol_print_date($action->datep, 'dayhour', 'tzuserrel'); - if ($action->datef) + print ''.dol_print_date($actioncomm->datep, 'dayhour', 'tzuserrel'); + if ($actioncomm->datef) { - $tmpa = dol_getdate($action->datep); - $tmpb = dol_getdate($action->datef); + $tmpa = dol_getdate($actioncomm->datep); + $tmpb = dol_getdate($actioncomm->datef); if ($tmpa['mday'] == $tmpb['mday'] && $tmpa['mon'] == $tmpb['mon'] && $tmpa['year'] == $tmpb['year']) { - if ($tmpa['hours'] != $tmpb['hours'] || $tmpa['minutes'] != $tmpb['minutes'] && $tmpa['seconds'] != $tmpb['seconds']) print '-'.dol_print_date($action->datef, 'hour', 'tzuserrel'); + if ($tmpa['hours'] != $tmpb['hours'] || $tmpa['minutes'] != $tmpb['minutes'] && $tmpa['seconds'] != $tmpb['seconds']) print '-'.dol_print_date($actioncomm->datef, 'hour', 'tzuserrel'); } - else print '-'.dol_print_date($action->datef, 'dayhour', 'tzuserrel'); + else print '-'.dol_print_date($actioncomm->datef, 'dayhour', 'tzuserrel'); } print ''; - print $action->getLibStatut(3); + print $actioncomm->getLibStatut(3); print '
'; - print dol_print_date($arraymsgs['datec'], 'dayhour'); + print img_picto('', 'actioncomm', 'class="paddingright"').dol_print_date($arraymsgs['datec'], 'dayhour'); print ''; diff --git a/htdocs/ticket/class/ticket.class.php b/htdocs/ticket/class/ticket.class.php index f94599153f0..4db98cfe7ad 100644 --- a/htdocs/ticket/class/ticket.class.php +++ b/htdocs/ticket/class/ticket.class.php @@ -1559,7 +1559,7 @@ class Ticket extends CommonObject // Insert entry into agenda with code 'TICKET_MSG' include_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php'; $actioncomm = new ActionComm($this->db); - $actioncomm->type_code = 'AC_OTH_AUTO'; + $actioncomm->type_code = 'AC_OTH'; $actioncomm->code = 'TICKET_MSG'; if ($this->private) { $actioncomm->code = 'TICKET_MSG_PRIVATE'; From dca3f3b31f2075c4a65056a0d5ca0dfe5941615b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 7 May 2020 22:59:40 +0200 Subject: [PATCH 096/158] Look adn feel v12 --- htdocs/ticket/class/actions_ticket.class.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/htdocs/ticket/class/actions_ticket.class.php b/htdocs/ticket/class/actions_ticket.class.php index 9931b12ffa2..147f6228005 100644 --- a/htdocs/ticket/class/actions_ticket.class.php +++ b/htdocs/ticket/class/actions_ticket.class.php @@ -380,8 +380,7 @@ class ActionsTicket global $langs; print '
'; - print '
'; - print '
'; + print '
'; // Exclude status which requires specific method $exclude_status = array(Ticket::STATUS_CLOSED, Ticket::STATUS_CANCELED); // Exclude actual status @@ -392,7 +391,7 @@ class ActionsTicket foreach ($object->statuts_short as $status => $status_label) { if (!in_array($status, $exclude_status)) { - print '
'; + print '
'; if ($status == 1) { @@ -403,13 +402,13 @@ class ActionsTicket $urlforbutton = $_SERVER['PHP_SELF'].'?track_id='.$object->track_id.'&action=set_status&new_status='.$status; } - print ''; + print ''; print img_picto($langs->trans($object->statuts_short[$status]), 'statut'.$status.'.png@ticket').' '.$langs->trans($object->statuts_short[$status]); print ''; print '
'; } } - print '

'; + print '

'; } /** From f23451e1c986143235b7aea6750293b878f0e1f7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 7 May 2020 23:04:52 +0200 Subject: [PATCH 097/158] Update facture.class.php --- htdocs/compta/facture/class/facture.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index ffa96fe5237..fd6a6d32642 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -1180,7 +1180,7 @@ class Facture extends CommonInvoice } // Bloc to update dates of service (month by month only if previously filled at 1d near start or end of month) // If it's a service with start and end dates - if ($line->product_type == 1 && !empty($line->date_start) && !empty($line->date_end) ) { + if (!empty($line->date_start) && !empty($line->date_end) ) { // Get the dates $start = dol_getdate($line->date_start); $end = dol_getdate($line->date_end); From 830a117aa7ae799cd93021b68408aa177b733cc4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 7 May 2020 23:39:03 +0200 Subject: [PATCH 098/158] Suggest fix for #13824 --- htdocs/bom/class/bom.class.php | 5 ++++- htdocs/takepos/admin/bar.php | 2 +- htdocs/takepos/admin/setup.php | 2 +- htdocs/takepos/genimg/qr.php | 2 +- htdocs/takepos/phone.php | 8 ++++---- htdocs/takepos/public/auto_order.php | 6 +++++- 6 files changed, 16 insertions(+), 9 deletions(-) diff --git a/htdocs/bom/class/bom.class.php b/htdocs/bom/class/bom.class.php index c2c18dae6e5..3e522b3c11f 100644 --- a/htdocs/bom/class/bom.class.php +++ b/htdocs/bom/class/bom.class.php @@ -1004,6 +1004,7 @@ class BOM extends CommonObject /** * BOM costs calculation based on cost_price or pmp of each BOM line + * * @return void */ public function calculateCosts() @@ -1022,7 +1023,9 @@ class BOM extends CommonObject } $this->total_cost = price2num($this->total_cost, 'MT'); - $this->unit_cost = price2num($this->total_cost / $this->qty, 'MU'); + if ($this->qty) { + $this->unit_cost = price2num($this->total_cost / $this->qty, 'MU'); + } } } diff --git a/htdocs/takepos/admin/bar.php b/htdocs/takepos/admin/bar.php index 7b6e1d9a98c..5c255dc89c7 100644 --- a/htdocs/takepos/admin/bar.php +++ b/htdocs/takepos/admin/bar.php @@ -157,7 +157,7 @@ if ($conf->global->TAKEPOS_AUTO_ORDER) print '
'; print "".$urlwithroot."/takepos/public/auto_order.php?key=".dol_encode($row['rowid']).""; print ''; - print ""; + print ""; print '
'; print $form->textwithpicto($langs->trans("RootCategoryForProductsToSell"), $langs->trans("RootCategoryForProductsToSellDesc")); print ''; -print $form->select_all_categories(Categorie::TYPE_PRODUCT, $conf->global->TAKEPOS_ROOT_CATEGORY_ID, 'TAKEPOS_ROOT_CATEGORY_ID', 64, 0, 0); +print img_object('', 'category', 'class="paddingright"').$form->select_all_categories(Categorie::TYPE_PRODUCT, $conf->global->TAKEPOS_ROOT_CATEGORY_ID, 'TAKEPOS_ROOT_CATEGORY_ID', 64, 0, 0); print ajax_combobox('TAKEPOS_ROOT_CATEGORY_ID'); print "
'; - print img_picto('', 'actioncomm', 'class="paddingright"').dol_print_date($arraymsgs['datec'], 'dayhour'); + print img_picto('', 'object_action', 'class="paddingright"').dol_print_date($arraymsgs['datec'], 'dayhour'); print ''; From d9a0edcf2b83aa9e9f6e35fefa8e740f1c36ab14 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Fri, 8 May 2020 00:01:56 +0200 Subject: [PATCH 100/158] FIX missing file manifest.json.php --- htdocs/theme/md/manifest.json.php | 57 +++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 htdocs/theme/md/manifest.json.php diff --git a/htdocs/theme/md/manifest.json.php b/htdocs/theme/md/manifest.json.php new file mode 100644 index 00000000000..f8d059752a6 --- /dev/null +++ b/htdocs/theme/md/manifest.json.php @@ -0,0 +1,57 @@ + + * Copyright (C) 2006 Rodolphe Quiedeville + * Copyright (C) 2007-2017 Regis Houssin + * Copyright (C) 2011 Philippe Grand + * Copyright (C) 2012 Juanjo Menent + * Copyright (C) 2018 Ferran Marcet + * + * 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 FI8TNESS 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/theme/md/manifest.json.php + * \brief File for The Web App + */ + +if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); +if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); +if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); +if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1'); +if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK', '1'); +if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); +if (! defined('NOLOGIN')) define('NOLOGIN', '1'); +if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); +if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); +if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); + +require_once __DIR__.'/../../main.inc.php'; + +$appli=constant('DOL_APPLICATION_TITLE'); +if (!empty($conf->global->MAIN_APPLICATION_TITLE)) $appli=$conf->global->MAIN_APPLICATION_TITLE; + +?> +{ + "name": "", + "icons": [ + { + "src": "", + "sizes": "256x256", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} \ No newline at end of file From 1a9afe6b203b1224ae0e4a641dcefe3c2073eb0a Mon Sep 17 00:00:00 2001 From: Maxime Kohlhaas Date: Fri, 8 May 2020 01:40:25 +0200 Subject: [PATCH 101/158] Fix missing hook params for printFieldListValue --- htdocs/accountancy/bookkeeping/list.php | 2 +- htdocs/adherents/list.php | 2 +- htdocs/adherents/subscription/list.php | 2 +- htdocs/admin/emailcollector_list.php | 2 +- htdocs/asset/list.php | 2 +- htdocs/comm/action/list.php | 2 +- htdocs/comm/propal/list.php | 2 +- htdocs/commande/list.php | 2 +- htdocs/compta/bank/list.php | 2 +- htdocs/compta/cashcontrol/cashcontrol_list.php | 2 +- htdocs/compta/facture/list.php | 2 +- htdocs/contact/list.php | 2 +- htdocs/contrat/list.php | 2 +- htdocs/contrat/services_list.php | 2 +- htdocs/expedition/list.php | 2 +- htdocs/expensereport/list.php | 2 +- htdocs/fichinter/list.php | 2 +- htdocs/fourn/facture/list.php | 2 +- htdocs/holiday/list.php | 2 +- htdocs/product/list.php | 2 +- htdocs/product/stock/list.php | 2 +- htdocs/product/stock/productlot_list.php | 2 +- htdocs/projet/list.php | 2 +- htdocs/projet/tasks/list.php | 2 +- htdocs/projet/tasks/time.php | 2 +- htdocs/reception/list.php | 2 +- htdocs/societe/list.php | 2 +- htdocs/societe/website.php | 2 +- htdocs/supplier_proposal/list.php | 2 +- htdocs/ticket/list.php | 2 +- htdocs/user/list.php | 2 +- htdocs/zapier/hook_list.php | 2 +- 32 files changed, 32 insertions(+), 32 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php index d8fe9975da5..129fedf3867 100644 --- a/htdocs/accountancy/bookkeeping/list.php +++ b/htdocs/accountancy/bookkeeping/list.php @@ -966,7 +966,7 @@ while ($i < min($num, $limit)) } // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; diff --git a/htdocs/adherents/list.php b/htdocs/adherents/list.php index c9b7ee42fcf..838e7cd9a5c 100644 --- a/htdocs/adherents/list.php +++ b/htdocs/adherents/list.php @@ -872,7 +872,7 @@ while ($i < min($num, $limit)) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Date creation diff --git a/htdocs/adherents/subscription/list.php b/htdocs/adherents/subscription/list.php index a582584ae7f..fa47d01cd41 100644 --- a/htdocs/adherents/subscription/list.php +++ b/htdocs/adherents/subscription/list.php @@ -524,7 +524,7 @@ while ($i < min($num, $limit)) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Date creation diff --git a/htdocs/admin/emailcollector_list.php b/htdocs/admin/emailcollector_list.php index 53d9fd8d1f1..9c76c176414 100644 --- a/htdocs/admin/emailcollector_list.php +++ b/htdocs/admin/emailcollector_list.php @@ -479,7 +479,7 @@ while ($i < min($num, $limit)) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Action column diff --git a/htdocs/asset/list.php b/htdocs/asset/list.php index fb8c4066a10..ae307bf1a42 100644 --- a/htdocs/asset/list.php +++ b/htdocs/asset/list.php @@ -459,7 +459,7 @@ while ($i < min($num, $limit)) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Action column diff --git a/htdocs/comm/action/list.php b/htdocs/comm/action/list.php index 95a3e6dbe09..410d31fb07e 100644 --- a/htdocs/comm/action/list.php +++ b/htdocs/comm/action/list.php @@ -718,7 +718,7 @@ if ($resql) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php index dcc9c7a54c7..eaeea9e3d43 100644 --- a/htdocs/comm/propal/list.php +++ b/htdocs/comm/propal/list.php @@ -1065,7 +1065,7 @@ if ($resql) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i); + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Date creation diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index e2b6aa06136..8a023cf7e80 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -1075,7 +1075,7 @@ if ($resql) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i); + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Date creation diff --git a/htdocs/compta/bank/list.php b/htdocs/compta/bank/list.php index e0d7f7d5c29..ac2caaf94eb 100644 --- a/htdocs/compta/bank/list.php +++ b/htdocs/compta/bank/list.php @@ -529,7 +529,7 @@ foreach ($accounts as $key=>$type) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters=array('arrayfields'=>$arrayfields); + $parameters=array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook=$hookmanager->executeHooks('printFieldListValue', $parameters, $objecttmp); // Note that $action and $objecttmpect may have been modified by hook print $hookmanager->resPrint; // Date creation diff --git a/htdocs/compta/cashcontrol/cashcontrol_list.php b/htdocs/compta/cashcontrol/cashcontrol_list.php index 6c59276d600..c13528224c4 100644 --- a/htdocs/compta/cashcontrol/cashcontrol_list.php +++ b/htdocs/compta/cashcontrol/cashcontrol_list.php @@ -496,7 +496,7 @@ while ($i < min($num, $limit)) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Action column diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index f5ab943d831..c3bfe93bf30 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -1313,7 +1313,7 @@ if ($resql) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i); + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Date creation diff --git a/htdocs/contact/list.php b/htdocs/contact/list.php index 9903e37cd5e..d51399d21a9 100644 --- a/htdocs/contact/list.php +++ b/htdocs/contact/list.php @@ -936,7 +936,7 @@ while ($i < min($num, $limit)) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Date creation diff --git a/htdocs/contrat/list.php b/htdocs/contrat/list.php index c32e45c1b42..857f9609d36 100644 --- a/htdocs/contrat/list.php +++ b/htdocs/contrat/list.php @@ -744,7 +744,7 @@ while ($i < min($num, $limit)) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Date creation diff --git a/htdocs/contrat/services_list.php b/htdocs/contrat/services_list.php index 29501ddee88..85579d65980 100644 --- a/htdocs/contrat/services_list.php +++ b/htdocs/contrat/services_list.php @@ -687,7 +687,7 @@ while ($i < min($num, $limit)) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters=array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters=array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook=$hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Date creation diff --git a/htdocs/expedition/list.php b/htdocs/expedition/list.php index d5cda3e2ebb..c3db317c9de 100644 --- a/htdocs/expedition/list.php +++ b/htdocs/expedition/list.php @@ -591,7 +591,7 @@ if ($resql) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Date creation diff --git a/htdocs/expensereport/list.php b/htdocs/expensereport/list.php index 5604ee77dc3..7f5e86d9c98 100644 --- a/htdocs/expensereport/list.php +++ b/htdocs/expensereport/list.php @@ -761,7 +761,7 @@ if ($resql) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters=array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters=array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook=$hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; diff --git a/htdocs/fichinter/list.php b/htdocs/fichinter/list.php index 03000bdb44d..fd45d2daecb 100644 --- a/htdocs/fichinter/list.php +++ b/htdocs/fichinter/list.php @@ -562,7 +562,7 @@ if ($resql) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters=array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters=array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook=$hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Date creation diff --git a/htdocs/fourn/facture/list.php b/htdocs/fourn/facture/list.php index b895bf63513..ddb2ce853b1 100644 --- a/htdocs/fourn/facture/list.php +++ b/htdocs/fourn/facture/list.php @@ -1058,7 +1058,7 @@ if ($resql) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Date creation diff --git a/htdocs/holiday/list.php b/htdocs/holiday/list.php index 2277563aaa0..18df214f4c6 100644 --- a/htdocs/holiday/list.php +++ b/htdocs/holiday/list.php @@ -744,7 +744,7 @@ if ($resql) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters=array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters=array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook=$hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; diff --git a/htdocs/product/list.php b/htdocs/product/list.php index ce3f8f1cd81..cc12bc73349 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -1148,7 +1148,7 @@ if ($resql) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Date creation diff --git a/htdocs/product/stock/list.php b/htdocs/product/stock/list.php index e4ad265c793..057735c49cc 100644 --- a/htdocs/product/stock/list.php +++ b/htdocs/product/stock/list.php @@ -571,7 +571,7 @@ if ($num) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; diff --git a/htdocs/product/stock/productlot_list.php b/htdocs/product/stock/productlot_list.php index 527afee2607..154ede71956 100644 --- a/htdocs/product/stock/productlot_list.php +++ b/htdocs/product/stock/productlot_list.php @@ -476,7 +476,7 @@ if ($resql) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Date creation diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index 650c14c5ee2..f3a8900a148 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -895,7 +895,7 @@ while ($i < min($num, $limit)) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Date creation diff --git a/htdocs/projet/tasks/list.php b/htdocs/projet/tasks/list.php index 3fd85f4082e..7d995965294 100644 --- a/htdocs/projet/tasks/list.php +++ b/htdocs/projet/tasks/list.php @@ -836,7 +836,7 @@ while ($i < min($num, $limit)) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters=array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters=array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook=$hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Date creation diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index f9069f7efa7..3a5e3c89ae3 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -1332,7 +1332,7 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0) */ // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$task_time); + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$task_time, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; diff --git a/htdocs/reception/list.php b/htdocs/reception/list.php index fea2662b93f..7566edfc610 100644 --- a/htdocs/reception/list.php +++ b/htdocs/reception/list.php @@ -885,7 +885,7 @@ if ($resql) include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Date creation diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php index e480d68eca4..4e033e5f35e 100644 --- a/htdocs/societe/list.php +++ b/htdocs/societe/list.php @@ -1279,7 +1279,7 @@ while ($i < min($num, $limit)) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Date creation diff --git a/htdocs/societe/website.php b/htdocs/societe/website.php index 5d248ec16fd..d5e89459771 100644 --- a/htdocs/societe/website.php +++ b/htdocs/societe/website.php @@ -481,7 +481,7 @@ while ($i < min($num, $limit)) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $objectwebsiteaccount); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Action column diff --git a/htdocs/supplier_proposal/list.php b/htdocs/supplier_proposal/list.php index a133d781337..91ef70c7b94 100644 --- a/htdocs/supplier_proposal/list.php +++ b/htdocs/supplier_proposal/list.php @@ -779,7 +779,7 @@ if ($resql) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters=array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters=array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook=$hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Date creation diff --git a/htdocs/ticket/list.php b/htdocs/ticket/list.php index 8d76ef5c5eb..08419e5c46d 100644 --- a/htdocs/ticket/list.php +++ b/htdocs/ticket/list.php @@ -669,7 +669,7 @@ while ($i < min($num, $limit)) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Action column diff --git a/htdocs/user/list.php b/htdocs/user/list.php index eb14f61e982..1ceec68a622 100644 --- a/htdocs/user/list.php +++ b/htdocs/user/list.php @@ -655,7 +655,7 @@ while ($i < min($num, $limit)) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters=array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters=array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook=$hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Date creation diff --git a/htdocs/zapier/hook_list.php b/htdocs/zapier/hook_list.php index 56a68ad7300..dbd9239e752 100644 --- a/htdocs/zapier/hook_list.php +++ b/htdocs/zapier/hook_list.php @@ -519,7 +519,7 @@ while ($i < min($num, $limit)) { // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Action column From 42ee755ea5189842673d8d1f374efef088404bfe Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 8 May 2020 02:52:55 +0200 Subject: [PATCH 102/158] Look and feel v12 --- htdocs/admin/translation.php | 10 +++++----- htdocs/comm/action/list.php | 4 ++-- htdocs/core/lib/agenda.lib.php | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/htdocs/admin/translation.php b/htdocs/admin/translation.php index 520cee44913..c17c2bdcee6 100644 --- a/htdocs/admin/translation.php +++ b/htdocs/admin/translation.php @@ -365,9 +365,9 @@ if ($mode == 'overwrite') } else { - print ''.img_edit().''; + print ''.img_edit().''; print '   '; - print ''.img_delete().''; + print ''.img_delete().''; } print ''; + print ''; print dol_print_date($db->jdate($obj->dp), $formatToUse); $late = 0; if ($obj->percent == 0 && $obj->dp && $db->jdate($obj->dp) < ($now - $delay_warning)) $late = 1; @@ -638,7 +638,7 @@ if ($resql) // End date if (!empty($arrayfields['a.datep2']['checked'])) { - print ''; + print ''; print dol_print_date($db->jdate($obj->dp2), $formatToUse); print ''; print img_picto('', 'company'); - print $form->select_company($socid, 'search_socid', '', 'SelectThirdParty', 0, 0, null, 0); + print $form->select_company($socid, 'search_socid', '', ' ', 0, 0, null, 0); print '
'; print ''; -print ''; +print ''; print "\n"; if ($conf->global->TAKEPOS_BAR_RESTAURANT && $conf->global->TAKEPOS_PRINT_METHOD != "browser") { From e55d9ed3b89c8f9e477e523e856419f8e8a62765 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 8 May 2020 03:02:53 +0200 Subject: [PATCH 104/158] Trans --- htdocs/langs/en_US/cashdesk.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/cashdesk.lang b/htdocs/langs/en_US/cashdesk.lang index b22a7b83166..52c2004c1c7 100644 --- a/htdocs/langs/en_US/cashdesk.lang +++ b/htdocs/langs/en_US/cashdesk.lang @@ -95,7 +95,7 @@ PrintMethod=Print method ReceiptPrinterMethodDescription=Powerful method with a lot of parameters. Full customizable with templates. Cannot print from the cloud. ByTerminal=By terminal TakeposNumpadUsePaymentIcon=Use payment icon on numpad -CashDeskRefNumberingModules=Numbering module for cash desk +CashDeskRefNumberingModules=Numbering module for POS sales CashDeskGenericMaskCodes6 =
{TN} tag is used to add the terminal number TakeposGroupSameProduct=Group same products lines StartAParallelSale=Start a new parallel sale From a49635a825360a8cb92acecb92dae14d389693b0 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Fri, 8 May 2020 07:45:01 +0200 Subject: [PATCH 105/158] NEW Bookkeeping by account - Add selectfields & hook --- .../accountancy/bookkeeping/listbyaccount.php | 453 ++++++++++++------ 1 file changed, 318 insertions(+), 135 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/listbyaccount.php b/htdocs/accountancy/bookkeeping/listbyaccount.php index 78f29e97595..582e54442a5 100644 --- a/htdocs/accountancy/bookkeeping/listbyaccount.php +++ b/htdocs/accountancy/bookkeeping/listbyaccount.php @@ -70,6 +70,13 @@ $pagenext = $page + 1; if ($sortorder == "") $sortorder = "ASC"; if ($sortfield == "") $sortfield = "t.doc_date,t.rowid"; +// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context +$object = new BookKeeping($db); +$hookmanager->initHooks(array('bookkeepingbyaccountlist')); + +$formaccounting = new FormAccounting($db); +$form = new Form($db); + if (empty($search_date_start) && empty($search_date_end) && GETPOSTISSET('search_date_startday') && GETPOSTISSET('search_date_startmonth') && GETPOSTISSET('search_date_starthour')) { $sql = "SELECT date_start, date_end from ".MAIN_DB_PREFIX."accounting_fiscalyear "; $sql .= " where date_start < '".$db->idate(dol_now())."' and date_end > '".$db->idate(dol_now())."'"; @@ -96,87 +103,112 @@ if (empty($search_date_start) && empty($search_date_end) && GETPOSTISSET('search } } +$arrayfields = array( + // 't.subledger_account'=>array('label'=>$langs->trans("SubledgerAccount"), 'checked'=>1), + 't.piece_num'=>array('label'=>$langs->trans("TransactionNumShort"), 'checked'=>1), + 't.doc_date'=>array('label'=>$langs->trans("Docdate"), 'checked'=>1), + 't.doc_ref'=>array('label'=>$langs->trans("Piece"), 'checked'=>1), + 't.label_operation'=>array('label'=>$langs->trans("Label"), 'checked'=>1), + 't.debit'=>array('label'=>$langs->trans("Debit"), 'checked'=>1), + 't.credit'=>array('label'=>$langs->trans("Credit"), 'checked'=>1), + 't.lettering_code'=>array('label'=>$langs->trans("LetteringCode"), 'checked'=>1), + 't.code_journal'=>array('label'=>$langs->trans("Codejournal"), 'checked'=>1), + // '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), +); + +if (empty($conf->global->ACCOUNTING_ENABLE_LETTERING)) unset($arrayfields['t.lettering_code']); + + $object = new BookKeeping($db); /* * Action */ -if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) // All tests are required to be compatible with all browsers -{ - $search_doc_date = ''; - $search_accountancy_code = ''; - $search_accountancy_code_start = ''; - $search_accountancy_code_end = ''; - $search_label_account = ''; - $search_doc_ref = ''; - $search_label_operation = ''; - $search_direction = ''; - $search_ledger_code = ''; - $search_date_start = ''; - $search_date_end = ''; - $search_date_startyear = ''; - $search_date_startmonth = ''; - $search_date_startday = ''; - $search_date_endyear = ''; - $search_date_endmonth = ''; - $search_date_endday = ''; - $search_debit = ''; - $search_credit = ''; -} +$parameters = array('socid'=>$socid); +$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'); -// Must be after the remove filter action, before the export. -$param = ''; -$filter = array(); +if (empty($reshook)) { + include DOL_DOCUMENT_ROOT . '/core/actions_changeselectedfields.inc.php'; -if (!empty($search_date_start)) { - $filter['t.doc_date>='] = $search_date_start; - $param .= '&search_date_startmonth='.GETPOST('search_date_startmonth', 'int').'&search_date_startday='.GETPOST('search_date_startday', 'int').'&search_date_startyear='.GETPOST('search_date_startyear', 'int'); -} -if (!empty($search_date_end)) { - $filter['t.doc_date<='] = $search_date_end; - $param .= '&search_date_endmonth='.GETPOST('search_date_endmonth', 'int').'&search_date_endday='.GETPOST('search_date_endday', 'int').'&search_date_endyear='.GETPOST('search_date_endyear', 'int'); -} -if (!empty($search_doc_date)) { - $filter['t.doc_date'] = $search_doc_date; - $param .= '&doc_datemonth='.GETPOST('doc_datemonth', 'int').'&doc_dateday='.GETPOST('doc_dateday', 'int').'&doc_dateyear='.GETPOST('doc_dateyear', 'int'); -} -if (!empty($search_accountancy_code_start)) { - $filter['t.numero_compte>='] = $search_accountancy_code_start; - $param .= '&search_accountancy_code_start='.urlencode($search_accountancy_code_start); -} -if (!empty($search_accountancy_code_end)) { - $filter['t.numero_compte<='] = $search_accountancy_code_end; - $param .= '&search_accountancy_code_end='.urlencode($search_accountancy_code_end); -} -if (!empty($search_label_account)) { - $filter['t.label_compte'] = $search_label_account; - $param .= '&search_label_compte='.urlencode($search_label_account); -} -if (!empty($search_doc_ref)) { - $filter['t.doc_ref'] = $search_doc_ref; - $param .= '&search_doc_ref='.urlencode($search_doc_ref); -} -if (!empty($search_label_operation)) { - $filter['t.label_operation'] = $search_label_operation; - $param .= '&search_label_operation='.urlencode($search_label_operation); -} -if (!empty($search_direction)) { - $filter['t.sens'] = $search_direction; - $param .= '&search_direction='.urlencode($search_direction); -} -if (!empty($search_ledger_code)) { - $filter['t.code_journal'] = $search_ledger_code; - $param .= '&search_ledger_code='.urlencode($search_ledger_code); -} -if (!empty($search_debit)) { - $filter['t.debit'] = $search_debit; - $param .= '&search_debit='.urlencode($search_debit); -} -if (!empty($search_credit)) { - $filter['t.credit'] = $search_credit; - $param .= '&search_credit='.urlencode($search_credit); -} + if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) // All tests are required to be compatible with all browsers + { + $search_doc_date = ''; + $search_accountancy_code = ''; + $search_accountancy_code_start = ''; + $search_accountancy_code_end = ''; + $search_label_account = ''; + $search_doc_ref = ''; + $search_label_operation = ''; + $search_direction = ''; + $search_ledger_code = ''; + $search_date_start = ''; + $search_date_end = ''; + $search_date_startyear = ''; + $search_date_startmonth = ''; + $search_date_startday = ''; + $search_date_endyear = ''; + $search_date_endmonth = ''; + $search_date_endday = ''; + $search_debit = ''; + $search_credit = ''; + } + // Must be after the remove filter action, before the export. + $param = ''; + $filter = array(); + + if (!empty($search_date_start)) { + $filter['t.doc_date>='] = $search_date_start; + $param .= '&search_date_startmonth=' . GETPOST('search_date_startmonth', 'int') . '&search_date_startday=' . GETPOST('search_date_startday', 'int') . '&search_date_startyear=' . GETPOST('search_date_startyear', 'int'); + } + if (!empty($search_date_end)) { + $filter['t.doc_date<='] = $search_date_end; + $param .= '&search_date_endmonth=' . GETPOST('search_date_endmonth', 'int') . '&search_date_endday=' . GETPOST('search_date_endday', 'int') . '&search_date_endyear=' . GETPOST('search_date_endyear', 'int'); + } + if (!empty($search_doc_date)) { + $filter['t.doc_date'] = $search_doc_date; + $param .= '&doc_datemonth=' . GETPOST('doc_datemonth', 'int') . '&doc_dateday=' . GETPOST('doc_dateday', 'int') . '&doc_dateyear=' . GETPOST('doc_dateyear', 'int'); + } + if (!empty($search_accountancy_code_start)) { + $filter['t.numero_compte>='] = $search_accountancy_code_start; + $param .= '&search_accountancy_code_start=' . urlencode($search_accountancy_code_start); + } + if (!empty($search_accountancy_code_end)) { + $filter['t.numero_compte<='] = $search_accountancy_code_end; + $param .= '&search_accountancy_code_end=' . urlencode($search_accountancy_code_end); + } + if (!empty($search_label_account)) { + $filter['t.label_compte'] = $search_label_account; + $param .= '&search_label_compte=' . urlencode($search_label_account); + } + if (!empty($search_doc_ref)) { + $filter['t.doc_ref'] = $search_doc_ref; + $param .= '&search_doc_ref=' . urlencode($search_doc_ref); + } + if (!empty($search_label_operation)) { + $filter['t.label_operation'] = $search_label_operation; + $param .= '&search_label_operation=' . urlencode($search_label_operation); + } + if (!empty($search_direction)) { + $filter['t.sens'] = $search_direction; + $param .= '&search_direction=' . urlencode($search_direction); + } + if (!empty($search_ledger_code)) { + $filter['t.code_journal'] = $search_ledger_code; + $param .= '&search_ledger_code=' . urlencode($search_ledger_code); + } + if (!empty($search_debit)) { + $filter['t.debit'] = $search_debit; + $param .= '&search_debit=' . urlencode($search_debit); + } + if (!empty($search_credit)) { + $filter['t.credit'] = $search_credit; + $param .= '&search_credit=' . urlencode($search_credit); + } +} if ($action == 'delmouvconfirm') { $mvt_num = GETPOST('mvt_num', 'int'); @@ -267,14 +299,25 @@ if ($limit > 0 && $limit != $conf->liste_limit) $param .= '&limit='.urlencode($l print_barre_liste($title_page, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $result, $nbtotalofrecords, 'title_accountancy', 0, $viewflat.$newcardbutton, '', $limit); +$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage; +$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields +if ($massactionbutton) $selectedfields .= $form->showCheckAddButtons('checkforselect', 1); + +$parameters = array(); +$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters); // Note that $action and $object may have been modified by hook +if (empty($reshook)) $moreforfilter .= $hookmanager->resPrint; +else $moreforfilter = $hookmanager->resPrint; + // Reverse sort order if (preg_match('/^asc/i', $sortorder)) $sortorder = "asc"; else $sortorder = "desc"; print '
'; -print '
'.$langs->trans("Parameters").''.$langs->trans("Value").''.$langs->trans("Parameters").''.$langs->trans("Value").'
'; +print '
'; -print ''; +// Filters lines +print ''; +// Accountancy account print ''; -print ''; +// Date document +if (!empty($arrayfields['t.doc_date']['checked'])) { + print ''; + print ''; +} +// Ref document +if (!empty($arrayfields['t.doc_ref']['checked'])) { + print ''; +} +// Label operation +if (!empty($arrayfields['t.label_operation']['checked'])) { + print ''; +} +// Debit +if (!empty($arrayfields['t.debit']['checked'])) { + print ''; +} +// Credit +if (!empty($arrayfields['t.credit']['checked'])) { + print ''; +} +// Code journal +if (!empty($arrayfields['t.code_journal']['checked'])) { + print ''; +} + +// Fields from hook +$parameters = array('arrayfields'=>$arrayfields); +$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook +print $hookmanager->resPrint; + +// Action column print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; +print "\n"; print ''; print_liste_field_titre("AccountAccountingShort", $_SERVER['PHP_SELF']); -print_liste_field_titre("TransactionNumShort", $_SERVER['PHP_SELF'], "t.piece_num", "", $param, '', $sortfield, $sortorder, 'right '); -print_liste_field_titre("Docdate", $_SERVER['PHP_SELF'], "t.doc_date", "", $param, '', $sortfield, $sortorder, 'center '); -print_liste_field_titre("Piece", $_SERVER['PHP_SELF'], "t.doc_ref", "", $param, "", $sortfield, $sortorder); -print_liste_field_titre("Label"); -print_liste_field_titre("Debit", $_SERVER['PHP_SELF'], "t.debit", "", $param, '', $sortfield, $sortorder, 'right '); -print_liste_field_titre("Credit", $_SERVER['PHP_SELF'], "t.credit", "", $param, '', $sortfield, $sortorder, 'right '); -print_liste_field_titre("Codejournal", $_SERVER['PHP_SELF'], "t.code_journal", "", $param, '', $sortfield, $sortorder, 'center '); -print_liste_field_titre('', $_SERVER["PHP_SELF"], "", $param, "", 'width="60"', $sortfield, $sortorder, 'center '); +if (!empty($arrayfields['t.piece_num']['checked'])) print_liste_field_titre($arrayfields['t.piece_num']['label'], $_SERVER['PHP_SELF'], "t.piece_num", "", $param, '', $sortfield, $sortorder, 'right '); +if (!empty($arrayfields['t.doc_date']['checked'])) print_liste_field_titre($arrayfields['t.doc_date']['label'], $_SERVER['PHP_SELF'], "t.doc_date", "", $param, '', $sortfield, $sortorder, 'center '); +if (!empty($arrayfields['t.doc_ref']['checked'])) print_liste_field_titre($arrayfields['t.doc_ref']['label'], $_SERVER['PHP_SELF'], "t.doc_ref", "", $param, "", $sortfield, $sortorder); +if (!empty($arrayfields['t.label_operation']['checked'])) print_liste_field_titre($arrayfields['t.label_operation']['label'], $_SERVER['PHP_SELF'], "t.label_operation", "", $param, "", $sortfield, $sortorder); +if (!empty($arrayfields['t.debit']['checked'])) print_liste_field_titre($arrayfields['t.debit']['label'], $_SERVER['PHP_SELF'], "t.debit", "", $param, '', $sortfield, $sortorder, 'right '); +if (!empty($arrayfields['t.credit']['checked'])) print_liste_field_titre($arrayfields['t.credit']['label'], $_SERVER['PHP_SELF'], "t.credit", "", $param, '', $sortfield, $sortorder, 'right '); +if (!empty($arrayfields['t.code_journal']['checked'])) print_liste_field_titre($arrayfields['t.code_journal']['label'], $_SERVER['PHP_SELF'], "t.code_journal", "", $param, '', $sortfield, $sortorder, 'center '); +// Hook fields +$parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder); +$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook +print $hookmanager->resPrint; +print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch '); print "\n"; @@ -323,7 +395,10 @@ $sous_total_debit = 0; $sous_total_credit = 0; $displayed_account_number = null; // Start with undefined to be able to distinguish with empty +// Loop on record +// -------------------------------------------------------------------- $i = 0; +$totalarray = array(); while ($i < min($num, $limit)) { $line = $object->lines[$i]; @@ -362,38 +437,149 @@ while ($i < min($num, $limit)) print ''; print ''; print ''; - print ''; - // TODO Add a link according to doc_type and fk_doc - print ''; + if (!$i) $totalarray['nbfield']++; + } + + // Document ref + if (!empty($arrayfields['t.doc_ref']['checked'])) + { + if ($line->doc_type == 'customer_invoice') + { + $langs->loadLangs(array('bills')); + + require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; + $objectstatic = new Facture($db); + $objectstatic->fetch($line->fk_doc); + //$modulepart = 'facture'; + + $filename = dol_sanitizeFileName($line->doc_ref); + $filedir = $conf->facture->dir_output.'/'.dol_sanitizeFileName($line->doc_ref); + $urlsource = $_SERVER['PHP_SELF'].'?id='.$objectstatic->id; + $documentlink = $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir); + } + elseif ($line->doc_type == 'supplier_invoice') + { + $langs->loadLangs(array('bills')); + + require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php'; + $objectstatic = new FactureFournisseur($db); + $objectstatic->fetch($line->fk_doc); + //$modulepart = 'invoice_supplier'; + + $filename = dol_sanitizeFileName($line->doc_ref); + $filedir = $conf->fournisseur->facture->dir_output.'/'.get_exdir($line->fk_doc, 2, 0, 0, $objectstatic, $modulepart).dol_sanitizeFileName($line->doc_ref); + $subdir = get_exdir($objectstatic->id, 2, 0, 0, $objectstatic, $modulepart).dol_sanitizeFileName($line->doc_ref); + $documentlink = $formfile->getDocumentsLink($objectstatic->element, $subdir, $filedir); + } + elseif ($line->doc_type == 'expense_report') + { + $langs->loadLangs(array('trips')); + + require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php'; + $objectstatic = new ExpenseReport($db); + $objectstatic->fetch($line->fk_doc); + //$modulepart = 'expensereport'; + + $filename = dol_sanitizeFileName($line->doc_ref); + $filedir = $conf->expensereport->dir_output.'/'.dol_sanitizeFileName($line->doc_ref); + $urlsource = $_SERVER['PHP_SELF'].'?id='.$objectstatic->id; + $documentlink = $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir); + } + else + { + // Other type + } + + print '\n"; + if (!$i) $totalarray['nbfield']++; + } + + // Label operation + if (!empty($arrayfields['t.label_operation']['checked'])) { + // Affiche un lien vers la facture client/fournisseur + $doc_ref = preg_replace('/\(.*\)/', '', $line->doc_ref); + print strlen(length_accounta($line->subledger_account)) == 0 ? '' : ''; + if (!$i) $totalarray['nbfield']++; + } + + // Amount debit + if (!empty($arrayfields['t.debit']['checked'])) + { + print ''; + if (!$i) $totalarray['nbfield']++; + if (!$i) $totalarray['pos'][$totalarray['nbfield']] = 'totaldebit'; + $totalarray['val']['totaldebit'] += $line->debit; + } + + // Amount credit + if (!empty($arrayfields['t.credit']['checked'])) { + print ''; + if (!$i) $totalarray['nbfield']++; + if (!$i) $totalarray['pos'][$totalarray['nbfield']] = 'totalcredit'; + $totalarray['val']['totalcredit'] += $line->credit; + } + + // Lettering code + if (!empty($arrayfields['t.lettering_code']['checked'])) + { + print ''; + if (!$i) $totalarray['nbfield']++; + } + + // Journal code + if (!empty($arrayfields['t.code_journal']['checked'])) + { + $accountingjournal = new AccountingJournal($db); + $result = $accountingjournal->fetch('', $line->code_journal); + $journaltoshow = (($result > 0) ? $accountingjournal->getNomUrl(0, 0, 0, '', 0) : $line->code_journal); + print ''; + } + + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + + // Action column + print ''; - // Affiche un lien vers la facture client/fournisseur - $doc_ref = preg_replace('/\(.*\)/', '', $line->doc_ref); - print strlen(length_accounta($line->subledger_account)) == 0 ? '' : ''; - - - print ''; - print ''; - - $accountingjournal = new AccountingJournal($db); - $result = $accountingjournal->fetch('', $line->code_journal); - $journaltoshow = (($result > 0) ? $accountingjournal->getNomUrl(0, 0, 0, '', 0) : $line->code_journal); - print ''; - - print ''; - print "\n"; - // Comptabilise le sous-total $sous_total_debit += $line->debit; $sous_total_credit += $line->credit; + if (!$i) $totalarray['nbfield']++; + + print "\n"; + $i++; } @@ -406,23 +592,20 @@ print ''; print ''; print ''; +// Show total line +include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php'; -// Show total -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; print "
'; print '
'; print $langs->trans('From').' '; @@ -285,35 +328,64 @@ print $langs->trans('to').' '; print $formaccounting->select_account($search_accountancy_code_end, 'search_accountancy_code_end', 1, array(), 1, 1, 'maxwidth200'); print '
'; print '
'; + print $langs->trans('From') . ': '; + print $form->selectDate($search_date_start, 'search_date_start', 0, 0, 1); + print '
'; + print $langs->trans('to') . ': '; + print $form->selectDate($search_date_end, 'search_date_end', 0, 0, 1); + print '
'; -print $langs->trans('From').': '; -print $form->selectDate($search_date_start, 'search_date_start', 0, 0, 1); -print '
'; -print $langs->trans('to').': '; -print $form->selectDate($search_date_end, 'search_date_end', 0, 0, 1); -print '
'; -$searchpicto = $form->showFilterAndCheckAddButtons(0); +$searchpicto = $form->showFilterButtons(); print $searchpicto; print '
 '.$line->piece_num.''.dol_print_date($line->doc_date, 'day').''; - //if ($line->doc_type == 'supplier_invoice') - //if ($line->doc_type == 'customer_invoice') - print $line->doc_ref; + // Document date + if (!empty($arrayfields['t.doc_date']['checked'])) + { + print ''.dol_print_date($line->doc_date, 'day').''; + + print ''; + // Picto + Ref + print '
'; + + if ($line->doc_type == 'customer_invoice' || $line->doc_type == 'supplier_invoice' || $line->doc_type == 'expense_report') + { + print $objectstatic->getNomUrl(1, '', 0, 0, '', 0, -1, 1); + print $documentlink; + } else { + print $line->doc_ref; + } + print '
'; + + print "
' . $line->label_operation . '' . $line->label_operation . '
(' . length_accounta($line->subledger_account) . ')
'.($line->debit ? price($line->debit) : '').'' . ($line->credit ? price($line->credit) : '') . ''.$line->lettering_code.''.$journaltoshow.''; + if (empty($line->date_export)) { + if ($user->rights->accounting->mouvements->creer) { + print ''.img_edit().''; + } + if ($user->rights->accounting->mouvements->supprimer) { + print ' '.img_delete().''; + } + } print ''.$line->label_operation.''.$line->label_operation.'
('.length_accounta($line->subledger_account).')
'.($line->debit ? price($line->debit) : '').''.($line->credit ? price($line->credit) : '').''.$journaltoshow.''; - print ''.img_edit().' '; - print ''.img_delete().''; - print '
'.$langs->trans("Total").':'; -print price($total_debit); -print ''; -print price($total_credit); -print '
"; print '
'; +// TODO Replace this with mass delete action +if ($user->rights->accounting->mouvements->supprimer_tous) { + print '
'."\n"; + print ''.$langs->trans("DeleteMvt").''; + print '
'; +} + print ''; // End of page From 40ffbbe61653f7a5bfea122b1d028b5cc297fcba Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Fri, 8 May 2020 13:28:56 +0200 Subject: [PATCH 106/158] Debug --- .../accountancy/bookkeeping/listbyaccount.php | 38 ++++++++++++++----- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/listbyaccount.php b/htdocs/accountancy/bookkeeping/listbyaccount.php index 582e54442a5..ff742c356c4 100644 --- a/htdocs/accountancy/bookkeeping/listbyaccount.php +++ b/htdocs/accountancy/bookkeeping/listbyaccount.php @@ -120,17 +120,18 @@ $arrayfields = array( if (empty($conf->global->ACCOUNTING_ENABLE_LETTERING)) unset($arrayfields['t.lettering_code']); - -$object = new BookKeeping($db); - /* * Action */ +if (GETPOST('cancel', 'alpha')) { $action = 'list'; $massaction = ''; } +if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') { $massaction = ''; } + $parameters = array('socid'=>$socid); $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)) { +if (empty($reshook)) +{ include DOL_DOCUMENT_ROOT . '/core/actions_changeselectedfields.inc.php'; if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) // All tests are required to be compatible with all browsers @@ -328,15 +329,22 @@ print $langs->trans('to').' '; print $formaccounting->select_account($search_accountancy_code_end, 'search_accountancy_code_end', 1, array(), 1, 1, 'maxwidth200'); print '
'; print ''; +// Movement number +if (!empty($arrayfields['t.piece_num']['checked'])) +{ + print ''; +} // Date document if (!empty($arrayfields['t.doc_date']['checked'])) { - print ''; print ''; + print '
'; print $langs->trans('From') . ': '; print $form->selectDate($search_date_start, 'search_date_start', 0, 0, 1); - print '
'; + print '
'; + print '
'; print $langs->trans('to') . ': '; print $form->selectDate($search_date_end, 'search_date_end', 0, 0, 1); + print '
'; print ''; } // Ref document @@ -374,7 +382,7 @@ print "\n"; print ''; print_liste_field_titre("AccountAccountingShort", $_SERVER['PHP_SELF']); -if (!empty($arrayfields['t.piece_num']['checked'])) print_liste_field_titre($arrayfields['t.piece_num']['label'], $_SERVER['PHP_SELF'], "t.piece_num", "", $param, '', $sortfield, $sortorder, 'right '); +if (!empty($arrayfields['t.piece_num']['checked'])) print_liste_field_titre($arrayfields['t.piece_num']['label'], $_SERVER['PHP_SELF'], "t.piece_num", "", $param, '', $sortfield, $sortorder); if (!empty($arrayfields['t.doc_date']['checked'])) print_liste_field_titre($arrayfields['t.doc_date']['label'], $_SERVER['PHP_SELF'], "t.doc_date", "", $param, '', $sortfield, $sortorder, 'center '); if (!empty($arrayfields['t.doc_ref']['checked'])) print_liste_field_titre($arrayfields['t.doc_ref']['label'], $_SERVER['PHP_SELF'], "t.doc_ref", "", $param, "", $sortfield, $sortorder); if (!empty($arrayfields['t.label_operation']['checked'])) print_liste_field_titre($arrayfields['t.label_operation']['label'], $_SERVER['PHP_SELF'], "t.label_operation", "", $param, "", $sortfield, $sortorder); @@ -436,7 +444,18 @@ while ($i < min($num, $limit)) print ''; print ' '; - print ''.$line->piece_num.''; + if (!$i) $totalarray['nbfield']++; + + // Piece number + if (!empty($arrayfields['t.piece_num']['checked'])) + { + print ''; + $object->id = $line->id; + $object->piece_num = $line->piece_num; + print $object->getNomUrl(1, '', 0, '', 1); + print ''; + if (!$i) $totalarray['nbfield']++; + } // Document date if (!empty($arrayfields['t.doc_date']['checked'])) @@ -553,6 +572,7 @@ while ($i < min($num, $limit)) $result = $accountingjournal->fetch('', $line->code_journal); $journaltoshow = (($result > 0) ? $accountingjournal->getNomUrl(0, 0, 0, '', 0) : $line->code_journal); print ''.$journaltoshow.''; + if (!$i) $totalarray['nbfield']++; } // Fields from hook @@ -585,7 +605,7 @@ while ($i < min($num, $limit)) // Show sub-total of last shown account print ''; -print ''.$langs->trans("SubTotal").':'.price($sous_total_debit).''.price($sous_total_credit).''; +print ''.$langs->trans("SubTotal").':'.price($sous_total_debit).''.price($sous_total_credit).''; print ''; print price($sous_total_debit - $sous_total_credit); print ''; From 640158ea4caa3ffc94a0af63494fd509c768dbf0 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Fri, 8 May 2020 13:50:26 +0200 Subject: [PATCH 107/158] NEW Accountancy - Add Fiducial Winfic eWinfic WinSis Compta --- ...ncy-format_Winfic-eWinfic-WinSisCompta.pdf | Bin 0 -> 173394 bytes .../class/accountancyexport.class.php | 96 +++++++++++++++++- htdocs/langs/en_US/accountancy.lang | 3 +- 3 files changed, 95 insertions(+), 4 deletions(-) create mode 100644 dev/resources/iso-normes/Accountancy-format_Winfic-eWinfic-WinSisCompta.pdf diff --git a/dev/resources/iso-normes/Accountancy-format_Winfic-eWinfic-WinSisCompta.pdf b/dev/resources/iso-normes/Accountancy-format_Winfic-eWinfic-WinSisCompta.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2fbaad04699b50eed31cf1373164693fda111714 GIT binary patch literal 173394 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

6gnen?77w`*g-le>y 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 literal 0 HcmV?d00001 diff --git a/htdocs/accountancy/class/accountancyexport.class.php b/htdocs/accountancy/class/accountancyexport.class.php index 1e641564de4..37b00ff43a6 100644 --- a/htdocs/accountancy/class/accountancyexport.class.php +++ b/htdocs/accountancy/class/accountancyexport.class.php @@ -5,11 +5,12 @@ * Copyright (C) 2015 Florian Henry * Copyright (C) 2015 Raphaël Doursenaud * Copyright (C) 2016 Pierre-Henry Favre - * Copyright (C) 2016-2019 Alexandre Spangaro + * Copyright (C) 2016-2020 Alexandre Spangaro * Copyright (C) 2013-2017 Olivier Geffroy * Copyright (C) 2017 Elarifr. Ari Elbaz * Copyright (C) 2017-2019 Frédéric France * Copyright (C) 2017 André Schild + * Copyright (C) 2020 Guillaume Alexandre * * 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 @@ -52,6 +53,7 @@ class AccountancyExport public static $EXPORT_TYPE_SAGE50_SWISS = 45; public static $EXPORT_TYPE_CHARLEMAGNE = 50; public static $EXPORT_TYPE_QUADRATUS = 60; + public static $EXPORT_TYPE_WINFIC = 70; public static $EXPORT_TYPE_OPENCONCERTO = 100; public static $EXPORT_TYPE_LDCOMPTA = 110; public static $EXPORT_TYPE_LDCOMPTA10 = 120; @@ -105,6 +107,7 @@ class AccountancyExport self::$EXPORT_TYPE_BOB50 => $langs->trans('Modelcsv_bob50'), self::$EXPORT_TYPE_CIEL => $langs->trans('Modelcsv_ciel'), self::$EXPORT_TYPE_QUADRATUS => $langs->trans('Modelcsv_quadratus'), + self::$EXPORT_TYPE_WINFIC => $langs->trans('Modelcsv_winfic'), self::$EXPORT_TYPE_EBP => $langs->trans('Modelcsv_ebp'), self::$EXPORT_TYPE_COGILOG => $langs->trans('Modelcsv_cogilog'), self::$EXPORT_TYPE_AGIRIS => $langs->trans('Modelcsv_agiris'), @@ -136,6 +139,7 @@ class AccountancyExport self::$EXPORT_TYPE_BOB50 => 'bob50', self::$EXPORT_TYPE_CIEL => 'ciel', self::$EXPORT_TYPE_QUADRATUS => 'quadratus', + self::$EXPORT_TYPE_WINFIC => 'winfic', self::$EXPORT_TYPE_EBP => 'ebp', self::$EXPORT_TYPE_COGILOG => 'cogilog', self::$EXPORT_TYPE_AGIRIS => 'agiris', @@ -184,6 +188,10 @@ class AccountancyExport 'label' => $langs->trans('Modelcsv_quadratus'), 'ACCOUNTING_EXPORT_FORMAT' => 'txt', ), + self::$EXPORT_TYPE_WINFIC => array( + 'label' => $langs->trans('Modelcsv_winfic'), + 'ACCOUNTING_EXPORT_FORMAT' => 'txt', + ), self::$EXPORT_TYPE_EBP => array( 'label' => $langs->trans('Modelcsv_ebp'), ), @@ -246,7 +254,7 @@ class AccountancyExport $filename = 'general_ledger-'.$this->getFormatCode($formatexportset); $type_export = 'general_ledger'; - global $db; // The tpl file use $db + global $db; // The tpl file use $db include DOL_DOCUMENT_ROOT.'/accountancy/tpl/export_journal.tpl.php'; @@ -269,6 +277,9 @@ class AccountancyExport case self::$EXPORT_TYPE_QUADRATUS : $this->exportQuadratus($TData); break; + case self::$EXPORT_TYPE_WINFIC : + $this->exportWinfic($TData); + break; case self::$EXPORT_TYPE_EBP : $this->exportEbp($TData); break; @@ -548,6 +559,85 @@ class AccountancyExport } } + /** + * Export format : WinFic - eWinfic - WinSis Compta + * + * + * @param array $TData data + * @return void + */ + public function exportWinfic(&$TData) + { + global $conf; + + $end_line = "\r\n"; + + //We should use dol_now function not time however this is wrong date to transfert in accounting + //$date_ecriture = dol_print_date(dol_now(), $conf->global->ACCOUNTING_EXPORT_DATE); // format must be ddmmyy + //$date_ecriture = dol_print_date(time(), $conf->global->ACCOUNTING_EXPORT_DATE); // format must be ddmmyy + foreach ($TData as $data) { + $code_compta = $data->numero_compte; + if (!empty($data->subledger_account)) + $code_compta = $data->subledger_account; + + $Tab = array(); + //$Tab['type_ligne'] = 'M'; + $Tab['code_journal'] = str_pad(self::trunc($data->code_journal, 2), 2); + + //We use invoice date $data->doc_date not $date_ecriture which is the transfert date + //maybe we should set an option for customer who prefer to keep in accounting software the tranfert date instead of invoice date ? + //$Tab['date_ecriture'] = $date_ecriture; + $Tab['date_operation'] = dol_print_date($data->doc_date, '%d%m%Y'); + + $Tab['folio'] = ' 1'; + + $Tab['num_ecriture'] = str_pad(self::trunc($data->piece_num, 6), 6, ' ', STR_PAD_LEFT); + + $Tab['jour_ecriture'] = dol_print_date($data->doc_date, '%d%m%y'); + + $Tab['num_compte'] = str_pad(self::trunc($code_compta, 6), 6, '0'); + + if($data->sens == 'D'){ + $Tab['montant_debit'] = str_pad(number_format(abs($data->montant), 2, ',', ''), 13, ' ', STR_PAD_LEFT); + + $Tab['montant_crebit'] = str_pad(number_format(0, 2, ',', ''), 13, ' ', STR_PAD_LEFT); + } + else{ + $Tab['montant_debit'] = str_pad(number_format(0, 2, ',', ''), 13, ' ', STR_PAD_LEFT); + + $Tab['montant_crebit'] = str_pad(number_format(abs($data->montant), 2, ',', ''), 13, ' ', STR_PAD_LEFT); + } + + $Tab['libelle_ecriture'] = str_pad(self::trunc(dol_string_unaccent($data->doc_ref).' '.dol_string_unaccent($data->label_operation), 30), 30); + + $Tab['lettrage'] = str_repeat(' ', 2); + + $Tab['code_piece'] = str_repeat(' ', 5); + + $Tab['code_stat'] = str_repeat(' ', 4); + + if (!empty($data->date_echeance)) + //$Tab['date_echeance'] = dol_print_date($data->date_echeance, $conf->global->ACCOUNTING_EXPORT_DATE); + $Tab['date_echeance'] = dol_print_date($data->date_echeance, '%d%m%Y'); + else + $Tab['date_echeance'] = dol_print_date($data->doc_date, '%d%m%Y'); + + $Tab['monnaie'] = '1'; + + $Tab['filler'] = ' '; + + $Tab['ind_compteur'] = ' '; + + $Tab['quantite'] = '0,000000000'; + + $Tab['code_pointage'] = str_repeat(' ', 2); + + $Tab['end_line'] = $end_line; + + print implode('|', $Tab); + } + } + /** * Export format : EBP @@ -930,7 +1020,7 @@ class AccountancyExport } /** - * Export format : LD Compta version 9 & higher + * Export format : LD Compta version 9 * http://www.ldsysteme.fr/fileadmin/telechargement/np/ldcompta/Documentation/IntCptW9.pdf * * @param array $objectLines data diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang index ba34d38f36e..eb3229efaee 100644 --- a/htdocs/langs/en_US/accountancy.lang +++ b/htdocs/langs/en_US/accountancy.lang @@ -314,12 +314,13 @@ Modelcsv_quadratus=Export for Quadratus QuadraCompta Modelcsv_ebp=Export for EBP Modelcsv_cogilog=Export for Cogilog Modelcsv_agiris=Export for Agiris -Modelcsv_LDCompta=Export for LD Compta (v9 & higher) (Test) +Modelcsv_LDCompta=Export for LD Compta (v9) (Test) Modelcsv_LDCompta10=Export for LD Compta (v10 & higher) Modelcsv_openconcerto=Export for OpenConcerto (Test) Modelcsv_configurable=Export CSV Configurable Modelcsv_FEC=Export FEC Modelcsv_Sage50_Swiss=Export for Sage 50 Switzerland +Modelcsv_winfic=Export Winfic - eWinfic - WinSis Compta ChartofaccountsId=Chart of accounts Id ## Tools - Init accounting account on product / service From 7ad80c9bf623a88d215baa7dce03e4446c8b7db2 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Fri, 8 May 2020 11:53:11 +0000 Subject: [PATCH 108/158] Fixing style errors. --- htdocs/accountancy/class/accountancyexport.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/accountancy/class/accountancyexport.class.php b/htdocs/accountancy/class/accountancyexport.class.php index 37b00ff43a6..3bf41e6326f 100644 --- a/htdocs/accountancy/class/accountancyexport.class.php +++ b/htdocs/accountancy/class/accountancyexport.class.php @@ -561,7 +561,7 @@ class AccountancyExport /** * Export format : WinFic - eWinfic - WinSis Compta - * + * * * @param array $TData data * @return void From 94d47c2acd4a53ba4ad69f914ac87212983b9ac4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 8 May 2020 14:04:17 +0200 Subject: [PATCH 109/158] Fix sql --- htdocs/install/mysql/migration/11.0.0-12.0.0.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/install/mysql/migration/11.0.0-12.0.0.sql b/htdocs/install/mysql/migration/11.0.0-12.0.0.sql index 38d0acb97fa..238c98b2f6e 100644 --- a/htdocs/install/mysql/migration/11.0.0-12.0.0.sql +++ b/htdocs/install/mysql/migration/11.0.0-12.0.0.sql @@ -275,4 +275,4 @@ ALTER TABLE llx_prelevement_facture ADD COLUMN fk_facture_fourn INTEGER NULL; ALTER TABLE llx_menu MODIFY COLUMN module varchar(255); -ALTER TABLE llx_actioncomm SET fk_action = 50 where fk_action = 40 AND code = 'TICKET_MSG'; +UPDATE TABLE llx_actioncomm SET fk_action = 50 where fk_action = 40 AND code = 'TICKET_MSG'; From c98663be4a491e133c914972891af7cde7e4ac84 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 8 May 2020 14:05:04 +0200 Subject: [PATCH 110/158] Fix sql --- htdocs/install/mysql/migration/11.0.0-12.0.0.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/install/mysql/migration/11.0.0-12.0.0.sql b/htdocs/install/mysql/migration/11.0.0-12.0.0.sql index 238c98b2f6e..470d48bbf26 100644 --- a/htdocs/install/mysql/migration/11.0.0-12.0.0.sql +++ b/htdocs/install/mysql/migration/11.0.0-12.0.0.sql @@ -275,4 +275,4 @@ ALTER TABLE llx_prelevement_facture ADD COLUMN fk_facture_fourn INTEGER NULL; ALTER TABLE llx_menu MODIFY COLUMN module varchar(255); -UPDATE TABLE llx_actioncomm SET fk_action = 50 where fk_action = 40 AND code = 'TICKET_MSG'; +UPDATE llx_actioncomm SET fk_action = 50 where fk_action = 40 AND code = 'TICKET_MSG'; From 0138ab3f7c85eb7fb1319f1ec568da8299d9eed8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 8 May 2020 14:25:49 +0200 Subject: [PATCH 111/158] Fix $weblangs must be initialized with language of page --- htdocs/core/website.inc.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/htdocs/core/website.inc.php b/htdocs/core/website.inc.php index 3e54f6ec2ad..5ea21e19fda 100644 --- a/htdocs/core/website.inc.php +++ b/htdocs/core/website.inc.php @@ -33,11 +33,6 @@ if (!is_object($website)) $website = new Website($db); $website->fetch(0, $websitekey); } -// Define $weblangs -if (!is_object($weblangs)) -{ - $weblangs = dol_clone($langs); // TODO Use an object lang from a language set into $website object instead of backoffice -} // Define $websitepage if we have $websitepagefile defined if (!$pageid && !empty($websitepagefile)) { @@ -48,10 +43,17 @@ if (!is_object($websitepage)) { $websitepage = new WebsitePage($db); } +// Define $weblangs +if (!is_object($weblangs)) +{ + $weblangs = new Translate($db); +} if ($pageid > 0) { $websitepage->fetch($pageid); + $weblangs->setDefaultLang($websitepage->lang ? $websitepage->lang : 'auto'); + if (!defined('USEDOLIBARREDITOR') && in_array($websitepage->type_container, array('menu', 'other'))) { $weblangs->load("website"); From 6a2bb08107a15da3a4d3ccc640be071a7c3d7d80 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 8 May 2020 14:34:02 +0200 Subject: [PATCH 112/158] Fix constructor --- htdocs/core/website.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/website.inc.php b/htdocs/core/website.inc.php index 5ea21e19fda..18744fec7a8 100644 --- a/htdocs/core/website.inc.php +++ b/htdocs/core/website.inc.php @@ -46,7 +46,7 @@ if (!is_object($websitepage)) // Define $weblangs if (!is_object($weblangs)) { - $weblangs = new Translate($db); + $weblangs = new Translate($db, $conf); } if ($pageid > 0) { From c28a3e85a35cb4df9a6cc4828bcfc82eb035955b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 8 May 2020 14:35:03 +0200 Subject: [PATCH 113/158] Fix constructor --- htdocs/core/website.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/website.inc.php b/htdocs/core/website.inc.php index 18744fec7a8..b5053fcc814 100644 --- a/htdocs/core/website.inc.php +++ b/htdocs/core/website.inc.php @@ -46,7 +46,7 @@ if (!is_object($websitepage)) // Define $weblangs if (!is_object($weblangs)) { - $weblangs = new Translate($db, $conf); + $weblangs = new Translate('', $conf); } if ($pageid > 0) { From bba8ab657eea7ae7f28e5369ea59b06b1f3f5937 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 8 May 2020 18:57:15 +0200 Subject: [PATCH 114/158] Fix add missing migration --- htdocs/install/mysql/migration/10.0.0-11.0.0.sql | 11 +++++++++++ htdocs/install/mysql/migration/11.0.0-12.0.0.sql | 9 +++++++++ 2 files changed, 20 insertions(+) diff --git a/htdocs/install/mysql/migration/10.0.0-11.0.0.sql b/htdocs/install/mysql/migration/10.0.0-11.0.0.sql index bc4b562711b..2a7a8963e9f 100644 --- a/htdocs/install/mysql/migration/10.0.0-11.0.0.sql +++ b/htdocs/install/mysql/migration/10.0.0-11.0.0.sql @@ -582,3 +582,14 @@ create table llx_commande_fournisseur_dispatch_extrafields ALTER TABLE llx_commande_fournisseur_dispatch_extrafields ADD INDEX idx_commande_fournisseur_dispatch_extrafields (fk_object); + +create table llx_facturedet_rec_extrafields +( + rowid integer AUTO_INCREMENT PRIMARY KEY, + tms timestamp, + fk_object integer NOT NULL, -- object id + import_key varchar(14) -- import key +)ENGINE=innodb; + +ALTER TABLE llx_facturedet_rec_extrafields ADD INDEX idx_facturedet_rec_extrafields (fk_object); + diff --git a/htdocs/install/mysql/migration/11.0.0-12.0.0.sql b/htdocs/install/mysql/migration/11.0.0-12.0.0.sql index 470d48bbf26..8a68e763160 100644 --- a/htdocs/install/mysql/migration/11.0.0-12.0.0.sql +++ b/htdocs/install/mysql/migration/11.0.0-12.0.0.sql @@ -54,6 +54,15 @@ create table llx_c_shipment_package_type entity integer DEFAULT 1 NOT NULL -- Multi company id )ENGINE=innodb; +create table llx_facturedet_rec_extrafields +( + rowid integer AUTO_INCREMENT PRIMARY KEY, + tms timestamp, + fk_object integer NOT NULL, -- object id + import_key varchar(14) -- import key +)ENGINE=innodb; + +ALTER TABLE llx_facturedet_rec_extrafields ADD INDEX idx_facturedet_rec_extrafields (fk_object); -- For v12 From 3644a718d8b7fd21deec36617724c9a30e119c15 Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Sat, 9 May 2020 01:02:51 +0200 Subject: [PATCH 115/158] 1 --- htdocs/admin/user.php | 24 ++++++++++++++++++++++++ htdocs/langs/en_US/admin.lang | 1 + htdocs/langs/fr_FR/admin.lang | 1 + 3 files changed, 26 insertions(+) diff --git a/htdocs/admin/user.php b/htdocs/admin/user.php index fb15a57a87e..60cbadcdd3a 100644 --- a/htdocs/admin/user.php +++ b/htdocs/admin/user.php @@ -177,6 +177,30 @@ else } print ''; +// user hide inactive + +print ''; +print ''.$langs->trans("UserHideInactive").''; +print ' '; + +print ''; +if ($conf->use_javascript_ajax) +{ + print ajax_constantonoff('USER_HIDE_INACTIVE_IN_COMBOBOX'); +} +else +{ + if (empty($conf->global->USER_HIDE_INACTIVE_IN_COMBOBOX)) + { + print ''.img_picto($langs->trans("Disabled"), 'off').''; + } + else + { + print ''.img_picto($langs->trans("Enabled"), 'on').''; + } +} +print ''; + print ''; print '
'; diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 3cf6e6044db..e97ed8dbc54 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1272,6 +1272,7 @@ RuleForGeneratedPasswords=Rules to generate and validate passwords DisableForgetPasswordLinkOnLogonPage=Do not show the "Password Forgotten" link on the Login page UsersSetup=Users module setup UserMailRequired=Email required to create a new user +UserHideInactive=Hide inactive users UsersDocModules=Document templates for documents generated from user record GroupsDocModules=Document templates for documents generated from a group record ##### HRM setup ##### diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang index 6545b71ede3..172153852e3 100644 --- a/htdocs/langs/fr_FR/admin.lang +++ b/htdocs/langs/fr_FR/admin.lang @@ -1272,6 +1272,7 @@ RuleForGeneratedPasswords=Règle pour la génération des mots de passe proposé DisableForgetPasswordLinkOnLogonPage=Cacher le lien "Mot de passe oublié" sur la page de connexion UsersSetup=Configuration du module utilisateurs UserMailRequired=Email requis pour créer un nouvel utilisateur +UserHideInactive=Cacher les utilisateurs inactifs UsersDocModules=Modèles de documents pour les documents générés à partir de la fiche utilisateur GroupsDocModules=Modèles de documents pour les documents générés à partir de la fiche d'un groupe ##### HRM setup ##### From 53eb891a88d9727591ada4601c1f03fed7c22370 Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Sat, 9 May 2020 18:48:01 +0200 Subject: [PATCH 116/158] Update list.php --- htdocs/product/stock/list.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/htdocs/product/stock/list.php b/htdocs/product/stock/list.php index 15b92c83acc..c13243fc9cb 100644 --- a/htdocs/product/stock/list.php +++ b/htdocs/product/stock/list.php @@ -549,6 +549,11 @@ if ($num) { print ''; if ($key == 'statut') print $warehouse->getLibStatut(5); + if ($key == 'phone') + { + print dol_print_phone($obj->phone, '', 0, $obj->rowid, 'AC_TEL'); + } + elseif ($key == 'fax') print dol_print_phone($obj->fax, '', 0, $obj->rowid, 'AC_FAX'); else print $warehouse->showOutputField($val, $key, $warehouse->$key, ''); print ''; if (!$i) $totalarray['nbfield']++; From fe241ea321982b4b7ee30cf6ea03e7e5c7a7b3e7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 9 May 2020 21:49:12 +0200 Subject: [PATCH 117/158] Fix removed not reliabled info in PHP info --- htdocs/admin/system/phpinfo.php | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/htdocs/admin/system/phpinfo.php b/htdocs/admin/system/phpinfo.php index ce21c1f3ad8..04439d11710 100644 --- a/htdocs/admin/system/phpinfo.php +++ b/htdocs/admin/system/phpinfo.php @@ -143,7 +143,7 @@ $loadedExtensions = array_map('strtolower', get_loaded_extensions(false)); print ''; print ''; print ''; -print ''; +//print ''; print ''; print ''; print ''; @@ -154,7 +154,7 @@ $name = "GD"; print ""; print ""; -print getTableColumn($name, $activatedExtensions); +//print getTableColumn($name, $activatedExtensions); print getTableColumn($name, $loadedExtensions); print getTableColumnFunction($functions); print getResultColumn($name, $activatedExtensions, $loadedExtensions, $functions); @@ -165,7 +165,7 @@ $name = "Curl"; print ""; print ""; -print getTableColumn($name, $activatedExtensions); +//print getTableColumn($name, $activatedExtensions); print getTableColumn($name, $loadedExtensions); print getTableColumnFunction($functions); print getResultColumn($name, $activatedExtensions, $loadedExtensions, $functions); @@ -178,7 +178,7 @@ if (empty($_SERVER["SERVER_ADMIN"]) || $_SERVER["SERVER_ADMIN"] != 'doliwamp@loc print ""; print ""; - print getTableColumn($name, $activatedExtensions); + //print getTableColumn($name, $activatedExtensions); print getTableColumn($name, $loadedExtensions); print getTableColumnFunction($functions); print getResultColumn($name, $activatedExtensions, $loadedExtensions, $functions); @@ -191,7 +191,7 @@ $name = "xDebug"; print ""; print ""; -print getTableColumn($name, $activatedExtensions); +//print getTableColumn($name, $activatedExtensions); print getTableColumn($name, $loadedExtensions); print getTableColumnFunction($functions); print getResultColumn($name, $activatedExtensions, $loadedExtensions, $functions); @@ -208,7 +208,6 @@ foreach ($phparray as $key => $value) print '
'; print '
'.$langs->trans("Extension").''.$langs->trans("EnabledInSetup").''.$langs->trans("EnabledInSetup").''.$langs->trans("Loaded").''.$langs->trans("FunctionTest").''.$langs->trans("Result").'
".$name."
".$name."
".$name."
".$name."
'; print ''; - //print ''; print ''; print ''; print "\n"; @@ -408,7 +407,7 @@ function getResultColumn($name, array $activated, array $loaded, array $function global $langs; $result = true; - $result = $result && in_array(strtolower($name), $activated); + //$result = $result && in_array(strtolower($name), $activated); $result = $result && in_array(strtolower($name), $loaded); foreach ($functions as $function) From 310c5f9eb665ac0331f3b727c81bf65b668da569 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 9 May 2020 21:56:51 +0200 Subject: [PATCH 118/158] Fix size of field --- htdocs/install/mysql/migration/8.0.0-9.0.0.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/install/mysql/migration/8.0.0-9.0.0.sql b/htdocs/install/mysql/migration/8.0.0-9.0.0.sql index 61f4dc544ba..b7fe131c3f9 100644 --- a/htdocs/install/mysql/migration/8.0.0-9.0.0.sql +++ b/htdocs/install/mysql/migration/8.0.0-9.0.0.sql @@ -200,7 +200,7 @@ CREATE TABLE llx_emailcollector_emailcollectorfilter( rowid integer AUTO_INCREMENT PRIMARY KEY NOT NULL, fk_emailcollector INTEGER NOT NULL, type varchar(128) NOT NULL, - rulevalue varchar(255) NULL, + rulevalue varchar(128) NULL, date_creation datetime NOT NULL, tms timestamp NOT NULL, fk_user_creat integer NOT NULL, From f40e978475751664c2b4cb1245f5c185b890613c Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sun, 10 May 2020 06:28:50 +0200 Subject: [PATCH 119/158] Fix delbookkeepingyear - add hook printFieldPreListTitle - Look & Feel v12 --- .../accountancy/bookkeeping/listbyaccount.php | 282 +++++++++++++----- htdocs/langs/en_US/accountancy.lang | 1 + 2 files changed, 213 insertions(+), 70 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/listbyaccount.php b/htdocs/accountancy/bookkeeping/listbyaccount.php index ff742c356c4..49dbb81e77d 100644 --- a/htdocs/accountancy/bookkeeping/listbyaccount.php +++ b/htdocs/accountancy/bookkeeping/listbyaccount.php @@ -57,6 +57,12 @@ $search_direction = GETPOST('search_direction', 'alpha'); $search_ledger_code = GETPOST('search_ledger_code', 'alpha'); $search_debit = GETPOST('search_debit', 'alpha'); $search_credit = GETPOST('search_credit', 'alpha'); +$search_lettering_code = GETPOST('search_lettering_code', 'alpha'); +$search_not_reconciled = GETPOST('search_reconciled_option', 'alpha'); + +if (GETPOST("button_delmvt_x") || GETPOST("button_delmvt.x") || GETPOST("button_delmvt")) { + $action = 'delbookkeepingyear'; +} // Load variable for pagination $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : (empty($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION) ? $conf->liste_limit : $conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION); @@ -105,6 +111,7 @@ if (empty($search_date_start) && empty($search_date_end) && GETPOSTISSET('search $arrayfields = array( // 't.subledger_account'=>array('label'=>$langs->trans("SubledgerAccount"), 'checked'=>1), + 't.code_journal'=>array('label'=>$langs->trans("Codejournal"), 'checked'=>1), 't.piece_num'=>array('label'=>$langs->trans("TransactionNumShort"), 'checked'=>1), 't.doc_date'=>array('label'=>$langs->trans("Docdate"), 'checked'=>1), 't.doc_ref'=>array('label'=>$langs->trans("Piece"), 'checked'=>1), @@ -112,10 +119,6 @@ $arrayfields = array( 't.debit'=>array('label'=>$langs->trans("Debit"), 'checked'=>1), 't.credit'=>array('label'=>$langs->trans("Credit"), 'checked'=>1), 't.lettering_code'=>array('label'=>$langs->trans("LetteringCode"), 'checked'=>1), - 't.code_journal'=>array('label'=>$langs->trans("Codejournal"), 'checked'=>1), - // '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), ); if (empty($conf->global->ACCOUNTING_ENABLE_LETTERING)) unset($arrayfields['t.lettering_code']); @@ -155,6 +158,8 @@ if (empty($reshook)) $search_date_endday = ''; $search_debit = ''; $search_credit = ''; + $search_lettering_code = ''; + $search_not_reconciled = ''; } // Must be after the remove filter action, before the export. @@ -209,9 +214,62 @@ if (empty($reshook)) $filter['t.credit'] = $search_credit; $param .= '&search_credit=' . urlencode($search_credit); } + if (!empty($search_lettering_code)) { + $filter['t.lettering_code'] = $search_lettering_code; + $param .= '&search_lettering_code='.urlencode($search_lettering_code); + } + if (!empty($search_not_reconciled)) { + $filter['t.reconciled_option'] = $search_not_reconciled; + $param .= '&search_not_reconciled='.urlencode($search_not_reconciled); + } } -if ($action == 'delmouvconfirm') { +if ($action == 'delbookkeeping' && $user->rights->accounting->mouvements->supprimer) { + $import_key = GETPOST('importkey', 'alpha'); + + if (!empty($import_key)) { + $result = $object->deleteByImportkey($import_key); + if ($result < 0) { + setEventMessages($object->error, $object->errors, 'errors'); + } + + // Make a redirect to avoid to launch the delete later after a back button + header("Location: listbyaccount.php".($param ? '?'.$param : '')); + exit; + } +} +if ($action == 'delbookkeepingyearconfirm' && $user->rights->accounting->mouvements->supprimer_tous) { + $delmonth = GETPOST('delmonth', 'int'); + $delyear = GETPOST('delyear', 'int'); + if ($delyear == -1) { + $delyear = 0; + } + $deljournal = GETPOST('deljournal', 'alpha'); + if ($deljournal == -1) { + $deljournal = 0; + } + + if (!empty($delmonth) || !empty($delyear) || !empty($deljournal)) + { + $result = $object->deleteByYearAndJournal($delyear, $deljournal, '', ($delmonth > 0 ? $delmonth : 0)); + if ($result < 0) { + setEventMessages($object->error, $object->errors, 'errors'); + } + else + { + setEventMessages("RecordDeleted", null, 'mesgs'); + } + + // Make a redirect to avoid to launch the delete later after a back button + header("Location: listbyaccount.php".($param ? '?'.$param : '')); + exit; + } + else + { + setEventMessages("NoRecordDeleted", null, 'warnings'); + } +} +if ($action == 'delmouvconfirm' && $user->rights->accounting->mouvements->supprimer) { $mvt_num = GETPOST('mvt_num', 'int'); if (!empty($mvt_num)) { @@ -219,8 +277,13 @@ if ($action == 'delmouvconfirm') { if ($result < 0) { setEventMessages($object->error, $object->errors, 'errors'); } - Header("Location: listbyaccount.php"); - exit(); + else + { + setEventMessages($langs->trans("RecordDeleted"), null, 'mesgs'); + } + + header("Location: listbyaccount.php?noreset=1".($param ? '&'.$param : '')); + exit; } } @@ -262,22 +325,42 @@ if ($action == 'delmouv') { } if ($action == 'delbookkeepingyear') { $form_question = array(); - $delyear = GETPOST('delyear'); + $delyear = GETPOST('delyear', 'int'); + $deljournal = GETPOST('deljournal', 'alpha'); if (empty($delyear)) { $delyear = dol_print_date(dol_now(), '%Y'); } + $month_array = array(); + for ($i = 1; $i <= 12; $i++) { + $month_array[$i] = $langs->trans("Month".sprintf("%02d", $i)); + } $year_array = $formaccounting->selectyear_accountancy_bookkepping($delyear, 'delyear', 0, 'array'); + $journal_array = $formaccounting->select_journal($deljournal, 'deljournal', '', 1, 1, 1, '', 0, 1); + $form_question['delmonth'] = array( + 'name' => 'delmonth', + 'type' => 'select', + 'label' => $langs->trans('DelMonth'), + 'values' => $month_array, + 'default' => '' + ); $form_question['delyear'] = array( - 'name' => 'delyear', - 'type' => 'select', - 'label' => $langs->trans('DelYear'), - 'values' => $year_array, - 'default' => $delyear + 'name' => 'delyear', + 'type' => 'select', + 'label' => $langs->trans('DelYear'), + 'values' => $year_array, + 'default' => $delyear + ); + $form_question['deljournal'] = array( + 'name' => 'deljournal', + 'type' => 'other', // We don't use select here, the journal_array is already a select html component + 'label' => $langs->trans('DelJournal'), + 'value' => $journal_array, + 'default' => $deljournal ); - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans('DeleteMvt'), $langs->trans('ConfirmDeleteMvt'), 'delbookkeepingyearconfirm', $form_question, 0, 1, 250); + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?'.$param, $langs->trans('DeleteMvt'), $langs->trans('ConfirmDeleteMvt'), 'delbookkeepingyearconfirm', $form_question, '', 1, 300); print $formconfirm; } @@ -304,35 +387,41 @@ $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage; $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields if ($massactionbutton) $selectedfields .= $form->showCheckAddButtons('checkforselect', 1); +// Reverse sort order +if (preg_match('/^asc/i', $sortorder)) $sortorder = "asc"; +else $sortorder = "desc"; + +$moreforfilter = ''; + +// Accountancy account +$moreforfilter .= '
'; +$moreforfilter .= $langs->trans('AccountAccounting').': '; +$moreforfilter .= '
'; +$moreforfilter .= $langs->trans('From').' '; +$moreforfilter .= $formaccounting->select_account($search_accountancy_code_start, 'search_accountancy_code_start', 1, array(), 1, 1, 'maxwidth200'); +$moreforfilter .= $langs->trans('to').' '; +$moreforfilter .= $formaccounting->select_account($search_accountancy_code_end, 'search_accountancy_code_end', 1, array(), 1, 1, 'maxwidth200'); +$moreforfilter .= '
'; +$moreforfilter .= '
'; + $parameters = array(); $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters); // Note that $action and $object may have been modified by hook if (empty($reshook)) $moreforfilter .= $hookmanager->resPrint; else $moreforfilter = $hookmanager->resPrint; -// Reverse sort order -if (preg_match('/^asc/i', $sortorder)) $sortorder = "asc"; -else $sortorder = "desc"; +print '
'; +print $moreforfilter; +print '
'; print '
'; print '
'.$langs->trans("Parameter").''.$key.''.$langs->trans("Value").'
'; // Filters lines print ''; -// Accountancy account -print ''; -// Movement number -if (!empty($arrayfields['t.piece_num']['checked'])) -{ - print ''; + +// Code journal +if (!empty($arrayfields['t.code_journal']['checked'])) { + print ''; } // Date document if (!empty($arrayfields['t.doc_date']['checked'])) { @@ -347,6 +436,11 @@ if (!empty($arrayfields['t.doc_date']['checked'])) { print ''; print ''; } +// Movement number +if (!empty($arrayfields['t.piece_num']['checked'])) +{ + print ''; +} // Ref document if (!empty($arrayfields['t.doc_ref']['checked'])) { print ''; @@ -363,9 +457,13 @@ if (!empty($arrayfields['t.debit']['checked'])) { if (!empty($arrayfields['t.credit']['checked'])) { print ''; } -// Code journal -if (!empty($arrayfields['t.code_journal']['checked'])) { - print ''; +// Lettering code +if (!empty($arrayfields['t.lettering_code']['checked'])) +{ + print ''; } // Fields from hook @@ -381,14 +479,14 @@ print ''; print "\n"; print ''; -print_liste_field_titre("AccountAccountingShort", $_SERVER['PHP_SELF']); -if (!empty($arrayfields['t.piece_num']['checked'])) print_liste_field_titre($arrayfields['t.piece_num']['label'], $_SERVER['PHP_SELF'], "t.piece_num", "", $param, '', $sortfield, $sortorder); +if (!empty($arrayfields['t.code_journal']['checked'])) print_liste_field_titre($arrayfields['t.code_journal']['label'], $_SERVER['PHP_SELF'], "t.code_journal", "", $param, '', $sortfield, $sortorder, 'center '); if (!empty($arrayfields['t.doc_date']['checked'])) print_liste_field_titre($arrayfields['t.doc_date']['label'], $_SERVER['PHP_SELF'], "t.doc_date", "", $param, '', $sortfield, $sortorder, 'center '); +if (!empty($arrayfields['t.piece_num']['checked'])) print_liste_field_titre($arrayfields['t.piece_num']['label'], $_SERVER['PHP_SELF'], "t.piece_num", "", $param, '', $sortfield, $sortorder); if (!empty($arrayfields['t.doc_ref']['checked'])) print_liste_field_titre($arrayfields['t.doc_ref']['label'], $_SERVER['PHP_SELF'], "t.doc_ref", "", $param, "", $sortfield, $sortorder); if (!empty($arrayfields['t.label_operation']['checked'])) print_liste_field_titre($arrayfields['t.label_operation']['label'], $_SERVER['PHP_SELF'], "t.label_operation", "", $param, "", $sortfield, $sortorder); if (!empty($arrayfields['t.debit']['checked'])) print_liste_field_titre($arrayfields['t.debit']['label'], $_SERVER['PHP_SELF'], "t.debit", "", $param, '', $sortfield, $sortorder, 'right '); if (!empty($arrayfields['t.credit']['checked'])) print_liste_field_titre($arrayfields['t.credit']['label'], $_SERVER['PHP_SELF'], "t.credit", "", $param, '', $sortfield, $sortorder, 'right '); -if (!empty($arrayfields['t.code_journal']['checked'])) print_liste_field_titre($arrayfields['t.code_journal']['label'], $_SERVER['PHP_SELF'], "t.code_journal", "", $param, '', $sortfield, $sortorder, 'center '); +if (!empty($arrayfields['t.lettering_code']['checked'])) print_liste_field_titre($arrayfields['t.lettering_code']['label'], $_SERVER['PHP_SELF'], "t.lettering_code", "", $param, '', $sortfield, $sortorder, 'center '); // Hook fields $parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder); $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook @@ -419,18 +517,42 @@ while ($i < min($num, $limit)) // Is it a break ? if ($accountg != $displayed_account_number || !isset($displayed_account_number)) { - // Affiche un Sous-Total par compte comptable + + $colspan = $totalarray['nbfield'] - 3; + $colspanend = $totalarray['nbfield'] - 7; + // Show a subtotal by accounting account if (isset($displayed_account_number)) { - print ''; - print "\n"; - print "\n"; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + // Show balance of last shown account + $balance = $sous_total_debit - $sous_total_credit; + print ''; + print ''; + if ($balance > 0 ) + { + print ''; + print ''; + } + else + { + print ''; + print ''; + } + print ''; print ''; } // Show the break account - $colspan = 9; print ""; - print ''; @@ -440,11 +562,28 @@ while ($i < min($num, $limit)) //if (empty($displayed_account_number)) $displayed_account_number='-'; $sous_total_debit = 0; $sous_total_credit = 0; + + $colspan = 0; } print ''; - print ''; - if (!$i) $totalarray['nbfield']++; + + // Journal code + if (!empty($arrayfields['t.code_journal']['checked'])) + { + $accountingjournal = new AccountingJournal($db); + $result = $accountingjournal->fetch('', $line->code_journal); + $journaltoshow = (($result > 0) ? $accountingjournal->getNomUrl(0, 0, 0, '', 0) : $line->code_journal); + print ''; + if (!$i) $totalarray['nbfield']++; + } + + // Document date + if (!empty($arrayfields['t.doc_date']['checked'])) + { + print ''; + if (!$i) $totalarray['nbfield']++; + } // Piece number if (!empty($arrayfields['t.piece_num']['checked'])) @@ -457,13 +596,6 @@ while ($i < min($num, $limit)) if (!$i) $totalarray['nbfield']++; } - // Document date - if (!empty($arrayfields['t.doc_date']['checked'])) - { - print ''; - if (!$i) $totalarray['nbfield']++; - } - // Document ref if (!empty($arrayfields['t.doc_ref']['checked'])) { @@ -565,16 +697,6 @@ while ($i < min($num, $limit)) if (!$i) $totalarray['nbfield']++; } - // Journal code - if (!empty($arrayfields['t.code_journal']['checked'])) - { - $accountingjournal = new AccountingJournal($db); - $result = $accountingjournal->fetch('', $line->code_journal); - $journaltoshow = (($result > 0) ? $accountingjournal->getNomUrl(0, 0, 0, '', 0) : $line->code_journal); - print ''; - if (!$i) $totalarray['nbfield']++; - } - // Fields from hook $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook @@ -591,25 +713,45 @@ while ($i < min($num, $limit)) } } print ''; + if (!$i) $totalarray['nbfield']++; // Comptabilise le sous-total $sous_total_debit += $line->debit; $sous_total_credit += $line->credit; - if (!$i) $totalarray['nbfield']++; - print "\n"; $i++; } // Show sub-total of last shown account +$colspan = $totalarray['nbfield'] - 3; +$colspanend = $totalarray['nbfield'] - 8; print ''; -print ''; -print ''; -print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +// Show balance of last shown account +$balance = $sous_total_debit - $sous_total_credit; +print ''; +print ''; +if ($balance > 0 ) +{ + print ''; + print ''; +} +else +{ + print ''; + print ''; +} +print ''; print ''; // Show total line diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang index eb3229efaee..adf2309ad07 100644 --- a/htdocs/langs/en_US/accountancy.lang +++ b/htdocs/langs/en_US/accountancy.lang @@ -121,6 +121,7 @@ InvoiceLinesDone=Bound lines of invoices ExpenseReportLines=Lines of expense reports to bind ExpenseReportLinesDone=Bound lines of expense reports IntoAccount=Bind line with the accounting account +TotalForAccount=Total for accounting account Ventilate=Bind From ff578198d63c4e8f4b852c96c4380f264e38b74c Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Sun, 10 May 2020 04:35:52 +0000 Subject: [PATCH 120/158] Fixing style errors. --- htdocs/accountancy/bookkeeping/listbyaccount.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/accountancy/bookkeeping/listbyaccount.php b/htdocs/accountancy/bookkeeping/listbyaccount.php index 49dbb81e77d..25f664d955e 100644 --- a/htdocs/accountancy/bookkeeping/listbyaccount.php +++ b/htdocs/accountancy/bookkeeping/listbyaccount.php @@ -517,7 +517,6 @@ while ($i < min($num, $limit)) // Is it a break ? if ($accountg != $displayed_account_number || !isset($displayed_account_number)) { - $colspan = $totalarray['nbfield'] - 3; $colspanend = $totalarray['nbfield'] - 7; // Show a subtotal by accounting account From 796f97c6715e16b162c9d23952c63a34d728ee8f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 10 May 2020 15:08:01 +0200 Subject: [PATCH 121/158] Support tag $capture in input of files --- htdocs/core/class/html.formfile.class.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index 98d781a51c1..26abcf2e721 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -78,9 +78,10 @@ class FormFile * @param string $accept Specifies the types of files accepted (This is not a security check but an user interface facility. eg '.pdf,image/*' or '.png,.jpg' or 'video/*') * @param string $sectiondir If upload must be done inside a particular directory (if sectiondir defined, sectionid must not be) * @param int $usewithoutform 0=Default, 1=Disable
and style to use in existing area + * @param int $capture 1=Add tag capture="capture" to force use of micro or video recording to generate file. When setting this to 1, you must also provide a value for $accept. * @return int <0 if KO, >0 if OK */ - public function form_attach_new_file($url, $title = '', $addcancel = 0, $sectionid = 0, $perm = 1, $size = 50, $object = '', $options = '', $useajax = 1, $savingdocmask = '', $linkfiles = 1, $htmlname = 'formuserfile', $accept = '', $sectiondir = '', $usewithoutform = 0) + public function form_attach_new_file($url, $title = '', $addcancel = 0, $sectionid = 0, $perm = 1, $size = 50, $object = '', $options = '', $useajax = 1, $savingdocmask = '', $linkfiles = 1, $htmlname = 'formuserfile', $accept = '', $sectiondir = '', $usewithoutform = 0, $capture = 0) { // phpcs:enable global $conf, $langs, $hookmanager; @@ -170,6 +171,7 @@ class FormFile $out .= ((!empty($conf->global->MAIN_DISABLE_MULTIPLE_FILEUPLOAD) || $conf->browser->layout != 'classic') ? ' name="userfile"' : ' name="userfile[]" multiple'); $out .= (empty($conf->global->MAIN_UPLOAD_DOC) || empty($perm) ? ' disabled' : ''); $out .= (!empty($accept) ? ' accept="'.$accept.'"' : ' accept=""'); + $out .= (!empty($capture) ? ' capture="capture"' : ''); $out .= '>'; $out .= ' '; if ($sectionid) { // Show overwrite if exists for ECM module only From 501f1ba2c403f12c90c8a76810bec39540581e64 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 10 May 2020 15:45:07 +0200 Subject: [PATCH 122/158] Fix look and feel v12 --- htdocs/contrat/document.php | 1 - htdocs/core/ajax/selectsearchbox.php | 2 +- htdocs/core/lib/functions.lib.php | 9 +++++---- htdocs/main.inc.php | 8 ++++---- htdocs/theme/eldy/global.inc.php | 6 +++++- htdocs/theme/md/style.css.php | 2 ++ 6 files changed, 17 insertions(+), 11 deletions(-) diff --git a/htdocs/contrat/document.php b/htdocs/contrat/document.php index 7d47b5102ac..fd3b3f66e4a 100644 --- a/htdocs/contrat/document.php +++ b/htdocs/contrat/document.php @@ -179,7 +179,6 @@ if ($object->id) print '
'; print '
'; - print '
'; -print '
'; -print $langs->trans('From').' '; -print $formaccounting->select_account($search_accountancy_code_start, 'search_accountancy_code_start', 1, array(), 1, 1, 'maxwidth200'); -print '
'; -print '
'; -print $langs->trans('to').' '; -print $formaccounting->select_account($search_accountancy_code_end, 'search_accountancy_code_end', 1, array(), 1, 1, 'maxwidth200'); -print '
'; -print '
'; + print ''; + print '
'.$langs->trans("NotReconciled").''; + print '
'.$langs->trans("SubTotal").':'.price($sous_total_debit).''.price($sous_total_credit).'  
'.$langs->trans("TotalForAccount").' '.length_accountg($displayed_account_number).':'.price($sous_total_debit).''.price($sous_total_credit).'
'.$langs->trans("Balance").':'; + print price($sous_total_debit - $sous_total_credit); + print ''; + print price($sous_total_credit - $sous_total_debit); + print '
'; + print ''; if ($line->numero_compte != "" && $line->numero_compte != '-1') print length_accountg($line->numero_compte).' : '.$object->get_compte_desc($line->numero_compte); else print ''.$langs->trans("Unknown").''; print '
 '.$journaltoshow.''.dol_print_date($line->doc_date, 'day').''.dol_print_date($line->doc_date, 'day').''.$journaltoshow.'
'.$langs->trans("SubTotal").':'.price($sous_total_debit).''.price($sous_total_credit).''; -print price($sous_total_debit - $sous_total_credit); -print ''.$langs->trans("TotalForAccount").' '.$accountg.':'.price($sous_total_debit).''.price($sous_total_credit).'
'.$langs->trans("Balance").':'; + print price($sous_total_debit - $sous_total_credit); + print ''; + print price($sous_total_credit - $sous_total_debit); + print '
'; print ''; print ''; diff --git a/htdocs/core/ajax/selectsearchbox.php b/htdocs/core/ajax/selectsearchbox.php index 2f8ad4ab5f7..31a95d1e02c 100644 --- a/htdocs/core/ajax/selectsearchbox.php +++ b/htdocs/core/ajax/selectsearchbox.php @@ -99,7 +99,7 @@ if (!empty($conf->commande->enabled) && empty($conf->global->MAIN_SEARCHFORM_CUS } if (!empty($conf->expedition->enabled) && empty($conf->global->MAIN_SEARCHFORM_CUSTOMER_SHIPMENT_DISABLED) && $user->rights->expedition->lire) { - $arrayresult['searchintoshipment'] = array('position'=>80, 'img'=>'object_sending', 'label'=>$langs->trans("SearchIntoCustomerShipments", $search_boxvalue), 'text'=>img_picto('', 'object_sending').' '.$langs->trans("SearchIntoCustomerShipments", $search_boxvalue), 'url'=>DOL_URL_ROOT.'/expedition/list.php'.($search_boxvalue ? '?sall='.urlencode($search_boxvalue) : '')); + $arrayresult['searchintoshipment'] = array('position'=>80, 'img'=>'object_shipment', 'label'=>$langs->trans("SearchIntoCustomerShipments", $search_boxvalue), 'text'=>img_picto('', 'object_shipment').' '.$langs->trans("SearchIntoCustomerShipments", $search_boxvalue), 'url'=>DOL_URL_ROOT.'/expedition/list.php'.($search_boxvalue ? '?sall='.urlencode($search_boxvalue) : '')); } if (!empty($conf->facture->enabled) && empty($conf->global->MAIN_SEARCHFORM_CUSTOMER_INVOICE_DISABLED) && $user->rights->facture->lire) { diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index bcf47a58eef..89e76156448 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -3162,7 +3162,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $ 'object_margin', 'object_money-bill-alt', 'object_multicurrency', 'object_order', 'object_payment', 'object_lot', 'object_mrp', 'object_payment', 'object_product', 'object_propal', 'object_other', 'object_paragraph', 'object_poll', 'object_printer', 'object_project', 'object_projectpub', 'object_propal', 'object_resource', 'object_rss', 'object_projecttask', - 'object_supplier_invoice', 'object_supplier_order', 'object_supplier_proposal', 'object_service', 'object_stock', + 'object_shipment', 'object_supplier_invoice', 'object_supplier_order', 'object_supplier_proposal', 'object_service', 'object_stock', 'object_technic', 'object_ticket', 'object_trip', 'object_user', 'object_group', 'object_member', 'object_phoning', 'object_phoning_mobile', 'object_phoning_fax', 'object_email', 'off', 'on', 'order', @@ -3209,7 +3209,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $ 'resize'=>'crop', 'supplier_order'=>'dol-order_supplier', 'supplier_proposal'=>'file-signature', 'payment'=>'money-check-alt', 'phoning'=>'phone', 'phoning_mobile'=>'mobile-alt', 'phoning_fax'=>'fax', 'printer'=>'print', 'product'=>'cube', 'service'=>'concierge-bell', 'resource'=>'laptop-house', - 'stock'=>'box-open', 'stats' => 'chart-bar', 'split'=>'code-branch', 'supplier_invoice'=>'file-invoice-dollar', 'technic'=>'cogs', 'ticket'=>'ticket-alt', + 'shipment'=>'dolly', 'stock'=>'box-open', 'stats' => 'chart-bar', 'split'=>'code-branch', 'supplier_invoice'=>'file-invoice-dollar', 'technic'=>'cogs', 'ticket'=>'ticket-alt', 'title_setup'=>'tools', 'title_accountancy'=>'money-check-alt', 'title_bank'=>'university', 'title_hrm'=>'umbrella-beach', 'title_agenda'=>'calendar-alt', 'uparrow'=>'mail-forward', @@ -3273,7 +3273,8 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $ 'error'=>'pictoerror', 'warning'=>'pictowarning', 'switch_on'=>'font-status4', 'holiday'=>'bg-infobox-holiday', 'invoice'=>'bg-infobox-commande', 'payment'=>'bg-infobox-bank_account', 'poll'=>'bg-infobox-adherent', 'project'=>'bg-infobox-project', 'projecttask'=>'bg-infobox-project', 'propal'=>'bg-infobox-propal', - 'resource'=>'bg-infobox-action', 'supplier_invoice'=>'bg-infobox-order_supplier', 'supplier_order'=>'bg-infobox-order_supplier', 'supplier_proposal'=>'bg-infobox-supplier_proposal', + 'resource'=>'bg-infobox-action', + 'supplier_invoice'=>'bg-infobox-order_supplier', 'supplier_order'=>'bg-infobox-order_supplier', 'supplier_proposal'=>'bg-infobox-supplier_proposal', 'ticket'=>'bg-infobox-contrat', 'title_accountancy'=>'bg-infobox-bank_account', 'title_hrm'=>'bg-infobox-holiday', 'trip'=>'bg-infobox-expensereport', 'title_agenda'=>'bg-infobox-action', //'title_setup'=>'bg-infobox-action', 'tools'=>'bg-infobox-action', 'list-alt'=>'imgforviewmode', 'calendar'=>'imgforviewmode', 'calendarweek'=>'imgforviewmode', 'calendarmonth'=>'imgforviewmode', 'calendarday'=>'imgforviewmode', 'calendarperuser'=>'imgforviewmode' @@ -3291,7 +3292,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $ 'map-marker-alt'=>'#aaa', 'mrp'=>'#a69944', 'product'=>'#a69944', 'service'=>'#a69944', 'stock'=>'#a69944', 'other'=>'#ddd', 'playdisabled'=>'#ccc', 'printer'=>'#444', 'projectpub'=>'#986c6a', 'resize'=>'#444', 'rss'=>'#cba', - 'stats'=>'#444', 'switch_off'=>'#999', 'uparrow'=>'#555', 'globe-americas'=>'#aaa' + 'shipment'=>'#a69944', 'stats'=>'#444', 'switch_off'=>'#999', 'uparrow'=>'#555', 'globe-americas'=>'#aaa' ); if (isset($arrayconvpictotocolor[$pictowithouttext])) { $facolor = $arrayconvpictotocolor[$pictowithouttext]; diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 6533b4bfe54..8ebd68631cb 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -2180,7 +2180,7 @@ function left_menu($menu_array_before, $helppagename = '', $notused = '', $menu_ } else { if (is_array($arrayresult)) { foreach ($arrayresult as $key => $val) { - $searchform .= printSearchForm($val['url'], $val['url'], $val['label'], 'maxwidth125', 'sall', $val['shortcut'], 'searchleft'.$key, img_picto('', $val['img'], '', false, 1, 1)); + $searchform .= printSearchForm($val['url'], $val['url'], $val['label'], 'maxwidth125', 'sall', $val['shortcut'], 'searchleft'.$key, $val['img']); } } } @@ -2453,14 +2453,14 @@ function printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinpu $ret .= ''; if ($showtitlebefore) $ret .= '
'.$title.'
'; $ret .= '
'; + $ret .= img_picto('', $img, '', false, 0, 0, '', 'paddingright width20'); $ret .= ''; - //$ret.=''; - $ret .= ''; $ret .= '
'; diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 9e099c6953d..4ec62c217a5 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -1027,6 +1027,7 @@ table[summary="list_of_modules"] .fa-cog { /* rule for not too small screen only */ @media only screen and (min-width: global->THEME_ELDY_WITDHOFFSET_FOR_REDUC3) ? round($nbtopmenuentries * 47, 0) + 130 : $conf->global->THEME_ELDY_WITDHOFFSET_FOR_REDUC3; ?>px) { + .width20 { width: 20px; } .width25 { width: 25px; } .width50 { width: 50px; } .width75 { width: 75px; } @@ -1048,6 +1049,7 @@ table[summary="list_of_modules"] .fa-cog { .minwidth500imp { min-width: 500px !important; } } .widthauto { width: auto; } +.width20 { width: 20px; } .width25 { width: 25px; } .width50 { width: 50px; } .width75 { width: 75px; } @@ -6309,7 +6311,9 @@ div.tabsElem a.tab { div.login_block_user, div.login_block_other { clear: both; } .atoplogin, .atoplogin:hover { - color: #000 !important; + color:unset !important; + padding-left: 4px; + padding-right: 4px; } .login_block_elem { padding: 0 !important; diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index c995426edd9..71fbb6f50da 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -1122,6 +1122,7 @@ table[summary="list_of_modules"] .fa-cog { /* rule for not too small screen only */ @media only screen and (min-width: px) { + .width20 { width: 20px; } .width25 { width: 25px; } .width50 { width: 50px; } .width75 { width: 75px; } @@ -1143,6 +1144,7 @@ table[summary="list_of_modules"] .fa-cog { .minwidth500imp { min-width: 500px !important; } } .widthauto { width: auto; } +.width20 { width: 20px; } .width25 { width: 25px; } .width50 { width: 50px; } .width75 { width: 75px; } From fbbb898d528e526b9ff9b8a7e47d4a027718d96b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 10 May 2020 18:31:55 +0200 Subject: [PATCH 123/158] Better log --- scripts/cron/cron_run_jobs.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/cron/cron_run_jobs.php b/scripts/cron/cron_run_jobs.php index 24e92c79d0b..79d52c49445 100755 --- a/scripts/cron/cron_run_jobs.php +++ b/scripts/cron/cron_run_jobs.php @@ -227,11 +227,13 @@ if (is_array($qualifiedjobs) && (count($qualifiedjobs) > 0)) { echo "You can also enable module Log if not yet enabled, run again and take a look into dolibarr.log file\n"; dol_syslog("cron_run_jobs.php::run_jobs Error ".$cronjob->error, LOG_ERR); $nbofjobslaunchedko++; + $resultstring = 'KO'; } else { $nbofjobslaunchedok++; + $resultstring = 'OK'; } - echo " - result of run_jobs = ".$result; + echo " - run_jobs ".$resultstring." result = ".$result; // We re-program the next execution and stores the last execution time for this job $result = $cronjob->reprogram_jobs($userlogin, $now); From c511af69fe31ec911679f93de77aeffbc541a952 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 10 May 2020 21:07:49 +0200 Subject: [PATCH 124/158] Debug look and feel v12 --- htdocs/core/class/html.form.class.php | 5 ++- htdocs/core/class/html.formactions.class.php | 5 ++- htdocs/core/lib/agenda.lib.php | 44 ++++++++++--------- htdocs/core/modules/DolibarrModules.class.php | 2 +- .../class/html.formresource.class.php | 5 ++- htdocs/theme/eldy/global.inc.php | 31 +++++++++---- 6 files changed, 55 insertions(+), 37 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index ee24af9f307..5fe411c6260 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -7676,10 +7676,11 @@ class Form * @param int $enableonly Array list of groups id to be enabled. All other must be disabled * @param string $force_entity '0' or Ids of environment to force * @param bool $multiple add [] in the name of element and add 'multiple' attribut (not working with ajax_autocompleter) + * @param string $morecss More css to add to html component * @return string * @see select_dolusers() */ - public function select_dolgroups($selected = '', $htmlname = 'groupid', $show_empty = 0, $exclude = '', $disabled = 0, $include = '', $enableonly = '', $force_entity = '0', $multiple = false) + public function select_dolgroups($selected = '', $htmlname = 'groupid', $show_empty = 0, $exclude = '', $disabled = 0, $include = '', $enableonly = '', $force_entity = '0', $multiple = false, $morecss = '') { // phpcs:enable global $conf, $user, $langs; @@ -7722,7 +7723,7 @@ class Form include_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php'; $out .= ajax_combobox($htmlname); - $out .= ''; $num = $this->db->num_rows($resql); $i = 0; diff --git a/htdocs/core/class/html.formactions.class.php b/htdocs/core/class/html.formactions.class.php index 352fcebb06b..8aa51a66ab7 100644 --- a/htdocs/core/class/html.formactions.class.php +++ b/htdocs/core/class/html.formactions.class.php @@ -339,9 +339,10 @@ class FormActions * @param int $hideinfohelp 1=Do not show info help, 0=Show, -1=Show+Add info to tell how to set default value * @param int $multiselect 1=Allow multiselect of action type * @param int $nooutput 1=No output + * @param string $morecss More css to add to SELECT component. * @return string */ - public function select_type_actions($selected = '', $htmlname = 'actioncode', $excludetype = '', $onlyautoornot = 0, $hideinfohelp = 0, $multiselect = 0, $nooutput = 0) + public function select_type_actions($selected = '', $htmlname = 'actioncode', $excludetype = '', $onlyautoornot = 0, $hideinfohelp = 0, $multiselect = 0, $nooutput = 0, $morecss = '') { // phpcs:enable global $langs, $user, $form, $conf; @@ -371,7 +372,7 @@ class FormActions } else { - $out .= $form->selectarray($htmlname, $arraylist, $selected, 0, 0, 0, '', 0, 0, 0, '', 'minwidth200', 1); + $out .= $form->selectarray($htmlname, $arraylist, $selected, 0, 0, 0, '', 0, 0, 0, '', 'minwidth200'.($morecss ? ' '.$morecss : ''), 1); } if ($user->admin && empty($onlyautoornot) && $hideinfohelp <= 0) diff --git a/htdocs/core/lib/agenda.lib.php b/htdocs/core/lib/agenda.lib.php index 474a4f03696..532ef091698 100644 --- a/htdocs/core/lib/agenda.lib.php +++ b/htdocs/core/lib/agenda.lib.php @@ -77,27 +77,29 @@ function print_actions_filter($form, $canedit, $status, $year, $month, $day, $sh { // Type print ''; - print ''; // Assigned to print ''; - print ''; if ($conf->resource->enabled) @@ -109,9 +111,9 @@ function print_actions_filter($form, $canedit, $status, $year, $month, $day, $sh print ''; print ''; } } @@ -119,11 +121,11 @@ function print_actions_filter($form, $canedit, $status, $year, $month, $day, $sh if (!empty($conf->societe->enabled) && $user->rights->societe->lire) { print ''; - print ''; } @@ -133,10 +135,10 @@ function print_actions_filter($form, $canedit, $status, $year, $month, $day, $sh $formproject = new FormProjets($db); print ''; - print ''; } @@ -145,9 +147,9 @@ function print_actions_filter($form, $canedit, $status, $year, $month, $day, $sh { // Status print ''; - print ''; } diff --git a/htdocs/core/modules/DolibarrModules.class.php b/htdocs/core/modules/DolibarrModules.class.php index c592cb69959..9543cf74442 100644 --- a/htdocs/core/modules/DolibarrModules.class.php +++ b/htdocs/core/modules/DolibarrModules.class.php @@ -2314,7 +2314,7 @@ class DolibarrModules // Can not be abstract, because we need to instantiate it print '
'.$this->getName().' - '.nl2br($this->getDesc()).''; + '.nl2br($this->getDesc()).''; /*print 'getVersion(1).'">'; print $this->getVersion(1); diff --git a/htdocs/resource/class/html.formresource.class.php b/htdocs/resource/class/html.formresource.class.php index 3c0bb36116e..36d3fc854cc 100644 --- a/htdocs/resource/class/html.formresource.class.php +++ b/htdocs/resource/class/html.formresource.class.php @@ -74,9 +74,10 @@ class FormResource * @param string $filterkey Filter on key value * @param int $outputmode 0=HTML select string, 1=Array, 2=without form tag * @param int $limit Limit number of answers + * @param string $morecss More css * @return string HTML string with */ - public function select_resource_list($selected = '', $htmlname = 'fk_resource', $filter = '', $showempty = 0, $showtype = 0, $forcecombo = 0, $event = array(), $filterkey = '', $outputmode = 0, $limit = 20) + public function select_resource_list($selected = '', $htmlname = 'fk_resource', $filter = '', $showempty = 0, $showtype = 0, $forcecombo = 0, $event = array(), $filterkey = '', $outputmode = 0, $limit = 20, $morecss = '') { // phpcs:enable global $conf, $user, $langs; @@ -103,7 +104,7 @@ class FormResource } // Construct $out and $outarray - $out .= ''."\n"; if ($showempty) $out .= ''."\n"; $num = 0; diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 4ec62c217a5..dc0c77ed67d 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -670,7 +670,9 @@ body[class*="colorblind-"] .text-success{ .editfielda span.fa-pencil-alt:hover, .editfielda span.fa-trash:hover, .editfieldlang:hover { color: var(--colortexttitle) !important; } - +.fawidth30 { + width: 20px; +} .floatnone { float: none !important; } @@ -1137,6 +1139,19 @@ table[summary="list_of_modules"] .fa-cog { .hideonsmartphone { display: none; } .hideonsmartphoneimp { display: none !important; } + + span.pictotitle { + margin-: 0 !important; + } + div.fiche>table.table-fiche-title { + margin-top: 7px !important; + margin-bottom: 15px !important; + } + + select.minwidth100imp, select.minwidth100, select.minwidth200, .widthcentpercentminusx { + width: calc(100% - 30px) !important; + display: inline-block; + } } /* Force values for small screen 570 */ @@ -1145,6 +1160,10 @@ table[summary="list_of_modules"] .fa-cog { body { font-size: ; } + + .box-flex-item { + margin: 3px 2px 3px 2px !important; + } div.refidno { font-size: !important; } @@ -1472,10 +1491,10 @@ body.onlinepaymentbody div.fiche { /* For online payment page */ margin: 20px !important; } div.fiche>table:first-child { - margin-bottom: 15px !important; + margin-bottom: 15px; } div.fiche>table.table-fiche-title { - margin-bottom: 7px !important; + margin-bottom: 7px; } div.fichecenter { width: 100%; @@ -1607,12 +1626,6 @@ td.nobordernopadding.widthpictotitle.col-picto { margin-: 8px; /* margin-bottom: 4px; */ } -@media only screen and (max-width: 767px) -{ - span.pictotitle { - margin-: 0 !important; - } -} .pictoobjectwidth { width: 14px; } From a83af075aa7867a404f5fb125515c120a042756f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 11 May 2020 00:35:05 +0200 Subject: [PATCH 125/158] Fix responsive --- htdocs/admin/index.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/admin/index.php b/htdocs/admin/index.php index 1a55fbc04ee..1a27d61e55d 100644 --- a/htdocs/admin/index.php +++ b/htdocs/admin/index.php @@ -67,12 +67,12 @@ if (!empty($conf->global->MAIN_MOTD_SETUPPAGE)) } } -print ''; -print $langs->trans("SetupDescription1"); +print ''; +print $langs->trans("SetupDescription1").' '; print $langs->trans("AreaForAdminOnly").' '; print $langs->trans("SetupDescription2", $langs->transnoentities("MenuCompanySetup"), $langs->transnoentities("Modules")); -print ''; print "

"; +print '
'; print '
'; From 7300b45bcd9af35dc206830d71708853615eed60 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 11 May 2020 01:19:33 +0200 Subject: [PATCH 126/158] Responsive --- htdocs/adherents/index.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/htdocs/adherents/index.php b/htdocs/adherents/index.php index 44fcb397ddc..6d069386592 100644 --- a/htdocs/adherents/index.php +++ b/htdocs/adherents/index.php @@ -1,9 +1,9 @@ * Copyright (C) 2003 Jean-Louis Bergamo - * Copyright (C) 2004-2017 Laurent Destailleur + * Copyright (C) 2004-2020 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin - * Copyright (C) 2019 Nicolas ZABOURI + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -22,7 +22,7 @@ /** * \file htdocs/adherents/index.php * \ingroup member - * \brief Page accueil module adherents + * \brief Home page of membership module */ require '../main.inc.php'; @@ -339,7 +339,7 @@ if ($resql) $staticmember->ref = $staticmember->getFullName($langs); $statictype->id = $obj->typeid; $statictype->label = $obj->label; - print '
'; + print ''; print ''; print ''; print ''; @@ -399,12 +399,12 @@ if ($resql) $staticmember->name = $obj->company; } $staticmember->ref = $staticmember->getFullName($langs); - print ''; - print ''; - print ''; + print ''; + print ''; + print ''; print ''; //print ''; - print ''; + print ''; print ''; $i++; } From 02ec28281296c16044ecd714230ad935625eb3f0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 11 May 2020 03:34:30 +0200 Subject: [PATCH 127/158] Typo --- htdocs/langs/en_US/admin.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 3cf6e6044db..9ad7d2cf55a 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1015,7 +1015,7 @@ LocalTax2IsUsedDescES=The IRPF rate by default when creating prospects, invoices LocalTax2IsNotUsedDescES=By default the proposed IRPF is 0. End of rule. LocalTax2IsUsedExampleES=In Spain, freelancers and independent professionals who provide services and companies who have chosen the tax system of modules. LocalTax2IsNotUsedExampleES=In Spain they are businesses not subject to tax system of modules. -RevenueStampDesc=The "tax stamp" or "revenue stamp" is a fixed tax you per invoice (It does not depend on amount of invoice). It can also be a percent tax but using the second or third type of tax is better for percent taxes as tax stamps des not provide any reporting. Only few countries uses this type of tax. +RevenueStampDesc=The "tax stamp" or "revenue stamp" is a fixed tax you per invoice (It does not depend on amount of invoice). It can also be a percent tax but using the second or third type of tax is better for percent taxes as tax stamps does not provide any reporting. Only few countries uses this type of tax. UseRevenueStamp=Use a tax stamp UseRevenueStampExample=The value of tax stamp is defined by default into the setup of dictionaries (%s - %s - %s) CalcLocaltax=Reports on local taxes From a8dcd2d09b2a933f1e5525340e4db31786aece88 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 11 May 2020 11:53:13 +0200 Subject: [PATCH 128/158] Clean code --- htdocs/core/class/conf.class.php | 2 -- htdocs/core/lib/functions.lib.php | 26 +++++++------------------- 2 files changed, 7 insertions(+), 21 deletions(-) diff --git a/htdocs/core/class/conf.class.php b/htdocs/core/class/conf.class.php index 0a52301e608..dee4edc3298 100644 --- a/htdocs/core/class/conf.class.php +++ b/htdocs/core/class/conf.class.php @@ -690,8 +690,6 @@ class Conf $this->global->AGENDA_DEFAULT_FILTER_TYPE = '0'; // 'AC_NON_AUTO' does not exists when AGENDA_DEFAULT_FILTER_TYPE is not on. } - if (!isset($this->global->MAIN_USE_OLD_TITLE_BUTTON)) $this->global->MAIN_USE_OLD_TITLE_BUTTON = 0; - if (!isset($this->global->MAIN_JS_GRAPH)) $this->global->MAIN_JS_GRAPH = 'chart'; // Use chart.js library if (empty($this->global->MAIN_MODULE_DOLISTORE_API_SRV)) $this->global->MAIN_MODULE_DOLISTORE_API_SRV = 'https://www.dolistore.com'; diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 89e76156448..5f31b07214c 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -4523,15 +4523,17 @@ function print_fleche_navigation($page, $file, $options = '', $nextpage = 0, $be } if ($page > 0) { - print ''; + print ''; } if ($betweenarrows) { + print ''; print $betweenarrows; + print ''; } if ($nextpage > 0) { - print ''; + print ''; } if ($afterarrows) { @@ -8623,11 +8625,8 @@ function dolGetButtonTitle($label, $helpText = '', $iconClass = 'fa fa-file', $u } $class = 'btnTitle'; + if ($iconClass == 'fa fa-plus-circle') $class .= ' btnTitlePlus'; - // hidden conf keep during button transition TODO: remove this block - if (!empty($conf->global->MAIN_USE_OLD_TITLE_BUTTON)) { - $class = 'butActionNew'; - } if (!empty($params['morecss'])) $class .= ' '.$params['morecss']; $attr = array( @@ -8642,11 +8641,6 @@ function dolGetButtonTitle($label, $helpText = '', $iconClass = 'fa fa-file', $u if ($status <= 0) { $attr['class'] .= ' refused'; - // hidden conf keep during button transition TODO: remove this block - if (!empty($conf->global->MAIN_USE_OLD_TITLE_BUTTON)) { - $attr['class'] = 'butActionNewRefused'; - } - $attr['href'] = ''; if ($status == -1) { // disable @@ -8698,18 +8692,12 @@ function dolGetButtonTitle($label, $helpText = '', $iconClass = 'fa fa-file', $u $tag = (empty($attr['href']) ? 'span' : 'a'); - $button = '<'.$tag.' '.$compiledAttributes.' >'; + $button = ''; + $button .= '<'.$tag.' '.$compiledAttributes.' >'; $button .= ''; $button .= ''.$label.''; $button .= ''; - // hidden conf keep during button transition TODO: remove this block - if (!empty($conf->global->MAIN_USE_OLD_TITLE_BUTTON)) { - $button = '<'.$tag.' '.$compiledAttributes.' >'.$label.''; - $button .= ''; - $button .= ''; - } - return $button; } From a2bc46f1c012346c5c0ee5f006c5bd59ccd988ea Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 11 May 2020 12:50:24 +0200 Subject: [PATCH 129/158] CSS --- htdocs/core/ajax/ajaxdirtree.php | 4 ++-- htdocs/core/lib/agenda.lib.php | 6 +++--- htdocs/resource/class/html.formresource.class.php | 5 +++-- htdocs/theme/eldy/global.inc.php | 12 +++++++++--- htdocs/theme/eldy/info-box.inc.php | 11 +++++------ 5 files changed, 22 insertions(+), 16 deletions(-) diff --git a/htdocs/core/ajax/ajaxdirtree.php b/htdocs/core/ajax/ajaxdirtree.php index 04687b77829..3e54532668a 100644 --- a/htdocs/core/ajax/ajaxdirtree.php +++ b/htdocs/core/ajax/ajaxdirtree.php @@ -428,11 +428,11 @@ function treeOutputForAbsoluteDir($sqltree, $selecteddir, $fullpathselecteddir, print (isset($val['cachenbofdoc']) && $val['cachenbofdoc'] >= 0) ? $val['cachenbofdoc'] : ' '; print ''; print ''; // Edit link - print ''; diff --git a/htdocs/core/lib/agenda.lib.php b/htdocs/core/lib/agenda.lib.php index 532ef091698..5d450aa4b04 100644 --- a/htdocs/core/lib/agenda.lib.php +++ b/htdocs/core/lib/agenda.lib.php @@ -109,9 +109,9 @@ function print_actions_filter($form, $canedit, $status, $year, $month, $day, $sh // Resource print ''; - print ''; @@ -158,7 +158,7 @@ function print_actions_filter($form, $canedit, $status, $year, $month, $day, $sh { // Filter on hours print ''; - print ''; + print ''; print "'; } diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 8f2e0973ab3..44fb0865682 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -5387,11 +5387,11 @@ class Product extends CommonObject $label_type = 'short_label'; } - $sql = 'select '.$label_type.' from '.MAIN_DB_PREFIX.'c_units where rowid='.$this->fk_unit; + $sql = 'select '.$label_type.', code from '.MAIN_DB_PREFIX.'c_units where rowid='.$this->fk_unit; $resql = $this->db->query($sql); if ($resql && $this->db->num_rows($resql) > 0) { $res = $this->db->fetch_array($resql); - $label = $res[$label_type]; + $label = $label_type == 'short' ? $res[$label_type] : $langs->trans('unit' . $res['code']); $this->db->free($resql); return $label; } From 64d2f906bc7cdf2c4bbcb733ca4668ce7eae868e Mon Sep 17 00:00:00 2001 From: atm-greg Date: Mon, 11 May 2020 16:35:58 +0200 Subject: [PATCH 131/158] fix visibility of extrafields in public interface --- htdocs/public/ticket/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/public/ticket/list.php b/htdocs/public/ticket/list.php index 1a18954994f..a7f9b49fd58 100644 --- a/htdocs/public/ticket/list.php +++ b/htdocs/public/ticket/list.php @@ -235,7 +235,7 @@ if ($action == "view_ticketlist") if (is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) { foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) { if ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate') { - $arrayfields["ef.".$key] = array('label' => $extrafields->attributes[$object->table_element]['label'][$key], 'checked' => $extrafields->attributes[$object->table_element]['list'][$key], 'position' => $extrafields->attributes[$object->table_element]['pos'][$key], 'enabled' => $extrafields->attributes[$object->table_element]['perms'][$key]); + $arrayfields["ef.".$key] = array('label' => $extrafields->attributes[$object->table_element]['label'][$key], 'checked' => ($extrafields->attributes[$object->table_element]['list'][$key] < 0) ? 0 : 1, 'position' => $extrafields->attributes[$object->table_element]['pos'][$key], 'enabled' =>(abs($extrafields->attributes[$object->table_element]['list'][$key]) != 3) && $extrafields->attributes[$object->table_element]['perms'][$key]); } } } From 097de7b3cd934e67a00cb0a9c82bc02e6c47d838 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Mon, 11 May 2020 18:34:54 +0200 Subject: [PATCH 132/158] Only add empty select if no multiselect --- htdocs/core/class/html.formactions.class.php | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/htdocs/core/class/html.formactions.class.php b/htdocs/core/class/html.formactions.class.php index 8aa51a66ab7..398e2b8a235 100644 --- a/htdocs/core/class/html.formactions.class.php +++ b/htdocs/core/class/html.formactions.class.php @@ -353,10 +353,13 @@ class FormActions require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php'; $caction = new CActionComm($this->db); - // Suggest a list with manual events or all auto events - $arraylist = $caction->liste_array(1, 'code', $excludetype, $onlyautoornot); - array_unshift($arraylist, ' '); // Add empty line at start - //asort($arraylist); + // Suggest a list with manual events or all auto events + $arraylist = $caction->liste_array(1, 'code', $excludetype, $onlyautoornot); + if (empty($multiselect)) { + // Add empty line at start only if no multiselect + array_unshift($arraylist, ' '); + } + //asort($arraylist); if ($selected == 'manual') $selected = 'AC_OTH'; if ($selected == 'auto') $selected = 'AC_OTH_AUTO'; From 3a46d5a3dddaf7b581f11867cbbd4ee1cd74d9b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Mon, 11 May 2020 18:46:54 +0200 Subject: [PATCH 133/158] Update agenda_other.php --- htdocs/admin/agenda_other.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/htdocs/admin/agenda_other.php b/htdocs/admin/agenda_other.php index 10bfa13d1ce..c5b196146d5 100644 --- a/htdocs/admin/agenda_other.php +++ b/htdocs/admin/agenda_other.php @@ -81,8 +81,10 @@ if (preg_match('/del_([a-z0-9_\-]+)/i', $action, $reg)) } if ($action == 'set') { + $getDefaultFilter = GETPOST('AGENDA_DEFAULT_FILTER_TYPE'); + $defaultfilter = (is_array($getDefaultFilter)) ? implode(',', $getDefaultFilter) : $getDefaultFilter; dolibarr_set_const($db, 'AGENDA_USE_EVENT_TYPE_DEFAULT', GETPOST('AGENDA_USE_EVENT_TYPE_DEFAULT'), 'chaine', 0, '', $conf->entity); - dolibarr_set_const($db, 'AGENDA_DEFAULT_FILTER_TYPE', GETPOST('AGENDA_DEFAULT_FILTER_TYPE'), 'chaine', 0, '', $conf->entity); + dolibarr_set_const($db, 'AGENDA_DEFAULT_FILTER_TYPE', $defaultfilter, 'chaine', 0, '', $conf->entity); dolibarr_set_const($db, 'AGENDA_DEFAULT_FILTER_STATUS', GETPOST('AGENDA_DEFAULT_FILTER_STATUS'), 'chaine', 0, '', $conf->entity); dolibarr_set_const($db, 'AGENDA_DEFAULT_VIEW', GETPOST('AGENDA_DEFAULT_VIEW'), 'chaine', 0, '', $conf->entity); } @@ -377,7 +379,12 @@ print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; // AGENDA_DEFAULT_FILTER_STATUS From 44d36815bd88eff1960f560de635a37f1cfcbfc7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 11 May 2020 19:00:27 +0200 Subject: [PATCH 134/158] Look and feel v12 --- htdocs/comm/mailing/card.php | 2 +- htdocs/comm/mailing/list.php | 2 +- htdocs/core/lib/functions.lib.php | 10 ++++++---- htdocs/core/modules/modCollab.class.php | 2 +- htdocs/core/modules/modWebsite.class.php | 2 +- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/htdocs/comm/mailing/card.php b/htdocs/comm/mailing/card.php index 68a6b8db331..e3cb5a9ad97 100644 --- a/htdocs/comm/mailing/card.php +++ b/htdocs/comm/mailing/card.php @@ -742,7 +742,7 @@ if ($action == 'create') // Print mail form - print load_fiche_titre($langs->trans("NewMailing"), $availablelink, 'generic'); + print load_fiche_titre($langs->trans("NewMailing"), $availablelink, 'object_email'); dol_fiche_head(); diff --git a/htdocs/comm/mailing/list.php b/htdocs/comm/mailing/list.php index 8feaa5a4d93..8119224bbfa 100644 --- a/htdocs/comm/mailing/list.php +++ b/htdocs/comm/mailing/list.php @@ -188,7 +188,7 @@ if ($resql) print ''; print ''; - print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'generic', 0, $newcardbutton, '', $limit, 0, 0, 1); + print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'object_email', 0, $newcardbutton, '', $limit, 0, 0, 1); $moreforfilter = ''; diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 5f31b07214c..20094da216c 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -3158,13 +3158,13 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $ 'object_category', 'object_conversation', 'object_bookmark', 'object_bug', 'object_dolly', 'object_dollyrevert', 'object_generic', 'object_folder', 'object_list-alt', 'object_calendar', 'object_calendarweek', 'object_calendarmonth', 'object_calendarday', 'object_calendarperuser', 'object_cash-register', 'object_company', 'object_contact', 'object_contract', 'object_donation', 'object_dynamicprice', - 'object_holiday', 'object_hrm', 'object_invoice', 'object_intervention', 'object_label', + 'object_globe', 'object_holiday', 'object_hrm', 'object_invoice', 'object_intervention', 'object_label', 'object_margin', 'object_money-bill-alt', 'object_multicurrency', 'object_order', 'object_payment', 'object_lot', 'object_mrp', 'object_payment', 'object_product', 'object_propal', 'object_other', 'object_paragraph', 'object_poll', 'object_printer', 'object_project', 'object_projectpub', 'object_propal', 'object_resource', 'object_rss', 'object_projecttask', 'object_shipment', 'object_supplier_invoice', 'object_supplier_order', 'object_supplier_proposal', 'object_service', 'object_stock', 'object_technic', 'object_ticket', 'object_trip', 'object_user', 'object_group', 'object_member', - 'object_phoning', 'object_phoning_mobile', 'object_phoning_fax', 'object_email', + 'object_phoning', 'object_phoning_mobile', 'object_phoning_fax', 'object_email', 'object_website', 'off', 'on', 'order', 'paiment', 'play', 'playdisabled', 'poll', 'printer', 'product', 'propal', 'projecttask', 'stock', 'resize', 'service', 'stats', 'trip', 'setup', 'sign-out', 'split', 'switch_off', 'switch_on', 'tools', 'unlink', 'uparrow', 'user', 'wrench', @@ -3213,7 +3213,8 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $ 'title_setup'=>'tools', 'title_accountancy'=>'money-check-alt', 'title_bank'=>'university', 'title_hrm'=>'umbrella-beach', 'title_agenda'=>'calendar-alt', 'uparrow'=>'mail-forward', - 'jabber'=>'comment-o' + 'jabber'=>'comment-o', + 'website'=>'globe-americas' ); if ($pictowithouttext == 'off') { $fakey = 'fa-square'; @@ -3292,7 +3293,8 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $ 'map-marker-alt'=>'#aaa', 'mrp'=>'#a69944', 'product'=>'#a69944', 'service'=>'#a69944', 'stock'=>'#a69944', 'other'=>'#ddd', 'playdisabled'=>'#ccc', 'printer'=>'#444', 'projectpub'=>'#986c6a', 'resize'=>'#444', 'rss'=>'#cba', - 'shipment'=>'#a69944', 'stats'=>'#444', 'switch_off'=>'#999', 'uparrow'=>'#555', 'globe-americas'=>'#aaa' + 'shipment'=>'#a69944', 'stats'=>'#444', 'switch_off'=>'#999', 'uparrow'=>'#555', 'globe-americas'=>'#aaa', + 'website'=>'#304' ); if (isset($arrayconvpictotocolor[$pictowithouttext])) { $facolor = $arrayconvpictotocolor[$pictowithouttext]; diff --git a/htdocs/core/modules/modCollab.class.php b/htdocs/core/modules/modCollab.class.php index 5190c8c4d72..345a292cb92 100644 --- a/htdocs/core/modules/modCollab.class.php +++ b/htdocs/core/modules/modCollab.class.php @@ -55,7 +55,7 @@ class modCollab extends DolibarrModules // Key used in llx_const table to save module status enabled/disabled (where MYMODULE is value of property name of module in uppercase) $this->const_name = 'MAIN_MODULE_'.strtoupper($this->name); // Name of image file used for this module. - $this->picto = 'globe'; + $this->picto = 'website'; // Data directories to create when module is enabled $this->dirs = array("/collab/temp"); diff --git a/htdocs/core/modules/modWebsite.class.php b/htdocs/core/modules/modWebsite.class.php index 3e3b4bae374..60cc93b5d39 100644 --- a/htdocs/core/modules/modWebsite.class.php +++ b/htdocs/core/modules/modWebsite.class.php @@ -55,7 +55,7 @@ class modWebsite extends DolibarrModules // Key used in llx_const table to save module status enabled/disabled (where MYMODULE is value of property name of module in uppercase) $this->const_name = 'MAIN_MODULE_'.strtoupper($this->name); // Name of image file used for this module. - $this->picto = 'globe'; + $this->picto = 'website'; // Data directories to create when module is enabled $this->dirs = array("/website/temp"); From c4a7923b51a449a86f1fedc50cef32c9feb745ae Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 11 May 2020 19:02:52 +0200 Subject: [PATCH 135/158] CSS --- htdocs/theme/eldy/global.inc.php | 2 +- htdocs/theme/md/style.css.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 8a21844ca7c..b6884b164a1 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -880,7 +880,7 @@ select.flat.selectlimit { max-width: 0; overflow: auto; } -.divintdwithtwolinesmax { +.divintowithtwolinesmax { width: 75px; display: -webkit-box; -webkit-box-orient: vertical; diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 71fbb6f50da..40e8c5e27b4 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -983,7 +983,7 @@ select.flat.selectlimit { max-width: 0; overflow: auto; } -.divintdwithtwolinesmax { +.divintodwithtwolinesmax { width: 75px; display: -webkit-box; -webkit-box-orient: vertical; From 4d50ba5e370a57c7168e6f4cd2dd4f336fe3d361 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Mon, 11 May 2020 20:42:47 +0200 Subject: [PATCH 136/158] Fix dolistore search with csrf active --- htdocs/admin/dolistore/ajax/image.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/htdocs/admin/dolistore/ajax/image.php b/htdocs/admin/dolistore/ajax/image.php index c1bb4e997dc..6349c7461b5 100644 --- a/htdocs/admin/dolistore/ajax/image.php +++ b/htdocs/admin/dolistore/ajax/image.php @@ -1,6 +1,7 @@ . * Copyright (C) 2008-2011 Laurent Destailleur + * Copyright (C) 2020 Frédéric France * * This program is free software; you can redistribute it and/or modifyion 2.0 (the "License"); * it under the terms of the GNU General Public License as published bypliance with the License. @@ -17,6 +18,9 @@ */ if (!defined('REQUIRE_JQUERY_BLOCKUI')) define('REQUIRE_JQUERY_BLOCKUI', 1); +if (!defined('NOTOKENRENEWAL')) { + define('NOTOKENRENEWAL', 1); +} /** From 75cd7d7e723103fa0edadcb8860a77e908f7e6bb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 12 May 2020 03:04:48 +0200 Subject: [PATCH 137/158] Code comment --- htdocs/core/class/commonobjectline.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/commonobjectline.class.php b/htdocs/core/class/commonobjectline.class.php index 5a09dbfed29..f04e2da11ee 100644 --- a/htdocs/core/class/commonobjectline.class.php +++ b/htdocs/core/class/commonobjectline.class.php @@ -54,8 +54,8 @@ abstract class CommonObjectLine extends CommonObject * Returns the translation key from units dictionary. * A langs->trans() must be called on result to get translated value. * - * @param string $type Label type (long or short) - * @return string|int <0 if ko, label if ok + * @param string $type Label type (long or short). This can be a translation key. + * @return string|int <0 if ko, label if ok */ public function getLabelOfUnit($type = 'long') { From d459f9902c7bbc601cf4eda76a4803d65bc3f194 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 12 May 2020 03:06:30 +0200 Subject: [PATCH 138/158] Update card.php --- htdocs/product/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/card.php b/htdocs/product/card.php index d58e5f8f742..87e86e8e0bc 100644 --- a/htdocs/product/card.php +++ b/htdocs/product/card.php @@ -2099,7 +2099,7 @@ else print ''; } From a0998583852dd9ff3a946703210be6aaed326399 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 12 May 2020 03:07:23 +0200 Subject: [PATCH 139/158] Update product.class.php --- htdocs/product/class/product.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 44fb0865682..2a56131bdd5 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -5391,7 +5391,7 @@ class Product extends CommonObject $resql = $this->db->query($sql); if ($resql && $this->db->num_rows($resql) > 0) { $res = $this->db->fetch_array($resql); - $label = $label_type == 'short' ? $res[$label_type] : $langs->trans('unit' . $res['code']); + $label = ($label_type == 'short' ? $res[$label_type] : 'unit'.$res['code']); $this->db->free($resql); return $label; } From 92d137cde90c6e2ad9c0ac42f46157badf624708 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 12 May 2020 03:09:04 +0200 Subject: [PATCH 140/158] Update list.php --- htdocs/product/stock/list.php | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/htdocs/product/stock/list.php b/htdocs/product/stock/list.php index c13243fc9cb..74c2c21cadf 100644 --- a/htdocs/product/stock/list.php +++ b/htdocs/product/stock/list.php @@ -549,12 +549,15 @@ if ($num) { print ''; if ($key == 'statut') print $warehouse->getLibStatut(5); - if ($key == 'phone') - { + if ($key == 'phone') { print dol_print_phone($obj->phone, '', 0, $obj->rowid, 'AC_TEL'); } - elseif ($key == 'fax') print dol_print_phone($obj->fax, '', 0, $obj->rowid, 'AC_FAX'); - else print $warehouse->showOutputField($val, $key, $warehouse->$key, ''); + elseif ($key == 'fax') { + print dol_print_phone($obj->fax, '', 0, $obj->rowid, 'AC_FAX'); + } + else { + print $warehouse->showOutputField($val, $key, $warehouse->$key, ''); + } print ''; if (!$i) $totalarray['nbfield']++; if (!empty($val['isameasure'])) From 6706d28eb7f166754cedbb64c106a1fd3c62cff3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 12 May 2020 03:15:19 +0200 Subject: [PATCH 141/158] Update admin.lang --- htdocs/langs/en_US/admin.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index e97ed8dbc54..7669378aff4 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1272,7 +1272,7 @@ RuleForGeneratedPasswords=Rules to generate and validate passwords DisableForgetPasswordLinkOnLogonPage=Do not show the "Password Forgotten" link on the Login page UsersSetup=Users module setup UserMailRequired=Email required to create a new user -UserHideInactive=Hide inactive users +UserHideInactive=Hide inactive users from all combo lists of users (this may means you won't be able to filter on old users) UsersDocModules=Document templates for documents generated from user record GroupsDocModules=Document templates for documents generated from a group record ##### HRM setup ##### From 3c8452aa3131eb6391ea21edf1a4315370f02d85 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 12 May 2020 03:17:55 +0200 Subject: [PATCH 142/158] Update admin.lang --- htdocs/langs/en_US/admin.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 7669378aff4..c9be1ca2f41 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1272,7 +1272,7 @@ RuleForGeneratedPasswords=Rules to generate and validate passwords DisableForgetPasswordLinkOnLogonPage=Do not show the "Password Forgotten" link on the Login page UsersSetup=Users module setup UserMailRequired=Email required to create a new user -UserHideInactive=Hide inactive users from all combo lists of users (this may means you won't be able to filter on old users) +UserHideInactive=Hide inactive users from all combo lists of users (Not recommended: this may means you won't be able to filter or search on old users on some pages) UsersDocModules=Document templates for documents generated from user record GroupsDocModules=Document templates for documents generated from a group record ##### HRM setup ##### From e4611f29502f5e311e45e6f2eefc23aeab796b45 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 12 May 2020 03:36:33 +0200 Subject: [PATCH 143/158] Fix filter on categories --- htdocs/compta/facture/stats/index.php | 38 +++++++++++++-------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/htdocs/compta/facture/stats/index.php b/htdocs/compta/facture/stats/index.php index 8606e619740..284186b73ce 100644 --- a/htdocs/compta/facture/stats/index.php +++ b/htdocs/compta/facture/stats/index.php @@ -262,33 +262,33 @@ if ($mode == 'customer') $filter = 's.client in (1,2,3)'; if ($mode == 'supplier') $filter = 's.fournisseur = 1'; print $form->selectarray('socid', $companies, $socid, 1, 0, 0, 'style="width: 95%"', 0, 0, 0, '', '', 1); print ''; -if(! empty($conf->category->enabled) && $mode == 'customer') { - // Customer Category - print ''; -} + // ThirdParty Type print ''; + // Category -if ($mode == 'customer') -{ - $cat_type = Categorie::TYPE_CUSTOMER; - $cat_label = $langs->trans("Category").' '.lcfirst($langs->trans("Customer")); +if (! empty($conf->category->enabled)) { + if ($mode == 'customer') + { + $cat_type = Categorie::TYPE_CUSTOMER; + $cat_label = $langs->trans("Category").' '.lcfirst($langs->trans("Customer")); + } + if ($mode == 'supplier') + { + $cat_type = Categorie::TYPE_SUPPLIER; + $cat_label = $langs->trans("Category").' '.lcfirst($langs->trans("Supplier")); + } + print ''; } -if ($mode == 'supplier') -{ - $cat_type = Categorie::TYPE_SUPPLIER; - $cat_label = $langs->trans("Category").' '.lcfirst($langs->trans("Supplier")); -} -print ''; + // User print '
'.$langs->trans("NbOfAttachedFiles").''.count($filearray).'
'.$langs->trans("TotalSizeOfAttachedFiles").''.dol_print_size($totalsize, 1, 1).'
'; + print ''; print $langs->trans("Type"); - print ''; + print ''; $multiselect = 0; if (!empty($conf->global->MAIN_ENABLE_MULTISELECT_TYPE)) // We use an option here because it adds bugs when used on agenda page "peruser" and "list" { $multiselect = (!empty($conf->global->AGENDA_USE_EVENT_TYPE)); } - print ''; - print $formactions->select_type_actions($actioncode, "search_actioncode", $excludetype, (empty($conf->global->AGENDA_USE_EVENT_TYPE) ? 1 : -1), 0, $multiselect); + print ''; + print $formactions->select_type_actions($actioncode, "search_actioncode", $excludetype, (empty($conf->global->AGENDA_USE_EVENT_TYPE) ? 1 : -1), 0, $multiselect, 0, 'maxwidth500'); print '
'; + print ''; print $langs->trans("ActionsToDoBy").'   '; - print ''; - print img_picto('', 'user'); - print $form->select_dolusers($filtert, 'search_filtert', 1, '', !$canedit, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); + print ''; + print img_picto('', 'user', 'class="fawidth30 inline-block"'); + print $form->select_dolusers($filtert, 'search_filtert', 1, '', !$canedit, '', '', 0, 0, 0, '', 0, '', 'maxwidth500'); if (empty($conf->dol_optimize_smallscreen)) print '   '.$langs->trans("or").' '.$langs->trans("ToUserOfGroup").'   '; - print $form->select_dolgroups($usergroupid, 'usergroup', 1, '', !$canedit); + else print '
'; + print img_picto('', 'object_group', 'class="fawidth30 inline-block"'); + print $form->select_dolgroups($usergroupid, 'usergroup', 1, '', !$canedit, '', '', '0', false, 'maxwidth500'); print '
'; print $langs->trans("Resource"); - print ''; - print img_picto('', 'object_resource'); - print $formresource->select_resource_list($resourceid, "search_resourceid", '', 1, 0, 0, null, '', 2); + print ''; + print img_picto('', 'object_resource', 'class="fawidth30 inline-block"'); + print $formresource->select_resource_list($resourceid, "search_resourceid", '', 1, 0, 0, null, '', 2, 0, 'maxwidth500'); print '
'; + print ''; print $langs->trans("ThirdParty").'   '; - print ''; - print img_picto('', 'company'); - print $form->select_company($socid, 'search_socid', '', ' ', 0, 0, null, 0); + print ''; + print img_picto('', 'company', 'class="fawidth30 inline-block"'); + print $form->select_company($socid, 'search_socid', '', ' ', 0, 0, null, 0, 'minwidth100 maxwidth500'); print '
'; + print ''; print $langs->trans("Project").'   '; - print ''; - print img_picto('', 'project'); + print ''; + print img_picto('', 'project', 'class="fawidth30 inline-block"'); print $formproject->select_projects($socid ? $socid : -1, $pid, 'search_projectid', 0, 0, 1, 0, 0, 0, 0, '', 1, 0, 'maxwidth500'); print '
'; + print ''; print $langs->trans("Status"); - print '  '; + print '  '; $formactions->form_select_status_action('formaction', $status, 1, 'search_status', 1, 2, 'minwidth100'); print '
'.$staticmember->getNomUrl(1, 32).''.$staticmember->getNomUrl(1, 32).''.$statictype->getNomUrl(1, 32).''.dol_print_date($db->jdate($obj->datem), 'dayhour').''.$staticmember->LibStatut($obj->statut, ($obj->subscription == 'yes' ? 1 : 0), $db->jdate($obj->date_end_subscription), 3).''.$subscriptionstatic->getNomUrl(1).''.$staticmember->getNomUrl(1, 32, 'subscription').''.get_date_range($db->jdate($obj->date_start), $db->jdate($obj->date_end)).''.$subscriptionstatic->getNomUrl(1).''.$staticmember->getNomUrl(1, 32, 'subscription').''.get_date_range($db->jdate($obj->date_start), $db->jdate($obj->date_end)).''.price($obj->subscription).''.$staticmember->LibStatut($obj->statut,($obj->subscription=='yes'?1:0),$db->jdate($obj->date_end_subscription),5).''.dol_print_date($db->jdate($obj->datem ? $obj->datem : $obj->datec), 'dayhour').''.dol_print_date($db->jdate($obj->datem ? $obj->datem : $obj->datec), 'dayhour').'
'; - if ($nbofsubdir > 0 && $nboffilesinsubdir > 0) print '+'.$nboffilesinsubdir.' '; + if ($nbofsubdir > 0 && $nboffilesinsubdir > 0) print '+'.$nboffilesinsubdir.' '; print ''.img_edit($langs->trans("Edit").' - '.$langs->trans("View"), 0, 'class="valignmiddle opacitymedium"').'
'; + print ''; print $langs->trans("Resource"); - print ''; + print ''; print img_picto('', 'object_resource', 'class="fawidth30 inline-block"'); print $formresource->select_resource_list($resourceid, "search_resourceid", '', 1, 0, 0, null, '', 2, 0, 'maxwidth500'); print '
'.$langs->trans("VisibleTimeRange").''.$langs->trans("VisibleTimeRange").'"; print '
'; print ''; diff --git a/htdocs/resource/class/html.formresource.class.php b/htdocs/resource/class/html.formresource.class.php index 36d3fc854cc..4836ed1a0f1 100644 --- a/htdocs/resource/class/html.formresource.class.php +++ b/htdocs/resource/class/html.formresource.class.php @@ -101,10 +101,12 @@ class FormResource { //$minLength = (is_numeric($conf->global->RESOURCE_USE_SEARCH_TO_SELECT)?$conf->global->RESOURCE_USE_SEARCH_TO_SELECT:2); $out .= ajax_combobox($htmlname, $event, $conf->global->RESOURCE_USE_SEARCH_TO_SELECT); + } else { + $out .= ajax_combobox($htmlname); } // Construct $out and $outarray - $out .= ''."\n"; if ($showempty) $out .= ''."\n"; $num = 0; @@ -137,7 +139,6 @@ class FormResource } } $out .= ''."\n"; - $out .= ajax_combobox($htmlname); if ($outputmode != 2) { diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index dc0c77ed67d..8a21844ca7c 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -1899,8 +1899,8 @@ div.tmenuleft } div.tmenucenter { - padding-left: 0px; - padding-right: 3px; + padding-left: 2px; + padding-right: 2px; padding-top: 8px; height: 26px; @@ -3600,6 +3600,12 @@ ul.noborder li:nth-child(even):not(.liste_titre) { @media only screen and (max-width: 767px) { + a.tmenu:link, a.tmenu:visited, a.tmenu:hover, a.tmenu:active { + padding: 0px 0px 0px 0px; + } + a.tmenusel:link, a.tmenusel:visited, a.tmenusel:hover, a.tmenusel:active { + padding: 0px 0px 0px 0px; + } .boxstats, .boxstats130 { margin: 3px; } @@ -4882,7 +4888,7 @@ ul.ecmjqft li { ul.ecmjqft a { line-height: 24px; vertical-align: middle; - color: #333; + color: unset; padding: 0px 0px; font-weight:normal; display: inline-block !important; diff --git a/htdocs/theme/eldy/info-box.inc.php b/htdocs/theme/eldy/info-box.inc.php index 7f62fe39689..3138cd8bfd9 100644 --- a/htdocs/theme/eldy/info-box.inc.php +++ b/htdocs/theme/eldy/info-box.inc.php @@ -15,10 +15,11 @@ if (!defined('ISLOADEDBYSTEELSHEET')) die('Must be call by steelsheet'); ?> display: block; position: relative; min-height: 90px; - background: #fff; + /* background: #fff; */ width: 100%; - box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.2), 0px 0px 2px rgba(0, 0, 0, 0.1); - border-radius: 2px; + box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.1); + border-radius: 2px; + border: 1px solid #eee; margin-bottom: 15px; } .info-box.info-box-sm{ @@ -67,7 +68,7 @@ if (!defined('ISLOADEDBYSTEELSHEET')) die('Must be call by steelsheet'); ?> text-align: center; font-size: 45px; line-height: 90px; - background: rgba(0, 0, 0, 0.2); + background: rgba(0, 0, 0, 0.08) !important } .info-box-sm .info-box-icon { height: 80px; @@ -203,8 +204,6 @@ if (GETPOSTISSET('THEME_AGRESSIVENESS_RATIO')) $conf->global->THEME_AGRESSIVENES .info-box-icon { color: #fff !important; - - background-color: #eee !important; opacity: 0.95; } From 65011c28771601aab882785dd0b1621a6c1f994d Mon Sep 17 00:00:00 2001 From: Tim Otte Date: Mon, 11 May 2020 15:11:23 +0200 Subject: [PATCH 130/158] Fixed the product unit translation --- htdocs/product/card.php | 2 +- htdocs/product/class/product.class.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/product/card.php b/htdocs/product/card.php index 87e86e8e0bc..d58e5f8f742 100644 --- a/htdocs/product/card.php +++ b/htdocs/product/card.php @@ -2099,7 +2099,7 @@ else print '
'.$langs->trans('DefaultUnitToShow').''; if ($unit !== '') { - print $langs->trans($unit); + print $unit; } print '
'.$langs->trans("AGENDA_DEFAULT_FILTER_TYPE").' '."\n"; -$formactions->select_type_actions($conf->global->AGENDA_DEFAULT_FILTER_TYPE, "AGENDA_DEFAULT_FILTER_TYPE", '', (empty($conf->global->AGENDA_USE_EVENT_TYPE) ? 1 : -1), 1); +$multiselect = 0; +if (!empty($conf->global->MAIN_ENABLE_MULTISELECT_TYPE)) { + // We use an option here because it adds bugs when used on agenda page "peruser" and "list" + $multiselect = (!empty($conf->global->AGENDA_USE_EVENT_TYPE)); +} +$formactions->select_type_actions($conf->global->AGENDA_DEFAULT_FILTER_TYPE, "AGENDA_DEFAULT_FILTER_TYPE", '', (empty($conf->global->AGENDA_USE_EVENT_TYPE) ? 1 : -1), 1, $multiselect); print '
'.$langs->trans('DefaultUnitToShow').''; if ($unit !== '') { - print $unit; + print $langs->trans($unit); } print '
'.$langs->trans("CustomersProspectsCategoriesShort").''; - $cate_arbo = $form->select_all_categories(Categorie::TYPE_CUSTOMER, null, 'parent', null, null, 1); - print $form->multiselectarray('custcats', $cate_arbo, GETPOST('custcats', 'array'), null, null, null, null, "90%"); - print '
'.$langs->trans("ThirdPartyType").''; $sortparam_typent = (empty($conf->global->SOCIETE_SORT_ON_TYPEENT) ? 'ASC' : $conf->global->SOCIETE_SORT_ON_TYPEENT); // NONE means we keep sort of original array, so we sort on position. ASC, means next function will sort on label. print $form->selectarray("typent_id", $formcompany->typent_array(0), $typent_id, 0, 0, 0, '', 0, 0, 0, $sortparam_typent); if ($user->admin) print ' '.info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1); print '
'.$cat_label.''; + $cate_arbo = $form->select_all_categories(Categorie::TYPE_CUSTOMER, null, 'parent', null, null, 1); + print $form->multiselectarray('custcats', $cate_arbo, GETPOST('custcats', 'array'), null, null, null, null, "90%"); + //print $formother->select_categories($cat_type, $categ_id, 'categ_id', true); + print '
'.$cat_label.''; -print $formother->select_categories($cat_type, $categ_id, 'categ_id', true); -print '
'.$langs->trans("CreatedBy").''; print $form->select_dolusers($userid, 'userid', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); From c89e8efec354070f055504c64c11e49fe1827320 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 12 May 2020 14:08:28 +0200 Subject: [PATCH 144/158] responsive --- htdocs/takepos/css/pos.css.php | 3 +++ htdocs/takepos/index.php | 9 +++++++-- htdocs/takepos/invoice.php | 2 +- htdocs/theme/eldy/global.inc.php | 1 + htdocs/theme/md/style.css.php | 1 + 5 files changed, 13 insertions(+), 3 deletions(-) diff --git a/htdocs/takepos/css/pos.css.php b/htdocs/takepos/css/pos.css.php index 5f0006d24fe..6871fcbd68b 100644 --- a/htdocs/takepos/css/pos.css.php +++ b/htdocs/takepos/css/pos.css.php @@ -591,6 +591,9 @@ div#moreinfo, div#infowarehouse { height: calc(45% - 100px); } + div#moreinfo, div#infowarehouse { + padding: 0 5px 0 5px; + } div.div1 { padding-bottom: 0; diff --git a/htdocs/takepos/index.php b/htdocs/takepos/index.php index 0688d4a8584..8da96df54d0 100644 --- a/htdocs/takepos/index.php +++ b/htdocs/takepos/index.php @@ -756,8 +756,13 @@ if (empty($conf->global->TAKEPOS_HIDE_HEAD_BAR)) {
-
- trans("Terminal")." "; +
+ + + + trans("Terminal"); ?> + + - '.dol_print_date(dol_now(), "day").''; diff --git a/htdocs/takepos/invoice.php b/htdocs/takepos/invoice.php index b1641072829..9f0e6649cf6 100644 --- a/htdocs/takepos/invoice.php +++ b/htdocs/takepos/invoice.php @@ -747,7 +747,7 @@ $( document ).ready(function() { $("#customerandsales").html(''); - $("#customerandsales").append(''); + $("#customerandsales").append(''); global->THEME_ELDY_WITDHOFFSET_FOR_REDUC3) ? round($nbtopmenuentries * 47, 0) + 130 : $conf->global->THEME_ELDY_WITDHOFFSET_FOR_REDUC3; ?>px) { diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 40e8c5e27b4..c7ce5709efd 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -1119,6 +1119,7 @@ table[summary="list_of_modules"] .fa-cog { .clearboth { clear:both; } .hideobject { display: none; } .minwidth50 { min-width: 50px; } +.minwidth75 { min-width: 75px; } /* rule for not too small screen only */ @media only screen and (min-width: px) { From e9c405182d07497ed177b60377f44c5f225ff30a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 12 May 2020 14:18:31 +0200 Subject: [PATCH 145/158] css --- htdocs/theme/eldy/main_menu_fa_icons.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/theme/eldy/main_menu_fa_icons.inc.php b/htdocs/theme/eldy/main_menu_fa_icons.inc.php index 5b9395fbc04..c344838458d 100644 --- a/htdocs/theme/eldy/main_menu_fa_icons.inc.php +++ b/htdocs/theme/eldy/main_menu_fa_icons.inc.php @@ -8,7 +8,7 @@ font-style: normal; font-variant: normal; text-rendering: auto; - line-height: 26px; + line-height: 23px; font-size: ; -webkit-font-smoothing: antialiased; text-align:center; From a6708009d790003f14320cfbcdadc972661d494e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 12 May 2020 14:53:03 +0200 Subject: [PATCH 146/158] Add option PROJECT_OPEN_ALWAYS_ON_TAB --- htdocs/projet/class/project.class.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index 1ee17511304..554bc84766a 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -1044,6 +1044,9 @@ class Project extends CommonObject if (!empty($conf->dol_no_mouse_hover)) $notooltip = 1; // Force disable tooltips $result = ''; + if (! empty($conf->global->PROJECT_OPEN_ALWAYS_ON_TAB)) { + $option = $conf->global->PROJECT_OPEN_ALWAYS_ON_TAB; + } $label = ''; if ($option != 'nolink') $label = ''.$langs->trans("Project").''; @@ -1073,6 +1076,10 @@ class Project extends CommonObject { $url = DOL_URL_ROOT.'/projet/tasks.php?id='.$this->id; } + elseif ($option == 'preview') + { + $url = DOL_URL_ROOT.'/projet/element.php?id='.$this->id; + } else { $url = DOL_URL_ROOT.'/projet/card.php?id='.$this->id; From 410694100d911de889d06f59f43756e6df849b4e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 12 May 2020 23:42:01 +0200 Subject: [PATCH 147/158] CSS --- htdocs/theme/eldy/global.inc.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 68e16afecd0..ef39d38a568 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -1707,6 +1707,7 @@ div.statusref { margin-top: 8px; margin-bottom: 10px; clear: both; + text-align: right; } div.statusref img { padding-left: 8px; From 63d6b3c47d5629082628cfd08d1a15ad13309149 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 12 May 2020 23:44:50 +0200 Subject: [PATCH 148/158] Look and feel v12 --- htdocs/contrat/card.php | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index 25857767e80..9f825cdf009 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -1452,7 +1452,7 @@ else print ''; - // Ligne info remises tiers + // Line info of thirdparty discounts print ''; } print ''; print ''; From b5f3be4599f9f56c30c63297643c88da8d75e956 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 13 May 2020 00:29:46 +0200 Subject: [PATCH 149/158] Clean phpcs rule file --- dev/setup/codesniffer/ruleset.xml | 77 +++++++++---------- htdocs/compta/bank/class/account.class.php | 3 +- htdocs/product/stats/commande_fournisseur.php | 4 +- htdocs/webservices/server_actioncomm.php | 6 +- 4 files changed, 43 insertions(+), 47 deletions(-) diff --git a/dev/setup/codesniffer/ruleset.xml b/dev/setup/codesniffer/ruleset.xml index ad26c7f0bdc..41526340daf 100644 --- a/dev/setup/codesniffer/ruleset.xml +++ b/dev/setup/codesniffer/ruleset.xml @@ -272,12 +272,7 @@ - - - - - - + 0 @@ -310,20 +305,21 @@ - - + 0 - + 0 + - 0 + 0 - + + 0 @@ -332,27 +328,25 @@ - + 0 - + + 0 - - 0 - + + + - 0 + 0 - - 0 - - - 0 - + + + @@ -361,26 +355,26 @@ 0 + - 0 + 0 - + 0 + - - 0 - + 0 0 - + 0 @@ -391,16 +385,16 @@ + + 0 + - - - - + 0 @@ -411,7 +405,6 @@ 0 - 0 @@ -421,15 +414,21 @@ - - - - - + + + + + + + + + + + diff --git a/htdocs/compta/bank/class/account.class.php b/htdocs/compta/bank/class/account.class.php index 58115537b1f..3fcbffba3b2 100644 --- a/htdocs/compta/bank/class/account.class.php +++ b/htdocs/compta/bank/class/account.class.php @@ -1672,8 +1672,7 @@ class Account extends CommonObject //Replace the old AccountNumber key with the new BankAccountNumber key $fieldlists = explode( ' ', - preg_replace('/ ?[^Bank]AccountNumber ?/', 'BankAccountNumber', - $conf->global->BANK_SHOW_ORDER_OPTION) + preg_replace('/ ?[^Bank]AccountNumber ?/', 'BankAccountNumber', $conf->global->BANK_SHOW_ORDER_OPTION) ); } } diff --git a/htdocs/product/stats/commande_fournisseur.php b/htdocs/product/stats/commande_fournisseur.php index 61024cdd7ff..c111e075972 100644 --- a/htdocs/product/stats/commande_fournisseur.php +++ b/htdocs/product/stats/commande_fournisseur.php @@ -44,9 +44,7 @@ if (!empty($user->socid)) $result = restrictedArea($user, 'produit|service', $fieldvalue, 'product&product', '', '', $fieldtype); // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context -$hookmanager->initHooks(array( - 'productstatssupplyorder' -)); +$hookmanager->initHooks(array('productstatssupplyorder')); $mesg = ''; diff --git a/htdocs/webservices/server_actioncomm.php b/htdocs/webservices/server_actioncomm.php index bc3d4a78c6a..39ed3b3cdf5 100644 --- a/htdocs/webservices/server_actioncomm.php +++ b/htdocs/webservices/server_actioncomm.php @@ -153,8 +153,8 @@ $server->wsdl->addComplexType( 'sequence', '', array( - 'code' => array('name'=>'code', 'type'=>'xsd:string'), - 'libelle' => array('name'=>'libelle', 'type'=>'xsd:string') + 'code' => array('name'=>'code', 'type'=>'xsd:string'), + 'libelle' => array('name'=>'libelle', 'type'=>'xsd:string') ) ); @@ -164,7 +164,7 @@ $server->wsdl->addComplexType( 'array', 'sequence', '', - array( + array( 'actioncommtype' => array( 'name' => 'actioncommtype', 'type' => 'tns:actioncommtype', From 22301d63d8fedaa2607167232b4ac4df76cd9593 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 13 May 2020 00:35:10 +0200 Subject: [PATCH 150/158] Replace a ZEND phpcs rule with a PSR2 rule --- dev/setup/codesniffer/ruleset.xml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/dev/setup/codesniffer/ruleset.xml b/dev/setup/codesniffer/ruleset.xml index 41526340daf..e726df6db7c 100644 --- a/dev/setup/codesniffer/ruleset.xml +++ b/dev/setup/codesniffer/ruleset.xml @@ -424,11 +424,7 @@ - - - - - + From f0d14662b996b082c701db2318157f9f86d7c957 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 13 May 2020 00:38:12 +0200 Subject: [PATCH 151/158] Fix scrutinizer --- htdocs/takepos/genimg/qr.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/takepos/genimg/qr.php b/htdocs/takepos/genimg/qr.php index c73e874a465..c4d60a52c1b 100644 --- a/htdocs/takepos/genimg/qr.php +++ b/htdocs/takepos/genimg/qr.php @@ -29,5 +29,5 @@ require '../../core/modules/barcode/doc/tcpdfbarcode.modules.php'; $key = GETPOST('key'); -$module = new modTcpdfbarcode($db); +$module = new modTcpdfbarcode(); $result = $module->buildBarCode("http://www.takepos.com", 'QRCODE', 'Y'); From ebbd4413f5985def5e726d974c761e193473d442 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 13 May 2020 00:47:27 +0200 Subject: [PATCH 152/158] Fix scrutinizer error --- htdocs/accountancy/admin/account.php | 2 +- .../class/accountingaccount.class.php | 17 ++++++----------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/htdocs/accountancy/admin/account.php b/htdocs/accountancy/admin/account.php index 86981e5b5de..cf00519e9d7 100644 --- a/htdocs/accountancy/admin/account.php +++ b/htdocs/accountancy/admin/account.php @@ -161,7 +161,7 @@ if (empty($reshook)) if ($action == 'disable') { if ($accounting->fetch($id)) { $mode = GETPOST('mode', 'int'); - $result = $accounting->account_desactivate($id, $mode); + $result = $accounting->accountDeactivate($id, $mode); } $action = 'update'; diff --git a/htdocs/accountancy/class/accountingaccount.class.php b/htdocs/accountancy/class/accountingaccount.class.php index a32918cc5bf..bcd17793db1 100644 --- a/htdocs/accountancy/class/accountingaccount.class.php +++ b/htdocs/accountancy/class/accountingaccount.class.php @@ -553,24 +553,19 @@ class AccountingAccount extends CommonObject } } - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps /** - * Account deactivated + * Deactivate an account (for status active or status reconcilable) * * @param int $id Id - * @param int $mode 0=field active, 1=field active_customer_list, 2=field_active_supplier_list + * @param int $mode 0=field active, 1=field reconcilable * @return int <0 if KO, >0 if OK */ - public function account_desactivate($id, $mode = 0) + public function accountDeactivate($id, $mode = 0) { - // phpcs:enable $result = $this->checkUsage(); - if ($mode == 0) - { - $fieldtouse = 'active'; - } - elseif ($mode == 1) + $fieldtouse = 'active'; + if ($mode == 1) { $fieldtouse = 'reconcilable'; } @@ -582,7 +577,7 @@ class AccountingAccount extends CommonObject $sql .= "SET ".$fieldtouse." = '0'"; $sql .= " WHERE rowid = ".$this->db->escape($id); - dol_syslog(get_class($this)."::account_desactivate ".$fieldtouse." sql=".$sql, LOG_DEBUG); + dol_syslog(get_class($this)."::accountDeactivate ".$fieldtouse." sql=".$sql, LOG_DEBUG); $result = $this->db->query($sql); if ($result) { From 9785e0b852bbbb9562942e3f84c748ef3ba3f0f3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 13 May 2020 12:30:59 +0200 Subject: [PATCH 153/158] Trans --- htdocs/langs/en_US/modulebuilder.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/modulebuilder.lang b/htdocs/langs/en_US/modulebuilder.lang index b815cf997cc..135ac1ae9ec 100644 --- a/htdocs/langs/en_US/modulebuilder.lang +++ b/htdocs/langs/en_US/modulebuilder.lang @@ -83,7 +83,7 @@ ListOfDictionariesEntries=List of dictionaries entries ListOfPermissionsDefined=List of defined permissions SeeExamples=See examples here EnabledDesc=Condition to have this field active (Examples: 1 or $conf->global->MYMODULE_MYOPTION) -VisibleDesc=Is the field visible ? (Examples: 0=Never visible, 1=Visible on list and create/update/view forms, 2=Visible on list only, 3=Visible on create/update/view form only (not list), 4=Visible on list and update/view form only (not create), 5=Visible on list end view form only (not create, not update). Using a negative value means field is not shown by default on list but can be selected for viewing). It can be an expression, for example:
preg_match('/public/', $_SERVER['PHP_SELF'])?0:1
($user->rights->holiday->define_holiday ? 1 : 0) +VisibleDesc=Is the field visible ? (Examples: 0=Never visible, 1=Visible on list and create/update/view forms, 2=Visible on list only, 3=Visible on create/update/view form only (not list), 4=Visible on list and update/view form only (not create), 5=Visible on list end view form only (not create, not update).

Using a negative value means field is not shown by default on list but can be selected for viewing).

It can be an expression, for example:
preg_match('/public/', $_SERVER['PHP_SELF'])?0:1
($user->rights->holiday->define_holiday ? 1 : 0) DisplayOnPdfDesc=Display this field on compatible PDF documents, you can manage position with "Position" field.
Currently, known compatibles PDF models are : eratosthene (order), espadon (ship), sponge (invoices), cyan (propal/quotation), cornas (supplier order)

For document :
0 = not displayed
1 = display
2 = display only if not empty

For document lines :
0 = not displayed
1 = displayed in a column
3 = display in line description column after the description
4 = display in description column after the description only if not empty DisplayOnPdf=Display on PDF IsAMeasureDesc=Can the value of field be cumulated to get a total into list? (Examples: 1 or 0) From 8e6efba0be33b762f6fdf58321f6d1b69433be3d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 13 May 2020 12:49:53 +0200 Subject: [PATCH 154/158] CSS --- htdocs/theme/eldy/global.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index ef39d38a568..60c7ee43bb0 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -1611,7 +1611,7 @@ div.nopadding { } td.nobordernopadding.widthpictotitle.col-picto { - color: var(--colortexttitlenotab); + color: #bbb; opacity: 0.85; } .table-list-of-attached-files .col-picto, .table-list-of-links .col-picto { From 3b87b7c359a61bcfce64ec6f8366aeb5904fed0d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 13 May 2020 13:29:50 +0200 Subject: [PATCH 155/158] CSS --- htdocs/core/tpl/extrafields_view.tpl.php | 21 ++++++++++++++++++--- htdocs/theme/eldy/global.inc.php | 2 +- htdocs/theme/md/style.css.php | 2 +- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/htdocs/core/tpl/extrafields_view.tpl.php b/htdocs/core/tpl/extrafields_view.tpl.php index e6cbad245d9..198a3910747 100644 --- a/htdocs/core/tpl/extrafields_view.tpl.php +++ b/htdocs/core/tpl/extrafields_view.tpl.php @@ -52,8 +52,12 @@ if (empty($reshook) && is_array($extrafields->attributes[$object->table_element] { $lastseparatorkeyfound = ''; $extrafields_collapse_num = ''; + $extrafields_collapse_num_old = ''; + $i = 0; foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $label) { + $i++; + // Discard if extrafield is a hidden field on form $enabled = 1; @@ -65,6 +69,7 @@ if (empty($reshook) && is_array($extrafields->attributes[$object->table_element] { $enabled = dol_eval($extrafields->attributes[$object->table_element]['list'][$key], 1); } + $perms = 1; if ($perms && isset($extrafields->attributes[$object->table_element]['perms'][$key])) { @@ -87,6 +92,8 @@ if (empty($reshook) && is_array($extrafields->attributes[$object->table_element] $value = $object->array_options["options_".$key]; //var_dump($key.' - '.$value); } + + // Print line tr of extra field if ($extrafields->attributes[$object->table_element]['type'][$key] == 'separate') { $extrafields_collapse_num = ''; @@ -109,13 +116,20 @@ if (empty($reshook) && is_array($extrafields->attributes[$object->table_element] } else { - print '
'; + print ''; + $extrafields_collapse_num_old = $extrafields_collapse_num; print '
'.$langs->trans('Discount').''; if ($object->thirdparty->remise_percent) print $langs->trans("CompanyHasRelativeDiscount", $object->thirdparty->remise_percent); else print $langs->trans("CompanyHasNoRelativeDiscount"); @@ -1502,8 +1502,6 @@ else } - $colorb = '666666'; - $arrayothercontracts = $object->getListOfContracts('others'); /* @@ -1775,8 +1773,8 @@ else print ''; - print ''; - print '
'; + print ''; + print '
'; print '
'; print ''; print ''; - print ''; print ''; print ''; @@ -643,7 +643,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea print ''; // Delete print ''; print ''; diff --git a/htdocs/core/class/translate.class.php b/htdocs/core/class/translate.class.php index 4f3930a4588..3fc3151030a 100644 --- a/htdocs/core/class/translate.class.php +++ b/htdocs/core/class/translate.class.php @@ -308,7 +308,7 @@ class Translate continue; } else { - // Convert some strings: Parse and render carriage returns. Also, change '\\s' int '\s' because transifex sync pull the string '\s' into string '\\s' + // Convert some strings: Parse and render carriage returns. Also, change '\\s' into '\s' because transifex sync pull the string '\s' into string '\\s' $this->tab_translate[$key] = str_replace(array('\\n', '\\\\s'), array("\n", '\s'), $value); if ($usecachekey) { $tabtranslatedomain[$key] = $value; diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 20094da216c..31716dc3f3c 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -5794,7 +5794,8 @@ function dolGetFirstLineOfText($text, $nboflines = 1, $charset = 'UTF-8') /** - * Replace CRLF in string with a HTML BR tag + * Replace CRLF in string with a HTML BR tag. + * WARNING: The content after operation contains some HTML tags (the
) so be sure to also have encode the special chars of stringtoencode into HTML before. * * @param string $stringtoencode String to encode * @param int $nl2brmode 0=Adding br before \n, 1=Replacing \n by br @@ -6048,7 +6049,7 @@ function dol_textishtml($msg, $option = 0) * * @param string $text1 Text 1 * @param string $text2 Text 2 - * @param bool $forxml false=Use
instead of \n if html content detected, true=Use
instead of \n if html content detected + * @param bool $forxml true=Use
instead of
if we have to add a br tag * @param bool $invert invert order of description lines (we often use config MAIN_CHANGE_ORDER_CONCAT_DESCRIPTION in this parameter) * @return string Text 1 + new line + Text2 * @see dol_textishtml() @@ -6063,9 +6064,9 @@ function dol_concatdesc($text1, $text2, $forxml = false, $invert = false) } $ret = ''; - $ret .= (!dol_textishtml($text1) && dol_textishtml($text2)) ?dol_nl2br($text1, 0, $forxml) : $text1; + $ret .= (!dol_textishtml($text1) && dol_textishtml($text2)) ? dol_nl2br(dol_escape_htmltag($text1, 0, 1, '', 1), 0, $forxml) : $text1; $ret .= (!empty($text1) && !empty($text2)) ? ((dol_textishtml($text1) || dol_textishtml($text2)) ? ($forxml ? "
\n" : "
\n") : "\n") : ""; - $ret .= (dol_textishtml($text1) && !dol_textishtml($text2)) ?dol_nl2br($text2, 0, $forxml) : $text2; + $ret .= (dol_textishtml($text1) && !dol_textishtml($text2)) ? dol_nl2br(dol_escape_htmltag($text2, 0, 1, '', 1), 0, $forxml) : $text2; return $ret; } diff --git a/htdocs/emailcollector/class/emailcollector.class.php b/htdocs/emailcollector/class/emailcollector.class.php index 969b83cac5a..2bc6d6db962 100644 --- a/htdocs/emailcollector/class/emailcollector.class.php +++ b/htdocs/emailcollector/class/emailcollector.class.php @@ -937,8 +937,8 @@ class EmailCollector extends CommonObject } imap_errors(); // Clear stack of errors. - // $conf->global->MAIL_PREFIX_FOR_EMAIL_ID must be defined $host = dol_getprefix('email'); + //$host = '123456'; // Define the IMAP search string // See https://tools.ietf.org/html/rfc3501#section-6.4.4 for IMAPv4 (PHP not yet compatible) @@ -1081,6 +1081,7 @@ class EmailCollector extends CommonObject dol_syslog("Start of loop on email", LOG_INFO, 1); + $i = 0; foreach ($arrayofemail as $imapemail) { if ($nbemailprocessed > 1000) @@ -1088,6 +1089,8 @@ class EmailCollector extends CommonObject break; // Do not process more than 1000 email per launch (this is a different protection than maxnbcollectedpercollect } + $i++; + $header = imap_fetchheader($connection, $imapemail, 0); $header = preg_replace('/\r\n\s+/m', ' ', $header); // When a header line is on several lines, merge lines $matches = array(); @@ -1095,6 +1098,8 @@ class EmailCollector extends CommonObject $headers = array_combine($matches[1], $matches[2]); //var_dump($headers); + dol_syslog("** Process email ".$i." References: ".$headers['References']); + // If there is a filter on trackid if ($searchfilterdoltrackid > 0) { @@ -1130,7 +1135,7 @@ class EmailCollector extends CommonObject // GET Email meta datas $overview = imap_fetch_overview($connection, $imapemail, 0); - dol_syslog("** Process email - msgid=".$overview[0]->message_id." date=".dol_print_date($overview[0]->udate, 'dayrfc', 'gmt')." subject=".$overview[0]->subject); + dol_syslog("msgid=".$overview[0]->message_id." date=".dol_print_date($overview[0]->udate, 'dayrfc', 'gmt')." subject=".$overview[0]->subject); // Decode $overview[0]->subject according to RFC2047 // Can use also imap_mime_header_decode($str) diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 5ce79a12231..6c139a0f10c 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1939,7 +1939,7 @@ WithoutDolTrackingID=Dolibarr Reference not found in Message ID FormatZip=Zip MainMenuCode=Menu entry code (mainmenu) ECMAutoTree=Show automatic ECM tree -OperationParamDesc=Define values to use for action, or how to extract values. For example:
objproperty1=SET:abc
objproperty1=SET:a value with replacement of __objproperty1__
objproperty3=SETIFEMPTY:abc
objproperty4=EXTRACT:HEADER:X-Myheaderkey.*[^\s]+(.*)
options_myextrafield=EXTRACT:SUBJECT:([^\s]*)
object.objproperty5=EXTRACT:BODY:My company name is\s([^\s]*)

Use a ; char as separator to extract or set several properties. +OperationParamDesc=Define the values to use for the object of the action, or how to extract values. For example:
objproperty1=SET:the value to set
objproperty2=SET:a value with replacement of __objproperty1__
objproperty3=SETIFEMPTY:value used if objproperty3 is not already defined
objproperty4=EXTRACT:HEADER:X-Myheaderkey:\s*([^\s]*)
options_myextrafield1=EXTRACT:SUBJECT:([^\n]*)
object.objproperty5=EXTRACT:BODY:My company name is\s([^\s]*)

Use a ; char as separator to extract or set several properties. OpeningHours=Opening hours OpeningHoursDesc=Enter here the regular opening hours of your company. ResourceSetup=Configuration of Resource module From 4a65b629ee3c93266226208d24806aee8243e168 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 14 May 2020 14:29:14 +0200 Subject: [PATCH 158/158] Position of fields --- htdocs/index.php | 4 ++-- htdocs/theme/eldy/global.inc.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/index.php b/htdocs/index.php index 36aae1f25b8..7f6e462839b 100644 --- a/htdocs/index.php +++ b/htdocs/index.php @@ -142,11 +142,11 @@ if (empty($user->socid) && empty($conf->global->MAIN_DISABLE_GLOBAL_BOXSTATS)) 'orders', 'invoices', 'donations', - 'contracts', - 'interventions', 'supplier_proposals', 'supplier_orders', 'supplier_invoices', + 'contracts', + 'interventions', 'ticket' ); diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 2f5e10c1459..afb154408c5 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -3643,7 +3643,7 @@ ul.noborder li:nth-child(even):not(.liste_titre) { box-shadow: 0px 0px 8px 0px rgba(0,0,0,0.20); } span.boxstatstext { - opacity: 0.7; + opacity: 0.5; line-height: 18px; color: var(--colortext); }
attributes[$object->table_element]['required'][$key])) print ' fieldrequired'; print '">'; if (!empty($extrafields->attributes[$object->table_element]['help'][$key])) print $form->textwithpicto($langs->trans($label), $langs->trans($extrafields->attributes[$object->table_element]['help'][$key])); @@ -161,6 +175,7 @@ if (empty($reshook) && is_array($extrafields->attributes[$object->table_element] //print 'x'.$object->array_options['options_' . $key].'-'.$datenotinstring.' - '.dol_print_date($datenotinstring, 'dayhour'); $value = isset($_POST["options_".$key]) ? dol_mktime($_POST["options_".$key."hour"], $_POST["options_".$key."min"], 0, $_POST["options_".$key."month"], $_POST["options_".$key."day"], $_POST["options_".$key."year"]) : $datenotinstring; } + //TODO Improve element and rights detection if ($action == 'edit_extras' && $permok && GETPOST('attribute', 'none') == $key) { diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 60c7ee43bb0..2f5e10c1459 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -1751,7 +1751,7 @@ img.photorefnoborder { border-bottom: px solid rgb(); /* border-bottom: 2px solid var(--colorbackhmenu1); */ } -.trextrafieldseparator td { +.trextrafieldseparator td, .trextrafields_collapse_last td { /* border-bottom: 2px solid var(--colorbackhmenu1) !important; */ border-bottom: 2px solid rgb() !important; } diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index c7ce5709efd..da2df5eb788 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -1799,7 +1799,7 @@ img.photorefnoborder { border-bottom: px solid rgb(); } -.trextrafieldseparator td { +.trextrafieldseparator td, .trextrafields_collapse_last td { border-bottom: 1px solid rgb() !important; } .tdhrthin { From 1bd00b0e8c635db1a8348c97d3933699b92d88db Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 14 May 2020 12:28:17 +0200 Subject: [PATCH 156/158] Fix to solve feedbacks of https://www.dolibarr.fr/forum/t/email-collector-avec-office-365-bug-et-contournement/32726 --- .../class/emailcollector.class.php | 20 +++++++++++++++---- .../install/mysql/migration/11.0.0-12.0.0.sql | 2 ++ .../llx_emailcollector_emailcollector.sql | 3 ++- htdocs/langs/en_US/admin.lang | 1 + 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/htdocs/emailcollector/class/emailcollector.class.php b/htdocs/emailcollector/class/emailcollector.class.php index 11cf2477720..969b83cac5a 100644 --- a/htdocs/emailcollector/class/emailcollector.class.php +++ b/htdocs/emailcollector/class/emailcollector.class.php @@ -100,8 +100,9 @@ class EmailCollector extends CommonObject 'ref' => array('type'=>'varchar(128)', 'label'=>'Ref', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'showoncombobox'=>1, 'index'=>1, 'position'=>10, 'searchall'=>1, 'help'=>'Example: MyCollector1'), 'label' => array('type'=>'varchar(255)', 'label'=>'Label', 'visible'=>1, 'enabled'=>1, 'position'=>30, 'notnull'=>-1, 'searchall'=>1, 'help'=>'Example: My Email collector'), 'description' => array('type'=>'text', 'label'=>'Description', 'visible'=>-1, 'enabled'=>1, 'position'=>60, 'notnull'=>-1), - 'host' => array('type'=>'varchar(255)', 'label'=>'EMailHost', 'visible'=>1, 'enabled'=>1, 'position'=>100, 'notnull'=>1, 'searchall'=>1, 'comment'=>"IMAP server", 'help'=>'Example: imap.gmail.com'), - 'login' => array('type'=>'varchar(128)', 'label'=>'Login', 'visible'=>1, 'enabled'=>1, 'position'=>101, 'notnull'=>-1, 'index'=>1, 'comment'=>"IMAP login", 'help'=>'Example: myaccount@gmail.com'), + 'host' => array('type'=>'varchar(255)', 'label'=>'EMailHost', 'visible'=>1, 'enabled'=>1, 'position'=>90, 'notnull'=>1, 'searchall'=>1, 'comment'=>"IMAP server", 'help'=>'Example: imap.gmail.com'), + 'hostcharset' => array('type'=>'varchar(16)', 'label'=>'HostCharset', 'visible'=>-1, 'enabled'=>1, 'position'=>91, 'notnull'=>0, 'searchall'=>0, 'comment'=>"IMAP server charset", 'help'=>'Example: "UTF-8" (May be "US-ASCII" with some Office365)'), + 'login' => array('type'=>'varchar(128)', 'label'=>'Login', 'visible'=>1, 'enabled'=>1, 'position'=>101, 'notnull'=>-1, 'index'=>1, 'comment'=>"IMAP login", 'help'=>'Example: myaccount@gmail.com'), 'password' => array('type'=>'password', 'label'=>'Password', 'visible'=>-1, 'enabled'=>1, 'position'=>102, 'notnull'=>-1, 'comment'=>"IMAP password", 'help'=>'WithGMailYouCanCreateADedicatedPassword'), 'source_directory' => array('type'=>'varchar(255)', 'label'=>'MailboxSourceDirectory', 'visible'=>-1, 'enabled'=>1, 'position'=>103, 'notnull'=>1, 'default' => 'Inbox', 'help'=>'Example: INBOX'), //'filter' => array('type'=>'text', 'label'=>'Filter', 'visible'=>1, 'enabled'=>1, 'position'=>105), @@ -173,6 +174,7 @@ class EmailCollector extends CommonObject public $host; + public $hostcharset; public $login; public $password; public $source_directory; @@ -985,9 +987,10 @@ class EmailCollector extends CommonObject $nbemailprocessed = 0; $nbemailok = 0; $nbactiondone = 0; + $charset = ($this->hostcharset ? $this->hostcharset : "UTF-8"); // Scan IMAP inbox - $arrayofemail = imap_search($connection, $search, null, "UTF-8"); + $arrayofemail = imap_search($connection, $search, null, $charset); if ($arrayofemail === false) { // Nothing found or search string not understood @@ -1086,6 +1089,7 @@ class EmailCollector extends CommonObject } $header = imap_fetchheader($connection, $imapemail, 0); + $header = preg_replace('/\r\n\s+/m', ' ', $header); // When a header line is on several lines, merge lines $matches = array(); preg_match_all('/([^: ]+): (.+?(?:\r\n\s(?:.+?))*)\r\n/m', $header, $matches); $headers = array_combine($matches[1], $matches[2]); @@ -1132,7 +1136,10 @@ class EmailCollector extends CommonObject // Can use also imap_mime_header_decode($str) // Can use also mb_decode_mimeheader($str) // Can use also iconv_mime_decode($str, ICONV_MIME_DECODE_CONTINUE_ON_ERROR, 'UTF-8') - if (function_exists('imap_mime_header_decode')) { + if (function_exists('iconv_mime_decode')) { + $overview[0]->subject = iconv_mime_decode($overview[0]->subject, ICONV_MIME_DECODE_CONTINUE_ON_ERROR, 'UTF-8'); + } + elseif (function_exists('imap_mime_header_decode')) { $elements = imap_mime_header_decode($overview[0]->subject); $newstring = ''; if (!empty($elements)) { @@ -1146,6 +1153,8 @@ class EmailCollector extends CommonObject elseif (function_exists('mb_decode_mimeheader')) { $overview[0]->subject = mb_decode_mimeheader($overview[0]->subject); } + // Removed emojis + $overview[0]->subject = preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $overview[0]->subject); // Parse IMAP email structure global $htmlmsg, $plainmsg, $charset, $attachments; @@ -1153,6 +1162,9 @@ class EmailCollector extends CommonObject //$htmlmsg,$plainmsg,$charset,$attachments $messagetext = $plainmsg ? $plainmsg : dol_string_nohtmltag($htmlmsg, 0); + // Removed emojis + $messagetext = preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $messagetext); + /*var_dump($plainmsg); var_dump($htmlmsg); var_dump($messagetext);*/ diff --git a/htdocs/install/mysql/migration/11.0.0-12.0.0.sql b/htdocs/install/mysql/migration/11.0.0-12.0.0.sql index 8a68e763160..7daf41a05d3 100644 --- a/htdocs/install/mysql/migration/11.0.0-12.0.0.sql +++ b/htdocs/install/mysql/migration/11.0.0-12.0.0.sql @@ -285,3 +285,5 @@ ALTER TABLE llx_prelevement_facture ADD COLUMN fk_facture_fourn INTEGER NULL; ALTER TABLE llx_menu MODIFY COLUMN module varchar(255); UPDATE llx_actioncomm SET fk_action = 50 where fk_action = 40 AND code = 'TICKET_MSG'; + +ALTER TABLE llx_emailcollector_emailcollector ADD COLUMN hostcharset varchar(16) DEFAULT 'UTF-8'; diff --git a/htdocs/install/mysql/tables/llx_emailcollector_emailcollector.sql b/htdocs/install/mysql/tables/llx_emailcollector_emailcollector.sql index 10f3e4f8b9b..87581f418e8 100644 --- a/htdocs/install/mysql/tables/llx_emailcollector_emailcollector.sql +++ b/htdocs/install/mysql/tables/llx_emailcollector_emailcollector.sql @@ -21,7 +21,8 @@ CREATE TABLE llx_emailcollector_emailcollector( ref varchar(128) NOT NULL, label varchar(255), description text, - host varchar(255), + host varchar(255), + hostcharset varchar(16) DEFAULT 'UTF-8', login varchar(128), password varchar(128), source_directory varchar(255) NOT NULL, diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 1bd7f3d0297..5ce79a12231 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -40,6 +40,7 @@ WebUserGroup=Web server user/group NoSessionFound=Your PHP configuration seems to not allow listing of active sessions. The directory used to save sessions (%s) may be protected (for example by OS permissions or by PHP directive open_basedir). DBStoringCharset=Database charset to store data DBSortingCharset=Database charset to sort data +HostCharset=Host charset ClientCharset=Client charset ClientSortingCharset=Client collation WarningModuleNotActive=Module %s must be enabled From bcaa83eeeca16486d5d3d511ea7290b25146aba5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 14 May 2020 14:10:04 +0200 Subject: [PATCH 157/158] FIX dol_concatdesc to escape < Better help --- htdocs/admin/emailcollector_card.php | 4 ++-- htdocs/core/class/translate.class.php | 2 +- htdocs/core/lib/functions.lib.php | 9 +++++---- htdocs/emailcollector/class/emailcollector.class.php | 9 +++++++-- htdocs/langs/en_US/admin.lang | 2 +- 5 files changed, 16 insertions(+), 10 deletions(-) diff --git a/htdocs/admin/emailcollector_card.php b/htdocs/admin/emailcollector_card.php index 74592ff777a..80161eaadc6 100644 --- a/htdocs/admin/emailcollector_card.php +++ b/htdocs/admin/emailcollector_card.php @@ -592,7 +592,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea print ''; $htmltext = $langs->transnoentitiesnoconv("OperationParamDesc"); //var_dump($htmltext); - print $form->textwithpicto('', $htmltext); + print $form->textwithpicto('', $htmltext, 1, 'help', '', 0, 2, 'operationparamtt'); print ''; - print ''.img_edit().''; + print ''.img_edit().''; print ' '.img_delete().''; print '