From 1b35380dda4b47606d4ee8172c4152770af65a63 Mon Sep 17 00:00:00 2001 From: atm-quentin Date: Mon, 4 May 2020 14:55:24 +0200 Subject: [PATCH 01/61] 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 02/61] 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 ''.$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 ''; + } // ThirdParty Type 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 b6aa766c72078988a0e74d8b5305b96eb9d6d509 Mon Sep 17 00:00:00 2001 From: atm-quentin Date: Wed, 6 May 2020 09:37:17 +0200 Subject: [PATCH 03/61] 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 ''.$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 ''; - } +if(! empty($conf->category->enabled) && $mode == 'customer') { + // Customer Category + 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 ''; +} // ThirdParty Type 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 0cd05887ce95de5496924a941a92f31155a0ed2e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 7 May 2020 17:21:27 +0200 Subject: [PATCH 04/61] 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 ''; - print ''.num_open_day($object->date_debut_gmt, $object->date_fin_gmt, 0, 1, $object->halfday).''; + print ''; + print num_open_day($object->date_debut_gmt, $object->date_fin_gmt, 0, 1, $object->halfday); + print ''; print ''; if ($object->statut == Holiday::STATUS_REFUSED) From d9a0edcf2b83aa9e9f6e35fefa8e740f1c36ab14 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Fri, 8 May 2020 00:01:56 +0200 Subject: [PATCH 05/61] 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 06/61] 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 a49635a825360a8cb92acecb92dae14d389693b0 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Fri, 8 May 2020 07:45:01 +0200 Subject: [PATCH 07/61] 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 ''; +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 08/61] 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 09/61] 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 10/61] 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 11/61] 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 12/61] 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 13/61] 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 14/61] 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 15/61] 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 16/61] 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 17/61] 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 18/61] 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 19/61] 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 20/61] 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 21/61] 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 22/61] 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 23/61] 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 24/61] 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 25/61] 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 26/61] 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 27/61] 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 28/61] 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 29/61] 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 30/61] 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 31/61] 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 33/61] 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 34/61] 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 35/61] 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 36/61] 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 37/61] 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 38/61] 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 39/61] 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 40/61] 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 41/61] 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 42/61] 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 43/61] 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 44/61] 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 45/61] 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 ' + $html .= ' - - - - '; + '.dol_print_date(dol_stringtotime($product->date_upd), 'dayhour').' - '.$langs->trans('Ref').': '.$product->reference.' - '.$langs->trans('Id').': '.$product->id.'

'.$product->description_short->language[$this->lang - 1].''; + // do not load if display none + //$html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; } return $html; } From 410694100d911de889d06f59f43756e6df849b4e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 12 May 2020 23:42:01 +0200 Subject: [PATCH 50/61] 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 51/61] 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 '
'.$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 32/61] 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 46/61] 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 47/61] 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 48/61] 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 366ae2f116cfaaed73e07a4b06d0a596ded92582 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Tue, 12 May 2020 18:44:26 +0200 Subject: [PATCH 49/61] Update dolistore.class.php --- .../admin/dolistore/class/dolistore.class.php | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/htdocs/admin/dolistore/class/dolistore.class.php b/htdocs/admin/dolistore/class/dolistore.class.php index 230c588f7e4..a229f3c985d 100644 --- a/htdocs/admin/dolistore/class/dolistore.class.php +++ b/htdocs/admin/dolistore/class/dolistore.class.php @@ -248,11 +248,8 @@ class Dolistore // phpcs:enable global $langs, $conf; $html = ""; - $parity = "pair"; $last_month = time() - (30 * 24 * 60 * 60); foreach ($this->products as $product) { - $parity = ($parity == "impair") ? 'pair' : 'impair'; - // check new product ? $newapp = ''; if ($last_month < strtotime($product->date_add)) { @@ -267,7 +264,7 @@ class Dolistore // add image or default ? if ($product->id_default_image != '') { $image_url = DOL_URL_ROOT.'/admin/dolistore/ajax/image.php?id_product='.$product->id.'&id_image='.$product->id_default_image; - $images = ''; + $images = ''; $images .= ''; } else { $images = ''; @@ -306,16 +303,16 @@ class Dolistore //.'
'.$langs->trans("SeeInMarkerPlace").' //output template - $html .= '
'.$newapp.$images.'

'.$product->name->language[$this->lang - 1] .'
'.$version.'

- '.dol_print_date(dol_stringtotime($product->date_upd), 'dayhour').' - '.$langs->trans('Ref').': '.$product->reference.' - '.$langs->trans('Id').': '.$product->id.'

'.$product->description_short->language[$this->lang - 1].'
'.$price.' - '.$download_link.'
'.$price.''.$download_link.'
'; - // 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 52/61] 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 53/61] 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 54/61] 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 55/61] 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 56/61] 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 57/61] 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 58/61] 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 61/61] 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 59/61] 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 60/61] 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 '