diff --git a/COPYRIGHT b/COPYRIGHT index 4ce5efff40b..ea0c6453486 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -14,15 +14,14 @@ Component Version License GPL Compatible PHP libraries: AdoDb-Date 0.36 Modified BSD License Yes Date convertion (not into rpm package) CKEditor 4.11.4 LGPL-2.1+ Yes Editor WYSIWYG -PHPDebugBar 1.15.0 MIT License Yes Used only by the module "debugbar" for developers EvalMath 1.0 BSD Yes Safe math expressions evaluation Escpos-php ? MIT License Yes Thermal receipt printer library, for use with ESC/POS compatible printers GeoIP 1.4 LGPL-2.1+ Yes Sample code to make geoip convert (not into deb package) Mobiledetect 2.8.83 MIT License Yes Detect mobile devices browsers NuSoap 0.9.5 LGPL 2.1+ Yes Library to develop SOAP Web services (not into rpm and deb package) PEAR Mail_MIME 1.8.9 BSD Yes NuSoap dependency -odtPHP 1.0.1 GPL-2+ Yes Library to build/edit ODT files ParseDown 1.6 MIT License Yes Markdown parser +PHPDebugBar 1.15.0 MIT License Yes Used only by the module "debugbar" for developers PHPExcel 1.8.1 LGPL-2.1+ Yes Read/Write XLS files, read ODS files PHPSpreadSheet ? LGPL-2.1+ Yes Read/Write XLS files, read ODS files php-iban 1.4.7 LGPL-3+ Yes Parse and validate IBAN (and IIBAN) bank account information in PHP diff --git a/htdocs/accountancy/admin/account.php b/htdocs/accountancy/admin/account.php index 0193d9c1f75..b3ddbc43feb 100644 --- a/htdocs/accountancy/admin/account.php +++ b/htdocs/accountancy/admin/account.php @@ -19,7 +19,7 @@ /** * \file htdocs/accountancy/admin/account.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief List accounting account */ diff --git a/htdocs/accountancy/admin/accountmodel.php b/htdocs/accountancy/admin/accountmodel.php index 6404b6119e7..f44ff0071d2 100644 --- a/htdocs/accountancy/admin/accountmodel.php +++ b/htdocs/accountancy/admin/accountmodel.php @@ -28,7 +28,7 @@ /** * \file htdocs/accountancy/admin/accountmodel.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Page to administer model of chart of accounts */ diff --git a/htdocs/accountancy/admin/card.php b/htdocs/accountancy/admin/card.php index 6d43f01b03f..a6c3969e64a 100644 --- a/htdocs/accountancy/admin/card.php +++ b/htdocs/accountancy/admin/card.php @@ -19,7 +19,7 @@ /** * \file htdocs/accountancy/admin/card.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Card of accounting account */ diff --git a/htdocs/accountancy/admin/categories.php b/htdocs/accountancy/admin/categories.php index faba7fb1c62..17fa65d4f5e 100644 --- a/htdocs/accountancy/admin/categories.php +++ b/htdocs/accountancy/admin/categories.php @@ -18,7 +18,7 @@ /** * \file htdocs/accountancy/admin/categories.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Page to assign mass categories to accounts */ diff --git a/htdocs/accountancy/admin/closure.php b/htdocs/accountancy/admin/closure.php index ff559332316..a638d598ac9 100644 --- a/htdocs/accountancy/admin/closure.php +++ b/htdocs/accountancy/admin/closure.php @@ -18,7 +18,7 @@ /** * \file htdocs/accountancy/admin/closure.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Setup page to configure accounting expert module */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/admin/defaultaccounts.php b/htdocs/accountancy/admin/defaultaccounts.php index 4ea9ff9139a..cba9ac92f3b 100644 --- a/htdocs/accountancy/admin/defaultaccounts.php +++ b/htdocs/accountancy/admin/defaultaccounts.php @@ -24,7 +24,7 @@ /** * \file htdocs/accountancy/admin/defaultaccounts.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Setup page to configure accounting expert module */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/admin/export.php b/htdocs/accountancy/admin/export.php index 15e455cf84c..74090e54120 100644 --- a/htdocs/accountancy/admin/export.php +++ b/htdocs/accountancy/admin/export.php @@ -23,7 +23,7 @@ /** * \file htdocs/accountancy/admin/export.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Setup page to configure accounting expert module */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/admin/fiscalyear.php b/htdocs/accountancy/admin/fiscalyear.php index 725dddf1339..fff0118c224 100644 --- a/htdocs/accountancy/admin/fiscalyear.php +++ b/htdocs/accountancy/admin/fiscalyear.php @@ -17,7 +17,7 @@ /** * \file htdocs/accountancy/admin/fiscalyear.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Setup page to configure fiscal year */ diff --git a/htdocs/accountancy/admin/fiscalyear_card.php b/htdocs/accountancy/admin/fiscalyear_card.php index 4063e28f369..5dc6010d465 100644 --- a/htdocs/accountancy/admin/fiscalyear_card.php +++ b/htdocs/accountancy/admin/fiscalyear_card.php @@ -18,7 +18,7 @@ /** * \file htdocs/accountancy/admin/fiscalyear_card.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Page to show a fiscal year */ diff --git a/htdocs/accountancy/admin/fiscalyear_info.php b/htdocs/accountancy/admin/fiscalyear_info.php index 86b01fa7397..dfec49949a3 100644 --- a/htdocs/accountancy/admin/fiscalyear_info.php +++ b/htdocs/accountancy/admin/fiscalyear_info.php @@ -17,7 +17,7 @@ /** * \file htdocs/accountancy/admin/fiscalyear_info.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Page to show info of a fiscal year */ diff --git a/htdocs/accountancy/admin/index.php b/htdocs/accountancy/admin/index.php index 984a5b08e90..b842c8115da 100644 --- a/htdocs/accountancy/admin/index.php +++ b/htdocs/accountancy/admin/index.php @@ -24,7 +24,7 @@ /** * \file htdocs/accountancy/admin/index.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Setup page to configure accounting expert module */ diff --git a/htdocs/accountancy/admin/journals_list.php b/htdocs/accountancy/admin/journals_list.php index c48e1a5989d..cac81bfbcae 100644 --- a/htdocs/accountancy/admin/journals_list.php +++ b/htdocs/accountancy/admin/journals_list.php @@ -18,7 +18,7 @@ /** * \file htdocs/accountancy/admin/journals_list.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Setup page to configure journals */ diff --git a/htdocs/accountancy/admin/productaccount.php b/htdocs/accountancy/admin/productaccount.php index 80c2ed052c0..4d5561e3aca 100644 --- a/htdocs/accountancy/admin/productaccount.php +++ b/htdocs/accountancy/admin/productaccount.php @@ -21,7 +21,7 @@ /** * \file htdocs/accountancy/admin/productaccount.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief To define accounting account on product / service */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/bookkeeping/balance.php b/htdocs/accountancy/bookkeeping/balance.php index 6d2c7644d85..44a12b76f36 100644 --- a/htdocs/accountancy/bookkeeping/balance.php +++ b/htdocs/accountancy/bookkeeping/balance.php @@ -21,7 +21,7 @@ /** * \file htdocs/accountancy/bookkeeping/balance.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Balance of book keeping */ diff --git a/htdocs/accountancy/bookkeeping/balancebymonth.php b/htdocs/accountancy/bookkeeping/balancebymonth.php index edf7383b595..b9568228a36 100644 --- a/htdocs/accountancy/bookkeeping/balancebymonth.php +++ b/htdocs/accountancy/bookkeeping/balancebymonth.php @@ -21,7 +21,7 @@ /** * \file htdocs/accountancy/bookkeeping/balancebymonth.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Balance by month */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/bookkeeping/card.php b/htdocs/accountancy/bookkeeping/card.php index ca0476f3a3c..a84a2b2e5b1 100644 --- a/htdocs/accountancy/bookkeeping/card.php +++ b/htdocs/accountancy/bookkeeping/card.php @@ -21,7 +21,7 @@ /** * \file htdocs/accountancy/bookkeeping/card.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Page to show book-entry */ diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php index 7de500ba690..733aea9ac1c 100644 --- a/htdocs/accountancy/bookkeeping/list.php +++ b/htdocs/accountancy/bookkeeping/list.php @@ -1,7 +1,7 @@ * Copyright (C) 2013-2016 Florian Henry - * Copyright (C) 2013-2018 Alexandre Spangaro + * Copyright (C) 2013-2019 Alexandre Spangaro * Copyright (C) 2016-2017 Laurent Destailleur * Copyright (C) 2018 Frédéric France * @@ -21,7 +21,7 @@ /** * \file htdocs/accountancy/bookkeeping/list.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief List operation of book keeping */ require '../../main.inc.php'; @@ -32,6 +32,7 @@ require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingjournal.class.php require_once DOL_DOCUMENT_ROOT . '/core/class/html.formother.class.php'; require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php'; +require_once DOL_DOCUMENT_ROOT . '/core/lib/admin.lib.php'; // Load translation files required by the page $langs->loadLangs(array("accountancy")); @@ -47,6 +48,9 @@ $search_date_creation_start = dol_mktime(0, 0, 0, GETPOST('date_creation_startmo $search_date_creation_end = dol_mktime(0, 0, 0, GETPOST('date_creation_endmonth', 'int'), GETPOST('date_creation_endday', 'int'), GETPOST('date_creation_endyear', 'int')); $search_date_modification_start = dol_mktime(0, 0, 0, GETPOST('date_modification_startmonth', 'int'), GETPOST('date_modification_startday', 'int'), GETPOST('date_modification_startyear', 'int')); $search_date_modification_end = dol_mktime(0, 0, 0, GETPOST('date_modification_endmonth', 'int'), GETPOST('date_modification_endday', 'int'), GETPOST('date_modification_endyear', 'int')); +$search_date_export_start = dol_mktime(0, 0, 0, GETPOST('date_export_startmonth', 'int'), GETPOST('date_export_startday', 'int'), GETPOST('date_export_startyear', 'int')); +$search_date_export_end = dol_mktime(0, 0, 0, GETPOST('date_export_endmonth', 'int'), GETPOST('date_export_endday', 'int'), GETPOST('date_export_endyear', 'int')); + //var_dump($search_date_start);exit; if (GETPOST("button_delmvt_x") || GETPOST("button_delmvt.x") || GETPOST("button_delmvt")) { $action = 'delbookkeepingyear'; @@ -143,6 +147,7 @@ $arrayfields=array( 't.code_journal'=>array('label'=>$langs->trans("Codejournal"), 'checked'=>1), 't.date_creation'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0), 't.tms'=>array('label'=>$langs->trans("DateModification"), 'checked'=>0), + 't.date_export'=>array('label'=>$langs->trans("DateExport"), 'checked'=>1), ); if (empty($conf->global->ACCOUNTING_ENABLE_LETTERING)) unset($arrayfields['t.lettering_code']); @@ -178,6 +183,8 @@ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x' $search_date_creation_end = ''; $search_date_modification_start = ''; $search_date_modification_end = ''; + $search_date_export_start = ''; + $search_date_export_end = ''; $search_debit = ''; $search_credit = ''; $search_lettering_code = ''; @@ -269,6 +276,16 @@ if (! empty($search_date_modification_end)) { $tmp=dol_getdate($search_date_modification_end); $param .= '&date_modification_endmonth=' . $tmp['mon'] . '&date_modification_endday=' . $tmp['mday'] . '&date_modification_endyear=' . $tmp['year']; } +if (! empty($search_date_export_start)) { + $filter['t.date_export>='] = $search_date_export_start; + $tmp=dol_getdate($search_date_export_start); + $param .= '&date_export_startmonth=' . $tmp['mon'] . '&date_export_startday=' . $tmp['mday'] . '&date_export_startyear=' . $tmp['year']; +} +if (! empty($search_date_export_end)) { + $filter['t.date_export<='] = $search_date_export_end; + $tmp=dol_getdate($search_date_export_end); + $param .= '&date_export_endmonth=' . $tmp['mon'] . '&date_export_endday=' . $tmp['mday'] . '&date_export_endyear=' . $tmp['year']; +} if (! empty($search_debit)) { $filter['t.debit'] = $search_debit; $param .= '&search_debit=' . urlencode($search_debit); @@ -348,8 +365,7 @@ if ($action == 'delmouvconfirm') { // Export into a file with format defined into setup (FEC, CSV, ...) if ($action == 'export_file') { - - $result = $object->fetchAll($sortorder, $sortfield, 0, 0, $filter); + $result = $object->fetchAll($sortorder, $sortfield, 0, 0, $filter, 'AND', $conf->global->ACCOUNTING_REEXPORT); if ($result < 0) { @@ -357,17 +373,57 @@ if ($action == 'export_file') { } else { + // Export files $accountancyexport = new AccountancyExport($db); $accountancyexport->export($object->lines); - if (!empty($accountancyexport->errors)) - { - setEventMessages('', $accountancyexport->errors, 'errors'); - } + if (! empty($accountancyexport->errors)) + { + setEventMessages('', $accountancyexport->errors, 'errors'); + } else { + // Specify as export : update field date_export + // TODO Move in class bookKeeping + $error=0; + $db->begin(); + + if (is_array($object->lines)) { + foreach ($object->lines as $movement) { + $now = dol_now(); + $sql = " UPDATE " . MAIN_DB_PREFIX . "accounting_bookkeeping"; + $sql .= " SET date_export = '" . $db->idate($now) . "'"; + $sql .= " WHERE rowid = " . $movement->id; + + dol_syslog("/accountancy/bookeeping/list.php Function export_file Specify movements as exported sql=" . $sql, LOG_DEBUG); + $result = $db->query($sql); + if ($result) { + $db->commit(); + // setEventMessages($langs->trans("AllExportedMovementsWereRecordedAsExported"), null, 'mesgs'); + } else { + $db->rollback(); + // setEventMessages($langs->trans("NotAllExportedMovementsCouldBeRecordedAsExported"), null, 'errors'); + } + } + } + } exit; } } +if ($action == 'setreexport') { + $export = 0; + $setreexport = GETPOST('value', 'int'); + if (! dolibarr_set_const($db, "ACCOUNTING_REEXPORT", $setreexport, 'yesno', 0, '', $conf->entity)) $error++; + + if (! $error) { + if ($conf->global->ACCOUNTING_REEXPORT == 1) { + setEventMessages($langs->trans("ExportOfPiecesAlreadyExportedIsEnable"), null, 'mesgs'); + } else { + setEventMessages($langs->trans("ExportOfPiecesAlreadyExportedIsDisable"), null, 'mesgs'); + } + } else { + setEventMessages($langs->trans("Error"), null, 'errors'); + } +} /* * View @@ -380,14 +436,14 @@ llxHeader('', $title_page); // List $nbtotalofrecords = ''; if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) { - $nbtotalofrecords = $object->fetchAll($sortorder, $sortfield, 0, 0, $filter); + $nbtotalofrecords = $object->fetchAll($sortorder, $sortfield, 0, 0, $filter, 'AND', $conf->global->ACCOUNTING_REEXPORT); if ($nbtotalofrecords < 0) { setEventMessages($object->error, $object->errors, 'errors'); } } // TODO Do not use this -$result = $object->fetchAll($sortorder, $sortfield, $limit, $offset, $filter); +$result = $object->fetchAll($sortorder, $sortfield, $limit, $offset, $filter, 'AND', $conf->global->ACCOUNTING_REEXPORT); if ($result < 0) { setEventMessages($object->error, $object->errors, 'errors'); } @@ -442,18 +498,26 @@ print ''; print ''; print ''; -$listofformat=AccountancyExport::getType(); +$button .= ''; +$listofformat=AccountancyExport::getType(); if (count($filter)) $buttonLabel = $langs->trans("ExportFilteredList"); else $buttonLabel = $langs->trans("ExportList"); -$newcardbutton = dolGetButtonTitle($buttonLabel, '', 'fa fa-file-export paddingleft', $_SERVER["PHP_SELF"].'?action=export_file'.($param?'&'.$param:'')); +// Button re-export +if (! empty($conf->global->ACCOUNTING_REEXPORT)) { + $newcardbutton =''.img_picto($langs->trans("Activated"), 'switch_on').' '; +} else { + $newcardbutton =''.img_picto($langs->trans("Disabled"), 'switch_off').' '; +} +$newcardbutton.= $langs->trans("IncludeDocsAlreadyExported"); + +$newcardbutton.= dolGetButtonTitle($buttonLabel, $langs->trans("ExportFilteredList").' ('.$listofformat[$conf->global->ACCOUNTING_EXPORT_MODELCSV].')', 'fa fa-file-export paddingleft', $_SERVER["PHP_SELF"].'?action=export_file'.($param?'&'.$param:'')); $newcardbutton.= dolGetButtonTitle($langs->trans('GroupByAccountAccounting'), '', 'fa fa-stream paddingleft', DOL_URL_ROOT.'/accountancy/bookkeeping/listbyaccount.php?'.$param); $newcardbutton.= dolGetButtonTitle($langs->trans('NewAccountingMvt'), '', 'fa fa-plus-circle paddingleft', './card.php?action=create'); - print_barre_liste($title_page, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $result, $nbtotalofrecords, 'title_accountancy', 0, $newcardbutton, '', $limit); $varpage=empty($contextpage)?$_SERVER["PHP_SELF"]:$contextpage; @@ -596,6 +660,20 @@ if (! empty($arrayfields['t.tms']['checked'])) print ''; print ''; } +// Date export +if (! empty($arrayfields['t.date_export']['checked'])) +{ + print ''; + print '
'; + print $langs->trans('From') . ' '; + print $form->selectDate($search_date_export_start, 'date_export_start', 0, 0, 1); + print '
'; + print '
'; + print $langs->trans('to') . ' '; + print $form->selectDate($search_date_export_end, 'date_export_end', 0, 0, 1); + print '
'; + print ''; +} // Action column print ''; $searchpicto=$form->showFilterButtons(); @@ -616,6 +694,7 @@ if (! empty($arrayfields['t.lettering_code']['checked'])) print_liste_field_tit if (! empty($arrayfields['t.code_journal']['checked'])) print_liste_field_titre($arrayfields['t.code_journal']['label'], $_SERVER['PHP_SELF'], "t.code_journal", "", $param, '', $sortfield, $sortorder, 'center '); if (! empty($arrayfields['t.date_creation']['checked'])) print_liste_field_titre($arrayfields['t.date_creation']['label'], $_SERVER['PHP_SELF'], "t.date_creation", "", $param, '', $sortfield, $sortorder, 'center '); if (! empty($arrayfields['t.tms']['checked'])) print_liste_field_titre($arrayfields['t.tms']['label'], $_SERVER['PHP_SELF'], "t.tms", "", $param, '', $sortfield, $sortorder, 'center '); +if (! empty($arrayfields['t.date_export']['checked'])) print_liste_field_titre($arrayfields['t.date_export']['label'], $_SERVER['PHP_SELF'], "t.date_export", "", $param, '', $sortfield, $sortorder, 'center '); print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch '); print "\n"; @@ -728,11 +807,20 @@ if ($num > 0) if (! $i) $totalarray['nbfield']++; } + // Exported operation date + if (! empty($arrayfields['t.date_export']['checked'])) + { + print '' . dol_print_date($line->date_export, 'dayhour') . ''; + if (! $i) $totalarray['nbfield']++; + } + // Action column print ''; - print '' . img_edit() . ' '; - print '' . img_delete() . ''; - print ''; + if(empty($line->date_export)) { + print '' . img_edit() . ' '; + print '' . img_delete() . ''; + } + print ''; if (! $i) $totalarray['nbfield']++; print "\n"; diff --git a/htdocs/accountancy/bookkeeping/listbyaccount.php b/htdocs/accountancy/bookkeeping/listbyaccount.php index 0b9bebcea78..d1ef1377994 100644 --- a/htdocs/accountancy/bookkeeping/listbyaccount.php +++ b/htdocs/accountancy/bookkeeping/listbyaccount.php @@ -21,7 +21,7 @@ /** * \file htdocs/accountancy/bookkeeping/listbyaccount.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief List operation of book keeping ordered by account number */ diff --git a/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php b/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php index 50b80c72338..87bd79bb64d 100644 --- a/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php +++ b/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php @@ -22,7 +22,7 @@ /** * \file htdocs/accountancy/bookkeeping/thirdparty_lettrage_supplier.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Tab to setup lettering */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/class/accountancycategory.class.php b/htdocs/accountancy/class/accountancycategory.class.php index 523fba7acda..f11ff3957f7 100644 --- a/htdocs/accountancy/class/accountancycategory.class.php +++ b/htdocs/accountancy/class/accountancycategory.class.php @@ -19,7 +19,7 @@ /** * \file htdocs/accountancy/class/accountancycategory.class.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief File of class to manage categories of an accounting category_type */ diff --git a/htdocs/accountancy/class/accountancyexport.class.php b/htdocs/accountancy/class/accountancyexport.class.php index 0bfbbea2581..053586e668e 100644 --- a/htdocs/accountancy/class/accountancyexport.class.php +++ b/htdocs/accountancy/class/accountancyexport.class.php @@ -27,7 +27,7 @@ /** * \file htdocs/accountancy/class/accountancyexport.class.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Class accountancy export */ diff --git a/htdocs/accountancy/class/accountancysystem.class.php b/htdocs/accountancy/class/accountancysystem.class.php index a704b1c9789..580ecda0b50 100644 --- a/htdocs/accountancy/class/accountancysystem.class.php +++ b/htdocs/accountancy/class/accountancysystem.class.php @@ -19,7 +19,7 @@ /** * \file htdocs/accountancy/class/accountancysystem.class.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief File of class to manage accountancy systems */ diff --git a/htdocs/accountancy/class/accountingaccount.class.php b/htdocs/accountancy/class/accountingaccount.class.php index 4d97b38bfb7..bc25e33484d 100644 --- a/htdocs/accountancy/class/accountingaccount.class.php +++ b/htdocs/accountancy/class/accountingaccount.class.php @@ -22,7 +22,7 @@ /** * \file htdocs/accountancy/class/accountingaccount.class.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief File of class to manage accounting accounts */ diff --git a/htdocs/accountancy/class/accountingjournal.class.php b/htdocs/accountancy/class/accountingjournal.class.php index eb99badd5f3..e8caaab8a89 100644 --- a/htdocs/accountancy/class/accountingjournal.class.php +++ b/htdocs/accountancy/class/accountingjournal.class.php @@ -17,7 +17,7 @@ /** * \file htdocs/accountancy/class/accountingjournal.class.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief File of class to manage accounting journals */ diff --git a/htdocs/accountancy/class/bookkeeping.class.php b/htdocs/accountancy/class/bookkeeping.class.php index b549a042bba..27aee939594 100644 --- a/htdocs/accountancy/class/bookkeeping.class.php +++ b/htdocs/accountancy/class/bookkeeping.class.php @@ -20,7 +20,7 @@ /** * \file htdocs/accountancy/class/bookkeeping.class.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief File of class to manage Ledger (General Ledger and Subledger) */ @@ -860,15 +860,16 @@ class BookKeeping extends CommonObject /** * Load object in memory from the database * - * @param string $sortorder Sort Order - * @param string $sortfield Sort field - * @param int $limit Offset limit - * @param int $offset Offset limit - * @param array $filter Filter array - * @param string $filtermode Filter mode (AND or OR) - * @return int <0 if KO, >0 if OK + * @param string $sortorder Sort Order + * @param string $sortfield Sort field + * @param int $limit Offset limit + * @param int $offset Offset limit + * @param array $filter Filter array + * @param string $filtermode Filter mode (AND or OR) + * @param int $showAlreadyExportMovements Show movements when field 'date_export' is not empty (0:No / 1:Yes (Default)) + * @return int <0 if KO, >0 if OK */ - public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, array $filter = array(), $filtermode = 'AND') + public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, array $filter = array(), $filtermode = 'AND', $showAlreadyExportMovements = 1) { global $conf; @@ -898,7 +899,8 @@ class BookKeeping extends CommonObject $sql .= " t.journal_label,"; $sql .= " t.piece_num,"; $sql .= " t.date_creation,"; - $sql .= " t.tms as date_modification"; + $sql .= " t.tms as date_modification,"; + $sql .= " t.date_export"; $sql .= ' FROM ' . MAIN_DB_PREFIX . $this->table_element . ' as t'; // Manage filter $sqlwhere = array (); @@ -918,6 +920,8 @@ class BookKeeping extends CommonObject $sqlwhere[] = $key . '\'' . $this->db->idate($value) . '\''; } elseif ($key == 't.tms>=' || $key == 't.tms<=') { $sqlwhere[] = $key . '\'' . $this->db->idate($value) . '\''; + } elseif ($key == 't.date_export>=' || $key == 't.date_export<=') { + $sqlwhere[] = $key . '\'' . $this->db->idate($value) . '\''; } elseif ($key == 't.credit' || $key == 't.debit') { $sqlwhere[] = natural_search($key, $value, 1, 1); } else { @@ -926,10 +930,12 @@ class BookKeeping extends CommonObject } } $sql.= ' WHERE t.entity IN (' . getEntity('accountancy') . ')'; + if ($showAlreadyExportMovements == 0) { + $sql .= " AND t.date_export IS NULL"; + } if (count($sqlwhere) > 0) { $sql .= ' AND ' . implode(' ' . $filtermode . ' ', $sqlwhere); } - if (! empty($sortfield)) { $sql .= $this->db->order($sortfield, $sortorder); } @@ -972,6 +978,7 @@ class BookKeeping extends CommonObject $line->piece_num = $obj->piece_num; $line->date_creation = $this->db->jdate($obj->date_creation); $line->date_modification = $this->db->jdate($obj->date_modification); + $line->date_export = $this->db->jdate($obj->date_export); $this->lines[] = $line; diff --git a/htdocs/accountancy/class/lettering.class.php b/htdocs/accountancy/class/lettering.class.php index 555e1a244a6..a0c977a8d5a 100644 --- a/htdocs/accountancy/class/lettering.class.php +++ b/htdocs/accountancy/class/lettering.class.php @@ -20,7 +20,7 @@ /** * \file htdocs/accountancy/class/lettering.class.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief File of class for lettering */ diff --git a/htdocs/accountancy/customer/card.php b/htdocs/accountancy/customer/card.php index 5c1dfc5ccbb..eb66b235d0b 100644 --- a/htdocs/accountancy/customer/card.php +++ b/htdocs/accountancy/customer/card.php @@ -19,7 +19,7 @@ /** * \file htdocs/accountancy/customer/card.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Card customer ventilation */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/customer/index.php b/htdocs/accountancy/customer/index.php index 039b7076c3e..0131f51d515 100644 --- a/htdocs/accountancy/customer/index.php +++ b/htdocs/accountancy/customer/index.php @@ -22,7 +22,7 @@ /** * \file htdocs/accountancy/customer/index.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Home customer journalization page */ diff --git a/htdocs/accountancy/customer/lines.php b/htdocs/accountancy/customer/lines.php index 83bceb04026..19e85cdb651 100644 --- a/htdocs/accountancy/customer/lines.php +++ b/htdocs/accountancy/customer/lines.php @@ -21,7 +21,7 @@ /** * \file htdocs/accountancy/customer/lines.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Page of detail of the lines of ventilation of invoices customers */ require '../../main.inc.php'; @@ -310,9 +310,9 @@ if ($result) { print ''; print ''; if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) { - print ''; + print ''; } - print ''; + print ''; $formother->select_year($search_year, 'search_year', 1, 20, 5); print ''; print ''; diff --git a/htdocs/accountancy/customer/list.php b/htdocs/accountancy/customer/list.php index 3b9a3f23564..ed1c40a6ad7 100644 --- a/htdocs/accountancy/customer/list.php +++ b/htdocs/accountancy/customer/list.php @@ -22,7 +22,7 @@ /** * \file htdocs/accountancy/customer/list.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Ventilation page from customers invoices */ require '../../main.inc.php'; @@ -377,9 +377,9 @@ if ($result) { print ''; print ''; if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) { - print ''; + print ''; } - print ''; + print ''; $formother->select_year($search_year, 'search_year', 1, 20, 5); print ''; print ''; @@ -410,7 +410,7 @@ if ($result) { print_liste_field_titre("Amount", $_SERVER["PHP_SELF"], "l.total_ht", "", $param, '', $sortfield, $sortorder, 'right maxwidth50 '); print_liste_field_titre("VATRate", $_SERVER["PHP_SELF"], "l.tva_tx", "", $param, '', $sortfield, $sortorder, 'right '); print_liste_field_titre("Country", $_SERVER["PHP_SELF"], "co.label", "", $param, '', $sortfield, $sortorder); - print_liste_field_titre("VATIntra", $_SERVER["PHP_SELF"], "s.tva_intra", "", $param, '', $sortfield, $sortorder, 'center '); + print_liste_field_titre("VATIntra", $_SERVER["PHP_SELF"], "s.tva_intra", "", $param, '', $sortfield, $sortorder); print_liste_field_titre("AccountAccountingSuggest", '', '', '', '', '', '', '', 'center '); print_liste_field_titre("IntoAccount", '', '', '', '', '', '', '', 'center '); $checkpicto=''; diff --git a/htdocs/accountancy/expensereport/card.php b/htdocs/accountancy/expensereport/card.php index eb620d7bf14..1052a1d485d 100644 --- a/htdocs/accountancy/expensereport/card.php +++ b/htdocs/accountancy/expensereport/card.php @@ -23,7 +23,7 @@ */ /** * \file htdocs/accountancy/supplier/card.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Card expense report ventilation */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/expensereport/index.php b/htdocs/accountancy/expensereport/index.php index 696f947b63f..a5026f920a0 100644 --- a/htdocs/accountancy/expensereport/index.php +++ b/htdocs/accountancy/expensereport/index.php @@ -20,7 +20,7 @@ /** * \file htdocs/accountancy/expensereport/index.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Home expense report ventilation */ diff --git a/htdocs/accountancy/expensereport/lines.php b/htdocs/accountancy/expensereport/lines.php index 734bbfb65d2..508dfb7136e 100644 --- a/htdocs/accountancy/expensereport/lines.php +++ b/htdocs/accountancy/expensereport/lines.php @@ -21,7 +21,7 @@ /** * \file htdocs/accountancy/expensereport/lines.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Page of detail of the lines of ventilation of expense reports */ require '../../main.inc.php'; @@ -263,8 +263,8 @@ if ($result) { print ''; print ''; print ''; - if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; - print ''; + if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; + print ''; $formother->select_year($search_year, 'search_year', 1, 20, 5); print ''; print ''; diff --git a/htdocs/accountancy/expensereport/list.php b/htdocs/accountancy/expensereport/list.php index a317f7e50b2..9f70d175d40 100644 --- a/htdocs/accountancy/expensereport/list.php +++ b/htdocs/accountancy/expensereport/list.php @@ -22,7 +22,7 @@ /** * \file htdocs/accountancy/expensereport/list.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Ventilation page from expense reports */ require '../../main.inc.php'; @@ -309,8 +309,8 @@ if ($result) { print ''; print ''; print ''; - if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; - print ''; + if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; + print ''; $formother->select_year($search_year, 'search_year', 1, 20, 5); print ''; print ''; diff --git a/htdocs/accountancy/index.php b/htdocs/accountancy/index.php index b34efe5ea04..922f1285b3c 100644 --- a/htdocs/accountancy/index.php +++ b/htdocs/accountancy/index.php @@ -18,7 +18,7 @@ /** * \file htdocs/accountancy/index.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Home accounting module */ diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php index cce4c33e383..e4e07831b44 100644 --- a/htdocs/accountancy/journal/bankjournal.php +++ b/htdocs/accountancy/journal/bankjournal.php @@ -27,7 +27,7 @@ /** * \file htdocs/accountancy/journal/bankjournal.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Page with bank journal */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/journal/expensereportsjournal.php b/htdocs/accountancy/journal/expensereportsjournal.php index f02ea6c2212..4c50015a2ba 100644 --- a/htdocs/accountancy/journal/expensereportsjournal.php +++ b/htdocs/accountancy/journal/expensereportsjournal.php @@ -25,7 +25,7 @@ /** * \file htdocs/accountancy/journal/expensereportsjournal.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Page with expense reports journal */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/journal/purchasesjournal.php b/htdocs/accountancy/journal/purchasesjournal.php index ee59481a419..cab5069e1f8 100644 --- a/htdocs/accountancy/journal/purchasesjournal.php +++ b/htdocs/accountancy/journal/purchasesjournal.php @@ -25,7 +25,7 @@ /** * \file htdocs/accountancy/journal/purchasesjournal.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Page with purchases journal */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/journal/sellsjournal.php b/htdocs/accountancy/journal/sellsjournal.php index 449f0a278eb..8f82fd95afb 100644 --- a/htdocs/accountancy/journal/sellsjournal.php +++ b/htdocs/accountancy/journal/sellsjournal.php @@ -26,7 +26,7 @@ /** * \file htdocs/accountancy/journal/sellsjournal.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Page with sells journal */ diff --git a/htdocs/accountancy/supplier/card.php b/htdocs/accountancy/supplier/card.php index 10e52d6c029..97f7d618ce8 100644 --- a/htdocs/accountancy/supplier/card.php +++ b/htdocs/accountancy/supplier/card.php @@ -23,7 +23,7 @@ */ /** * \file htdocs/accountancy/supplier/card.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Card supplier ventilation */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/supplier/index.php b/htdocs/accountancy/supplier/index.php index 6f178c755d3..ca60735fcf0 100644 --- a/htdocs/accountancy/supplier/index.php +++ b/htdocs/accountancy/supplier/index.php @@ -20,7 +20,7 @@ /** * \file htdocs/accountancy/supplier/index.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Home supplier journalization page */ diff --git a/htdocs/accountancy/supplier/lines.php b/htdocs/accountancy/supplier/lines.php index 9b704e21eb3..352a73200fb 100644 --- a/htdocs/accountancy/supplier/lines.php +++ b/htdocs/accountancy/supplier/lines.php @@ -21,7 +21,7 @@ /** * \file htdocs/accountancy/supplier/lines.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Page of detail of the lines of ventilation of invoices suppliers */ require '../../main.inc.php'; @@ -314,8 +314,8 @@ if ($result) { print ''; print ''; print ''; - if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; - print ''; + if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; + print ''; $formother->select_year($search_year, 'search_year', 1, 20, 5); print ''; print ''; diff --git a/htdocs/accountancy/supplier/list.php b/htdocs/accountancy/supplier/list.php index b7b74104f14..fc8cc10fec4 100644 --- a/htdocs/accountancy/supplier/list.php +++ b/htdocs/accountancy/supplier/list.php @@ -22,7 +22,7 @@ /** * \file htdocs/accountancy/supplier/list.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Ventilation page from suppliers invoices */ require '../../main.inc.php'; @@ -376,8 +376,8 @@ if ($result) { print ''; print ''; print ''; - if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; - print ''; + if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; + print ''; $formother->select_year($search_year, 'search_year', 1, 20, 5); print ''; print ''; diff --git a/htdocs/bom/bom_agenda.php b/htdocs/bom/bom_agenda.php index a4bf134e3ce..d7d86c50543 100644 --- a/htdocs/bom/bom_agenda.php +++ b/htdocs/bom/bom_agenda.php @@ -196,7 +196,7 @@ if ($object->id > 0) $objthirdparty=$object; $objcon=new stdClass(); - $out=''; + $out='&origin='.$object->element.'&originid='.$object->id; $permok=$user->rights->agenda->myactions->create; if ((! empty($objthirdparty->id) || ! empty($objcon->id)) && $permok) { @@ -227,9 +227,9 @@ if ($object->id > 0) if (! empty($conf->agenda->enabled) && (!empty($user->rights->agenda->myactions->read) || !empty($user->rights->agenda->allactions->read) )) { - $param='&socid='.$socid; - if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage; - if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit; + $param='&id='.$object->id.'&socid='.$socid; + if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.urlencode($contextpage); + if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.urlencode($limit); //print load_fiche_titre($langs->trans("ActionsOnBom"), '', ''); @@ -239,7 +239,7 @@ if ($object->id > 0) $filters['search_agenda_label']=$search_agenda_label; // TODO Replace this with same code than into list.php - //show_actions_done($conf,$langs,$db,$object,null,0,$actioncode, '', $filters, $sortfield, $sortorder); + show_actions_done($conf, $langs, $db, $object, null, 0, $actioncode, '', $filters, $sortfield, $sortorder); } } diff --git a/htdocs/comm/action/card.php b/htdocs/comm/action/card.php index 71702c7b507..8e8d21c51b1 100644 --- a/htdocs/comm/action/card.php +++ b/htdocs/comm/action/card.php @@ -238,8 +238,8 @@ if ($action == 'add') $object->fulldayevent = (! empty($fulldayevent)?1:0); $object->location = GETPOST("location"); $object->label = trim(GETPOST('label')); - $object->fk_element = GETPOST("fk_element"); - $object->elementtype = GETPOST("elementtype"); + $object->fk_element = GETPOST("fk_element", 'int'); + $object->elementtype = GETPOST("elementtype", 'alpha'); if (! GETPOST('label')) { if (GETPOST('actioncode') == 'AC_RDV' && $contact->getFullName($langs)) @@ -349,7 +349,7 @@ if ($action == 'add') { $db->begin(); - // On cree l'action + // Creation of action/event $idaction=$object->create($user); if ($idaction > 0) @@ -690,7 +690,7 @@ if ($action == 'create') dol_fiche_head(); - print ''; + print '
'; // Type of event if (! empty($conf->global->AGENDA_USE_EVENT_TYPE)) @@ -857,7 +857,7 @@ if ($action == 'create') print '


'; - print '
'; + print '
'; if ($conf->societe->enabled) { diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index 0ac28e92bb0..6396b5e5f88 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -1647,7 +1647,7 @@ class Contrat extends CommonObject // if buy price not defined, define buyprice as configured in margin admin if ($this->pa_ht == 0) { - if (($result = $this->defineBuyPrice($pu_ht, $remise_percent)) < 0) + if (($result = $this->defineBuyPrice($pu, $remise_percent)) < 0) { return $result; } diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php index c774c9f83c6..8192f85f44f 100644 --- a/htdocs/core/actions_massactions.inc.php +++ b/htdocs/core/actions_massactions.inc.php @@ -269,11 +269,22 @@ if (! $error && $massaction == 'confirm_presend') if ($_POST['addmaindocfile']) { - // TODO Use future field $objectobj->fullpathdoc to know where is stored default file - // TODO If not defined, use $objectobj->modelpdf (or defaut invoice config) to know what is template to use to regenerate doc. - $filename=dol_sanitizeFileName($objectobj->ref).'.pdf'; - $filedir=$uploaddir . '/' . dol_sanitizeFileName($objectobj->ref); - $file = $filedir . '/' . $filename; + // TODO Use future field $objectobj->fullpathdoc to know where is stored default file + // TODO If not defined, use $objectobj->modelpdf (or defaut invoice config) to know what is template to use to regenerate doc. + $filename = dol_sanitizeFileName($objectobj->ref).'.pdf'; + $subdir = ''; + // TODO Set subdir to be compatible with multi levels dir trees + // $subdir = get_exdir($objectobj->id, 2, 0, 0, $objectobj, $objectobj->element) + $filedir = $uploaddir . '/' . $subdir . dol_sanitizeFileName($objectobj->ref); + $file = $filedir . '/' . $filename; + + // For supplier invoices, we use the file provided by supplier, not the one we generate + if ($objectobj->element == 'invoice_supplier') + { + $fileparams = dol_most_recent_file($uploaddir . '/' . get_exdir($objectobj->id,2,0,0,$objectobj,$objectobj->element).$objectobj->ref, preg_quote($objectobj->ref,'/').'([^\-])+'); + $file = $fileparams['fullname']; + } + $mime = dol_mimetype($file); if (dol_is_file($file)) diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index 419862229e1..be389a94283 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -1040,7 +1040,7 @@ class FormFile * @param string $relativepath Relative path of docs (autodefined if not provided), relative to module dir, not to MAIN_DATA_ROOT. * @param int $permonobject Permission on object (so permission to delete or crop document) * @param int $useinecm Change output for use in ecm module: - * 0 or 6: Add a preview column. Show also a rename button. Show also a crop button (if modulepart into a specific list) + * 0 or 6: Add a preview column. Show also a rename button. Show also a crop button for some values of $modulepart (must be supported into hard coded list in this function + photos_resize.php + restrictedArea + checkUserAccessToObject) * 1: Add link to edit ECM entry * 2: Add rename and crop link * 4: Add a preview column @@ -1068,7 +1068,7 @@ class FormFile global $form; $disablecrop=1; - if (in_array($modulepart, array('expensereport','holiday','member','project','product','produit','service','societe','tax','ticket','user'))) $disablecrop=0; + if (in_array($modulepart, array('bom','expensereport','holiday','member','project','product','produit','service','societe','tax','ticket','user'))) $disablecrop=0; // Define relative path used to store the file if (empty($relativepath)) diff --git a/htdocs/core/class/html.formmail.class.php b/htdocs/core/class/html.formmail.class.php index b39c3839c71..1e4ff4b353f 100644 --- a/htdocs/core/class/html.formmail.class.php +++ b/htdocs/core/class/html.formmail.class.php @@ -394,6 +394,7 @@ class FormMail extends Form if ($this->param['models'] != 'none') { $result = $this->fetchAllEMailTemplate($this->param["models"], $user, $outputlangs); + if ($result < 0) { setEventMessages($this->error, $this->errors, 'errors'); diff --git a/htdocs/core/class/html.formother.class.php b/htdocs/core/class/html.formother.class.php index 5b829f95f86..620b9317995 100644 --- a/htdocs/core/class/html.formother.class.php +++ b/htdocs/core/class/html.formother.class.php @@ -393,7 +393,8 @@ class FormOther public function select_salesrepresentatives($selected, $htmlname, $user, $showstatus = 0, $showempty = 1, $morecss = '') { // phpcs:enable - global $conf,$langs; + global $conf, $langs; + $langs->load('users'); $out = ''; @@ -415,17 +416,44 @@ class FormOther // Get list of users allowed to be viewed $sql_usr = "SELECT u.rowid, u.lastname, u.firstname, u.statut, u.login"; $sql_usr.= " FROM ".MAIN_DB_PREFIX."user as u"; - $sql_usr.= " WHERE u.entity IN (0,".$conf->entity.")"; + + if (! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) + { + if (! empty($user->admin) && empty($user->entity) && $conf->entity == 1) { + $sql_usr.= " WHERE u.entity IS NOT NULL"; // Show all users + } else { + $sql_usr.= " WHERE EXISTS (SELECT ug.fk_user FROM ".MAIN_DB_PREFIX."usergroup_user as ug WHERE u.rowid = ug.fk_user AND ug.entity IN (".getEntity('user')."))"; + $sql_usr.= " OR u.entity = 0"; // Show always superadmin + } + } + else + { + $sql_usr.= " WHERE u.entity IN (".getEntity('user').")"; + } + if (empty($user->rights->user->user->lire)) $sql_usr.=" AND u.rowid = ".$user->id; - if (! empty($user->societe_id)) $sql_usr.=" AND u.fk_soc = ".$user->societe_id; + if (! empty($user->socid)) $sql_usr.=" AND u.fk_soc = ".$user->socid; // Add existing sales representatives of thirdparty of external user - if (empty($user->rights->user->user->lire) && $user->societe_id) + if (empty($user->rights->user->user->lire) && $user->socid) { $sql_usr.=" UNION "; $sql_usr.= "SELECT u2.rowid, u2.lastname, u2.firstname, u2.statut, u2.login"; $sql_usr.= " FROM ".MAIN_DB_PREFIX."user as u2, ".MAIN_DB_PREFIX."societe_commerciaux as sc"; - $sql_usr.= " WHERE u2.entity IN (0,".$conf->entity.")"; - $sql_usr.= " AND u2.rowid = sc.fk_user AND sc.fk_soc=".$user->societe_id; + + if (! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) + { + if (! empty($user->admin) && empty($user->entity) && $conf->entity == 1) { + $sql_usr.= " WHERE u2.entity IS NOT NULL"; // Show all users + } else { + $sql_usr.= " WHERE EXISTS (SELECT ug2.fk_user FROM ".MAIN_DB_PREFIX."usergroup_user as ug2 WHERE u2.rowid = ug2.fk_user AND ug2.entity IN (".getEntity('user')."))"; + } + } + else + { + $sql_usr.= " WHERE u2.entity IN (".getEntity('user').")"; + } + + $sql_usr.= " AND u2.rowid = sc.fk_user AND sc.fk_soc=".$user->socid; } $sql_usr.= " ORDER BY statut DESC, lastname ASC"; // Do not use 'ORDER BY u.statut' here, not compatible with the UNION. //print $sql_usr;exit; diff --git a/htdocs/core/lib/company.lib.php b/htdocs/core/lib/company.lib.php index 99344b12dc1..c3b9bcec2cf 100644 --- a/htdocs/core/lib/company.lib.php +++ b/htdocs/core/lib/company.lib.php @@ -1188,7 +1188,8 @@ function show_actions_todo($conf, $langs, $db, $filterobj, $objcon = '', $noprin } /** - * Show html area with actions (done or not, ignore the name of function) + * Show html area with actions (done or not, ignore the name of function). + * Note: Global parameter $param must be defined. * * @param Conf $conf Object conf * @param Translate $langs Object langs @@ -1208,7 +1209,7 @@ function show_actions_done($conf, $langs, $db, $filterobj, $objcon = '', $noprin global $user, $conf; global $form; - global $param; + global $param, $massactionbutton; dol_include_once('/comm/action/class/actioncomm.class.php'); @@ -1251,6 +1252,7 @@ function show_actions_done($conf, $langs, $db, $filterobj, $objcon = '', $noprin elseif (is_object($filterobj) && get_class($filterobj) == 'CommandeFournisseur') $sql.= ", o.ref"; elseif (is_object($filterobj) && get_class($filterobj) == 'Product') $sql.= ", o.ref"; elseif (is_object($filterobj) && get_class($filterobj) == 'Ticket') $sql.= ", o.ref"; + elseif (is_object($filterobj) && get_class($filterobj) == 'BOM') $sql.= ", o.ref"; $sql.= " FROM ".MAIN_DB_PREFIX."actioncomm as a"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on u.rowid = a.fk_user_action"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_actioncomm as c ON a.fk_action = c.id"; @@ -1273,6 +1275,7 @@ function show_actions_done($conf, $langs, $db, $filterobj, $objcon = '', $noprin elseif (is_object($filterobj) && get_class($filterobj) == 'CommandeFournisseur') $sql.= ", ".MAIN_DB_PREFIX."commande_fournisseur as o"; elseif (is_object($filterobj) && get_class($filterobj) == 'Product') $sql.= ", ".MAIN_DB_PREFIX."product as o"; elseif (is_object($filterobj) && get_class($filterobj) == 'Ticket') $sql.= ", ".MAIN_DB_PREFIX."ticket as o"; + elseif (is_object($filterobj) && get_class($filterobj) == 'BOM') $sql.= ", ".MAIN_DB_PREFIX."bom_bom as o"; $sql.= " WHERE a.entity IN (".getEntity('agenda').")"; if ($force_filter_contact === false) { @@ -1298,6 +1301,11 @@ function show_actions_done($conf, $langs, $db, $filterobj, $objcon = '', $noprin $sql.= " AND a.fk_element = o.rowid AND a.elementtype = 'ticket'"; if ($filterobj->id) $sql.= " AND a.fk_element = ".$filterobj->id; } + elseif (is_object($filterobj) && get_class($filterobj) == 'BOM') + { + $sql.= " AND a.fk_element = o.rowid AND a.elementtype = 'bom'"; + if ($filterobj->id) $sql.= " AND a.fk_element = ".$filterobj->id; + } } // Condition on actioncode diff --git a/htdocs/core/lib/security.lib.php b/htdocs/core/lib/security.lib.php index dcdc70c3fe6..051f3a5392a 100644 --- a/htdocs/core/lib/security.lib.php +++ b/htdocs/core/lib/security.lib.php @@ -247,7 +247,7 @@ function restrictedArea($user, $features, $objectid = 0, $tableandshare = '', $f { if (! $user->rights->projet->lire && ! $user->rights->projet->all->lire) { $readok=0; $nbko++; } } - elseif (! empty($feature2)) // This should be used for future changes + elseif (! empty($feature2)) // This is for permissions on 2 levels { $tmpreadok=1; foreach($feature2 as $subfeature) @@ -263,7 +263,7 @@ function restrictedArea($user, $features, $objectid = 0, $tableandshare = '', $f $nbko++; } } - elseif (! empty($feature) && ($feature!='user' && $feature!='usergroup')) // This is for old permissions + elseif (! empty($feature) && ($feature!='user' && $feature!='usergroup')) // This is permissions on 1 level { if (empty($user->rights->$feature->lire) && empty($user->rights->$feature->read) @@ -307,7 +307,7 @@ function restrictedArea($user, $features, $objectid = 0, $tableandshare = '', $f { if (! $user->rights->banque->cheque) { $createok=0; $nbko++; } } - elseif (! empty($feature2)) // This should be used + elseif (! empty($feature2)) // This is for permissions on one level { foreach($feature2 as $subfeature) { @@ -317,7 +317,7 @@ function restrictedArea($user, $features, $objectid = 0, $tableandshare = '', $f else { $createok=1; break; } // Break to bypass second test if the first is ok } } - elseif (! empty($feature)) // This is for old permissions ('creer' or 'write') + elseif (! empty($feature)) // This is for permissions on 2 levels ('creer' or 'write') { //print '
feature='.$feature.' creer='.$user->rights->$feature->creer.' write='.$user->rights->$feature->write; if (empty($user->rights->$feature->creer) @@ -384,7 +384,7 @@ function restrictedArea($user, $features, $objectid = 0, $tableandshare = '', $f { if (! $user->rights->salaries->delete) $deleteok=0; } - elseif (! empty($feature2)) // This should be used for permissions on 2 levels + elseif (! empty($feature2)) // This is for permissions on 2 levels { foreach($feature2 as $subfeature) { @@ -392,7 +392,7 @@ function restrictedArea($user, $features, $objectid = 0, $tableandshare = '', $f else { $deleteok=1; break; } // For bypass the second test if the first is ok } } - elseif (! empty($feature)) // This is used for permissions on 1 level + elseif (! empty($feature)) // This is used for permissions on 1 level { //print '
feature='.$feature.' creer='.$user->rights->$feature->supprimer.' write='.$user->rights->$feature->delete; if (empty($user->rights->$feature->supprimer) @@ -451,7 +451,7 @@ function checkUserAccessToObject($user, $featuresarray, $objectid = 0, $tableand if ($feature == 'project') $feature='projet'; if ($feature == 'task') $feature='projet_task'; - $check = array('adherent','banque','don','user','usergroup','product','produit','service','produit|service','categorie','resource','expensereport','holiday'); // Test on entity only (Objects with no link to company) + $check = array('adherent','banque','bom','don','user','usergroup','product','produit','service','produit|service','categorie','resource','expensereport','holiday'); // Test on entity only (Objects with no link to company) $checksoc = array('societe'); // Test for societe object $checkother = array('contact','agenda'); // Test on entity and link to third party. Allowed if link is empty (Ex: contacts...). $checkproject = array('projet','project'); // Test for project object diff --git a/htdocs/core/modules/barcode/doc/tcpdfbarcode.modules.php b/htdocs/core/modules/barcode/doc/tcpdfbarcode.modules.php index 1b39fe16095..3d2564591da 100644 --- a/htdocs/core/modules/barcode/doc/tcpdfbarcode.modules.php +++ b/htdocs/core/modules/barcode/doc/tcpdfbarcode.modules.php @@ -116,7 +116,6 @@ class modTcpdfbarcode extends ModeleBarCode $_GET["code"]=$code; $_GET["type"]=$encoding; - $_GET["height"]=$height; $_GET["readable"]=$readable; if ($code) { @@ -166,7 +165,6 @@ class modTcpdfbarcode extends ModeleBarCode $_GET["code"]=$code; $_GET["type"]=$encoding; - $_GET["height"]=$height; $_GET["readable"]=$readable; if ($code) { diff --git a/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php b/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php index 8bb3eaa7804..e0bba62df3b 100644 --- a/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php +++ b/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php @@ -117,13 +117,13 @@ class pdf_standard extends ModeleExpenseReport public $emetteur; - /** - * Constructor - * - * @param DoliDB $db Database handler - */ - public function __construct($db) - { + /** + * Constructor + * + * @param DoliDB $db Database handler + */ + public function __construct($db) + { global $conf, $langs, $mysoc, $user; // Translations @@ -172,12 +172,12 @@ class pdf_standard extends ModeleExpenseReport $this->posxup=145; $this->posxqty=168; $this->postotalttc=178; - // if (empty($conf->projet->enabled)) { - // $this->posxtva-=20; - // $this->posxup-=20; - // $this->posxqty-=20; - // $this->postotalttc-=20; - // } + // if (empty($conf->projet->enabled)) { + // $this->posxtva-=20; + // $this->posxup-=20; + // $this->posxqty-=20; + // $this->postotalttc-=20; + // } if ($this->page_largeur < 210) // To work with US executive format { $this->posxdate-=20; @@ -196,19 +196,19 @@ class pdf_standard extends ModeleExpenseReport } - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps - /** - * Function to build pdf onto disk - * - * @param Object $object Object to generate - * @param Translate $outputlangs Lang output object - * @param string $srctemplatepath Full path of source filename for generator using a template file - * @param int $hidedetails Do not show line details - * @param int $hidedesc Do not show desc - * @param int $hideref Do not show ref - * @return int 1=OK, 0=KO + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps + /** + * Function to build pdf onto disk + * + * @param Object $object Object to generate + * @param Translate $outputlangs Lang output object + * @param string $srctemplatepath Full path of source filename for generator using a template file + * @param int $hidedetails Do not show line details + * @param int $hidedesc Do not show desc + * @param int $hideref Do not show ref + * @return int 1=OK, 0=KO */ - public function write_file($object, $outputlangs, $srctemplatepath = '', $hidedetails = 0, $hidedesc = 0, $hideref = 0) + public function write_file($object, $outputlangs, $srctemplatepath = '', $hidedetails = 0, $hidedesc = 0, $hideref = 0) { // phpcs:enable global $user, $langs, $conf, $mysoc, $db, $hookmanager; @@ -501,9 +501,9 @@ class pdf_standard extends ModeleExpenseReport $posy=$this->tablePayments($pdf, $object, $posy_start_of_totals, $outputlangs); } - // Pied de page + // Page footer $this->_pagefoot($pdf, $object, $outputlangs); - if (method_exists($pdf, 'AliasNbPages')) $pdf->AliasNbPage(); + if (method_exists($pdf, 'AliasNbPages')) $pdf->AliasNbPages(); $pdf->Close(); @@ -540,17 +540,17 @@ class pdf_standard extends ModeleExpenseReport } } - /** - * @param TCPDF $pdf Object PDF - * @param Object $object Object to show - * @param int $linenumber line number - * @param int $curY current y position - * @param int $default_font_size default siez of font - * @param Translate $outputlangs Object lang for output - * @param int $hidedetails Hide details (0=no, 1=yes, 2=just special lines) - * @return void - */ - private function printLine(&$pdf, $object, $linenumber, $curY, $default_font_size, $outputlangs, $hidedetails = 0) + /** + * @param TCPDF $pdf Object PDF + * @param Object $object Object to show + * @param int $linenumber line number + * @param int $curY current y position + * @param int $default_font_size default siez of font + * @param Translate $outputlangs Object lang for output + * @param int $hidedetails Hide details (0=no, 1=yes, 2=just special lines) + * @return void + */ + private function printLine(&$pdf, $object, $linenumber, $curY, $default_font_size, $outputlangs, $hidedetails = 0) { global $conf; $pdf->SetFont('', '', $default_font_size - 1); @@ -618,7 +618,7 @@ class pdf_standard extends ModeleExpenseReport } $comment .= $object->lines[$linenumber]->comments; $pdf->writeHTMLCell($this->posxtva-$this->posxcomment-0.8, 4, $this->posxcomment-1, $curY, $comment, 0, 1); - } + } /** * Show top header of page. @@ -846,7 +846,7 @@ class pdf_standard extends ModeleExpenseReport } } } - } + } /** * Show table for lines @@ -1024,6 +1024,7 @@ class pdf_standard extends ModeleExpenseReport if ($resql) { $num = $this->db->num_rows($resql); + $totalpaid = 0; $i=0; while ($i < $num) { $y+=$tab3_height; diff --git a/htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php b/htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php index 7670a623c49..f6bb3bc46a7 100644 --- a/htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php +++ b/htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php @@ -154,7 +154,7 @@ class pdf_tcpdflabel extends CommonStickerGenerator $widthtouse = $maxwidthtouse; $heighttouse = $maxheighttouse; $logoHeight = $heighttouse; - $logoWidth = $heighttouse; + $logoWidth = $widthtouse; //var_dump($this->_Width.'x'.$this->_Height.' with border and scale '.$imgscale.' => max '.$maxwidthtouse.'x'.$maxheighttouse.' => We use '.$widthtouse.'x'.$heighttouse);exit; @@ -175,9 +175,11 @@ class pdf_tcpdflabel extends CommonStickerGenerator } elseif ($textleft!='' && $textright!='') // left and right part { + $logoHeight = $heighttouse/2; + $logoWidth = $widthtouse/2; if (($textleft == '%LOGO%' || $textleft == '%PHOTO%' || $textleft == '%BARCODE%') && !strstr($textright, '%') ) // left part logo/barcode right part text { - if ($textleft == '%LOGO%' && $logo) $pdf->Image($logo, $_PosX+$xleft, $_PosY+$ytop, $widthtouse/2, 0); + if ($textleft == '%LOGO%' && $logo) $pdf->Image($logo, $_PosX+$xleft, $_PosY+$ytop, $logoWidth, 0); elseif ($code && !empty($encoding)) { $this->writeBarcode($pdf, $code, $encoding, $is2d, $_PosX+$xleft, $_PosY+$ytop, $widthtouse/2, $heighttouse); @@ -187,7 +189,7 @@ class pdf_tcpdflabel extends CommonStickerGenerator } elseif (($textright == '%LOGO%' || $textright == '%PHOTO%' || $textright == '%BARCODE%') && !strstr($textleft, '%')) // right part logo/barcode left part text { - if ($textright == '%LOGO%' && $logo) $pdf->Image($logo, $_PosX+($widthtouse/2), $_PosY+$ytop, $widthtouse/2, 0); + if ($textright == '%LOGO%' && $logo) $pdf->Image($logo, $_PosX+($widthtouse/2), $_PosY+$ytop, $logoWidth, 0); elseif ($code && !empty($encoding)) { $this->writeBarcode($pdf, $code, $encoding, $is2d, $_PosX+($widthtouse/2), $_PosY+$ytop, $widthtouse/2, $heighttouse); @@ -203,7 +205,7 @@ class pdf_tcpdflabel extends CommonStickerGenerator $this->writeBarcode($pdf, $code, $encoding, $is2d, $_PosX+$xleft+$logoWidth+1, $_PosY+$ytop, $widthtouse-$logoWidth-1, $heighttouse); } else { $pdf->SetXY($_PosX+$xleft+$logoWidth+1, $_PosY+$ytop); - $pdf->MultiCell($widthtouse-$logoWidth1-1, $this->_Line_Height, $outputlangs->convToOutputCharset($textright), 0, 'R'); + $pdf->MultiCell($widthtouse-$logoWidth-1, $this->_Line_Height, $outputlangs->convToOutputCharset($textright), 0, 'R'); } } elseif ($textright == '%LOGO%') // right part logo left part text/barcode diff --git a/htdocs/core/photos_resize.php b/htdocs/core/photos_resize.php index 2ecb127f3b2..47be8cdf974 100644 --- a/htdocs/core/photos_resize.php +++ b/htdocs/core/photos_resize.php @@ -53,6 +53,12 @@ elseif ($modulepart == 'project') if (! $user->rights->projet->lire) accessforbidden(); $accessallowed=1; } +elseif ($modulepart == 'bom') +{ + $result=restrictedArea($user, 'bom', $id, 'bom_bom'); + if (! $user->rights->bom->read) accessforbidden(); + $accessallowed=1; +} elseif ($modulepart == 'expensereport') { $result=restrictedArea($user, 'expensereport', $id, 'expensereport'); @@ -205,8 +211,19 @@ elseif ($modulepart == 'ticket') $dir=$conf->ticket->dir_output; // By default } } +elseif ($modulepart == 'bom') +{ + require_once DOL_DOCUMENT_ROOT.'/bom/class/bom.class.php'; + $object = new BOM($db); + if ($id > 0) + { + $result = $object->fetch($id); + if ($result <= 0) dol_print_error($db, 'Failed to load object'); + $dir=$conf->bom->dir_output; // By default + } +} else { - print 'Action crop for module part '.$modulepart.' is not supported yet.'; + print 'Action crop for modulepart = '.$modulepart.' is not supported yet.'; } if (empty($backtourl)) @@ -220,6 +237,7 @@ if (empty($backtourl)) elseif (in_array($modulepart, array('tax'))) $backtourl=DOL_URL_ROOT."/compta/sociales/document.php?id=".$id.'&file='.urldecode($_POST["file"]); elseif (in_array($modulepart, array('ticket'))) $backtourl=DOL_URL_ROOT."/ticket/document.php?id=".$id.'&file='.urldecode($_POST["file"]); elseif (in_array($modulepart, array('user'))) $backtourl=DOL_URL_ROOT."/user/document.php?id=".$id.'&file='.urldecode($_POST["file"]); + else $backtourl=DOL_URL_ROOT."/".$modulepart."/".$modulepart."_document.php?id=".$id.'&file='.urldecode($_POST["file"]); } diff --git a/htdocs/expedition/class/expedition.class.php b/htdocs/expedition/class/expedition.class.php index e4f2ce31acd..4676d48073c 100644 --- a/htdocs/expedition/class/expedition.class.php +++ b/htdocs/expedition/class/expedition.class.php @@ -1402,6 +1402,8 @@ class Expedition extends CommonObject $this->total_localtax1 = 0; $this->total_localtax2 = 0; + $line = new ExpeditionLigne($this->db); + while ($i < $num) { $obj = $this->db->fetch_object($resql); @@ -2566,8 +2568,6 @@ class ExpeditionLigne extends CommonObjectLine $this->error = 'ErrorMandatoryParametersNotProvided'; return -1; } - // Clean parameters - if (empty($this->entrepot_id)) $this->entrepot_id='null'; $this->db->begin(); @@ -2578,7 +2578,7 @@ class ExpeditionLigne extends CommonObjectLine $sql.= ", qty"; $sql.= ") VALUES ("; $sql.= $this->fk_expedition; - $sql.= ", ".$this->entrepot_id; + $sql.= ", ".(empty($this->entrepot_id) ? 'NULL' : $this->entrepot_id); $sql.= ", ".$this->fk_origin_line; $sql.= ", ".$this->qty; $sql.= ")"; diff --git a/htdocs/fourn/class/fournisseur.product.class.php b/htdocs/fourn/class/fournisseur.product.class.php index 45595471701..f2384b13cf2 100644 --- a/htdocs/fourn/class/fournisseur.product.class.php +++ b/htdocs/fourn/class/fournisseur.product.class.php @@ -247,10 +247,10 @@ class ProductFournisseur extends Product if (empty($supplier_reputation) || $supplier_reputation == -1) $supplier_reputation=''; if ($delivery_time_days != '' && ! is_numeric($delivery_time_days)) $delivery_time_days = ''; if ($price_base_type == 'TTC') - { - $ttx = $tva_tx; - $buyprice = $buyprice/(1+($ttx/100)); - } + { + $ttx = $tva_tx; + $buyprice = $buyprice/(1+($ttx/100)); + } // Multicurrency if ($conf->multicurrency->enabled) { @@ -259,10 +259,10 @@ class ProductFournisseur extends Product if (empty($multicurrency_buyprice)) $multicurrency_buyprice=0; if ($multicurrency_price_base_type == 'TTC') - { - $ttx = $tva_tx; - $multicurrency_buyprice = $multicurrency_buyprice/(1+($ttx/100)); - } + { + $ttx = $tva_tx; + $multicurrency_buyprice = $multicurrency_buyprice/(1+($ttx/100)); + } $multicurrency_buyprice=price2num($multicurrency_buyprice, 'MU'); $multicurrency_unitBuyPrice=price2num($multicurrency_buyprice/$qty, 'MU'); @@ -369,7 +369,7 @@ class ProductFournisseur extends Product // End call triggers if (! $error && empty($conf->global->PRODUCT_PRICE_SUPPLIER_NO_LOG)) { - $result = $this->logPrice($user, $now, $buyprice, $qty, $multicurrency_buyprice, $multicurrency_unitBuyPrice, $multicurrency_tx, $fk_multicurrenc, $multicurrency_code); + $result = $this->logPrice($user, $now, $buyprice, $qty, $multicurrency_buyprice, $multicurrency_unitBuyPrice, $multicurrency_tx, $fk_multicurrency, $multicurrency_code); if ($result < 0) { $error++; } @@ -911,21 +911,21 @@ class ProductFournisseur extends Product return $out; } - /** - * Function used to replace a thirdparty id with another one. - * - * @param DoliDB $db Database handler - * @param int $origin_id Old thirdparty id - * @param int $dest_id New thirdparty id - * @return bool - */ - public static function replaceThirdparty(DoliDB $db, $origin_id, $dest_id) - { - $tables = array( - 'product_fournisseur_price' - ); + /** + * Function used to replace a thirdparty id with another one. + * + * @param DoliDB $db Database handler + * @param int $origin_id Old thirdparty id + * @param int $dest_id New thirdparty id + * @return bool + */ + public static function replaceThirdparty(DoliDB $db, $origin_id, $dest_id) + { + $tables = array( + 'product_fournisseur_price' + ); - return CommonObject::commonReplaceThirdparty($db, $origin_id, $dest_id, $tables); + return CommonObject::commonReplaceThirdparty($db, $origin_id, $dest_id, $tables); } /** @@ -1089,7 +1089,7 @@ class ProductFournisseur extends Product * * @return int < 0 NOK > 0 OK */ - private function logPrice($user, $datec, $buyprice, $qty, $multicurrency_buyprice, $multicurrency_unitBuyPrice, $multicurrency_tx, $fk_multicurrency, $multicurrency_code) + private function logPrice($user, $datec, $buyprice, $qty, $multicurrency_buyprice = null, $multicurrency_unitBuyPrice = null, $multicurrency_tx = null, $fk_multicurrency = null, $multicurrency_code = null) { // Add record into log table $sql = "INSERT INTO " . MAIN_DB_PREFIX . "product_fournisseur_price_log("; diff --git a/htdocs/fourn/facture/list.php b/htdocs/fourn/facture/list.php index fe3deb6459b..ed7caf0061d 100644 --- a/htdocs/fourn/facture/list.php +++ b/htdocs/fourn/facture/list.php @@ -484,7 +484,7 @@ if ($resql) print_barre_liste($langs->trans("BillsSuppliers").($socid?' '.$soc->name:''), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_accountancy', 0, $newcardbutton, '', $limit); $topicmail="SendBillRef"; - $modelmail="supplier_invoice_send"; + $modelmail="invoice_supplier_send"; $objecttmp=new FactureFournisseur($db); $trackid='sinv'.$object->id; include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php'; diff --git a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql index 96b1f68fa9a..e353f317b45 100644 --- a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql +++ b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql @@ -382,7 +382,7 @@ ALTER TABLE llx_reception_extrafields ADD INDEX idx_reception_extrafields (fk_ob ALTER TABLE llx_commande_fournisseur_dispatch ADD COLUMN fk_projet integer DEFAULT NULL; ALTER TABLE llx_commande_fournisseur_dispatch ADD COLUMN fk_reception integer DEFAULT NULL; - +ALTER TABLE llx_accounting_bookkeeping ADD COLUMN date_export datetime DEFAULT NULL after date_validated; insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) values (110, 'supplier_proposal', 'internal', 'SALESREPFOLL', 'Responsable suivi de la demande', 1); insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) values (111, 'supplier_proposal', 'external', 'BILLING', 'Contact fournisseur facturation', 1); diff --git a/htdocs/install/mysql/tables/llx_accounting_bookkeeping.sql b/htdocs/install/mysql/tables/llx_accounting_bookkeeping.sql index 8a5045186e6..5317254d79d 100644 --- a/htdocs/install/mysql/tables/llx_accounting_bookkeeping.sql +++ b/htdocs/install/mysql/tables/llx_accounting_bookkeeping.sql @@ -1,6 +1,6 @@ -- ============================================================================ -- Copyright (C) 2013-2014 Olivier Geffroy --- Copyright (C) 2013-2017 Alexandre Spangaro +-- Copyright (C) 2013-2019 Alexandre Spangaro -- -- 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 @@ -50,6 +50,7 @@ CREATE TABLE llx_accounting_bookkeeping journal_label varchar(255), -- FEC:JournalLib piece_num integer NOT NULL, -- FEC:EcritureNum | accounting source document date_validated datetime, -- FEC:ValidDate | if empty: movement not validated / if not empty: movement validated (No deleting / No modification) + date_export datetime DEFAULT NULL, -- import_key varchar(14), - extraparams varchar(255) -- for other parameters with json format + extraparams varchar(255) -- for other parameters with json format ) ENGINE=innodb; diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index 400d7179b02..6efbe942032 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -842,6 +842,11 @@ Exports=Exports ExportFilteredList=Export filtered list ExportList=Export list ExportOptions=Export Options +IncludeDocsAlreadyExported=Include docs already exported +ExportOfPiecesAlreadyExportedIsEnable=Export of pieces already exported is enable +ExportOfPiecesAlreadyExportedIsDisable=Export of pieces already exported is disable +AllExportedMovementsWereRecordedAsExported=All exported movements were recorded as exported +NotAllExportedMovementsCouldBeRecordedAsExported=Not all exported movements could be recorded as exported Miscellaneous=Miscellaneous Calendar=Calendar GroupBy=Group by... diff --git a/htdocs/langs/en_US/mrp.lang b/htdocs/langs/en_US/mrp.lang index c4bb9193a33..360f4303f07 100644 --- a/htdocs/langs/en_US/mrp.lang +++ b/htdocs/langs/en_US/mrp.lang @@ -13,3 +13,5 @@ WatermarkOnDraftBOMs=Watermark on draft BOM ConfirmCloneBillOfMaterials=Are you sure you want to clone this bill of material ? ManufacturingEfficiency=Manufacturing efficiency ValueOfMeansLoss=Value of 0.95 means an average of 5%% of loss during the production +DeleteBillOfMaterials=Delete Bill Of Materials +ConfirmDeleteBillOfMaterials=Are you sure you want to delete this Bill Of Material? diff --git a/htdocs/modulebuilder/template/myobject_agenda.php b/htdocs/modulebuilder/template/myobject_agenda.php index 1f693282e5f..183781469ef 100644 --- a/htdocs/modulebuilder/template/myobject_agenda.php +++ b/htdocs/modulebuilder/template/myobject_agenda.php @@ -209,7 +209,7 @@ if ($object->id > 0) $objthirdparty=$object; $objcon=new stdClass(); - $out=''; + $out='&origin='.$object->element.'&originid='.$object->id; $permok=$user->rights->agenda->myactions->create; if ((! empty($objthirdparty->id) || ! empty($objcon->id)) && $permok) { @@ -240,19 +240,19 @@ if ($object->id > 0) if (! empty($conf->agenda->enabled) && (!empty($user->rights->agenda->myactions->read) || !empty($user->rights->agenda->allactions->read) )) { - $param='&socid='.$socid; - if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage; - if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit; + $param='&id='.$object->id.'&socid='.$socid; + if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.urlencode($contextpage); + if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.urlencode($limit); - print load_fiche_titre($langs->trans("ActionsOnMyObject"), '', ''); + //print load_fiche_titre($langs->trans("ActionsOnMyObject"), '', ''); // List of all actions $filters=array(); $filters['search_agenda_label']=$search_agenda_label; // TODO Replace this with same code than into list.php - //show_actions_done($conf,$langs,$db,$object,null,0,$actioncode, '', $filters, $sortfield, $sortorder); + //show_actions_done($conf, $langs, $db, $object, null, 0, $actioncode, '', $filters, $sortfield, $sortorder); } } diff --git a/htdocs/product/class/html.formproduct.class.php b/htdocs/product/class/html.formproduct.class.php index b4347f82941..a0ebda88cd9 100644 --- a/htdocs/product/class/html.formproduct.class.php +++ b/htdocs/product/class/html.formproduct.class.php @@ -59,12 +59,12 @@ class FormProduct * Load in cache array list of warehouses * If fk_product is not 0, we do not use cache * - * @param int $fk_product Add quantity of stock in label for product with id fk_product. Nothing if 0. - * @param string $batch Add quantity of batch stock in label for product with batch name batch, batch name precedes batch_id. Nothing if ''. - * @param string $status warehouse status filter, following comma separated filter options can be used - * 'warehouseopen' = select products from open warehouses, - * 'warehouseclosed' = select products from closed warehouses, - * 'warehouseinternal' = select products from warehouses for internal correct/transfer only + * @param int $fk_product Add quantity of stock in label for product with id fk_product. Nothing if 0. + * @param string $batch Add quantity of batch stock in label for product with batch name batch, batch name precedes batch_id. Nothing if ''. + * @param string $status warehouse status filter, following comma separated filter options can be used + * 'warehouseopen' = select products from open warehouses, + * 'warehouseclosed' = select products from closed warehouses, + * 'warehouseinternal' = select products from warehouses for internal correct/transfer only * @param boolean $sumStock sum total stock of a warehouse, default true * @param array $exclude warehouses ids to exclude * @return int Nb of loaded lines, 0 if already loaded, <0 if KO @@ -114,9 +114,9 @@ class FormProduct { $sql.= " AND ps.fk_product = '".$fk_product."'"; if (!empty($batch)) - { - $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product_batch as pb on pb.fk_product_stock = ps.rowid AND pb.batch = '".$batch."'"; - } + { + $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product_batch as pb on pb.fk_product_stock = ps.rowid AND pb.batch = '".$batch."'"; + } } $sql.= " WHERE e.entity IN (".getEntity('stock').")"; if (count($warehouseStatus)) @@ -173,9 +173,9 @@ class FormProduct * @param String $final_label full label with all parents, separated by ' >> ' (completed on each call) * @return String full label with all parents, separated by ' >> ' */ - private function get_parent_path($tab, $final_label = '') - { - //phpcs:enable + private function get_parent_path($tab, $final_label = '') + { + //phpcs:enable if(empty($final_label)) $final_label = $tab['label']; if(empty($tab['parent_id'])) return $final_label; @@ -195,9 +195,9 @@ class FormProduct * @param int $selected Id of preselected warehouse ('' for no value, 'ifone'=select value if one value otherwise no value) * @param string $htmlname Name of html select html * @param string $filterstatus warehouse status filter, following comma separated filter options can be used - * 'warehouseopen' = select products from open warehouses, - * 'warehouseclosed' = select products from closed warehouses, - * 'warehouseinternal' = select products from warehouses for internal correct/transfer only + * 'warehouseopen' = select products from open warehouses, + * 'warehouseclosed' = select products from closed warehouses, + * 'warehouseinternal' = select products from warehouses for internal correct/transfer only * @param int $empty 1=Can be empty, 0 if not * @param int $disabled 1=Select is disabled * @param int $fk_product Add quantity of stock in label for product with id fk_product. Nothing if 0. @@ -379,9 +379,9 @@ class FormProduct */ public function selectLotStock($selected = '', $htmlname = 'batch_id', $filterstatus = '', $empty = 0, $disabled = 0, $fk_product = 0, $fk_entrepot = 0, $objectLines = array(), $empty_label = '', $forcecombo = 0, $events = array(), $morecss = 'minwidth200') { - global $langs; + global $conf, $langs; - dol_syslog(get_class($this)."::selectLot $selected, $htmlname, $filterstatus, $empty, $disabled, $fk_product, $fk_entrepot, $empty_label, $showstock, $forcecombo, $morecss", LOG_DEBUG); + dol_syslog(get_class($this)."::selectLot $selected, $htmlname, $filterstatus, $empty, $disabled, $fk_product, $fk_entrepot, $empty_label, $forcecombo, $morecss", LOG_DEBUG); $out=''; $productIdArray = array();