From 1301cd36a1e17cc327234c8b54a6e287fca7124f Mon Sep 17 00:00:00 2001 From: Yannis Hoareau <93135242+YannisHoareau@users.noreply.github.com> Date: Sat, 10 May 2025 02:44:31 +0200 Subject: [PATCH] NEW Subtotal module (#33502) * Changes to follow mvc logic * Reworked admin page and form to add lines * Reworked adding line logic * Adding options when editing subtotal lines * Fix translations * Fixed errors/displays and started pdf * Color for subtotals pdf lines * FIX display of subtotal totht * Added pdf azur for propal * Fix duplicate translation * Added subtotal support for facture pdf * Added subtotal support for commande pdf * Improve UI/translations * Restored old pdf * Info to warn user for unsupported pdf * Added title lines VAT rate and discount support This is meant for future feature wich is block mass changing vat rate and discount percentage * Working on block apply vat and discount * Added buttons for block actions * Handle editing vat and discount for subtotal lines * Editing vat and discount for subtotal lines bloc working * Added possibility to move by block * Updated adding and updating a subtotal line * Improved vat and discount block update * Improvement for block vat/discount and line edition Editing a title line edits the corresponding subtotal line * Improvement for moving by block * Bad tile or st line placement managing * Improved bad title or st line placement managing * Adding subtotal line improved Adding a subtotal line adds it right under its corresponding title * Improved deleting subtotal line Added possibility to choose if you want to delete the corresponding subtotal line when deleting a title line * Preventing too high level titles to be created * Create and update line errors managing * Improved bad title or st line placement managing * Improved st line creation * improve headers * fix bad block placement managing * fix adding st line not working if duplicates titles * fix translations * Fix block update * FIX special chars bug If special char like " ' " was used in title it could be converted to special char entity. * Prepare for pdf options Pdf options like page break befor title should be shown as a picto if activated on a subtotal line on a document * Added option managing * Improved subtotal options and PDF integration * Code refactor * Action name/Error managment/PDF refreshing When adding or updating a subtotal line * Reformat * Reworked subtotal options database managment * Changed access to special code * Remove unecessary call to php trait * Changed definition of subtotals special code constant * Reworked align on PDF * Removed unecessary function and improved error managment * Typo fix and removed treated todos * Post typo changed for to better match subtotals names * Disabled edit if status is not draft * Changed way subtotals options are stored * Added view managing when creating a document form an other * Improved creating document from an other Can check subtotals lines with table head checkbox and removed highlight class for better UI. * Make include of subtotals tpl more clear * Manage centered or justified case If user chose to center or justify, we don't change nothing * Improved pdf * Removed unecessary code block * optimisation * Code sniffer fix * Code sniffer fix * Code sniffer fix * Code sniffer fix * Code sniffer fix and added missing translation * Fix php code sniffer * Reload page when setup saved on subtotals admin page * Fix php code sniffer * pjan fix * phan fix * phan fix * phan fix * phan fix * phan fix * phan fix * phan fix * phan fix * phan fix * phan fix * phan fix * php warning fix * php warning fix * php phan fix * php phan fix * php phan fix * Fix bug admin page not loading because of const not defined * php phan fix * php phan fix * FIX subtotals admin page display * php phan fix * FIX php phan * Fix bugs and langs * Fix bug pdf align * Replace include by require * Add headers to avoid refreshing and adding unwanted lines * Fix phan * Add GETPOST check for security * Fix phan * Fix phan * Fix phan * Subtotal option when creating a document from another * Fix phan * Add field subtotal options for subtotal lines * Fix phan * Fix phan * Fix phan * Update to follow mvc * Fix php phan * Fix php phan * Fix phpstan/phan * Fix phpstan * Fix phpstan * Fix phpstan * Fix phpstan * Fix phpstan * Update to switch to extraparams * Update to switch to extraparams * Retrieve extraparams from db to objectline * Modified last things to switch to extraparams * Cleaning unnecessary code lines * Fix php-stan * Section subtotal in extraparams to differentiate if needed for further devs * Fix phan * Keep extraparams when creating from another object * Change default value to false when creating a subtotal line * Fix clone would not keep extraparams in new object * Fix dark subtotal line background color Fix when a subtotal background color is too dark and edit pencil or delete trash could not be seen * Fix typo * Fix typo * Added subtotals for facturerec * Fix precommit * Added extraparams when creating rec from fac and other way * Fix phan * Fix objectline null * Desactivating block vat / discount update for facturerec * reformating code * Added expeditions for subtotal * Save extraparams for shipping lines * Display of subtotals lines in shipments * Display when creating facture from shipments * Improve display of lines and invoice creation from shipments * Fix error if missing line rang * Deleted duplicate * Added deletion of subtotal line in shipping documents * Not including subtotal lines if there is no product line in between * Update get subtotal lines in shipment docs to disable * Delete possibility to edit subtotal lines in shipments * Handle pdf for shipment * Handle conf stock or shipment supporting services * Fix precommit * Fix duplicate name creating bug * Fix bug where id could be changed by the line id and would create bug * Deleted subtotal lines when STOCK_SUPPORTS_SERVICES is enabled and block would only have service lines * Disable shipments in admin modules Shimpements subtotals lines are only created from commands * Fixing phan and stan * Deleted unused template and phan fix * Fix phan * Fix phan * Fix phan * FIX: phan * Fix template bug If document was not in subtotal scope and would use a template used by subtotal it would create an error. * Fix php-stan * Fix bad display when modules and confs were activated * Fix php codesniffer * Excluding subtotal lines when mass updating * Fix shipments service lines exluded + showing subtotal line with specific configs * Fix line display with situation invoices + bug block line update * Added ODT managment This works with invoices but has not been tested with other documents * Fix bug when editing VAT/discount by block * Fix error raised when subtotal line added Subtotal line had no fk_product and raised the error but we want this line to have no fk product * Fix precommit * Added ODT template for documents that uses subtotals This template can be usefull to understand how to create an odt template using subtotals module * Fix phan * Fix phan * fix: buttons showing in bad document status * clean: unwanted commited files * add: table examples to use with subtotals on ODT templates * fix: Unwanted print of value when creating a document from another * feat: renaming for better understanding * feat: Improved templates for documents related to subtotals --------- Co-authored-by: Marc de Lima Lucio <68746600+marc-dll@users.noreply.github.com> Co-authored-by: Laurent Destailleur --- dev/tools/phan/config.php | 1 + htdocs/admin/subtotals.php | 222 ++++++ htdocs/comm/propal/card.php | 294 ++++++- htdocs/comm/propal/class/propal.class.php | 41 +- htdocs/commande/card.php | 297 +++++++- htdocs/commande/class/commande.class.php | 10 + htdocs/compta/facture/card-rec.php | 201 ++++- htdocs/compta/facture/card.php | 304 +++++++- .../facture/class/facture-rec.class.php | 9 + htdocs/compta/facture/class/facture.class.php | 17 + .../facture/class/factureligne.class.php | 1 - htdocs/core/class/html.form.class.php | 2 +- htdocs/core/lib/sendings.lib.php | 5 +- .../commande/doc/pdf_eratosthene.modules.php | 85 ++- .../expedition/doc/pdf_espadon.modules.php | 102 ++- .../facture/doc/pdf_sponge.modules.php | 87 ++- htdocs/core/modules/modSubtotals.class.php | 168 ++++ .../modules/propale/doc/pdf_cyan.modules.php | 84 +- htdocs/core/tpl/objectline_edit.tpl.php | 5 + htdocs/core/tpl/objectline_view.tpl.php | 5 + htdocs/core/tpl/originproductline.tpl.php | 21 +- htdocs/core/tpl/originsubtotalline.tpl.php | 70 ++ htdocs/core/tpl/subtotal_ajaxrow.tpl.php | 299 ++++++++ htdocs/core/tpl/subtotal_create.tpl.php | 74 ++ htdocs/core/tpl/subtotal_edit.tpl.php | 165 ++++ .../core/tpl/subtotal_expedition_view.tpl.php | 92 +++ htdocs/core/tpl/subtotal_view.tpl.php | 290 +++++++ htdocs/core/tpl/subtotalline_select.tpl.php | 24 + htdocs/expedition/card.php | 89 ++- htdocs/expedition/class/expedition.class.php | 15 +- .../class/expeditionligne.class.php | 16 +- htdocs/expedition/shipment.php | 7 +- .../invoices/template_invoice.odt | Bin 35166 -> 35727 bytes .../doctemplates/orders/template_order.odt | Bin 20174 -> 36038 bytes .../proposals/template_proposal.odt | Bin 28534 -> 35802 bytes .../shipments/template_shipment.odt | Bin 25555 -> 35400 bytes htdocs/langs/en_US/subtotals.lang | 54 ++ .../subtotals/class/commonsubtotal.class.php | 717 ++++++++++++++++++ .../substitutions/functions_subtotals.lib.php | 28 + test/phpunit/CommonClassTest.class.php | 1 + 40 files changed, 3811 insertions(+), 91 deletions(-) create mode 100644 htdocs/admin/subtotals.php create mode 100644 htdocs/core/modules/modSubtotals.class.php create mode 100644 htdocs/core/tpl/originsubtotalline.tpl.php create mode 100644 htdocs/core/tpl/subtotal_ajaxrow.tpl.php create mode 100644 htdocs/core/tpl/subtotal_create.tpl.php create mode 100644 htdocs/core/tpl/subtotal_edit.tpl.php create mode 100644 htdocs/core/tpl/subtotal_expedition_view.tpl.php create mode 100644 htdocs/core/tpl/subtotal_view.tpl.php create mode 100644 htdocs/core/tpl/subtotalline_select.tpl.php create mode 100644 htdocs/langs/en_US/subtotals.lang create mode 100644 htdocs/subtotals/class/commonsubtotal.class.php create mode 100644 htdocs/subtotals/core/substitutions/functions_subtotals.lib.php diff --git a/dev/tools/phan/config.php b/dev/tools/phan/config.php index 9537d29f98d..40c4c0ce814 100644 --- a/dev/tools/phan/config.php +++ b/dev/tools/phan/config.php @@ -161,6 +161,7 @@ $VALID_MODULE_MAPPING = array( 'stock' => 'Stock', 'stocktransfer' => 'StockTransfer', 'stripe' => 'Stripe', + 'subtotals' => 'Subtotals', 'supplier_invoice' => null, // Special case, uses invoice 'supplier_order' => null, // Special case, uses invoice 'supplier_proposal' => 'SupplierProposal', diff --git a/htdocs/admin/subtotals.php b/htdocs/admin/subtotals.php new file mode 100644 index 00000000000..b095df572a6 --- /dev/null +++ b/htdocs/admin/subtotals.php @@ -0,0 +1,222 @@ + + * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2012-2013 Juanjo Menent + * Copyright (C) 2019 Christophe Battarel + * Copyright (C) 2024 Frédéric France + * Copyright (C) 2024 MDW + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/admin/subtotals.php + * \ingroup subtotals + * \brief Activation page for the subtotals module in the other modules + */ + +// Load Dolibarr environment +require '../main.inc.php'; +require_once DOL_DOCUMENT_ROOT . '/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT . '/core/lib/doleditor.lib.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formother.class.php'; + +/** + * @var Conf $conf + * @var DoliDB $db + * @var Form $form + * @var HookManager $hookmanager + * @var Translate $langs + * @var User $user + */ + +// Load translation files required by the page +$langs->loadLangs(array('main', 'admin', 'subtotals', 'errors')); +$action = GETPOST('action', 'aZ09'); + +if (!$user->admin) { + accessforbidden(); +} + +$formother = new FormOther($db); + +// default color const +$default = 'ffffff'; + +// Constant and translation of the module description +$modules = array( + 'PROPAL' => array('lang' => 'propal', 'key' => 'Proposal', 'old_pdf' => '(azur model)'), + 'COMMANDE' => array('lang' => 'orders', 'key' => 'CustomerOrder', 'old_pdf' => '(einstein model)'), + 'FACTURE' => array('lang' => 'bills', 'key' => 'CustomerInvoice', 'old_pdf' => '(crabe model)'), + 'FACTUREREC' => array('lang' => 'bills', 'key' => 'RecurringInvoiceTemplate'), +); +// Conditions for the option to be offered +$conditions = array( + 'PROPAL' => (isModEnabled("propal")), + 'COMMANDE' => (isModEnabled("order")), + 'FACTURE' => (isModEnabled("invoice")), + 'FACTUREREC' => (isModEnabled("invoice")), +); + +$max_depth = 0; + +foreach ($modules as $const => $desc) { + $const_depth = getDolGlobalString('SUBTOTAL_' . $const . '_MAX_DEPTH'); + $max_depth = max($const_depth, $max_depth); +} + +$colors = array(); + +for ($i = 0; $i < $max_depth; $i++) { + $colors['SUBTOTAL_BACK_COLOR_LEVEL_' . ($i + 1)] = array('level' => $i + 1, 'color' => getDolGlobalString('SUBTOTAL_BACK_COLOR_LEVEL_' . ($i + 1), $default)); +} + +/* + * Actions + */ + +if (preg_match('/^SUBTOTAL_.*$/', $action)) { + if (preg_match('/^.*_MAX_DEPTH$/', $action)) { + dolibarr_set_const($db, $action, GETPOSTINT($action), 'int', 0, '', $conf->entity); + header("Location: " . $_SERVER['PHP_SELF']); + setEventMessages($langs->trans("SetupSaved"), null); + exit; + } else { + $value = getDolGlobalInt($action, 0); + $value == 0 ? $value = 1 : $value = 0; + dolibarr_set_const($db, $action, $value, 'chaine', 0, '', $conf->entity); + header("Location: " . $_SERVER['PHP_SELF']); + setEventMessages($langs->trans("SetupSaved"), null); + exit; + } +} + +if ($action == 'update_colors') { + foreach ($colors as $const => $color) { + $color_to_update = GETPOST($const, 'aZ09'); + if ($color_to_update != $color['color']) { + dolibarr_set_const($db, $const, $color_to_update, 'chaine', 0, '', $conf->entity); + } + } + + header("Location: " . $_SERVER["PHP_SELF"]); + exit; +} + + +/* + * View + */ + +llxHeader('', '', '', '', 0, 0, '', '', '', 'mod-admin page-subtotals'); +$linkback = '' . $langs->trans("BackToModuleList") . ''; + +print load_fiche_titre($langs->trans("SubtotalSetup"), $linkback, 'title_setup'); + +if (empty($conf->use_javascript_ajax)) { + setEventMessages(null, array($langs->trans("NotAvailable"), $langs->trans("JavascriptDisabled")), 'errors'); +} else { + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print "\n"; + + // Modules + foreach ($modules as $const => $desc) { + // If this condition is not met, the option is not offered + if (!$conditions[$const]) { + continue; + } + + $langs->load($desc['lang']); + + $constante_title = 'SUBTOTAL_TITLE_' . $const; + $constante_subtotal = 'SUBTOTAL_' . $const; + print '' . "\n"; + print ''; + print ''; + + print ''; + + print ''; + + print ''; + + print ''; + } + + print '
' . $langs->trans("Settings") . '' . $langs->trans("Title") . '' . $langs->trans("Subtotal") . '' . $langs->trans("MaxSubtotalLevel") . '
'; + if (isset($desc['old_pdf'])) { + print $form->textwithpicto($langs->trans($desc['key']), $langs->trans("NotSupportedByAllPDF", $desc['old_pdf'])); + } else { + print $langs->trans($desc['key']); + } + print ''; + $value_title = getDolGlobalInt($constante_title, 0); + print ''; + print $value_title == 0 ? img_picto($langs->trans("Disabled"), 'switch_off') : img_picto($langs->trans("Enabled"), 'switch_on') . ''; + print ''; + $value_subtotal = getDolGlobalInt($constante_subtotal, 0); + print ''; + print $value_subtotal == 0 ? img_picto($langs->trans("Disabled"), 'switch_off') : img_picto($langs->trans("Enabled"), 'switch_on') . ''; + print ''; + $can_modify = !($value_subtotal == 0 && $value_title == 0); + print '
'; + print ''; + print ''; + print ''; + print $can_modify ? '' : ''; + print '
'; + print '
'; + + // Other options + + print '
'; + print ''; + print ''; + + print ''; + print ''; + print ''; + print ''; + print "\n"; + + foreach ($colors as $key => $value) { + print ''; + print ''; + print ''; + print ''; + } + + print '
' . $langs->trans("Other") . '
' . $langs->trans("SubtotalLineBackColor", $value['level']) . ''; + print $formother->selectColor(colorArrayToHex(colorStringToArray($value['color'], array()), $default), $key, '', 1, array(), '', '', $default) . ' '; + print '   ' . $langs->trans("Default") . ': ' . $default . ''; + print $form->textwithpicto('', $langs->trans("NotSupportedByAllThemes") . ', ' . $langs->trans("PressF5AfterChangingThis")); + print '
' . "\n"; +} + +print '
'; +print ''; +print ''; +print '
'; + +// End of page +llxFooter(); +$db->close(); diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index 8ff2fc5133c..050fe09f444 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -323,6 +323,41 @@ if (empty($reshook)) { header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id); exit(); + } elseif ($action == 'confirm_delete_subtotalline' && $confirm == 'yes' && $usercancreate) { + // Delete line + $object->fetch($id); + $object->fetch_thirdparty(); + + $result = $object->deleteSubtotalLine($langs, GETPOSTINT('lineid'), (bool) GETPOST('deletecorrespondingsubtotalline')); + if ($result > 0) { + // reorder lines + $object->line_order(true); + // Define output language + $outputlangs = $langs; + $newlang = ''; + if (getDolGlobalInt('MAIN_MULTILANGS') /* && empty($newlang) */ && GETPOST('lang_id')) { + $newlang = GETPOST('lang_id'); + } + if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) { + $newlang = $object->thirdparty->default_lang; + } + if (!empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + $outputlangs->load('products'); + } + if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) { + $ret = $object->fetch($id); // Reload to get new records + $result = $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + if ($result >= 0) { + header('Location: '.$_SERVER["PHP_SELF"].'?id='.$id); + exit(); + } + } else { + setEventMessages($object->error, $object->errors, 'errors'); + $action = ''; + } } elseif ($action == 'confirm_validate' && $confirm == 'yes' && $usercanvalidate) { // Validation $idwarehouse = GETPOSTINT('idwarehouse'); @@ -934,6 +969,12 @@ if (empty($reshook)) { setEventMessages($langs->trans('ErrorsOnXLines', $error), null, 'errors'); } } + } elseif ($action == 'addline' && GETPOST('updateallvatlinesblock', 'alpha') && GETPOST('vatforblocklines', 'alpha') !== '' && $usercancreate) { + $tx_tva = GETPOST('vatforblocklines') ? GETPOST('vatforblocklines') : 0; + $object->updateSubtotalLineBlockLines($langs, $object->getRangOfLine($lineid), 'tva', $tx_tva); + } elseif ($action == 'addline' && GETPOST('updatealldiscountlinesblock', 'alpha') && GETPOST('discountforblocklines', 'alpha') !== '' && $usercancreate) { + $discount = GETPOST('discountforblocklines') ? GETPOST('discountforblocklines') : 0; + $object->updateSubtotalLineBlockLines($langs, $object->getRangOfLine($lineid), 'discount', $discount); } include DOL_DOCUMENT_ROOT.'/core/actions_printing.inc.php'; @@ -981,6 +1022,9 @@ if (empty($reshook)) { $alldate_start = dol_mktime(GETPOSTINT('alldate_starthour'), GETPOSTINT('alldate_startmin'), 0, GETPOSTINT('alldate_startmonth'), GETPOSTINT('alldate_startday'), GETPOSTINT('alldate_startyear')); $alldate_end = dol_mktime(GETPOSTINT('alldate_endhour'), GETPOSTINT('alldate_endmin'), 0, GETPOSTINT('alldate_endmonth'), GETPOSTINT('alldate_endday'), GETPOSTINT('alldate_endyear')); foreach ($object->lines as $key => $line) { + if ($line->special_code == SUBTOTALS_SPECIAL_CODE) { + continue; + } if ($line->product_type == 1) { // only service line $result = $object->updateline($line->id, $line->subprice, $line->qty, $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, $line->desc, 'HT', $line->info_bits, $line->special_code, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $alldate_start, $alldate_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice); $object->lines[$key] = $object->line; @@ -993,6 +1037,9 @@ if (empty($reshook)) { $localtax1_rate = get_localtax($vat_rate, 1, $object->thirdparty, $mysoc); $localtax2_rate = get_localtax($vat_rate, 2, $object->thirdparty, $mysoc); foreach ($object->lines as $key => $line) { + if ($line->special_code == SUBTOTALS_SPECIAL_CODE) { + continue; + } $result = $object->updateline($line->id, $line->subprice, $line->qty, $line->remise_percent, $vat_rate, $localtax1_rate, $localtax2_rate, $line->desc, 'HT', $line->info_bits, $line->special_code, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice); $object->lines[$key] = $object->line; } @@ -1001,6 +1048,9 @@ if (empty($reshook)) { $remise_percent = (GETPOST('remiseforalllines') ? GETPOST('remiseforalllines') : 0); $remise_percent = str_replace('*', '', $remise_percent); foreach ($object->lines as $key => $line) { + if ($line->special_code == SUBTOTALS_SPECIAL_CODE) { + continue; + } $tvatx = $line->tva_tx; if (!empty($line->vat_src_code)) { $tvatx .= ' ('.$line->vat_src_code.')'; @@ -1012,6 +1062,9 @@ if (empty($reshook)) { // Define margin $margin_rate = (GETPOST('marginforalllines', 'alpha') ? GETPOST('marginforalllines', 'alpha') : 0); foreach ($object->lines as $key => $line) { + if ($line->special_code == SUBTOTALS_SPECIAL_CODE) { + continue; + } $subprice = price2num($line->pa_ht * (1 + $margin_rate / 100), 'MU'); $prod = new Product($db); $prod->fetch($line->fk_product); @@ -1044,6 +1097,104 @@ if (empty($reshook)) { // $line->subprice = (float) $subprice; // $line->multicurrency_subprice = $multicurrency_subprice; } + } elseif ($action == 'confirm_addtitleline' && $usercancreate) { + // Handling adding a new title line for subtotals module + + $langs->load('subtotals'); + + $desc = GETPOST('subtotallinedesc', 'alphanohtml'); + $depth = GETPOSTINT('subtotallinelevel') ?? 1; + + $subtotal_options = array(); + + foreach (Propal::$TITLE_OPTIONS as $option) { + $value = GETPOST($option, 'alphanohtml'); + if ($value) { + $subtotal_options[$option] = $value == 'on' ? 1 : $value; + } + } + + // Insert line + $result = $object->addSubtotalLine($langs, $desc, (int) $depth, $subtotal_options); + + if ($result >= 0) { + if ($result == 0) { + setEventMessages($object->error, $object->errors, 'warnings'); + } + $ret = $object->fetch($object->id); // Reload to get new records + $object->fetch_thirdparty(); + + if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) { + // Define output language + $outputlangs = $langs; + $newlang = GETPOST('lang_id', 'alpha'); + if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) { + $newlang = $object->thirdparty->default_lang; + } + if (!empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + + $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } else { + setEventMessages($object->error, $object->errors, 'errors'); + } + header('Location: '.$_SERVER["PHP_SELF"].'?id='.$id); + exit(); + } elseif ($action == 'confirm_addsubtotalline' && $usercancreate) { + // Handling adding a new subtotal line for subtotals module + + $langs->load('subtotals'); + + $choosen_line = GETPOST('subtotaltitleline', 'alphanohtml'); + foreach ($object->lines as $line) { + if ($line->desc == $choosen_line && $line->special_code == SUBTOTALS_SPECIAL_CODE) { + $desc = $line->desc; + $depth = -$line->qty; + } + } + + $subtotal_options = array(); + + foreach (Propal::$SUBTOTAL_OPTIONS as $option) { + $value = GETPOST($option, 'alphanohtml'); + if ($value) { + $subtotal_options[$option] = $value == 'on' ? 1 : $value; + } + } + + // Insert line + if (isset($desc) && isset($depth)) { + $result = $object->addSubtotalLine($langs, $desc, (int) $depth, $subtotal_options); + } else { + $object->errors[] = $langs->trans("CorrespondingTitleNotFound"); + } + + if (isset($result) && $result >= 0) { + $ret = $object->fetch($object->id); // Reload to get new records + $object->fetch_thirdparty(); + + if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) { + // Define output language + $outputlangs = $langs; + $newlang = GETPOST('lang_id', 'alpha'); + if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) { + $newlang = $object->thirdparty->default_lang; + } + if (!empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + + $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } else { + setEventMessages($object->error, $object->errors, 'errors'); + } + header('Location: '.$_SERVER["PHP_SELF"].'?id='.$id); + exit(); } elseif ( $action == 'addline' && !GETPOST('submitforalllines', 'alpha') && !GETPOST('submitforallmargins', 'alpha') && !GETPOST('markforalllines', 'alpha') && $usercancreate) { // Add line @@ -1553,6 +1704,9 @@ if (empty($reshook)) { $margin_rate = GETPOSTISSET('marginforalllines') ? GETPOST('marginforalllines', 'int') : ''; $mark_rate = GETPOSTISSET('markforalllines') ? GETPOST('markforalllines', 'int') : ''; foreach ($object->lines as &$line) if ($line->subprice > 0) { + if ($line->special_code == SUBTOTALS_SPECIAL_CODE) { + continue; + } $subprice_multicurrency = $line->subprice; if (is_numeric($margin_rate) && $margin_rate > 0) { $line->subprice = floatval(price2num(floatval($line->pa_ht) * (1 + floatval($margin_rate) / 100), 'MU')); @@ -1600,6 +1754,91 @@ if (empty($reshook)) { setEventMessages($object->error, $object->errors, 'errors'); } } + } elseif ($action == 'updatetitleline' && GETPOSTISSET("save") && $usercancreate && !GETPOST('cancel', 'alpha')) { + // Handling updating a title line for subtotals module + + $langs->load('subtotals'); + + $desc = GETPOST('line_desc', 'alphanohtml') ?? $langs->trans("Title"); + $depth = GETPOSTINT('line_depth') ?? 1; + + $subtotal_options = array(); + + foreach (Propal::$TITLE_OPTIONS as $option) { + $value = GETPOST($option, 'alphanohtml'); + if ($value) { + $subtotal_options[$option] = $value == 'on' ? 1 : $value; + } + } + + // Update line + $result = $object->updateSubtotalLine($langs, GETPOSTINT('lineid'), $desc, $depth, $subtotal_options); + + if ($result >= 0) { + if ($result == 0) { + setEventMessages($object->error, $object->errors, 'warnings'); + } + $ret = $object->fetch($object->id); // Reload to get new records + $object->fetch_thirdparty(); + + if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) { + // Define output language + $outputlangs = $langs; + $newlang = GETPOST('lang_id', 'alpha'); + if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) { + $newlang = $object->thirdparty->default_lang; + } + if (!empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + + $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } else { + setEventMessages($object->error, $object->errors, 'errors'); + } + } elseif ($action == 'updatesubtotalline' && GETPOSTISSET("save") && $usercancreate && !GETPOST('cancel', 'alpha')) { + // Handling updating a subtotal line for subtotals module + + $langs->load('subtotals'); + + $desc = GETPOST('line_desc', 'alphanohtml'); + $depth = GETPOSTINT('line_depth'); + + $subtotal_options = array(); + + foreach (Propal::$SUBTOTAL_OPTIONS as $option) { + $value = GETPOST($option, 'alphanohtml'); + if ($value) { + $subtotal_options[$option] = $value == 'on' ? 1 : $value; + } + } + + // Update line + $result = $object->updateSubtotalLine($langs, GETPOSTINT('lineid'), $desc, $depth, $subtotal_options); + + if ($result > 0) { + $ret = $object->fetch($object->id); // Reload to get new records + $object->fetch_thirdparty(); + + if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) { + // Define output language + $outputlangs = $langs; + $newlang = GETPOST('lang_id', 'alpha'); + if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) { + $newlang = $object->thirdparty->default_lang; + } + if (!empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + + $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } else { + setEventMessages($object->error, $object->errors, 'errors'); + } } elseif ($action == 'updateline' && $usercancreate && GETPOST('save')) { // Update a line within proposal @@ -2466,6 +2705,19 @@ if ($action == 'create') { $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmClonePropal', $object->ref), 'confirm_clone', $formquestion, 'yes', 1, 250, 600); } + // Subtotal line form + if ($action == 'add_title_line') { + $langs->load('subtotals'); + $type = 'title'; + $depth_array = $object->getPossibleLevels($langs); + require dol_buildpath('/core/tpl/subtotal_create.tpl.php'); + } elseif ($action == 'add_subtotal_line') { + $langs->load('subtotals'); + $type = 'subtotal'; + $titles = $object->getPossibleTitles(); + require dol_buildpath('/core/tpl/subtotal_create.tpl.php'); + } + if ($action == 'closeas') { //Form to close proposal (signed or not) $formquestion = array(); @@ -2630,6 +2882,17 @@ if ($action == 'create') { } elseif ($action == 'ask_deleteline') { // Confirmation delete product/service line $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$lineid, $langs->trans('DeleteProductLine'), $langs->trans('ConfirmDeleteProductLine'), 'confirm_deleteline', '', 0, 1); + } elseif ($action == 'ask_subtotal_deleteline') { + // Confirmation de la suppression d'une ligne subtotal + $langs->load("subtotals"); + $title = "DeleteSubtotalLine"; + $question = "ConfirmDeleteSubtotalLine"; + if (GETPOST('type') == 'title') { + $formconfirm = array(array('type' => 'checkbox', 'name' => 'deletecorrespondingsubtotalline', 'label' => $langs->trans("DeleteCorrespondingSubtotalLine"), 'value' => 0)); + $title = "DeleteTitleLine"; + $question = "ConfirmDeleteTitleLine"; + } + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$lineid, $langs->trans($title), $langs->trans($question), 'confirm_delete_subtotalline', $formconfirm, 'no', 1); } elseif ($action == 'validate') { // Confirm validate proposal $error = 0; @@ -3134,7 +3397,11 @@ if ($action == 'create') { '; if (!empty($conf->use_javascript_ajax) && $object->status == Propal::STATUS_DRAFT) { - include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php'; + if (isModEnabled('subtotals')) { + include DOL_DOCUMENT_ROOT.'/core/tpl/subtotal_ajaxrow.tpl.php'; + } else { + include DOL_DOCUMENT_ROOT . '/core/tpl/ajaxrow.tpl.php'; + } } print '
'; @@ -3187,6 +3454,31 @@ if ($action == 'create') { // modified by hook if (empty($reshook)) { if ($action != 'editline') { + // Subtotal + if ($object->status == Propal::STATUS_DRAFT && isModEnabled('subtotals') && getDolGlobalString('SUBTOTAL_TITLE_'.strtoupper($object->element))) { + $langs->load('subtotals'); + + $url_button = array(); + + $url_button[] = array( + 'lang' => 'subtotals', + 'enabled' => (isModEnabled('propal') && $object->status == Propal::STATUS_DRAFT), + 'perm' => (bool) $usercancreate, + 'label' => $langs->trans('AddTitleLine'), + 'url' => '/comm/propal/card.php?id='.$object->id.'&action=add_title_line&token='.newToken() + ); + + $url_button[] = array( + 'lang' => 'subtotals', + 'enabled' => (isModEnabled('propal') && $object->status == Propal::STATUS_DRAFT), + 'perm' => (bool) $usercancreate, + 'label' => $langs->trans('AddSubtotalLine'), + 'url' => '/comm/propal/card.php?id='.$object->id.'&action=add_subtotal_line&token='.newToken() + ); + + print dolGetButtonAction('', $langs->trans('Subtotal'), 'default', $url_button, '', true); + } + // Validate if (($object->status == Propal::STATUS_DRAFT && $object->total_ttc >= 0 && count($object->lines) > 0) || ($object->status == Propal::STATUS_DRAFT && getDolGlobalString('PROPAL_ENABLE_NEGATIVE') && count($object->lines) > 0)) { diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index dc0ac1cfd98..35c1732460e 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -47,13 +47,14 @@ require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; require_once DOL_DOCUMENT_ROOT.'/margin/lib/margins.lib.php'; require_once DOL_DOCUMENT_ROOT.'/multicurrency/class/multicurrency.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/commonincoterm.class.php'; +require_once DOL_DOCUMENT_ROOT.'/subtotals/class/commonsubtotal.class.php'; /** * Class to manage proposals */ class Propal extends CommonObject { - use CommonIncoterm; + use CommonIncoterm, CommonSubtotal; /** * @var string code @@ -632,8 +633,35 @@ class Propal extends CommonObject * @return int >0 if OK, <0 if KO * @see add_product() */ - public function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1 = 0.0, $txlocaltax2 = 0.0, $fk_product = 0, $remise_percent = 0.0, $price_base_type = 'HT', $pu_ttc = 0.0, $info_bits = 0, $type = 0, $rang = -1, $special_code = 0, $fk_parent_line = 0, $fk_fournprice = 0, $pa_ht = 0, $label = '', $date_start = '', $date_end = '', $array_options = array(), $fk_unit = null, $origin = '', $origin_id = 0, $pu_ht_devise = 0, $fk_remise_except = 0, $noupdateafterinsertline = 0) - { + public function addline( + $desc, + $pu_ht, + $qty, + $txtva, + $txlocaltax1 = 0.0, + $txlocaltax2 = 0.0, + $fk_product = 0, + $remise_percent = 0.0, + $price_base_type = 'HT', + $pu_ttc = 0.0, + $info_bits = 0, + $type = 0, + $rang = -1, + $special_code = 0, + $fk_parent_line = 0, + $fk_fournprice = 0, + $pa_ht = 0, + $label = '', + $date_start = '', + $date_end = '', + $array_options = array(), + $fk_unit = null, + $origin = '', + $origin_id = 0, + $pu_ht_devise = 0, + $fk_remise_except = 0, + $noupdateafterinsertline = 0 + ) { global $mysoc, $langs; dol_syslog(get_class($this)."::addline propalid=$this->id, desc=$desc, pu_ht=$pu_ht, qty=$qty, txtva=$txtva, fk_product=$fk_product, remise_except=$remise_percent, price_base_type=$price_base_type, pu_ttc=$pu_ttc, info_bits=$info_bits, type=$type, fk_remise_except=".$fk_remise_except); @@ -841,6 +869,13 @@ class Propal extends CommonObject } $this->lines[] = $this->line; + } else { + foreach ($this->lines as $line) { + if ($line->id == $origin_id) { + $this->line->extraparams = $line->extraparams; + $this->line->setExtraParameters(); + } + } } // Update denormalized fields at the order level diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index a19b942a2e5..83e125ee445 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -307,6 +307,34 @@ if (empty($reshook)) { $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref); } + header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id); + exit; + } else { + setEventMessages($object->error, $object->errors, 'errors'); + } + } elseif ($action == 'confirm_delete_subtotalline' && $confirm == 'yes' && $usercancreate) { + $result = $object->deleteSubtotalLine($langs, GETPOSTINT('lineid'), (bool) GETPOST('deletecorrespondingsubtotalline'), $user); + if ($result > 0) { + // reorder lines + $object->line_order(true); + // Define output language + $outputlangs = $langs; + $newlang = ''; + if (getDolGlobalInt('MAIN_MULTILANGS') /* && empty($newlang) */ && GETPOST('lang_id', 'aZ09')) { + $newlang = GETPOST('lang_id', 'aZ09'); + } + if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) { + $newlang = $object->thirdparty->default_lang; + } + if (!empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) { + $ret = $object->fetch($object->id); // Reload to get new records + $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id); exit; } else { @@ -490,7 +518,10 @@ if (empty($reshook)) { $array_options, $lines[$i]->fk_unit, $object->origin, - $lines[$i]->rowid + $lines[$i]->rowid, + 0, + $lines[$i]->ref_ext, + 0 ); if ($result < 0) { @@ -498,6 +529,13 @@ if (empty($reshook)) { break; } + foreach ($object->lines as $line) { + if ($line->id == $result) { + $line->extraparams = $lines[$i]->extraparams; + $line->setExtraParameters(); + } + } + // Defined the new fk_parent_line if ($result > 0 && $lines[$i]->product_type == 9) { $fk_parent_line = $result; @@ -708,11 +746,20 @@ if (empty($reshook)) { if ($result < 0) { setEventMessages($object->error, $object->errors, 'errors'); } + } elseif ($action == 'addline' && GETPOST('updateallvatlinesblock', 'alpha') && GETPOST('vatforblocklines', 'alpha') !== '' && $usercancreate) { + $tx_tva = GETPOST('vatforblocklines') ? GETPOST('vatforblocklines') : 0; + $object->updateSubtotalLineBlockLines($langs, $object->getRangOfLine($lineid), 'tva', $tx_tva); + } elseif ($action == 'addline' && GETPOST('updatealldiscountlinesblock', 'alpha') && GETPOST('discountforblocklines', 'alpha') !== '' && $usercancreate) { + $discount = GETPOST('discountforblocklines') ? GETPOST('discountforblocklines') : 0; + $object->updateSubtotalLineBlockLines($langs, $object->getRangOfLine($lineid), 'discount', $discount); } elseif ($action == 'addline' && GETPOST('submitforalllines', 'aZ09') && (GETPOST('alldate_start', 'alpha') || GETPOST('alldate_end', 'alpha')) && $usercancreate) { // Define date start and date end for all line $alldate_start = dol_mktime(GETPOSTINT('alldate_starthour'), GETPOSTINT('alldate_startmin'), 0, GETPOSTINT('alldate_startmonth'), GETPOSTINT('alldate_startday'), GETPOSTINT('alldate_startyear')); $alldate_end = dol_mktime(GETPOSTINT('alldate_endhour'), GETPOSTINT('alldate_endmin'), 0, GETPOSTINT('alldate_endmonth'), GETPOSTINT('alldate_endday'), GETPOSTINT('alldate_endyear')); foreach ($object->lines as $line) { + if ($line->special_code == SUBTOTALS_SPECIAL_CODE) { + continue; + } if ($line->product_type == 1) { // only service line $result = $object->updateline($line->id, $line->desc, $line->subprice, $line->qty, $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, 'HT', $line->info_bits, $alldate_start, $alldate_end, $line->product_type, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->special_code, $line->array_options, $line->fk_unit, $line->multicurrency_subprice); } @@ -724,6 +771,9 @@ if (empty($reshook)) { $localtax1_rate = get_localtax($vat_rate, 1, $object->thirdparty, $mysoc); $localtax2_rate = get_localtax($vat_rate, 2, $object->thirdparty, $mysoc); foreach ($object->lines as $line) { + if ($line->special_code == SUBTOTALS_SPECIAL_CODE) { + continue; + } $result = $object->updateline($line->id, $line->desc, $line->subprice, $line->qty, $line->remise_percent, (float) $vat_rate, $localtax1_rate, $localtax2_rate, 'HT', $line->info_bits, $line->date_start, $line->date_end, $line->product_type, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->special_code, $line->array_options, $line->fk_unit, $line->multicurrency_subprice); } } elseif ($action == 'addline' && GETPOST('submitforalllines', 'alpha') && GETPOST('remiseforalllines', 'alpha') !== '' && $usercancreate) { @@ -731,6 +781,9 @@ if (empty($reshook)) { $remise_percent = (GETPOST('remiseforalllines') ? GETPOST('remiseforalllines') : 0); $remise_percent = str_replace('*', '', $remise_percent); foreach ($object->lines as $line) { + if ($line->special_code == SUBTOTALS_SPECIAL_CODE) { + continue; + } $tvatx = $line->tva_tx; if (!empty($line->vat_src_code)) { $tvatx .= ' ('.$line->vat_src_code.')'; @@ -745,6 +798,9 @@ if (empty($reshook)) { $margin_rate = GETPOSTISSET('marginforalllines') ? GETPOST('marginforalllines', 'int') : ''; $mark_rate = GETPOSTISSET('markforalllines') ? GETPOST('markforalllines', 'int') : ''; foreach ($object->lines as &$line) if ($line->subprice > 0) { + if ($line->special_code == SUBTOTALS_SPECIAL_CODE) { + continue; + } $subprice_multicurrency = $line->subprice; if (is_numeric($margin_rate) && $margin_rate > 0) { $line->subprice = floatval(price2num(floatval($line->pa_ht) * (1 + floatval($margin_rate) / 100), 'MU')); @@ -791,6 +847,104 @@ if (empty($reshook)) { setEventMessages($object->error, $object->errors, 'errors'); } } + } elseif ($action == 'confirm_addtitleline' && $usercancreate) { + // Handling adding a new title line for subtotals module + + $langs->load('subtotals'); + + $desc = GETPOST('subtotallinedesc', 'alphanohtml'); + $depth = GETPOSTINT('subtotallinelevel') ?? 1; + + $subtotal_options = array(); + + foreach (Commande::$TITLE_OPTIONS as $option) { + $value = GETPOST($option, 'alphanohtml'); + if ($value) { + $subtotal_options[$option] = $value == 'on' ? 1 : $value; + } + } + + // Insert line + $result = $object->addSubtotalLine($langs, $desc, (int) $depth, $subtotal_options); + + if ($result >= 0) { + if ($result == 0) { + setEventMessages($object->error, $object->errors, 'warnings'); + } + $ret = $object->fetch($object->id); // Reload to get new records + $object->fetch_thirdparty(); + + if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) { + // Define output language + $outputlangs = $langs; + $newlang = GETPOST('lang_id', 'alpha'); + if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) { + $newlang = $object->thirdparty->default_lang; + } + if (!empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + + $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } else { + setEventMessages($object->error, $object->errors, 'errors'); + } + header('Location: '.$_SERVER["PHP_SELF"].'?id='.$id); + exit(); + } elseif ($action == 'confirm_addsubtotalline' && $usercancreate) { + // Handling adding a new subtotal line for subtotals module + + $langs->load('subtotals'); + + $choosen_line = GETPOST('subtotaltitleline', 'alphanohtml'); + foreach ($object->lines as $line) { + if ($line->desc == $choosen_line && $line->special_code == SUBTOTALS_SPECIAL_CODE) { + $desc = $line->desc; + $depth = -$line->qty; + } + } + + $subtotal_options = array(); + + foreach (Commande::$SUBTOTAL_OPTIONS as $option) { + $value = GETPOST($option, 'alphanohtml'); + if ($value) { + $subtotal_options[$option] = $value == 'on' ? 1 : $value; + } + } + + // Insert line + if (isset($desc) && isset($depth)) { + $result = $object->addSubtotalLine($langs, $desc, (int) $depth, $subtotal_options); + } else { + $object->errors[] = $langs->trans("CorrespondingTitleNotFound"); + } + + if (isset($result) && $result >= 0) { + $ret = $object->fetch($object->id); // Reload to get new records + $object->fetch_thirdparty(); + + if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) { + // Define output language + $outputlangs = $langs; + $newlang = GETPOST('lang_id', 'alpha'); + if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) { + $newlang = $object->thirdparty->default_lang; + } + if (!empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + + $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } else { + setEventMessages($object->error, $object->errors, 'errors'); + } + header('Location: '.$_SERVER["PHP_SELF"].'?id='.$id); + exit(); } elseif ($action == 'addline' && !GETPOST('submitforalllines', 'alpha') && $usercancreate) { // Add a new line $langs->load('errors'); $error = 0; @@ -1296,6 +1450,91 @@ if (empty($reshook)) { } } } + } elseif ($action == 'updatetitleline' && GETPOSTISSET("save") && $usercancreate && !GETPOST('cancel', 'alpha')) { + // Handling updating a title line for subtotals module + + $langs->load('subtotals'); + + $desc = GETPOST('line_desc', 'alphanohtml') ?? $langs->trans("Title"); + $depth = GETPOSTINT('line_depth') ?? 1; + + $subtotal_options = array(); + + foreach (Commande::$TITLE_OPTIONS as $option) { + $value = GETPOST($option, 'alphanohtml'); + if ($value) { + $subtotal_options[$option] = $value == 'on' ? 1 : $value; + } + } + + // Update line + $result = $object->updateSubtotalLine($langs, GETPOSTINT('lineid'), $desc, $depth, $subtotal_options); + + if ($result >= 0) { + if ($result == 0) { + setEventMessages($object->error, $object->errors, 'warnings'); + } + $ret = $object->fetch($object->id); // Reload to get new records + $object->fetch_thirdparty(); + + if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) { + // Define output language + $outputlangs = $langs; + $newlang = GETPOST('lang_id', 'alpha'); + if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) { + $newlang = $object->thirdparty->default_lang; + } + if (!empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + + $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } else { + setEventMessages($object->error, $object->errors, 'errors'); + } + } elseif ($action == 'updatesubtotalline' && GETPOSTISSET("save") && $usercancreate && !GETPOST('cancel', 'alpha')) { + // Handling updating a subtotal line for subtotals module + + $langs->load('subtotals'); + + $desc = GETPOST('line_desc', 'alphanohtml'); + $depth = GETPOSTINT('line_depth'); + + $subtotal_options = array(); + + foreach (Commande::$SUBTOTAL_OPTIONS as $option) { + $value = GETPOST($option, 'alphanohtml'); + if ($value) { + $subtotal_options[$option] = $value == 'on' ? 1 : $value; + } + } + + // Update line + $result = $object->updateSubtotalLine($langs, GETPOSTINT('lineid'), $desc, $depth, $subtotal_options); + + if ($result > 0) { + $ret = $object->fetch($object->id); // Reload to get new records + $object->fetch_thirdparty(); + + if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) { + // Define output language + $outputlangs = $langs; + $newlang = GETPOST('lang_id', 'alpha'); + if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) { + $newlang = $object->thirdparty->default_lang; + } + if (!empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + + $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } else { + setEventMessages($object->error, $object->errors, 'errors'); + } } elseif ($action == 'updateline' && $usercancreate && GETPOST('save')) { // Update a line // Clean parameters @@ -2630,6 +2869,19 @@ if ($action == 'create' && $usercancreate) { $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$lineid, $langs->trans('DeleteProductLine'), $langs->trans('ConfirmDeleteProductLine'), 'confirm_deleteline', '', 0, 1); } + // Confirmation de la suppression d'une ligne subtotal + if ($action == 'ask_subtotal_deleteline') { + $langs->load("subtotals"); + $title = "DeleteSubtotalLine"; + $question = "ConfirmDeleteSubtotalLine"; + if (GETPOST('type') == 'title') { + $formconfirm = array(array('type' => 'checkbox', 'name' => 'deletecorrespondingsubtotalline', 'label' => $langs->trans("DeleteCorrespondingSubtotalLine"), 'value' => 0)); + $title = "DeleteTitleLine"; + $question = "ConfirmDeleteTitleLine"; + } + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$lineid, $langs->trans($title), $langs->trans($question), 'confirm_delete_subtotalline', $formconfirm, 'no', 1); + } + // Clone confirmation if ($action == 'clone') { $filter = '(s.client:IN:1,2,3)'; @@ -2640,6 +2892,19 @@ if ($action == 'create' && $usercancreate) { $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneOrder', $object->ref), 'confirm_clone', $formquestion, 'yes', 1); } + // Subtotal line form + if ($action == 'add_title_line') { + $langs->load('subtotals'); + $type = 'title'; + $depth_array = $object->getPossibleLevels($langs); + require dol_buildpath('/core/tpl/subtotal_create.tpl.php'); + } elseif ($action == 'add_subtotal_line') { + $langs->load('subtotals'); + $type = 'subtotal'; + $titles = $object->getPossibleTitles(); + require dol_buildpath('/core/tpl/subtotal_create.tpl.php'); + } + // Call Hook formConfirm $parameters = array('formConfirm' => $formconfirm, 'lineid' => $lineid); // Note that $action and $object may be modified by hook @@ -3087,7 +3352,11 @@ if ($action == 'create' && $usercancreate) { '; if (!empty($conf->use_javascript_ajax) && $object->status == Commande::STATUS_DRAFT) { - include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php'; + if (isModEnabled('subtotals')) { + include DOL_DOCUMENT_ROOT.'/core/tpl/subtotal_ajaxrow.tpl.php'; + } else { + include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php'; + } } print '
'; @@ -3155,6 +3424,30 @@ if ($action == 'create' && $usercancreate) { } } + // Subtotal + if ($object->status == Commande::STATUS_DRAFT && isModEnabled('subtotals') && getDolGlobalString('SUBTOTAL_TITLE_'.strtoupper($object->element))) { + $langs->load('subtotals'); + + $url_button = array(); + + $url_button[] = array( + 'lang' => 'subtotals', + 'enabled' => (isModEnabled('order') && $object->status == Commande::STATUS_DRAFT), + 'perm' => (bool) $usercancreate, + 'label' => $langs->trans('AddTitleLine'), + 'url' => '/commande/card.php?id='.$object->id.'&action=add_title_line&token='.newToken() + ); + + $url_button[] = array( + 'lang' => 'subtotals', + 'enabled' => (isModEnabled('order') && $object->status == Commande::STATUS_DRAFT), + 'perm' => (bool) $usercancreate, + 'label' => $langs->trans('AddSubtotalLine'), + 'url' => '/commande/card.php?id='.$object->id.'&action=add_subtotal_line&token='.newToken() + ); + print dolGetButtonAction('', $langs->trans('Subtotal'), 'default', $url_button, '', true); + } + // Valid if ($object->status == Commande::STATUS_DRAFT && ($object->total_ttc >= 0 || getDolGlobalString('ORDER_ENABLE_NEGATIVE')) && $usercanvalidate) { if ($numlines > 0) { diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index c459d4fc975..9bdd1df6f4c 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -42,6 +42,7 @@ require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; require_once DOL_DOCUMENT_ROOT.'/margin/lib/margins.lib.php'; require_once DOL_DOCUMENT_ROOT.'/multicurrency/class/multicurrency.class.php'; require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; +require_once DOL_DOCUMENT_ROOT.'/subtotals/class/commonsubtotal.class.php'; /** @@ -49,6 +50,8 @@ require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; */ class Commande extends CommonOrder { + use CommonSubtotal; + /** * @var string ID to identify managed object */ @@ -1827,6 +1830,13 @@ class Commande extends CommonOrder } $this->lines[] = $this->line; + } else { + foreach ($this->lines as $line) { + if ($line->id == $origin_id) { + $this->line->extraparams = $line->extraparams; + $this->line->setExtraParameters(); + } + } } $this->db->commit(); diff --git a/htdocs/compta/facture/card-rec.php b/htdocs/compta/facture/card-rec.php index ea53df5c8c0..40380d6152f 100644 --- a/htdocs/compta/facture/card-rec.php +++ b/htdocs/compta/facture/card-rec.php @@ -488,6 +488,28 @@ if (empty($reshook)) { $db->rollback(); setEventMessages($line->error, $line->errors, 'errors'); } + } elseif ($action == 'confirm_delete_subtotalline' && $confirm == 'yes' && $usercancreate) { + // Delete line + $object->fetch($id); + $object->fetch_thirdparty(); + + $result = $object->deleteSubtotalLine($langs, GETPOSTINT('lineid'), (bool) GETPOST('deletecorrespondingsubtotalline'), $user); + if ($result > 0) { + $result = $object->update_price(1); + + if ($result > 0) { + $db->commit(); + $object->fetch($object->id); // Reload lines + header('Location: '.$_SERVER["PHP_SELF"].'?id='.$id); + exit(); + } else { + $db->rollback(); + setEventMessages($db->lasterror(), null, 'errors'); + } + } else { + setEventMessages($object->error, $object->errors, 'errors'); + $action = ''; + } } elseif ($action == 'update_extras' && $permissiontoeditextra) { $object->oldcopy = dol_clone($object, 2); // @phan-suppress-current-line PhanTypeMismatchProperty @@ -804,6 +826,74 @@ if (empty($reshook)) { $action = ''; } } + } elseif ($action == 'confirm_addtitleline' && $usercancreate) { + // Handling adding a new title line for subtotals module + + $langs->load('subtotals'); + + $desc = GETPOST('subtotallinedesc', 'alphanohtml'); + $depth = GETPOSTINT('subtotallinelevel') ?? 1; + + $subtotal_options = array(); + + foreach (FactureRec::$TITLE_OPTIONS as $option) { + $value = GETPOST($option, 'alphanohtml'); + if ($value) { + $subtotal_options[$option] = $value == 'on' ? 1 : $value; + } + } + + // Insert line + $result = $object->addSubtotalLine($langs, $desc, (int) $depth, $subtotal_options); + + if ($result >= 0) { + if ($result == 0) { + setEventMessages($object->error, $object->errors, 'warnings'); + } + $ret = $object->fetch($object->id); // Reload to get new records + $object->fetch_thirdparty(); + } else { + setEventMessages($object->error, $object->errors, 'errors'); + } + header('Location: '.$_SERVER["PHP_SELF"].'?id='.$id); + exit(); + } elseif ($action == 'confirm_addsubtotalline' && $usercancreate) { + // Handling adding a new subtotal line for subtotals module + + $langs->load('subtotals'); + + $choosen_line = GETPOST('subtotaltitleline', 'alphanohtml'); + foreach ($object->lines as $line) { + if ($line->desc == $choosen_line && $line->special_code == SUBTOTALS_SPECIAL_CODE) { + $desc = $line->desc; + $depth = -$line->qty; + } + } + + $subtotal_options = array(); + + foreach (FactureRec::$SUBTOTAL_OPTIONS as $option) { + $value = GETPOST($option, 'alphanohtml'); + if ($value) { + $subtotal_options[$option] = $value == 'on' ? 1 : $value; + } + } + + // Insert line + if (isset($desc) && isset($depth)) { + $result = $object->addSubtotalLine($langs, $desc, (int) $depth, $subtotal_options); + } else { + $object->errors[] = $langs->trans("CorrespondingTitleNotFound"); + } + + if (isset($result) && $result >= 0) { + $ret = $object->fetch($object->id); // Reload to get new records + $object->fetch_thirdparty(); + } else { + setEventMessages($object->error, $object->errors, 'errors'); + } + header('Location: '.$_SERVER["PHP_SELF"].'?id='.$id); + exit(); } elseif ($action == 'updateline' && $usercancreate && !GETPOST('cancel', 'alpha')) { if (!$object->fetch($id) > 0) { dol_print_error($db); @@ -1015,6 +1105,61 @@ if (empty($reshook)) { setEventMessages($object->error, $object->errors, 'errors'); } } + } elseif ($action == 'updatetitleline' && GETPOSTISSET("save") && $usercancreate && !GETPOST('cancel', 'alpha')) { + // Handling updating a title line for subtotals module + + $langs->load('subtotals'); + + $desc = GETPOST('line_desc', 'alphanohtml') ?? $langs->trans("Title"); + $depth = GETPOSTINT('line_depth') ?? 1; + + $subtotal_options = array(); + + foreach (Facture::$TITLE_OPTIONS as $option) { + $value = GETPOST($option, 'alphanohtml'); + if ($value) { + $subtotal_options[$option] = $value == 'on' ? 1 : $value; + } + } + + // Update line + $result = $object->updateSubtotalLine($langs, GETPOSTINT('lineid'), $desc, $depth, $subtotal_options); + + if ($result >= 0) { + if ($result == 0) { + setEventMessages($object->error, $object->errors, 'warnings'); + } + $ret = $object->fetch($object->id); // Reload to get new records + $object->fetch_thirdparty(); + } else { + setEventMessages($object->error, $object->errors, 'errors'); + } + } elseif ($action == 'updatesubtotalline' && GETPOSTISSET("save") && $usercancreate && !GETPOST('cancel', 'alpha')) { + // Handling updating a subtotal line for subtotals module + + $langs->load('subtotals'); + + $desc = GETPOST('line_desc', 'alphanohtml'); + $depth = GETPOSTINT('line_depth'); + + $subtotal_options = array(); + + foreach (Facture::$SUBTOTAL_OPTIONS as $option) { + $value = GETPOST($option, 'alphanohtml'); + if ($value) { + $subtotal_options[$option] = $value == 'on' ? 1 : $value; + } + } + + // Update line + $result = $object->updateSubtotalLine($langs, GETPOSTINT('lineid'), $desc, $depth, $subtotal_options); + + if ($result > 0) { + $ret = $object->fetch($object->id); // Reload to get new records + $object->fetch_thirdparty(); + } else { + setEventMessages($object->error, $object->errors, 'errors'); + } } } @@ -1340,6 +1485,31 @@ if ($action == 'create') { if ($action == 'delete') { $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('DeleteRepeatableInvoice'), $langs->trans('ConfirmDeleteRepeatableInvoice'), 'confirm_delete', '', 'no', 1); } + // Confirmation de la suppression d'une ligne subtotal + if ($action == 'ask_subtotal_deleteline') { + $langs->load("subtotals"); + $title = "DeleteSubtotalLine"; + $question = "ConfirmDeleteSubtotalLine"; + if (GETPOST('type') == 'title') { + $formconfirm = array(array('type' => 'checkbox', 'name' => 'deletecorrespondingsubtotalline', 'label' => $langs->trans("DeleteCorrespondingSubtotalLine"), 'value' => 0)); + $title = "DeleteTitleLine"; + $question = "ConfirmDeleteTitleLine"; + } + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$lineid, $langs->trans($title), $langs->trans($question), 'confirm_delete_subtotalline', $formconfirm, 'no', 1); + } + + // Subtotal line form + if ($action == 'add_title_line') { + $langs->load('subtotals'); + $type = 'title'; + $depth_array = $object->getPossibleLevels($langs); + require dol_buildpath('/core/tpl/subtotal_create.tpl.php'); + } elseif ($action == 'add_subtotal_line') { + $langs->load('subtotals'); + $type = 'subtotal'; + $titles = $object->getPossibleTitles(); + require dol_buildpath('/core/tpl/subtotal_create.tpl.php'); + } // Call Hook formConfirm $parameters = array('formConfirm' => $formconfirm, 'lineid' => $lineid); @@ -1852,7 +2022,11 @@ if ($action == 'create') { print ''; if (!empty($conf->use_javascript_ajax) && $object->statut == 0) { - include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php'; + if (isModEnabled('subtotals')) { + include DOL_DOCUMENT_ROOT.'/core/tpl/subtotal_ajaxrow.tpl.php'; + } else { + include DOL_DOCUMENT_ROOT . '/core/tpl/ajaxrow.tpl.php'; + } } print '
'; @@ -1900,6 +2074,31 @@ if ($action == 'create') { 'class' => 'classfortooltip', ), ); + + // Subtotal + if (empty($object->suspended) && isModEnabled('subtotals') && getDolGlobalString('SUBTOTAL_TITLE_'.strtoupper($object->element))) { + $langs->load("subtotals"); + + $url_button = array(); + + $url_button[] = array( + 'lang' => 'subtotals', + 'enabled' => (isModEnabled('invoice') && $object->status == Facture::STATUS_DRAFT), + 'perm' => (bool) $usercancreate, + 'label' => $langs->trans('AddTitleLine'), + 'url' => '/compta/facture/card-rec.php?id='.$object->id.'&action=add_title_line&token='.newToken() + ); + + $url_button[] = array( + 'lang' => 'subtotals', + 'enabled' => (isModEnabled('invoice') && $object->status == Facture::STATUS_DRAFT), + 'perm' => (bool) $usercancreate, + 'label' => $langs->trans('AddSubtotalLine'), + 'url' => '/compta/facture/card-rec.php?id='.$object->id.'&action=add_subtotal_line&token='.newToken() + ); + print dolGetButtonAction('', $langs->trans('Subtotal'), 'default', $url_button, '', true); + } + if (empty($object->suspended)) { if ($user->hasRight('facture', 'creer')) { if (!empty($object->frequency) && $object->nb_gen_max > 0 && ($object->nb_gen_done >= $object->nb_gen_max)) { diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index 7eff9b45f2b..58cb49c108b 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -355,6 +355,41 @@ if (empty($reshook)) { setEventMessages($object->error, $object->errors, 'errors'); $action = ''; } + } elseif ($action == 'confirm_delete_subtotalline' && $confirm == 'yes' && $usercancreate) { + // Delete line + $object->fetch($id); + $object->fetch_thirdparty(); + + $result = $object->deleteSubtotalLine($langs, GETPOSTINT('lineid'), (bool) GETPOST('deletecorrespondingsubtotalline')); + if ($result > 0) { + // reorder lines + $object->line_order(true); + // Define output language + $outputlangs = $langs; + $newlang = ''; + if (getDolGlobalInt('MAIN_MULTILANGS') /* && empty($newlang) */ && GETPOST('lang_id')) { + $newlang = GETPOST('lang_id'); + } + if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) { + $newlang = $object->thirdparty->default_lang; + } + if (!empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + $outputlangs->load('products'); + } + if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) { + $ret = $object->fetch($id); // Reload to get new records + $result = $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + if ($result >= 0) { + header('Location: '.$_SERVER["PHP_SELF"].'?facid='.$id); + exit(); + } + } else { + setEventMessages($object->error, $object->errors, 'errors'); + $action = ''; + } } elseif ($action == 'unlinkdiscount' && $usercancreate) { // Delete link of credit note to invoice $discount = new DiscountAbsolute($db); @@ -1917,10 +1952,17 @@ if (empty($reshook)) { $lines[$i]->fk_unit, 0, '', - 1 + 0 ); if ($result > 0) { + foreach ($object->lines as $line) { + if ($line->id == $result) { + $line->extraparams = $lines[$i]->extraparams; + $line->setExtraParameters(); + } + } + $lineid = $result; } else { $lineid = 0; @@ -1942,6 +1984,8 @@ if (empty($reshook)) { $object->update_price(1, 'auto', 0, $mysoc); + $object->line_order(true, 'DESC'); + // Now we create same links to contact than the ones found on origin object /* Useless, already into the create if (getDolGlobalString('MAIN_PROPAGATE_CONTACTS_FROM_ORIGIN')) { @@ -2176,6 +2220,9 @@ if (empty($reshook)) { $alldate_start = dol_mktime(GETPOSTINT('alldate_starthour'), GETPOSTINT('alldate_startmin'), 0, GETPOSTINT('alldate_startmonth'), GETPOSTINT('alldate_startday'), GETPOSTINT('alldate_startyear')); $alldate_end = dol_mktime(GETPOSTINT('alldate_endhour'), GETPOSTINT('alldate_endmin'), 0, GETPOSTINT('alldate_endmonth'), GETPOSTINT('alldate_endday'), GETPOSTINT('alldate_endyear')); foreach ($object->lines as $line) { + if ($line->special_code == SUBTOTALS_SPECIAL_CODE) { + continue; + } if ($line->product_type == 1) { // only service line $result = $object->updateline($line->id, $line->desc, $line->subprice, $line->qty, $line->remise_percent, $alldate_start, $alldate_end, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, 'HT', $line->info_bits, $line->product_type, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->special_code, $line->array_options, $line->situation_percent, $line->fk_unit, $line->multicurrency_subprice); } @@ -2187,6 +2234,9 @@ if (empty($reshook)) { $localtax1_rate = get_localtax($vat_rate, 1, $object->thirdparty, $mysoc); $localtax2_rate = get_localtax($vat_rate, 2, $object->thirdparty, $mysoc); foreach ($object->lines as $line) { + if ($line->special_code == SUBTOTALS_SPECIAL_CODE) { + continue; + } $result = $object->updateline($line->id, $line->desc, $line->subprice, $line->qty, $line->remise_percent, $line->date_start, $line->date_end, $vat_rate, $localtax1_rate, $localtax2_rate, 'HT', $line->info_bits, $line->product_type, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->special_code, $line->array_options, $line->situation_percent, $line->fk_unit, $line->multicurrency_subprice); } } elseif ($action == 'addline' && GETPOST('submitforalllines', 'alpha') && GETPOST('remiseforalllines', 'alpha') !== '' && $usercancreate) { @@ -2194,12 +2244,119 @@ if (empty($reshook)) { $remise_percent = (GETPOST('remiseforalllines') ? GETPOST('remiseforalllines') : 0); $remise_percent = str_replace('*', '', $remise_percent); foreach ($object->lines as $line) { + if ($line->special_code == SUBTOTALS_SPECIAL_CODE) { + continue; + } $tvatx = $line->tva_tx; if (!empty($line->vat_src_code)) { $tvatx .= ' ('.$line->vat_src_code.')'; } $result = $object->updateline($line->id, $line->desc, $line->subprice, $line->qty, (float) $remise_percent, $line->date_start, $line->date_end, $tvatx, $line->localtax1_tx, $line->localtax2_tx, 'HT', $line->info_bits, $line->product_type, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->special_code, $line->array_options, $line->situation_percent, $line->fk_unit, $line->multicurrency_subprice); } + } elseif ($action == 'confirm_addtitleline' && $usercancreate) { + // Handling adding a new title line for subtotals module + + $langs->load('subtotals'); + + $desc = GETPOST('subtotallinedesc', 'alphanohtml'); + $depth = GETPOSTINT('subtotallinelevel') ?? 1; + + $subtotal_options = array(); + + foreach (Facture::$TITLE_OPTIONS as $option) { + $value = GETPOST($option, 'alphanohtml'); + if ($value) { + $subtotal_options[$option] = $value == 'on' ? 1 : $value; + } + } + + // Insert line + $result = $object->addSubtotalLine($langs, $desc, (int) $depth, $subtotal_options); + + if ($result >= 0) { + if ($result == 0) { + setEventMessages($object->error, $object->errors, 'warnings'); + } + $ret = $object->fetch($object->id); // Reload to get new records + $object->fetch_thirdparty(); + + if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) { + // Define output language + $outputlangs = $langs; + $newlang = GETPOST('lang_id', 'alpha'); + if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) { + $newlang = $object->thirdparty->default_lang; + } + if (!empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + + $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } else { + setEventMessages($object->error, $object->errors, 'errors'); + } + header('Location: '.$_SERVER["PHP_SELF"].'?facid='.$id); + exit(); + } elseif ($action == 'confirm_addsubtotalline' && $usercancreate) { + // Handling adding a new subtotal line for subtotals module + + $langs->load('subtotals'); + + $choosen_line = GETPOST('subtotaltitleline', 'alphanohtml'); + foreach ($object->lines as $line) { + if ($line->desc == $choosen_line && $line->special_code == SUBTOTALS_SPECIAL_CODE) { + $desc = $line->desc; + $depth = -$line->qty; + } + } + + $subtotal_options = array(); + + foreach (Facture::$SUBTOTAL_OPTIONS as $option) { + $value = GETPOST($option, 'alphanohtml'); + if ($value) { + $subtotal_options[$option] = $value == 'on' ? 1 : $value; + } + } + + // Insert line + if (isset($desc) && isset($depth)) { + $result = $object->addSubtotalLine($langs, $desc, (int) $depth, $subtotal_options); + } else { + $object->errors[] = $langs->trans("CorrespondingTitleNotFound"); + } + + if (isset($result) && $result >= 0) { + $ret = $object->fetch($object->id); // Reload to get new records + $object->fetch_thirdparty(); + + if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) { + // Define output language + $outputlangs = $langs; + $newlang = GETPOST('lang_id', 'alpha'); + if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) { + $newlang = $object->thirdparty->default_lang; + } + if (!empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + + $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } else { + setEventMessages($object->error, $object->errors, 'errors'); + } + header('Location: '.$_SERVER["PHP_SELF"].'?facid='.$id); + exit(); + } elseif ($action == 'addline' && GETPOST('updateallvatlinesblock', 'alpha') && GETPOST('vatforblocklines', 'alpha') !== '' && $usercancreate) { + $tx_tva = GETPOST('vatforblocklines') ? GETPOST('vatforblocklines') : 0; + $object->updateSubtotalLineBlockLines($langs, $object->getRangOfLine($lineid), 'tva', $tx_tva); + } elseif ($action == 'addline' && GETPOST('updatealldiscountlinesblock', 'alpha') && GETPOST('discountforblocklines', 'alpha') !== '' && $usercancreate) { + $discount = GETPOST('discountforblocklines') ? GETPOST('discountforblocklines') : 0; + $object->updateSubtotalLineBlockLines($langs, $object->getRangOfLine($lineid), 'discount', $discount); } elseif ($action == 'addline' && !GETPOST('submitforalllines', 'alpha') && !GETPOST('submitforallmargins', 'alpha') && !GETPOST('submitforallmark', 'alpha') && $usercancreate) { // Add a new line $langs->load('errors'); $error = 0; @@ -2638,6 +2795,9 @@ if (empty($reshook)) { $margin_rate = GETPOSTISSET('marginforalllines') ? GETPOST('marginforalllines', 'int') : ''; $mark_rate = GETPOSTISSET('markforalllines') ? GETPOST('markforalllines', 'int') : ''; foreach ($object->lines as &$line) if ($line->subprice > 0) { + if ($line->special_code == SUBTOTALS_SPECIAL_CODE) { + continue; + } $subprice_multicurrency = $line->subprice; if (is_numeric($margin_rate) && $margin_rate > 0) { $line->subprice = floatval(price2num(floatval($line->pa_ht) * (1 + floatval($margin_rate) / 100), 'MU')); @@ -2684,6 +2844,91 @@ if (empty($reshook)) { setEventMessages($object->error, $object->errors, 'errors'); } } + } elseif ($action == 'updatetitleline' && GETPOSTISSET("save") && $usercancreate && !GETPOST('cancel', 'alpha')) { + // Handling updating a title line for subtotals module + + $langs->load('subtotals'); + + $desc = GETPOST('line_desc', 'alphanohtml') ?? $langs->trans("Title"); + $depth = GETPOSTINT('line_depth') ?? 1; + + $subtotal_options = array(); + + foreach (Facture::$TITLE_OPTIONS as $option) { + $value = GETPOST($option, 'alphanohtml'); + if ($value) { + $subtotal_options[$option] = $value == 'on' ? 1 : $value; + } + } + + // Update line + $result = $object->updateSubtotalLine($langs, GETPOSTINT('lineid'), $desc, $depth, $subtotal_options); + + if ($result >= 0) { + if ($result == 0) { + setEventMessages($object->error, $object->errors, 'warnings'); + } + $ret = $object->fetch($object->id); // Reload to get new records + $object->fetch_thirdparty(); + + if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) { + // Define output language + $outputlangs = $langs; + $newlang = GETPOST('lang_id', 'alpha'); + if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) { + $newlang = $object->thirdparty->default_lang; + } + if (!empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + + $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } else { + setEventMessages($object->error, $object->errors, 'errors'); + } + } elseif ($action == 'updatesubtotalline' && GETPOSTISSET("save") && $usercancreate && !GETPOST('cancel', 'alpha')) { + // Handling updating a subtotal line for subtotals module + + $langs->load('subtotals'); + + $desc = GETPOST('line_desc', 'alphanohtml'); + $depth = GETPOSTINT('line_depth'); + + $subtotal_options = array(); + + foreach (Facture::$SUBTOTAL_OPTIONS as $option) { + $value = GETPOST($option, 'alphanohtml'); + if ($value) { + $subtotal_options[$option] = $value == 'on' ? 1 : $value; + } + } + + // Update line + $result = $object->updateSubtotalLine($langs, GETPOSTINT('lineid'), $desc, $depth, $subtotal_options); + + if ($result > 0) { + $ret = $object->fetch($object->id); // Reload to get new records + $object->fetch_thirdparty(); + + if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) { + // Define output language + $outputlangs = $langs; + $newlang = GETPOST('lang_id', 'alpha'); + if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) { + $newlang = $object->thirdparty->default_lang; + } + if (!empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + + $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } else { + setEventMessages($object->error, $object->errors, 'errors'); + } } elseif ($action == 'updateline' && $usercancreate && !GETPOST('cancel', 'alpha')) { if (!$object->fetch($id) > 0) { dol_print_error($db); @@ -3189,6 +3434,7 @@ if (empty($reshook)) { } } + // Actions when printing a doc from card include DOL_DOCUMENT_ROOT.'/core/actions_printing.inc.php'; @@ -4761,6 +5007,19 @@ if ($action == 'create') { $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?facid='.$object->id.'&lineid='.$lineid, $langs->trans('DeleteProductLine'), $langs->trans('ConfirmDeleteProductLine'), 'confirm_deleteline', '', 'no', 1); } + // Confirmation de la suppression d'une ligne subtotal + if ($action == 'ask_subtotal_deleteline') { + $langs->load("subtotals"); + $title = "DeleteSubtotalLine"; + $question = "ConfirmDeleteSubtotalLine"; + if (GETPOST('type') == 'title') { + $formconfirm = array(array('type' => 'checkbox', 'name' => 'deletecorrespondingsubtotalline', 'label' => $langs->trans("DeleteCorrespondingSubtotalLine"), 'value' => 0)); + $title = "DeleteTitleLine"; + $question = "ConfirmDeleteTitleLine"; + } + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?facid='.$object->id.'&lineid='.$lineid, $langs->trans($title), $langs->trans($question), 'confirm_delete_subtotalline', $formconfirm, 'no', 1); + } + // Clone confirmation if ($action == 'clone') { $filter = '(s.client:IN:1,2,3)'; @@ -4773,6 +5032,19 @@ if ($action == 'create') { $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?facid='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneInvoice', $object->ref), 'confirm_clone', $formquestion, 'yes', 1, 250); } + // Subtotal line form + if ($action == 'add_title_line') { + $langs->load('subtotals'); + $type = 'title'; + $depth_array = $object->getPossibleLevels($langs); + require dol_buildpath('/core/tpl/subtotal_create.tpl.php'); + } elseif ($action == 'add_subtotal_line') { + $langs->load('subtotals'); + $type = 'subtotal'; + $titles = $object->getPossibleTitles(); + require dol_buildpath('/core/tpl/subtotal_create.tpl.php'); + } + if ($action == "remove_file_comfirm") { $file = GETPOST('file', 'alpha'); @@ -5923,7 +6195,11 @@ if ($action == 'create') { '; if (!empty($conf->use_javascript_ajax) && $object->status == 0) { - include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php'; + if (isModEnabled('subtotals')) { + include DOL_DOCUMENT_ROOT.'/core/tpl/subtotal_ajaxrow.tpl.php'; + } else { + include DOL_DOCUMENT_ROOT . '/core/tpl/ajaxrow.tpl.php'; + } } print '
'; @@ -6034,6 +6310,30 @@ if ($action == 'create') { } } + // Subtotal + if ($object->status == Facture::STATUS_DRAFT && isModEnabled('subtotals') && getDolGlobalString('SUBTOTAL_TITLE_'.strtoupper($object->element))) { + $langs->load("subtotals"); + + $url_button = array(); + + $url_button[] = array( + 'lang' => 'subtotals', + 'enabled' => (isModEnabled('invoice') && $object->status == Facture::STATUS_DRAFT), + 'perm' => (bool) $usercancreate, + 'label' => $langs->trans('AddTitleLine'), + 'url' => '/compta/facture/card.php?facid='.$object->id.'&action=add_title_line&token='.newToken() + ); + + $url_button[] = array( + 'lang' => 'subtotals', + 'enabled' => (isModEnabled('invoice') && $object->status == Facture::STATUS_DRAFT), + 'perm' => (bool) $usercancreate, + 'label' => $langs->trans('AddSubtotalLine'), + 'url' => '/compta/facture/card.php?facid='.$object->id.'&action=add_subtotal_line&token='.newToken() + ); + print dolGetButtonAction('', $langs->trans('Subtotal'), 'default', $url_button, '', true); + } + // Validate if ($object->status == Facture::STATUS_DRAFT && count($object->lines) > 0 && ((($object->type == Facture::TYPE_STANDARD || $object->type == Facture::TYPE_REPLACEMENT || $object->type == Facture::TYPE_DEPOSIT || $object->type == Facture::TYPE_PROFORMA || $object->type == Facture::TYPE_SITUATION) && (getDolGlobalString('FACTURE_ENABLE_NEGATIVE') || $object->total_ttc >= 0)) diff --git a/htdocs/compta/facture/class/facture-rec.class.php b/htdocs/compta/facture/class/facture-rec.class.php index 7694b54635b..b2ba01ea9d4 100644 --- a/htdocs/compta/facture/class/facture-rec.class.php +++ b/htdocs/compta/facture/class/facture-rec.class.php @@ -37,6 +37,7 @@ require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/factureligne.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/subtotals/class/commonsubtotal.class.php'; /** @@ -44,6 +45,8 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; */ class FactureRec extends CommonInvoice { + use CommonSubtotal; + const TRIGGER_PREFIX = 'BILLREC'; /** * @var string ID to identify managed object @@ -493,6 +496,12 @@ class FactureRec extends CommonInvoice if ($result < 0) { $error++; } + + $objectline->extraparams = $facline->extraparams; + $result = $objectline->setExtraParameters(); + if ($result < 0) { + $error++; + } } elseif ($result2 < 0) { $this->errors[] = $objectline->error; $error++; diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 9aeb6dfd272..866c7155556 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -50,6 +50,7 @@ require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; require_once DOL_DOCUMENT_ROOT.'/societe/class/client.class.php'; require_once DOL_DOCUMENT_ROOT.'/margin/lib/margins.lib.php'; require_once DOL_DOCUMENT_ROOT.'/multicurrency/class/multicurrency.class.php'; +require_once DOL_DOCUMENT_ROOT.'/subtotals/class/commonsubtotal.class.php'; if (isModEnabled('accounting')) { require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php'; @@ -63,6 +64,8 @@ if (isModEnabled('accounting')) { */ class Facture extends CommonInvoice { + use CommonSubtotal; + /** * @var string ID to identify managed object */ @@ -1103,6 +1106,13 @@ class Facture extends CommonInvoice 1 ); + foreach ($this->lines as $line) { + if ($line->id == $result_insert) { + $line->extraparams = $_facrec->lines[$i]->extraparams; + $line->setExtraParameters(); + } + } + // Defined the new fk_parent_line if ($result_insert > 0 && $_facrec->lines[$i]->product_type == 9) { $fk_parent_line = $result_insert; @@ -4423,6 +4433,13 @@ class Facture extends CommonInvoice } $this->lines[] = $this->line; + } else { + foreach ($this->lines as $line) { + if ($line->id == $origin_id) { + $this->line->extraparams = $line->extraparams; + $this->line->setExtraParameters(); + } + } } if ($result > 0) { diff --git a/htdocs/compta/facture/class/factureligne.class.php b/htdocs/compta/facture/class/factureligne.class.php index e95fa0e8781..8e785f086df 100644 --- a/htdocs/compta/facture/class/factureligne.class.php +++ b/htdocs/compta/facture/class/factureligne.class.php @@ -185,7 +185,6 @@ class FactureLigne extends CommonInvoiceLine */ public $packaging; - /** * Constructor * diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 6d524c73594..ef92c84817e 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -10994,7 +10994,7 @@ class Form } $out .= ' }); $(".' . $cssclass . '").change(function() { - $(this).closest("tr").toggleClass("highlight", this.checked); + $(this).closest("tr").toggleClass(this.checked); }); }); '; diff --git a/htdocs/core/lib/sendings.lib.php b/htdocs/core/lib/sendings.lib.php index 2d787cda10e..a308b33d814 100644 --- a/htdocs/core/lib/sendings.lib.php +++ b/htdocs/core/lib/sendings.lib.php @@ -242,7 +242,7 @@ function show_list_sending_receive($origin, $origin_id, $filter = '') $expedition = new Expedition($db); $warehousestatic = new Entrepot($db); - $sql = "SELECT obj.rowid, obj.fk_product, obj.label, obj.description, obj.product_type as fk_product_type, obj.qty as qty_asked, obj.date_start, obj.date_end,"; + $sql = "SELECT obj.rowid, obj.fk_product, obj.label, obj.description, obj.product_type as fk_product_type, obj.qty as qty_asked, obj.date_start, obj.date_end, obj.special_code,"; $sql .= " ed.rowid as edrowid, ed.qty as qty_shipped, ed.fk_expedition as expedition_id, ed.fk_elementdet, ed.fk_entrepot as warehouse_id,"; $sql .= " e.rowid as sendingid, e.ref as exp_ref, e.date_creation, e.date_delivery, e.date_expedition, e.billed, e.fk_statut as status, e.signed_status,"; $sql .= ' p.label as product_label, p.ref, p.fk_product_type, p.rowid as prodid, p.tobatch as product_tobatch,'; @@ -255,6 +255,9 @@ function show_list_sending_receive($origin, $origin_id, $filter = '') $sql .= " WHERE e.entity IN (".getEntity('expedition').")"; $sql .= " AND obj.fk_".$origin." = ".((int) $origin_id); $sql .= " AND obj.rowid = ed.fk_elementdet"; + if (isModEnabled('subtotals')) { + $sql .= " AND obj.special_code <> ".SUBTOTALS_SPECIAL_CODE; + } $sql .= " AND ed.fk_expedition = e.rowid"; if ($filter) { $sql .= $filter; diff --git a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php index 993325c6f0b..10f54c67915 100644 --- a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php +++ b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php @@ -41,7 +41,6 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'; - /** * Class to generate PDF orders with template Eratosthene */ @@ -556,10 +555,44 @@ class pdf_eratosthene extends ModelePDFCommandes // Loop on each lines $pageposbeforeprintlines = $pdf->getPage(); $pagenb = $pageposbeforeprintlines; + + $pdf_sub_options = array(); + $pdf_sub_options['titleshowuponpdf'] = 1; + $pdf_sub_options['titleshowtotalexludingvatonpdf'] = 1; + for ($i = 0; $i < $nblines; $i++) { $linePosition = $i + 1; $curY = $nexY; + $sub_options = $object->lines[$i]->extraparams["subtotal"] ?? array(); + + if ($object->lines[$i]->special_code == SUBTOTALS_SPECIAL_CODE) { + $level = $object->lines[$i]->qty; + if ($sub_options) { + if (isset($sub_options['titleshowuponpdf'])) { + $pdf_sub_options['titleshowuponpdf'] = isset($pdf_sub_options['titleshowuponpdf']) && $pdf_sub_options['titleshowuponpdf'] < $level ? $pdf_sub_options['titleshowuponpdf'] : $level; + } elseif (isset($pdf_sub_options['titleshowuponpdf']) && abs($level) <= $pdf_sub_options['titleshowuponpdf']) { + unset($pdf_sub_options['titleshowuponpdf']); + } + if (isset($sub_options['titleshowtotalexludingvatonpdf'])) { + $pdf_sub_options['titleshowtotalexludingvatonpdf'] = isset($pdf_sub_options['titleshowtotalexludingvatonpdf']) && $pdf_sub_options['titleshowtotalexludingvatonpdf'] < $level ? $pdf_sub_options['titleshowtotalexludingvatonpdf'] : $level; + } elseif (isset($pdf_sub_options['titleshowtotalexludingvatonpdf']) && abs($level) <= $pdf_sub_options['titleshowtotalexludingvatonpdf']) { + unset($pdf_sub_options['titleshowtotalexludingvatonpdf']); + } + } else { + if (isset($pdf_sub_options['titleshowuponpdf']) && abs($level) <= $pdf_sub_options['titleshowuponpdf']) { + unset($pdf_sub_options['titleshowuponpdf']); + } + if (isset($pdf_sub_options['titleshowtotalexludingvatonpdf']) && abs($level) <= $pdf_sub_options['titleshowtotalexludingvatonpdf']) { + unset($pdf_sub_options['titleshowtotalexludingvatonpdf']); + } + } + } + + if (($curY + 6) > ($this->page_hauteur - $heightforfooter) || isset($sub_options['titleforcepagebreak']) && !($pdf->getNumPages() == 1 && $curY == $tab_top + $this->tabTitleHeight)) { + $object->lines[$i]->pagebreak = true; + } + // in First Check line page break and add page if needed if (isset($object->lines[$i]->pagebreak) && $object->lines[$i]->pagebreak) { // New page @@ -569,7 +602,7 @@ class pdf_eratosthene extends ModelePDFCommandes } $pdf->setPage($pdf->getNumPages()); - $nexY = $tab_top_newpage; + $nexY = $curY = $tab_top_newpage; } $this->resetAfterColsLinePositionsData($nexY, $pdf->getPage()); @@ -624,8 +657,29 @@ class pdf_eratosthene extends ModelePDFCommandes // Description of product line if ($this->getColumnStatus('desc')) { - $this->printColDescContent($pdf, $curY, 'desc', $object, $i, $outputlangs, $hideref, $hidedesc); - $this->setAfterColsLinePositionsData('desc', $pdf->GetY(), $pdf->getPage()); + if ($object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE) { + $this->printColDescContent($pdf, $curY, 'desc', $object, $i, $outputlangs, $hideref, $hidedesc); + $this->setAfterColsLinePositionsData('desc', $pdf->GetY(), $pdf->getPage()); + } else { + $bg_color = colorStringToArray(getDolGlobalString("SUBTOTAL_BACK_COLOR_LEVEL_".abs($object->lines[$i]->qty))); + $pdf->SetFillColor($bg_color[0], $bg_color[1], $bg_color[2]); + $pdf->SetXY($pdf->GetX() + 1, $curY); + $pdf->MultiCell($this->page_largeur - $this->marge_droite - $this->marge_gauche - 2, 6, '', 0, '', true); + $previous_align = array(); + $previous_align['align'] = $this->cols['desc']['content']['align']; + if ($object->lines[$i]->qty < 0) { + $langs->load("subtotals"); + $object->lines[$i]->desc = $langs->trans("SubtotalOf", $object->lines[$i]->desc); + if ($previous_align['align'] == 'L') { + $this->cols['desc']['content']['align'] = 'R'; + } elseif ($previous_align['align'] == 'R') { + $this->cols['desc']['content']['align'] = 'L'; + } + } + $this->printColDescContent($pdf, $curY, 'desc', $object, $i, $outputlangs, $hideref, $hidedesc); + $this->setAfterColsLinePositionsData('desc', $pdf->GetY(), $pdf->getPage()); + $this->cols['desc']['content']['align'] = $previous_align['align']; // Re align if we printed a subtotal ligne + } } $afterPosData = $this->getMaxAfterColsLinePositionsData(); @@ -647,41 +701,50 @@ class pdf_eratosthene extends ModelePDFCommandes } // VAT Rate - if ($this->getColumnStatus('vat')) { + if ($this->getColumnStatus('vat') && $object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE) { $vat_rate = pdf_getlinevatrate($object, $i, $outputlangs, $hidedetails); $this->printStdColumnContent($pdf, $curY, 'vat', $vat_rate); } // Unit price before discount - if ($this->getColumnStatus('subprice')) { + if ($this->getColumnStatus('subprice') && $object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE && isset($pdf_sub_options['titleshowuponpdf'])) { $up_excl_tax = pdf_getlineupexcltax($object, $i, $outputlangs, $hidedetails); $this->printStdColumnContent($pdf, $curY, 'subprice', $up_excl_tax); } // Quantity // Enough for 6 chars - if ($this->getColumnStatus('qty')) { + if ($this->getColumnStatus('qty') && $object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE) { $qty = pdf_getlineqty($object, $i, $outputlangs, $hidedetails); $this->printStdColumnContent($pdf, $curY, 'qty', $qty); } // Unit - if ($this->getColumnStatus('unit')) { + if ($this->getColumnStatus('unit') && $object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE) { $unit = pdf_getlineunit($object, $i, $outputlangs, $hidedetails); $this->printStdColumnContent($pdf, $curY, 'unit', $unit); } // Discount on line - if ($this->getColumnStatus('discount') && $object->lines[$i]->remise_percent) { + if ($this->getColumnStatus('discount') && $object->lines[$i]->remise_percent && $object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE) { $remise_percent = pdf_getlineremisepercent($object, $i, $outputlangs, $hidedetails); $this->printStdColumnContent($pdf, $curY, 'discount', $remise_percent); } // Total excl tax line (HT) if ($this->getColumnStatus('totalexcltax')) { - $total_excl_tax = pdf_getlinetotalexcltax($object, $i, $outputlangs, $hidedetails); - $this->printStdColumnContent($pdf, $curY, 'totalexcltax', $total_excl_tax); + if ($object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE && isset($pdf_sub_options['titleshowtotalexludingvatonpdf'])) { + $total_excl_tax = pdf_getlinetotalexcltax($object, $i, $outputlangs, $hidedetails); + $this->printStdColumnContent($pdf, $curY, 'totalexcltax', $total_excl_tax); + } elseif ($object->lines[$i]->qty < 0 && isset($sub_options['subtotalshowtotalexludingvatonpdf'])) { + if (isModEnabled('multicurrency') && $object->multicurrency_code != $conf->currency) { + $total_excl_tax = $object->getSubtotalLineMulticurrencyAmount($object->lines[$i]); + } else { + $total_excl_tax = $object->getSubtotalLineAmount($object->lines[$i]); + } + $this->printStdColumnContent($pdf, $curY, 'totalexcltax', $total_excl_tax); + } } // Total with tax line (TTC) diff --git a/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php b/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php index 125c901dbdb..a72b83cea76 100644 --- a/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php +++ b/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php @@ -572,6 +572,19 @@ class pdf_espadon extends ModelePdfExpedition $pagenb = $pageposbeforeprintlines; for ($i = 0; $i < $nblines; $i++) { $curY = $nexY; + + $sub_options = $object->lines[$i]->extraparams["subtotal"] ?? array(); + + if (($curY + 6) > ($this->page_hauteur - $heightforfooter) || isset($sub_options['titleforcepagebreak']) && !($pdf->getNumPages() == 1 && $curY == $tab_top + $this->tabTitleHeight)) { + $pdf->AddPage(); + if (!empty($tplidx)) { + $pdf->useTemplate($tplidx); + } + + $pdf->setPage($pdf->getNumPages()); + $nexY = $curY = $tab_top_newpage; + } + $pdf->SetFont('', '', $default_font_size - 1); // Into loop to work with multipage $pdf->SetTextColor(0, 0, 0); @@ -620,41 +633,62 @@ class pdf_espadon extends ModelePdfExpedition // Description of product line if ($this->getColumnStatus('desc')) { - $pdf->startTransaction(); - - $this->printColDescContent($pdf, $curY, 'desc', $object, $i, $outputlangs, $hideref, $hidedesc); - - $pageposafter = $pdf->getPage(); - if ($pageposafter > $pageposbefore) { // There is a pagebreak - $pdf->rollbackTransaction(true); + if ($object->lines[$i]->special_code == SUBTOTALS_SPECIAL_CODE) { + $bg_color = colorStringToArray(getDolGlobalString("SUBTOTAL_BACK_COLOR_LEVEL_".abs($object->lines[$i]->qty))); + $pdf->SetFillColor($bg_color[0], $bg_color[1], $bg_color[2]); + $pdf->SetXY($pdf->GetX() + 1, $curY); + $pdf->MultiCell($this->page_largeur - $this->marge_droite - $this->marge_gauche - 2, 6, '', 0, '', true); + $previous_align = array(); + $previous_align['align'] = $this->cols['desc']['content']['align']; + if ($object->lines[$i]->qty < 0) { + $langs->load("subtotals"); + $object->lines[$i]->desc = $langs->trans("SubtotalOf", $object->lines[$i]->desc); + if ($previous_align['align'] == 'L') { + $this->cols['desc']['content']['align'] = 'R'; + } elseif ($previous_align['align'] == 'R') { + $this->cols['desc']['content']['align'] = 'L'; + } + } + $this->printColDescContent($pdf, $curY, 'desc', $object, $i, $outputlangs, $hideref, $hidedesc); + $this->setAfterColsLinePositionsData('desc', $pdf->GetY(), $pdf->getPage()); + $this->cols['desc']['content']['align'] = $previous_align['align']; // Re align if we printed a subtotal ligne + } else { + $pdf->startTransaction(); $this->printColDescContent($pdf, $curY, 'desc', $object, $i, $outputlangs, $hideref, $hidedesc); $pageposafter = $pdf->getPage(); - $posyafter = $pdf->GetY(); - //var_dump($posyafter); var_dump(($this->page_hauteur - ($heightforfooter+$heightforfreetext+$heightforinfotot))); exit; - if ($posyafter > ($this->page_hauteur - ($heightforfooter + $heightforfreetext + $heightforsignature + $heightforinfotot))) { // There is no space left for total+free text - if ($i == ($nblines - 1)) { // No more lines, and no space left to show total, so we create a new page - $pdf->AddPage('', '', true); - if (!empty($tplidx)) { - $pdf->useTemplate($tplidx); + if ($pageposafter > $pageposbefore) { // There is a pagebreak + $pdf->rollbackTransaction(true); + + $this->printColDescContent($pdf, $curY, 'desc', $object, $i, $outputlangs, $hideref, $hidedesc); + + $pageposafter = $pdf->getPage(); + $posyafter = $pdf->GetY(); + //var_dump($posyafter); var_dump(($this->page_hauteur - ($heightforfooter+$heightforfreetext+$heightforinfotot))); exit; + if ($posyafter > ($this->page_hauteur - ($heightforfooter + $heightforfreetext + $heightforsignature + $heightforinfotot))) { // There is no space left for total+free text + if ($i == ($nblines - 1)) { // No more lines, and no space left to show total, so we create a new page + $pdf->AddPage('', '', true); + if (!empty($tplidx)) { + $pdf->useTemplate($tplidx); + } + //if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) $this->_pagehead($pdf, $object, 0, $outputlangs); + $pdf->setPage($pageposafter + 1); } - //if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) $this->_pagehead($pdf, $object, 0, $outputlangs); - $pdf->setPage($pageposafter + 1); - } - } else { - // We found a page break - // Allows data in the first page if description is long enough to break in multiples pages - if (getDolGlobalString('MAIN_PDF_DATA_ON_FIRST_PAGE')) { - $showpricebeforepagebreak = 1; } else { - $showpricebeforepagebreak = 0; + // We found a page break + // Allows data in the first page if description is long enough to break in multiples pages + if (getDolGlobalString('MAIN_PDF_DATA_ON_FIRST_PAGE')) { + $showpricebeforepagebreak = 1; + } else { + $showpricebeforepagebreak = 0; + } } + } else { // No pagebreak + $pdf->commitTransaction(); } - } else { // No pagebreak - $pdf->commitTransaction(); + $posYAfterDescription = $pdf->GetY(); } - $posYAfterDescription = $pdf->GetY(); } $nexY = max($pdf->GetY(), $posYAfterImage); @@ -685,42 +719,42 @@ class pdf_espadon extends ModelePdfExpedition // weight $weighttxt = ''; - if (empty($object->lines[$i]->fk_product_type) && $object->lines[$i]->weight) { + if (empty($object->lines[$i]->fk_product_type) && $object->lines[$i]->weight && $object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE) { $weighttxt = round($object->lines[$i]->weight * $object->lines[$i]->qty_shipped, getDolGlobalInt('SHIPMENT_ROUND_WEIGHT_ON_PDF', 5)).' '.measuringUnitString(0, "weight", $object->lines[$i]->weight_units, 1); } $voltxt = ''; - if (empty($object->lines[$i]->fk_product_type) && $object->lines[$i]->volume && !getDolGlobalString('SHIPPING_PDF_HIDE_VOLUME')) { + if (empty($object->lines[$i]->fk_product_type) && $object->lines[$i]->volume && !getDolGlobalString('SHIPPING_PDF_HIDE_VOLUME') && $object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE) { $voltxt = round($object->lines[$i]->volume * $object->lines[$i]->qty_shipped, getDolGlobalInt('SHIPMENT_ROUND_VOLUME_ON_PDF', 5)).' '.measuringUnitString(0, "volume", $object->lines[$i]->volume_units ? $object->lines[$i]->volume_units : 0, 1); } // weight and volume - if ($this->getColumnStatus('weight')) { + if ($this->getColumnStatus('weight') && $object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE) { $this->printStdColumnContent($pdf, $curY, 'weight', $weighttxt.(($weighttxt && $voltxt) ? '
' : '').$voltxt); $nexY = max($pdf->GetY(), $nexY); } - if ($this->getColumnStatus('qty_asked')) { + if ($this->getColumnStatus('qty_asked') && $object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE) { $this->printStdColumnContent($pdf, $curY, 'qty_asked', (string) $object->lines[$i]->qty_asked); $nexY = max($pdf->GetY(), $nexY); } - if ($this->getColumnStatus('unit_order')) { + if ($this->getColumnStatus('unit_order') && $object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE) { $this->printStdColumnContent($pdf, $curY, 'unit_order', measuringUnitString((int) $object->lines[$i]->fk_unit)); $nexY = max($pdf->GetY(), $nexY); } - if ($this->getColumnStatus('qty_shipped')) { + if ($this->getColumnStatus('qty_shipped') && $object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE) { $this->printStdColumnContent($pdf, $curY, 'qty_shipped', (string) $object->lines[$i]->qty_shipped); $nexY = max($pdf->GetY(), $nexY); } - if ($this->getColumnStatus('subprice')) { + if ($this->getColumnStatus('subprice') && $object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE) { $this->printStdColumnContent($pdf, $curY, 'subprice', price($object->lines[$i]->subprice, 0, $outputlangs)); $nexY = max($pdf->GetY(), $nexY); } // Extrafields - if (!empty($object->lines[$i]->array_options)) { + if (!empty($object->lines[$i]->array_options) && $object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE) { foreach ($object->lines[$i]->array_options as $extrafieldColKey => $extrafieldValue) { if ($this->getColumnStatus($extrafieldColKey)) { $extrafieldValue = $this->getExtrafieldContent($object->lines[$i], $extrafieldColKey, $outputlangs); diff --git a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php index 9eb2577b223..dc7a49730a8 100644 --- a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php @@ -42,7 +42,6 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'; - /** * Class to manage PDF invoice template sponge */ @@ -702,10 +701,44 @@ class pdf_sponge extends ModelePDFFactures // Loop on each lines $pageposbeforeprintlines = $pdf->getPage(); $pagenb = $pageposbeforeprintlines; + + $pdf_sub_options = array(); + $pdf_sub_options['titleshowuponpdf'] = 1; + $pdf_sub_options['titleshowtotalexludingvatonpdf'] = 1; + for ($i = 0; $i < $nblines; $i++) { $linePosition = $i + 1; $curY = $nexY; + $sub_options = $object->lines[$i]->extraparams["subtotal"] ?? array(); + + if ($object->lines[$i]->special_code == SUBTOTALS_SPECIAL_CODE) { + $level = $object->lines[$i]->qty; + if ($sub_options) { + if (isset($sub_options['titleshowuponpdf'])) { + $pdf_sub_options['titleshowuponpdf'] = isset($pdf_sub_options['titleshowuponpdf']) && $pdf_sub_options['titleshowuponpdf'] < $level ? $pdf_sub_options['titleshowuponpdf'] : $level; + } elseif (isset($pdf_sub_options['titleshowuponpdf']) && abs($level) <= $pdf_sub_options['titleshowuponpdf']) { + unset($pdf_sub_options['titleshowuponpdf']); + } + if (isset($sub_options['titleshowtotalexludingvatonpdf'])) { + $pdf_sub_options['titleshowtotalexludingvatonpdf'] = isset($pdf_sub_options['titleshowtotalexludingvatonpdf']) && $pdf_sub_options['titleshowtotalexludingvatonpdf'] < $level ? $pdf_sub_options['titleshowtotalexludingvatonpdf'] : $level; + } elseif (isset($pdf_sub_options['titleshowtotalexludingvatonpdf']) && abs($level) <= $pdf_sub_options['titleshowtotalexludingvatonpdf']) { + unset($pdf_sub_options['titleshowtotalexludingvatonpdf']); + } + } else { + if (isset($pdf_sub_options['titleshowuponpdf']) && abs($level) <= $pdf_sub_options['titleshowuponpdf']) { + unset($pdf_sub_options['titleshowuponpdf']); + } + if (isset($pdf_sub_options['titleshowtotalexludingvatonpdf']) && abs($level) <= $pdf_sub_options['titleshowtotalexludingvatonpdf']) { + unset($pdf_sub_options['titleshowtotalexludingvatonpdf']); + } + } + } + + if (($curY + 6) > ($this->page_hauteur - $this->heightforfooter) || isset($sub_options['titleforcepagebreak']) && !($pdf->getNumPages() == 1 && $curY == $this->tab_top + $this->tabTitleHeight)) { + $object->lines[$i]->pagebreak = true; + } + // in First Check line page break and add page if needed if (isset($object->lines[$i]->pagebreak) && $object->lines[$i]->pagebreak) { // New page @@ -715,7 +748,7 @@ class pdf_sponge extends ModelePDFFactures } $pdf->setPage($pdf->getNumPages()); - $nexY = $this->tab_top_newpage; + $nexY = $curY = $this->tab_top_newpage; } $this->resetAfterColsLinePositionsData($nexY, $pdf->getPage()); @@ -767,8 +800,29 @@ class pdf_sponge extends ModelePDFFactures // Description of product line if ($this->getColumnStatus('desc')) { - $this->printColDescContent($pdf, $curY, 'desc', $object, $i, $outputlangs, $hideref, $hidedesc); - $this->setAfterColsLinePositionsData('desc', $pdf->GetY(), $pdf->getPage()); + if ($object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE) { + $this->printColDescContent($pdf, $curY, 'desc', $object, $i, $outputlangs, $hideref, $hidedesc); + $this->setAfterColsLinePositionsData('desc', $pdf->GetY(), $pdf->getPage()); + } else { + $bg_color = colorStringToArray(getDolGlobalString("SUBTOTAL_BACK_COLOR_LEVEL_".abs($object->lines[$i]->qty))); + $pdf->SetFillColor($bg_color[0], $bg_color[1], $bg_color[2]); + $pdf->SetXY($pdf->GetX() + 1, $curY); + $pdf->MultiCell($this->page_largeur - $this->marge_droite - $this->marge_gauche - 2, 6, '', 0, '', true); + $previous_align = array(); + $previous_align['align'] = $this->cols['desc']['content']['align']; + if ($object->lines[$i]->qty < 0) { + $langs->load("subtotals"); + $object->lines[$i]->desc = $langs->trans("SubtotalOf", $object->lines[$i]->desc); + if ($previous_align['align'] == 'L') { + $this->cols['desc']['content']['align'] = 'R'; + } elseif ($previous_align['align'] == 'R') { + $this->cols['desc']['content']['align'] = 'L'; + } + } + $this->printColDescContent($pdf, $curY, 'desc', $object, $i, $outputlangs, $hideref, $hidedesc); + $this->setAfterColsLinePositionsData('desc', $pdf->GetY(), $pdf->getPage()); + $this->cols['desc']['content']['align'] = $previous_align['align']; // Re align if we printed a subtotal ligne + } } @@ -792,46 +846,55 @@ class pdf_sponge extends ModelePDFFactures } // VAT Rate - if ($this->getColumnStatus('vat')) { + if ($this->getColumnStatus('vat') && $object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE) { $vat_rate = pdf_getlinevatrate($object, $i, $outputlangs, $hidedetails); $this->printStdColumnContent($pdf, $curY, 'vat', $vat_rate); } // Unit price before discount - if ($this->getColumnStatus('subprice')) { + if ($this->getColumnStatus('subprice') && $object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE && isset($pdf_sub_options['titleshowuponpdf'])) { $up_excl_tax = pdf_getlineupexcltax($object, $i, $outputlangs, $hidedetails); $this->printStdColumnContent($pdf, $curY, 'subprice', $up_excl_tax); } // Quantity // Enough for 6 chars - if ($this->getColumnStatus('qty')) { + if ($this->getColumnStatus('qty') && $object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE) { $qty = pdf_getlineqty($object, $i, $outputlangs, $hidedetails); $this->printStdColumnContent($pdf, $curY, 'qty', $qty); } // Situation progress - if ($this->getColumnStatus('progress')) { + if ($this->getColumnStatus('progress') && $object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE) { $progress = pdf_getlineprogress($object, $i, $outputlangs, $hidedetails); $this->printStdColumnContent($pdf, $curY, 'progress', $progress); } // Unit - if ($this->getColumnStatus('unit')) { + if ($this->getColumnStatus('unit') && $object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE) { $unit = pdf_getlineunit($object, $i, $outputlangs, $hidedetails); $this->printStdColumnContent($pdf, $curY, 'unit', $unit); } // Discount on line - if ($this->getColumnStatus('discount') && $object->lines[$i]->remise_percent) { + if ($this->getColumnStatus('discount') && $object->lines[$i]->remise_percent && $object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE) { $remise_percent = pdf_getlineremisepercent($object, $i, $outputlangs, $hidedetails); $this->printStdColumnContent($pdf, $curY, 'discount', $remise_percent); } // Total excl tax line (HT) if ($this->getColumnStatus('totalexcltax')) { - $total_excl_tax = pdf_getlinetotalexcltax($object, $i, $outputlangs, $hidedetails); - $this->printStdColumnContent($pdf, $curY, 'totalexcltax', $total_excl_tax); + if ($object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE && isset($pdf_sub_options['titleshowtotalexludingvatonpdf'])) { + $total_excl_tax = pdf_getlinetotalexcltax($object, $i, $outputlangs, $hidedetails); + $this->printStdColumnContent($pdf, $curY, 'totalexcltax', $total_excl_tax); + } elseif ($object->lines[$i]->qty < 0 && isset($sub_options['subtotalshowtotalexludingvatonpdf'])) { + if (isModEnabled('multicurrency') && $object->multicurrency_code != $conf->currency) { + $total_excl_tax = $object->getSubtotalLineMulticurrencyAmount($object->lines[$i]); + } else { + $total_excl_tax = $object->getSubtotalLineAmount($object->lines[$i]); + } + $this->printStdColumnContent($pdf, $curY, 'totalexcltax', $total_excl_tax); + } } // Total with tax line (TTC) diff --git a/htdocs/core/modules/modSubtotals.class.php b/htdocs/core/modules/modSubtotals.class.php new file mode 100644 index 00000000000..1330bd0d695 --- /dev/null +++ b/htdocs/core/modules/modSubtotals.class.php @@ -0,0 +1,168 @@ + + * Copyright (C) 2004-2011 Laurent Destailleur + * Copyright (C) 2005-2010 Regis Houssin + * Copyright (C) 2011 Dimitri Mouillard + * Copyright (C) 2013 Juanjo Menent + * Copyright (C) 2018 Charlene Benke + * Copyright (C) 2024 MDW + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * or see https://www.gnu.org/ + */ + +/** + * \defgroup subtotals Module subtotals + * \brief Module for subtotal lines management + * + * \file htdocs/core/modules/modsubtotal.class.php + * \ingroup subtotals + * \brief Description and activation file for the module subtotals + */ +include_once DOL_DOCUMENT_ROOT."/core/modules/DolibarrModules.class.php"; +require_once DOL_DOCUMENT_ROOT.'/subtotals/class/commonsubtotal.class.php'; + +/** + * Description and activation class for module subtotals + */ +class modSubtotals extends DolibarrModules +{ + /** + * Constructor. Define names, constants, directories, boxes, permissions + * + * @param DoliDB $db Database handler + */ + public function __construct($db) + { + global $conf, $user; // Required by some include code + + $this->db = $db; + + // 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 = SUBTOTALS_SPECIAL_CODE; + // Key text used to identify module (for permissions, menus, etc...) + $this->rights_class = 'subtotals'; + + // Family can be 'crm','financial','hr','projects','products','ecm','technic','other' + // It is used to group modules in module setup page + $this->family = "technic"; + $this->module_position = '42'; + // Module label (no space allowed), used if translation string 'ModuleXXXName' not found (where XXX is value of numeric property 'numero' of module) + $this->name = preg_replace('/^mod/i', '', get_class($this)); + // Module description, used if translation string 'ModuleXXXDesc' not found (where XXX is value of numeric property 'numero' of module) + $this->description = "Subtotal and title lines for certain documents"; + // Possible values for version are: 'development', 'experimental', 'dolibarr' or version + $this->version = 'dolibarr'; + // Key used in llx_const table to save module status enabled/disabled (where MYMODULE is value of property name of module in uppercase) + $this->const_name = 'MAIN_MODULE_'.strtoupper($this->name); + // Name of image file used for this module. + // If file is in theme/yourtheme/img directory under name object_pictovalue.png, use this->picto='pictovalue' + // If file is in module/img directory under name object_pictovalue.png, use this->picto='pictovalue@module' + $this->picto = 'donation'; + + // Data directories to create when module is enabled. + // Example: this->dirs = array("/mymodule/temp"); + $this->dirs = array("/subtotals/temp"); + $r = 0; + + // Config pages + $this->config_page_url = array("subtotals.php"); + + // Dependencies + $this->hidden = false; // A condition to hide module + $this->depends = array(); // List of module class names as string that must be enabled if this module is enabled + $this->requiredby = array(); // List of module ids to disable if this one is disabled + $this->conflictwith = array(); // List of module class names as string this module is in conflict with + $this->phpmin = array(7, 0); // Minimum version of PHP required by module + $this->need_dolibarr_version = array(3, 0); // Minimum version of Dolibarr required by module + $this->langfiles = array("subtotals"); + + // Constants + // Example: $this->const=array(0=>array('MYMODULE_MYNEWCONST1','chaine','myvalue','This is a constant to add',0), + // 1=>array('MYMODULE_MYNEWCONST2','chaine','myvalue','This is another constant to add',0) ); + $this->const = array(); // List of particular constants to add when module is enabled (key, 'chaine', value, desc, visible, 0 or 'allentities') + $r = 0; + + // Array to add new pages in new tabs + //$this->tabs[] = array('data'=>'user:+paidholidays:CPTitreMenu:holiday:$user->rights->holiday->read:/holiday/list.php?mainmenu=hrm&id=__ID__'); // We avoid to get one tab for each module. RH data are already in RH tab. + $this->tabs[] = array(); // To add a new tab identified by code tabname1 + + // Boxes + $this->boxes = array(); // List of boxes + $r = 0; + + // Add here list of php file(s) stored in includes/boxes that contains class to show a box. + // Example: + //$this->boxes[$r][1] = "myboxa.php"; + //$r++; + //$this->boxes[$r][1] = "myboxb.php"; + //$r++; + + // Permissions + $this->rights = array(); // Permission array used by this module + $r = 0; + + // Menus + //------- + $this->menu = 1; // This module add menu entries. They are coded into menu manager. + + $this->module_parts = array('substitutions' => 1); + + // Exports + $r = 0; + } + + /** + * Function called when module is enabled. + * The init function add constants, boxes, permissions and menus (defined in constructor) into Dolibarr database. + * It also creates data directories + * + * @param string $options Options when enabling module ('', 'newboxdefonly', 'noboxes') + * @return int 1 if OK, 0 if KO + */ + public function init($options = '') + { + global $conf; + + // Permissions + $this->remove($options); + + //ODT template + /*$src=DOL_DOCUMENT_ROOT.'/install/doctemplates/holiday/template_holiday.odt'; + $dirodt=DOL_DATA_ROOT.'/doctemplates/holiday'; + $dest=$dirodt.'/template_order.odt'; + + if (file_exists($src) && ! file_exists($dest)) + { + require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + dol_mkdir($dirodt); + $result=dol_copy($src, $dest, 0, 0); + if ($result < 0) + { + $langs->load("errors"); + $this->error=$langs->trans('ErrorFailToCopyFile', $src, $dest); + return 0; + } + } + */ + + $sql = array( + // "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->db->escape($this->const[0][2])."' AND type = 'holiday' AND entity = ".((int) $conf->entity), + // "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->db->escape($this->const[0][2])."','holiday',".((int) $conf->entity).")" + ); + + return $this->_init($sql, $options); + } +} diff --git a/htdocs/core/modules/propale/doc/pdf_cyan.modules.php b/htdocs/core/modules/propale/doc/pdf_cyan.modules.php index 0f090cf26a3..17f7abe524f 100644 --- a/htdocs/core/modules/propale/doc/pdf_cyan.modules.php +++ b/htdocs/core/modules/propale/doc/pdf_cyan.modules.php @@ -39,7 +39,6 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'; - /** * Class to generate PDF proposal Cyan */ @@ -559,10 +558,43 @@ class pdf_cyan extends ModelePDFPropales $pageposbeforeprintlines = $pdf->getPage(); $pagenb = $pageposbeforeprintlines; + $pdf_sub_options = array(); + $pdf_sub_options['titleshowuponpdf'] = 1; + $pdf_sub_options['titleshowtotalexludingvatonpdf'] = 1; + for ($i = 0; $i < $nblines; $i++) { $linePosition = $i + 1; $curY = $nexY; + $sub_options = $object->lines[$i]->extraparams["subtotal"] ?? array(); + + if ($object->lines[$i]->special_code == SUBTOTALS_SPECIAL_CODE) { + $level = $object->lines[$i]->qty; + if ($sub_options) { + if (isset($sub_options['titleshowuponpdf'])) { + $pdf_sub_options['titleshowuponpdf'] = isset($pdf_sub_options['titleshowuponpdf']) && $pdf_sub_options['titleshowuponpdf'] < $level ? $pdf_sub_options['titleshowuponpdf'] : $level; + } elseif (isset($pdf_sub_options['titleshowuponpdf']) && abs($level) <= $pdf_sub_options['titleshowuponpdf']) { + unset($pdf_sub_options['titleshowuponpdf']); + } + if (isset($sub_options['titleshowtotalexludingvatonpdf'])) { + $pdf_sub_options['titleshowtotalexludingvatonpdf'] = isset($pdf_sub_options['titleshowtotalexludingvatonpdf']) && $pdf_sub_options['titleshowtotalexludingvatonpdf'] < $level ? $pdf_sub_options['titleshowtotalexludingvatonpdf'] : $level; + } elseif (isset($pdf_sub_options['titleshowtotalexludingvatonpdf']) && abs($level) <= $pdf_sub_options['titleshowtotalexludingvatonpdf']) { + unset($pdf_sub_options['titleshowtotalexludingvatonpdf']); + } + } else { + if (isset($pdf_sub_options['titleshowuponpdf']) && abs($level) <= $pdf_sub_options['titleshowuponpdf']) { + unset($pdf_sub_options['titleshowuponpdf']); + } + if (isset($pdf_sub_options['titleshowtotalexludingvatonpdf']) && abs($level) <= $pdf_sub_options['titleshowtotalexludingvatonpdf']) { + unset($pdf_sub_options['titleshowtotalexludingvatonpdf']); + } + } + } + + if (($curY + 6) > ($this->page_hauteur - $heightforfooter) || isset($sub_options['titleforcepagebreak']) && !($pdf->getNumPages() == 1 && $curY == $tab_top + $this->tabTitleHeight)) { + $object->lines[$i]->pagebreak = true; + } + // in First Check line page break and add page if needed if (isset($object->lines[$i]->pagebreak) && $object->lines[$i]->pagebreak) { // New page @@ -572,7 +604,7 @@ class pdf_cyan extends ModelePDFPropales } $pdf->setPage($pdf->getNumPages()); - $nexY = $tab_top_newpage; + $nexY = $curY = $tab_top_newpage; } $this->resetAfterColsLinePositionsData($nexY, $pdf->getPage()); @@ -625,8 +657,29 @@ class pdf_cyan extends ModelePDFPropales $pdf->setPageOrientation('', true, $heightforfooter); // The only function to edit the bottom margin of current page to set it. if ($this->getColumnStatus('desc')) { - $this->printColDescContent($pdf, $curY, 'desc', $object, $i, $outputlangs, $hideref, $hidedesc); - $this->setAfterColsLinePositionsData('desc', $pdf->GetY(), $pdf->getPage()); + if ($object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE) { + $this->printColDescContent($pdf, $curY, 'desc', $object, $i, $outputlangs, $hideref, $hidedesc); + $this->setAfterColsLinePositionsData('desc', $pdf->GetY(), $pdf->getPage()); + } else { + $bg_color = colorStringToArray(getDolGlobalString("SUBTOTAL_BACK_COLOR_LEVEL_".abs($object->lines[$i]->qty))); + $pdf->SetFillColor($bg_color[0], $bg_color[1], $bg_color[2]); + $pdf->SetXY($pdf->GetX() + 1, $curY + 1); + $pdf->MultiCell($this->page_largeur - $this->marge_droite - $this->marge_gauche - 2, 5, '', 0, '', true); + $previous_align = array(); + $previous_align['align'] = $this->cols['desc']['content']['align']; + if ($object->lines[$i]->qty < 0) { + $langs->load("subtotals"); + $object->lines[$i]->desc = $langs->trans("SubtotalOf", $object->lines[$i]->desc); + if ($previous_align['align'] == 'L') { + $this->cols['desc']['content']['align'] = 'R'; + } elseif ($previous_align['align'] == 'R') { + $this->cols['desc']['content']['align'] = 'L'; + } + } + $this->printColDescContent($pdf, $curY, 'desc', $object, $i, $outputlangs, $hideref, $hidedesc); + $this->setAfterColsLinePositionsData('desc', $pdf->GetY(), $pdf->getPage()); + $this->cols['desc']['content']['align'] = $previous_align['align']; // Re align if we printed a subtotal ligne + } } $afterPosData = $this->getMaxAfterColsLinePositionsData(); @@ -651,41 +704,50 @@ class pdf_cyan extends ModelePDFPropales } // VAT Rate - if ($this->getColumnStatus('vat')) { + if ($this->getColumnStatus('vat') && $object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE) { $vat_rate = pdf_getlinevatrate($object, $i, $outputlangs, $hidedetails); $this->printStdColumnContent($pdf, $curY, 'vat', $vat_rate); } // Unit price before discount - if ($this->getColumnStatus('subprice')) { + if ($this->getColumnStatus('subprice') && $object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE && isset($pdf_sub_options['titleshowuponpdf'])) { $up_excl_tax = pdf_getlineupexcltax($object, $i, $outputlangs, $hidedetails); $this->printStdColumnContent($pdf, $curY, 'subprice', $up_excl_tax); } // Quantity // Enough for 6 chars - if ($this->getColumnStatus('qty')) { + if ($this->getColumnStatus('qty') && $object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE) { $qty = pdf_getlineqty($object, $i, $outputlangs, $hidedetails); $this->printStdColumnContent($pdf, $curY, 'qty', $qty); } // Unit - if ($this->getColumnStatus('unit')) { + if ($this->getColumnStatus('unit') && $object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE) { $unit = pdf_getlineunit($object, $i, $outputlangs, $hidedetails); $this->printStdColumnContent($pdf, $curY, 'unit', $unit); } // Discount on line - if ($this->getColumnStatus('discount') && $object->lines[$i]->remise_percent) { + if ($this->getColumnStatus('discount') && $object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE && $object->lines[$i]->remise_percent) { $remise_percent = pdf_getlineremisepercent($object, $i, $outputlangs, $hidedetails); $this->printStdColumnContent($pdf, $curY, 'discount', $remise_percent); } // Total excl tax line (HT) if ($this->getColumnStatus('totalexcltax')) { - $total_excl_tax = pdf_getlinetotalexcltax($object, $i, $outputlangs, $hidedetails); - $this->printStdColumnContent($pdf, $curY, 'totalexcltax', $total_excl_tax); + if ($object->lines[$i]->special_code != SUBTOTALS_SPECIAL_CODE && isset($pdf_sub_options['titleshowtotalexludingvatonpdf'])) { + $total_excl_tax = pdf_getlinetotalexcltax($object, $i, $outputlangs, $hidedetails); + $this->printStdColumnContent($pdf, $curY, 'totalexcltax', $total_excl_tax); + } elseif ($object->lines[$i]->qty < 0 && isset($sub_options['subtotalshowtotalexludingvatonpdf'])) { + if (isModEnabled('multicurrency') && $object->multicurrency_code != $conf->currency) { + $total_excl_tax = $object->getSubtotalLineMulticurrencyAmount($object->lines[$i]); + } else { + $total_excl_tax = $object->getSubtotalLineAmount($object->lines[$i]); + } + $this->printStdColumnContent($pdf, $curY, 'totalexcltax', $total_excl_tax); + } } // Total with tax line (TTC) diff --git a/htdocs/core/tpl/objectline_edit.tpl.php b/htdocs/core/tpl/objectline_edit.tpl.php index f20c6a1d79a..01c8d9c4a33 100644 --- a/htdocs/core/tpl/objectline_edit.tpl.php +++ b/htdocs/core/tpl/objectline_edit.tpl.php @@ -61,6 +61,11 @@ if (empty($object) || !is_object($object)) { @phan-var-force string $var '; +// Handle subtotals line edit +if (defined('SUBTOTALS_SPECIAL_CODE') && $line->special_code == SUBTOTALS_SPECIAL_CODE) { + return require DOL_DOCUMENT_ROOT.'/core/tpl/subtotal_edit.tpl.php'; +} + $usemargins = 0; if (isModEnabled('margin') && !empty($object->element) && in_array($object->element, array('facture', 'facturerec', 'propal', 'commande'))) { $usemargins = 1; diff --git a/htdocs/core/tpl/objectline_view.tpl.php b/htdocs/core/tpl/objectline_view.tpl.php index 07f1464fd92..666d89b9478 100644 --- a/htdocs/core/tpl/objectline_view.tpl.php +++ b/htdocs/core/tpl/objectline_view.tpl.php @@ -78,6 +78,11 @@ if (empty($object) || !is_object($object)) { @phan-var-force Object $objp '; +// Handle subtotals line view +if (defined('SUBTOTALS_SPECIAL_CODE') && $line->special_code == SUBTOTALS_SPECIAL_CODE) { + return require DOL_DOCUMENT_ROOT.'/core/tpl/subtotal_view.tpl.php'; +} + global $mysoc; global $forceall, $senderissupplier, $inputalsopricewithtax, $outputalsopricetotalwithtax; diff --git a/htdocs/core/tpl/originproductline.tpl.php b/htdocs/core/tpl/originproductline.tpl.php index ff8902fc24d..f4029abe9f0 100644 --- a/htdocs/core/tpl/originproductline.tpl.php +++ b/htdocs/core/tpl/originproductline.tpl.php @@ -20,6 +20,7 @@ /** * @var CommonObject $this * @var Conf $conf + * @var CommonObjectLine $line */ // Protection to avoid direct call of template if (empty($conf) || !is_object($conf)) { @@ -31,7 +32,25 @@ if (empty($conf) || !is_object($conf)) { element == 'shipping') { + $classname = ucfirst($line->element_type); + $objectsrc = new $classname($this->db); + $objectsrc_line = new $objectsrc->class_element_line($this->db); + '@phan-var-force CommonObjectLine $objectsrc_line'; + $objectsrc_line->fetch($line->origin_line_id); + $shipping_use_tpl = ($objectsrc_line->special_code == SUBTOTALS_SPECIAL_CODE); +} + +// Handle subtotals line edit +if (defined('SUBTOTALS_SPECIAL_CODE') && $line->special_code == SUBTOTALS_SPECIAL_CODE || isset($shipping_use_tpl)) { + return require DOL_DOCUMENT_ROOT.'/core/tpl/originsubtotalline.tpl.php'; +} + print ''; print ''.$this->tpl['label'].''; print ''.$this->tpl['description'].''; diff --git a/htdocs/core/tpl/originsubtotalline.tpl.php b/htdocs/core/tpl/originsubtotalline.tpl.php new file mode 100644 index 00000000000..21dc6c80591 --- /dev/null +++ b/htdocs/core/tpl/originsubtotalline.tpl.php @@ -0,0 +1,70 @@ + + * Copyright (C) 2017 Charlie Benke + * Copyright (C) 2022 Gauthier VERDOL + * Copyright (C) 2024 Frédéric France + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +/** + * @var CommonObject $this + * @var Conf $conf + * @var CommonObjectLine $line + */ +// Protection to avoid direct call of template +if (empty($conf) || !is_object($conf)) { + print "Error, template page can't be called as URL"; + exit(1); +} +?> + + +tpl['id'].'" class="'.(empty($this->tpl['strike']) ? '' : ' strikefordisabled').'" style="background:#'.$this->getSubtotalColors($line->qty).'">'; +print ''.$this->tpl['description'].''; +print ''; +print ''; +print ''; +if (isModEnabled("multicurrency")) { + print ''; +} + +print ''; +if (getDolGlobalString('PRODUCT_USE_UNITS')) { + print ''; +} + +print ''; +if ($this->tpl['qty'] < 0) { + print ''.$this->getSubtotalLineAmount($line).''; +} else { + print ''; +} + +$selected = 1; +if (!empty($selectedLines) && !in_array($this->tpl['id'], $selectedLines)) { + $selected = 0; +} +print ''; +print ''; +print ''; +print ''."\n"; +?> + diff --git a/htdocs/core/tpl/subtotal_ajaxrow.tpl.php b/htdocs/core/tpl/subtotal_ajaxrow.tpl.php new file mode 100644 index 00000000000..5021a71bfdd --- /dev/null +++ b/htdocs/core/tpl/subtotal_ajaxrow.tpl.php @@ -0,0 +1,299 @@ + + * Copyright (C) 2024 MDW + * Copyright (C) 2024 Frédéric France + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * or see https://www.gnu.org/ + */ + +/** + * Javascript code to activate the drag and drop on lines + * while using subtotal module + * You can use this if you want to be able to drag and drop rows of a HTML table. + * You must add id="tablelines" on table level tag + * $object and $object->id must be defined + * $object->fk_element or $fk_element must be defined + * you must have ($nboflines or count($object->lines) or count($taskarray) > 0) + * you must have $table_element_line = 'tablename' or $object->table_element_line with line to move + * + */ +/** + * @var Conf $conf + * @var CommonObject $object + * @var Translate $langs + * + * @var ?string $filepath + * @var ?string $fk_element + * @var ?int $nboflines + * @var ?string $tagidfortablednd + */ +// Protection to avoid direct call of template +if (empty($object) || !is_object($object)) { + print "Error, template page ".basename(__FILE__)." can't be called with no object defined."; + exit; +} +' +@phan-var-force ?string $fk_element +@phan-var-force ?Task[] $tasksarray +'; + +?> + + +id; +$fk_element = empty($object->fk_element) ? $fk_element : $object->fk_element; +$table_element_line = (empty($table_element_line) ? $object->table_element_line : $table_element_line); +$nboflines = count($object->lines); +$forcereloadpage = !getDolGlobalString('MAIN_FORCE_RELOAD_PAGE') ? 0 : 1; +$tagidfortablednd = (empty($tagidfortablednd) ? 'tablelines' : $tagidfortablednd); +$filepath = (empty($filepath) ? '' : $filepath); +$langs->load("subtotals"); + +if (GETPOST('action', 'aZ09') != 'editline' && $nboflines > 1 && $conf->browser->layout != 'phone') { ?> + + + + + + diff --git a/htdocs/core/tpl/subtotal_create.tpl.php b/htdocs/core/tpl/subtotal_create.tpl.php new file mode 100644 index 00000000000..9074724ca25 --- /dev/null +++ b/htdocs/core/tpl/subtotal_create.tpl.php @@ -0,0 +1,74 @@ + + * Copyright (C) 2024 MDW + * Copyright (C) 2024 Frédéric France + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * or see https://www.gnu.org/ + */ + +/** + * @var CommonObject $this + * @var CommonObject $object + * @var CommonObjectLine $line + * @var Form $form + * @var HookManager $hookmanager + * @var Translate $langs + * @var User $user + * + * @var array $depth_array + * @var array $titles + * @var string $type + */ + +' +@phan-var-force CommonObject $this +'; + +$depth_array = $depth_array ?? array(); +$titles = $titles ?? array(); + +if ($type == 'subtotal' && empty($titles)) { + setEventMessages("NoTitleError", null, 'errors'); + return; +} + +$formquestion = array(); + +if ($type == 'title') { + $formquestion = array( + array('type' => 'text', 'name' => 'subtotallinedesc', 'label' => $langs->trans("SubtotalLineDesc"), 'moreattr' => 'placeholder="' . $langs->trans("Description") . '"'), + array('type' => 'select', 'name' => 'subtotallinelevel', 'label' => $langs->trans("SubtotalLineLevel"), 'values' => $depth_array, 'default' => 1, 'select_show_empty' => 0), + array('type' => 'checkbox', 'value' => false, 'name' => 'titleshowuponpdf', 'label' => $langs->trans("ShowUPOnPDF")), + array('type' => 'checkbox', 'value' => false, 'name' => 'titleshowtotalexludingvatonpdf', 'label' => $langs->trans("ShowTotalExludingVATOnPDF")), + array('type' => 'checkbox', 'value' => false, 'name' => 'titleforcepagebreak', 'label' => $langs->trans("ForcePageBreak")), + ); +} elseif ($type == 'subtotal') { + $formquestion = array( + array('type' => 'select', 'name' => 'subtotaltitleline', 'label' => $langs->trans("CorrespondingTitleLine"), 'values' => $titles, 'select_show_empty' => 0), + array('type' => 'checkbox', 'value' => false, 'name' => 'subtotalshowtotalexludingvatonpdf', 'label' => $langs->trans("ShowTotalExludingVATOnPDF")), + ); +} + +$page = $_SERVER["PHP_SELF"]; + +if ($object->element == 'facture') { + $page .= '?facid=' . $object->id; +} elseif (in_array($object->element, array('propal', 'commande', 'facturerec', 'shipping'))) { + $page .= '?id=' . $object->id; +} + +$form_title = $type == 'title' ? $langs->trans('AddTitleLine') : $langs->trans('AddSubtotalLine'); + +print $form->formconfirm($page, $form_title, '', 'confirm_add' . $type . 'line', $formquestion, 'yes', 1); diff --git a/htdocs/core/tpl/subtotal_edit.tpl.php b/htdocs/core/tpl/subtotal_edit.tpl.php new file mode 100644 index 00000000000..aa57f7fa068 --- /dev/null +++ b/htdocs/core/tpl/subtotal_edit.tpl.php @@ -0,0 +1,165 @@ + + * Copyright (C) 2024 MDW + * Copyright (C) 2024 Frédéric France + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * or see https://www.gnu.org/ + */ + +/** + * @var CommonObject $this + * @var CommonObject $object + * @var CommonObjectLine $line + * @var Form $form + * @var Translate $langs + * @var User $user + * @var Conf $conf + * @var int $i + */ + +' +@phan-var-force Propal|Contrat|Commande|Facture|Expedition|Delivery|FactureFournisseur|FactureFournisseur|SupplierProposal $object +@phan-var-force CommonObjectLine|CommonInvoiceLine|CommonOrderLine|ExpeditionLigne|PropaleLigne $line +'; + +// Options for subtotal +$sub_options = $line->extraparams["subtotal"] ?? array(); + +$titleshowuponpdf = !empty($sub_options['titleshowuponpdf']); +$titleshowtotalexludingvatonpdf = !empty($sub_options['titleshowtotalexludingvatonpdf']); +$titleforcepagebreak = !empty($sub_options['titleforcepagebreak']); +$subtotalshowtotalexludingvatonpdf = !empty($sub_options['subtotalshowtotalexludingvatonpdf']); + +$line_options = array( + 'titleshowuponpdf' => array('type' => array('title'), 'value' => 'on', 'checked' => $titleshowuponpdf, 'trans_key' => 'ShowUPOnPDF'), + 'titleshowtotalexludingvatonpdf' => array('type' => array('title'), 'value' => 'on', 'checked' => $titleshowtotalexludingvatonpdf, 'trans_key' => 'ShowTotalExludingVATOnPDF'), + 'titleforcepagebreak' => array('type' => array('title'), 'value' => 'on', 'checked' => $titleforcepagebreak, 'trans_key' => 'ForcePageBreak'), + 'subtotalshowtotalexludingvatonpdf' => array('type' => array('subtotal'), 'value' => 'on', 'checked' => $subtotalshowtotalexludingvatonpdf, 'trans_key' => 'ShowTotalExludingVATOnPDF'), +); + +// Line type +$line_type = $line->qty > 0 ? 'title' : 'subtotal'; + +print "\n"; + +echo ''; + +if (getDolGlobalString('MAIN_VIEW_LINE_NUMBER')) { + echo '' . ($i + 1) . ''; +} + +// Base colspan if there is no module activated to display line correctly +$colspan = 4; + +// Handling colspan if margin module is enabled +if (!empty($object->element) && in_array($object->element, array('facture', 'facturerec', 'propal', 'commande')) && isModEnabled('margin') && empty($user->socid)) { + if ($user->hasRight('margins', 'creer')) { + $colspan += 1; + } + if (getDolGlobalString('DISPLAY_MARGIN_RATES') && $user->hasRight('margins', 'liretous')) { + $colspan += 1; + } + if (getDolGlobalString('DISPLAY_MARK_RATES') && $user->hasRight('margins', 'liretous')) { + $colspan += 1; + } +} + +// Handling colspan if multicurrency module is enabled +if (isModEnabled('multicurrency') && $object->multicurrency_code != $conf->currency) { + $colspan += 1; +} + +// Handling colspan if MAIN_NO_INPUT_PRICE_WITH_TAX conf is enabled +if (!getDolGlobalInt('MAIN_NO_INPUT_PRICE_WITH_TAX')) { + $colspan += 1; +} + +// Handling colspan if PRODUCT_USE_UNITS conf is enabled +if (getDolGlobalString('PRODUCT_USE_UNITS')) { + $colspan += 1; +} + +?> + + +
+ + + + + + + + fk_prev_id != null && in_array($object->element, array('facture', 'facturedet'))) { + /** @var CommonInvoice $object */ + // @phan-suppress-next-line PhanUndeclaredConstantOfClass + if ($object->type == $object::TYPE_SITUATION) { // The constant TYPE_SITUATION exists only for object invoice + // Set constant to disallow editing during a situation cycle + $situationinvoicelinewithparent = 1; + } + } + + // Do not allow editing during a situation cycle + // but in some situations that is required (update legal information for example) + if (getDolGlobalString('INVOICE_SITUATION_CAN_FORCE_UPDATE_DESCRIPTION')) { + $situationinvoicelinewithparent = 0; + } + + $langs->load('subtotals'); + + + if (!$situationinvoicelinewithparent) { + print ''; + $depth_array = $this->getPossibleLevels($langs); + print $form->selectarray('line_depth', $depth_array, abs($line->qty), 0, 0, 0, '', 0, 0, $disabled); + if ($disabled) { + print ''; + } + print '
    '; + foreach ($line_options as $key => $value) { + if (in_array($line_type, $value['type'])) { + print '
  • '; + print '
  • '; + } + } + print '
'; + print ''; + } else { + print ''; + } + ?> + + + + ">
+ "> + + + + diff --git a/htdocs/core/tpl/subtotal_expedition_view.tpl.php b/htdocs/core/tpl/subtotal_expedition_view.tpl.php new file mode 100644 index 00000000000..370405351e5 --- /dev/null +++ b/htdocs/core/tpl/subtotal_expedition_view.tpl.php @@ -0,0 +1,92 @@ +origin_line_id)) { + print ''; // id of order line + $id = $line->id; + $element = $line->element; + $desc = $line->desc; + $line_options = $line->extraparams["subtotal"] ?? array(); + $buttons = $object->status == Expedition::STATUS_DRAFT; +} else { + print ''; // id of order line + $id = $line->rowid; + $element = "commande"; + $desc = $line->description; + $extraparams = (array) json_decode($line->extraparams, true); + $line_options = $extraparams["subtotal"] ?? array(); +} + +$langs->load('subtotals'); + +$line_color = $object->getSubtotalColors((int) $line->qty); +$colspan = 7; + +if (isModEnabled('productbatch')) { + $colspan++; +} +if (isModEnabled('stock')) { + $colspan++; +} + +print ''; + +if (getDolGlobalString('MAIN_VIEW_LINE_NUMBER')) { + print '' . ($i + 1) . ''; +} + +if ($line->qty > 0) { ?> + >qty - 1) * 8); ?> + trans("ShowUPOnPDF"), 'invoicing'); + } + if (array_key_exists('titleshowtotalexludingvatonpdf', $line_options)) { + echo '  %'; + } + if (array_key_exists('titleforcepagebreak', $line_options)) { + echo ' ' . img_picto($langs->trans("ForcePageBreak"), 'file'); + } + ?> + +qty < 0) { ?> + colspan=""> + trans("ShowTotalExludingVATOnPDF") . '">%'; + } + ?> + +'; + echo ''; + if (!colorIsLight($line_color)) { + echo img_delete('default', 'class="pictodelete" style="color: white"'); + } else { + echo img_delete('default', 'class="pictodelete" style="color: #666"'); + } + echo ' '; +} + +print ""; diff --git a/htdocs/core/tpl/subtotal_view.tpl.php b/htdocs/core/tpl/subtotal_view.tpl.php new file mode 100644 index 00000000000..cf1fe6fd56e --- /dev/null +++ b/htdocs/core/tpl/subtotal_view.tpl.php @@ -0,0 +1,290 @@ + + * Copyright (C) 2024 MDW + * Copyright (C) 2024 Frédéric France + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * or see https://www.gnu.org/ + */ + +/** + * @var CommonObject $object + * @var CommonObject $this + * @var CommonObjectLine $line + * @var Conf $conf + * @var Form $form + * @var Societe $mysoc + * @var Translate $langs + * @var User $user + * @var string $action + * + * @var int $num + * @var int $i + */ + +' +@phan-var-force CommonObjectLine|CommonInvoiceLine|CommonOrderLine|ExpeditionLigne|PropaleLigne $line +@phan-var-force CommonObject $this +@phan-var-force Propal|Contrat|Commande|Facture|Expedition|Delivery|FactureFournisseur|FactureFournisseur|SupplierProposal $object +@phan-var-force int $num +'; + +echo "\n"; + +$langs->load('subtotals'); + +$line_options = $line->extraparams["subtotal"] ?? array(); + +$line_color = $this->getSubtotalColors($line->qty); + +echo ''; + +// Showing line number if conf is enabled +if (getDolGlobalString('MAIN_VIEW_LINE_NUMBER')) { + echo '' . ($i + 1) . ''; +} + +if ($line->qty > 0) { ?> + >qty - 1) * 8); ?> + desc; + if (array_key_exists('titleshowuponpdf', $line_options)) { + echo ' ' . img_picto($langs->trans("ShowUPOnPDF"), 'invoicing'); + } + if (array_key_exists('titleshowtotalexludingvatonpdf', $line_options)) { + echo '  %'; + } + if (array_key_exists('titleforcepagebreak', $line_options)) { + echo ' ' . img_picto($langs->trans("ForcePageBreak"), 'file'); + } + ?> + + + status == 0 && $object->element != 'facturerec') { + if (GETPOST('mode', 'aZ09') == 'vatforblocklines' && GETPOSTINT('lineid') == $line->id) { + $type_tva = $type_tva ?? 0; + print '
'; + print $form->load_tva('vatforblocklines', '', $mysoc, $object->thirdparty, 0, $line->info_bits, $line->product_type, false, 1, $type_tva); + print ''; + print ''; + print '
'; + } else { + print 'id . '">'; + if (!colorIsLight($line_color)) { + echo img_edit($langs->trans("ApplyVATForBlock"), 0, 'style="color: white"'); + } else { + echo img_edit($langs->trans("ApplyVATForBlock"), 0, 'style="color: #666"'); + } + echo ''; + } + } + ?> + + + multicurrency_code != $conf->currency) { + print ''; + } + // Handling colspan if MAIN_NO_INPUT_PRICE_WITH_TAX conf is enabled + if (!getDolGlobalInt('MAIN_NO_INPUT_PRICE_WITH_TAX') && $object->element != 'facturerec') { + print ''; + } + + print ''; + + // Handling colspan if PRODUCT_USE_UNITS conf is enabled + if (getDolGlobalString('PRODUCT_USE_UNITS')) { + print ''; + } + ?> + + status == 0 && $object->element != 'facturerec') { + if (GETPOST('mode', 'aZ09') == 'discountforblocklines' && GETPOSTINT('lineid') == $line->id) { + print '
'; + print '%'; + print ''; + print ''; + print '
'; + } else { + print 'id . '">'; + if (!colorIsLight($line_color)) { + echo img_edit($langs->trans("ApplyDiscountForBlock"), 0, 'style="color: white"'); + } else { + echo img_edit($langs->trans("ApplyDiscountForBlock"), 0, 'style="color: #666"'); + } + echo ''; + } + } + ?> + + situation_cycle_ref) && $this->situation_cycle_ref) { + print ''; + if (getDolGlobalInt('INVOICE_USE_SITUATION') == 2) { + print ''; + } + print ''; + } + + // Handling colspan if margin module is enabled + if (!empty($object->element) && in_array($object->element, array('facture', 'facturerec', 'propal', 'commande')) && isModEnabled('margin') && empty($user->socid)) { + if ($user->hasRight('margins', 'creer')) { + print ''; + } + if (getDolGlobalString('DISPLAY_MARGIN_RATES') && $user->hasRight('margins', 'liretous')) { + print ''; + } + if (getDolGlobalString('DISPLAY_MARK_RATES') && $user->hasRight('margins', 'liretous')) { + print ''; + } + } + ?> + + multicurrency_code != $conf->currency) { ?> + + +qty < 0) { + // Base colspan if there is no module activated to display line correctly + $colspan = 3; + + if (isset($this->situation_cycle_ref) && $this->situation_cycle_ref) { + $colspan += 2; + if (getDolGlobalInt('INVOICE_USE_SITUATION') == 2) { + $colspan += 1; + } + } + + // Handling colspan if margin module is enabled + if (!empty($object->element) && in_array($object->element, array('facture', 'facturerec', 'propal', 'commande')) && isModEnabled('margin') && empty($user->socid)) { + if ($user->hasRight('margins', 'creer')) { + $colspan += 1; + } + if (getDolGlobalString('DISPLAY_MARGIN_RATES') && $user->hasRight('margins', 'liretous')) { + $colspan += 1; + } + if (getDolGlobalString('DISPLAY_MARK_RATES') && $user->hasRight('margins', 'liretous')) { + $colspan += 1; + } + } + + // Handling colspan if multicurrency module is enabled + if (isModEnabled('multicurrency') && $object->multicurrency_code != $conf->currency) { + $colspan += 1; + } + + // Handling colspan if MAIN_NO_INPUT_PRICE_WITH_TAX conf is enabled + if (!getDolGlobalInt('MAIN_NO_INPUT_PRICE_WITH_TAX') && $object->element != 'facturerec') { + $colspan += 1; + } + + // Handling colspan if PRODUCT_USE_UNITS conf is enabled + if (getDolGlobalString('PRODUCT_USE_UNITS')) { + $colspan += 1; + } + ?> + colspan=""> + desc; + if (array_key_exists('subtotalshowtotalexludingvatonpdf', $line_options)) { + echo '  %'; + } + echo ' :'; + ?> + + > + getSubtotalLineAmount($line); + ?> + + multicurrency_code != $conf->currency) { + echo ''; + echo $this->getSubtotalLineMulticurrencyAmount($line); + echo ''; + } + ?> +status == 0) { + // Edit picto + echo ''; + echo ''; + if (!colorIsLight($line_color)) { + echo img_edit('default', 0, 'style="color: white"'); + } else { + echo img_edit('default', 0, 'style="color: #666"'); + } + echo ' '; + + // Delete picto + echo ''; + echo ''; + if (!colorIsLight($line_color)) { + echo img_delete('default', 'class="pictodelete" style="color: white"'); + } else { + echo img_delete('default', 'class="pictodelete" style="color: #666"'); + } + echo ' '; + + // Move up-down picto + if ($num > 1 && $conf->browser->layout != 'phone' && ((property_exists($this, 'situation_counter') && $this->situation_counter == 1) || empty($this->situation_cycle_ref)) && empty($disablemove)) { + echo ''; + if ($i > 0) { + echo ''; + echo img_up('default', 0, 'imgupforline'); + echo ''; + } + if ($i < $num - 1) { + echo ''; + echo img_down('default', 0, 'imgdownforline'); + echo ''; + } + echo ''; + } else { + echo 'browser->layout != 'phone' && empty($disablemove)) ? ' class="linecolmove tdlineupdown center"' : ' class="linecolmove center"') . '>'; + } +} else { + $colspan = 3; + if (isModEnabled('asset') && $object->element == 'invoice_supplier') { + $colspan++; + } + print ''; +} + +if ($action == 'selectlines') { ?> + +'; +echo ''; +?> diff --git a/htdocs/core/tpl/subtotalline_select.tpl.php b/htdocs/core/tpl/subtotalline_select.tpl.php new file mode 100644 index 00000000000..d3c0c5312a9 --- /dev/null +++ b/htdocs/core/tpl/subtotalline_select.tpl.php @@ -0,0 +1,24 @@ +getSubtotalColors($line->qty); + +print ''."\n"; +print ''."\n"; + + +$selected = 1; +if (!empty($selectedLines) && !in_array($this->tpl['id'], $selectedLines)) { + $selected = 0; +} +print ""; +print ''; +print $line->desc . "\n"; + + +print ''; diff --git a/htdocs/expedition/card.php b/htdocs/expedition/card.php index 6543705f137..565e20ced65 100644 --- a/htdocs/expedition/card.php +++ b/htdocs/expedition/card.php @@ -400,6 +400,7 @@ if (empty($reshook)) { } if (($totalqty > 0 || getDolGlobalString('SHIPMENT_GETS_ALL_ORDER_PRODUCTS')) && !$error) { // There is at least one thing to ship and no error + $selected_subtotal_lines = GETPOST('subtotal_toselect', 'array'); for ($i = 0; $i < $num; $i++) { $qty = "qtyl".$i; @@ -435,6 +436,9 @@ if (empty($reshook)) { $error++; } } + if (isModEnabled('subtotals') && $objectsrc->lines[$i]->special_code == SUBTOTALS_SPECIAL_CODE && in_array($objectsrc->lines[$i]->id, $selected_subtotal_lines)) { + $object->addSubtotalLine($langs, $objectsrc->lines[$i]->desc, (int) $objectsrc->lines[$i]->qty, $objectsrc->lines[$i]->extraparams, $objectsrc->lines[$i]->id); + } } } else { // batch mode @@ -478,6 +482,14 @@ if (empty($reshook)) { if (!$error) { $db->commit(); + $object->fetch_lines(); + foreach ($object->lines as $line) { + $objectsrc_line = new $objectsrc->class_element_line($db); + '@phan-var-force CommonObjectLine $objectsrc_line'; + $objectsrc_line->fetch($line->origin_line_id); + $line->extraparams = $objectsrc_line->extraparams; + $line->setExtraParameters(); + } header("Location: card.php?id=".$object->id); exit; } else { @@ -559,6 +571,34 @@ if (empty($reshook)) { // setEventMessages($object->error, $object->errors, 'errors'); // } //} + } elseif ($action == 'confirm_delete_subtotalline' && $confirm == 'yes' && $permissiontoadd) { + $result = $object->deleteSubtotalLine($langs, GETPOSTINT('lineid'), (bool) GETPOST('deletecorrespondingsubtotalline'), $user); + if ($result > 0) { + // reorder lines + $object->line_order(true, 'ASC', false); + // Define output language + $outputlangs = $langs; + $newlang = ''; + if (getDolGlobalInt('MAIN_MULTILANGS') /* && empty($newlang) */ && GETPOST('lang_id', 'aZ09')) { + $newlang = GETPOST('lang_id', 'aZ09'); + } + if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) { + $newlang = $object->thirdparty->default_lang; + } + if (!empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) { + $ret = $object->fetch($object->id); // Reload to get new records + $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + + header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id); + exit; + } else { + setEventMessages($object->error, $object->errors, 'errors'); + } } elseif ($action == 'setdate_livraison' && $user->hasRight('expedition', 'creer')) { $datedelivery = dol_mktime(GETPOSTINT('liv_hour'), GETPOSTINT('liv_min'), 0, GETPOSTINT('liv_month'), GETPOSTINT('liv_day'), GETPOSTINT('liv_year')); @@ -1196,9 +1236,27 @@ if ($action == 'create') { $alreadyQtyBatchSetted = $alreadyQtySetted = array(); + $title_lines_to_disable = array(); + if ($numAsked) { + if (isModEnabled('subtotals')) { + if (!(getDolGlobalString('SHIPMENT_SUPPORTS_SERVICES') || getDolGlobalString('STOCK_SUPPORTS_SERVICES'))) { + $title_lines_to_disable = $object->getDisabledShippmentSubtotalLines(); + } + foreach ($object->lines as $line) { + if ($line->special_code == SUBTOTALS_SPECIAL_CODE) { + $show_check_add_buttons = true; + break; + } + } + } print ''; - print ''.$langs->trans("Description").''; + print ''; + if (isset($show_check_add_buttons)) { + print $form->showCheckAddButtons('checkforselect'); + } + print $langs->trans("Description"); + print ''; print ''.$langs->trans("QtyOrdered").''; print ''.$langs->trans("QtyShipped").''; print ''.$langs->trans("QtyToShip"); @@ -1244,7 +1302,7 @@ if ($action == 'create') { setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); } - if (empty($reshook)) { + if (empty($reshook) && $line->special_code != SUBTOTALS_SPECIAL_CODE) { // Show product and description $type = $line->product_type ? $line->product_type : $line->fk_product_type; // Try to enhance type detection using date_start and date_end for free lines where type @@ -1895,6 +1953,8 @@ if ($action == 'create') { print $expLine->showOptionals($extrafields, 'edit', array('style' => 'class="drag drop oddeven"', 'colspan' => $colspan), (string) $indiceAsked, '', '1'); } + } elseif (empty($reshook) && $line->special_code == SUBTOTALS_SPECIAL_CODE && !in_array($line->id, $title_lines_to_disable)) { + require dol_buildpath('/core/tpl/subtotalline_select.tpl.php'); } $indiceAsked++; @@ -1965,6 +2025,20 @@ if ($action == 'create') { ); } + // Confirmation de la suppression d'une ligne subtotal + if ($action == 'ask_subtotal_deleteline') { + $lineid = GETPOSTINT('lineid'); + $langs->load("subtotals"); + $title = "DeleteSubtotalLine"; + $question = "ConfirmDeleteSubtotalLine"; + if (GETPOST('type') == 'title') { + $formconfirm = array(array('type' => 'checkbox', 'name' => 'deletecorrespondingsubtotalline', 'label' => $langs->trans("DeleteCorrespondingSubtotalLine"), 'value' => 0)); + $title = "DeleteTitleLine"; + $question = "ConfirmDeleteTitleLine"; + } + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$lineid, $langs->trans($title), $langs->trans($question), 'confirm_delete_subtotalline', $formconfirm, 'no', 1); + } + // Confirmation validation if ($action == 'valid') { $objectref = substr($object->ref, 1, 4); @@ -2403,7 +2477,7 @@ if ($action == 'create') { // Get list of products already sent for same source object into $alreadysent $alreadysent = array(); if ($origin && $origin_id > 0) { - $sql = "SELECT obj.rowid, obj.fk_product, obj.label, obj.description, obj.product_type as fk_product_type, obj.qty as qty_asked, obj.fk_unit, obj.date_start, obj.date_end"; + $sql = "SELECT obj.rowid, obj.fk_product, obj.label, obj.description, obj.product_type as fk_product_type, obj.qty as qty_asked, obj.fk_unit, obj.date_start, obj.date_end, obj.special_code"; $sql .= ", ed.rowid as shipmentline_id, ed.qty as qty_shipped, ed.fk_expedition as expedition_id, ed.fk_elementdet, ed.fk_entrepot"; $sql .= ", e.rowid as shipment_id, e.ref as shipment_ref, e.date_creation, e.date_valid, e.date_delivery, e.date_expedition"; //if (getDolGlobalInt('MAIN_SUBMODULE_DELIVERY')) $sql .= ", l.rowid as livraison_id, l.ref as livraison_ref, l.date_delivery, ld.qty as qty_received"; @@ -2454,7 +2528,7 @@ if ($action == 'create') { setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); } - if (empty($reshook)) { + if (empty($reshook) && $lines[$i]->product_type != "9") { print ''; // id of order line print ''; @@ -2852,6 +2926,13 @@ if ($action == 'create') { print $lines[$i]->showOptionals($extrafields, 'view', array('colspan' => $colspan), !empty($indiceAsked) ? $indiceAsked : '', '', '', 'card'); } } + } elseif (empty($reshook) && $lines[$i]->product_type == "9") { + $objectsrc = new OrderLine($db); + $objectsrc->fetch($lines[$i]->origin_line_id); + if ($objectsrc->special_code == SUBTOTALS_SPECIAL_CODE) { + $line = $lines[$i]; + require dol_buildpath('/core/tpl/subtotal_expedition_view.tpl.php'); + } } } diff --git a/htdocs/expedition/class/expedition.class.php b/htdocs/expedition/class/expedition.class.php index 6132be45b79..4b52d425025 100644 --- a/htdocs/expedition/class/expedition.class.php +++ b/htdocs/expedition/class/expedition.class.php @@ -47,7 +47,7 @@ if (isModEnabled('order')) { } require_once DOL_DOCUMENT_ROOT.'/expedition/class/expeditionlinebatch.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/commonsignedobject.class.php'; - +require_once DOL_DOCUMENT_ROOT.'/subtotals/class/commonsubtotal.class.php'; /** * Class to manage shipments @@ -58,6 +58,7 @@ class Expedition extends CommonObject { use CommonIncoterm; use CommonSignedObject; + use CommonSubtotal; /** * @var string ID to identify managed object @@ -500,6 +501,14 @@ class Expedition extends CommonObject $kits_list = array(); if (getDolGlobalInt('PRODUIT_SOUSPRODUITS')) { for ($i = 0; $i < $num; $i++) { + $objectsrc = new OrderLine($this->db); + $objectsrc->fetch($this->lines[$i]->origin_line_id); + if ($this->lines[$i]->product_type == "9" && $objectsrc->special_code == SUBTOTALS_SPECIAL_CODE) { + if ($this->create_line($this->lines[$i]->entrepot_id, $this->lines[$i]->origin_line_id, $this->lines[$i]->qty, $this->lines[$i]->rang, $this->lines[$i]->array_options) <= 0) { + $error++; + } + continue; + } if (empty($this->lines[$i]->product_type) || getDolGlobalString('STOCK_SUPPORTS_SERVICES') || getDolGlobalString('SHIPMENT_SUPPORTS_SERVICES')) { // virtual products $line = $this->lines[$i]; @@ -1917,7 +1926,7 @@ class Expedition extends CommonObject $sql .= ", cd.total_ht, cd.total_localtax1, cd.total_localtax2, cd.total_ttc, cd.total_tva"; $sql .= ", cd.fk_remise_except, cd.fk_product_fournisseur_price as fk_fournprice"; $sql .= ", cd.vat_src_code, cd.tva_tx, cd.localtax1_tx, cd.localtax2_tx, cd.localtax1_type, cd.localtax2_type, cd.info_bits, cd.price, cd.subprice, cd.remise_percent,cd.buy_price_ht as pa_ht"; - $sql .= ", cd.fk_multicurrency, cd.multicurrency_code, cd.multicurrency_subprice, cd.multicurrency_total_ht, cd.multicurrency_total_tva, cd.multicurrency_total_ttc, cd.rang, cd.date_start, cd.date_end"; + $sql .= ", cd.fk_multicurrency, cd.multicurrency_code, cd.multicurrency_subprice, cd.multicurrency_total_ht, cd.multicurrency_total_tva, cd.multicurrency_total_ttc, cd.rang, cd.date_start, cd.date_end, cd.special_code"; $sql .= ", ed.rowid as line_id, ed.qty as qty_shipped, ed.fk_element, ed.fk_elementdet, ed.element_type, ed.fk_entrepot, ed.extraparams"; $sql .= ", p.ref as product_ref, p.label as product_label, p.fk_product_type, p.barcode as product_barcode"; $sql .= ", p.weight, p.weight_units, p.length, p.length_units, p.width, p.width_units, p.height, p.height_units"; @@ -2055,6 +2064,8 @@ class Expedition extends CommonObject $line->date_start = $this->db->jdate($obj->date_start); $line->date_end = $this->db->jdate($obj->date_end); + $line->special_code = $obj->special_code; + // Multicurrency $this->fk_multicurrency = $obj->fk_multicurrency; $this->multicurrency_code = $obj->multicurrency_code; diff --git a/htdocs/expedition/class/expeditionligne.class.php b/htdocs/expedition/class/expeditionligne.class.php index ec409c4f6e6..5879f516270 100644 --- a/htdocs/expedition/class/expeditionligne.class.php +++ b/htdocs/expedition/class/expeditionligne.class.php @@ -372,11 +372,23 @@ class ExpeditionLigne extends CommonObjectLine global $langs; $error = 0; + $skip_check_parameters = false; + + // Handling parent line subtotal line + if (!empty($this->element_type) + && !empty($this->fk_elementdet) + && $this->element_type == 'commande') { + $objectsrc_line = new OrderLine($this->db); + $objectsrc_line->fetch($this->fk_elementdet); + $skip_check_parameters = $objectsrc_line->special_code == SUBTOTALS_SPECIAL_CODE; + } + // Check parameters - if (empty($this->fk_expedition) + if ((empty($this->fk_expedition) || empty($this->fk_product) // product id is mandatory || (empty($this->fk_elementdet) && empty($this->fk_parent)) // at least origin line id of parent line id is set - || !is_numeric($this->qty)) { + || !is_numeric($this->qty)) + && !$skip_check_parameters) { $langs->load('errors'); $this->errors[] = $langs->trans('ErrorMandatoryParametersNotProvided'); return -1; diff --git a/htdocs/expedition/shipment.php b/htdocs/expedition/shipment.php index 3c012575de4..4dd45ab12a9 100644 --- a/htdocs/expedition/shipment.php +++ b/htdocs/expedition/shipment.php @@ -614,7 +614,7 @@ if ($order_id > 0 || !empty($ref)) { $sql .= " cd.qty, cd.fk_unit, cd.rang,"; $sql .= ' cd.date_start,'; $sql .= ' cd.date_end,'; - $sql .= ' cd.special_code,'; + $sql .= ' cd.special_code, cd.extraparams,'; $sql .= ' p.rowid as prodid, p.label as product_label, p.entity, p.ref, p.fk_product_type as product_type, p.description as product_desc,'; $sql .= ' p.weight, p.weight_units, p.length, p.length_units, p.width, p.width_units, p.height, p.height_units,'; $sql .= ' p.surface, p.surface_units, p.volume, p.volume_units'; @@ -661,7 +661,7 @@ if ($order_id > 0 || !empty($ref)) { setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); } - if (empty($reshook)) { + if (empty($reshook) && $objp->special_code != SUBTOTALS_SPECIAL_CODE) { // Show product and description $type = isset($objp->type) ? $objp->type : $objp->product_type; @@ -840,6 +840,9 @@ if ($order_id > 0 || !empty($ref)) { } } } + } elseif (empty($reshook) && $objp->special_code == SUBTOTALS_SPECIAL_CODE) { + $line = $objp; + require dol_buildpath('/core/tpl/subtotal_expedition_view.tpl.php'); } $i++; } diff --git a/htdocs/install/doctemplates/invoices/template_invoice.odt b/htdocs/install/doctemplates/invoices/template_invoice.odt index 5d44e1a606cf1772eeb30cda382057c8438c9ad7..9d1c0e68d4ff675d86e18989ae22296b4f7c0ba7 100644 GIT binary patch literal 35727 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 V4)A7W11S>(!c<_PBLd3H3;+`^Soi<{ literal 35166 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 literal 20174 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 literal 28534 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 bBY;B-j^aDOo0ScuOb`eQfT4S+6~qGo?rKh+ literal 25555 zcmbTc1C%C9vo_kcZQGi*ZM&y!+qP|6)AqEd-92sFwynQs?{9zSJLkW5t$S{*RqtCB z@nj$~GO9A888zVYfeMfUgI$Jwq8zWmoXKP~{Cpsr%Hz)c3CQMJp1i}Oa0N~I0moQ@|eL6R5 zD{j889|9L+2gfgQJVcCi3`7LRHiouF<~F80L@LUnwCqHDyinY>CMM>F#+?6Xp#3sM zpWv&hjU(sZEFL0f2OG}6Y~i%gw>Eaati6A}EYAOEAnnTUA*>D@nO@In!A8yRwbwK3*pVqj#ZWniXdWKd>g%KAH(hmhR$W#Wg8yLZ+Bw)-7#lj#Gk;^S zW+V}GHn%dO{WAV9lm1KGA5RS(jQ94_!rC7*1_l>Dl;3~zo>?0Uo8xsj2-@q#qjN4JR4gZT30i3Cu2uDeZw!K{x2vC zGZPU#@84cJJATP9GBz={F*f?!>Ob>{he*Q4#MZ%D-_X3T!G?hGe+U0xN@xDxNoV;3 z|JP*T{L|0>b@%Tf`-}W{E`or7_$#q}<+6VtFke@W#!i1?*zr$3>eQ5R++j!PysQy_ zmK7H#%an&y3V~sk7SHpOwm2j^18a<*r;~uYx-2yY&IHXej%p%@@^zA`@_E-`Tl3Ko z-r0jqI-t1hxSeIb1Tpd>Or7Prbf2sK?wO12yS8K03tSe8L4qi*G_422Qy_QbTzOC9Wt;}49_vQO*HvU~ljbAjw!-DG=QwbN){+wmjx~i)Tj!iQ( z@^0@1H2k<#&Gu+!MaAfDlrJ!E_PMUh`P)mu)=VgK7Cb=_PT)e+2;~tiyrD3lv_~`~ zGFAk~@o-6RYls+3KFV!!*Z?Y>kUIZQ?5cOnlrEtq`O!Xu4ak<1AJIFkE3E031CvZ_ z&%EAkT@*H~@KjB=4SY3`8S`E=d0vf0CQ?H#7S3_dNYFjKLn$jZ1&kQ`gte*+zxfag z5z|*DnlY&yl|@eKNy$oriNg0-e~i{|2z$}O&bQl}H~h+5>3+Cv2&lL`B7}f|39=SJ zhobSG9C(~3y?pqgckb)AbZy5wPDc`fX>hnnxWJptz-*8-*6O@bRzQLeLG*QGv4vSh3J?;#rvKs58!Qd`DQRy(WNN0RyerobP zZSB_bR^j113Zgn7YpuSSWGSpFG*HQWJ9%Ek+f6r&fJSx4>9Zqn`I*J65g#Jp#M)TN zIeYPD003jQn*w#5Pk1*M<4-A+%wpo-ZYhRZ4OKMDb3Et_YdGSzZ*0L98rL(H;R`r8ds z2ssdMam8p0N4eY@3p7%v9|1x0m63~G03{8yW)mYXHGuJ%g0U6~*TjMF$1fqNjgdp1 zF4AB>L?J9_e;}@27YirW+jhMNP?0K4SLE>kiICda-&Bm8NnXr|;_0=XhoGFy8z)MY zq<~i_$jh}S#`d9FLkANyK~kD)scY17jE-~`U$D8Zr%NhN9Y|uYP8d5a#M7C|z=mt9Dl&PQJzDeRE}9nx8t<3y6? zt1Vwlgy&q(9*d>ulYrB*l#uY4v=O&|Z%3G#bP$LEdV+)sr}zjYjyYyt#(o?2K{^{r z;XmJbn~kz*7*If^`evYXPh75hQq15Sq=E#Bn z6#56kF`2kaQyL6^(q+HNo0`92GbV`E^iIG@ONi`)V^}y;grVMSjOL)@5I<(qipzAW zz7hizd}|Z0mNZDX-M5b=zT#Ep*a8^J%3H+)Y=9;~w978W-!?Hufw=pvOG#UGHEe;b zx?m(qgkB1FWfqafE19Sg-D|m7Ke&8P$`0Pwi?5;OrNALLAg&qgKmh<4hyeip-!nDz zSEe?!wQ>6Me)*NC&%b-x61O0JcIO&Y0Ej3VkxJF$YDMF&Jx_!DRHJVz5K(}bqf;}8 zXB4@yYsa32>2Umhu-YESNj(OtKP_Ur z#CO8Mev>9wFd%Zdez(AL>h1a5ZmW)f059itKuQ=>bXq6g+YKi!W{}XVbBBZ{gMlP0 zO@v~=7{3uT!2Y|K%=jYwg1Q)@HGgm?qm_pCI-3PmwF6ayh3!&Dm%~S*RK=(D3Wq>dohW-kAjvYrW_cs)BCn=yhlu3n2^K6L*R8yiZfI%``+?{ zn@+$Ib!RfLz7M;&+YogkrFRrtjbaMO!!+znFp0S|l{!rf&wh)#K9&t6d&AACvH4@% z*MnKEhtYb%gi%~a2Ua)8=$D~UbS>Sjd~@B176Yo-#3i>hN>_~>M%A((ATyvp=5fCc z_?bhbM-Tef4CHY4@b%Tv3&ImrG*kV|X+K+b066rTq)fD!8W=(sh$t{~#~zxu>?vR0 z=N)j{aG^$HvPb525+o!Mtx>ygkX&LOOk3_ax7S+!#D=90IrmV`vOtIv@vx0`DpyVYqk>CYnoiThjw za9_Hw6C2oPGk>ERmVK$b>pGGVFx~FxwLGMSR+w`n(A%#h%+HM6z?UEE&$aZTtUFZB zL+x(=g@^%^f;xHCjKdg@2azcJ@2Xi6y!eaLfS3dhe%d}FMOq{{L{p?MzZ2etLs?WTJSc|b`g^pJTgHdREGmHl z6OG51vW%J~U1{zb#sc&~f?s>_-nVO&F07mf!Z5cyXU$UrNwiut!G3gvv&OFCi_690 z&q@{S;RP1R!VE>qx^gYiNoDTiT$tF--fA4Bmfs9mF|u7BO5obLd_SuTKaQ+ws!dJB zO0|_cJwR0CV&xvoIk^LtHboXs!58n#d|e*yd9{az3T1z6a0h5i4(`62@ZiI?A9=h| zwB@W7p8ia%o?Hn`IMtUt{Q*>7Y4(fEaj#R?E=9O&CbXw{Cz9Z*~MuT31XM`fNsEl4wk&m38b*!wTpem_xJZKnv`E?br7i|2?LL#6X{7mOsw}u#Z<8X zAg6(BVV5{fJk_4q58j6heONh-=3-A-op*HDj^oOCH}iG9yM($wyh43$pW)sg%wgVn zo5ffLGDSTi5yhZmc8oUwK%A+n@Yj@2u)rzu9auRtWb{M3zoBxoP!o2(Q`v@(H(8EN z60V@uH@VMgnzl2-i@kW!COhDJaw9=G-$14t|N_=YMlWtow0 zZw4sX<{qsSo5p;iwl@QY4jE9eK7NvyveO>bvo^L1e*$tpoq6j1rf^SVBH^fW7Y0&# zO?4ahkU2gx@nDd_1m_5x#f=CYms__|-(SzkNpKiwYfB?qojE?_{c<;`ty_<{o6osm zS@l9H7B8;C(xUD>e)#k%(?(BW1aYAH`Esn$83cMTkd**&c&bqP3zue@PAmKAd~4W5 z^0DmG79p9oq(*ze>xPE-W%;wT+V}*|(%NThgy*x7tflO`*6uzzGHj?=H)+FX$jsbT z--UkVk3a*uv#d@AbbfHCB>`=TBvvKKNoRE+Gfp8kuElzl~~%K}NM*o(*@f|X9H=)pWfEluZ6Z?QO2 z3E5Z9oG7m=F-YW`N8L~6Hqsz8p8}r)WskG7r@GXwWqwDw2uEQv$|H3)Gu2jyJ9C45 zv8HCDv%~$HvyE=IvrczsmwRUZfG5CU@Qrnqe5$r=sxbQ%y2!-oDJ6ry5>a^e8&wtX z#~xP#$BR#ng+D2gdJx4^t!}Nktph8~Hk=#cPZS0YeniNh2>zj6{>^!lI?h9#UStOH zEj<7VZ#Vmcgz-1p=OV40{_i>?62Z?t#-q)S6o@nW{>0OQ><-~Y4P;52j%Ri-4|l&5 zEs0Xg{UxCy!Ug2WJ4fvbFOS7CF^!=QzO#2LQ+BWPQfQ)zDpcynT{_YTqf!!U2EI%0 zP$3{x3Xo`tsi26|gy@ISHF9*i5mp z?sbEFEvCvK(*OoNs)hmvu|&Wj60BgzFoJCyyrqKq5_k~CW}S_A?u|NdVr)2HqnPn+ zAr_LH_nKg&uV08mez3Ah!w?xCs!~rK*GcpYg4F^T+ZhDA#Xp)W0Jp^-ca?rj`Kk!^ zyoh?m9DAkwo?lJ8q`O8nn0oj@B7D9uy#S;4?v;#m@OT3X*vdIsjb4{S4;9f+P8B-c z;e~Z%qskd5QHo*Jdp=-@J@g|RwE)tJ_oM9jP`#QlCQH}neTK0T??j?o=(nxJ)B21z z?ec2ri$}p_+<{ht*APlKbq{{R2KGp&l7+3@S@x_4ak;C+aZ`{@?gaKohZI!}slzMF zMnZpk@l~%>ecJ3*4$?Xj6TDhxx};BvJdZJU zS{9by^9JOYb!3>M3K=N@d!hL7`9Y^36Xre|1wn_u^3+)#g;rcyWt>NIAcgg0^Q0)8 z`yE5^=5AAOQg_a0*~w428V4gyd-VkiiwN+({p@Q;oTQ@d5zP+qAeF2DEAS&zW0m7+ zJiP-$NmX`Qyw#&_&WAL-AjEwf=dr8}0U0}hot6L_EzVyaN#SjXN(H!SM)JI4DfJ-9 ziERJ^6J`W}RnSREI>1n7F7k{kWqsEgX)5}(dp3SZx3!@1@#g?4E?EOvl|Ld2q?^Gj z0WpC4wYvxqL6lH~?zdVYV-@YBtZ+1JdYdy{){=DcOE1DGz zKL{MvO**0xr?{_U(AI=?zf!QdD1p81zuU?ud`@KHBsW9851$ePZooJ|Hz}cpqfvm* z1Ruq{IUsZZ_tV$Ifnz>wb$7Nt=X~tI#yK{5zlMEhenk*FHm?2X7n7{&cpY7(+F7=} zy4=3xtGG8KxLMQL`>nILqO&)sv)4>l-!J~TL97*N0W5E^g&{b_I||p5i>e4(NzGQ* zCQ9t?VQtld?iV>>vdI2^hLFVCu)NR!=8Vc)rsyklQ$>}K6D4@L!Hui^LB%E~mVV03 z%9kbD5^Bz(GJohg>xuFs?k=N39?#A_rY+{c$@RLn0gZj?ZW3O>Ma|znPgX7TRJmLe zPWkY~&iP02l>f^bPW5EY%gI!+*G~sl5v@9-ha~BRI=##7gD$F5MlE_d0Bt5$^@ z``g})-z|iS9Zv*~UydFqJ2f)+=DW4Mp85W)9#-ej9YDXfao*JbSv~x-fxU&I>660= z0PyF;_*y+En>kw>*yx*EInq1*b4h1sV;U|mD+UXN1@#4il@J$J{Q7SK000Dl0Q$P} z5Xg%H0N^y15Ef8&%R2W4_exxx|CrxMpdGo{@Wif#U0U+Fvj0DBO2Spc)^L z0xrPgZ*kdBZ;yf9a=e&)7;LoNZoZ}slkww^%%?zS=)0SRHxp2?T)P5GbTzK;N7 zmis-iQlx|4>1?qn%45R1855+!{`L|W5ByaFGIk77Vo-}tXazP>6L{DS#H{4MNUmo~ z6h;khs`bn96P_j)IwBXu)Df@^L%0g4W0jx`ZEhUE8>UtXlBytkVyb86cI!o2{*Flf ziep$3G|5%qnq@RQ*Xm`y`R*$!g2hOAFadDbo8jivX%_|ZZy9>DO@fWq`6_~@JVO|Ox z5D;LG00s`k(}LJtrocmco-5{6Y5?eM9321_Y*?m$7hI(q@)0ixt<{u0uJAirmIpWu z`G-wH1%zE4%la3|NUP#!%Ve=HGoBq?zFcp=2f>3v0smW^_C5`T`s=!EAAM+z zHN}o8;#f`hmFukfY9PJFTA-T{$h_qj%&k_R%HJjeb)ArFtXB)Ak zf%0|Q(Hx(jBfh&nx}ttd;eBi|KI&9-!{+hScR|pnIhW0=KpuD+smnTUK%%GWJq%K$ zAE|jWe`Z_eQhZzFRzRq(et&j4m2F8Mua9-OazP5HXuLl!0^SO!itX4r_-QCk~zzhIH*UZNYN=^8*7uMQVf(iA7+f_-PhH! z&7UhDY%-cE92`3o?A}WaH@$p#KuIAW8(p4ELPv@ehlL#)%1%;G!q9cY=o(zqDOnTu z`c+~nXix+T6F|S7ODZnomc!rN*yf7q zY^BQqb@N%fD=3C%kuT<3jZKE?QvP5;QgY?iMxbi-dID1;skh^8^6uiBAl?Oj7Ar`G zctrtYmJQc$AW3E6HP2qBas*kaR5Spd%Enzk5-m=lo5{!AFf%k`so9Bv%ghXDb*{V+ zEhjNdNv-a^VW;vFP~B`@wJ8dDO0>iHj=y<^kA7fmRZ+E<-pEUZq_Hl)KIB1AeJNWp z2XIGJ9LuJoz8DZKZIq$4x}U~E6ytwfUO^ySEiOuIjk!kwqzzB85yDC+GCxOp-M%_C zdJkt(cV|KrSb2#=>CLf$fik$HO$n<@P}8Yb5?p_`POAbn2t0xTgGsJt@f_olTBKMz zm&XuM)|?#meE`ga#_DiqR$NoSoNHGf_vV6%Z>K_^ zrNsqmSjqIYfmWzY>gYZRk=|265Zmdfuv3Z5ag?;#~1E z30eiD&Z;aQWK0}n9DIsgRNM1LoXV$Lo4xLjTaHOSYrc%!Hj^jA$V6N*!seld+~s6g zzjt@T#cfwh#|2u0{1gtGOvBubg&cyVk{qoCdso?k{f>W!!r9dWz-HAItmnf(X2WZE`VaH>zXI5^|a~kVAa|}KG9bL!m+c>j0d=G6y z?%ll7h<1&yu_G{BXNe3$pYRRA$jsKI1e9hm7k|CbFDctyu5vHrB4(J#dJ;T-u<*d_ z;^UWeMdEu?Yc^+usT&n4lazB@wPYUqu4U{89_Bo^)DPWc~uR=kg4n;*kMZ!EXIe5-twLaP4o7T;1mO{|yT6}Nj3O@>w6>@_?o}%Yv zX5;2T<`{P8#Acki%*yWKt;*Y!UDaz?P?{GDdkr0V#t)1CxLu$;f$Z-l-g=|_kLUlN zysF`3vBg6P-yRI`cEe3mtY*;~HL=Hzs5fK27{?IdUpS?i|$mjk+N8dq!g|{T%hjfke4u z?uNwsgE|{W$xUl-jt$WI^g)M<{U7;df^UXILKBGL&O zHO%_9c^Oh^4wxh^NPj>W3YQb4-7}M&cy81AIqUUOXkY2u1 z$mlgKxIQM&*B!gPp`O;=x}NjT53cARdvB)W)!xI_bP+dLC_tb&`@#6zrvqgOVNE75 z$uhH$s6h&s@!RSfK?12Ej%{Y3y_m>PrB+*;>`w!T8b9fC8=i}Cl#p|=aP_iDzd>NV z##+a%FZm|&QuERbw%3TBWFCdKWGR2k;?Z458lDRPc*O)CJDJFcS*sRn$E= z20g&3Nf|Ld2Wtc)BSG&t2O&_58N74jlUrKPOK({LXQksVZNhNiHKtHVhH83%%Mo7( zr;vK>BjKp(J(j#ci|#vB1*_4e4uv`4@l+G4n(RhpA!-L&Kc8cj7@ZR2yuzx9v$ta$ zw!F&C!m;1@DABaR9Cr}l8g1J`(J}4&X@e`83COO%*n!`|CEX1p%V(G#cTKgLfFQ6U zh0v^Op=I?F`3*UAa*zIwZbU1|X3!Xgxd?oUFj2zs4m0>^zs_`H^^AwNv}#CqM_mR7 zxwdB8ClG#MvN8*zAm%TM({^XN1J`tGaM>g^$nk3xN?) z{jQPfgEMUos5Kue&VaNu!_+LqY^oZ%w1j%|qMXV6Hsy1}NuB3BWlJPrYG};F#EzoB z#DO2xBEIHR;*|?!#<u?y;2UyP-0?r289syQUL24%R``N>E`hyHou}(vL!$^^<1ZJU#=eL3RorD) zf!Vrj_0Bhlcb`pDrP<@Kh?>InW{i2j=$s}dG^^8!6^;qdpL^usoS(~)WE4q){@#o3 zsff=U=O1T)at6%$%=>cHc$JjPyW*ZWXH&~tkOW?y^eL%-81;Jjqh+HpdDjbhTxnI~u^VGpyE3s1oJ zMwf5Ss#m^ERF7dv43Lsgo~5WH@qj6qxg4YRSR!&7EsP?osxu`FLyAMYRB#9@dFT>_ z_!-}Nx9nhPZmPDJPecx@KNbz%c7-kNT&TyT!Zstd35&}IVjp`uV zbO4#n=R=NRb#ZKr$t%B)wa)WTjAmlT5M#C1yt(Zkp4ML#Q_qs9tot(yuGl(o+^U+q zp6sn3!gso2l*Un%(CX$!S$646hZ>L-D@e(%F@}LbV1GNWza!7l;bjYmdh6?Uz6pJS z&{Uk?fIsP5;Qp!auTjhda8N^0cdr)km5|b=jnF`2<1M|J1YfEb>J=~w75z;ZyeVMn zWRH;fQ(7LyMF#bVnW_CR2MWXhQuBx_?}&HFxJc^+XynaPl#1y2|u z4WOX4y;kxE-@=m?$cs}`i~|r-(dEz<5m-S;TkuXEi3w6?v@rw;V<8$RU@AO@*@UJ+ z4D#{X5lZ2$nvB?fgZk~c$onacgA1F$`c8{+By6zy?!l8(BEPh;|;= zL-h@td{Yo&a(wCTEUMC6fL#F>I(Fff3fnF`{7TCRijm`0(S6^^c@*Kb7uK$x9@aa| zTfz`Jf_Fo0PD;1i67}(Fs5FX-nAUluUb?SoR27+-xb|df(X%E35!uncEWDg4Y~o{N z#6$rhb6$2LGHTux?R?#Kdn}CR+TfyxQX2j`P}Rg@oA5QE`*wa{AqxxvxygvV*!6A3`WO+U0@Pmr3ucb6 z&}6Xnl%^;xxM{F7TfZDQu|=#}jp-$H@e9`Ec%0Z85>)@&@T7A&%Hbh|z%e3#+3Lwi zxyBtKeyxXY06W-o85k4Z)b7Mw5 z*M{RId8C>3&wRRj4hIva`Qdq|d!d_~j2!0cIn`gOaH%nGnfg#N*2}wo^>x~GfhzXw zx%C92^_UIUI-{86V%afco)-S5l?lXzZD4d7BefYH~DwOEO9-v4FxFsE$LPUI*8^|+9iu9VQHjH#g0IOv}~nHH@*3`L?vcr8<{yFsS$ilmXae5{t+ZR~Z$B zJH{Sf<5XHitj}D@wNL25czISX&q~d37+9KBL&`)caIvlk+lRim*saw%q^e>)6;7JDV$mY`SCVTyy+H!w~E6PyQHs$%L19v zYof<~fo0^hj+dn@n!RoJIL z;S7U^{|Y^i=z;NFZ-c*ZIrvh%5p7$c*aaIudq!mw;%`QlAGTHyLKJzs%OPOlU@t^U zaPZIgj`*64;>Js~aH!`bmbV#^5th( z{nCZTiN?4)qcO3vNBWpgTM{Znf>TJB`%x}Km|y9zZ(M0i7aE6)wV|Bk&jN(s#xF0` zVWJ=JH0G%BySdCh=Gx*sKl)s0BT~WVM03UZ7OCj*YOyo)j^}kx%qin%b}qZy`f|E| z57RvFNZAao=*0(f_}UOfVQ1iQ7ur61(=L!|KqXUL#1{%WW5K{$E<732=c$Fi_s$s7 z=mHW?=5o^SJsgE%VFk6S2UrtSyrmS!^(1h^Aq)%(MoYnaf5^0yspZex*-P& z^r~p9^?p^L))O)i!^&Z?d8~b++$mQEU`R207*}RCF`*~y=u)d20B z6>%@|3)(f(gbvR9=df!Vp}DC1Dn0onYp8<*?zFKXoL-k{WO6FJj|2H zYksKKs+5d&KLxJ>HTg^LQp5HW+ZA7yErD69H4m<{GK#*#v@vnB_?=AdHu8yWv>mG@ zEnC`sgigF@>2`~Fn7!3eIZSBjTkJZQ$nau2z3kaL-;j$|_n!5KSom+J`_oy4Q?Rf7 z`0gs~nXRyCU=8TP@k-3u^8;cwCGGhS=WTM^R#tp;-DN}4v-g{zd9N^8Z+&u_ zRHHiC#!Tx4e}=Xp;P0Nac6F{sZv9<(b|?XZWymcO&YFc0i zQ2~n2g0?Wdxwhz*-ec3Hm^z*w7aEHwt&7_QPN0j=p6t5c;6r;mLQAq&R6($8DU64} z<(~1e*)Zvj8g8pD0u)vhwUjO^84^F5ffy-dnYV?6Mnx?}Hl4S>dyttH_E4pxhO?P8^Xug$OZ=QxkC4^;_1>87k>gO)`b-^yjw$MbGG4JQPBJNyJMD3SwY49+_K$6QNJdMjItCaQ3gi$hrF5BqR&Pa|4G+FvGtCgtopVKtIx{zVYW8&n|MKe{${~q6IM;DEc zH_aJ{YB8OaZ5dCFg&Z*>mh#V_fvM>#Qir9ny3xyqhBZBbH4kV3gxJFs&o^e(0L&hi zXq4UQ%zz~$B7jpOn(>w(<&@JGUzj14KV9Ng-0Iwg4mDr`c^WZ!J0Y&(r>~Xh)%A+y zub@Hq^{v57KH+m#YRs<}vM`8edvpGB5GGTLrZWI1O7s-bDN-nFoc6%LJJ4|x-!!@0 zIBP^M)tTGS@s>*Do~1Kr8W#}>`ZmeOtY~zDuKL)E1kcJdSbw*2+~6YAEK{RdGXL7w zXO(rcWyTFW5iN_$-QYt_N4Mr$Egf-dJg(Ca;c^_=Fmr~}eDNUTABBt(5T=zJpyjhu z*tXLXQgUS%U-@HRzd;kO!+qno`;AwPakH|b*Upl>EFUM9W)@|z>50@e;&OO?9j&Sm z70Ugvn`C(uT3ovi;rMU%_~n^+4oI+0OlaDPxt_0_Ki=T`eRVSK>R}j>|1pcUla2iQ zaJGRPE3d|)%L~!)DEw)Sf=%jA7ke%rS?GM;X_h%q; z$Lz-C*OB$vd1Se+bJIS?9mfP1=g_XRv{oLpmm(W~u{U^{g$z{MJdFp(iti!xuCe>>Q+=b&;Eht=p5y5a8N8t!f^&OfV+z&Ae(Bjb|u zxw%b<&wIV^Bc@*9lo|d*7u{y*sa6zNxp?vZ^r#L62qKTHCdI6$5RSd z5=Qb+o0oeDCPw;rHL;{>Z#b_KI`L^K|3j(;#`&z-o>AqYwAfV+H$1M8Gmf;4&WlvRSx=~-60mAe zv1?h~hbnx+C<97wY_V54gG57+L<(M>k?M>HY)+AyEstU^f0srV-wcJdgQPd1 zt?)MCoFnrOVW`aTb~VbC4qZIkrV9 zO_KF9HZ249@NHz}dt$PsJaCqfgW0vvs0ooS4Mha}xXt&tl4K{3@l-Xz7JB%`tcDhh zD!e2KQ0nApnAj(L{gbvGOE1TD|Iz-YQG4?bNpJqg{n~YCLXcXRFnbIXr4D!bU;+L0$=+tSm$AJ zMP_N;S@JlnzaEPrZJWUNZKprO^8ktwUH!CJ@v`kKs*uUk&y1qdu+{Yx%N37e>JQ<# z$ry7BC=0}nLlY#iOL;c|vlbK?u^JE0Xn)^b=8XrzL^oHU%ztE!pyiGG9;lcu0aA)K z02J6mp@{XD2FTAsu+k$I2fU@Hyn0%~%`WD+5|Qa5RgfZU-@&%<^AlqUx!;D#!n3y?fy1CdTNNP#RS)E;%{pQ;fO&={%Ngsow=x@2}f^!5xU^x|b``D=u zXt*sk`x{RWiGhKA$$e@1jm8IQZA(gvp!ypnCg2?ro zsIq&ESbL84CHf3sH*JRJiyPu9!WsL8rEo*%;bDng5JkX5A=Rq4U+6UAcjfBOjtJCm zyLdpM{cIo94Mz0rM%Nu~c|=0K;3tNfzQs=Ui@+NpUf*v9(Mv`(yx?b`96WP*^HALRfih4!*<&};?&S^c z`Z^&gIkJg5<5_}$#q@nLNI`IvtQtg@X$gy`2Rt5iW8#J5->M|z2%kx*IE&1GC|Y%Q zdHZk`Zs@tx(>I2^Uuu&__ggj54>s52zGe4y&9RQW2_2AuIKrpA&qOb!8kvlCLp3j* zNs(#DTo)!T>GNVWU~e>hlCAN*3eG^o0!mk6-_Z*6u?0VG=XGTRy@j5v^7u9$X>rW8 zBo4gKw(zCeL3-Jn_1t{aK9tY2@GHHyY@#2$UBYqy3vk%kQr)8^*)HAM6)moiTu`{M z!-!O7OCI@p=)0ACo=sF2iw7dt^y!~G@8TLS%$bPz)j@wGS2`BoA7JOI$TrVSr|Vl4U#Nw%pg+k|yHOdaTpGxWtV0j1(byM`;#*~Ic-s0*iQ zEQei59ogYi-t@t=oo)g8OLdtoebOW5t}2aG5f^VC zKH2j#dZ2Dzqe=S)E_{zxWOI)jRI(f%_^MMwt2XL5!(%eSKJ^zS-u6D-Ul9l1=jp-c zn*z$|cKyWeXvI7(8v2rnuA`zyZF1X-&~!M-B)``ilswMwx<)Y(<}OLoitp>PJF?jg zHS`n*t7;{p&)lscZ%6`2e(bvJMd&=d5Ff}QN ztg6BYZQ5yZv9E=1@N+qrZng@jRJWU||mnwm+Hnql4;=gR6Ge)Yp&mJ6KI zc6$pZATlEL9d>y+4jUs(YCAa%MoGH_C#U?AkmhBvH2C*XaOBL0vo40^5w2Ism)cOhn?Jvi#1!p8Ol)z zlj;doI=1mYJdK6zO?!*#VVl}c3B>FFv)#YGO8JcloFYM&0a)|x(<;i>i=dAvXfGs( z|BcH4=>c@78{pqx3ornFD*ISoel~#ymC|Zr8Bb?(`XokS4&)s1W3TSMgiLOhg=@v7 z#ABPlo3TnzMUvK~@D&gEz7N(KA97D1z~Of17gnHWE`37uKQVs9s;s(|uv$DeU*Y>a zz6~8m8ra}h&4dntolHln&OCT)Mx9it&^(>C!_R#_-y230v32*^*HINxq4`c;|Ix zA6#U4sc^>Z>5Fam%;LN8!>sS#G!^$<>V5P(_ANTKq-<)|Yg?t|bV(9j{8eFgH&>5O zgPrH5mM{I_u$$t^TB)nzM#ez*rr>nQA^EJH__EtqEkpof6z-?n zGhDi#66H5HIH|}4glUte9wX6hakJ!~)v5xd`E|S+6+n{R?_Gokh&1tj#7{-zQ2jcr zyBbdU{E?(P<4Dyhl1!|TX4iyWfOk6ngI27V2uL(s)~X1FLB&E6&Z5Y0(aqd3fF8+; zgG$2^tOrvz{$OeMoXBXUC}nkSG{21i#^yBqe_bX={X|CuRn{yr9Jcmq z)j#@RMtB?qxubRbh@9m3cse|MKh*V}x4#=@IgpCk{d}$HblBSdkWK~7g0}|8taJr4 z)Aj7TxusW4XaSS$z7@~kUmUtz`4}_&I5N9{9iqj*aBke+WdYdGeo8#wie5W@Z%H2y zyupQm@&}r{=`Fl)pZOLA+uW!BEU>n&E z8|Dogyqlc}`f=ZpwL8hsVn?YExKe)zOu+E74z?cq)po{oAaua(abDaT`MokX_s6zX zIS~=hw*-I2M?8-@_Cw#r=lgCA6X(NU*%Rbknzr|()){@mu&vv2YqkeHH#N%4hO< z9}LTg<>l@peI_#!m8i+)`Hu4h4p*achPo?vdqWIa^I@lsl8u&{OGmrz>mQr{EC#ac z?yA*Js!2RE)ta_Be!}IN|KyOXTaX&RXtx_eWBu3+GO}L-Pj&0c!~dhq$Oh(&-A)G` zQFNgN-}4z|S3e;O2twMig_~wWo^VVP*{PvYttgdBWFSyylxovo7A%ySDr4N4hDuX$ zu`E23IZ)$v-!fImr@{R7@&D>fOFBJWV3Ou#~ByPq}D|>s55n6brFjE>7Tq>X985VMb-X zJv+b7G{r)G=R2hjpb=EOHA2J+m&S)1F=QmP0kD0cn$yqJl7kStg9-NfuFxUrz2SXK z=p|ad1m!FvXY^R;s{}aj4H!prg+fjyL0LGXKee7%<)HBBL)8oxw|cbEZ3OROFdJiF zHB1b@K>$>8>%o=U{q(XvTbDdTW}!lHnR`SDqaSN(8z@noo&^VO95$UAGgPGpKT9fU zd1p@9SrE;ptXOi`?wa&e3O;0Q9xpizvnF<2AT37k3ANA|s2&}>*(%|7YbDHhxsUp+VOpw`ghdkH^fn; zmj`?)MZD)%WSB$KLLJ}I%_aFNZnQU-&RZUM9#rO{0Wn?gaTkQn<=!#%`hl4ZrSe$b zZ%iUx{H6nCCcR~D4X^++&B|PTMh;^e5Q zd`X}qzS*cV?Q>V94F)vK=>a*AYx1r_dTI1Dq0=brDDqBGXHwz^$X3s&Sy`7uLt z*qoPW8cq0M1%ijca6tI=1m5aXJ%tEXnmpBt(xq$h-oB!^Whpu2OE<9 z{;uvp&<)b^@Q80M*c!pJTEA=%FB;Wpp81Pqvx} zF%x0xR%;;GWWx9cZ*g|!ze@|HPezH&HO4UQh*%_Oy|PL*>U@U&keA3bmp_V;R6G)e z3z%o~TJ7Q2Om&k+GB@e3$d{!9_nWyZ!d4%KzLPUac`>nC%`dqS)3_by%Dz&P!&(Ky zv{=|-mk4ggV2PY9rA!@f5Z1d8@VbMrc9wx>Cg6qwdNe^s@5YJh*7;qJTm-D%S(kO4 z9D(b$l$0Q?qNY9%*|JAox z&78?KXQ`ciazs<2khRY{c@3_WUFV&nd#x14Rd}2!nlQqO)4YsMKD*4WXybJrw^u7E z>+Q)E4{Z|xALVt|p;r_7XmebF1w}5oj?W(cAJ*5Um+DH^#D)sOoYm(y*I?#)REC#B zDlAy#YO-1#?wHCAIRUF@&>`Y|N1ztncNpoZ)2pFCSYPjgDaVovaB@ve@x%X74B#)A zOJ|r`bAz~Op!fc`MVq+CN5GA2vAQ_KkXe9}X>ukDcc1I}Z9%yOIA0mMrRvRvAv?gA zWn3k69m6<}22-{SD0meA6Z%4{J6VUv(wQDfsRMiBtlesOvo1?xmMGPQa!Q~M8tK}# z=If)Sn@hUkEDN8gjyNtP{r&yG+_jOY zM;3{QgD)X+{Cc<;np}Gls^M`fuGQP7%*`Td82Wlg`+Bn6E9Z;1+@)@F)PgR-9Iz6T z-LZ=Ed!$JWzUo>#rxH{wKy4{7sF!U<`%5wCbBr$uZf}A?Chu9!@x6G zK+5XEtb&*b;vhZ`i@z$v7YFAm&s!i4)v^iwNB#rRvF#}sn?a^YG{I)O!#srOAzsxl z1La*mu6x=Ys5`0-Z+ipN&|jKPzYEOGh0!sMfPt0{ysj0@s&1>5Cz-SgfLq?UrEhmd0Gya6^Xdn=ucQt(dm*DhsagH3!- z?C?-OLdZX`)y+M7z*FYqNN_s2m7@_2oeRrBRlB=M9>DKl$JcLuJQ?o6Qam9FYW+X0 zTm@8AYu5&mZV8E@LqzFrq@+Wnq`Miq2PK9s>5%RY>F$yeq(K@)x=Z1ox!>=_dq2JZ z_pSBsS+mx}dG^_7pYy)6pR?zEROL_P!ohK7FAlOn6@q-}obW_I^j2}AFN55 z_K=3}gOr5Y)~YU&FtY_}_9>ZaB_AmU9~c0LUu8;lq?{QalBHIB(F`zWme#aL5i7Ia zWiTZ_w9U_j&)OMhZnJvUo}Sc}7%Dek@3Y}}q8>gC}DKP5Q&No|` zQxr5Rg9G;+ZiCoeemg&JaqT>gIsL(!cm$`NwPj8a^p^e>i`T}{myPcVEhNI zZx4*P#0lbKV7i@!|G4FHn>Xz7k&JZ21PPElkJ117ac%OWqQGuvQ1$w`DmHQHo*4^k z)1EX)Ex48GL|TfC2usLNaU{cI8Mbbu;8@bcj7K~*R<>VE&T2G8`ps=<| z1TTq~$~

P|Hh~tKx;oT_N_z_QjNwmxuY<6r(Zok6fP$YA{&<%UW`zn94(@VeLHj zdsF0s!k&`?!c5!h9nL#JkZ$7&PVaE6lwC{ljHT*FMv$FqQcCBfHbZe-y?hr5YjXI( zyT??r3M*uSj=feLL{1W8^8m>w?>-e z5DH+s^x61%egJs-J7J1CT<@~-jAJfS5S(mWtG&EvMY0JclkvPbx4ilu;a9tlO@Sa` zCx(@JYH8>xmEYTeSi|G*0q{T}Jrr`Z&SUav^7H_CHf}B#9`!Pl@`Tmjo$4-kj%ICWvwBB|6Y~7pMC*MDlwd)(|SxeBcOD#OB^~n0nYvtKJ zM?QWO$Us#u=EzDi!0K022gH()E)%o!eK?BnD(;_&`+PYq<=4!1V=Cbz{&A)wPnWeatR; zLoQh$H#@f~p>;l=eawyChIf1bR!8xp^Y*YqL;U0p#hUXzqb^4W(`zH;3@se!H*KIp z!+W<)cr1Y}au>bi#(Y69^Xnt5%JbLXBI{2^YeJe5eD1^S<^Ew{86at?uqTqVP%;f# z8|U>N{dhm2x~f%RWFB+a7|NT}0l%f;D>9*5ty%Gd6qYcjZ6g6jig2oE1ZvGs#Y)E1 z?%N)RQr`u|Tzr+EUa!CHfRRWB#lPZ>26QyrTHWG_OStzSl?;Z;B*3oDK0{ucHN#YYdo)W~`0nZ4wnO@GOT~FI|)o~llV6TozOR9fY?@>2d zWYFLKO#P{p3o$AE`ckN7h?TGvlpfSjMFLdVu1UZnm=Ywd;}H5fj{1rGl@(xp?6W|u zpk?Z890oN94VMLyoZ4P`v_I0Pn-wzEZq0@4w_27&M771!=kZerxJ)F0(!nFuO4~NP zTp49E*8_?0KtVbIcX<+7JBv*3C_HnHC$=_T09#A182QfCq>h!us`LXGXPBYvmtRjL z!0DRO2XfA=j8u<5vve~=O#5YCGcNkUx;jS|zW-Q&oav@Y!2V5gA8~}D8a=MnY!^V3)x_7>{RSfF|M8ENpkR7lY-fU%O|vp zaP3#raH%=89`oBf+@z{~AEhIZ+)%AkUgWHCLJC8p2^Kp&rZMOjo}Z+#n#z}(J_P=O zJS|u^OM~I<$&Wfa%mJ~Y%N3mZcpL5cU7wUp3vDkOvwbUX@CPyt-F!fW^dCMJ*>3mO4qEQuzdfUvf69qH}+8-aDbj zi8#M!m{L;|(&mRJ)bJ{KUg{zAUDAM@UCPiGl7-YaRM@Us9M&zhI%5;GqvdiEvBkAz z%~=Z65`+ew01kdfG%~jcF<<$%&z6fF%Pe9ws$xS6H-}bfl0Km!?AbA+9>m@FNR;J)10^b+IsnEDGxQ7+Kj-gz9iQ1W^)t16QN0Po#p$C2gm zn-+pq1k5v4=QW<{O8qCcBG3*`3Hr=HBzdpmmvA_n@mhz;3f@?Pt)WiqaIi+Y`Q@d3 zmI!X$1(#GfdQK0$9rmJ6uU693g&}yX!vrW!rC323$Q4{hm}?xmkoHEz1pukZ(Ut#b zgG`;La5K!;Pu@BQjV-!f`rN+P3?%aFs_r5oEwVDCI+x<{>o{+{YN9t=9nf=JlU-DG zTywOKhn3cHX$M^@(Pv4I(ZnSjvIJ6gSBT0rFalB9v#~5fCEu@}uvuAodiM~^rC))? z#UiU{`H=&)y&;WOi{I7yt|~UNnVBCv{H?Tk{T) z)>u8@s%CZAZ+;sS#!z^yPQ`3H+0;7jj>n?T&=FQ=%U-zDl8&5z)JNHbypV<-8*?QiCN7rK`lYe$fxOZgu43`TpIVO1D&7kk2 z`{nJTDmm}=CdaG?DVylNS(}YOmu}7GHq)JlJD+)2x*vtdQ|ve?)tT8vPy~W4A|sOK zoD4&;wyK%Xd)5kqCC`P~SZTn6kcBWDC;Bjp3`WZK8x6|6j>Kb^D|a(D&4=*Zvm9op zv|XI(JzcaVH`q!aEa~*H^c#aynsMn>&)deY&MtRD-F@8#POOP37&;rXHIYwCl9x1Y zeX}1D-AkA*7_X%(8C}{p_P?6cJ}7Q6jiOpe1ck0Qkd6q0g*|mQmmm5czOH@LYFvW51l_Ut#m~B_f%{gLtQGd@AUjO2-K#T- zeBc7g$k(~Fk=V&|1eSIzUb&a1fQZHgDogGlNfk6*QRXUk^A zoD5{NIN|UY1BXyvx;{OUl22^mpjXuY$PNSDqdv$Zqe+e+p8r5!{?%gUhdEaQ;jte< zMs-tzD~%C^@fE^aN-TGo-N0gq!k}$h*U6T<#>`s~#l<6d!v;Sh$hq*-ZEVp-JuT5( z-upHe7+X}`p#%T9ekWR)$9R+5=y~x`bEVsL8Sj89dKWP!{U@~J^jsLoc*&@AxCY{E zuJ==!ONf{Ca-LoqR^M?s1(OBabKQ9k(1@`aBs zWAYj?KclV@()))hdF|NU0``tr;0!y1VS{^L;$`vo=7b7G$!e*Cq@=y}!Y);xl;5yy z4>?2~T{-BitW5D@Hy(*&DT`=)8K*U6*JkQeq~qM!TqL0bM4jrCIy_<+9A!$pS69{& zqxNxAS0_1^Y{vd%d>fnCA*lFf){k+3SIg6QBt5C0+iLTnLNiITtrBm2De7j>WfK&doukg3#XR9w@nv4VpsgXxaDSF}(5 zM^A-r4A2{1jS*_{T%wpfwsm#AyJl{MDm~_upT9fn-XU4LvJ+H+k$FHI#vqIE#5Ro2-I2J#EYzck-voC9X8*>w52S-MGBa@-%Asb(2EWdqz zu<`J;FcUnyJ>5XPMOqt&zdAhAQPP9YE#c9sO4*QA*`HQRCD<0jtCDy10evBr`Ry;+ z4Ik4CNSak|J>hL+tk0R_ot>_ELY72wXyKcaM&ICKL(iid2WH?xvl@AyN#~k$%&*Wy z**?K-CyCZm6^?{V8YW_Xy5>p5GrWRqqNe1yogV3SPA(9#z*~@BiK1WgqB)?3{H?ce z7_#hupQA6JL0+btE$&!}r#)kLrB|tqYjg>+*2SK5DtBl`vJ4*@|3 zCJ}Q-YkgaXe*ph#r;b3Nm94&wvDJTxgDM+3IT+~M{{s&2i(nx-i>CI*4*v%dy88O> z>48T2&-?oo3YyRV9%W($gy>oRIJRHu076Ah{~n>fp&>-s^AF)kCPOECs5&H6c?#~2 zVFlS92D&~RYQG;=&^6@_j&2Z%ODJ;Tl}5xW=L4@rU46P~P}X`DW~~c&!662Ca=p=J zUBP16P1B{B3T3yHAz!Y~U%NlzBu*_irjG&*qsYYwn#zXh*=NM5)&-wcs-qOvy~1ZV zwJ35{ZLB=XOwp|MR?qA@fwRb>E+HbN3?H2Mv{)J3Q3JG)k^tp2JMUz4>u=T-PUI}-udQZ z_IJt3&D)3lls7OU$0Gr0U)3WoN2{^s(&^te0h;7OFg8&s=#}k!ZHVA}%HjMAp3BTTmTmN^SH6(cCafgXNq>`~5v#+O zV)}gx`~q`ffPL4`hv%5!1^T@d05_l4RKC#Ee+ou=R$ z5t)pe*^ZfZvrmd)u9e2{(SS@5UJys-8n1T~k7EB&?&@~#cXU0CfM;G!ug#s-q!%hr z6t4a998ccjTbvXu*&0;pnDCavO)Ht^Xn2K$l{q4!xg@9{+h_~yq0({L%-shX4{$oB z)o-+0I@4OyFu3ps@lS$ibNpf=lSIv|yN-~u#A0Us94U~z!X;d57$?GWS0wfHyV-e4 zGW%Uq*HSthWb!i(aJU~4D$&R-#nAFmTt1w}8N%Y#)Pg4)ZCQJO0yfT{L^TVL?^Q#% z=C*I9s@eZ&PuBHJiiTql+@yisfxKYpEhB7u5QB`GqfuYv)2?0-7YaFWc0Zr92gTcF zuP~MygIT3c8n8*5Bnk1AtuQ;Ai!;%OaEtg+*U>12V^CJ}7I#p>ow>5eu@m3ytuzK* zGIdZGdavlVRc;l3GI^TS?W|DC+!fq6JooUG&$$rDNp*oM8 z&S(xMUsPy{JG<(bOiCUd;i>(kh0dZLq z@i?dD^{nyhL^&@v@qC?GobBj_lIh@|7UYl6sHe1X>a`xKnJT39j5gKg z$+RqNk!#(vEKOCmYkS?w7WsVbc%M>W^;Ssag;6md0T!RgQhrcFH&|@}z93o|ITjFw zSa@~6prChB#Ih;z*%Q_jZ#vQ@Q(5JzB{IdXorw~MMkL~Dmc`1M?KKR{IdA^DWezz( zAPw$JOx-aGK3z;TQv(NLAu~qYGEdCa;yf34b2a-@YkP#clFw?(hcJddF1HFMt(Jc8 zn)v>UntXa6<>S`oF;52s6lUH&?C`=|83exVSK9{af~-$zi_91*tL&mQz4zg+x+a3G zVSK-zQ0>*|(cc*$>Ti}WmzUM5)(={K&k5&yiU3auNQwP%(K4l*u4@|78g#-9u zJTv0o^#-^Fmzizg?n`i6qB(8sx5y8wPtF8`X>~Z2Nsj3g6M3e&ZfhRSh8%G&tyoe< z;v>(K1ql>(SowVT-akS8?Rw|d*_z9FYnk->P*j^8(jNXgSlD3G`EA+h`oyqRt}3~; zTq}9sj>L`=2|Rl0jU|l|YC;9v2f(}uHHI+7F}|?<15d)7NGH5RLbX{r>tn)TEkoh- zeYRTF4W@cWbOU9X15mk)HR_6Ea(h_cQswZAN`$l}T)JJQ^18BkB~N$xdlPYWSn^Jo#KvDPMCYSBKn9m!6ZI`hYLe zqboC^tvo}RE)vJ9I~f6+uf`~6Q9i%h>g6-Mx^(;4>BwNtVhs-*J{i|$5g=CBSm@QK zGiTm~esY|`BB1F=7LbwMU4_@gGadqgR5Z#W`rwa5w935os%J||)4g&nrD4b{SsF@A zmEQ~gdg*#J3L^E7LYUC8MV*jS>U&MWu57Eo#Oc`>zp-7YL_@yEVov4PGooFZ&;U_) z^1x)DWAi+%@b$_>p<`Y&1v~60V|y)wufAc*+O~Ew7>UoClJ9el7Co1+Ky8TI0)45} zeY;wHMBz!XZ_xX=Ktp(umyqd!xz|hoA>9K}*sPKp5RBmN8~Ic$rURgd<^iXGuM2Sm z9NB;;k<*)35iccHbRtY}ZYTHQ`OZ1HJP3ufXRkRcis9&- z=O?S}`F3pQvN#5a8SXlu*&LYK=cJU9SD4s4z|OyM3xuQFXhpNzkzJA}_Kb)U!5_OP z-Jb-DgAkFhWi;!ZL5#k)@8gH*xjcs>cZfXc4@Sr5W27i*ZX~_c5~|~9fx}2^ZUpRe zHL@+b&#bRTdg~p$P$J2UXW6>XqY@i#!NC=nRO%H(Fbn9ik0fF^wL4d^S-eGomY`0i z{sC+d(e%nE|5R$=K}rod@t4mSq~s--{w(DoRY%E78JkXWtc6Wn{JDWq6O{~Z4Y9At zV{ozu)6aa`eJFx~x_lObDzO8q?+v~7oAnV?lcQa_u?;J|=?`gj#l4M0tP4uIHuthT zA10p~tb1Ge2A!@eqB+Hsn$Xx&laSA3BlFV^Nd#aNV9|QAgc$TX4V~Y zOzQJ|>b;3uFxnizxKKnsMOxc9Q`e-c-!FeK>NHHWL?K5~5NFzcq?2dFU!my0?rIb% z>Ve7qT$sb()SK3b)Fd($!|LAQ^yYgzmw=t~`;#=?@mV|hAYlW6s{Eddr}&7VJ}n|< z#COcA%`}1E2kpGBjf#_zaYZLT?0lF-u&_#AC8T7)Bk;vQWD_&C4}FdK<+T=0n#2IR zbmWY*Lj<~F%fRy|h5UqMe8Q6QcFuxbYhn9bL_Cq57 z@2J14-`^qRATOa3)zI?r2kJ+C`m-)7lL=T!|Ms6UWDBEO3i z1_nxu?u=ad-%ISyQ|etzb1 zzxM-Wb9V;+@)t?^3%C2dCn!(5GofF2y5oBPsTZeTc)8<#|EZUvUwFCWg8%aJ + * Copyright (C) 2024 MDW + * Copyright (C) 2024 Frédéric France + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * or see https://www.gnu.org/ + */ + +if (!defined('SUBTOTALS_SPECIAL_CODE')) { + define('SUBTOTALS_SPECIAL_CODE', 81); +} + +/** + * + * Trait CommonSubtotal + * + * Add subtotals lines + */ +trait CommonSubtotal +{ + /** + * @var int + * Type for subtotals module lines + */ + public static $PRODUCT_TYPE = 9; + + /** + * @var array + * Options for subtotals module title lines + */ + public static $TITLE_OPTIONS = ['titleshowuponpdf', 'titleshowtotalexludingvatonpdf', 'titleforcepagebreak']; + + /** + * @var array + * Options for subtotals module subtotal lines + */ + public static $SUBTOTAL_OPTIONS = ['subtotalshowtotalexludingvatonpdf']; + + /** + * Adds a subtotals line to a document. + * This function inserts a subtotal line based on the given parameters. + * + * @param Translate $langs Translation. + * @param string $desc Description of the line. + * @param int $depth Level of the line (>0 for title lines, <0 for subtotal lines) + * @param array|string $options Subtotal options for pdf view + * @param int $parent_line ID of the parent line for shipments + * @return int ID of the added line if successful, 0 on warning, -1 on error + * + * @phan-suppress PhanUndeclaredMethod + * @phan-suppress PhanUndeclaredProperty + */ + public function addSubtotalLine($langs, $desc, $depth, $options = array(), $parent_line = 0) + { + if (empty($desc)) { + if (isset($this->errors)) { + $this->errors[] = $langs->trans("TitleNeedDesc"); + } + return -1; + } + $current_module = $this->element; + // Ensure the object is one of the supported types + $allowed_types = array('propal', 'commande', 'facture', 'facturerec', 'shipping'); + if (!in_array($current_module, $allowed_types)) { + if (isset($this->errors)) { + $this->errors[] = $langs->trans("UnsupportedModuleError"); + } + return -1; // Unsupported type + } + $error = 0; + $desc = dol_html_entity_decode($desc, ENT_QUOTES); + $rang = -1; + $next_line = false; + $result = 0; + + if ($depth < 0 && $current_module != 'shipping') { + foreach ($this->lines as $line) { + if (!$next_line && $line->desc == $desc && $line->qty == -$depth) { + $next_line = true; + continue; + } + if ($next_line && $line->desc == $desc && $line->qty == $depth) { + $next_line = false; + continue; + } + if ($next_line && $line->special_code == SUBTOTALS_SPECIAL_CODE && abs($line->qty) <= abs($depth)) { + $rang = $line->rang; + break; + } + } + } + + if ($depth > 0 && $current_module != 'shipping') { + $max_existing_level = 0; + + foreach ($this->lines as $line) { + if ($line->special_code == SUBTOTALS_SPECIAL_CODE && $line->qty > $max_existing_level) { + $max_existing_level = $line->qty; + } + } + + if ($max_existing_level+1 < $depth) { + $depth = $max_existing_level+1; + if (isset($this->errors)) { + $this->errors[] = $langs->trans("TitleAddedLevelTooHigh", $depth); + } + + $error ++; + } + } + + // Add the line calling the right module + if ($current_module == 'facture') { + $result = $this->addline( // @phpstan-ignore-line + $desc, // Description @phpstan-ignore-line + 0, // Unit price @phpstan-ignore-line + $depth, // Quantity @phpstan-ignore-line + 0, // VAT rate @phpstan-ignore-line + 0, // Local tax 1 @phpstan-ignore-line + 0, // Local tax 2 @phpstan-ignore-line + 0, // FK product @phpstan-ignore-line + 0, // Discount percentage @phpstan-ignore-line + '', // Date start @phpstan-ignore-line + '', // Date end @phpstan-ignore-line + 0, // FK code ventilation @phpstan-ignore-line + 0, // Info bits @phpstan-ignore-line + 0, // FK remise except @phpstan-ignore-line + '', // Price base type @phpstan-ignore-line + 0, // PU ttc @phpstan-ignore-line + self::$PRODUCT_TYPE, // Type @phpstan-ignore-line + $rang, // Rang @phpstan-ignore-line + SUBTOTALS_SPECIAL_CODE // Special code @phpstan-ignore-line + ); + } elseif ($current_module == 'propal') { + $result = $this->addline( // @phpstan-ignore-line + $desc, // Description @phpstan-ignore-line + 0, // Unit price @phpstan-ignore-line + $depth, // Quantity @phpstan-ignore-line + 0, // VAT rate @phpstan-ignore-line + 0, // Local tax 1 @phpstan-ignore-line + 0, // Local tax 2 @phpstan-ignore-line + 0, // FK product @phpstan-ignore-line + 0, // Discount percentage @phpstan-ignore-line + '', // Price base type @phpstan-ignore-line + 0, // PU ttc @phpstan-ignore-line + 0, // Info bits @phpstan-ignore-line + self::$PRODUCT_TYPE, // Type @phpstan-ignore-line + $rang, // Rang @phpstan-ignore-line + SUBTOTALS_SPECIAL_CODE // Special code @phpstan-ignore-line + ); + } elseif ($current_module == 'commande') { + $result = $this->addline( // @phpstan-ignore-line + $desc, // Description @phpstan-ignore-line + 0, // Unit price @phpstan-ignore-line + $depth, // Quantity @phpstan-ignore-line + 0, // VAT rate @phpstan-ignore-line + 0, // Local tax 1 @phpstan-ignore-line + 0, // Local tax 2 @phpstan-ignore-line + 0, // FK product @phpstan-ignore-line + 0, // Discount percentage @phpstan-ignore-line + 0, // Info bits @phpstan-ignore-line + 0, // FK remise except @phpstan-ignore-line + '', // Price base type @phpstan-ignore-line + 0, // PU ttc @phpstan-ignore-line + '', // Date start @phpstan-ignore-line + '', // Date end @phpstan-ignore-line + self::$PRODUCT_TYPE, // Type @phpstan-ignore-line + $rang, // Rang @phpstan-ignore-line + SUBTOTALS_SPECIAL_CODE // Special code @phpstan-ignore-line + ); + } elseif ($current_module == 'shipping') { + $result = $this->addline( // @phpstan-ignore-line + '', // Warehouse ID @phpstan-ignore-line + (int) $parent_line, // Source line @phpstan-ignore-line + $depth // Quantity @phpstan-ignore-line + ); + } elseif ($current_module == 'facturerec') { + $rang = $rang == -1 ? $rang : $rang-1; + $result = $this->addline( // @phpstan-ignore-line + $desc, // Description @phpstan-ignore-line + 0, // Unit price @phpstan-ignore-line + $depth, // Quantity @phpstan-ignore-line + 0, // VAT rate @phpstan-ignore-line + 0, // Local tax 1 @phpstan-ignore-line + 0, // Local tax 2 @phpstan-ignore-line + 0, // FK product @phpstan-ignore-line + 0, // Discount percentage @phpstan-ignore-line + '', // Price base type @phpstan-ignore-line + 0, // Info bits @phpstan-ignore-line + 0, // FK remise except @phpstan-ignore-line + 0, // PU ttc @phpstan-ignore-line + self::$PRODUCT_TYPE, // Type @phpstan-ignore-line + $rang, // Rang @phpstan-ignore-line + SUBTOTALS_SPECIAL_CODE // Special code @phpstan-ignore-line + ); + $this->fetch_lines(); + } + + if ($current_module != 'shipping') { + foreach ($this->lines as $line) { + '@phan-var-force CommonObjectLine $line'; + if ($line->id == $result) { + $line->extraparams["subtotal"] = $options; + $line->setExtraParameters(); + } + } + } + + if ($result < 0) { + return $result; + } + + return $error > 0 ? 0 : $result; + } + + /** + * Deletes a subtotal or a title line from a document. + * If the corresponding subtotal line exists and second parameter true, it will also be deleted. + * + * @param Translate $langs Translation. + * @param int $id ID of the line to delete + * @param boolean $correspondingstline If true, also deletes the corresponding subtotal line + * @param User $user performing the deletion (used for permissions in some modules) + * @return int ID of deleted line if successful, -1 on error + * + * @phan-suppress PhanUndeclaredMethod + * @phan-suppress PhanUndeclaredProperty + */ + public function deleteSubtotalLine($langs, $id, $correspondingstline = false, $user = null) + { + $current_module = $this->element; + // Ensure the object is one of the supported types + $allowed_types = array('propal', 'commande', 'facture', 'facturerec', 'shipping'); + if (!in_array($current_module, $allowed_types)) { + if (isset($this->errors)) { + $this->errors[] = $langs->trans("UnsupportedModuleError"); + } + return -1; // Unsupported type + } + + $result = 0; + + if ($correspondingstline) { + $oldDesc = ""; + $oldDepth = 0; + foreach ($this->lines as $line) { + if ($line->id == $id) { + $oldDesc = $line->desc; + $oldDepth = $line->qty; + } + if ($line->special_code == SUBTOTALS_SPECIAL_CODE && $line->qty == -$oldDepth && $line->desc == $oldDesc) { + $this->deleteSubtotalLine($langs, $line->id, false, $user); + break; + } + } + } + + // Add the line calling the right module + if ($current_module == 'facture') { + $result = $this->deleteLine($id); // @phpstan-ignore-line + } elseif ($current_module == 'propal') { + $result = $this->deleteLine($id); // @phpstan-ignore-line + } elseif ($current_module == 'commande') { + $result = $this->deleteLine($user, $id); // @phpstan-ignore-line + } elseif ($current_module == 'facturerec') { + $line = new FactureLigneRec($this->db); + $line->id = $id; + $result = $line->delete($user); // @phpstan-ignore-line + } elseif ($current_module == 'shipping') { + $line = new ExpeditionLigne($this->db); + $line->id = $id; + $result = $line->delete($user); // @phpstan-ignore-line + } + + return $result >= 0 ? $result : -1; // Return line ID or false + } + + /** + * Updates a subtotal line of a document. + * This function updates a subtotals line based on its id and the given parameters. + * Updating a title line updates the corresponding subtotal line except options. + * + * @param Translate $langs Translation. + * @param int $lineid ID of the line to update. + * @param string $desc Description of the line. + * @param int $depth Level of the line (>0 for title lines, <0 for subtotal lines) + * @param array|string $options Subtotal options for pdf view + * @return int ID of the added line if successful, 0 on warning, -1 on error + * + * @phan-suppress PhanUndeclaredMethod + * @phan-suppress PhanUndeclaredProperty + */ + public function updateSubtotalLine($langs, $lineid, $desc, $depth, $options) // @phpstan-ignore-line + { + $current_module = $this->element; + // Ensure the object is one of the supported types + $allowed_types = array('propal', 'commande', 'facture', 'facturerec', 'shipping'); + if (!in_array($current_module, $allowed_types)) { + if (isset($this->errors)) { + $this->errors[] = $langs->trans("UnsupportedModuleError"); + } + return -1; // Unsupported type + } + + $result = 0; + $error = 0; + + $max_existing_level = 0; + + if ($depth>0) { + foreach ($this->lines as $line) { + if ($line->special_code == SUBTOTALS_SPECIAL_CODE && $line->qty > $max_existing_level && $line->id != $lineid) { + $max_existing_level = $line->qty; + } + } + } + + if ($max_existing_level+1 < $depth) { + $depth = $max_existing_level+1; + if (isset($this->errors)) { + $this->errors[] = $langs->trans("TitleEditedLevelTooHigh"); + } + $error ++; + } + + if ($depth>0) { + $oldDesc = ""; + $oldDepth = 0; + foreach ($this->lines as $line) { + if ($line->id == $lineid) { + $oldDesc = $line->desc; + $oldDepth = $line->qty; + } + if ($line->special_code == SUBTOTALS_SPECIAL_CODE && $line->qty == -$oldDepth && $line->desc == $oldDesc) { + $this->updateSubtotalLine($langs, $line->id, $desc, -$depth, !empty($line->extraparams["subtotal"]) ? $line->extraparams["subtotal"] : array()); + break; + } + } + } + + // Update the line calling the right module + if ($current_module == 'facture') { + $result = $this->updateline( // @phpstan-ignore-line + $lineid, // ID of line to change @phpstan-ignore-line + $desc, // Description @phpstan-ignore-line + 0, // Unit price @phpstan-ignore-line + $depth, // Quantity @phpstan-ignore-line + 0, // Discount percentage @phpstan-ignore-line + '', // Date start @phpstan-ignore-line + '', // Date end @phpstan-ignore-line + 0, // VAT rate @phpstan-ignore-line + 0, // Local tax 1 @phpstan-ignore-line + 0, // Local tax 2 @phpstan-ignore-line + '', // Price base type @phpstan-ignore-line + 0, // Info bits @phpstan-ignore-line + self::$PRODUCT_TYPE, // Type @phpstan-ignore-line + 0, // FK parent line @phpstan-ignore-line + 0, // Skip update total @phpstan-ignore-line + 0, // FK fournprice @phpstan-ignore-line + 0, // PA ht @phpstan-ignore-line + '', // Label @phpstan-ignore-line + SUBTOTALS_SPECIAL_CODE // Special code @phpstan-ignore-line + ); + } elseif ($current_module == 'propal') { + $result = $this->updateline( // @phpstan-ignore-line + $lineid, // ID of line to change @phpstan-ignore-line + 0, // Unit price @phpstan-ignore-line + $depth, // Quantity @phpstan-ignore-line + 0, // Discount percentage @phpstan-ignore-line + 0, // VAT rate @phpstan-ignore-line + 0, // Local tax 1 @phpstan-ignore-line + 0, // Local tax 2 @phpstan-ignore-line + $desc, // Description @phpstan-ignore-line + '', // Price base type @phpstan-ignore-line + 0, // Info bits @phpstan-ignore-line + SUBTOTALS_SPECIAL_CODE, // Special code @phpstan-ignore-line + 0, // FK parent line @phpstan-ignore-line + 0, // Skip update total @phpstan-ignore-line + 0, // FK fournprice @phpstan-ignore-line + 0, // PA ht @phpstan-ignore-line + '', // Label @phpstan-ignore-line + self::$PRODUCT_TYPE // Type @phpstan-ignore-line + ); + } elseif ($current_module == 'commande') { + $result = $this->updateline( // @phpstan-ignore-line + $lineid, // ID of line to change @phpstan-ignore-line + $desc, // Description @phpstan-ignore-line + 0, // Unit price @phpstan-ignore-line + $depth, // Quantity @phpstan-ignore-line + 0, // Discount percentage @phpstan-ignore-line + 0, // VAT rate @phpstan-ignore-line + 0, // Local tax 1 @phpstan-ignore-line + 0, // Local tax 2 @phpstan-ignore-line + '', // Price base type @phpstan-ignore-line + 0, // Info bits @phpstan-ignore-line + '', // Date start @phpstan-ignore-line + '', // Date end @phpstan-ignore-line + self::$PRODUCT_TYPE, // Type @phpstan-ignore-line + 0, // FK parent line @phpstan-ignore-line + 0, // Skip update total @phpstan-ignore-line + 0, // FK fournprice @phpstan-ignore-line + 0, // PA ht @phpstan-ignore-line + '', // Label @phpstan-ignore-line + SUBTOTALS_SPECIAL_CODE // Special code @phpstan-ignore-line + ); + } elseif ($current_module == 'facturerec') { + $objectline = new FactureLigneRec($this->db); + $objectline->fetch($lineid); + $line_rang = $objectline->rang; + $result = $this->updateline( // @phpstan-ignore-line + $lineid, // ID of line to change @phpstan-ignore-line + $desc, // Description @phpstan-ignore-line + 0, // Unit price @phpstan-ignore-line + $depth, // Quantity @phpstan-ignore-line + 0, // VAT rate @phpstan-ignore-line + 0, // Local tax 1 @phpstan-ignore-line + 0, // Local tax 2 @phpstan-ignore-line + 0, // FK parent line @phpstan-ignore-line + 0, // Discount percentage @phpstan-ignore-line + '', // Price base type @phpstan-ignore-line + 0, // Info bits @phpstan-ignore-line + 0, // FK parent line @phpstan-ignore-line + 0, // PU ttc @phpstan-ignore-line + self::$PRODUCT_TYPE, // Type @phpstan-ignore-line + $line_rang, // Rang @phpstan-ignore-line + SUBTOTALS_SPECIAL_CODE // Special code @phpstan-ignore-line + ); + } + + foreach ($this->lines as $line) { + '@phan-var-force CommonObjectLine $line'; + if ($line->id == $lineid) { + $line->extraparams["subtotal"] = $options; + $line->setExtraParameters(); + } + } + + if ($result < 0) { + return $result; + } + + return $error > 0 ? 0 : $result; + } + + /** + * Updates a block of lines of a document. + * + * @param Translate $langs Translation. + * @param int $linerang Rang of the line to start from. + * @param string $mode Column to change (discount or vat). + * @param int $value Value of the change. + * @return int Return integer < 0 if KO, 1 if OK + * + * @phan-suppress PhanUndeclaredMethod + * @phan-suppress PhanUndeclaredProperty + */ + public function updateSubtotalLineBlockLines($langs, $linerang, $mode, $value) // @phpstan-ignore-line + { + $current_module = $this->element; + // Ensure the object is one of the supported types + $allowed_types = array('propal', 'commande', 'facture', 'facturerec', 'shipping'); + if (!in_array($current_module, $allowed_types)) { + if (isset($this->errors)) { + $this->errors[] = $langs->trans("UnsupportedModuleError"); + } + return -1; // Unsupported type + } + + $result = 0; + $linerang -= 1; + + $nb_lines = count($this->lines)+1; + + for ($i = $linerang+1; $i < $nb_lines; $i++) { + if ($this->lines[$i]->special_code == SUBTOTALS_SPECIAL_CODE) { + if (abs($this->lines[$i]->qty) <= (int) $this->lines[$linerang]->qty) { + return 1; + } + } else { + if ($current_module == 'facture') { + $result = $this->updateline( // @phpstan-ignore-line + $this->lines[$i]->id, // @phpstan-ignore-line + $this->lines[$i]->desc, // @phpstan-ignore-line + $this->lines[$i]->subprice, // @phpstan-ignore-line + $this->lines[$i]->qty, // @phpstan-ignore-line + $mode == 'discount' ? $value : $this->lines[$i]->remise_percent, // @phpstan-ignore-line + $this->lines[$i]->date_start, // @phpstan-ignore-line + $this->lines[$i]->date_end, // @phpstan-ignore-line + $mode == 'tva' ? $value : $this->lines[$i]->tva_tx, // @phpstan-ignore-line + $this->lines[$i]->localtax1_tx, // @phpstan-ignore-line + $this->lines[$i]->localtax2_tx, // @phpstan-ignore-line + 'HT', // @phpstan-ignore-line + $this->lines[$i]->info_bits, // @phpstan-ignore-line + $this->lines[$i]->product_type, // @phpstan-ignore-line + $this->lines[$i]->fk_parent_line, 0, // @phpstan-ignore-line + $this->lines[$i]->fk_fournprice, // @phpstan-ignore-line + $this->lines[$i]->pa_ht, // @phpstan-ignore-line + $this->lines[$i]->label, // @phpstan-ignore-line + $this->lines[$i]->special_code, // @phpstan-ignore-line + $this->lines[$i]->array_options, // @phpstan-ignore-line + $this->lines[$i]->situation_percent, // @phpstan-ignore-line + $this->lines[$i]->fk_unit, // @phpstan-ignore-line + $this->lines[$i]->multicurrency_subprice // @phpstan-ignore-line + ); + } elseif ($current_module == 'commande') { + $result = $this->updateline( // @phpstan-ignore-line + $this->lines[$i]->id, // @phpstan-ignore-line + $this->lines[$i]->desc, // @phpstan-ignore-line + $this->lines[$i]->subprice, // @phpstan-ignore-line + $this->lines[$i]->qty, // @phpstan-ignore-line + $mode == 'discount' ? $value : $this->lines[$i]->remise_percent, // @phpstan-ignore-line + $mode == 'tva' ? $value : $this->lines[$i]->tva_tx, // @phpstan-ignore-line + $this->lines[$i]->localtax1_rate, // @phpstan-ignore-line + $this->lines[$i]->localtax2_rate, // @phpstan-ignore-line + 'HT', // @phpstan-ignore-line + $this->lines[$i]->info_bits, // @phpstan-ignore-line + $this->lines[$i]->date_start, // @phpstan-ignore-line + $this->lines[$i]->date_end, // @phpstan-ignore-line + $this->lines[$i]->product_type, // @phpstan-ignore-line + $this->lines[$i]->fk_parent_line, 0, // @phpstan-ignore-line + $this->lines[$i]->fk_fournprice, // @phpstan-ignore-line + $this->lines[$i]->pa_ht, // @phpstan-ignore-line + $this->lines[$i]->label, // @phpstan-ignore-line + $this->lines[$i]->special_code, // @phpstan-ignore-line + $this->lines[$i]->array_options, // @phpstan-ignore-line + $this->lines[$i]->fk_unit, // @phpstan-ignore-line + $this->lines[$i]->multicurrency_subprice // @phpstan-ignore-line + ); + } elseif ($current_module == 'propal') { + $result = $this->updateline( // @phpstan-ignore-line + $this->lines[$i]->id, // @phpstan-ignore-line + $this->lines[$i]->subprice, // @phpstan-ignore-line + $this->lines[$i]->qty, // @phpstan-ignore-line + $mode == 'discount' ? $value : $this->lines[$i]->remise_percent, // @phpstan-ignore-line + $mode == 'tva' ? $value : $this->lines[$i]->tva_tx, // @phpstan-ignore-line + $this->lines[$i]->localtax1_rate, // @phpstan-ignore-line + $this->lines[$i]->localtax2_rate, // @phpstan-ignore-line + $this->lines[$i]->desc, // @phpstan-ignore-line + 'HT', // @phpstan-ignore-line + $this->lines[$i]->info_bits, // @phpstan-ignore-line + $this->lines[$i]->special_code, // @phpstan-ignore-line + $this->lines[$i]->fk_parent_line, 0, // @phpstan-ignore-line + $this->lines[$i]->fk_fournprice, // @phpstan-ignore-line + $this->lines[$i]->pa_ht, // @phpstan-ignore-line + $this->lines[$i]->label, // @phpstan-ignore-line + $this->lines[$i]->product_type, // @phpstan-ignore-line + $this->lines[$i]->date_start, // @phpstan-ignore-line + $this->lines[$i]->date_end, // @phpstan-ignore-line + $this->lines[$i]->array_options, // @phpstan-ignore-line + $this->lines[$i]->fk_unit, // @phpstan-ignore-line + $this->lines[$i]->multicurrency_subprice // @phpstan-ignore-line + ); + } + if ($result < 0) { + return $result; + } + } + } + return 1; + } + + /** + * Return the total_ht of lines that are above the current line (excluded) and that are not a subtotal line + * until a title line of the same level is found + * + * @param object $line Line that needs the subtotal amount. + * @return string $total_ht + * + * @phan-suppress PhanUndeclaredProperty + */ + public function getSubtotalLineAmount($line) + { + $final_amount = 0; + for ($i = $line->rang-1; $i > 0; $i--) { + if (is_null($this->lines[$i-1]) || $this->lines[$i-1]->rang >= $line->rang) { + continue; + } + if ($this->lines[$i-1]->special_code == SUBTOTALS_SPECIAL_CODE && $this->lines[$i-1]->qty > 0) { + if ($this->lines[$i-1]->qty <= abs($line->qty)) { + return price($final_amount); + } + } else { + $final_amount += $this->lines[$i-1]->total_ht; + } + } + return price($final_amount); + } + + /** + * Return the multicurrency_total_ht of lines that are above the current line (excluded) and that are not a subtotal line + * until a title line of the same level is found + * + * @param object $line Line that needs the subtotal amount with multicurrency mod activated. + * @return string $total_ht + * + * @phan-suppress PhanUndeclaredProperty + */ + public function getSubtotalLineMulticurrencyAmount($line) + { + $final_amount = 0; + for ($i = $line->rang-1; $i > 0; $i--) { + if (is_null($this->lines[$i-1]) || $this->lines[$i-1]->rang >= $line->rang) { + continue; + } + if ($this->lines[$i-1]->special_code == SUBTOTALS_SPECIAL_CODE && $this->lines[$i-1]->qty>0) { + if ($this->lines[$i-1]->qty <= abs($line->qty)) { + return price($final_amount); + } + } else { + $final_amount += $this->lines[$i-1]->multicurrency_total_ht; + } + } + return price($final_amount); + } + + /** + * Retrieve the background color associated with a specific subtotal level. + * + * @param int|float $level The level of the subtotal for which the color is requested. + * @return string|null The background color in hexadecimal format or null if not set. + */ + public function getSubtotalColors($level) + { + return getDolGlobalString('SUBTOTAL_BACK_COLOR_LEVEL_'.abs($level)); + } + + /** + * Retrieve current object possible titles to choose from + * + * @return array The set of titles, empty if no title line set. + * + * @phan-suppress PhanUndeclaredProperty + */ + public function getPossibleTitles() + { + $titles = array(); + foreach ($this->lines as $line) { + if ($line->special_code == SUBTOTALS_SPECIAL_CODE && $line->qty > 0) { + $titles[$line->desc] = $line->desc; + } + if ($line->special_code == SUBTOTALS_SPECIAL_CODE && $line->qty < 0) { + unset($titles[$line->desc]); + } + } + return $titles; + } + + /** + * Retrieve the current object possible levels (defined in admin page) + * + * @param Translate $langs Translations. + * @return array The set of possible levels, empty if not defined correctly. + * + * @phan-suppress PhanUndeclaredProperty + */ + public function getPossibleLevels($langs) + { + $depth_array = array(); + $max_depth = getDolGlobalString('SUBTOTAL_'.strtoupper($this->element).'_MAX_DEPTH', 2); + for ($i = 0; $i < $max_depth; $i++) { + $depth_array[$i + 1] = $langs->trans("Level", $i + 1); + } + return $depth_array; + } + + /** + * Returns an array with the IDs of the line that we don't need to show to avoid empty blocks + * + * @return array $total_ht + * + * @phan-suppress PhanUndeclaredProperty + */ + public function getDisabledShippmentSubtotalLines() + { + $toDisableLines = array(); + $toDisable = true; + $oldDesc = ""; + $oldDepth = 0; + + foreach ($this->lines as $titleLine) { + if ($titleLine->special_code != SUBTOTALS_SPECIAL_CODE || $titleLine->qty <= 0) { + continue; + } + foreach ($this->lines as $line) { + if ($line->id == $titleLine->id) { + $oldDesc = $line->desc; + $oldDepth = $line->qty; + } + if ($line->special_code != SUBTOTALS_SPECIAL_CODE && $line->fk_product_type == 0 && !empty($oldDesc) && !empty($oldDepth)) { + $toDisable = false; + } + if ($line->special_code == SUBTOTALS_SPECIAL_CODE && $line->qty == -$oldDepth && $line->desc == $oldDesc) { + if ($toDisable) { + $toDisableLines = array_merge($toDisableLines, array($titleLine->id, $line->id)); + } + $oldDesc = ""; + $oldDepth = 0; + $toDisable = true; + break; + } + } + } + return $toDisableLines; + } +} diff --git a/htdocs/subtotals/core/substitutions/functions_subtotals.lib.php b/htdocs/subtotals/core/substitutions/functions_subtotals.lib.php new file mode 100644 index 00000000000..a3ddd90b43a --- /dev/null +++ b/htdocs/subtotals/core/substitutions/functions_subtotals.lib.php @@ -0,0 +1,28 @@ + $substitutionarray Array with substitution key=>val +* @param Translate $langs Output langs +* @param Object $object Object to use to get values +* @param object $line Line to use to get values +* @return void The entry parameter $substitutionarray is modified +*/ +function subtotals_completesubstitutionarray_lines(&$substitutionarray, $langs, $object, $line) +{ + global $conf, $db; + + $substitutionarray['is_subtotals_line'] = $line->special_code == SUBTOTALS_SPECIAL_CODE; + $substitutionarray['is_not_subtotals_line'] = !$substitutionarray['is_subtotals_line']; + $substitutionarray['is_subtotals_title'] = $line->special_code == SUBTOTALS_SPECIAL_CODE && $line->qty > 0; + $substitutionarray['is_subtotals_subtotal'] = $line->special_code == SUBTOTALS_SPECIAL_CODE && $line->qty < 0; + $subtotal_total = 0; + if (isModEnabled('multicurrency') && $object->multicurrency_code != $conf->currency) { + $subtotal_total = $object->getSubtotalLineMulticurrencyAmount($line); // @phan-suppress-current-line PhanPluginUnknownObjectMethodCall + } else { + $subtotal_total = $object->getSubtotalLineAmount($line); // @phan-suppress-current-line PhanPluginUnknownObjectMethodCall + } + $substitutionarray['subtotals_total'] = $subtotal_total == 0 ? "" : $subtotal_total; + $substitutionarray['subtotals_level'] = abs($line->qty); +} diff --git a/test/phpunit/CommonClassTest.class.php b/test/phpunit/CommonClassTest.class.php index 27722930f95..b2070bbcbfa 100644 --- a/test/phpunit/CommonClassTest.class.php +++ b/test/phpunit/CommonClassTest.class.php @@ -453,6 +453,7 @@ abstract class CommonClassTest extends TestCase 'stock' => 'Stock', 'stocktransfer' => 'StockTransfer', 'stripe' => 'Stripe', + 'subtotals' => 'Subtotals', 'supplier_invoice' => null, // Special case, uses invoice 'supplier_order' => null, // Special case, uses invoice 'supplier_proposal' => 'SupplierProposal',