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/146] 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 10c973f38f98e08587f2d7735f584e12ce22ebed Mon Sep 17 00:00:00 2001 From: John Botella Date: Wed, 15 Jan 2020 14:36:44 +0100 Subject: [PATCH 002/146] 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 003/146] 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 004/146] 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 005/146] 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 006/146] 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 007/146] 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 008/146] 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 009/146] 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 010/146] 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 011/146] 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 012/146] 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 5fb15ff0f88e7b45ad586d5f6d489c2a0851a08f Mon Sep 17 00:00:00 2001 From: AdrianDominik Date: Thu, 16 Jan 2020 14:01:41 +0100 Subject: [PATCH 013/146] 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 014/146] 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 015/146] 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 016/146] 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 017/146] 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 018/146] 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 019/146] 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 020/146] 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 021/146] 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 022/146] 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 023/146] 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 024/146] 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 025/146] 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 026/146] 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 027/146] 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 028/146] 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 zck?(gj(`5q`2A3o9`MIVxqe!{RnC^a<++yoit6~W>`<0%22O5F!O91I*64i_A|IRfcBQ@Z5a*0AZ7 zm?_dOlYL0I`rvXEtOFIQ#_>P0M(JoSqMDY+dOV~2Jwcg%Hy~Wl(F%r|zveyBSl)Sz zw1Y37_`Kj0Iq*CFJLHcA`PJPw;)GI^`)L@lP26q};*YU2XF;PR5B_S#BMz;E61!lbA!U?2ypu~t9J7W4J4D-5BQ>~gI0R3-t_DAA zt|EKYRhvBYGQqM@lf#7De82Oq1@|Op2pQt8dGjL5camT1HjMf1Z09>a-6V&(7m1Xu z5EBtxq;2Jy(iBY^Zlpp+07F_ho1X3-u$o2+S5uGe*4Ubvgp-Td}M+)Dh)+t5-6dm z%zWs2Wkt^dfvtE0(`iL`CE$U-W*-D^b1&G6Jm(VFy_)&4sVV}sk)?wd?b*wTVEVJV z(FlxTmM2MU-C!<7c@TB9BD?vP%;h}LeY)s9$$>}zLr~%uQn(N@O?=~2@QWX{dqcQf z(ki|%&QtE}S@L~-=R4_zsgVC#nf9agaAT%Tj@)^3y07WVOs%QtmY}3IN-KlQx-r+$ zcvSM4Q#M`eg+=>rB>+|u-@WooS~R7ZHMywLj*YE3Y&d}!cd)!Dr!`|#=&#fqQt6U_ z2*ABsJtP&vo$JUvlTZ@9o zlNAO*@AXI_WNY{_Lyp_az8ezxN5BfWN48LMA1lGPc0V%9xT2Pv$4ke83z8E;wi25+ z^09DHn2Mv1pMADfMJV&njXLT<%ypJMQNU8tY1QgXy%-v8Fdxcvk_W~gD&;pLg*3{M*t zSTS)LfS(`bXb!+YIvh?IG=7HLU|SQof?4o)`?EwFCThhSAJnei)PU7G{ZNO_1ALv% zBiR#GnC1#ff_UpHs;BafN+7=ls*9f`htq+)ibw04yRILc?{n?z8M=L4DS^&B%@=kL zBN|8*)$KyM1VyYah@e?!{w)YKiEzXM4ZZ!mG8-B~5y!0h`}!)el4v&--06I9i-{A} zDzeENxuc1Np}R#)-@f8q*<>6~66od7W19YWM>jhEBSYs_y}m)Wvy2`#I1GpM%)Dhu z4s#!KSM+X-VmGHfB=({xw1vJNwA=f=!n+QYx*su#(M*!rRmZTxz-Wd$*(plqc3VRW zYU^gM;O#(JE}158(sOVeHkN_|Z2%-t@$z{rM=0^`uc)L{Y-%`kMmCu=KXA1FfLq#c z+YNS5#D%@=1!i17KR|NnDEA>3av$^pLCUBZgI#%uF<{uEKY^9y2(&p?IP4udvXbEK z%qDXySPV*9zm=4Tvr;plHlpT>xkN^WqLQ)Tn&C>vX8NT4IJ)x%y)moIzF4~Z)dZOznR@d$y!E7ex&m~aG>rPSv*FZ z`Zi<_aJ!0n8wBCtsA{ws&Mf~`7ScGM&8{FkQ$R#rVn9cz&leP(0q}|3U92K33CZBH z;p7elrz&~wca7U3>g)E7WsWqM67V9MQg+PJ+4{kRr##U~-~|a&BR=npTJVtyJ~@&) zeZO5GrosFb3sS86m?R*1AdMRFuTOx1q98Md>cX(3$9F<8J`hnFq9P@vS9H0YG34vb zLNrN@I$2%6IpD0H13I-7%x|RayCP8%Vv|Iv3f~@_c{615uQam$TB4mHU?YDD1-ZtI zY4c`u8({<(Qd6yLHh7h^aik3Y?X*6m2! z>amWXs`Hu!)9yG&G)#-P@0%Ok?a<&0W5HPYHc%4Ot$-4B3f%fR@OBsV#P<=#i9AX} zO3-&1hR|H&__$<5SP_w-1)<5M!EyBl^w+hoi)yL-ZA?vuwP4OMRZ-N82FjAKyFbZzXylpir27&xjYavC?69e6eemv*uIe)BI|cG zVlteZ2d1-nAb_|?jW=9{P~S)~wX{=&y%|o}vv$T4D(%>(^Nk`(TBWsj^9McKQW^&* zN`uc0TvBWsjRvAQa}@97;SWURm~yTIYhUf3-kB@@QHd((n>gDAJ1=}MNb-?|%l8od zmmIXdt$cb;K9Oib7fmJoRpMwB-QV23?!gkO3#dzp5CM1Q%^9VbtIKOej1LJ&Eb(7Q z#)IH+oy#yxU8{+)n71{TL$NbR_A`md+PZ#3@H9{1p(NM=(2Zb4C! z_tpFj$j}Khtz9cOH1m!GEUqK{g5lKws}+MW0RdVDxphai41d;zp>n?n*@teS2IK6om+{*d7iOq|lKWD_!dwu9tP)XlJG9Pc3R-IDiD#GSc{ma+<-2?aO zKFCYPDW-f7Om@J>)*Lyr5tyoQ^FGrz!%8jzcPb-uWTiQ%oEWzBA((-twC0+)FyNGWE!l;L)HBgp)_;D)=Oi5 zv!n{cerUaBIPB9tetg%nlcSfQ*FzMg2_g}{S zkqf#oT#+POiH=X>{HY6>fB3d>z1(quW1krblS8O#up+&XJ=?s zF)Lf{8EDWl$<&WNi(Cr^64~g97CS6 zy_vT9so|7@dzMKrx|~E74)6B0R~>7NOz@e zIpIAjHi93Nh{C|>Ku?*}i?iEnzY*{S#N-W0vBypnC*McEYL_EGxS_j&R z2gl|XTq)Bwc2HFRIkjxa?7pOs+&?mG$7=Tj5r=c3w|r+gpK7d3gqye7Tjkb1G>cNO ztoFvpD*u)obBPs`G11Ka6F6-RB5;|FzShT9Gs}!A@*a3PAF&{`i2o#@?BhHN{LHyl z;bC+>ADRo3JLLc+oau$DulqE?(A{761dSBNf9I`^A1(02JsrEPx_@rV+I8lgyA4kL zez&CW$Xr_=Um@cz{-N1`%~6?`A;v(fyRhihOE)!yWpEwkJeZUB1elrg*U8an6|Jxp zlO42Q(JjH;^;-rp*7vq~on3&k`d~bh#%RWd%V_u7H^i!ywX=XpGhTyaBL_X7SD9WR zk!6W9Cf5_Q?Gn!>#Y1nL!q6imDheHcRs2tA8|gH3BjFr0k;t`X!V0esna5I z*!hOI7fWMeBzZ|^s>mcE2|%P|-MYk^xJgv;oWjR-V&7CF0Rq2IUa@SNf@3}SA~Zg4 z8ZhI3!&kjars-vXAojo62BsMXWMx4*W&a(d>@*F6x`&E<$hOpb<~+r4POu~S z_;^x0D&ft+3*gQzvR3HHxs}y2#p}}&MpQz*;W{lC=7|tiNr7}m4CK#vpOv^6ayz*| z(wCoVtdcC~1Tn&F9HQm&LJuHByTJ0yT%zES1$vuGIUP_#$v4w)uFiL^I<}N6U~WL% zDvo4z`sSQ-OvetEyY*z)$9z+$PGE8uKUE}e-*J&(1G4o*)lcii>mjp02IIbSZ75;x zrW=KW_ZrKK547xTEv;7Js&qpdel)|6`; zN-TE7!0um<0C6~D%Odga($kk4TurVYotl2C3&dc%c!-J%W4H)ZwpZsw;njX0=i(zh z-LpuD9Oi!a;cOsF z5v?8}4rs!U3_zp%qlnYIph$=-tmCkRRdo711;7=jgbT?dB=HIe%i5O{S1b<}L#-3l zZ^y2DQr|pHkWZ6Ejh2@3z~`L>Jl}M3?fz_;BB1H$E*b51(CvpGk`TRe70O*SZM2jj z#9Uv_KXJIku-wGfj=-KCKl;6d{Vwkyh{BZAP#oUp17>!3EUlW7FwmpXR8Htf%+?g<~hGzSAEiw{1Z8@n$DXjYlui&6LZR0!#|9>ewe7~{!BUSLKo&$4w{D@!SI+e`p(}e)C&wRh<79R2y*8EnG zVq^e5vbaZ5-j?q;=)C@zLM`qTTy1*S7;I-kGgYUkWl?~$zY>_jS9x!r>ALefke)?O z_&Cx@BU()^H|DDxsmm9vAOwcetLT2E;B)YgO{6yZu4BUI_Al+9LGd9l< zTwI=dMl;5;FW>D*w-DC40Aokl^ z=NyX^#Ggd?Ivn|K2z91;D^LS6(!C3qOYf9@)JdqF zg}k3QT6K3kPVL!~m&H2Jm9UXY45GUS(w@;4FOSO?ue-Qw9t*LN)56^Ue9;)+wI*Y& zuMmMx)kqoV8&2hZyfpJ~Gdxrq%ggZP!DXY+<(|j#+p8_V&NKQNenO9JHPHmZugH#8knDqnJ`|cTK51uj+*z^Xk0|yiU;> z4t6BM2~>81S!b!~^X`aLe(S%sv2vDtR`0hKOODf}D(W5GgD+AFS_({YL~1YtHuI^> zc-DeFYzF*!&p9Cb@qms-(~oV@&DQNz+t%u-7^ep|;RTHY*^RW--Ca9>PiWnnDu>EX za}QqiCU4gaWT;?``nqe4mq$(?vdSVVjS>w zV|eGy{46o3IT}kgX9XU5l@?+$rl;m9L8*!Dy*$puB6_(}oX#xaHAaYC(Ez*M&<=6Z zgis-s>CI5dd0RK7GEdK7rx-M2Fa|};-kh+g-J68hGb%4$Oz$TSy()K{IWbBCi7U1x@4%})#fAHwVLJGC_a(@*D^nBEN zm>1PM*pzldD(p@$a@o-^(N;ThBU~rkK$d(K7a$6PhS*X(N2xATCJhZKt1dM+k<7JX z7joz+yOF4BN6!*A%AiO|Z;4XgIi~-v%FoGonRZnxcb|@9kBNCq9W+wXvIt&#%A7>v zrc#tA0<dJt({uZ*dcn;N8`0&qCjRDmTq^L)72s`>MxRpKvPAf?rOQYl4Eqa z=3;T2uq4|>JFEY;zWJ({cDH6?n~T?GM|rY1E^NqAf>k_FkevGXc?lNdF3|w&sI`95 zjl;ZHPP0FfFmjzEBcgMosgq3u3s5gcl*((sfI}~c`FD*PYAk9v=IeLk7a@ z3HBWe>{xB~&9T^?Wosi>rxZz4cesCGpU%lhkzh8%P3Urnic$qW1`R!NqA z+ua>FvEhT769&TDyeT>a2sfxN?xkHmvZ$!`Rt4*x~b)C*> zmRMDfRPOM)O}1Iph!;)DeDhR$^_-Vb^_|v&d@KIC>ff%mqf_+<*AgGz9Lr<0d{fG! z8a5*dd?DeyGneh#XGuX14Dc!}w0zOD8%qQg4KTq7l2nit@XsBdbeHKi*@E5=KvhJT zkc+qY4+{BOfT4uDF^ntYMqkh_s)z!0< z%RunHS{Oyn2v!7EvjFqK8$oPDry!GF+mj^G6L%1$fpoD1*~SrTRg6H&%K%b5I?X>Q z21G2YOjb_IKm7cxp{Fiuf^n9u0m}P-4y5+`Aj{VqfxW2LZGrzbv+BJCkw=zSBUuYA zD}VbiU$|%`06jh|xVO=~^IOIogh_xn%jdPH@Mmm?1Jt}isC84CKh%%&n5=J27!;)1 zO{z&%%Jemld`d}DIXxjUOx|6!&Z;5!eL7rJ%^V>^4004sqKgFJr3 zUT`z~#t&WV%=(i);z#qhx#o%#B@ki4&D;~x`Su?C57wULZw#vaUycmng)S*k#qrh| z$bbrkyx^>04or2Vdu24-;AwJqD|qEr8v<(Yrfx_!(L zhnZ(RW7+Y<4GDJ7zH@6Rz;V=IpI?8X&sncaECv0t*C~uQN1>4h@Lpy%I2h**4(nRA zZShj|$QAm(qq%=(;6mYiQ&eBZD+!r^wx3p&-y3Hw*>z&dR`NOKeH%fcyK@ij9=>m6 zSd3QAns-Kl1Ww;sXUFq`(<7}HEgJJ>O@*IWO1yaUfVFc^TeL%~EhSl$uUa<-jz?Nw z{{5{6kFGM4a|0@c#9~AQ&*`GzzA+^nOBkc zz_(1pp?wbZV{6I;h8!ORaXZ7-t7ws$C|)r#$00R~M^RvM zdAvD1R!f2Z(Di@X`pU4lnq}+3-F$Rn>d;(=%PuyHU47AaV1C>P_|ZhCSW(qoeTd__9mGc-iW{ zuP-lF(p-@gUG;pV8uQHgjj#HrGRMU%6fwj8)3IyA5b3HJ;ld*S z#n$1k7KlTk6cnQe0JI^Cz0*yw2e;_AXxz0G$zY1bz^F$G*&dMD5BQ76VoXj7+=B*Q z?6ZBsHRwLpfamOl?)_=$>kXVv!5!b>lW`jYCr4-b@o9QOWnsPfMd0xjh$&DNizJxz z1ZMFqB`H*^C1Ko8%(ao@6!?`CxY=?&wLZ#;JK!IGM(aD*JBW$ z4m)zoXi}TEE(P;sd$;K)5GoDtuRM4U3~MMx1Ano+uXL`AGC}CVrkUb65~_Cj?`0)- zhxc3Ju#nx{ny*yOC}lBvXmbX%Z^{VsS&g&PjTr|0FEEMSP`srQ`$3`ZwboKI7(4_R z89a@bu8mX&zR+|%IRltIk@BvNlgM;J%BI3bc!Au2!#jlN7VF7sD)!7ty0l~0e8mRw zz2SYn*|$+G0S2ln6LHXI#u)R;jAhl1YPZO6Cw72}D#M!GOlMDco1=pIFe5!K*NS?a zbb_KaDO9g-$0t*wBB0p(KvM9}Rnt2K|I8lSRc6TdfKVh%pwJhQf%unG$MdWkrsEne zl+9drTvyh$q4|G1g?9%^V|GW%+8b3f(sn3q@EXBA(EvJOWTG-qO`v4Wc=8lE8~5qb ze}s<3PrKY#W4qsOs|Iz)>%i3!3JOc9rg>$mVu@JuQs zw=dze_Xpf4@uN$`K9bq+^P40Tf6meVc8ygzJVuIzLje0@9{8mlN{OSM&q+i8FU7y|rsGUG1*=)fMcLrK*PHiE*%QEZ zhLsazfC~iIQVpuh?A`*m%)`u7q!0>XD-t_tCj=DXZyRAoR0!dM{S`1`M$Tm-bv%RD z5@~%n^|Rf+eeZ#>-)vaypc|5|d~(t!W*N{r^?Cjb&iarBdFFRIzemBa_UjG%XaA(E z$clbgcDLP^(=(Y#$t>1&EV{i>zv&QNJMg0&>P_9c5-@_yg)C-@U>xf4Ec|l{pskbD zxUGN}vF0D{%Um-3TuFo1((hDfT{0cxdfzp!W$PXzvv=YR3Y|{F(Vzvj(sd&VFh5ys z`KV-4pCZ>>>NJRG!?OtR2&amox$vU2ENZEvKpLq!UTdBK`OhvV%{8w3Vy}MoOd@qz zxkmVV9wdNFDlY~1ub*#EaBS%1n;AAT)mE_AYRNV;XWfR$!Sv3*5H=HK&+8m)@5#nbi`615-{qhQqkzRlie|uxPRrp7t>CDzO2rAvN zx^QIPd4Xr&C3XJk(byV7MP6`F=+;)W9s)Pqq{A2p2Y8>qHBe5@sH@ZxqUeJ_IxIWC z7QX&b%0 zIPMk@i-e+&25!Dhh5>2Wy!Aj;^qQ!G4ifksu~NY|xH6j9Ze!k|;R{&GSQZWe7^fM}$>Ll__d?EXLb8cq)yjO=+h?DBs<+dtPeWY4onS zQEY)+4-rFbvGU{qIYc^Q2=390t4g*g8+}=j&>iNW*_gJG8djlfNxRdppcs6Ds2q_muD6s53E_19d57^hV`i>4@$z|r~@E8Ss%&K-7Fwgrp|7F*;JzI|@Myy3| zyxcD(AJK2Dol3$q!^fXUw+7|skH|m^Q1*n>6C?6w1wlt9jcpg9+E|L>cSyU6N5g;{ zs|phS><8rMa-&NGLG#vWIHk8zXMA}l`sr!@dhPJ^+ZqYBeMLSOIFDwPrTy<^q#$)w zC!U7e^h!XuWPN@e!UmZYBjei8((TrRWwSy+KCt`B893^5$*}ympMG8RiIubi=wivE zg#JX+0SfK*r%%uDe&h~a)wywp0EFt>ScLsu4VLlJdxwc+&D}?J^}bR%9qW(D@f(R* zWol!PCHULqzGUXea17S(eP@KXl}}17{Xg*Sxohav@wp(alS7f`vK(SGnYOOz#nzdx zrB!A<%G{DagB!)ktwDMQ%A8qlpjn?Xp+sg~$j0IEtcxdeC`-4Lk70q5K|yOlIiOzFJJXFC z$4Q0M)v)QqkW6X0;dzMSRkt;Km5KC&4dk_Cn4>7_kZ4L7IZ4}kj3nvs0|-pj<3Q8j)_pQzQUBW0i8Y^Su)-Y~sI)9mF>j5(Un2iLNV5?c|bqOSr3O8BSg7Z%dW2B z{LBB@cMYs}$0Jnyg&$b=OSQq9l*~05?Gg}jd%Lq@NEhSHH&httY=s#C9^9?a3(G?Y zAHcwD8fsjuze0bTUrCSd*BB0%5=Q7UlScJE%Jll!&F&=C{S!@*PBf+rjXx@xB7o{E zmoN?6^2nnyhzQzw!XZe-p@`LeGnVqXzQ-_04N>+vUM!{W z_cR;U@-c4H{HD!uBH!J*#ym+4p{R(≠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 029/146] 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 030/146] 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 031/146] 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 032/146] 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 033/146] 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 034/146] 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 035/146] 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 036/146] 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 037/146] 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 038/146] 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 088/146] 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 089/146] 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 090/146] 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 091/146] 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 092/146] 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 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
  • 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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 093/146] 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 094/146] 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 095/146] 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 096/146] 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 097/146] 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 098/146] 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 099/146] 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 100/146] 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 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 108/146] 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 109/146] 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 110/146] 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 111/146] 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 112/146] 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 113/146] 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 114/146] 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 115/146] 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 116/146] 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 117/146] 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 118/146] 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 119/146] 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 120/146] 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 121/146] 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 122/146] 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 123/146] 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 124/146] 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 125/146] 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 126/146] 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 127/146] 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 128/146] 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 129/146] 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 130/146] 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 131/146] 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 132/146] 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 133/146] 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 134/146] 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 135/146] 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 646ccc1354a9b5627146c170a63d2a520e32031c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 23 Jan 2020 11:46:40 +0100 Subject: [PATCH 136/146] 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 137/146] 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 138/146] 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 7ee37ddd3ff7871e6d58b7bc90edaa74a661a78d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 23 Jan 2020 17:30:05 +0100 Subject: [PATCH 139/146] 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 5d4ea0b4c4328679e996fc0d4fd45c4fe664f62a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 23 Jan 2020 19:28:56 +0100 Subject: [PATCH 140/146] 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 $form->textwithpicto($langs->trans("PeriodEndDate"), $langs->trans("LastDayTaxIsRelatedTo")); - print ''; - print ''; - print $form->selectDate(!empty($dateperiod) ? $dateperiod : '-1', 'period', 0, 0, 0, 'charge', 1); - print ''; - print ''; - - // Date due - print ''; - print ''; - print $langs->trans("DateDue"); + print $langs->trans("Date"); print ''; print ''; print $form->selectDate(!empty($dateech) ? $dateech : '-1', 'ech', 0, 0, 0, 'charge', 1); print ''; print "\n"; + // Date end period + print ''; + print ''; + print $form->textwithpicto($langs->trans("PeriodEndDate"), $langs->trans("LastDayTaxIsRelatedTo")); + print ''; + print ''; + print $form->selectDate(!empty($dateperiod) ? $dateperiod : '-1', 'period', 0, 0, 0, 'charge', 1); + print ''; + print ''; + // Amount print ''; 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 141/146] 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 '
    '.$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 142/146] 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 143/146] 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 144/146] 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 145/146] 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 146/146] 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 '
    '.$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 $langs->trans('BankAccount'); @@ -1468,8 +1468,6 @@ else print '
    '; 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)) {