From 5c1a84746cbb5c8045ef62bbec132b3c5ea11db2 Mon Sep 17 00:00:00 2001 From: Lenin Rivas <53640168+leninrivas@users.noreply.github.com> Date: Mon, 12 Aug 2019 15:21:41 -0500 Subject: [PATCH 001/230] Add Linked objects Fichinter Ref. in PDF formats --- htdocs/core/lib/pdf.lib.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/htdocs/core/lib/pdf.lib.php b/htdocs/core/lib/pdf.lib.php index 56ca215e118..22bccb4462e 100644 --- a/htdocs/core/lib/pdf.lib.php +++ b/htdocs/core/lib/pdf.lib.php @@ -10,6 +10,7 @@ * Copyright (C) 2014 Cedric GROSS * Copyright (C) 2014 Teddy Andreotti <125155@supinfo.com> * Copyright (C) 2015-2016 Marcos García + * Copyright (C) 2019 Lenin Rivas * * 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 @@ -2129,6 +2130,17 @@ function pdf_getLinkedObjects($object, $outputlangs) $linkedobjects[$objecttype]['date_value'] = dol_print_date($elementobject->date_contrat, 'day', '', $outputlangs); } } + else if ($objecttype == 'fichinter') + { + $outputlangs->load('interventions'); + foreach($objects as $elementobject) + { + $linkedobjects[$objecttype]['ref_title'] = $outputlangs->transnoentities("InterRef"); + $linkedobjects[$objecttype]['ref_value'] = $outputlangs->transnoentities($elementobject->ref); + $linkedobjects[$objecttype]['date_title'] = $outputlangs->transnoentities("InterDate"); + $linkedobjects[$objecttype]['date_value'] = dol_print_date($elementobject->datec,'day','',$outputlangs); + } + } elseif ($objecttype == 'shipping') { $outputlangs->loadLangs(array("orders", "sendings")); From 8522faea7f86f000bf9d31f0ea043a24c1e59165 Mon Sep 17 00:00:00 2001 From: altairis Date: Wed, 20 Nov 2019 10:15:46 +0100 Subject: [PATCH 002/230] add conf --- htdocs/conf/conf.php | 51 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 htdocs/conf/conf.php diff --git a/htdocs/conf/conf.php b/htdocs/conf/conf.php new file mode 100644 index 00000000000..bfadb6d5c55 --- /dev/null +++ b/htdocs/conf/conf.php @@ -0,0 +1,51 @@ + Date: Fri, 22 Nov 2019 15:14:32 +0100 Subject: [PATCH 003/230] remove conf --- htdocs/conf/conf.php | 51 -------------------------------------------- 1 file changed, 51 deletions(-) delete mode 100644 htdocs/conf/conf.php diff --git a/htdocs/conf/conf.php b/htdocs/conf/conf.php deleted file mode 100644 index bfadb6d5c55..00000000000 --- a/htdocs/conf/conf.php +++ /dev/null @@ -1,51 +0,0 @@ - Date: Fri, 22 Nov 2019 15:14:55 +0100 Subject: [PATCH 004/230] allow time consumed to be linked to another task --- htdocs/projet/tasks/time.php | 102 +++++++++++++++++++++++++---------- 1 file changed, 73 insertions(+), 29 deletions(-) diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index 0f9e9fb6357..c534789c812 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -5,6 +5,7 @@ * Copyright (C) 2011 Juanjo Menent * Copyright (C) 2018 Ferran Marcet * Copyright (C) 2018 Frédéric France + * Copyright (C) 2019 Christophe Battarel * * 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 @@ -225,34 +226,70 @@ if (($action == 'updateline' || $action == 'updatesplitline') && !$_POST["cancel if (!$error) { - $object->fetch($id, $ref); - // TODO Check that ($task_time->fk_user == $user->id || in_array($task_time->fk_user, $childids)) - - $object->timespent_id = $_POST["lineid"]; - $object->timespent_note = $_POST["timespent_note_line"]; - $object->timespent_old_duration = $_POST["old_duration"]; - $object->timespent_duration = $_POST["new_durationhour"] * 60 * 60; // We store duration in seconds - $object->timespent_duration += $_POST["new_durationmin"] * 60; // We store duration in seconds - if (GETPOST("timelinehour") != '' && GETPOST("timelinehour") >= 0) // If hour was entered - { - $object->timespent_date = dol_mktime(GETPOST("timelinehour"), GETPOST("timelinemin"), 0, GETPOST("timelinemonth"), GETPOST("timelineday"), GETPOST("timelineyear")); - $object->timespent_withhour = 1; - } - else + if ($_POST['taskid'] != $id) { - $object->timespent_date = dol_mktime(12, 0, 0, GETPOST("timelinemonth"), GETPOST("timelineday"), GETPOST("timelineyear")); + $id = $_POST['taskid']; + + $object->fetchTimeSpent(GETPOST('lineid', 'int')); + // TODO Check that ($task_time->fk_user == $user->id || in_array($task_time->fk_user, $childids)) + $result = $object->delTimeSpent($user); + + $object->fetch($id); + $object->timespent_note = $_POST["timespent_note_line"]; + $object->timespent_duration = $_POST["new_durationhour"] * 60 * 60; // We store duration in seconds + $object->timespent_duration += ($_POST["new_durationmin"] ? $_POST["new_durationmin"] : 0) * 60; // We store duration in seconds + if (GETPOST("timelinehour") != '' && GETPOST("timelinehour") >= 0) // If hour was entered + { + $object->timespent_date = dol_mktime(GETPOST("timelinehour"), GETPOST("timelinemin"), 0, GETPOST("timelinemonth"), GETPOST("timelineday"), GETPOST("timelineyear")); + $object->timespent_withhour = 1; + } + else + { + $object->timespent_date = dol_mktime(12, 0, 0, GETPOST("timelinemonth"), GETPOST("timelineday"), GETPOST("timelineyear")); + } + $object->timespent_fk_user = $_POST["userid_line"]; + $result = $object->addTimeSpent($user); + if ($result >= 0) + { + setEventMessages($langs->trans("RecordSaved"), null, 'mesgs'); + } + else + { + setEventMessages($langs->trans($object->error), null, 'errors'); + $error++; + } } - $object->timespent_fk_user = $_POST["userid_line"]; + else + { + $object->fetch($id, $ref); + // TODO Check that ($task_time->fk_user == $user->id || in_array($task_time->fk_user, $childids)) - $result = $object->updateTimeSpent($user); - if ($result >= 0) - { - setEventMessages($langs->trans("RecordSaved"), null, 'mesgs'); - } - else - { - setEventMessages($langs->trans($object->error), null, 'errors'); - $error++; + $object->timespent_id = $_POST["lineid"]; + $object->timespent_note = $_POST["timespent_note_line"]; + $object->timespent_old_duration = $_POST["old_duration"]; + $object->timespent_duration = $_POST["new_durationhour"] * 60 * 60; // We store duration in seconds + $object->timespent_duration += $_POST["new_durationmin"] * 60; // We store duration in seconds + if (GETPOST("timelinehour") != '' && GETPOST("timelinehour") >= 0) // If hour was entered + { + $object->timespent_date = dol_mktime(GETPOST("timelinehour"), GETPOST("timelinemin"), 0, GETPOST("timelinemonth"), GETPOST("timelineday"), GETPOST("timelineyear")); + $object->timespent_withhour = 1; + } + else + { + $object->timespent_date = dol_mktime(12, 0, 0, GETPOST("timelinemonth"), GETPOST("timelineday"), GETPOST("timelineyear")); + } + $object->timespent_fk_user = $_POST["userid_line"]; + + $result = $object->updateTimeSpent($user); + if ($result >= 0) + { + setEventMessages($langs->trans("RecordSaved"), null, 'mesgs'); + } + else + { + setEventMessages($langs->trans($object->error), null, 'errors'); + $error++; + } } } else @@ -1195,10 +1232,17 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0) if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) // Not a dedicated task { print ''; - $tasktmp->id = $task_time->fk_task; - $tasktmp->ref = $task_time->ref; - $tasktmp->label = $task_time->label; - print $tasktmp->getNomUrl(1, 'withproject', 'time'); + if ($action == 'editline' && $_GET['lineid'] == $task_time->rowid) + { + $formproject->selectTasks(-1, GETPOST('taskid', 'int')?GETPOST('taskid', 'int'):$task_time->fk_task, 'taskid', 0, 0, 1, 1, 0, 0, 'maxwidth300', $projectstatic->id, ''); + } + else + { + $tasktmp->id = $task_time->fk_task; + $tasktmp->ref = $task_time->ref; + $tasktmp->label = $task_time->label; + print $tasktmp->getNomUrl(1, 'withproject', 'time'); + } print ''; if (!$i) $totalarray['nbfield']++; } From 7f24d1fe407941af8545d726e6a98205f8874e46 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Fri, 22 Nov 2019 14:18:09 +0000 Subject: [PATCH 005/230] Fixing style errors. --- htdocs/projet/tasks/time.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index c534789c812..9fb95609cb6 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -229,11 +229,11 @@ if (($action == 'updateline' || $action == 'updatesplitline') && !$_POST["cancel if ($_POST['taskid'] != $id) { $id = $_POST['taskid']; - + $object->fetchTimeSpent(GETPOST('lineid', 'int')); // TODO Check that ($task_time->fk_user == $user->id || in_array($task_time->fk_user, $childids)) $result = $object->delTimeSpent($user); - + $object->fetch($id); $object->timespent_note = $_POST["timespent_note_line"]; $object->timespent_duration = $_POST["new_durationhour"] * 60 * 60; // We store duration in seconds @@ -259,7 +259,7 @@ if (($action == 'updateline' || $action == 'updatesplitline') && !$_POST["cancel $error++; } } - else + else { $object->fetch($id, $ref); // TODO Check that ($task_time->fk_user == $user->id || in_array($task_time->fk_user, $childids)) From b6c9de39289d191ea82b2e9733dd63ec330ebc4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Tue, 17 Dec 2019 14:49:18 +0100 Subject: [PATCH 006/230] upload odt models for order --- .../modules/commande/doc/doc_generic_order_odt.modules.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/htdocs/core/modules/commande/doc/doc_generic_order_odt.modules.php b/htdocs/core/modules/commande/doc/doc_generic_order_odt.modules.php index 794e7c57a29..b753f323023 100644 --- a/htdocs/core/modules/commande/doc/doc_generic_order_odt.modules.php +++ b/htdocs/core/modules/commande/doc/doc_generic_order_odt.modules.php @@ -118,7 +118,7 @@ class doc_generic_order_odt extends ModelePDFCommandes $form = new Form($this->db); $texte = $this->description.".
\n"; - $texte .= '
'; + $texte .= ''; $texte .= ''; $texte .= ''; $texte .= ''; @@ -177,6 +177,11 @@ class doc_generic_order_odt extends ModelePDFCommandes } $texte .= ''; } + // Add select to upload a new template file. TODO Copy this feature on other admin pages. + $texte.= '
'.$langs->trans("UploadNewTemplate").' '; + $texte.= ''; + $texte.= ''; + $texte.= '
'; $texte .= ''; From 3d19e1321bbe3b6f7e22c6e0cfc903e1a839add9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Thu, 19 Dec 2019 11:10:55 +0100 Subject: [PATCH 007/230] NEW upload odt models for proposal --- .../propale/doc/doc_generic_proposal_odt.modules.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php b/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php index b955da102ab..b4b3d2fb3e0 100644 --- a/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php +++ b/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php @@ -2,7 +2,7 @@ /* Copyright (C) 2010-2012 Laurent Destailleur * Copyright (C) 2012 Juanjo Menent * Copyright (C) 2016 Charlie Benke - * Copyright (C) 2018 Frédéric France + * Copyright (C) 2018-2019 Frédéric France * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -115,7 +115,7 @@ class doc_generic_proposal_odt extends ModelePDFPropales $form = new Form($this->db); $texte = $this->description.".
\n"; - $texte .= ''; + $texte .= ''; $texte .= ''; $texte .= ''; $texte .= ''; @@ -205,7 +205,11 @@ class doc_generic_proposal_odt extends ModelePDFPropales $texte .= ''; } } - + // Add select to upload a new template file. TODO Copy this feature on other admin pages. + $texte .= '
'.$langs->trans("UploadNewTemplate").' '; + $texte .= ''; + $texte .= ''; + $texte .= '
'; $texte .= ''; $texte .= ''; From ee7fe667494aa20f6ed35ef6f4e66177dbba36f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Tue, 31 Dec 2019 14:19:31 +0100 Subject: [PATCH 008/230] Update doc_generic_order_odt.modules.php --- .../commande/doc/doc_generic_order_odt.modules.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/core/modules/commande/doc/doc_generic_order_odt.modules.php b/htdocs/core/modules/commande/doc/doc_generic_order_odt.modules.php index b753f323023..4694cdaf6ee 100644 --- a/htdocs/core/modules/commande/doc/doc_generic_order_odt.modules.php +++ b/htdocs/core/modules/commande/doc/doc_generic_order_odt.modules.php @@ -4,7 +4,7 @@ * Copyright (C) 2014 Marcos García * Copyright (C) 2016 Charlie Benke * Copyright (C) 2018-2019 Philippe Grand - * Copyright (C) 2018 Frédéric France + * Copyright (C) 2018-2019 Frédéric France * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -177,11 +177,11 @@ class doc_generic_order_odt extends ModelePDFCommandes } $texte .= ''; } - // Add select to upload a new template file. TODO Copy this feature on other admin pages. - $texte.= '
'.$langs->trans("UploadNewTemplate").' '; - $texte.= ''; - $texte.= ''; - $texte.= '
'; + // Add input to upload a new template file. + $texte .= '
'.$langs->trans("UploadNewTemplate").' '; + $texte .= ''; + $texte .= ''; + $texte .= '
'; $texte .= ''; From 57a5416cbca7a3d2dee462d9926cfeca6a0efe37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Tue, 31 Dec 2019 14:20:39 +0100 Subject: [PATCH 009/230] Update doc_generic_proposal_odt.modules.php --- .../modules/propale/doc/doc_generic_proposal_odt.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php b/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php index b4b3d2fb3e0..fde5f08d318 100644 --- a/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php +++ b/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php @@ -205,7 +205,7 @@ class doc_generic_proposal_odt extends ModelePDFPropales $texte .= ''; } } - // Add select to upload a new template file. TODO Copy this feature on other admin pages. + // Add input to upload a new template file. $texte .= '
'.$langs->trans("UploadNewTemplate").' '; $texte .= ''; $texte .= ''; From d9d70c10b35ed8e50278c53420f98cb38f0f769a Mon Sep 17 00:00:00 2001 From: Guillaume Lafarge Date: Wed, 8 Jan 2020 10:25:58 +0100 Subject: [PATCH 010/230] Add native spellcheck to CKEditor As the native spell checker is disabled by default, this PR removes the default behaviour and restore it to check for spelling and grammar in wysiwyg editor. See : https://ckeditor.com/docs/ckeditor4/latest/features/spellcheck.html#native-browser-spell-checker --- htdocs/core/class/doleditor.class.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/core/class/doleditor.class.php b/htdocs/core/class/doleditor.class.php index 29bb1c24dce..e524d174e03 100644 --- a/htdocs/core/class/doleditor.class.php +++ b/htdocs/core/class/doleditor.class.php @@ -225,7 +225,8 @@ class DolEditor breakAfterClose : true }); } - }'; + }, + disableNativeSpellChecker: false'; if ($this->uselocalbrowser) { From eddc38e37f77ef85778ddfb4d5bfa6e0181d51d6 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Wed, 15 Jan 2020 13:18:25 +0000 Subject: [PATCH 011/230] Fixing style errors. --- htdocs/projet/tasks/time.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index 779bd6ac2fd..efaaa5b75ca 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -235,8 +235,8 @@ if (($action == 'updateline' || $action == 'updatesplitline') && !$_POST["cancel $result = $object->delTimeSpent($user); $object->fetch($id, $ref); - $object->timespent_note = $_POST["timespent_note_line"]; - $object->timespent_old_duration = $_POST["old_duration"]; + $object->timespent_note = $_POST["timespent_note_line"]; + $object->timespent_old_duration = $_POST["old_duration"]; $object->timespent_duration = $_POST["new_durationhour"] * 60 * 60; // We store duration in seconds $object->timespent_duration += ($_POST["new_durationmin"] ? $_POST["new_durationmin"] : 0) * 60; // We store duration in seconds if (GETPOST("timelinehour") != '' && GETPOST("timelinehour") >= 0) // If hour was entered From 10c973f38f98e08587f2d7735f584e12ce22ebed Mon Sep 17 00:00:00 2001 From: John Botella Date: Wed, 15 Jan 2020 14:36:44 +0100 Subject: [PATCH 012/230] Fix complex export model loading --- htdocs/exports/export.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/exports/export.php b/htdocs/exports/export.php index c404fc2b264..9122c93bae4 100644 --- a/htdocs/exports/export.php +++ b/htdocs/exports/export.php @@ -373,7 +373,7 @@ if ($step == 2 && $action == 'select_model') $result = $objexport->fetch($exportmodelid); if ($result > 0) { - $fieldsarray=explode(',', $objexport->hexa); + $fieldsarray=preg_split("/,(?! [^(]*\))/", $objexport->hexa); $i=1; foreach($fieldsarray as $val) { From ad7278e6a51173ea31b2f022cd68102afd322a68 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 16 Jan 2020 02:48:24 +0100 Subject: [PATCH 013/230] FIX Label of DEPOSIT on screen Fix look and feel v11 --- htdocs/commande/card.php | 10 +++--- htdocs/compta/facture/card.php | 45 +++++++++++++++---------- htdocs/core/tpl/objectline_view.tpl.php | 8 ++++- htdocs/fourn/facture/card.php | 2 +- htdocs/langs/en_US/bills.lang | 2 +- 5 files changed, 42 insertions(+), 25 deletions(-) diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index c1dfd1ae43b..7da9fcca7d1 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -2542,6 +2542,11 @@ if ($action == 'create' && $usercancreate) // Note that $action and $object may be modified by hook $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); if (empty($reshook)) { + // Reopen a closed order + if (($object->statut == Commande::STATUS_CLOSED || $object->statut == Commande::STATUS_CANCELED) && $usercancreate) { + print ''; + } + // Send if ($object->statut > Commande::STATUS_DRAFT || !empty($conf->global->COMMANDE_SENDBYEMAIL_FOR_ALL_STATUS)) { if ($usercansend) { @@ -2619,11 +2624,6 @@ if ($action == 'create' && $usercancreate) } } - // Reopen a closed order - if (($object->statut == Commande::STATUS_CLOSED || $object->statut == Commande::STATUS_CANCELED) && $usercancreate) { - print ''; - } - // Set to shipped if (($object->statut == Commande::STATUS_VALIDATED || $object->statut == Commande::STATUS_SHIPMENTONPROCESS) && $usercanclose) { print ''; diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index 6e5ed9de613..3057d5ebe11 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -103,7 +103,9 @@ $extrafields = new ExtraFields($db); // Load object if ($id > 0 || !empty($ref)) { - $ret = $object->fetch($id, $ref, '', '', $conf->global->INVOICE_USE_SITUATION); + if ($action != 'add') { + $ret = $object->fetch($id, $ref, '', '', $conf->global->INVOICE_USE_SITUATION); + } } // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context @@ -134,6 +136,7 @@ if ($user->socid) $socid = $user->socid; $isdraft = (($object->statut == Facture::STATUS_DRAFT) ? 1 : 0); $result = restrictedArea($user, 'facture', $id, '', '', 'fk_soc', $fieldid, $isdraft); + /* * Actions */ @@ -941,11 +944,13 @@ if (empty($reshook)) { $error++; setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Date")), null, 'errors'); + $action = 'create'; } if (!($_POST['fac_replacement'] > 0)) { $error++; setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ReplaceInvoice")), null, 'errors'); + $action = 'create'; } $date_pointoftax = dol_mktime(12, 0, 0, $_POST['date_pointoftaxmonth'], $_POST['date_pointoftaxday'], $_POST['date_pointoftaxyear']); @@ -992,6 +997,7 @@ if (empty($reshook)) { $error++; setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("CorrectInvoice")), null, 'errors'); + $action = 'create'; } $dateinvoice = dol_mktime(12, 0, 0, $_POST['remonth'], $_POST['reday'], $_POST['reyear']); @@ -999,6 +1005,7 @@ if (empty($reshook)) { $error++; setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Date")), null, 'errors'); + $action = 'create'; } $date_pointoftax = dol_mktime(12, 0, 0, $_POST['date_pointoftaxmonth'], $_POST['date_pointoftaxday'], $_POST['date_pointoftaxyear']); @@ -1181,6 +1188,7 @@ if (empty($reshook)) { $error++; setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Date")), null, 'errors'); + $action = 'create'; } $date_pointoftax = dol_mktime(12, 0, 0, $_POST['date_pointoftaxmonth'], $_POST['date_pointoftaxday'], $_POST['date_pointoftaxyear']); @@ -1223,6 +1231,7 @@ if (empty($reshook)) { $error++; setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Customer")), null, 'errors'); + $action = 'create'; } $dateinvoice = dol_mktime(12, 0, 0, $_POST['remonth'], $_POST['reday'], $_POST['reyear']); @@ -1230,6 +1239,7 @@ if (empty($reshook)) { $error++; setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Date")), null, 'errors'); + $action = 'create'; } $date_pointoftax = dol_mktime(12, 0, 0, $_POST['date_pointoftaxmonth'], $_POST['date_pointoftaxday'], $_POST['date_pointoftaxyear']); @@ -1642,6 +1652,7 @@ if (empty($reshook)) $error++; $mesg = $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("InvoiceSituation")); setEventMessages($mesg, null, 'errors'); + $action = 'create'; } if (!$error) { @@ -2939,7 +2950,7 @@ if ($action == 'create') if (($origin == 'propal') || ($origin == 'commande')) { print ''; - $arraylist = array('amount' => $langs->transnoentitiesnoconv('FixAmount'), 'variable' => $langs->transnoentitiesnoconv('VarAmountOneLine', $langs->transnoentitiesnoconv('Deposit'))); + $arraylist = array('amount' => $langs->transnoentitiesnoconv('FixAmount', $langs->transnoentitiesnoconv('Deposit')), 'variable' => $langs->transnoentitiesnoconv('VarAmountOneLine', $langs->transnoentitiesnoconv('Deposit'))); print $form->selectarray('typedeposit', $arraylist, GETPOST('typedeposit'), 0, 0, 0, '', 1); print ''; print ''.$langs->trans('Value').':'; @@ -5082,21 +5093,6 @@ elseif ($id > 0 || !empty($ref)) } } - // Clone - if (($object->type == Facture::TYPE_STANDARD || $object->type == Facture::TYPE_DEPOSIT || $object->type == Facture::TYPE_PROFORMA) && $usercancreate) - { - print ''.$langs->trans("ToClone").''; - } - - // Clone as predefined / Create template - if (($object->type == Facture::TYPE_STANDARD || $object->type == Facture::TYPE_DEPOSIT || $object->type == Facture::TYPE_PROFORMA) && $object->statut == 0 && $usercancreate) - { - if (!$objectidnext && count($object->lines) > 0) - { - print ''.$langs->trans("ChangeIntoRepeatableInvoice").''; - } - } - // Create a credit note if (($object->type == Facture::TYPE_STANDARD || $object->type == Facture::TYPE_DEPOSIT || $object->type == Facture::TYPE_PROFORMA) && $object->statut > 0 && $usercancreate) { @@ -5123,6 +5119,21 @@ elseif ($id > 0 || !empty($ref)) } } + // Clone + if (($object->type == Facture::TYPE_STANDARD || $object->type == Facture::TYPE_DEPOSIT || $object->type == Facture::TYPE_PROFORMA) && $usercancreate) + { + print ''.$langs->trans("ToClone").''; + } + + // Clone as predefined / Create template + if (($object->type == Facture::TYPE_STANDARD || $object->type == Facture::TYPE_DEPOSIT || $object->type == Facture::TYPE_PROFORMA) && $object->statut == 0 && $usercancreate) + { + if (!$objectidnext && count($object->lines) > 0) + { + print ''.$langs->trans("ChangeIntoRepeatableInvoice").''; + } + } + // Remove situation from cycle if ($object->statut > Facture::STATUS_DRAFT && $object->type == Facture::TYPE_SITUATION diff --git a/htdocs/core/tpl/objectline_view.tpl.php b/htdocs/core/tpl/objectline_view.tpl.php index 12bb5053a46..408a2a6f5b2 100644 --- a/htdocs/core/tpl/objectline_view.tpl.php +++ b/htdocs/core/tpl/objectline_view.tpl.php @@ -135,7 +135,13 @@ else echo $form->textwithtooltip($text, dol_htmlentitiesbr($line->description), 3, '', '', $i, 0, (!empty($line->fk_parent_line) ?img_picto('', 'rightarrow') : '')); } else { if (!empty($line->fk_parent_line)) echo img_picto('', 'rightarrow'); - echo $text.' '.dol_htmlentitiesbr($line->description); + if (preg_match('/^\(DEPOSIT\)/', $line->description)) { + $newdesc = preg_replace('/^\(DEPOSIT\)/', $langs->trans("Deposit"), $line->description); + echo $text.' '.dol_htmlentitiesbr($newdesc); + } + else { + echo $text.' '.dol_htmlentitiesbr($line->description); + } } } diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index 9872874a1d0..d7a258b517e 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -1845,7 +1845,7 @@ if ($action == 'create') if (($origin == 'propal') || ($origin == 'commande')) { print ''; - $arraylist = array('amount' => 'FixAmount','variable' => 'VarAmount'); + $arraylist = array('amount' => $langs->transnoentitiesnoconv('FixAmount', $langs->transnoentitiesnoconv('Deposit')), 'variable' => $langs->transnoentitiesnoconv('VarAmountOneLine', $langs->transnoentitiesnoconv('Deposit'))); print $form->selectarray('typedeposit', $arraylist, GETPOST('typedeposit'), 0, 0, 0, '', 1); print ''; print '' . $langs->trans('Value') . ':'; diff --git a/htdocs/langs/en_US/bills.lang b/htdocs/langs/en_US/bills.lang index e6ea4390fd8..83ebdece24b 100644 --- a/htdocs/langs/en_US/bills.lang +++ b/htdocs/langs/en_US/bills.lang @@ -416,7 +416,7 @@ PaymentConditionShort14D=14 days PaymentCondition14D=14 days PaymentConditionShort14DENDMONTH=14 days of month-end PaymentCondition14DENDMONTH=Within 14 days following the end of the month -FixAmount=Fixed amount +FixAmount=Fixed amount - 1 line with label '%s' VarAmount=Variable amount (%% tot.) VarAmountOneLine=Variable amount (%% tot.) - 1 line with label '%s' # PaymentType From 5cf26ad9db7090e3a8788132d8cfd21de80b62b2 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Thu, 16 Jan 2020 04:31:35 +0100 Subject: [PATCH 014/230] Fix Belgian legal form --- htdocs/install/mysql/data/llx_c_forme_juridique.sql | 2 +- htdocs/install/mysql/migration/11.0.0-12.0.0.sql | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/install/mysql/data/llx_c_forme_juridique.sql b/htdocs/install/mysql/data/llx_c_forme_juridique.sql index d57c9a7081d..628d42d4144 100644 --- a/htdocs/install/mysql/data/llx_c_forme_juridique.sql +++ b/htdocs/install/mysql/data/llx_c_forme_juridique.sql @@ -127,7 +127,7 @@ insert into llx_c_forme_juridique (fk_pays, code, libelle) values (1,'99','Perso -- Belgium insert into llx_c_forme_juridique (fk_pays, code, libelle) values (2, '200', 'Indépendant'); -insert into llx_c_forme_juridique (fk_pays, code, libelle) values (2, '201', 'SPRL - Société à responsabilité limitée'); +insert into llx_c_forme_juridique (fk_pays, code, libelle) values (2, '201', 'SRL - Société à responsabilité limitée'); insert into llx_c_forme_juridique (fk_pays, code, libelle) values (2, '202', 'SA - Société Anonyme'); insert into llx_c_forme_juridique (fk_pays, code, libelle) values (2, '203', 'SCRL - Société coopérative à responsabilité limitée'); insert into llx_c_forme_juridique (fk_pays, code, libelle) values (2, '204', 'ASBL - Association sans but Lucratif'); 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 2d9518a69f2..00dd43ff694 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 @@ -123,3 +123,5 @@ ALTER TABLE llx_accounting_account ADD COLUMN labelshort varchar(255) DEFAULT NU ALTER TABLE llx_subscription ADD COLUMN fk_user_creat integer DEFAULT NULL; ALTER TABLE llx_subscription ADD COLUMN fk_user_valid integer DEFAULT NULL; + +UPDATE llx_c_forme_juridique set libelle = 'SRL - Société à responsabilité limitée' WHERE code = '201'; From 3c1d78948233825885ae25e23917de487d1a8f35 Mon Sep 17 00:00:00 2001 From: andreubisquerra Date: Thu, 16 Jan 2020 08:25:36 +0100 Subject: [PATCH 015/230] Visible receipt printer settings without stock module in TakePOS --- htdocs/takepos/admin/terminal.php | 53 ++++++++++++++++--------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/htdocs/takepos/admin/terminal.php b/htdocs/takepos/admin/terminal.php index d2769d77afb..b30cb4e7032 100644 --- a/htdocs/takepos/admin/terminal.php +++ b/htdocs/takepos/admin/terminal.php @@ -207,33 +207,34 @@ if (!empty($conf->stock->enabled)) print ''.$langs->trans("StockDecreaseForPointOfSaleDisabled").''; } print ''; - if ($conf->receiptprinter->enabled) { - // Select printer to use with terminal - require_once DOL_DOCUMENT_ROOT.'/core/class/dolreceiptprinter.class.php'; - $printer = new dolReceiptPrinter($db); - $printer->listprinters(); - $printers = array(); - foreach ($printer->listprinters as $key => $value) { - $printers[$value['rowid']] = $value['name']; - } - print ''.$langs->trans("TakeposTerminalPrinterToUse").''; - print ''; - print $form->selectarray('TAKEPOS_PRINTER_TO_USE'.$terminal, $printers, (empty($conf->global->{'TAKEPOS_PRINTER_TO_USE'.$terminal}) ? '0' : $conf->global->{'TAKEPOS_PRINTER_TO_USE'.$terminal}), 1); - print ''; - $printer->listPrintersTemplates(); - $templates = array(); - foreach ($printer->listprinterstemplates as $key => $value) { - $templates[$value['rowid']] = $value['name']; - } - print ''.$langs->trans("TakeposTerminalTemplateToUseForInvoicesTicket").''; - print ''; - print $form->selectarray('TAKEPOS_TEMPLATE_TO_USE_FOR_INVOICES'.$terminal, $templates, (empty($conf->global->{'TAKEPOS_TEMPLATE_TO_USE_FOR_INVOICES'.$terminal}) ? '0' : $conf->global->{'TAKEPOS_TEMPLATE_TO_USE_FOR_INVOICES'.$terminal}), 1); - print ''; - print ''.$langs->trans("TakeposTerminalTemplateToUseForOrdersTicket").''; - print ''; - print $form->selectarray('TAKEPOS_TEMPLATE_TO_USE_FOR_ORDERS'.$terminal, $templates, (empty($conf->global->{'TAKEPOS_TEMPLATE_TO_USE_FOR_ORDERS'.$terminal}) ? '0' : $conf->global->{'TAKEPOS_TEMPLATE_TO_USE_FOR_ORDERS'.$terminal}), 1); - print ''; +} + +if ($conf->receiptprinter->enabled) { + // Select printer to use with terminal + require_once DOL_DOCUMENT_ROOT.'/core/class/dolreceiptprinter.class.php'; + $printer = new dolReceiptPrinter($db); + $printer->listprinters(); + $printers = array(); + foreach ($printer->listprinters as $key => $value) { + $printers[$value['rowid']] = $value['name']; } + print ''.$langs->trans("TakeposTerminalPrinterToUse").''; + print ''; + print $form->selectarray('TAKEPOS_PRINTER_TO_USE'.$terminal, $printers, (empty($conf->global->{'TAKEPOS_PRINTER_TO_USE'.$terminal}) ? '0' : $conf->global->{'TAKEPOS_PRINTER_TO_USE'.$terminal}), 1); + print ''; + $printer->listPrintersTemplates(); + $templates = array(); + foreach ($printer->listprinterstemplates as $key => $value) { + $templates[$value['rowid']] = $value['name']; + } + print ''.$langs->trans("TakeposTerminalTemplateToUseForInvoicesTicket").''; + print ''; + print $form->selectarray('TAKEPOS_TEMPLATE_TO_USE_FOR_INVOICES'.$terminal, $templates, (empty($conf->global->{'TAKEPOS_TEMPLATE_TO_USE_FOR_INVOICES'.$terminal}) ? '0' : $conf->global->{'TAKEPOS_TEMPLATE_TO_USE_FOR_INVOICES'.$terminal}), 1); + print ''; + print ''.$langs->trans("TakeposTerminalTemplateToUseForOrdersTicket").''; + print ''; + print $form->selectarray('TAKEPOS_TEMPLATE_TO_USE_FOR_ORDERS'.$terminal, $templates, (empty($conf->global->{'TAKEPOS_TEMPLATE_TO_USE_FOR_ORDERS'.$terminal}) ? '0' : $conf->global->{'TAKEPOS_TEMPLATE_TO_USE_FOR_ORDERS'.$terminal}), 1); + print ''; } print ''; From 3cdb84b192bd5ea8c4f6c66eabc2f19215dee08e Mon Sep 17 00:00:00 2001 From: atm-ph Date: Thu, 16 Jan 2020 09:50:57 +0100 Subject: [PATCH 016/230] Fix note started with balise --- htdocs/core/lib/functions.lib.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 3f7d9b8af09..63759ba71ed 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -5756,9 +5756,9 @@ function dol_textishtml($msg, $option = 0) elseif (preg_match('//i', $msg)) return true; elseif (preg_match('//i', $msg)) return true; - elseif (preg_match('/<(br|div|font|li|p|span|strong|table)>/i', $msg)) return true; - elseif (preg_match('/<(br|div|font|li|p|span|strong|table)\s+[^<>\/]*>/i', $msg)) return true; - elseif (preg_match('/<(br|div|font|li|p|span|strong|table)\s+[^<>\/]*\/>/i', $msg)) return true; + elseif (preg_match('/<(br|div|font|li|p|span|strong|table|s)>/i', $msg)) return true; + elseif (preg_match('/<(br|div|font|li|p|span|strong|table|s)\s+[^<>\/]*>/i', $msg)) return true; + elseif (preg_match('/<(br|div|font|li|p|span|strong|table|s)\s+[^<>\/]*\/>/i', $msg)) return true; elseif (preg_match('/]*src[^<>]*>/i', $msg)) return true; // must accept elseif (preg_match('/]*href[^<>]*>/i', $msg)) return true; // must accept elseif (preg_match('//i', $msg)) return true; From 849c78f4cd6a347687ce813dd43c5b52dc10ca05 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 16 Jan 2020 10:12:39 +0100 Subject: [PATCH 017/230] Doc --- htdocs/compta/facture/card.php | 36 ++++++++++++++++--------------- htdocs/core/lib/functions.lib.php | 3 ++- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index 3057d5ebe11..ffed0ec77b0 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -2134,7 +2134,7 @@ if (empty($reshook)) if (!GETPOST('qty')) $special_code = 3; $line = new FactureLigne($db); - $line->fetch(GETPOST('lineid')); + $line->fetch(GETPOST('lineid', 'int')); $percent = $line->get_prev_progress($object->id); if ($object->type == Facture::TYPE_CREDIT_NOTE && $object->situation_cycle_ref > 0) @@ -2294,17 +2294,17 @@ if (empty($reshook)) } } - elseif ($action == 'updatealllines' && $usercancreate && $_POST['all_percent'] == $langs->trans('Modifier')) + elseif ($action == 'updatealllines' && $usercancreate && $_POST['all_percent'] == $langs->trans('Modifier')) // Update all lines of situation invoice { if (!$object->fetch($id) > 0) dol_print_error($db); - if (!is_null(GETPOST('all_progress')) && GETPOST('all_progress') != "") + if (GETPOST('all_progress') != "") { $all_progress = GETPOST('all_progress', 'int'); foreach ($object->lines as $line) { $percent = $line->get_prev_progress($object->id); if (floatval($all_progress) < floatval($percent)) { - $mesg = $langs->trans("Line").' '.$i.' '.$line->ref.' : '.$langs->trans("CantBeLessThanMinPercent"); + $mesg = $langs->trans("Line").' '.$i.' : '.$langs->trans("CantBeLessThanMinPercent"); setEventMessages($mesg, null, 'warnings'); $result = -1; } else @@ -2314,7 +2314,7 @@ if (empty($reshook)) } elseif ($action == 'updateline' && $usercancreate && $_POST['cancel'] == $langs->trans('Cancel')) { - header('Location: '.$_SERVER["PHP_SELF"].'?facid='.$id); // Pour reaffichage de la fiche en cours d'edition + header('Location: '.$_SERVER["PHP_SELF"].'?facid='.$id); // To show again edited page exit(); } @@ -3003,14 +3003,16 @@ if ($action == 'create') exit(); } $options = ""; - foreach ($facids as $facparam) - { - $options .= ''; + if (is_array($facids)) { + foreach ($facids as $facparam) + { + $options .= ''; + } } print ''; @@ -4251,7 +4253,7 @@ elseif ($id > 0 || !empty($ref)) } else { - print $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?facid='.$object->id, $object->retained_warranty_fk_cond_reglement, 'none'); + $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?facid='.$object->id, $object->retained_warranty_fk_cond_reglement, 'none'); if (!$displayWarranty) { print img_picto($langs->trans('RetainedWarrantyNeed100Percent'), 'warning.png', 'class="pictowarning valignmiddle" '); } @@ -4568,7 +4570,7 @@ elseif ($id > 0 || !empty($ref)) print ''; // Payments already done (from payment on this invoice) - $sql = 'SELECT p.datep as dp, p.ref, p.num_paiement, p.rowid, p.fk_bank,'; + $sql = 'SELECT p.datep as dp, p.ref, p.num_paiement as num_payment, p.rowid, p.fk_bank,'; $sql .= ' c.code as payment_code, c.libelle as payment_label,'; $sql .= ' pf.amount,'; $sql .= ' ba.rowid as baid, ba.ref as baref, ba.label, ba.number as banumber, ba.account_number, ba.fk_accountancy_journal'; @@ -4594,7 +4596,7 @@ elseif ($id > 0 || !empty($ref)) $paymentstatic->id = $objp->rowid; $paymentstatic->datepaye = $db->jdate($objp->dp); $paymentstatic->ref = $objp->ref; - $paymentstatic->num_paiement = $objp->num_paiement; + $paymentstatic->num_payment = $objp->num_payment; $paymentstatic->payment_code = $objp->payment_code; print ''; @@ -4602,7 +4604,7 @@ elseif ($id > 0 || !empty($ref)) print ''; print ''.dol_print_date($db->jdate($objp->dp), 'dayhour').''; $label = ($langs->trans("PaymentType".$objp->payment_code) != ("PaymentType".$objp->payment_code)) ? $langs->trans("PaymentType".$objp->payment_code) : $objp->payment_label; - print ''.$label.' '.$objp->num_paiement.''; + print ''.$label.' '.$objp->num_payment.''; if (!empty($conf->banque->enabled)) { $bankaccountstatic->id = $objp->baid; diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 228a0583ac4..112e09daad3 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -4515,7 +4515,8 @@ function price($amount, $form = 0, $outlangs = '', $trunc = 1, $rounding = -1, $ /** * Function that return a number with universal decimal format (decimal separator is '.') from an amount typed by a user. - * Function to use on each input amount before any numeric test or database insert + * Function to use on each input amount before any numeric test or database insert. A better name for this function + * should be text2num(). * * @param float $amount Amount to convert/clean * @param string $rounding ''=No rounding From bbd7900fc7885013c7e17607c4b5e1144dc50e12 Mon Sep 17 00:00:00 2001 From: Tobias Sekan Date: Thu, 16 Jan 2020 10:34:45 +0100 Subject: [PATCH 018/230] Show holidays in agenda --- htdocs/comm/action/index.php | 106 ++++++++++++++++++++++++++++++++++- 1 file changed, 105 insertions(+), 1 deletion(-) diff --git a/htdocs/comm/action/index.php b/htdocs/comm/action/index.php index c4750ef54db..a84ea741721 100644 --- a/htdocs/comm/action/index.php +++ b/htdocs/comm/action/index.php @@ -757,6 +757,95 @@ if ($showbirthday) } } +if($conf->global->AGENDA_SHOW_HOLIDAYS) +{ + $sql = "SELECT u.rowid as uid, u.lastname, u.firstname, u.statut, x.rowid, x.date_debut as date_start, x.date_fin as date_end, x.halfday, x.statut as status"; + $sql.= " FROM ".MAIN_DB_PREFIX."holiday as x, ".MAIN_DB_PREFIX."user as u"; + $sql.= " WHERE u.rowid = x.fk_user"; + $sql.= " AND u.statut = '1'"; // Show only active users (0 = inactive user, 1 = active user) + $sql.= " AND (x.statut = '2' OR x.statut = '3')"; // Show only public leaves (2 = leave wait for approval, 3 = leave approved) + + if($action == 'show_day') + { + // Request only leaves for the current selected day + $sql.= " AND '".$year."-".$month."-".$day."' BETWEEN x.date_debut AND x.date_fin"; + } + elseif($action == 'show_week') + { + // TODO: Add filter to reduce database request + } + elseif($action == 'show_month') + { + // TODO: Add filter to reduce database request + } + + $resql=$db->query($sql); + if ($resql) + { + $num = $db->num_rows($resql); + $i = 0; + + while ($i < $num) + { + $obj = $db->fetch_object($resql); + + $dateStartArray = dol_getdate(dol_stringtotime($obj->date_start, 1), true); + $dateEndArray = dol_getdate(dol_stringtotime($obj->date_end, 1), true); + + $event = new ActionComm($db); + + // Need the id of the leave object for link to it + $event->id = $obj->rowid; + + $event->type_code = 'HOLIDAY'; + $event->datep = dol_mktime(0, 0, 0, $dateStartArray['mon'], $dateStartArray['mday'], $dateStartArray['year'], true); + $event->datef = dol_mktime(0, 0, 0, $dateEndArray['mon'], $dateEndArray['mday'], $dateEndArray['year'], true); + $event->date_start_in_calendar = $event->datep; + $event->date_end_in_calendar = $event->datef; + + if($obj->status == 3) + { + // Show no symbol for leave with state "leave approved" + $event->percentage = -1; + } + elseif($obj->status == 2) + { + // Show TO-DO symbol for leave with state "leave wait for approval" + $event->percentage = 0; + } + + if($obj->halfday == 1) + { + $event->label = $obj->lastname.' ('.$langs->trans("Morning").')'; + } + elseif($obj->halfday == -1) + { + $event->label = $obj->lastname.' ('.$langs->trans("Afternoon").')'; + } + else + { + $event->label = $obj->lastname; + } + + $annee = date('Y', $event->date_start_in_calendar); + $mois = date('m', $event->date_start_in_calendar); + $jour = date('d', $event->date_start_in_calendar); + $daykey = dol_mktime(0, 0, 0, $mois, $jour, $annee); + + do + { + $eventarray[$daykey][] = $event; + + $daykey += 60*60*24; + } + + while ($daykey <= $event->date_end_in_calendar); + + $i++; + } + } +} + // Complete $eventarray with external import Ical if (count($listofextcals)) { @@ -1512,7 +1601,11 @@ function show_day_events($db, $day, $month, $year, $monthshown, $style, &$eventa { print $event->getNomUrl(1, $maxnbofchar, 'cal_event', 'birthday', 'contact'); } - if ($event->type_code != 'BIRTHDAY') + elseif ($event->type_code == 'HOLIDAY') + { + print $event->getNomUrl(1, $maxnbofchar, 'cal_event', 'holiday', 'user'); + } + elseif ($event->type_code != 'BIRTHDAY' && $event->type_code != 'HOLIDAY') { // Picto if (empty($event->fulldayevent)) @@ -1740,6 +1833,17 @@ function dol_color_minus($color, $minus, $minusunit = 16) */ function sort_events_by_date($a, $b) { + // Sort holidays at first + if($a->type_code === 'HOLIDAY') + { + return -1; + } + + if($b->type_code === 'HOLIDAY') + { + return 1; + } + // datep => Event start time // datef => Event end time From 72e227a543e290ddd2acb72b0286a16f03378cda Mon Sep 17 00:00:00 2001 From: Tobias Sekan Date: Thu, 16 Jan 2020 10:37:16 +0100 Subject: [PATCH 019/230] Add link to leave request for holidays in agenda --- htdocs/comm/action/class/actioncomm.class.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index 454a78979b0..2d0219ca4e1 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -1378,13 +1378,13 @@ class ActionComm extends CommonObject * Return URL of event * Use $this->id, $this->type_code, $this->label and $this->type_label * - * @param int $withpicto 0=No picto, 1=Include picto into link, 2=Only picto + * @param int $withpicto 0 = No picto, 1 = Include picto into link, 2 = Only picto * @param int $maxlength Max number of charaters into label. If negative, use the ref as label. * @param string $classname Force style class on a link - * @param string $option ''=Link to action, 'birthday'=Link to contact - * @param int $overwritepicto 1=Overwrite picto - * @param int $notooltip 1=Disable tooltip - * @param int $save_lastsearch_value -1=Auto, 0=No save of lastsearch_values when clicking, 1=Save lastsearch_values whenclicking + * @param string $option '' = Link to action, 'birthday'= Link to contact, 'holiday' = Link to leave + * @param int $overwritepicto 1 = Overwrite picto + * @param int $notooltip 1 = Disable tooltip + * @param int $save_lastsearch_value -1 = Auto, 0 = No save of lastsearch_values when clicking, 1 = Save lastsearch_values whenclicking * @return string Chaine avec URL */ public function getNomUrl($withpicto = 0, $maxlength = 0, $classname = '', $option = '', $overwritepicto = 0, $notooltip = 0, $save_lastsearch_value = -1) @@ -1451,6 +1451,8 @@ class ActionComm extends CommonObject $url = ''; if ($option == 'birthday') $url = DOL_URL_ROOT.'/contact/perso.php?id='.$this->id; + elseif ($option == 'holiday') + $url = DOL_URL_ROOT.'/holiday/card.php?id='.$this->id; else $url = DOL_URL_ROOT.'/comm/action/card.php?id='.$this->id; if ($option !== 'nolink') From b79c6fc84886f35eee49b0bf8c532a5d9ce07831 Mon Sep 17 00:00:00 2001 From: Tobias Sekan Date: Thu, 16 Jan 2020 10:38:20 +0100 Subject: [PATCH 020/230] Update German language --- htdocs/langs/de_DE/holiday.lang | 2 ++ 1 file changed, 2 insertions(+) diff --git a/htdocs/langs/de_DE/holiday.lang b/htdocs/langs/de_DE/holiday.lang index 2143adfd5b3..23adf217284 100644 --- a/htdocs/langs/de_DE/holiday.lang +++ b/htdocs/langs/de_DE/holiday.lang @@ -129,3 +129,5 @@ FreeLegalTextOnHolidays=Freitext als PDF WatermarkOnDraftHolidayCards=Wasserzeichen auf Urlaubsantragsentwurf (leerlassen wenn keines benötigt wird) HolidaysToApprove=Urlaubstage zu genehmigen NobodyHasPermissionToValidateHolidays=Niemand hat die Erlaubnis, Feiertage zu bestätigen. +Morning=Vormittags +Afternoon=Nachmittags From eca59220d8dd2b260e93244c459f7cc3df02903b Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Thu, 16 Jan 2020 09:44:49 +0000 Subject: [PATCH 021/230] Fixing style errors. --- htdocs/comm/action/index.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/comm/action/index.php b/htdocs/comm/action/index.php index a84ea741721..7e4b800dbdd 100644 --- a/htdocs/comm/action/index.php +++ b/htdocs/comm/action/index.php @@ -764,7 +764,7 @@ if($conf->global->AGENDA_SHOW_HOLIDAYS) $sql.= " WHERE u.rowid = x.fk_user"; $sql.= " AND u.statut = '1'"; // Show only active users (0 = inactive user, 1 = active user) $sql.= " AND (x.statut = '2' OR x.statut = '3')"; // Show only public leaves (2 = leave wait for approval, 3 = leave approved) - + if($action == 'show_day') { // Request only leaves for the current selected day @@ -810,7 +810,7 @@ if($conf->global->AGENDA_SHOW_HOLIDAYS) } elseif($obj->status == 2) { - // Show TO-DO symbol for leave with state "leave wait for approval" + // Show TO-DO symbol for leave with state "leave wait for approval" $event->percentage = 0; } @@ -1843,7 +1843,7 @@ function sort_events_by_date($a, $b) { return 1; } - + // datep => Event start time // datef => Event end time From d7423c23de19ab13461022a6c1f730859778a2e4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 16 Jan 2020 12:34:53 +0100 Subject: [PATCH 022/230] Doc --- htdocs/core/class/conf.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/conf.class.php b/htdocs/core/class/conf.class.php index 7d344717514..4136cef1be5 100644 --- a/htdocs/core/class/conf.class.php +++ b/htdocs/core/class/conf.class.php @@ -309,7 +309,7 @@ class Conf { if (!empty($this->$module->enabled)) { - foreach ($dirs as $type => $name) + foreach ($dirs as $type => $name) // $type is 'output' or 'temp' { $subdir = ($type == 'temp' ? '/temp' : ''); // For multicompany sharings From 651bf8c1fce2363b77d1e6eba3576d23758b09fb Mon Sep 17 00:00:00 2001 From: Tobias Sekan Date: Thu, 16 Jan 2020 13:49:05 +0100 Subject: [PATCH 023/230] Export ical with holidays --- htdocs/comm/action/class/actioncomm.class.php | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index 454a78979b0..1c46b43d39c 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -1783,6 +1783,91 @@ class ActionComm extends CommonObject return -1; } + if($conf->global->AGENDA_SHOW_HOLIDAYS) + { + $langs->load("holidays"); + $title = $langs->trans("Holidays"); + + $sql = "SELECT u.rowid as uid, u.lastname, u.firstname, u.email, u.statut, x.rowid, x.date_debut as date_start, x.date_fin as date_end, x.halfday, x.statut as status"; + $sql.= " FROM ".MAIN_DB_PREFIX."holiday as x, ".MAIN_DB_PREFIX."user as u"; + $sql.= " WHERE u.rowid = x.fk_user"; + $sql.= " AND u.statut = '1'"; // Show only active users (0 = inactive user, 1 = active user) + $sql.= " AND (x.statut = '2' OR x.statut = '3')"; // Show only public leaves (2 = leave wait for approval, 3 = leave approved) + + $resql=$this->db->query($sql); + if ($resql) + { + $num = $this->db->num_rows($resql); + $i = 0; + + while ($i < $num) + { + $obj = $this->db->fetch_object($resql); + $event = array(); + + if($obj->halfday == -1) + { + $event['fulldayevent'] = false; + + $timestampStart = dol_stringtotime($obj->date_start." 00:00:00", 0); + $timestampEnd = dol_stringtotime($obj->date_end." 12:00:00", 0); + } + elseif($obj->halfday == 1) + { + $event['fulldayevent'] = false; + + $timestampStart = dol_stringtotime($obj->date_start." 12:00:00", 0); + $timestampEnd = dol_stringtotime($obj->date_end." 23:59:59", 0); + } + else + { + $event['fulldayevent'] = true; + + $timestampStart = dol_stringtotime($obj->date_start." 00:00:00", 0); + $timestampEnd = dol_stringtotime($obj->date_end." 23:59:59", 0); + } + + if(!empty($conf->global->AGENDA_EXPORT_FIX_TZ)) + { + $timestampStart =- ($conf->global->AGENDA_EXPORT_FIX_TZ * 3600); + $timestampEnd =- ($conf->global->AGENDA_EXPORT_FIX_TZ * 3600); + } + + $urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root)); + $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; + $url = $urlwithroot.'/holiday/card.php?id='.$obj->rowid; + + $event['uid'] = 'dolibarrholiday-'.$this->db->database_name.'-'.$obj->rowid."@".$_SERVER["SERVER_NAME"]; + $event['author'] = dolGetFirstLastname($obj->firstname, $obj->lastname); + $event['type'] = 'event'; + $event['category'] = "Holiday"; + $event['transparency'] = 'OPAQUE'; + $event['email'] = $obj->email; + $event['created'] = $timestampStart; + $event['modified'] = $timestampStart; + $event['startdate'] = $timestampStart; + $event['enddate'] = $timestampEnd; + $event['duration'] = $timestampEnd - $timestampStart; + $event['url'] = $url; + + if($obj->status == 2) + { + // 2 = leave wait for approval + $event['summary'] = $title." - ".$obj->lastname." (wait for approval)"; + } + else + { + // 3 = leave approved + $event['summary'] = $title." - ".$obj->lastname; + } + + $eventarray[] = $event; + + $i++; + } + } + } + $langs->load("agenda"); // Define title and desc From b47e2e81278a5d9eecd33f62e305762912c2e0e9 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Thu, 16 Jan 2020 12:55:08 +0000 Subject: [PATCH 024/230] Fixing style errors. --- htdocs/comm/action/class/actioncomm.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index 1c46b43d39c..04897326762 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -1799,7 +1799,7 @@ class ActionComm extends CommonObject { $num = $this->db->num_rows($resql); $i = 0; - + while ($i < $num) { $obj = $this->db->fetch_object($resql); From 5fb15ff0f88e7b45ad586d5f6d489c2a0851a08f Mon Sep 17 00:00:00 2001 From: AdrianDominik Date: Thu, 16 Jan 2020 14:01:41 +0100 Subject: [PATCH 025/230] FIX: add traslate from remains holidays --- htdocs/holiday/card.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/holiday/card.php b/htdocs/holiday/card.php index 26a210f40e0..9cc287cd28a 100644 --- a/htdocs/holiday/card.php +++ b/htdocs/holiday/card.php @@ -991,7 +991,9 @@ if ((empty($id) && empty($ref)) || $action == 'add' || $action == 'request' || $ { $nb_type = $object->getCPforUser($user->id, $val['rowid']); $nb_holiday += $nb_type; - $out .= ' - '.$val['label'].': '.($nb_type ?price2num($nb_type) : 0).'
'; + + $out .= ' - ' . ($langs->trans($val['code']) != $val['code'] ? $langs->trans($val['code']) : $val['label']) .': '.($nb_type ?price2num($nb_type) : 0).'
'; + //$out .= ' - '.$val['label'].': '.($nb_type ?price2num($nb_type) : 0).'
'; } print $langs->trans('SoldeCPUser', round($nb_holiday, 5)).'
'; print $out; From 6318f21a8fc457d9c790b9fed0422985ca27870d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 16 Jan 2020 15:07:18 +0100 Subject: [PATCH 026/230] Trans --- htdocs/langs/en_US/admin.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 011bb0b613d..020e61f721a 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1766,6 +1766,7 @@ GoOntoUserCardToAddMore=Go to the tab "Notifications" of a user to add or remove GoOntoContactCardToAddMore=Go to the tab "Notifications" of a third party to add or remove notifications for contacts/addresses Threshold=Threshold BackupDumpWizard=Wizard to build the backup file +BackupZipWizard=Wizard to archive the documents SomethingMakeInstallFromWebNotPossible=Installation of external module is not possible from the web interface for the following reason: SomethingMakeInstallFromWebNotPossible2=For this reason, process to upgrade described here is a manual process only a privileged user may perform. InstallModuleFromWebHasBeenDisabledByFile=Install of external module from application has been disabled by your administrator. You must ask him to remove the file %s to allow this feature. From e38ed8dc521204dc288e8d469374fbc140aa0461 Mon Sep 17 00:00:00 2001 From: Anthony Berton <34568357+bb2a@users.noreply.github.com> Date: Thu, 16 Jan 2020 15:14:51 +0100 Subject: [PATCH 027/230] Update functions.lib.php --- htdocs/core/lib/functions.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 6c5a049597e..e847f02ec3f 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -6039,7 +6039,7 @@ function getCommonSubstitutionArray($outputlangs, $onlykey = 0, $exclude = null, $substitutionarray['__REFCLIENT__'] = (isset($object->ref_client) ? $object->ref_client : (isset($object->ref_customer) ? $object->ref_customer : null)); $substitutionarray['__REFSUPPLIER__'] = (isset($object->ref_supplier) ? $object->ref_supplier : null); $substitutionarray['__SUPPLIER_ORDER_DATE_DELIVERY__'] = (isset($object->date_livraison) ? dol_print_date($object->date_livraison, 'day', 0, $outputlangs) : ''); - $substitutionarray['__SUPPLIER_ORDER_DELAY_DELIVERY__'] = (isset($object->availability_code) ? $outputlangs->transnoentities("AvailabilityType".$object->availability_code) : ''); + $substitutionarray['__SUPPLIER_ORDER_DELAY_DELIVERY__'] = (isset($object->availability_code) ? $outputlangs->transnoentities($object->availability) : ''); $birthday = dol_print_date($object->birth, 'day'); From 9a6bcaa6830cac0317cb5de12fb9257a265844da Mon Sep 17 00:00:00 2001 From: Anthony Berton <34568357+bb2a@users.noreply.github.com> Date: Thu, 16 Jan 2020 15:20:09 +0100 Subject: [PATCH 028/230] Update functions.lib.php --- htdocs/core/lib/functions.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 112e09daad3..e39cf073ae1 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -6040,7 +6040,7 @@ function getCommonSubstitutionArray($outputlangs, $onlykey = 0, $exclude = null, $substitutionarray['__REFCLIENT__'] = (isset($object->ref_client) ? $object->ref_client : (isset($object->ref_customer) ? $object->ref_customer : null)); $substitutionarray['__REFSUPPLIER__'] = (isset($object->ref_supplier) ? $object->ref_supplier : null); $substitutionarray['__SUPPLIER_ORDER_DATE_DELIVERY__'] = (isset($object->date_livraison) ? dol_print_date($object->date_livraison, 'day', 0, $outputlangs) : ''); - $substitutionarray['__SUPPLIER_ORDER_DELAY_DELIVERY__'] = (isset($object->availability_code) ? $outputlangs->transnoentities("AvailabilityType".$object->availability_code) : ''); + $substitutionarray['__SUPPLIER_ORDER_DELAY_DELIVERY__'] = (isset($object->availability_code) ? $outputlangs->transnoentities($object->availability_code) : ''); $birthday = dol_print_date($object->birth, 'day'); From 9a6ee89d439cf67014fd520a89cc09d8ef1b6a5a Mon Sep 17 00:00:00 2001 From: Anthony Berton <34568357+bb2a@users.noreply.github.com> Date: Thu, 16 Jan 2020 15:44:07 +0100 Subject: [PATCH 029/230] Update functions.lib.php --- htdocs/core/lib/functions.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index e39cf073ae1..4e82d61c148 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -6040,7 +6040,7 @@ function getCommonSubstitutionArray($outputlangs, $onlykey = 0, $exclude = null, $substitutionarray['__REFCLIENT__'] = (isset($object->ref_client) ? $object->ref_client : (isset($object->ref_customer) ? $object->ref_customer : null)); $substitutionarray['__REFSUPPLIER__'] = (isset($object->ref_supplier) ? $object->ref_supplier : null); $substitutionarray['__SUPPLIER_ORDER_DATE_DELIVERY__'] = (isset($object->date_livraison) ? dol_print_date($object->date_livraison, 'day', 0, $outputlangs) : ''); - $substitutionarray['__SUPPLIER_ORDER_DELAY_DELIVERY__'] = (isset($object->availability_code) ? $outputlangs->transnoentities($object->availability_code) : ''); + $substitutionarray['__SUPPLIER_ORDER_DELAY_DELIVERY__'] = $outputlangs->transnoentities("AvailabilityType".$object->availability_code)!=('AvailabilityType'.$object->availability_code)?$outputlangs->transnoentities("AvailabilityType".$object->availability_code):$outputlangs->convToOutputCharset(isset($object->availability)?$object->availability:''); $birthday = dol_print_date($object->birth, 'day'); From c8a880a53ae1eec0b677247d158391f5db383f4d Mon Sep 17 00:00:00 2001 From: Anthony Berton <34568357+bb2a@users.noreply.github.com> Date: Thu, 16 Jan 2020 15:45:14 +0100 Subject: [PATCH 030/230] Update functions.lib.php --- htdocs/core/lib/functions.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index e847f02ec3f..b06a4875a17 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -6039,7 +6039,7 @@ function getCommonSubstitutionArray($outputlangs, $onlykey = 0, $exclude = null, $substitutionarray['__REFCLIENT__'] = (isset($object->ref_client) ? $object->ref_client : (isset($object->ref_customer) ? $object->ref_customer : null)); $substitutionarray['__REFSUPPLIER__'] = (isset($object->ref_supplier) ? $object->ref_supplier : null); $substitutionarray['__SUPPLIER_ORDER_DATE_DELIVERY__'] = (isset($object->date_livraison) ? dol_print_date($object->date_livraison, 'day', 0, $outputlangs) : ''); - $substitutionarray['__SUPPLIER_ORDER_DELAY_DELIVERY__'] = (isset($object->availability_code) ? $outputlangs->transnoentities($object->availability) : ''); + $substitutionarray['__SUPPLIER_ORDER_DELAY_DELIVERY__'] = $outputlangs->transnoentities("AvailabilityType".$object->availability_code)!=('AvailabilityType'.$object->availability_code)?$outputlangs->transnoentities("AvailabilityType".$object->availability_code):$outputlangs->convToOutputCharset(isset($object->availability)?$object->availability:''); $birthday = dol_print_date($object->birth, 'day'); From 76e7c147b3cab8db555006df3f9e531f0e051de8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 16 Jan 2020 18:03:57 +0100 Subject: [PATCH 031/230] Look and feel v11 --- htdocs/compta/paiement.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/paiement.php b/htdocs/compta/paiement.php index 67da7f0d766..5b297eed309 100644 --- a/htdocs/compta/paiement.php +++ b/htdocs/compta/paiement.php @@ -637,7 +637,7 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie } - print ''; + print ''; print ''; print $invoice->getNomUrl(1, ''); @@ -715,7 +715,7 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie } // Price - print 'id == $facid) ? ' style="font-weight: bold" ' : '').'>'.price($sign * $objp->total_ttc).''; + print ''.price($sign * $objp->total_ttc).''; // Received or paid back print ''.price($sign * $paiement); From 1d058e8707ab6412c7b46173000679dccd611977 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 16 Jan 2020 18:09:29 +0100 Subject: [PATCH 032/230] Fix look and feel v11 --- htdocs/fourn/facture/paiement.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/fourn/facture/paiement.php b/htdocs/fourn/facture/paiement.php index 53ccf3d4d58..0949f179d5b 100644 --- a/htdocs/fourn/facture/paiement.php +++ b/htdocs/fourn/facture/paiement.php @@ -606,7 +606,7 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie $multicurrency_remaintopay = price2num($invoice->multicurrency_total_ttc - $multicurrency_payment - $multicurrency_creditnotes - $multicurrency_deposits, 'MT'); } - print ''; + print ''; // Ref print ''; @@ -619,7 +619,7 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie // Date if ($objp->df > 0) { - print ''; + print ''; print dol_print_date($db->jdate($objp->df), 'day').''; } else @@ -630,7 +630,7 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie // Date Max Payment if ($objp->dlr > 0) { - print ''; + print ''; print dol_print_date($db->jdate($objp->dlr), 'day'); if ($invoice->hasDelay()) @@ -973,7 +973,7 @@ if (empty($action) || $action == 'list') { $objp = $db->fetch_object($resql); - print ''; + print ''; // Ref payment print '
'.img_object($langs->trans('ShowPayment'), 'payment').' '.$objp->pid.''; From a8fd6f56ea8d8e251647aa25123aa6df6fdb74eb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 16 Jan 2020 18:12:52 +0100 Subject: [PATCH 033/230] Look and feel v11 --- htdocs/fourn/facture/paiement.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/fourn/facture/paiement.php b/htdocs/fourn/facture/paiement.php index 0949f179d5b..e9198ebcc91 100644 --- a/htdocs/fourn/facture/paiement.php +++ b/htdocs/fourn/facture/paiement.php @@ -973,7 +973,7 @@ if (empty($action) || $action == 'list') { $objp = $db->fetch_object($resql); - print ''; + print ''; // Ref payment print ''.img_object($langs->trans('ShowPayment'), 'payment').' '.$objp->pid.''; From 906110dc1d738cf061628348e787916c80ee56fc Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 17 Jan 2020 11:34:31 +0100 Subject: [PATCH 034/230] Fix backup. Recommended compression is gzip. --- htdocs/admin/tools/dolibarr_export.php | 34 +++++++++++++++++--------- htdocs/admin/tools/export_files.php | 17 +++++++++---- htdocs/core/js/lib_foot.js.php | 2 +- htdocs/langs/en_US/admin.lang | 2 +- 4 files changed, 36 insertions(+), 19 deletions(-) diff --git a/htdocs/admin/tools/dolibarr_export.php b/htdocs/admin/tools/dolibarr_export.php index 1500dd0dc4d..d5a63b95135 100644 --- a/htdocs/admin/tools/dolibarr_export.php +++ b/htdocs/admin/tools/dolibarr_export.php @@ -413,11 +413,6 @@ print '
'; // Define compressions array $compression=array(); if (in_array($type, array('mysql', 'mysqli'))) { - $compression['none'] = array( - 'function' => '', - 'id' => 'radio_compression_none', - 'label' => $langs->trans("None") - ); $compression['gz'] = array( 'function' => 'gzopen', 'id' => 'radio_compression_gzip', @@ -434,13 +429,18 @@ if (in_array($type, array('mysql', 'mysqli'))) { 'id' => 'radio_compression_bzip', 'label' => $langs->trans("Bzip2") ); + $compression['none'] = array( + 'function' => '', + 'id' => 'radio_compression_none', + 'label' => $langs->trans("None") + ); } else { $compression['none'] = array( 'function' => '', 'id' => 'radio_compression_none', - 'label' => $langs->trans("Default") + 'label' => $langs->trans("None") ); $compression['gz'] = array( 'function' => 'gzopen', @@ -455,11 +455,14 @@ print "\n"; print $langs->trans("Compression").':   '; +$i = 0; foreach($compression as $key => $val) { if (! $val['function'] || function_exists($val['function'])) { // Enabled export format - print ''; + $checked = ''; + if ($key == 'gz') $checked = ' checked'; + print ''; print ' '; } else @@ -467,9 +470,10 @@ foreach($compression as $key => $val) // Disabled export format print ''; print ' '; - print ' ('.$langs->trans("NotAvailable").')'; + print ' ('.$langs->trans("NotAvailable").')'; } print '     '; + $i++; } print '
'; @@ -542,6 +546,7 @@ print "\n"; print ''; print ''; print ''; +print ''; print '
2'; @@ -561,28 +566,33 @@ print '
'; // Show compression choices +// Example: With gz choice, you can compress in 5mn, a file of 2GB directory (after compression) with 10 Mb memory. print '
'; print "\n"; print $langs->trans("Compression").':   '; $filecompression = $compression; -array_shift($filecompression); +unset($filecompression['none']); $filecompression['zip']= array('function' => 'dol_compress_dir', 'id' => 'radio_compression_zip', 'label' => $langs->trans("FormatZip")); +$i = 0; foreach($filecompression as $key => $val) { if (! $val['function'] || function_exists($val['function'])) // Enabled export format { - print ''; + $checked = ''; + if ($key == 'gz') $checked = ' checked'; + print ''; print ' '; } else // Disabled export format { print ''; print ' '; - print ' ('.$langs->trans("NotAvailable").')'; + print ' ('.$langs->trans("NotAvailable").')'; } print '     '; + $i++; } print '
'; @@ -600,7 +610,7 @@ print '
'; $filearray=dol_dir_list($conf->admin->dir_output.'/documents', 'files', 0, '', '', $sortfield, (strtolower($sortorder)=='asc'?SORT_ASC:SORT_DESC), 1); -$result=$formfile->list_of_documents($filearray, null, 'systemtools', '', 1, 'documents/', 1, 0, $langs->trans("NoBackupFileAvailable"), 0, $langs->trans("PreviousDumpFiles")); +$result=$formfile->list_of_documents($filearray, null, 'systemtools', '', 1, 'documents/', 1, 0, $langs->trans("NoBackupFileAvailable"), 0, $langs->trans("ArchiveFiles")); print '
'; print '
'; diff --git a/htdocs/admin/tools/export_files.php b/htdocs/admin/tools/export_files.php index 04bf1fac7dd..e498492ed34 100644 --- a/htdocs/admin/tools/export_files.php +++ b/htdocs/admin/tools/export_files.php @@ -18,8 +18,8 @@ */ /** - * \file htdocs/admin/tools/export.php - * \brief Page to export a database into a dump file + * \file htdocs/admin/tools/export_files.php + * \brief Page to export documents into a compressed file */ require '../../main.inc.php'; @@ -73,7 +73,7 @@ if ($action == 'delete') */ // Increase limit of time. Works only if we are not in safe mode -$ExecTimeLimit=600; +$ExecTimeLimit=1800; // 30mn if (!empty($ExecTimeLimit)) { $err=error_reporting(); @@ -88,7 +88,7 @@ if (!empty($MemoryLimit)) @ini_set('memory_limit', $MemoryLimit); } -$form=new Form($db); +$form = new Form($db); $formfile = new FormFile($db); //$help_url='EN:Backups|FR:Sauvegardes|ES:Copias_de_seguridad'; @@ -115,7 +115,14 @@ if ($compression == 'zip') $ret = dol_compress_dir(DOL_DATA_ROOT, $outputdir."/".$file, $compression, '/(\.log|\/temp\/|documents\/admin\/documents\/)/'); if ($ret < 0) { - $errormsg = $langs->trans("ErrorFailedToWriteInDir", $outputdir); + if ($ret == -2) { + $langs->load("errors"); + $errormsg = $langs->trans("ErrNoZipEngine"); + } + else { + $langs->load("errors"); + $errormsg = $langs->trans("ErrorFailedToWriteInDir", $outputdir); + } } } elseif (in_array($compression, array('gz', 'bz'))) diff --git a/htdocs/core/js/lib_foot.js.php b/htdocs/core/js/lib_foot.js.php index a5bc992a1ca..3d708101d13 100644 --- a/htdocs/core/js/lib_foot.js.php +++ b/htdocs/core/js/lib_foot.js.php @@ -158,7 +158,7 @@ print ' } else { - console.log("We click on tag with .reposition class but element is not an html tag, so we try to update input form field page_y with value "+page_y); + console.log("We click on tag with .reposition class but element is not an html tag, so we try to update input form field with name=page_y with value "+page_y); jQuery("input[type=hidden][name=page_y]").val(page_y); } } diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 020e61f721a..c75059ef4b2 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1156,7 +1156,7 @@ NoEventOrNoAuditSetup=No security event has been logged. This is normal if Audit NoEventFoundWithCriteria=No security event has been found for this search criteria. SeeLocalSendMailSetup=See your local sendmail setup BackupDesc=A complete backup of a Dolibarr installation requires two steps. -BackupDesc2=Backup the contents of the "documents" directory (%s) containing all uploaded and generated files. This will also include all the dump files generated in Step 1. +BackupDesc2=Backup the contents of the "documents" directory (%s) containing all uploaded and generated files. This will also include all the dump files generated in Step 1. This operation may last several minutes. BackupDesc3=Backup the structure and contents of your database (%s) into a dump file. For this, you can use the following assistant. BackupDescX=The archived directory should be stored in a secure place. BackupDescY=The generated dump file should be stored in a secure place. From 2099e05f225cfa5693e1a6f05af79a6a717851e0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 17 Jan 2020 11:39:22 +0100 Subject: [PATCH 035/230] Fix translation --- htdocs/admin/tools/dolibarr_export.php | 2 +- htdocs/langs/en_US/admin.lang | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/htdocs/admin/tools/dolibarr_export.php b/htdocs/admin/tools/dolibarr_export.php index d5a63b95135..a8e94e5f8cf 100644 --- a/htdocs/admin/tools/dolibarr_export.php +++ b/htdocs/admin/tools/dolibarr_export.php @@ -610,7 +610,7 @@ print '
'; $filearray=dol_dir_list($conf->admin->dir_output.'/documents', 'files', 0, '', '', $sortfield, (strtolower($sortorder)=='asc'?SORT_ASC:SORT_DESC), 1); -$result=$formfile->list_of_documents($filearray, null, 'systemtools', '', 1, 'documents/', 1, 0, $langs->trans("NoBackupFileAvailable"), 0, $langs->trans("ArchiveFiles")); +$result=$formfile->list_of_documents($filearray, null, 'systemtools', '', 1, 'documents/', 1, 0, $langs->trans("NoBackupFileAvailable"), 0, $langs->trans("PreviousArchiveFiles")); print '
'; print '
'; diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index c75059ef4b2..9cd2d3b3f1e 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1167,6 +1167,7 @@ RestoreDesc3=Restore the database structure and data from a backup dump file int RestoreMySQL=MySQL import ForcedToByAModule= This rule is forced to %s by an activated module PreviousDumpFiles=Existing backup files +PreviousArchiveFiles=Existing archive files WeekStartOnDay=First day of the week RunningUpdateProcessMayBeRequired=Running the upgrade process seems to be required (Program version %s differs from Database version %s) YouMustRunCommandFromCommandLineAfterLoginToUser=You must run this command from command line after login to a shell with user %s or you must add -W option at end of command line to provide %s password. @@ -1765,8 +1766,8 @@ ListOfFixedNotifications=List of automatic fixed notifications GoOntoUserCardToAddMore=Go to the tab "Notifications" of a user to add or remove notifications for users GoOntoContactCardToAddMore=Go to the tab "Notifications" of a third party to add or remove notifications for contacts/addresses Threshold=Threshold -BackupDumpWizard=Wizard to build the backup file -BackupZipWizard=Wizard to archive the documents +BackupDumpWizard=Wizard to build the database dump file +BackupZipWizard=Wizard to build the archive of documents directory SomethingMakeInstallFromWebNotPossible=Installation of external module is not possible from the web interface for the following reason: SomethingMakeInstallFromWebNotPossible2=For this reason, process to upgrade described here is a manual process only a privileged user may perform. InstallModuleFromWebHasBeenDisabledByFile=Install of external module from application has been disabled by your administrator. You must ask him to remove the file %s to allow this feature. From 8ba234c928640b65766a7f07748d26f21dc207c8 Mon Sep 17 00:00:00 2001 From: dvdwalker Date: Fri, 17 Jan 2020 07:40:28 -0300 Subject: [PATCH 036/230] Update actions_mymodule.class.php --- htdocs/modulebuilder/template/class/actions_mymodule.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/modulebuilder/template/class/actions_mymodule.class.php b/htdocs/modulebuilder/template/class/actions_mymodule.class.php index 530b320b111..743c46bfc39 100644 --- a/htdocs/modulebuilder/template/class/actions_mymodule.class.php +++ b/htdocs/modulebuilder/template/class/actions_mymodule.class.php @@ -117,7 +117,7 @@ class ActionsMyModule /** - * Overloading the doActions function : replacing the parent's function with the one below + * Overloading the doMassActions function : replacing the parent's function with the one below * * @param array $parameters Hook metadatas (context, etc...) * @param CommonObject $object The object to process (an invoice if you are in invoice module, a propale in propale's module, etc...) From 26e450fb2ace3b44580ad0bccd28040e9ed5a75c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 17 Jan 2020 11:52:21 +0100 Subject: [PATCH 037/230] Fix extension of backup file --- htdocs/admin/tools/dolibarr_export.php | 2 +- htdocs/admin/tools/export_files.php | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/htdocs/admin/tools/dolibarr_export.php b/htdocs/admin/tools/dolibarr_export.php index a8e94e5f8cf..e5f6dae4852 100644 --- a/htdocs/admin/tools/dolibarr_export.php +++ b/htdocs/admin/tools/dolibarr_export.php @@ -560,7 +560,7 @@ print load_fiche_titre($title?$title:$langs->trans("BackupZipWizard")); print '
'; $prefix='documents'; $ext='zip'; -$file=$prefix.'_'.$dolibarr_main_db_name.'_'.dol_sanitizeFileName(DOL_VERSION).'_'.strftime("%Y%m%d%H%M").'.'.$ext; +$file=$prefix.'_'.$dolibarr_main_db_name.'_'.dol_sanitizeFileName(DOL_VERSION).'_'.strftime("%Y%m%d%H%M"); print '
'; print '
'; diff --git a/htdocs/admin/tools/export_files.php b/htdocs/admin/tools/export_files.php index e498492ed34..b6e593d15bf 100644 --- a/htdocs/admin/tools/export_files.php +++ b/htdocs/admin/tools/export_files.php @@ -33,10 +33,11 @@ $langs->load("admin"); $action=GETPOST('action', 'alpha'); $what=GETPOST('what', 'alpha'); $export_type=GETPOST('export_type', 'alpha'); -$file=GETPOST('zipfilename_template', 'alpha'); +$file=trim(GETPOST('zipfilename_template', 'alpha')); $compression = GETPOST('compression'); $file = dol_sanitizeFileName($file); +$file = preg_replace('/(\.zip|\.tar|\.tgz|\.gz|\.tar\.gz|\.bz2)$/i', '', $file); $sortfield = GETPOST('sortfield', 'alpha'); $sortorder = GETPOST('sortorder', 'alpha'); @@ -112,6 +113,7 @@ $utils = new Utils($db); if ($compression == 'zip') { + $file .= '.zip'; $ret = dol_compress_dir(DOL_DATA_ROOT, $outputdir."/".$file, $compression, '/(\.log|\/temp\/|documents\/admin\/documents\/)/'); if ($ret < 0) { @@ -131,7 +133,6 @@ elseif (in_array($compression, array('gz', 'bz'))) $outputfile = $conf->admin->dir_temp.'/export_files.'.$userlogin.'.out'; // File used with popen method - $file = substr($file, 0, strrpos($file, '.')); $file .= '.tar'; // We also exclude '/temp/' dir and 'documents/admin/documents' $cmd = "tar -cf ".$outputdir."/".$file." --exclude-vcs --exclude 'temp' --exclude 'dolibarr.log' --exclude='documents/admin/documents' -C ".dirname(DOL_DATA_ROOT)." ".basename(DOL_DATA_ROOT); From ab8078689f351e3e0c8864cb29c13765df558263 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 17 Jan 2020 13:31:40 +0100 Subject: [PATCH 038/230] Trans --- htdocs/langs/en_US/other.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/other.lang b/htdocs/langs/en_US/other.lang index 7ee672f089b..314a325c79d 100644 --- a/htdocs/langs/en_US/other.lang +++ b/htdocs/langs/en_US/other.lang @@ -267,7 +267,7 @@ WEBSITE_PAGEURL=URL of page WEBSITE_TITLE=Title WEBSITE_DESCRIPTION=Description WEBSITE_IMAGE=Image -WEBSITE_IMAGEDesc=Relative path of the image media. You can keep this empty as this is rarely used (it can be used by dynamic content to show a preview of a list of blog posts). +WEBSITE_IMAGEDesc=Relative path of the image media. You can keep this empty as this is rarely used (it can be used by dynamic content to show a thumbnail in a list of blog posts). WEBSITE_KEYWORDS=Keywords LinesToImport=Lines to import From 60d4f63205a0c8d03bfdf96825f0a5b1894f5ab3 Mon Sep 17 00:00:00 2001 From: VESSILLER Date: Fri, 17 Jan 2020 13:56:01 +0100 Subject: [PATCH 039/230] FIX send expense report mail in HTML format --- htdocs/expensereport/card.php | 18 +++++++++++++----- htdocs/langs/fr_FR/trips.lang | 2 +- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/htdocs/expensereport/card.php b/htdocs/expensereport/card.php index b95dad0f200..44179745267 100644 --- a/htdocs/expensereport/card.php +++ b/htdocs/expensereport/card.php @@ -390,6 +390,7 @@ if (empty($reshook)) // CONTENT $link = $urlwithroot.'/expensereport/card.php?id='.$object->id; + $link = '
' . $link . ''; $message = $langs->transnoentities("ExpenseReportWaitingForApprovalMessage", $expediteur->getFullName($langs), get_date_range($object->date_debut, $object->date_fin, '', $langs), $link); // Rebuild pdf @@ -509,6 +510,7 @@ if (empty($reshook)) // CONTENT $link = $urlwithroot.'/expensereport/card.php?id='.$object->id; + $link = '' . $link . ''; $dateRefusEx = explode(" ", $object->date_refuse); $message = $langs->transnoentities("ExpenseReportWaitingForReApprovalMessage", $dateRefusEx[0], $object->detail_refuse, $expediteur->getFullName($langs), $link); @@ -634,6 +636,7 @@ if (empty($reshook)) // CONTENT $link = $urlwithroot.'/expensereport/card.php?id='.$object->id; + $link = '' . $link . ''; $message = $langs->transnoentities("ExpenseReportApprovedMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $link); // Rebuilt pdf @@ -704,7 +707,8 @@ if (empty($reshook)) $object = new ExpenseReport($db); $object->fetch($id); - $result = $object->setDeny($user, GETPOST('detail_refuse', 'alpha')); + $detailRefuse = GETPOST('detail_refuse', 'alpha'); + $result = $object->setDeny($user, $detailRefuse); if ($result > 0) { @@ -752,7 +756,8 @@ if (empty($reshook)) // CONTENT $link = $urlwithroot.'/expensereport/card.php?id='.$object->id; - $message = $langs->transnoentities("ExpenseReportRefusedMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $_POST['detail_refuse'], $link); + $link = '' . $link . ''; + $message = $langs->transnoentities("ExpenseReportRefusedMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $detailRefuse, $link); // Rebuilt pdf /* @@ -832,7 +837,8 @@ if (empty($reshook)) if ($user->id == $object->fk_user_valid || $user->id == $object->fk_user_author) { - $result = $object->set_cancel($user, GETPOST('detail_cancel', 'alpha')); + $detailCancel = GETPOST('detail_cancel', 'alpha'); + $result = $object->set_cancel($user, $detailCancel); if ($result > 0) { @@ -880,7 +886,8 @@ if (empty($reshook)) // CONTENT $link = $urlwithroot.'/expensereport/card.php?id='.$object->id; - $message = $langs->transnoentities("ExpenseReportCanceledMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), GETPOST('detail_cancel', 'alpha'), $link); + $link = '' . $link . ''; + $message = $langs->transnoentities("ExpenseReportCanceledMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $detailCancel, $link); // Rebuilt pdf /* @@ -1105,6 +1112,7 @@ if (empty($reshook)) // CONTENT $link = $urlwithroot.'/expensereport/card.php?id='.$object->id; + $link = '' . $link . ''; $message = $langs->transnoentities("ExpenseReportPaidMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $link); // Generate pdf before attachment @@ -1736,7 +1744,7 @@ else if ($action == 'cancel') { $array_input = array('text'=>$langs->trans("ConfirmCancelTrip"), array('type'=>"text",'label'=>''.$langs->trans("Comment").'','name'=>"detail_cancel",'value'=>"")); - $formconfirm=$form->formconfirm($_SEVER["PHP_SELF"]."?id=".$id, $langs->trans("Cancel"), "", "confirm_cancel", $array_input, "", 1); + $formconfirm=$form->formconfirm($_SERVER["PHP_SELF"]."?id=".$id, $langs->trans("Cancel"), "", "confirm_cancel", $array_input, "", 1); } if ($action == 'setdraft') diff --git a/htdocs/langs/fr_FR/trips.lang b/htdocs/langs/fr_FR/trips.lang index cffe2cc14e8..efb5b645a3d 100644 --- a/htdocs/langs/fr_FR/trips.lang +++ b/htdocs/langs/fr_FR/trips.lang @@ -29,7 +29,7 @@ ExpenseReportApprovedMessage=La note de frais %s a été approuvée.
- Utilis ExpenseReportRefused=Une note de frais a été refusée ExpenseReportRefusedMessage=La note de frais %s a été refusée.
- Utilisateur : %s
- Refusée par : %s
- Motif du refus : %s
Cliquez ici pour afficher la note de frais: %s ExpenseReportCanceled=Une note de frais a été annulée -ExpenseReportCanceledMessage=La note de frais %s a été annulée.
- Utilisateur : %s
- Annulée par : %s
- Motif de l'annulation :%s
Cliquez ici pour afficher la note de frais %s +ExpenseReportCanceledMessage=La note de frais %s a été annulée.
- Utilisateur : %s
- Annulée par : %s
- Motif de l'annulation : %s
Cliquez ici pour afficher la note de frais %s ExpenseReportPaid=Une note de frais a été réglée ExpenseReportPaidMessage=La note de frais %s a été réglée.
- Utilisateur : %s
- Réglée par : %s
Cliquez ici pour afficher la note de frais %s TripId=Id note de frais From b48c9a5998dc23e77979eba682aaac42b48f670a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 17 Jan 2020 14:09:29 +0100 Subject: [PATCH 040/230] Update website templates --- .../websites/website_template-corporate.zip | Bin 1721229 -> 1722083 bytes .../websites/website_template-stellar.zip | Bin 114796 -> 114796 bytes htdocs/langs/en_US/other.lang | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/install/doctemplates/websites/website_template-corporate.zip b/htdocs/install/doctemplates/websites/website_template-corporate.zip index a9773ce496bcfcc711ffd015051fb56741f66a38..f83fecc2c2e1e0618d1731d96ae3f6def65d1543 100644 GIT binary patch delta 83055 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 z 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≠5kDAa4x-YY8W4odtS1QHaqD3Gz)%D)RW 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 delta 82465 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

YyP2(8QI(tI>X{5Wl}1y1=tio>|NdgVuI6oH+n# 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%0AXMW5pdS$`pubPI?C z{_m-Wf;oQnCzR(S`~PedKmKttF}M9>!eVD`_umeFwj9R%aqv$zk@x@Mz|q9Pkpq%> z2!w@Lh=EZ5F4(6}vp|*`06@bO5kT;N#s&Z`_95|NAlesNJH?*U(At13i-D;AwnKQ! z!|-R&e@4Bv4qKM5eI z7X$?VQ<-a8+b??034DCsasQD>{TYN!0z~zN|dnW3iXAH@6h=atRp)w?%(}lf< zv`GBx+-uDxme%s@_2hZ~Crv-^6D0qz#3=b}w)p^gEBR-d+B{2OMt%`M)_xNZGXHnw zHobd+f9N6oN6ap8AV?@8i0psT+~LsZwRk?j-aQ{+&nL+LvsuAINTomwe^2lKv?Tm@ in&^li2ssLf@P8ct=f38@O*Tm(RZ<`(cunfR82f*qar?di diff --git a/htdocs/install/doctemplates/websites/website_template-stellar.zip b/htdocs/install/doctemplates/websites/website_template-stellar.zip index 59ebb470d72bbb429c12a5a6ee6e19340c99002c..ca73b125015d7f01ad19fe7d907937bc54aed972 100644 GIT binary patch delta 681 zcmX|;O(?@*9LIf|Y*tn-a-qEELKqJ6E;TP}oa8`lE*!j+VTZ{@4sx)p|4}1wShV;!ni>;78uUWG&N!$`MEfn*`FN>!9h78H}}EU09A)Pme>ii?9Nq39ok*+B8l zj(3XJ4k#H!&sb^@Q65JvXiZEA>*FMzbQDjg@kZy46COGPt+NPfq2wHFboRM0L+7On zJ}o}!#w*2vdFYCW!#*r&*ZbJg`qIrd5*&1~gJsgdF5--I?O|P8{^`fPmOc-liq4+^ z>PhuMw2|CF@C~J_AbP3gge`pHOj-I;QfqG`;6qE_5%kd36%}h&q9S@16&J`qf%O+i1J$Vj delta 681 zcmX|;ODKd<7>2#gn6nolA+%r5J7PI=vz3?>GnNyHN}r^2D0N~QQ} z#~Z~f2b5%@dn7T4C_7OFTEASv`Y?(|9mSI|ywbTd4mX{?#!2|KP<#qDI=iPaLFdIZ z*0uQP3|=Vq&O(<@99YMqcD?s4tuI|~e32?*Y`1N@P@#>@r$N+cFwRv471R6y4bb zrT%^DL5Ar_^2*4Ro`TSR&JYr|o{(7P389ta9z&=jV_1Iy5|jUF diff --git a/htdocs/langs/en_US/other.lang b/htdocs/langs/en_US/other.lang index 314a325c79d..052b1b25859 100644 --- a/htdocs/langs/en_US/other.lang +++ b/htdocs/langs/en_US/other.lang @@ -267,7 +267,7 @@ WEBSITE_PAGEURL=URL of page WEBSITE_TITLE=Title WEBSITE_DESCRIPTION=Description WEBSITE_IMAGE=Image -WEBSITE_IMAGEDesc=Relative path of the image media. You can keep this empty as this is rarely used (it can be used by dynamic content to show a thumbnail in a list of blog posts). +WEBSITE_IMAGEDesc=Relative path of the image media. You can keep this empty as this is rarely used (it can be used by dynamic content to show a thumbnail in a list of blog posts). Use __WEBSITEKEY__ in the path if path depends on website name. WEBSITE_KEYWORDS=Keywords LinesToImport=Lines to import From fe6bcd8a316ab2c1b4ffc08f632c1035ac84be95 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 17 Jan 2020 14:32:22 +0100 Subject: [PATCH 041/230] Fix missing value in popup --- htdocs/compta/sociales/card.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/compta/sociales/card.php b/htdocs/compta/sociales/card.php index f8a9a2d2975..ff2cb84dbce 100644 --- a/htdocs/compta/sociales/card.php +++ b/htdocs/compta/sociales/card.php @@ -604,7 +604,7 @@ if ($id > 0) */ $sql = "SELECT p.rowid, p.num_paiement, datep as dp, p.amount,"; $sql .= " c.code as type_code,c.libelle as paiement_type,"; - $sql .= ' ba.rowid as baid, ba.ref as baref, ba.label, ba.number as banumber, ba.account_number, ba.fk_accountancy_journal'; + $sql .= ' ba.rowid as baid, ba.ref as baref, ba.label, ba.number as banumber, ba.account_number, ba.currency_code as bacurrency_code, ba.fk_accountancy_journal'; $sql .= " FROM ".MAIN_DB_PREFIX."paiementcharge as p"; $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'bank as b ON p.fk_bank = b.rowid'; $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'bank_account as ba ON b.fk_account = ba.rowid'; @@ -653,6 +653,7 @@ if ($id > 0) $bankaccountstatic->ref = $objp->baref; $bankaccountstatic->label = $objp->baref; $bankaccountstatic->number = $objp->banumber; + $bankaccountstatic->currency_code = $objp->bacurrency_code; if (!empty($conf->accounting->enabled)) { $bankaccountstatic->account_number = $objp->account_number; From 82deccea086cb537da92565322afe57c0cd4d893 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 17 Jan 2020 14:41:42 +0100 Subject: [PATCH 042/230] Fix bad link --- htdocs/compta/facture/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index ffed0ec77b0..bc51fabfefc 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -3968,7 +3968,7 @@ elseif ($id > 0 || !empty($ref)) if ($result > 0) { print '. '.$langs->trans( "GeneratedFromTemplate", - ''.$tmptemplate->ref.'' + ''.$tmptemplate->ref.'' ).''; } } From 81f8a486c94b332999b4e07a41abf0220c2c080a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 17 Jan 2020 14:56:06 +0100 Subject: [PATCH 043/230] Look and feel v11 --- htdocs/comm/multiprix.php | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/htdocs/comm/multiprix.php b/htdocs/comm/multiprix.php index c4e0df11df2..6d80626242d 100644 --- a/htdocs/comm/multiprix.php +++ b/htdocs/comm/multiprix.php @@ -20,7 +20,7 @@ /** * \file htdocs/comm/multiprix.php * \ingroup societe - * \brief Onglet choix du niveau de prix + * \brief Tab to set the price level of a thirdparty */ require '../main.inc.php'; @@ -64,20 +64,11 @@ $userstatic = new User($db); if ($_socid > 0) { - // On recupere les donnees societes par l'objet + // We load data of thirdparty $objsoc = new Societe($db); $objsoc->id = $_socid; $objsoc->fetch($_socid, $to); - if ($errmesg) - { - print '
'.$errmesg.'

'; - } - - - /* - * Affichage onglets - */ $head = societe_prepare_head($objsoc); @@ -91,7 +82,7 @@ if ($_socid > 0) dol_fiche_head($head, $tabchoice, $langs->trans("ThirdParty"), 0, 'company'); - print ''; + print '
'; print '"; From 0ebed529e10f2b3a57a39c7dee3abc36e09f6cff Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 17 Jan 2020 15:27:43 +0100 Subject: [PATCH 044/230] FIX #12872 --- htdocs/core/tpl/objectline_create.tpl.php | 3 ++- htdocs/product/ajax/products.php | 21 ++++++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/htdocs/core/tpl/objectline_create.tpl.php b/htdocs/core/tpl/objectline_create.tpl.php index 374e740ea40..9056f3bde9d 100644 --- a/htdocs/core/tpl/objectline_create.tpl.php +++ b/htdocs/core/tpl/objectline_create.tpl.php @@ -620,7 +620,7 @@ if (!empty($usemargins) && $user->rights->margins->creer) /* When changing predefined product, we reload list of supplier prices required for margin combo */ $("#idprod, #idprodfournprice").change(function() { - console.log("#idprod, #idprodfournprice change triggered this.val = "+$(this).val()); + console.log("Call method change() after change on #idprod or #idprodfournprice. this.val = "+$(this).val()); setforpredef(); // TODO Keep vat combo visible and set it to first entry into list that match result of get_default_tva @@ -631,6 +631,7 @@ if (!empty($usemargins) && $user->rights->margins->creer) { ?> // Get the HT price for the product and display it + console.log("Load price without tax and set it into #price_ht"); $.post('/product/ajax/products.php?action=fetch', { 'id': $(this).val(), 'socid' : socid; ?> }, function(data) { jQuery("#price_ht").val(data.price_ht); }, diff --git a/htdocs/product/ajax/products.php b/htdocs/product/ajax/products.php index 19fd7926453..918950179c7 100644 --- a/htdocs/product/ajax/products.php +++ b/htdocs/product/ajax/products.php @@ -59,8 +59,9 @@ dol_syslog(join(',', $_GET)); if (!empty($action) && $action == 'fetch' && !empty($id)) { - // When action='fetch', id must be the product id. + // action='fetch' is used to get product information on a product. So when action='fetch', id must be the product id. require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; + require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; $outjson = array(); @@ -77,6 +78,13 @@ if (!empty($action) && $action == 'fetch' && !empty($id)) $found = false; + $price_level = 1; + if ($socid > 0 && !empty($conf->global->PRODUIT_MULTIPRICES)) { + $thirdpartytemp = new Societe($db); + $thirdpartytemp->fetch($socid); + $price_level = $thirdpartytemp->price_level; + } + // Price by qty if (!empty($price_by_qty_rowid) && $price_by_qty_rowid >= 1 && (!empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY))) // If we need a particular price related to qty { @@ -100,14 +108,13 @@ if (!empty($action) && $action == 'fetch' && !empty($id)) } // Multiprice - if (!$found && isset($price_level) && $price_level >= 1 && (!empty($conf->global->PRODUIT_MULTIPRICES))) // If we need a particular price - // level (from 1 to 6) + if (!$found && isset($price_level) && $price_level >= 1 && (!empty($conf->global->PRODUIT_MULTIPRICES))) // If we need a particular price level (from 1 to 6) { $sql = "SELECT price, price_ttc, price_base_type, tva_tx"; $sql .= " FROM ".MAIN_DB_PREFIX."product_price "; - $sql .= " WHERE fk_product='".$id."'"; + $sql .= " WHERE fk_product = '".$id."'"; $sql .= " AND entity IN (".getEntity('productprice').")"; - $sql .= " AND price_level=".$price_level; + $sql .= " AND price_level = ".((int) $price_level); $sql .= " ORDER BY date_price"; $sql .= " DESC LIMIT 1"; @@ -160,8 +167,7 @@ else { require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php'; - $langs->load("products"); - $langs->load("main"); + $langs->loadLangs(array("main", "products")); top_httphead(); @@ -186,6 +192,7 @@ else $searchkey = (($idprod && GETPOST($idprod, 'alpha')) ? GETPOST($idprod, 'alpha') : (GETPOST($htmlname, 'alpha') ? GETPOST($htmlname, 'alpha') : '')); $form = new Form($db); + if (empty($mode) || $mode == 1) { // mode=1: customer $arrayresult = $form->select_produits_list("", $htmlname, $type, 0, $price_level, $searchkey, $status, $finished, $outjson, $socid, '1', 0, '', $hidepriceinlabel, $warehouseStatus); } elseif ($mode == 2) { // mode=2: supplier From 057a40dcb21ea4cb8254ad5d512aa30b530eb5c2 Mon Sep 17 00:00:00 2001 From: Juanjo Menent Date: Fri, 17 Jan 2020 17:05:29 +0100 Subject: [PATCH 045/230] FIX: In third parties creation, when changing the country drop down, the states are not recharged --- htdocs/societe/card.php | 66 ++++++++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php index e8d4c327ecf..da9f79cf4f5 100644 --- a/htdocs/societe/card.php +++ b/htdocs/societe/card.php @@ -5,7 +5,7 @@ * Copyright (C) 2005 Eric Seigne * Copyright (C) 2005-2017 Regis Houssin * Copyright (C) 2008 Patrick Raguin - * Copyright (C) 2010-2016 Juanjo Menent + * Copyright (C) 2010-2020 Juanjo Menent * Copyright (C) 2011-2013 Alexandre Spangaro * Copyright (C) 2015 Jean-François Ferry * Copyright (C) 2015 Marcos García @@ -1070,13 +1070,13 @@ else $linkback = ""; print load_fiche_titre($langs->trans("NewThirdParty"), $linkback, 'building'); - if (!empty($conf->use_javascript_ajax) && !empty($conf->global->THIRDPARTY_SUGGEST_ALSO_ADDRESS_CREATION)) - { - print "\n".''."\n"; + print '' . "\n"; - print '
'; - print '
'; - print $langs->trans("ThirdPartyType").':     '; - print '
'; - print ''; - print '     '; - print ''; - print '
'; - print "
\n"; - } + print '
'; + print '
'; + print $langs->trans("ThirdPartyType") . ':     '; + print '
'; + print ''; + print '     '; + print ''; + print '
'; + print "
\n"; + } else { + print '' . "\n"; + } + } dol_htmloutput_mesg(is_numeric($error) ? '' : $error, $errors, 'error'); From 5687d26f955156a0d54586ca9d169c0725120f73 Mon Sep 17 00:00:00 2001 From: Laurent De Coninck Date: Fri, 17 Jan 2020 17:21:14 +0100 Subject: [PATCH 046/230] fixes the creation of a stock movement This fixes the creation of a stock movement by supporting the DLC and DLUO. [see: #12883] --- htdocs/product/stock/class/api_stockmovements.class.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/product/stock/class/api_stockmovements.class.php b/htdocs/product/stock/class/api_stockmovements.class.php index cfa901bce30..c199bfdf676 100644 --- a/htdocs/product/stock/class/api_stockmovements.class.php +++ b/htdocs/product/stock/class/api_stockmovements.class.php @@ -192,13 +192,15 @@ class StockMovements extends DolibarrApi if ($field == 'movementcode') $movementcode = $value; if ($field == 'movementlabel') $movementlabel = $value; if ($field == 'price') $price = $value; + if ($field == 'dlc') $dlc = $value; + if ($field == 'dluo') $dluo = $value; } // Type increase or decrease if ($qty >= 0) $type = 3; else $type = 2; - if($this->stockmovement->_create(DolibarrApiAccess::$user, $product_id, $warehouse_id, $qty, $type, $price, $movementlabel, $movementcode, '', '', '', $lot) <= 0) { + if($this->stockmovement->_create(DolibarrApiAccess::$user, $product_id, $warehouse_id, $qty, $type, $price, $movementlabel, $movementcode, '', $dlc, $dluo, $lot) <= 0) { throw new RestException(503, 'Error when create stock movement : '.$this->stockmovement->error); } From d2e4b9346ba747085a5d3bab2724756f7ae13940 Mon Sep 17 00:00:00 2001 From: Laurent De Coninck Date: Fri, 17 Jan 2020 17:49:50 +0100 Subject: [PATCH 047/230] enhance the doc --- .../stock/class/api_stockmovements.class.php | 45 +++++-------------- 1 file changed, 12 insertions(+), 33 deletions(-) diff --git a/htdocs/product/stock/class/api_stockmovements.class.php b/htdocs/product/stock/class/api_stockmovements.class.php index c199bfdf676..8e6621085b7 100644 --- a/htdocs/product/stock/class/api_stockmovements.class.php +++ b/htdocs/product/stock/class/api_stockmovements.class.php @@ -154,48 +154,27 @@ class StockMovements extends DolibarrApi return $obj_ret; } - /* - * @param int $product_id Id product id {@min 1} - * @param int $warehouse_id Id warehouse {@min 1} - * @param float $qty Qty to add (Use negative value for a stock decrease) {@min 0} {@message qty must be higher than 0} - * @param string $lot Lot - * @param string $movementcode Movement code {@example INV123} - * @param string $movementlabel Movement label {@example Inventory number 123} - * @param string $price To update AWP (Average Weighted Price) when you make a stock increase (qty must be higher then 0). - */ - - /** * Create stock movement object. - * You can use the following message to test this RES API: - * { "product_id": 1, "warehouse_id": 1, "qty": 1, "lot": "", "movementcode": "INV123", "movementlabel": "Inventory 123", "price": 0 } + * @param int $product_id Id product id {@min 1} {@from body} {@required true} + * @param int $warehouse_id Id warehouse {@min 1} {@from body} {@required true} + * @param float $qty Qty to add (Use negative value for a stock decrease) {@min 0} {@message qty must be higher than 0} {@from body} {@required true} + * @param string $lot Lot {@from body} + * @param string $movementcode Movement code {@example INV123} {@from body} + * @param string $movementlabel Movement label {@example Inventory number 123} {@from body} + * @param string $price To update AWP (Average Weighted Price) when you make a stock increase (qty must be higher then 0). {@from body} + * @param string $dlc {@from body} {@type date} + * @param string $dluo {@from body} {@type date} * - * @param array $request_data Request data * @return int ID of stock movement + * @throws RestException */ - //function post($product_id, $warehouse_id, $qty, $lot='', $movementcode='', $movementlabel='', $price=0) - public function post($request_data = null) + public function post($product_id, $warehouse_id, $qty, $lot = '', $movementcode = '', $movementlabel = '', $price = '', $dlc = '', $dluo = '') { if(! DolibarrApiAccess::$user->rights->stock->creer) { throw new RestException(401); } - // Check mandatory fields - //$result = $this->_validate($request_data); - - foreach($request_data as $field => $value) { - //$this->stockmovement->$field = $value; - if ($field == 'product_id') $product_id = $value; - if ($field == 'warehouse_id') $warehouse_id = $value; - if ($field == 'qty') $qty = $value; - if ($field == 'lot') $lot = $value; - if ($field == 'movementcode') $movementcode = $value; - if ($field == 'movementlabel') $movementlabel = $value; - if ($field == 'price') $price = $value; - if ($field == 'dlc') $dlc = $value; - if ($field == 'dluo') $dluo = $value; - } - // Type increase or decrease if ($qty >= 0) $type = 3; else $type = 2; @@ -344,7 +323,7 @@ class StockMovements extends DolibarrApi private function _validate($data) { $stockmovement = array(); - foreach (Warehouses::$FIELDS as $field) { + foreach (self::$FIELDS as $field) { if (!isset($data[$field])) throw new RestException(400, "$field field missing"); $stockmovement[$field] = $data[$field]; From 73d56358e1dbd30d5d4f83d606396e33bfdaa746 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 18 Jan 2020 16:13:10 +0100 Subject: [PATCH 048/230] Fix bad param --- htdocs/compta/bank/various_payment/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/bank/various_payment/list.php b/htdocs/compta/bank/various_payment/list.php index c4164c78b4a..5b75b7ef847 100644 --- a/htdocs/compta/bank/various_payment/list.php +++ b/htdocs/compta/bank/various_payment/list.php @@ -234,7 +234,7 @@ if ($result) // Subledger account print '
'; } From 0873f2fec9b616b24e45fb0272ad3013016d5bd3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 18 Jan 2020 16:16:17 +0100 Subject: [PATCH 049/230] Fix $user not defined --- htdocs/fourn/class/fournisseur.commande.class.php | 2 +- htdocs/fourn/class/fournisseur.facture.class.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index b8745aa0d2b..e03b050d693 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -705,7 +705,7 @@ class CommandeFournisseur extends CommonOrder */ public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0) { - global $langs, $conf; + global $langs, $conf, $user; $result = ''; $label = ''.$langs->trans("ShowOrder").''; diff --git a/htdocs/fourn/class/fournisseur.facture.class.php b/htdocs/fourn/class/fournisseur.facture.class.php index 1f00720a12d..587f9fbb226 100644 --- a/htdocs/fourn/class/fournisseur.facture.class.php +++ b/htdocs/fourn/class/fournisseur.facture.class.php @@ -2253,7 +2253,7 @@ class FactureFournisseur extends CommonInvoice */ public function getNomUrl($withpicto = 0, $option = '', $max = 0, $short = 0, $moretitle = '', $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0) { - global $langs, $conf; + global $langs, $conf, $user; $result = ''; From 8744f6ab7bc497dbe3650e57b415516b3a1f02a4 Mon Sep 17 00:00:00 2001 From: Scrutinizer Auto-Fixer Date: Sat, 18 Jan 2020 15:17:07 +0000 Subject: [PATCH 050/230] Scrutinizer Auto-Fixes This commit consists of patches automatically generated for this project on https://scrutinizer-ci.com --- htdocs/admin/tools/dolibarr_export.php | 84 +- htdocs/comm/propal/list.php | 50 +- htdocs/commande/list.php | 34 +- htdocs/compta/bank/various_payment/list.php | 166 +- htdocs/compta/facture/list.php | 24 +- htdocs/core/class/dolgraph.class.php | 2 +- htdocs/core/class/html.form.class.php | 86 +- htdocs/core/class/utils.class.php | 2 +- htdocs/core/modules/DolibarrModules.class.php | 856 ++++----- htdocs/core/modules/modAgenda.class.php | 28 +- htdocs/core/modules/modUser.class.php | 166 +- htdocs/expedition/list.php | 24 +- htdocs/exports/class/export.class.php | 394 ++--- .../fourn/class/fournisseur.facture.class.php | 690 ++++---- htdocs/holiday/card.php | 22 +- htdocs/loan/list.php | 2 +- htdocs/salaries/list.php | 28 +- .../class/supplier_proposal.class.php | 1524 ++++++++--------- 18 files changed, 2091 insertions(+), 2091 deletions(-) diff --git a/htdocs/admin/tools/dolibarr_export.php b/htdocs/admin/tools/dolibarr_export.php index e5f6dae4852..854fd130bc5 100644 --- a/htdocs/admin/tools/dolibarr_export.php +++ b/htdocs/admin/tools/dolibarr_export.php @@ -29,18 +29,18 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; $langs->load("admin"); -$action=GETPOST('action', 'alpha'); +$action = GETPOST('action', 'alpha'); $sortfield = GETPOST('sortfield', 'alpha'); $sortorder = GETPOST('sortorder', 'alpha'); $page = GETPOST('page', 'int'); -if (! $sortorder) $sortorder="DESC"; -if (! $sortfield) $sortfield="date"; +if (!$sortorder) $sortorder = "DESC"; +if (!$sortfield) $sortfield = "date"; if (empty($page) || $page == -1) { $page = 0; } -$limit = GETPOST('limit', 'int')?GETPOST('limit', 'int'):$conf->liste_limit; +$limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit; $offset = $limit * $page; -if (! $user->admin) +if (!$user->admin) accessforbidden(); @@ -52,33 +52,33 @@ if ($action == 'delete') { if (preg_match('/^backup\//', GETPOST('urlfile', 'alpha'))) { - $file=$conf->admin->dir_output.'/backup/'.basename(GETPOST('urlfile', 'alpha')); - $ret=dol_delete_file($file, 1); + $file = $conf->admin->dir_output.'/backup/'.basename(GETPOST('urlfile', 'alpha')); + $ret = dol_delete_file($file, 1); if ($ret) setEventMessages($langs->trans("FileWasRemoved", GETPOST('urlfile')), null, 'mesgs'); else setEventMessages($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), null, 'errors'); } else { - $file=$conf->admin->dir_output.'/documents/'.basename(GETPOST('urlfile', 'alpha')); - $ret=dol_delete_file($file, 1); + $file = $conf->admin->dir_output.'/documents/'.basename(GETPOST('urlfile', 'alpha')); + $ret = dol_delete_file($file, 1); if ($ret) setEventMessages($langs->trans("FileWasRemoved", GETPOST('urlfile')), null, 'mesgs'); else setEventMessages($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), null, 'errors'); } - $action=''; + $action = ''; } /* * View */ -$form=new Form($db); +$form = new Form($db); $formfile = new FormFile($db); -$label=$db::LABEL; -$type=$db->type; +$label = $db::LABEL; +$type = $db->type; //var_dump($db); -$help_url='EN:Backups|FR:Sauvegardes|ES:Copias_de_seguridad'; +$help_url = 'EN:Backups|FR:Sauvegardes|ES:Copias_de_seguridad'; llxHeader('', '', $help_url); print ' \n',1,'2019-08-15 00:03:30',NULL,'2019-08-14 22:28:20',NULL,NULL,'other','en_US',NULL,'','',NULL,''),(10,3,'header','','Header and Top Menu','Header with menu','','\n\n\n\n
\n
\n
\n \n
\n
\n
\n',1,'2019-08-15 00:03:30',NULL,'2020-01-17 11:40:26',NULL,NULL,'other','en_US',NULL,'','',NULL,''),(11,3,'home','','Home','Welcome','','
\n \n \n \n \n \n
\n
\n
\n
\n
\n
\n
\n
\n
Boost your business\n
\n
\n

We provide powerful solutions for all businesses

\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
 Best prices on the market \n
\n
\n

Our optimized processes allows us to provide you very competitive prices

\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n\n \n
\n
\n
\n
\n
\n
\n \n
\n
\n

Our sales representative are also technicians.

\n
\n
\n
\n
\n
\n \n
\n

Take a look at our offers...

\n
\n
\n
\n
\n
\n \n
\n

Our customer-supplier relationship is very appreciated by our customers

\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n

We continue to follow and assist you after the sale. Contact us at any time.

\n
\n
\n
\n
\n
\n\n\n \n
\n
\n

Looking for

\n

a high quality service?

\n

With a lot of experience, hiring us is a security for your business!

\n
\n
\n
11
\n
Years of Experience
\n
\n
\n
\n query($sql); $obj = $db->fetch_object($resql); print $obj->nb; ?>\n
\n
Experts
\n
\n
\n
\n query($sql); $obj = $db->fetch_object($resql); print $obj->nb; ?>\n
\n
Trusted Clients
\n
\n
\n
\n \n
\n
\n
\n\n \n \n \n
\n
\n
\n \n
\n \n
\n \n
\n

our plans

\n\n \n
\n \n
\n
\n
\n
FREE
\n
The best choice for personal use
\n
The service 1 for free
\n
\n 0/ month\n
\n
\n Available features are : \n
    \n
  • \n \n Service 1 \n
  • \n
\n
\n
\n Subcribe\n
\n
\n
\n \n \n \n
\n
\n
\n
STARTER
\n
For small companiess
\n
The service 1 and product 1 at low price
\n
\n 29/ month\n
\n
\n Available features are : \n
    \n
  • \n \n Service 1\n
  • \n
  • \n \n Product 1\n
  • \n
\n
\n
\n Subscribe\n
\n
\n
\n \n \n \n
\n
\n
\n
PREMIUM
\n
For large companies
\n
The full option package for a one shot price\n
\n
\n 2499\n
\n
\n Available features are :\n
    \n
  • \n \n Service 1
  • \n
  • \n \n Service 2
  • \n
  • \n \n Product 1
  • \n
\n
\n
\n Buy\n
\n
\n
\n \n
\n \n
\n \n
\n \n
\n \n \n
\n
\n
\n \n \n \n
\n
\n

our team

\n
\n
\n \n
\n
\n
\n
\n\n\n \n
\n
\n
\n
\n
\n

Request a callback

\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n \n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n
\n

successful cases

\n
\n
\n
\n
\n
\"\"\n
\n
\n
\n
\"\"\n
\n
\n
\n
\"\"\n
\n
\n
\n
\"\"\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n Albert Einstein\n
\n
Scientist, www.emc2.org
\n
\n
\n
\n
\n
-20%
\n
Expenses
\n
\n
\n
\n
\n
\n
\n \n They did everything, with almost no time or effort for me. The best part was that I could trust their team to represent our company professionally with our clients.\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n Pierre Curie\n
\n
CEO “Cyclonic”
\n
\n
\n
\n
\n
-30%
\n
Expenses
\n
\n
\n
\n
\n
\n
\n \n Their course gave me the confidence to implement new techniques in my work. I learn “how” to write – “what” and “why” also became much clearer.\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n Marie Curie\n
\n
CTO \"Cyclonic\"
\n
\n
\n
\n
\n
+22%
\n
Turnover
\n
\n
\n
\n
\n
\n
\n \n We were skeptical to work with a consultant to optimize our sales emails, but they were highly recommended by many other startups we knew. They helped us to reach our objective of 20% turnover increase, in 4 monthes.\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n John Doe\n
\n
Sale representative
\n
\n
\n
\n
\n
+40%
\n
Quotes
\n
\n
\n
\n
\n
\n
\n \n Their work on our website and Internet marketing has made a significant different to our business. We’ve seen a +40% increase in quote requests from our website.\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n\n \n
\n
\n

Latest News

\n \n
\n
\n\n\n \n\n\n
\n',1,'2019-08-15 00:03:30',NULL,'2020-01-17 12:35:43',NULL,NULL,'page','en_US',NULL,'','',NULL,''),(12,3,'our-team','','Our team','Our team','team','
\n\n \n\n
\n
\n
\n
\n
\n
\n
\n
\n
Our team\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n
\n

\n

The crew...




\n query($sql);\n if (! $resql) dol_print_error($db);\n while ($obj = $db->fetch_object($resql))\n {\n $arrayofusers[]=$obj->rowid;\n }\n \n print \'
\';\n foreach($arrayofusers as $id)\n {\n $fuser->fetch($id);\n\n print \'
\';\n print \'
\';\n print \'
\';\n if ($fuser->photo) print Form::showphoto(\'userphoto\', $fuser, 100, 0, 0, \'photowithmargin\', \'\', 0);\n //print \'photo.\'\" width=\"129\" height=\"129\" alt=\"\">\';\n else print \'\"\"\';\n print \'
\';\n print \'
\';\n print \'
\'.$fuser->firstname.\'
\';\n print \'
    \';\n //print \'
  • September 24, 2018
  • \';\n if ($fuser->job) print \'
  • \'.$fuser->job.\'
  • \';\n else print \'
  • \';\n print \'
\';\n print \'
\';\n print \'
\';\n print \'
\';\n }\n print \'
\';\n\n ?>\n
\n
\n\n

\n\n \n\n
\n \n',1,'2019-08-15 00:03:30',NULL,'2020-01-10 22:50:50',NULL,NULL,'page','en_US',NULL,'','',NULL,''),(13,3,'partners','','Partners','Partners','partners','
\n\n \n\n
\n
\n
\n
\n
\n
\n
\n
\n
Partners\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n
\n
\n

Our partners...

\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n

\n\n \n\n
\n \n\n',1,'2019-08-15 00:03:30',NULL,'2019-08-14 22:29:51',NULL,NULL,'page','en_US',NULL,'','',NULL,''),(14,3,'pricing','','Pricing','All the prices of our offers','pricing','
\n\n \n\n
\n
\n
\n
\n
\n
\n
\n
\n
Our plans\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n\n\n \n
\n
\n
\n \n
\n \n
\n \n
\n\n \n
\n \n
\n
\n
\n
FREE
\n
The best choice for personal use
\n
The service 1 for free
\n
\n 0/ month\n
\n
\n Available features are : \n
    \n
  • \n \n Service 1 \n
  • \n
\n
\n
\n Subcribe\n
\n
\n
\n \n \n \n
\n
\n
\n
STARTER
\n
For small companiess
\n
The service 1 and product 1 at low price
\n
\n 29/ month\n
\n
\n Available features are : \n
    \n
  • \n \n Service 1\n
  • \n
  • \n \n Product 1\n
  • \n
\n
\n
\n Subscribe\n
\n
\n
\n \n \n \n
\n
\n
\n
PREMIUM
\n
For large companies
\n
The full option package for a one shot price\n
\n
\n 2499\n
\n
\n Available features are :\n
    \n
  • \n \n Service 1
  • \n
  • \n \n Service 2
  • \n
  • \n \n Product 1
  • \n
\n
\n
\n Buy\n
\n
\n
\n \n
\n \n
\n \n
\n \n
\n \n \n
\n
\n
\n \n \n \n

\n\n \n\n
\n \n',1,'2019-08-15 00:03:30',NULL,'2019-08-14 22:26:54',NULL,NULL,'page','en_US',NULL,'','',NULL,''),(15,3,'privacy-policies','','Privacy Policies','Privacy Policies','Privacy policies, GDPR','
\n \n \n \n\n\n
\n
\n
\n
\n
\n
\n
\n
\n
Privacy Policy\n
\n
\n
\n
\n
\n
\n
\n
\n\n


\n\n
\n
\n

Information collected and used


\n

* Your customer information (email, phone, business name, first and last name of contact, address, postal code, country and VAT number) are stored when you become a customer. This information allows us to bill you. \n

* If you paid using our online service, we also store the last 4 digits of your card. The full details of your credit card is stored by our payment provider Stripe (the world leader in online payment).

\n

* You have the option to request the deletion of your data and the above information at any time (except data required y fiscal tracking rules, like your invoices).

\n

* The Privacy Policies and GDPR referral contact for our services is: global->MAIN_INFO_GDPR; ?>

\n


\n

Data Storage and Backups


\n

* The storage of collected data (see \'Information collected and used\') is done in a database.

\n

* We made one backup every week. Only 4 weeks are kept.

\n


\n

Subcontractor


\n

* Our services relies on the following subcontractors and service:
\n** The host of computer servers, which is ABC company. These servers are hosted in US. No customer information is communicated to this subcontractor who only provides the hardware and network layer, the installation and operation being carried out by us directly.
\n** The online payment service Stripe, which is used, to ensure regular payment of subscription or your invoices paid online.

\n


\n

Software Protection


\n

* Our services runs on Linux Ubuntu systems and software. They benefit from regular security updates when the operating system editor (Ubuntu Canonical) publishes them.

\n

* Our services are accessible in HTTPS (HTTP encrypted) only, encrypted with SHA256 certificates.

\n

* Our technical platform are protected by various solutions.

\n


\n

Data theft


\n

* In case of suspicion of a theft of the data we have collected (see first point \'Information collected and used\'), customers will be informed by email, at email corresponding to their customer account

\n

 

\n
\n
\n\n\n \n \n \n
\n \n',1,'2019-08-15 00:03:30',NULL,'2019-08-14 22:27:09',NULL,NULL,'page','en_US',NULL,'','',NULL,''),(16,3,'product-p','','Product P','Product P','','
\n\n \n\n
\n
\n
\n
\n
\n
\n
\n
\n
Product P\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n
\n
\n
\n
\n
\nThis is a description page of our product P...
\n
\n
\n
\n
\n
\n
\n\n\n

\n\n \n\n
\n \n\n',1,'2019-08-15 00:03:30',NULL,'2019-08-14 22:27:20',NULL,NULL,'page','en_US',NULL,'','',NULL,''),(17,3,'search','','Search Page','Search Page','','
\n\n \n\n
\n
\n
\n
\n
\n
\n
\n
\n
Search\n
\n
\n
\n
\n
\n
\n
\n
\n\n


\n\n
\n \n
\n
\n
\n \">\n
\n
\n \n \n
\n
\n \n load(\"main\");\n \n if (function_exists(\'getPagesFromSearchCriterias\'))\n {\n if (GETPOSTISSET(\'s\'))\n {\n $listofpages = getPagesFromSearchCriterias(\'page\', \'meta\', GETPOST(\'s\', \'none\'));\n if ($listofpages[\'code\'] == \'OK\')\n {\n foreach($listofpages[\'list\'] as $websitepagefound)\n {\n print \'
ref.\'.php\">\'.$websitepagefound->title.\' - \'.$websitepagefound->description.\'
\';\n }\n }\n else\n {\n // If error, show message\n print $listofpages[\'message\'];\n }\n }\n }\n else\n {\n print $weblangs->trans(\"FeatureNotYetAvailable\");\n }\n ?>\n \n





\n
\n\n \n\n
\n',1,'2019-08-15 00:03:30',NULL,'2020-01-17 12:17:47',NULL,NULL,'page','fr_FR',NULL,'','',NULL,''),(18,3,'service-s','','Service S','Service S','','
\n\n \n\n
\n
\n
\n
\n
\n
\n
\n
\n
Service S\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n
\n
\n
\n
\n
\nThis is a description page of our service S...
\n
\n
\n
\n
\n
\n
\n\n\n

\n\n \n\n
\n',1,'2019-08-15 00:03:30',NULL,'2019-08-14 22:27:45',NULL,NULL,'page','en_US',NULL,'','',NULL,''),(19,3,'test','','test','Page test','test','Test\n',1,'2019-08-15 00:03:30',NULL,'2019-08-14 22:03:30',NULL,NULL,'page','en_US',NULL,'','',NULL,''); /*!40000 ALTER TABLE `llx_website_page` ENABLE KEYS */; UNLOCK TABLES; @@ -13206,7 +13274,7 @@ CREATE TABLE `tmp_user` ( LOCK TABLES `tmp_user` WRITE; /*!40000 ALTER TABLE `tmp_user` DISABLE KEYS */; -INSERT INTO `tmp_user` VALUES (1,'2012-07-08 13:20:11','2019-11-28 11:52:58',NULL,NULL,'aeinstein',0,NULL,NULL,NULL,1,0,NULL,'11c9c772d6471aa24c27274bdd8a223b',NULL,NULL,'Einstein','Albert','',NULL,'123456789','','','','aeinstein@example.com','','[]','',0,'',1,1,NULL,NULL,NULL,'','2017-10-05 08:32:44','2017-10-03 11:43:50',NULL,'',1,'alberteinstein.jpg',NULL,NULL,14,NULL,NULL,NULL,'','','',NULL,NULL,'aaaaff','',NULL,0,0,NULL,NULL,NULL,44.00000000,'man',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL),(2,'2012-07-08 13:54:48','2019-11-28 11:52:58',NULL,NULL,'demo',1,NULL,NULL,NULL,1,0,NULL,'fe01ce2a7fbac8fafaed7c982a04e229',NULL,NULL,'Doe','David','Trainee',NULL,'09123123','','','','daviddoe@example.com','','[]','',0,'',1,1,NULL,NULL,NULL,'','2018-07-30 23:10:54','2018-07-30 23:04:17',NULL,'',1,'person9.jpeg',NULL,NULL,11,NULL,NULL,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,35.00000000,'man',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL),(3,'2012-07-11 16:18:59','2019-11-28 11:52:58',NULL,NULL,'pcurie',1,NULL,NULL,NULL,1,0,NULL,'ab335b4eb4c3c99334f656e5db9584c9',NULL,NULL,'Curie','Pierre','',NULL,'','','','','pcurie@example.com','','[]','',0,'',1,1,NULL,NULL,2,'','2014-12-21 17:38:55',NULL,NULL,'',1,'pierrecurie.jpg',NULL,NULL,14,NULL,NULL,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,39.00000000,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL),(4,'2015-01-23 17:52:27','2019-11-28 11:52:58',NULL,NULL,'bbookkeeper',1,NULL,NULL,NULL,1,0,NULL,'a7d30b58d647fcf59b7163f9592b1dbb',NULL,NULL,'Bookkeeper','Bob','Bookkeeper',NULL,'','','','','bbookkeeper@example.com','','{\"skype\":\"skypebbookkeeper\"}','',0,'',1,1,17,6,NULL,'','2015-02-25 10:18:41','2015-01-23 17:53:20',NULL,'',1,'person8.jpeg',NULL,NULL,11,NULL,NULL,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,16.00000000,'man',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL),(10,'2017-10-03 11:47:41','2019-11-28 11:52:58',NULL,NULL,'mcurie',1,NULL,NULL,NULL,1,0,NULL,'52cda011808bb282d1d3625ab607a145',NULL,'t3mnkbhs','Curie','Marie','',NULL,'','','','','mcurie@example.com','','[]','',0,NULL,1,1,NULL,NULL,NULL,'',NULL,NULL,NULL,'',1,'mariecurie.jpg',NULL,NULL,14,NULL,NULL,NULL,'','','',NULL,NULL,'ffaaff','',NULL,0,0,NULL,NULL,NULL,44.00000000,'woman',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL),(11,'2017-10-05 09:07:52','2019-11-28 11:52:58',NULL,NULL,'zzeceo',1,NULL,NULL,NULL,1,0,NULL,'92af989c4c3a5140fb5d73eb77a52454',NULL,'cq78nf9m','Zeceo','Zack','President - CEO',NULL,'','','','','zzeceo@example.com','','[]','',0,NULL,1,1,NULL,NULL,NULL,'','2017-10-05 22:48:08','2017-10-05 21:18:46',NULL,'',1,'person4.jpeg',NULL,NULL,NULL,NULL,NULL,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,39.00000000,NULL,NULL,'2019-06-10 00:00:00',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL),(12,'2017-10-05 09:09:46','2019-11-28 11:52:58',NULL,NULL,'admin',0,NULL,NULL,NULL,1,0,NULL,'f6fdffe48c908deb0f4c3bd36c032e72',NULL,'nd6hgbcr','Adminson','Alice','Admin Technical',NULL,'','','','','aadminson@example.com','','[]','Alice - 123',1,NULL,1,1,NULL,NULL,NULL,'','2019-12-19 15:12:33','2019-11-29 12:43:24',NULL,'',1,'person6.jpeg',NULL,NULL,11,NULL,NULL,NULL,'','','',NULL,NULL,'','',NULL,0,0,2700.00000000,NULL,NULL,39.00000000,'woman',NULL,NULL,NULL,NULL,'1985-09-15',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL),(13,'2017-10-05 21:29:35','2019-11-28 11:52:58',NULL,NULL,'ccommercy',1,NULL,NULL,NULL,1,0,NULL,'179858e041af35e8f4c81d68c55fe9da',NULL,'y451ksdv','Commercy','Coraly','Commercial leader',NULL,'','','','','ccommercy@example.com','','[]','',0,NULL,1,1,NULL,NULL,NULL,'',NULL,NULL,NULL,'',1,'person7.jpeg',NULL,NULL,11,NULL,NULL,NULL,'','','',NULL,NULL,'','',NULL,0,0,1890.00000000,NULL,NULL,25.00000000,'woman',NULL,'2018-09-11 00:00:00',NULL,NULL,'1998-12-08',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL),(14,'2017-10-05 21:33:33','2019-11-28 11:52:58',NULL,NULL,'sscientol',1,NULL,NULL,NULL,1,0,NULL,'39bee07ac42f31c98e79cdcd5e5fe4c5',NULL,'s2hp8bxd','Scientol','Sam','Scientist leader',NULL,'','','','','sscientol@example.com','','[]','',0,NULL,1,1,NULL,NULL,NULL,'',NULL,NULL,NULL,'',1,'person3.jpeg',NULL,NULL,11,NULL,NULL,NULL,'','','',NULL,NULL,'','',NULL,0,0,3500.00000000,NULL,NULL,39.00000000,NULL,NULL,'2018-07-03 00:00:00',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL),(16,'2017-10-05 22:47:52','2019-11-28 11:52:58',NULL,NULL,'ccommerson',1,NULL,NULL,NULL,1,0,NULL,'d68005ccf362b82d084551b6291792a3',NULL,'cx9y1dk0','Charle1','Commerson','Sale representative',NULL,'','','','','ccommerson@example.com','','[]','',0,NULL,1,1,NULL,NULL,NULL,'','2017-10-05 23:46:24','2017-10-05 23:37:31',NULL,'',1,'person1.jpeg',NULL,NULL,13,NULL,NULL,NULL,'','','',NULL,NULL,'','',NULL,0,0,2900.00000000,NULL,NULL,39.00000000,NULL,NULL,'2019-09-01 00:00:00',NULL,NULL,'1976-02-05',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL),(17,'2017-10-05 22:48:39','2019-11-28 11:52:58',NULL,NULL,'aleerfok',1,NULL,NULL,NULL,1,0,NULL,'a964065211872fb76f876c6c3e952ea3',NULL,'gw8cb7xj','Leerfok','Amanda','Sale representative',NULL,'','','','','aleerfok@example.com','','[]','',0,NULL,1,1,NULL,NULL,NULL,'','2017-10-05 23:16:06',NULL,NULL,'',0,'person5.jpeg',NULL,NULL,13,NULL,NULL,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,39.00000000,'woman',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL),(18,'2018-01-22 17:27:02','2019-11-28 11:52:58',NULL,NULL,'ldestailleur',1,NULL,NULL,NULL,1,0,NULL,'1bb7805145a7a5066df9e6d585b8b645',NULL,'87g06wbx','Destailleur','Laurent','Project leader of Dolibarr ERP CRM',NULL,'','','','','ldestailleur@example.com','','[]','
Laurent DESTAILLEUR
\r\n\r\n
\r\n
Project Director
\r\nldestailleur@example.com
\r\n\r\n
 
\r\n\r\n\r\n
',0,NULL,1,1,10,10,NULL,'More information on http://www.destailleur.fr','2019-10-04 10:06:40','2017-09-06 11:55:30',NULL,'',1,'ldestailleur_200x200.jpg',NULL,NULL,NULL,NULL,NULL,NULL,'','','',NULL,NULL,'007f7f','',NULL,0,0,NULL,NULL,NULL,NULL,'man',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL),(19,'2017-02-02 03:55:44','2019-11-28 11:52:58',NULL,NULL,'aboston',1,NULL,NULL,NULL,1,0,NULL,'a7a77a5aff2d5fc2f75f2f61507c88d4',NULL,NULL,'Boston','Alex','',NULL,'','','','','aboston@example.com','','[]','Alex Boston
\r\nAdmin support service - 555 01 02 03 04',0,NULL,1,1,NULL,NULL,NULL,'',NULL,NULL,NULL,'',1,'person2.jpeg',NULL,NULL,12,NULL,NULL,25.00000000,'','','',NULL,NULL,'ff00ff','',NULL,0,0,2700.00000000,NULL,NULL,32.00000000,NULL,NULL,'2016-11-04 00:00:00',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL); +INSERT INTO `tmp_user` VALUES (1,'2012-07-08 13:20:11','2019-11-28 11:52:58',NULL,NULL,'aeinstein',0,NULL,NULL,NULL,1,0,NULL,'11c9c772d6471aa24c27274bdd8a223b',NULL,NULL,'Einstein','Albert','',NULL,'123456789','','','','aeinstein@example.com','','[]','',0,'',1,1,NULL,NULL,NULL,'','2017-10-05 08:32:44','2017-10-03 11:43:50',NULL,'',1,'alberteinstein.jpg',NULL,NULL,14,NULL,NULL,NULL,'','','',NULL,NULL,'aaaaff','',NULL,0,0,NULL,NULL,NULL,44.00000000,'man',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL),(2,'2012-07-08 13:54:48','2019-11-28 11:52:58',NULL,NULL,'demo',1,NULL,NULL,NULL,1,0,NULL,'fe01ce2a7fbac8fafaed7c982a04e229',NULL,NULL,'Doe','David','Trainee',NULL,'09123123','','','','daviddoe@example.com','','[]','',0,'',1,1,NULL,NULL,NULL,'','2018-07-30 23:10:54','2018-07-30 23:04:17',NULL,'',1,'person9.jpeg',NULL,NULL,11,NULL,NULL,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,35.00000000,'man',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL),(3,'2012-07-11 16:18:59','2020-01-21 09:30:27',NULL,NULL,'pcurie',1,NULL,NULL,NULL,1,0,NULL,'ab335b4eb4c3c99334f656e5db9584c9',NULL,NULL,'Curie','Pierre','',NULL,'','','','','pcurie@example.com','','[]','',0,'',1,1,NULL,NULL,2,'','2014-12-21 17:38:55',NULL,NULL,'',1,'pierrecurie.jpg',NULL,NULL,14,NULL,NULL,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,39.00000000,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL),(4,'2015-01-23 17:52:27','2019-11-28 11:52:58',NULL,NULL,'bbookkeeper',1,NULL,NULL,NULL,1,0,NULL,'a7d30b58d647fcf59b7163f9592b1dbb',NULL,NULL,'Bookkeeper','Bob','Bookkeeper',NULL,'','','','','bbookkeeper@example.com','','{\"skype\":\"skypebbookkeeper\"}','',0,'',1,1,17,6,NULL,'','2015-02-25 10:18:41','2015-01-23 17:53:20',NULL,'',1,'person8.jpeg',NULL,NULL,11,NULL,NULL,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,16.00000000,'man',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL),(10,'2017-10-03 11:47:41','2019-11-28 11:52:58',NULL,NULL,'mcurie',1,NULL,NULL,NULL,1,0,NULL,'52cda011808bb282d1d3625ab607a145',NULL,'t3mnkbhs','Curie','Marie','',NULL,'','','','','mcurie@example.com','','[]','',0,NULL,1,1,NULL,NULL,NULL,'',NULL,NULL,NULL,'',1,'mariecurie.jpg',NULL,NULL,14,NULL,NULL,NULL,'','','',NULL,NULL,'ffaaff','',NULL,0,0,NULL,NULL,NULL,44.00000000,'woman',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL),(11,'2017-10-05 09:07:52','2019-11-28 11:52:58',NULL,NULL,'zzeceo',1,NULL,NULL,NULL,1,0,NULL,'92af989c4c3a5140fb5d73eb77a52454',NULL,'cq78nf9m','Zeceo','Zack','President - CEO',NULL,'','','','','zzeceo@example.com','','[]','',0,NULL,1,1,NULL,NULL,NULL,'','2017-10-05 22:48:08','2017-10-05 21:18:46',NULL,'',1,'person4.jpeg',NULL,NULL,NULL,NULL,NULL,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,39.00000000,NULL,NULL,'2019-06-10 00:00:00',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL),(12,'2017-10-05 09:09:46','2020-01-07 13:47:17',NULL,NULL,'admin',0,NULL,NULL,NULL,1,0,NULL,'f6fdffe48c908deb0f4c3bd36c032e72',NULL,'nd6hgbcr','Adminson','Alice','Admin Technical',NULL,'','','','','aadminson@example.com','','[]','Alice - 123',1,NULL,1,1,NULL,NULL,NULL,'','2020-01-21 10:38:41','2020-01-21 10:35:27',NULL,'',1,'person6.jpeg',NULL,NULL,11,NULL,NULL,NULL,'','','',NULL,NULL,'','',NULL,0,0,2700.00000000,NULL,NULL,39.00000000,'woman',NULL,NULL,NULL,'generic_user_odt','1985-09-15',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL),(13,'2017-10-05 21:29:35','2019-11-28 11:52:58',NULL,NULL,'ccommercy',1,NULL,NULL,NULL,1,0,NULL,'179858e041af35e8f4c81d68c55fe9da',NULL,'y451ksdv','Commercy','Coraly','Commercial leader',NULL,'','','','','ccommercy@example.com','','[]','',0,NULL,1,1,NULL,NULL,NULL,'',NULL,NULL,NULL,'',1,'person7.jpeg',NULL,NULL,11,NULL,NULL,NULL,'','','',NULL,NULL,'','',NULL,0,0,1890.00000000,NULL,NULL,25.00000000,'woman',NULL,'2018-09-11 00:00:00',NULL,NULL,'1998-12-08',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL),(14,'2017-10-05 21:33:33','2019-11-28 11:52:58',NULL,NULL,'sscientol',1,NULL,NULL,NULL,1,0,NULL,'39bee07ac42f31c98e79cdcd5e5fe4c5',NULL,'s2hp8bxd','Scientol','Sam','Scientist leader',NULL,'','','','','sscientol@example.com','','[]','',0,NULL,1,1,NULL,NULL,NULL,'',NULL,NULL,NULL,'',1,'person3.jpeg',NULL,NULL,11,NULL,NULL,NULL,'','','',NULL,NULL,'','',NULL,0,0,3500.00000000,NULL,NULL,39.00000000,NULL,NULL,'2018-07-03 00:00:00',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL),(16,'2017-10-05 22:47:52','2019-11-28 11:52:58',NULL,NULL,'ccommerson',1,NULL,NULL,NULL,1,0,NULL,'d68005ccf362b82d084551b6291792a3',NULL,'cx9y1dk0','Charle1','Commerson','Sale representative',NULL,'','','','','ccommerson@example.com','','[]','',0,NULL,1,1,NULL,NULL,NULL,'','2017-10-05 23:46:24','2017-10-05 23:37:31',NULL,'',1,'person1.jpeg',NULL,NULL,13,NULL,NULL,NULL,'','','',NULL,NULL,'','',NULL,0,0,2900.00000000,NULL,NULL,39.00000000,NULL,NULL,'2019-09-01 00:00:00',NULL,NULL,'1976-02-05',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL),(17,'2017-10-05 22:48:39','2019-11-28 11:52:58',NULL,NULL,'aleerfok',1,NULL,NULL,NULL,1,0,NULL,'a964065211872fb76f876c6c3e952ea3',NULL,'gw8cb7xj','Leerfok','Amanda','Sale representative',NULL,'','','','','aleerfok@example.com','','[]','',0,NULL,1,1,NULL,NULL,NULL,'','2017-10-05 23:16:06',NULL,NULL,'',0,'person5.jpeg',NULL,NULL,13,NULL,NULL,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,39.00000000,'woman',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL),(18,'2018-01-22 17:27:02','2019-11-28 11:52:58',NULL,NULL,'ldestailleur',1,NULL,NULL,NULL,1,0,NULL,'1bb7805145a7a5066df9e6d585b8b645',NULL,'87g06wbx','Destailleur','Laurent','Project leader of Dolibarr ERP CRM',NULL,'','','','','ldestailleur@example.com','','[]','
Laurent DESTAILLEUR
\r\n\r\n
\r\n
Project Director
\r\nldestailleur@example.com
\r\n\r\n
 
\r\n\r\n\r\n
',0,NULL,1,1,10,10,NULL,'More information on http://www.destailleur.fr','2019-10-04 10:06:40','2017-09-06 11:55:30',NULL,'',1,'ldestailleur_200x200.jpg',NULL,NULL,NULL,NULL,NULL,NULL,'','','',NULL,NULL,'007f7f','',NULL,0,0,NULL,NULL,NULL,NULL,'man',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL),(19,'2017-02-02 03:55:44','2020-01-16 15:44:42',NULL,NULL,'aboston',1,NULL,NULL,NULL,1,0,NULL,'a7a77a5aff2d5fc2f75f2f61507c88d4',NULL,NULL,'Boston','Alex','',NULL,'','','','','aboston@example.com','','[]','Alex Boston
\r\nAdmin support service - 555 01 02 03 04',0,NULL,1,1,NULL,NULL,NULL,'',NULL,NULL,NULL,'',0,'person2.jpeg',NULL,NULL,12,NULL,NULL,25.00000000,'','','',NULL,NULL,'ff00ff','',NULL,0,0,2700.00000000,NULL,NULL,32.00000000,NULL,NULL,'2016-11-04 00:00:00',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,-1,NULL,NULL); /*!40000 ALTER TABLE `tmp_user` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; @@ -13219,4 +13287,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2019-12-21 17:47:48 +-- Dump completed on 2020-01-21 11:32:00 From a3a3835c764c9cbd89c166b3c2cb73aaf6b2fbf0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 21 Jan 2020 12:19:39 +0100 Subject: [PATCH 101/230] Fix fatal error --- htdocs/core/modules/modFournisseur.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/modFournisseur.class.php b/htdocs/core/modules/modFournisseur.class.php index 9b527fe7678..2042e8b35da 100644 --- a/htdocs/core/modules/modFournisseur.class.php +++ b/htdocs/core/modules/modFournisseur.class.php @@ -633,7 +633,7 @@ class modFournisseur extends DolibarrModules */ public function init($options = '') { - global $conf; + global $conf, $langs; $this->remove($options); From 49e875aa96338773134b0f59d7366d5987b3a5a9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 21 Jan 2020 12:19:39 +0100 Subject: [PATCH 102/230] Fix fatal error --- htdocs/core/modules/modFournisseur.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/modFournisseur.class.php b/htdocs/core/modules/modFournisseur.class.php index 9b527fe7678..2042e8b35da 100644 --- a/htdocs/core/modules/modFournisseur.class.php +++ b/htdocs/core/modules/modFournisseur.class.php @@ -633,7 +633,7 @@ class modFournisseur extends DolibarrModules */ public function init($options = '') { - global $conf; + global $conf, $langs; $this->remove($options); From ca3e6ff60c79751f09a1c296ca71178b96b1109b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 21 Jan 2020 12:46:28 +0100 Subject: [PATCH 103/230] Doc --- htdocs/core/modules/modMrp.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/modMrp.class.php b/htdocs/core/modules/modMrp.class.php index d4d9d9c5140..20c45dfe59b 100644 --- a/htdocs/core/modules/modMrp.class.php +++ b/htdocs/core/modules/modMrp.class.php @@ -45,7 +45,7 @@ class modMrp extends DolibarrModules // Id for module (must be unique). // Use here a free id (See in Home -> System information -> Dolibarr for list of used modules id). - $this->numero = 660; // TODO Go on page https://wiki.dolibarr.org/index.php/List_of_modules_id to reserve an id number for your module + $this->numero = 660; // Key text used to identify module (for permissions, menus, etc...) $this->rights_class = 'mrp'; // Family can be 'base' (core modules),'crm','financial','hr','projects','products','ecm','technic' (transverse modules),'interface' (link with external tools),'other','...' From 4773c81ae1249a5c878d0570e7f7aeb91417db74 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 21 Jan 2020 13:01:49 +0100 Subject: [PATCH 104/230] Fix demo profiles --- htdocs/public/demo/index.php | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/htdocs/public/demo/index.php b/htdocs/public/demo/index.php index 8a20432b1ba..d4b24579446 100644 --- a/htdocs/public/demo/index.php +++ b/htdocs/public/demo/index.php @@ -68,16 +68,11 @@ if (empty($reshook)) { $demoprofiles=array( array('default'=>'1', 'key'=>'profdemoservonly','label'=>'DemoCompanyServiceOnly', - 'disablemodules'=>'adherent,barcode,cashdesk,don,expedition,externalsite,ftp,incoterm,mailmanspip,margin,prelevement,product,productbatch,stock', + 'disablemodules'=>'adherent,barcode,bom,cashdesk,don,expedition,externalsite,ftp,incoterm,mailmanspip,margin,mrp,prelevement,product,productbatch,stock,takepos', //'icon'=>DOL_URL_ROOT.'/public/demo/dolibarr_screenshot8.png', 'icon'=>DOL_URL_ROOT.'/public/demo/demo-profile-service.jpg', 'url'=>$url ), - array('default'=>'-1','key'=>'profdemoshopwithdesk','label'=>'DemoCompanyShopWithCashDesk', - 'disablemodules'=>'adherent,don,externalsite,ficheinter,ftp,incoterm,mailmanspip,prelevement,product,productbatch,stock', - 'icon'=>DOL_URL_ROOT.'/public/demo/dolibarr_screenshot2.png', - 'url'=>$url - ), array('default'=>'0', 'key'=>'profdemoprodstock','label'=>'DemoCompanyProductAndStocks', 'disablemodules'=>'adherent,contrat,don,externalsite,ficheinter,ftp,mailmanspip,prelevement,service', //'icon'=>DOL_URL_ROOT.'/public/demo/dolibarr_screenshot2.png', @@ -85,12 +80,12 @@ if (empty($reshook)) 'url'=>$url ), array('default'=>'-1', 'key'=>'profdemofun','label'=>'DemoFundation', - 'disablemodules'=>'banque,barcode,cashdesk,commande,commercial,compta,comptabilite,contrat,expedition,externalsite,ficheinter,ftp,incoterm,mailmanspip,margin,prelevement,product,productbatch,projet,propal,propale,service,societe,stock,tax', + 'disablemodules'=>'banque,barcode,bom,cashdesk,commande,commercial,compta,comptabilite,contrat,expedition,externalsite,ficheinter,ftp,incoterm,mailmanspip,margin,mrp,prelevement,product,productbatch,projet,propal,propale,service,societe,stock,tax,takepos', 'icon'=>DOL_URL_ROOT.'/public/demo/dolibarr_screenshot6.png', 'url'=>$url ), array('default'=>'0', 'key'=>'profdemofun2','label'=>'DemoFundation2', - 'disablemodules'=>'barcode,cashdesk,commande,commercial,compta,comptabilite,contrat,expedition,externalsite,ficheinter,ftp,incoterm,mailmanspip,margin,prelevement,product,productbatch,projet,propal,propale,service,societe,stock,tax', + 'disablemodules'=>'barcode,cashdesk,bom,commande,commercial,compta,comptabilite,contrat,expedition,externalsite,ficheinter,ftp,incoterm,mailmanspip,margin,mrp,prelevement,product,productbatch,projet,propal,propale,service,societe,stock,tax,takepos', //'icon'=>DOL_URL_ROOT.'/public/demo/dolibarr_screenshot6.png', 'icon'=>DOL_URL_ROOT.'/public/demo/demo-profile-foundation.jpg', 'url'=>$url @@ -112,7 +107,7 @@ if (empty($reshook)) 'mailmanspip','notification','oauth','syslog','user','webservices','workflow', // Extended modules 'memcached','numberwords','zipautofillfr'); - $alwayshiddenuncheckedmodules=array('debugbar','emailcollector','ftp','hrm','modulebuilder','webservicesclient','websites', + $alwayshiddenuncheckedmodules=array('dav','debugbar','emailcollector','ftp','hrm','modulebuilder','printing','webservicesclient', // Extended modules 'awstats','bittorrent','bootstrap','cabinetmed','cmcic','concatpdf','customfield','deplacement','dolicloud','filemanager','lightbox','mantis','monitoring','moretemplates','multicompany','nltechno','numberingpack','openstreetmap', 'ovh','phenix','phpsysinfo','pibarcode','postnuke','selectbank','skincoloreditor','submiteverywhere','survey','thomsonphonebook','topten','tvacerfa','voyage','webcalendar','webmail'); From 6d50cc189965e17fd1cd2ec3aeaf7cf0f55dc95a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 21 Jan 2020 13:25:38 +0100 Subject: [PATCH 105/230] Update demo profiles --- htdocs/langs/en_US/other.lang | 3 ++- htdocs/public/demo/demo-profile-health.jpg | Bin 0 -> 29432 bytes .../public/demo/demo-profile-manufacturing.jpg | Bin 0 -> 17278 bytes htdocs/public/demo/dolibarr_screenshot2.png | Bin 6431 -> 0 bytes htdocs/public/demo/dolibarr_screenshot6.png | Bin 4910 -> 0 bytes htdocs/public/demo/dolibarr_screenshot8.png | Bin 5574 -> 0 bytes htdocs/public/demo/dolibarr_screenshot9.png | Bin 5729 -> 0 bytes htdocs/public/demo/index.php | 14 +++++++------- 8 files changed, 9 insertions(+), 8 deletions(-) create mode 100644 htdocs/public/demo/demo-profile-health.jpg create mode 100644 htdocs/public/demo/demo-profile-manufacturing.jpg delete mode 100644 htdocs/public/demo/dolibarr_screenshot2.png delete mode 100644 htdocs/public/demo/dolibarr_screenshot6.png delete mode 100644 htdocs/public/demo/dolibarr_screenshot8.png delete mode 100644 htdocs/public/demo/dolibarr_screenshot9.png diff --git a/htdocs/langs/en_US/other.lang b/htdocs/langs/en_US/other.lang index 052b1b25859..640199588ab 100644 --- a/htdocs/langs/en_US/other.lang +++ b/htdocs/langs/en_US/other.lang @@ -104,7 +104,8 @@ DemoFundation=Manage members of a foundation DemoFundation2=Manage members and bank account of a foundation DemoCompanyServiceOnly=Company or freelance selling service only DemoCompanyShopWithCashDesk=Manage a shop with a cash desk -DemoCompanyProductAndStocks=Company selling products with a shop +DemoCompanyProductAndStocks=Shop selling products with Point Of Sales +DemoCompanyManufacturing=Company manufacturing products DemoCompanyAll=Company with multiple activities (all main modules) CreatedBy=Created by %s ModifiedBy=Modified by %s diff --git a/htdocs/public/demo/demo-profile-health.jpg b/htdocs/public/demo/demo-profile-health.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b08e2a52553f96adbcff93a83d67b269cfb459c4 GIT binary patch literal 29432 zcmeEuWprG-(q)?=W@d_+nVFfHnb|Qr#+aFznb|SL?3kIE?UDR^AO#p(VsDvm0=uN1Br~!c26@U-`925*33=|w33>*Ri z911_2!f0|Ole4GjyI1Ro3gJq{Wg0X4yUQZfok3QT+&dKz+i5^@Ui zpGJTnARwS2p^>4Xk;$>pu*mf2mnR|0zm|N?E_!~fB?WCKtO>1 z3J?hJTYVwkK#ZT4@f!vJ0tN+nT?W8_ywMOq5C8z6?>Yaa{{PhfgBAb+;{QLDLeS+8 zNsOc}{*OASDHs7n5(NEjPFhfNE$#oLhoER^Y6?UU5YM*dFh$n7!DhJoPpVd!nEw34 z2o6Or?gw-4Ru+;cKaZvSgECN+Iurl^V>N2D@YN`P`8<94czp67bVXS-VgSAppa=p5 z^T!O)M^T^&wLd?g42>R`)xvK^S;H0GB5Jgh_Z@+iHeJLvT@gmY96e1K-Ev2eow0|a{ z$8lR@Q)7t(kbzr|B$j?=O|d5$tG8ex0R(*s4vQv#X8j_8j;+D{h0&`-H%X>*BzE^cNwesnZW@;-RQ(bJQ&AM05HzX`I+^L zD7t%8y5zq{DLKq^qW_uCK}K4Y%)}@i3IISd$^KCppaMrKPx#Oc4rVdI6Wj1JkKK&NmWh!VSO5@KC%Z-PGwVMBB=EH~Y*0H4PGJem zwAE^5E`ACV001u?sbn;A+o4@DhtvQdEu0lZtA!P5+Jd_60RV2&Yb62*9PHCu7kAB63y>}XK;pHRTwq|CS2PF+D!NW_5&oovm1n5xI}EGk*&rE9 zfT9*fy5v^?09*6zO(|HVHF>}S0;yA61b?ys%y2-dev#_x#zZof72m}2008$X4Jn1H z^mn8bK$g<5y;Dek55b7QfC#MrxW1mx6`J^spla<(zD3yG~51- z1wk;QApwd(3kEgDIe^iAXF9caaxel|W}9_VoSs97F>EgKtFg;uD)`&Xg2R}YmO>n3 zsBDo=A{#(ogz89zlU+L*TQxGNA^tLZQx6;WRGC6$x^&ywBuVk9U4ef4WygdSBTIxye2MYZ{=nf+_NPUgbc%YjiYDKw~_d@}ad(HzJe% z54NL>NkU*aRdSZ&OqF$&stO%Zqw#r0{0L63^b#!-msy$C$r2R}BO`Hu_H_9CY+XHD zelhg#HXsNVG{m(nOZL(Zr&-atD3UdJKB<|F%G&a@hqQ&eKMO*H%6`#p+3ASRiE%5ZOOqVvQ>0R=d(x|3bBTj}H zQ9s$E+b`B#^%(s*{}No^CP+jY(bkSgMHYS`agOqLmV%CSDzGG@?NFhs<}s*%jn}`r zyG7bzACf>l$Tx72nqD4ViwgOzCcyc@8vJ2ZEV2%D)-;1ULe1&>!Z_Dnqcbg!eY2U@ zQ|ZM7_^iCXI;z4IOAz4i8mvj?tkwUx8mt4nPbrCCYe(2%6B_~qcvAf&9L9-D(zz>| zvm$n@%O!YSJUzAAx#nf|Cnc^IXU=oBwyH~>D^ghbxmx(ISZ0L9 z7-7vNIF9+>4wh`l2`jr_r#Ql7+A?m@n1s zyf4Jo|F4y|Rl!`9hy*xk>1Q0n?Y-eKw^LmIyc%;{;Fb6 zJ~YnmRoxS3^B_o;*WzvLEbFm;P2%CuZ<7sBg~O4ww|(NBO;U2<98#%eg(H)wz9rjBFep91oS1dgJD}!PDR71z4q6MI%(z2oI;Bq{~E!e!VK7BF7R# zMGL$r?(R(Of;lFhPsWDE#-_@SaxgAYv6F1@oE}Ef2idH=;cBU=09E&pRh_U!sSy~z z#qh3Q8V436T?jZ|{6q{Pp0W!Q8~nz3B!swNKbwhnP}MC!e}-)&YU&zfZLY{vKLGWB zjFS!RiH?Sm#OaUK>^{!-u9AYB#Yh2-q-3;|1Z=T9KZ%LA0mC$#Wqqth|9JAz{2&8s zHtJN@)L5J#ARPrgd9EsZ2BJ0r8e)=g;>rB5GfrD)< z;t%X*kv(iMh64CPf&xR*M>A=s>}LzmfrGR7g=+Z4QbB3dA{m<+Hy5M_P5#1tk2OQd zKs?yIOpF8|00s~!gCH2bc_CF)l#~n=;@ZPE~a;d$X@{mAaw$2RMnV|PYB{L)72wBx4}up}!6e3$6m$An>lxBR z#7YLZNi|cJ8s29UVr6Pj1JZZ%D5eD{@aYu*a23kHiZ~TDqdBK)(Gpyo8?oFAY{+@k zOy$Jy!ad0(u=J{SguNLK-?=`!OS64xvtw?p;-3JTWkN$6HVX>ZJ^Y3 z8LX^l<|GuP^hG*5FKgGRZYjUMhYN|&q|pe99sFe!w$70ncJa-D4=uwX+*b;=XjF@= zTxG45nT8+J(bBj@Y<6~`?}=0~*0QBmzph2xWVn1@gI6RwaSihnN@u2xwAFZ%odn53 z^iun6KybOvl394IIv#e?UW=_(tVgwaw(486@mL-pxz#V>pxZ!x4Tt8CS9I!=7elWs zAv|W|Z)?2ofD0CnjAF^($caX!U&p#;fol3(e9Axo1~|FUrnurcVC0akPqA z#bfzn?-Hrg=;H*GIxu&>m$^cw1$l7* zIJjU^``aSM2BP`B2zwD1H;z5E)L0$u+f9Ir%<4x&aCB)cJ}YZxPeU8L^0oC=;3vV@ zR9UC;!2x4qVMqtGJst57pH+(-6cY>@?@TnREP1Ms2AJ>`nr_Z)oR(D6 zapCMOlV-5Kmg3j4ENu!B%HWAu_hEVL7!@$QnIIi$Bg#-dAmuZ0NI#x33N)d`VLnLN zBQ#)Z$p3`KTD)TE9E#KF9=w8F2RXR% zCR_ipq)X}H0OLoF#TKWc*_vCttT`N;$Z~nUl}6BW^C&ra6u`7Br3bKvC0Gd?W}VU-;VMR< zUV**exm0I0{hZ_zodoy6#=z`kz1=L%`qorsZQ$S(ZlxaRi!$&DomPU-5G|L(l@{wq zEim}%i=3Tlt1X2JIgKQtIASkd-GiazmN#sZy&1B`DBJx;FYh{JBdDn<=;wtDDU3%& zw5xC7m$6ag`w`@7Z%U54=pNspKl_EDUjsyB9zhl`yWp|Y1jDS|9-~Z;JzXI;jjbSy z%c|CNEMb3epsA`Rk{;y;EJAl%PT;RH>)#Q-R5@Z(7(_m*Wbb^LC{UWua8l64_xw_z zp=q(C6E%T^Xp5$*#K%JTvR3&NS64=Om%FD13ax?5P{R;T1CU(pr8LA>m)g*)! zW`6+>LsqL_k{Sh0pi>W(4-uiWbLr@1G(&ML`G9^4!Ieq&Y3!Th zW)$T1@@(+XuGQAyVZvj<2Rys$&U!L}8?2|N2aMRYHB?ou5ae7>m9$T~NFyD?{x*uD z&-?R1zOozq5HW!R`$?%aiEF+0jQg~w)$XYxS2va$PQsHOulb;Z(>>y``kA_z>s<=+ zz7ZHJ6!wla{QM!Mn7-H=9GG}R_m8|e(SzMQ#t0fpY;e}52l-1gY;A2{PKgYCdv8$K>8i_px)xJuJ;p&LH_HBwE^)CHNyaLPVm2Yp2bU zju;yTMka=Q_~O@#K?uq>wEb%V;#^@%jMdw60;Pj)zpgHR1LT2Ty2u}A1jxE#>A z+`g5k$laK+O^UPRSa%^@2=PEz?ezx^^}A3OI5_#p`3aY-{hN3(vkz=qT<*|rvSNnQ z!C&Ok*j(^4Co)T%C0W}Ef-&%0I*9C&bBBH0X5=?-g-ws;?`PkKHE?FCVOoi=RJg}z zW`0RGg0645I{j$HAdMooMzZr`1R7UW)W|{rj-k!!S*Wcu_ejs>t)jLdxdtUSd<0{+bs9g^48}wy-A=_B>|VoG8L$=^b9|2X9%>|achxBV zp_^TpVL{Jk40npU&*xp}&BI#=U2mD}(702yVX>U%kAvaT*(-N(gTkv?l>61re5H=* zuGvL*S{pmu%A~5AOLa+zCCVs0PxHHb_I;-6Ny6D&Eo!r=-HMaUXP)IrF`c_0Qe4hp zx-=Eb|$284eTQ-#_ex&?vTQEXuJ4OR08Z3Oe0sG*9 zENKa8Z?Sy-&TRXe$G{JJ0XR5KCGXwSa@8^$r5OuO=r(Z~Y*9&C47^uBXwBM`kGvCc zeg3o!i`n)Z^S}Zp&u498h!0GWO%MY7P*(Z_@0H|t-e%cP^%s{E-=e?Q_~YO;jD`&+ zTn5Dk%d)mKJ3jfZLW9t`wttUpEE7VODdm!~+OpfhB?K>~*~n|LgEK#@IAN2wXR0YG z%I#sZ@%dDHaY?CXA<8_9utk)+oE|R<(e`D|Hv}HW(d|hmCd)@oa>kv$NleU*Y^)^~ z9qpw=vr)*Qfh-L(ea87pL{&$zcNT6HD=ir7Y{UyUJ2+Iyn>C0c$DdN9s9i#B%}LdM za+Oss#)Ve)+4)_6orU#=_kuY|WStO9bgH!MohJh8Mu*i9ZNZak`m}1U-l2^})R<{e zZhzF`IfU8Pw(|OdPrs0#oTkuV>Hr9|XhX}~@*FWz3~_2;(@rmSorVcg$Sa`OXv5>+ zVH$Zfw2gY`nyFr{sS}U7!Eiz-I$|G213y^p7*p24s5zUeP;L>pH zn<<>luRl&NSYH8nV5oFEC0sOHiEGx{4GV+)s6DeikbD_FzKR)CN==oTmz;Y=zF&tL zYQI+mZm3@tPByG)hHoW>=6XjFM@Yf&*)-j*L_59b00QO2l9G0Whz7F$F_@qoDtlJ! zz3%`?O@s&?kxt5&u9Sf>B$SPNI2vcJ{D^2`*-}ev5F75?QB~o{8(DOc#D(?IV&+B^ zj5J0>bQfse(mO{0loM!K(~)nZ#)-1$=M`Vz!aje(Gjz zgo=`(P2E$%IMsT&-N@(Wx$WkpB5yQj-NfOWZd}viD&C|&E@}tg{e%^96Zn3a*WuK-yuZN^M$=h0-#GhDkFtCiTa z4~U}st!$v2R9-&kQKdZjX9Ek7hqHn#rj|?Z-CVVZDH`z(9Fr*^FPbVGItCn<>MXCA zsOO6|c!Tk2qj5jB(1eN6upQS=E5r4&k=eL?bev^>N{Xy}1$diYZA>a>O@2n)GAe%e z?i~(&ZC@ab6>34&X-K~$qk8O@V1;)p1@=P%-%dSt8=;TL1Gu3u!Rw*F8+K%l9EN?D zPX)DMzrE~z_s(2P6%7p$@{<@$1vP3-(bpzg&BZ2~5Eh_=x7B`4Q)Nl5;{pxjq#>;O zo4mjWzDe}$E8xwwc#rtgwEzMA%d7ay<#=-~5cLT`d}9!h82IgTYX0&i-VQL2H*`TzvPoUXr&1OGI>b#GdXg+Q7P_0?CdALi2C=dE%=Z+_34p928~4gv-N z_HVxjkr0W1K>-wjh+e?J0hv+WFZR8lqM>80er`7klYiU=7_*Sm)Yc`xl6}tA|2RV6 zd~c4>WI1pRRrKaF3x;uDN?$qsn#Gc&o?qQ6L~VUVS(_AL!FDRbCWG$iDV(0~NrbBc zk8^Yi;sZM-+{GNcI9jC?r#DO=?S(e&u-w(W z!LNF~#`nXsgAkK$+soUt@vvJ0Cwfk!d5*L9+LOW0Nl~6DMWljZSA$5v_u9xvmd#sG{QxV@bs7D32m*{SG@wNgW^+LaZ%?*1*}U0mC%o4?Pzl$SSUB6{F7hz>V#iPVq2X;ukxURX zAVwJvI$SBwzq?64lpWJJ3*?HT$gK;q%5g_d&jgexvkISoHgz9PpN6JkkG#3Q$Pzq$ z|5R-73dn6gzs9}S{>n9l@PTW|erJn#oyG+`{LU?Nf0BzUN&Q`Bgnun+VRfnlL|JxO zO0PrekdawlUm5!ic@yiXf9pP5FpU!- zy-UqJ5S8GquGM9N_r{|aDk{BP)Awf0@gJ3gs{=L0H!+XhFt(9F`WiLZag=Ucvof7C z9Ycex3<@etrc{(Ptc&4;Nn{*t%XHJfp`=l48Lx6z-OCnpj@ZPmC)K#(jeYW4-z(42 zKn*Kxr)!;5v6esK~pms@wz zlLL>Fe3t#KEw@uacdmam5G7@DYD7(u7Po6}YkH&Rs-yebHmVpNE|v*dj-= zU9B$YD|~`wI0~!b6q?x&CzYw_>*}-f7yZt*w#UTIa4RiWN1y88HhX~*DuW#DAa5N_ z`N8oW4kZT~JDfTBd;e|?UR@m7+xFu7xdNC)*so4)QiaycsZsCDzgt1j!E)`~;_4~0 zfjal%lWPPDHD~2JeBowTW1IMXEBGU`ik1m{oKfAfi;|~z%=>zlLO7S5okI9_{c~{; z?)6LOj7pFJYg9o=L@j7gtIk|wz5tb#uw8uenfSN8PX^N^NngIcw*)CEL+jQuQ2GF_ zizUW$-0?-0fX_(E3TA+$;G>zAho!0T62*pR%uI@Gr33#!M(}WnrkIT zoDYwtvJh+MT{tV8V!xq^8VYDJtz`vo877TafIlhD?j)GVC@R!DQ&~k%aVp@F4VCCT z+B2rO8vOOYwd$-Z_H(ldN4rlh;ptB*m>81n&n^m$$wsibH~YAg zxy_BcMhCucoZ-ZlI$lmxZC`vrUru|IxOQoDIJ~fecMK7>d22El1$dH zO2>_{E|E8yy)p`^|eGS@1TAs8&O;OHc_j!~Aua`T*OoDT?2 zq^eJs=EBH>V}HucD<@NX!3G&E1ET$tXfxDP)fmz|dz!2`NB6cDZ~+^ri{vzBPp3&9 zP9C7a%fP(J&pb)B49{UtSr9~YDY{2x z)N*rbeqchrLrL*mAfb6~UTyABSsLUUf()B7leHX;B7rDln?`9CyP4ykE82jGl~PVL zO*}N*DB3sl#&5d%`&Be-De@z}Rip(dZ*}?ID>{qoAR!IBH;CTo230N z9TV$GHi^}g#G(U#QJ`7O(^1MRAW=v#6C4j)*0a@KlZs>cMov@Qq0Z){?R~f8TpXB5 z+O($hZtoo=rEeyrKn2k|nZkVZ9wX`wC5(;GcWeD$kU4d;{jn#$pdp^Mk6MCoD+ypE zvZAvELVsArmwB3PM&0rM18T&6ks)Ni8K;5~wliA*zx*m!nZuTXItHvu6)G6jhd>*PvOgRJ|W zPpJpfU|bsH$eN#VBi8#*jeHZT$n4Kuw=8@NoaoY|6W}BMOc>m1e-te2QQF3WkbLLV z-y2L2&ZQoUF%v$_kOyyp3=}g5B4`m4$|n3>5Me7E76m|laVq}h8c$pVSk@pu{X6NG zMypRfcQK!?x4(QckC_?S!M0(_5uB5*ov`159CogqaG)>Vgh)KJHDyq@$6-+1(K|j#oA6aD<c4GhwiuhZCJH{W(x%e z)+GED06ZUTxHmdFen(iHN%s;LlRMk|qjEKYKW7<>?}Aeno%Y6WDbuVp6S7)<)H%Et z(HT8LNoky>I+1VFUd6*-hVUjmId_&rME~t{q^iAdW_D6^wXMbPVLk8_;H!V;th>Q8 ziB7pFbXjpPR{a9}%#skJ5?pR~~iNPfrzj@f`~N=`TGPm<*TlXIe6MPU}1WiM?$`$H2- zHbT`|$nlPE`8hd2_dSi{IixpeoFe}sXLkAY881R|&yy4yMU0ch^?mVfUlX?* zq&FI_AS67p-5dy5#Fx5TyKZ|YT0L-T^?H&TP=*#h%;Fq%Drd$wJsLBMADTOLy5Sou z9S9O%shcm*SzNt+NQ@l%@gq}7o4sph*}!At)PwOR2GO)T%n_}=$-_HPlw5BTj; z-G)GKvLvd8eD5z>r6%P7o#3>{ZAqTEriQDAg7jw78M$?VZgn!$=E%5&U1RRs#gO~b zLv6A{&Hz?CmUHQ^A%(bb?F!tHVTd20ca+HEdPqH7%*qt7oxk_2j)O!@LDeiYquDZ^ z>CpKEFg^y$@!9KIgwi@<|r4EaIghYVh zHYvd)&48(4Jm+V;!U>GMY7ZNJkI+)x=yqb*fqED*dQU00%Hx_bL=&F{{M@l-k+rJy=6U&XYWIgCf9w-6xM&%TTK4w5+sq7DVrLge_Q zKaO!doqfAa8bUvV7mp-XEj>c@an2kaNSHSuQy3}Mw?ZyQ@ceX)+f?an($4g~83bNG z@T=|@%2p|H#=VhbT2*N$?PA9Ed+)M5mbtY>TqPMe*b#Vyp;Nkk7`VpaXAT)CeN{+K z=^ue3rj6@LG?Aw0@hLmx$=q!Owe#A@au9Y$RwlM*hIHxbJQlW0YIqh^+d2uop!bxZ z{u(FCdKK&=V_5B>3bqTZAUPcP<;yg1-`eGJYcHRagqaG~BU7xv{OJ+~bj-497>1vk zp$<#k!Lj{%jv%X8u|^3)^<$h#Qn`A-Q_KXc4Ke$0SYa!ih|#KYen6Ihhj&zGA9J!B zVvw|m>?b;HDo@FmCoBwOy$k3IplB!%Ug~Qtx`SD5Cb^0whFX>WjLX?Lvfga~?YDs7 zD~{NDbdH0l)zeI@@0+R2r)m4X?gd<5Gl6;cx^rFlX|sGPm5SR6XyZYfg%^uVP@gIg zWyxcsk6zj!?a*APRx!V2oyfa!C?)FA{G3+1IR!2G0plFmvF4ItMdxKbW*di^dg03YPcwO+gkM{l4$3|svQ*C|h+SV46vCKTF`Z_A9(v`ozTu}E{eD{qJV{XvmACn7Vbg+=F#bNxV_{I=|N08Y1pc>+~?TW9vaAr^a|? z#}z>hk+`eY6DsVd#IE5vs{&?_z{{4Ho8(Y|OcK=vRG%8xny?*(APw6@w?nR+)$h(> zszitI6(UxM*5{gt?Opk?+FQs4$br-m_NEgjo)-9n6d*5}m~oLb)qG6CQ)qCXdpgk3 zv|B>l4GE$W!$VRg%;=8rtLkp6midwN-;bjOT~~cPYX`>0tFPRd2zJ$De+7u!GP`-i zy{K}FnkbR6A2F{ZI_@nZ#|#)W6yoGHh!&ADR7WUkUM4?o3>+tyP%Rtb!Gnh?tnz5{ z?pX7(yK$p0NYQ1`6JsaRMPCT{p7(M{axH!0Fg6@DxymSW8E!YxQcdqklSEG2%AV(x zjTcyUV~7TiVr)AFGO<5qsaO2S-)A?qCHMlP6R$B;F{V_GjEKdu4v<$^oI&k~p7;1P zwQSUF)Sbu2abj=Si=nB+JGX=GBVE*2SRD%s9H9WkFLP4cQ(>s;BEE?VoY3v2xE1y8 zWYI@G5Oz2XZU&9cAUCV3M z@(6MU`;NMa-kp#i4MGjolq;V7!P1-`t-cALpV}vgdIT#3dnSsD&2haHQ}ocZn1EB5 z3EF@l*W7LV-L50)p79i^y=75|h{7e6E%zVpxPf>iptt(Di$^+SUTTE{5{KS{j9ZZW zLCb@+Fa`W`i51$QrP{bS0jcE!dF@5<(ZZv! z8XxkyThBj`tg_yDN$Fq&3E>nKX|!Y!2r5~qt*1#`Upj{KU?MHeaRx||kQRgSCsL|r zkVZ|(mAD|17Z1=K-?~Rvsyn#ZXr%L`kCC(2bV~5U=h{JOV>X%Xv-_HUz_1G`lr2n_ zJ2pR+ik~>U(5x|u$!fn3I$Jsgj#=L=S?&4KUPNr0ytBDQAi1T))yg?S6aXnD^nuH} zbb}w#!41#!V!`;wOWq4*l)K$7Ii;>X?*67TpD&-@drgPe%0mGMG$Fe~%8AeP9 zVk1ju2F0PnDK(e7WXP8ZVrB0}qf<(=@3H+TB+}?A-xELnaKXrH#`QDQx!3dBPj<}D zeFZS`EyB;brr|FYC^@^sz;llfHPbq1dEQ(mq^nWI$d0)W=uwaonB$JN=17CJiS`p3 zGJSkkb~l}SU*2WE>CoujvrV20Rg1;5QR>2``y+^22CinOhFY|2tL^kfP<+3w<5|Ei zxx(xTz?>&(qN|=VxdnsC|8cAz6K4s_Vvj*Pj83t)qq^0j&=**ET#g_j2E)oZXrbgB zs4ZfxTfniJ!M^*XK2G^m&qaO&GPf(DnS(tl(bAB7JNR8dY4FXlV6QA4aN#r-HqegR zH9Qo?MXxxA(W+0){4Fp3Nv?w{ft3YM^Mn64c!ORvhj9>aq}ZqP$QUEpGV>n?RE}7P zbjzGk(VunpAfWXvayeKz6}}{ib4-Asdupqd*(yd<<1A7pTn9ccnY;fORsY0Z^N>gW z1jg0=lBsbNl%ZZIGJGpZChSEQCdw_g$J8;uv#p)I*-f)=bUyv@CV?S=^^ja4GP>ZH zpfMqwu6VsBS}6BxT_fiGi&2@9rq^N(D`~>vw}JJr_R9lUE`mdwCJ-uyN>{zX{XT?z z!^J!90}mrE$4x>!@OxEm5ghqUWFOh%=IsH$g-0l#7_%@j@#{(xp<%z!8qO=DW3Y9n zt4HaN`0k>Zvfkj=+QbKGsSvW?12+RH+T%j7-Z5@4j?XjC58yls2UJy+uxvk$+l{f5 z3|<*rf1^^VbM%Yo{&IHU-wTmwbG2_lFP3)AV@9>S{|d1BbYi-G!|KU|qR`*9n_R4e zKjX>g=3ts)G07e91n$OcuT&rwoAmD6IjH`5w4hbrU{*~f{Il}>;q?bO)WImDH74Ak z&j(dglmq^Anx-Xv-91N7)!V>Ww_FcFB>tS69)h9CAXU9*aefTau-b8TDrKrv1@D>) zrXqKW(Ueop8ji!llThq6N}-o_O>PX-M+ZJw;vtRdd(mbX0AD z&q;nCf&yaL&}P8yKXyYdGvnxQ>xKjq;OPzJINi9@&vlb>9#f;{2KxrTJ9rLhL7u#L zcDGOP`iL1|$|rRc?dD+EM={IWcsVfDy{&QE`g}o!d9yH$9DMCJG8YLU&5~N-I(iQv zH28cjzMHUHmT1|oMi-bLSLB)V-6zH-BMFKX-fdM1jw^@|Sb}wdEJ1ng+}+8czj|w= zn%vCK6(;p2X+8(<2j*0^k1a@)a5dZIP&>J66#3@GsPjPYO~=4GZcwV2X8Zi(NpT3W zfvM)bQ3Y(Tygp6jrE>Rs7J@^?mf=F?=k&etSHNTv#ncMh%PCGZTj&eJ#%MR*!=Ll!12r zZss7oyE}@4eVL~Dy?65RQ*VuO>Xcm+j+rb-_Gl-IN!)3TpMT|CuE4rfN zhMl-XWsj&C#b6oPAjYXd&;Z4C|1p_lzoTwBe0Xo|d#MpGKhQqPMN;0pDlIAs3p0BD z4hNpBAdNq1=$2%V!Y*1%i@{AIrbdz!pSujgi4nZ3q0@l#aKnCgl0Oe&$l^YGUNB6X zS?^8Oz&eid4fP>evkM6tQS9htJbQR0S3e~=Q=o8l(mD3NX(Y=rowrmml^LJ+wO@xz zXdO{|&b9tc*hLR`z@FoJ0c}U%J>=puY1f|6R!H)!q^2>GdW_c>*c1t2dv{@ z>{s-*@Eq_WnWrMAmZ2S14u_!r)XXH1RI$*(jywHLITN!m6J-{n!S_!GWIk{$8vA(xc96Hl+Q(Py}uEWm7 zIJl8Pg?Zgf^F;*yA~dWhCur<7*%aFxQ2 zO0&LitdWKj(39s>GK}=OMR6qy?v~lN&#K%8Uu@cDAI@_UrWaB5}=wm~BjTZjP7zWazto0Djf{MR+5wufm zQ-*SW+=rD)hUo@n57jujCv=Z?q^#P|z4Wl)XVD26U92eXaC%H85KXK0wU{QM7RmhK z_6lHUG@Q3|eAXmP*(IRbSH$eO9@tHiM0eWlt$?xlN?N)ykj7bUQ+mk)IiSX7>OD(J zO$BB?-wbJAs#usyUi^McORwF%K)8o}Q$ZjY9M=#i66Yl#?;^6@Af2(l6_b#XmZKOb zV$2xc-ET@o<3;v};uRo~%ue|TLFWeLrrvIpe=wZaO4!#=|s8;25-!SlXrp^_nd9fSJceLU2AaO zj0<51TM(6HS7ES6jlpEYRG><5{EY5`Mdk;2(94gjn#Oyn7U7!IyKWU4HQgdlv-YQy zJt|gj8$d?05i18^nFtW^tCtXgy=rSd_=WV#XHnN>JVhe1`}iC#-?f)Vh<1* zIv=cNgeE)jUg5FjxwZ@-o&o6bn&PZd+VMz7v-t}JH$_L;? z5?qMyh*z^*Z~2J1ThnT*H%*nJ0xW3!M8buReCj4tN9&KT(euu@I|X5YI43+pu7V?c z#!S9H$UCvUg^)HMBtTIrSM^JtD3@xZ;=zk2E~_%$QF5bv82GR(&f6iOc85bXathI) zTRZ5zUnrTl2valGp5IUDE9563A@+h6D)APsE1~zi@phR1*Q3>dpTP=nT!ASXq@Q%E8t*7@eP*#$m%KaR~f(j zN@Sj%xSx>TP%xf__@O^h31pwnk)IZwW~5A-w1$2mzGccVp5H(JM7cIbSei!O62H9& zUls~}=FoILQU47Ur#^xFOW(5o%^O(xjYu5F|K3gfFBHB_&$wyn4^-0s+*SCeW#P7s z#;1>eptM>aPab}v;^{W~PrSdQF}hmkKcbN&h<9t#Kb|db|Bl9s^*-(q2}+O_nKRmb zK7LdCY3JWB|N5^I1>kAo^pcs3A724~UHQMUH>Gq^R!s};S&NScIiHqt3;sj`nnt#2>qe!#q9{RV0de7*`lsbMxlQi*^&SbL)UO4CkAFi&3lL`5u%JjK zqBc=#|Aq>r1n5t1Vv@ex?aC(={BgZ;0$=?Ft}cKe&XS%m=$ZdSWj`apzWqpn)5T-8 z2j%}nA(Gd8+Iqx+hm5rwvNQff!J9UkW~Pnw#LXI3XdC{9#>u%}3tCWFqfCGNeDNnL z5x2zq3h0p_K1Ochdc^q?mQGsfnCXG-QxLYu191O|igri{-d{<;F9)x9EiJtn`AtEz zQvzf`$bv@wWyKX;Bkd1VI;mRXD7>IalMwgxYX02fcdl?!ro^yhMAEQL)9zbTD8(P> zJdM=2JYCbUcCut#XTss{sPuewz{aFWox0lHKzTONAE;EK)N|W147UPB4GFcQ>QyI%(ny9k0X0>Ww7vOVPaY zg4`MD#*FgB1yc7qKyPE=H`sN|QIk3j04`+Wi~ZdqUh)-C_bZ!qh1|8X3W`X`I6d=4 z3XOaX{8yCjsRaG$#imY6DX!&Zr4!Hdw>y*BQ;XS?SDh?zdD7$c5NpN9VyIv0rS=vR z38?lw8}I)CvhYN+hgMW+_bZM(;kB6kQOLwwzw>mvEXOR%;#U;dt05LN4vH}#q0MVX z0z8G*=9hZKOUG$Z=V?(VA?nkRecl|?wf(JL|Dy>2wvJn#@hRl4`>jEKu@hqx2l)5b zw=+<}xA;vU(7z5q|B4ZPdjmp5AfT5gWY8CQ3ljY+%<^Z9D8efM3_$=CK`bPE+Adc( zKMRN5s#oS25ed96*j1Nh6NyuT4l5T%C}+l-c`+rAq!a$_|4Tq|U?W+HWAWhV{As+Q zs1Zb}yQwF-ixc<#Aqo5;-#@@S95(q-sNY#(k5*(BY}v7mLN8P*CtL3+KYFV1SkL1U zXLq%(iS6sSgSEP{JfQuUW~!=VE7y)({}vnsNf1VDb2M3Y%-Y!%^5u(h*tY@|gU#)# zvd8%f=&JY+^VH697Vj6zx-pAN&MK$D2MIiB;pn@{LCxMip-5wO;rOT)1wixctD%S= zQMlaLadk;NowZQ7h^htxHPC6|vFar9Tc{Q*U1a;G%2PqrE5d4ZuvYv>m0jDBLY2Rz2@>5`>nJGbo_!G7ua$i(rcSmiSjDpmoXX5zC_j%g zZ!{qqwAHy<=qM`uBIe?@_EBWA5&`TMmY z5e!KVoL;SD3fCQhl69TH;$9wc&rZy2ngTw(_oh1 zg?LMb4Kc^36GXpz>v!VsdjA?*ApeREe*4>`e+dvG0X>4eK0gDYfPKtgW9w&#@Y~pG zoy-zNhT7S~fez-j5@=<{gWvIy@9gGAX;e%IxDY8r$RIVmpc--$DwnX*{dG_63jNv26r%spQM5et0Z}T3+=Il1==5YfTHT{mzKR1|rvE zEp&RRE*fj?+)hBd|CMW)!hshKA*3LTFg{byYLXLJ-&ro(vo5t=%BE z`qP8-IUU(Ttzm!I14ipXI2yGE&xy`0dHu`4)?x$S_>{RGCFTzo^1>mn3QaY|z_drc z+;FQy)xfJ-+mA#W>{{rXwQkfH-$gnSgoH^G=vH-8cq8G3x2=WF&=zILJ&UQTHNH%y znc3ef9u{mlPZq8~6}lp%E71*jgvitc()CIuQg~?U+OfSGqy4UH!0?HXt4uMWMG&D` zF`)x4p^(Bm``;lDz;99Fz`#GlxZk?zuMh|U1p^0!w+ION+U_X=di|}7Oa6cL*4vY( zKYQz`Qn7RE2{cpRb?*{rP%L~Ie=~{AX--}io>Hymif{HE7+sz+XWv^SgN3|IMXr@l zQQ!k>_k>*+d@>&>)-tb(ckdBx#08(=Hg0ypD}bp=kF~!u4|GZl+B?-I+yGC6%BtkO zn}!dC5u&EzkjLss$ZVnu@+&}h;sJxGgmCd&EAT?VqY<^=5>Nj^?KzhGk#=?BC?tQU zDg*8R3TY;m*)~O9P|J`7l!rA}DB+ffYw2(vP%SBe{{V*+vQJ89>d$#nL$XAH!8;iT7zkKB8u9-C z0syjwrd+k`AIv=u@Fm8eDC9~{;o=uSRsqk0;`oMeo)SFkQC5HeRmfU};MAyey7~VA zfDt7e;FPL^TJ+SR$t$2=Xe&eRz+4B*8w>}We%Piru>G?@cc54I7&vSI`7$#*D(xlB z=8X7SVF;K26ctnkC@=v&$@~8RfDwG(!wEplwnH6U6Qc;QUyIA_2X`C+PjfdSDPPlzVhG|+opeL^*w7qY;8?Sy-F z3aP$tBm*>;`SNn~NBDx)z&5&rw1nkQ4$GnKm$Y`egi`lR9t-grlDkDdRbRLys6wM1 zdLbCYVqvl&VX;f{etet+aT=M?fS`j)Oo7HSqf`qW9bOcm@E8uq+!Re9!XB3vF^=NQ zQChrx2tVKq-jRtd!Fvo_%G)#LR*1_Me?EcRG z0E>1)2%Sb)U5h5pA8{XeFntE0xny5PFQI{pMQwMmv+e%Hu*p-ad9HzPw6av9s%=%Z zURBSmK>q*+Bv_hBv$t{N<~JJ9AG5dO*iDR8#&Y?`xfgg+3?lpbtY1=~a~Gml^fJBN zL;kjA!9Z}TSK9~7*qTit23M^T{SrECckK3gm@9ORtCR6X07#CJh%H6*T^{E>cio;yshinvbtfhWD}Sk zzjCf@`Gr?xu@O>$6<&a4dlCH$V9CSKcH7TH00056^|3&>vG)GSq3bL`gOBiW{tQsQ zLOYos-_PR|uoj#EZHRaP6;vrck_%WaUu&qVP1i^&qd=?BgFrwc$Ex6JunXSiYLiZ9 z-H_~2{_ikBy_x0#Y1-$ccnZ+5Y6|Q{=yrEk&>J$bXfQ zh-0Dl8~q=OG^CzG)$iNg#5?K#5en-Gc zsH<>RoIq4%uqrwl)5%NGno|}$H!9${&Q;_;aTOBK(jo}(jlnt$UCtA;{hWWM{{X@A zAS&ZIKJ9yunt?`Qg9sw!%ZxD7mQv_A2)CUV{3P8wtFNc z$d(eU_d7J+uW@pw1O*2aFeyt|yQzqZ$Uy_%UwLt34349^^bM~-{(~$to!S{)U+eKU ziwE3rd}a8RDi}8HF5{A&({J(f6_Bi|g#Z;-fCXh5N`RuF0agSHbP5+ya4xA;?w}tb zmt=bMC?GSS3x|YJ;oz{{s}YX_y|GL?S!W6B2I8llBU$L_IT>Mq0PGM$?o`%%D}?_5 z57XtB{x=P-ZZ1OUPF{z*+-hsB7OTp~3EG6LLKq@aBwmj|TG^*m-EAy|tl%3Eu^x!P zLJ&yzmo6`O!o>DK>Ua*m#j}CoV=MR$55%%y3VH_R<%rSX(0dq-1fXCn&=&hccNHx= zxqoqB%vg}8J58sCgW3$Hiev(>R@(3f5ZZzW*D8w8>ZpkXOKo0GXc-GV%L90g%fmtZL;uXMA5vkxTP>7wyBV$1b#$Kf; z9ha5?$S^F?1zAWF$)B;70|1UU#8*QoEl)?3`!$%Wz(>2dQrEE#MO-xet@x>ybLB-o z?Xf8|Ky^&i5RD8Yv4u)Rq)QUCkbhzx&GsR*62!~I_qRe_=da4akolsN#+6OJYa5sKh#z4m`F127WqVur6h3KXKP z7S;mSf{TNML=oyFtCd9@Dj@tUSi1XKUnZYiWblv=RPaxr}I1?LFE2ViMA?m1FJz4uwXn3iWVJ)qEET0uIq{ zv4=OnZYi~BLwF9X69ulKiY*$;UpSUn+ER5W*J?=uALx!MdK3+$06_*w@8-LzH9%n)b*5unB_Y9Pw1MOD>Z z!Y2?^yQl?fFpyFYNCT;Yj5Sx%A}yxAYd?RDs~Z#XpW;z4z$G0e5`qqp)p{D2FVWYc z)}$W@zo~M1Xs5Bz`NQ5KqiAd7K9)b!&&}7|NVH~-J*@etlC~7z8j8Op zXX3|zLm7xbMPhV=6&~;yUz-mRVmgdt*)Z`hi0#Coa)-^IPvby0urW;lTw zX?>sODW{_@9mO?H>x1o-7eZ%_ke+bLv;zDwSGF)KFkJ77p&uZhoM=!@3c1V0DCwfmd<8^J5Wx{|5Eym*f+{x_<;9mRfonI4Ywn^cEQA4mc72uk8khE2zv2V3 zR5U|GqvBBrI>}xg$}q=MC-)y$Um`%uOzx4Yd!U!`6}1zn!dBg~ntKt{xSSEbw14Mm zsej{Py8(8gPn87(a7%@Fo>LE+K8TQ)7CwxLz#ho{u38A_1ym5M2}qoY9JW;ja=ePW3WZ{#Lji~xf&{>? zm^O-qUVtC5iP9iZQ4W@G<`on!<&mp}UNOWWD{9|1Q}Bng2@qKnEG2=YUDQ&n@CWV^ zOvvN7*a)sufZW0(&1dFXxmA2cZDXN$rjht#Ramwnh?+#m_lF9_5kiZ@N!+gy;38-j zH{>fO`};O~^pE3FOsqat{(S@0E6}HOK$=SD(CdP}$@)mk+F;CXne?EuVPQ{@%vPo| zFLivyzX8}2oaB?z3ALvh8r9* zNO6J5bhQSvU=~?MY@pjB?gLk0a*LbaXrSr{XXT2kt(K?S$L<_h2$=-FTIOJv3Bp^t zQ%5kquxSX`rMJ$wt;LMs6oQD3krFzzj@ch>J)x#`*gU-cQBrCP6$pE8)``Am}ZG7Fv z(?;QrPUa$XqSV)N;qRxIC{zrE4@7@uj|>Bw-*^|3<^kpl&)gN7y)PEh^f-+O9B|x1 zQ?L&OrM-;6Hc%8xMLlqZYkT~4)c*kL59o%yrjeXQi2=B=ZCqX2D0^u(ZAT@1Q z>?T#)5CmEV*p0N7XwWNV4E3{!Mb=Q!7Gxi2MrTVhczBgE{8*n2kR)lFF7UQ5nu2-= z8Ssrh*92i6-}a3bsk8^dYw|&3Zjk}d58H79H-^p8m6yUNjl?pUFkK=xgOI1%;hg?7 z=H;)#{{Vi2QrNPAl&r^gtHs%%`M21VF2ooksOV+Iz%BNjPO;?+?PkvmU>MDk8Z`?= zd72ZV4`v0hvfE?9{eWjqei&Bse68$9@h3jGuhfi}b>hC+$e3?8pcOtir z(MkQC;i`fjCLl|`Bh}MD3%DsqVF^PDEs~0|n@6>`PGAzo$6t$hx_;~Zdbo}VsAUSC zBUQ>0g(xyps-9;U7aG>R{|5>fF3RL7*@=%009L0A>F{x0AoOA{9b zC^Yc(!&r!;}}S&X^oB*o6nO zJ>cMR5jrxWr0nwV5h}YHs1YKBQE8^BLM90n0s#O78)}H#I$hO#s1BScj{!%ldT6wd z?CN)d3X2l|0Q$6nzG=)i5w4I8F>D~AD&p1TLsTWzwM$L%rH@i(5McBU$PtWPf$9!V zeVzQm24*5+CUYXAUJ0gl;CnoDajK{BG!OnF{{S;jMrj=kcE-W?nT;_CsU1g$#Bvm+ zVXedLe8X;44*F#Ks7Nh|+)({Sq`G!ewUD-0RhlV?j=2g+1Y1xF^GGci?zd+ZREvZS zgLROU7cn~$z}T5OWN8?X5iGc13DbKW$z#3`fdeZc3Gc|QUZS=v5Qh+n8%#K?Akf}V zlzrwCGhSvx(Adm-yQEJi5BJ>sLoVC{;0NyEuSO|~F&tc|Cm66tOrcFp*LuZ%gHm=s0;NfK&QUEMjQ8COY z3pQewt2zab93*8}qCAL*~9iiSmKm>?@HYt?r0s?Ey7!lw% zEY+-JYGzsyL(py}B{o`t=8Px8{6h@PMrI;AsH~3LSEs7}u=_*t9TidH)$|b8qs&;8 zDU+?)PT523WdjpZYDL7UNAMWkSt|Gvjd06R1_ufnMC(Xb7MKp`Pee!4@gj^D2^?28 zVc;lQ%s|YED1e~_Z#Gt3R*0%1*$RS)urX&WaKo5{15_aP8)%ev;M8R{8c-IN+~Vjw zDvJ{3(5NmDF5CdPiz3sYSTrdz-95(PaNnesMJPZzg;iaEC4#8|P|zx);=96TvG7zB zM0M1N%K!@C6$9RxP_7Lui4#CH-7u&l0j230=+1e7{hj5dNbQyJc>%%myn2!iq%bVSAB-rsROM?vy=4 z(sCWKlA2D)n06qMd`W8f1?1r2j;JXO;1|stA{ubnE+Ptc64nUyGB*tS!GNXMCUlHX z=%4_kEtm_eS!LvE97efkLkpfpSN60lf(c9(v@HljB1=W=+<7w=AstI1P6jLv$Un81 zNvknxERfW@bV7G9{U^ua`lwarnSks;j8g*}cKPr>O2N|!*(5$H9YKN|M}|S6-bi zR(*g!Wa<0yuxgTUt1_3ZTjfe^Pg-&-V_?%xat;T35cn9G@LUxovY2BDmJxeLB?V1Y z1rY`TUoz?0Tn?GIA#fMrA~^}bD4|=X!iwpe!Il;Vgc*8VJOvq0Qd*8-8V@ywg8`PZ zw*;WIt*tLABD}0vCccd#Vpg~d$rOI7S~D;im`uz>S1#s&x3h=oUvI}eu&i-ph@UpziVMQh-OWo2B
  • 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 R+zJ7r0MRS_EB^q)|Jm^}@4)~7 literal 0 HcmV?d00001 diff --git a/htdocs/public/demo/demo-profile-manufacturing.jpg b/htdocs/public/demo/demo-profile-manufacturing.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6b5bc0d485479a16201e68415ebeaa8789e18116 GIT binary patch literal 17278 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 literal 0 HcmV?d00001 diff --git a/htdocs/public/demo/dolibarr_screenshot2.png b/htdocs/public/demo/dolibarr_screenshot2.png deleted file mode 100644 index adb7788e6779b8c4f452d2589a5fbfbf18e9bf3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6431 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 diff --git a/htdocs/public/demo/dolibarr_screenshot8.png b/htdocs/public/demo/dolibarr_screenshot8.png deleted file mode 100644 index eb520a9166ff7bbde210a1ff9a471b8dbefdf4de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5574 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 Uqd%j;V*mgE07*qoM6N<$g0_6`o&W#< diff --git a/htdocs/public/demo/dolibarr_screenshot9.png b/htdocs/public/demo/dolibarr_screenshot9.png deleted file mode 100644 index d6765506f74980d4a409df00591bd70385afa603..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5729 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 TN$WL!00000NkvXXu0mjfXlM2V diff --git a/htdocs/public/demo/index.php b/htdocs/public/demo/index.php index d4b24579446..7a962a15b79 100644 --- a/htdocs/public/demo/index.php +++ b/htdocs/public/demo/index.php @@ -73,17 +73,17 @@ if (empty($reshook)) 'icon'=>DOL_URL_ROOT.'/public/demo/demo-profile-service.jpg', 'url'=>$url ), + array('default'=>'0', 'key'=>'profmanufacture','label'=>'DemoCompanyManufacturing', + 'disablemodules'=>'adherent,contrat,don,externalsite,ficheinter,ftp,mailmanspip,prelevement,service', + 'icon'=>DOL_URL_ROOT.'/public/demo/demo-profile-manufacturing.jpg', + 'url'=>$url + ), array('default'=>'0', 'key'=>'profdemoprodstock','label'=>'DemoCompanyProductAndStocks', - 'disablemodules'=>'adherent,contrat,don,externalsite,ficheinter,ftp,mailmanspip,prelevement,service', + 'disablemodules'=>'adherent,bom,contrat,don,externalsite,ficheinter,ftp,mailmanspip,mrp,prelevement,service', //'icon'=>DOL_URL_ROOT.'/public/demo/dolibarr_screenshot2.png', 'icon'=>DOL_URL_ROOT.'/public/demo/demo-profile-product.jpg', 'url'=>$url ), - array('default'=>'-1', 'key'=>'profdemofun','label'=>'DemoFundation', - 'disablemodules'=>'banque,barcode,bom,cashdesk,commande,commercial,compta,comptabilite,contrat,expedition,externalsite,ficheinter,ftp,incoterm,mailmanspip,margin,mrp,prelevement,product,productbatch,projet,propal,propale,service,societe,stock,tax,takepos', - 'icon'=>DOL_URL_ROOT.'/public/demo/dolibarr_screenshot6.png', - 'url'=>$url - ), array('default'=>'0', 'key'=>'profdemofun2','label'=>'DemoFundation2', 'disablemodules'=>'barcode,cashdesk,bom,commande,commercial,compta,comptabilite,contrat,expedition,externalsite,ficheinter,ftp,incoterm,mailmanspip,margin,mrp,prelevement,product,productbatch,projet,propal,propale,service,societe,stock,tax,takepos', //'icon'=>DOL_URL_ROOT.'/public/demo/dolibarr_screenshot6.png', @@ -92,7 +92,7 @@ if (empty($reshook)) ), // All demo profile array('default'=>'0', 'key'=>'profdemoall','label'=>'ChooseYourDemoProfilMore', - 'disablemodules'=>'adherent,don,externalsite,mailmanspip,takepos', + 'disablemodules'=>'adherent,cashdesk,don,externalsite,mailmanspip', //'icon'=>DOL_URL_ROOT.'/public/demo/dolibarr_screenshot9.png' 'icon'=>DOL_URL_ROOT.'/public/demo/demo-profile-all.jpg' ) From d6766af35d3e83c4d5132b8791b54c1801b2af02 Mon Sep 17 00:00:00 2001 From: John Botella Date: Tue, 21 Jan 2020 14:17:53 +0100 Subject: [PATCH 106/230] Fix dom and missing param --- htdocs/core/class/commonobject.class.php | 3 ++- htdocs/core/class/html.form.class.php | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index bf39cc1e94d..d4735e4ba8d 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -5932,7 +5932,8 @@ abstract class CommonObject { $param_list=array_keys($param['options']); // $param_list='ObjectName:classPath' $showempty=(($required && $default != '')?0:1); - $out=$form->selectForForms($param_list[0], $keyprefix.$key.$keysuffix, $value, $showempty); + $out=$form->selectForForms($param_list[0], $keyprefix.$key.$keysuffix, $value, $showempty, '', '', $morecss, $moreparam); + if ($conf->global->MAIN_FEATURES_LEVEL >= 2) { list($class,$classfile)=explode(':', $param_list[0]); diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 3f9a6827e49..cb46be383db 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -5044,11 +5044,11 @@ class Form { if ($societe_vendeuse->id == $mysoc->id) { - $return.= ''.$langs->trans("ErrorYourCountryIsNotDefined").''; + $return.= '

    '.$langs->trans("ErrorYourCountryIsNotDefined").'
    '; } else { - $return.= ''.$langs->trans("ErrorSupplierCountryIsNotDefined").''; + $return.= '
    '.$langs->trans("ErrorSupplierCountryIsNotDefined").'
    '; } return $return; } From 4fdfba38675c8252bd1beaf465bc827ed1923a7b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 21 Jan 2020 15:01:22 +0100 Subject: [PATCH 107/230] Add .noexec extension for old php4, php5... files --- htdocs/core/lib/functions.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 577d190d9d4..00719db30d5 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -8503,7 +8503,7 @@ function dolGetButtonTitle($label, $helpText = '', $iconClass = 'fa fa-file', $u */ function isAFileWithExecutableContent($filename) { - if (preg_match('/\.(htm|html|js|php|phtml|pl|py|cgi|ksh|sh|bash|bat|cmd|wpk|exe|dmg)$/i', $filename)) + if (preg_match('/\.(htm|html|js|php|php\d+|phtml|pl|py|cgi|ksh|sh|bash|bat|cmd|wpk|exe|dmg)$/i', $filename)) { return true; } From 4922567a27f31f07171e09d660acb715cc0ef3a4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 21 Jan 2020 15:01:22 +0100 Subject: [PATCH 108/230] Add .noexec extension for old php4, php5... files --- htdocs/core/lib/functions.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 7f5c3c351c7..add0dba599d 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -8499,7 +8499,7 @@ function dolGetButtonTitle($label, $helpText = '', $iconClass = 'fa fa-file', $u */ function isAFileWithExecutableContent($filename) { - if (preg_match('/\.(htm|html|js|php|phtml|pl|py|cgi|ksh|sh|bash|bat|cmd|wpk|exe|dmg)$/i', $filename)) + if (preg_match('/\.(htm|html|js|php|php\d+|phtml|pl|py|cgi|ksh|sh|bash|bat|cmd|wpk|exe|dmg)$/i', $filename)) { return true; } From 8bd835d937047cbbfcfba4af62c349a214ddad54 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 21 Jan 2020 16:17:18 +0100 Subject: [PATCH 109/230] NEW Add option PDF_USE_ALSO_LANGUAGE_CODE to generate PDF in 2 languages in same document. --- .../commande/doc/pdf_eratosthene.modules.php | 31 ++++++++++----- .../facture/doc/pdf_sponge.modules.php | 39 ++++++++++++------- .../modules/propale/doc/pdf_cyan.modules.php | 32 ++++++++++----- 3 files changed, 70 insertions(+), 32 deletions(-) diff --git a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php index 268332b8bd5..d310f176039 100644 --- a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php +++ b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php @@ -1080,10 +1080,18 @@ class pdf_eratosthene extends ModelePDFCommandes $largcol2 = ($this->page_largeur - $this->marge_droite - $col2x); $useborder = 0; $index = 0; + + $outputlangsbis = null; + if (! empty($conf->global->PDF_USE_ALSO_LANGUAGE_CODE) && $outputlangs->defaultlang != $conf->global->PDF_USE_ALSO_LANGUAGE_CODE) { + $outputlangsbis = new Translate('', $conf); + $outputlangsbis->setDefaultLang($conf->global->PDF_USE_ALSO_LANGUAGE_CODE); + $outputlangsbis->loadLangs(array("main", "dict", "companies", "bills", "products", "propal")); + } + // Total HT $pdf->SetFillColor(255, 255, 255); $pdf->SetXY($col1x, $tab2_top + 0); - $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("TotalHT"), 0, 'L', 1); + $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("TotalHT").(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transnoentities("TotalHT") : ''), 0, 'L', 1); $total_ht = (($conf->multicurrency->enabled && isset($object->multicurrency_tx) && $object->multicurrency_tx != 1) ? $object->multicurrency_total_ht : $object->total_ht); $pdf->SetXY($col2x, $tab2_top + 0); $pdf->MultiCell($largcol2, $tab2_hl, price($total_ht + (!empty($object->remise) ? $object->remise : 0), 0, $outputlangs), 0, 'R', 1); @@ -1123,7 +1131,8 @@ class pdf_eratosthene extends ModelePDFCommandes $tvakey=str_replace('*', '', $tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transcountrynoentities("TotalLT1", $mysoc->country_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalLT1", $mysoc->country_code).(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalLT1", $mysoc->country_code) : ''); + $totalvat.=' '; $totalvat.=vatrate(abs($tvakey), 1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -1154,7 +1163,8 @@ class pdf_eratosthene extends ModelePDFCommandes $tvakey=str_replace('*', '', $tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transcountrynoentities("TotalLT2", $mysoc->country_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalLT2", $mysoc->country_code).(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalLT2", $mysoc->country_code) : ''); + $totalvat.=' '; $totalvat.=vatrate(abs($tvakey), 1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -1180,7 +1190,8 @@ class pdf_eratosthene extends ModelePDFCommandes $tvakey = str_replace('*', '', $tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transcountrynoentities("TotalVAT", $mysoc->country_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalVAT", $mysoc->country_code).(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalVAT", $mysoc->country_code) : ''); + $totalvat.=' '; $totalvat .= vatrate($tvakey, 1).$tvacompl; $pdf->MultiCell($col2x - $col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -1211,7 +1222,8 @@ class pdf_eratosthene extends ModelePDFCommandes $tvakey=str_replace('*', '', $tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transcountrynoentities("TotalLT1", $mysoc->country_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalLT1", $mysoc->country_code).(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalLT1", $mysoc->country_code) : ''); + $totalvat.=' '; $totalvat.=vatrate(abs($tvakey), 1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -1243,7 +1255,8 @@ class pdf_eratosthene extends ModelePDFCommandes $tvakey=str_replace('*', '', $tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transcountrynoentities("TotalLT2", $mysoc->country_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalLT2", $mysoc->country_code).(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalLT2", $mysoc->country_code) : ''); + $totalvat.=' '; $totalvat.=vatrate(abs($tvakey), 1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -1260,7 +1273,7 @@ class pdf_eratosthene extends ModelePDFCommandes $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); $pdf->SetTextColor(0, 0, 60); $pdf->SetFillColor(224, 224, 224); - $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("TotalTTC"), $useborder, 'L', 1); + $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("TotalTTC").(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalTTC", $mysoc->country_code) : ''), $useborder, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($total_ttc, 0, $outputlangs), $useborder, 'R', 1); @@ -1283,7 +1296,7 @@ class pdf_eratosthene extends ModelePDFCommandes $index++; $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); - $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("AlreadyPaid"), 0, 'L', 0); + $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("AlreadyPaid").(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transnoentities("AlreadyPaid") : ''), 0, 'L', 0); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($deja_regle, 0, $outputlangs), 0, 'R', 0); @@ -1291,7 +1304,7 @@ class pdf_eratosthene extends ModelePDFCommandes $pdf->SetTextColor(0, 0, 60); $pdf->SetFillColor(224, 224, 224); $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); - $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("RemainderToPay"), $useborder, 'L', 1); + $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("RemainderToPay").(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transnoentities("AlreadyPaid") : ''), $useborder, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($resteapayer, 0, $outputlangs), $useborder, 'R', 1); diff --git a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php index 05802e21605..39829c4d06c 100644 --- a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php @@ -1231,7 +1231,12 @@ class pdf_sponge extends ModelePDFFactures $useborder=0; $index = 0; - + $outputlangsbis = null; + if (! empty($conf->global->PDF_USE_ALSO_LANGUAGE_CODE) && $outputlangs->defaultlang != $conf->global->PDF_USE_ALSO_LANGUAGE_CODE) { + $outputlangsbis = new Translate('', $conf); + $outputlangsbis->setDefaultLang($conf->global->PDF_USE_ALSO_LANGUAGE_CODE); + $outputlangsbis->loadLangs(array("main", "dict", "companies", "bills", "products", "propal")); + } // overall percentage of advancement $percent = 0; @@ -1368,7 +1373,7 @@ class pdf_sponge extends ModelePDFFactures if (! empty($conf->global->MAIN_SHOW_AMOUNT_DISCOUNT)) { $pdf->SetFillColor(255, 255, 255); $pdf->SetXY($col1x, $tab2_top + $tab2_hl); - $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("TotalDiscount"), 0, 'L', 1); + $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("TotalDiscount").(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transnoentities("TotalDiscount") : ''), 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl); $pdf->MultiCell($largcol2, $tab2_hl, price($total_line_remise, 0, $outputlangs), 0, 'R', 1); @@ -1378,7 +1383,7 @@ class pdf_sponge extends ModelePDFFactures if (! empty($conf->global->MAIN_SHOW_AMOUNT_BEFORE_DISCOUNT)) { $pdf->SetFillColor(255, 255, 255); $pdf->SetXY($col1x, $tab2_top + 0); - $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("TotalHTBeforeDiscount"), 0, 'L', 1); + $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("TotalHTBeforeDiscount").(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transnoentities("TotalHTBeforeDiscount") : ''), 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + 0); $pdf->MultiCell($largcol2, $tab2_hl, price($total_line_remise + $total_ht, 0, $outputlangs), 0, 'R', 1); @@ -1389,7 +1394,7 @@ class pdf_sponge extends ModelePDFFactures // Total HT $pdf->SetFillColor(255, 255, 255); $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); - $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("TotalHT"), 0, 'L', 1); + $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("TotalHT").(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transnoentities("TotalHT") : ''), 0, 'L', 1); $total_ht = (($conf->multicurrency->enabled && isset($object->multicurrency_tx) && $object->multicurrency_tx != 1) ? $object->multicurrency_total_ht : $object->total_ht); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); @@ -1435,7 +1440,8 @@ class pdf_sponge extends ModelePDFFactures $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transcountrynoentities("TotalLT1", $mysoc->country_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalLT1", $mysoc->country_code).(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalLT1", $mysoc->country_code) : ''); + $totalvat.=' '; $totalvat.=vatrate(abs($tvakey), 1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -1467,7 +1473,8 @@ class pdf_sponge extends ModelePDFFactures $tvakey=str_replace('*', '', $tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transcountrynoentities("TotalLT2", $mysoc->country_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalLT2", $mysoc->country_code)(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalLT2", $mysoc->country_code) : ''); + $totalvat.=' '; $totalvat.=vatrate(abs($tvakey), 1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -1517,7 +1524,8 @@ class pdf_sponge extends ModelePDFFactures $tvakey = str_replace('*', '', $tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transcountrynoentities("TotalVAT", $mysoc->country_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalVAT", $mysoc->country_code)(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalVAT", $mysoc->country_code) : ''); + $totalvat.=' '; $totalvat .= vatrate($tvakey, 1).$tvacompl; $pdf->MultiCell($col2x - $col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -1548,7 +1556,8 @@ class pdf_sponge extends ModelePDFFactures $tvakey=str_replace('*', '', $tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transcountrynoentities("TotalLT1", $mysoc->country_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalLT1", $mysoc->country_code)(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalLT1", $mysoc->country_code) : ''); + $totalvat.=' '; $totalvat.=vatrate(abs($tvakey), 1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -1581,7 +1590,8 @@ class pdf_sponge extends ModelePDFFactures $tvakey=str_replace('*', '', $tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transcountrynoentities("TotalLT2", $mysoc->country_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalLT2", $mysoc->country_code).(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalLT2", $mysoc->country_code) : ''); + $totalvat.=' '; $totalvat.=vatrate(abs($tvakey), 1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -1598,7 +1608,7 @@ class pdf_sponge extends ModelePDFFactures { $index++; $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); - $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("RevenueStamp"), $useborder, 'L', 1); + $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("RevenueStamp").(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transnoentities("RevenueStamp", $mysoc->country_code) : ''), $useborder, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($sign * $object->revenuestamp), $useborder, 'R', 1); @@ -1609,7 +1619,7 @@ class pdf_sponge extends ModelePDFFactures $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); $pdf->SetTextColor(0, 0, 60); $pdf->SetFillColor(224, 224, 224); - $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("TotalTTC"), $useborder, 'L', 1); + $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("TotalTTC").(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transnoentities("TotalTTC") : ''), $useborder, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($sign * $total_ttc, 0, $outputlangs), $useborder, 'R', 1); @@ -1692,7 +1702,7 @@ class pdf_sponge extends ModelePDFFactures // Already paid + Deposits $index++; $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); - $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("Paid"), 0, 'L', 0); + $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("Paid").(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transnoentities("Paid") : ''), 0, 'L', 0); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($deja_regle + $depositsamount, 0, $outputlangs), 0, 'R', 0); @@ -1700,6 +1710,7 @@ class pdf_sponge extends ModelePDFFactures if ($creditnoteamount) { $labeltouse = ($outputlangs->transnoentities("CreditNotesOrExcessReceived") != "CreditNotesOrExcessReceived") ? $outputlangs->transnoentities("CreditNotesOrExcessReceived") : $outputlangs->transnoentities("CreditNotes"); + $labeltouse .= (is_object($outputlangsbis) ? ' / '.($outputlangsbis->transnoentities("CreditNotesOrExcessReceived") != "CreditNotesOrExcessReceived") ? $outputlangsbis->transnoentities("CreditNotesOrExcessReceived") : $outputlangsbis->transnoentities("CreditNotes") : ''); $index++; $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($col2x - $col1x, $tab2_hl, $labeltouse, 0, 'L', 0); @@ -1714,7 +1725,7 @@ class pdf_sponge extends ModelePDFFactures $pdf->SetFillColor(255, 255, 255); $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); - $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("EscompteOfferedShort"), $useborder, 'L', 1); + $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("EscompteOfferedShort").(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transnoentities("EscompteOfferedShort") : ''), $useborder, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($object->total_ttc - $deja_regle - $creditnoteamount - $depositsamount, 0, $outputlangs), $useborder, 'R', 1); @@ -1725,7 +1736,7 @@ class pdf_sponge extends ModelePDFFactures $pdf->SetTextColor(0, 0, 60); $pdf->SetFillColor(224, 224, 224); $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); - $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("RemainderToPay"), $useborder, 'L', 1); + $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("RemainderToPay").(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transnoentities("RemainderToPay") : ''), $useborder, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($resteapayer, 0, $outputlangs), $useborder, 'R', 1); diff --git a/htdocs/core/modules/propale/doc/pdf_cyan.modules.php b/htdocs/core/modules/propale/doc/pdf_cyan.modules.php index 0bbbff297ba..6809f234eda 100644 --- a/htdocs/core/modules/propale/doc/pdf_cyan.modules.php +++ b/htdocs/core/modules/propale/doc/pdf_cyan.modules.php @@ -1159,6 +1159,7 @@ class pdf_cyan extends ModelePDFPropales protected function drawTotalTable(&$pdf, $object, $deja_regle, $posy, $outputlangs) { global $conf, $mysoc; + $default_font_size = pdf_getPDFFontSize($outputlangs); $tab2_top = $posy; @@ -1176,10 +1177,17 @@ class pdf_cyan extends ModelePDFPropales $useborder = 0; $index = 0; + $outputlangsbis = null; + if (! empty($conf->global->PDF_USE_ALSO_LANGUAGE_CODE) && $outputlangs->defaultlang != $conf->global->PDF_USE_ALSO_LANGUAGE_CODE) { + $outputlangsbis = new Translate('', $conf); + $outputlangsbis->setDefaultLang($conf->global->PDF_USE_ALSO_LANGUAGE_CODE); + $outputlangsbis->loadLangs(array("main", "dict", "companies", "bills", "products", "propal")); + } + // Total HT $pdf->SetFillColor(255, 255, 255); $pdf->SetXY($col1x, $tab2_top + 0); - $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("TotalHT"), 0, 'L', 1); + $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("TotalHT").(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transnoentities("TotalHT") : ''), 0, 'L', 1); $total_ht = (($conf->multicurrency->enabled && isset($object->multicurrency_tx) && $object->multicurrency_tx != 1) ? $object->multicurrency_total_ht : $object->total_ht); $pdf->SetXY($col2x, $tab2_top + 0); @@ -1222,7 +1230,8 @@ class pdf_cyan extends ModelePDFPropales $tvakey=str_replace('*', '', $tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transcountrynoentities("TotalLT1", $mysoc->country_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalLT1", $mysoc->country_code).(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalLT1", $mysoc->country_code) : ''); + $totalvat.=' '; $totalvat.=vatrate(abs($tvakey), 1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -1256,7 +1265,8 @@ class pdf_cyan extends ModelePDFPropales $tvakey=str_replace('*', '', $tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transcountrynoentities("TotalLT2", $mysoc->country_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalLT2", $mysoc->country_code).(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalLT2", $mysoc->country_code) : ''); + $totalvat.=' '; $totalvat.=vatrate(abs($tvakey), 1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -1282,7 +1292,8 @@ class pdf_cyan extends ModelePDFPropales $tvakey = str_replace('*', '', $tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transcountrynoentities("TotalVAT", $mysoc->country_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalVAT", $mysoc->country_code).(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalVAT", $mysoc->country_code) : ''); + $totalvat.=' '; $totalvat .= vatrate($tvakey, 1).$tvacompl; $pdf->MultiCell($col2x - $col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -1313,7 +1324,8 @@ class pdf_cyan extends ModelePDFPropales $tvakey=str_replace('*', '', $tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transcountrynoentities("TotalLT1", $mysoc->country_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalLT1", $mysoc->country_code).(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalLT1", $mysoc->country_code) : ''); + $totalvat.=' '; $totalvat.=vatrate(abs($tvakey), 1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -1346,7 +1358,8 @@ class pdf_cyan extends ModelePDFPropales $tvakey=str_replace('*', '', $tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transcountrynoentities("TotalLT2", $mysoc->country_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalLT2", $mysoc->country_code).(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalLT2", $mysoc->country_code) : ''); + $totalvat.= ' '; $totalvat.=vatrate(abs($tvakey), 1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -1363,7 +1376,7 @@ class pdf_cyan extends ModelePDFPropales $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); $pdf->SetTextColor(0, 0, 60); $pdf->SetFillColor(224, 224, 224); - $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("TotalTTC"), $useborder, 'L', 1); + $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("TotalTTC").(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transnoentities("TotalTTC") : ''), $useborder, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($total_ttc, 0, $outputlangs), $useborder, 'R', 1); @@ -1372,6 +1385,7 @@ class pdf_cyan extends ModelePDFPropales $pdf->SetTextColor(0, 0, 0); + $resteapayer = 0; /* $resteapayer = $object->total_ttc - $deja_regle; if (! empty($object->paye)) $resteapayer=0; @@ -1382,7 +1396,7 @@ class pdf_cyan extends ModelePDFPropales $index++; $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); - $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("AlreadyPaid"), 0, 'L', 0); + $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("AlreadyPaid").(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transnoentities("AlreadyPaid") : ''), 0, 'L', 0); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($deja_regle, 0, $outputlangs), 0, 'R', 0); @@ -1407,7 +1421,7 @@ class pdf_cyan extends ModelePDFPropales $pdf->SetTextColor(0, 0, 60); $pdf->SetFillColor(224, 224, 224); $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); - $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("RemainderToPay"), $useborder, 'L', 1); + $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("RemainderToPay").(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transnoentities("RemainderToPay") : ''), $useborder, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($resteapayer, 0, $outputlangs), $useborder, 'R', 1); From 8a348d533ba2556b48e2f9dc9ba35e6be175cfa6 Mon Sep 17 00:00:00 2001 From: VESSILLER Date: Tue, 21 Jan 2020 17:29:45 +0100 Subject: [PATCH 110/230] NEW only show units columns in product list (not in service list) --- htdocs/product/list.php | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/htdocs/product/list.php b/htdocs/product/list.php index 9549d43673d..99417793420 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -172,18 +172,18 @@ $arrayfields = array( 'p.fk_product_type'=>array('label'=>$langs->trans("Type"), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled) && !empty($conf->service->enabled)), 'position'=>11), 'p.barcode'=>array('label'=>$langs->trans("Gencod"), 'checked'=>1, 'enabled'=>(!empty($conf->barcode->enabled)), 'position'=>12), 'p.duration'=>array('label'=>$langs->trans("Duration"), 'checked'=>($contextpage != 'productlist'), 'enabled'=>(!empty($conf->service->enabled) && (string) $type == '1'), 'position'=>13), - 'p.weight'=>array('label'=>$langs->trans('Weight'), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled)), 'position'=>20), - 'p.weight_units'=>array('label'=>$langs->trans('WeightUnits'), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled)), 'position'=>21), - 'p.length'=>array('label'=>$langs->trans('Length'), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled) && empty($conf->global->PRODUCT_DISABLE_SIZE)), 'position'=>22), - 'p.length_units'=>array('label'=>$langs->trans('LengthUnits'), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled) && empty($conf->global->PRODUCT_DISABLE_SIZE)), 'position'=>23), - 'p.width'=>array('label'=>$langs->trans('Width'), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled) && empty($conf->global->PRODUCT_DISABLE_SIZE)), 'position'=>24), - 'p.width_units'=>array('label'=>$langs->trans('WidthUnits'), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled) && empty($conf->global->PRODUCT_DISABLE_SIZE)), 'position'=>25), - 'p.height'=>array('label'=>$langs->trans('Height'), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled) && empty($conf->global->PRODUCT_DISABLE_SIZE)), 'position'=>26), - 'p.height_units'=>array('label'=>$langs->trans('HeightUnits'), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled) && empty($conf->global->PRODUCT_DISABLE_SIZE)), 'position'=>27), - 'p.surface'=>array('label'=>$langs->trans('Surface'), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled) && empty($conf->global->PRODUCT_DISABLE_SURFACE)), 'position'=>28), - 'p.surface_units'=>array('label'=>$langs->trans('SurfaceUnits'), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled) && empty($conf->global->PRODUCT_DISABLE_SURFACE)), 'position'=>29), - 'p.volume'=>array('label'=>$langs->trans('Volume'), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled) && empty($conf->global->PRODUCT_DISABLE_VOLUME)), 'position'=>30), - 'p.volume_units'=>array('label'=>$langs->trans('VolumeUnits'), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled) && empty($conf->global->PRODUCT_DISABLE_VOLUME)), 'position'=>31), + 'p.weight'=>array('label'=>$langs->trans('Weight'), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled) && $type != '1'), 'position'=>20), + 'p.weight_units'=>array('label'=>$langs->trans('WeightUnits'), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled) && $type != '1'), 'position'=>21), + 'p.length'=>array('label'=>$langs->trans('Length'), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled) && empty($conf->global->PRODUCT_DISABLE_SIZE) && $type != '1'), 'position'=>22), + 'p.length_units'=>array('label'=>$langs->trans('LengthUnits'), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled) && empty($conf->global->PRODUCT_DISABLE_SIZE) && $type != '1'), 'position'=>23), + 'p.width'=>array('label'=>$langs->trans('Width'), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled) && empty($conf->global->PRODUCT_DISABLE_SIZE) && $type != '1'), 'position'=>24), + 'p.width_units'=>array('label'=>$langs->trans('WidthUnits'), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled) && empty($conf->global->PRODUCT_DISABLE_SIZE) && $type != '1'), 'position'=>25), + 'p.height'=>array('label'=>$langs->trans('Height'), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled) && empty($conf->global->PRODUCT_DISABLE_SIZE) && $type != '1'), 'position'=>26), + 'p.height_units'=>array('label'=>$langs->trans('HeightUnits'), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled) && empty($conf->global->PRODUCT_DISABLE_SIZE) && $type != '1'), 'position'=>27), + 'p.surface'=>array('label'=>$langs->trans('Surface'), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled) && empty($conf->global->PRODUCT_DISABLE_SURFACE) && $type != '1'), 'position'=>28), + 'p.surface_units'=>array('label'=>$langs->trans('SurfaceUnits'), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled) && empty($conf->global->PRODUCT_DISABLE_SURFACE) && $type != '1'), 'position'=>29), + 'p.volume'=>array('label'=>$langs->trans('Volume'), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled) && empty($conf->global->PRODUCT_DISABLE_VOLUME) && $type != '1'), 'position'=>30), + 'p.volume_units'=>array('label'=>$langs->trans('VolumeUnits'), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled) && empty($conf->global->PRODUCT_DISABLE_VOLUME) && $type != '1'), 'position'=>31), 'cu.label'=>array('label'=>$langs->trans("DefaultUnitToShow"), 'checked'=>0, 'enabled'=>(!empty($conf->product->enabled) && !empty($conf->global->PRODUCT_USE_UNITS)), 'position'=>32), 'p.sellprice'=>array('label'=>$langs->trans("SellingPrice"), 'checked'=>1, 'enabled'=>empty($conf->global->PRODUIT_MULTIPRICES), 'position'=>40), 'p.minbuyprice'=>array('label'=>$langs->trans("BuyingPriceMinShort"), 'checked'=>1, 'enabled'=>(!empty($user->rights->fournisseur->lire)), 'position'=>41), @@ -1046,7 +1046,7 @@ if ($resql) // Weight units if (!empty($arrayfields['p.weight_units']['checked'])) { print '
  • '; if (!$i) $totalarray['nbfield']++; } @@ -1061,7 +1061,7 @@ if ($resql) // Length units if (!empty($arrayfields['p.length_units']['checked'])) { print ''; if (!$i) $totalarray['nbfield']++; } @@ -1076,7 +1076,7 @@ if ($resql) // Width units if (!empty($arrayfields['p.width_units']['checked'])) { print ''; if (!$i) $totalarray['nbfield']++; } @@ -1091,7 +1091,7 @@ if ($resql) // Height units if (!empty($arrayfields['p.height_units']['checked'])) { print ''; if (!$i) $totalarray['nbfield']++; } @@ -1106,7 +1106,7 @@ if ($resql) // Surface units if (!empty($arrayfields['p.surface_units']['checked'])) { print ''; if (!$i) $totalarray['nbfield']++; } @@ -1121,7 +1121,7 @@ if ($resql) // Volume units if (!empty($arrayfields['p.volume_units']['checked'])) { print ''; if (!$i) $totalarray['nbfield']++; } From c91ab621b848180c0954043eb0d63e0c8081dfd2 Mon Sep 17 00:00:00 2001 From: VESSILLER Date: Tue, 21 Jan 2020 17:49:27 +0100 Subject: [PATCH 111/230] FIX length, width and height coherence in product table --- htdocs/product/class/product.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 47b190ed4f7..aa6dd5e08a8 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -819,9 +819,9 @@ class Product extends CommonObject $this->height = price2num($this->height); $this->height_units = trim($this->height_units); // set unit not defined - if ($this->length_units) { $this->width_units = $this->length_units; // Not used yet + if (is_numeric($this->length_units)) { $this->width_units = $this->length_units; // Not used yet } - if ($this->length_units) { $this->height_units = $this->length_units; // Not used yet + if (is_numeric($this->length_units)) { $this->height_units = $this->length_units; // Not used yet } // Automated compute surface and volume if not filled if (empty($this->surface) && !empty($this->length) && !empty($this->width) && $this->length_units == $this->width_units) { From fd02ed43174281c7e72ab362b672744951bff6cf Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 21 Jan 2020 20:50:58 +0100 Subject: [PATCH 112/230] Fix label --- htdocs/product/list.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/htdocs/product/list.php b/htdocs/product/list.php index 6bf3beb6dde..9fc5eaa62d4 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -922,7 +922,10 @@ if ($resql) // Type if (!empty($arrayfields['p.fk_product_type']['checked'])) { - print ''; + print ''; if (!$i) $totalarray['nbfield']++; } From a36b0ea4f563e7ce070c1883aefda1790736f424 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 21 Jan 2020 21:36:40 +0100 Subject: [PATCH 113/230] Fix filter on parent account in list of accounting accounts --- htdocs/accountancy/admin/account.php | 16 ++++++++++++---- htdocs/core/class/html.form.class.php | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/htdocs/accountancy/admin/account.php b/htdocs/accountancy/admin/account.php index 9c4536e94c4..5423ae7b41d 100644 --- a/htdocs/accountancy/admin/account.php +++ b/htdocs/accountancy/admin/account.php @@ -27,6 +27,7 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php'; // Load translation files required by the page $langs->loadLangs(array("compta", "bills", "admin", "accountancy", "salaries")); @@ -180,6 +181,7 @@ if (empty($reshook)) */ $form = new Form($db); +$formaccounting = new FormAccounting($db); llxHeader('', $langs->trans("ListAccounts")); @@ -200,7 +202,7 @@ $sql .= " WHERE asy.rowid = ".$pcgver; //print $sql; if (strlen(trim($search_account))) $sql .= natural_search("aa.account_number", $search_account); if (strlen(trim($search_label))) $sql .= natural_search("aa.label", $search_label); -if (strlen(trim($search_accountparent))) $sql .= natural_search("aa.account_parent", $search_accountparent); +if (strlen(trim($search_accountparent)) && $search_accountparent != '-1') $sql .= natural_search("aa.account_parent", $search_accountparent, 2); if (strlen(trim($search_pcgtype))) $sql .= natural_search("aa.pcg_type", $search_pcgtype); if (strlen(trim($search_pcgsubtype))) $sql .= natural_search("aa.pcg_subtype", $search_pcgsubtype); $sql .= $db->order($sortfield, $sortorder); @@ -232,7 +234,7 @@ if ($resql) if ($limit > 0 && $limit != $conf->liste_limit) $param .= '&limit='.$limit; if ($search_account) $param .= '&search_account='.urlencode($search_account); if ($search_label) $param .= '&search_label='.urlencode($search_label); - if ($search_accountparent) $param .= '&search_accountparent='.urlencode($search_accountparent); + if ($search_accountparent > 0 || $search_accountparent == '0') $param .= '&search_accountparent='.urlencode($search_accountparent); if ($search_pcgtype) $param .= '&search_pcgtype='.urlencode($search_pcgtype); if ($search_pcgsubtype) $param .= '&search_pcgsubtype='.urlencode($search_pcgsubtype); if ($optioncss != '') $param .= '&optioncss='.$optioncss; @@ -316,8 +318,13 @@ if ($resql) print ''; if (!empty($arrayfields['aa.account_number']['checked'])) print ''; if (!empty($arrayfields['aa.label']['checked'])) print ''; - if (!empty($arrayfields['aa.account_parent']['checked'])) print ''; - if (!empty($arrayfields['aa.pcg_type']['checked'])) print ''; + if (!empty($arrayfields['aa.account_parent']['checked'])) { + print ''; + } + if (!empty($arrayfields['aa.pcg_type']['checked'])) print ''; if (!empty($arrayfields['aa.pcg_subtype']['checked'])) print ''; if (!empty($arrayfields['aa.active']['checked'])) print ''; print ''; } if (!empty($arrayfields['aa.pcg_type']['checked'])) print ''; diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 921579df947..a4928136c9e 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -6235,7 +6235,12 @@ class Form $out .= '\n"; print '
    '; print $langs->trans("PriceLevel").''.$objsoc->price_level."
    '; print '
    '; - print $formaccounting->select_auxaccount($search_accountancy_subledger, 'search_accountancy_subledger', 1, array (), 1, 1, 'maxwidth200'); + print $formaccounting->select_auxaccount($search_accountancy_subledger, 'search_accountancy_subledger', 1, 'maxwidth200'); print '
    '; print '
    '; - print measuringUnitString(0, 'weight', $product_static->weight_units); + if ($product_static->weight != '') print measuringUnitString(0, 'weight', $product_static->weight_units); print ''; - print measuringUnitString(0, 'size', $product_static->length_units); + if ($product_static->length != '') print measuringUnitString(0, 'size', $product_static->length_units); print ''; - print measuringUnitString(0, 'size', $product_static->width_units); + if ($product_static->width != '') print measuringUnitString(0, 'size', $product_static->width_units); print ''; - print measuringUnitString(0, 'size', $product_static->height_units); + if ($product_static->height != '') print measuringUnitString(0, 'size', $product_static->height_units); print ''; - print measuringUnitString(0, 'surface', $product_static->surface_units); + if ($product_static->surface != '') print measuringUnitString(0, 'surface', $product_static->surface_units); print ''; - print measuringUnitString(0, 'volume', $product_static->volume_units); + if ($product_static->volume != '') print measuringUnitString(0, 'volume', $product_static->volume_units); print ''.$obj->fk_product_type.''; + if ($obj->fk_product_type == 0) print $langs->trans("Product"); + else print $langs->trans("Service"); + print '
    '; + print $formaccounting->select_account($search_accountparent, 'search_accountparent', 2); + //print ''; + print ' '; @@ -339,6 +346,7 @@ if ($resql) $accountstatic = new AccountingAccount($db); $accountparent = new AccountingAccount($db); + $totalarray = array(); $i = 0; while ($i < min($num, $limit)) { diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index bc69d809e46..921579df947 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -6235,7 +6235,7 @@ class Form $out .= ''; print $formaccounting->select_account($search_accountparent, 'search_accountparent', 2); - //print ''; print '
    '; +/* print '
    '; if ($conf->global->MAIN_FEATURES_LEVEL >= 2) { @@ -471,7 +472,7 @@ if ($conf->global->MAIN_FEATURES_LEVEL >= 2) print ''."\n"; // Example with a yes / no select - /*print ''; + print ''; print ''.$langs->trans("INVENTORY_DISABLE_VIRTUAL").''; print ''; if ($conf->use_javascript_ajax) { @@ -481,10 +482,10 @@ if ($conf->global->MAIN_FEATURES_LEVEL >= 2) print $form->selectarray("INVENTORY_DISABLE_VIRTUAL", $arrval, $conf->global->INVENTORY_DISABLE_VIRTUAL); } print ''; - */ + // Example with a yes / no select - /*print ''; + print ''; print ''.$langs->trans("INVENTORY_USE_MIN_PA_IF_NO_LAST_PA").''; print ''; if ($conf->use_javascript_ajax) { @@ -494,7 +495,7 @@ if ($conf->global->MAIN_FEATURES_LEVEL >= 2) print $form->selectarray("INVENTORY_USE_MIN_PA_IF_NO_LAST_PA", $arrval, $conf->global->INVENTORY_USE_MIN_PA_IF_NO_LAST_PA); } print ''; - */ + // Example with a yes / no select print ''; @@ -507,8 +508,10 @@ if ($conf->global->MAIN_FEATURES_LEVEL >= 2) print $form->selectarray("INVENTORY_USE_INVENTORY_DATE_FOR_DATE_OF_MVT", $arrval, $conf->global->INVENTORY_USE_INVENTORY_DATE_FOR_DATE_OF_MVT); } print ''; + print ''; } +*/ /* I keep the option/feature, but hidden to end users for the moment. If feature is used by module, no need to have users see it. If not used by a module, I still need to understand in which case user may need this now we can set rule on product page. From 73ee655dde2ef8483e8a0eb3d3f64ae17c13ef69 Mon Sep 17 00:00:00 2001 From: Laurent De Coninck Date: Wed, 22 Jan 2020 08:13:00 +0100 Subject: [PATCH 121/230] fix minimum quantity on stock movement by fixing another issue on the batch management in the API, I introduced a bug on the stock quantity decrease. [see: X] --- htdocs/product/stock/class/api_stockmovements.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/stock/class/api_stockmovements.class.php b/htdocs/product/stock/class/api_stockmovements.class.php index 9951c05d323..721744d0c55 100644 --- a/htdocs/product/stock/class/api_stockmovements.class.php +++ b/htdocs/product/stock/class/api_stockmovements.class.php @@ -164,7 +164,7 @@ class StockMovements extends DolibarrApi * * @param int $product_id Id product id {@min 1} {@from body} {@required true} * @param int $warehouse_id Id warehouse {@min 1} {@from body} {@required true} - * @param float $qty Qty to add (Use negative value for a stock decrease) {@min 0} {@message qty must be higher than 0} {@from body} {@required true} + * @param float $qty Qty to add (Use negative value for a stock decrease) {@from body} {@required true} * @param string $lot Lot {@from body} * @param string $movementcode Movement code {@example INV123} {@from body} * @param string $movementlabel Movement label {@example Inventory number 123} {@from body} From 3ce077320c96585de55f0913267c8e71fcd7e4da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Wed, 22 Jan 2020 10:23:31 +0100 Subject: [PATCH 122/230] retrieve extrafields oldline when updating line --- htdocs/contrat/class/contrat.class.php | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index 7434d886072..086327db50a 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -9,7 +9,7 @@ * Copyright (C) 2013 Florian Henry * Copyright (C) 2014-2015 Marcos García * Copyright (C) 2018 Nicolas ZABOURI - * Copyright (C) 2018-2019 Frédéric France + * Copyright (C) 2018-2020 Frédéric France * Copyright (C) 2015-2018 Ferran Marcet * * This program is free software; you can redistribute it and/or modify @@ -675,18 +675,18 @@ class Contrat extends CommonObject { $this->id = $obj->rowid; $this->ref = (!isset($obj->ref) || !$obj->ref) ? $obj->rowid : $obj->ref; - $this->ref_customer = $obj->ref_customer; - $this->ref_supplier = $obj->ref_supplier; + $this->ref_customer = $obj->ref_customer; + $this->ref_supplier = $obj->ref_supplier; $this->ref_ext = $obj->ref_ext; $this->entity = $obj->entity; $this->statut = $obj->statut; $this->mise_en_service = $this->db->jdate($obj->datemise); - $this->date_contrat = $this->db->jdate($obj->datecontrat); - $this->date_creation = $this->db->jdate($obj->datecontrat); + $this->date_contrat = $this->db->jdate($obj->datecontrat); + $this->date_creation = $this->db->jdate($obj->datecontrat); - $this->fin_validite = $this->db->jdate($obj->fin_validite); - $this->date_cloture = $this->db->jdate($obj->date_cloture); + $this->fin_validite = $this->db->jdate($obj->fin_validite); + $this->date_cloture = $this->db->jdate($obj->date_cloture); $this->user_author_id = $obj->fk_user_author; @@ -696,9 +696,9 @@ class Contrat extends CommonObject $this->note_private = $obj->note_private; $this->note_public = $obj->note_public; - $this->modelpdf = $obj->model_pdf; + $this->modelpdf = $obj->model_pdf; - $this->fk_projet = $obj->fk_project; // deprecated + $this->fk_projet = $obj->fk_project; // deprecated $this->fk_project = $obj->fk_project; $this->socid = $obj->fk_soc; @@ -708,7 +708,7 @@ class Contrat extends CommonObject $this->db->free($resql); - // Retreive all extrafields + // Retrieve all extrafields // fetch optionals attributes and labels $this->fetch_optionals(); @@ -3004,6 +3004,7 @@ class ContratLigne extends CommonObjectLine $this->oldcopy = new ContratLigne($this->db); $this->oldcopy->fetch($this->id); + $this->oldcopy->fetch_optionals(); // Update request $sql = "UPDATE ".MAIN_DB_PREFIX."contratdet SET"; From 7a0bff06b93aa28e35ebcee6e82b1d78c70bd4db Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 22 Jan 2020 12:44:10 +0100 Subject: [PATCH 123/230] Fix reponsive --- htdocs/user/home.php | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/htdocs/user/home.php b/htdocs/user/home.php index fbf90e44cc6..2bc273d1594 100644 --- a/htdocs/user/home.php +++ b/htdocs/user/home.php @@ -64,14 +64,13 @@ llxHeader(); print load_fiche_titre($langs->trans("MenuUsersAndGroups")); -//print ''; -//print '
    '; print '
    '; // Search User print '
    '; print ''; + print ''; print ''; print ''; print "
    '.$langs->trans("Search").'
    '; @@ -86,6 +85,7 @@ if ($canreadperms) print '

    \n"; + print '
    '; print '
    '; @@ -124,6 +124,8 @@ $resql=$db->query($sql); if ($resql) { $num = $db->num_rows($resql); + + print '
    '; print ''; print ''; print ''; @@ -204,7 +206,8 @@ if ($resql) print ''; $i++; } - print "
    '.$langs->trans("LastUsersCreated", min($num, $max)).''.$langs->trans("FullList").'

    "; + print "
    "; + print "
    "; $db->free($resql); } @@ -240,6 +243,8 @@ if ($canreadperms) $colspan=1; if (! empty($conf->multicompany->enabled)) $colspan++; $num = $db->num_rows($resql); + + print '
    '; print ''; print ''; print ''; @@ -275,7 +280,8 @@ if ($canreadperms) print ""; $i++; } - print "
    '.$langs->trans("LastGroupsCreated", ($num ? $num : $max)).''.$langs->trans("FullList").'

    "; + print ""; + print "

    "; $db->free($resql); } From 0c666ee73baf22201bc17c235264c8f98b3bd421 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 22 Jan 2020 12:46:01 +0100 Subject: [PATCH 124/230] Fix reponsive --- htdocs/user/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/user/list.php b/htdocs/user/list.php index c73825df145..eb14f61e982 100644 --- a/htdocs/user/list.php +++ b/htdocs/user/list.php @@ -519,7 +519,7 @@ while ($i < min($num, $limit)) print ""; if (! empty($arrayfields['u.login']['checked'])) { - print ''; + print ''; print $li; if (! empty($conf->multicompany->enabled) && $obj->admin && ! $obj->entity) { From de9942624710e97dddc18e508af6d668914cbc0b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 22 Jan 2020 12:53:51 +0100 Subject: [PATCH 125/230] Fix MRP --- htdocs/core/modules/modMrp.class.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/modules/modMrp.class.php b/htdocs/core/modules/modMrp.class.php index 20c45dfe59b..a5d58bd8333 100644 --- a/htdocs/core/modules/modMrp.class.php +++ b/htdocs/core/modules/modMrp.class.php @@ -240,17 +240,17 @@ class modMrp extends DolibarrModules // Add here entries to declare new permissions /* BEGIN MODULEBUILDER PERMISSIONS */ $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) - $this->rights[$r][1] = 'Read objects of Mrp'; // Permission label + $this->rights[$r][1] = 'Read Manufacturing Order'; // Permission label $this->rights[$r][4] = 'read'; // In php code, permission will be checked by test if ($user->rights->mrp->level1->level2) $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->mrp->level1->level2) $r++; $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) - $this->rights[$r][1] = 'Create/Update objects of Mrp'; // Permission label + $this->rights[$r][1] = 'Create/Update Manufacturing Order'; // Permission label $this->rights[$r][4] = 'write'; // In php code, permission will be checked by test if ($user->rights->mrp->level1->level2) $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->mrp->level1->level2) $r++; $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) - $this->rights[$r][1] = 'Delete objects of Mrp'; // Permission label + $this->rights[$r][1] = 'Delete Manufacturing Order'; // Permission label $this->rights[$r][4] = 'delete'; // In php code, permission will be checked by test if ($user->rights->mrp->level1->level2) $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->mrp->level1->level2) $r++; From 13a9a22cc5966377628f3e944f24631d6907bebf Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 22 Jan 2020 13:02:50 +0100 Subject: [PATCH 126/230] Fix responsive demo --- htdocs/public/demo/demo.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/htdocs/public/demo/demo.css b/htdocs/public/demo/demo.css index 7f482367eba..9328a8ecd1b 100644 --- a/htdocs/public/demo/demo.css +++ b/htdocs/public/demo/demo.css @@ -110,6 +110,9 @@ img.demothumb { @media only screen and (max-width: 767px) { + .CTable { + width: 300px; + } .demobody { line-height: 150% !important; font-size: 100% !important; From d87419f3dbdfdf50aa00bd3e4735520de35c0489 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 22 Jan 2020 13:34:07 +0100 Subject: [PATCH 127/230] FIX #11957 --- htdocs/comm/action/class/actioncomm.class.php | 6 +++++- htdocs/comm/action/index.php | 9 +++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index 95cbd6beb7a..01f38eb531f 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -1393,7 +1393,11 @@ class ActionComm extends CommonObject if (!empty($conf->dol_no_mouse_hover)) $notooltip = 1; // Force disable tooltips - if ((!$user->rights->agenda->allactions->read && $this->authorid != $user->id) || (!$user->rights->agenda->myactions->read && $this->authorid == $user->id)) + $canread = 0; + if ($user->rights->agenda->myactions->read && $this->authorid == $user->id) $canread = 1; // Can read my event + if ($user->rights->agenda->myactions->read && array_key_exists($user->id, $this->userassigned)) $canread = 1; // Can read my event i am assigned + if ($user->rights->agenda->allactions->read) $canread = 1; // Can read all event of other + if (! $canread) { $option = 'nolink'; } diff --git a/htdocs/comm/action/index.php b/htdocs/comm/action/index.php index c4750ef54db..a9a832ea6b4 100644 --- a/htdocs/comm/action/index.php +++ b/htdocs/comm/action/index.php @@ -1568,13 +1568,12 @@ function show_day_events($db, $day, $month, $year, $monthshown, $style, &$eventa $titletoshow = $daterange; $titletoshow .= ($titletoshow ? ' ' : '').($event->label ? $event->label : $event->libelle); - if ($event->type_code == 'ICALEVENT') print $titletoshow; - else - { + if ($event->type_code != 'ICALEVENT') { $savlabel = $event->label ? $event->label : $event->libelle; $event->label = $titletoshow; $event->libelle = $titletoshow; - print $event->getNomUrl(0, $maxnbofchar, 'cal_event', '', 0, 0); + // Note: List of users are inside $event->userassigned. Link may be clickable depending on permissions of user. + $titletoshow = $event->getNomUrl(0, $maxnbofchar, 'cal_event', '', 0, 0); $event->label = $savlabel; $event->libelle = $savlabel; } @@ -1595,6 +1594,8 @@ function show_day_events($db, $day, $month, $year, $monthshown, $style, &$eventa $listofusertoshow .= $cacheusers[$tmpid]->getNomUrl(-3, '', 0, 0, 0, 0, '', 'paddingright valigntextbottom'); } + + print $titletoshow; print $listofusertoshow; if ($event->type_code == 'ICALEVENT') print '
    ('.dol_trunc($event->icalname, $maxnbofchar).')'; From 0456994f0dd1973650c8ce44d9f14c41cd5df2d3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 22 Jan 2020 13:34:21 +0100 Subject: [PATCH 128/230] Responsive --- htdocs/langs/en_US/admin.lang | 2 +- htdocs/theme/eldy/global.inc.php | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 8db158323a0..3c351467284 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -878,7 +878,7 @@ Permission1251=Run mass imports of external data into database (data load) Permission1321=Export customer invoices, attributes and payments Permission1322=Reopen a paid bill Permission1421=Export sales orders and attributes -Permission2401=Read actions (events or tasks) linked to his user account (if owner of event) +Permission2401=Read actions (events or tasks) linked to his user account (if owner of event or just assigned to) Permission2402=Create/modify actions (events or tasks) linked to his user account (if owner of event) Permission2403=Delete actions (events or tasks) linked to his user account (if owner of event) Permission2411=Read actions (events or tasks) of others diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 6d7dbb05b95..4b731808d2e 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -3512,6 +3512,7 @@ div.info { padding-bottom: 8px; margin: 1em 0em 1em 0em; background: #eff8fc; + color: #666; } /* Warning message */ From 395b9bf7ac276ca09a79056808fdbf948b74029c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 22 Jan 2020 13:41:05 +0100 Subject: [PATCH 129/230] Fix syntax error --- htdocs/core/modules/facture/doc/pdf_sponge.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php index 39829c4d06c..a5cf5b5ad3f 100644 --- a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php @@ -1473,7 +1473,7 @@ class pdf_sponge extends ModelePDFFactures $tvakey=str_replace('*', '', $tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transcountrynoentities("TotalLT2", $mysoc->country_code)(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalLT2", $mysoc->country_code) : ''); + $totalvat = $outputlangs->transcountrynoentities("TotalLT2", $mysoc->country_code).(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalLT2", $mysoc->country_code) : ''); $totalvat.=' '; $totalvat.=vatrate(abs($tvakey), 1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); From 443e4e22230f4c069c58d5da73e5f70076aecfa3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 22 Jan 2020 13:44:42 +0100 Subject: [PATCH 130/230] Update html.form.class.php --- htdocs/core/class/html.form.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index cb46be383db..acbd15712e5 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -5044,11 +5044,11 @@ class Form { if ($societe_vendeuse->id == $mysoc->id) { - $return.= '
    '.$langs->trans("ErrorYourCountryIsNotDefined").'
    '; + $return.= ''.$langs->trans("ErrorYourCountryIsNotDefined").''; } else { - $return.= '
    '.$langs->trans("ErrorSupplierCountryIsNotDefined").'
    '; + $return.= ''.$langs->trans("ErrorSupplierCountryIsNotDefined").''; } return $return; } From 999e36344616c199a8cf5ebb3ba28831f369036e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 22 Jan 2020 13:52:37 +0100 Subject: [PATCH 131/230] Update charge.php --- htdocs/stripe/charge.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/htdocs/stripe/charge.php b/htdocs/stripe/charge.php index 3483efcaa18..992b5266b5b 100644 --- a/htdocs/stripe/charge.php +++ b/htdocs/stripe/charge.php @@ -142,7 +142,11 @@ if (!$rowid) } if (! empty($charge->payment_intent)) { - $charge = \Stripe\PaymentIntent::retrieve($charge->payment_intent, array("stripe_account" => $stripeacc)); + if (empty($stripeacc)) { // If the Stripe connect account not set, we use common API usage + $charge = \Stripe\PaymentIntent::retrieve($charge->payment_intent); + } else { + $charge = \Stripe\PaymentIntent::retrieve($charge->payment_intent, array("stripe_account" => $stripeacc)); + } } // The metadata FULLTAG is defined by the online payment page From fc894d7a2002f2687955d1fe8653f27e9afeabe8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 22 Jan 2020 13:53:20 +0100 Subject: [PATCH 132/230] Fix for stripe connect --- htdocs/public/payment/newpayment.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/public/payment/newpayment.php b/htdocs/public/payment/newpayment.php index dbceb483f97..729a8c68be6 100644 --- a/htdocs/public/payment/newpayment.php +++ b/htdocs/public/payment/newpayment.php @@ -658,7 +658,7 @@ if ($action == 'charge' && ! empty($conf->stripe->enabled)) \Stripe\Stripe::setApiKey($stripearrayofkeysbyenv[$servicestatus]['secret_key']); try { - if (empty($key)) { // If the Stripe connect account not set, we use common API usage + if (empty($stripeacc)) { // If the Stripe connect account not set, we use common API usage $paymentintent = \Stripe\PaymentIntent::retrieve($paymentintent_id); } else { $paymentintent = \Stripe\PaymentIntent::retrieve($paymentintent_id, array("stripe_account" => $stripeacc)); From bfc8369418e9fc02db206f9a5d6426bbb6a61f29 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 22 Jan 2020 14:15:08 +0100 Subject: [PATCH 133/230] Fix phpcs --- htdocs/comm/propal/class/propal.class.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index 4c685cbd122..791c4872794 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -3432,7 +3432,6 @@ class Propal extends CommonObject $xnbp++; } -// var_dump($this->lines);exit; } // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps From ee21ea5ef8d93c90662edea0f8159d6d9c935acf Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 22 Jan 2020 14:27:38 +0100 Subject: [PATCH 134/230] Fix phpcs --- htdocs/core/modules/facture/doc/pdf_sponge.modules.php | 4 ++-- phpstan.neon | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php index a5cf5b5ad3f..70b2a1f989f 100644 --- a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php @@ -1524,7 +1524,7 @@ class pdf_sponge extends ModelePDFFactures $tvakey = str_replace('*', '', $tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transcountrynoentities("TotalVAT", $mysoc->country_code)(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalVAT", $mysoc->country_code) : ''); + $totalvat = $outputlangs->transcountrynoentities("TotalVAT", $mysoc->country_code).(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalVAT", $mysoc->country_code) : ''); $totalvat.=' '; $totalvat .= vatrate($tvakey, 1).$tvacompl; $pdf->MultiCell($col2x - $col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -1556,7 +1556,7 @@ class pdf_sponge extends ModelePDFFactures $tvakey=str_replace('*', '', $tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transcountrynoentities("TotalLT1", $mysoc->country_code)(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalLT1", $mysoc->country_code) : ''); + $totalvat = $outputlangs->transcountrynoentities("TotalLT1", $mysoc->country_code).(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalLT1", $mysoc->country_code) : ''); $totalvat.=' '; $totalvat.=vatrate(abs($tvakey), 1).$tvacompl; diff --git a/phpstan.neon b/phpstan.neon index a33a17919f4..71b70a42218 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -25,7 +25,6 @@ parameters: - %currentWorkingDirectory%/htdocs/compta/localtax/class - %currentWorkingDirectory%/htdocs/compta/paiement/class - %currentWorkingDirectory%/htdocs/compta/prelevement/class - - %currentWorkingDirectory%/htdocs/compta/salaries/class - %currentWorkingDirectory%/htdocs/compta/sociales/class - %currentWorkingDirectory%/htdocs/compta/tva/class - %currentWorkingDirectory%/htdocs/conf @@ -76,6 +75,7 @@ parameters: - %currentWorkingDirectory%/htdocs/projet/class - %currentWorkingDirectory%/htdocs/reception/class - %currentWorkingDirectory%/htdocs/resource/class + - %currentWorkingDirectory%/htdocs/salaries/class - %currentWorkingDirectory%/htdocs/societe/class - %currentWorkingDirectory%/htdocs/stripe/class - %currentWorkingDirectory%/htdocs/supplier_proposal/class From d6a31f60cdcd9136d6aadb68fb13cb9beac9fde1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 22 Jan 2020 14:39:00 +0100 Subject: [PATCH 135/230] Clean code --- htdocs/core/modules/commande/doc/pdf_einstein.modules.php | 6 ++---- .../core/modules/commande/doc/pdf_eratosthene.modules.php | 6 ++---- .../core/modules/expensereport/doc/pdf_standard.modules.php | 2 -- htdocs/core/modules/facture/doc/pdf_crabe.modules.php | 6 ++---- htdocs/core/modules/facture/doc/pdf_sponge.modules.php | 6 ++---- htdocs/core/modules/facture/modules_facture.php | 4 ++++ htdocs/core/modules/livraison/doc/pdf_typhon.modules.php | 2 -- htdocs/core/modules/propale/doc/pdf_azur.modules.php | 6 ++---- htdocs/core/modules/propale/doc/pdf_cyan.modules.php | 6 ++---- .../modules/supplier_invoice/doc/pdf_canelle.modules.php | 2 -- .../core/modules/supplier_order/doc/pdf_cornas.modules.php | 6 ++---- .../modules/supplier_order/doc/pdf_muscadet.modules.php | 6 ++---- .../modules/supplier_payment/doc/pdf_standard.modules.php | 2 -- .../modules/supplier_proposal/doc/pdf_aurore.modules.php | 2 -- 14 files changed, 20 insertions(+), 42 deletions(-) diff --git a/htdocs/core/modules/commande/doc/pdf_einstein.modules.php b/htdocs/core/modules/commande/doc/pdf_einstein.modules.php index 6bfee834b9b..e8a09515d91 100644 --- a/htdocs/core/modules/commande/doc/pdf_einstein.modules.php +++ b/htdocs/core/modules/commande/doc/pdf_einstein.modules.php @@ -160,8 +160,6 @@ class pdf_einstein extends ModelePDFCommandes $this->option_freetext = 1; // Support add of a personalised text $this->option_draft_watermark = 1; // Support add of a watermark on drafts - $this->franchise=!$mysoc->tva_assuj; - // Get source company $this->emetteur=$mysoc; if (empty($this->emetteur->country_code)) $this->emetteur->country_code=substr($langs->defaultlang, -2); // By default, if was not defined @@ -678,13 +676,13 @@ class pdf_einstein extends ModelePDFCommandes protected function _tableau_info(&$pdf, $object, $posy, $outputlangs) { // phpcs:enable - global $conf; + global $conf, $mysoc; $default_font_size = pdf_getPDFFontSize($outputlangs); $pdf->SetFont('', '', $default_font_size - 1); // If France, show VAT mention if not applicable - if ($this->emetteur->country_code == 'FR' && $this->franchise == 1) + if ($this->emetteur->country_code == 'FR' && empty($mysoc->tva_assuj)) { $pdf->SetFont('', 'B', $default_font_size - 2); $pdf->SetXY($this->marge_gauche, $posy); diff --git a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php index d310f176039..29ba0cffc81 100644 --- a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php +++ b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php @@ -160,8 +160,6 @@ class pdf_eratosthene extends ModelePDFCommandes $this->option_freetext = 1; // Support add of a personalised text $this->option_draft_watermark = 1; // Support add of a watermark on drafts - $this->franchise=!$mysoc->tva_assuj; - // Get source company $this->emetteur=$mysoc; if (empty($this->emetteur->country_code)) $this->emetteur->country_code=substr($langs->defaultlang, -2); // By default, if was not defined @@ -877,13 +875,13 @@ class pdf_eratosthene extends ModelePDFCommandes */ protected function drawInfoTable(&$pdf, $object, $posy, $outputlangs) { - global $conf; + global $conf, $mysoc; $default_font_size = pdf_getPDFFontSize($outputlangs); $pdf->SetFont('', '', $default_font_size - 1); // If France, show VAT mention if not applicable - if ($this->emetteur->country_code == 'FR' && $this->franchise == 1) + if ($this->emetteur->country_code == 'FR' && empty($mysoc->tva_assuj)) { $pdf->SetFont('', 'B', $default_font_size - 2); $pdf->SetXY($this->marge_gauche, $posy); diff --git a/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php b/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php index a2cefcf9ff0..3936dccae95 100644 --- a/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php +++ b/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php @@ -155,8 +155,6 @@ class pdf_standard extends ModeleExpenseReport $this->option_freetext = 1; // Support add of a personalised text $this->option_draft_watermark = 1; // Support add of a watermark on drafts - $this->franchise = !$mysoc->tva_assuj; - // Get source company $this->emetteur=$mysoc; diff --git a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php index 0f7b892cf9a..9ab176186a6 100644 --- a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php @@ -171,8 +171,6 @@ class pdf_crabe extends ModelePDFFactures $this->option_freetext = 1; // Support add of a personalised text $this->option_draft_watermark = 1; // Support add of a watermark on drafts - $this->franchise = !$mysoc->tva_assuj; - // Get source company $this->emetteur = $mysoc; if (empty($this->emetteur->country_code)) $this->emetteur->country_code = substr($langs->defaultlang, -2); // By default, if was not defined @@ -965,14 +963,14 @@ class pdf_crabe extends ModelePDFFactures protected function _tableau_info(&$pdf, $object, $posy, $outputlangs) { // phpcs:enable - global $conf; + global $conf, $mysoc; $default_font_size = pdf_getPDFFontSize($outputlangs); $pdf->SetFont('', '', $default_font_size - 1); // If France, show VAT mention if not applicable - if ($this->emetteur->country_code == 'FR' && $this->franchise == 1) + if ($this->emetteur->country_code == 'FR' && empty($mysoc->tva_assuj)) { $pdf->SetFont('', 'B', $default_font_size - 2); $pdf->SetXY($this->marge_gauche, $posy); diff --git a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php index 70b2a1f989f..ead9b843c06 100644 --- a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php @@ -171,8 +171,6 @@ class pdf_sponge extends ModelePDFFactures $this->option_freetext = 1; // Support add of a personalised text $this->option_draft_watermark = 1; // Support add of a watermark on drafts - $this->franchise=!$mysoc->tva_assuj; - // Get source company $this->emetteur=$mysoc; if (empty($this->emetteur->country_code)) $this->emetteur->country_code=substr($langs->defaultlang, -2); // By default, if was not defined @@ -1051,14 +1049,14 @@ class pdf_sponge extends ModelePDFFactures */ protected function drawInfoTable(&$pdf, $object, $posy, $outputlangs) { - global $conf; + global $conf, $mysoc; $default_font_size = pdf_getPDFFontSize($outputlangs); $pdf->SetFont('', '', $default_font_size - 1); // If France, show VAT mention if not applicable - if ($this->emetteur->country_code == 'FR' && $this->franchise == 1) + if ($this->emetteur->country_code == 'FR' && empty($mysoc->tva_assuj)) { $pdf->SetFont('', 'B', $default_font_size - 2); $pdf->SetXY($this->marge_gauche, $posy); diff --git a/htdocs/core/modules/facture/modules_facture.php b/htdocs/core/modules/facture/modules_facture.php index ba65eeeca9c..f27f086ec7d 100644 --- a/htdocs/core/modules/facture/modules_facture.php +++ b/htdocs/core/modules/facture/modules_facture.php @@ -42,6 +42,10 @@ abstract class ModelePDFFactures extends CommonDocGenerator */ public $error=''; + public $atleastonediscount = 0; + public $atleastoneratenotnull = 0; + + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps /** * Return list of active generation modules diff --git a/htdocs/core/modules/livraison/doc/pdf_typhon.modules.php b/htdocs/core/modules/livraison/doc/pdf_typhon.modules.php index 00268810ce8..fca1df1386d 100644 --- a/htdocs/core/modules/livraison/doc/pdf_typhon.modules.php +++ b/htdocs/core/modules/livraison/doc/pdf_typhon.modules.php @@ -142,8 +142,6 @@ class pdf_typhon extends ModelePDFDeliveryOrder $this->option_tva = 1; // Manage the vat option FACTURE_TVAOPTION $this->option_codeproduitservice = 1; // Display product-service code - $this->franchise=!$mysoc->tva_assuj; - // Get source company $this->emetteur=$mysoc; if (empty($this->emetteur->country_code)) $this->emetteur->country_code=substr($langs->defaultlang, -2); // By default, if was not defined diff --git a/htdocs/core/modules/propale/doc/pdf_azur.modules.php b/htdocs/core/modules/propale/doc/pdf_azur.modules.php index cd0240c4da7..fada0b8a142 100644 --- a/htdocs/core/modules/propale/doc/pdf_azur.modules.php +++ b/htdocs/core/modules/propale/doc/pdf_azur.modules.php @@ -160,8 +160,6 @@ class pdf_azur extends ModelePDFPropales $this->option_freetext = 1; // Support add of a personalised text $this->option_draft_watermark = 1; // Support add of a watermark on drafts - $this->franchise = !$mysoc->tva_assuj; - // Get source company $this->emetteur = $mysoc; if (empty($this->emetteur->country_code)) $this->emetteur->country_code = substr($langs->defaultlang, -2); // By default, if was not defined @@ -866,13 +864,13 @@ class pdf_azur extends ModelePDFPropales protected function _tableau_info(&$pdf, $object, $posy, $outputlangs) { // phpcs:enable - global $conf; + global $conf, $mysoc; $default_font_size = pdf_getPDFFontSize($outputlangs); $pdf->SetFont('', '', $default_font_size - 1); // If France, show VAT mention if not applicable - if ($this->emetteur->country_code == 'FR' && $this->franchise == 1) + if ($this->emetteur->country_code == 'FR' && empty($mysoc->tva_assuj)) { $pdf->SetFont('', 'B', $default_font_size - 2); $pdf->SetXY($this->marge_gauche, $posy); diff --git a/htdocs/core/modules/propale/doc/pdf_cyan.modules.php b/htdocs/core/modules/propale/doc/pdf_cyan.modules.php index 6809f234eda..ed4a3210763 100644 --- a/htdocs/core/modules/propale/doc/pdf_cyan.modules.php +++ b/htdocs/core/modules/propale/doc/pdf_cyan.modules.php @@ -159,8 +159,6 @@ class pdf_cyan extends ModelePDFPropales $this->option_freetext = 1; // Support add of a personalised text $this->option_draft_watermark = 1; // Support add of a watermark on drafts - $this->franchise=!$mysoc->tva_assuj; - // Get source company $this->emetteur=$mysoc; if (empty($this->emetteur->country_code)) $this->emetteur->country_code=substr($langs->defaultlang, -2); // By default, if was not defined @@ -978,13 +976,13 @@ class pdf_cyan extends ModelePDFPropales */ public function drawInfoTable(&$pdf, $object, $posy, $outputlangs) { - global $conf; + global $conf, $mysoc; $default_font_size = pdf_getPDFFontSize($outputlangs); $pdf->SetFont('', '', $default_font_size - 1); // If France, show VAT mention if not applicable - if ($this->emetteur->country_code == 'FR' && $this->franchise == 1) + if ($this->emetteur->country_code == 'FR' && empty($mysoc->tva_assuj)) { $pdf->SetFont('', 'B', $default_font_size - 2); $pdf->SetXY($this->marge_gauche, $posy); diff --git a/htdocs/core/modules/supplier_invoice/doc/pdf_canelle.modules.php b/htdocs/core/modules/supplier_invoice/doc/pdf_canelle.modules.php index bd3ca0002e5..f318237a43e 100644 --- a/htdocs/core/modules/supplier_invoice/doc/pdf_canelle.modules.php +++ b/htdocs/core/modules/supplier_invoice/doc/pdf_canelle.modules.php @@ -152,8 +152,6 @@ class pdf_canelle extends ModelePDFSuppliersInvoices $this->option_codeproduitservice = 1; // Affiche code produit-service $this->option_multilang = 1; // Dispo en plusieurs langues - $this->franchise = !$mysoc->tva_assuj; - // Define column position $this->posxdesc = $this->marge_gauche + 1; $this->posxtva = 112; diff --git a/htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php b/htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php index fc18f18cca0..2fbeb7ccdca 100644 --- a/htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php +++ b/htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php @@ -153,8 +153,6 @@ class pdf_cornas extends ModelePDFSuppliersOrders $this->option_freetext = 1; // Support add of a personalised text $this->option_draft_watermark = 1; // Support add of a watermark on drafts - $this->franchise = !$mysoc->tva_assuj; - // Get source company $this->emetteur = $mysoc; if (empty($this->emetteur->country_code)) $this->emetteur->country_code = substr($langs->defaultlang, -2); // By default, if was not defined @@ -835,11 +833,11 @@ class pdf_cornas extends ModelePDFSuppliersOrders protected function _tableau_info(&$pdf, $object, $posy, $outputlangs) { // phpcs:enable - global $conf; + global $conf, $mysoc; $default_font_size = pdf_getPDFFontSize($outputlangs); // If France, show VAT mention if not applicable - if ($this->emetteur->country_code == 'FR' && $this->franchise == 1) + if ($this->emetteur->country_code == 'FR' && empty($mysoc->tva_assuj)) { $pdf->SetFont('', 'B', $default_font_size - 2); $pdf->SetXY($this->marge_gauche, $posy); diff --git a/htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php b/htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php index 8961644a2aa..2da47c09205 100644 --- a/htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php +++ b/htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php @@ -153,8 +153,6 @@ class pdf_muscadet extends ModelePDFSuppliersOrders $this->option_freetext = 1; // Support add of a personalised text $this->option_draft_watermark = 1; // Support add of a watermark on drafts - $this->franchise=!$mysoc->tva_assuj; - // Get source company $this->emetteur=$mysoc; if (empty($this->emetteur->country_code)) $this->emetteur->country_code=substr($langs->defaultlang, -2); // By default, if was not defined @@ -732,11 +730,11 @@ class pdf_muscadet extends ModelePDFSuppliersOrders protected function _tableau_info(&$pdf, $object, $posy, $outputlangs) { // phpcs:enable - global $conf; + global $conf, $mysoc; $default_font_size = pdf_getPDFFontSize($outputlangs); // If France, show VAT mention if not applicable - if ($this->emetteur->country_code == 'FR' && $this->franchise == 1) + if ($this->emetteur->country_code == 'FR' && empty($mysoc->tva_assuj)) { $pdf->SetFont('', 'B', $default_font_size - 2); $pdf->SetXY($this->marge_gauche, $posy); diff --git a/htdocs/core/modules/supplier_payment/doc/pdf_standard.modules.php b/htdocs/core/modules/supplier_payment/doc/pdf_standard.modules.php index e8b97224aad..9979509f027 100644 --- a/htdocs/core/modules/supplier_payment/doc/pdf_standard.modules.php +++ b/htdocs/core/modules/supplier_payment/doc/pdf_standard.modules.php @@ -142,8 +142,6 @@ class pdf_standard extends ModelePDFSuppliersPayments $this->option_logo = 1; // Affiche logo $this->option_multilang = 1; // Dispo en plusieurs langues - $this->franchise=!$mysoc->tva_assuj; - // Define column position $this->posxdate=$this->marge_gauche+1; $this->posxreffacturefourn=30; diff --git a/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php b/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php index ff8ab76c674..cb73468f6fd 100644 --- a/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php +++ b/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php @@ -150,8 +150,6 @@ class pdf_aurore extends ModelePDFSupplierProposal $this->option_freetext = 1; // Support add of a personalised text $this->option_draft_watermark = 1; //Support add of a watermark on drafts - $this->franchise=!$mysoc->tva_assuj; - // Get source company $this->emetteur=$mysoc; if (empty($this->emetteur->country_code)) $this->emetteur->country_code=substr($langs->defaultlang, -2); // By default, if was not defined From 2679f057fbaa3414041dfc6ddd349d37c9dcbbe4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 22 Jan 2020 14:40:43 +0100 Subject: [PATCH 136/230] Doc --- htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php | 2 +- htdocs/core/modules/facture/doc/pdf_sponge.modules.php | 2 +- htdocs/core/modules/propale/doc/pdf_cyan.modules.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php index 29ba0cffc81..03730936c0f 100644 --- a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php +++ b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php @@ -871,7 +871,7 @@ class pdf_eratosthene extends ModelePDFCommandes * @param Object $object Object to show * @param int $posy Y * @param Translate $outputlangs Langs object - * @return void + * @return int Pos y */ protected function drawInfoTable(&$pdf, $object, $posy, $outputlangs) { diff --git a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php index ead9b843c06..b45e8a04700 100644 --- a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php @@ -1045,7 +1045,7 @@ class pdf_sponge extends ModelePDFFactures * @param Object $object Object to show * @param int $posy Y * @param Translate $outputlangs Langs object - * @return void + * @return int Pos y */ protected function drawInfoTable(&$pdf, $object, $posy, $outputlangs) { diff --git a/htdocs/core/modules/propale/doc/pdf_cyan.modules.php b/htdocs/core/modules/propale/doc/pdf_cyan.modules.php index ed4a3210763..d8790c54eee 100644 --- a/htdocs/core/modules/propale/doc/pdf_cyan.modules.php +++ b/htdocs/core/modules/propale/doc/pdf_cyan.modules.php @@ -972,7 +972,7 @@ class pdf_cyan extends ModelePDFPropales * @param Object $object Object to show * @param int $posy Y * @param Translate $outputlangs Langs object - * @return void + * @return int Pos y */ public function drawInfoTable(&$pdf, $object, $posy, $outputlangs) { From 25665daa40439467765813cd1634a6343beddd67 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 22 Jan 2020 14:53:40 +0100 Subject: [PATCH 137/230] FIX #11957 --- htdocs/comm/action/class/actioncomm.class.php | 8 ++++---- htdocs/comm/action/list.php | 6 ++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index 01f38eb531f..41cdd5caf5c 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -791,16 +791,16 @@ class ActionComm extends CommonObject */ public function fetchResources() { - $sql = 'SELECT fk_actioncomm, element_type, fk_element, answer_status, mandatory, transparency'; + $this->userassigned = array(); + $this->socpeopleassigned = array(); + + $sql = 'SELECT fk_actioncomm, element_type, fk_element, answer_status, mandatory, transparency'; $sql .= ' FROM '.MAIN_DB_PREFIX.'actioncomm_resources'; $sql .= ' WHERE fk_actioncomm = '.$this->id; $sql .= " AND element_type IN ('user', 'socpeople')"; $resql = $this->db->query($sql); if ($resql) { - $this->userassigned = array(); - $this->socpeopleassigned = array(); - // If owner is known, we must but id first into list if ($this->userownerid > 0) $this->userassigned[$this->userownerid] = array('id'=>$this->userownerid); // Set first so will be first into list. diff --git a/htdocs/comm/action/list.php b/htdocs/comm/action/list.php index 8288db9d90b..6df7aaa55ba 100644 --- a/htdocs/comm/action/list.php +++ b/htdocs/comm/action/list.php @@ -554,7 +554,10 @@ if ($resql) $actionstatic->type_picto = $obj->type_picto; $actionstatic->label = $obj->label; $actionstatic->location = $obj->location; - $actionstatic->note = dol_htmlentitiesbr($obj->note); + $actionstatic->note = dol_htmlentitiesbr($obj->note); // deprecated + $actionstatic->note_public = dol_htmlentitiesbr($obj->note); + + $actionstatic->fetchResources(); print ''; @@ -656,7 +659,6 @@ if ($resql) if (!empty($arrayfields['a.fk_contact']['checked'])) { print ''; - $actionstatic->fetchResources(); if (!empty($actionstatic->socpeopleassigned)) { $contactList = array(); From 28d0b85b84e15299a576fa0ac4674f33efaf2a63 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 22 Jan 2020 14:56:19 +0100 Subject: [PATCH 138/230] Fix phpcs --- htdocs/core/lib/pdf.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/pdf.lib.php b/htdocs/core/lib/pdf.lib.php index 56b7f54d609..c1489a1b751 100644 --- a/htdocs/core/lib/pdf.lib.php +++ b/htdocs/core/lib/pdf.lib.php @@ -2143,7 +2143,7 @@ function pdf_getLinkedObjects($object, $outputlangs) $linkedobjects[$objecttype]['ref_title'] = $outputlangs->transnoentities("InterRef"); $linkedobjects[$objecttype]['ref_value'] = $outputlangs->transnoentities($elementobject->ref); $linkedobjects[$objecttype]['date_title'] = $outputlangs->transnoentities("InterDate"); - $linkedobjects[$objecttype]['date_value'] = dol_print_date($elementobject->datec,'day','',$outputlangs); + $linkedobjects[$objecttype]['date_value'] = dol_print_date($elementobject->datec, 'day', '', $outputlangs); } } elseif ($objecttype == 'shipping') From 88d01fbb224ee5e36eaada4388baeee9cf182847 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 22 Jan 2020 16:02:28 +0100 Subject: [PATCH 139/230] Save also customer account onn card level. --- htdocs/societe/paymentmodes.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/societe/paymentmodes.php b/htdocs/societe/paymentmodes.php index 4f0f349e7be..90d5d4412ae 100644 --- a/htdocs/societe/paymentmodes.php +++ b/htdocs/societe/paymentmodes.php @@ -222,7 +222,7 @@ if (empty($reshook)) if (GETPOST('stripe_card_ref', 'alpha') && GETPOST('stripe_card_ref', 'alpha') != $companypaymentmode->stripe_card_ref) { // If we set a stripe value that is different than previous one, we also set the stripe account - $companypaymentmode->stripe_account = $site_account; + $companypaymentmode->stripe_account = $stripecu.'@'.$site_account; } $companypaymentmode->stripe_card_ref = GETPOST('stripe_card_ref', 'alpha'); @@ -383,7 +383,7 @@ if (empty($reshook)) if (GETPOST('stripe_card_ref', 'alpha')) { // If we set a stripe value, we also set the stripe account - $companypaymentmode->stripe_account = $site_account; + $companypaymentmode->stripe_account = $stripecu.'@'.$site_account; } $companypaymentmode->stripe_card_ref = GETPOST('stripe_card_ref', 'alpha'); @@ -867,7 +867,7 @@ if ($socid && $action != 'edit' && $action != 'create' && $action != 'editcard' { $url = 'https://dashboard.stripe.com/'.$connect.'customers/'.$stripecu; } - print '
    '.img_picto($langs->trans('ShowInStripe').' - Publishable key '.$site_account, 'globe').''; + print ' '.img_picto($langs->trans('ShowInStripe').' - Publishable key = '.$site_account, 'globe').''; } print ''; if (empty($stripecu)) @@ -1077,7 +1077,7 @@ if ($socid && $action != 'edit' && $action != 'create' && $action != 'editcard' { $url = 'https://dashboard.stripe.com/'.$connect.'search?query='.$companypaymentmodetemp->stripe_card_ref; } - print ' '.img_picto($langs->trans('ShowInStripe').' - Publishable key '.$companypaymentmodetemp->stripe_account, 'globe').''; + print ' '.img_picto($langs->trans('ShowInStripe').' - Customer and Publishable key = '.$companypaymentmodetemp->stripe_account, 'globe').''; } print ''; print ''; From 7964699674f0e92cd859f873ac0dec512d4e94ad Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 22 Jan 2020 16:22:53 +0100 Subject: [PATCH 140/230] FIX Check on unicity on prof id was not triggered sometimes --- htdocs/societe/class/societe.class.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index f1d489751ac..793cbbbb97e 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -3284,6 +3284,12 @@ class Societe extends CommonObject // Define if third party is treated as company (or not) when nature is unknown $isacompany=empty($conf->global->MAIN_UNKNOWN_CUSTOMERS_ARE_COMPANIES)?0:1; // 0 by default if (! empty($this->tva_intra)) $isacompany=1; + elseif (! empty($this->idprof1)) $isacompany=1; + elseif (! empty($this->idprof2)) $isacompany=1; + elseif (! empty($this->idprof3)) $isacompany=1; + elseif (! empty($this->idprof4)) $isacompany=1; + elseif (! empty($this->idprof5)) $isacompany=1; + elseif (! empty($this->idprof6)) $isacompany=1; elseif (! empty($this->typent_code) && $this->typent_code != 'TE_UNKNOWN') { // TODO Add a field is_a_company into dictionary From 381f2d5eee3e41c896e608e9ea3ebb21c5cd334d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 22 Jan 2020 16:24:16 +0100 Subject: [PATCH 141/230] Fix typo --- htdocs/societe/class/societe.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 793cbbbb97e..dd6765e34f5 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -769,7 +769,7 @@ class Societe extends CommonObject } } - // Check for mandatory prof id (but only if country is other than ours) + // Check for mandatory prof id (but only if country is same than ours) if ($mysoc->country_id > 0 && $this->country_id == $mysoc->country_id) { $idprof_mandatory ='SOCIETE_'.$key.'_MANDATORY'; From 553107258e2763dd114b61918a61bdc81ac9b2b5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 22 Jan 2020 17:00:54 +0100 Subject: [PATCH 142/230] Fix alignement --- htdocs/admin/dict.php | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/htdocs/admin/dict.php b/htdocs/admin/dict.php index e5a525a62c9..af07dc9bfc6 100644 --- a/htdocs/admin/dict.php +++ b/htdocs/admin/dict.php @@ -1298,7 +1298,6 @@ if ($id) // Determines the name of the field in relation to the possible names // in data dictionaries $showfield = 1; // By defaut - $align = "left"; $cssprefix = ''; $sortable = 1; $valuetoshow = ucfirst($fieldlist[$field]); // By defaut @@ -1310,23 +1309,23 @@ if ($id) if ($fieldlist[$field] == 'taux') { if ($tabname[$id] != MAIN_DB_PREFIX."c_revenuestamp") $valuetoshow = $langs->trans("Rate"); else $valuetoshow = $langs->trans("Amount"); - $align = 'center'; + $cssprefix = 'center '; } - if ($fieldlist[$field] == 'localtax1_type') { $valuetoshow = $langs->trans("UseLocalTax")." 2"; $align = "center"; $sortable = 0; } - if ($fieldlist[$field] == 'localtax1') { $valuetoshow = $langs->trans("Rate")." 2"; $align = "center"; $sortable = 0; } - if ($fieldlist[$field] == 'localtax2_type') { $valuetoshow = $langs->trans("UseLocalTax")." 3"; $align = "center"; $sortable = 0; } - if ($fieldlist[$field] == 'localtax2') { $valuetoshow = $langs->trans("Rate")." 3"; $align = "center"; $sortable = 0; } + if ($fieldlist[$field] == 'localtax1_type') { $valuetoshow = $langs->trans("UseLocalTax")." 2"; $cssprefix = "center "; $sortable = 0; } + if ($fieldlist[$field] == 'localtax1') { $valuetoshow = $langs->trans("Rate")." 2"; $cssprefix = "center "; $sortable = 0; } + if ($fieldlist[$field] == 'localtax2_type') { $valuetoshow = $langs->trans("UseLocalTax")." 3"; $cssprefix = "center "; $sortable = 0; } + if ($fieldlist[$field] == 'localtax2') { $valuetoshow = $langs->trans("Rate")." 3"; $cssprefix = "center "; $sortable = 0; } if ($fieldlist[$field] == 'organization') { $valuetoshow = $langs->trans("Organization"); } if ($fieldlist[$field] == 'lang') { $valuetoshow = $langs->trans("Language"); } if ($fieldlist[$field] == 'type') { $valuetoshow = $langs->trans("Type"); } if ($fieldlist[$field] == 'code') { $valuetoshow = $langs->trans("Code"); } - if ($fieldlist[$field] == 'position') { $align = 'right'; } + if ($fieldlist[$field] == 'position') { $cssprefix = 'right '; } if ($fieldlist[$field] == 'libelle' || $fieldlist[$field] == 'label') { $valuetoshow = $langs->trans("Label"); } if ($fieldlist[$field] == 'libelle_facture') { $valuetoshow = $langs->trans("LabelOnDocuments"); } if ($fieldlist[$field] == 'country') { $valuetoshow = $langs->trans("Country"); } - if ($fieldlist[$field] == 'recuperableonly') { $valuetoshow = $langs->trans("NPR"); $align = "center"; } + if ($fieldlist[$field] == 'recuperableonly') { $valuetoshow = $langs->trans("NPR"); $cssprefix = "center "; } if ($fieldlist[$field] == 'nbjour') { $valuetoshow = $langs->trans("NbOfDays"); } - if ($fieldlist[$field] == 'type_cdr') { $valuetoshow = $langs->trans("AtEndOfMonth"); $align = "center"; } + if ($fieldlist[$field] == 'type_cdr') { $valuetoshow = $langs->trans("AtEndOfMonth"); $cssprefix = "center "; } if ($fieldlist[$field] == 'decalage') { $valuetoshow = $langs->trans("Offset"); } if ($fieldlist[$field] == 'width' || $fieldlist[$field] == 'nx') { $valuetoshow = $langs->trans("Width"); } if ($fieldlist[$field] == 'height' || $fieldlist[$field] == 'ny') { $valuetoshow = $langs->trans("Height"); } @@ -1368,7 +1367,7 @@ if ($id) // Show field title if ($showfield) { - print getTitleFieldOfList($valuetoshow, 0, $_SERVER["PHP_SELF"], ($sortable ? $fieldlist[$field] : ''), ($page ? 'page='.$page.'&' : ''), $param, "align=".$align, $sortfield, $sortorder, $cssprefix); + print getTitleFieldOfList($valuetoshow, 0, $_SERVER["PHP_SELF"], ($sortable ? $fieldlist[$field] : ''), ($page ? 'page='.$page.'&' : ''), $param, '', $sortfield, $sortorder, $cssprefix); } } // Favorite - Only activated on country dictionary @@ -1424,8 +1423,8 @@ if ($id) foreach ($fieldlist as $field => $value) { //var_dump($fieldlist); + $class = ''; $showfield = 1; - $align = "left"; $valuetoshow = $obj->{$fieldlist[$field]}; if ($fieldlist[$field] == 'entity') { @@ -1457,13 +1456,13 @@ if ($id) } elseif ($fieldlist[$field] == 'recuperableonly' || $fieldlist[$field] == 'deductible' || $fieldlist[$field] == 'category_type') { $valuetoshow = yn($valuetoshow); - $align = "center"; + $class = "center"; } elseif ($fieldlist[$field] == 'type_cdr') { if (empty($valuetoshow)) $valuetoshow = $langs->trans('None'); elseif ($valuetoshow == 1) $valuetoshow = $langs->trans('AtEndOfMonth'); elseif ($valuetoshow == 2) $valuetoshow = $langs->trans('CurrentNext'); - $align = "center"; + $class = "center"; } elseif ($fieldlist[$field] == 'price' || preg_match('/^amount/i', $fieldlist[$field])) { $valuetoshow = price($valuetoshow); } @@ -1577,20 +1576,20 @@ if ($id) $valuetoshow = $localtax_typeList[$valuetoshow]; else $valuetoshow = ''; - $align = "center"; + $class = "center"; } elseif ($fieldlist[$field] == 'localtax2_type') { if ($obj->localtax2 != 0) $valuetoshow = $localtax_typeList[$valuetoshow]; else $valuetoshow = ''; - $align = "center"; + $class = "center"; } elseif ($fieldlist[$field] == 'taux') { $valuetoshow = price($valuetoshow, 0, $langs, 0, 0); - $align = "center"; + $class = "center"; } elseif (in_array($fieldlist[$field], array('recuperableonly'))) { - $align = "center"; + $class = "center"; } elseif ($fieldlist[$field] == 'accountancy_code' || $fieldlist[$field] == 'accountancy_code_sell' || $fieldlist[$field] == 'accountancy_code_buy') { $valuetoshow = length_accountg($valuetoshow); @@ -1622,14 +1621,14 @@ if ($id) $valuetoshow = ($obj->label && $key != strtoupper($obj->label) ? $key : $obj->{$fieldlist[$field]}); } - $class = 'tddict'; + $class .= ($class ? ' ' : '').'tddict'; if ($fieldlist[$field] == 'note' && $id == 10) $class .= ' tdoverflowmax200'; if ($fieldlist[$field] == 'tracking') $class .= ' tdoverflowauto'; if ($fieldlist[$field] == 'position') $class .= ' right'; if ($fieldlist[$field] == 'localtax1_type') $class .= ' nowrap'; if ($fieldlist[$field] == 'localtax2_type') $class .= ' nowrap'; // Show value for field - if ($showfield) print ''.$valuetoshow.''; + if ($showfield) print ''.$valuetoshow.''; } } @@ -1908,9 +1907,9 @@ function fieldList($fieldlist, $obj = '', $tabname = '', $context = '') print ''; } elseif (in_array($fieldlist[$field], array('nbjour', 'decalage', 'taux', 'localtax1', 'localtax2'))) { - $align = "left"; - if (in_array($fieldlist[$field], array('taux', 'localtax1', 'localtax2'))) $align = "center"; // Fields aligned on right - print ''; + $class = "left"; + if (in_array($fieldlist[$field], array('taux', 'localtax1', 'localtax2'))) $class = "center"; // Fields aligned on right + print ''; print ''; print ''; } From 5eeef771fac4fa5e81ddec1e31d0a7e01800b156 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Thu, 23 Jan 2020 06:20:31 +0100 Subject: [PATCH 143/230] FIX: FEC export format --- .../class/accountancyexport.class.php | 10 +++---- htdocs/core/lib/functions.lib.php | 29 +++++++++++++++++++ 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/htdocs/accountancy/class/accountancyexport.class.php b/htdocs/accountancy/class/accountancyexport.class.php index dcf59be27f3..df120e90d09 100644 --- a/htdocs/accountancy/class/accountancyexport.class.php +++ b/htdocs/accountancy/class/accountancyexport.class.php @@ -658,9 +658,9 @@ class AccountancyExport print $end_line; foreach ( $objectLines as $line ) { - $date_creation = dol_print_date($line->date_creation, '%d%m%Y'); - $date_doc = dol_print_date($line->doc_date, '%d%m%Y'); - $date_valid = dol_print_date($line->date_validated, '%d%m%Y'); + $date_creation = dol_print_date($line->date_creation, '%Y%m%d'); + $date_doc = dol_print_date($line->doc_date, '%Y%m%d'); + $date_valid = dol_print_date($line->date_validated, '%Y%m%d'); // FEC:JournalCode print $line->code_journal . $separator; @@ -696,10 +696,10 @@ class AccountancyExport print $line->label_operation . $separator; // FEC:Debit - print price2num($line->debit) . $separator; + print price2fec($line->debit) . $separator; // FEC:Credit - print price2num($line->credit) . $separator; + print price2fec($line->credit) . $separator; // FEC:EcritureLet print $line->lettering_code . $separator; diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 89bd0622f5f..0ec230d1b87 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -4523,6 +4523,35 @@ function price2num($amount,$rounding='',$alreadysqlnb=0) return $amount; } +/** + * Function to format a value into a defined format for French administration (no thousand separator & decimal separator force to ',' with two decimals) + * Function used into accountancy FEC export + * + * @param float $amount Amount to format + * @return string Chain with formatted upright + * + * @see price2num() Revert function of price2fec + */ +function price2fec($amount) +{ + global $conf; + + // Clean parameters + if (empty($amount)) $amount=0; // To have a numeric value if amount not defined or = '' + $amount = (is_numeric($amount)?$amount:0); // Check if amount is numeric, for example, an error occured when amount value = o (letter) instead 0 (number) + + // Output decimal number by default (french) + $nbdecimal= 2; + + // Output separators by default (french) + $dec=','; $thousand=''; + + // Format number + $output=number_format($amount, $nbdecimal, $dec, $thousand); + + return $output; +} + /** * Output a dimension with best unit From 7ec17f17d555b93c0715ee9a3ebeb61a72d59dee Mon Sep 17 00:00:00 2001 From: Laurent De Coninck Date: Thu, 23 Jan 2020 09:41:22 +0100 Subject: [PATCH 144/230] FIX - API - DLC/DLUO date for stock movement Instead of giving a string to the creation of a stock movement, we have to give an integer. This PR fixes that. [see: X] --- .../product/stock/class/api_stockmovements.class.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/htdocs/product/stock/class/api_stockmovements.class.php b/htdocs/product/stock/class/api_stockmovements.class.php index 9951c05d323..c4f6ee56b5a 100644 --- a/htdocs/product/stock/class/api_stockmovements.class.php +++ b/htdocs/product/stock/class/api_stockmovements.class.php @@ -186,10 +186,15 @@ class StockMovements extends DolibarrApi } // Type increase or decrease - if ($qty >= 0) $type = 3; - else $type = 2; + $type = 2; + if ($qty >= 0){ + $type = 3; + } - if($this->stockmovement->_create(DolibarrApiAccess::$user, $product_id, $warehouse_id, $qty, $type, $price, $movementlabel, $movementcode, '', $dlc, $dluo, $lot) <= 0) { + $eatBy = empty($dluo) ? '' : (new DateTime($dluo))->getTimestamp(); + $sellBy = empty($dlc) ? '' : (new DateTime($dlc))->getTimestamp();; + + if($this->stockmovement->_create(DolibarrApiAccess::$user, $product_id, $warehouse_id, $qty, $type, $price, $movementlabel, $movementcode, '', $eatBy, $sellBy, $lot) <= 0) { throw new RestException(503, 'Error when create stock movement : '.$this->stockmovement->error); } From cc96da274140985a09935f299a1993dcbbb801f6 Mon Sep 17 00:00:00 2001 From: AdrianDominik Date: Thu, 23 Jan 2020 10:47:52 +0100 Subject: [PATCH 145/230] Fix: strict mode mysql compatibility --- htdocs/core/boxes/box_factures_imp.php | 1 + htdocs/core/boxes/box_services_expired.php | 1 + 2 files changed, 2 insertions(+) diff --git a/htdocs/core/boxes/box_factures_imp.php b/htdocs/core/boxes/box_factures_imp.php index bb6eb95b32f..881c3a295cb 100644 --- a/htdocs/core/boxes/box_factures_imp.php +++ b/htdocs/core/boxes/box_factures_imp.php @@ -111,6 +111,7 @@ class box_factures_imp extends ModeleBoxes if($user->socid) $sql.= " AND s.rowid = ".$user->socid; $sql.= " GROUP BY s.nom, s.rowid, s.code_client, s.logo, f.ref, f.date_lim_reglement,"; $sql.= " f.type, f.amount, f.datef, f.total, f.tva, f.total_ttc, f.paye, f.fk_statut, f.rowid"; + $sql.= ", s.email"; //$sql.= " ORDER BY f.datef DESC, f.ref DESC "; $sql.= " ORDER BY datelimite ASC, f.ref ASC "; $sql.= $this->db->plimit($max, 0); diff --git a/htdocs/core/boxes/box_services_expired.php b/htdocs/core/boxes/box_services_expired.php index e80c2a57214..295c358caf0 100644 --- a/htdocs/core/boxes/box_services_expired.php +++ b/htdocs/core/boxes/box_services_expired.php @@ -94,6 +94,7 @@ class box_services_expired extends ModeleBoxes if ($user->socid) $sql .= ' AND c.fk_soc = '.$user->socid; if (!$user->rights->societe->client->voir && !$user->socid) $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".$user->id; $sql .= " GROUP BY c.rowid, c.ref, c.statut, c.date_contrat, c.ref_customer, c.ref_supplier, s.nom, s.rowid"; + $sql.= ", s.email, s.client, s.fournisseur, s.code_client, s.code_fournisseur, s.code_compta, s.code_compta_fournisseur"; $sql .= " ORDER BY date_line ASC"; $sql .= $this->db->plimit($max, 0); From 1b84ff634fee3c3f7dee95502a4fe88f4116a4ed Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 23 Jan 2020 11:07:02 +0100 Subject: [PATCH 146/230] Doc --- htdocs/public/payment/newpayment.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/public/payment/newpayment.php b/htdocs/public/payment/newpayment.php index c580fa2a6d3..678c9a98215 100644 --- a/htdocs/public/payment/newpayment.php +++ b/htdocs/public/payment/newpayment.php @@ -23,7 +23,7 @@ * For Stripe test: Use credit card 4242424242424242 .More example on https://stripe.com/docs/testing * * Variants: - * - When option STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION is on, we use the new checkout API + * - When option STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION is on, we use the new PaymentIntent API * - When option STRIPE_USE_NEW_CHECKOUT is on, we use the new checkout API * - If no option set, we use old APIS (charge) */ From fa305a14717efd511ba11cfe1373daa61b56e287 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 23 Jan 2020 11:14:27 +0100 Subject: [PATCH 147/230] Update box_factures_imp.php --- htdocs/core/boxes/box_factures_imp.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/htdocs/core/boxes/box_factures_imp.php b/htdocs/core/boxes/box_factures_imp.php index 881c3a295cb..883dec19981 100644 --- a/htdocs/core/boxes/box_factures_imp.php +++ b/htdocs/core/boxes/box_factures_imp.php @@ -109,9 +109,8 @@ class box_factures_imp extends ModeleBoxes $sql.= " AND fk_statut = 1"; if (!$user->rights->societe->client->voir && !$user->socid) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; if($user->socid) $sql.= " AND s.rowid = ".$user->socid; - $sql.= " GROUP BY s.nom, s.rowid, s.code_client, s.logo, f.ref, f.date_lim_reglement,"; + $sql.= " GROUP BY s.nom, s.rowid, s.email, s.code_client, s.logo, f.ref, f.date_lim_reglement,"; $sql.= " f.type, f.amount, f.datef, f.total, f.tva, f.total_ttc, f.paye, f.fk_statut, f.rowid"; - $sql.= ", s.email"; //$sql.= " ORDER BY f.datef DESC, f.ref DESC "; $sql.= " ORDER BY datelimite ASC, f.ref ASC "; $sql.= $this->db->plimit($max, 0); From 41577714ce2a4f18a38c79eaa5cdc9538f0a2d01 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 23 Jan 2020 11:25:08 +0100 Subject: [PATCH 148/230] Add link to pay online into sponge template. --- .../modules/facture/doc/pdf_crabe.modules.php | 2 +- .../modules/facture/doc/pdf_sponge.modules.php | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php index 8904941146d..3f188fcc864 100644 --- a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php @@ -1059,7 +1059,7 @@ class pdf_crabe extends ModelePDFFactures // Show payment mode CHQ if (empty($object->mode_reglement_code) || $object->mode_reglement_code == 'CHQ') { - // If unregulated or forced payment mode to CHQ + // If payment mode unregulated or payment mode forced to CHQ if (!empty($conf->global->FACTURE_CHQ_NUMBER)) { $diffsizetitle = (empty($conf->global->PDF_DIFFSIZE_TITLE) ? 3 : $conf->global->PDF_DIFFSIZE_TITLE); diff --git a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php index b45e8a04700..5c8a933de66 100644 --- a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php @@ -1124,13 +1124,27 @@ class pdf_sponge extends ModelePDFFactures $lib_mode_reg=$outputlangs->transnoentities("PaymentType".$object->mode_reglement_code)!=('PaymentType'.$object->mode_reglement_code)?$outputlangs->transnoentities("PaymentType".$object->mode_reglement_code):$outputlangs->convToOutputCharset($object->mode_reglement); $pdf->MultiCell(80, 5, $lib_mode_reg, 0, 'L'); + // Show online payment link + $useonlinepayment = ((! empty($conf->paypal->enabled) || ! empty($conf->stripe->enabled) || ! empty($conf->paybox->enabled)) && !empty($conf->global->PDF_SHOW_LINK_TO_ONLINE_PAYMENT)); + if ($object->mode_reglement_code == 'CB' || $object->mode_reglement_code == 'VAD' && $object->statut != Facture::STATUS_DRAFT && $useonlinepayment) { + require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php'; + global $langs; + + $langs->loadLangs(array('payment', 'paybox')); + $servicename=$langs->transnoentities('Online'); + $paiement_url = getOnlinePaymentUrl('', 'invoice', $object->ref, '', '', ''); + $linktopay = $langs->trans("ToOfferALinkForOnlinePayment", $servicename).' '.$outputlangs->transnoentities("ClickHere").''; + + $pdf->writeHTMLCell(80, 10, '', '', dol_htmlentitiesbr($linktopay), 0, 1); + } + $posy=$pdf->GetY()+2; } // Show payment mode CHQ if (empty($object->mode_reglement_code) || $object->mode_reglement_code == 'CHQ') { - // If payment mode not forced or forced to CHQ + // If payment mode unregulated or payment mode forced to CHQ if (! empty($conf->global->FACTURE_CHQ_NUMBER)) { $diffsizetitle=(empty($conf->global->PDF_DIFFSIZE_TITLE)?3:$conf->global->PDF_DIFFSIZE_TITLE); From 7f47b48559f1f3aa0cf27e0e556d10523e6e26be Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Thu, 23 Jan 2020 11:47:30 +0100 Subject: [PATCH 149/230] Move function to functions2.lib.php --- .../class/accountancyexport.class.php | 1 + htdocs/core/lib/functions.lib.php | 30 ------------------- htdocs/core/lib/functions2.lib.php | 29 ++++++++++++++++++ 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/htdocs/accountancy/class/accountancyexport.class.php b/htdocs/accountancy/class/accountancyexport.class.php index df120e90d09..742c3ac721c 100644 --- a/htdocs/accountancy/class/accountancyexport.class.php +++ b/htdocs/accountancy/class/accountancyexport.class.php @@ -38,6 +38,7 @@ */ require_once DOL_DOCUMENT_ROOT . '/core/lib/functions.lib.php'; +require_once DOL_DOCUMENT_ROOT . '/core/lib/functions2.lib.php'; class AccountancyExport { diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 0ec230d1b87..a16faa50f46 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -4523,36 +4523,6 @@ function price2num($amount,$rounding='',$alreadysqlnb=0) return $amount; } -/** - * Function to format a value into a defined format for French administration (no thousand separator & decimal separator force to ',' with two decimals) - * Function used into accountancy FEC export - * - * @param float $amount Amount to format - * @return string Chain with formatted upright - * - * @see price2num() Revert function of price2fec - */ -function price2fec($amount) -{ - global $conf; - - // Clean parameters - if (empty($amount)) $amount=0; // To have a numeric value if amount not defined or = '' - $amount = (is_numeric($amount)?$amount:0); // Check if amount is numeric, for example, an error occured when amount value = o (letter) instead 0 (number) - - // Output decimal number by default (french) - $nbdecimal= 2; - - // Output separators by default (french) - $dec=','; $thousand=''; - - // Format number - $output=number_format($amount, $nbdecimal, $dec, $thousand); - - return $output; -} - - /** * Output a dimension with best unit * diff --git a/htdocs/core/lib/functions2.lib.php b/htdocs/core/lib/functions2.lib.php index 41d8758cca0..b271a092c90 100644 --- a/htdocs/core/lib/functions2.lib.php +++ b/htdocs/core/lib/functions2.lib.php @@ -2340,3 +2340,32 @@ function random_color($min=0, $max=255) { return random_color_part($min, $max) . random_color_part($min, $max) . random_color_part($min, $max); } + +/** + * Function to format a value into a defined format for French administration (no thousand separator & decimal separator force to ',' with two decimals) + * Function used into accountancy FEC export + * + * @param float $amount Amount to format + * @return string Chain with formatted upright + * + * @see price2num() Revert function of price2fec + */ +function price2fec($amount) +{ + global $conf; + + // Clean parameters + if (empty($amount)) $amount=0; // To have a numeric value if amount not defined or = '' + $amount = (is_numeric($amount)?$amount:0); // Check if amount is numeric, for example, an error occured when amount value = o (letter) instead 0 (number) + + // Output decimal number by default (french) + $nbdecimal= 2; + + // Output separators by default (french) + $dec=','; $thousand=''; + + // Format number + $output=number_format($amount, $nbdecimal, $dec, $thousand); + + return $output; +} From 40febd27810af57d0cf68d1ffc24c61cf197f709 Mon Sep 17 00:00:00 2001 From: gti-eu <60189441+gti-eu@users.noreply.github.com> Date: Thu, 23 Jan 2020 11:48:44 +0100 Subject: [PATCH 150/230] Fix reference check on emailcollector ObjectType is on reg[1] ObjectId is on reg[2] --- .../class/emailcollector.class.php | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/htdocs/emailcollector/class/emailcollector.class.php b/htdocs/emailcollector/class/emailcollector.class.php index 7e957385e60..0844cff2057 100644 --- a/htdocs/emailcollector/class/emailcollector.class.php +++ b/htdocs/emailcollector/class/emailcollector.class.php @@ -1243,34 +1243,34 @@ class EmailCollector extends CommonObject $objectid = 0; $objectemail = null; - if ($reg[0] == 'inv') + if ($reg[1] == 'inv') { - $objectid = $reg[1]; + $objectid = $reg[2]; $objectemail = new Facture($this->db); } - if ($reg[0] == 'proj') + if ($reg[1] == 'proj') { - $objectid = $reg[1]; + $objectid = $reg[2]; $objectemail = new Project($this->db); } - if ($reg[0] == 'con') + if ($reg[1] == 'con') { - $objectid = $reg[1]; + $objectid = $reg[2]; $objectemail = new Contact($this->db); } - if ($reg[0] == 'thi') + if ($reg[1] == 'thi') { - $objectid = $reg[1]; + $objectid = $reg[2]; $objectemail = new Societe($this->db); } - if ($reg[0] == 'use') + if ($reg[1] == 'use') { - $objectid = $reg[1]; + $objectid = $reg[2]; $objectemail = new User($this->db); } - if ($reg[0] == 'tic') + if ($reg[1] == 'tic') { - $objectid = $reg[1]; + $objectid = $reg[2]; $objectemail = new Ticket($this->db); } From 646ccc1354a9b5627146c170a63d2a520e32031c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 23 Jan 2020 11:46:40 +0100 Subject: [PATCH 151/230] Fix error management --- htdocs/product/stock/class/api_stockmovements.class.php | 9 ++++++--- htdocs/product/stock/class/mouvementstock.class.php | 7 ++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/htdocs/product/stock/class/api_stockmovements.class.php b/htdocs/product/stock/class/api_stockmovements.class.php index c4f6ee56b5a..b8b0d0d2301 100644 --- a/htdocs/product/stock/class/api_stockmovements.class.php +++ b/htdocs/product/stock/class/api_stockmovements.class.php @@ -191,11 +191,14 @@ class StockMovements extends DolibarrApi $type = 3; } - $eatBy = empty($dluo) ? '' : (new DateTime($dluo))->getTimestamp(); - $sellBy = empty($dlc) ? '' : (new DateTime($dlc))->getTimestamp();; + require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; + $eatBy = empty($dluo) ? '' : dol_stringtotime($dluo); + $sellBy = empty($dlc) ? '' : dol_stringtotime($dlc); if($this->stockmovement->_create(DolibarrApiAccess::$user, $product_id, $warehouse_id, $qty, $type, $price, $movementlabel, $movementcode, '', $eatBy, $sellBy, $lot) <= 0) { - throw new RestException(503, 'Error when create stock movement : '.$this->stockmovement->error); + $errormessage = $this->stockmovement->error; + if (empty($errormessage)) $errormessage = join(',', $this->stockmovement->errors); + throw new RestException(503, 'Error when create stock movement : '.$errormessage); } return $this->stockmovement->id; diff --git a/htdocs/product/stock/class/mouvementstock.class.php b/htdocs/product/stock/class/mouvementstock.class.php index 93c3d316be6..9e8dcc3184e 100644 --- a/htdocs/product/stock/class/mouvementstock.class.php +++ b/htdocs/product/stock/class/mouvementstock.class.php @@ -172,7 +172,7 @@ class MouvementStock extends CommonObject { if (empty($batch)) { - $this->errors[]=$langs->trans("ErrorTryToMakeMoveOnProductRequiringBatchData", $product->ref); + $this->errors[]=$langs->transnoentitiesnoconv("ErrorTryToMakeMoveOnProductRequiringBatchData", $product->ref); dol_syslog("Try to make a movement of a product with status_batch on without any batch data"); $this->db->rollback(); @@ -207,7 +207,8 @@ class MouvementStock extends CommonObject if ($this->db->jdate($obj->eatby) != $eatby && $this->db->jdate($obj->eatby) != $eatbywithouthour) // We test date without hours and with hours for backward compatibility { // If found and eatby/sellby defined into table and provided and differs, return error - $this->errors[]=$langs->trans("ThisSerialAlreadyExistWithDifferentDate", $batch, dol_print_date($this->db->jdate($obj->eatby), 'dayhour'), dol_print_date($eatby, 'dayhour')); + $langs->load("stocks"); + $this->errors[] = $langs->transnoentitiesnoconv("ThisSerialAlreadyExistWithDifferentDate", $batch, dol_print_date($this->db->jdate($obj->eatby), 'dayhour'), dol_print_date($eatbywithouthour, 'dayhour')); dol_syslog("ThisSerialAlreadyExistWithDifferentDate batch=".$batch.", eatby found into product_lot = ".$obj->eatby." = ".dol_print_date($this->db->jdate($obj->eatby), 'dayhourrfc')." so eatbywithouthour = ".$eatbywithouthour." = ".dol_print_date($eatbywithouthour)." - eatby provided = ".$eatby." = ".dol_print_date($eatby, 'dayhourrfc'), LOG_ERR); $this->db->rollback(); return -3; @@ -244,7 +245,7 @@ class MouvementStock extends CommonObject if ($this->db->jdate($obj->sellby) != $sellby && $this->db->jdate($obj->sellby) != $sellbywithouthour) // We test date without hours and with hours for backward compatibility { // If found and eatby/sellby defined into table and provided and differs, return error - $this->errors[]=$langs->trans("ThisSerialAlreadyExistWithDifferentDate", $batch, dol_print_date($this->db->jdate($obj->sellby)), dol_print_date($sellby)); + $this->errors[]=$langs->transnoentitiesnoconv("ThisSerialAlreadyExistWithDifferentDate", $batch, dol_print_date($this->db->jdate($obj->sellby)), dol_print_date($sellby)); dol_syslog($langs->transnoentities("ThisSerialAlreadyExistWithDifferentDate", $batch, dol_print_date($this->db->jdate($obj->sellby)), dol_print_date($sellby)), LOG_ERR); $this->db->rollback(); return -3; From 1487158082e499ac844e5d0b1613a09a6d3d17e4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 23 Jan 2020 12:02:29 +0100 Subject: [PATCH 152/230] Update functions2.lib.php --- htdocs/core/lib/functions2.lib.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/htdocs/core/lib/functions2.lib.php b/htdocs/core/lib/functions2.lib.php index b271a092c90..f9678c2f569 100644 --- a/htdocs/core/lib/functions2.lib.php +++ b/htdocs/core/lib/functions2.lib.php @@ -2356,16 +2356,17 @@ function price2fec($amount) // Clean parameters if (empty($amount)) $amount=0; // To have a numeric value if amount not defined or = '' - $amount = (is_numeric($amount)?$amount:0); // Check if amount is numeric, for example, an error occured when amount value = o (letter) instead 0 (number) + $amount = (is_numeric($amount) ? $amount : 0); // Check if amount is numeric, for example, an error occured when amount value = o (letter) instead 0 (number) - // Output decimal number by default (french) - $nbdecimal= 2; + // Output decimal number by default + $nbdecimal = (empty($conf->global->ACCOUNTING_FEC_DECIMAL_LENGTH) ? 2 : $conf->global->ACCOUNTING_FEC_DECIMAL_LENGTH); - // Output separators by default (french) - $dec=','; $thousand=''; + // Output separators by default + $dec = (empty($conf->global->ACCOUNTING_FEC_DECIMAL_SEPARATOR) ? ',' : $conf->global->ACCOUNTING_FEC_DECIMAL_SEPARATOR); + $thousand = (empty($conf->global->ACCOUNTING_FEC_THOUSAND_SEPARATOR) ? '' : $conf->global->ACCOUNTING_FEC_THOUSAND_SEPARATOR); // Format number - $output=number_format($amount, $nbdecimal, $dec, $thousand); + $output = number_format($amount, $nbdecimal, $dec, $thousand); return $output; } From cbe396b97c0596af8a958c990e3af5f2c523ab54 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 23 Jan 2020 12:04:14 +0100 Subject: [PATCH 153/230] Update functions2.lib.php --- htdocs/core/lib/functions2.lib.php | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/htdocs/core/lib/functions2.lib.php b/htdocs/core/lib/functions2.lib.php index f9678c2f569..37bc6c1cd5e 100644 --- a/htdocs/core/lib/functions2.lib.php +++ b/htdocs/core/lib/functions2.lib.php @@ -2320,9 +2320,9 @@ function getModuleDirForApiClass($module) /* * Return 2 hexa code randomly * - * @param $min int Between 0 and 255 - * @param $max int Between 0 and 255 - * @return String + * @param int $min Between 0 and 255 + * @param int $max Between 0 and 255 + * @return String Color string */ function random_color_part($min=0,$max=255) { @@ -2332,9 +2332,9 @@ function random_color_part($min=0,$max=255) /* * Return hexadecimal color randomly * - * @param $min int Between 0 and 255 - * @param $max int Between 0 and 255 - * @return String + * @param int $min Between 0 and 255 + * @param int $max Between 0 and 255 + * @return String Color string */ function random_color($min=0, $max=255) { @@ -2346,9 +2346,8 @@ function random_color($min=0, $max=255) * Function used into accountancy FEC export * * @param float $amount Amount to format - * @return string Chain with formatted upright - * - * @see price2num() Revert function of price2fec + * @return string Chain with formatted upright + * @see price2num() Format a numeric into a price for FEC files */ function price2fec($amount) { From 67e57b8da2fc550fd95562984517eb8dbe59e63a Mon Sep 17 00:00:00 2001 From: gti-eu <60189441+gti-eu@users.noreply.github.com> Date: Thu, 23 Jan 2020 12:53:24 +0100 Subject: [PATCH 154/230] Add trackid to Ticket message mail --- htdocs/ticket/class/ticket.class.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/ticket/class/ticket.class.php b/htdocs/ticket/class/ticket.class.php index cf1e2502676..f5132809dd1 100644 --- a/htdocs/ticket/class/ticket.class.php +++ b/htdocs/ticket/class/ticket.class.php @@ -2753,7 +2753,8 @@ class Ticket extends CommonObject $conf->global->MAIN_MAIL_AUTOCOPY_TO = ''; } include_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; - $mailfile = new CMailFile($subject, $receiver, $from, $message_to_send, $filepath, $mimetype, $filename, $sendtocc, '', $deliveryreceipt, -1); + $trackid = "tic".$this->id; + $mailfile = new CMailFile($subject, $receiver, $from, $message_to_send, $filepath, $mimetype, $filename, $sendtocc, '', $deliveryreceipt, -1, '', '', $trackid); if ($mailfile->error) { setEventMessages($mailfile->error, null, 'errors'); } else { From d302f190a72b458409cbf78e35b6fa58c103fc91 Mon Sep 17 00:00:00 2001 From: AdrianDominik Date: Thu, 23 Jan 2020 13:29:28 +0100 Subject: [PATCH 155/230] Fix: strict mode mysql compatibility --- htdocs/comm/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/comm/card.php b/htdocs/comm/card.php index 3ce6d2f00fa..00e30b88c0f 100644 --- a/htdocs/comm/card.php +++ b/htdocs/comm/card.php @@ -1047,7 +1047,7 @@ if ($object->id > 0) $sql .= " AND f.entity = ".$conf->entity; $sql .= ' GROUP BY f.rowid, f.titre, f.amount, f.total, f.tva, f.total_ttc,'; $sql .= ' f.date_last_gen, f.datec, f.frequency, f.unit_frequency,'; - $sql .= ' f.suspended,'; + $sql .= ' f.suspended, f.date_when,'; $sql .= ' s.nom, s.rowid'; $sql .= " ORDER BY f.date_last_gen, f.datec DESC"; From 13045748f374682f028b672107b13dc7d4348f58 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Thu, 23 Jan 2020 15:26:22 +0100 Subject: [PATCH 156/230] fix sql on order list --- htdocs/commande/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index bb148f304c3..507bc24e803 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -252,7 +252,7 @@ $sql .= " state.code_departement as state_code, state.nom as state_name,"; $sql.= ' c.rowid, c.ref, c.total_ht, c.tva as total_tva, c.total_ttc, c.ref_client, c.fk_user_author,'; $sql .= ' c.date_valid, c.date_commande, c.note_private, c.date_livraison as date_delivery, c.fk_statut, c.facture as billed,'; $sql .= ' c.date_creation as date_creation, c.tms as date_update, c.date_cloture as date_cloture,'; -$sql .= " p.rowid as project_id, p.ref as project_ref, p.title as project_label"; +$sql .= " p.rowid as project_id, p.ref as project_ref, p.title as project_label,"; $sql.= " u.login"; if ($search_categ_cus) $sql .= ", cc.fk_categorie, cc.fk_soc"; // Add fields from extrafields From fd0daad9592849c21c443ff01f3774d1c7e086a4 Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Thu, 23 Jan 2020 16:49:06 +0100 Subject: [PATCH 157/230] fix SEPA line with limit select and working pagination --- htdocs/compta/prelevement/card.php | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/htdocs/compta/prelevement/card.php b/htdocs/compta/prelevement/card.php index b7850fb8dc0..0b8a441dea2 100644 --- a/htdocs/compta/prelevement/card.php +++ b/htdocs/compta/prelevement/card.php @@ -63,7 +63,7 @@ $object = new BonPrelevement($db, ""); // Load object include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals -$hookmanager->initHooks(array('directdebitprevcard', 'globalcard')); +$hookmanager->initHooks(array('directdebitprevcard', 'globalcard', 'directdebitprevlist')); /* * Actions @@ -362,10 +362,19 @@ if ($id > 0 || $ref) $urladd = "&id=".$id; - print_barre_liste($langs->trans("Lines"), $page, $_SERVER["PHP_SELF"], $urladd, $sortfield, $sortorder, '', $num, $nbtotalofrecords, ''); + print '
    ' . "\n"; + print ''; + print ''; + if (! empty($page)) { + print ''; + } + if (! empty($limit)) { + print ''; + } + print_barre_liste($langs->trans("Lines"), $page, $_SERVER["PHP_SELF"], $urladd, $sortfield, $sortorder, '', $num, $nbtotalofrecords, '', 0, '', '', $limit); print '
    '; // You can use div-table-responsive-no-min if you dont need reserved height for your table - print ''; + print '
    '; print ''; print_liste_field_titre("Lines", $_SERVER["PHP_SELF"], "pl.rowid", '', $urladd); print_liste_field_titre("ThirdParty", $_SERVER["PHP_SELF"], "s.nom", '', $urladd); @@ -375,7 +384,7 @@ if ($id > 0 || $ref) $total = 0; - while ($i < min($num, $conf->liste_limit)) + while ($i < min($num, $limit)) { $obj = $db->fetch_object($result); @@ -433,6 +442,7 @@ if ($id > 0 || $ref) print "
    "; print '
    '; + print '
    '; $db->free($result); } From 7ee37ddd3ff7871e6d58b7bc90edaa74a661a78d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 23 Jan 2020 17:30:05 +0100 Subject: [PATCH 158/230] FIX Error in log for email sending with smtps was not complete --- htdocs/core/class/smtps.class.php | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/htdocs/core/class/smtps.class.php b/htdocs/core/class/smtps.class.php index 1ade95098fa..4415aad3b9a 100644 --- a/htdocs/core/class/smtps.class.php +++ b/htdocs/core/class/smtps.class.php @@ -506,8 +506,9 @@ class SMTPs // The error here just means the ID/password combo doesn't work. // There is not a method to determine which is the problem, ID or password - if ( ! $_retVal = $this->socket_send_str(base64_encode($this->_smtpsPW), '235') ) - $this->_setErr(130, 'Invalid Authentication Credentials.'); + if (! $_retVal = $this->socket_send_str(base64_encode($this->_smtpsPW), '235') ) { + $this->_setErr(130, 'Invalid Authentication Credentials.'); + } } else { @@ -575,8 +576,12 @@ class SMTPs // From this point onward most server response codes should be 250 // Specify who the mail is from.... // This has to be the raw email address, strip the "name" off - $this->socket_send_str('MAIL FROM: ' . $this->getFrom('addr'), '250'); - + $resultmailfrom = $this->socket_send_str('MAIL FROM: ' . $this->getFrom('addr'), '250'); + if (! $resultmailfrom) { + fclose($this->socket); + return false; + } + // 'RCPT TO:' must be given a single address, so this has to loop // through the list of addresses, regardless of TO, CC or BCC // and send it out "single file" @@ -1786,6 +1791,7 @@ class SMTPs $_retVal = false; break; } + $this->log .= $server_response; $limit++; } From 210e0511d0fdf95e78efb4ecef2e2bf5ee0d6098 Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Thu, 23 Jan 2020 17:45:16 +0100 Subject: [PATCH 159/230] fix create SEPA withdraw with limit select and working pagination --- htdocs/compta/prelevement/create.php | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/htdocs/compta/prelevement/create.php b/htdocs/compta/prelevement/create.php index 34da3336bcc..66dd6338c9d 100644 --- a/htdocs/compta/prelevement/create.php +++ b/htdocs/compta/prelevement/create.php @@ -193,6 +193,7 @@ else } print "\n"; +print ''; print '
    '; @@ -221,6 +222,11 @@ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) { $result = $db->query($sql); $nbtotalofrecords = $db->num_rows($result); + if (($page * $limit) > $nbtotalofrecords) // if total resultset is smaller then paging size (filtering), goto and load page 0 + { + $page = 0; + $offset = 0; + } } $sql.= $db->plimit($limit+1, $offset); @@ -236,11 +242,12 @@ if ($resql) if($socid) $param .= '&socid='.urlencode($socid); if($option) $param .= "&option=".urlencode($option); - if(! empty($page) && $num <= $nbtotalofrecords) $page = 0; - print '
    '; print ''; - print ''; + print ''; + if (! empty($limit)) { + print ''; + } print_barre_liste($langs->trans("InvoiceWaitingWithdraw"), $page, $_SERVER['PHP_SELF'], $param, '', '', '', $num, $nbtotalofrecords, 'title_accountancy.png', 0, '', '', $limit); @@ -300,6 +307,7 @@ if ($resql) } else print ''.$langs->trans("None").''; print ""; + print ''; print "
    "; print "
    \n"; } From 5ad5578f4059d0952fe6672c18a00c67a5ab384c Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Thu, 23 Jan 2020 17:47:00 +0100 Subject: [PATCH 160/230] fix create SEPA withdraw with limit select and working pagination --- htdocs/compta/prelevement/create.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/compta/prelevement/create.php b/htdocs/compta/prelevement/create.php index 66dd6338c9d..eec72ee4b1e 100644 --- a/htdocs/compta/prelevement/create.php +++ b/htdocs/compta/prelevement/create.php @@ -307,7 +307,6 @@ if ($resql) } else print ''.$langs->trans("None").''; print ""; - print ''; print ""; print "
    \n"; } From 62caf3cbfc1d6f1e72514a57ea6a11156c87c61c Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Thu, 23 Jan 2020 17:59:50 +0100 Subject: [PATCH 161/230] fix create SEPA withdraw with limit select and working pagination --- htdocs/compta/prelevement/demandes.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/htdocs/compta/prelevement/demandes.php b/htdocs/compta/prelevement/demandes.php index 6c1ea278430..da1b3663d21 100644 --- a/htdocs/compta/prelevement/demandes.php +++ b/htdocs/compta/prelevement/demandes.php @@ -140,8 +140,6 @@ else $newcardbutton = ''.$langs->trans("Back").''; -print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_generic', 0, $newcardbutton, '', $limit); - print '
    '; if ($optioncss != '') print ''; print ''; @@ -152,6 +150,7 @@ print ''; print ''; print ''; +print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_generic', 0, $newcardbutton, '', $limit); print ''; From 5d4ea0b4c4328679e996fc0d4fd45c4fe664f62a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 23 Jan 2020 19:28:56 +0100 Subject: [PATCH 162/230] FIX Label of status of social contribution --- htdocs/compta/sociales/card.php | 53 ++++++++++--------- .../sociales/class/chargesociales.class.php | 10 ++-- 2 files changed, 34 insertions(+), 29 deletions(-) diff --git a/htdocs/compta/sociales/card.php b/htdocs/compta/sociales/card.php index ff2cb84dbce..92c27ff71a2 100644 --- a/htdocs/compta/sociales/card.php +++ b/htdocs/compta/sociales/card.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2004-2020 Laurent Destailleur * Copyright (C) 2005-2013 Regis Houssin * Copyright (C) 2016-2018 Frédéric France * Copyright (C) 2017 Alexandre Spangaro @@ -337,26 +337,26 @@ if ($action == 'create') print ''; print ''; - // Date end period + // Date print ''; print ''; - print ''; - print ''; - - // Date due - print ''; - print ''; print ''; print "\n"; + // Date end period + print ''; + print ''; + print ''; + print ''; + // Amount print ''; print '"; - print '"; diff --git a/htdocs/compta/cashcontrol/class/cashcontrol.class.php b/htdocs/compta/cashcontrol/class/cashcontrol.class.php index ad792db0826..32f7533b6c3 100644 --- a/htdocs/compta/cashcontrol/class/cashcontrol.class.php +++ b/htdocs/compta/cashcontrol/class/cashcontrol.class.php @@ -59,7 +59,7 @@ class CashControl extends CommonObject 'entity' =>array('type'=>'integer', 'label'=>'Entity', 'enabled'=>1, 'visible'=>0, 'notnull'=>1, 'position'=>15), 'ref' =>array('type'=>'varchar(64)', 'label'=>'Ref', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'position'=>18), 'posmodule' =>array('type'=>'varchar(30)', 'label'=>'Module', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'position'=>19), - 'posnumber' =>array('type'=>'varchar(30)', 'label'=>'CashDesk', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'position'=>20), + 'posnumber' =>array('type'=>'varchar(30)', 'label'=>'Terminal', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'position'=>20, 'css'=>'center'), 'label' =>array('type'=>'varchar(255)', 'label'=>'Label', 'enabled'=>1, 'visible'=>0, 'position'=>24), 'opening' =>array('type'=>'price', 'label'=>'Opening', 'enabled'=>1, 'visible'=>1, 'position'=>25), 'cash' =>array('type'=>'price', 'label'=>'Cash', 'enabled'=>1, 'visible'=>1, 'position'=>30), From de4183ea6552e917ac33f8416f784340966f2a8d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 24 Jan 2020 17:30:46 +0100 Subject: [PATCH 184/230] Update logos --- htdocs/core/lib/security2.lib.php | 2 +- htdocs/langs/en_US/other.lang | 2 +- htdocs/main.inc.php | 2 +- htdocs/public/payment/newpayment.php | 61 +++++++++++------- htdocs/theme/common/dolibarr_logo_bw.png | Bin 791 -> 0 bytes .../{common => }/dolibarr_logo_256x256.png | Bin htdocs/theme/dolibarr_logo_bw.png | Bin 0 -> 646 bytes htdocs/theme/eldy/global.inc.php | 11 ++++ htdocs/theme/eldy/manifest.json.php | 2 +- 9 files changed, 51 insertions(+), 29 deletions(-) delete mode 100644 htdocs/theme/common/dolibarr_logo_bw.png rename htdocs/theme/{common => }/dolibarr_logo_256x256.png (100%) create mode 100644 htdocs/theme/dolibarr_logo_bw.png diff --git a/htdocs/core/lib/security2.lib.php b/htdocs/core/lib/security2.lib.php index c81ea9d98d7..26e97499482 100644 --- a/htdocs/core/lib/security2.lib.php +++ b/htdocs/core/lib/security2.lib.php @@ -283,7 +283,7 @@ if (! function_exists('dol_loginfunction')) // Set jquery theme $dol_loginmesg = (! empty($_SESSION["dol_loginmesg"])?$_SESSION["dol_loginmesg"]:''); - $favicon = DOL_URL_ROOT.'/theme/common/dolibarr_logo_256x256.png'; + $favicon = DOL_URL_ROOT.'/theme/dolibarr_logo_256x256.png'; if (! empty($mysoc->logo_squarred_mini)) $favicon = DOL_URL_ROOT.'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode('logos/thumbs/'.$mysoc->logo_squarred_mini); if (! empty($conf->global->MAIN_FAVICON_URL)) $favicon=$conf->global->MAIN_FAVICON_URL; diff --git a/htdocs/langs/en_US/other.lang b/htdocs/langs/en_US/other.lang index 640199588ab..46424590f31 100644 --- a/htdocs/langs/en_US/other.lang +++ b/htdocs/langs/en_US/other.lang @@ -24,7 +24,7 @@ MessageOK=Message on the return page for a validated payment MessageKO=Message on the return page for a canceled payment ContentOfDirectoryIsNotEmpty=Content of this directory is not empty. DeleteAlsoContentRecursively=Check to delete all content recursively - +PoweredBy=Powered by YearOfInvoice=Year of invoice date PreviousYearOfInvoice=Previous year of invoice date NextYearOfInvoice=Following year of invoice date diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index c9def11e910..a6de7819237 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1224,7 +1224,7 @@ function top_htmlhead($head, $title = '', $disablejs = 0, $disablehead = 0, $arr print ''."\n"; // Favicon - $favicon = DOL_URL_ROOT.'/theme/common/dolibarr_logo_256x256.png'; + $favicon = DOL_URL_ROOT.'/theme/dolibarr_logo_256x256.png'; if (!empty($mysoc->logo_squarred_mini)) $favicon = DOL_URL_ROOT.'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode('logos/thumbs/'.$mysoc->logo_squarred_mini); if (!empty($conf->global->MAIN_FAVICON_URL)) $favicon = $conf->global->MAIN_FAVICON_URL; if (empty($conf->dol_use_jmobile)) print ''."\n"; // Not required into an Android webview diff --git a/htdocs/public/payment/newpayment.php b/htdocs/public/payment/newpayment.php index c580fa2a6d3..80ed910ac70 100644 --- a/htdocs/public/payment/newpayment.php +++ b/htdocs/public/payment/newpayment.php @@ -717,7 +717,8 @@ if (!empty($conf->global->ONLINE_PAYMENT_CSS_URL)) $head = 'dol_hide_leftmenu) ? '
    ' : '').'
    '; +llxHeader($head, $langs->trans("PaymentForm"), '', '', 0, 0, '', '', '', 'onlinepaymentbody', $replacemainarea); // Check link validity if ($source && in_array($ref, array('member_ref', 'contractline_ref', 'invoice_ref', 'order_ref', ''))) @@ -753,27 +754,7 @@ print ''; print ''; print "\n"; -print ''."\n"; -print ''."\n"; -// Additionnal information for each payment system -if (!empty($conf->paypal->enabled)) -{ - print ''."\n"; - print ''."\n"; -} -if (!empty($conf->paybox->enabled)) -{ - print ''."\n"; -} -if (!empty($conf->stripe->enabled)) -{ - print ''."\n"; -} -print ''."\n"; -print ''."\n"; -print "\n"; -print '
    '; - print $form->textwithpicto($langs->trans("PeriodEndDate"), $langs->trans("LastDayTaxIsRelatedTo")); - print ''; - print $form->selectDate(!empty($dateperiod) ? $dateperiod : '-1', 'period', 0, 0, 0, 'charge', 1); - print '
    '; - print $langs->trans("DateDue"); + print $langs->trans("Date"); print ''; print $form->selectDate(!empty($dateech) ? $dateech : '-1', 'ech', 0, 0, 0, 'charge', 1); print '
    '; + print $form->textwithpicto($langs->trans("PeriodEndDate"), $langs->trans("LastDayTaxIsRelatedTo")); + print ''; + print $form->selectDate(!empty($dateperiod) ? $dateperiod : '-1', 'period', 0, 0, 0, 'charge', 1); + print '
    '; @@ -434,11 +434,11 @@ if ($id > 0) } else { + $formquestion[] = array('type' => 'date', 'name' => 'clone_date_ech', 'label' => $langs->trans("Date"), 'value' => -1); $formquestion[] = array('type' => 'date', 'name' => 'clone_period', 'label' => $langs->trans("PeriodEndDate"), 'value' => -1); - $formquestion[] = array('type' => 'date', 'name' => 'clone_date_ech', 'label' => $langs->trans("DateDue"), 'value' => -1); } - print $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneTax', $object->ref), 'confirm_clone', $formquestion, 'yes', 1); + print $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneTax', $object->ref), 'confirm_clone', $formquestion, 'yes', 1, 240); } @@ -515,9 +515,20 @@ if ($id > 0) print ''; // Type - print '"; + print '"; print ""; + // Date + if ($action == 'edit') + { + print '"; + } else { + print ""; + } + // Period end date print ""; print ""; - // Due date - if ($action == 'edit') - { - print '"; - } else { - print ""; - } - // Amount if ($action == 'edit') { diff --git a/htdocs/compta/sociales/class/chargesociales.class.php b/htdocs/compta/sociales/class/chargesociales.class.php index 5bb218d46cd..7b2d9ceea1b 100644 --- a/htdocs/compta/sociales/class/chargesociales.class.php +++ b/htdocs/compta/sociales/class/chargesociales.class.php @@ -499,16 +499,20 @@ class ChargeSociales extends CommonObject // Load translation files required by the page $langs->loadLangs(array("customers","bills")); + // We reinit status array to force to redefine them because label may change according to properties values. + $this->labelStatus = array(); + $this->labelStatusShort = array(); + if (empty($this->labelStatus) || empty($this->labelStatusShort)) { global $langs; //$langs->load("mymodule"); $this->labelStatus[self::STATUS_UNPAID] = $langs->trans('Unpaid'); $this->labelStatus[self::STATUS_PAID] = $langs->trans('Paid'); - if ($status == 0 && $alreadypaid > 0) $this->labelStatus[self::STATUS_UNPAID] = $langs->trans("BillStatusStarted"); - $this->labelStatusShort[self::STATUS_UNPAID] = $langs->trans('Draft'); + if ($status == self::STATUS_UNPAID && $alreadypaid > 0) $this->labelStatus[self::STATUS_UNPAID] = $langs->trans("BillStatusStarted"); + $this->labelStatusShort[self::STATUS_UNPAID] = $langs->trans('Unpaid'); $this->labelStatusShort[self::STATUS_PAID] = $langs->trans('Enabled'); - if ($status == 0 && $alreadypaid > 0) $this->labelStatusShort[self::STATUS_UNPAID] = $langs->trans("BillStatusStarted"); + if ($status == self::STATUS_UNPAID && $alreadypaid > 0) $this->labelStatusShort[self::STATUS_UNPAID] = $langs->trans("BillStatusStarted"); } $statusType = 'status1'; From 423be8a139984953ce56b98afc12f4bd5a7cf367 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 23 Jan 2020 19:28:56 +0100 Subject: [PATCH 163/230] FIX Label of status of social contribution --- htdocs/compta/sociales/card.php | 53 ++++++++++--------- .../sociales/class/chargesociales.class.php | 10 ++-- 2 files changed, 34 insertions(+), 29 deletions(-) diff --git a/htdocs/compta/sociales/card.php b/htdocs/compta/sociales/card.php index ff2cb84dbce..92c27ff71a2 100644 --- a/htdocs/compta/sociales/card.php +++ b/htdocs/compta/sociales/card.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2004-2020 Laurent Destailleur * Copyright (C) 2005-2013 Regis Houssin * Copyright (C) 2016-2018 Frédéric France * Copyright (C) 2017 Alexandre Spangaro @@ -337,26 +337,26 @@ if ($action == 'create') print ''; print ''; - // Date end period + // Date print ''; print ''; - print ''; - print ''; - - // Date due - print ''; - print ''; print ''; print "\n"; + // Date end period + print ''; + print ''; + print ''; + print ''; + // Amount print ''; print ''; } print "
    '.$langs->trans("Type")."".$object->type_label."
    '; + print $langs->trans("Type")."".$object->type_label."
    '.$langs->trans("DateDue").""; + print $form->selectDate($object->date_ech, 'ech', 0, 0, 0, 'charge', 1); + print "
    ".$langs->trans("DateDue")."".dol_print_date($object->date_ech, 'day')."
    ".$form->textwithpicto($langs->trans("PeriodEndDate"), $langs->trans("LastDayTaxIsRelatedTo")).""; @@ -531,16 +542,6 @@ if ($id > 0) } print "
    '.$langs->trans("DateDue").""; - print $form->selectDate($object->date_ech, 'ech', 0, 0, 0, 'charge', 1); - print "
    ".$langs->trans("DateDue")."".dol_print_date($object->date_ech, 'day')."
    '; - print $form->textwithpicto($langs->trans("PeriodEndDate"), $langs->trans("LastDayTaxIsRelatedTo")); - print ''; - print $form->selectDate(!empty($dateperiod) ? $dateperiod : '-1', 'period', 0, 0, 0, 'charge', 1); - print '
    '; - print $langs->trans("DateDue"); + print $langs->trans("Date"); print ''; print $form->selectDate(!empty($dateech) ? $dateech : '-1', 'ech', 0, 0, 0, 'charge', 1); print '
    '; + print $form->textwithpicto($langs->trans("PeriodEndDate"), $langs->trans("LastDayTaxIsRelatedTo")); + print ''; + print $form->selectDate(!empty($dateperiod) ? $dateperiod : '-1', 'period', 0, 0, 0, 'charge', 1); + print '
    '; @@ -434,11 +434,11 @@ if ($id > 0) } else { + $formquestion[] = array('type' => 'date', 'name' => 'clone_date_ech', 'label' => $langs->trans("Date"), 'value' => -1); $formquestion[] = array('type' => 'date', 'name' => 'clone_period', 'label' => $langs->trans("PeriodEndDate"), 'value' => -1); - $formquestion[] = array('type' => 'date', 'name' => 'clone_date_ech', 'label' => $langs->trans("DateDue"), 'value' => -1); } - print $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneTax', $object->ref), 'confirm_clone', $formquestion, 'yes', 1); + print $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneTax', $object->ref), 'confirm_clone', $formquestion, 'yes', 1, 240); } @@ -515,9 +515,20 @@ if ($id > 0) print ''; // Type - print '"; + print '"; print ""; + // Date + if ($action == 'edit') + { + print '"; + } else { + print ""; + } + // Period end date print ""; print ""; - // Due date - if ($action == 'edit') - { - print '"; - } else { - print ""; - } - // Amount if ($action == 'edit') { diff --git a/htdocs/compta/sociales/class/chargesociales.class.php b/htdocs/compta/sociales/class/chargesociales.class.php index 5bb218d46cd..7b2d9ceea1b 100644 --- a/htdocs/compta/sociales/class/chargesociales.class.php +++ b/htdocs/compta/sociales/class/chargesociales.class.php @@ -499,16 +499,20 @@ class ChargeSociales extends CommonObject // Load translation files required by the page $langs->loadLangs(array("customers","bills")); + // We reinit status array to force to redefine them because label may change according to properties values. + $this->labelStatus = array(); + $this->labelStatusShort = array(); + if (empty($this->labelStatus) || empty($this->labelStatusShort)) { global $langs; //$langs->load("mymodule"); $this->labelStatus[self::STATUS_UNPAID] = $langs->trans('Unpaid'); $this->labelStatus[self::STATUS_PAID] = $langs->trans('Paid'); - if ($status == 0 && $alreadypaid > 0) $this->labelStatus[self::STATUS_UNPAID] = $langs->trans("BillStatusStarted"); - $this->labelStatusShort[self::STATUS_UNPAID] = $langs->trans('Draft'); + if ($status == self::STATUS_UNPAID && $alreadypaid > 0) $this->labelStatus[self::STATUS_UNPAID] = $langs->trans("BillStatusStarted"); + $this->labelStatusShort[self::STATUS_UNPAID] = $langs->trans('Unpaid'); $this->labelStatusShort[self::STATUS_PAID] = $langs->trans('Enabled'); - if ($status == 0 && $alreadypaid > 0) $this->labelStatusShort[self::STATUS_UNPAID] = $langs->trans("BillStatusStarted"); + if ($status == self::STATUS_UNPAID && $alreadypaid > 0) $this->labelStatusShort[self::STATUS_UNPAID] = $langs->trans("BillStatusStarted"); } $statusType = 'status1'; From f59cb65a21729fb157b5d184c5aaebbeace83296 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 23 Jan 2020 19:32:15 +0100 Subject: [PATCH 164/230] Fix label --- htdocs/compta/sociales/class/chargesociales.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/sociales/class/chargesociales.class.php b/htdocs/compta/sociales/class/chargesociales.class.php index 7b2d9ceea1b..bf2d04515bf 100644 --- a/htdocs/compta/sociales/class/chargesociales.class.php +++ b/htdocs/compta/sociales/class/chargesociales.class.php @@ -511,7 +511,7 @@ class ChargeSociales extends CommonObject $this->labelStatus[self::STATUS_PAID] = $langs->trans('Paid'); if ($status == self::STATUS_UNPAID && $alreadypaid > 0) $this->labelStatus[self::STATUS_UNPAID] = $langs->trans("BillStatusStarted"); $this->labelStatusShort[self::STATUS_UNPAID] = $langs->trans('Unpaid'); - $this->labelStatusShort[self::STATUS_PAID] = $langs->trans('Enabled'); + $this->labelStatusShort[self::STATUS_PAID] = $langs->trans('Paid'); if ($status == self::STATUS_UNPAID && $alreadypaid > 0) $this->labelStatusShort[self::STATUS_UNPAID] = $langs->trans("BillStatusStarted"); } From a44d534e64a55311a352a739340c4bd22cae5519 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 23 Jan 2020 19:32:15 +0100 Subject: [PATCH 165/230] Fix label --- htdocs/compta/sociales/class/chargesociales.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/sociales/class/chargesociales.class.php b/htdocs/compta/sociales/class/chargesociales.class.php index 7b2d9ceea1b..bf2d04515bf 100644 --- a/htdocs/compta/sociales/class/chargesociales.class.php +++ b/htdocs/compta/sociales/class/chargesociales.class.php @@ -511,7 +511,7 @@ class ChargeSociales extends CommonObject $this->labelStatus[self::STATUS_PAID] = $langs->trans('Paid'); if ($status == self::STATUS_UNPAID && $alreadypaid > 0) $this->labelStatus[self::STATUS_UNPAID] = $langs->trans("BillStatusStarted"); $this->labelStatusShort[self::STATUS_UNPAID] = $langs->trans('Unpaid'); - $this->labelStatusShort[self::STATUS_PAID] = $langs->trans('Enabled'); + $this->labelStatusShort[self::STATUS_PAID] = $langs->trans('Paid'); if ($status == self::STATUS_UNPAID && $alreadypaid > 0) $this->labelStatusShort[self::STATUS_UNPAID] = $langs->trans("BillStatusStarted"); } From b74d37338bd1f4638c090e68e727e7f5702d239a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 23 Jan 2020 19:37:34 +0100 Subject: [PATCH 166/230] Fix trans --- htdocs/compta/sociales/card.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/compta/sociales/card.php b/htdocs/compta/sociales/card.php index 92c27ff71a2..29c7a1f2aab 100644 --- a/htdocs/compta/sociales/card.php +++ b/htdocs/compta/sociales/card.php @@ -141,7 +141,7 @@ if ($action == 'add' && $user->rights->tax->charges->creer) if (!$dateech) { - setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("DateDue")), null, 'errors'); + setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Date")), null, 'errors'); $action = 'create'; } elseif (!$dateperiod) @@ -193,7 +193,7 @@ if ($action == 'update' && ! $_POST["cancel"] && $user->rights->tax->charges->cr if (! $dateech) { - setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("DateDue")), null, 'errors'); + setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Date")), null, 'errors'); $action = 'edit'; } elseif (! $dateperiod) @@ -522,11 +522,11 @@ if ($id > 0) // Date if ($action == 'edit') { - print '"; } else { - print ""; + print ""; } // Period end date From e1123c63a95eecfb43ae14280db433ea834e1630 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 23 Jan 2020 19:42:00 +0100 Subject: [PATCH 167/230] Fix field label --- htdocs/compta/sociales/list.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/htdocs/compta/sociales/list.php b/htdocs/compta/sociales/list.php index e25d43209eb..d259fb362fd 100644 --- a/htdocs/compta/sociales/list.php +++ b/htdocs/compta/sociales/list.php @@ -217,7 +217,9 @@ if ($resql) print ''; - // Period end date + // Date + print ''; + // Period end date print ''; - print ''; // Status print '\n"; @@ -276,6 +277,10 @@ if ($resql) print "\n"; if (!$i) $totalarray['nbfield']++; + // Date + print ''; + if (!$i) $totalarray['nbfield']++; + // Date end period print ''; - if (!$i) $totalarray['nbfield']++; - print ''; if (!$i) $totalarray['nbfield']++; From 12b4909c45b33e51ecc54a3869bd2e905991c075 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 23 Jan 2020 20:59:18 +0100 Subject: [PATCH 168/230] Fix load of segment prices not required for virtual stock change virtual stock must include production (WIP) --- htdocs/compta/facture/card-rec.php | 8 +-- htdocs/compta/facture/class/facture.class.php | 4 +- htdocs/core/class/html.form.class.php | 5 +- htdocs/product/class/product.class.php | 60 ++++++++++++------- 4 files changed, 48 insertions(+), 29 deletions(-) diff --git a/htdocs/compta/facture/card-rec.php b/htdocs/compta/facture/card-rec.php index 07697ffd2d9..7d1f529bf82 100644 --- a/htdocs/compta/facture/card-rec.php +++ b/htdocs/compta/facture/card-rec.php @@ -44,7 +44,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/invoice.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; // Load translation files required by the page -$langs->loadLangs(array('bills', 'compta', 'admin', 'other', 'products')); +$langs->loadLangs(array('bills', 'compta', 'admin', 'other', 'products', 'banks')); $action = GETPOST('action', 'alpha'); $massaction = GETPOST('massaction', 'alpha'); @@ -1030,6 +1030,8 @@ if ($action == 'create') // Only on template invoices $substitutionarray['__INVOICE_DATE_NEXT_INVOICE_BEFORE_GEN__'] = $langs->trans("DateNextInvoiceBeforeGen").' ('.$langs->trans("Example").': '.dol_print_date($object->date_when, 'dayhour').')'; $substitutionarray['__INVOICE_DATE_NEXT_INVOICE_AFTER_GEN__'] = $langs->trans("DateNextInvoiceAfterGen").' ('.$langs->trans("Example").': '.dol_print_date(dol_time_plus_duree($object->date_when, $object->frequency, $object->unit_frequency), 'dayhour').')'; + $substitutionarray['__INVOICE_COUNTER_CURRENT__'] = $langs->trans("Count"); + $substitutionarray['__INVOICE_COUNTER_MAX__'] = $langs->trans("MaxPeriodNumber"); $htmltext = ''.$langs->trans("FollowingConstantsWillBeSubstituted").':
    '; foreach ($substitutionarray as $key => $val) @@ -1446,8 +1448,6 @@ else print '
    '; // Bank Account - $langs->load('banks'); - print '"; - foreach ($arrayofpaymentmode as $key => $val) { print '
    '.$langs->trans("Type")."".$object->type_label."
    '; + print $langs->trans("Type")."".$object->type_label."
    '.$langs->trans("DateDue").""; + print $form->selectDate($object->date_ech, 'ech', 0, 0, 0, 'charge', 1); + print "
    ".$langs->trans("DateDue")."".dol_print_date($object->date_ech, 'day')."
    ".$form->textwithpicto($langs->trans("PeriodEndDate"), $langs->trans("LastDayTaxIsRelatedTo")).""; @@ -531,16 +542,6 @@ if ($id > 0) } print "
    '.$langs->trans("DateDue").""; - print $form->selectDate($object->date_ech, 'ech', 0, 0, 0, 'charge', 1); - print "
    ".$langs->trans("DateDue")."".dol_print_date($object->date_ech, 'day')."
    '.$langs->trans("DateDue").""; + print '
    '.$langs->trans("Date").""; print $form->selectDate($object->date_ech, 'ech', 0, 0, 0, 'charge', 1); print "
    ".$langs->trans("DateDue")."".dol_print_date($object->date_ech, 'day')."
    ".$langs->trans("Date")."".dol_print_date($object->date_ech, 'day')."
    '; $formsocialcontrib->select_type_socialcontrib($search_typeid, 'search_typeid', 1, 0, 0, 'maxwidth100onsmartphone'); print ' '; if (!empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; print ''; @@ -227,7 +229,6 @@ if ($resql) print ''; print ''; print ' '; $liststatus = array('0'=>$langs->trans("Unpaid"), '1'=>$langs->trans("Paid")); @@ -244,9 +245,9 @@ if ($resql) print_liste_field_titre("Ref", $_SERVER["PHP_SELF"], "id", "", $param, "", $sortfield, $sortorder); print_liste_field_titre("Label", $_SERVER["PHP_SELF"], "cs.libelle", "", $param, 'class="left"', $sortfield, $sortorder); print_liste_field_titre("Type", $_SERVER["PHP_SELF"], "type", "", $param, 'class="left"', $sortfield, $sortorder); + print_liste_field_titre("Date", $_SERVER["PHP_SELF"], "cs.date_ech", "", $param, 'align="center"', $sortfield, $sortorder); print_liste_field_titre("PeriodEndDate", $_SERVER["PHP_SELF"], "periode", "", $param, 'align="center"', $sortfield, $sortorder); print_liste_field_titre("Amount", $_SERVER["PHP_SELF"], "cs.amount", "", $param, 'class="right"', $sortfield, $sortorder); - print_liste_field_titre("DateDue", $_SERVER["PHP_SELF"], "cs.date_ech", "", $param, 'align="center"', $sortfield, $sortorder); print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "cs.paye", "", $param, 'class="right"', $sortfield, $sortorder); print_liste_field_titre('', $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'maxwidthsearch '); print "
    ".$obj->type_label."'.dol_print_date($db->jdate($obj->date_ech), 'day').''; if ($obj->periode) @@ -295,10 +300,6 @@ if ($resql) if (!$i) $totalarray['pos'][$totalarray['nbfield']] = 'totalttcfield'; $totalarray['val']['totalttcfield'] += $obj->amount; - // Due date - print ''.dol_print_date($db->jdate($obj->date_ech), 'day').''.$chargesociale_static->LibStatut($obj->paye, 5, $obj->alreadypayed).'
    '; print ''; // Model pdf - $langs->load('banks'); - print ''; print '
    '; print $langs->trans('BankAccount'); @@ -1468,8 +1468,6 @@ else print '
    '; print ''; // Bank Account - $langs->load('banks'); - print '
    '; print $langs->trans('Model'); diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 421e6b2e7d6..83f9706bcee 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -448,10 +448,12 @@ class Facture extends CommonInvoice $substitutionarray['__INVOICE_PREVIOUS_YEAR__'] = dol_print_date(dol_time_plus_duree($this->date, -1, 'y'), '%Y'); $substitutionarray['__INVOICE_YEAR__'] = dol_print_date($this->date, '%Y'); $substitutionarray['__INVOICE_NEXT_YEAR__'] = dol_print_date(dol_time_plus_duree($this->date, 1, 'y'), '%Y'); - // Only for tempalte invoice + // Only for template invoice $substitutionarray['__INVOICE_DATE_NEXT_INVOICE_BEFORE_GEN__'] = dol_print_date($originaldatewhen, 'dayhour'); $substitutionarray['__INVOICE_DATE_NEXT_INVOICE_AFTER_GEN__'] = dol_print_date($nextdatewhen, 'dayhour'); $substitutionarray['__INVOICE_PREVIOUS_DATE_NEXT_INVOICE_AFTER_GEN__'] = dol_print_date($previousdaynextdatewhen, 'dayhour'); + $substitutionarray['__INVOICE_COUNTER_CURRENT__'] = $_facrec->nb_gen_done; + $substitutionarray['__INVOICE_COUNTER_MAX__'] = $_facrec->nb_gen_max; //var_dump($substitutionarray);exit; diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index fe3f271b447..5d93ca482dd 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -2364,6 +2364,7 @@ class Form $objp->price_ttc = price2num($objp->price_ttc, 'MU'); } } + $this->constructProductListOption($objp, $opt, $optJson, $price_level, $selected, $hidepriceinlabel, $filterkey); // Add new entry // "key" value of json key array is used by jQuery automatically as selected value @@ -2514,7 +2515,7 @@ class Form $sql .= " ORDER BY date_price DESC, rowid DESC"; // Warning DESC must be both on date_price and rowid. $sql .= " LIMIT 1"; - dol_syslog(get_class($this).'::constructProductListOption search price for level '.$price_level.'', LOG_DEBUG); + dol_syslog(get_class($this).'::constructProductListOption search price for product '.$objp->rowid.' AND level '.$price_level.'', LOG_DEBUG); $result2 = $this->db->query($sql); if ($result2) { @@ -2642,7 +2643,7 @@ class Form $langs->load("stocks"); $tmpproduct = new Product($this->db); - $tmpproduct->fetch($objp->rowid); + $tmpproduct->fetch($objp->rowid, '', '', '', 1, 1, 1); // Load product without lang and prices arrays (we just need to make ->virtual_stock() after) $tmpproduct->load_virtual_stock(); $virtualstock = $tmpproduct->stock_theorique; diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 664388797fc..3e92772738f 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -2051,9 +2051,11 @@ class Product extends CommonObject * @param string $ref_ext Ref ext of product/service to load * @param string $barcode Barcode of product/service to load * @param int $ignore_expression Ignores the math expression for calculating price and uses the db value instead - * @return int <0 if KO, 0 if not found, >0 if OK + * @param int $ignore_price_load Load product without loading prices arrays (when we are sure we don't need them) + * @param int $ignore_lang_load Load product without loading language arrays (when we are sure we don't need them) + * @return int <0 if KO, 0 if not found, >0 if OK */ - public function fetch($id = '', $ref = '', $ref_ext = '', $barcode = '', $ignore_expression = 0) + public function fetch($id = '', $ref = '', $ref_ext = '', $barcode = '', $ignore_expression = 0, $ignore_price_load = 0, $ignore_lang_load = 0) { include_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; @@ -2182,12 +2184,12 @@ class Product extends CommonObject $this->fetch_optionals(); // multilangs - if (!empty($conf->global->MAIN_MULTILANGS)) { + if (!empty($conf->global->MAIN_MULTILANGS) && empty($ignore_lang_load)) { $this->getMultiLangs(); } // Load multiprices array - if (!empty($conf->global->PRODUIT_MULTIPRICES)) // prices per segment + if (!empty($conf->global->PRODUIT_MULTIPRICES) && empty($ignore_price_load)) // prices per segment { for ($i = 1; $i <= $conf->global->PRODUIT_MULTIPRICES_LIMIT; $i++) { @@ -2255,11 +2257,11 @@ class Product extends CommonObject } } } - elseif (!empty($conf->global->PRODUIT_CUSTOMER_PRICES)) // prices per customers + elseif (!empty($conf->global->PRODUIT_CUSTOMER_PRICES) && empty($ignore_price_load)) // prices per customers { // Nothing loaded by default. List may be very long. } - elseif (!empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY)) // prices per quantity + elseif (!empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY) && empty($ignore_price_load)) // prices per quantity { $sql = "SELECT price, price_ttc, price_min, price_min_ttc,"; $sql .= " price_base_type, tva_tx, default_vat_code, tosell, price_by_qty, rowid"; @@ -2310,7 +2312,7 @@ class Product extends CommonObject return -1; } } - elseif (!empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES)) // prices per customer and quantity + elseif (!empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES) && empty($ignore_price_load)) // prices per customer and quantity { for ($i = 1; $i <= $conf->global->PRODUIT_MULTIPRICES_LIMIT; $i++) { @@ -2770,7 +2772,7 @@ class Product extends CommonObject // phpcs:enable global $conf, $user; - $sql = "SELECT COUNT(DISTINCT cf.fk_soc) as nb_customers, COUNT(DISTINCT cf.rowid) as nb,"; + $sql = "SELECT COUNT(DISTINCT cf.fk_soc) as nb_suppliers, COUNT(DISTINCT cf.rowid) as nb,"; $sql .= " COUNT(fd.rowid) as nb_rows, SUM(fd.qty) as qty"; $sql .= " FROM ".MAIN_DB_PREFIX."commande_fournisseur_dispatch as fd"; $sql .= ", ".MAIN_DB_PREFIX."commande_fournisseur as cf"; @@ -2791,7 +2793,7 @@ class Product extends CommonObject $result = $this->db->query($sql); if ($result) { $obj = $this->db->fetch_object($result); - $this->stats_reception['suppliers'] = $obj->nb_customers; + $this->stats_reception['suppliers'] = $obj->nb_suppliers; $this->stats_reception['nb'] = $obj->nb; $this->stats_reception['rows'] = $obj->nb_rows; $this->stats_reception['qty'] = $obj->qty ? $obj->qty : 0; @@ -4674,6 +4676,7 @@ class Product extends CommonObject $stock_commande_fournisseur = 0; $stock_sending_client = 0; $stock_reception_fournisseur = 0; + $stock_inproduction = 0; if (!empty($conf->commande->enabled)) { @@ -4699,34 +4702,49 @@ class Product extends CommonObject $result = $this->load_stats_commande_fournisseur(0, '1,2,3,4', 1); if ($result < 0) dol_print_error($this->db, $this->error); $stock_commande_fournisseur = $this->stats_commande_fournisseur['qty']; - + } + if (!empty($conf->fournisseur->enabled) && empty($conf->reception->enabled)) + { $result = $this->load_stats_reception(0, '4', 1); if ($result < 0) dol_print_error($this->db, $this->error); $stock_reception_fournisseur = $this->stats_reception['qty']; } + if (!empty($conf->fournisseur->enabled) && !empty($conf->reception->enabled)) + { + $result = $this->load_stats_reception(0, '4', 1); // Use same tables than when module reception is not used. + if ($result < 0) dol_print_error($this->db, $this->error); + $stock_reception_fournisseur = $this->stats_reception['qty']; + } + if (!empty($conf->mrp->enabled)) + { + // TODO + $stock_inproduction = 0; + } + + $this->stock_theorique = $this->stock_reel + $stock_inproduction; // Stock decrease mode if (!empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT) || !empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT_CLOSE)) { - $this->stock_theorique = $this->stock_reel - $stock_commande_client + $stock_sending_client; + $this->stock_theorique -= ($stock_commande_client - $stock_sending_client); } - if (!empty($conf->global->STOCK_CALCULATE_ON_VALIDATE_ORDER)) { - $this->stock_theorique = $this->stock_reel; + elseif (!empty($conf->global->STOCK_CALCULATE_ON_VALIDATE_ORDER)) { + $this->stock_theorique += 0; } - if (!empty($conf->global->STOCK_CALCULATE_ON_BILL)) { - $this->stock_theorique = $this->stock_reel - $stock_commande_client; + elseif (!empty($conf->global->STOCK_CALCULATE_ON_BILL)) { + $this->stock_theorique -= $stock_commande_client; } // Stock Increase mode if (!empty($conf->global->STOCK_CALCULATE_ON_RECEPTION) || !empty($conf->global->STOCK_CALCULATE_ON_RECEPTION_CLOSE)) { - $this->stock_theorique += $stock_commande_fournisseur - $stock_reception_fournisseur; + $this->stock_theorique += ($stock_commande_fournisseur - $stock_reception_fournisseur); } - if (!empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER)) { - $this->stock_theorique += $stock_commande_fournisseur - $stock_reception_fournisseur; + elseif (!empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER)) { + $this->stock_theorique += ($stock_commande_fournisseur - $stock_reception_fournisseur); } - if (!empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER)) { + elseif (!empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER)) { $this->stock_theorique -= $stock_reception_fournisseur; } - if (!empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_BILL)) { - $this->stock_theorique += $stock_commande_fournisseur - $stock_reception_fournisseur; + elseif (!empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_BILL)) { + $this->stock_theorique += ($stock_commande_fournisseur - $stock_reception_fournisseur); } if (!is_object($hookmanager)) { From 540713510e765eee847a458118732e05247e9f74 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 23 Jan 2020 20:59:18 +0100 Subject: [PATCH 169/230] Fix load of segment prices not required for virtual stock change virtual stock must include production (WIP) --- htdocs/compta/facture/card-rec.php | 8 +-- htdocs/compta/facture/class/facture.class.php | 4 +- htdocs/core/class/html.form.class.php | 5 +- htdocs/product/class/product.class.php | 60 ++++++++++++------- 4 files changed, 48 insertions(+), 29 deletions(-) diff --git a/htdocs/compta/facture/card-rec.php b/htdocs/compta/facture/card-rec.php index 07697ffd2d9..7d1f529bf82 100644 --- a/htdocs/compta/facture/card-rec.php +++ b/htdocs/compta/facture/card-rec.php @@ -44,7 +44,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/invoice.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; // Load translation files required by the page -$langs->loadLangs(array('bills', 'compta', 'admin', 'other', 'products')); +$langs->loadLangs(array('bills', 'compta', 'admin', 'other', 'products', 'banks')); $action = GETPOST('action', 'alpha'); $massaction = GETPOST('massaction', 'alpha'); @@ -1030,6 +1030,8 @@ if ($action == 'create') // Only on template invoices $substitutionarray['__INVOICE_DATE_NEXT_INVOICE_BEFORE_GEN__'] = $langs->trans("DateNextInvoiceBeforeGen").' ('.$langs->trans("Example").': '.dol_print_date($object->date_when, 'dayhour').')'; $substitutionarray['__INVOICE_DATE_NEXT_INVOICE_AFTER_GEN__'] = $langs->trans("DateNextInvoiceAfterGen").' ('.$langs->trans("Example").': '.dol_print_date(dol_time_plus_duree($object->date_when, $object->frequency, $object->unit_frequency), 'dayhour').')'; + $substitutionarray['__INVOICE_COUNTER_CURRENT__'] = $langs->trans("Count"); + $substitutionarray['__INVOICE_COUNTER_MAX__'] = $langs->trans("MaxPeriodNumber"); $htmltext = ''.$langs->trans("FollowingConstantsWillBeSubstituted").':
    '; foreach ($substitutionarray as $key => $val) @@ -1446,8 +1448,6 @@ else print '
    '; print ''; // Model pdf - $langs->load('banks'); - print '
    '; print $langs->trans('BankAccount'); @@ -1468,8 +1468,6 @@ else print '
    '; print ' - + Date: Fri, 24 Jan 2020 09:23:08 +0100 Subject: [PATCH 171/230] Update "submitted only" module options Don't update to the null value options absent from the posted parameters. --- htdocs/core/actions_setmoduleoptions.inc.php | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/htdocs/core/actions_setmoduleoptions.inc.php b/htdocs/core/actions_setmoduleoptions.inc.php index e0232ee5c87..d3f1d48064d 100644 --- a/htdocs/core/actions_setmoduleoptions.inc.php +++ b/htdocs/core/actions_setmoduleoptions.inc.php @@ -34,11 +34,15 @@ if ($action == 'update' && is_array($arrayofparameters)) $ok=true; foreach($arrayofparameters as $key => $val) { - $result=dolibarr_set_const($db, $key, GETPOST($key, 'alpha'), 'chaine', 0, '', $conf->entity); - if ($result < 0) + // Modify constant only if key was posted (avoid resetting key to the null value) + if (GETPOSTISSET($key)) { - $ok=false; - break; + $result=dolibarr_set_const($db, $key, GETPOST($key, 'alpha'), 'chaine', 0, '', $conf->entity); + if ($result < 0) + { + $ok=false; + break; + } } } From 4761671fc8f40024f0f334b3a5611b7b8a710e26 Mon Sep 17 00:00:00 2001 From: simicar29 <53998265+simicar29@users.noreply.github.com> Date: Fri, 24 Jan 2020 09:41:22 +0100 Subject: [PATCH 172/230] Add Hook doPreMassActions Add Hook doPreMassActions to allow dedicated form display for custom mass actions --- htdocs/core/tpl/massactions_pre.tpl.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/htdocs/core/tpl/massactions_pre.tpl.php b/htdocs/core/tpl/massactions_pre.tpl.php index a0c627ac049..bc040e1274d 100644 --- a/htdocs/core/tpl/massactions_pre.tpl.php +++ b/htdocs/core/tpl/massactions_pre.tpl.php @@ -166,3 +166,13 @@ if ($massaction == 'presend') dol_fiche_end(); } +// Allow Pre-Mass-Action hook (eg for confirmation dialog) +$parameters['toselect']=$toselect; +$parameters['uploaddir']=$uploaddir; + +$reshook=$hookmanager->executeHooks('doPreMassActions',$parameters, $object, $action); +if ($reshook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); +} else { + print $hookmanager->resPrint; +} From cfa67b6a5d259624b9fbddaef58887fbe8982384 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Fri, 24 Jan 2020 08:47:11 +0000 Subject: [PATCH 173/230] Fixing style errors. --- htdocs/core/tpl/massactions_pre.tpl.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/tpl/massactions_pre.tpl.php b/htdocs/core/tpl/massactions_pre.tpl.php index bc040e1274d..6949c76680f 100644 --- a/htdocs/core/tpl/massactions_pre.tpl.php +++ b/htdocs/core/tpl/massactions_pre.tpl.php @@ -170,7 +170,7 @@ if ($massaction == 'presend') $parameters['toselect']=$toselect; $parameters['uploaddir']=$uploaddir; -$reshook=$hookmanager->executeHooks('doPreMassActions',$parameters, $object, $action); +$reshook=$hookmanager->executeHooks('doPreMassActions', $parameters, $object, $action); if ($reshook < 0) { setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); } else { From 354b784279984aca4d172f9a2db9f8fd1a1a38fe Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Fri, 24 Jan 2020 09:57:17 +0100 Subject: [PATCH 174/230] NEW: Add hook on margin list page --- htdocs/margin/agentMargins.php | 11 +++++++++-- htdocs/margin/customerMargins.php | 11 +++++++++-- htdocs/margin/productMargins.php | 3 +++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/htdocs/margin/agentMargins.php b/htdocs/margin/agentMargins.php index 4080822b9ef..852bf4934d5 100644 --- a/htdocs/margin/agentMargins.php +++ b/htdocs/margin/agentMargins.php @@ -74,6 +74,9 @@ if ($user->rights->margins->read->all) { } $result = restrictedArea($user, 'margins'); +// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context +$object = new User($db); +$hookmanager->initHooks(array('marginagentlist')); /* * Actions @@ -205,8 +208,11 @@ if ($result) else // value is 'costprice' or 'pmp' $labelcostprice = 'CostPrice'; + $moreforfilter = ''; + $i = 0; - print "
    '; print $langs->trans('Model'); diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 421e6b2e7d6..83f9706bcee 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -448,10 +448,12 @@ class Facture extends CommonInvoice $substitutionarray['__INVOICE_PREVIOUS_YEAR__'] = dol_print_date(dol_time_plus_duree($this->date, -1, 'y'), '%Y'); $substitutionarray['__INVOICE_YEAR__'] = dol_print_date($this->date, '%Y'); $substitutionarray['__INVOICE_NEXT_YEAR__'] = dol_print_date(dol_time_plus_duree($this->date, 1, 'y'), '%Y'); - // Only for tempalte invoice + // Only for template invoice $substitutionarray['__INVOICE_DATE_NEXT_INVOICE_BEFORE_GEN__'] = dol_print_date($originaldatewhen, 'dayhour'); $substitutionarray['__INVOICE_DATE_NEXT_INVOICE_AFTER_GEN__'] = dol_print_date($nextdatewhen, 'dayhour'); $substitutionarray['__INVOICE_PREVIOUS_DATE_NEXT_INVOICE_AFTER_GEN__'] = dol_print_date($previousdaynextdatewhen, 'dayhour'); + $substitutionarray['__INVOICE_COUNTER_CURRENT__'] = $_facrec->nb_gen_done; + $substitutionarray['__INVOICE_COUNTER_MAX__'] = $_facrec->nb_gen_max; //var_dump($substitutionarray);exit; diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 0fe8c72220c..cba66729d8c 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -2361,6 +2361,7 @@ class Form $objp->price_ttc = price2num($objp->price_ttc, 'MU'); } } + $this->constructProductListOption($objp, $opt, $optJson, $price_level, $selected, $hidepriceinlabel, $filterkey); // Add new entry // "key" value of json key array is used by jQuery automatically as selected value @@ -2511,7 +2512,7 @@ class Form $sql .= " ORDER BY date_price DESC, rowid DESC"; // Warning DESC must be both on date_price and rowid. $sql .= " LIMIT 1"; - dol_syslog(get_class($this).'::constructProductListOption search price for level '.$price_level.'', LOG_DEBUG); + dol_syslog(get_class($this).'::constructProductListOption search price for product '.$objp->rowid.' AND level '.$price_level.'', LOG_DEBUG); $result2 = $this->db->query($sql); if ($result2) { @@ -2639,7 +2640,7 @@ class Form $langs->load("stocks"); $tmpproduct = new Product($this->db); - $tmpproduct->fetch($objp->rowid); + $tmpproduct->fetch($objp->rowid, '', '', '', 1, 1, 1); // Load product without lang and prices arrays (we just need to make ->virtual_stock() after) $tmpproduct->load_virtual_stock(); $virtualstock = $tmpproduct->stock_theorique; diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 664388797fc..3e92772738f 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -2051,9 +2051,11 @@ class Product extends CommonObject * @param string $ref_ext Ref ext of product/service to load * @param string $barcode Barcode of product/service to load * @param int $ignore_expression Ignores the math expression for calculating price and uses the db value instead - * @return int <0 if KO, 0 if not found, >0 if OK + * @param int $ignore_price_load Load product without loading prices arrays (when we are sure we don't need them) + * @param int $ignore_lang_load Load product without loading language arrays (when we are sure we don't need them) + * @return int <0 if KO, 0 if not found, >0 if OK */ - public function fetch($id = '', $ref = '', $ref_ext = '', $barcode = '', $ignore_expression = 0) + public function fetch($id = '', $ref = '', $ref_ext = '', $barcode = '', $ignore_expression = 0, $ignore_price_load = 0, $ignore_lang_load = 0) { include_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; @@ -2182,12 +2184,12 @@ class Product extends CommonObject $this->fetch_optionals(); // multilangs - if (!empty($conf->global->MAIN_MULTILANGS)) { + if (!empty($conf->global->MAIN_MULTILANGS) && empty($ignore_lang_load)) { $this->getMultiLangs(); } // Load multiprices array - if (!empty($conf->global->PRODUIT_MULTIPRICES)) // prices per segment + if (!empty($conf->global->PRODUIT_MULTIPRICES) && empty($ignore_price_load)) // prices per segment { for ($i = 1; $i <= $conf->global->PRODUIT_MULTIPRICES_LIMIT; $i++) { @@ -2255,11 +2257,11 @@ class Product extends CommonObject } } } - elseif (!empty($conf->global->PRODUIT_CUSTOMER_PRICES)) // prices per customers + elseif (!empty($conf->global->PRODUIT_CUSTOMER_PRICES) && empty($ignore_price_load)) // prices per customers { // Nothing loaded by default. List may be very long. } - elseif (!empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY)) // prices per quantity + elseif (!empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY) && empty($ignore_price_load)) // prices per quantity { $sql = "SELECT price, price_ttc, price_min, price_min_ttc,"; $sql .= " price_base_type, tva_tx, default_vat_code, tosell, price_by_qty, rowid"; @@ -2310,7 +2312,7 @@ class Product extends CommonObject return -1; } } - elseif (!empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES)) // prices per customer and quantity + elseif (!empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES) && empty($ignore_price_load)) // prices per customer and quantity { for ($i = 1; $i <= $conf->global->PRODUIT_MULTIPRICES_LIMIT; $i++) { @@ -2770,7 +2772,7 @@ class Product extends CommonObject // phpcs:enable global $conf, $user; - $sql = "SELECT COUNT(DISTINCT cf.fk_soc) as nb_customers, COUNT(DISTINCT cf.rowid) as nb,"; + $sql = "SELECT COUNT(DISTINCT cf.fk_soc) as nb_suppliers, COUNT(DISTINCT cf.rowid) as nb,"; $sql .= " COUNT(fd.rowid) as nb_rows, SUM(fd.qty) as qty"; $sql .= " FROM ".MAIN_DB_PREFIX."commande_fournisseur_dispatch as fd"; $sql .= ", ".MAIN_DB_PREFIX."commande_fournisseur as cf"; @@ -2791,7 +2793,7 @@ class Product extends CommonObject $result = $this->db->query($sql); if ($result) { $obj = $this->db->fetch_object($result); - $this->stats_reception['suppliers'] = $obj->nb_customers; + $this->stats_reception['suppliers'] = $obj->nb_suppliers; $this->stats_reception['nb'] = $obj->nb; $this->stats_reception['rows'] = $obj->nb_rows; $this->stats_reception['qty'] = $obj->qty ? $obj->qty : 0; @@ -4674,6 +4676,7 @@ class Product extends CommonObject $stock_commande_fournisseur = 0; $stock_sending_client = 0; $stock_reception_fournisseur = 0; + $stock_inproduction = 0; if (!empty($conf->commande->enabled)) { @@ -4699,34 +4702,49 @@ class Product extends CommonObject $result = $this->load_stats_commande_fournisseur(0, '1,2,3,4', 1); if ($result < 0) dol_print_error($this->db, $this->error); $stock_commande_fournisseur = $this->stats_commande_fournisseur['qty']; - + } + if (!empty($conf->fournisseur->enabled) && empty($conf->reception->enabled)) + { $result = $this->load_stats_reception(0, '4', 1); if ($result < 0) dol_print_error($this->db, $this->error); $stock_reception_fournisseur = $this->stats_reception['qty']; } + if (!empty($conf->fournisseur->enabled) && !empty($conf->reception->enabled)) + { + $result = $this->load_stats_reception(0, '4', 1); // Use same tables than when module reception is not used. + if ($result < 0) dol_print_error($this->db, $this->error); + $stock_reception_fournisseur = $this->stats_reception['qty']; + } + if (!empty($conf->mrp->enabled)) + { + // TODO + $stock_inproduction = 0; + } + + $this->stock_theorique = $this->stock_reel + $stock_inproduction; // Stock decrease mode if (!empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT) || !empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT_CLOSE)) { - $this->stock_theorique = $this->stock_reel - $stock_commande_client + $stock_sending_client; + $this->stock_theorique -= ($stock_commande_client - $stock_sending_client); } - if (!empty($conf->global->STOCK_CALCULATE_ON_VALIDATE_ORDER)) { - $this->stock_theorique = $this->stock_reel; + elseif (!empty($conf->global->STOCK_CALCULATE_ON_VALIDATE_ORDER)) { + $this->stock_theorique += 0; } - if (!empty($conf->global->STOCK_CALCULATE_ON_BILL)) { - $this->stock_theorique = $this->stock_reel - $stock_commande_client; + elseif (!empty($conf->global->STOCK_CALCULATE_ON_BILL)) { + $this->stock_theorique -= $stock_commande_client; } // Stock Increase mode if (!empty($conf->global->STOCK_CALCULATE_ON_RECEPTION) || !empty($conf->global->STOCK_CALCULATE_ON_RECEPTION_CLOSE)) { - $this->stock_theorique += $stock_commande_fournisseur - $stock_reception_fournisseur; + $this->stock_theorique += ($stock_commande_fournisseur - $stock_reception_fournisseur); } - if (!empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER)) { - $this->stock_theorique += $stock_commande_fournisseur - $stock_reception_fournisseur; + elseif (!empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER)) { + $this->stock_theorique += ($stock_commande_fournisseur - $stock_reception_fournisseur); } - if (!empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER)) { + elseif (!empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER)) { $this->stock_theorique -= $stock_reception_fournisseur; } - if (!empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_BILL)) { - $this->stock_theorique += $stock_commande_fournisseur - $stock_reception_fournisseur; + elseif (!empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_BILL)) { + $this->stock_theorique += ($stock_commande_fournisseur - $stock_reception_fournisseur); } if (!is_object($hookmanager)) { From c46f255408aa34a07b262d9fe369f9aeaea3979e Mon Sep 17 00:00:00 2001 From: javierybar <36415318+javierybar@users.noreply.github.com> Date: Fri, 24 Jan 2020 09:22:46 +0100 Subject: [PATCH 170/230] TakePOS price rounding --- htdocs/takepos/receipt.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/takepos/receipt.php b/htdocs/takepos/receipt.php index 462f9a830b0..185302e3a16 100644 --- a/htdocs/takepos/receipt.php +++ b/htdocs/takepos/receipt.php @@ -138,7 +138,7 @@ if ($conf->global->TAKEPOS_CUSTOM_RECEIPT && $conf->global->TAKEPOS_SHOW_CUSTOME else echo $line->description;?> qty;?>total_ttc/$line->qty;?>total_ttc, 'MT'), 1);?> total_ttc);?>
    "; + print '
    '; + print '
    '."\n"; print ''; if ($agentid > 0) @@ -299,7 +305,8 @@ if ($result) print "\n"; } } - print "
    "; + print "
    "; + print ''; } else { diff --git a/htdocs/margin/customerMargins.php b/htdocs/margin/customerMargins.php index 35dde9a2e62..ed0a2a01b34 100644 --- a/htdocs/margin/customerMargins.php +++ b/htdocs/margin/customerMargins.php @@ -62,6 +62,9 @@ if (!empty($_POST['startdatemonth'])) if (!empty($_POST['enddatemonth'])) $enddate = dol_mktime(23, 59, 59, $_POST['enddatemonth'], $_POST['enddateday'], $_POST['enddateyear']); +// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context +$object = new Societe($db); +$hookmanager->initHooks(array('margincustomerlist')); /* * View @@ -255,8 +258,11 @@ if ($result) else // value is 'costprice' or 'pmp' $labelcostprice = 'CostPrice'; + $moreforfilter = ''; + $i = 0; - print ""; + print '
    '; + print '
    '."\n"; print ''; if (!empty($client)) { @@ -359,7 +365,8 @@ if ($result) print "\n"; print "\n"; - print "
    ".(($markRate === '') ? 'n/a' : price($markRate, null, null, null, null, $rounding)."%")."
    "; + print "
    "; + print ''; } else { diff --git a/htdocs/margin/productMargins.php b/htdocs/margin/productMargins.php index 4b9c271cc5c..27354556910 100644 --- a/htdocs/margin/productMargins.php +++ b/htdocs/margin/productMargins.php @@ -76,6 +76,9 @@ if (!empty($_POST['startdatemonth'])) if (!empty($_POST['enddatemonth'])) $enddate = dol_mktime(23, 59, 59, $_POST['enddatemonth'], $_POST['enddateday'], $_POST['enddateyear']); +// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context +$object = new Product($db); +$hookmanager->initHooks(array('marginproductlist')); /* * View From 1f18c93b9f79fd1542b68e5da02de4e97b28432f Mon Sep 17 00:00:00 2001 From: gauthier Date: Fri, 24 Jan 2020 12:06:22 +0100 Subject: [PATCH 175/230] FIX : thirdparty alias name desappeared if we change country with THIRDPARTY_SUGGEST_ALSO_ADDRESS_CREATION conf --- htdocs/societe/card.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php index 3f7b97fee73..d277632c348 100644 --- a/htdocs/societe/card.php +++ b/htdocs/societe/card.php @@ -950,6 +950,7 @@ else if (! empty($conf->fournisseur->enabled) && (GETPOST("type")=='f' || (GETPOST("type")=='' && ! empty($conf->global->THIRDPARTY_SUPPLIER_BY_DEFAULT)))) { $object->fournisseur=1; } $object->name = GETPOST('name', 'alpha'); + $object->name_alias = GETPOST('name_alias', 'alpha'); $object->firstname = GETPOST('firstname', 'alpha'); $object->particulier = $private; $object->prefix_comm = GETPOST('prefix_comm', 'alpha'); From dc3eafccb9f75e1062d3693956dfd4676b86c3a7 Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Fri, 24 Jan 2020 13:22:04 +0100 Subject: [PATCH 176/230] add hook into withdraw list --- htdocs/compta/prelevement/demandes.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/htdocs/compta/prelevement/demandes.php b/htdocs/compta/prelevement/demandes.php index d21815acfac..aa0538341e6 100644 --- a/htdocs/compta/prelevement/demandes.php +++ b/htdocs/compta/prelevement/demandes.php @@ -57,6 +57,16 @@ if (! $sortfield) $sortfield="f.ref"; $massactionbutton = ''; +$hookmanager->initHooks(array('withdrawalstodolist')); + + +/* + * Actions + */ + +$parameters = array('socid' => $socid, 'limit' => $limit, 'page' => $page, 'offset' => $offset); +$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'); /* * View @@ -142,7 +152,7 @@ $newcardbutton = ''.$lan print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'generic', 0, $newcardbutton, '', $limit); -print ''; +print ''; if ($optioncss != '') print ''; print ''; print ''; From f5395fa859bf6423e46faaa06e4db60cc1f4def1 Mon Sep 17 00:00:00 2001 From: atm-greg Date: Fri, 24 Jan 2020 14:28:08 +0100 Subject: [PATCH 177/230] fix lost name_alias on country selection --- htdocs/societe/card.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php index 3f7b97fee73..d277632c348 100644 --- a/htdocs/societe/card.php +++ b/htdocs/societe/card.php @@ -950,6 +950,7 @@ else if (! empty($conf->fournisseur->enabled) && (GETPOST("type")=='f' || (GETPOST("type")=='' && ! empty($conf->global->THIRDPARTY_SUPPLIER_BY_DEFAULT)))) { $object->fournisseur=1; } $object->name = GETPOST('name', 'alpha'); + $object->name_alias = GETPOST('name_alias', 'alpha'); $object->firstname = GETPOST('firstname', 'alpha'); $object->particulier = $private; $object->prefix_comm = GETPOST('prefix_comm', 'alpha'); From 17f28189f9a1a77a2f38d19589e1f53fc8618847 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 24 Jan 2020 14:51:45 +0100 Subject: [PATCH 178/230] Virtual stock must include Manufacturing Orders --- htdocs/langs/en_US/mrp.lang | 2 + htdocs/product/class/product.class.php | 95 +++++++++++++++++++++++++- htdocs/product/stock/product.php | 8 +++ 3 files changed, 103 insertions(+), 2 deletions(-) diff --git a/htdocs/langs/en_US/mrp.lang b/htdocs/langs/en_US/mrp.lang index e4034426e9a..11c6915a25c 100644 --- a/htdocs/langs/en_US/mrp.lang +++ b/htdocs/langs/en_US/mrp.lang @@ -64,3 +64,5 @@ ConfirmProductionDesc=By clicking on '%s', you will validate the consumption and ProductionForRef=Production of %s AutoCloseMO=Close automatically the Manufacturing Order if quantities to consume and to produce are reached NoStockChangeOnServices=No stock change on services +ProductQtyToConsumeByMO=Product quantity still to consume by open MO +ProductQtyToProduceByMO=Product quentity still to produce by open MO diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 3e92772738f..5eb8ab904cc 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -318,6 +318,9 @@ class Product extends CommonObject public $stats_contrat = array(); public $stats_facture = array(); public $stats_commande_fournisseur = array(); + public $stats_reception = array(); + public $stats_mrptoconsume = array(); + public $stats_mrptoproduce = array(); public $multilangs = array(); @@ -2806,6 +2809,93 @@ class Product extends CommonObject } } + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps + /** + * Charge tableau des stats commande client pour le produit/service + * + * @param int $socid Id societe pour filtrer sur une societe + * @param string $filtrestatut Id statut pour filtrer sur un statut + * @param int $forVirtualStock Ignore rights filter for virtual stock calculation. + * @return integer Array of stats in $this->stats_commande (nb=nb of order, qty=qty ordered), <0 if ko or >0 if ok + */ + public function load_stats_inproduction($socid = 0, $filtrestatut = '', $forVirtualStock = 0) + { + // phpcs:enable + global $conf, $user; + + $sql = "SELECT COUNT(DISTINCT m.fk_soc) as nb_customers, COUNT(DISTINCT m.rowid) as nb,"; + $sql .= " COUNT(mp.rowid) as nb_rows, SUM(mp.qty) as qty, role"; + $sql .= " FROM ".MAIN_DB_PREFIX."mrp_production as mp"; + $sql .= ", ".MAIN_DB_PREFIX."mrp_mo as m"; + $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = m.fk_soc"; + if (!$user->rights->societe->client->voir && !$socid && !$forVirtualStock) { + $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; + } + $sql .= " WHERE m.rowid = mp.fk_mo"; + $sql .= " AND m.entity IN (".getEntity('mrp').")"; + $sql .= " AND mp.fk_product = ".$this->id; + if (!$user->rights->societe->client->voir && !$socid && !$forVirtualStock) { + $sql .= " AND m.fk_soc = sc.fk_soc AND sc.fk_user = ".$user->id; + } + if ($socid > 0) { + $sql .= " AND m.fk_soc = ".$socid; + } + if ($filtrestatut <> '') { + $sql .= " AND m.status in (".$filtrestatut.")"; + } + $sql .= " GROUP BY role"; + + $this->stats_mrptoconsume['customers'] = 0; + $this->stats_mrptoconsume['nb'] = 0; + $this->stats_mrptoconsume['rows'] = 0; + $this->stats_mrptoconsume['qty'] = 0; + $this->stats_mrptoproduce['customers'] = 0; + $this->stats_mrptoproduce['nb'] = 0; + $this->stats_mrptoproduce['rows'] = 0; + $this->stats_mrptoproduce['qty'] = 0; + + $result = $this->db->query($sql); + if ($result) { + while ($obj = $this->db->fetch_object($result)) { + if ($obj->role == 'toconsume') { + $this->stats_mrptoconsume['customers'] += $obj->nb_customers; + $this->stats_mrptoconsume['nb'] += $obj->nb; + $this->stats_mrptoconsume['rows'] += $obj->nb_rows; + $this->stats_mrptoconsume['qty'] += ($obj->qty ? $obj->qty : 0); + } + if ($obj->role == 'consumed') { + //$this->stats_mrptoconsume['customers'] += $obj->nb_customers; + //$this->stats_mrptoconsume['nb'] += $obj->nb; + //$this->stats_mrptoconsume['rows'] += $obj->nb_rows; + $this->stats_mrptoconsume['qty'] -= ($obj->qty ? $obj->qty : 0); + } + if ($obj->role == 'toproduce') { + $this->stats_mrptoproduce['customers'] += $obj->nb_customers; + $this->stats_mrptoproduce['nb'] += $obj->nb; + $this->stats_mrptoproduce['rows'] += $obj->nb_rows; + $this->stats_mrptoproduce['qty'] += ($obj->qty ? $obj->qty : 0); + } + if ($obj->role == 'produced') { + //$this->stats_mrptoproduce['customers'] += $obj->nb_customers; + //$this->stats_mrptoproduce['nb'] += $obj->nb; + //$this->stats_mrptoproduce['rows'] += $obj->nb_rows; + $this->stats_mrptoproduce['qty'] -= ($obj->qty ? $obj->qty : 0); + } + } + + // Clean data + if ($this->stats_mrptoconsume['qty'] < 0) $this->stats_mrptoconsume['qty'] = 0; + if ($this->stats_mrptoproduce['qty'] < 0) $this->stats_mrptoproduce['qty'] = 0; + + return 1; + } + else + { + $this->error = $this->db->error(); + return -1; + } + } + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps /** * Charge tableau des stats contrat pour le produit/service @@ -4717,8 +4807,9 @@ class Product extends CommonObject } if (!empty($conf->mrp->enabled)) { - // TODO - $stock_inproduction = 0; + $result = $this->load_stats_inproduction(0, '1,2', 1); + if ($result < 0) dol_print_error($this->db, $this->error); + $stock_inproduction = $this->stats_mrptoproduce['qty'] - $this->stats_mrptoconsume['qty']; } $this->stock_theorique = $this->stock_reel + $stock_inproduction; diff --git a/htdocs/product/stock/product.php b/htdocs/product/stock/product.php index 889084aa4be..5929a46edb8 100644 --- a/htdocs/product/stock/product.php +++ b/htdocs/product/stock/product.php @@ -689,6 +689,14 @@ if ($id > 0 || $ref) $helpondiff .= $langs->trans("ProductQtyInSuppliersShipmentAlreadyRecevied").': '.$object->stats_reception['qty']; } + // Number of product in production + if (!empty($conf->mrp->enabled)) { + if ($found) $helpondiff .= '
    '; else $found = 1; + $helpondiff .= $langs->trans("ProductQtyToConsumeByMO").': '.$object->stats_mrptoconsume['qty'].'
    '; + $helpondiff .= $langs->trans("ProductQtyToProduceByMO").': '.$object->stats_mrptoproduce['qty']; + } + + // Calculating a theorical value print '
    '; print $form->textwithpicto($langs->trans("VirtualStock"), $langs->trans("VirtualStockDesc")); From f63893a90cf4600b5436e17cf71def45e9bbd647 Mon Sep 17 00:00:00 2001 From: atm-greg Date: Fri, 24 Jan 2020 15:10:57 +0100 Subject: [PATCH 179/230] FIX date filter not used if no operator --- htdocs/contrat/services_list.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/htdocs/contrat/services_list.php b/htdocs/contrat/services_list.php index 07b5cceee1a..93c09d7f256 100644 --- a/htdocs/contrat/services_list.php +++ b/htdocs/contrat/services_list.php @@ -242,9 +242,17 @@ if ($search_contract) $sql.= " AND c.ref LIKE '%".$db->escape($search_contract). if ($search_service) $sql.= " AND (p.ref LIKE '%".$db->escape($search_service)."%' OR p.description LIKE '%".$db->escape($search_service)."%' OR cd.description LIKE '%".$db->escape($search_service)."%')"; if ($socid > 0) $sql.= " AND s.rowid = ".$socid; $filter_dateouvertureprevue=dol_mktime(0, 0, 0, $opouvertureprevuemonth, $opouvertureprevueday, $opouvertureprevueyear); +if ($filter_dateouvertureprevue != '' && $filter_opouvertureprevue == -1) $filter_opouvertureprevue = '='; + $filter_date1=dol_mktime(0, 0, 0, $op1month, $op1day, $op1year); +if ($filter_date1 != '' && $filter_op1 == -1) $filter_op1 = '='; + $filter_date2=dol_mktime(0, 0, 0, $op2month, $op2day, $op2year); +if ($filter_date2 != '' && $filter_op2 == -1) $filter_op2 = '='; + $filter_datecloture=dol_mktime(0, 0, 0, $opcloturemonth, $opclotureday, $opclotureyear); +if ($filter_datecloture != '' && $filter_opcloture == -1) $filter_opcloture = '='; + if (! empty($filter_opouvertureprevue) && $filter_opouvertureprevue != -1 && $filter_dateouvertureprevue != '') $sql.= " AND cd.date_ouverture_prevue ".$filter_opouvertureprevue." '".$db->idate($filter_dateouvertureprevue)."'"; if (! empty($filter_op1) && $filter_op1 != -1 && $filter_date1 != '') $sql.= " AND cd.date_ouverture ".$filter_op1." '".$db->idate($filter_date1)."'"; if (! empty($filter_op2) && $filter_op2 != -1 && $filter_date2 != '') $sql.= " AND cd.date_fin_validite ".$filter_op2." '".$db->idate($filter_date2)."'"; @@ -253,6 +261,8 @@ if (! empty($filter_opcloture) && $filter_opcloture != -1 && $filter_datecloture include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php'; $sql .= $db->order($sortfield, $sortorder); +//print $sql; + $nbtotalofrecords = ''; if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) { From 779cd94b0ec5598a84256fef5c2db094ea81d82b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 24 Jan 2020 15:26:18 +0100 Subject: [PATCH 180/230] Debug cashfence feature --- .../compta/cashcontrol/cashcontrol_card.php | 5 ++-- htdocs/compta/cashcontrol/report.php | 25 ++++++++++++++----- htdocs/core/class/html.formfile.class.php | 4 +-- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/htdocs/compta/cashcontrol/cashcontrol_card.php b/htdocs/compta/cashcontrol/cashcontrol_card.php index 0a7e2fa2d17..d98142a30b3 100644 --- a/htdocs/compta/cashcontrol/cashcontrol_card.php +++ b/htdocs/compta/cashcontrol/cashcontrol_card.php @@ -551,7 +551,9 @@ if (empty($action) || $action == "view") print '
    '; print $langs->trans("Period"); print ''; - print $object->year_close."-".$object->month_close."-".$object->day_close; + print $object->year_close; + print ($object->month_close ? "-" : "").$object->month_close; + print ($object->day_close ? "-" : "").$object->day_close; print '
    '; @@ -570,7 +572,6 @@ if (empty($action) || $action == "view") print '
    '.$langs->trans("InitialBankBalance").' - '.$langs->trans("Cash").''; print price($object->opening, 0, $langs, 1, -1, -1, $conf->currency); print "
    '.$langs->trans($val).''; diff --git a/htdocs/compta/cashcontrol/report.php b/htdocs/compta/cashcontrol/report.php index 2a2477fce5e..26023d47701 100644 --- a/htdocs/compta/cashcontrol/report.php +++ b/htdocs/compta/cashcontrol/report.php @@ -33,11 +33,11 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/compta/cashcontrol/class/cashcontrol.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/cashcontrol/class/cashcontrol.class.php'; $id = GETPOST('id', 'int'); $_GET['optioncss']="print"; -include_once 'class/cashcontrol.class.php'; $cashcontrol= new CashControl($db); $cashcontrol->fetch($id); @@ -243,12 +243,25 @@ if ($resql) print "
    "; - $cash=$cash+$cashcontrol->opening; + $cash = $cash + $cashcontrol->opening; print "

    "; - print $langs->trans("Cash").": ".price($cash)."

    "; - print $langs->trans("PaymentTypeCB").": ".price($bank)."

    "; - print $langs->trans("PaymentTypeCHQ").": ".price($cheque)."

    "; - if ($other) print $langs->trans("Other").": ".price($other)."

    "; + print $langs->trans("Cash").": ".price($cash); + if ($cash != $object->cash) { + print ' <> '.$langs->trans("Declared").': '.price($cashcontrol->cash).''; + } + print "

    "; + print '
    '; + print $langs->trans("PaymentTypeCHQ").": ".price($cheque); + if ($cash != $object->cheque) { + print ' <> '.$langs->trans("Declared").': '.price($cashcontrol->cheque).''; + } + print "

    "; + print '
    '; + print $langs->trans("PaymentTypeCB").": ".price($bank); + print "

    "; + if ($other) { + print '
    '.$langs->trans("Other").": ".price($other)."

    "; + } print "

    "; //save totals to DB diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index c78fe06693b..a3d73b627b7 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -1712,8 +1712,8 @@ class FormFile if (count($filearray) == 0) { print '
    '; - if (empty($textifempty)) print $langs->trans("NoFileFound"); - else print $textifempty; + if (empty($textifempty)) print ''.$langs->trans("NoFileFound").''; + else print ''.$textifempty.''; print '
    "; From 4222639702d0bab73fd1a0f2576caa2a06af7a89 Mon Sep 17 00:00:00 2001 From: gauthier Date: Fri, 24 Jan 2020 15:32:59 +0100 Subject: [PATCH 181/230] FIX : Extrafield position in export field list must respect "pos" field --- htdocs/core/extrafieldsinexport.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/extrafieldsinexport.inc.php b/htdocs/core/extrafieldsinexport.inc.php index 78dbba9934e..e9d10138d1e 100644 --- a/htdocs/core/extrafieldsinexport.inc.php +++ b/htdocs/core/extrafieldsinexport.inc.php @@ -8,7 +8,7 @@ if (empty($keyforselect) || empty($keyforelement) || empty($keyforaliasextra)) } // Add extra fields -$sql="SELECT name, label, type, param, fieldcomputed, fielddefault FROM ".MAIN_DB_PREFIX."extrafields WHERE elementtype = '".$keyforselect."' AND type != 'separate' AND entity IN (0, ".$conf->entity.')'; +$sql="SELECT name, label, type, param, fieldcomputed, fielddefault FROM ".MAIN_DB_PREFIX."extrafields WHERE elementtype = '".$keyforselect."' AND type != 'separate' AND entity IN (0, ".$conf->entity.') ORDER BY pos ASC'; //print $sql; $resql=$this->db->query($sql); if ($resql) // This can fail when class is used on old database (during migration for example) From 923e315daef17669d0f388a29f7290c6e8d5f642 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 24 Jan 2020 15:59:36 +0100 Subject: [PATCH 182/230] Debug cashfence feature --- htdocs/compta/cashcontrol/report.php | 75 +++++++++++++++++++--------- 1 file changed, 52 insertions(+), 23 deletions(-) diff --git a/htdocs/compta/cashcontrol/report.php b/htdocs/compta/cashcontrol/report.php index 26023d47701..e8aea86681c 100644 --- a/htdocs/compta/cashcontrol/report.php +++ b/htdocs/compta/cashcontrol/report.php @@ -35,6 +35,8 @@ require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/cashcontrol/class/cashcontrol.class.php'; +$langs->load("bills"); + $id = GETPOST('id', 'int'); $_GET['optioncss']="print"; @@ -50,7 +52,8 @@ $arrayfields=array( 'b.dateo'=>array('label'=>$langs->trans("DateOperationShort"), 'checked'=>1), 'b.num_chq'=>array('label'=>$langs->trans("Number"), 'checked'=>1), 'ba.ref'=>array('label'=>$langs->trans("BankAccount"), 'checked'=>1), - 'b.debit'=>array('label'=>$langs->trans("Debit"), 'checked'=>1, 'position'=>600), + 'cp.code'=>array('label'=>$langs->trans("PaymentMode"), 'checked'=>1), + 'b.debit'=>array('label'=>$langs->trans("Debit"), 'checked'=>1, 'position'=>600), 'b.credit'=>array('label'=>$langs->trans("Credit"), 'checked'=>1, 'position'=>605), ); @@ -128,7 +131,6 @@ if ($resql) $invoicetmp = new Facture($db); - print "

    "; print $langs->trans("InitialBankBalance").' - '.$langs->trans("Cash")." : ".price($cashcontrol->opening); print "

    "; @@ -136,13 +138,16 @@ if ($resql) print '
    '; print ''."\n"; + $param = ''; + // Fields title print ''; print_liste_field_titre($arrayfields['b.rowid']['label'], $_SERVER['PHP_SELF'], 'b.rowid', '', $param, '', $sortfield, $sortorder); - print_liste_field_titre($arrayfields['b.dateo']['label'], $_SERVER['PHP_SELF'], 'b.dateo', '', $param, 'class="left"', $sortfield, $sortorder); - print_liste_field_titre($arrayfields['ba.ref']['label'], $_SERVER['PHP_SELF'], 'ba.ref', '', $param, 'class="right"', $sortfield, $sortorder); - print_liste_field_titre($arrayfields['b.debit']['label'], $_SERVER['PHP_SELF'], 'b.amount', '', $param, 'class="right"', $sortfield, $sortorder); - print_liste_field_titre($arrayfields['b.credit']['label'], $_SERVER['PHP_SELF'], 'b.amount', '', $param, 'class="right"', $sortfield, $sortorder); + print_liste_field_titre($arrayfields['b.dateo']['label'], $_SERVER['PHP_SELF'], 'b.dateo', '', $param, '"', $sortfield, $sortorder, 'center '); + print_liste_field_titre($arrayfields['ba.ref']['label'], $_SERVER['PHP_SELF'], 'ba.ref', '', $param, '', $sortfield, $sortorder, 'right '); + print_liste_field_titre($arrayfields['cp.code']['label'], $_SERVER['PHP_SELF'], 'cp.code', '', $param, '', $sortfield, $sortorder, 'right '); + print_liste_field_titre($arrayfields['b.debit']['label'], $_SERVER['PHP_SELF'], 'b.amount', '', $param, '', $sortfield, $sortorder, 'right '); + print_liste_field_titre($arrayfields['b.credit']['label'], $_SERVER['PHP_SELF'], 'b.amount', '', $param, '', $sortfield, $sortorder, 'right '); print "\n"; $posconciliatecol = 0; @@ -151,7 +156,9 @@ if ($resql) $sign = 1; $cash=$bank=$cheque=$other=0; - $totalarray=array(); + $totalarray = array(); + $cachebankaccount = array(); + $amountpertype = array(); while ($i < $num) { $objp = $db->fetch_object($resql); @@ -168,7 +175,9 @@ if ($resql) $bankaccount = $cachebankaccount[$objp->bankid]; } - /*if ($first == "yes") + $invoicetmp->fetch($objp->facid); + + /*if ($first == "yes") { print ''; print ''; @@ -181,12 +190,10 @@ if ($resql) // Ref print ''; if (! $i) $totalarray['nbfield']++; - // Date ope print '\n"; if (! $i) $totalarray['nbfield']++; - // Debit + // Type + print '\n"; + if (! $i) $totalarray['nbfield']++; + + // Debit print '\n"; if (! $i) $totalarray['nbfield']++; @@ -228,6 +247,7 @@ if ($resql) { print price($objp->amount); $totalarray['val']['totalcredfield'] += $objp->amount; + $amountpertype[$objp->code] -= $objp->amount; } print "\n"; if (! $i) $totalarray['nbfield']++; @@ -243,22 +263,31 @@ if ($resql) print "
    '.$langs->trans("InitialBankBalance").' - '.$langs->trans("Cash").''; - $invoicetmp->fetch($objp->facid); print $invoicetmp->getNomUrl(1); print ''; print ''.dol_print_date($db->jdate($objp->do), "day").""; @@ -197,26 +204,38 @@ if ($resql) print ''; print $bankaccount->getNomUrl(1); if ($cashcontrol->posmodule=="takepos"){ - if ($conf->global->{'CASHDESK_ID_BANKACCOUNT_CASH'.$cashcontrol->posnumber}==$bankaccount->id) $cash+=$objp->amount; - elseif ($conf->global->{'CASHDESK_ID_BANKACCOUNT_CB'.$cashcontrol->posnumber}==$bankaccount->id) $bank+=$objp->amount; - elseif ($conf->global->{'CASHDESK_ID_BANKACCOUNT_CHEQUE'.$cashcontrol->posnumber}==$bankaccount->id) $cheque+=$objp->amount; - else $other+=$objp->amount; + $var1 = 'CASHDESK_ID_BANKACCOUNT_CASH'.$cashcontrol->posnumber; } else{ - if ($conf->global->CASHDESK_ID_BANKACCOUNT_CASH==$bankaccount->id) $cash+=$objp->amount; - elseif ($conf->global->CASHDESK_ID_BANKACCOUNT_CB==$bankaccount->id) $bank+=$objp->amount; - elseif ($conf->global->CASHDESK_ID_BANKACCOUNT_CHEQUE==$bankaccount->id) $cheque+=$objp->amount; - else $other+=$objp->amount; + $var1 = 'CASHDESK_ID_BANKACCOUNT_CASH'; + } + if ($objp->code == 'CHQ') { + $cheque += $objp->amount; + } elseif ($objp->code == 'CB') { + $bank += $objp->amount; + } else { + if ($conf->global->$var1 == $bankaccount->id) $cash += $objp->amount; + //elseif ($conf->global->$var2 == $bankaccount->id) $bank+=$objp->amount; + //elseif ($conf->global->$var3 == $bankaccount->id) $cheque+=$objp->amount; + else $other += $objp->amount; } print "'; + print $objp->code; + if (empty($amountpertype[$objp->code])) $amountpertype[$objp->code] = 0; + print "'; if ($objp->amount < 0) { print price($objp->amount * -1); $totalarray['val']['totaldebfield'] += $objp->amount; + $amountpertype[$objp->code] += $objp->amount; } print "
    "; + //$cash = $amountpertype['LIQ'] + $cashcontrol->opening; $cash = $cash + $cashcontrol->opening; + print "

    "; print $langs->trans("Cash").": ".price($cash); - if ($cash != $object->cash) { + if ($cash != $cashcontrol->cash) { print ' <> '.$langs->trans("Declared").': '.price($cashcontrol->cash).''; } print "

    "; - print '
    '; + + //print '
    '; print $langs->trans("PaymentTypeCHQ").": ".price($cheque); - if ($cash != $object->cheque) { + if ($cheque != $cashcontrol->cheque) { print ' <> '.$langs->trans("Declared").': '.price($cashcontrol->cheque).''; } print "

    "; - print '
    '; + + //print '
    '; print $langs->trans("PaymentTypeCB").": ".price($bank); + if ($bank != $cashcontrol->card) { + print ' <> '.$langs->trans("Declared").': '.price($cashcontrol->card).''; + } print "

    "; + + // print '
    '; if ($other) { print '
    '.$langs->trans("Other").": ".price($other)."

    "; } From 209ebfbe2f7ecefac26288434d5a875fe3f23ae1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 24 Jan 2020 16:14:52 +0100 Subject: [PATCH 183/230] Fix trans --- htdocs/compta/cashcontrol/cashcontrol_card.php | 2 +- htdocs/compta/cashcontrol/class/cashcontrol.class.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/cashcontrol/cashcontrol_card.php b/htdocs/compta/cashcontrol/cashcontrol_card.php index d98142a30b3..7958d107ec8 100644 --- a/htdocs/compta/cashcontrol/cashcontrol_card.php +++ b/htdocs/compta/cashcontrol/cashcontrol_card.php @@ -544,7 +544,7 @@ if (empty($action) || $action == "view") print $object->posmodule; print "

    '.$langs->trans("CashDesk").' ID'; + print '
    '.$langs->trans("Terminal").''; print $object->posnumber; print "
    '."\n"; // Show logo (search order: logo defined by PAYMENT_LOGO_suffix, then PAYMENT_LOGO, then small company logo, large company logo, theme logo, common logo) $width = 0; @@ -803,13 +784,43 @@ elseif (!empty($logo) && is_readable($conf->mycompany->dir_output.'/logos/'.$log // Output html code for logo if ($urllogo) { - print ''; - print ''; - print ''."\n"; + print '>'; + print ''; + if (empty($conf->global->MAIN_HIDE_POWERED_BY)) { + print ''; + } + print ''; } + + + +print ''."\n"; +print ''."\n"; +// Additionnal information for each payment system +if (!empty($conf->paypal->enabled)) +{ + print ''."\n"; + print ''."\n"; +} +if (!empty($conf->paybox->enabled)) +{ + print ''."\n"; +} +if (!empty($conf->stripe->enabled)) +{ + print ''."\n"; +} +print ''."\n"; +print ''."\n"; +print "\n"; + +print '
    '; + print '
    '; + print '
    '."\n"; + // Output introduction text $text = ''; if (!empty($conf->global->PAYMENT_NEWFORM_TEXT)) diff --git a/htdocs/theme/common/dolibarr_logo_bw.png b/htdocs/theme/common/dolibarr_logo_bw.png deleted file mode 100644 index 238a1899c00d9e74878a57a3efa53a1209315a24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 791 zcmV+y1L*vTP)b2wb(kXB6erg z0EW2v#`*AKfyxMB!>sWElRY2!&P1(_ShX0i=TrrZB__8IgVVfcykYkIZN{{O-6Gau zw;i_`+kLoW9P+Fy>~>6>`Y>nB6$V{}{eH}~%~uUGru(T{sH25NM-0L3#qJgx{{)s# zcVYhwPNS&7Do+Wg@RVO_oGw+Wj4Y^(Xv2X@d3Nb&#Z1PvR~2StP9|q0Mnw{A)BWY* zTkO(}<<=$)RRvZg;o=N#v6o3rOS51Kj3nW5kP4H`x)@3gHj?lL+q|)PD3%yktbv9Tv7zEo1%i*ZXb2=_-*n9w+gkcS{=xXlZ@kzK;9(s5 zk=uLfb9(~}FFgE`<8kK?U%nLhrNnRCKb816j+f92jRy`h{$Ao=;q%LcFA0B+?+p{? z$(=%P2$PJx8HfH+Mi%&#mvpM|*9u?bPq2*qG~;7l(lOzmOZXChgNHP-z%ianf!FXg z{pKIj$O6M_nsu0Wi#cQcI6Z{Dj=!tN3hoc1JXQ?vO`dNb)7!rq`GH1x_}~6v`wK+| Vh4s`po4Wu2002ovPDHLkV1gedW?BFM diff --git a/htdocs/theme/common/dolibarr_logo_256x256.png b/htdocs/theme/dolibarr_logo_256x256.png similarity index 100% rename from htdocs/theme/common/dolibarr_logo_256x256.png rename to htdocs/theme/dolibarr_logo_256x256.png diff --git a/htdocs/theme/dolibarr_logo_bw.png b/htdocs/theme/dolibarr_logo_bw.png new file mode 100644 index 0000000000000000000000000000000000000000..50b1608847c3d5d0001b4e9334610b49ef41cf16 GIT binary patch literal 646 zcmV;10(t$3P)o7!U;rhDLhx0005`Nkl@nynh(h+!fv(uMfkQcQwoLgw5{jP0earlD{#-F2^CTUNIEzFyyM(LpiB|Rn0RW{Kzea zTopSg*Py|Wt6~e~5&?!>6;DvEAYBf=f)yJm7Z^BKTQQFdjd42g_R+~MEHKP?ImfBU gGlRx{;eYu20@~ literal 0 HcmV?d00001 diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 4b731808d2e..fb63a6d5a3b 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -3663,6 +3663,17 @@ table.table-fiche-title { margin-bottom: 5px; } + +div.backgreypublicpayment { background-color: #f0f0f0; padding: 20px; border-bottom: 1px solid #ddd; } +.backgreypublicpayment a { color: #222 !important; } +.poweredbypublicpayment { + float: right; + top: 20px; + right: 20px; + position: absolute; + font-size: 0.8em; + color: #222; +} #dolpaymenttable { min-width: 320px; font-size: 16px; } /* Width must have min to make stripe input area visible. Lower than 320 makes input area crazy for credit card that need zip code */ #tablepublicpayment { border: 1px solid #CCCCCC !important; width: 100%; padding: 20px; } #tablepublicpayment .CTableRow1 { background-color: #F0F0F0 !important; } diff --git a/htdocs/theme/eldy/manifest.json.php b/htdocs/theme/eldy/manifest.json.php index 889b406ab3f..545f39b7896 100644 --- a/htdocs/theme/eldy/manifest.json.php +++ b/htdocs/theme/eldy/manifest.json.php @@ -46,7 +46,7 @@ if (!empty($conf->global->MAIN_APPLICATION_TITLE)) $appli=$conf->global->MAIN_AP "name": "", "icons": [ { - "src": "", + "src": "", "sizes": "256x256", "type": "image/png" } From 5d7fa5575996e387c028377d6ee96e677c1180c1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 24 Jan 2020 17:48:24 +0100 Subject: [PATCH 185/230] css --- htdocs/public/payment/newpayment.php | 2 +- htdocs/theme/eldy/global.inc.php | 5 +++-- htdocs/theme/eldy/theme_vars.inc.php | 2 +- htdocs/theme/md/style.css.php | 14 ++++++++++++++ 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/htdocs/public/payment/newpayment.php b/htdocs/public/payment/newpayment.php index 80ed910ac70..2e160139dec 100644 --- a/htdocs/public/payment/newpayment.php +++ b/htdocs/public/payment/newpayment.php @@ -791,7 +791,7 @@ if ($urllogo) print '>'; print ''; if (empty($conf->global->MAIN_HIDE_POWERED_BY)) { - print ''; + print ''; } print ''; } diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index fb63a6d5a3b..e2414e8ad85 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -3668,11 +3668,12 @@ div.backgreypublicpayment { background-color: #f0f0f0; padding: 20px; border-bot .backgreypublicpayment a { color: #222 !important; } .poweredbypublicpayment { float: right; - top: 20px; - right: 20px; + top: 8px; + right: 8px; position: absolute; font-size: 0.8em; color: #222; + opacity: 0.3; } #dolpaymenttable { min-width: 320px; font-size: 16px; } /* Width must have min to make stripe input area visible. Lower than 320 makes input area crazy for credit card that need zip code */ #tablepublicpayment { border: 1px solid #CCCCCC !important; width: 100%; padding: 20px; } diff --git a/htdocs/theme/eldy/theme_vars.inc.php b/htdocs/theme/eldy/theme_vars.inc.php index 2f8b7ac08e4..ccaac4471a9 100644 --- a/htdocs/theme/eldy/theme_vars.inc.php +++ b/htdocs/theme/eldy/theme_vars.inc.php @@ -53,7 +53,7 @@ $theme_bgcolor = array(hexdec('F4'), hexdec('F4'), hexdec('F4')); $theme_bgcoloronglet = array(hexdec('DE'), hexdec('E7'), hexdec('EC')); // Colors -$colorbackhmenu1 = '60,70,100'; // topmenu +$colorbackhmenu1 = '68,68,90'; // topmenu $colorbackvmenu1 = '250,250,250'; // vmenu $colortopbordertitle1 = '200,200,200'; // top border of title $colorbacktitle1 = '233,234,237'; // title of tables,list diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 98a6af8259f..b20982ccb67 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -3780,6 +3780,20 @@ table.table-fiche-title .col-title div.titre{ line-height: 40px; } +div.backgreypublicpayment { background-color: #f0f0f0; padding: 20px; border-bottom: 1px solid #ddd; } +.backgreypublicpayment a { color: #222 !important; } +.poweredbypublicpayment { + float: right; + top: 8px; + right: 8px; + position: absolute; + font-size: 0.8em; + color: #222; + opacity: 0.3; +} +span.buttonpaymentsmall { + text-shadow: none; +} #dolpaymenttable { min-width: 320px; font-size: 16px; } /* Width must have min to make stripe input area visible. Lower than 320 makes input area crazy for credit card that need zip code */ #tablepublicpayment { border: 1px solid #CCCCCC !important; width: 100%; padding: 20px; } #tablepublicpayment .CTableRow1 { background-color: #F0F0F0 !important; } From 3a7c0b63f198de4ffe223c5db80e4aa4ae4f5dd6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 24 Jan 2020 17:56:41 +0100 Subject: [PATCH 186/230] css --- htdocs/theme/eldy/dropdown.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/theme/eldy/dropdown.inc.php b/htdocs/theme/eldy/dropdown.inc.php index 1258418b3ff..fb8856d4687 100644 --- a/htdocs/theme/eldy/dropdown.inc.php +++ b/htdocs/theme/eldy/dropdown.inc.php @@ -100,7 +100,7 @@ if (! defined('ISLOADEDBYSTEELSHEET')) die('Must be call by steelsheet'); ?> } .side-nav-vert .user-menu .dropdown-menu > .user-header { - min-height: 175px; + min-height: 100px; padding: 10px; text-align: center; white-space: normal; From d5f2a793c0ad6ad41f87990ed64bd4ac5da057ca Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 24 Jan 2020 19:36:17 +0100 Subject: [PATCH 187/230] CSS --- htdocs/theme/eldy/info-box.inc.php | 2 +- htdocs/theme/md/info-box.inc.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/theme/eldy/info-box.inc.php b/htdocs/theme/eldy/info-box.inc.php index 2ceaa70911a..268f1885327 100644 --- a/htdocs/theme/eldy/info-box.inc.php +++ b/htdocs/theme/eldy/info-box.inc.php @@ -153,7 +153,7 @@ a.info-box-text{ text-decoration: none;} include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; $prefix=''; -$prefix = 'background-'; +//$prefix = 'background-'; if (! empty($conf->global->THEME_INFOBOX_COLOR_ON_BACKGROUND)) $prefix = 'background-'; if (! isset($conf->global->THEME_AGRESSIVENESS_RATIO) && $prefix) $conf->global->THEME_AGRESSIVENESS_RATIO=-50; diff --git a/htdocs/theme/md/info-box.inc.php b/htdocs/theme/md/info-box.inc.php index 8effe7d62d6..fb011e63e69 100644 --- a/htdocs/theme/md/info-box.inc.php +++ b/htdocs/theme/md/info-box.inc.php @@ -98,7 +98,7 @@ a.info-box-text{ text-decoration: none;} -/* ICONS */ +/* ICONS INFO BOX */ .info-box-icon { color: #000 !important; } From 8f3f34e1c0e4eaaa4a3c77f30c0d69297b9eed6b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 24 Jan 2020 20:11:07 +0100 Subject: [PATCH 188/230] Fix css --- htdocs/core/lib/functions.lib.php | 2 +- htdocs/theme/eldy/global.inc.php | 3 +++ htdocs/theme/md/style.css.php | 5 +++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index c5e4dfb0d6d..2e86e88460d 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -1140,7 +1140,7 @@ function dol_get_fiche_head($links = array(), $active = '', $title = '', $notab { $limittitle = 30; $out .= ''; - if ($picto) $out .= img_picto($title, ($pictoisfullpath ? '' : 'object_').$picto, '', $pictoisfullpath).' '; + if ($picto) $out .= img_picto($title, ($pictoisfullpath ? '' : 'object_').$picto, '', $pictoisfullpath, 0, 0, '', 'imgTabTitle').' '; $out .= ''.dol_trunc($title, $limittitle).''; $out .= ''; } diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index e2414e8ad85..bc00125301e 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -2462,6 +2462,9 @@ a.tabTitle { text-decoration: none; white-space: nowrap; } +.imgTabTitle { + max-height: 14px; +} a.tabunactive { color: rgb() !important; diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index b20982ccb67..0806cb47d1e 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -2637,8 +2637,6 @@ div.popuptab { } a.tabTitle { -/* background: #657090; - color: white;*/ color:rgba(0,0,0,.5); margin-: 10px; text-shadow:1px 1px 1px #ffffff; @@ -2649,6 +2647,9 @@ a.tabTitle { text-decoration: none; white-space: nowrap; } +.imgTabTitle { + max-height: 14px; +} a.tab:link, a.tab:visited, a.tab:hover, a.tab#active { font-family: ; From c494e3029be3d0509fd55d96090a76fec2486a90 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 24 Jan 2020 20:14:01 +0100 Subject: [PATCH 189/230] Trans --- htdocs/langs/en_US/main.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index bfc702426a2..43331220bd0 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -1014,3 +1014,4 @@ ContactDefault_ticketsup=Ticket ContactAddedAutomatically=Contact added from contact thirdparty roles More=More ShowDetails=Show details +CustomReports=Custom reports \ No newline at end of file From cc6b9269f9bb5f8f8b2aea44e8e61a09f31fbcd4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 25 Jan 2020 11:50:16 +0100 Subject: [PATCH 190/230] Fix look and feel v11 --- htdocs/cron/class/cronjob.class.php | 14 ++++++++++---- htdocs/cron/list.php | 3 ++- htdocs/theme/eldy/global.inc.php | 2 +- htdocs/theme/eldy/theme_vars.inc.php | 2 +- htdocs/theme/md/theme_vars.inc.php | 2 +- 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/htdocs/cron/class/cronjob.class.php b/htdocs/cron/class/cronjob.class.php index b70707f1464..5cde792bbb5 100644 --- a/htdocs/cron/class/cronjob.class.php +++ b/htdocs/cron/class/cronjob.class.php @@ -1287,12 +1287,12 @@ class Cronjob extends CommonObject /** * Return label of status of user (active, inactive) * - * @param int $mode 0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long, 5=Libelle court + Picto + * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto, 6=Long label + Picto * @return string Label of status */ public function getLibStatut($mode = 0) { - return $this->LibStatut($this->status, $mode, $this->processing); + return $this->LibStatut($this->status, $mode, $this->processing, $this->lastresult); } // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps @@ -1300,13 +1300,17 @@ class Cronjob extends CommonObject * Renvoi le libelle d'un statut donne * * @param int $status Id statut - * @param int $mode 0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long, 5=Libelle court + Picto + * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto, 6=Long label + Picto * @param int $processing 0=Not running, 1=Running + * @param int $lastresult Value of last result (0=no error, error otherwise) * @return string Label of status */ - public function LibStatut($status, $mode = 0, $processing = 0) + public function LibStatut($status, $mode = 0, $processing = 0, $lastresult = 0) { // phpcs:enable + $this->labelStatus = array(); // Force reset o array because label depends on other fields + $this->labelStatusShort = array(); + if (empty($this->labelStatus) || empty($this->labelStatusShort)) { global $langs; @@ -1314,6 +1318,7 @@ class Cronjob extends CommonObject $moretext = ''; if ($processing) $moretext = ' ('.$langs->trans("Running").')'; + elseif ($lastresult) $moretext .= ' ('.$langs->trans("Error").')'; $this->labelStatus[self::STATUS_DISABLED] = $langs->trans('Draft').$moretext; $this->labelStatus[self::STATUS_ENABLED] = $langs->trans('Enabled').$moretext; @@ -1324,6 +1329,7 @@ class Cronjob extends CommonObject $statusType = 'status4'; if ($status == 1 && $processing) $statusType = 'status1'; if ($status == 0) $statusType = 'status5'; + if ($this->lastresult) $statusType = 'status8'; return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statusType, $mode); } diff --git a/htdocs/cron/list.php b/htdocs/cron/list.php index dd70d6d6913..ac9f178b163 100644 --- a/htdocs/cron/list.php +++ b/htdocs/cron/list.php @@ -425,6 +425,7 @@ if ($num > 0) $object->status = $obj->status; $object->priority = $obj->priority; $object->processing = $obj->processing; + $object->lastresult = $obj->lastresult; $datelastrun = $db->jdate($obj->datelastrun); $datelastresult = $db->jdate($obj->datelastresult); @@ -541,7 +542,7 @@ if ($num > 0) // Status print ''; print ''; // Year -print ' - - + + Date: Sun, 26 Jan 2020 22:12:52 +0100 Subject: [PATCH 206/230] Update receipt.php --- htdocs/takepos/receipt.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/takepos/receipt.php b/htdocs/takepos/receipt.php index 8489f97c5db..1ae64888095 100644 --- a/htdocs/takepos/receipt.php +++ b/htdocs/takepos/receipt.php @@ -138,7 +138,7 @@ if ($conf->global->TAKEPOS_CUSTOM_RECEIPT && $conf->global->TAKEPOS_SHOW_CUSTOME else echo $line->description;?> - + Date: Fri, 24 Jan 2020 09:22:46 +0100 Subject: [PATCH 207/230] TakePOS price rounding --- htdocs/takepos/receipt.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/takepos/receipt.php b/htdocs/takepos/receipt.php index 462f9a830b0..185302e3a16 100644 --- a/htdocs/takepos/receipt.php +++ b/htdocs/takepos/receipt.php @@ -138,7 +138,7 @@ if ($conf->global->TAKEPOS_CUSTOM_RECEIPT && $conf->global->TAKEPOS_SHOW_CUSTOME else echo $line->description;?> - + Date: Sun, 26 Jan 2020 22:12:26 +0100 Subject: [PATCH 208/230] Update receipt.php --- htdocs/takepos/receipt.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/takepos/receipt.php b/htdocs/takepos/receipt.php index 185302e3a16..8489f97c5db 100644 --- a/htdocs/takepos/receipt.php +++ b/htdocs/takepos/receipt.php @@ -138,8 +138,8 @@ if ($conf->global->TAKEPOS_CUSTOM_RECEIPT && $conf->global->TAKEPOS_SHOW_CUSTOME else echo $line->description;?> - - + + Date: Sun, 26 Jan 2020 22:12:52 +0100 Subject: [PATCH 209/230] Update receipt.php --- htdocs/takepos/receipt.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/takepos/receipt.php b/htdocs/takepos/receipt.php index 8489f97c5db..1ae64888095 100644 --- a/htdocs/takepos/receipt.php +++ b/htdocs/takepos/receipt.php @@ -138,7 +138,7 @@ if ($conf->global->TAKEPOS_CUSTOM_RECEIPT && $conf->global->TAKEPOS_SHOW_CUSTOME else echo $line->description;?> - + Date: Sun, 26 Jan 2020 22:32:37 +0100 Subject: [PATCH 210/230] Update massactions_pre.tpl.php --- htdocs/core/tpl/massactions_pre.tpl.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/htdocs/core/tpl/massactions_pre.tpl.php b/htdocs/core/tpl/massactions_pre.tpl.php index 6949c76680f..fcff59cb21a 100644 --- a/htdocs/core/tpl/massactions_pre.tpl.php +++ b/htdocs/core/tpl/massactions_pre.tpl.php @@ -167,8 +167,10 @@ if ($massaction == 'presend') dol_fiche_end(); } // Allow Pre-Mass-Action hook (eg for confirmation dialog) -$parameters['toselect']=$toselect; -$parameters['uploaddir']=$uploaddir; +$parameters = array( + 'toselect' => $toselect, + 'uploaddir' => $uploaddir +); $reshook=$hookmanager->executeHooks('doPreMassActions', $parameters, $object, $action); if ($reshook < 0) { From d13e5bc90b2f6543024b9d410ef58b826daddc8b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 26 Jan 2020 23:22:47 +0100 Subject: [PATCH 211/230] FIX #12875 --- htdocs/core/tpl/objectline_create.tpl.php | 69 ++++++++++++----------- htdocs/fourn/ajax/getSupplierPrices.php | 9 +-- 2 files changed, 40 insertions(+), 38 deletions(-) diff --git a/htdocs/core/tpl/objectline_create.tpl.php b/htdocs/core/tpl/objectline_create.tpl.php index 9056f3bde9d..b60c48da09c 100644 --- a/htdocs/core/tpl/objectline_create.tpl.php +++ b/htdocs/core/tpl/objectline_create.tpl.php @@ -670,46 +670,47 @@ if (!empty($usemargins) && $user->rights->margins->creer) var i = 0; $(data).each(function() { - if (this.id != 'pmpprice' && this.id != 'costprice') - { - i++; - this.price = parseFloat(this.price); // to fix when this.price >0 - // If margin is calculated on best supplier price, we set it by defaut (but only if value is not 0) - //console.log("id="+this.id+"-price="+this.price+"-"+(this.price > 0)); - if (bestpricefound == 0 && this.price > 0) { defaultkey = this.id; defaultprice = this.price; bestpriceid = this.id; bestpricevalue = this.price; bestpricefound=1; } // bestpricefound is used to take the first price > 0 - } - if (this.id == 'pmpprice') - { - // If margin is calculated on PMP, we set it by defaut (but only if value is not 0) - //console.log("id="+this.id+"-price="+this.price); - if ('pmp' == defaultbuyprice || 'costprice' == defaultbuyprice) - { - if (this.price > 0) { - defaultkey = this.id; defaultprice = this.price; pmppriceid = this.id; pmppricevalue = this.price; - //console.log("pmppricevalue="+pmppricevalue); - } - } - } - if (this.id == 'costprice') - { - // If margin is calculated on Cost price, we set it by defaut (but only if value is not 0) - //console.log("id="+this.id+"-price="+this.price+"-pmppricevalue="+pmppricevalue); - if ('costprice' == defaultbuyprice) - { - if (this.price > 0) { defaultkey = this.id; defaultprice = this.price; costpriceid = this.id; costpricevalue = this.price; } - else if (pmppricevalue > 0) { defaultkey = pmppriceid; defaultprice = pmppricevalue; } - } - } - options += ''; - }); - options += ''; + /* Warning: Lines must be processed in order: best supplier price, then pmpprice line then costprice */ + if (this.id != 'pmpprice' && this.id != 'costprice') + { + i++; + this.price = parseFloat(this.price); // to fix when this.price >0 + // If margin is calculated on best supplier price, we set it by defaut (but only if value is not 0) + //console.log("id="+this.id+"-price="+this.price+"-"+(this.price > 0)); + if (bestpricefound == 0 && this.price > 0) { defaultkey = this.id; defaultprice = this.price; bestpriceid = this.id; bestpricevalue = this.price; bestpricefound=1; } // bestpricefound is used to take the first price > 0 + } + if (this.id == 'pmpprice') + { + // If margin is calculated on PMP, we set it by defaut (but only if value is not 0) + console.log("id="+this.id+"-price="+this.price); + if ('pmp' == defaultbuyprice || 'costprice' == defaultbuyprice) + { + if (this.price > 0) { + defaultkey = this.id; defaultprice = this.price; pmppriceid = this.id; pmppricevalue = this.price; + //console.log("pmppricevalue="+pmppricevalue); + } + } + } + if (this.id == 'costprice') + { + // If margin is calculated on Cost price, we set it by defaut (but only if value is not 0) + console.log("id="+this.id+"-price="+this.price+"-pmppricevalue="+pmppricevalue); + if ('costprice' == defaultbuyprice) + { + if (this.price > 0) { defaultkey = this.id; defaultprice = this.price; costpriceid = this.id; costpricevalue = this.price; } + else if (pmppricevalue > 0) { defaultkey = 'pmpprice'; defaultprice = pmppricevalue; } + } + } + options += ''; + }); + options += ''; console.log("finally selected defaultkey="+defaultkey+" defaultprice="+defaultprice); $("#fournprice_predef").html(options).show(); if (defaultkey != '') { - $("#fournprice_predef").val(defaultkey); + $("#fournprice_predef").val(defaultkey); } /* At loading, no product are yet selected, so we hide field of buying_price */ diff --git a/htdocs/fourn/ajax/getSupplierPrices.php b/htdocs/fourn/ajax/getSupplierPrices.php index 24c68a6aced..2d18c6ea86e 100644 --- a/htdocs/fourn/ajax/getSupplierPrices.php +++ b/htdocs/fourn/ajax/getSupplierPrices.php @@ -84,16 +84,17 @@ if ($idprod > 0) } } - // Add price for costprice - $price=$producttmp->cost_price; - $prices[] = array("id" => 'costprice', "price" => price2num($price), "label" => $langs->trans("CostPrice").': '.price($price, 0, $langs, 0, 0, -1, $conf->currency), "title" => $langs->trans("PMPValueShort").': '.price($price, 0, $langs, 0, 0, -1, $conf->currency)); // For price field, we must use price2num(), for label or title, price() - + // After best supplier prices and before costprice if(!empty($conf->stock->enabled)) { // Add price for pmp $price=$producttmp->pmp; $prices[] = array("id" => 'pmpprice', "price" => price2num($price), "label" => $langs->trans("PMPValueShort").': '.price($price, 0, $langs, 0, 0, -1, $conf->currency), "title" => $langs->trans("PMPValueShort").': '.price($price, 0, $langs, 0, 0, -1, $conf->currency)); // For price field, we must use price2num(), for label or title, price() } + + // Add price for costprice (at end) + $price=$producttmp->cost_price; + $prices[] = array("id" => 'costprice', "price" => price2num($price), "label" => $langs->trans("CostPrice").': '.price($price, 0, $langs, 0, 0, -1, $conf->currency), "title" => $langs->trans("PMPValueShort").': '.price($price, 0, $langs, 0, 0, -1, $conf->currency)); // For price field, we must use price2num(), for label or title, price() } echo json_encode($prices); From ecaacc9543d023babf437bfdd4c0918f5dd8b6c4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 26 Jan 2020 23:27:47 +0100 Subject: [PATCH 212/230] FIX #12875 --- htdocs/fourn/ajax/getSupplierPrices.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/fourn/ajax/getSupplierPrices.php b/htdocs/fourn/ajax/getSupplierPrices.php index 85b0ed37155..495337ade14 100644 --- a/htdocs/fourn/ajax/getSupplierPrices.php +++ b/htdocs/fourn/ajax/getSupplierPrices.php @@ -84,16 +84,16 @@ if ($idprod > 0) } } - // Add price for costprice - $price=$producttmp->cost_price; - $prices[] = array("id" => 'costprice', "price" => price2num($price), "label" => $langs->trans("CostPrice").': '.price($price, 0, $langs, 0, 0, -1, $conf->currency), "title" => $langs->trans("PMPValueShort").': '.price($price, 0, $langs, 0, 0, -1, $conf->currency)); // For price field, we must use price2num(), for label or title, price() - if(!empty($conf->stock->enabled)) { // Add price for pmp $price=$producttmp->pmp; $prices[] = array("id" => 'pmpprice', "price" => price2num($price), "label" => $langs->trans("PMPValueShort").': '.price($price, 0, $langs, 0, 0, -1, $conf->currency), "title" => $langs->trans("PMPValueShort").': '.price($price, 0, $langs, 0, 0, -1, $conf->currency)); // For price field, we must use price2num(), for label or title, price() } + + // Add price for costprice + $price=$producttmp->cost_price; + $prices[] = array("id" => 'costprice', "price" => price2num($price), "label" => $langs->trans("CostPrice").': '.price($price, 0, $langs, 0, 0, -1, $conf->currency), "title" => $langs->trans("PMPValueShort").': '.price($price, 0, $langs, 0, 0, -1, $conf->currency)); // For price field, we must use price2num(), for label or title, price() } echo json_encode($prices); From fd50074b4276e5148130d86e700b2e8033e4072d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 26 Jan 2020 23:31:19 +0100 Subject: [PATCH 213/230] Update doleditor.class.php --- htdocs/core/class/doleditor.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/doleditor.class.php b/htdocs/core/class/doleditor.class.php index e524d174e03..f4909a02df0 100644 --- a/htdocs/core/class/doleditor.class.php +++ b/htdocs/core/class/doleditor.class.php @@ -226,7 +226,7 @@ class DolEditor }); } }, - disableNativeSpellChecker: false'; + disableNativeSpellChecker: '.(empty($conf->global->CKEDITOR_NATIVE_SPELLCHECKER)?'false':'true'); if ($this->uselocalbrowser) { From 4a5dca4a3d5eff31d929df919465c093a0b6c155 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 26 Jan 2020 23:48:40 +0100 Subject: [PATCH 214/230] Fix test --- htdocs/core/class/doleditor.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/doleditor.class.php b/htdocs/core/class/doleditor.class.php index f4909a02df0..32ac5d2365c 100644 --- a/htdocs/core/class/doleditor.class.php +++ b/htdocs/core/class/doleditor.class.php @@ -226,7 +226,7 @@ class DolEditor }); } }, - disableNativeSpellChecker: '.(empty($conf->global->CKEDITOR_NATIVE_SPELLCHECKER)?'false':'true'); + disableNativeSpellChecker: '.(empty($conf->global->CKEDITOR_NATIVE_SPELLCHECKER)?'true':'false'); if ($this->uselocalbrowser) { From 3ece94fb2ee04dbb989d189d1f7a0b010e686e40 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 27 Jan 2020 00:06:10 +0100 Subject: [PATCH 215/230] Fix class not found --- htdocs/projet/tasks.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/projet/tasks.php b/htdocs/projet/tasks.php index 5a33f8ca4f2..b125ed7306e 100644 --- a/htdocs/projet/tasks.php +++ b/htdocs/projet/tasks.php @@ -31,6 +31,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php'; +if ($conf->categorie->enabled) { require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; } // Load translation files required by the page $langs->loadLangs(array('projects', 'users', 'companies')); From 6744fc4279fe42867f537e6aae406af66c428392 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 27 Jan 2020 00:38:28 +0100 Subject: [PATCH 216/230] Fix takepos permissions --- htdocs/install/upgrade2.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/htdocs/install/upgrade2.php b/htdocs/install/upgrade2.php index 12d9ef9b734..dd9e3b1ed95 100644 --- a/htdocs/install/upgrade2.php +++ b/htdocs/install/upgrade2.php @@ -489,6 +489,7 @@ if (!GETPOST('action', 'aZ09') || preg_match('/upgrade/i', GETPOST('action', 'aZ 'MAIN_MODULE_SYSLOG'=>'newboxdefonly', 'MAIN_MODULE_SOCIETE'=>'newboxdefonly', 'MAIN_MODULE_SERVICE'=>'newboxdefonly', + 'MAIN_MODULE_TAKEPOS'=>'newboxdefonly', 'MAIN_MODULE_USER'=>'newboxdefonly', //This one must be always done and only into last targeted version) 'MAIN_MODULE_VARIANTS'=>'newboxdefonly', 'MAIN_MODULE_WEBSITE'=>'newboxdefonly', @@ -4746,8 +4747,19 @@ function migrate_reload_modules($db, $langs, $conf, $listofmodule = array(), $fo $mod->init($reloadmode); } } + elseif ($moduletoreload == 'MAIN_MODULE_TAKEPOS') // Permission has changed into 10.0 + { + dolibarr_install_syslog("upgrade2::migrate_reload_modules Reactivate Takepos module"); + $res = @include_once DOL_DOCUMENT_ROOT.'/core/modules/modTakePos.class.php'; + if ($res) { + $mod = new modTakePos($db); + $mod->remove('noboxes'); // We need to remove because menu entries has changed + $mod->init($reloadmode); + } + } else { + $reg = array(); $tmp = preg_match('/MAIN_MODULE_([a-zA-Z0-9]+)/', $moduletoreload, $reg); if (!empty($reg[1])) { From 539348bbbb27a3804bc8defe37adcf065e8ee265 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 27 Jan 2020 01:31:39 +0100 Subject: [PATCH 217/230] Responsive TakePOS with Bar. --- htdocs/langs/en_US/cashdesk.lang | 1 + htdocs/takepos/admin/setup.php | 9 ++++ htdocs/takepos/css/pos.css | 85 ++++++++++++++++++++++++++++---- htdocs/takepos/takepos.php | 61 ++++++++++++++++++----- 4 files changed, 136 insertions(+), 20 deletions(-) diff --git a/htdocs/langs/en_US/cashdesk.lang b/htdocs/langs/en_US/cashdesk.lang index 964bd7c436c..8c34ef482a4 100644 --- a/htdocs/langs/en_US/cashdesk.lang +++ b/htdocs/langs/en_US/cashdesk.lang @@ -81,3 +81,4 @@ CustomReceipt=Custom Receipt ReceiptName=Receipt Name ProductSupplements=Product Supplements SupplementCategory=Supplement category +HeadBar=Head Bar \ No newline at end of file diff --git a/htdocs/takepos/admin/setup.php b/htdocs/takepos/admin/setup.php index ebd0e0659e4..691451ced50 100644 --- a/htdocs/takepos/admin/setup.php +++ b/htdocs/takepos/admin/setup.php @@ -82,6 +82,7 @@ if (GETPOST('action', 'alpha') == 'set') $res = dolibarr_set_const($db, "TAKEPOS_NUM_TERMINALS", GETPOST('TAKEPOS_NUM_TERMINALS', 'alpha'), 'chaine', 0, '', $conf->entity); $res = dolibarr_set_const($db, "TAKEPOS_DIRECT_PAYMENT", GETPOST('TAKEPOS_DIRECT_PAYMENT', 'int'), 'int', 0, '', $conf->entity); $res = dolibarr_set_const($db, "TAKEPOS_CUSTOM_RECEIPT", GETPOST('TAKEPOS_CUSTOM_RECEIPT', 'int'), 'int', 0, '', $conf->entity); + //$res = dolibarr_set_const($db, "TAKEPOS_HEAD_BAR", GETPOST('TAKEPOS_HEAD_BAR', 'int'), 'int', 0, '', $conf->entity); $res = dolibarr_set_const($db, "TAKEPOS_EMAIL_TEMPLATE_INVOICE", GETPOST('TAKEPOS_EMAIL_TEMPLATE_INVOICE', 'alpha'), 'chaine', 0, '', $conf->entity); if (!empty($conf->global->TAKEPOS_ENABLE_SUMUP)) { $res = dolibarr_set_const($db, "TAKEPOS_SUMUP_AFFILIATE", GETPOST('TAKEPOS_SUMUP_AFFILIATE', 'alpha'), 'chaine', 0, '', $conf->entity); @@ -270,6 +271,14 @@ print '\n"; +// Head Bar +/*print '\n"; +*/ + // Email template for send invoice print '
    '; - print $object->getLibStatut(3); + print $object->getLibStatut(5); print ''; diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index bc00125301e..0f96bb15d62 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -3499,7 +3499,7 @@ img.boxhandle, img.boxclose { .ok { color: #114466; } .warning { color: #887711 !important; } -.error { color: #550000 !important; font-weight: bold; } +.error { color: #660000 !important; font-weight: bold; } .green { color: #118822; } div.ok { diff --git a/htdocs/theme/eldy/theme_vars.inc.php b/htdocs/theme/eldy/theme_vars.inc.php index ccaac4471a9..e80347e9895 100644 --- a/htdocs/theme/eldy/theme_vars.inc.php +++ b/htdocs/theme/eldy/theme_vars.inc.php @@ -112,7 +112,7 @@ $badgeStatus4 = '#55a580'; // Color ok $badgeStatus5 = '#cad2d2'; $badgeStatus6 = '#cad2d2'; $badgeStatus7 = '#baa32b'; -$badgeStatus8 = '#be3013'; +$badgeStatus8 = '#993013'; $badgeStatus9 = '#e7f0f0'; // status color ajustement for color blind diff --git a/htdocs/theme/md/theme_vars.inc.php b/htdocs/theme/md/theme_vars.inc.php index 5f0d1868481..106a4b5b854 100644 --- a/htdocs/theme/md/theme_vars.inc.php +++ b/htdocs/theme/md/theme_vars.inc.php @@ -99,5 +99,5 @@ $badgeStatus4 = '#277d1e'; $badgeStatus5 = '#cad2d2'; $badgeStatus6 = '#cad2d2'; $badgeStatus7 = '#baa32b'; -$badgeStatus8 = '#be3013'; +$badgeStatus8 = '#993013'; $badgeStatus9 = '#e7f0f0'; From be70232bfe5e7727f508ee5d224364d8726f4972 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 25 Jan 2020 12:10:00 +0100 Subject: [PATCH 191/230] Clean code --- .../class/expensereportstats.class.php | 19 +++++++++++-------- htdocs/expensereport/stats/index.php | 4 +++- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/htdocs/expensereport/class/expensereportstats.class.php b/htdocs/expensereport/class/expensereportstats.class.php index 9345e3e42ef..9c614e4953c 100644 --- a/htdocs/expensereport/class/expensereportstats.class.php +++ b/htdocs/expensereport/class/expensereportstats.class.php @@ -42,6 +42,9 @@ class ExpenseReportStats extends Stats public $field; public $where; + private $datetouse = 'date_valid'; + + /** * Constructor * @@ -91,7 +94,7 @@ class ExpenseReportStats extends Stats */ public function getNbByYear() { - $sql = "SELECT YEAR(".$this->db->ifsql('e.date_valid IS NULL', 'e.date_create', 'e.date_valid').") as dm, count(*)"; + $sql = "SELECT YEAR(".$this->db->ifsql('e.'.$this->datetouse.' IS NULL', 'e.date_create', 'e.'.$this->datetouse).") as dm, count(*)"; $sql.= " FROM ".$this->from; $sql.= " GROUP BY dm DESC"; $sql.= " WHERE ".$this->where; @@ -109,9 +112,9 @@ class ExpenseReportStats extends Stats */ public function getNbByMonth($year, $format = 0) { - $sql = "SELECT MONTH(".$this->db->ifsql('e.date_valid IS NULL', 'e.date_create', 'e.date_valid').") as dm, count(*)"; + $sql = "SELECT MONTH(".$this->db->ifsql('e.'.$this->datetouse.' IS NULL', 'e.date_create', 'e.'.$this->datetouse).") as dm, count(*)"; $sql.= " FROM ".$this->from; - $sql.= " WHERE YEAR(e.date_valid) = ".$year; + $sql.= " WHERE YEAR(e.".$this->datetouse.") = ".$year; $sql.= " AND ".$this->where; $sql.= " GROUP BY dm"; $sql.= $this->db->order('dm', 'DESC'); @@ -131,9 +134,9 @@ class ExpenseReportStats extends Stats */ public function getAmountByMonth($year, $format = 0) { - $sql = "SELECT date_format(".$this->db->ifsql('e.date_valid IS NULL', 'e.date_create', 'e.date_valid').",'%m') as dm, sum(".$this->field.")"; + $sql = "SELECT date_format(".$this->db->ifsql('e.'.$this->datetouse.' IS NULL', 'e.date_create', 'e.'.$this->datetouse).",'%m') as dm, sum(".$this->field.")"; $sql.= " FROM ".$this->from; - $sql.= " WHERE date_format(".$this->db->ifsql('e.date_valid IS NULL', 'e.date_create', 'e.date_valid').",'%Y') = '".$year."'"; + $sql.= " WHERE date_format(".$this->db->ifsql('e.'.$this->datetouse.' IS NULL', 'e.date_create', 'e.'.$this->datetouse).",'%Y') = '".$year."'"; $sql.= " AND ".$this->where; $sql.= " GROUP BY dm"; $sql.= $this->db->order('dm', 'DESC'); @@ -151,9 +154,9 @@ class ExpenseReportStats extends Stats */ public function getAverageByMonth($year) { - $sql = "SELECT date_format(".$this->db->ifsql('e.date_valid IS NULL', 'e.date_create', 'e.date_valid').",'%m') as dm, avg(".$this->field.")"; + $sql = "SELECT date_format(".$this->db->ifsql('e.'.$this->datetouse.' IS NULL', 'e.date_create', 'e.'.$this->datetouse).",'%m') as dm, avg(".$this->field.")"; $sql.= " FROM ".$this->from; - $sql.= " WHERE date_format(".$this->db->ifsql('e.date_valid IS NULL', 'e.date_create', 'e.date_valid').",'%Y') = '".$year."'"; + $sql.= " WHERE date_format(".$this->db->ifsql('e.'.$this->datetouse.' IS NULL', 'e.date_create', 'e.'.$this->datetouse).",'%Y') = '".$year."'"; $sql.= " AND ".$this->where; $sql.= " GROUP BY dm"; $sql.= $this->db->order('dm', 'DESC'); @@ -168,7 +171,7 @@ class ExpenseReportStats extends Stats */ public function getAllByYear() { - $sql = "SELECT date_format(".$this->db->ifsql('e.date_valid IS NULL', 'e.date_create', 'e.date_valid').",'%Y') as year, count(*) as nb, sum(".$this->field.") as total, avg(".$this->field.") as avg"; + $sql = "SELECT date_format(".$this->db->ifsql('e.'.$this->datetouse.' IS NULL', 'e.date_create', 'e.'.$this->datetouse).",'%Y') as year, count(*) as nb, sum(".$this->field.") as total, avg(".$this->field.") as avg"; $sql.= " FROM ".$this->from; $sql.= " WHERE ".$this->where; $sql.= " GROUP BY year"; diff --git a/htdocs/expensereport/stats/index.php b/htdocs/expensereport/stats/index.php index 12959e7946f..60ab9001972 100644 --- a/htdocs/expensereport/stats/index.php +++ b/htdocs/expensereport/stats/index.php @@ -232,7 +232,9 @@ $liststatus = $tmpexpensereport->statuts; print $form->selectarray('object_status', $liststatus, GETPOST('object_status', 'int'), -4, 0, 0, '', 1); print '
    '.$langs->trans("Year").''; +print '
    '; +print $form->textwithpicto($langs->trans("Year"), $langs->trans("DateValidation")); +print ''; if (!in_array($year, $arrayyears)) $arrayyears[$year] = $year; arsort($arrayyears); print $form->selectarray('year', $arrayyears, $year, 0); From 09e707b8187db017b0c444d55ad154174f2ca436 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 25 Jan 2020 13:05:40 +0100 Subject: [PATCH 192/230] trans --- htdocs/core/tpl/objectline_edit.tpl.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/tpl/objectline_edit.tpl.php b/htdocs/core/tpl/objectline_edit.tpl.php index 095ddebdad6..7c76a5c0e07 100644 --- a/htdocs/core/tpl/objectline_edit.tpl.php +++ b/htdocs/core/tpl/objectline_edit.tpl.php @@ -105,7 +105,7 @@ $coldisplay++; // Do not allow editing during a situation cycle if ($line->fk_prev_id == null) { - // editeur wysiwyg + // editor wysiwyg require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; $nbrows = ROWS_2; if (!empty($conf->global->MAIN_INPUT_DESC_HEIGHT)) $nbrows = $conf->global->MAIN_INPUT_DESC_HEIGHT; From de6b30be8c0a1b693d2ff2e5a95bbad7720e7c49 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 25 Jan 2020 13:06:10 +0100 Subject: [PATCH 193/230] Look and feel v11 --- htdocs/admin/order_extrafields.php | 1 - htdocs/admin/orderdet_extrafields.php | 1 - 2 files changed, 2 deletions(-) diff --git a/htdocs/admin/order_extrafields.php b/htdocs/admin/order_extrafields.php index f81b3cc1e69..eba9fd76ff6 100644 --- a/htdocs/admin/order_extrafields.php +++ b/htdocs/admin/order_extrafields.php @@ -70,7 +70,6 @@ llxHeader('', $langs->trans("OrdersSetup")); $linkback=''.$langs->trans("BackToModuleList").''; print load_fiche_titre($langs->trans("OrdersSetup"), $linkback, 'title_setup'); -print "
    \n"; $head = order_admin_prepare_head(); diff --git a/htdocs/admin/orderdet_extrafields.php b/htdocs/admin/orderdet_extrafields.php index 2b239de0932..9204bbc251c 100644 --- a/htdocs/admin/orderdet_extrafields.php +++ b/htdocs/admin/orderdet_extrafields.php @@ -71,7 +71,6 @@ llxHeader('', $langs->trans("OrdersSetup")); $linkback=''.$langs->trans("BackToModuleList").''; print load_fiche_titre($langs->trans("OrdersSetup"), $linkback, 'title_setup'); -print "
    \n"; $head = order_admin_prepare_head(); From 09f809f347df80160aed14af2ee9362dbb6025e4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 25 Jan 2020 14:03:24 +0100 Subject: [PATCH 194/230] FIX #12913 --- htdocs/comm/propal/class/propal.class.php | 8 +++-- htdocs/commande/class/commande.class.php | 6 +++- htdocs/compta/facture/class/facture.class.php | 6 +++- htdocs/contrat/card.php | 28 ++++++---------- htdocs/contrat/class/contrat.class.php | 10 ++++-- htdocs/core/class/commonobject.class.php | 2 -- htdocs/core/class/extrafields.class.php | 8 +++-- .../class/fournisseur.commande.class.php | 7 +++- .../fourn/class/fournisseur.facture.class.php | 20 ++++++++--- .../class/supplier_proposal.class.php | 33 +++++++++++-------- 10 files changed, 81 insertions(+), 47 deletions(-) diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index 791c4872794..778f00fbf31 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -722,6 +722,7 @@ class Propal extends CommonObject $localtaxes_type = getLocalTaxesFromRate($txtva, 0, $this->thirdparty, $mysoc); // Clean vat code + $reg = array(); $vat_src_code = ''; if (preg_match('/\((.*)\)/', $txtva, $reg)) { @@ -757,7 +758,7 @@ class Propal extends CommonObject //Fetch current line from the database and then clone the object and set it in $oldline property $line = new PropaleLigne($this->db); $line->fetch($rowid); - $line->fetch_optionals(); // Fetch extrafields for oldcopy + $line->fetch_optionals(); $staticline = clone $line; @@ -808,7 +809,10 @@ class Propal extends CommonObject $this->line->remise = $remise; if (is_array($array_options) && count($array_options) > 0) { - $this->line->array_options = $array_options; + // We replace values in this->line->array_options only for entries defined into $array_options + foreach($array_options as $key => $value) { + $this->line->array_options[$key] = $array_options[$key]; + } } // Multicurrency diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 337a6696b3c..1d8c5bb0f30 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -3074,6 +3074,7 @@ class Commande extends CommonOrder //Fetch current line from the database and then clone the object and set it in $oldline property $line = new OrderLine($this->db); $line->fetch($rowid); + $line->fetch_optionals(); if (!empty($line->fk_product)) { @@ -3146,7 +3147,10 @@ class Commande extends CommonOrder $this->line->remise = $remise; if (is_array($array_options) && count($array_options) > 0) { - $this->line->array_options = $array_options; + // We replace values in this->line->array_options only for entries defined into $array_options + foreach($array_options as $key => $value) { + $this->line->array_options[$key] = $array_options[$key]; + } } $result = $this->line->update($user, $notrigger); diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 83f9706bcee..4cea8dcad9d 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -3105,6 +3105,7 @@ class Facture extends CommonInvoice //Fetch current line from the database and then clone the object and set it in $oldline property $line = new FactureLigne($this->db); $line->fetch($rowid); + $line->fetch_optionals(); if (!empty($line->fk_product)) { @@ -3173,7 +3174,10 @@ class Facture extends CommonInvoice $this->line->multicurrency_total_ttc = $multicurrency_total_ttc; if (is_array($array_options) && count($array_options) > 0) { - $this->line->array_options = $array_options; + // We replace values in this->line->array_options only for entries defined into $array_options + foreach($array_options as $key => $value) { + $this->line->array_options[$key] = $array_options[$key]; + } } $result = $this->line->update($user, $notrigger); diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index bc7e7dc87a9..fccae47fd89 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -155,23 +155,7 @@ if (empty($reshook)) } } - // Si ajout champ produit libre - if (GETPOST('mode') == 'libre') - { - $date_start_sl = ''; - $date_end_sl = ''; - if (GETPOST('date_start_slmonth') && GETPOST('date_start_slday') && GETPOST('date_start_slyear')) - { - $date_start_sl = dol_mktime(GETPOST('date_start_slhour'), GETPOST('date_start_slmin'), 0, GETPOST('date_start_slmonth'), GETPOST('date_start_slday'), GETPOST('date_start_slyear')); - } - if (GETPOST('date_end_slmonth') && GETPOST('date_end_slday') && GETPOST('date_end_slyear')) - { - $date_end_sl = dol_mktime(GETPOST('date_end_slhour'), GETPOST('date_end_slmin'), 0, GETPOST('date_end_slmonth'), GETPOST('date_end_slday'), GETPOST('date_end_slyear')); - } - } - // Param dates - $date_contrat = ''; $date_start_update = ''; $date_end_update = ''; $date_start_real_update = ''; @@ -665,11 +649,12 @@ if (empty($reshook)) if (!$error) { $objectline = new ContratLigne($db); - if ($objectline->fetch(GETPOST('elrowid')) < 0) + if ($objectline->fetch(GETPOST('elrowid', 'int')) < 0) { setEventMessages($objectline->error, $objectline->errors, 'errors'); $error++; } + $objectline->fetch_optionals(); } $db->begin(); @@ -693,6 +678,7 @@ if (empty($reshook)) $txtva = $vat_rate; // Clean vat code + $reg = array(); $vat_src_code = ''; if (preg_match('/\((.*)\)/', $txtva, $reg)) { @@ -735,7 +721,13 @@ if (empty($reshook)) // Extrafields $extralabelsline = $extrafields->fetch_name_optionals_label($objectline->table_element); $array_options = $extrafields->getOptionalsFromPost($object->table_element_line, $predef); - $objectline->array_options = $array_options; + + if (is_array($array_options) && count($array_options) > 0) { + // We replace values in this->line->array_options only for entries defined into $array_options + foreach($array_options as $key => $value) { + $objectline->array_options[$key] = $array_options[$key]; + } + } // TODO verifier price_min si fk_product et multiprix diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index 7434d886072..98d6a5bc5cc 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -1739,8 +1739,14 @@ class Contrat extends CommonObject if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED) && is_array($array_options) && count($array_options) > 0) // For avoid conflicts if trigger used { $contractline = new ContratLigne($this->db); - $contractline->array_options = $array_options; - $contractline->id = $rowid; + $contractline->fetch($rowid); + $contractline->fetch_optionals(); + + // We replace values in $contractline->array_options only for entries defined into $array_options + foreach($array_options as $key => $value) { + $contractline->array_options[$key] = $array_options[$key]; + } + $result = $contractline->insertExtraFields(); if ($result < 0) { diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 623cc6e14ba..14433ff79db 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -5187,7 +5187,6 @@ abstract class CommonObject $attributeRequired = $extrafields->attributes[$this->table_element]['required'][$attributeKey]; $attrfieldcomputed = $extrafields->attributes[$this->table_element]['computed'][$attributeKey]; - if ($attributeRequired) { $mandatorypb = false; @@ -5218,7 +5217,6 @@ abstract class CommonObject } } - switch ($attributeType) { case 'int': diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php index 8479db591d9..ef5f5d4e74c 100644 --- a/htdocs/core/class/extrafields.class.php +++ b/htdocs/core/class/extrafields.class.php @@ -2147,23 +2147,27 @@ class ExtraFields if (in_array($key_type, array('date', 'datetime'))) { + if (! GETPOSTISSET($keysuffix."options_".$key.$keyprefix)."year") continue; // Value was not provided, we should not set it. // Clean parameters - $value_key = dol_mktime($_POST[$keysuffix."options_".$key.$keyprefix."hour"], $_POST[$keysuffix."options_".$key.$keyprefix."min"], 0, $_POST[$keysuffix."options_".$key.$keyprefix."month"], $_POST[$keysuffix."options_".$key.$keyprefix."day"], $_POST[$keysuffix."options_".$key.$keyprefix."year"]); + $value_key = dol_mktime(GETPOST($keysuffix."options_".$key.$keyprefix."hour", 'int'), GETPOST($keysuffix."options_".$key.$keyprefix."min", 'int'), 0, GETPOST($keysuffix."options_".$key.$keyprefix."month", 'int'), GETPOST($keysuffix."options_".$key.$keyprefix."day", 'int'), GETPOST($keysuffix."options_".$key.$keyprefix."year", 'int')); } elseif (in_array($key_type, array('checkbox', 'chkbxlst'))) { + if (! GETPOSTISSET($keysuffix."options_".$key.$keyprefix)) continue; // Value was not provided, we should not set it. $value_arr = GETPOST($keysuffix."options_".$key.$keyprefix); // Make sure we get an array even if there's only one checkbox $value_arr = (array) $value_arr; $value_key = implode(',', $value_arr); } - elseif (in_array($key_type, array('price', 'double'))) + elseif (in_array($key_type, array('price', 'double', 'int'))) { + if (! GETPOSTISSET($keysuffix."options_".$key.$keyprefix)) continue; // Value was not provided, we should not set it. $value_arr = GETPOST($keysuffix."options_".$key.$keyprefix); $value_key = price2num($value_arr); } else { + if (! GETPOSTISSET($keysuffix."options_".$key.$keyprefix)) continue; // Value was not provided, we should not set it. $value_key = GETPOST($keysuffix."options_".$key.$keyprefix); } diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index 3183b66dc2c..3b2833fee76 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -2572,6 +2572,8 @@ class CommandeFournisseur extends CommonOrder //Fetch current line from the database and then clone the object and set it in $oldline property $this->line = new CommandeFournisseurLigne($this->db); $this->line->fetch($rowid); + $this->line->fetch_optionals(); + $oldline = clone $this->line; $this->line->oldline = $oldline; @@ -2620,7 +2622,10 @@ class CommandeFournisseur extends CommonOrder $this->line->remise_percent = $remise_percent; if (is_array($array_options) && count($array_options) > 0) { - $this->line->array_options = $array_options; + // We replace values in this->line->array_options only for entries defined into $array_options + foreach($array_options as $key => $value) { + $this->line->array_options[$key] = $array_options[$key]; + } } $result = $this->line->update($notrigger); diff --git a/htdocs/fourn/class/fournisseur.facture.class.php b/htdocs/fourn/class/fournisseur.facture.class.php index f3d61c95b8b..e6562dbf928 100644 --- a/htdocs/fourn/class/fournisseur.facture.class.php +++ b/htdocs/fourn/class/fournisseur.facture.class.php @@ -1913,11 +1913,15 @@ class FactureFournisseur extends CommonInvoice $product_type = $type; } + //Fetch current line from the database and then clone the object and set it in $oldline property $line = new SupplierInvoiceLine($this->db); + $line->fetch($id); + $line->fetch_optionals(); - if ($line->fetch($id) < 1) { - return -1; - } + $staticline = clone $line; + + $line->oldline = $staticline; + $line->context = $this->context; $line->description = $desc; $line->subprice = $pu_ht; @@ -1945,9 +1949,15 @@ class FactureFournisseur extends CommonInvoice $line->product_type = $product_type; $line->info_bits = $info_bits; $line->fk_unit = $fk_unit; - $line->array_options = $array_options; - // Multicurrency + if (is_array($array_options) && count($array_options) > 0) { + // We replace values in this->line->array_options only for entries defined into $array_options + foreach($array_options as $key => $value) { + $this->line->array_options[$key] = $array_options[$key]; + } + } + + // Multicurrency $line->multicurrency_subprice = $pu_ht_devise; $line->multicurrency_total_ht = $multicurrency_total_ht; $line->multicurrency_total_tva = $multicurrency_total_tva; diff --git a/htdocs/supplier_proposal/class/supplier_proposal.class.php b/htdocs/supplier_proposal/class/supplier_proposal.class.php index 5825b2ff9b7..e881eeb3b78 100644 --- a/htdocs/supplier_proposal/class/supplier_proposal.class.php +++ b/htdocs/supplier_proposal/class/supplier_proposal.class.php @@ -391,7 +391,7 @@ class SupplierProposal extends CommonObject * @param int $fk_fournprice Id supplier price. If 0, we will take best price. If -1 we keep it empty. * @param int $pa_ht Buying price without tax * @param string $label ??? - * @param array $array_option extrafields array + * @param array $array_options extrafields array * @param string $ref_supplier Supplier price reference * @param int $fk_unit Id of the unit to use. * @param string $origin 'order', 'supplier_proposal', ... @@ -403,7 +403,7 @@ class SupplierProposal extends CommonObject * * @see add_product() */ - public function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1 = 0, $txlocaltax2 = 0, $fk_product = 0, $remise_percent = 0, $price_base_type = 'HT', $pu_ttc = 0, $info_bits = 0, $type = 0, $rang = -1, $special_code = 0, $fk_parent_line = 0, $fk_fournprice = 0, $pa_ht = 0, $label = '', $array_option = 0, $ref_supplier = '', $fk_unit = '', $origin = '', $origin_id = 0, $pu_ht_devise = 0, $date_start = 0, $date_end = 0) + public function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1 = 0, $txlocaltax2 = 0, $fk_product = 0, $remise_percent = 0, $price_base_type = 'HT', $pu_ttc = 0, $info_bits = 0, $type = 0, $rang = -1, $special_code = 0, $fk_parent_line = 0, $fk_fournprice = 0, $pa_ht = 0, $label = '', $array_options = 0, $ref_supplier = '', $fk_unit = '', $origin = '', $origin_id = 0, $pu_ht_devise = 0, $date_start = 0, $date_end = 0) { global $mysoc, $conf, $langs; @@ -605,8 +605,8 @@ class SupplierProposal extends CommonObject // Mise en option de la ligne if (empty($qty) && empty($special_code)) $this->line->special_code=3; - if (is_array($array_option) && count($array_option)>0) { - $this->line->array_options=$array_option; + if (is_array($array_options) && count($array_options)>0) { + $this->line->array_options=$array_options; } $result=$this->line->insert(); @@ -664,13 +664,13 @@ class SupplierProposal extends CommonObject * @param int $pa_ht Price (without tax) of product when it was bought * @param string $label ??? * @param int $type 0/1=Product/service - * @param array $array_option extrafields array + * @param array $array_options extrafields array * @param string $ref_supplier Supplier price reference * @param int $fk_unit Id of the unit to use. * @param double $pu_ht_devise Unit price in currency * @return int 0 if OK, <0 if KO */ - public function updateline($rowid, $pu, $qty, $remise_percent, $txtva, $txlocaltax1 = 0, $txlocaltax2 = 0, $desc = '', $price_base_type = 'HT', $info_bits = 0, $special_code = 0, $fk_parent_line = 0, $skip_update_total = 0, $fk_fournprice = 0, $pa_ht = 0, $label = '', $type = 0, $array_option = 0, $ref_supplier = '', $fk_unit = '', $pu_ht_devise = 0) + public function updateline($rowid, $pu, $qty, $remise_percent, $txtva, $txlocaltax1 = 0, $txlocaltax2 = 0, $desc = '', $price_base_type = 'HT', $info_bits = 0, $special_code = 0, $fk_parent_line = 0, $skip_update_total = 0, $fk_fournprice = 0, $pa_ht = 0, $label = '', $type = 0, $array_options = 0, $ref_supplier = '', $fk_unit = '', $pu_ht_devise = 0) { global $conf,$user,$langs, $mysoc; @@ -720,13 +720,17 @@ class SupplierProposal extends CommonObject $multicurrency_total_tva = $tabprice[17]; $multicurrency_total_ttc = $tabprice[18]; - // Update line - $this->line=new SupplierProposalLine($this->db); + //Fetch current line from the database and then clone the object and set it in $oldline property + $line = new SupplierProposalLine($this->db); + $line->fetch($rowid); + $line->fetch_optionals(); // Stock previous line records - $staticline=new SupplierProposalLine($this->db); - $staticline->fetch($rowid); - $this->line->oldline = $staticline; + $staticline = clone $line; + + $line->oldline = $staticline; + $this->line = $line; + $this->line->context = $this->context; // Reorder if fk_parent_line change if (! empty($fk_parent_line) && ! empty($staticline->fk_parent_line) && $fk_parent_line != $staticline->fk_parent_line) @@ -773,8 +777,11 @@ class SupplierProposal extends CommonObject } $this->line->pa_ht = $pa_ht; - if (is_array($array_option) && count($array_option)>0) { - $this->line->array_options=$array_option; + if (is_array($array_options) && count($array_options)>0) { + // We replace values in this->line->array_options only for entries defined into $array_options + foreach($array_options as $key => $value) { + $this->line->array_options[$key] = $array_options[$key]; + } } // Multicurrency From f2771b33658ec0cd85974cfbc5501171e787068e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 25 Jan 2020 14:23:23 +0100 Subject: [PATCH 195/230] FIX #12896 --- htdocs/compta/cashcontrol/cashcontrol_card.php | 6 +++--- htdocs/compta/cashcontrol/cashcontrol_list.php | 4 ++-- htdocs/core/menus/standard/eldy.lib.php | 2 +- htdocs/core/modules/modCashDesk.class.php | 6 +++--- htdocs/core/modules/modTakePos.class.php | 6 +++--- htdocs/takepos/takepos.php | 3 +++ 6 files changed, 15 insertions(+), 12 deletions(-) diff --git a/htdocs/compta/cashcontrol/cashcontrol_card.php b/htdocs/compta/cashcontrol/cashcontrol_card.php index 7958d107ec8..4c60434619a 100644 --- a/htdocs/compta/cashcontrol/cashcontrol_card.php +++ b/htdocs/compta/cashcontrol/cashcontrol_card.php @@ -56,7 +56,7 @@ if (!$sortfield) $sortfield = 'rowid'; if (!$sortorder) $sortorder = 'ASC'; // Security check -if (!$user->rights->cashdesk->use && !$user->rights->takepos->use) +if (!$user->rights->cashdesk->run && !$user->rights->takepos->run) { accessforbidden(); } @@ -82,8 +82,8 @@ $hookmanager->initHooks(array('cashcontrolcard', 'globalcard')); * Actions */ -$permissiontoadd = ($user->rights->cashdesk->use || $user->rights->takepos->use); -$permissiontodelete = ($user->rights->cashdesk->use || $user->rights->takepos->use) || ($permissiontoadd && $object->status == 0); +$permissiontoadd = ($user->rights->cashdesk->run || $user->rights->takepos->run); +$permissiontodelete = ($user->rights->cashdesk->run || $user->rights->takepos->run) || ($permissiontoadd && $object->status == 0); if (empty($backtopage)) $backtopage = dol_buildpath('/compta/cashcontrol/cashcontrol_card.php', 1).'?id='.($id > 0 ? $id : '__ID__'); $backurlforlist = dol_buildpath('/compta/cashcontrol/cashcontrol_list.php', 1); $triggermodname = 'CACHCONTROL_MODIFY'; // Name of trigger action code to execute when we modify record diff --git a/htdocs/compta/cashcontrol/cashcontrol_list.php b/htdocs/compta/cashcontrol/cashcontrol_list.php index 5bf48189c4a..6c59276d600 100644 --- a/htdocs/compta/cashcontrol/cashcontrol_list.php +++ b/htdocs/compta/cashcontrol/cashcontrol_list.php @@ -168,8 +168,8 @@ if (empty($reshook)) // Mass actions $objectclass = 'CashControl'; $objectlabel = 'CashControl'; - $permissiontoread = ($user->rights->cashdesk->use || $user->rights->takepos->use); - $permissiontodelete = ($user->rights->cashdesk->use || $user->rights->takepos->use); + $permissiontoread = ($user->rights->cashdesk->run || $user->rights->takepos->run); + $permissiontodelete = ($user->rights->cashdesk->run || $user->rights->takepos->run); //$uploaddir = ''; //include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php'; diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index 253b745e25f..5a5a2c5628d 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -1474,7 +1474,7 @@ function print_left_eldy_menu($db, $menu_array_before, $menu_array_after, &$tabM // Cash Control if (!empty($conf->takepos->enabled) || !empty($conf->cashdesk->enabled)) { - $permtomakecashfence = ($user->rights->cashdesk->use || $user->rights->takepos->use); + $permtomakecashfence = ($user->rights->cashdesk->run || $user->rights->takepos->run); $newmenu->add("/compta/cashcontrol/cashcontrol_list.php?action=list", $langs->trans("POS"), 0, $permtomakecashfence, '', $mainmenu, 'cashcontrol'); $newmenu->add("/compta/cashcontrol/cashcontrol_card.php?action=create", $langs->trans("NewCashFence"), 1, $permtomakecashfence); $newmenu->add("/compta/cashcontrol/cashcontrol_list.php?action=list", $langs->trans("List"), 1, $permtomakecashfence); diff --git a/htdocs/core/modules/modCashDesk.class.php b/htdocs/core/modules/modCashDesk.class.php index 83495ca1af6..afb5185fb51 100644 --- a/htdocs/core/modules/modCashDesk.class.php +++ b/htdocs/core/modules/modCashDesk.class.php @@ -85,10 +85,10 @@ class modCashDesk extends DolibarrModules $r++; $this->rights[$r][0] = 50101; - $this->rights[$r][1] = 'Use point of sale'; + $this->rights[$r][1] = 'Use Point of sale'; $this->rights[$r][2] = 'a'; $this->rights[$r][3] = 0; - $this->rights[$r][4] = 'use'; + $this->rights[$r][4] = 'run'; // Main menu entries $this->menus = array(); // List of menus to add @@ -103,7 +103,7 @@ class modCashDesk extends DolibarrModules 'langs'=>'cashdesk', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. 'position'=>900, 'enabled'=>'$conf->cashdesk->enabled', - 'perms'=>'$user->rights->cashdesk->use', // Use 'perms'=>'1' if you want your menu with no permission rules + 'perms'=>'$user->rights->cashdesk->run', // Use 'perms'=>'1' if you want your menu with no permission rules 'target'=>'pointofsale', 'user'=>0); // 0=Menu for internal users, 1=external users, 2=both diff --git a/htdocs/core/modules/modTakePos.class.php b/htdocs/core/modules/modTakePos.class.php index b5f79f79d8d..515f18cf690 100644 --- a/htdocs/core/modules/modTakePos.class.php +++ b/htdocs/core/modules/modTakePos.class.php @@ -199,10 +199,10 @@ class modTakePos extends DolibarrModules $r++; $this->rights[$r][0] = 50151; - $this->rights[$r][1] = 'Use point of sale'; + $this->rights[$r][1] = 'Use Point Of Sale'; $this->rights[$r][2] = 'a'; $this->rights[$r][3] = 0; - $this->rights[$r][4] = 'use'; + $this->rights[$r][4] = 'run'; // Main menu entries @@ -221,7 +221,7 @@ class modTakePos extends DolibarrModules 'langs'=>'cashdesk', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. 'position'=>1000+$r, 'enabled'=>'$conf->takepos->enabled', // Define condition to show or hide menu entry. Use '$conf->takepos->enabled' if entry must be visible if module is enabled. - 'perms'=>'1', // Use 'perms'=>'$user->rights->takepos->level1->level2' if you want your menu with a permission rules + 'perms'=>'$user->rights->takepos->run', // Use 'perms'=>'$user->rights->takepos->level1->level2' if you want your menu with a permission rules 'target'=>'takepos', 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both diff --git a/htdocs/takepos/takepos.php b/htdocs/takepos/takepos.php index 78ead8ff9c5..a7fb413e5f4 100644 --- a/htdocs/takepos/takepos.php +++ b/htdocs/takepos/takepos.php @@ -78,6 +78,9 @@ if ($invoice->socid > 0) $soc->fetch($invoice->socid); else $soc->fetch($conf->global->$constforcompanyid); */ +// Security check +$result = restrictedArea($user, 'takepos', 0, ''); + /* * View From 06731bdd59e0fd1f85c94cf794410df5a245c265 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 25 Jan 2020 14:40:16 +0100 Subject: [PATCH 196/230] Fix phpcs --- htdocs/core/class/commonobject.class.php | 2 +- htdocs/core/modules/facture/doc/pdf_crabe.modules.php | 6 +++--- htdocs/core/modules/facture/doc/pdf_sponge.modules.php | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 623cc6e14ba..3a8d2de15ca 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -6613,7 +6613,7 @@ abstract class CommonObject if (is_array($params) && array_key_exists('onlykey', $params) && $key != $params['onlykey']) continue; // @todo Add test also on 'enabled' (different than 'list' that is 'visibility') - $enabled = 1; + //$enabled = 1; $visibility = 1; if ($visibility && isset($extrafields->attributes[$this->table_element]['list'][$key])) diff --git a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php index 3f188fcc864..8e95a725cd3 100644 --- a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php @@ -1037,13 +1037,13 @@ class pdf_crabe extends ModelePDFFactures $pdf->SetXY($posxval, $posy); $lib_mode_reg = $outputlangs->transnoentities("PaymentType".$object->mode_reglement_code) != ('PaymentType'.$object->mode_reglement_code) ? $outputlangs->transnoentities("PaymentType".$object->mode_reglement_code) : $outputlangs->convToOutputCharset($object->mode_reglement); $pdf->MultiCell(80, 5, $lib_mode_reg, 0, 'L'); - + // Show online payment link $useonlinepayment = ((! empty($conf->paypal->enabled) || ! empty($conf->stripe->enabled) || ! empty($conf->paybox->enabled)) && !empty($conf->global->PDF_SHOW_LINK_TO_ONLINE_PAYMENT)); if ($object->mode_reglement_code == 'CB' || $object->mode_reglement_code == 'VAD' && $object->statut != Facture::STATUS_DRAFT && $useonlinepayment) { require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php'; global $langs; - + $langs->loadLangs(array('payment', 'paybox')); $servicename=$langs->transnoentities('Online'); $paiement_url = getOnlinePaymentUrl('', 'invoice', $object->ref, '', '', ''); @@ -1051,7 +1051,7 @@ class pdf_crabe extends ModelePDFFactures $pdf->writeHTMLCell(80, 10, '', '', dol_htmlentitiesbr($linktopay), 0, 1); } - + $posy = $pdf->GetY() + 2; } diff --git a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php index 5c8a933de66..75b985c6cd9 100644 --- a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php @@ -1129,15 +1129,15 @@ class pdf_sponge extends ModelePDFFactures if ($object->mode_reglement_code == 'CB' || $object->mode_reglement_code == 'VAD' && $object->statut != Facture::STATUS_DRAFT && $useonlinepayment) { require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php'; global $langs; - + $langs->loadLangs(array('payment', 'paybox')); $servicename=$langs->transnoentities('Online'); $paiement_url = getOnlinePaymentUrl('', 'invoice', $object->ref, '', '', ''); $linktopay = $langs->trans("ToOfferALinkForOnlinePayment", $servicename).' '.$outputlangs->transnoentities("ClickHere").''; - + $pdf->writeHTMLCell(80, 10, '', '', dol_htmlentitiesbr($linktopay), 0, 1); } - + $posy=$pdf->GetY()+2; } From c64acb1a9c414c577fc275e2382174b0ec5a8438 Mon Sep 17 00:00:00 2001 From: Pierre Ardoin <32256817+mapiolca@users.noreply.github.com> Date: Sat, 25 Jan 2020 15:19:46 +0100 Subject: [PATCH 197/230] Permissions Issue fixes an issue that displayed the "restricted area" banner despite user permissions. --- htdocs/compta/tva/document.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/tva/document.php b/htdocs/compta/tva/document.php index 8e4962a6351..8ea2de95efa 100644 --- a/htdocs/compta/tva/document.php +++ b/htdocs/compta/tva/document.php @@ -49,7 +49,7 @@ $confirm = GETPOST('confirm', 'alpha'); // Security check if ($user->societe_id) $socid=$user->societe_id; -$result = restrictedArea($user, 'tax', $id, 'vat', 'charges'); +$result = restrictedArea($user, 'tax', '', 'vat', 'charges'); // Get parameters From 9ecf6127c627b5850853720c98b4725713df4edb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 25 Jan 2020 19:02:36 +0100 Subject: [PATCH 198/230] Add array fields for contracts --- htdocs/contrat/class/contrat.class.php | 30 ++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index 98d6a5bc5cc..4be939236c5 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -189,6 +189,36 @@ class Contrat extends CommonObject protected $lines_id_index_mapper = array(); + public $fields=array( + 'rowid' =>array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>10), + 'ref' =>array('type'=>'varchar(50)', 'label'=>'Ref', 'enabled'=>1, 'visible'=>-1, 'showoncombobox'=>1, 'position'=>15), + 'ref_ext' =>array('type'=>'varchar(255)', 'label'=>'Ref ext', 'enabled'=>1, 'visible'=>0, 'position'=>20), + 'ref_supplier' =>array('type'=>'varchar(50)', 'label'=>'Ref supplier', 'enabled'=>1, 'visible'=>-1, 'position'=>25), + 'entity' =>array('type'=>'integer', 'label'=>'Entity', 'default'=>1, 'enabled'=>1, 'visible'=>-2, 'notnull'=>1, 'position'=>30, 'index'=>1), + 'tms' =>array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>35), + 'datec' =>array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>1, 'visible'=>-1, 'position'=>40), + 'date_contrat' =>array('type'=>'datetime', 'label'=>'Date contrat', 'enabled'=>1, 'visible'=>-1, 'position'=>45), + 'statut' =>array('type'=>'smallint(6)', 'label'=>'Statut', 'enabled'=>1, 'visible'=>-1, 'position'=>500), + 'mise_en_service' =>array('type'=>'datetime', 'label'=>'Mise en service', 'enabled'=>1, 'visible'=>-1, 'position'=>55), + 'fin_validite' =>array('type'=>'datetime', 'label'=>'Fin validite', 'enabled'=>1, 'visible'=>-1, 'position'=>60), + 'date_cloture' =>array('type'=>'datetime', 'label'=>'Date cloture', 'enabled'=>1, 'visible'=>-1, 'position'=>65), + 'fk_soc' =>array('type'=>'integer', 'label'=>'ThirdParty', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>70), + 'fk_projet' =>array('type'=>'integer', 'label'=>'Fk projet', 'enabled'=>1, 'visible'=>-1, 'position'=>75), + 'fk_commercial_signature' =>array('type'=>'integer', 'label'=>'Fk commercial signature', 'enabled'=>1, 'visible'=>-1, 'position'=>80), + 'fk_commercial_suivi' =>array('type'=>'integer', 'label'=>'Fk commercial suivi', 'enabled'=>1, 'visible'=>-1, 'position'=>85), + 'fk_user_author' =>array('type'=>'integer', 'label'=>'Fk user author', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>90), + 'fk_user_mise_en_service' =>array('type'=>'integer', 'label'=>'Fk user mise en service', 'enabled'=>1, 'visible'=>-1, 'position'=>95), + 'fk_user_cloture' =>array('type'=>'integer', 'label'=>'Fk user cloture', 'enabled'=>1, 'visible'=>-1, 'position'=>100), + 'note_private' =>array('type'=>'text', 'label'=>'NotePublic', 'enabled'=>1, 'visible'=>0, 'position'=>105), + 'note_public' =>array('type'=>'text', 'label'=>'NotePrivate', 'enabled'=>1, 'visible'=>0, 'position'=>110), + 'model_pdf' =>array('type'=>'varchar(255)', 'label'=>'Model pdf', 'enabled'=>1, 'visible'=>0, 'position'=>115), + 'import_key' =>array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>1, 'visible'=>-2, 'position'=>120), + 'extraparams' =>array('type'=>'varchar(255)', 'label'=>'Extraparams', 'enabled'=>1, 'visible'=>-1, 'position'=>125), + 'ref_customer' =>array('type'=>'varchar(128)', 'label'=>'Ref customer', 'enabled'=>1, 'visible'=>-1, 'position'=>130), + 'fk_user_modif' =>array('type'=>'integer', 'label'=>'UserModif', 'enabled'=>1, 'visible'=>-2, 'notnull'=>-1, 'position'=>135), + 'last_main_doc' =>array('type'=>'varchar(255)', 'label'=>'Last main doc', 'enabled'=>1, 'visible'=>-1, 'position'=>140), + ); + const STATUS_DRAFT = 0; const STATUS_VALIDATED = 1; const STATUS_CLOSED = 2; From 12556aa83536e5c51ee9196c2d56175e091129b1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 25 Jan 2020 19:21:37 +0100 Subject: [PATCH 199/230] Fix modulebuilder --- htdocs/contrat/class/contrat.class.php | 18 +++++++++--------- htdocs/modulebuilder/index.php | 8 +++++++- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index 4be939236c5..bb506884cab 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -202,20 +202,20 @@ class Contrat extends CommonObject 'mise_en_service' =>array('type'=>'datetime', 'label'=>'Mise en service', 'enabled'=>1, 'visible'=>-1, 'position'=>55), 'fin_validite' =>array('type'=>'datetime', 'label'=>'Fin validite', 'enabled'=>1, 'visible'=>-1, 'position'=>60), 'date_cloture' =>array('type'=>'datetime', 'label'=>'Date cloture', 'enabled'=>1, 'visible'=>-1, 'position'=>65), - 'fk_soc' =>array('type'=>'integer', 'label'=>'ThirdParty', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>70), - 'fk_projet' =>array('type'=>'integer', 'label'=>'Fk projet', 'enabled'=>1, 'visible'=>-1, 'position'=>75), - 'fk_commercial_signature' =>array('type'=>'integer', 'label'=>'Fk commercial signature', 'enabled'=>1, 'visible'=>-1, 'position'=>80), - 'fk_commercial_suivi' =>array('type'=>'integer', 'label'=>'Fk commercial suivi', 'enabled'=>1, 'visible'=>-1, 'position'=>85), - 'fk_user_author' =>array('type'=>'integer', 'label'=>'Fk user author', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>90), - 'fk_user_mise_en_service' =>array('type'=>'integer', 'label'=>'Fk user mise en service', 'enabled'=>1, 'visible'=>-1, 'position'=>95), - 'fk_user_cloture' =>array('type'=>'integer', 'label'=>'Fk user cloture', 'enabled'=>1, 'visible'=>-1, 'position'=>100), + 'fk_soc' =>array('type'=>'integer:Societe:societe/class/societe.class.php', 'label'=>'ThirdParty', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>70), + 'fk_projet' =>array('type'=>'integer:Project:projet/class/project.class.php:1:fk_statut=1', 'label'=>'Fk projet', 'enabled'=>1, 'visible'=>-1, 'position'=>75), + 'fk_commercial_signature' =>array('type'=>'integer:User:user/class/user.class.php', 'label'=>'Fk commercial signature', 'enabled'=>1, 'visible'=>-1, 'position'=>80), + 'fk_commercial_suivi' =>array('type'=>'integer:User:user/class/user.class.php', 'label'=>'Fk commercial suivi', 'enabled'=>1, 'visible'=>-1, 'position'=>85), + 'fk_user_author' =>array('type'=>'integer:User:user/class/user.class.php', 'label'=>'Fk user author', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>90), + 'fk_user_mise_en_service' =>array('type'=>'integer:User:user/class/user.class.php', 'label'=>'Fk user mise en service', 'enabled'=>1, 'visible'=>-1, 'position'=>95), + 'fk_user_cloture' =>array('type'=>'integer:User:user/class/user.class.php', 'label'=>'Fk user cloture', 'enabled'=>1, 'visible'=>-1, 'position'=>100), 'note_private' =>array('type'=>'text', 'label'=>'NotePublic', 'enabled'=>1, 'visible'=>0, 'position'=>105), 'note_public' =>array('type'=>'text', 'label'=>'NotePrivate', 'enabled'=>1, 'visible'=>0, 'position'=>110), 'model_pdf' =>array('type'=>'varchar(255)', 'label'=>'Model pdf', 'enabled'=>1, 'visible'=>0, 'position'=>115), 'import_key' =>array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>1, 'visible'=>-2, 'position'=>120), 'extraparams' =>array('type'=>'varchar(255)', 'label'=>'Extraparams', 'enabled'=>1, 'visible'=>-1, 'position'=>125), - 'ref_customer' =>array('type'=>'varchar(128)', 'label'=>'Ref customer', 'enabled'=>1, 'visible'=>-1, 'position'=>130), - 'fk_user_modif' =>array('type'=>'integer', 'label'=>'UserModif', 'enabled'=>1, 'visible'=>-2, 'notnull'=>-1, 'position'=>135), + 'ref_customer' =>array('type'=>'varchar(50)', 'label'=>'Ref customer', 'enabled'=>1, 'visible'=>-1, 'position'=>130), + 'fk_user_modif' =>array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserModif', 'enabled'=>1, 'visible'=>-2, 'notnull'=>-1, 'position'=>135), 'last_main_doc' =>array('type'=>'varchar(255)', 'label'=>'Last main doc', 'enabled'=>1, 'visible'=>-1, 'position'=>140), ); diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index 9476f87a342..51e35ab050a 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -692,7 +692,7 @@ if ($dirins && $action == 'initobject' && $module && GETPOST('createtablearray', 'entity' =>array('type'=>'integer', 'label'=>'Entity', 'enabled'=>1, 'visible'=>0, 'default'=>1, 'notnull'=>1, 'index'=>1, 'position'=>20), 'label' =>array('type'=>'varchar(255)', 'label'=>'Label', 'enabled'=>1, 'visible'=>1, 'position'=>30, 'searchall'=>1, 'css'=>'minwidth200', 'help'=>'Help text'), 'amount' =>array('type'=>'double(24,8)', 'label'=>'Amount', 'enabled'=>1, 'visible'=>1, 'default'=>'null', 'position'=>40, 'searchall'=>0, 'isameasure'=>1, 'help'=>'Help text'), - 'fk_soc' =>array('type'=>'integer:Societe:societe/class/societe.class.php', 'label'=>'ThirdParty', 'visible'=>1, 'enabled'=>1, 'position'=>50, 'notnull'=>-1, 'index'=>1, 'searchall'=>1, 'help'=>'LinkToThirparty'), + 'fk_soc' =>array('type'=>'integer:Societe:societe/class/societe.class.php', 'label'=>'ThirdParty', 'visible'=>1, 'enabled'=>1, 'position'=>50, 'notnull'=>-1, 'index'=>1, 'searchall'=>1, 'help'=>'LinkToThirparty'), 'description' =>array('type'=>'text', 'label'=>'Descrption', 'enabled'=>1, 'visible'=>0, 'position'=>60), 'note_public' =>array('type'=>'html', 'label'=>'NotePublic', 'enabled'=>1, 'visible'=>0, 'position'=>61), 'note_private' =>array('type'=>'html', 'label'=>'NotePrivate', 'enabled'=>1, 'visible'=>0, 'position'=>62), @@ -716,6 +716,12 @@ if ($dirins && $action == 'initobject' && $module && GETPOST('createtablearray', // type $type = $obj->Type; if ($type == 'int(11)') $type='integer'; + if ($obj->Field == 'fk_soc') $type = 'integer:Societe:societe/class/societe.class.php'; + if (preg_match('/^fk_proj/', $obj->Field)) $type = 'integer:Project:projet/class/project.class.php:1:fk_statut=1'; + if (preg_match('/^fk_prod/', $obj->Field)) $type = 'integer:Product:product/class/product.class.php:1'; + if ($obj->Field == 'fk_warehouse') $type = 'integer:Entrepot:product/stock/class/entrepot.class.php'; + if (preg_match('/^(fk_user|fk_commercial)/', $obj->Field)) $type = 'integer:User:user/class/user.class.php'; + // notnull $notnull = ($obj->Null == 'YES'?0:1); if ($fieldname == 'fk_user_modif') $notnull = -1; From 6b30a6ad1f51f626b0f2f157cef30c63cab98ab4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 25 Jan 2020 19:30:12 +0100 Subject: [PATCH 200/230] Fix modulebuilder --- htdocs/contrat/class/contrat.class.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index a2249a41da9..b0ac1a4ab85 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -73,6 +73,11 @@ class Contrat extends CommonObject */ public $ismultientitymanaged = 1; + /** + * @var int Does object support extrafields ? 0=No, 1=Yes + */ + public $isextrafieldmanaged = 1; + /** * 0=Default, 1=View may be restricted to sales representative only if no permission to see all or to company of external user if external user * @var integer From 30a5ab479f42d12e002543a5eb7f0122d6018de8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 25 Jan 2020 22:43:24 +0100 Subject: [PATCH 201/230] Can choose text to show when there is no data --- htdocs/core/class/dolgraph.class.php | 12 +++++++++--- htdocs/langs/en_US/main.lang | 3 ++- htdocs/theme/eldy/global.inc.php | 12 ++++++++++++ htdocs/theme/md/style.css.php | 12 ++++++++++++ 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/htdocs/core/class/dolgraph.class.php b/htdocs/core/class/dolgraph.class.php index d954ba08320..9aa54498edc 100644 --- a/htdocs/core/class/dolgraph.class.php +++ b/htdocs/core/class/dolgraph.class.php @@ -1145,8 +1145,8 @@ class DolGraph /** * Output HTML string to show graph * - * @param int $shownographyet Show graph to say there is not enough data - * @return string HTML string to show graph + * @param int|string $shownographyet Show graph to say there is not enough data or the message in $shownographyet if it is a string. + * @return string HTML string to show graph */ public function show($shownographyet = 0) { @@ -1155,7 +1155,13 @@ class DolGraph if ($shownographyet) { $s = '
    '; - $s .= '
    '.$langs->trans("NotEnoughDataYet").'
    '; + $s .= '
    '; + if (is_numeric($shownographyet)) { + $s .= $langs->trans("NotEnoughDataYet"); + } else { + $s .= $shownographyet; + } + $s .= '
    '; return $s; } diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index 43331220bd0..de3ea66d682 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -1014,4 +1014,5 @@ ContactDefault_ticketsup=Ticket ContactAddedAutomatically=Contact added from contact thirdparty roles More=More ShowDetails=Show details -CustomReports=Custom reports \ No newline at end of file +CustomReports=Custom reports +SelectYourGraphOptionsFirst=Select your graph options to build a graph \ No newline at end of file diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 0f96bb15d62..000f303fde5 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -4376,6 +4376,18 @@ pre#editfilecontentaceeditorid { } +/* ============================================================================== */ +/* Custom reports */ +/* ============================================================================== */ + +.customreportsoutput, .customreportsoutputnotdata { + padding-top: 20px; +} +.customreportsoutputnotdata { + text-align: center; +} + + /* ============================================================================== */ /* Holiday */ /* ============================================================================== */ diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 0806cb47d1e..91adb3b7cdf 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -4518,6 +4518,18 @@ pre#editfilecontentaceeditorid { } +/* ============================================================================== */ +/* Custom reports */ +/* ============================================================================== */ + +.customreportsoutput, .customreportsoutputnotdata { + padding-top: 20px; +} +.customreportsoutputnotdata { + text-align: center; +} + + /* ============================================================================== */ /* Holiday */ /* ============================================================================== */ From 4510ef488ee17c1342e976e8292308d73b4a81a1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 25 Jan 2020 22:43:56 +0100 Subject: [PATCH 202/230] doc modulebuilder --- htdocs/bom/class/bom.class.php | 2 +- htdocs/modulebuilder/template/class/myobject.class.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/bom/class/bom.class.php b/htdocs/bom/class/bom.class.php index 8fcd6ce1274..0183ffb004a 100644 --- a/htdocs/bom/class/bom.class.php +++ b/htdocs/bom/class/bom.class.php @@ -47,7 +47,7 @@ class BOM extends CommonObject public $ismultientitymanaged = 1; /** - * @var int Does bom support extrafields ? 0=No, 1=Yes + * @var int Does object support extrafields ? 0=No, 1=Yes */ public $isextrafieldmanaged = 1; diff --git a/htdocs/modulebuilder/template/class/myobject.class.php b/htdocs/modulebuilder/template/class/myobject.class.php index 7209738fa60..596e47e12c0 100644 --- a/htdocs/modulebuilder/template/class/myobject.class.php +++ b/htdocs/modulebuilder/template/class/myobject.class.php @@ -48,7 +48,7 @@ class MyObject extends CommonObject public $ismultientitymanaged = 0; /** - * @var int Does myobject support extrafields ? 0=No, 1=Yes + * @var int Does object support extrafields ? 0=No, 1=Yes */ public $isextrafieldmanaged = 1; From 68f5aee432d2ba2bae931ec18a121776cb6b9d5a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 26 Jan 2020 19:38:19 +0100 Subject: [PATCH 203/230] Fix global stats for holiday --- htdocs/index.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/htdocs/index.php b/htdocs/index.php index 23f02ed95b3..250a0c1736b 100644 --- a/htdocs/index.php +++ b/htdocs/index.php @@ -115,6 +115,7 @@ $boxstatFromHook = ''; // Load translation files required by page $langs->loadLangs(array('commercial', 'bills', 'orders', 'contracts')); +// Load global statistics of objects if (empty($user->socid) && empty($conf->global->MAIN_DISABLE_GLOBAL_BOXSTATS)) { $object = new stdClass(); @@ -201,7 +202,7 @@ if (empty($user->socid) && empty($conf->global->MAIN_DISABLE_GLOBAL_BOXSTATS)) 'contacts', 'members', 'products', - 'services', + 'services', 'proposals', 'orders', 'invoices', @@ -212,7 +213,7 @@ if (empty($user->socid) && empty($conf->global->MAIN_DISABLE_GLOBAL_BOXSTATS)) 'askprice', 'projects', 'expensereports', - 'holiday', + 'holidays', 'donations' ); // Dashboard Icon lines @@ -348,9 +349,8 @@ if (empty($user->socid) && empty($conf->global->MAIN_DISABLE_GLOBAL_BOXSTATS)) -/* - * Dolibarr Working Board with weather - */ +// Dolibarr Working Board with weather + if (empty($conf->global->MAIN_DISABLE_GLOBAL_WORKBOARD)) { $showweather = (empty($conf->global->MAIN_DISABLE_METEO) || $conf->global->MAIN_DISABLE_METEO == 2) ? 1 : 0; @@ -701,6 +701,7 @@ if (empty($conf->global->MAIN_DISABLE_GLOBAL_WORKBOARD)) { $openedDashBoard .= ' '."\n"; $openedDashBoard .= ' '."\n"; + // Show the span for the total of record if (!empty($groupElement['globalStats'])) { $globalStatInTopOpenedDashBoard[] = $globalStatsKey; $openedDashBoard .= ' '.$nbTotal.''."\n"; From 8ff19a2a0f612ca08fe9a61b87c19021036f2e9d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 26 Jan 2020 22:02:31 +0100 Subject: [PATCH 204/230] WIP search component --- htdocs/contrat/class/contrat.class.php | 2 +- htdocs/core/class/html.form.class.php | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index b0ac1a4ab85..3f4027b9935 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -203,7 +203,7 @@ class Contrat extends CommonObject 'tms' =>array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>35), 'datec' =>array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>1, 'visible'=>-1, 'position'=>40), 'date_contrat' =>array('type'=>'datetime', 'label'=>'Date contrat', 'enabled'=>1, 'visible'=>-1, 'position'=>45), - 'statut' =>array('type'=>'smallint(6)', 'label'=>'Statut', 'enabled'=>1, 'visible'=>-1, 'position'=>500), + 'statut' =>array('type'=>'smallint(6)', 'label'=>'Statut', 'enabled'=>1, 'visible'=>-1, 'position'=>500, 'arrayofkeyval'=>array(0=>'Draft', 1=>'Validated', 2=>'Closed')), 'mise_en_service' =>array('type'=>'datetime', 'label'=>'Mise en service', 'enabled'=>1, 'visible'=>-1, 'position'=>55), 'fin_validite' =>array('type'=>'datetime', 'label'=>'Fin validite', 'enabled'=>1, 'visible'=>-1, 'position'=>60), 'date_cloture' =>array('type'=>'datetime', 'label'=>'Date cloture', 'enabled'=>1, 'visible'=>-1, 'position'=>65), diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 5d93ca482dd..8a0dda0c2fc 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -8021,4 +8021,23 @@ class Form return -1; } } + + /** + * Output the component to make advanced search criteries + * + * @param array $arrayofcriterias Array of available search criterias. Example: array($object->element => $object->fields, 'otherfamily' => otherarrayoffields, ...) + * @param array $search_component_params Array of selected search criterias + * @return string HTML component for advanced search + */ + public function searchComponent($arrayofcriterias, $search_component_params) + { + $ret = ''; + + + + + + + return $ret; + } } From 3e8d2407c8a383b0535424fc0baff5f7333db308 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 26 Jan 2020 22:12:26 +0100 Subject: [PATCH 205/230] Update receipt.php --- htdocs/takepos/receipt.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/takepos/receipt.php b/htdocs/takepos/receipt.php index 185302e3a16..8489f97c5db 100644 --- a/htdocs/takepos/receipt.php +++ b/htdocs/takepos/receipt.php @@ -138,8 +138,8 @@ if ($conf->global->TAKEPOS_CUSTOM_RECEIPT && $conf->global->TAKEPOS_SHOW_CUSTOME else echo $line->description;?>
    qty;?>total_ttc, 'MT'), 1);?>total_ttc);?>total_ttc/$line->qty, 'MT'), 1);?>total_ttc, 1);?>
    qty;?>total_ttc/$line->qty, 'MT'), 1);?>total_ttc / $line->qty, 'MT'), 1);?> total_ttc, 1);?>
    qty;?>total_ttc/$line->qty;?>total_ttc, 'MT'), 1);?> total_ttc);?>
    qty;?>total_ttc, 'MT'), 1);?>total_ttc);?>total_ttc/$line->qty, 'MT'), 1);?>total_ttc, 1);?>
    qty;?>total_ttc/$line->qty, 'MT'), 1);?>total_ttc / $line->qty, 'MT'), 1);?> total_ttc, 1);?>
    '; print $form->selectyesno("TAKEPOS_CUSTOM RECEIPT", $conf->global->TAKEPOS_CUSTOM_RECEIPT, 1); print "
    '; +print $langs->trans('HeadBar'); +print ''; +print $form->selectyesno("TAKEPOS_HEAD_BAR", $conf->global->TAKEPOS_HEAD_BAR, 1); +print "
    '; print $langs->trans('EmailTemplate'); diff --git a/htdocs/takepos/css/pos.css b/htdocs/takepos/css/pos.css index e8e53a0c8bf..5e32381d0a5 100644 --- a/htdocs/takepos/css/pos.css +++ b/htdocs/takepos/css/pos.css @@ -1,6 +1,6 @@ html,body { box-sizing: border-box; - padding:3px; + padding:0px; margin:0; height:100%; width:100%; @@ -35,7 +35,7 @@ button.calcbutton { text-align: center; overflow: visible; /* removes extra width in IE */ width: calc(25% - 2px); - height: 24%; + height: calc(25% - 2px); font-weight: bold; background-color: #8c907e; color: #fff; @@ -57,7 +57,7 @@ button.calcbutton2 { text-align: center; overflow: visible; /* removes extra width in IE */ width: calc(25% - 2px); - height: 24%; + height: calc(25% - 2px); font-weight: bold; } @@ -72,7 +72,7 @@ button.calcbutton3 { font-size:120%; overflow: visible; /* removes extra width in IE */ width: calc(25% - 2px); - height: 24%; + height: calc(25% - 2px); } button.actionbutton { @@ -91,7 +91,7 @@ button.actionbutton { text-align: center; overflow: visible; /* removes extra width in IE */ width:33%; - height:24%; + height: calc(25% - 2px); } .takepospay { @@ -107,7 +107,7 @@ div.wrapper{ float:left; /* important */ position:relative; /* important(so we can absolutely position the description div */ width:25%; - height:25%; + height:33%; margin:0; padding:1px; border: 2px solid #EEE; @@ -121,7 +121,7 @@ div.wrapper2{ float:left; /* important */ position:relative; /* important(so we can absolutely position the description div */ width:12.5%; - height:25%; + height:33%; margin:0; /* padding:1px; */ border: 2px solid #EEE; @@ -206,12 +206,25 @@ div.paymentbordline height: 34%; } +.row1withhead{ + margin: 0 auto; + width: 100%; + height: calc(50% - 35px); + padding-top: 5px; +} + .row2{ margin: 0 auto; width: 100%; height: 66%; } +.row2withhead{ + margin: 0 auto; + width: 100%; + height: 50%; +} + .div1{ height:100%; width: 34%; @@ -221,9 +234,10 @@ div.paymentbordline overflow: auto; /* background-color:white; */ padding-top: 0; - padding-bottom: 10px; + padding-bottom: 0; padding-right: 5px; padding-left: 5px; + min-height: 180px; } .div2{ @@ -233,7 +247,7 @@ div.paymentbordline float: left; box-sizing: border-box; padding-top: 0; - padding-bottom: 10px; + padding-bottom: 0; padding-right: 5px; padding-left: 5px; min-height: 180px; @@ -325,6 +339,45 @@ div.description_content { padding-right: 2px; } +.header{ + margin: 0 auto; + width: 100%; + height: 35px; + background: rgb(60,70,100); +} + +.topnav{ + background-color: rgb(60,70,100); + overflow: hidden; + height: 100%; +} + +.topnav a{ + float: left; + color: #f2f2f2; + text-align: center; + padding: 6px 16px; + text-decoration: none; + font-size: 17px; +} + +.topnav a:hover{ + background-color: #ddd; + color: black; +} + +.topnav-right{ + float: right; +} + +.topnav input[type="text"] { + background-color: #fff; + color: #000; + float: left; + border-bottom: none !important; + margin-top: 4px; +} + @media screen and (min-width: 892px) { .calcbutton{ font-size: 18px; @@ -382,6 +435,12 @@ div.description_content { /* For small screens */ @media screen and (max-width: 767px) { + .topnav-right { + float: unset; + } + .header { + height: unset; + } div.container { overflow-x: scroll; } @@ -392,6 +451,10 @@ div.description_content { width: 25%; } + div.div1 { + padding-bottom: 0; + margin-bottom: 10px; + } div.div1, div.div2, div.div3 { width: 100%; } @@ -404,6 +467,10 @@ div.description_content { min-height: unset; } + div.div3 { + height: unset; + } + button.calcbutton, button.calcbutton2 { min-height: 30px; } diff --git a/htdocs/takepos/takepos.php b/htdocs/takepos/takepos.php index 0508cecbb9d..0b10b9a2c23 100644 --- a/htdocs/takepos/takepos.php +++ b/htdocs/takepos/takepos.php @@ -54,8 +54,8 @@ $langs->loadLangs(array("bills", "orders", "commercial", "cashdesk", "receiptpri $categorie = new Categorie($db); -$maxcategbydefaultforthisdevice = 16; -$maxproductbydefaultforthisdevice = 32; +$maxcategbydefaultforthisdevice = 12; +$maxproductbydefaultforthisdevice = 24; if ($conf->browser->layout == 'phone') { $maxcategbydefaultforthisdevice = 8; @@ -622,6 +622,10 @@ function DirectPayment(){ }); } +function FullScreen() { + document.documentElement.requestFullscreen(); +} + $( document ).ready(function() { PrintCategories(0); LoadProducts(0); @@ -642,7 +646,35 @@ $( document ).ready(function() { if ($conf->global->TAKEPOS_NUM_TERMINALS != "1" && $_SESSION["takeposterminal"] == "") print '
    '.$langs->trans('TerminalSelect').'
    '; ?>
    -
    + +global->TAKEPOS_HIDE_HEAD_BAR)) { +?> + + + +
    @@ -710,7 +742,9 @@ else $menus[$r++] = array('title'=>'
    '.$langs->trans("Place").'
    ', 'action'=>'Floors();'); } -$menus[$r++] = array('title'=>'
    '.$langs->trans("Customer").'
    ', 'action'=>'Customer();'); +if (! empty($conf->global->TAKEPOS_HIDE_HEAD_BAR)) { + $menus[$r++] = array('title'=>'
    '.$langs->trans("Customer").'
    ', 'action'=>'Customer();'); +} $menus[$r++] = array('title'=>'
    '.$langs->trans("History").'
    ', 'action'=>'History();'); $menus[$r++] = array('title'=>'
    '.$langs->trans("FreeZone").'
    ', 'action'=>'FreeZone();'); $menus[$r++] = array('title'=>'
    '.$langs->trans("Payment").'
    ', 'action'=>'CloseBill();'); @@ -764,7 +798,10 @@ if (!empty($reshook)) { if ($r % 3 == 2) $menus[$r++]=array('title'=>'', 'style'=>'visibility: hidden;'); $menus[$r++]=array('title'=>'
    '.$langs->trans("BackOffice").'
    ', 'action'=>'window.open(\''.(DOL_URL_ROOT ? DOL_URL_ROOT : '/').'\', \'_backoffice\');'); -$menus[$r++]=array('title'=>'
    '.$langs->trans("Logout").'
    ', 'action'=>'window.location.href=\''.DOL_URL_ROOT.'/user/logout.php\';'); + +if (! empty($conf->global->TAKEPOS_HIDE_HEAD_BAR)) { + $menus[$r++]=array('title'=>'
    '.$langs->trans("Logout").'
    ', 'action'=>'window.location.href=\''.DOL_URL_ROOT.'/user/logout.php\';'); +} ?> @@ -783,16 +820,18 @@ $menus[$r++]=array('title'=>'< else echo ''; } - print ''."\n"; - print '
    '; - print ' '; - print ''.img_picto('', 'searchclear').''; - print '
    '; + if (! empty($conf->global->TAKEPOS_HIDE_HEAD_BAR)) { + print ''."\n"; + print '
    '; + print ' '; + print ''.img_picto('', 'searchclear').''; + print '
    '; + } ?>
    -
    +
    From a8656fe6125e6d03d2dbe6444aab0a22b73611f9 Mon Sep 17 00:00:00 2001 From: andreubisquerra Date: Mon, 9 Dec 2019 08:39:11 +0100 Subject: [PATCH 218/230] Travis fix --- htdocs/takepos/takepos.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/takepos/takepos.php b/htdocs/takepos/takepos.php index 0b10b9a2c23..ddd4b7b4f9f 100644 --- a/htdocs/takepos/takepos.php +++ b/htdocs/takepos/takepos.php @@ -670,7 +670,7 @@ if (empty($conf->global->TAKEPOS_HIDE_HEAD_BAR)) {
    - From 37f5922bf84a4c09cfc9815d2fd50782e8658da4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 27 Jan 2020 01:38:50 +0100 Subject: [PATCH 219/230] Fix conflict --- htdocs/takepos/css/pos.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/takepos/css/pos.css b/htdocs/takepos/css/pos.css index 5e32381d0a5..39862f13535 100644 --- a/htdocs/takepos/css/pos.css +++ b/htdocs/takepos/css/pos.css @@ -259,7 +259,7 @@ div.paymentbordline float: left; box-sizing: border-box; padding-top: 0; - padding-bottom: 10px; + padding-bottom: 0; padding-right: 5px; padding-left: 5px; } From 42db2a33eb517ceac808b03508faf6cbc2205b6f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 27 Jan 2020 01:52:35 +0100 Subject: [PATCH 220/230] Fix phpcs --- htdocs/takepos/takepos.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/takepos/takepos.php b/htdocs/takepos/takepos.php index ddd4b7b4f9f..4693ff8b4bf 100644 --- a/htdocs/takepos/takepos.php +++ b/htdocs/takepos/takepos.php @@ -649,7 +649,7 @@ if ($conf->global->TAKEPOS_NUM_TERMINALS != "1" && $_SESSION["takeposterminal"] global->TAKEPOS_HIDE_HEAD_BAR)) { -?> + ?>
    From d4223c3d828d5de9ded05a290e7b54d2d969b75b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 27 Jan 2020 02:06:34 +0100 Subject: [PATCH 221/230] TakePOS can use the same CSS properties than app --- htdocs/takepos/css/{pos.css => pos.css.php} | 62 ++++++++++++++++++++- htdocs/takepos/floors.php | 2 +- htdocs/takepos/freezone.php | 2 +- htdocs/takepos/invoice.php | 2 +- htdocs/takepos/pay.php | 4 +- htdocs/takepos/send.php | 2 +- htdocs/takepos/takepos.php | 2 +- 7 files changed, 68 insertions(+), 8 deletions(-) rename htdocs/takepos/css/{pos.css => pos.css.php} (71%) diff --git a/htdocs/takepos/css/pos.css b/htdocs/takepos/css/pos.css.php similarity index 71% rename from htdocs/takepos/css/pos.css rename to htdocs/takepos/css/pos.css.php index 39862f13535..6d79e829426 100644 --- a/htdocs/takepos/css/pos.css +++ b/htdocs/takepos/css/pos.css.php @@ -1,3 +1,62 @@ + + * 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 FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/theme/eldy/style.css.php + * \brief File for CSS style sheet Eldy + */ + +//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER','1'); // Not disabled because need to load personalized language +//if (! defined('NOREQUIREDB')) define('NOREQUIREDB','1'); // Not disabled to increase speed. Language code is found on url. +if (!defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); +//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); // Not disabled because need to do translations +if (!defined('NOCSRFCHECK')) define('NOCSRFCHECK', 1); +if (!defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', 1); +if (!defined('NOLOGIN')) define('NOLOGIN', 1); // File must be accessed by logon page so without login +//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU',1); // We need top menu content +if (!defined('NOREQUIREHTML')) define('NOREQUIREHTML', 1); +if (!defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); + + +define('ISLOADEDBYSTEELSHEET', '1'); + + +session_cache_limiter('public'); + +require_once __DIR__.'/../../main.inc.php'; // __DIR__ allow this script to be included in custom themes +require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; + +// Define css type +top_httphead('text/css'); +// Important: Following code is to avoid page request by browser and PHP CPU at each Dolibarr page access. +if (empty($dolibarr_nocache)) header('Cache-Control: max-age=10800, public, must-revalidate'); +else header('Cache-Control: no-cache'); + + +require DOL_DOCUMENT_ROOT.'/theme/'.$conf->theme.'/theme_vars.inc.php'; +if (defined('THEME_ONLY_CONSTANT')) return; + +?> + html,body { box-sizing: border-box; padding:0px; @@ -347,7 +406,8 @@ div.description_content { } .topnav{ - background-color: rgb(60,70,100); + background: rgb(); + background-image: linear-gradient(-45deg, , rgb()); overflow: hidden; height: 100%; } diff --git a/htdocs/takepos/floors.php b/htdocs/takepos/floors.php index 7fcd7a5f9d0..01f0a0b4b25 100644 --- a/htdocs/takepos/floors.php +++ b/htdocs/takepos/floors.php @@ -86,7 +86,7 @@ $title='TakePOS - Dolibarr '.DOL_VERSION; if (! empty($conf->global->MAIN_APPLICATION_TITLE)) $title='TakePOS - '.$conf->global->MAIN_APPLICATION_TITLE; top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss); ?> - +