diff --git a/htdocs/admin/ihm.php b/htdocs/admin/ihm.php index 1f5e305361f2f..dae763a002963 100644 --- a/htdocs/admin/ihm.php +++ b/htdocs/admin/ihm.php @@ -249,7 +249,9 @@ dolibarr_set_const($db, "MAIN_IHM_PARAMS_REV", getDolGlobalInt('MAIN_IHM_PARAMS_REV') + 1, 'chaine', 0, '', $conf->entity); dolibarr_set_const($db, "MAIN_SIZE_LISTE_LIMIT", GETPOST("MAIN_SIZE_LISTE_LIMIT", 'int'), 'chaine', 0, '', $conf->entity); + dolibarr_set_const($db, "MAIN_GRANDTOTAL_LIST_SHOW", GETPOST("MAIN_GRANDTOTAL_LIST_SHOW", 'int'), 'chaine', 0, '', $conf->entity); dolibarr_set_const($db, "MAIN_SIZE_SHORTLIST_LIMIT", GETPOST("main_size_shortliste_limit", 'int'), 'chaine', 0, '', $conf->entity); + if (GETPOSTISSET("MAIN_CHECKBOX_LEFT_COLUMN")) { dolibarr_set_const($db, "MAIN_CHECKBOX_LEFT_COLUMN", GETPOST("MAIN_CHECKBOX_LEFT_COLUMN", 'int'), 'chaine', 0, '', $conf->entity); @@ -432,12 +434,17 @@ // Max size of lists print '' . $langs->trans("DefaultMaxSizeList") . ''; print ''; + + // Display grand total in list's footer + print '' . $langs->trans("DisplayGrandTotalInList") . ''; + print ajax_constantonoff("MAIN_GRANDTOTAL_LIST_SHOW", array(), $conf->entity, 0, 0, 1, 0, 0, 0, '', 'other'); + print ''; // Max size of short lists on customer card print '' . $langs->trans("DefaultMaxSizeShortList") . ''; print ''; - // Max size of lists + // Display checkboxes and fields menu left / right print '' . $langs->trans("MAIN_CHECKBOX_LEFT_COLUMN") . ''; print ajax_constantonoff("MAIN_CHECKBOX_LEFT_COLUMN", array(), $conf->entity, 0, 0, 1, 0, 0, 0, '', 'other'); print ''; diff --git a/htdocs/core/tpl/list_print_total.tpl.php b/htdocs/core/tpl/list_print_total.tpl.php index 88aff7cce8242..15a9be6ebb131 100644 --- a/htdocs/core/tpl/list_print_total.tpl.php +++ b/htdocs/core/tpl/list_print_total.tpl.php @@ -9,37 +9,13 @@ } // Show total line if (isset($totalarray['pos'])) { + print ''; print ''; $i = 0; while ($i < $totalarray['nbfield']) { $i++; if (!empty($totalarray['pos'][$i])) { - // if $totalarray['type'] not present we consider it as number - if (empty($totalarray['type'][$i])) { - $totalarray['type'][$i] = 'real'; - } - switch ($totalarray['type'][$i]) { - case 'duration': - print ''; - print (!empty($totalarray['val'][$totalarray['pos'][$i]]) ? convertSecondToTime($totalarray['val'][$totalarray['pos'][$i]], 'allhourmin') : 0); - print ''; - break; - case 'string': // This type is no more used. type is now varchar(x) - print ''; - print (!empty($totalarray['val'][$totalarray['pos'][$i]]) ? $totalarray['val'][$totalarray['pos'][$i]] : ''); - print ''; - break; - case 'stock': - print ''; - print price2num(!empty($totalarray['val'][$totalarray['pos'][$i]]) ? $totalarray['val'][$totalarray['pos'][$i]] : 0, 'MS'); - print ''; - break; - default: - print ''; - print price(!empty($totalarray['val'][$totalarray['pos'][$i]]) ? $totalarray['val'][$totalarray['pos'][$i]] : 0); - print ''; - break; - } + printTotalValCell($totalarray['type'][$i], $totalarray['val'][$totalarray['pos'][$i]]); } else { if ($i == 1) { if (is_null($limit) || $num < $limit) { @@ -59,4 +35,86 @@ } } print ''; + // Add VMA : add grand total if necessary + if (getDolGlobalString('MAIN_GRANDTOTAL_LIST_SHOW') && (true || !(is_null($limit) || $num < $limit))) { // we print grand total only if different of page total already printed above + if (isset($totalarray['pos']) && is_array($totalarray['pos']) && count($totalarray['pos']) > 0) { + $sumsarray = false; + $tbsumfields = []; + foreach ($totalarray['pos'] as $field) { + $tbsumfields[] = "sum($field) as `$field`"; + } + if (isset($sqlfields)) { // In project, commande list, this var is defined + $sqlforgrandtotal = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT '. implode(",", $tbsumfields), $sql); + } else { + $sqlforgrandtotal = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/', 'SELECT '. implode(",", $tbsumfields). ' FROM ', $sql); + } + $sqlforgrandtotal = preg_replace('/GROUP BY .*$/', '', $sqlforgrandtotal). ''; + //echo $sqlforgrandtotal; + $resql = $db->query($sqlforgrandtotal); + if ($resql) { + $sumsarray = $db->fetch_array($resql); + } else { + //dol_print_error($db); // as we're not sure it's ok for ALL lists, we don't print sq errors, they'll be in logs + } + if (is_array($sumsarray) && count($sumsarray) >0) { + // Show grand total line + print ''; + $i = 0; + while ($i < $totalarray['nbfield']) { + $i++; + if (!empty($totalarray['pos'][$i])) { + printTotalValCell($totalarray['type'][$i], $sumsarray[$totalarray['pos'][$i]]); + } else { + if ($i == 1) { + print ''; + if (is_object($form)) { + print $form->textwithpicto($langs->trans("GrandTotal"), $langs->transnoentitiesnoconv("TotalforAllPages")); + } else { + print $langs->trans("GrandTotal"); + } + print ''; + } else { + print ''; + } + } + } + print ''; + } + } + } + print ''; } + +/** print a total cell value according to its type + * + * @param string $type of field (duration, string..) + * @param string $val the value to display + */ +function printTotalValCell($type, $val) { + // if $totalarray['type'] not present we consider it as number + if (empty($type)) { + $type = 'real'; + } + switch ($type) { + case 'duration': + print ''; + print (!empty($val) ? convertSecondToTime($val, 'allhourmin') : 0); + print ''; + break; + case 'string': // This type is no more used. type is now varchar(x) + print ''; + print (!empty($val) ? $val : ''); + print ''; + break; + case 'stock': + print ''; + print price2num(!empty($val) ? $val : 0, 'MS'); + print ''; + break; + default: + print ''; + print price(!empty($val) ? $val : 0); + print ''; + break; + } +} \ No newline at end of file diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 627d2d08a1f4e..d2ca53d4aecec 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1201,6 +1201,7 @@ Skin=Skin theme DefaultSkin=Default skin theme MaxSizeList=Max length for list DefaultMaxSizeList=Default max length for lists +DisplayGrandTotalInList=Display grand total (for all pages) in lists footer DefaultMaxSizeShortList=Default max length for short lists (i.e. in customer card) MessageOfDay=Message of the day MessageLogin=Login page message diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index 8c40379b67b7b..bee41a827bdac 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -420,6 +420,8 @@ TotalTTCShort=Total (inc. tax) TotalHT=Total (excl. tax) TotalHTforthispage=Total (excl. tax) for this page Totalforthispage=Total for this page +GrandTotal=Grand total +TotalforAllPages=Total for all pages TotalTTC=Total (inc. tax) TotalTTCToYourCredit=Total (inc. tax) to your credit TotalVAT=Total tax diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang index 94a4878fb1193..1f6d6d9364464 100644 --- a/htdocs/langs/fr_FR/admin.lang +++ b/htdocs/langs/fr_FR/admin.lang @@ -1201,6 +1201,7 @@ Skin=Thème visuel DefaultSkin=Thème visuel par défaut MaxSizeList=Longueur maximale des listes DefaultMaxSizeList=Longueur maximale par défaut des listes +DisplayGrandTotalInList=Affiche le total général (de toutes les pages) en bas des listes DefaultMaxSizeShortList=Longueur maximale par défaut des listes courtes (e.g. dans la fiche client) MessageOfDay=Message du jour MessageLogin=Message page de connexion diff --git a/htdocs/langs/fr_FR/main.lang b/htdocs/langs/fr_FR/main.lang index 9019201c1bbba..98e74d35cb794 100644 --- a/htdocs/langs/fr_FR/main.lang +++ b/htdocs/langs/fr_FR/main.lang @@ -420,6 +420,8 @@ TotalTTCShort=Total TTC TotalHT=Total HT TotalHTforthispage=Montant (HT) pour la page Totalforthispage=Total pour cette page +GrandTotal=Total général +TotalforAllPages=Total général de toutes les pages TotalTTC=Total TTC TotalTTCToYourCredit=Total TTC à votre crédit TotalVAT=Total TVA