From 4fecd01ddd0b24a9b91af67f816bdf5b89db1c0c Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Fri, 10 Jun 2022 04:47:15 +0200 Subject: [PATCH 0001/1128] NEW Accountancy - Manage customer retained warranty --- htdocs/accountancy/admin/defaultaccounts.php | 3 + htdocs/accountancy/journal/sellsjournal.php | 115 ++++++++++++++++++- htdocs/langs/en_US/accountancy.lang | 1 + 3 files changed, 116 insertions(+), 3 deletions(-) diff --git a/htdocs/accountancy/admin/defaultaccounts.php b/htdocs/accountancy/admin/defaultaccounts.php index 583b12368dc..da590e80562 100644 --- a/htdocs/accountancy/admin/defaultaccounts.php +++ b/htdocs/accountancy/admin/defaultaccounts.php @@ -84,6 +84,9 @@ $list_account[] = 'ACCOUNTING_VAT_PAY_ACCOUNT'; if (!empty($conf->banque->enabled)) { $list_account[] = 'ACCOUNTING_ACCOUNT_TRANSFER_CASH'; } +if (!empty($conf->global->INVOICE_USE_RETAINED_WARRANTY)) { + $list_account[] = 'ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY'; +} if (!empty($conf->don->enabled)) { $list_account[] = 'DONATION_ACCOUNTINGACCOUNT'; } diff --git a/htdocs/accountancy/journal/sellsjournal.php b/htdocs/accountancy/journal/sellsjournal.php index 426bc6d7795..a36f67f55f0 100644 --- a/htdocs/accountancy/journal/sellsjournal.php +++ b/htdocs/accountancy/journal/sellsjournal.php @@ -4,7 +4,7 @@ * Copyright (C) 2011 Juanjo Menent * Copyright (C) 2012 Regis Houssin * Copyright (C) 2013 Christophe Battarel - * Copyright (C) 2013-2021 Alexandre Spangaro + * Copyright (C) 2013-2022 Alexandre Spangaro * Copyright (C) 2013-2016 Florian Henry * Copyright (C) 2013-2016 Olivier Geffroy * Copyright (C) 2014 Raphaël Doursenaud @@ -105,7 +105,7 @@ if (!GETPOSTISSET('date_startmonth') && (empty($date_start) || empty($date_end)) $date_end = dol_get_last_day($pastmonthyear, $pastmonth, false); } -$sql = "SELECT f.rowid, f.ref, f.type, f.datef as df, f.ref_client, f.date_lim_reglement as dlr, f.close_code,"; +$sql = "SELECT f.rowid, f.ref, f.type, f.datef as df, f.ref_client, f.date_lim_reglement as dlr, f.close_code, f.retained_warranty,"; $sql .= " fd.rowid as fdid, fd.description, fd.product_type, fd.total_ht, fd.total_tva, fd.total_localtax1, fd.total_localtax2, fd.tva_tx, fd.total_ttc, fd.situation_percent, fd.vat_src_code,"; $sql .= " s.rowid as socid, s.nom as name, s.code_client, s.code_fournisseur,"; if (!empty($conf->global->MAIN_COMPANY_PERENTITY_SHARED)) { @@ -167,6 +167,7 @@ if ($result) { $tabht = array(); $tabtva = array(); $def_tva = array(); + $tabwarranty = array(); $tabttc = array(); $tablocaltax1 = array(); $tablocaltax2 = array(); @@ -247,7 +248,13 @@ if ($result) { $tablocaltax2[$obj->rowid][$compta_localtax2] = 0; } - $tabttc[$obj->rowid][$compta_soc] += $obj->total_ttc * $situation_ratio; + $total_ttc = $obj->total_ttc * $situation_ratio; + if (!empty($conf->global->INVOICE_USE_RETAINED_WARRANTY) && $obj->retained_warranty > 0) { + $retained_warranty = (double)price2num($total_ttc * $obj->retained_warranty / 100, 'MT'); + $tabwarranty[$obj->rowid][$compta_soc] += $retained_warranty; + $total_ttc -= $retained_warranty; + } + $tabttc[$obj->rowid][$compta_soc] += $total_ttc; $tabht[$obj->rowid][$compta_prod] += $obj->total_ht * $situation_ratio; if (empty($line->tva_npr)) { $tabtva[$obj->rowid][$compta_tva] += $obj->total_tva * $situation_ratio; // We ignore line if VAT is a NPR @@ -299,6 +306,10 @@ if ($action == 'writebookkeeping') { $accountingaccountcustomer->fetch(null, $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER, true); + $accountingaccountcustomerwarranty = new AccountingAccount($db); + + $accountingaccountcustomerwarranty->fetch(null, $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY, true); + foreach ($tabfac as $key => $val) { // Loop on each invoice $errorforline = 0; @@ -345,6 +356,55 @@ if ($action == 'writebookkeeping') { setEventMessages($langs->trans('ErrorInvoiceContainsLinesNotYetBounded', $val['ref']), null, 'errors'); } + // Warranty + if (!$errorforline) { + foreach ($tabwarranty[$key] as $k => $mt) { + $bookkeeping = new BookKeeping($db); + $bookkeeping->doc_date = $val["date"]; + $bookkeeping->date_lim_reglement = $val["datereg"]; + $bookkeeping->doc_ref = $val["ref"]; + $bookkeeping->date_creation = $now; + $bookkeeping->doc_type = 'customer_invoice'; + $bookkeeping->fk_doc = $key; + $bookkeeping->fk_docdet = 0; // Useless, can be several lines that are source of this record to add + $bookkeeping->thirdparty_code = $companystatic->code_client; + + $bookkeeping->subledger_account = $tabcompany[$key]['code_compta']; + $bookkeeping->subledger_label = $tabcompany[$key]['name']; + + $bookkeeping->numero_compte = $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY; + $bookkeeping->label_compte = $accountingaccountcustomerwarranty->label; + + $bookkeeping->label_operation = dol_trunc($companystatic->name, 16).' - '.$invoicestatic->ref.' - '.$langs->trans("Retainedwarranty"); + $bookkeeping->montant = $mt; + $bookkeeping->sens = ($mt >= 0) ? 'D' : 'C'; + $bookkeeping->debit = ($mt >= 0) ? $mt : 0; + $bookkeeping->credit = ($mt < 0) ? -$mt : 0; + $bookkeeping->code_journal = $journal; + $bookkeeping->journal_label = $langs->transnoentities($journal_label); + $bookkeeping->fk_user_author = $user->id; + $bookkeeping->entity = $conf->entity; + + $totaldebit += $bookkeeping->debit; + $totalcredit += $bookkeeping->credit; + + $result = $bookkeeping->create($user); + if ($result < 0) { + if ($bookkeeping->error == 'BookkeepingRecordAlreadyExists') { // Already exists + $error++; + $errorforline++; + $errorforinvoice[$key] = 'alreadyjournalized'; + //setEventMessages('Transaction for ('.$bookkeeping->doc_type.', '.$bookkeeping->fk_doc.', '.$bookkeeping->fk_docdet.') were already recorded', null, 'warnings'); + } else { + $error++; + $errorforline++; + $errorforinvoice[$key] = 'other'; + setEventMessages($bookkeeping->error, $bookkeeping->errors, 'errors'); + } + } + } + } + // Thirdparty if (!$errorforline) { foreach ($tabttc[$key] as $k => $mt) { @@ -627,6 +687,25 @@ if ($action == 'exportcsv') { // ISO and not UTF8 ! continue; } + // Warranty + foreach ($tabwarranty[$key] as $k => $mt) { + //if ($mt) { + print '"'.$key.'"'.$sep; + print '"'.$date.'"'.$sep; + print '"'.$val["ref"].'"'.$sep; + print '"'.utf8_decode(dol_trunc($companystatic->name, 32)).'"'.$sep; + print '"'.length_accounta(html_entity_decode($k)).'"'.$sep; + print '"'.length_accountg($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY).'"'.$sep; + print '"'.length_accounta(html_entity_decode($k)).'"'.$sep; + print '"'.$langs->trans("Thirdparty").'"'.$sep; + print '"'.utf8_decode(dol_trunc($companystatic->name, 16)).' - '.$invoicestatic->ref.' - '.$langs->trans("Retainedwarranty").'"'.$sep; + print '"'.($mt >= 0 ? price($mt) : '').'"'.$sep; + print '"'.($mt < 0 ? price(-$mt) : '').'"'.$sep; + print '"'.$journal.'"'; + print "\n"; + //} + } + // Third party foreach ($tabttc[$key] as $k => $mt) { //if ($mt) { @@ -852,6 +931,36 @@ if (empty($action) || $action == 'view') { print ""; } + // Warranty + foreach ($tabwarranty[$key] as $k => $mt) { + print ''; + print ""; + print "".$date.""; + print "".$invoicestatic->getNomUrl(1).""; + // Account + print ""; + $accountoshow = length_accountg($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY); + if (($accountoshow == "") || $accountoshow == 'NotDefined') { + print ''.$langs->trans("MainAccountForCustomersNotDefined").''; + } else { + print $accountoshow; + } + print ''; + // Subledger account + print ""; + $accountoshow = length_accounta($k); + if (($accountoshow == "") || $accountoshow == 'NotDefined') { + print ''.$langs->trans("ThirdpartyAccountNotDefined").''; + } else { + print $accountoshow; + } + print ''; + print "".$companystatic->getNomUrl(0, 'customer', 16).' - '.$invoicestatic->ref.' - '.$langs->trans("Retainedwarranty").""; + print ''.($mt >= 0 ? price($mt) : '').""; + print ''.($mt < 0 ? price(-$mt) : '').""; + print ""; + } + // Third party foreach ($tabttc[$key] as $k => $mt) { print ''; diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang index 0f85c4b1c33..8a6824f9eda 100644 --- a/htdocs/langs/en_US/accountancy.lang +++ b/htdocs/langs/en_US/accountancy.lang @@ -183,6 +183,7 @@ ADHERENT_SUBSCRIPTION_ACCOUNTINGACCOUNT=Accounting account to register subscript ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Accounting account by default to register customer deposit UseAuxiliaryAccountOnCustomerDeposit=Use sub-accounts on customer deposit lines +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Accounting account by default for the bought products (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Accounting account by default for the bought products in EEC (used if not defined in the product sheet) From a1cec27540f190f2a1522a3392f8037d5f7bc554 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Fri, 10 Jun 2022 02:53:13 +0000 Subject: [PATCH 0002/1128] Fixing style errors. --- htdocs/accountancy/journal/sellsjournal.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/accountancy/journal/sellsjournal.php b/htdocs/accountancy/journal/sellsjournal.php index a36f67f55f0..cfa1f1d351f 100644 --- a/htdocs/accountancy/journal/sellsjournal.php +++ b/htdocs/accountancy/journal/sellsjournal.php @@ -250,7 +250,7 @@ if ($result) { $total_ttc = $obj->total_ttc * $situation_ratio; if (!empty($conf->global->INVOICE_USE_RETAINED_WARRANTY) && $obj->retained_warranty > 0) { - $retained_warranty = (double)price2num($total_ttc * $obj->retained_warranty / 100, 'MT'); + $retained_warranty = (double) price2num($total_ttc * $obj->retained_warranty / 100, 'MT'); $tabwarranty[$obj->rowid][$compta_soc] += $retained_warranty; $total_ttc -= $retained_warranty; } From 9ae40a2a02236e801e3bbe322068c6c736a98488 Mon Sep 17 00:00:00 2001 From: atm-florian Date: Tue, 14 Jun 2022 12:52:14 +0200 Subject: [PATCH 0003/1128] NEW: helper functions for dates + small demo case --- htdocs/core/lib/functions.lib.php | 31 ++++++++++++++++++++++++++ htdocs/fourn/facture/list.php | 36 ++++++------------------------- 2 files changed, 37 insertions(+), 30 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 45bf99577d4..09a287200ba 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -11110,3 +11110,34 @@ function dolForgeCriteriaCallback($matches) return $db->escape($operand).' '.$db->escape($operator)." ".$tmpescaped; } + +/** + * Helper function that combines values of a dolibarr DatePicker (such as Form::selectDate) for year, month, day (and + * optionally hour, minute, second) fields to return a timestamp. + * + * @param string $prefix Prefix used to build the date selector (for instance using Form::selectDate) + * @param bool $useHourTime If true, will also include hour, minute, second values from the HTTP request + * @param string $gm Passed to dol_mktime + * @return int|string Date as a timestamp, '' or false if error + */ +function GETPOSTDATE($prefix, $useHourTime = false, $gm = 'auto') { + return dol_mktime($useHourTime ? (GETPOSTINT($prefix . 'hour')) : 0, $useHourTime ? (GETPOSTINT($prefix . 'minute')) : 0, $useHourTime ? (GETPOSTINT($prefix . 'second')) : 0, GETPOSTINT($prefix . 'month'), GETPOSTINT($prefix . 'day'), GETPOSTINT($prefix . 'year'), $gm); +} + +/** + * Helper function that combines values of a dolibarr DatePicker (such as Form::selectDate) for year, month, day (and + * optionally hour, minute, second) fields to return a a portion of URL reproducing the values from the current HTTP + * request. + * + * @param string $prefix Prefix used to build the date selector (for instance using Form::selectDate) + * @param bool $useHourTime If true, will also include hour, minute, second values from the HTTP request + * @return string Portion of URL with query parameters for the specified date + */ +function buildParamDate($prefix, $useHourTime = false) { + $TParam = [$prefix . 'day' => GETPOST($prefix . 'day'), $prefix . 'month' => GETPOST($prefix . 'month'), $prefix . 'year' => GETPOST($prefix . 'year')]; + if ($useHourTime) { + $TParam += [$prefix . 'hour' => GETPOST($prefix . 'hour'), $prefix . 'minute' => GETPOST($prefix . 'minute'), $prefix . 'second' => GETPOST($prefix . 'second')]; + } + + return '&' . http_build_query($TParam); +} diff --git a/htdocs/fourn/facture/list.php b/htdocs/fourn/facture/list.php index 70a7334196a..ec0d8ce7427 100644 --- a/htdocs/fourn/facture/list.php +++ b/htdocs/fourn/facture/list.php @@ -98,14 +98,8 @@ $search_country = GETPOST("search_country", 'int'); $search_type_thirdparty = GETPOST("search_type_thirdparty", 'int'); $search_user = GETPOST('search_user', 'int'); $search_sale = GETPOST('search_sale', 'int'); -$search_date_startday = GETPOST('search_date_startday', 'int'); -$search_date_startmonth = GETPOST('search_date_startmonth', 'int'); -$search_date_startyear = GETPOST('search_date_startyear', 'int'); -$search_date_endday = GETPOST('search_date_endday', 'int'); -$search_date_endmonth = GETPOST('search_date_endmonth', 'int'); -$search_date_endyear = GETPOST('search_date_endyear', 'int'); -$search_date_start = dol_mktime(0, 0, 0, $search_date_startmonth, $search_date_startday, $search_date_startyear); // Use tzserver -$search_date_end = dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_endday, $search_date_endyear); +$search_date_start = GETPOSTDATE('search_date_start', false, 'tzserver'); +$search_date_end = GETPOSTDATE('search_date_end', false, 'tzserver'); $search_datelimit_startday = GETPOST('search_datelimit_startday', 'int'); $search_datelimit_startmonth = GETPOST('search_datelimit_startmonth', 'int'); $search_datelimit_startyear = GETPOST('search_datelimit_startyear', 'int'); @@ -274,12 +268,6 @@ if (empty($reshook)) { $search_type = ''; $search_country = ''; $search_type_thirdparty = ''; - $search_date_startday = ''; - $search_date_startmonth = ''; - $search_date_startyear = ''; - $search_date_endday = ''; - $search_date_endmonth = ''; - $search_date_endyear = ''; $search_date_start = ''; $search_date_end = ''; $search_datelimit_startday = ''; @@ -706,23 +694,11 @@ if ($resql) { if ($search_all) { $param .= '&search_all='.urlencode($search_all); } - if ($search_date_startday) { - $param .= '&search_date_startday='.urlencode($search_date_startday); + if ($search_date_start) { + $param .= buildParamDate('search_date_start', false); } - if ($search_date_startmonth) { - $param .= '&search_date_startmonth='.urlencode($search_date_startmonth); - } - if ($search_date_startyear) { - $param .= '&search_date_startyear='.urlencode($search_date_startyear); - } - if ($search_date_endday) { - $param .= '&search_date_endday='.urlencode($search_date_endday); - } - if ($search_date_endmonth) { - $param .= '&search_date_endmonth='.urlencode($search_date_endmonth); - } - if ($search_date_endyear) { - $param .= '&search_date_endyear='.urlencode($search_date_endyear); + if ($search_date_end) { + $param .= buildParamDate('search_date_end', false); } if ($search_datelimit_startday) { $param .= '&search_datelimit_startday='.urlencode($search_datelimit_startday); From e455997160c26ded69e30ab9eafbb148d2ae88e3 Mon Sep 17 00:00:00 2001 From: atm-florian Date: Tue, 14 Jun 2022 14:21:46 +0200 Subject: [PATCH 0004/1128] [minor] [stickler-ci] Opening brace should be on a new line --- htdocs/core/lib/functions.lib.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 09a287200ba..f783c764f78 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -11120,7 +11120,8 @@ function dolForgeCriteriaCallback($matches) * @param string $gm Passed to dol_mktime * @return int|string Date as a timestamp, '' or false if error */ -function GETPOSTDATE($prefix, $useHourTime = false, $gm = 'auto') { +function GETPOSTDATE($prefix, $useHourTime = false, $gm = 'auto') +{ return dol_mktime($useHourTime ? (GETPOSTINT($prefix . 'hour')) : 0, $useHourTime ? (GETPOSTINT($prefix . 'minute')) : 0, $useHourTime ? (GETPOSTINT($prefix . 'second')) : 0, GETPOSTINT($prefix . 'month'), GETPOSTINT($prefix . 'day'), GETPOSTINT($prefix . 'year'), $gm); } @@ -11133,7 +11134,8 @@ function GETPOSTDATE($prefix, $useHourTime = false, $gm = 'auto') { * @param bool $useHourTime If true, will also include hour, minute, second values from the HTTP request * @return string Portion of URL with query parameters for the specified date */ -function buildParamDate($prefix, $useHourTime = false) { +function buildParamDate($prefix, $useHourTime = false) +{ $TParam = [$prefix . 'day' => GETPOST($prefix . 'day'), $prefix . 'month' => GETPOST($prefix . 'month'), $prefix . 'year' => GETPOST($prefix . 'year')]; if ($useHourTime) { $TParam += [$prefix . 'hour' => GETPOST($prefix . 'hour'), $prefix . 'minute' => GETPOST($prefix . 'minute'), $prefix . 'second' => GETPOST($prefix . 'second')]; From b4e068dcdcd4fa55b78d38859b492e327dfb28f5 Mon Sep 17 00:00:00 2001 From: atm-florian Date: Tue, 14 Jun 2022 18:13:32 +0200 Subject: [PATCH 0005/1128] PR feedback: allow setting a specific hourtime --- htdocs/core/lib/functions.lib.php | 43 +++++++++++++++++++++++++------ htdocs/fourn/facture/list.php | 8 +++--- 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index f783c764f78..aa4d5947fbb 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -11116,13 +11116,29 @@ function dolForgeCriteriaCallback($matches) * optionally hour, minute, second) fields to return a timestamp. * * @param string $prefix Prefix used to build the date selector (for instance using Form::selectDate) - * @param bool $useHourTime If true, will also include hour, minute, second values from the HTTP request + * @param string $hourTime 'getpost' to include hour, minute, second values from the HTTP request, 'XX:YY:ZZ' to set + * hour, minute, second respectively (for instance '23:59:59') * @param string $gm Passed to dol_mktime * @return int|string Date as a timestamp, '' or false if error */ -function GETPOSTDATE($prefix, $useHourTime = false, $gm = 'auto') +function GETPOSTDATE($prefix, $hourTime = '', $gm = 'auto') { - return dol_mktime($useHourTime ? (GETPOSTINT($prefix . 'hour')) : 0, $useHourTime ? (GETPOSTINT($prefix . 'minute')) : 0, $useHourTime ? (GETPOSTINT($prefix . 'second')) : 0, GETPOSTINT($prefix . 'month'), GETPOSTINT($prefix . 'day'), GETPOSTINT($prefix . 'year'), $gm); + if ($hourTime === 'getpost') { + $hour = GETPOSTINT($prefix . 'hour'); + $minute = GETPOSTINT($prefix . 'minute'); + $second = GETPOSTINT($prefix . 'second'); + } elseif (preg_match('/^(\d\d):(\d\d):(\d\d)$/', $hourTime, $m)) { + $hour = (int)$m[1]; + $minute = (int)$m[2]; + $second = (int)$m[3]; + } else { + $hour = $minute = $second = 0; + } + // normalize out of range values + $hour = min($hour, 23); + $minute = min($minute, 59); + $second = min($second, 59); + return dol_mktime($hour, $minute, $second, GETPOSTINT($prefix . 'month'), GETPOSTINT($prefix . 'day'), GETPOSTINT($prefix . 'year'), $gm); } /** @@ -11131,14 +11147,25 @@ function GETPOSTDATE($prefix, $useHourTime = false, $gm = 'auto') * request. * * @param string $prefix Prefix used to build the date selector (for instance using Form::selectDate) - * @param bool $useHourTime If true, will also include hour, minute, second values from the HTTP request + * @param int $timestamp If null, the timestamp will be created from request data + * @param bool $hourTime If timestamp is null, will be passed to GETPOSTDATE to construct the timestamp + * @param bool $gm If timestamp is null, will be passed to GETPOSTDATE to construct the timestamp * @return string Portion of URL with query parameters for the specified date */ -function buildParamDate($prefix, $useHourTime = false) +function buildParamDate($prefix, $timestamp = null, $hourTime = '', $gm = 'auto') { - $TParam = [$prefix . 'day' => GETPOST($prefix . 'day'), $prefix . 'month' => GETPOST($prefix . 'month'), $prefix . 'year' => GETPOST($prefix . 'year')]; - if ($useHourTime) { - $TParam += [$prefix . 'hour' => GETPOST($prefix . 'hour'), $prefix . 'minute' => GETPOST($prefix . 'minute'), $prefix . 'second' => GETPOST($prefix . 'second')]; + if ($timestamp === null) $timestamp = GETPOSTDATE($prefix, $hourTime, $gm); + $TParam = array( + $prefix . 'day' => intval(dol_print_date($timestamp, '%d')), + $prefix . 'month' => intval(dol_print_date($timestamp, '%m')), + $prefix . 'year' => intval(dol_print_date($timestamp, '%Y')), + ); + if ($hourTime === 'getpost' || ($timestamp !== null && dol_print_date($timestamp, '%H:%M:%S') !== '00:00:00')) { + $TParam = array_merge($TParam, array( + $prefix . 'hour' => intval(dol_print_date($timestamp, '%H')), + $prefix . 'minute' => intval(dol_print_date($timestamp, '%M')), + $prefix . 'second' => intval(dol_print_date($timestamp, '%S')) + )); } return '&' . http_build_query($TParam); diff --git a/htdocs/fourn/facture/list.php b/htdocs/fourn/facture/list.php index ec0d8ce7427..e63c8794aad 100644 --- a/htdocs/fourn/facture/list.php +++ b/htdocs/fourn/facture/list.php @@ -98,8 +98,8 @@ $search_country = GETPOST("search_country", 'int'); $search_type_thirdparty = GETPOST("search_type_thirdparty", 'int'); $search_user = GETPOST('search_user', 'int'); $search_sale = GETPOST('search_sale', 'int'); -$search_date_start = GETPOSTDATE('search_date_start', false, 'tzserver'); -$search_date_end = GETPOSTDATE('search_date_end', false, 'tzserver'); +$search_date_start = GETPOSTDATE('search_date_start', '', 'tzserver'); +$search_date_end = GETPOSTDATE('search_date_end', '23:59:59', 'tzserver'); $search_datelimit_startday = GETPOST('search_datelimit_startday', 'int'); $search_datelimit_startmonth = GETPOST('search_datelimit_startmonth', 'int'); $search_datelimit_startyear = GETPOST('search_datelimit_startyear', 'int'); @@ -695,10 +695,10 @@ if ($resql) { $param .= '&search_all='.urlencode($search_all); } if ($search_date_start) { - $param .= buildParamDate('search_date_start', false); + $param .= buildParamDate('search_date_start', null, '', 'tzserver'); } if ($search_date_end) { - $param .= buildParamDate('search_date_end', false); + $param .= buildParamDate('search_date_end', null, '', 'tzserver'); } if ($search_datelimit_startday) { $param .= '&search_datelimit_startday='.urlencode($search_datelimit_startday); From d4b19ed8a36b45c534ba8de3721281ad88363a4f Mon Sep 17 00:00:00 2001 From: atm-florian Date: Wed, 15 Jun 2022 08:46:54 +0200 Subject: [PATCH 0006/1128] [minor] formatting issues --- htdocs/core/lib/functions.lib.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index aa4d5947fbb..ecb45a33280 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -11117,7 +11117,7 @@ function dolForgeCriteriaCallback($matches) * * @param string $prefix Prefix used to build the date selector (for instance using Form::selectDate) * @param string $hourTime 'getpost' to include hour, minute, second values from the HTTP request, 'XX:YY:ZZ' to set - * hour, minute, second respectively (for instance '23:59:59') + * hour, minute, second respectively (for instance '23:59:59') * @param string $gm Passed to dol_mktime * @return int|string Date as a timestamp, '' or false if error */ @@ -11128,9 +11128,9 @@ function GETPOSTDATE($prefix, $hourTime = '', $gm = 'auto') $minute = GETPOSTINT($prefix . 'minute'); $second = GETPOSTINT($prefix . 'second'); } elseif (preg_match('/^(\d\d):(\d\d):(\d\d)$/', $hourTime, $m)) { - $hour = (int)$m[1]; - $minute = (int)$m[2]; - $second = (int)$m[3]; + $hour = intval($m[1]); + $minute = intval($m[2]); + $second = intval($m[3]); } else { $hour = $minute = $second = 0; } From 1414f72794c6850bb950f016b02f2559069d9e57 Mon Sep 17 00:00:00 2001 From: lvessiller Date: Wed, 13 Jul 2022 16:37:50 +0200 Subject: [PATCH 0007/1128] NEW color in action list --- htdocs/admin/agenda_other.php | 88 +++++++++++++++++++++++++++++++++-- htdocs/comm/action/list.php | 32 ++++++++++++- 2 files changed, 116 insertions(+), 4 deletions(-) diff --git a/htdocs/admin/agenda_other.php b/htdocs/admin/agenda_other.php index 1014d40de50..3f976efc784 100644 --- a/htdocs/admin/agenda_other.php +++ b/htdocs/admin/agenda_other.php @@ -53,6 +53,9 @@ $type = 'action'; * Actions */ +$error = 0; +$errors = array(); + include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php'; $reg = array(); @@ -109,7 +112,36 @@ if ($action == 'set') { } else { setEventMessages($langs->trans("RecordSaved"), null, 'mesgs'); } -} elseif ($action == 'specimen') { // For orders + +} elseif ($action == 'setcolors') { + $event_color = preg_replace('/[^0-9a-f#]/i', '', (string) GETPOST('event_past_color', 'alphanohtml')); + $res = dolibarr_set_const($db, 'AGENDA_EVENT_PAST_COLOR', $event_color, 'chaine', 0, '', $conf->entity); + if (!$res > 0) { + $error++; + $errors[] = $db->lasterror(); + } + + $event_color = preg_replace('/[^0-9a-f#]/i', '', (string) GETPOST('event_progress_color', 'alphanohtml')); + $res = dolibarr_set_const($db, 'AGENDA_EVENT_PROGRESS_COLOR', $event_color, 'chaine', 0, '', $conf->entity); + if (!$res > 0) { + $error++; + $errors[] = $db->lasterror(); + } + + $event_color = preg_replace('/[^0-9a-f#]/i', '', (string) GETPOST('event_future_color', 'alphanohtml')); + $res = dolibarr_set_const($db, 'AGENDA_EVENT_FUTURE_COLOR', $event_color, 'chaine', 0, '', $conf->entity); + if (!$res > 0) { + $error++; + $errors[] = $db->lasterror(); + } + + if ($error) { + setEventMessages('', $errors, 'errors'); + } else { + setEventMessage($langs->trans('SetupSaved')); + } +} +elseif ($action == 'specimen') { // For orders $modele = GETPOST('module', 'alpha'); $commande = new CommandeFournisseur($db); @@ -192,9 +224,10 @@ print dol_get_fiche_head($head, 'other', $langs->trans("Agenda"), -1, 'action'); /* - * Documents models for supplier orders + * Miscellaneous */ +print load_fiche_titre($langs->trans('Miscellaneous'), '', ''); // Define array def of models $def = array(); @@ -394,7 +427,54 @@ print ''."\n"; print ''; -print dol_get_fiche_end(); +print $form->buttonsSaveCancel("Save", ''); + +print ''; + + +/* + * User interface (colors) + */ + +print load_fiche_titre($langs->trans('UserInterface'), '', ''); + +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; +$formother = new FormOther($db); + +print '
'; +print ''; +print ''; + +print ''."\n"; +print ''."\n"; +print ''."\n"; +print ''."\n"; +print ''."\n"; +print ''."\n"; + +// AGENDA_EVENT_PAST_COLOR +print ''."\n"; +print ''."\n"; +print ''."\n"; +print ''."\n"; +// AGENDA_EVENT_PROGRESS_COLOR +print ''."\n"; +print ''."\n"; +print ''."\n"; +print ''."\n"; +// AGENDA_EVENT_FUTURE_COLOR +print ''."\n"; +print ''."\n"; +print ''."\n"; +print ''."\n"; + +print '
'.$langs->trans("Parameters").' '.$langs->trans("Value").'
'.$langs->trans('AGENDA_EVENT_PAST_COLOR').' '."\n"; +print $formother->selectColor($conf->global->AGENDA_EVENT_PAST_COLOR, 'event_past_color'); +print '
'.$langs->trans('AGENDA_EVENT_PROGRESS_COLOR').' '."\n"; +print $formother->selectColor($conf->global->AGENDA_EVENT_PROGRESS_COLOR, 'event_progress_color'); +print '
'.$langs->trans('AGENDA_EVENT_FUTURE_COLOR').' '."\n"; +print $formother->selectColor($conf->global->AGENDA_EVENT_FUTURE_COLOR, 'event_future_color'); +print '
'; print $form->buttonsSaveCancel("Save", ''); @@ -402,6 +482,8 @@ print '
'; print "
"; +print dol_get_fiche_end(); + // End of page llxFooter(); $db->close(); diff --git a/htdocs/comm/action/list.php b/htdocs/comm/action/list.php index dd877e903e4..0dadd28ff9e 100644 --- a/htdocs/comm/action/list.php +++ b/htdocs/comm/action/list.php @@ -889,6 +889,7 @@ $i = 0; //$savnbfield = $totalarray['nbfield']; //$totalarray['nbfield'] = 0; $imaxinloop = ($limit ? min($num, $limit) : $num); +$today_start_date_time = dol_now(); while ($i < $imaxinloop) { $obj = $db->fetch_object($resql); if (empty($obj)) { @@ -923,7 +924,36 @@ while ($i < $imaxinloop) { $actionstatic->fetchResources(); } - print ''; + // get event color + $event_color = ''; + $event_more_class = ''; + $event_start_date_time = $actionstatic->datep; + if ($obj->fulldayevent) { + $today_start_date_time = dol_mktime(0, 0, 0, date('m', $today_start_date_time), date('d', $today_start_date_time), date('Y', $today_start_date_time)); + } + if ($event_start_date_time > $today_start_date_time) { + // future event + $event_color = $conf->global->AGENDA_EVENT_FUTURE_COLOR; + $event_more_class = 'event-future'; + } else { + // check event end date + $event_end_date_time = $db->jdate($obj->dp2); + if ($event_end_date_time != null && $event_end_date_time < $today_start_date_time) { + // past event + $event_color = $conf->global->AGENDA_EVENT_PAST_COLOR; + $event_more_class = 'event-past'; + } elseif ($event_end_date_time == null && $event_start_date_time < $today_start_date_time) { + // past event + $event_color = $conf->global->AGENDA_EVENT_PAST_COLOR; + $event_more_class = 'event-past'; + } else { + // today event + $event_color = $conf->global->AGENDA_EVENT_PROGRESS_COLOR; + $event_more_class = 'event-progress'; + } + } + + print ''; // Ref if (!empty($arrayfields['a.id']['checked'])) { From cda6e9184df96afe1d4fb54beec9aae1ef12c5cc Mon Sep 17 00:00:00 2001 From: lvessiller Date: Wed, 13 Jul 2022 16:52:57 +0200 Subject: [PATCH 0008/1128] NEW color in action list and translated --- htdocs/admin/agenda_other.php | 10 +++++----- htdocs/comm/action/list.php | 6 +++--- htdocs/langs/en_US/admin.lang | 5 ++++- htdocs/langs/fr_FR/admin.lang | 5 ++++- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/htdocs/admin/agenda_other.php b/htdocs/admin/agenda_other.php index 3f976efc784..08858252032 100644 --- a/htdocs/admin/agenda_other.php +++ b/htdocs/admin/agenda_other.php @@ -121,8 +121,8 @@ if ($action == 'set') { $errors[] = $db->lasterror(); } - $event_color = preg_replace('/[^0-9a-f#]/i', '', (string) GETPOST('event_progress_color', 'alphanohtml')); - $res = dolibarr_set_const($db, 'AGENDA_EVENT_PROGRESS_COLOR', $event_color, 'chaine', 0, '', $conf->entity); + $event_color = preg_replace('/[^0-9a-f#]/i', '', (string) GETPOST('event_current_color', 'alphanohtml')); + $res = dolibarr_set_const($db, 'AGENDA_EVENT_CURRENT_COLOR', $event_color, 'chaine', 0, '', $conf->entity); if (!$res > 0) { $error++; $errors[] = $db->lasterror(); @@ -459,12 +459,12 @@ print ' '."\n"; print ''."\n"; print $formother->selectColor($conf->global->AGENDA_EVENT_PAST_COLOR, 'event_past_color'); print ''."\n"; -// AGENDA_EVENT_PROGRESS_COLOR +// AGENDA_EVENT_CURRENT_COLOR print ''."\n"; -print ''.$langs->trans('AGENDA_EVENT_PROGRESS_COLOR').''."\n"; +print ''.$langs->trans('AGENDA_EVENT_CURRENT_COLOR').''."\n"; print ' '."\n"; print ''."\n"; -print $formother->selectColor($conf->global->AGENDA_EVENT_PROGRESS_COLOR, 'event_progress_color'); +print $formother->selectColor($conf->global->AGENDA_EVENT_CURRENT_COLOR, 'event_current_color'); print ''."\n"; // AGENDA_EVENT_FUTURE_COLOR print ''."\n"; diff --git a/htdocs/comm/action/list.php b/htdocs/comm/action/list.php index 0dadd28ff9e..ec42c0257af 100644 --- a/htdocs/comm/action/list.php +++ b/htdocs/comm/action/list.php @@ -947,9 +947,9 @@ while ($i < $imaxinloop) { $event_color = $conf->global->AGENDA_EVENT_PAST_COLOR; $event_more_class = 'event-past'; } else { - // today event - $event_color = $conf->global->AGENDA_EVENT_PROGRESS_COLOR; - $event_more_class = 'event-progress'; + // current event + $event_color = $conf->global->AGENDA_EVENT_CURRENT_COLOR; + $event_more_class = 'event-current'; } } diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 813c7a4faa0..07cd5da86a9 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1806,6 +1806,9 @@ AGENDA_USE_EVENT_TYPE=Use events types (managed in menu Setup -> Dictionaries -> AGENDA_USE_EVENT_TYPE_DEFAULT=Automatically set this default value for type of event in event create form AGENDA_DEFAULT_FILTER_TYPE=Automatically set this type of event in search filter of agenda view AGENDA_DEFAULT_FILTER_STATUS=Automatically set this status for events in search filter of agenda view +AGENDA_EVENT_PAST_COLOR=Past event color +AGENDA_EVENT_CURRENT_COLOR=Current event color +AGENDA_EVENT_FUTURE_COLOR=Future event color AGENDA_DEFAULT_VIEW=Which view do you want to open by default when selecting menu Agenda AGENDA_REMINDER_BROWSER=Enable event reminder on user's browser (When remind date is reached, a popup is shown by the browser. Each user can disable such notifications from its browser notification setup). AGENDA_REMINDER_BROWSER_SOUND=Enable sound notification @@ -2284,4 +2287,4 @@ AlwaysEnabled=Always Enabled DoesNotWorkWithAllThemes=Will not work with all themes NoName=No name ShowAdvancedOptions= Show advanced options -HideAdvancedoptions= Hide advanced options \ No newline at end of file +HideAdvancedoptions= Hide advanced options diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang index 3c653717801..8c9424546e9 100644 --- a/htdocs/langs/fr_FR/admin.lang +++ b/htdocs/langs/fr_FR/admin.lang @@ -1806,6 +1806,9 @@ AGENDA_USE_EVENT_TYPE=Utiliser les types d'événements (gérés dans le menu Co AGENDA_USE_EVENT_TYPE_DEFAULT=Configurez automatiquement cette valeur par défaut pour le type d'événement dans le formulaire de création d'événement. AGENDA_DEFAULT_FILTER_TYPE=Positionner automatiquement ce type d'événement dans le filtre de recherche de la vue agenda AGENDA_DEFAULT_FILTER_STATUS=Positionner automatiquement ce statut d'événement dans le filtre de recherche de la vue agenda +AGENDA_EVENT_PAST_COLOR=Couleur de l'événement passé +AGENDA_EVENT_CURRENT_COLOR=Couleur de l'événement en cours +AGENDA_EVENT_FUTURE_COLOR=Couleur de l'événement futur AGENDA_DEFAULT_VIEW=Quel onglet voulez-vous voir ouvrir par défaut quand on choisit le menu Agenda AGENDA_REMINDER_BROWSER=Activer le rappel d'événement sur le navigateur de l'utilisateur (lorsque la date de l'événement est atteinte, une popup est affichée sur la navigateur. Chaque utilisateur peut désactiver de telles notification depuis la configuration des notifications de son navigateur) AGENDA_REMINDER_BROWSER_SOUND=Activer les notifications sonores. @@ -2267,4 +2270,4 @@ DarkThemeMode=Mode thème sombre AlwaysDisabled=Toujours désactivé AccordingToBrowser=Selon le navigateur AlwaysEnabled=Toujours activé -DoesNotWorkWithAllThemes=Ne fonctionne pas avec tous les thèmes \ No newline at end of file +DoesNotWorkWithAllThemes=Ne fonctionne pas avec tous les thèmes From 0a82efce07b3d28a396995d25d5a2a32e3b8f0c3 Mon Sep 17 00:00:00 2001 From: lvessiller Date: Wed, 13 Jul 2022 17:30:08 +0200 Subject: [PATCH 0009/1128] FIX reload stickler-ci From f69d5924498cc1e1eaed24f48eea42d39a1fb23f Mon Sep 17 00:00:00 2001 From: lvessiller Date: Wed, 13 Jul 2022 17:38:18 +0200 Subject: [PATCH 0010/1128] FIX stickler-ci --- htdocs/admin/agenda_other.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/htdocs/admin/agenda_other.php b/htdocs/admin/agenda_other.php index 08858252032..7c2c6640277 100644 --- a/htdocs/admin/agenda_other.php +++ b/htdocs/admin/agenda_other.php @@ -112,7 +112,6 @@ if ($action == 'set') { } else { setEventMessages($langs->trans("RecordSaved"), null, 'mesgs'); } - } elseif ($action == 'setcolors') { $event_color = preg_replace('/[^0-9a-f#]/i', '', (string) GETPOST('event_past_color', 'alphanohtml')); $res = dolibarr_set_const($db, 'AGENDA_EVENT_PAST_COLOR', $event_color, 'chaine', 0, '', $conf->entity); @@ -140,8 +139,7 @@ if ($action == 'set') { } else { setEventMessage($langs->trans('SetupSaved')); } -} -elseif ($action == 'specimen') { // For orders +} elseif ($action == 'specimen') { // For orders $modele = GETPOST('module', 'alpha'); $commande = new CommandeFournisseur($db); From f40ab59b37df0a312a58608854fc654dc70ca042 Mon Sep 17 00:00:00 2001 From: GregM Date: Tue, 19 Jul 2022 16:08:38 +0200 Subject: [PATCH 0011/1128] FIX contacts disabled are not returned on create invoice --- htdocs/contact/class/contact.class.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php index bb3f2ae035d..ce74f82b412 100644 --- a/htdocs/contact/class/contact.class.php +++ b/htdocs/contact/class/contact.class.php @@ -1776,10 +1776,13 @@ class Contact extends CommonObject $sql = "SELECT sc.fk_socpeople as id, sc.fk_c_type_contact"; $sql .= " FROM ".MAIN_DB_PREFIX."c_type_contact tc"; $sql .= ", ".MAIN_DB_PREFIX."societe_contacts sc"; + $sql .= " INNER JOIN ".MAIN_DB_PREFIX."socpeople sp"; + $sql .= " ON sc.fk_socpeople = sp.rowid"; $sql .= " WHERE sc.fk_soc =".((int) $this->socid); $sql .= " AND sc.fk_c_type_contact=tc.rowid"; $sql .= " AND tc.element = '".$this->db->escape($element)."'"; $sql .= " AND tc.active = 1"; + $sql .= " AND sp.statut = 1"; dol_syslog(__METHOD__, LOG_DEBUG); $resql = $this->db->query($sql); From 161958d34613d1bcc9ffb30f0f61b9ec440ac957 Mon Sep 17 00:00:00 2001 From: lvessiller Date: Thu, 21 Jul 2022 10:56:03 +0200 Subject: [PATCH 0012/1128] NEW color for start date and owner --- htdocs/comm/action/list.php | 48 +++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/htdocs/comm/action/list.php b/htdocs/comm/action/list.php index ec42c0257af..096771c9ea7 100644 --- a/htdocs/comm/action/list.php +++ b/htdocs/comm/action/list.php @@ -890,6 +890,7 @@ $i = 0; //$totalarray['nbfield'] = 0; $imaxinloop = ($limit ? min($num, $limit) : $num); $today_start_date_time = dol_now(); +$cache_user_list = array(); while ($i < $imaxinloop) { $obj = $db->fetch_object($resql); if (empty($obj)) { @@ -924,36 +925,54 @@ while ($i < $imaxinloop) { $actionstatic->fetchResources(); } - // get event color - $event_color = ''; + // cache of user list (owners) + if ($obj->fk_user_action > 0 && !isset($cache_user_list[$obj->fk_user_action])) { + $res = $userstatic->fetch($obj->fk_user_action); + if ($res > 0) { + $cache_user_list[$obj->fk_user_action] = $userstatic; + } + } + + // get event style for user owner + $event_owner_style = ''; + // We decide to choose color of owner of event (event->userownerid is user id of owner, event->userassigned contains all users assigned to event) + if ($cache_user_list[$obj->fk_user_action]->color != '') { + $event_owner_style .= 'border-left: #' . $cache_user_list[$obj->fk_user_action]->color . ' 5px solid;'; + } + + // get event style for start date $event_more_class = ''; + $event_start_date_style = ''; $event_start_date_time = $actionstatic->datep; if ($obj->fulldayevent) { $today_start_date_time = dol_mktime(0, 0, 0, date('m', $today_start_date_time), date('d', $today_start_date_time), date('Y', $today_start_date_time)); } if ($event_start_date_time > $today_start_date_time) { // future event - $event_color = $conf->global->AGENDA_EVENT_FUTURE_COLOR; $event_more_class = 'event-future'; + $event_start_date_color = $conf->global->AGENDA_EVENT_FUTURE_COLOR; } else { // check event end date $event_end_date_time = $db->jdate($obj->dp2); if ($event_end_date_time != null && $event_end_date_time < $today_start_date_time) { // past event - $event_color = $conf->global->AGENDA_EVENT_PAST_COLOR; $event_more_class = 'event-past'; + $event_start_date_color = $conf->global->AGENDA_EVENT_PAST_COLOR; } elseif ($event_end_date_time == null && $event_start_date_time < $today_start_date_time) { // past event - $event_color = $conf->global->AGENDA_EVENT_PAST_COLOR; $event_more_class = 'event-past'; + $event_start_date_color = $conf->global->AGENDA_EVENT_PAST_COLOR; } else { // current event - $event_color = $conf->global->AGENDA_EVENT_CURRENT_COLOR; $event_more_class = 'event-current'; + $event_start_date_color = $conf->global->AGENDA_EVENT_CURRENT_COLOR; } } + if ($event_start_date_color != '') { + $event_start_date_style .= 'background: #' . $event_start_date_color . ';'; + } - print ''; + print ''; // Ref if (!empty($arrayfields['a.id']['checked'])) { @@ -964,10 +983,15 @@ while ($i < $imaxinloop) { // User owner if (!empty($arrayfields['owner']['checked'])) { - print ''; // With edge and chrome the td overflow is not supported correctly when content is not full text. - if ($obj->fk_user_action > 0) { - $userstatic->fetch($obj->fk_user_action); - print $userstatic->getNomUrl(-1); + print ''; // With edge and chrome the td overflow is not supported correctly when content is not full text. + if ($obj->fk_user_action > 0 && !isset($cache_user_list[$obj->fk_user_action])) { + $res = $userstatic->fetch($obj->fk_user_action); + if ($res > 0) { + $cache_user_list[$obj->fk_user_action] = $userstatic; + } + } + if (isset($cache_user_list[$obj->fk_user_action])) { + print $cache_user_list[$obj->fk_user_action]->getNomUrl(-1); } else { print ' '; } @@ -1015,7 +1039,7 @@ while ($i < $imaxinloop) { // Start date if (!empty($arrayfields['a.datep']['checked'])) { - print ''; + print ''; if (empty($obj->fulldayevent)) { print dol_print_date($db->jdate($obj->dp), $formatToUse, 'tzuserrel'); } else { From 993812dc70d6e96118326e283054f8014fca76ec Mon Sep 17 00:00:00 2001 From: lvessiller Date: Thu, 21 Jul 2022 11:22:53 +0200 Subject: [PATCH 0013/1128] FIX stickler-ci --- htdocs/comm/action/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/comm/action/list.php b/htdocs/comm/action/list.php index 096771c9ea7..627b1088afe 100644 --- a/htdocs/comm/action/list.php +++ b/htdocs/comm/action/list.php @@ -972,7 +972,7 @@ while ($i < $imaxinloop) { $event_start_date_style .= 'background: #' . $event_start_date_color . ';'; } - print ''; + print ''; // Ref if (!empty($arrayfields['a.id']['checked'])) { From 4d59fd2679a6854994a967924e17f9a7cadb5cae Mon Sep 17 00:00:00 2001 From: lvessiller Date: Tue, 26 Jul 2022 16:36:28 +0200 Subject: [PATCH 0014/1128] FIX reset today event time --- htdocs/comm/action/list.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/comm/action/list.php b/htdocs/comm/action/list.php index 627b1088afe..dba1adecf08 100644 --- a/htdocs/comm/action/list.php +++ b/htdocs/comm/action/list.php @@ -889,7 +889,6 @@ $i = 0; //$savnbfield = $totalarray['nbfield']; //$totalarray['nbfield'] = 0; $imaxinloop = ($limit ? min($num, $limit) : $num); -$today_start_date_time = dol_now(); $cache_user_list = array(); while ($i < $imaxinloop) { $obj = $db->fetch_object($resql); @@ -945,7 +944,9 @@ while ($i < $imaxinloop) { $event_start_date_style = ''; $event_start_date_time = $actionstatic->datep; if ($obj->fulldayevent) { - $today_start_date_time = dol_mktime(0, 0, 0, date('m', $today_start_date_time), date('d', $today_start_date_time), date('Y', $today_start_date_time)); + $today_start_date_time = dol_mktime(0, 0, 0, date('m', $now), date('d', $now), date('Y', $now)); + } else { + $today_start_date_time = $now; } if ($event_start_date_time > $today_start_date_time) { // future event From 62b70b37d353f3a4dc28a5636ecada25716afaab Mon Sep 17 00:00:00 2001 From: lvessiller Date: Wed, 27 Jul 2022 08:32:46 +0200 Subject: [PATCH 0015/1128] NEW set today start time at begining --- htdocs/comm/action/list.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/comm/action/list.php b/htdocs/comm/action/list.php index dba1adecf08..674348d6158 100644 --- a/htdocs/comm/action/list.php +++ b/htdocs/comm/action/list.php @@ -877,6 +877,7 @@ print "\n"; $now = dol_now(); $delay_warning = $conf->global->MAIN_DELAY_ACTIONS_TODO * 24 * 60 * 60; +$today_start_time = dol_mktime(0, 0, 0, date('m', $now), date('d', $now), date('Y', $now)); require_once DOL_DOCUMENT_ROOT.'/comm/action/class/cactioncomm.class.php'; $caction = new CActionComm($db); @@ -943,8 +944,8 @@ while ($i < $imaxinloop) { $event_more_class = ''; $event_start_date_style = ''; $event_start_date_time = $actionstatic->datep; - if ($obj->fulldayevent) { - $today_start_date_time = dol_mktime(0, 0, 0, date('m', $now), date('d', $now), date('Y', $now)); + if ($obj->fulldayevent == 1) { + $today_start_date_time = $today_start_time; } else { $today_start_date_time = $now; } From 7a8006c0a0f02941a286301ac4129c54f0e90ac2 Mon Sep 17 00:00:00 2001 From: BB2A Anthony Berton Date: Wed, 27 Jul 2022 14:40:45 +0200 Subject: [PATCH 0016/1128] init --- htdocs/commande/list.php | 179 ++++++++++++++++++++++++++++++++- htdocs/langs/en_US/orders.lang | 1 + 2 files changed, 179 insertions(+), 1 deletion(-) diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index 264613ac597..00470b13afc 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -71,6 +71,15 @@ $search_dateorder_end = dol_mktime(23, 59, 59, GETPOST('search_dateorder_end_mon $search_datedelivery_start = dol_mktime(0, 0, 0, GETPOST('search_datedelivery_start_month', 'int'), GETPOST('search_datedelivery_start_day', 'int'), GETPOST('search_datedelivery_start_year', 'int')); $search_datedelivery_end = dol_mktime(23, 59, 59, GETPOST('search_datedelivery_end_month', 'int'), GETPOST('search_datedelivery_end_day', 'int'), GETPOST('search_datedelivery_end_year', 'int')); $search_product_category = GETPOST('search_product_category', 'int'); +/* +// Détail commande +*/ +$search_refProduct = GETPOST('search_refProduct', 'alpha'); +$search_descProduct = GETPOST('search_descProduct', 'alpha'); +$check_orderdetail = GETPOST('check_orderdetail', 'alpha'); +/* +// Détail commande fin +*/ $search_ref = GETPOST('search_ref', 'alpha') != '' ?GETPOST('search_ref', 'alpha') : GETPOST('sref', 'alpha'); $search_ref_customer = GETPOST('search_ref_customer', 'alpha'); $search_company = GETPOST('search_company', 'alpha'); @@ -204,6 +213,17 @@ $arrayfields = array( 'c.import_key' =>array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>1, 'visible'=>-2, 'position'=>999), 'c.fk_statut'=>array('label'=>"Status", 'checked'=>1, 'position'=>1000) ); +/* + // Détail commande fin + */ +if (!empty($check_orderdetail)) { + $arrayfields['cdet.qty'] = array('label'=>'QtyOrdered', 'checked'=>1, 'position'=>1); + $arrayfields['pr.desc'] = array('label'=>'ProductDescription', 'checked'=>1, 'position'=>1); + $arrayfields['pr.ref'] = array('label'=>'ProductRef', 'checked'=>1, 'position'=>1); +} + /* + // Détail commande fin + */ // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php'; @@ -789,6 +809,16 @@ $sql .= ' p.rowid as project_id, p.ref as project_ref, p.title as project_label, $sql .= ' u.login, u.lastname, u.firstname, u.email as user_email, u.statut as user_statut, u.entity, u.photo, u.office_phone, u.office_fax, u.user_mobile, u.job, u.gender,'; $sql .= ' c.fk_cond_reglement,c.deposit_percent,c.fk_mode_reglement,c.fk_shipping_method,'; $sql .= ' c.fk_input_reason, c.import_key'; +/* +// Détail commande +*/ +if (!empty($check_orderdetail)) { + $sql .= ', cdet.description, cdet.qty, '; + $sql .= ' pr.rowid as product_rowid, pr.ref as product_ref, pr.label as product_label, pr.barcode as product_barcode, pr.tobatch as product_batch, pr.tosell as product_status, pr.tobuy as product_status_buy'; +} +/* +// Détail commande fin +*/ if (($search_categ_cus > 0) || ($search_categ_cus == -2)) { $sql .= ", cc.fk_categorie, cc.fk_soc"; } @@ -809,7 +839,19 @@ $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as state on (state.rowid = if (($search_categ_cus > 0) || ($search_categ_cus == -2)) { $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX."categorie_societe as cc ON s.rowid = cc.fk_soc"; // We'll need this table joined to the select in order to filter by categ } -$sql .= ', '.MAIN_DB_PREFIX.'commande as c'; +/* +// Détail commande +*/ +if (!empty($check_orderdetail)) { + $sql .= ', '.MAIN_DB_PREFIX.'commandedet as cdet'; + $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'commande as c ON cdet.fk_commande=c.rowid'; + $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'product as pr ON pr.rowid=cdet.fk_product'; +} else { + $sql .= ', '.MAIN_DB_PREFIX.'commande as c'; +} +/* +// Détail commande fin +*/ if (!empty($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) { $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."commande_extrafields as ef on (c.rowid = ef.fk_object)"; } @@ -1310,6 +1352,13 @@ if ($resql) { print ''; print '
'; } + /* + // Détail commande + */ + print '
 
'; + /* + // Détail commande fin + */ if ($sall) { foreach ($fieldstosearchall as $key => $val) { @@ -1391,6 +1440,27 @@ if ($resql) { print ''."\n"; print ''; + /* + // Détail commande + */ + if (!empty($arrayfields['pr.ref']['checked'])) { + print ''; + } + // Product Description + if (!empty($arrayfields['pr.desc']['checked'])) { + print ''; + } + // Product QtyOrdered + if (!empty($arrayfields['cdet.qty']['checked'])) { + print ''; + } + /* + // Détail commande fin + */ // Ref if (!empty($arrayfields['c.ref']['checked'])) { print ''; + + /* + // Détail commande + */ + if (!empty($arrayfields['pr.ref']['checked'])) { + print_liste_field_titre($arrayfields['pr.ref']['label'], $_SERVER["PHP_SELF"], 'pr.ref', '', $param, '', $sortfield, $sortorder); + } + if (!empty($arrayfields['pr.desc']['checked'])) { + print_liste_field_titre($arrayfields['pr.desc']['label'], $_SERVER["PHP_SELF"], 'pr.desc', '', $param, '', $sortfield, $sortorder); + } + if (!empty($arrayfields['cdet.qty']['checked'])) { + print_liste_field_titre($arrayfields['cdet.qty']['label'], $_SERVER["PHP_SELF"], 'cdet.qty', '', $param, '', $sortfield, $sortorder); + } + /* + // Détail commande fin + */ if (!empty($arrayfields['c.ref']['checked'])) { print_liste_field_titre($arrayfields['c.ref']['label'], $_SERVER["PHP_SELF"], 'c.ref', '', $param, '', $sortfield, $sortorder); } @@ -1820,6 +1906,14 @@ if ($resql) { } $total_ht = 0; $total_margin = 0; + /* + // Détail commande + */ + $totalqty = 0; + /* + // Détail commande fin + */ + $imaxinloop = ($limit ? min($num, $limit) : $num); $last_num = min($num, $limit); @@ -1872,9 +1966,92 @@ if ($resql) { $total_ht += $obj->total_ht; $total_margin += $marginInfo['total_margin']; } + /* + // Détail commande + *//* + if (isset($refpre) && $obj->product_ref != $refpre) { + print ''; + $i = 0; + // var_dump($totalarray); + while ($i < $totalarray['nbfield']) { + $i++; + if (!empty($totalarray['pos'][$i]) && $totalarray['pos'][$i] == 'cdet.qty') { + print ''; + } elseif ($i == 1) { + print ''; + } else { + print ''; + } + } + print ''; + $totalqty = $obj->qty; + //include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php'; + + } else { + $totalqty = $totalqty + $obj->qty; + } + $refpre = isset($obj->product_ref) ? $obj->product_ref : ''; + /* + // Détail commande fin + */ print ''; + /* + // Détail commande + */ + // Product Ref + if (!empty($arrayfields['pr.ref']['checked'])) { + if (!empty($obj->product_rowid)) { + $generic_product->id = $obj->product_rowid; + $generic_product->ref = $obj->product_ref; + $generic_product->label = $obj->product_label; + $generic_product->status = $obj->product_status; + $generic_product->status_buy = $obj->product_status_buy; + $generic_product->status_batch = $obj->product_batch; + $generic_product->barcode = $obj->product_barcode; + print ''; + } else { + print ''; + } + if (!$i) { + $totalarray['nbfield']++; + } + } + // Product Description + if (!empty($arrayfields['pr.desc']['checked'])) { + // print ''; + !empty($obj->product_label) ? $labelproduct = $obj->product_label : $labelproduct = $obj->description; + print ''; + + if (!$i) { + $totalarray['nbfield']++; + } + } + // Product QtyOrdered + if (!empty($arrayfields['cdet.qty']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'cdet.qty'; + } + if (isset($totalarray['val']['cdet.qty'])) { + $totalarray['val']['cdet.qty'] += $obj->qty; + } else { + $totalarray['val']['cdet.qty'] = $obj->qty; + } + } + /* + // Détail commande fin + */ // Ref if (!empty($arrayfields['c.ref']['checked'])) { print ''; - /* - // Détail commande - */ +// Détail commande if (!empty($arrayfields['pr.ref']['checked'])) { print ''; } - /* - // Détail commande fin - */ // Action column if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { @@ -1737,9 +1717,7 @@ if ($resql) { // Fields title print ''; - /* // Détail commande - */ if (!empty($arrayfields['pr.ref']['checked'])) { print_liste_field_titre($arrayfields['pr.ref']['label'], $_SERVER["PHP_SELF"], 'pr.ref', '', $param, '', $sortfield, $sortorder); } @@ -1749,9 +1727,6 @@ if ($resql) { if (!empty($arrayfields['cdet.qty']['checked'])) { print_liste_field_titre($arrayfields['cdet.qty']['label'], $_SERVER["PHP_SELF"], 'cdet.qty', '', $param, '', $sortfield, $sortorder); } - /* - // Détail commande fin - */ if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', $param, '', $sortfield, $sortorder, 'maxwidthsearch center '); @@ -1927,14 +1902,9 @@ if ($resql) { } $total_ht = 0; $total_margin = 0; - /* + // Détail commande - */ $totalqty = 0; - /* - // Détail commande fin - */ - $imaxinloop = ($limit ? min($num, $limit) : $num); $last_num = min($num, $limit); @@ -1987,46 +1957,10 @@ if ($resql) { $total_ht += $obj->total_ht; $total_margin += $marginInfo['total_margin']; } - /* - // Détail commande - *//* - if (isset($refpre) && $obj->product_ref != $refpre) { - print ''; - $i = 0; - // var_dump($totalarray); - while ($i < $totalarray['nbfield']) { - $i++; - if (!empty($totalarray['pos'][$i]) && $totalarray['pos'][$i] == 'cdet.qty') { - print ''; - } elseif ($i == 1) { - print ''; - } else { - print ''; - } - } - print ''; - $totalqty = $obj->qty; - //include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php'; - - } else { - $totalqty = $totalqty + $obj->qty; - } - $refpre = isset($obj->product_ref) ? $obj->product_ref : ''; - /* - // Détail commande fin - */ print ''; - /* // Détail commande - */ // Product Ref if (!empty($arrayfields['pr.ref']['checked'])) { if (!empty($obj->product_rowid)) { @@ -2070,9 +2004,6 @@ if ($resql) { $totalarray['val']['cdet.qty'] = $obj->qty; } } - /* - // Détail commande fin - */ // Action column if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { From 887d30e1b46b72c54972d84f205ea76716a51021 Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Wed, 27 Jul 2022 16:01:45 +0200 Subject: [PATCH 0018/1128] Add option ORDER_ADD_OPTION_SHOW_DETAIL_LIST --- htdocs/commande/list.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index 00e87be1411..02ac878ecee 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -1345,8 +1345,9 @@ if ($resql) { } // Détail commande - print '
 
'; - + if (!empty($conf->global->ORDER_ADD_OPTION_SHOW_DETAIL_LIST)){ + print '
 
'; + } if ($sall) { foreach ($fieldstosearchall as $key => $val) { @@ -1429,7 +1430,7 @@ if ($resql) { print '
'; -// Détail commande + // Détail commande if (!empty($arrayfields['pr.ref']['checked'])) { print ''; + // Action column + if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + } + // Détail commande if (!empty($arrayfields['pr.ref']['checked'])) { print ''; } - // Action column - if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { - print ''; - } - // Ref if (!empty($arrayfields['c.ref']['checked'])) { print ''; + if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', $param, '', $sortfield, $sortorder, 'maxwidthsearch center '); + } + // Détail commande if (!empty($arrayfields['pr.ref']['checked'])) { + var_dump($_SERVER["PHP_SELF"]); print_liste_field_titre($arrayfields['pr.ref']['label'], $_SERVER["PHP_SELF"], 'pr.ref', '', $param, '', $sortfield, $sortorder); } if (!empty($arrayfields['pr.desc']['checked'])) { @@ -1738,10 +1743,6 @@ if ($resql) { print_liste_field_titre($arrayfields['cdet.qty']['label'], $_SERVER["PHP_SELF"], 'cdet.qty', '', $param, '', $sortfield, $sortorder); } - if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { - print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', $param, '', $sortfield, $sortorder, 'maxwidthsearch center '); - } - if (!empty($arrayfields['c.ref']['checked'])) { print_liste_field_titre($arrayfields['c.ref']['label'], $_SERVER["PHP_SELF"], 'c.ref', '', $param, '', $sortfield, $sortorder); } @@ -1970,6 +1971,18 @@ if ($resql) { print ''; + // Action column + if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; } - // Détail commande - if (!empty($arrayfields['pr.ref']['checked'])) { - print ''; - } + // Product Description if (!empty($arrayfields['pr.desc']['checked'])) { print ''; - } else { - print ''; - } - if (!$i) { - $totalarray['nbfield']++; - } - } - // Product Description - if (!empty($arrayfields['pr.desc']['checked'])) { - // print ''; - !empty($obj->product_label) ? $labelproduct = $obj->product_label : $labelproduct = $obj->description; - print ''; - - if (!$i) { - $totalarray['nbfield']++; - } - } - // Product QtyOrdered - if (!empty($arrayfields['cdet.qty']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'cdet.qty'; - } - if (isset($totalarray['val']['cdet.qty'])) { - $totalarray['val']['cdet.qty'] += $obj->qty; - } else { - $totalarray['val']['cdet.qty'] = $obj->qty; - } - } - // Ref if (!empty($arrayfields['c.ref']['checked'])) { print ''; - print ''; + } + } else { + print ''; + print '"; + //multicompany + if (isModEnabled('multicompany') && is_object($mc) && empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE) && $conf->entity == 1) { + $mc->getInfo($obj->entity); + print ''; + } + print ''; + print ''; + print ''; + print ''; + print ''; + print "\n"; } - print ""; - //multicompany - if (isModEnabled('multicompany') && is_object($mc) && empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE) && $conf->entity == 1) { - $mc->getInfo($obj->entity); - print ''; - } - print ''; - print ''; - print ''; - print ''; - print ''; - print "\n"; $i++; } print "
'; + print ''; + print ''; + print ''; + print ''; @@ -1652,6 +1722,22 @@ if ($resql) { // Fields title print '
'.$totalqty.''; + if (is_object($form)) { + print $form->textwithpicto($langs->trans("Total"), $langs->transnoentitiesnoconv("Totalforthispage")); + } else { + print $langs->trans("Totalforthispage"); + } + print '
'.$generic_product->getNomUrl(1).'Ligne libre'.$obj->description.''.dol_escape_htmltag($labelproduct).''.$obj->qty.''; diff --git a/htdocs/langs/en_US/orders.lang b/htdocs/langs/en_US/orders.lang index a4261f8e62c..acb880fa4f3 100644 --- a/htdocs/langs/en_US/orders.lang +++ b/htdocs/langs/en_US/orders.lang @@ -130,6 +130,7 @@ SupplierOrderClassifiedBilled=Purchase Order %s set billed OtherOrders=Other orders SupplierOrderValidatedAndApproved=Supplier order is validated and approved : %s SupplierOrderValidated=Supplier order is validated : %s +OrderShowDetail=Show order detail ##### Types de contacts ##### TypeContact_commande_internal_SALESREPFOLL=Representative following-up sales order TypeContact_commande_internal_SHIPPING=Representative following-up shipping From 0e796a2a02a3a4ff21ac30db67cdaf1c45d016f9 Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Wed, 27 Jul 2022 15:35:35 +0200 Subject: [PATCH 0017/1128] Clean --- htdocs/commande/list.php | 97 ++++++---------------------------------- 1 file changed, 14 insertions(+), 83 deletions(-) diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index c58cc12a21c..00e87be1411 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -11,7 +11,7 @@ * Copyright (C) 2015 Jean-François Ferry * Copyright (C) 2016-2021 Ferran Marcet * Copyright (C) 2018 Charlene Benke - * Copyright (C) 2021 Anthony Berton + * Copyright (C) 2021-2022 Anthony Berton * * 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 @@ -71,15 +71,12 @@ $search_dateorder_end = dol_mktime(23, 59, 59, GETPOST('search_dateorder_end_mon $search_datedelivery_start = dol_mktime(0, 0, 0, GETPOST('search_datedelivery_start_month', 'int'), GETPOST('search_datedelivery_start_day', 'int'), GETPOST('search_datedelivery_start_year', 'int')); $search_datedelivery_end = dol_mktime(23, 59, 59, GETPOST('search_datedelivery_end_month', 'int'), GETPOST('search_datedelivery_end_day', 'int'), GETPOST('search_datedelivery_end_year', 'int')); $search_product_category = GETPOST('search_product_category', 'int'); -/* + // Détail commande -*/ $search_refProduct = GETPOST('search_refProduct', 'alpha'); $search_descProduct = GETPOST('search_descProduct', 'alpha'); $check_orderdetail = GETPOST('check_orderdetail', 'alpha'); -/* -// Détail commande fin -*/ + $search_ref = GETPOST('search_ref', 'alpha') != '' ?GETPOST('search_ref', 'alpha') : GETPOST('sref', 'alpha'); $search_ref_customer = GETPOST('search_ref_customer', 'alpha'); $search_company = GETPOST('search_company', 'alpha'); @@ -213,17 +210,14 @@ $arrayfields = array( 'c.import_key' =>array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>1, 'visible'=>-2, 'position'=>999), 'c.fk_statut'=>array('label'=>"Status", 'checked'=>1, 'position'=>1000) ); -/* - // Détail commande fin - */ + +// Détail commande if (!empty($check_orderdetail)) { $arrayfields['cdet.qty'] = array('label'=>'QtyOrdered', 'checked'=>1, 'position'=>1); $arrayfields['pr.desc'] = array('label'=>'ProductDescription', 'checked'=>1, 'position'=>1); $arrayfields['pr.ref'] = array('label'=>'ProductRef', 'checked'=>1, 'position'=>1); } - /* - // Détail commande fin - */ + // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php'; @@ -812,16 +806,13 @@ $sql .= ' p.rowid as project_id, p.ref as project_ref, p.title as project_label, $sql .= ' u.login, u.lastname, u.firstname, u.email as user_email, u.statut as user_statut, u.entity, u.photo, u.office_phone, u.office_fax, u.user_mobile, u.job, u.gender,'; $sql .= ' c.fk_cond_reglement,c.deposit_percent,c.fk_mode_reglement,c.fk_shipping_method,'; $sql .= ' c.fk_input_reason, c.import_key'; -/* + // Détail commande -*/ if (!empty($check_orderdetail)) { $sql .= ', cdet.description, cdet.qty, '; $sql .= ' pr.rowid as product_rowid, pr.ref as product_ref, pr.label as product_label, pr.barcode as product_barcode, pr.tobatch as product_batch, pr.tosell as product_status, pr.tobuy as product_status_buy'; } -/* -// Détail commande fin -*/ + if (($search_categ_cus > 0) || ($search_categ_cus == -2)) { $sql .= ", cc.fk_categorie, cc.fk_soc"; } @@ -842,9 +833,8 @@ $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as state on (state.rowid = if (($search_categ_cus > 0) || ($search_categ_cus == -2)) { $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX."categorie_societe as cc ON s.rowid = cc.fk_soc"; // We'll need this table joined to the select in order to filter by categ } -/* + // Détail commande -*/ if (!empty($check_orderdetail)) { $sql .= ', '.MAIN_DB_PREFIX.'commandedet as cdet'; $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'commande as c ON cdet.fk_commande=c.rowid'; @@ -852,9 +842,7 @@ if (!empty($check_orderdetail)) { } else { $sql .= ', '.MAIN_DB_PREFIX.'commande as c'; } -/* -// Détail commande fin -*/ + if (!empty($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) { $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."commande_extrafields as ef on (c.rowid = ef.fk_object)"; } @@ -1355,13 +1343,10 @@ if ($resql) { print ''; print '
'; } - /* + // Détail commande - */ print '
 
'; - /* - // Détail commande fin - */ + if ($sall) { foreach ($fieldstosearchall as $key => $val) { @@ -1444,9 +1429,7 @@ if ($resql) { print '
'; print ''; @@ -1462,9 +1445,6 @@ if ($resql) { if (!empty($arrayfields['cdet.qty']['checked'])) { print '
'.$totalqty.''; - if (is_object($form)) { - print $form->textwithpicto($langs->trans("Total"), $langs->transnoentitiesnoconv("Totalforthispage")); - } else { - print $langs->trans("Totalforthispage"); - } - print '
'; print ''; From 7df1f876f51aca06b1e747abb0bf05c2b8ed2095 Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Wed, 27 Jul 2022 16:02:27 +0200 Subject: [PATCH 0019/1128] Add removefilter --- htdocs/commande/list.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index 02ac878ecee..b6490def16a 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -253,6 +253,8 @@ if (empty($reshook)) { $search_user = ''; $search_sale = ''; $search_product_category = ''; + $search_refProduct = ''; + $search_descProduct = ''; $search_ref = ''; $search_ref_customer = ''; $search_company = ''; From 5f3dc1b01fd1a4526b6b04f5588a3643d1d95f30 Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Wed, 27 Jul 2022 16:11:16 +0200 Subject: [PATCH 0020/1128] Add search in sql --- htdocs/commande/list.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index b6490def16a..882c56ca033 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -882,6 +882,13 @@ if ($socid > 0) { if (empty($user->rights->societe->client->voir) && !$socid) { $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id); } +if ($search_refProduct) { + $sql .= natural_search('pr.ref', $search_refProduct); +} +if ($search_descProduct) { + $sql .= natural_search('pr.label', $search_descProduct); + $sql .= natural_search('cdet.description', $search_descProduct); +} if ($search_ref) { $sql .= natural_search('c.ref', $search_ref); } From 7740c81f3b55fff507b733c6daa32cc71962f1be Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Wed, 27 Jul 2022 14:38:59 +0000 Subject: [PATCH 0021/1128] Fixing style errors. --- htdocs/commande/list.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index 882c56ca033..1c5499e6e8c 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -1352,9 +1352,9 @@ if ($resql) { print ''; print '
'; } - + // Détail commande - if (!empty($conf->global->ORDER_ADD_OPTION_SHOW_DETAIL_LIST)){ + if (!empty($conf->global->ORDER_ADD_OPTION_SHOW_DETAIL_LIST)) { print '
 
'; } @@ -1912,7 +1912,7 @@ if ($resql) { } $total_ht = 0; $total_margin = 0; - + // Détail commande $totalqty = 0; From 716adb103fc7a67a1ad18f7b5b883b09215eb4ab Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Wed, 27 Jul 2022 16:52:48 +0200 Subject: [PATCH 0022/1128] FIX - Error with MAIN_CHECKBOX_LEFT_COLUMN --- htdocs/commande/list.php | 49 ++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index 882c56ca033..a8d96597cc7 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -1439,6 +1439,14 @@ if ($resql) { print '
'; + $searchpicto = $form->showFilterButtons('left'); + print $searchpicto; + print ''; @@ -1456,14 +1464,6 @@ if ($resql) { print ''; - $searchpicto = $form->showFilterButtons('left'); - print $searchpicto; - print ''; @@ -1727,8 +1727,13 @@ if ($resql) { // Fields title print '
'; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->rowid, $arrayofselected)) { + $selected = 1; + } + print ''; + } + } + // Détail commande // Product Ref if (!empty($arrayfields['pr.ref']['checked'])) { @@ -2015,18 +2028,6 @@ if ($resql) { } } - // Action column - if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->rowid, $arrayofselected)) { - $selected = 1; - } - print ''; - } - } - // Ref if (!empty($arrayfields['c.ref']['checked'])) { print ''; From 8dfb4288ecb950004147bc2c47f12f42bbcd262f Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Wed, 27 Jul 2022 17:27:05 +0200 Subject: [PATCH 0023/1128] Clean --- htdocs/commande/list.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index 47d139c696a..ac1885b03af 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -1733,7 +1733,6 @@ if ($resql) { // Détail commande if (!empty($arrayfields['pr.ref']['checked'])) { - var_dump($_SERVER["PHP_SELF"]); print_liste_field_titre($arrayfields['pr.ref']['label'], $_SERVER["PHP_SELF"], 'pr.ref', '', $param, '', $sortfield, $sortorder); } if (!empty($arrayfields['pr.desc']['checked'])) { From 1769530cfd5837fb4b163197d742ba8ce15bbe99 Mon Sep 17 00:00:00 2001 From: Antonio Date: Sat, 30 Jul 2022 12:12:19 -0500 Subject: [PATCH 0024/1128] agregar un mensaje de error traducido al espanol --- htdocs/public/error-401.php | 5 +++++ htdocs/public/error-404.php | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/htdocs/public/error-401.php b/htdocs/public/error-401.php index 3d453cd30e5..a160535ff10 100644 --- a/htdocs/public/error-401.php +++ b/htdocs/public/error-401.php @@ -20,6 +20,11 @@
Sorry. You are not allowed to access this resource. +
+
+ + No esta autorizado para acceder a este recurso. +
diff --git a/htdocs/public/error-404.php b/htdocs/public/error-404.php index c964e49cd85..84832100026 100644 --- a/htdocs/public/error-404.php +++ b/htdocs/public/error-404.php @@ -20,6 +20,10 @@
You requested a website or a page that does not exists. +
+
+ la pagina o el recurso solicitado no existe. +
From dac8613c396edb0f815ee9794469300c96d92abe Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Tue, 23 Aug 2022 10:46:09 +0200 Subject: [PATCH 0025/1128] Add new file --- htdocs/commande/list.php | 96 +- htdocs/commande/list_line.php | 2660 +++++++++++++++++++++++++++++++++ 2 files changed, 2671 insertions(+), 85 deletions(-) create mode 100644 htdocs/commande/list_line.php diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index ac1885b03af..1b74238db1c 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -11,7 +11,7 @@ * Copyright (C) 2015 Jean-François Ferry * Copyright (C) 2016-2021 Ferran Marcet * Copyright (C) 2018 Charlene Benke - * Copyright (C) 2021-2022 Anthony Berton + * Copyright (C) 2021 Anthony Berton * * 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 @@ -72,10 +72,7 @@ $search_datedelivery_start = dol_mktime(0, 0, 0, GETPOST('search_datedelivery_st $search_datedelivery_end = dol_mktime(23, 59, 59, GETPOST('search_datedelivery_end_month', 'int'), GETPOST('search_datedelivery_end_day', 'int'), GETPOST('search_datedelivery_end_year', 'int')); $search_product_category = GETPOST('search_product_category', 'int'); -// Détail commande -$search_refProduct = GETPOST('search_refProduct', 'alpha'); -$search_descProduct = GETPOST('search_descProduct', 'alpha'); -$check_orderdetail = GETPOST('check_orderdetail', 'alpha'); + $search_ref = GETPOST('search_ref', 'alpha') != '' ?GETPOST('search_ref', 'alpha') : GETPOST('sref', 'alpha'); $search_ref_customer = GETPOST('search_ref_customer', 'alpha'); @@ -211,12 +208,7 @@ $arrayfields = array( 'c.fk_statut'=>array('label'=>"Status", 'checked'=>1, 'position'=>1000) ); -// Détail commande -if (!empty($check_orderdetail)) { - $arrayfields['cdet.qty'] = array('label'=>'QtyOrdered', 'checked'=>1, 'position'=>1); - $arrayfields['pr.desc'] = array('label'=>'ProductDescription', 'checked'=>1, 'position'=>1); - $arrayfields['pr.ref'] = array('label'=>'ProductRef', 'checked'=>1, 'position'=>1); -} + // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php'; @@ -809,11 +801,7 @@ $sql .= ' u.login, u.lastname, u.firstname, u.email as user_email, u.statut as u $sql .= ' c.fk_cond_reglement,c.deposit_percent,c.fk_mode_reglement,c.fk_shipping_method,'; $sql .= ' c.fk_input_reason, c.import_key'; -// Détail commande -if (!empty($check_orderdetail)) { - $sql .= ', cdet.description, cdet.qty, '; - $sql .= ' pr.rowid as product_rowid, pr.ref as product_ref, pr.label as product_label, pr.barcode as product_barcode, pr.tobatch as product_batch, pr.tosell as product_status, pr.tobuy as product_status_buy'; -} + if (($search_categ_cus > 0) || ($search_categ_cus == -2)) { $sql .= ", cc.fk_categorie, cc.fk_soc"; @@ -836,14 +824,9 @@ if (($search_categ_cus > 0) || ($search_categ_cus == -2)) { $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX."categorie_societe as cc ON s.rowid = cc.fk_soc"; // We'll need this table joined to the select in order to filter by categ } -// Détail commande -if (!empty($check_orderdetail)) { - $sql .= ', '.MAIN_DB_PREFIX.'commandedet as cdet'; - $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'commande as c ON cdet.fk_commande=c.rowid'; - $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'product as pr ON pr.rowid=cdet.fk_product'; -} else { - $sql .= ', '.MAIN_DB_PREFIX.'commande as c'; -} + +$sql .= ', '.MAIN_DB_PREFIX.'commande as c'; + if (!empty($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) { $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."commande_extrafields as ef on (c.rowid = ef.fk_object)"; @@ -1353,10 +1336,7 @@ if ($resql) { print '
'; } - // Détail commande - if (!empty($conf->global->ORDER_ADD_OPTION_SHOW_DETAIL_LIST)) { - print '
 
'; - } + if ($sall) { foreach ($fieldstosearchall as $key => $val) { @@ -1447,12 +1427,7 @@ if ($resql) { print '
'; - print ''; - print ''; @@ -1731,10 +1706,7 @@ if ($resql) { print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', $param, '', $sortfield, $sortorder, 'maxwidthsearch center '); } - // Détail commande - if (!empty($arrayfields['pr.ref']['checked'])) { - print_liste_field_titre($arrayfields['pr.ref']['label'], $_SERVER["PHP_SELF"], 'pr.ref', '', $param, '', $sortfield, $sortorder); - } + if (!empty($arrayfields['pr.desc']['checked'])) { print_liste_field_titre($arrayfields['pr.desc']['label'], $_SERVER["PHP_SELF"], 'pr.desc', '', $param, '', $sortfield, $sortorder); } @@ -1913,8 +1885,7 @@ if ($resql) { $total_ht = 0; $total_margin = 0; - // Détail commande - $totalqty = 0; + $imaxinloop = ($limit ? min($num, $limit) : $num); $last_num = min($num, $limit); @@ -1982,51 +1953,6 @@ if ($resql) { } } - // Détail commande - // Product Ref - if (!empty($arrayfields['pr.ref']['checked'])) { - if (!empty($obj->product_rowid)) { - $generic_product->id = $obj->product_rowid; - $generic_product->ref = $obj->product_ref; - $generic_product->label = $obj->product_label; - $generic_product->status = $obj->product_status; - $generic_product->status_buy = $obj->product_status_buy; - $generic_product->status_batch = $obj->product_batch; - $generic_product->barcode = $obj->product_barcode; - print ''.$generic_product->getNomUrl(1).'Ligne libre'.$obj->description.''.dol_escape_htmltag($labelproduct).''.$obj->qty.''; diff --git a/htdocs/commande/list_line.php b/htdocs/commande/list_line.php new file mode 100644 index 00000000000..ac1885b03af --- /dev/null +++ b/htdocs/commande/list_line.php @@ -0,0 +1,2660 @@ + + * Copyright (C) 2004-2019 Laurent Destailleur + * Copyright (C) 2005 Marc Barilley / Ocebo + * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2012 Juanjo Menent + * Copyright (C) 2013 Christophe Battarel + * Copyright (C) 2013 Cédric Salvador + * Copyright (C) 2015-2018 Frédéric France + * Copyright (C) 2015 Marcos García + * Copyright (C) 2015 Jean-François Ferry + * Copyright (C) 2016-2021 Ferran Marcet + * Copyright (C) 2018 Charlene Benke + * Copyright (C) 2021-2022 Anthony Berton + * + * 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/commande/list.php + * \ingroup commande + * \brief Page to list orders + */ + +require '../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/discount.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; +if (!empty($conf->margin->enabled)) { + require_once DOL_DOCUMENT_ROOT.'/core/class/html.formmargin.class.php'; +} +require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; +require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; +require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; + +// Load translation files required by the page +$langs->loadLangs(array("orders", 'sendings', 'deliveries', 'companies', 'compta', 'bills', 'stocks', 'products')); + +$action = GETPOST('action', 'aZ09'); +$massaction = GETPOST('massaction', 'alpha'); +$show_files = GETPOST('show_files', 'int'); +$confirm = GETPOST('confirm', 'alpha'); +$toselect = GETPOST('toselect', 'array'); +$contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'orderlist'; + +$search_datecloture_start = GETPOST('search_datecloture_start', 'int'); +if (empty($search_datecloture_start)) { + $search_datecloture_start = dol_mktime(0, 0, 0, GETPOST('search_datecloture_startmonth', 'int'), GETPOST('search_datecloture_startday', 'int'), GETPOST('search_datecloture_startyear', 'int')); +} +$search_datecloture_end = GETPOST('search_datecloture_end', 'int'); +if (empty($search_datecloture_end)) { + $search_datecloture_end = dol_mktime(23, 59, 59, GETPOST('search_datecloture_endmonth', 'int'), GETPOST('search_datecloture_endday', 'int'), GETPOST('search_datecloture_endyear', 'int')); +} +$search_dateorder_start = dol_mktime(0, 0, 0, GETPOST('search_dateorder_start_month', 'int'), GETPOST('search_dateorder_start_day', 'int'), GETPOST('search_dateorder_start_year', 'int')); +$search_dateorder_end = dol_mktime(23, 59, 59, GETPOST('search_dateorder_end_month', 'int'), GETPOST('search_dateorder_end_day', 'int'), GETPOST('search_dateorder_end_year', 'int')); +$search_datedelivery_start = dol_mktime(0, 0, 0, GETPOST('search_datedelivery_start_month', 'int'), GETPOST('search_datedelivery_start_day', 'int'), GETPOST('search_datedelivery_start_year', 'int')); +$search_datedelivery_end = dol_mktime(23, 59, 59, GETPOST('search_datedelivery_end_month', 'int'), GETPOST('search_datedelivery_end_day', 'int'), GETPOST('search_datedelivery_end_year', 'int')); +$search_product_category = GETPOST('search_product_category', 'int'); + +// Détail commande +$search_refProduct = GETPOST('search_refProduct', 'alpha'); +$search_descProduct = GETPOST('search_descProduct', 'alpha'); +$check_orderdetail = GETPOST('check_orderdetail', 'alpha'); + +$search_ref = GETPOST('search_ref', 'alpha') != '' ?GETPOST('search_ref', 'alpha') : GETPOST('sref', 'alpha'); +$search_ref_customer = GETPOST('search_ref_customer', 'alpha'); +$search_company = GETPOST('search_company', 'alpha'); +$search_company_alias = GETPOST('search_company_alias', 'alpha'); +$search_town = GETPOST('search_town', 'alpha'); +$search_zip = GETPOST('search_zip', 'alpha'); +$search_state = GETPOST("search_state", 'alpha'); +$search_country = GETPOST("search_country", 'int'); +$search_type_thirdparty = GETPOST("search_type_thirdparty", 'int'); +$sall = trim((GETPOST('search_all', 'alphanohtml') != '') ? GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml')); +$socid = GETPOST('socid', 'int'); +$search_user = GETPOST('search_user', 'int'); +$search_sale = GETPOST('search_sale', 'int'); +$search_total_ht = GETPOST('search_total_ht', 'alpha'); +$search_total_vat = GETPOST('search_total_vat', 'alpha'); +$search_total_ttc = GETPOST('search_total_ttc', 'alpha'); +$search_warehouse = GETPOST('search_warehouse', 'int'); +$search_multicurrency_code = GETPOST('search_multicurrency_code', 'alpha'); +$search_multicurrency_tx = GETPOST('search_multicurrency_tx', 'alpha'); +$search_multicurrency_montant_ht = GETPOST('search_multicurrency_montant_ht', 'alpha'); +$search_multicurrency_montant_vat = GETPOST('search_multicurrency_montant_vat', 'alpha'); +$search_multicurrency_montant_ttc = GETPOST('search_multicurrency_montant_ttc', 'alpha'); +$search_login = GETPOST('search_login', 'alpha'); +$search_categ_cus = GETPOST("search_categ_cus", 'int'); +$optioncss = GETPOST('optioncss', 'alpha'); +$search_billed = GETPOSTISSET('search_billed') ? GETPOST('search_billed', 'int') : GETPOST('billed', 'int'); +$search_status = GETPOST('search_status', 'int'); +$search_btn = GETPOST('button_search', 'alpha'); +$search_remove_btn = GETPOST('button_removefilter', 'alpha'); +$search_project_ref = GETPOST('search_project_ref', 'alpha'); +$search_project = GETPOST('search_project', 'alpha'); +$search_shippable = GETPOST('search_shippable', 'aZ09'); +$search_fk_cond_reglement = GETPOST("search_fk_cond_reglement", 'int'); +$search_fk_shipping_method = GETPOST("search_fk_shipping_method", 'int'); +$search_fk_mode_reglement = GETPOST("search_fk_mode_reglement", 'int'); +$search_fk_input_reason = GETPOST("search_fk_input_reason", 'int'); + +// Security check +$id = (GETPOST('orderid') ?GETPOST('orderid', 'int') : GETPOST('id', 'int')); +if ($user->socid) { + $socid = $user->socid; +} +$result = restrictedArea($user, 'commande', $id, ''); + +$diroutputmassaction = $conf->commande->multidir_output[$conf->entity].'/temp/massgeneration/'.$user->id; + +// Load variable for pagination +$limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit; +$sortfield = GETPOST('sortfield', 'aZ09comma'); +$sortorder = GETPOST('sortorder', 'aZ09comma'); +$page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int'); +if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) { + $page = 0; +} // If $page is not defined, or '' or -1 or if we click on clear filters +$offset = $limit * $page; +$pageprev = $page - 1; +$pagenext = $page + 1; +if (!$sortfield) { + $sortfield = 'c.ref'; +} +if (!$sortorder) { + $sortorder = 'DESC'; +} + +$show_shippable_command = GETPOST('show_shippable_command', 'aZ09'); + +// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context +$object = new Commande($db); +$hookmanager->initHooks(array('orderlist')); +$extrafields = new ExtraFields($db); + +// fetch optionals attributes and labels +$extrafields->fetch_name_optionals_label($object->table_element); +$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_'); + +// List of fields to search into when doing a "search in all" +$fieldstosearchall = array( + 'c.ref'=>'Ref', + 'c.ref_client'=>'RefCustomerOrder', + 'pd.description'=>'Description', + 's.nom'=>"ThirdParty", + 's.name_alias'=>"AliasNameShort", + 's.zip'=>"Zip", + 's.town'=>"Town", + 'c.note_public'=>'NotePublic', +); +if (empty($user->socid)) { + $fieldstosearchall["c.note_private"] = "NotePrivate"; +} + +$checkedtypetiers = 0; +$arrayfields = array( + 'c.ref'=>array('label'=>"Ref", 'checked'=>1, 'position'=>5), + 'c.ref_client'=>array('label'=>"RefCustomerOrder", 'checked'=>-1, 'position'=>10), + 'p.ref'=>array('label'=>"ProjectRef", 'checked'=>-1, 'enabled'=>(empty($conf->project->enabled) ? 0 : 1), 'position'=>20), + 'p.title'=>array('label'=>"ProjectLabel", 'checked'=>0, 'enabled'=>(empty($conf->project->enabled) ? 0 : 1), 'position'=>25), + 's.nom'=>array('label'=>"ThirdParty", 'checked'=>1, 'position'=>30), + 's.name_alias'=>array('label'=>"AliasNameShort", 'checked'=>-1, 'position'=>31), + 's.town'=>array('label'=>"Town", 'checked'=>-1, 'position'=>35), + 's.zip'=>array('label'=>"Zip", 'checked'=>-1, 'position'=>40), + 'state.nom'=>array('label'=>"StateShort", 'checked'=>0, 'position'=>45), + 'country.code_iso'=>array('label'=>"Country", 'checked'=>0, 'position'=>50), + 'typent.code'=>array('label'=>"ThirdPartyType", 'checked'=>$checkedtypetiers, 'position'=>55), + 'c.date_commande'=>array('label'=>"OrderDateShort", 'checked'=>1, 'position'=>60), + 'c.date_delivery'=>array('label'=>"DateDeliveryPlanned", 'checked'=>1, 'enabled'=>empty($conf->global->ORDER_DISABLE_DELIVERY_DATE), 'position'=>65), + 'c.fk_shipping_method'=>array('label'=>"SendingMethod", 'checked'=>-1, 'position'=>66 , 'enabled'=>!empty($conf->expedition->enabled)), + 'c.fk_cond_reglement'=>array('label'=>"PaymentConditionsShort", 'checked'=>-1, 'position'=>67), + 'c.fk_mode_reglement'=>array('label'=>"PaymentMode", 'checked'=>-1, 'position'=>68), + 'c.fk_input_reason'=>array('label'=>"Channel", 'checked'=>-1, 'position'=>69), + 'c.total_ht'=>array('label'=>"AmountHT", 'checked'=>1, 'position'=>75), + 'c.total_vat'=>array('label'=>"AmountVAT", 'checked'=>0, 'position'=>80), + 'c.total_ttc'=>array('label'=>"AmountTTC", 'checked'=>0, 'position'=>85), + 'c.multicurrency_code'=>array('label'=>'Currency', 'checked'=>0, 'enabled'=>(empty($conf->multicurrency->enabled) ? 0 : 1), 'position'=>90), + 'c.multicurrency_tx'=>array('label'=>'CurrencyRate', 'checked'=>0, 'enabled'=>(empty($conf->multicurrency->enabled) ? 0 : 1), 'position'=>95), + 'c.multicurrency_total_ht'=>array('label'=>'MulticurrencyAmountHT', 'checked'=>0, 'enabled'=>(empty($conf->multicurrency->enabled) ? 0 : 1), 'position'=>100), + 'c.multicurrency_total_vat'=>array('label'=>'MulticurrencyAmountVAT', 'checked'=>0, 'enabled'=>(empty($conf->multicurrency->enabled) ? 0 : 1), 'position'=>105), + 'c.multicurrency_total_ttc'=>array('label'=>'MulticurrencyAmountTTC', 'checked'=>0, 'enabled'=>(empty($conf->multicurrency->enabled) ? 0 : 1), 'position'=>110), + 'u.login'=>array('label'=>"Author", 'checked'=>1, 'position'=>115), + 'sale_representative'=>array('label'=>"SaleRepresentativesOfThirdParty", 'checked'=>0, 'position'=>116), + 'total_pa' => array('label' => (getDolGlobalString('MARGIN_TYPE') == '1' ? 'BuyingPrice' : 'CostPrice'), 'checked' => 0, 'position' => 300, 'enabled' => (empty($conf->margin->enabled) || !$user->rights->margins->liretous ? 0 : 1)), + 'total_margin' => array('label' => 'Margin', 'checked' => 0, 'position' => 301, 'enabled' => (empty($conf->margin->enabled) || !$user->rights->margins->liretous ? 0 : 1)), + 'total_margin_rate' => array('label' => 'MarginRate', 'checked' => 0, 'position' => 302, 'enabled' => (empty($conf->margin->enabled) || !$user->rights->margins->liretous || empty($conf->global->DISPLAY_MARGIN_RATES) ? 0 : 1)), + 'total_mark_rate' => array('label' => 'MarkRate', 'checked' => 0, 'position' => 303, 'enabled' => (empty($conf->margin->enabled) || !$user->rights->margins->liretous || empty($conf->global->DISPLAY_MARK_RATES) ? 0 : 1)), + 'c.datec'=>array('label'=>"DateCreation", 'checked'=>0, 'position'=>120), + 'c.tms'=>array('label'=>"DateModificationShort", 'checked'=>0, 'position'=>125), + 'c.date_cloture'=>array('label'=>"DateClosing", 'checked'=>0, 'position'=>130), + 'c.note_public'=>array('label'=>'NotePublic', 'checked'=>0, 'enabled'=>(empty($conf->global->MAIN_LIST_ALLOW_PUBLIC_NOTES)), 'position'=>135), + 'c.note_private'=>array('label'=>'NotePrivate', 'checked'=>0, 'enabled'=>(empty($conf->global->MAIN_LIST_ALLOW_PRIVATE_NOTES)), 'position'=>140), + 'shippable'=>array('label'=>"Shippable", 'checked'=>1,'enabled'=>(!empty($conf->expedition->enabled)), 'position'=>990), + 'c.facture'=>array('label'=>"Billed", 'checked'=>1, 'enabled'=>(empty($conf->global->WORKFLOW_BILL_ON_SHIPMENT)), 'position'=>995), + 'c.import_key' =>array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>1, 'visible'=>-2, 'position'=>999), + 'c.fk_statut'=>array('label'=>"Status", 'checked'=>1, 'position'=>1000) +); + +// Détail commande +if (!empty($check_orderdetail)) { + $arrayfields['cdet.qty'] = array('label'=>'QtyOrdered', 'checked'=>1, 'position'=>1); + $arrayfields['pr.desc'] = array('label'=>'ProductDescription', 'checked'=>1, 'position'=>1); + $arrayfields['pr.ref'] = array('label'=>'ProductRef', 'checked'=>1, 'position'=>1); +} + +// Extra fields +include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php'; + +$object->fields = dol_sort_array($object->fields, 'position'); +$arrayfields = dol_sort_array($arrayfields, 'position'); + + + +/* + * Actions + */ + +if (GETPOST('cancel', 'alpha')) { + $action = 'list'; $massaction = ''; +} +if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend' && $massaction != 'confirm_createbills') { + $massaction = ''; +} + +$parameters = array('socid'=>$socid); +$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks +if ($reshook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); +} + +if (empty($reshook)) { + // Selection of new fields + include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php'; + + // Purge search criteria + if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers + $search_categ = ''; + $search_user = ''; + $search_sale = ''; + $search_product_category = ''; + $search_refProduct = ''; + $search_descProduct = ''; + $search_ref = ''; + $search_ref_customer = ''; + $search_company = ''; + $search_company_alias = ''; + $search_town = ''; + $search_zip = ""; + $search_state = ""; + $search_type = ''; + $search_country = ''; + $search_type_thirdparty = ''; + $search_total_ht = ''; + $search_total_vat = ''; + $search_total_ttc = ''; + $search_warehouse = ''; + $search_multicurrency_code = ''; + $search_multicurrency_tx = ''; + $search_multicurrency_montant_ht = ''; + $search_multicurrency_montant_vat = ''; + $search_multicurrency_montant_ttc = ''; + $search_login = ''; + $search_dateorder_start = ''; + $search_dateorder_end = ''; + $search_datedelivery_start = ''; + $search_datedelivery_end = ''; + $search_project_ref = ''; + $search_project = ''; + $search_status = ''; + $search_billed = ''; + $toselect = array(); + $search_array_options = array(); + $search_categ_cus = 0; + $search_datecloture_start = ''; + $search_datecloture_end = ''; + $search_fk_cond_reglement = ''; + $search_fk_shipping_method = ''; + $search_fk_mode_reglement = ''; + $search_fk_input_reason = ''; + } + if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha') + || GETPOST('button_search_x', 'alpha') || GETPOST('button_search.x', 'alpha') || GETPOST('button_search', 'alpha')) { + $massaction = ''; // Protection to avoid mass action if we force a new search during a mass action confirmation + } + + // Mass actions + $objectclass = 'Commande'; + $objectlabel = 'Orders'; + $permissiontoread = $user->rights->commande->lire; + $permissiontoadd = $user->rights->commande->creer; + $permissiontodelete = $user->rights->commande->supprimer; + if (!empty($conf->global->MAIN_USE_ADVANCED_PERMS)) { + $permissiontovalidate = $user->rights->commande->order_advance->validate; + $permissiontoclose = $user->rights->commande->order_advance->close; + $permissiontocancel = $user->rights->commande->order_advance->annuler; + $permissiontosendbymail = $user->rights->commande->order_advance->send; + } else { + $permissiontovalidate = $user->rights->commande->creer; + $permissiontoclose = $user->rights->commande->creer; + $permissiontocancel = $user->rights->commande->creer; + $permissiontosendbymail = $user->rights->commande->creer; + } + $uploaddir = $conf->commande->multidir_output[$conf->entity]; + $triggersendname = 'ORDER_SENTBYMAIL'; + include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php'; + + if ($massaction == 'confirm_createbills') { // Create bills from orders. + $orders = GETPOST('toselect', 'array'); + $createbills_onebythird = GETPOST('createbills_onebythird', 'int'); + $validate_invoices = GETPOST('validate_invoices', 'int'); + + $errors = array(); + + $TFact = array(); + $TFactThird = array(); + $TFactThirdNbLines = array(); + + $nb_bills_created = 0; + $lastid= 0; + $lastref = ''; + + $db->begin(); + + $nbOrders = is_array($orders) ? count($orders) : 1; + + foreach ($orders as $id_order) { + $cmd = new Commande($db); + if ($cmd->fetch($id_order) <= 0) { + continue; + } + $cmd->fetch_thirdparty(); + + $objecttmp = new Facture($db); + if (!empty($createbills_onebythird) && !empty($TFactThird[$cmd->socid])) { + // If option "one bill per third" is set, and an invoice for this thirdparty was already created, we re-use it. + $objecttmp = $TFactThird[$cmd->socid]; + } else { + // If we want one invoice per order or if there is no first invoice yet for this thirdparty. + $objecttmp->socid = $cmd->socid; + $objecttmp->thirdparty = $cmd->thirdparty; + + $objecttmp->type = $objecttmp::TYPE_STANDARD; + $objecttmp->cond_reglement_id = !empty($cmd->cond_reglement_id) ? $cmd->cond_reglement_id : $cmd->thirdparty->cond_reglement_id; + $objecttmp->mode_reglement_id = !empty($cmd->mode_reglement_id) ? $cmd->mode_reglement_id : $cmd->thirdparty->mode_reglement_id; + + $objecttmp->fk_project = $cmd->fk_project; + $objecttmp->multicurrency_code = $cmd->multicurrency_code; + if (empty($createbills_onebythird)) { + $objecttmp->ref_client = $cmd->ref_client; + } + + $datefacture = dol_mktime(12, 0, 0, GETPOST('remonth', 'int'), GETPOST('reday', 'int'), GETPOST('reyear', 'int')); + if (empty($datefacture)) { + $datefacture = dol_now(); + } + + $objecttmp->date = $datefacture; + $objecttmp->origin = 'commande'; + $objecttmp->origin_id = $id_order; + + $objecttmp->array_options = $cmd->array_options; // Copy extrafields + + $res = $objecttmp->create($user); + + if ($res > 0) { + $nb_bills_created++; + $lastref = $objecttmp->ref; + $lastid = $objecttmp->id; + + $TFactThird[$cmd->socid] = $objecttmp; + $TFactThirdNbLines[$cmd->socid] = 0; //init nblines to have lines ordered by expedition and rang + } else { + $langs->load("errors"); + $errors[] = $cmd->ref.' : '.$langs->trans($objecttmp->errors[0]); + $error++; + } + } + + if ($objecttmp->id > 0) { + $res = $objecttmp->add_object_linked($objecttmp->origin, $id_order); + + if ($res == 0) { + $errors[] = $cmd->ref.' : '.$langs->trans($objecttmp->errors[0]); + $error++; + } + + if (!$error) { + $lines = $cmd->lines; + if (empty($lines) && method_exists($cmd, 'fetch_lines')) { + $cmd->fetch_lines(); + $lines = $cmd->lines; + } + + $fk_parent_line = 0; + $num = count($lines); + + for ($i = 0; $i < $num; $i++) { + $desc = ($lines[$i]->desc ? $lines[$i]->desc : ''); + // If we build one invoice for several orders, we must put the ref of order on the invoice line + if (!empty($createbills_onebythird)) { + $desc = dol_concatdesc($desc, $langs->trans("Order").' '.$cmd->ref.' - '.dol_print_date($cmd->date, 'day')); + } + + if ($lines[$i]->subprice < 0) { + // Negative line, we create a discount line + $discount = new DiscountAbsolute($db); + $discount->fk_soc = $objecttmp->socid; + $discount->amount_ht = abs($lines[$i]->total_ht); + $discount->amount_tva = abs($lines[$i]->total_tva); + $discount->amount_ttc = abs($lines[$i]->total_ttc); + $discount->tva_tx = $lines[$i]->tva_tx; + $discount->fk_user = $user->id; + $discount->description = $desc; + $discountid = $discount->create($user); + if ($discountid > 0) { + $result = $objecttmp->insert_discount($discountid); + //$result=$discount->link_to_invoice($lineid,$id); + } else { + setEventMessages($discount->error, $discount->errors, 'errors'); + $error++; + break; + } + } else { + // Positive line + $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0); + // Date start + $date_start = false; + if ($lines[$i]->date_debut_prevue) { + $date_start = $lines[$i]->date_debut_prevue; + } + if ($lines[$i]->date_debut_reel) { + $date_start = $lines[$i]->date_debut_reel; + } + if ($lines[$i]->date_start) { + $date_start = $lines[$i]->date_start; + } + //Date end + $date_end = false; + if ($lines[$i]->date_fin_prevue) { + $date_end = $lines[$i]->date_fin_prevue; + } + if ($lines[$i]->date_fin_reel) { + $date_end = $lines[$i]->date_fin_reel; + } + if ($lines[$i]->date_end) { + $date_end = $lines[$i]->date_end; + } + // Reset fk_parent_line for no child products and special product + if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) { + $fk_parent_line = 0; + } + + // Extrafields + if (method_exists($lines[$i], 'fetch_optionals')) { + $lines[$i]->fetch_optionals(); + $array_options = $lines[$i]->array_options; + } + + $objecttmp->context['createfromclone']; + + $rang = ($nbOrders > 1) ? -1 : $lines[$i]->rang; + //there may already be rows from previous orders + if (!empty($createbills_onebythird)) { + $rang = $TFactThirdNbLines[$cmd->socid]; + } + + $result = $objecttmp->addline( + $desc, + $lines[$i]->subprice, + $lines[$i]->qty, + $lines[$i]->tva_tx, + $lines[$i]->localtax1_tx, + $lines[$i]->localtax2_tx, + $lines[$i]->fk_product, + $lines[$i]->remise_percent, + $date_start, + $date_end, + 0, + $lines[$i]->info_bits, + $lines[$i]->fk_remise_except, + 'HT', + 0, + $product_type, + $rang, + $lines[$i]->special_code, + $objecttmp->origin, + $lines[$i]->rowid, + $fk_parent_line, + $lines[$i]->fk_fournprice, + $lines[$i]->pa_ht, + $lines[$i]->label, + $array_options, + 100, + 0, + $lines[$i]->fk_unit + ); + if ($result > 0) { + $lineid = $result; + if (!empty($createbills_onebythird)) //increment rang to keep order + $TFactThirdNbLines[$rcp->socid]++; + } else { + $lineid = 0; + $error++; + break; + } + // Defined the new fk_parent_line + if ($result > 0 && $lines[$i]->product_type == 9) { + $fk_parent_line = $result; + } + } + } + } + } + + //$cmd->classifyBilled($user); // Disabled. This behavior must be set or not using the workflow module. + + if (!empty($createbills_onebythird) && empty($TFactThird[$cmd->socid])) { + $TFactThird[$cmd->socid] = $objecttmp; + } else { + $TFact[$objecttmp->id] = $objecttmp; + } + } + + // Build doc with all invoices + $TAllFact = empty($createbills_onebythird) ? $TFact : $TFactThird; + $toselect = array(); + + if (!$error && $validate_invoices) { + $massaction = $action = 'builddoc'; + + foreach ($TAllFact as &$objecttmp) { + $result = $objecttmp->validate($user); + if ($result <= 0) { + $error++; + setEventMessages($objecttmp->error, $objecttmp->errors, 'errors'); + break; + } + + $id = $objecttmp->id; // For builddoc action + + // Builddoc + $donotredirect = 1; + $upload_dir = $conf->facture->dir_output; + $permissiontoadd = $user->rights->facture->creer; + + // Call action to build doc + $savobject = $object; + $object = $objecttmp; + include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php'; + $object = $savobject; + } + + $massaction = $action = 'confirm_createbills'; + } + + if (!$error) { + $db->commit(); + + if ($nb_bills_created == 1) { + $texttoshow = $langs->trans('BillXCreated', '{s1}'); + $texttoshow = str_replace('{s1}', ''.$lastref.'', $texttoshow); + setEventMessages($texttoshow, null, 'mesgs'); + } else { + setEventMessages($langs->trans('BillCreated', $nb_bills_created), null, 'mesgs'); + } + + // Make a redirect to avoid to bill twice if we make a refresh or back + $param = ''; + if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { + $param .= '&contextpage='.urlencode($contextpage); + } + if ($limit > 0 && $limit != $conf->liste_limit) { + $param .= '&limit='.urlencode($limit); + } + if ($sall) { + $param .= '&sall='.urlencode($sall); + } + if ($socid > 0) { + $param .= '&socid='.urlencode($socid); + } + if ($search_status != '') { + $param .= '&search_status='.urlencode($search_status); + } + if ($search_orderday) { + $param .= '&search_orderday='.urlencode($search_orderday); + } + if ($search_ordermonth) { + $param .= '&search_ordermonth='.urlencode($search_ordermonth); + } + if ($search_orderyear) { + $param .= '&search_orderyear='.urlencode($search_orderyear); + } + if ($search_deliveryday) { + $param .= '&search_deliveryday='.urlencode($search_deliveryday); + } + if ($search_deliverymonth) { + $param .= '&search_deliverymonth='.urlencode($search_deliverymonth); + } + if ($search_deliveryyear) { + $param .= '&search_deliveryyear='.urlencode($search_deliveryyear); + } + if ($search_ref) { + $param .= '&search_ref='.urlencode($search_ref); + } + if ($search_company) { + $param .= '&search_company='.urlencode($search_company); + } + if ($search_ref_customer) { + $param .= '&search_ref_customer='.urlencode($search_ref_customer); + } + if ($search_user > 0) { + $param .= '&search_user='.urlencode($search_user); + } + if ($search_sale > 0) { + $param .= '&search_sale='.urlencode($search_sale); + } + if ($search_total_ht != '') { + $param .= '&search_total_ht='.urlencode($search_total_ht); + } + if ($search_total_vat != '') { + $param .= '&search_total_vat='.urlencode($search_total_vat); + } + if ($search_total_ttc != '') { + $param .= '&search_total_ttc='.urlencode($search_total_ttc); + } + if ($search_project_ref >= 0) { + $param .= "&search_project_ref=".urlencode($search_project_ref); + } + if ($show_files) { + $param .= '&show_files='.urlencode($show_files); + } + if ($optioncss != '') { + $param .= '&optioncss='.urlencode($optioncss); + } + if ($billed != '') { + $param .= '&billed='.urlencode($billed); + } + + header("Location: ".$_SERVER['PHP_SELF'].'?'.$param); + exit; + } else { + $db->rollback(); + + $action = 'create'; + $_GET["origin"] = $_POST["origin"]; + $_GET["originid"] = $_POST["originid"]; + if (!empty($errors)) { + setEventMessages(null, $errors, 'errors'); + } else { + setEventMessages("Error", null, 'errors'); + } + $error++; + } + } +} +if ($action == 'validate' && $permissiontoadd) { + if (GETPOST('confirm') == 'yes') { + $objecttmp = new $objectclass($db); + $db->begin(); + $error = 0; + foreach ($toselect as $checked) { + if ($objecttmp->fetch($checked)) { + if ($objecttmp->statut == 0) { + if (!empty($objecttmp->fk_warehouse)) { + $idwarehouse = $objecttmp->fk_warehouse; + } else { + $idwarehouse = 0; + } + if ($objecttmp->valid($user, $idwarehouse)) { + setEventMessage($langs->trans('hasBeenValidated', $objecttmp->ref), 'mesgs'); + } else { + setEventMessage($objecttmp->error, $objecttmp->errors, 'errors'); + $error++; + } + } else { + $langs->load("errors"); + setEventMessage($langs->trans('ErrorIsNotADraft', $objecttmp->ref), 'errors'); + $error++; + } + } else { + dol_print_error($db); + $error++; + } + } + if ($error) { + $db->rollback(); + } else { + $db->commit(); + } + } +} +if ($action == 'shipped' && $permissiontoadd) { + if (GETPOST('confirm') == 'yes') { + $objecttmp = new $objectclass($db); + $db->begin(); + $error = 0; + foreach ($toselect as $checked) { + if ($objecttmp->fetch($checked)) { + if ($objecttmp->statut == 1 || $objecttmp->statut == 2) { + if ($objecttmp->cloture($user)) { + setEventMessage($langs->trans('PassedInClosedStatus', $objecttmp->ref), 'mesgs'); + } else { + setEventMessage($langs->trans('CantBeClosed'), 'errors'); + $error++; + } + } else { + $langs->load("errors"); + setEventMessage($langs->trans('ErrorIsNotADraft', $objecttmp->ref), 'errors'); + $error++; + } + } else { + dol_print_error($db); + $error++; + } + } + if ($error) { + $db->rollback(); + } else { + $db->commit(); + } + } +} +// Closed records +if (!$error && $massaction === 'setbilled' && $permissiontoclose) { + $db->begin(); + + $objecttmp = new $objectclass($db); + $nbok = 0; + foreach ($toselect as $toselectid) { + $result = $objecttmp->fetch($toselectid); + if ($result > 0) { + $result = $objecttmp->classifyBilled($user, 0); + if ($result <= 0) { + setEventMessages($objecttmp->error, $objecttmp->errors, 'errors'); + $error++; + break; + } else { + $nbok++; + } + } else { + setEventMessages($objecttmp->error, $objecttmp->errors, 'errors'); + $error++; + break; + } + } + + if (!$error) { + if ($nbok > 1) { + setEventMessages($langs->trans("RecordsModified", $nbok), null, 'mesgs'); + } else { + setEventMessages($langs->trans("RecordsModified", $nbok), null, 'mesgs'); + } + $db->commit(); + } else { + $db->rollback(); + } +} + +/* + * View + */ + +$now = dol_now(); + +$form = new Form($db); +$formother = new FormOther($db); +$formfile = new FormFile($db); +$formmargin = null; +if (!empty($conf->margin->enabled)) { + $formmargin = new FormMargin($db); +} +$companystatic = new Societe($db); +$formcompany = new FormCompany($db); +$projectstatic = new Project($db); + +$title = $langs->trans("Orders"); +$help_url = "EN:Module_Customers_Orders|FR:Module_Commandes_Clients|ES:Módulo_Pedidos_de_clientes"; +// llxHeader('',$title,$help_url); + +$sql = 'SELECT'; +if ($sall || $search_product_category > 0 || $search_user > 0) { + $sql = 'SELECT DISTINCT'; +} +$sql .= ' s.rowid as socid, s.nom as name, s.name_alias as alias, s.email, s.phone, s.fax, s.address, s.town, s.zip, s.fk_pays, s.client, s.code_client,'; +$sql .= " typent.code as typent_code,"; +$sql .= " state.code_departement as state_code, state.nom as state_name,"; +$sql .= " country.code as country_code,"; +$sql .= ' c.rowid, c.ref, c.total_ht, c.total_tva, c.total_ttc, c.ref_client, c.fk_user_author,'; +$sql .= ' c.fk_multicurrency, c.multicurrency_code, c.multicurrency_tx, c.multicurrency_total_ht, c.multicurrency_total_tva as multicurrency_total_vat, c.multicurrency_total_ttc,'; +$sql .= ' c.date_valid, c.date_commande, c.note_public, c.note_private, c.date_livraison as date_delivery, c.fk_statut, c.facture as billed,'; +$sql .= ' c.date_creation as date_creation, c.tms as date_update, c.date_cloture as date_cloture,'; +$sql .= ' p.rowid as project_id, p.ref as project_ref, p.title as project_label,'; +$sql .= ' u.login, u.lastname, u.firstname, u.email as user_email, u.statut as user_statut, u.entity, u.photo, u.office_phone, u.office_fax, u.user_mobile, u.job, u.gender,'; +$sql .= ' c.fk_cond_reglement,c.deposit_percent,c.fk_mode_reglement,c.fk_shipping_method,'; +$sql .= ' c.fk_input_reason, c.import_key'; + +// Détail commande +if (!empty($check_orderdetail)) { + $sql .= ', cdet.description, cdet.qty, '; + $sql .= ' pr.rowid as product_rowid, pr.ref as product_ref, pr.label as product_label, pr.barcode as product_barcode, pr.tobatch as product_batch, pr.tosell as product_status, pr.tobuy as product_status_buy'; +} + +if (($search_categ_cus > 0) || ($search_categ_cus == -2)) { + $sql .= ", cc.fk_categorie, cc.fk_soc"; +} +// Add fields from extrafields +if (!empty($extrafields->attributes[$object->table_element]['label'])) { + foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) { + $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : ''); + } +} +// Add fields from hooks +$parameters = array(); +$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters); // Note that $action and $object may have been modified by hook +$sql .= $hookmanager->resPrint; +$sql .= ' FROM '.MAIN_DB_PREFIX.'societe as s'; +$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as country on (country.rowid = s.fk_pays)"; +$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_typent as typent on (typent.id = s.fk_typent)"; +$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as state on (state.rowid = s.fk_departement)"; +if (($search_categ_cus > 0) || ($search_categ_cus == -2)) { + $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX."categorie_societe as cc ON s.rowid = cc.fk_soc"; // We'll need this table joined to the select in order to filter by categ +} + +// Détail commande +if (!empty($check_orderdetail)) { + $sql .= ', '.MAIN_DB_PREFIX.'commandedet as cdet'; + $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'commande as c ON cdet.fk_commande=c.rowid'; + $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'product as pr ON pr.rowid=cdet.fk_product'; +} else { + $sql .= ', '.MAIN_DB_PREFIX.'commande as c'; +} + +if (!empty($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) { + $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."commande_extrafields as ef on (c.rowid = ef.fk_object)"; +} +if ($sall || $search_product_category > 0) { + $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'commandedet as pd ON c.rowid=pd.fk_commande'; +} +if ($search_product_category > 0) { + $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_product as cp ON cp.fk_product=pd.fk_product'; +} +$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."projet as p ON p.rowid = c.fk_projet"; +$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'user as u ON c.fk_user_author = u.rowid'; + +// We'll need this table joined to the select in order to filter by sale +if ($search_sale > 0 || (empty($user->rights->societe->client->voir) && !$socid)) { + $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; +} +if ($search_user > 0) { + $sql .= ", ".MAIN_DB_PREFIX."element_contact as ec"; + $sql .= ", ".MAIN_DB_PREFIX."c_type_contact as tc"; +} + +// Add table from hooks +$parameters = array(); +$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object); // Note that $action and $object may have been modified by hook +$sql .= $hookmanager->resPrint; + +$sql .= ' WHERE c.fk_soc = s.rowid'; +$sql .= ' AND c.entity IN ('.getEntity('commande').')'; +if ($search_product_category > 0) { + $sql .= " AND cp.fk_categorie = ".((int) $search_product_category); +} +if ($socid > 0) { + $sql .= ' AND s.rowid = '.((int) $socid); +} +if (empty($user->rights->societe->client->voir) && !$socid) { + $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id); +} +if ($search_refProduct) { + $sql .= natural_search('pr.ref', $search_refProduct); +} +if ($search_descProduct) { + $sql .= natural_search('pr.label', $search_descProduct); + $sql .= natural_search('cdet.description', $search_descProduct); +} +if ($search_ref) { + $sql .= natural_search('c.ref', $search_ref); +} +if ($search_ref_customer) { + $sql .= natural_search('c.ref_client', $search_ref_customer); +} +if ($sall) { + $sql .= natural_search(array_keys($fieldstosearchall), $sall); +} +if ($search_billed != '' && $search_billed >= 0) { + $sql .= ' AND c.facture = '.((int) $search_billed); +} +if ($search_status <> '') { + if ($search_status <= 3 && $search_status >= -1) { // status from -1 to 3 are real status (other are virtual combination) + if ($search_status == 1 && empty($conf->expedition->enabled)) { + $sql .= ' AND c.fk_statut IN (1,2)'; // If module expedition disabled, we include order with status 'sending in process' into 'validated' + } else { + $sql .= ' AND c.fk_statut = '.((int) $search_status); // brouillon, validee, en cours, annulee + } + } + if ($search_status == -2) { // To process + //$sql.= ' AND c.fk_statut IN (1,2,3) AND c.facture = 0'; + $sql .= " AND ((c.fk_statut IN (1,2)) OR (c.fk_statut = 3 AND c.facture = 0))"; // If status is 2 and facture=1, it must be selected + } + if ($search_status == -3) { // To bill + //$sql.= ' AND c.fk_statut in (1,2,3)'; + //$sql.= ' AND c.facture = 0'; // invoice not created + $sql .= ' AND ((c.fk_statut IN (1,2)) OR (c.fk_statut = 3 AND c.facture = 0))'; // validated, in process or closed but not billed + } + if ($search_status == -4) { // "validate and in progress" + $sql .= ' AND (c.fk_statut IN (1,2))'; // validated, in process + } +} + +if ($search_datecloture_start) { + $sql .= " AND c.date_cloture >= '".$db->idate($search_datecloture_start)."'"; +} +if ($search_datecloture_end) { + $sql .= " AND c.date_cloture <= '".$db->idate($search_datecloture_end)."'"; +} +if ($search_dateorder_start) { + $sql .= " AND c.date_commande >= '".$db->idate($search_dateorder_start)."'"; +} +if ($search_dateorder_end) { + $sql .= " AND c.date_commande <= '".$db->idate($search_dateorder_end)."'"; +} +if ($search_datedelivery_start) { + $sql .= " AND c.date_livraison >= '".$db->idate($search_datedelivery_start)."'"; +} +if ($search_datedelivery_end) { + $sql .= " AND c.date_livraison <= '".$db->idate($search_datedelivery_end)."'"; +} +if ($search_town) { + $sql .= natural_search('s.town', $search_town); +} +if ($search_zip) { + $sql .= natural_search("s.zip", $search_zip); +} +if ($search_state) { + $sql .= natural_search("state.nom", $search_state); +} +if ($search_country) { + $sql .= " AND s.fk_pays IN (".$db->sanitize($search_country).')'; +} +if ($search_type_thirdparty && $search_type_thirdparty != '-1') { + $sql .= " AND s.fk_typent IN (".$db->sanitize($search_type_thirdparty).')'; +} +if ($search_company) { + $sql .= natural_search('s.nom', $search_company); +} +if ($search_company_alias) { + $sql .= natural_search('s.name_alias', $search_company_alias); +} +if ($search_sale > 0) { + $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $search_sale); +} +if ($search_user > 0) { + $sql .= " AND ec.fk_c_type_contact = tc.rowid AND tc.element='commande' AND tc.source='internal' AND ec.element_id = c.rowid AND ec.fk_socpeople = ".((int) $search_user); +} +if ($search_total_ht != '') { + $sql .= natural_search('c.total_ht', $search_total_ht, 1); +} +if ($search_total_vat != '') { + $sql .= natural_search('c.total_tva', $search_total_vat, 1); +} +if ($search_total_ttc != '') { + $sql .= natural_search('c.total_ttc', $search_total_ttc, 1); +} +if ($search_warehouse != '' && $search_warehouse > 0) { + $sql .= natural_search('c.fk_warehouse', $search_warehouse, 1); +} +if ($search_multicurrency_code != '') { + $sql .= " AND c.multicurrency_code = '".$db->escape($search_multicurrency_code)."'"; +} +if ($search_multicurrency_tx != '') { + $sql .= natural_search('c.multicurrency_tx', $search_multicurrency_tx, 1); +} +if ($search_multicurrency_montant_ht != '') { + $sql .= natural_search('c.multicurrency_total_ht', $search_multicurrency_montant_ht, 1); +} +if ($search_multicurrency_montant_vat != '') { + $sql .= natural_search('c.multicurrency_total_tva', $search_multicurrency_montant_vat, 1); +} +if ($search_multicurrency_montant_ttc != '') { + $sql .= natural_search('c.multicurrency_total_ttc', $search_multicurrency_montant_ttc, 1); +} +if ($search_login) { + $sql .= natural_search(array("u.login", "u.firstname", "u.lastname"), $search_login); +} +if ($search_project_ref != '') { + $sql .= natural_search("p.ref", $search_project_ref); +} +if ($search_project != '') { + $sql .= natural_search("p.title", $search_project); +} +if ($search_categ_cus > 0) { + $sql .= " AND cc.fk_categorie = ".((int) $search_categ_cus); +} +if ($search_categ_cus == -2) { + $sql .= " AND cc.fk_categorie IS NULL"; +} +if ($search_fk_cond_reglement > 0) { + $sql .= " AND c.fk_cond_reglement = ".((int) $search_fk_cond_reglement); +} +if ($search_fk_shipping_method > 0) { + $sql .= " AND c.fk_shipping_method = ".((int) $search_fk_shipping_method); +} +if ($search_fk_mode_reglement > 0) { + $sql .= " AND c.fk_mode_reglement = ".((int) $search_fk_mode_reglement); +} +if ($search_fk_input_reason > 0) { + $sql .= " AND c.fk_input_reason = ".((int) $search_fk_input_reason); +} + +// Add where from extra fields +include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php'; +// Add where from hooks +$parameters = array(); +$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters); // Note that $action and $object may have been modified by hook +$sql .= $hookmanager->resPrint; + +// Add HAVING from hooks +$parameters = array(); +$reshook = $hookmanager->executeHooks('printFieldListHaving', $parameters, $object); // Note that $action and $object may have been modified by hook +$sql .= empty($hookmanager->resPrint) ? "" : " HAVING 1=1 ".$hookmanager->resPrint; + +$sql .= $db->order($sortfield, $sortorder); + +// Count total nb of records +$nbtotalofrecords = ''; +if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) { + $result = $db->query($sql); + $nbtotalofrecords = $db->num_rows($result); + + if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0 + $page = 0; + $offset = 0; + } +} + +$sql .= $db->plimit($limit + 1, $offset); +//print $sql; + +$resql = $db->query($sql); +if ($resql) { + if ($socid > 0) { + $soc = new Societe($db); + $soc->fetch($socid); + $title = $langs->trans('CustomersOrders').' - '.$soc->name; + if (empty($search_company)) { + $search_company = $soc->name; + } + } else { + $title = $langs->trans('CustomersOrders'); + } + if (strval($search_status) == '0') { + $title .= ' - '.$langs->trans('StatusOrderDraftShort'); + } + if ($search_status == 1) { + $title .= ' - '.$langs->trans('StatusOrderValidatedShort'); + } + if ($search_status == 2) { + $title .= ' - '.$langs->trans('StatusOrderSentShort'); + } + if ($search_status == 3) { + $title .= ' - '.$langs->trans('StatusOrderToBillShort'); + } + if ($search_status == -1) { + $title .= ' - '.$langs->trans('StatusOrderCanceledShort'); + } + if ($search_status == -2) { + $title .= ' - '.$langs->trans('StatusOrderToProcessShort'); + } + if ($search_status == -3) { + $title .= ' - '.$langs->trans('StatusOrderValidated').', '.(empty($conf->expedition->enabled) ? '' : $langs->trans("StatusOrderSent").', ').$langs->trans('StatusOrderToBill'); + } + if ($search_status == -4) { + $title .= ' - '.$langs->trans("StatusOrderValidatedShort").'+'.$langs->trans("StatusOrderSentShort"); + } + + $num = $db->num_rows($resql); + + $arrayofselected = is_array($toselect) ? $toselect : array(); + + if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $sall) { + $obj = $db->fetch_object($resql); + $id = $obj->rowid; + header("Location: ".DOL_URL_ROOT.'/commande/card.php?id='.$id); + exit; + } + + llxHeader('', $title, $help_url); + + $param = ''; + + if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { + $param .= '&contextpage='.urlencode($contextpage); + } + if ($limit > 0 && $limit != $conf->liste_limit) { + $param .= '&limit='.urlencode($limit); + } + if ($sall) { + $param .= '&sall='.urlencode($sall); + } + if ($socid > 0) { + $param .= '&socid='.urlencode($socid); + } + if ($search_status != '') { + $param .= '&search_status='.urlencode($search_status); + } + if ($search_datecloture_start) { + $param .= '&search_datecloture_startday='.dol_print_date($search_datecloture_start, '%d').'&search_datecloture_startmonth='.dol_print_date($search_datecloture_start, '%m').'&search_datecloture_startyear='.dol_print_date($search_datecloture_start, '%Y'); + } + if ($search_datecloture_end) { + $param .= '&search_datecloture_endday='.dol_print_date($search_datecloture_end, '%d').'&search_datecloture_endmonth='.dol_print_date($search_datecloture_end, '%m').'&search_datecloture_endyear='.dol_print_date($search_datecloture_end, '%Y'); + } + if ($search_dateorder_start) { + $param .= '&search_dateorder_start_day='.dol_print_date($search_dateorder_start, '%d').'&search_dateorder_start_month='.dol_print_date($search_dateorder_start, '%m').'&search_dateorder_start_year='.dol_print_date($search_dateorder_start, '%Y'); + } + if ($search_dateorder_end) { + $param .= '&search_dateorder_end_day='.dol_print_date($search_dateorder_end, '%d').'&search_dateorder_end_month='.dol_print_date($search_dateorder_end, '%m').'&search_dateorder_end_year='.dol_print_date($search_dateorder_end, '%Y'); + } + if ($search_datedelivery_start) { + $param .= '&search_datedelivery_start_day='.dol_print_date($search_datedelivery_start, '%d').'&search_datedelivery_start_month='.dol_print_date($search_datedelivery_start, '%m').'&search_datedelivery_start_year='.dol_print_date($search_datedelivery_start, '%Y'); + } + if ($search_datedelivery_end) { + $param .= '&search_datedelivery_end_day='.dol_print_date($search_datedelivery_end, '%d').'&search_datedelivery_end_month='.dol_print_date($search_datedelivery_end, '%m').'&search_datedelivery_end_year='.dol_print_date($search_datedelivery_end, '%Y'); + } + if ($search_ref) { + $param .= '&search_ref='.urlencode($search_ref); + } + if ($search_company) { + $param .= '&search_company='.urlencode($search_company); + } + if ($search_company_alias) { + $param .= '&search_company_alias='.urlencode($search_company_alias); + } + if ($search_ref_customer) { + $param .= '&search_ref_customer='.urlencode($search_ref_customer); + } + if ($search_user > 0) { + $param .= '&search_user='.urlencode($search_user); + } + if ($search_sale > 0) { + $param .= '&search_sale='.urlencode($search_sale); + } + if ($search_total_ht != '') { + $param .= '&search_total_ht='.urlencode($search_total_ht); + } + if ($search_total_vat != '') { + $param .= '&search_total_vat='.urlencode($search_total_vat); + } + if ($search_total_ttc != '') { + $param .= '&search_total_ttc='.urlencode($search_total_ttc); + } + if ($search_warehouse != '') { + $param .= '&search_warehouse='.urlencode($search_warehouse); + } + if ($search_login) { + $param .= '&search_login='.urlencode($search_login); + } + if ($search_multicurrency_code != '') { + $param .= '&search_multicurrency_code='.urlencode($search_multicurrency_code); + } + if ($search_multicurrency_tx != '') { + $param .= '&search_multicurrency_tx='.urlencode($search_multicurrency_tx); + } + if ($search_multicurrency_montant_ht != '') { + $param .= '&search_multicurrency_montant_ht='.urlencode($search_multicurrency_montant_ht); + } + if ($search_multicurrency_montant_vat != '') { + $param .= '&search_multicurrency_montant_vat='.urlencode($search_multicurrency_montant_vat); + } + if ($search_multicurrency_montant_ttc != '') { + $param .= '&search_multicurrency_montant_ttc='.urlencode($search_multicurrency_montant_ttc); + } + if ($search_project_ref >= 0) { + $param .= "&search_project_ref=".urlencode($search_project_ref); + } + if ($search_town != '') { + $param .= '&search_town='.urlencode($search_town); + } + if ($search_zip != '') { + $param .= '&search_zip='.urlencode($search_zip); + } + if ($search_state != '') { + $param .= '&search_state='.urlencode($search_state); + } + if ($search_country != '') { + $param .= '&search_country='.urlencode($search_country); + } + if ($search_type_thirdparty && $search_type_thirdparty != '-1') { + $param .= '&search_type_thirdparty='.urlencode($search_type_thirdparty); + } + if ($search_product_category != '') { + $param .= '&search_product_category='.urlencode($search_product_category); + } + if (($search_categ_cus > 0) || ($search_categ_cus == -2)) { + $param .= '&search_categ_cus='.urlencode($search_categ_cus); + } + if ($show_files) { + $param .= '&show_files='.urlencode($show_files); + } + if ($optioncss != '') { + $param .= '&optioncss='.urlencode($optioncss); + } + if ($search_billed != '') { + $param .= '&search_billed='.urlencode($search_billed); + } + if ($search_fk_cond_reglement > 0) { + $param .= '&search_fk_cond_reglement='.urlencode($search_fk_cond_reglement); + } + if ($search_fk_shipping_method > 0) { + $param .= '&search_fk_shipping_method='.urlencode($search_fk_shipping_method); + } + if ($search_fk_mode_reglement > 0) { + $param .= '&search_fk_mode_reglement='.urlencode($search_fk_mode_reglement); + } + if ($search_fk_input_reason > 0) { + $param .= '&search_fk_input_reason='.urlencode($search_fk_input_reason); + } + + // Add $param from extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php'; + + // Add $param from hooks + $parameters = array(); + $reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object); // Note that $action and $object may have been modified by hook + $param .= $hookmanager->resPrint; + + // List of mass actions available + $arrayofmassactions = array( + 'generate_doc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"), + 'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"), + ); + if ($permissiontovalidate) { + $arrayofmassactions['prevalidate'] = img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate"); + } + if ($permissiontosendbymail) { + $arrayofmassactions['presend'] = img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"); + } + if ($permissiontoclose) { + $arrayofmassactions['preshipped'] = img_picto('', 'dollyrevert', 'class="pictofixedwidth"').$langs->trans("ClassifyShipped"); + } + if ($permissiontocancel) { + $arrayofmassactions['cancelorders'] = img_picto('', 'close_title', 'class="pictofixedwidth"').$langs->trans("Cancel"); + } + if (!empty($conf->invoice->enabled) && $user->rights->facture->creer) { + $arrayofmassactions['createbills'] = img_picto('', 'bill', 'class="pictofixedwidth"').$langs->trans("CreateInvoiceForThisCustomer"); + } + if ($permissiontoclose) { + $arrayofmassactions['setbilled'] = img_picto('', 'bill', 'class="pictofixedwidth"').$langs->trans("ClassifyBilled"); + } + if ($permissiontodelete) { + $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete"); + } + if (in_array($massaction, array('presend', 'predelete', 'createbills'))) { + $arrayofmassactions = array(); + } + $massactionbutton = $form->selectMassAction('', $arrayofmassactions); + + $url = DOL_URL_ROOT.'/commande/card.php?action=create'; + if (!empty($socid)) { + $url .= '&socid='.$socid; + } + $newcardbutton = dolGetButtonTitle($langs->trans('NewOrder'), '', 'fa fa-plus-circle', $url, '', $contextpage == 'orderlist' && $permissiontoadd); + + // Lines of title fields + print '
'; + if ($optioncss != '') { + print ''; + } + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'order', 0, $newcardbutton, '', $limit, 0, 0, 1); + + $topicmail = "SendOrderRef"; + $modelmail = "order_send"; + $objecttmp = new Commande($db); + $trackid = 'ord'.$object->id; + include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php'; + + if ($massaction == 'prevalidate') { + print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassValidation"), $langs->trans("ConfirmMassValidationQuestion"), "validate", null, '', 0, 200, 500, 1); + } + if ($massaction == 'preshipped') { + print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("CloseOrder"), $langs->trans("ConfirmCloseOrder"), "shipped", null, '', 0, 200, 500, 1); + } + + if ($massaction == 'createbills') { + print ''; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print '
'; + print $langs->trans('DateInvoice'); + print ''; + print $form->selectDate('', '', '', '', '', '', 1, 1); + print '
'; + print $langs->trans('CreateOneBillByThird'); + print ''; + print $form->selectyesno('createbills_onebythird', '', 1); + print '
'; + print $langs->trans('ValidateInvoices'); + print ''; + if (!empty($conf->stock->enabled) && !empty($conf->global->STOCK_CALCULATE_ON_BILL)) { + print $form->selectyesno('validate_invoices', 0, 1, 1); + print ' ('.$langs->trans("AutoValidationNotPossibleWhenStockIsDecreasedOnInvoiceValidation").')'; + } else { + print $form->selectyesno('validate_invoices', 0, 1); + } + if (!empty($conf->workflow->enabled) && !empty($conf->global->WORKFLOW_INVOICE_AMOUNT_CLASSIFY_BILLED_ORDER)) { + print '     '.$langs->trans("IfValidateInvoiceIsNoOrderStayUnbilled").''; + } else { + print '     '.$langs->trans("OptionToSetOrderBilledNotEnabled").''; + } + print '
'; + + print '
'; + print '
'; + print ' '; + print ''; + print '
'; + print '
'; + } + + // Détail commande + if (!empty($conf->global->ORDER_ADD_OPTION_SHOW_DETAIL_LIST)) { + print '
 
'; + } + + if ($sall) { + foreach ($fieldstosearchall as $key => $val) { + $fieldstosearchall[$key] = $langs->trans($val); + } + print '
'.$langs->trans("FilterOnInto", $sall).join(', ', $fieldstosearchall).'
'; + } + + $moreforfilter = ''; + + // If the user can view prospects other than his' + if ($user->rights->user->user->lire) { + $langs->load("commercial"); + $moreforfilter .= '
'; + $tmptitle = $langs->trans('ThirdPartiesOfSaleRepresentative'); + $moreforfilter .= img_picto($tmptitle, 'user', 'class="pictofixedwidth"').$formother->select_salesrepresentatives($search_sale, 'search_sale', $user, 0, $tmptitle, 'maxwidth250 widthcentpercentminusx'); + $moreforfilter .= '
'; + } + // If the user can view other users + if ($user->rights->user->user->lire) { + $moreforfilter .= '
'; + $tmptitle = $langs->trans('LinkedToSpecificUsers'); + $moreforfilter .= img_picto($tmptitle, 'user', 'class="pictofixedwidth"').$form->select_dolusers($search_user, 'search_user', $tmptitle, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth250 widthcentpercentminusx'); + $moreforfilter .= '
'; + } + // If the user can view prospects other than his' + if (!empty($conf->categorie->enabled) && $user->rights->categorie->lire && ($user->rights->produit->lire || $user->rights->service->lire)) { + include_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; + $moreforfilter .= '
'; + $tmptitle = $langs->trans('IncludingProductWithTag'); + $cate_arbo = $form->select_all_categories(Categorie::TYPE_PRODUCT, null, 'parent', null, null, 1); + $moreforfilter .= img_picto($tmptitle, 'category', 'class="pictofixedwidth"').$form->selectarray('search_product_category', $cate_arbo, $search_product_category, $tmptitle, 0, 0, '', 0, 0, 0, 0, 'maxwidth300 widthcentpercentminusx', 1); + $moreforfilter .= '
'; + } + if (!empty($conf->categorie->enabled) && $user->rights->categorie->lire) { + require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; + $moreforfilter .= '
'; + $tmptitle = $langs->trans('CustomersProspectsCategoriesShort'); + $moreforfilter .= img_picto($tmptitle, 'category', 'class="pictofixedwidth"').$formother->select_categories('customer', $search_categ_cus, 'search_categ_cus', 1, $tmptitle, 'maxwidth300 widthcentpercentminusx'); + $moreforfilter .= '
'; + } + if (!empty($conf->stock->enabled) && !empty($conf->global->WAREHOUSE_ASK_WAREHOUSE_DURING_ORDER)) { + require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php'; + $formproduct = new FormProduct($db); + $moreforfilter .= '
'; + $tmptitle = $langs->trans('Warehouse'); + $moreforfilter .= img_picto($tmptitle, 'stock', 'class="pictofixedwidth"').$formproduct->selectWarehouses($search_warehouse, 'search_warehouse', '', 1, 0, 0, $tmptitle, 0, 0, array(), 'maxwidth250 widthcentpercentminusx'); + $moreforfilter .= '
'; + } + $parameters = array(); + $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters); // Note that $action and $object may have been modified by hook + if (empty($reshook)) { + $moreforfilter .= $hookmanager->resPrint; + } else { + $moreforfilter = $hookmanager->resPrint; + } + + if (!empty($moreforfilter)) { + print '
'; + print $moreforfilter; + print '
'; + } + + $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage; + $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN', '')); // This also change content of $arrayfields + $selectedfields .= $form->showCheckAddButtons('checkforselect', 1); + + if (GETPOST('autoselectall', 'int')) { + $selectedfields .= ''; + } + + print '
'; + print ''."\n"; + + print ''; + + // Action column + if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + } + + // Détail commande + if (!empty($arrayfields['pr.ref']['checked'])) { + print ''; + } + // Product Description + if (!empty($arrayfields['pr.desc']['checked'])) { + print ''; + } + // Product QtyOrdered + if (!empty($arrayfields['cdet.qty']['checked'])) { + print ''; + } + + // Ref + if (!empty($arrayfields['c.ref']['checked'])) { + print ''; + } + // Ref customer + if (!empty($arrayfields['c.ref_client']['checked'])) { + print ''; + } + // Project ref + if (!empty($arrayfields['p.ref']['checked'])) { + print ''; + } + // Project title + if (!empty($arrayfields['p.title']['checked'])) { + print ''; + } + // Thirpdarty + if (!empty($arrayfields['s.nom']['checked'])) { + print ''; + } + // Alias + if (!empty($arrayfields['s.name_alias']['checked'])) { + print ''; + } + // Town + if (!empty($arrayfields['s.town']['checked'])) { + print ''; + } + // Zip + if (!empty($arrayfields['s.zip']['checked'])) { + print ''; + } + // State + if (!empty($arrayfields['state.nom']['checked'])) { + print ''; + } + // Country + if (!empty($arrayfields['country.code_iso']['checked'])) { + print ''; + } + // Company type + if (!empty($arrayfields['typent.code']['checked'])) { + print ''; + } + // Date order + if (!empty($arrayfields['c.date_commande']['checked'])) { + print ''; + } + if (!empty($arrayfields['c.date_delivery']['checked'])) { + print ''; + } + // Shipping Method + if (!empty($arrayfields['c.fk_shipping_method']['checked'])) { + print ''; + } + // Payment term + if (!empty($arrayfields['c.fk_cond_reglement']['checked'])) { + print ''; + } + // Payment mode + if (!empty($arrayfields['c.fk_mode_reglement']['checked'])) { + print ''; + } + // Channel + if (!empty($arrayfields['c.fk_input_reason']['checked'])) { + print ''; + } + if (!empty($arrayfields['c.total_ht']['checked'])) { + // Amount + print ''; + } + if (!empty($arrayfields['c.total_vat']['checked'])) { + // Amount + print ''; + } + if (!empty($arrayfields['c.total_ttc']['checked'])) { + // Amount + print ''; + } + if (!empty($arrayfields['c.multicurrency_code']['checked'])) { + // Currency + print ''; + } + if (!empty($arrayfields['c.multicurrency_tx']['checked'])) { + // Currency rate + print ''; + } + if (!empty($arrayfields['c.multicurrency_total_ht']['checked'])) { + // Amount + print ''; + } + if (!empty($arrayfields['c.multicurrency_total_vat']['checked'])) { + // Amount VAT + print ''; + } + if (!empty($arrayfields['c.multicurrency_total_ttc']['checked'])) { + // Amount + print ''; + } + if (!empty($arrayfields['u.login']['checked'])) { + // Author + print ''; + } + if (!empty($arrayfields['sale_representative']['checked'])) { + print ''; + } + if (!empty($arrayfields['total_pa']['checked'])) { + print ''; + } + if (!empty($arrayfields['total_margin']['checked'])) { + print ''; + } + if (!empty($arrayfields['total_margin_rate']['checked'])) { + print ''; + } + if (!empty($arrayfields['total_mark_rate']['checked'])) { + print ''; + } + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields); + $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Date creation + if (!empty($arrayfields['c.datec']['checked'])) { + print ''; + } + // Date modification + if (!empty($arrayfields['c.tms']['checked'])) { + print ''; + } + // Date cloture + if (!empty($arrayfields['c.date_cloture']['checked'])) { + print ''; + } + // Note public + if (!empty($arrayfields['c.note_public']['checked'])) { + print ''; + } + // Note private + if (!empty($arrayfields['c.note_private']['checked'])) { + print ''; + } + // Shippable + if (!empty($arrayfields['shippable']['checked'])) { + print ''; + } + // Status billed + if (!empty($arrayfields['c.facture']['checked'])) { + print ''; + } + // Import key + if (!empty($arrayfields['c.import_key']['checked'])) { + print ''; + } + // Status + if (!empty($arrayfields['c.fk_statut']['checked'])) { + print ''; + } + // Action column + if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + } + print "\n"; + + // Fields title + print ''; + + if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', $param, '', $sortfield, $sortorder, 'maxwidthsearch center '); + } + + // Détail commande + if (!empty($arrayfields['pr.ref']['checked'])) { + print_liste_field_titre($arrayfields['pr.ref']['label'], $_SERVER["PHP_SELF"], 'pr.ref', '', $param, '', $sortfield, $sortorder); + } + if (!empty($arrayfields['pr.desc']['checked'])) { + print_liste_field_titre($arrayfields['pr.desc']['label'], $_SERVER["PHP_SELF"], 'pr.desc', '', $param, '', $sortfield, $sortorder); + } + if (!empty($arrayfields['cdet.qty']['checked'])) { + print_liste_field_titre($arrayfields['cdet.qty']['label'], $_SERVER["PHP_SELF"], 'cdet.qty', '', $param, '', $sortfield, $sortorder); + } + + if (!empty($arrayfields['c.ref']['checked'])) { + print_liste_field_titre($arrayfields['c.ref']['label'], $_SERVER["PHP_SELF"], 'c.ref', '', $param, '', $sortfield, $sortorder); + } + if (!empty($arrayfields['c.ref_client']['checked'])) { + print_liste_field_titre($arrayfields['c.ref_client']['label'], $_SERVER["PHP_SELF"], 'c.ref_client', '', $param, '', $sortfield, $sortorder); + } + if (!empty($arrayfields['p.ref']['checked'])) { + print_liste_field_titre($arrayfields['p.ref']['label'], $_SERVER["PHP_SELF"], "p.ref", "", $param, '', $sortfield, $sortorder); + } + if (!empty($arrayfields['p.title']['checked'])) { + print_liste_field_titre($arrayfields['p.title']['label'], $_SERVER["PHP_SELF"], "p.title", "", $param, '', $sortfield, $sortorder); + } + if (!empty($arrayfields['s.nom']['checked'])) { + print_liste_field_titre($arrayfields['s.nom']['label'], $_SERVER["PHP_SELF"], 's.nom', '', $param, '', $sortfield, $sortorder); + } + if (!empty($arrayfields['s.name_alias']['checked'])) { + print_liste_field_titre($arrayfields['s.name_alias']['label'], $_SERVER["PHP_SELF"], 's.name_alias', '', $param, '', $sortfield, $sortorder); + } + if (!empty($arrayfields['s.town']['checked'])) { + print_liste_field_titre($arrayfields['s.town']['label'], $_SERVER["PHP_SELF"], 's.town', '', $param, '', $sortfield, $sortorder); + } + if (!empty($arrayfields['s.zip']['checked'])) { + print_liste_field_titre($arrayfields['s.zip']['label'], $_SERVER["PHP_SELF"], 's.zip', '', $param, '', $sortfield, $sortorder); + } + if (!empty($arrayfields['state.nom']['checked'])) { + print_liste_field_titre($arrayfields['state.nom']['label'], $_SERVER["PHP_SELF"], "state.nom", "", $param, '', $sortfield, $sortorder); + } + if (!empty($arrayfields['country.code_iso']['checked'])) { + print_liste_field_titre($arrayfields['country.code_iso']['label'], $_SERVER["PHP_SELF"], "country.code_iso", "", $param, '', $sortfield, $sortorder, 'center '); + } + if (!empty($arrayfields['typent.code']['checked'])) { + print_liste_field_titre($arrayfields['typent.code']['label'], $_SERVER["PHP_SELF"], "typent.code", "", $param, '', $sortfield, $sortorder, 'center '); + } + if (!empty($arrayfields['c.date_commande']['checked'])) { + print_liste_field_titre($arrayfields['c.date_commande']['label'], $_SERVER["PHP_SELF"], 'c.date_commande', '', $param, '', $sortfield, $sortorder, 'center '); + } + if (!empty($arrayfields['c.date_delivery']['checked'])) { + print_liste_field_titre($arrayfields['c.date_delivery']['label'], $_SERVER["PHP_SELF"], 'c.date_livraison', '', $param, '', $sortfield, $sortorder, 'center '); + } + if (!empty($arrayfields['c.fk_shipping_method']['checked'])) { + print_liste_field_titre($arrayfields['c.fk_shipping_method']['label'], $_SERVER["PHP_SELF"], "c.fk_shipping_method", "", $param, '', $sortfield, $sortorder); + } + if (!empty($arrayfields['c.fk_cond_reglement']['checked'])) { + print_liste_field_titre($arrayfields['c.fk_cond_reglement']['label'], $_SERVER["PHP_SELF"], "c.fk_cond_reglement", "", $param, '', $sortfield, $sortorder); + } + if (!empty($arrayfields['c.fk_mode_reglement']['checked'])) { + print_liste_field_titre($arrayfields['c.fk_mode_reglement']['label'], $_SERVER["PHP_SELF"], "c.fk_mode_reglement", "", $param, '', $sortfield, $sortorder); + } + if (!empty($arrayfields['c.fk_input_reason']['checked'])) { + print_liste_field_titre($arrayfields['c.fk_input_reason']['label'], $_SERVER["PHP_SELF"], "c.fk_input_reason", "", $param, '', $sortfield, $sortorder); + } + if (!empty($arrayfields['c.total_ht']['checked'])) { + print_liste_field_titre($arrayfields['c.total_ht']['label'], $_SERVER["PHP_SELF"], 'c.total_ht', '', $param, '', $sortfield, $sortorder, 'right '); + } + if (!empty($arrayfields['c.total_vat']['checked'])) { + print_liste_field_titre($arrayfields['c.total_vat']['label'], $_SERVER["PHP_SELF"], 'c.total_tva', '', $param, '', $sortfield, $sortorder, 'right '); + } + if (!empty($arrayfields['c.total_ttc']['checked'])) { + print_liste_field_titre($arrayfields['c.total_ttc']['label'], $_SERVER["PHP_SELF"], 'c.total_ttc', '', $param, '', $sortfield, $sortorder, 'right '); + } + if (!empty($arrayfields['c.multicurrency_code']['checked'])) { + print_liste_field_titre($arrayfields['c.multicurrency_code']['label'], $_SERVER['PHP_SELF'], 'c.multicurrency_code', '', $param, '', $sortfield, $sortorder); + } + if (!empty($arrayfields['c.multicurrency_tx']['checked'])) { + print_liste_field_titre($arrayfields['c.multicurrency_tx']['label'], $_SERVER['PHP_SELF'], 'c.multicurrency_tx', '', $param, '', $sortfield, $sortorder); + } + if (!empty($arrayfields['c.multicurrency_total_ht']['checked'])) { + print_liste_field_titre($arrayfields['c.multicurrency_total_ht']['label'], $_SERVER['PHP_SELF'], 'c.multicurrency_total_ht', '', $param, 'class="right"', $sortfield, $sortorder); + } + if (!empty($arrayfields['c.multicurrency_total_vat']['checked'])) { + print_liste_field_titre($arrayfields['c.multicurrency_total_vat']['label'], $_SERVER['PHP_SELF'], 'c.multicurrency_total_tva', '', $param, 'class="right"', $sortfield, $sortorder); + } + if (!empty($arrayfields['c.multicurrency_total_ttc']['checked'])) { + print_liste_field_titre($arrayfields['c.multicurrency_total_ttc']['label'], $_SERVER['PHP_SELF'], 'c.multicurrency_total_ttc', '', $param, 'class="right"', $sortfield, $sortorder); + } + if (!empty($arrayfields['u.login']['checked'])) { + print_liste_field_titre($arrayfields['u.login']['label'], $_SERVER["PHP_SELF"], 'u.login', '', $param, 'align="center"', $sortfield, $sortorder); + } + if (!empty($arrayfields['sale_representative']['checked'])) { + print_liste_field_titre($arrayfields['sale_representative']['label'], $_SERVER["PHP_SELF"], "", "", "$param", '', $sortfield, $sortorder); + } + if (!empty($arrayfields['total_pa']['checked'])) { + print_liste_field_titre($arrayfields['total_pa']['label'], $_SERVER['PHP_SELF'], '', '', $param, 'class="right"', $sortfield, $sortorder); + } + if (!empty($arrayfields['total_margin']['checked'])) { + print_liste_field_titre($arrayfields['total_margin']['label'], $_SERVER['PHP_SELF'], '', '', $param, 'class="right"', $sortfield, $sortorder); + } + if (!empty($arrayfields['total_margin_rate']['checked'])) { + print_liste_field_titre($arrayfields['total_margin_rate']['label'], $_SERVER['PHP_SELF'], '', '', $param, 'class="right"', $sortfield, $sortorder); + } + if (!empty($arrayfields['total_mark_rate']['checked'])) { + print_liste_field_titre($arrayfields['total_mark_rate']['label'], $_SERVER['PHP_SELF'], '', '', $param, 'class="right"', $sortfield, $sortorder); + } + + $totalarray = array( + 'nbfield' => 0, + 'val' => array( + 'c.total_ht' => 0, + 'c.total_tva' => 0, + 'c.total_ttc' => 0, + ), + 'pos' => array(), + ); + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php'; + // Hook fields + $parameters = array( + 'arrayfields' => $arrayfields, + 'param' => $param, + 'sortfield' => $sortfield, + 'sortorder' => $sortorder, + 'totalarray' => &$totalarray, + ); + $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + if (!empty($arrayfields['c.datec']['checked'])) { + print_liste_field_titre($arrayfields['c.datec']['label'], $_SERVER["PHP_SELF"], "c.date_creation", "", $param, '', $sortfield, $sortorder, 'center nowrap '); + } + if (!empty($arrayfields['c.tms']['checked'])) { + print_liste_field_titre($arrayfields['c.tms']['label'], $_SERVER["PHP_SELF"], "c.tms", "", $param, '', $sortfield, $sortorder, 'center nowrap '); + } + if (!empty($arrayfields['c.date_cloture']['checked'])) { + print_liste_field_titre($arrayfields['c.date_cloture']['label'], $_SERVER["PHP_SELF"], "c.date_cloture", "", $param, '', $sortfield, $sortorder, 'center nowrap '); + } + if (!empty($arrayfields['c.note_public']['checked'])) { + print_liste_field_titre($arrayfields['c.note_public']['label'], $_SERVER["PHP_SELF"], "c.note_public", "", $param, '', $sortfield, $sortorder, 'right '); + } + if (!empty($arrayfields['c.note_private']['checked'])) { + print_liste_field_titre($arrayfields['c.note_private']['label'], $_SERVER["PHP_SELF"], "c.note_private", "", $param, '', $sortfield, $sortorder, 'right '); + } + if (!empty($arrayfields['shippable']['checked'])) { + print_liste_field_titre($arrayfields['shippable']['label'], $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'center '); + } + if (!empty($arrayfields['c.facture']['checked'])) { + print_liste_field_titre($arrayfields['c.facture']['label'], $_SERVER["PHP_SELF"], 'c.facture', '', $param, '', $sortfield, $sortorder, 'center '); + } + if (!empty($arrayfields['c.import_key']['checked'])) { + print_liste_field_titre($arrayfields['c.import_key']['label'], $_SERVER["PHP_SELF"], "c.import_key", "", $param, '', $sortfield, $sortorder, 'center '); + } + if (!empty($arrayfields['c.fk_statut']['checked'])) { + print_liste_field_titre($arrayfields['c.fk_statut']['label'], $_SERVER["PHP_SELF"], "c.fk_statut", "", $param, '', $sortfield, $sortorder, 'center '); + } + if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', $param, '', $sortfield, $sortorder, 'maxwidthsearch center '); + } + print ''."\n"; + + $total = 0; + $subtotal = 0; + $productstat_cache = array(); + $productstat_cachevirtual = array(); + $getNomUrl_cache = array(); + + $generic_commande = new Commande($db); + $generic_product = new Product($db); + $userstatic = new User($db); + $i = 0; + + $with_margin_info = false; + if (!empty($conf->margin->enabled) && ( + !empty($arrayfields['total_pa']['checked']) + || !empty($arrayfields['total_margin']['checked']) + || !empty($arrayfields['total_margin_rate']['checked']) + || !empty($arrayfields['total_mark_rate']['checked']) + ) + ) { + $with_margin_info = true; + } + $total_ht = 0; + $total_margin = 0; + + // Détail commande + $totalqty = 0; + + $imaxinloop = ($limit ? min($num, $limit) : $num); + $last_num = min($num, $limit); + while ($i < $imaxinloop) { + $obj = $db->fetch_object($resql); + + $notshippable = 0; + $warning = 0; + $text_info = ''; + $text_warning = ''; + $nbprod = 0; + + $companystatic->id = $obj->socid; + $companystatic->name = $obj->name; + $companystatic->name_alias = $obj->alias; + $companystatic->client = $obj->client; + $companystatic->code_client = $obj->code_client; + $companystatic->email = $obj->email; + $companystatic->phone = $obj->phone; + $companystatic->address = $obj->address; + $companystatic->zip = $obj->zip; + $companystatic->town = $obj->town; + $companystatic->country_code = $obj->country_code; + if (!isset($getNomUrl_cache[$obj->socid])) { + $getNomUrl_cache[$obj->socid] = $companystatic->getNomUrl(1, 'customer'); + } + + $generic_commande->id = $obj->rowid; + $generic_commande->ref = $obj->ref; + $generic_commande->statut = $obj->fk_statut; + $generic_commande->billed = $obj->billed; + $generic_commande->date = $db->jdate($obj->date_commande); + $generic_commande->date_livraison = $db->jdate($obj->date_delivery); // deprecated + $generic_commande->delivery_date = $db->jdate($obj->date_delivery); + $generic_commande->ref_client = $obj->ref_client; + $generic_commande->total_ht = $obj->total_ht; + $generic_commande->total_tva = $obj->total_tva; + $generic_commande->total_ttc = $obj->total_ttc; + $generic_commande->note_public = $obj->note_public; + $generic_commande->note_private = $obj->note_private; + + $projectstatic->id = $obj->project_id; + $projectstatic->ref = $obj->project_ref; + $projectstatic->title = $obj->project_label; + + $marginInfo = array(); + if ($with_margin_info === true) { + $generic_commande->fetch_lines(); + $marginInfo = $formmargin->getMarginInfosArray($generic_commande); + $total_ht += $obj->total_ht; + $total_margin += $marginInfo['total_margin']; + } + + print ''; + + // Action column + if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + } else { + print ''; + } + if (!$i) { + $totalarray['nbfield']++; + } + } + // Product Description + if (!empty($arrayfields['pr.desc']['checked'])) { + // print ''; + !empty($obj->product_label) ? $labelproduct = $obj->product_label : $labelproduct = $obj->description; + print ''; + + if (!$i) { + $totalarray['nbfield']++; + } + } + // Product QtyOrdered + if (!empty($arrayfields['cdet.qty']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'cdet.qty'; + } + if (isset($totalarray['val']['cdet.qty'])) { + $totalarray['val']['cdet.qty'] += $obj->qty; + } else { + $totalarray['val']['cdet.qty'] = $obj->qty; + } + } + + // Ref + if (!empty($arrayfields['c.ref']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Ref customer + if (!empty($arrayfields['c.ref_client']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Project ref + if (!empty($arrayfields['p.ref']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Project label + if (!empty($arrayfields['p.title']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Third party + if (!empty($arrayfields['s.nom']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Alias name + if (!empty($arrayfields['s.name_alias']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Town + if (!empty($arrayfields['s.town']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Zip + if (!empty($arrayfields['s.zip']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // State + if (!empty($arrayfields['state.nom']['checked'])) { + print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Country + if (!empty($arrayfields['country.code_iso']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Type ent + if (!empty($arrayfields['typent.code']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Order date + if (!empty($arrayfields['c.date_commande']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Plannned date of delivery + if (!empty($arrayfields['c.date_delivery']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Shipping Method + if (!empty($arrayfields['c.fk_shipping_method']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Payment terms + if (!empty($arrayfields['c.fk_cond_reglement']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Payment mode + if (!empty($arrayfields['c.fk_mode_reglement']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Channel + if (!empty($arrayfields['c.fk_input_reason']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount HT + if (!empty($arrayfields['c.total_ht']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'c.total_ht'; + } + if (isset($totalarray['val']['c.total_ht'])) { + $totalarray['val']['c.total_ht'] += $obj->total_ht; + } else { + $totalarray['val']['c.total_ht'] = $obj->total_ht; + } + } + // Amount VAT + if (!empty($arrayfields['c.total_vat']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'c.total_tva'; + } + $totalarray['val']['c.total_tva'] += $obj->total_tva; + } + // Amount TTC + if (!empty($arrayfields['c.total_ttc']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'c.total_ttc'; + } + $totalarray['val']['c.total_ttc'] += $obj->total_ttc; + } + + // Currency + if (!empty($arrayfields['c.multicurrency_code']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Currency rate + if (!empty($arrayfields['c.multicurrency_tx']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount HT + if (!empty($arrayfields['c.multicurrency_total_ht']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount VAT + if (!empty($arrayfields['c.multicurrency_total_vat']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount TTC + if (!empty($arrayfields['c.multicurrency_total_ttc']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + $userstatic->id = $obj->fk_user_author; + $userstatic->login = $obj->login; + $userstatic->lastname = $obj->lastname; + $userstatic->firstname = $obj->firstname; + $userstatic->email = $obj->user_email; + $userstatic->statut = $obj->user_statut; + $userstatic->entity = $obj->entity; + $userstatic->photo = $obj->photo; + $userstatic->office_phone = $obj->office_phone; + $userstatic->office_fax = $obj->office_fax; + $userstatic->user_mobile = $obj->user_mobile; + $userstatic->job = $obj->job; + $userstatic->gender = $obj->gender; + + // Author + if (!empty($arrayfields['u.login']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + if (!empty($arrayfields['sale_representative']['checked'])) { + // Sales representatives + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Total buying or cost price + if (!empty($arrayfields['total_pa']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Total margin + if (!empty($arrayfields['total_margin']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'total_margin'; + } + $totalarray['val']['total_margin'] += $marginInfo['total_margin']; + } + // Total margin rate + if (!empty($arrayfields['total_margin_rate']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Total mark rate + if (!empty($arrayfields['total_mark_rate']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'total_mark_rate'; + } + if ($i >= $last_num - 1) { + if (!empty($total_ht)) { + $totalarray['val']['total_mark_rate'] = price2num($total_margin * 100 / $total_ht, 'MT'); + } else { + $totalarray['val']['total_mark_rate'] = ''; + } + } + } + + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + + // Date creation + if (!empty($arrayfields['c.datec']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Date modification + if (!empty($arrayfields['c.tms']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Date cloture + if (!empty($arrayfields['c.date_cloture']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Note public + if (!empty($arrayfields['c.note_public']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Note private + if (!empty($arrayfields['c.note_private']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Show shippable Icon (this creates subloops, so may be slow) + if (!empty($arrayfields['shippable']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Billed + if (!empty($arrayfields['c.facture']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Import key + if (!empty($arrayfields['c.import_key']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Status + if (!empty($arrayfields['c.fk_statut']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Action column + if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + + print "\n"; + + $total += $obj->total_ht; + $subtotal += $obj->total_ht; + $i++; + } + + // Show total line + include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php'; + + // If no record found + if ($num == 0) { + $colspan = 1; + foreach ($arrayfields as $key => $val) { + if (!empty($val['checked'])) { + $colspan++; + } + } + print ''; + } + + $db->free($resql); + + $parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql); + $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + + print '
'; + $searchpicto = $form->showFilterButtons('left'); + print $searchpicto; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print $form->select_country($search_country, 'search_country', '', 0, 'minwidth100imp maxwidth100'); + print ''; + print $form->selectarray("search_type_thirdparty", $formcompany->typent_array(0), $search_type_thirdparty, 1, 0, 0, '', 0, 0, 0, (empty($conf->global->SOCIETE_SORT_ON_TYPEENT) ? 'ASC' : $conf->global->SOCIETE_SORT_ON_TYPEENT), '', 1); + print ''; + print '
'; + print $form->selectDate($search_dateorder_start ? $search_dateorder_start : -1, 'search_dateorder_start_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From')); + print '
'; + print '
'; + print $form->selectDate($search_dateorder_end ? $search_dateorder_end : -1, 'search_dateorder_end_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to')); + print '
'; + print '
'; + print '
'; + print $form->selectDate($search_datedelivery_start ? $search_datedelivery_start : -1, 'search_datedelivery_start_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From')); + print '
'; + print '
'; + print $form->selectDate($search_datedelivery_end ? $search_datedelivery_end : -1, 'search_datedelivery_end_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to')); + print '
'; + print '
'; + $form->selectShippingMethod($search_fk_shipping_method, 'search_fk_shipping_method', '', 1, '', 1); + print ''; + $form->select_conditions_paiements($search_fk_cond_reglement, 'search_fk_cond_reglement', 1, 1, 1); + print ''; + $form->select_types_paiements($search_fk_mode_reglement, 'search_fk_mode_reglement', '', 0, 1, 1, 0, -1); + print ''; + $form->selectInputReason($search_fk_input_reason, 'search_fk_input_reason', '', 1, '', 1); + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print $form->selectMultiCurrency($search_multicurrency_code, 'search_multicurrency_code', 1); + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print '
'; + print $form->selectDate($search_datecloture_start ? $search_datecloture_start : -1, 'search_datecloture_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From')); + print '
'; + print '
'; + print $form->selectDate($search_datecloture_end ? $search_datecloture_end : -1, 'search_datecloture_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to')); + print '
'; + print '
'; + print ''; + print ''; + //print $form->selectyesno('search_shippable', $search_shippable, 1, 0, 1, 1); + if (!empty($conf->global->ORDER_SHIPABLE_STATUS_DISABLED_BY_DEFAULT)) { + print ''; + print $langs->trans('ShowShippableStatus'); + } else { + $show_shippable_command = 1; + } + print ''; + print $form->selectyesno('search_billed', $search_billed, 1, 0, 1, 1); + print ''; + print ''; + $liststatus = array( + Commande::STATUS_DRAFT=>$langs->trans("StatusOrderDraftShort"), + Commande::STATUS_VALIDATED=>$langs->trans("StatusOrderValidated"), + Commande::STATUS_SHIPMENTONPROCESS=>$langs->trans("StatusOrderSentShort"), + Commande::STATUS_CLOSED=>$langs->trans("StatusOrderDelivered"), + -3=>$langs->trans("StatusOrderValidatedShort").'+'.$langs->trans("StatusOrderSentShort").'+'.$langs->trans("StatusOrderDelivered"), + -2=>$langs->trans("StatusOrderValidatedShort").'+'.$langs->trans("StatusOrderSentShort"), + Commande::STATUS_CANCELED=>$langs->trans("StatusOrderCanceledShort") + ); + print $form->selectarray('search_status', $liststatus, $search_status, -5, 0, 0, '', 0, 0, 0, '', 'maxwidth125', 1); + print ''; + $searchpicto = $form->showFilterButtons(); + print $searchpicto; + print '
'; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->rowid, $arrayofselected)) { + $selected = 1; + } + print ''; + } + } + + // Détail commande + // Product Ref + if (!empty($arrayfields['pr.ref']['checked'])) { + if (!empty($obj->product_rowid)) { + $generic_product->id = $obj->product_rowid; + $generic_product->ref = $obj->product_ref; + $generic_product->label = $obj->product_label; + $generic_product->status = $obj->product_status; + $generic_product->status_buy = $obj->product_status_buy; + $generic_product->status_batch = $obj->product_batch; + $generic_product->barcode = $obj->product_barcode; + print ''.$generic_product->getNomUrl(1).'Ligne libre'.$obj->description.''.dol_escape_htmltag($labelproduct).''.$obj->qty.''; + print $generic_commande->getNomUrl(1, ($search_status != 2 ? 0 : $obj->fk_statut), 0, 0, 0, 1, 1); + + $filename = dol_sanitizeFileName($obj->ref); + $filedir = $conf->commande->multidir_output[$conf->entity].'/'.dol_sanitizeFileName($obj->ref); + $urlsource = $_SERVER['PHP_SELF'].'?id='.$obj->rowid; + print $formfile->getDocumentsLink($generic_commande->element, $filename, $filedir); + + print ''.$obj->ref_client.''; + if ($obj->project_id > 0) { + print $projectstatic->getNomUrl(1); + } + print ''; + if ($obj->project_id > 0) { + print $projectstatic->title; + } + print ''; + print $getNomUrl_cache[$obj->socid]; + + // If module invoices enabled and user with invoice creation permissions + if (isModEnabled('facture') && !empty($conf->global->ORDER_BILLING_ALL_CUSTOMER)) { + if ($user->rights->facture->creer) { + if (($obj->fk_statut > 0 && $obj->fk_statut < 3) || ($obj->fk_statut == 3 && $obj->billed == 0)) { + print ' '; + print img_picto($langs->trans("CreateInvoiceForThisCustomer").' : '.$companystatic->name, 'object_bill', 'hideonsmartphone').''; + } + } + } + print ''; + print $obj->alias; + print ''; + print $obj->town; + print ''; + print $obj->zip; + print '".$obj->state_name."'; + $tmparray = getCountry($obj->fk_pays, 'all'); + print $tmparray['label']; + print ''; + if (empty($typenArray)) { + $typenArray = $formcompany->typent_array(1); + } + print $typenArray[$obj->typent_code]; + print ''; + print dol_print_date($db->jdate($obj->date_commande), 'day'); + // Warning late icon and note + if ($generic_commande->hasDelay()) { + print img_picto($langs->trans("Late").' : '.$generic_commande->showDelay(), "warning"); + } + print ''; + print dol_print_date($db->jdate($obj->date_delivery), 'dayhour'); + print ''; + $form->formSelectShippingMethod('', $obj->fk_shipping_method, 'none', 1); + print ''; + $form->form_conditions_reglement($_SERVER['PHP_SELF'], $obj->fk_cond_reglement, 'none', 0, '', 1, $obj->deposit_percent); + print ''; + $form->form_modes_reglement($_SERVER['PHP_SELF'], $obj->fk_mode_reglement, 'none', '', -1); + print ''; + $form->formInputReason($_SERVER['PHP_SELF'], $obj->fk_input_reason, 'none', ''); + print ''.price($obj->total_ht)."'.price($obj->total_tva)."'.price($obj->total_ttc)."'.$obj->multicurrency_code.' - '.$langs->trans('Currency'.$obj->multicurrency_code)."'; + $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$obj->rowid, $obj->multicurrency_tx, 'none', $obj->multicurrency_code); + print "'.price($obj->multicurrency_total_ht)."'.price($obj->multicurrency_total_vat)."'.price($obj->multicurrency_total_ttc)."'; + if ($userstatic->id) { + print $userstatic->getNomUrl(-1); + } else { + print ' '; + } + print "'; + if ($obj->socid > 0) { + $listsalesrepresentatives = $companystatic->getSalesRepresentatives($user); + if ($listsalesrepresentatives < 0) { + dol_print_error($db); + } + $nbofsalesrepresentative = count($listsalesrepresentatives); + if ($nbofsalesrepresentative > 6) { + // We print only number + print $nbofsalesrepresentative; + } elseif ($nbofsalesrepresentative > 0) { + $j = 0; + foreach ($listsalesrepresentatives as $val) { + $userstatic->id = $val['id']; + $userstatic->lastname = $val['lastname']; + $userstatic->firstname = $val['firstname']; + $userstatic->email = $val['email']; + $userstatic->statut = $val['statut']; + $userstatic->entity = $val['entity']; + $userstatic->photo = $val['photo']; + $userstatic->login = $val['login']; + $userstatic->office_phone = $val['office_phone']; + $userstatic->office_fax = $val['office_fax']; + $userstatic->user_mobile = $val['user_mobile']; + $userstatic->job = $val['job']; + $userstatic->gender = $val['gender']; + //print '
': + print ($nbofsalesrepresentative < 2) ? $userstatic->getNomUrl(-1, '', 0, 0, 12) : $userstatic->getNomUrl(-2); + $j++; + if ($j < $nbofsalesrepresentative) { + print ' '; + } + //print '
'; + } + } + //else print $langs->trans("NoSalesRepresentativeAffected"); + } else { + print ' '; + } + print '
'.price($marginInfo['pa_total']).''.price($marginInfo['total_margin']).''.(($marginInfo['total_margin_rate'] == '') ? '' : price($marginInfo['total_margin_rate'], null, null, null, null, 2).'%').''.(($marginInfo['total_mark_rate'] == '') ? '' : price($marginInfo['total_mark_rate'], null, null, null, null, 2).'%').''; + print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); + print ''; + print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); + print ''; + print dol_print_date($db->jdate($obj->date_cloture), 'dayhour', 'tzuser'); + print ''; + print dol_string_nohtmltag($obj->note_public); + print ''; + print dol_string_nohtmltag($obj->note_private); + print ''; + if (!empty($show_shippable_command) && !empty($conf->stock->enabled)) { + if (($obj->fk_statut > $generic_commande::STATUS_DRAFT) && ($obj->fk_statut < $generic_commande::STATUS_CLOSED)) { + $generic_commande->getLinesArray(); // Load array ->lines + $generic_commande->loadExpeditions(); // Load array ->expeditions + + $numlines = count($generic_commande->lines); // Loop on each line of order + for ($lig = 0; $lig < $numlines; $lig++) { + if (isset($generic_commande->expeditions[$generic_commande->lines[$lig]->id])) { + $reliquat = $generic_commande->lines[$lig]->qty - $generic_commande->expeditions[$generic_commande->lines[$lig]->id]; + } else { + $reliquat = $generic_commande->lines[$lig]->qty; + } + if ($generic_commande->lines[$lig]->product_type == 0 && $generic_commande->lines[$lig]->fk_product > 0) { // If line is a product and not a service + $nbprod++; // order contains real products + $generic_product->id = $generic_commande->lines[$lig]->fk_product; + + // Get local and virtual stock and store it into cache + if (empty($productstat_cache[$generic_commande->lines[$lig]->fk_product])) { + $generic_product->load_stock('nobatch'); // ->load_virtual_stock() is already included into load_stock() + $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stock_reel'] = $generic_product->stock_reel; + $productstat_cachevirtual[$generic_commande->lines[$lig]->fk_product]['stock_reel'] = $generic_product->stock_theorique; + } else { + $generic_product->stock_reel = $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stock_reel']; + $generic_product->stock_theorique = $productstat_cachevirtual[$generic_commande->lines[$lig]->fk_product]['stock_reel'] = $generic_product->stock_theorique; + } + + if ($reliquat > $generic_product->stock_reel) { + $notshippable++; + } + if (empty($conf->global->SHIPPABLE_ORDER_ICON_IN_LIST)) { // Default code. Default should be this case. + $text_info .= $reliquat.' x '.$generic_commande->lines[$lig]->product_ref.' '.dol_trunc($generic_commande->lines[$lig]->product_label, 20); + $text_info .= ' - '.$langs->trans("Stock").': '.$generic_product->stock_reel.''; + $text_info .= ' - '.$langs->trans("VirtualStock").': '.$generic_product->stock_theorique.''; + $text_info .= ($reliquat != $generic_commande->lines[$lig]->qty ? ' ('.$langs->trans("QtyInOtherShipments").' '.($generic_commande->lines[$lig]->qty - $reliquat).')' : ''); + $text_info .= '
'; + } else { // BUGGED CODE. + // DOES NOT TAKE INTO ACCOUNT MANUFACTURING. THIS CODE SHOULD BE USELESS. PREVIOUS CODE SEEMS COMPLETE. + // COUNT STOCK WHEN WE SHOULD ALREADY HAVE VALUE + // Detailed virtual stock, looks bugged, uncomplete and need heavy load. + // stock order and stock order_supplier + $stock_order = 0; + $stock_order_supplier = 0; + if (!empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT) || !empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT_CLOSE)) { // What about other options ? + if (!empty($conf->commande->enabled)) { + if (empty($productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_customer'])) { + $generic_product->load_stats_commande(0, '1,2'); + $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_customer'] = $generic_product->stats_commande['qty']; + } else { + $generic_product->stats_commande['qty'] = $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_customer']; + } + $stock_order = $generic_product->stats_commande['qty']; + } + if ((!empty($conf->fournisseur->enabled) && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || !empty($conf->supplier_order->enabled)) { + if (empty($productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_supplier'])) { + $generic_product->load_stats_commande_fournisseur(0, '3'); + $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_supplier'] = $generic_product->stats_commande_fournisseur['qty']; + } else { + $generic_product->stats_commande_fournisseur['qty'] = $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_supplier']; + } + $stock_order_supplier = $generic_product->stats_commande_fournisseur['qty']; + } + } + $text_info .= $reliquat.' x '.$generic_commande->lines[$lig]->ref.' '.dol_trunc($generic_commande->lines[$lig]->product_label, 20); + $text_stock_reel = $generic_product->stock_reel.'/'.$stock_order; + if ($stock_order > $generic_product->stock_reel && !($generic_product->stock_reel < $generic_commande->lines[$lig]->qty)) { + $warning++; + $text_warning .= ''.$langs->trans('Available').' : '.$text_stock_reel.''; + } + if ($reliquat > $generic_product->stock_reel) { + $text_info .= ''.$langs->trans('Available').' : '.$text_stock_reel.''; + } else { + $text_info .= ''.$langs->trans('Available').' : '.$text_stock_reel.''; + } + if ((!empty($conf->fournisseur->enabled) && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || !empty($conf->supplier_order->enabled)) { + $text_info .= ' '.$langs->trans('SupplierOrder').' : '.$stock_order_supplier; + } + $text_info .= ($reliquat != $generic_commande->lines[$lig]->qty ? ' ('.$langs->trans("QtyInOtherShipments").' '.($generic_commande->lines[$lig]->qty - $reliquat).')' : ''); + $text_info .= '
'; + } + } + } + if ($notshippable == 0) { + $text_icon = img_picto('', 'dolly', '', false, 0, 0, '', 'green paddingleft'); + $text_info = $text_icon.' '.$langs->trans('Shippable').'
'.$text_info; + } else { + $text_icon = img_picto('', 'dolly', '', false, 0, 0, '', 'error paddingleft'); + $text_info = $text_icon.' '.$langs->trans('NonShippable').'
'.$text_info; + } + } + + if ($nbprod) { + print $form->textwithtooltip('', $text_info, 2, 1, $text_icon, '', 2); + } + if ($warning) { // Always false in default mode + print $form->textwithtooltip('', $langs->trans('NotEnoughForAllOrders').'
'.$text_warning, 2, 1, img_picto('', 'error'), '', 2); + } + } + print '
'.yn($obj->billed).''.$obj->import_key.''.$generic_commande->LibStatut($obj->fk_statut, $obj->billed, 5, 1).''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->rowid, $arrayofselected)) { + $selected = 1; + } + print ''; + } + } + print '
'.$langs->trans("NoRecordFound").'
'."\n"; + print '
'; + + print '
'."\n"; + + $hidegeneratedfilelistifempty = 1; + if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) { + $hidegeneratedfilelistifempty = 0; + } + + // Show list of available documents + $urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder; + $urlsource .= str_replace('&', '&', $param); + + $filedir = $diroutputmassaction; + $genallowed = $permissiontoread; + $delallowed = $permissiontoadd; + + print $formfile->showdocuments('massfilesarea_orders', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty); +} else { + dol_print_error($db); +} + +// End of page +llxFooter(); +$db->close(); From 5eb495224b1f73ccd960b1d0ce03681d932337ba Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Tue, 23 Aug 2022 10:51:38 +0200 Subject: [PATCH 0026/1128] clean --- htdocs/commande/list.php | 50 +--------------------------------------- 1 file changed, 1 insertion(+), 49 deletions(-) diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index 1b74238db1c..dbb99d0f993 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -11,7 +11,7 @@ * Copyright (C) 2015 Jean-François Ferry * Copyright (C) 2016-2021 Ferran Marcet * Copyright (C) 2018 Charlene Benke - * Copyright (C) 2021 Anthony Berton + * Copyright (C) 2021 Anthony Berton * * 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 @@ -71,9 +71,6 @@ $search_dateorder_end = dol_mktime(23, 59, 59, GETPOST('search_dateorder_end_mon $search_datedelivery_start = dol_mktime(0, 0, 0, GETPOST('search_datedelivery_start_month', 'int'), GETPOST('search_datedelivery_start_day', 'int'), GETPOST('search_datedelivery_start_year', 'int')); $search_datedelivery_end = dol_mktime(23, 59, 59, GETPOST('search_datedelivery_end_month', 'int'), GETPOST('search_datedelivery_end_day', 'int'), GETPOST('search_datedelivery_end_year', 'int')); $search_product_category = GETPOST('search_product_category', 'int'); - - - $search_ref = GETPOST('search_ref', 'alpha') != '' ?GETPOST('search_ref', 'alpha') : GETPOST('sref', 'alpha'); $search_ref_customer = GETPOST('search_ref_customer', 'alpha'); $search_company = GETPOST('search_company', 'alpha'); @@ -207,9 +204,6 @@ $arrayfields = array( 'c.import_key' =>array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>1, 'visible'=>-2, 'position'=>999), 'c.fk_statut'=>array('label'=>"Status", 'checked'=>1, 'position'=>1000) ); - - - // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php'; @@ -245,8 +239,6 @@ if (empty($reshook)) { $search_user = ''; $search_sale = ''; $search_product_category = ''; - $search_refProduct = ''; - $search_descProduct = ''; $search_ref = ''; $search_ref_customer = ''; $search_company = ''; @@ -800,9 +792,6 @@ $sql .= ' p.rowid as project_id, p.ref as project_ref, p.title as project_label, $sql .= ' u.login, u.lastname, u.firstname, u.email as user_email, u.statut as user_statut, u.entity, u.photo, u.office_phone, u.office_fax, u.user_mobile, u.job, u.gender,'; $sql .= ' c.fk_cond_reglement,c.deposit_percent,c.fk_mode_reglement,c.fk_shipping_method,'; $sql .= ' c.fk_input_reason, c.import_key'; - - - if (($search_categ_cus > 0) || ($search_categ_cus == -2)) { $sql .= ", cc.fk_categorie, cc.fk_soc"; } @@ -823,11 +812,7 @@ $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as state on (state.rowid = if (($search_categ_cus > 0) || ($search_categ_cus == -2)) { $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX."categorie_societe as cc ON s.rowid = cc.fk_soc"; // We'll need this table joined to the select in order to filter by categ } - - $sql .= ', '.MAIN_DB_PREFIX.'commande as c'; - - if (!empty($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) { $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."commande_extrafields as ef on (c.rowid = ef.fk_object)"; } @@ -865,13 +850,6 @@ if ($socid > 0) { if (empty($user->rights->societe->client->voir) && !$socid) { $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id); } -if ($search_refProduct) { - $sql .= natural_search('pr.ref', $search_refProduct); -} -if ($search_descProduct) { - $sql .= natural_search('pr.label', $search_descProduct); - $sql .= natural_search('cdet.description', $search_descProduct); -} if ($search_ref) { $sql .= natural_search('c.ref', $search_ref); } @@ -1336,8 +1314,6 @@ if ($resql) { print '
'; } - - if ($sall) { foreach ($fieldstosearchall as $key => $val) { $fieldstosearchall[$key] = $langs->trans($val); @@ -1418,7 +1394,6 @@ if ($resql) { print ''."\n"; print ''; - // Action column if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { print ''; } - - // Product Description - if (!empty($arrayfields['pr.desc']['checked'])) { - print ''; - } - // Product QtyOrdered - if (!empty($arrayfields['cdet.qty']['checked'])) { - print ''; - } - // Ref if (!empty($arrayfields['c.ref']['checked'])) { print ''; } - if (!empty($arrayfields['c.total_ht']['checked'])) { + if (!empty($arrayfields['cdet.total_ht']['checked'])) { // Amount print ''; } - if (!empty($arrayfields['c.total_ttc']['checked'])) { + if (!empty($arrayfields['cdet.total_ttc']['checked'])) { // Amount print '\n"; if (!$i) { $totalarray['nbfield']++; } if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'c.total_ht'; + $totalarray['pos'][$totalarray['nbfield']] = 'cdet.total_ht'; } - if (isset($totalarray['val']['c.total_ht'])) { - $totalarray['val']['c.total_ht'] += $obj->total_ht; + if (isset($totalarray['val']['cdet.total_ht'])) { + $totalarray['val']['cdet.total_ht'] += $obj->total_ht; } else { - $totalarray['val']['c.total_ht'] = $obj->total_ht; + $totalarray['val']['cdet.total_ht'] = $obj->total_ht; } } // Amount VAT @@ -2216,20 +1708,20 @@ if ($resql) { $totalarray['nbfield']++; } if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'c.total_tva'; + $totalarray['pos'][$totalarray['nbfield']] = 'cdet.total_tva'; } - $totalarray['val']['c.total_tva'] += $obj->total_tva; + $totalarray['val']['cdet.total_tva'] += $obj->total_tva; } // Amount TTC - if (!empty($arrayfields['c.total_ttc']['checked'])) { + if (!empty($arrayfields['cdet.total_ttc']['checked'])) { print '\n"; if (!$i) { $totalarray['nbfield']++; } if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'c.total_ttc'; + $totalarray['pos'][$totalarray['nbfield']] = 'cdet.total_ttc'; } - $totalarray['val']['c.total_ttc'] += $obj->total_ttc; + $totalarray['val']['cdet.total_ttc'] += $obj->total_ttc; } // Currency From 62163ae903a3f0c9e0d37f343c4497d5e765f4cb Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Tue, 23 Aug 2022 14:47:54 +0200 Subject: [PATCH 0029/1128] Add in auguria menu --- htdocs/core/menus/init_menu_auguria.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/core/menus/init_menu_auguria.sql b/htdocs/core/menus/init_menu_auguria.sql index 96625dd1f95..6821b065010 100644 --- a/htdocs/core/menus/init_menu_auguria.sql +++ b/htdocs/core/menus/init_menu_auguria.sql @@ -178,6 +178,7 @@ insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, left insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->commande->enabled && $leftmenu=="orders"', __HANDLER__, 'left', 1207__+MAX_llx_menu__, 'commercial', '', 1202__+MAX_llx_menu__, '/commande/list.php?mainmenu=commercial&leftmenu=orders&search_status=4', 'StatusOrderProcessed', 1, 'orders', '$user->rights->commande->lire', '', 2, 6, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->commande->enabled && $leftmenu=="orders"', __HANDLER__, 'left', 1208__+MAX_llx_menu__, 'commercial', '', 1202__+MAX_llx_menu__, '/commande/list.php?mainmenu=commercial&leftmenu=orders&search_status=-1', 'StatusOrderCanceledShort', 1, 'orders', '$user->rights->commande->lire', '', 2, 7, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->commande->enabled', __HANDLER__, 'left', 1209__+MAX_llx_menu__, 'commercial', '', 1200__+MAX_llx_menu__, '/commande/stats/index.php?mainmenu=commercial&leftmenu=orders', 'Statistics', 1, 'orders', '$user->rights->commande->lire', '', 2, 4, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->commande->enabled && $conf->global->MAIN_FEATURES_LEVEL >= 2 && empty($user->socid)', __HANDLER__, 'left', 1210__+MAX_llx_menu__, 'commercial', '', 1200__+MAX_llx_menu__, '/commande/list_line.php?mainmenu=commercial&leftmenu=orders', 'ListOrderLigne', 1, 'orders', '$user->rights->commande->lire', '', 2, 1, __ENTITY__); -- Commercial - Supplier's proposals insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->supplier_proposal->enabled', __HANDLER__, 'left', 1650__+MAX_llx_menu__, 'commercial', 'propals_supplier', 3__+MAX_llx_menu__, '/supplier_proposal/index.php?leftmenu=propals_supplier', 'SupplierProposalsShort', 0, 'supplier_proposal', '$user->rights->supplier_proposal->lire', '', 2, 4, __ENTITY__); From 19248016bf05e8f77946035731c5643331fc12db Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Tue, 23 Aug 2022 15:40:12 +0200 Subject: [PATCH 0030/1128] Fix - $generic_commande mount --- htdocs/commande/list_line.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/htdocs/commande/list_line.php b/htdocs/commande/list_line.php index 9437daebf33..cb7d76e8930 100644 --- a/htdocs/commande/list_line.php +++ b/htdocs/commande/list_line.php @@ -350,8 +350,9 @@ $sql .= ' s.rowid as socid, s.nom as name, s.name_alias as alias, s.email, s.pho $sql .= " typent.code as typent_code,"; $sql .= " state.code_departement as state_code, state.nom as state_name,"; $sql .= " country.code as country_code,"; -$sql .= ' c.rowid, c.ref, c.ref_client, c.fk_user_author,'; +$sql .= ' c.rowid as c_rowid, c.ref, c.ref_client, c.fk_user_author,'; $sql .= ' c.fk_multicurrency, c.multicurrency_code, c.multicurrency_tx, c.multicurrency_total_ht, c.multicurrency_total_tva as multicurrency_total_vat, c.multicurrency_total_ttc,'; +$sql .= ' c.total_ht as c_total_ht, c.total_tva as c_total_tva, c.total_ttc as c_total_ttc,'; $sql .= ' c.date_valid, c.date_commande, c.note_public, c.note_private, c.date_livraison as date_delivery, c.fk_statut, c.facture as billed,'; $sql .= ' c.date_creation as date_creation, c.tms as date_update, c.date_cloture as date_cloture,'; $sql .= ' p.rowid as project_id, p.ref as project_ref, p.title as project_label,'; @@ -601,12 +602,12 @@ if ($resql) { if ($socid > 0) { $soc = new Societe($db); $soc->fetch($socid); - $title = $langs->trans('CustomersOrders').' - '.$soc->name; + $title = $langs->trans('ListOrderLigne').' - '.$soc->name; if (empty($search_company)) { $search_company = $soc->name; } } else { - $title = $langs->trans('CustomersOrders'); + $title = $langs->trans('ListOrderLigne'); } if (strval($search_status) == '0') { $title .= ' - '.$langs->trans('StatusOrderDraftShort'); @@ -1419,7 +1420,7 @@ if ($resql) { $getNomUrl_cache[$obj->socid] = $companystatic->getNomUrl(1, 'customer'); } - $generic_commande->id = $obj->rowid; + $generic_commande->id = $obj->c_rowid; $generic_commande->ref = $obj->ref; $generic_commande->statut = $obj->fk_statut; $generic_commande->billed = $obj->billed; @@ -1427,9 +1428,9 @@ if ($resql) { $generic_commande->date_livraison = $db->jdate($obj->date_delivery); // deprecated $generic_commande->delivery_date = $db->jdate($obj->date_delivery); $generic_commande->ref_client = $obj->ref_client; - $generic_commande->total_ht = $obj->total_ht; - $generic_commande->total_tva = $obj->total_tva; - $generic_commande->total_ttc = $obj->total_ttc; + $generic_commande->total_ht = $obj->c_total_ht; + $generic_commande->total_tva = $obj->c_total_tva; + $generic_commande->total_ttc = $obj->c_total_ttc; $generic_commande->note_public = $obj->note_public; $generic_commande->note_private = $obj->note_private; From 6d625d6128bb1656d8dfe2ccf58aa0977053fe04 Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Tue, 23 Aug 2022 20:09:40 +0200 Subject: [PATCH 0031/1128] Add options for clean list --- htdocs/commande/list_line.php | 14 +++++++++++++- htdocs/langs/en_US/orders.lang | 2 ++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/htdocs/commande/list_line.php b/htdocs/commande/list_line.php index cb7d76e8930..d564daf27ab 100644 --- a/htdocs/commande/list_line.php +++ b/htdocs/commande/list_line.php @@ -57,6 +57,8 @@ $show_files = GETPOST('show_files', 'int'); $confirm = GETPOST('confirm', 'alpha'); $toselect = GETPOST('toselect', 'array'); $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'orderlist'; +$productonly = GETPOST('productonly', 'alpha'); +$disablelinefree = GETPOST('disablelinefree', 'alpha'); $search_datecloture_start = GETPOST('search_datecloture_start', 'int'); if (empty($search_datecloture_start)) { @@ -361,7 +363,7 @@ $sql .= ' c.fk_cond_reglement,c.deposit_percent,c.fk_mode_reglement,c.fk_shippin $sql .= ' c.fk_input_reason, c.import_key'; // Détail commande -$sql .= ', cdet.rowid, cdet.description, cdet.qty, cdet.total_ht, cdet.total_tva, cdet.total_ttc, '; +$sql .= ', cdet.rowid, cdet.description, cdet.qty, cdet.product_type, cdet.fk_product, cdet.total_ht, cdet.total_tva, cdet.total_ttc, '; $sql .= ' pr.rowid as product_rowid, pr.ref as product_ref, pr.label as product_label, pr.barcode as product_barcode, pr.tobatch as product_batch, pr.tosell as product_status, pr.tobuy as product_status_buy'; if (($search_categ_cus > 0) || ($search_categ_cus == -2)) { @@ -418,6 +420,13 @@ $sql .= $hookmanager->resPrint; $sql .= ' WHERE c.fk_soc = s.rowid'; $sql .= ' AND c.entity IN ('.getEntity('commande').')'; + +if (!empty($productonly)) { + $sql .= " AND (cdet.product_type = 0 OR cdet.product_type = 1)"; +} +if (!empty($disablelinefree)) { + $sql .= " AND cdet.fk_product IS NOT NULL"; +} if ($search_product_category > 0) { $sql .= " AND cp.fk_categorie = ".((int) $search_product_category); } @@ -830,6 +839,9 @@ if ($resql) { print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'order', 0, $newcardbutton, '', $limit, 0, 0, 1); + print ''; + print ''; + $topicmail = "SendOrderRef"; $modelmail = "order_send"; $objecttmp = new Commande($db); diff --git a/htdocs/langs/en_US/orders.lang b/htdocs/langs/en_US/orders.lang index cb64d1b603a..a465fc41ea6 100644 --- a/htdocs/langs/en_US/orders.lang +++ b/htdocs/langs/en_US/orders.lang @@ -97,6 +97,8 @@ NumberOfOrdersByMonth=Number of orders by month AmountOfOrdersByMonthHT=Amount of orders by month (excl. tax) ListOfOrders=List of orders ListOrderLigne=Lines of orders +productonly=Lines products only +disablelinefree=No lines free CloseOrder=Close order ConfirmCloseOrder=Are you sure you want to set this order to delivered? Once an order is delivered, it can be set to billed. ConfirmDeleteOrder=Are you sure you want to delete this order? From 8cc9d72b37a534b5d90556ba9cb1a1f846c3b18c Mon Sep 17 00:00:00 2001 From: GregM Date: Tue, 30 Aug 2022 16:53:14 +0200 Subject: [PATCH 0032/1128] update sql --- htdocs/contact/class/contact.class.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php index ce74f82b412..3ae7e7d8645 100644 --- a/htdocs/contact/class/contact.class.php +++ b/htdocs/contact/class/contact.class.php @@ -1777,12 +1777,11 @@ class Contact extends CommonObject $sql .= " FROM ".MAIN_DB_PREFIX."c_type_contact tc"; $sql .= ", ".MAIN_DB_PREFIX."societe_contacts sc"; $sql .= " INNER JOIN ".MAIN_DB_PREFIX."socpeople sp"; - $sql .= " ON sc.fk_socpeople = sp.rowid"; + $sql .= " ON sc.fk_socpeople = sp.rowid AND sp.statut = 1"; $sql .= " WHERE sc.fk_soc =".((int) $this->socid); $sql .= " AND sc.fk_c_type_contact=tc.rowid"; $sql .= " AND tc.element = '".$this->db->escape($element)."'"; $sql .= " AND tc.active = 1"; - $sql .= " AND sp.statut = 1"; dol_syslog(__METHOD__, LOG_DEBUG); $resql = $this->db->query($sql); From c0c12a40b088b57694981844bc2d130958b15e88 Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Thu, 1 Sep 2022 16:37:13 +0200 Subject: [PATCH 0033/1128] Fix inithook --- htdocs/commande/list_line.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/commande/list_line.php b/htdocs/commande/list_line.php index d564daf27ab..7ea36fe8d09 100644 --- a/htdocs/commande/list_line.php +++ b/htdocs/commande/list_line.php @@ -146,7 +146,7 @@ $show_shippable_command = GETPOST('show_shippable_command', 'aZ09'); // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context $object = new Commande($db); -$hookmanager->initHooks(array('orderlist')); +$hookmanager->initHooks(array('orderlistdetail')); $extrafields = new ExtraFields($db); // fetch optionals attributes and labels From 6e6a62d167d4ac9d48b937c0b6e98c3dbca7438e Mon Sep 17 00:00:00 2001 From: lvessiller Date: Wed, 7 Sep 2022 14:58:07 +0200 Subject: [PATCH 0034/1128] NEW set payment default values when supplier order created from reception --- htdocs/fourn/facture/card.php | 95 +++++++++++++++++++++++++++++--- htdocs/reception/list.php | 100 ++++++++++++++++++++++++++++++++-- 2 files changed, 181 insertions(+), 14 deletions(-) diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index 2f8f3f2adae..d096d02d92c 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -1954,15 +1954,93 @@ if ($action == 'create') { $projectid = (!empty($objectsrc->fk_project) ? $objectsrc->fk_project : ''); //$ref_client = (!empty($objectsrc->ref_client)?$object->ref_client:''); - $soc = $objectsrc->thirdparty; - $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_supplier_id) ? $soc->cond_reglement_supplier_id : 0)); // TODO maybe add default value option - $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_supplier_id) ? $soc->mode_reglement_supplier_id : 0)); - $fk_account = (!empty($objectsrc->fk_account) ? $objectsrc->fk_account : (!empty($soc->fk_account) ? $soc->fk_account : 0)); - $remise_percent = (!empty($objectsrc->remise_percent) ? $objectsrc->remise_percent : (!empty($soc->remise_supplier_percent) ? $soc->remise_supplier_percent : 0)); - $remise_absolue = (!empty($objectsrc->remise_absolue) ? $objectsrc->remise_absolue : (!empty($soc->remise_absolue) ? $soc->remise_absolue : 0)); - $dateinvoice = empty($conf->global->MAIN_AUTOFILL_DATE) ?-1 : ''; - $transport_mode_id = (!empty($objectsrc->transport_mode_id) ? $objectsrc->transport_mode_id : (!empty($soc->transport_mode_id) ? $soc->transport_mode_id : 0)); + + $cond_reglement_id = 0; + $mode_reglement_id = 0; + $fk_account = 0; + $remise_percent = 0; + $remise_absolue = 0; + $transport_mode_id = 0; + + // set from object source + if (!empty($objectsrc->cond_reglement_id)) { + $cond_reglement_id = $objectsrc->cond_reglement_id; + } + if (!empty($objectsrc->mode_reglement_id)) { + $mode_reglement_id = $objectsrc->mode_reglement_id; + } + if (!empty($objectsrc->fk_account)) { + $fk_account = $objectsrc->fk_account; + } + if (!empty($objectsrc->remise_percent)) { + $remise_percent = $objectsrc->remise_percent; + } + if (!empty($objectsrc->remise_absolue)) { + $remise_absolue = $objectsrc->remise_absolue; + } + if (!empty($objectsrc->transport_mode_id)) { + $transport_mode_id = $objectsrc->transport_mode_id; + } + + if (empty($cond_reglement_id) + || empty($mode_reglement_id) + || empty($fk_account) + || empty($remise_percent) + || empty($remise_absolue) + || empty($transport_mode_id) + ) { + if ($origin == 'reception') { + // try to get from source of reception (supplier order) + if (!isset($objectsrc->supplier_order)) { + $objectsrc->fetch_origin(); + } + + if (!empty($objectsrc->commandeFournisseur)) { + $supplierOrder = $objectsrc->commandeFournisseur; + if (empty($cond_reglement_id) && !empty($supplierOrder->cond_reglement_id)) { + $cond_reglement_id = $supplierOrder->cond_reglement_id; + } + if (empty($mode_reglement_id) && !empty($supplierOrder->mode_reglement_id)) { + $mode_reglement_id = $supplierOrder->mode_reglement_id; + } + if (empty($fk_account) && !empty($supplierOrder->fk_account)) { + $fk_account = $supplierOrder->fk_account; + } + if (empty($remise_percent) && !empty($supplierOrder->remise_percent)) { + $remise_percent = $supplierOrder->remise_percent; + } + if (empty($remise_absolue) && !empty($supplierOrder->remise_absolue)) { + $remise_absolue = $supplierOrder->remise_absolue; + } + if (empty($transport_mode_id) && !empty($supplierOrder->transport_mode_id)) { + $transport_mode_id = $supplierOrder->transport_mode_id; + } + } + } + + // try to get from third-party of source object + if (!empty($soc)) { + if (empty($cond_reglement_id) && !empty($soc->cond_reglement_supplier_id)) { + $cond_reglement_id = $soc->cond_reglement_supplier_id; + } + if (empty($mode_reglement_id) && !empty($soc->mode_reglement_supplier_id)) { + $mode_reglement_id = $soc->mode_reglement_supplier_id; + } + if (empty($fk_account) && !empty($soc->fk_account)) { + $fk_account = $soc->fk_account; + } + if (empty($remise_percent) && !empty($soc->remise_supplier_percent)) { + $remise_percent = $soc->remise_supplier_percent; + } + if (empty($remise_absolue) && !empty($soc->remise_absolue)) { + $remise_absolue = $soc->remise_absolue; + } + if (empty($transport_mode_id) && !empty($soc->transport_mode_id)) { + $transport_mode_id = $soc->transport_mode_id; + } + } + } if (isModEnabled("multicurrency")) { if (!empty($objectsrc->multicurrency_code)) { @@ -1973,6 +2051,7 @@ if ($action == 'create') { } } + $dateinvoice = empty($conf->global->MAIN_AUTOFILL_DATE) ?-1 : ''; $datetmp = dol_mktime(12, 0, 0, GETPOST('remonth', 'int'), GETPOST('reday', 'int'), GETPOST('reyear', 'int')); $dateinvoice = ($datetmp == '' ? (empty($conf->global->MAIN_AUTOFILL_DATE) ?-1 : '') : $datetmp); $datetmp = dol_mktime(12, 0, 0, GETPOST('echmonth', 'int'), GETPOST('echday', 'int'), GETPOST('echyear', 'int')); diff --git a/htdocs/reception/list.php b/htdocs/reception/list.php index 88c86168678..a6ed1ad935e 100644 --- a/htdocs/reception/list.php +++ b/htdocs/reception/list.php @@ -219,15 +219,98 @@ if (empty($reshook)) { } } } else { + $cond_reglement_id = 0; + $mode_reglement_id = 0; + $fk_account = 0; + $remise_percent = 0; + $remise_absolue = 0; + $transport_mode_id = 0; + if (!empty($rcp->cond_reglement_id)) { + $cond_reglement_id = $rcp->cond_reglement_id; + } + if (!empty($rcp->mode_reglement_id)) { + $mode_reglement_id = $rcp->mode_reglement_id; + } + if (!empty($rcp->fk_account)) { + $fk_account = $rcp->fk_account; + } + if (!empty($rcp->remise_percent)) { + $remise_percent = $rcp->remise_percent; + } + if (!empty($rcp->remise_absolue)) { + $remise_absolue = $rcp->remise_absolue; + } + if (!empty($rcp->transport_mode_id)) { + $transport_mode_id = $rcp->transport_mode_id; + } + + if (empty($cond_reglement_id) + || empty($mode_reglement_id) + || empty($fk_account) + || empty($remise_percent) + || empty($remise_absolue) + || empty($transport_mode_id) + ) { + if (!isset($rcp->supplier_order)) { + $rcp->fetch_origin(); + } + + // try to get from source of reception (supplier order) + if (!empty($rcp->commandeFournisseur)) { + $supplierOrder = $rcp->commandeFournisseur; + if (empty($cond_reglement_id) && !empty($supplierOrder->cond_reglement_id)) { + $cond_reglement_id = $supplierOrder->cond_reglement_id; + } + if (empty($mode_reglement_id) && !empty($supplierOrder->mode_reglement_id)) { + $mode_reglement_id = $supplierOrder->mode_reglement_id; + } + if (empty($fk_account) && !empty($supplierOrder->fk_account)) { + $fk_account = $supplierOrder->fk_account; + } + if (empty($remise_percent) && !empty($supplierOrder->remise_percent)) { + $remise_percent = $supplierOrder->remise_percent; + } + if (empty($remise_absolue) && !empty($supplierOrder->remise_absolue)) { + $remise_absolue = $supplierOrder->remise_absolue; + } + if (empty($transport_mode_id) && !empty($supplierOrder->transport_mode_id)) { + $transport_mode_id = $supplierOrder->transport_mode_id; + } + } + + // try get from third-party of reception + if (!empty($rcp->thirdparty)) { + $soc = $rcp->thirdparty; + if (empty($cond_reglement_id) && !empty($soc->cond_reglement_supplier_id)) { + $cond_reglement_id = $soc->cond_reglement_supplier_id; + } + if (empty($mode_reglement_id) && !empty($soc->mode_reglement_supplier_id)) { + $mode_reglement_id = $soc->mode_reglement_supplier_id; + } + if (empty($fk_account) && !empty($soc->fk_account)) { + $fk_account = $soc->fk_account; + } + if (empty($remise_percent) && !empty($soc->remise_supplier_percent)) { + $remise_percent = $soc->remise_supplier_percent; + } + if (empty($remise_absolue) && !empty($soc->remise_absolue)) { + $remise_absolue = $soc->remise_absolue; + } + if (empty($transport_mode_id) && !empty($soc->transport_mode_id)) { + $transport_mode_id = $soc->transport_mode_id; + } + } + } + // If we want one invoice per reception or if there is no first invoice yet for this thirdparty. $objecttmp->socid = $rcp->socid; $objecttmp->type = $objecttmp::TYPE_STANDARD; - $objecttmp->cond_reglement_id = $rcp->cond_reglement_id || $rcp->thirdparty->cond_reglement_supplier_id; - $objecttmp->mode_reglement_id = $rcp->mode_reglement_id || $rcp->thirdparty->mode_reglement_supplier_id; - - $objecttmp->fk_account = !empty($rcp->thirdparty->fk_account) ? $rcp->thirdparty->fk_account : 0; - $objecttmp->remise_percent = !empty($rcp->thirdparty->remise_percent) ? $rcp->thirdparty->remise_percent : 0; - $objecttmp->remise_absolue = !empty($rcp->thirdparty->remise_absolue) ? $rcp->thirdparty->remise_absolue : 0; + $objecttmp->cond_reglement_id = $cond_reglement_id; + $objecttmp->mode_reglement_id = $mode_reglement_id; + $objecttmp->fk_account = $fk_account; + $objecttmp->remise_percent = $remise_percent; + $objecttmp->remise_absolue = $remise_absolue; + $objecttmp->transport_mode_id = $transport_mode_id; $objecttmp->fk_project = $rcp->fk_project; //$objecttmp->multicurrency_code = $rcp->multicurrency_code; @@ -247,6 +330,11 @@ if (empty($reshook)) { $objecttmp->origin = 'reception'; $objecttmp->origin_id = $id_reception; + // Auto calculation of date due if not filled by user + if (empty($objecttmp->date_echeance)) { + $objecttmp->date_echeance = $objecttmp->calculate_date_lim_reglement(); + } + $objecttmp->array_options = $rcp->array_options; // Copy extrafields // Set $objecttmp->linked_objects with all links order_supplier existing on reception, so same links will be added to the generated supplier invoice From 1833add141e439011e56691b6f038907ba7adfc3 Mon Sep 17 00:00:00 2001 From: Quentin VIAL-GOUTEYRON Date: Thu, 8 Sep 2022 10:12:40 +0200 Subject: [PATCH 0035/1128] FIX theorical stock when stock calculate on bill --- htdocs/product/class/product.class.php | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 0900f11ed29..bb04f6e9359 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -2990,7 +2990,6 @@ class Product extends CommonObject $sql .= " JOIN ".MAIN_DB_PREFIX."commande c ON el.fk_source = c.rowid "; $sql .= " WHERE c.fk_statut IN (".$this->db->sanitize($filtrestatut).") AND c.facture = 0 AND fd.fk_product = ".((int) $this->id); dol_syslog(__METHOD__.":: sql $sql", LOG_NOTICE); - $resql = $this->db->query($sql); if ($resql) { if ($this->db->num_rows($resql) > 0) { @@ -2999,6 +2998,24 @@ class Product extends CommonObject } } + $this->stats_commande['qty'] -= $adeduire; + } else { + //For every order having invoice already validated we need to decrease stock cause it's in physical stock + $adeduire = 0; + $sql = 'SELECT sum(fd.qty) as count FROM '.MAIN_DB_PREFIX.'facturedet fd '; + $sql .= ' JOIN '.MAIN_DB_PREFIX.'facture f ON fd.fk_facture = f.rowid '; + $sql .= ' JOIN '.MAIN_DB_PREFIX."element_element el ON el.fk_target = f.rowid and el.targettype = 'facture' and sourcetype = 'commande'"; + $sql .= ' JOIN '.MAIN_DB_PREFIX.'commande c ON el.fk_source = c.rowid '; + $sql .= ' WHERE c.fk_statut IN ('.$this->db->sanitize($filtrestatut).') AND f.fk_statut > '.Facture::STATUS_DRAFT.' AND fd.fk_product = '.((int) $this->id); + dol_syslog(__METHOD__.":: sql $sql", LOG_NOTICE); + $resql = $this->db->query($sql); + if($resql) { + if($this->db->num_rows($resql) > 0) { + $obj = $this->db->fetch_object($resql); + $adeduire += $obj->count; + } + } + $this->stats_commande['qty'] -= $adeduire; } } From c4793fdb06a6f59f85defe372621c8c270df999a Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Thu, 8 Sep 2022 08:32:08 +0000 Subject: [PATCH 0036/1128] Fixing style errors. --- htdocs/product/class/product.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index bb04f6e9359..5a1385deb6f 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -3009,8 +3009,8 @@ class Product extends CommonObject $sql .= ' WHERE c.fk_statut IN ('.$this->db->sanitize($filtrestatut).') AND f.fk_statut > '.Facture::STATUS_DRAFT.' AND fd.fk_product = '.((int) $this->id); dol_syslog(__METHOD__.":: sql $sql", LOG_NOTICE); $resql = $this->db->query($sql); - if($resql) { - if($this->db->num_rows($resql) > 0) { + if ($resql) { + if ($this->db->num_rows($resql) > 0) { $obj = $this->db->fetch_object($resql); $adeduire += $obj->count; } From 4fcfe966903ad783639492bc2c0039e2c7553ef9 Mon Sep 17 00:00:00 2001 From: Quentin VIAL-GOUTEYRON Date: Wed, 14 Sep 2022 09:45:18 +0200 Subject: [PATCH 0037/1128] fix two sides --- htdocs/product/class/product.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index bb04f6e9359..670b4548228 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -3004,7 +3004,7 @@ class Product extends CommonObject $adeduire = 0; $sql = 'SELECT sum(fd.qty) as count FROM '.MAIN_DB_PREFIX.'facturedet fd '; $sql .= ' JOIN '.MAIN_DB_PREFIX.'facture f ON fd.fk_facture = f.rowid '; - $sql .= ' JOIN '.MAIN_DB_PREFIX."element_element el ON el.fk_target = f.rowid and el.targettype = 'facture' and sourcetype = 'commande'"; + $sql .= ' JOIN '.MAIN_DB_PREFIX."element_element el ON ((el.fk_target = f.rowid AND el.targettype = 'facture' AND sourcetype = 'commande') OR (el.fk_source = f.rowid AND el.targettype = 'commande' AND sourcetype = 'facture'))"; $sql .= ' JOIN '.MAIN_DB_PREFIX.'commande c ON el.fk_source = c.rowid '; $sql .= ' WHERE c.fk_statut IN ('.$this->db->sanitize($filtrestatut).') AND f.fk_statut > '.Facture::STATUS_DRAFT.' AND fd.fk_product = '.((int) $this->id); dol_syslog(__METHOD__.":: sql $sql", LOG_NOTICE); From 18be0b4f271d428e13949c2fc9441b9576c5a6a6 Mon Sep 17 00:00:00 2001 From: Quentin VIAL-GOUTEYRON Date: Tue, 20 Sep 2022 14:44:43 +0200 Subject: [PATCH 0038/1128] FIX missing facture class inclusion --- htdocs/product/class/product.class.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 705081484fe..ca2418a0ab1 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -2926,7 +2926,6 @@ class Product extends CommonObject { // phpcs:enable global $conf, $user, $hookmanager; - $sql = "SELECT COUNT(DISTINCT c.fk_soc) as nb_customers, COUNT(DISTINCT c.rowid) as nb,"; $sql .= " COUNT(cd.rowid) as nb_rows, SUM(cd.qty) as qty"; $sql .= " FROM ".MAIN_DB_PREFIX."commandedet as cd"; @@ -3000,6 +2999,8 @@ class Product extends CommonObject $this->stats_commande['qty'] -= $adeduire; } else { + include_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; + //For every order having invoice already validated we need to decrease stock cause it's in physical stock $adeduire = 0; $sql = 'SELECT sum(fd.qty) as count FROM '.MAIN_DB_PREFIX.'facturedet fd '; From dc3d0c5c2e78bbe9c9fa1156b96c19422abeeaa3 Mon Sep 17 00:00:00 2001 From: lvessiller Date: Wed, 28 Sep 2022 11:04:09 +0200 Subject: [PATCH 0039/1128] FIX duplicate invoice date --- htdocs/fourn/facture/card.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index d096d02d92c..e6c16d03eed 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -2050,10 +2050,9 @@ if ($action == 'create') { $currency_tx = $objectsrc->multicurrency_tx; } } - - $dateinvoice = empty($conf->global->MAIN_AUTOFILL_DATE) ?-1 : ''; + $datetmp = dol_mktime(12, 0, 0, GETPOST('remonth', 'int'), GETPOST('reday', 'int'), GETPOST('reyear', 'int')); - $dateinvoice = ($datetmp == '' ? (empty($conf->global->MAIN_AUTOFILL_DATE) ?-1 : '') : $datetmp); + $dateinvoice = ($datetmp == '' ? (empty($conf->global->MAIN_AUTOFILL_DATE) ? -1 : '') : $datetmp); $datetmp = dol_mktime(12, 0, 0, GETPOST('echmonth', 'int'), GETPOST('echday', 'int'), GETPOST('echyear', 'int')); $datedue = ($datetmp == '' ?-1 : $datetmp); From 4bcd9220e64d6784453ef324c59b7c6a9bc836c5 Mon Sep 17 00:00:00 2001 From: lvessiller Date: Wed, 28 Sep 2022 11:13:21 +0200 Subject: [PATCH 0040/1128] FIX stickler-ci --- htdocs/fourn/facture/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index e6c16d03eed..d342ddc79d6 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -2050,7 +2050,7 @@ if ($action == 'create') { $currency_tx = $objectsrc->multicurrency_tx; } } - + $datetmp = dol_mktime(12, 0, 0, GETPOST('remonth', 'int'), GETPOST('reday', 'int'), GETPOST('reyear', 'int')); $dateinvoice = ($datetmp == '' ? (empty($conf->global->MAIN_AUTOFILL_DATE) ? -1 : '') : $datetmp); $datetmp = dol_mktime(12, 0, 0, GETPOST('echmonth', 'int'), GETPOST('echday', 'int'), GETPOST('echyear', 'int')); From c268cf379c100c382fe90710ae2ca950edcbacfa Mon Sep 17 00:00:00 2001 From: lvessiller Date: Fri, 30 Sep 2022 14:00:06 +0200 Subject: [PATCH 0041/1128] FIX full day event compare start date in future --- htdocs/comm/action/list.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/htdocs/comm/action/list.php b/htdocs/comm/action/list.php index 674348d6158..d5fb64ec471 100644 --- a/htdocs/comm/action/list.php +++ b/htdocs/comm/action/list.php @@ -944,16 +944,17 @@ while ($i < $imaxinloop) { $event_more_class = ''; $event_start_date_style = ''; $event_start_date_time = $actionstatic->datep; - if ($obj->fulldayevent == 1) { - $today_start_date_time = $today_start_time; - } else { - $today_start_date_time = $now; - } - if ($event_start_date_time > $today_start_date_time) { + if ($event_start_date_time > $now) { // future event $event_more_class = 'event-future'; $event_start_date_color = $conf->global->AGENDA_EVENT_FUTURE_COLOR; } else { + if ($obj->fulldayevent == 1) { + $today_start_date_time = $today_start_time; + } else { + $today_start_date_time = $now; + } + // check event end date $event_end_date_time = $db->jdate($obj->dp2); if ($event_end_date_time != null && $event_end_date_time < $today_start_date_time) { From 069371fc954597341c3f7e889f8919c507e73174 Mon Sep 17 00:00:00 2001 From: lvessiller Date: Fri, 30 Sep 2022 14:12:03 +0200 Subject: [PATCH 0042/1128] FIX reload stickler-ci From f18c84621266c9ff6bee315050318070cafab054 Mon Sep 17 00:00:00 2001 From: lvessiller Date: Mon, 3 Oct 2022 14:33:08 +0200 Subject: [PATCH 0043/1128] FIX user owner cache in event list --- htdocs/comm/action/list.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/comm/action/list.php b/htdocs/comm/action/list.php index d5fb64ec471..8a811a90f22 100644 --- a/htdocs/comm/action/list.php +++ b/htdocs/comm/action/list.php @@ -273,7 +273,6 @@ if (empty($reshook)) { */ $form = new Form($db); -$userstatic = new User($db); $formactions = new FormActions($db); $actionstatic = new ActionComm($db); @@ -927,6 +926,7 @@ while ($i < $imaxinloop) { // cache of user list (owners) if ($obj->fk_user_action > 0 && !isset($cache_user_list[$obj->fk_user_action])) { + $userstatic = new User($db); $res = $userstatic->fetch($obj->fk_user_action); if ($res > 0) { $cache_user_list[$obj->fk_user_action] = $userstatic; @@ -988,6 +988,7 @@ while ($i < $imaxinloop) { if (!empty($arrayfields['owner']['checked'])) { print ''; } - print ''; + if (!$i) { $totalarray['nbfield']++; } From cb3680a91bcc275357286757269846102157115f Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Wed, 26 Oct 2022 15:43:59 +0200 Subject: [PATCH 0051/1128] FIX - td --- htdocs/commande/list_det.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/commande/list_det.php b/htdocs/commande/list_det.php index 089c5dedbe1..7cd3f61c16d 100644 --- a/htdocs/commande/list_det.php +++ b/htdocs/commande/list_det.php @@ -1479,6 +1479,7 @@ if ($resql) { } print ''; } + print ''; } // Détail commande From 0f842fdb3a42b65cf254ff3d5aa9fc35bc30fe60 Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Wed, 26 Oct 2022 16:02:25 +0200 Subject: [PATCH 0052/1128] FIX - $totalarray['nbfield']++; --- htdocs/commande/list_det.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/htdocs/commande/list_det.php b/htdocs/commande/list_det.php index 7cd3f61c16d..cac3d3e50e6 100644 --- a/htdocs/commande/list_det.php +++ b/htdocs/commande/list_det.php @@ -1480,6 +1480,9 @@ if ($resql) { print ''; } print ''; + if (!$i) { + $totalarray['nbfield']++; + } } // Détail commande @@ -2100,10 +2103,9 @@ if ($resql) { print ''; } print ''; - } - - if (!$i) { - $totalarray['nbfield']++; + if (!$i) { + $totalarray['nbfield']++; + } } print "\n"; @@ -2112,7 +2114,7 @@ if ($resql) { $subtotal += $obj->total_ht; $i++; } - + var_dump($totalarray['nbfield']); // Show total line include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php'; From 6c4b77a23c818c9b4225a2cd0659e7e93996835c Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Wed, 26 Oct 2022 18:35:58 +0200 Subject: [PATCH 0053/1128] Hook --- htdocs/commande/list_det.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/commande/list_det.php b/htdocs/commande/list_det.php index cac3d3e50e6..18c096d38c7 100644 --- a/htdocs/commande/list_det.php +++ b/htdocs/commande/list_det.php @@ -1911,7 +1911,7 @@ if ($resql) { include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Date creation @@ -2107,7 +2107,8 @@ if ($resql) { $totalarray['nbfield']++; } } - + // $totalarray['nbfield']--; + // $totalarray['nbfield']--; print "\n"; $total += $obj->total_ht; From 1fc644572d678e455bcbc9d55b7c5ecfd601a556 Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Sat, 29 Oct 2022 21:45:45 +0200 Subject: [PATCH 0054/1128] FIX - totalarray --- htdocs/commande/list_det.php | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/htdocs/commande/list_det.php b/htdocs/commande/list_det.php index 18c096d38c7..7dcd8fb3835 100644 --- a/htdocs/commande/list_det.php +++ b/htdocs/commande/list_det.php @@ -1415,8 +1415,11 @@ if ($resql) { // Détail commande $totalqty = 0; + $totalarray = array(); + $totalarray['nbfield'] = 0; + $totalarray['val']['cdet.total_tva'] = 0; + $totalarray['val']['cdet.total_ttc'] = 0; $imaxinloop = ($limit ? min($num, $limit) : $num); - $last_num = min($num, $limit); while ($i < $imaxinloop) { $obj = $db->fetch_object($resql); @@ -1517,9 +1520,6 @@ if ($resql) { // Product QtyOrdered if (!empty($arrayfields['cdet.qty']['checked'])) { print ''; - if (!$i) { - $totalarray['nbfield']++; - } if (!$i) { $totalarray['pos'][$totalarray['nbfield']] = 'cdet.qty'; } @@ -1528,6 +1528,9 @@ if ($resql) { } else { $totalarray['val']['cdet.qty'] = $obj->qty; } + if (!$i) { + $totalarray['nbfield']++; + } } // Ref @@ -1898,7 +1901,7 @@ if ($resql) { if (!$i) { $totalarray['pos'][$totalarray['nbfield']] = 'total_mark_rate'; } - if ($i >= $last_num - 1) { + if ($i >= $imaxinloop - 1) { if (!empty($total_ht)) { $totalarray['val']['total_mark_rate'] = price2num($total_margin * 100 / $total_ht, 'MT'); } else { From 7baf98d6aa76a7e58c6f4360a6f519b8fec1de7f Mon Sep 17 00:00:00 2001 From: kkhelifa Date: Fri, 4 Nov 2022 16:18:19 +0100 Subject: [PATCH 0055/1128] FIX: Reload page on supplier change and keeping the values of the input already set in the form --- htdocs/fourn/commande/card.php | 17 +++++++++-------- htdocs/fourn/facture/card.php | 15 ++++++++------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index 86e34ce39a1..204b2d724da 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -1616,15 +1616,16 @@ if ($action == 'create') { print img_picto('', 'company').$form->select_company((empty($socid) ? '' : $socid), 'socid', 's.fournisseur=1', 'SelectThirdParty', 0, 0, null, 0, 'minwidth300'); // reload page to retrieve customer informations if (!empty($conf->global->RELOAD_PAGE_ON_SUPPLIER_CHANGE)) { - print ''; + '; } print ' '; } diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index 366047da07c..103748aa541 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -1945,14 +1945,15 @@ if ($action == 'create') { // reload page to retrieve supplier informations if (!empty($conf->global->RELOAD_PAGE_ON_SUPPLIER_CHANGE)) { print ''; + '; } print ' '; } From 60eb3340d11ebb31bfe3286452fb17d3e2410c89 Mon Sep 17 00:00:00 2001 From: kkhelifa Date: Fri, 4 Nov 2022 17:32:48 +0100 Subject: [PATCH 0056/1128] FIX: Fix the prospecting level colomn on contact list by normalize the field namein the table with the name defined in the fields list of the contact class --- htdocs/contact/class/contact.class.php | 12 ++++++------ htdocs/contact/list.php | 16 ++++++++-------- htdocs/install/mysql/migration/13.0.0-14.0.0.sql | 3 +++ htdocs/install/mysql/tables/llx_socpeople.sql | 2 +- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php index 89d84df9426..c7640cca61c 100644 --- a/htdocs/contact/class/contact.class.php +++ b/htdocs/contact/class/contact.class.php @@ -339,9 +339,9 @@ class Contact extends CommonObject $this->fields['fk_soc']['searchall'] = 0; } - if (empty($conf->global->THIRDPARTY_ENABLE_PROSPECTION_ON_ALTERNATIVE_ADRESSES)) { // Default behaviour - $this->field['fk_stcommcontact']['enabled'] = 0; - $this->field['fk_prospectcontactlevel']['enabled'] = 0; + if (!empty($conf->global->SOCIETE_DISABLE_PROSPECTS) || empty($conf->global->THIRDPARTY_ENABLE_PROSPECTION_ON_ALTERNATIVE_ADRESSES)) { // Default behaviour + $this->fields['fk_stcommcontact']['enabled'] = 0; + $this->fields['fk_prospectlevel']['enabled'] = 0; } // Unset fields that are disabled @@ -588,7 +588,7 @@ class Contact extends CommonObject $sql .= ", phone_perso = ".(isset($this->phone_perso) ? "'".$this->db->escape($this->phone_perso)."'" : "NULL"); $sql .= ", phone_mobile = ".(isset($this->phone_mobile) ? "'".$this->db->escape($this->phone_mobile)."'" : "NULL"); $sql .= ", priv = '".$this->db->escape($this->priv)."'"; - $sql .= ", fk_prospectcontactlevel = '".$this->db->escape($this->fk_prospectlevel)."'"; + $sql .= ", fk_prospectlevel = '".$this->db->escape($this->fk_prospectlevel)."'"; if (isset($this->stcomm_id)) { $sql .= ", fk_stcommcontact = ".($this->stcomm_id > 0 || $this->stcomm_id == -1 ? $this->stcomm_id : "0"); } @@ -967,7 +967,7 @@ class Contact extends CommonObject $sql .= " c.socialnetworks,"; $sql .= " c.photo,"; $sql .= " c.priv, c.note_private, c.note_public, c.default_lang, c.canvas,"; - $sql .= " c.fk_prospectcontactlevel, c.fk_stcommcontact, st.libelle as stcomm, st.picto as stcomm_picto,"; + $sql .= " c.fk_prospectlevel, c.fk_stcommcontact, st.libelle as stcomm, st.picto as stcomm_picto,"; $sql .= " c.import_key,"; $sql .= " c.datec as date_creation, c.tms as date_modification,"; $sql .= " co.label as country, co.code as country_code,"; @@ -1034,7 +1034,7 @@ class Contact extends CommonObject $this->poste = $obj->poste; $this->statut = $obj->statut; - $this->fk_prospectlevel = $obj->fk_prospectcontactlevel; + $this->fk_prospectlevel = $obj->fk_prospectlevel; $transcode = $langs->trans('StatusProspect'.$obj->fk_stcommcontact); $libelle = ($transcode != 'StatusProspect'.$obj->fk_stcommcontact ? $transcode : $obj->stcomm); diff --git a/htdocs/contact/list.php b/htdocs/contact/list.php index fd61f16dd0c..1b1d95b60ab 100644 --- a/htdocs/contact/list.php +++ b/htdocs/contact/list.php @@ -369,7 +369,7 @@ $sql = "SELECT s.rowid as socid, s.nom as name,"; $sql .= " p.rowid, p.lastname as lastname, p.statut, p.firstname, p.zip, p.town, p.poste, p.email,"; $sql .= " p.socialnetworks, p.photo,"; $sql .= " p.phone as phone_pro, p.phone_mobile, p.phone_perso, p.fax, p.fk_pays, p.priv, p.datec as date_creation, p.tms as date_update,"; -$sql .= " st.libelle as stcomm, st.picto as stcomm_picto, p.fk_stcommcontact as stcomm_id, p.fk_prospectcontactlevel,"; +$sql .= " st.libelle as stcomm, st.picto as stcomm_picto, p.fk_stcommcontact as stcomm_id, p.fk_prospectlevel,"; $sql .= " co.label as country, co.code as country_code"; // Add fields from extrafields if (!empty($extrafields->attributes[$object->table_element]['label'])) { @@ -411,7 +411,7 @@ if (!empty($userid)) { // propre au commercial $sql .= " AND p.fk_user_creat=".((int) $userid); } if ($search_level) { - $sql .= natural_search("p.fk_prospectcontactlevel", join(',', $search_level), 3); + $sql .= natural_search("p.fk_prospectlevel", join(',', $search_level), 3); } if ($search_stcomm != '' && $search_stcomm != -2) { $sql .= natural_search("p.fk_stcommcontact", $search_stcomm, 2); @@ -877,7 +877,7 @@ if (!empty($arrayfields['p.priv']['checked'])) { print ''; } // Prospect level -if (!empty($arrayfields['p.fk_prospectcontactlevel']['checked'])) { +if (!empty($arrayfields['p.fk_prospectlevel']['checked'])) { print ''; @@ -987,8 +987,8 @@ if (!empty($arrayfields['s.nom']['checked'])) { if (!empty($arrayfields['p.priv']['checked'])) { print_liste_field_titre($arrayfields['p.priv']['label'], $_SERVER["PHP_SELF"], "p.priv", $begin, $param, '', $sortfield, $sortorder, 'center '); } -if (!empty($arrayfields['p.fk_prospectcontactlevel']['checked'])) { - print_liste_field_titre($arrayfields['p.fk_prospectcontactlevel']['label'], $_SERVER["PHP_SELF"], "p.fk_prospectcontactlevel", "", $param, '', $sortfield, $sortorder, 'center '); +if (!empty($arrayfields['p.fk_prospectlevel']['checked'])) { + print_liste_field_titre($arrayfields['p.fk_prospectlevel']['label'], $_SERVER["PHP_SELF"], "p.fk_prospectlevel", "", $param, '', $sortfield, $sortorder, 'center '); } if (!empty($arrayfields['p.fk_stcommcontact']['checked'])) { print_liste_field_titre($arrayfields['p.fk_stcommcontact']['label'], $_SERVER["PHP_SELF"], "p.fk_stcommcontact", "", $param, '', $sortfield, $sortorder, 'center '); @@ -1042,9 +1042,9 @@ while ($i < min($num, $limit)) { $contactstatic->country_code = $obj->country_code; $contactstatic->photo = $obj->photo; - $contactstatic->fk_prospectlevel = $obj->fk_prospectcontactlevel; + $contactstatic->fk_prospectlevel = $obj->fk_prospectlevel; - print ''; + print ''; // ID if (!empty($arrayfields['p.rowid']['checked'])) { @@ -1196,7 +1196,7 @@ while ($i < min($num, $limit)) { } } - if (!empty($arrayfields['p.fk_prospectcontactlevel']['checked'])) { + if (!empty($arrayfields['p.fk_prospectlevel']['checked'])) { // Prospect level print ''; } + if (!empty($arrayfields['c.fk_warehouse']['checked'])) { + // Warehouse + print ''; + } if (!empty($arrayfields['c.multicurrency_code']['checked'])) { // Currency print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } // Currency if (!empty($arrayfields['c.multicurrency_code']['checked'])) { print '\n"; From 8ce49001a751d3c0a83429864b639288b4372134 Mon Sep 17 00:00:00 2001 From: Artem Chernitsov Date: Mon, 14 Nov 2022 18:10:31 +0200 Subject: [PATCH 0059/1128] Add abbility of ODT support to supplier invoices --- htdocs/admin/supplier_invoice.php | 2 + htdocs/core/actions_setmoduleoptions.inc.php | 4 + htdocs/core/lib/files.lib.php | 1 + htdocs/core/modules/modFournisseur.class.php | 46 +- ...c_generic_supplier_invoice_odt.modules.php | 503 ++++++++++++++++++ .../doctemplates/supplier_invoices/index.html | 0 .../template_supplier_invoices.odt | Bin 0 -> 25866 bytes 7 files changed, 552 insertions(+), 4 deletions(-) create mode 100644 htdocs/core/modules/supplier_invoice/doc/doc_generic_supplier_invoice_odt.modules.php create mode 100644 htdocs/install/doctemplates/supplier_invoices/index.html create mode 100644 htdocs/install/doctemplates/supplier_invoices/template_supplier_invoices.odt diff --git a/htdocs/admin/supplier_invoice.php b/htdocs/admin/supplier_invoice.php index bc587845cda..c095b778e8b 100644 --- a/htdocs/admin/supplier_invoice.php +++ b/htdocs/admin/supplier_invoice.php @@ -56,6 +56,8 @@ $specimenthirdparty->initAsSpecimen(); * Actions */ +include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php'; + if ($action == 'updateMask') { $maskconstinvoice = GETPOST('maskconstinvoice', 'alpha'); $maskconstcredit = GETPOST('maskconstcredit', 'alpha'); diff --git a/htdocs/core/actions_setmoduleoptions.inc.php b/htdocs/core/actions_setmoduleoptions.inc.php index 797bb8e4cb7..e45365bceb1 100644 --- a/htdocs/core/actions_setmoduleoptions.inc.php +++ b/htdocs/core/actions_setmoduleoptions.inc.php @@ -90,6 +90,7 @@ if ($action == 'setModuleOptions') { include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; $keyforuploaddir = GETPOST('keyforuploaddir', 'aZ09'); $listofdir = explode(',', preg_replace('/[\r\n]+/', ',', trim($conf->global->$keyforuploaddir))); + foreach ($listofdir as $key => $tmpdir) { $tmpdir = trim($tmpdir); $tmpdir = preg_replace('/DOL_DATA_ROOT/', DOL_DATA_ROOT, $tmpdir); @@ -105,7 +106,10 @@ if ($action == 'setModuleOptions') { $upload_dir = $tmpdir; } } + + if ($upload_dir) { + $result = dol_add_file_process($upload_dir, 1, 1, 'uploadfile', ''); if ($result <= 0) { $error++; diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index 21c290b595d..391801c4e7c 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -1568,6 +1568,7 @@ function dol_init_file_process($pathtoscan = '', $trackid = '') */ function dol_add_file_process($upload_dir, $allowoverwrite = 0, $donotupdatesession = 0, $varfiles = 'addedfile', $savingdocmask = '', $link = null, $trackid = '', $generatethumbs = 1, $object = null) { + global $db, $user, $conf, $langs; $res = 0; diff --git a/htdocs/core/modules/modFournisseur.class.php b/htdocs/core/modules/modFournisseur.class.php index d65d9674f59..63134340891 100644 --- a/htdocs/core/modules/modFournisseur.class.php +++ b/htdocs/core/modules/modFournisseur.class.php @@ -96,14 +96,25 @@ class modFournisseur extends DolibarrModules $this->const[$r][4] = 0; $r++; - /* For supplier invoice, we must not have default pdf template on. In most cases, we need to join PDF from supplier, not have a document generated. + /* OLD For supplier invoice, we must not have default pdf template on. In most cases, we need to join PDF from supplier, not have a document generated. + NEW Uncomment to add ability to generate PDF for Supplier Invoices which generated not from Order. + */ + $this->const[$r][0] = "INVOICE_SUPPLIER_ADDON_PDF"; $this->const[$r][1] = "chaine"; $this->const[$r][2] = "canelle"; $this->const[$r][3] = 'Nom du gestionnaire de generation des factures fournisseur en PDF'; $this->const[$r][4] = 0; $r++; - */ + + // Add abbility ODT for Supplier Invoices + $this->const[$r][0] = "SUPPLIER_INVOICE_ADDON_PDF_ODT_PATH"; + $this->const[$r][1] = "chaine"; + $this->const[$r][2] = "DOL_DATA_ROOT/doctemplates/supplier_invoices"; + $this->const[$r][3] = ""; + $this->const[$r][4] = 0; + $r++; + $this->const[$r][0] = "INVOICE_SUPPLIER_ADDON_NUMBER"; $this->const[$r][1] = "chaine"; @@ -840,7 +851,7 @@ class modFournisseur extends DolibarrModules $this->remove($options); - //ODT template + //ODT template for Supplier Orders $src = DOL_DOCUMENT_ROOT.'/install/doctemplates/supplier_orders/template_supplier_order.odt'; $dirodt = DOL_DATA_ROOT.'/doctemplates/supplier_orders'; $dest = $dirodt.'/template_supplier_order.odt'; @@ -856,11 +867,38 @@ class modFournisseur extends DolibarrModules } } - $sql = array( + $sql_order = array( "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->db->escape($this->const[0][2])."' AND type = 'order_supplier' AND entity = ".$conf->entity, "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->db->escape($this->const[0][2])."','order_supplier',".$conf->entity.")", ); + + + //ODT template for Supplier Invoice + $src = DOL_DOCUMENT_ROOT.'/install/doctemplates/supplier_invoices/template_supplier_invoices.odt'; + $dirodt = DOL_DATA_ROOT.'/doctemplates/supplier_invoices'; + $dest = $dirodt.'/template_supplier_invoices.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_invoice = array( + "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->db->escape($this->const[2][2])."' AND type = 'invoice_supplier' AND entity = ".$conf->entity, + "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->db->escape($this->const[2][2])."','invoice_supplier',".$conf->entity.")", + ); + + $sql = array_merge($sql_order, $sql_invoice); + //var_dump($sql); + //die; + return $this->_init($sql, $options); } } diff --git a/htdocs/core/modules/supplier_invoice/doc/doc_generic_supplier_invoice_odt.modules.php b/htdocs/core/modules/supplier_invoice/doc/doc_generic_supplier_invoice_odt.modules.php new file mode 100644 index 00000000000..8d1f9713c00 --- /dev/null +++ b/htdocs/core/modules/supplier_invoice/doc/doc_generic_supplier_invoice_odt.modules.php @@ -0,0 +1,503 @@ + + * Copyright (C) 2012 Juanjo Menent + * Copyright (C) 2014 Marcos García + * Copyright (C) 2016 Charlie Benke + * Copyright (C) 2018-2019 Philippe Grand + * Copyright (C) 2018-2019 Frédéric France + * Copyright (C) 2019 Tim Otte + * + * 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/ + */ + +/** + * \file htdocs/core/modules/supplier_invoce/doc/doc_generic_supplier_invoice_odt.modules.php + * \ingroup facture + * \brief File of class to build ODT documents for supplier invoices + */ + +require_once DOL_DOCUMENT_ROOT.'/core/modules/supplier_invoice/modules_facturefournisseur.php'; +require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; +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/files.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/doc.lib.php'; + + +/** + * Class to build documents using ODF templates generator + */ +class doc_generic_supplier_invoice_odt extends ModelePDFSuppliersInvoices +{ + /** + * Issuer + * @var Societe + */ + public $issuer; + + /** + * @var array Minimum version of PHP required by module. + * e.g.: PHP ≥ 5.6 = array(5, 6) + */ + public $phpmin = array(5, 6); + + /** + * @var string Dolibarr version of the loaded document + */ + public $version = 'dolibarr'; + + + /** + * Constructor + * + * @param DoliDB $db Database handler + */ + public function __construct($db) + { + global $conf, $langs, $mysoc; + + // Load translation files required by the page + $langs->loadLangs(array("main", "companies")); + + $this->db = $db; + $this->name = "ODT templates"; + $this->description = $langs->trans("DocumentModelOdt"); + $this->scandir = 'SUPPLIER_INVOICE_ADDON_PDF_ODT_PATH'; // Name of constant that is used to save list of directories to scan + // Page size for A4 format + $this->type = 'odt'; + $this->page_largeur = 0; + $this->page_hauteur = 0; + $this->format = array($this->page_largeur, $this->page_hauteur); + $this->marge_gauche = 0; + $this->marge_droite = 0; + $this->marge_haute = 0; + $this->marge_basse = 0; + + $this->option_logo = 1; // Display logo + $this->option_tva = 0; // Manage the vat option FACTURE_TVAOPTION + $this->option_modereg = 0; // Display payment mode + $this->option_condreg = 0; // Display payment terms + $this->option_codeproduitservice = 0; // Display product-service code + $this->option_multilang = 1; // Available in several languages + $this->option_escompte = 0; // Displays if there has been a discount + $this->option_credit_note = 0; // Support credit notes + $this->option_freetext = 1; // Support add of a personalised text + $this->option_draft_watermark = 0; // Support add of a watermark on drafts + + // Recupere issuer + $this->issuer = $mysoc; + if (!$this->issuer->country_code) { + $this->issuer->country_code = substr($langs->defaultlang, -2); // By default if not defined + } + } + + + /** + * Return description of a module + * + * @param Translate $langs Lang object to use for output + * @return string Description + */ + public function info($langs) + { + global $conf, $langs; + + // Load translation files required by the page + $langs->loadLangs(array("errors", "companies")); + + $form = new Form($this->db); + + $texte = $this->description.".
\n"; + $texte .= ''; + $texte .= ''; + $texte .= ''; + $texte .= ''; + $texte .= '
'; @@ -1427,18 +1402,6 @@ if ($resql) { print ''; - print ''; - print ''; @@ -1705,15 +1668,6 @@ if ($resql) { if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', $param, '', $sortfield, $sortorder, 'maxwidthsearch center '); } - - - if (!empty($arrayfields['pr.desc']['checked'])) { - print_liste_field_titre($arrayfields['pr.desc']['label'], $_SERVER["PHP_SELF"], 'pr.desc', '', $param, '', $sortfield, $sortorder); - } - if (!empty($arrayfields['cdet.qty']['checked'])) { - print_liste_field_titre($arrayfields['cdet.qty']['label'], $_SERVER["PHP_SELF"], 'cdet.qty', '', $param, '', $sortfield, $sortorder); - } - if (!empty($arrayfields['c.ref']['checked'])) { print_liste_field_titre($arrayfields['c.ref']['label'], $_SERVER["PHP_SELF"], 'c.ref', '', $param, '', $sortfield, $sortorder); } @@ -1885,8 +1839,6 @@ if ($resql) { $total_ht = 0; $total_margin = 0; - - $imaxinloop = ($limit ? min($num, $limit) : $num); $last_num = min($num, $limit); while ($i < $imaxinloop) { From b3c903723f3e3335be8f8a8fe426cd5312c846b3 Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Tue, 23 Aug 2022 11:37:08 +0200 Subject: [PATCH 0027/1128] Add menu and clean --- htdocs/commande/list_line.php | 33 +++++++------------------ htdocs/core/menus/standard/eldy.lib.php | 3 +++ htdocs/langs/en_US/orders.lang | 1 + 3 files changed, 13 insertions(+), 24 deletions(-) diff --git a/htdocs/commande/list_line.php b/htdocs/commande/list_line.php index ac1885b03af..219d8745587 100644 --- a/htdocs/commande/list_line.php +++ b/htdocs/commande/list_line.php @@ -75,7 +75,6 @@ $search_product_category = GETPOST('search_product_category', 'int'); // Détail commande $search_refProduct = GETPOST('search_refProduct', 'alpha'); $search_descProduct = GETPOST('search_descProduct', 'alpha'); -$check_orderdetail = GETPOST('check_orderdetail', 'alpha'); $search_ref = GETPOST('search_ref', 'alpha') != '' ?GETPOST('search_ref', 'alpha') : GETPOST('sref', 'alpha'); $search_ref_customer = GETPOST('search_ref_customer', 'alpha'); @@ -169,6 +168,10 @@ if (empty($user->socid)) { $checkedtypetiers = 0; $arrayfields = array( + // Détail commande + 'pr.ref'=> array('label'=>'ProductRef', 'checked'=>1, 'position'=>1), + 'pr.desc'=> array('label'=>'ProductDescription', 'checked'=>1, 'position'=>1), + 'cdet.qty'=> array('label'=>'QtyOrdered', 'checked'=>1, 'position'=>1), 'c.ref'=>array('label'=>"Ref", 'checked'=>1, 'position'=>5), 'c.ref_client'=>array('label'=>"RefCustomerOrder", 'checked'=>-1, 'position'=>10), 'p.ref'=>array('label'=>"ProjectRef", 'checked'=>-1, 'enabled'=>(empty($conf->project->enabled) ? 0 : 1), 'position'=>20), @@ -211,13 +214,6 @@ $arrayfields = array( 'c.fk_statut'=>array('label'=>"Status", 'checked'=>1, 'position'=>1000) ); -// Détail commande -if (!empty($check_orderdetail)) { - $arrayfields['cdet.qty'] = array('label'=>'QtyOrdered', 'checked'=>1, 'position'=>1); - $arrayfields['pr.desc'] = array('label'=>'ProductDescription', 'checked'=>1, 'position'=>1); - $arrayfields['pr.ref'] = array('label'=>'ProductRef', 'checked'=>1, 'position'=>1); -} - // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php'; @@ -810,10 +806,8 @@ $sql .= ' c.fk_cond_reglement,c.deposit_percent,c.fk_mode_reglement,c.fk_shippin $sql .= ' c.fk_input_reason, c.import_key'; // Détail commande -if (!empty($check_orderdetail)) { - $sql .= ', cdet.description, cdet.qty, '; - $sql .= ' pr.rowid as product_rowid, pr.ref as product_ref, pr.label as product_label, pr.barcode as product_barcode, pr.tobatch as product_batch, pr.tosell as product_status, pr.tobuy as product_status_buy'; -} +$sql .= ', cdet.description, cdet.qty, '; +$sql .= ' pr.rowid as product_rowid, pr.ref as product_ref, pr.label as product_label, pr.barcode as product_barcode, pr.tobatch as product_batch, pr.tosell as product_status, pr.tobuy as product_status_buy'; if (($search_categ_cus > 0) || ($search_categ_cus == -2)) { $sql .= ", cc.fk_categorie, cc.fk_soc"; @@ -837,13 +831,9 @@ if (($search_categ_cus > 0) || ($search_categ_cus == -2)) { } // Détail commande -if (!empty($check_orderdetail)) { - $sql .= ', '.MAIN_DB_PREFIX.'commandedet as cdet'; - $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'commande as c ON cdet.fk_commande=c.rowid'; - $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'product as pr ON pr.rowid=cdet.fk_product'; -} else { - $sql .= ', '.MAIN_DB_PREFIX.'commande as c'; -} +$sql .= ', '.MAIN_DB_PREFIX.'commandedet as cdet'; +$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'commande as c ON cdet.fk_commande=c.rowid'; +$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'product as pr ON pr.rowid=cdet.fk_product'; if (!empty($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) { $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."commande_extrafields as ef on (c.rowid = ef.fk_object)"; @@ -1353,11 +1343,6 @@ if ($resql) { print '
'; } - // Détail commande - if (!empty($conf->global->ORDER_ADD_OPTION_SHOW_DETAIL_LIST)) { - print '
 
'; - } - if ($sall) { foreach ($fieldstosearchall as $key => $val) { $fieldstosearchall[$key] = $langs->trans($val); diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index 4707657d3e3..e4e6c8e2839 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -1324,6 +1324,9 @@ function get_left_menu_commercial($mainmenu, &$newmenu, $usemenuhider = 1, $left //$newmenu->add("/commande/list.php?leftmenu=orders&search_status=4", $langs->trans("StatusOrderProcessed"), 2, $user->rights->commande->lire); $newmenu->add("/commande/list.php?leftmenu=orders&search_status=-1", $langs->trans("StatusOrderCanceledShort"), 2, $user->rights->commande->lire); } + if ($conf->global->MAIN_FEATURES_LEVEL >= 2 && empty($user->socid)) { + $newmenu->add("/commande/list_line.php?leftmenu=orders", $langs->trans("ListOrderLigne"), 1, $user->rights->commande->lire); + } $newmenu->add("/commande/stats/index.php?leftmenu=orders", $langs->trans("Statistics"), 1, $user->rights->commande->lire); } diff --git a/htdocs/langs/en_US/orders.lang b/htdocs/langs/en_US/orders.lang index 78a5e348516..cb64d1b603a 100644 --- a/htdocs/langs/en_US/orders.lang +++ b/htdocs/langs/en_US/orders.lang @@ -96,6 +96,7 @@ OrdersStatisticsSuppliers=Purchase order statistics NumberOfOrdersByMonth=Number of orders by month AmountOfOrdersByMonthHT=Amount of orders by month (excl. tax) ListOfOrders=List of orders +ListOrderLigne=Lines of orders CloseOrder=Close order ConfirmCloseOrder=Are you sure you want to set this order to delivered? Once an order is delivered, it can be set to billed. ConfirmDeleteOrder=Are you sure you want to delete this order? From d7387ecd17ac974351de6dcd5919be717bd9632f Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Tue, 23 Aug 2022 12:33:03 +0200 Subject: [PATCH 0028/1128] optimise --- htdocs/commande/list_line.php | 606 +++------------------------------- 1 file changed, 49 insertions(+), 557 deletions(-) diff --git a/htdocs/commande/list_line.php b/htdocs/commande/list_line.php index 219d8745587..9437daebf33 100644 --- a/htdocs/commande/list_line.php +++ b/htdocs/commande/list_line.php @@ -189,9 +189,9 @@ $arrayfields = array( 'c.fk_cond_reglement'=>array('label'=>"PaymentConditionsShort", 'checked'=>-1, 'position'=>67), 'c.fk_mode_reglement'=>array('label'=>"PaymentMode", 'checked'=>-1, 'position'=>68), 'c.fk_input_reason'=>array('label'=>"Channel", 'checked'=>-1, 'position'=>69), - 'c.total_ht'=>array('label'=>"AmountHT", 'checked'=>1, 'position'=>75), + 'cdet.total_ht'=>array('label'=>"AmountHT", 'checked'=>1, 'position'=>75), 'c.total_vat'=>array('label'=>"AmountVAT", 'checked'=>0, 'position'=>80), - 'c.total_ttc'=>array('label'=>"AmountTTC", 'checked'=>0, 'position'=>85), + 'cdet.total_ttc'=>array('label'=>"AmountTTC", 'checked'=>0, 'position'=>85), 'c.multicurrency_code'=>array('label'=>'Currency', 'checked'=>0, 'enabled'=>(empty($conf->multicurrency->enabled) ? 0 : 1), 'position'=>90), 'c.multicurrency_tx'=>array('label'=>'CurrencyRate', 'checked'=>0, 'enabled'=>(empty($conf->multicurrency->enabled) ? 0 : 1), 'position'=>95), 'c.multicurrency_total_ht'=>array('label'=>'MulticurrencyAmountHT', 'checked'=>0, 'enabled'=>(empty($conf->multicurrency->enabled) ? 0 : 1), 'position'=>100), @@ -314,458 +314,12 @@ if (empty($reshook)) { $uploaddir = $conf->commande->multidir_output[$conf->entity]; $triggersendname = 'ORDER_SENTBYMAIL'; include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php'; - - if ($massaction == 'confirm_createbills') { // Create bills from orders. - $orders = GETPOST('toselect', 'array'); - $createbills_onebythird = GETPOST('createbills_onebythird', 'int'); - $validate_invoices = GETPOST('validate_invoices', 'int'); - - $errors = array(); - - $TFact = array(); - $TFactThird = array(); - $TFactThirdNbLines = array(); - - $nb_bills_created = 0; - $lastid= 0; - $lastref = ''; - - $db->begin(); - - $nbOrders = is_array($orders) ? count($orders) : 1; - - foreach ($orders as $id_order) { - $cmd = new Commande($db); - if ($cmd->fetch($id_order) <= 0) { - continue; - } - $cmd->fetch_thirdparty(); - - $objecttmp = new Facture($db); - if (!empty($createbills_onebythird) && !empty($TFactThird[$cmd->socid])) { - // If option "one bill per third" is set, and an invoice for this thirdparty was already created, we re-use it. - $objecttmp = $TFactThird[$cmd->socid]; - } else { - // If we want one invoice per order or if there is no first invoice yet for this thirdparty. - $objecttmp->socid = $cmd->socid; - $objecttmp->thirdparty = $cmd->thirdparty; - - $objecttmp->type = $objecttmp::TYPE_STANDARD; - $objecttmp->cond_reglement_id = !empty($cmd->cond_reglement_id) ? $cmd->cond_reglement_id : $cmd->thirdparty->cond_reglement_id; - $objecttmp->mode_reglement_id = !empty($cmd->mode_reglement_id) ? $cmd->mode_reglement_id : $cmd->thirdparty->mode_reglement_id; - - $objecttmp->fk_project = $cmd->fk_project; - $objecttmp->multicurrency_code = $cmd->multicurrency_code; - if (empty($createbills_onebythird)) { - $objecttmp->ref_client = $cmd->ref_client; - } - - $datefacture = dol_mktime(12, 0, 0, GETPOST('remonth', 'int'), GETPOST('reday', 'int'), GETPOST('reyear', 'int')); - if (empty($datefacture)) { - $datefacture = dol_now(); - } - - $objecttmp->date = $datefacture; - $objecttmp->origin = 'commande'; - $objecttmp->origin_id = $id_order; - - $objecttmp->array_options = $cmd->array_options; // Copy extrafields - - $res = $objecttmp->create($user); - - if ($res > 0) { - $nb_bills_created++; - $lastref = $objecttmp->ref; - $lastid = $objecttmp->id; - - $TFactThird[$cmd->socid] = $objecttmp; - $TFactThirdNbLines[$cmd->socid] = 0; //init nblines to have lines ordered by expedition and rang - } else { - $langs->load("errors"); - $errors[] = $cmd->ref.' : '.$langs->trans($objecttmp->errors[0]); - $error++; - } - } - - if ($objecttmp->id > 0) { - $res = $objecttmp->add_object_linked($objecttmp->origin, $id_order); - - if ($res == 0) { - $errors[] = $cmd->ref.' : '.$langs->trans($objecttmp->errors[0]); - $error++; - } - - if (!$error) { - $lines = $cmd->lines; - if (empty($lines) && method_exists($cmd, 'fetch_lines')) { - $cmd->fetch_lines(); - $lines = $cmd->lines; - } - - $fk_parent_line = 0; - $num = count($lines); - - for ($i = 0; $i < $num; $i++) { - $desc = ($lines[$i]->desc ? $lines[$i]->desc : ''); - // If we build one invoice for several orders, we must put the ref of order on the invoice line - if (!empty($createbills_onebythird)) { - $desc = dol_concatdesc($desc, $langs->trans("Order").' '.$cmd->ref.' - '.dol_print_date($cmd->date, 'day')); - } - - if ($lines[$i]->subprice < 0) { - // Negative line, we create a discount line - $discount = new DiscountAbsolute($db); - $discount->fk_soc = $objecttmp->socid; - $discount->amount_ht = abs($lines[$i]->total_ht); - $discount->amount_tva = abs($lines[$i]->total_tva); - $discount->amount_ttc = abs($lines[$i]->total_ttc); - $discount->tva_tx = $lines[$i]->tva_tx; - $discount->fk_user = $user->id; - $discount->description = $desc; - $discountid = $discount->create($user); - if ($discountid > 0) { - $result = $objecttmp->insert_discount($discountid); - //$result=$discount->link_to_invoice($lineid,$id); - } else { - setEventMessages($discount->error, $discount->errors, 'errors'); - $error++; - break; - } - } else { - // Positive line - $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0); - // Date start - $date_start = false; - if ($lines[$i]->date_debut_prevue) { - $date_start = $lines[$i]->date_debut_prevue; - } - if ($lines[$i]->date_debut_reel) { - $date_start = $lines[$i]->date_debut_reel; - } - if ($lines[$i]->date_start) { - $date_start = $lines[$i]->date_start; - } - //Date end - $date_end = false; - if ($lines[$i]->date_fin_prevue) { - $date_end = $lines[$i]->date_fin_prevue; - } - if ($lines[$i]->date_fin_reel) { - $date_end = $lines[$i]->date_fin_reel; - } - if ($lines[$i]->date_end) { - $date_end = $lines[$i]->date_end; - } - // Reset fk_parent_line for no child products and special product - if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) { - $fk_parent_line = 0; - } - - // Extrafields - if (method_exists($lines[$i], 'fetch_optionals')) { - $lines[$i]->fetch_optionals(); - $array_options = $lines[$i]->array_options; - } - - $objecttmp->context['createfromclone']; - - $rang = ($nbOrders > 1) ? -1 : $lines[$i]->rang; - //there may already be rows from previous orders - if (!empty($createbills_onebythird)) { - $rang = $TFactThirdNbLines[$cmd->socid]; - } - - $result = $objecttmp->addline( - $desc, - $lines[$i]->subprice, - $lines[$i]->qty, - $lines[$i]->tva_tx, - $lines[$i]->localtax1_tx, - $lines[$i]->localtax2_tx, - $lines[$i]->fk_product, - $lines[$i]->remise_percent, - $date_start, - $date_end, - 0, - $lines[$i]->info_bits, - $lines[$i]->fk_remise_except, - 'HT', - 0, - $product_type, - $rang, - $lines[$i]->special_code, - $objecttmp->origin, - $lines[$i]->rowid, - $fk_parent_line, - $lines[$i]->fk_fournprice, - $lines[$i]->pa_ht, - $lines[$i]->label, - $array_options, - 100, - 0, - $lines[$i]->fk_unit - ); - if ($result > 0) { - $lineid = $result; - if (!empty($createbills_onebythird)) //increment rang to keep order - $TFactThirdNbLines[$rcp->socid]++; - } else { - $lineid = 0; - $error++; - break; - } - // Defined the new fk_parent_line - if ($result > 0 && $lines[$i]->product_type == 9) { - $fk_parent_line = $result; - } - } - } - } - } - - //$cmd->classifyBilled($user); // Disabled. This behavior must be set or not using the workflow module. - - if (!empty($createbills_onebythird) && empty($TFactThird[$cmd->socid])) { - $TFactThird[$cmd->socid] = $objecttmp; - } else { - $TFact[$objecttmp->id] = $objecttmp; - } - } - - // Build doc with all invoices - $TAllFact = empty($createbills_onebythird) ? $TFact : $TFactThird; - $toselect = array(); - - if (!$error && $validate_invoices) { - $massaction = $action = 'builddoc'; - - foreach ($TAllFact as &$objecttmp) { - $result = $objecttmp->validate($user); - if ($result <= 0) { - $error++; - setEventMessages($objecttmp->error, $objecttmp->errors, 'errors'); - break; - } - - $id = $objecttmp->id; // For builddoc action - - // Builddoc - $donotredirect = 1; - $upload_dir = $conf->facture->dir_output; - $permissiontoadd = $user->rights->facture->creer; - - // Call action to build doc - $savobject = $object; - $object = $objecttmp; - include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php'; - $object = $savobject; - } - - $massaction = $action = 'confirm_createbills'; - } - - if (!$error) { - $db->commit(); - - if ($nb_bills_created == 1) { - $texttoshow = $langs->trans('BillXCreated', '{s1}'); - $texttoshow = str_replace('{s1}', ''.$lastref.'', $texttoshow); - setEventMessages($texttoshow, null, 'mesgs'); - } else { - setEventMessages($langs->trans('BillCreated', $nb_bills_created), null, 'mesgs'); - } - - // Make a redirect to avoid to bill twice if we make a refresh or back - $param = ''; - if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { - $param .= '&contextpage='.urlencode($contextpage); - } - if ($limit > 0 && $limit != $conf->liste_limit) { - $param .= '&limit='.urlencode($limit); - } - if ($sall) { - $param .= '&sall='.urlencode($sall); - } - if ($socid > 0) { - $param .= '&socid='.urlencode($socid); - } - if ($search_status != '') { - $param .= '&search_status='.urlencode($search_status); - } - if ($search_orderday) { - $param .= '&search_orderday='.urlencode($search_orderday); - } - if ($search_ordermonth) { - $param .= '&search_ordermonth='.urlencode($search_ordermonth); - } - if ($search_orderyear) { - $param .= '&search_orderyear='.urlencode($search_orderyear); - } - if ($search_deliveryday) { - $param .= '&search_deliveryday='.urlencode($search_deliveryday); - } - if ($search_deliverymonth) { - $param .= '&search_deliverymonth='.urlencode($search_deliverymonth); - } - if ($search_deliveryyear) { - $param .= '&search_deliveryyear='.urlencode($search_deliveryyear); - } - if ($search_ref) { - $param .= '&search_ref='.urlencode($search_ref); - } - if ($search_company) { - $param .= '&search_company='.urlencode($search_company); - } - if ($search_ref_customer) { - $param .= '&search_ref_customer='.urlencode($search_ref_customer); - } - if ($search_user > 0) { - $param .= '&search_user='.urlencode($search_user); - } - if ($search_sale > 0) { - $param .= '&search_sale='.urlencode($search_sale); - } - if ($search_total_ht != '') { - $param .= '&search_total_ht='.urlencode($search_total_ht); - } - if ($search_total_vat != '') { - $param .= '&search_total_vat='.urlencode($search_total_vat); - } - if ($search_total_ttc != '') { - $param .= '&search_total_ttc='.urlencode($search_total_ttc); - } - if ($search_project_ref >= 0) { - $param .= "&search_project_ref=".urlencode($search_project_ref); - } - if ($show_files) { - $param .= '&show_files='.urlencode($show_files); - } - if ($optioncss != '') { - $param .= '&optioncss='.urlencode($optioncss); - } - if ($billed != '') { - $param .= '&billed='.urlencode($billed); - } - - header("Location: ".$_SERVER['PHP_SELF'].'?'.$param); - exit; - } else { - $db->rollback(); - - $action = 'create'; - $_GET["origin"] = $_POST["origin"]; - $_GET["originid"] = $_POST["originid"]; - if (!empty($errors)) { - setEventMessages(null, $errors, 'errors'); - } else { - setEventMessages("Error", null, 'errors'); - } - $error++; - } - } -} -if ($action == 'validate' && $permissiontoadd) { - if (GETPOST('confirm') == 'yes') { - $objecttmp = new $objectclass($db); - $db->begin(); - $error = 0; - foreach ($toselect as $checked) { - if ($objecttmp->fetch($checked)) { - if ($objecttmp->statut == 0) { - if (!empty($objecttmp->fk_warehouse)) { - $idwarehouse = $objecttmp->fk_warehouse; - } else { - $idwarehouse = 0; - } - if ($objecttmp->valid($user, $idwarehouse)) { - setEventMessage($langs->trans('hasBeenValidated', $objecttmp->ref), 'mesgs'); - } else { - setEventMessage($objecttmp->error, $objecttmp->errors, 'errors'); - $error++; - } - } else { - $langs->load("errors"); - setEventMessage($langs->trans('ErrorIsNotADraft', $objecttmp->ref), 'errors'); - $error++; - } - } else { - dol_print_error($db); - $error++; - } - } - if ($error) { - $db->rollback(); - } else { - $db->commit(); - } - } -} -if ($action == 'shipped' && $permissiontoadd) { - if (GETPOST('confirm') == 'yes') { - $objecttmp = new $objectclass($db); - $db->begin(); - $error = 0; - foreach ($toselect as $checked) { - if ($objecttmp->fetch($checked)) { - if ($objecttmp->statut == 1 || $objecttmp->statut == 2) { - if ($objecttmp->cloture($user)) { - setEventMessage($langs->trans('PassedInClosedStatus', $objecttmp->ref), 'mesgs'); - } else { - setEventMessage($langs->trans('CantBeClosed'), 'errors'); - $error++; - } - } else { - $langs->load("errors"); - setEventMessage($langs->trans('ErrorIsNotADraft', $objecttmp->ref), 'errors'); - $error++; - } - } else { - dol_print_error($db); - $error++; - } - } - if ($error) { - $db->rollback(); - } else { - $db->commit(); - } - } } + // Closed records -if (!$error && $massaction === 'setbilled' && $permissiontoclose) { - $db->begin(); +// if (!$error && $massaction === 'setbilled' && $permissiontoclose) { - $objecttmp = new $objectclass($db); - $nbok = 0; - foreach ($toselect as $toselectid) { - $result = $objecttmp->fetch($toselectid); - if ($result > 0) { - $result = $objecttmp->classifyBilled($user, 0); - if ($result <= 0) { - setEventMessages($objecttmp->error, $objecttmp->errors, 'errors'); - $error++; - break; - } else { - $nbok++; - } - } else { - setEventMessages($objecttmp->error, $objecttmp->errors, 'errors'); - $error++; - break; - } - } - - if (!$error) { - if ($nbok > 1) { - setEventMessages($langs->trans("RecordsModified", $nbok), null, 'mesgs'); - } else { - setEventMessages($langs->trans("RecordsModified", $nbok), null, 'mesgs'); - } - $db->commit(); - } else { - $db->rollback(); - } -} +// } /* * View @@ -796,7 +350,7 @@ $sql .= ' s.rowid as socid, s.nom as name, s.name_alias as alias, s.email, s.pho $sql .= " typent.code as typent_code,"; $sql .= " state.code_departement as state_code, state.nom as state_name,"; $sql .= " country.code as country_code,"; -$sql .= ' c.rowid, c.ref, c.total_ht, c.total_tva, c.total_ttc, c.ref_client, c.fk_user_author,'; +$sql .= ' c.rowid, c.ref, c.ref_client, c.fk_user_author,'; $sql .= ' c.fk_multicurrency, c.multicurrency_code, c.multicurrency_tx, c.multicurrency_total_ht, c.multicurrency_total_tva as multicurrency_total_vat, c.multicurrency_total_ttc,'; $sql .= ' c.date_valid, c.date_commande, c.note_public, c.note_private, c.date_livraison as date_delivery, c.fk_statut, c.facture as billed,'; $sql .= ' c.date_creation as date_creation, c.tms as date_update, c.date_cloture as date_cloture,'; @@ -806,7 +360,7 @@ $sql .= ' c.fk_cond_reglement,c.deposit_percent,c.fk_mode_reglement,c.fk_shippin $sql .= ' c.fk_input_reason, c.import_key'; // Détail commande -$sql .= ', cdet.description, cdet.qty, '; +$sql .= ', cdet.rowid, cdet.description, cdet.qty, cdet.total_ht, cdet.total_tva, cdet.total_ttc, '; $sql .= ' pr.rowid as product_rowid, pr.ref as product_ref, pr.label as product_label, pr.barcode as product_barcode, pr.tobatch as product_batch, pr.tosell as product_status, pr.tobuy as product_status_buy'; if (($search_categ_cus > 0) || ($search_categ_cus == -2)) { @@ -959,13 +513,13 @@ if ($search_user > 0) { $sql .= " AND ec.fk_c_type_contact = tc.rowid AND tc.element='commande' AND tc.source='internal' AND ec.element_id = c.rowid AND ec.fk_socpeople = ".((int) $search_user); } if ($search_total_ht != '') { - $sql .= natural_search('c.total_ht', $search_total_ht, 1); + $sql .= natural_search('cdet.total_ht', $search_total_ht, 1); } if ($search_total_vat != '') { - $sql .= natural_search('c.total_tva', $search_total_vat, 1); + $sql .= natural_search('cdet.total_tva', $search_total_vat, 1); } if ($search_total_ttc != '') { - $sql .= natural_search('c.total_ttc', $search_total_ttc, 1); + $sql .= natural_search('cdet.total_ttc', $search_total_ttc, 1); } if ($search_warehouse != '' && $search_warehouse > 0) { $sql .= natural_search('c.fk_warehouse', $search_warehouse, 1); @@ -1231,33 +785,26 @@ if ($resql) { // List of mass actions available $arrayofmassactions = array( - 'generate_doc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"), - 'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"), + 'GenerateOrdersSuppliers'=>img_picto('', 'doc', 'class="pictofixedwidth"').$langs->trans("GenerateOrdersSupplie"), ); - if ($permissiontovalidate) { - $arrayofmassactions['prevalidate'] = img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate"); - } - if ($permissiontosendbymail) { - $arrayofmassactions['presend'] = img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"); - } - if ($permissiontoclose) { - $arrayofmassactions['preshipped'] = img_picto('', 'dollyrevert', 'class="pictofixedwidth"').$langs->trans("ClassifyShipped"); - } - if ($permissiontocancel) { - $arrayofmassactions['cancelorders'] = img_picto('', 'close_title', 'class="pictofixedwidth"').$langs->trans("Cancel"); - } - if (!empty($conf->invoice->enabled) && $user->rights->facture->creer) { - $arrayofmassactions['createbills'] = img_picto('', 'bill', 'class="pictofixedwidth"').$langs->trans("CreateInvoiceForThisCustomer"); - } - if ($permissiontoclose) { - $arrayofmassactions['setbilled'] = img_picto('', 'bill', 'class="pictofixedwidth"').$langs->trans("ClassifyBilled"); - } - if ($permissiontodelete) { - $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete"); - } - if (in_array($massaction, array('presend', 'predelete', 'createbills'))) { - $arrayofmassactions = array(); - } + // if ($permissiontovalidate) { + // $arrayofmassactions['prevalidate'] = img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate"); + // } + // if ($permissiontosendbymail) { + // $arrayofmassactions['presend'] = img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"); + // } + // if ($permissiontoclose) { + // $arrayofmassactions['preshipped'] = img_picto('', 'dollyrevert', 'class="pictofixedwidth"').$langs->trans("ClassifyShipped"); + // } + // if ($permissiontocancel) { + // $arrayofmassactions['cancelorders'] = img_picto('', 'close_title', 'class="pictofixedwidth"').$langs->trans("Cancel"); + // } + // if ($permissiontodelete) { + // $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete"); + // } + // if (in_array($massaction, array('presend', 'predelete', 'createbills'))) { + // $arrayofmassactions = array(); + // } $massactionbutton = $form->selectMassAction('', $arrayofmassactions); $url = DOL_URL_ROOT.'/commande/card.php?action=create'; @@ -1288,61 +835,6 @@ if ($resql) { $trackid = 'ord'.$object->id; include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php'; - if ($massaction == 'prevalidate') { - print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassValidation"), $langs->trans("ConfirmMassValidationQuestion"), "validate", null, '', 0, 200, 500, 1); - } - if ($massaction == 'preshipped') { - print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("CloseOrder"), $langs->trans("ConfirmCloseOrder"), "shipped", null, '', 0, 200, 500, 1); - } - - if ($massaction == 'createbills') { - print ''; - - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print '
'; - print $langs->trans('DateInvoice'); - print ''; - print $form->selectDate('', '', '', '', '', '', 1, 1); - print '
'; - print $langs->trans('CreateOneBillByThird'); - print ''; - print $form->selectyesno('createbills_onebythird', '', 1); - print '
'; - print $langs->trans('ValidateInvoices'); - print ''; - if (!empty($conf->stock->enabled) && !empty($conf->global->STOCK_CALCULATE_ON_BILL)) { - print $form->selectyesno('validate_invoices', 0, 1, 1); - print ' ('.$langs->trans("AutoValidationNotPossibleWhenStockIsDecreasedOnInvoiceValidation").')'; - } else { - print $form->selectyesno('validate_invoices', 0, 1); - } - if (!empty($conf->workflow->enabled) && !empty($conf->global->WORKFLOW_INVOICE_AMOUNT_CLASSIFY_BILLED_ORDER)) { - print '     '.$langs->trans("IfValidateInvoiceIsNoOrderStayUnbilled").''; - } else { - print '     '.$langs->trans("OptionToSetOrderBilledNotEnabled").''; - } - print '
'; - - print '
'; - print '
'; - print ' '; - print ''; - print '
'; - print '
'; - } - if ($sall) { foreach ($fieldstosearchall as $key => $val) { $fieldstosearchall[$key] = $langs->trans($val); @@ -1552,7 +1044,7 @@ if ($resql) { $form->selectInputReason($search_fk_input_reason, 'search_fk_input_reason', '', 1, '', 1); print '
'; print ''; @@ -1564,7 +1056,7 @@ if ($resql) { print ''; print ''; print ''; @@ -1778,14 +1270,14 @@ if ($resql) { if (!empty($arrayfields['c.fk_input_reason']['checked'])) { print_liste_field_titre($arrayfields['c.fk_input_reason']['label'], $_SERVER["PHP_SELF"], "c.fk_input_reason", "", $param, '', $sortfield, $sortorder); } - if (!empty($arrayfields['c.total_ht']['checked'])) { - print_liste_field_titre($arrayfields['c.total_ht']['label'], $_SERVER["PHP_SELF"], 'c.total_ht', '', $param, '', $sortfield, $sortorder, 'right '); + if (!empty($arrayfields['cdet.total_ht']['checked'])) { + print_liste_field_titre($arrayfields['cdet.total_ht']['label'], $_SERVER["PHP_SELF"], 'cdet.total_ht', '', $param, '', $sortfield, $sortorder, 'right '); } if (!empty($arrayfields['c.total_vat']['checked'])) { - print_liste_field_titre($arrayfields['c.total_vat']['label'], $_SERVER["PHP_SELF"], 'c.total_tva', '', $param, '', $sortfield, $sortorder, 'right '); + print_liste_field_titre($arrayfields['c.total_vat']['label'], $_SERVER["PHP_SELF"], 'cdet.total_tva', '', $param, '', $sortfield, $sortorder, 'right '); } - if (!empty($arrayfields['c.total_ttc']['checked'])) { - print_liste_field_titre($arrayfields['c.total_ttc']['label'], $_SERVER["PHP_SELF"], 'c.total_ttc', '', $param, '', $sortfield, $sortorder, 'right '); + if (!empty($arrayfields['cdet.total_ttc']['checked'])) { + print_liste_field_titre($arrayfields['cdet.total_ttc']['label'], $_SERVER["PHP_SELF"], 'cdet.total_ttc', '', $param, '', $sortfield, $sortorder, 'right '); } if (!empty($arrayfields['c.multicurrency_code']['checked'])) { print_liste_field_titre($arrayfields['c.multicurrency_code']['label'], $_SERVER['PHP_SELF'], 'c.multicurrency_code', '', $param, '', $sortfield, $sortorder); @@ -1824,9 +1316,9 @@ if ($resql) { $totalarray = array( 'nbfield' => 0, 'val' => array( - 'c.total_ht' => 0, - 'c.total_tva' => 0, - 'c.total_ttc' => 0, + 'cdet.total_ht' => 0, + 'cdet.total_tva' => 0, + 'cdet.total_ttc' => 0, ), 'pos' => array(), ); @@ -2195,18 +1687,18 @@ if ($resql) { } } // Amount HT - if (!empty($arrayfields['c.total_ht']['checked'])) { + if (!empty($arrayfields['cdet.total_ht']['checked'])) { print ''.price($obj->total_ht)."'.price($obj->total_ttc)."'; // With edge and chrome the td overflow is not supported correctly when content is not full text. if ($obj->fk_user_action > 0 && !isset($cache_user_list[$obj->fk_user_action])) { + $userstatic = new User($db); $res = $userstatic->fetch($obj->fk_user_action); if ($res > 0) { $cache_user_list[$obj->fk_user_action] = $userstatic; From 9c6dd0f5df000710aa193195fdfe2f23ba805250 Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Mon, 24 Oct 2022 18:24:11 +0200 Subject: [PATCH 0044/1128] FIX - removefilter --- htdocs/commande/list_line.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/htdocs/commande/list_line.php b/htdocs/commande/list_line.php index 7ea36fe8d09..98e0016d36f 100644 --- a/htdocs/commande/list_line.php +++ b/htdocs/commande/list_line.php @@ -247,6 +247,8 @@ if (empty($reshook)) { // Purge search criteria if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers + $productonly = ''; + $disablelinefree = ''; $search_categ = ''; $search_user = ''; $search_sale = ''; From 2671bd6433ccf2d60d2af5690a087a9ca8447b4f Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Mon, 24 Oct 2022 18:28:00 +0200 Subject: [PATCH 0045/1128] FIX - no ligne title or sub-total or comment --- htdocs/commande/list_line.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/commande/list_line.php b/htdocs/commande/list_line.php index 98e0016d36f..4b20250e6de 100644 --- a/htdocs/commande/list_line.php +++ b/htdocs/commande/list_line.php @@ -422,6 +422,7 @@ $sql .= $hookmanager->resPrint; $sql .= ' WHERE c.fk_soc = s.rowid'; $sql .= ' AND c.entity IN ('.getEntity('commande').')'; +$sql .= ' AND cdet.product_type <> 9'; if (!empty($productonly)) { $sql .= " AND (cdet.product_type = 0 OR cdet.product_type = 1)"; From 64bc7a93c3e328b57fedcc1cab339ff117c19744 Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Mon, 24 Oct 2022 18:43:23 +0200 Subject: [PATCH 0046/1128] ADD - Option Products to buy only --- htdocs/commande/list_line.php | 6 ++++++ htdocs/langs/en_US/orders.lang | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/htdocs/commande/list_line.php b/htdocs/commande/list_line.php index 4b20250e6de..a569d7a56e1 100644 --- a/htdocs/commande/list_line.php +++ b/htdocs/commande/list_line.php @@ -57,6 +57,7 @@ $show_files = GETPOST('show_files', 'int'); $confirm = GETPOST('confirm', 'alpha'); $toselect = GETPOST('toselect', 'array'); $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'orderlist'; +$productobuy = GETPOST('productobuy', 'alpha'); $productonly = GETPOST('productonly', 'alpha'); $disablelinefree = GETPOST('disablelinefree', 'alpha'); @@ -247,6 +248,7 @@ if (empty($reshook)) { // Purge search criteria if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers + $productobuy = ''; $productonly = ''; $disablelinefree = ''; $search_categ = ''; @@ -424,6 +426,9 @@ $sql .= ' WHERE c.fk_soc = s.rowid'; $sql .= ' AND c.entity IN ('.getEntity('commande').')'; $sql .= ' AND cdet.product_type <> 9'; +if (!empty($productobuy)) { + $sql .= " AND pr.tobuy = 1"; +} if (!empty($productonly)) { $sql .= " AND (cdet.product_type = 0 OR cdet.product_type = 1)"; } @@ -842,6 +847,7 @@ if ($resql) { print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'order', 0, $newcardbutton, '', $limit, 0, 0, 1); + print ''; print ''; print ''; diff --git a/htdocs/langs/en_US/orders.lang b/htdocs/langs/en_US/orders.lang index a465fc41ea6..f988cd62f19 100644 --- a/htdocs/langs/en_US/orders.lang +++ b/htdocs/langs/en_US/orders.lang @@ -97,7 +97,8 @@ NumberOfOrdersByMonth=Number of orders by month AmountOfOrdersByMonthHT=Amount of orders by month (excl. tax) ListOfOrders=List of orders ListOrderLigne=Lines of orders -productonly=Lines products only +productobuy=Products to buy only +productonly=Products only disablelinefree=No lines free CloseOrder=Close order ConfirmCloseOrder=Are you sure you want to set this order to delivered? Once an order is delivered, it can be set to billed. From 60acbe8186b3015ff02f24d4612ad21c1ce40149 Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Wed, 26 Oct 2022 12:45:09 +0200 Subject: [PATCH 0047/1128] FIX - contextpage --- htdocs/commande/list_line.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/commande/list_line.php b/htdocs/commande/list_line.php index a569d7a56e1..70aef999c72 100644 --- a/htdocs/commande/list_line.php +++ b/htdocs/commande/list_line.php @@ -56,7 +56,7 @@ $massaction = GETPOST('massaction', 'alpha'); $show_files = GETPOST('show_files', 'int'); $confirm = GETPOST('confirm', 'alpha'); $toselect = GETPOST('toselect', 'array'); -$contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'orderlist'; +$contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'orderlistdet'; $productobuy = GETPOST('productobuy', 'alpha'); $productonly = GETPOST('productonly', 'alpha'); $disablelinefree = GETPOST('disablelinefree', 'alpha'); From 78063b864ab65bc4c1c8ee28be4ddadffd39dd1b Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Wed, 26 Oct 2022 14:01:54 +0200 Subject: [PATCH 0048/1128] FIX - Delete button ADD order --- htdocs/commande/list_line.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/commande/list_line.php b/htdocs/commande/list_line.php index 70aef999c72..42e4ce98b00 100644 --- a/htdocs/commande/list_line.php +++ b/htdocs/commande/list_line.php @@ -829,7 +829,7 @@ if ($resql) { if (!empty($socid)) { $url .= '&socid='.$socid; } - $newcardbutton = dolGetButtonTitle($langs->trans('NewOrder'), '', 'fa fa-plus-circle', $url, '', $contextpage == 'orderlist' && $permissiontoadd); + $newcardbutton = '';//dolGetButtonTitle($langs->trans('NewOrder'), '', 'fa fa-plus-circle', $url, '', $contextpage == 'orderlistdet' && $permissiontoadd); // Lines of title fields print '
'; From 1a9f1e557455f9d76defe1d1e2a662ab8bfa1e37 Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Wed, 26 Oct 2022 14:04:25 +0200 Subject: [PATCH 0049/1128] rename file --- htdocs/commande/{list_line.php => list_det.php} | 0 htdocs/core/menus/init_menu_auguria.sql | 2 +- htdocs/core/menus/standard/eldy.lib.php | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename htdocs/commande/{list_line.php => list_det.php} (100%) diff --git a/htdocs/commande/list_line.php b/htdocs/commande/list_det.php similarity index 100% rename from htdocs/commande/list_line.php rename to htdocs/commande/list_det.php diff --git a/htdocs/core/menus/init_menu_auguria.sql b/htdocs/core/menus/init_menu_auguria.sql index 27dd621ed59..5c479e900bd 100644 --- a/htdocs/core/menus/init_menu_auguria.sql +++ b/htdocs/core/menus/init_menu_auguria.sql @@ -178,7 +178,7 @@ insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, left insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->commande->enabled && $leftmenu=="orders"', __HANDLER__, 'left', 1207__+MAX_llx_menu__, 'commercial', '', 1202__+MAX_llx_menu__, '/commande/list.php?mainmenu=commercial&leftmenu=orders&search_status=4', 'StatusOrderProcessed', 1, 'orders', '$user->rights->commande->lire', '', 2, 6, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->commande->enabled && $leftmenu=="orders"', __HANDLER__, 'left', 1208__+MAX_llx_menu__, 'commercial', '', 1202__+MAX_llx_menu__, '/commande/list.php?mainmenu=commercial&leftmenu=orders&search_status=-1', 'StatusOrderCanceledShort', 1, 'orders', '$user->rights->commande->lire', '', 2, 7, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->commande->enabled', __HANDLER__, 'left', 1209__+MAX_llx_menu__, 'commercial', '', 1200__+MAX_llx_menu__, '/commande/stats/index.php?mainmenu=commercial&leftmenu=orders', 'Statistics', 1, 'orders', '$user->rights->commande->lire', '', 2, 4, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->commande->enabled && $conf->global->MAIN_FEATURES_LEVEL >= 2 && empty($user->socid)', __HANDLER__, 'left', 1210__+MAX_llx_menu__, 'commercial', '', 1200__+MAX_llx_menu__, '/commande/list_line.php?mainmenu=commercial&leftmenu=orders', 'ListOrderLigne', 1, 'orders', '$user->rights->commande->lire', '', 2, 1, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->commande->enabled && $conf->global->MAIN_FEATURES_LEVEL >= 2 && empty($user->socid)', __HANDLER__, 'left', 1210__+MAX_llx_menu__, 'commercial', '', 1200__+MAX_llx_menu__, '/commande/list_det.php?mainmenu=commercial&leftmenu=orders', 'ListOrderLigne', 1, 'orders', '$user->rights->commande->lire', '', 2, 1, __ENTITY__); -- Commercial - Supplier's proposals insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->supplier_proposal->enabled', __HANDLER__, 'left', 1650__+MAX_llx_menu__, 'commercial', 'propals_supplier', 3__+MAX_llx_menu__, '/supplier_proposal/index.php?leftmenu=propals_supplier', 'SupplierProposalsShort', 0, 'supplier_proposal', '$user->rights->supplier_proposal->lire', '', 2, 4, __ENTITY__); diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index cdea369e47c..62cd8055cc1 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -1338,7 +1338,7 @@ function get_left_menu_commercial($mainmenu, &$newmenu, $usemenuhider = 1, $left $newmenu->add("/commande/list.php?leftmenu=orders&search_status=-1", $langs->trans("StatusOrderCanceledShort"), 2, $user->hasRight('commande', 'lire')); } if ($conf->global->MAIN_FEATURES_LEVEL >= 2 && empty($user->socid)) { - $newmenu->add("/commande/list_line.php?leftmenu=orders", $langs->trans("ListOrderLigne"), 1, $user->hasRight('commande', 'lire')); + $newmenu->add("/commande/list_det.php?leftmenu=orders", $langs->trans("ListOrderLigne"), 1, $user->hasRight('commande', 'lire')); } $newmenu->add("/commande/stats/index.php?leftmenu=orders", $langs->trans("Statistics"), 1, $user->hasRight('commande', 'lire')); } From e1ee0b7d66a224ca1baffb7d60ae65fc82be59e2 Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Wed, 26 Oct 2022 15:34:04 +0200 Subject: [PATCH 0050/1128] FIX - /td --- htdocs/commande/list_det.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/commande/list_det.php b/htdocs/commande/list_det.php index 42e4ce98b00..089c5dedbe1 100644 --- a/htdocs/commande/list_det.php +++ b/htdocs/commande/list_det.php @@ -2098,8 +2098,9 @@ if ($resql) { } print ''; } + print '
'.$obj->qty.''; print $form->multiselectarray('search_level', $tab_level, $search_level, 0, 0, 'width75', 0, 0, '', '', '', 2); print '
'; print $contactstatic->getLibProspLevel(); diff --git a/htdocs/install/mysql/migration/13.0.0-14.0.0.sql b/htdocs/install/mysql/migration/13.0.0-14.0.0.sql index a1b6a210a5b..142d5de32fe 100644 --- a/htdocs/install/mysql/migration/13.0.0-14.0.0.sql +++ b/htdocs/install/mysql/migration/13.0.0-14.0.0.sql @@ -655,3 +655,6 @@ ALTER TABLE llx_c_socialnetworks DROP INDEX idx_c_socialnetworks_code; ALTER TABLE llx_c_socialnetworks ADD UNIQUE INDEX idx_c_socialnetworks_code_entity (code, entity); ALTER TABLE llx_propaldet ADD COLUMN import_key varchar(14); + +-- Rename prospect level on contact +ALTER TABLE llx_socpeople CHANGE fk_prospectcontactlevel fk_prospectlevel varchar(12); diff --git a/htdocs/install/mysql/tables/llx_socpeople.sql b/htdocs/install/mysql/tables/llx_socpeople.sql index 1f28534d5d3..b7a1496354f 100644 --- a/htdocs/install/mysql/tables/llx_socpeople.sql +++ b/htdocs/install/mysql/tables/llx_socpeople.sql @@ -58,7 +58,7 @@ create table llx_socpeople photo varchar(255), no_email smallint NOT NULL DEFAULT 0, -- deprecated. Use table llx_mailing_unsubscribe instead priv smallint NOT NULL DEFAULT 0, - fk_prospectcontactlevel varchar(12), -- prospect level (in llx_c_prospectcontactlevel) + fk_prospectlevel varchar(12), -- prospect level (in llx_c_prospectcontactlevel) fk_stcommcontact integer DEFAULT 0 NOT NULL, -- commercial statut fk_user_creat integer DEFAULT 0, -- user qui a creel'enregistrement fk_user_modif integer, From c62a23b75a38009b39cca5db57dfb484d90d90aa Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Mon, 7 Nov 2022 13:07:50 +0100 Subject: [PATCH 0057/1128] clean code --- htdocs/commande/list_det.php | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/htdocs/commande/list_det.php b/htdocs/commande/list_det.php index 7dcd8fb3835..fff7dc5b142 100644 --- a/htdocs/commande/list_det.php +++ b/htdocs/commande/list_det.php @@ -805,24 +805,6 @@ if ($resql) { $arrayofmassactions = array( 'GenerateOrdersSuppliers'=>img_picto('', 'doc', 'class="pictofixedwidth"').$langs->trans("GenerateOrdersSupplie"), ); - // if ($permissiontovalidate) { - // $arrayofmassactions['prevalidate'] = img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate"); - // } - // if ($permissiontosendbymail) { - // $arrayofmassactions['presend'] = img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"); - // } - // if ($permissiontoclose) { - // $arrayofmassactions['preshipped'] = img_picto('', 'dollyrevert', 'class="pictofixedwidth"').$langs->trans("ClassifyShipped"); - // } - // if ($permissiontocancel) { - // $arrayofmassactions['cancelorders'] = img_picto('', 'close_title', 'class="pictofixedwidth"').$langs->trans("Cancel"); - // } - // if ($permissiontodelete) { - // $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete"); - // } - // if (in_array($massaction, array('presend', 'predelete', 'createbills'))) { - // $arrayofmassactions = array(); - // } $massactionbutton = $form->selectMassAction('', $arrayofmassactions); $url = DOL_URL_ROOT.'/commande/card.php?action=create'; @@ -2118,7 +2100,7 @@ if ($resql) { $subtotal += $obj->total_ht; $i++; } - var_dump($totalarray['nbfield']); + // Show total line include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php'; From ce7e59a4b27d4e5eb6f762fd6a443b8940aa7131 Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Mon, 7 Nov 2022 14:15:21 +0100 Subject: [PATCH 0058/1128] ADD colum warehouse --- htdocs/commande/list_det.php | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/htdocs/commande/list_det.php b/htdocs/commande/list_det.php index fff7dc5b142..fd36f229e5c 100644 --- a/htdocs/commande/list_det.php +++ b/htdocs/commande/list_det.php @@ -200,6 +200,7 @@ $arrayfields = array( 'c.multicurrency_total_ht'=>array('label'=>'MulticurrencyAmountHT', 'checked'=>0, 'enabled'=>(empty($conf->multicurrency->enabled) ? 0 : 1), 'position'=>100), 'c.multicurrency_total_vat'=>array('label'=>'MulticurrencyAmountVAT', 'checked'=>0, 'enabled'=>(empty($conf->multicurrency->enabled) ? 0 : 1), 'position'=>105), 'c.multicurrency_total_ttc'=>array('label'=>'MulticurrencyAmountTTC', 'checked'=>0, 'enabled'=>(empty($conf->multicurrency->enabled) ? 0 : 1), 'position'=>110), + 'c.fk_warehouse'=>array('label'=>'Warehouse', 'checked'=>0, 'enabled'=>(empty($conf->stock->enabled) && empty($conf->global->WAREHOUSE_ASK_WAREHOUSE_DURING_ORDER) ? 0 : 1), 'position'=>110), 'u.login'=>array('label'=>"Author", 'checked'=>1, 'position'=>115), 'sale_representative'=>array('label'=>"SaleRepresentativesOfThirdParty", 'checked'=>0, 'position'=>116), 'total_pa' => array('label' => (getDolGlobalString('MARGIN_TYPE') == '1' ? 'BuyingPrice' : 'CostPrice'), 'checked' => 0, 'position' => 300, 'enabled' => (empty($conf->margin->enabled) || !$user->rights->margins->liretous ? 0 : 1)), @@ -358,7 +359,7 @@ $sql .= " state.code_departement as state_code, state.nom as state_name,"; $sql .= " country.code as country_code,"; $sql .= ' c.rowid as c_rowid, c.ref, c.ref_client, c.fk_user_author,'; $sql .= ' c.fk_multicurrency, c.multicurrency_code, c.multicurrency_tx, c.multicurrency_total_ht, c.multicurrency_total_tva as multicurrency_total_vat, c.multicurrency_total_ttc,'; -$sql .= ' c.total_ht as c_total_ht, c.total_tva as c_total_tva, c.total_ttc as c_total_ttc,'; +$sql .= ' c.total_ht as c_total_ht, c.total_tva as c_total_tva, c.total_ttc as c_total_ttc, c.fk_warehouse as warehouse,'; $sql .= ' c.date_valid, c.date_commande, c.note_public, c.note_private, c.date_livraison as date_delivery, c.fk_statut, c.facture as billed,'; $sql .= ' c.date_creation as date_creation, c.tms as date_update, c.date_cloture as date_cloture,'; $sql .= ' p.rowid as project_id, p.ref as project_ref, p.title as project_label,'; @@ -1066,6 +1067,10 @@ if ($resql) { print ''; print ''; @@ -1283,6 +1288,9 @@ if ($resql) { if (!empty($arrayfields['cdet.total_ttc']['checked'])) { print_liste_field_titre($arrayfields['cdet.total_ttc']['label'], $_SERVER["PHP_SELF"], 'cdet.total_ttc', '', $param, '', $sortfield, $sortorder, 'right '); } + if (!empty($arrayfields['c.fk_warehouse']['checked'])) { + print_liste_field_titre($arrayfields['c.fk_warehouse']['label'], "", '', '', $param, '', $sortfield, $sortorder); + } if (!empty($arrayfields['c.multicurrency_code']['checked'])) { print_liste_field_titre($arrayfields['c.multicurrency_code']['label'], $_SERVER['PHP_SELF'], 'c.multicurrency_code', '', $param, '', $sortfield, $sortorder); } @@ -1734,7 +1742,18 @@ if ($resql) { } $totalarray['val']['cdet.total_ttc'] += $obj->total_ttc; } - + // Warehouse + if (!empty($arrayfields['c.fk_warehouse']['checked'])) { + print ''; + if ($obj->warehouse > 0) { + print img_picto('', 'stock', 'class="paddingrightonly"'); + } + $formproduct->formSelectWarehouses($_SERVER['PHP_SELF'], $obj->warehouse, 'none'); + print "'.$obj->multicurrency_code.' - '.$langs->trans('Currency'.$obj->multicurrency_code)."
'; + + // List of directories area + $texte .= ''; + + + $texte .= ''; + $texte .= ''; + + $texte .= '
'; + $texttitle = $langs->trans("ListOfDirectories"); + $listofdir = explode(',', preg_replace('/[\r\n]+/', ',', trim($conf->global->SUPPLIER_INVOICE_ADDON_PDF_ODT_PATH))); + + + $listoffiles = array(); + foreach ($listofdir as $key => $tmpdir) { + $tmpdir = trim($tmpdir); + $tmpdir = preg_replace('/DOL_DATA_ROOT/', DOL_DATA_ROOT, $tmpdir); + if (!$tmpdir) { + unset($listofdir[$key]); + continue; + } + if (!is_dir($tmpdir)) { + $texttitle .= img_warning($langs->trans("ErrorDirNotFound", $tmpdir), 0); + } else { + $tmpfiles = dol_dir_list($tmpdir, 'files', 0, '\.(ods|odt)'); + if (count($tmpfiles)) { + $listoffiles = array_merge($listoffiles, $tmpfiles); + } + } + } + + $texthelp = $langs->trans("ListOfDirectoriesForModelGenODT"); + // Add list of substitution keys + $texthelp .= '
'.$langs->trans("FollowingSubstitutionKeysCanBeUsed").'
'; + $texthelp .= $langs->transnoentitiesnoconv("FullListOnOnlineDocumentation"); // This contains an url, we don't modify it + + $texte .= $form->textwithpicto($texttitle, $texthelp, 1, 'help', '', 1); + $texte .= '
'; + $texte .= ''; + $texte .= '
'; + $texte .= ''; + $texte .= '
'; + + // Scan directories + $nbofiles = count($listoffiles); + if (!empty($conf->global->SUPPLIER_INVOICE_ADDON_PDF_ODT_PATH)) { + $texte .= $langs->trans("NumberOfModelFilesFound").': '; + //$texte.=$nbofiles?'':''; + $texte .= count($listoffiles); + //$texte.=$nbofiles?'':''; + $texte .= ''; + } + + if ($nbofiles) { + $texte .= '
'; + // Show list of found files + foreach ($listoffiles as $file) { + $texte .= '- '.$file['name'].' '.img_picto('', 'listlight').'
'; + } + $texte .= '
'; + } + // Add input to upload a new template file. + $texte .= '
'.$langs->trans("UploadNewTemplate").' '; + $texte .= ''; + $texte .= ''; + $texte .= '
'; + $texte .= '
'; + $texte .= $langs->trans("ExampleOfDirectoriesForModelGen"); + $texte .= '
'; + $texte .= ''; + + return $texte; + } + + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps + /** + * Function to build a document on disk using the generic odt module. + * + * @param Commande $object Object source to build document + * @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 if OK, <=0 if KO + */ + public function write_file($object, $outputlangs, $srctemplatepath, $hidedetails = 0, $hidedesc = 0, $hideref = 0) + { + // phpcs:enable + global $user, $langs, $conf, $mysoc, $hookmanager; + + if (empty($srctemplatepath)) { + dol_syslog("doc_generic_odt::write_file parameter srctemplatepath empty", LOG_WARNING); + return -1; + } + + // Add odtgeneration hook + if (!is_object($hookmanager)) { + include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php'; + $hookmanager = new HookManager($this->db); + } + $hookmanager->initHooks(array('odtgeneration')); + global $action; + + if (!is_object($outputlangs)) { + $outputlangs = $langs; + } + $sav_charset_output = $outputlangs->charset_output; + $outputlangs->charset_output = 'UTF-8'; + + $outputlangs->loadLangs(array("main", "dict", "companies", "bills")); + + if ($conf->fournisseur->facture->dir_output) { + $object->fetch_thirdparty(); + + if ($object->specimen) { + $dir = $conf->fournisseur->facture->dir_output; + $file = $dir."/SPECIMEN.pdf"; + } else { + $objectref = dol_sanitizeFileName($object->ref); + $objectrefsupplier = dol_sanitizeFileName($object->ref_supplier); + //$dir = $conf->fournisseur->facture->dir_output.'/'.$objectref; + $dir = $conf->fournisseur->facture->dir_output.'/'.get_exdir($object->id, 2, 0, 0, $object, 'invoice_supplier').$objectref; + $file = $dir."/".$objectref.".pdf"; + if (!empty($conf->global->SUPPLIER_REF_IN_NAME)) { + $file = $dir."/".$objectref.($objectrefsupplier ? "_".$objectrefsupplier : "").".pdf"; + } + } + + if (!file_exists($dir)) { + if (dol_mkdir($dir) < 0) { + $this->error = $langs->transnoentities("ErrorCanNotCreateDir", $dir); + return -1; + } + } + + if (file_exists($dir)) { + //print "srctemplatepath=".$srctemplatepath; // Src filename + $newfile = basename($srctemplatepath); + $newfiletmp = preg_replace('/\.od(t|s)/i', '', $newfile); + $newfiletmp = preg_replace('/template_/i', '', $newfiletmp); + $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp); + $newfiletmp = $objectref.'_'.$newfiletmp; + //$file=$dir.'/'.$newfiletmp.'.'.dol_print_date(dol_now(),'%Y%m%d%H%M%S').'.odt'; + // Get extension (ods or odt) + $newfileformat = substr($newfile, strrpos($newfile, '.') + 1); + if (!empty($conf->global->MAIN_DOC_USE_TIMING)) { + $format = $conf->global->MAIN_DOC_USE_TIMING; + if ($format == '1') { + $format = '%Y%m%d%H%M%S'; + } + $filename = $newfiletmp.'-'.dol_print_date(dol_now(), $format).'.'.$newfileformat; + } else { + $filename = $newfiletmp.'.'.$newfileformat; + } + $file = $dir.'/'.$filename; + //print "newdir=".$dir; + //print "newfile=".$newfile; + //print "file=".$file; + //print "conf->societe->dir_temp=".$conf->societe->dir_temp; + + dol_mkdir($conf->fournisseur->facture->dir_temp); + if (!is_writable($conf->fournisseur->facture->dir_temp)) { + $this->error = "Failed to write in temp directory ".$conf->fournisseur->facture->dir_temp; + dol_syslog('Error in write_file: '.$this->error, LOG_ERR); + return -1; + } + + // If CUSTOMER contact defined on invoice, we use it + $usecontact = false; + $arrayidcontact = $object->getIdContact('external', 'CUSTOMER'); + if (count($arrayidcontact) > 0) { + $usecontact = true; + $result = $object->fetch_contact($arrayidcontact[0]); + } + + // Recipient name + $contactobject = null; + if (!empty($usecontact)) { + // We can use the company of contact instead of thirdparty company + if ($object->contact->socid != $object->thirdparty->id && (!isset($conf->global->MAIN_USE_COMPANY_NAME_OF_CONTACT) || !empty($conf->global->MAIN_USE_COMPANY_NAME_OF_CONTACT))) { + $object->contact->fetch_thirdparty(); + $socobject = $object->contact->thirdparty; + $contactobject = $object->contact; + } else { + $socobject = $object->thirdparty; + // if we have a CUSTOMER contact and we dont use it as thirdparty recipient we store the contact object for later use + $contactobject = $object->contact; + } + } else { + $socobject = $object->thirdparty; + } + + // Make substitution + $substitutionarray = array( + '__FROM_NAME__' => $this->issuer->name, + '__FROM_EMAIL__' => $this->issuer->email, + '__TOTAL_TTC__' => $object->total_ttc, + '__TOTAL_HT__' => $object->total_ht, + '__TOTAL_VAT__' => $object->total_tva + ); + complete_substitutions_array($substitutionarray, $langs, $object); + // Call the ODTSubstitution hook + $parameters = array('file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$substitutionarray); + $reshook = $hookmanager->executeHooks('ODTSubstitution', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks + + // Line of free text + $newfreetext = ''; + $paramfreetext = 'INVOICE_FREE_TEXT'; + if (!empty($conf->global->$paramfreetext)) { + $newfreetext = make_substitutions($conf->global->$paramfreetext, $substitutionarray); + } + + // Open and load template + require_once ODTPHP_PATH.'odf.php'; + try { + $odfHandler = new odf( + $srctemplatepath, + array( + 'PATH_TO_TMP' => $conf->fournisseur->dir_temp, + 'ZIP_PROXY' => 'PclZipProxy', // PhpZipProxy or PclZipProxy. Got "bad compression method" error when using PhpZipProxy. + 'DELIMITER_LEFT' => '{', + 'DELIMITER_RIGHT' => '}' + ) + ); + } catch (Exception $e) { + $this->error = $e->getMessage(); + dol_syslog($e->getMessage(), LOG_INFO); + return -1; + } + // After construction $odfHandler->contentXml contains content and + // [!-- BEGIN row.lines --]*[!-- END row.lines --] has been replaced by + // [!-- BEGIN lines --]*[!-- END lines --] + //print html_entity_decode($odfHandler->__toString()); + //print exit; + + + // Make substitutions into odt of freetext + try { + $odfHandler->setVars('free_text', $newfreetext, true, 'UTF-8'); + } catch (OdfException $e) { + dol_syslog($e->getMessage(), LOG_INFO); + } + + // Define substitution array + $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object); + $array_object_from_properties = $this->get_substitutionarray_each_var_object($object, $outputlangs); + $array_objet = $this->get_substitutionarray_object($object, $outputlangs); + $array_user = $this->get_substitutionarray_user($user, $outputlangs); + $array_soc = $this->get_substitutionarray_mysoc($mysoc, $outputlangs); + $array_thirdparty = $this->get_substitutionarray_thirdparty($socobject, $outputlangs); + $array_other = $this->get_substitutionarray_other($outputlangs); + // retrieve contact information for use in object as contact_xxx tags + $array_thirdparty_contact = array(); + if ($usecontact && is_object($contactobject)) { + $array_thirdparty_contact = $this->get_substitutionarray_contact($contactobject, $outputlangs, 'contact'); + } + + $tmparray = array_merge($substitutionarray, $array_object_from_properties, $array_user, $array_soc, $array_thirdparty, $array_objet, $array_other, $array_thirdparty_contact); + complete_substitutions_array($tmparray, $outputlangs, $object); + + // Call the ODTSubstitution hook + $parameters = array('odfHandler'=>&$odfHandler, 'file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$tmparray); + $reshook = $hookmanager->executeHooks('ODTSubstitution', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks + + foreach ($tmparray as $key => $value) { + try { + if (preg_match('/logo$/', $key)) { // Image + if (file_exists($value)) { + $odfHandler->setImage($key, $value); + } else { + $odfHandler->setVars($key, 'ErrorFileNotFound', true, 'UTF-8'); + } + } else // Text + { + $odfHandler->setVars($key, $value, true, 'UTF-8'); + } + } catch (OdfException $e) { + dol_syslog($e->getMessage(), LOG_INFO); + } + } + // Replace tags of lines + try { + $foundtagforlines = 1; + try { + $listlines = $odfHandler->setSegment('lines'); + } catch (OdfException $e) { + // We may arrive here if tags for lines not present into template + $foundtagforlines = 0; + dol_syslog($e->getMessage(), LOG_INFO); + } + if ($foundtagforlines) { + $linenumber = 0; + foreach ($object->lines as $line) { + $linenumber++; + $tmparray = $this->get_substitutionarray_lines($line, $outputlangs, $linenumber); + complete_substitutions_array($tmparray, $outputlangs, $object, $line, "completesubstitutionarray_lines"); + // Call the ODTSubstitutionLine hook + $parameters = array('odfHandler'=>&$odfHandler, 'file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$tmparray, 'line'=>$line); + $reshook = $hookmanager->executeHooks('ODTSubstitutionLine', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks + foreach ($tmparray as $key => $val) { + try { + $listlines->setVars($key, $val, true, 'UTF-8'); + } catch (OdfException $e) { + dol_syslog($e->getMessage(), LOG_INFO); + } catch (SegmentException $e) { + dol_syslog($e->getMessage(), LOG_INFO); + } + } + $listlines->merge(); + } + $odfHandler->mergeSegment($listlines); + } + } catch (OdfException $e) { + $this->error = $e->getMessage(); + dol_syslog($this->error, LOG_WARNING); + return -1; + } + + // Replace labels translated + $tmparray = $outputlangs->get_translations_for_substitutions(); + foreach ($tmparray as $key => $value) { + try { + $odfHandler->setVars($key, $value, true, 'UTF-8'); + } catch (OdfException $e) { + dol_syslog($e->getMessage(), LOG_INFO); + } + } + + // Call the beforeODTSave hook + + $parameters = array('odfHandler'=>&$odfHandler, 'file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$tmparray); + $reshook = $hookmanager->executeHooks('beforeODTSave', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks + + // Write new file + if (!empty($conf->global->MAIN_ODT_AS_PDF)) { + try { + $odfHandler->exportAsAttachedPDF($file); + } catch (Exception $e) { + $this->error = $e->getMessage(); + dol_syslog($e->getMessage(), LOG_INFO); + return -1; + } + } else { + try { + $odfHandler->saveToDisk($file); + } catch (Exception $e) { + $this->error = $e->getMessage(); + dol_syslog($e->getMessage(), LOG_INFO); + return -1; + } + } + + $parameters = array('odfHandler'=>&$odfHandler, 'file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$tmparray); + $reshook = $hookmanager->executeHooks('afterODTCreation', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks + + if (!empty($conf->global->MAIN_UMASK)) { + @chmod($file, octdec($conf->global->MAIN_UMASK)); + } + + $odfHandler = null; // Destroy object + + $this->result = array('fullpath'=>$file); + + return 1; // Success + } else { + $this->error = $langs->transnoentities("ErrorCanNotCreateDir", $dir); + return -1; + } + } + + return -1; + } +} diff --git a/htdocs/install/doctemplates/supplier_invoices/index.html b/htdocs/install/doctemplates/supplier_invoices/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/install/doctemplates/supplier_invoices/template_supplier_invoices.odt b/htdocs/install/doctemplates/supplier_invoices/template_supplier_invoices.odt new file mode 100644 index 0000000000000000000000000000000000000000..8ece83c989c9ff688337dbb0edf6febd47eb0dcf GIT binary patch literal 25866 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 jUx%REKSA)Nd85A==G7F@&=G4A!~e?R literal 0 HcmV?d00001 From 578c8cf2c462b2f3d52f0946c571af0aa6d29a1f Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Mon, 14 Nov 2022 16:41:54 +0000 Subject: [PATCH 0060/1128] Fixing style errors. --- htdocs/core/actions_setmoduleoptions.inc.php | 1 - htdocs/core/modules/modFournisseur.class.php | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/htdocs/core/actions_setmoduleoptions.inc.php b/htdocs/core/actions_setmoduleoptions.inc.php index e45365bceb1..237dd86b270 100644 --- a/htdocs/core/actions_setmoduleoptions.inc.php +++ b/htdocs/core/actions_setmoduleoptions.inc.php @@ -109,7 +109,6 @@ if ($action == 'setModuleOptions') { if ($upload_dir) { - $result = dol_add_file_process($upload_dir, 1, 1, 'uploadfile', ''); if ($result <= 0) { $error++; diff --git a/htdocs/core/modules/modFournisseur.class.php b/htdocs/core/modules/modFournisseur.class.php index 63134340891..d36b0f157c8 100644 --- a/htdocs/core/modules/modFournisseur.class.php +++ b/htdocs/core/modules/modFournisseur.class.php @@ -107,7 +107,7 @@ class modFournisseur extends DolibarrModules $this->const[$r][4] = 0; $r++; - // Add abbility ODT for Supplier Invoices + // Add abbility ODT for Supplier Invoices $this->const[$r][0] = "SUPPLIER_INVOICE_ADDON_PDF_ODT_PATH"; $this->const[$r][1] = "chaine"; $this->const[$r][2] = "DOL_DATA_ROOT/doctemplates/supplier_invoices"; From 46a7cfd8d29a4e8722a4944aae1b843f01df76d3 Mon Sep 17 00:00:00 2001 From: Artem Chernitsov Date: Mon, 14 Nov 2022 21:18:36 +0200 Subject: [PATCH 0061/1128] Update modFournisseur.class.php Fix error after conflicts --- htdocs/core/modules/modFournisseur.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/modFournisseur.class.php b/htdocs/core/modules/modFournisseur.class.php index c218f31efe2..20bae3a9ee4 100644 --- a/htdocs/core/modules/modFournisseur.class.php +++ b/htdocs/core/modules/modFournisseur.class.php @@ -902,8 +902,8 @@ class modFournisseur extends DolibarrModules $sql_order = array( "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->db->escape($this->const[0][2])."' AND type = 'order_supplier' AND entity = ".$conf->entity, "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->db->escape($this->const[0][2])."','order_supplier',".$conf->entity.")", - - //ODT template for Supplier Invoice + ); +//ODT template for Supplier Invoice $src = DOL_DOCUMENT_ROOT.'/install/doctemplates/supplier_invoices/template_supplier_invoices.odt'; $dirodt = DOL_DATA_ROOT.'/doctemplates/supplier_invoices'; $dest = $dirodt.'/template_supplier_invoices.odt'; From 1a350d036ab2686bac2a61319f79701308f39f0e Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Mon, 14 Nov 2022 19:40:58 +0000 Subject: [PATCH 0062/1128] Fixing style errors. --- htdocs/core/modules/modFournisseur.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/modFournisseur.class.php b/htdocs/core/modules/modFournisseur.class.php index 20bae3a9ee4..a9ee19c5541 100644 --- a/htdocs/core/modules/modFournisseur.class.php +++ b/htdocs/core/modules/modFournisseur.class.php @@ -903,7 +903,7 @@ class modFournisseur extends DolibarrModules "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->db->escape($this->const[0][2])."' AND type = 'order_supplier' AND entity = ".$conf->entity, "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->db->escape($this->const[0][2])."','order_supplier',".$conf->entity.")", ); -//ODT template for Supplier Invoice + //ODT template for Supplier Invoice $src = DOL_DOCUMENT_ROOT.'/install/doctemplates/supplier_invoices/template_supplier_invoices.odt'; $dirodt = DOL_DATA_ROOT.'/doctemplates/supplier_invoices'; $dest = $dirodt.'/template_supplier_invoices.odt'; From c185d133a2c3a261b99ff9859da010ee1b658ccb Mon Sep 17 00:00:00 2001 From: Artem Chernitsov Date: Tue, 15 Nov 2022 13:23:19 +0200 Subject: [PATCH 0063/1128] Set constant empty by default Set SUPPLIER_INVOICE_ADDON_PDF_ODT_PATH constant empty by default --- htdocs/core/modules/modFournisseur.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/modFournisseur.class.php b/htdocs/core/modules/modFournisseur.class.php index a9ee19c5541..1be5312fd64 100644 --- a/htdocs/core/modules/modFournisseur.class.php +++ b/htdocs/core/modules/modFournisseur.class.php @@ -109,7 +109,7 @@ class modFournisseur extends DolibarrModules // Add abbility ODT for Supplier Invoices $this->const[$r][0] = "SUPPLIER_INVOICE_ADDON_PDF_ODT_PATH"; $this->const[$r][1] = "chaine"; - $this->const[$r][2] = "DOL_DATA_ROOT/doctemplates/supplier_invoices"; + $this->const[$r][2] = ""; $this->const[$r][3] = ""; $this->const[$r][4] = 0; $r++; From 3b3ebfa1c21f1407328a366cc344b76a5ee6199b Mon Sep 17 00:00:00 2001 From: VESSILLER Date: Wed, 16 Nov 2022 11:45:42 +0100 Subject: [PATCH 0064/1128] NEW triggers on mailing --- htdocs/comm/mailing/class/mailing.class.php | 120 ++++++++++++++------ 1 file changed, 83 insertions(+), 37 deletions(-) diff --git a/htdocs/comm/mailing/class/mailing.class.php b/htdocs/comm/mailing/class/mailing.class.php index 4ea794bfbd4..2d2a5e833d6 100644 --- a/htdocs/comm/mailing/class/mailing.class.php +++ b/htdocs/comm/mailing/class/mailing.class.php @@ -217,9 +217,10 @@ class Mailing extends CommonObject * Create an EMailing * * @param User $user Object of user making creation - * @return int -1 if error, Id of created object if OK + * @param int $notrigger Disable triggers + * @return int <0 if KO, Id of created object if OK */ - public function create($user) + public function create($user, $notrigger = 0) { global $conf, $langs; @@ -229,8 +230,6 @@ class Mailing extends CommonObject return -1; } - $this->db->begin(); - $this->title = trim($this->title); $this->email_from = trim($this->email_from); @@ -239,7 +238,9 @@ class Mailing extends CommonObject return -1; } + $error = 0; $now = dol_now(); + $this->db->begin(); $sql = "INSERT INTO ".MAIN_DB_PREFIX."mailing"; $sql .= " (date_creat, fk_user_creat, entity)"; @@ -250,19 +251,32 @@ class Mailing extends CommonObject } dol_syslog("Mailing::Create", LOG_DEBUG); - $result = $this->db->query($sql); - if ($result) { + $resql = $this->db->query($sql); + if ($resql) { $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."mailing"); - if ($this->update($user) > 0) { - $this->db->commit(); - } else { - $this->error = $this->db->lasterror(); - $this->db->rollback(); - return -1; + $result = $this->update($user, 1); + if ($result < 0) { + $error++; } - return $this->id; + if (!$error && !$notrigger) { + // Call trigger + $result = $this->call_trigger('MAILING_CREATE', $user); + if ($result < 0) { + $error++; + } + // End call triggers + } + + if (!$error) { + $this->db->commit(); + return $this->id; + } else { + $this->db->rollback(); + dol_syslog(__METHOD__ . ' ' . $this->error, LOG_ERR); + return -2; + } } else { $this->error = $this->db->lasterror(); $this->db->rollback(); @@ -274,9 +288,10 @@ class Mailing extends CommonObject * Update emailing record * * @param User $user Object of user making change + * @param int $notrigger Disable triggers * @return int < 0 if KO, > 0 if OK */ - public function update($user) + public function update($user, $notrigger = 0) { // Check properties if ($this->body === 'InvalidHTMLString') { @@ -284,6 +299,9 @@ class Mailing extends CommonObject return -1; } + $error = 0; + $this->db->begin(); + $sql = "UPDATE ".MAIN_DB_PREFIX."mailing "; $sql .= " SET titre = '".$this->db->escape($this->title)."'"; $sql .= ", sujet = '".$this->db->escape($this->sujet)."'"; @@ -295,12 +313,30 @@ class Mailing extends CommonObject $sql .= ", bgimage = '".($this->bgimage ? $this->db->escape($this->bgimage) : null)."'"; $sql .= " WHERE rowid = ".(int) $this->id; - dol_syslog("Mailing::Update", LOG_DEBUG); - $result = $this->db->query($sql); - if ($result) { - return 1; + dol_syslog(__METHOD__, LOG_DEBUG); + $resql = $this->db->query($sql); + if ($resql) { + if (!$error && !$notrigger) { + // Call trigger + $result = $this->call_trigger('MAILING_MODIFY', $user); + if ($result < 0) { + $error++; + } + // End call triggers + } + + if (!$error) { + dol_syslog(__METHOD__ . ' success'); + $this->db->commit(); + return 1; + } else { + $this->db->rollback(); + dol_syslog(__METHOD__ . ' ' . $this->error, LOG_ERR); + return -2; + } } else { $this->error = $this->db->lasterror(); + $this->db->rollback(); return -1; } } @@ -528,36 +564,46 @@ class Mailing extends CommonObject { global $user; + $error = 0; $this->db->begin(); - $sql = "DELETE FROM ".MAIN_DB_PREFIX."mailing"; - $sql .= " WHERE rowid = ".((int) $rowid); + if (!$notrigger) { + $result = $this->call_trigger('MAILING_DELETE', $user); + if ($result < 0) { + $error++; + } + } - dol_syslog("Mailing::delete", LOG_DEBUG); - $resql = $this->db->query($sql); - if ($resql) { - $res = $this->delete_targets(); - if ($res <= 0) { + if (!$error) { + $sql = "DELETE FROM " . MAIN_DB_PREFIX . "mailing"; + $sql .= " WHERE rowid = " . ((int)$rowid); + + dol_syslog(__METHOD__, LOG_DEBUG); + $resql = $this->db->query($sql); + if ($resql) { + $res = $this->delete_targets(); + if ($res <= 0) { + $error++; + } + + if (!$error) { + dol_syslog(__METHOD__ . ' success'); + $this->db->commit(); + return 1; + } else { + $this->db->rollback(); + dol_syslog(__METHOD__ . ' ' . $this->error, LOG_ERR); + return -2; + } + } else { $this->db->rollback(); $this->error = $this->db->lasterror(); return -1; } } else { $this->db->rollback(); - $this->error = $this->db->lasterror(); return -1; } - - if (!$notrigger) { - $result = $this->call_trigger('MAILING_DELETE', $user); - if ($result < 0) { - $this->db->rollback(); - return -1; - } - } - - $this->db->commit(); - return 1; } // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps From 90191d6ce8092288c4c04ddfef23d9b396e4a069 Mon Sep 17 00:00:00 2001 From: VESSILLER Date: Wed, 16 Nov 2022 12:23:17 +0100 Subject: [PATCH 0065/1128] FIX stickler-ci --- htdocs/comm/mailing/class/mailing.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/comm/mailing/class/mailing.class.php b/htdocs/comm/mailing/class/mailing.class.php index 2d2a5e833d6..75cf669d3c8 100644 --- a/htdocs/comm/mailing/class/mailing.class.php +++ b/htdocs/comm/mailing/class/mailing.class.php @@ -250,7 +250,7 @@ class Mailing extends CommonObject $this->title = $langs->trans("NoTitle"); } - dol_syslog("Mailing::Create", LOG_DEBUG); + dol_syslog(__METHOD__, LOG_DEBUG); $resql = $this->db->query($sql); if ($resql) { $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."mailing"); @@ -576,7 +576,7 @@ class Mailing extends CommonObject if (!$error) { $sql = "DELETE FROM " . MAIN_DB_PREFIX . "mailing"; - $sql .= " WHERE rowid = " . ((int)$rowid); + $sql .= " WHERE rowid = " . ((int) $rowid); dol_syslog(__METHOD__, LOG_DEBUG); $resql = $this->db->query($sql); From e9d32c882291c2eded62dca1b4ae5ae4ca02f7fe Mon Sep 17 00:00:00 2001 From: VESSILLER Date: Wed, 16 Nov 2022 14:31:59 +0100 Subject: [PATCH 0066/1128] NEW hook printFieldListFrom in contact list --- htdocs/contact/list.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/htdocs/contact/list.php b/htdocs/contact/list.php index 2bfdf9d1f66..39feeb125f4 100644 --- a/htdocs/contact/list.php +++ b/htdocs/contact/list.php @@ -402,6 +402,10 @@ $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_stcommcontact as st ON st.id = p.fk_stco if (empty($user->rights->societe->client->voir) && !$socid) { $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON s.rowid = sc.fk_soc"; } +// Add fields from hooks +$parameters = array(); +$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object, $action); // Note that $action and $object may have been modified by hook +$sql .= $hookmanager->resPrint; $sql .= ' WHERE p.entity IN ('.getEntity('contact').')'; if (empty($user->rights->societe->client->voir) && !$socid) { //restriction $sql .= " AND (sc.fk_user = ".((int) $user->id)." OR p.fk_soc IS NULL)"; From 53df25a9667b47f0fabfa22d22d21e4cc41bac97 Mon Sep 17 00:00:00 2001 From: VESSILLER Date: Wed, 16 Nov 2022 15:58:00 +0100 Subject: [PATCH 0067/1128] NEW presend mass action in contact list --- htdocs/contact/list.php | 2 +- htdocs/core/actions_massactions.inc.php | 50 ++++++++++++------------- htdocs/core/tpl/massactions_pre.tpl.php | 33 ++++++++++------ 3 files changed, 48 insertions(+), 37 deletions(-) diff --git a/htdocs/contact/list.php b/htdocs/contact/list.php index 2bfdf9d1f66..c383cf82e3b 100644 --- a/htdocs/contact/list.php +++ b/htdocs/contact/list.php @@ -758,7 +758,7 @@ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php'; // List of mass actions available $arrayofmassactions = array( -// 'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"), + 'presend' => img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"), // 'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"), ); //if($user->rights->societe->creer) $arrayofmassactions['createbills']=$langs->trans("CreateInvoiceForThisCustomer"); diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php index b83c30d15b6..2006c4ded5c 100644 --- a/htdocs/core/actions_massactions.inc.php +++ b/htdocs/core/actions_massactions.inc.php @@ -92,11 +92,11 @@ if (!$error && $massaction == 'confirm_presend') { $objecttmp = new $objectclass($db); if ($objecttmp->element == 'expensereport') { $thirdparty = new User($db); - } - if ($objecttmp->element == 'partnership' && getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR') == 'member') { + } elseif ($objecttmp->element == 'contact') { + $thirdparty = new Contact($db); + } elseif ($objecttmp->element == 'partnership' && getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR') == 'member') { $thirdparty = new Adherent($db); - } - if ($objecttmp->element == 'holiday') { + } elseif ($objecttmp->element == 'holiday') { $thirdparty = new User($db); } @@ -109,14 +109,13 @@ if (!$error && $massaction == 'confirm_presend') { $thirdpartyid = ($objecttmp->fk_soc ? $objecttmp->fk_soc : $objecttmp->socid); if ($objecttmp->element == 'societe') { $thirdpartyid = $objecttmp->id; - } - if ($objecttmp->element == 'expensereport') { + } elseif ($objecttmp->element == 'contact') { + $thirdpartyid = $objecttmp->id; + } elseif ($objecttmp->element == 'expensereport') { $thirdpartyid = $objecttmp->fk_user_author; - } - if ($objecttmp->element == 'partnership' && getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR') == 'member') { + } elseif ($objecttmp->element == 'partnership' && getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR') == 'member') { $thirdpartyid = $objecttmp->fk_member; - } - if ($objecttmp->element == 'holiday') { + } elseif ($objecttmp->element == 'holiday') { $thirdpartyid = $objecttmp->fk_user; } if (empty($thirdpartyid)) { @@ -267,6 +266,10 @@ if (!$error && $massaction == 'confirm_presend') { $fuser = new User($db); $fuser->fetch($objectobj->fk_user_author); $sendto = $fuser->email; + } elseif ($objectobj->element == 'contact') { + $fcontact = new Contact($db); + $fcontact->fetch($objectobj->id); + $sendto = $fcontact->email; } elseif ($objectobj->element == 'partnership' && getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR') == 'member') { $fadherent = new Adherent($db); $fadherent->fetch($objectobj->fk_member); @@ -509,31 +512,28 @@ if (!$error && $massaction == 'confirm_presend') { $trackid = 'thi'.$thirdparty->id; if ($objecttmp->element == 'expensereport') { $trackid = 'use'.$thirdparty->id; - } - if ($objecttmp->element == 'holiday') { + } elseif ($objecttmp->element == 'contact') { + $trackid = 'ctc'.$thirdparty->id; + } elseif ($objecttmp->element == 'holiday') { $trackid = 'use'.$thirdparty->id; } } else { $trackid = strtolower(get_class($objecttmp)); - if (get_class($objecttmp) == 'Contrat') { + if (get_class($objecttmp) == 'Contact') { + $trackid = 'ctc'; + } elseif (get_class($objecttmp) == 'Contrat') { $trackid = 'con'; - } - if (get_class($objecttmp) == 'Propal') { + } elseif (get_class($objecttmp) == 'Propal') { $trackid = 'pro'; - } - if (get_class($objecttmp) == 'Commande') { + } elseif (get_class($objecttmp) == 'Commande') { $trackid = 'ord'; - } - if (get_class($objecttmp) == 'Facture') { + } elseif (get_class($objecttmp) == 'Facture') { $trackid = 'inv'; - } - if (get_class($objecttmp) == 'Supplier_Proposal') { + } elseif (get_class($objecttmp) == 'Supplier_Proposal') { $trackid = 'spr'; - } - if (get_class($objecttmp) == 'CommandeFournisseur') { + } elseif (get_class($objecttmp) == 'CommandeFournisseur') { $trackid = 'sor'; - } - if (get_class($objecttmp) == 'FactureFournisseur') { + } elseif (get_class($objecttmp) == 'FactureFournisseur') { $trackid = 'sin'; } diff --git a/htdocs/core/tpl/massactions_pre.tpl.php b/htdocs/core/tpl/massactions_pre.tpl.php index 7657fe21e96..07fd80c8595 100644 --- a/htdocs/core/tpl/massactions_pre.tpl.php +++ b/htdocs/core/tpl/massactions_pre.tpl.php @@ -167,8 +167,9 @@ if ($massaction == 'presend') { $thirdpartyid = ($objecttmp->fk_soc ? $objecttmp->fk_soc : $objecttmp->socid); // For proposal, order, invoice, conferenceorbooth, ... if (in_array($objecttmp->element, array('societe', 'conferenceorboothattendee'))) { $thirdpartyid = $objecttmp->id; - } - if ($objecttmp->element == 'expensereport') { + } elseif ($objecttmp->element == 'contact') { + $thirdpartyid = $objecttmp->id; + } elseif ($objecttmp->element == 'expensereport') { $thirdpartyid = $objecttmp->fk_user_author; } if (empty($thirdpartyid)) { @@ -205,6 +206,10 @@ if ($massaction == 'presend') { $fuser = new User($db); $fuser->fetch($thirdpartyid); $liste['thirdparty'] = $fuser->getFullName($langs)." <".$fuser->email.">"; + } elseif ($objecttmp->element == 'contact') { + $fcontact = new Contact($db); + $fcontact->fetch($thirdpartyid); + $liste['contact'] = $fcontact->getFullName($langs)." <".$fcontact->email.">"; } elseif ($objecttmp->element == 'partnership' && getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR') == 'member') { $fadherent = new Adherent($db); $fadherent->fetch($objecttmp->fk_member); @@ -236,17 +241,23 @@ if ($massaction == 'presend') { } else { $formmail->withtopic = 1; } - $formmail->withfile = 1; // $formmail->withfile = 2 to allow to upload files is not yet supported in mass action - // Add a checkbox "Attach also main document" - if (isset($withmaindocfilemail)) { - $formmail->withmaindocfile = $withmaindocfilemail; - } else { // Do an automatic definition of $formmail->withmaindocfile - $formmail->withmaindocfile = 1; - if ($objecttmp->element != 'societe') { - $formmail->withfile = ''.$langs->trans("OnlyPDFattachmentSupported").''; - $formmail->withmaindocfile = -1; // Add a checkbox "Attach also main document" but not checked by default + if ($objecttmp->element == 'contact') { + $formmail->withfile = 0; + $formmail->withmaindocfile = 0; // Add a checkbox "Attach also main document" + } else { + $formmail->withfile = 1; // $formmail->withfile = 2 to allow to upload files is not yet supported in mass action + // Add a checkbox "Attach also main document" + if (isset($withmaindocfilemail)) { + $formmail->withmaindocfile = $withmaindocfilemail; + } else { // Do an automatic definition of $formmail->withmaindocfile + $formmail->withmaindocfile = 1; + if ($objecttmp->element != 'societe') { + $formmail->withfile = '' . $langs->trans("OnlyPDFattachmentSupported") . ''; + $formmail->withmaindocfile = -1; // Add a checkbox "Attach also main document" but not checked by default + } } } + $formmail->withbody = 1; $formmail->withdeliveryreceipt = 1; $formmail->withcancel = 1; From 9ed824a484681f965ca3ff9c36e544247529b7b5 Mon Sep 17 00:00:00 2001 From: VESSILLER Date: Wed, 16 Nov 2022 16:25:58 +0100 Subject: [PATCH 0068/1128] FIX reload travis From fb5c3ee02edf1bdae84e203e87356f81146c8a4e Mon Sep 17 00:00:00 2001 From: VESSILLER Date: Wed, 16 Nov 2022 18:09:18 +0100 Subject: [PATCH 0069/1128] FIX stickler ci --- htdocs/contact/list.php | 2 +- htdocs/core/actions_massactions.inc.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/contact/list.php b/htdocs/contact/list.php index c383cf82e3b..9a5822e8406 100644 --- a/htdocs/contact/list.php +++ b/htdocs/contact/list.php @@ -758,7 +758,7 @@ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php'; // List of mass actions available $arrayofmassactions = array( - 'presend' => img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"), + 'presend' => img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"), // 'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"), ); //if($user->rights->societe->creer) $arrayofmassactions['createbills']=$langs->trans("CreateInvoiceForThisCustomer"); diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php index 2006c4ded5c..a5e63aab9e3 100644 --- a/htdocs/core/actions_massactions.inc.php +++ b/htdocs/core/actions_massactions.inc.php @@ -519,7 +519,7 @@ if (!$error && $massaction == 'confirm_presend') { } } else { $trackid = strtolower(get_class($objecttmp)); - if (get_class($objecttmp) == 'Contact') { + if (get_class($objecttmp) == 'Contact') { $trackid = 'ctc'; } elseif (get_class($objecttmp) == 'Contrat') { $trackid = 'con'; From 97d2d4a17be4510050f32a1a80663d886e493821 Mon Sep 17 00:00:00 2001 From: kkhelifa Date: Fri, 18 Nov 2022 11:03:05 +0100 Subject: [PATCH 0070/1128] Deplacement requete de migration --- htdocs/install/mysql/migration/13.0.0-14.0.0.sql | 3 --- htdocs/install/mysql/migration/16.0.0-17.0.0.sql | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/install/mysql/migration/13.0.0-14.0.0.sql b/htdocs/install/mysql/migration/13.0.0-14.0.0.sql index 742b7e315d0..b335cf7f3f6 100644 --- a/htdocs/install/mysql/migration/13.0.0-14.0.0.sql +++ b/htdocs/install/mysql/migration/13.0.0-14.0.0.sql @@ -656,6 +656,3 @@ ALTER TABLE llx_c_socialnetworks DROP INDEX idx_c_socialnetworks_code; ALTER TABLE llx_c_socialnetworks ADD UNIQUE INDEX idx_c_socialnetworks_code_entity (code, entity); ALTER TABLE llx_propaldet ADD COLUMN import_key varchar(14); - --- Rename prospect level on contact -ALTER TABLE llx_socpeople CHANGE fk_prospectcontactlevel fk_prospectlevel varchar(12); diff --git a/htdocs/install/mysql/migration/16.0.0-17.0.0.sql b/htdocs/install/mysql/migration/16.0.0-17.0.0.sql index 0b4b773be40..cc375456056 100644 --- a/htdocs/install/mysql/migration/16.0.0-17.0.0.sql +++ b/htdocs/install/mysql/migration/16.0.0-17.0.0.sql @@ -376,3 +376,6 @@ ALTER TABLE llx_prelevement_demande ADD COLUMN fk_salary INTEGER NULL AFTER fk_f ALTER TABLE llx_user ADD COLUMN birth_place varchar(64); + +-- Rename prospect level on contact +ALTER TABLE llx_socpeople CHANGE fk_prospectcontactlevel fk_prospectlevel varchar(12); From 8c790818fbedea7394b3960ee0dbfa3fcc7a8c69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Mon, 21 Nov 2022 12:20:44 +0100 Subject: [PATCH 0071/1128] add hook in productlot tooltip --- htdocs/product/stock/class/productlot.class.php | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/htdocs/product/stock/class/productlot.class.php b/htdocs/product/stock/class/productlot.class.php index 7009d0d55fc..f8574e919a5 100644 --- a/htdocs/product/stock/class/productlot.class.php +++ b/htdocs/product/stock/class/productlot.class.php @@ -3,7 +3,7 @@ * Copyright (C) 2014 Juanjo Menent * Copyright (C) 2015 Florian Henry * Copyright (C) 2015 Raphaël Doursenaud - * Copyright (C) 2018 Frédéric France + * Copyright (C) 2018-2022 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 @@ -596,7 +596,7 @@ class Productlot extends CommonObject */ public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $maxlen = 24, $morecss = '', $save_lastsearch_value = -1) { - global $langs, $conf, $db; + global $langs, $conf, $hookmanager, $db; global $dolibarr_main_authentication, $dolibarr_main_demo; global $menumanager; @@ -658,6 +658,16 @@ class Productlot extends CommonObject } $result .= $linkend; + global $action; + $hookmanager->initHooks(array('productlotdao')); + $parameters = array('id' => $this->id, 'getnomurl' => $result); + $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks + if ($reshook > 0) { + $result = $hookmanager->resPrint; + } else { + $result .= $hookmanager->resPrint; + } + return $result; } From 15d26a4b591203b6f5f183e0d631385b304756b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Mon, 21 Nov 2022 14:13:15 +0100 Subject: [PATCH 0072/1128] Update product.php --- htdocs/product/stock/product.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/product/stock/product.php b/htdocs/product/stock/product.php index b0771bc39d9..0be0ac52945 100644 --- a/htdocs/product/stock/product.php +++ b/htdocs/product/stock/product.php @@ -8,7 +8,7 @@ * Copyright (C) 2013-2018 Juanjo Menent * Copyright (C) 2014-2015 Cédric Gross * Copyright (C) 2015 Marcos García - * Copyright (C) 2018-2019 Frédéric France + * Copyright (C) 2018-2022 Frédéric France * Copyright (C) 2021 Gauthier VERDOL * * This program is free software; you can redistribute it and/or modify @@ -1132,6 +1132,7 @@ if (!$variants) { } foreach ($details as $pdluo) { $product_lot_static->id = $pdluo->lotid; + $product_lot_static->fk_product = $pdluo->fk_product_stock; $product_lot_static->batch = $pdluo->batch; $product_lot_static->eatby = $pdluo->eatby; $product_lot_static->sellby = $pdluo->sellby; From b5688427abb8e7c356d84fb5d5dff7d58742bca4 Mon Sep 17 00:00:00 2001 From: Gauthier PC portable 024 Date: Mon, 21 Nov 2022 16:59:36 +0100 Subject: [PATCH 0073/1128] NEW : Now we can edit amount on vat and salaries clone action --- htdocs/compta/tva/card.php | 5 +++++ htdocs/salaries/card.php | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/htdocs/compta/tva/card.php b/htdocs/compta/tva/card.php index e7c7678b818..eae2f17f4ec 100644 --- a/htdocs/compta/tva/card.php +++ b/htdocs/compta/tva/card.php @@ -333,6 +333,10 @@ if ($action == 'confirm_clone' && $confirm == 'yes' && ($user->rights->tax->char $object->id = $object->ref = null; $object->paye = 0; + if (GETPOST('amount', 'alphanohtml')) { + $object->amount = price2num(GETPOST('amount', 'alphanohtml'), 'MT', 2); + } + if (GETPOST('clone_label', 'alphanohtml')) { $object->label = GETPOST('clone_label', 'alphanohtml'); } else { @@ -540,6 +544,7 @@ if ($id > 0) { //$formquestion[] = array('type' => 'date', 'name' => 'clone_date_ech', 'label' => $langs->trans("Date"), 'value' => -1); $formquestion[] = array('type' => 'date', 'name' => 'clone_period', 'label' => $langs->trans("PeriodEndDate"), 'value' => -1); + $formquestion[] = array('type' => 'text', 'name' => 'amount', 'label' => $langs->trans("Amount"), 'value' => price($object->amount), 'morecss' => 'width100'); print $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneVAT', $object->ref), 'confirm_clone', $formquestion, 'yes', 1, 240); } diff --git a/htdocs/salaries/card.php b/htdocs/salaries/card.php index 5ba1b818137..66844d40f5b 100644 --- a/htdocs/salaries/card.php +++ b/htdocs/salaries/card.php @@ -380,6 +380,10 @@ if ($action == 'confirm_clone' && $confirm == 'yes' && ($user->rights->salaries- $object->paye = 0; $object->id = $object->ref = null; + if (GETPOST('amount', 'alphanohtml')) { + $object->amount = price2num(GETPOST('amount', 'alphanohtml'), 'MT', 2); + } + if (GETPOST('clone_label', 'alphanohtml')) { $object->label = GETPOST('clone_label', 'alphanohtml'); } else { @@ -710,6 +714,7 @@ if ($id) { //$formquestion[] = array('type' => 'date', 'name' => 'clone_date_ech', 'label' => $langs->trans("Date"), 'value' => -1); $formquestion[] = array('type' => 'date', 'name' => 'clone_date_start', 'label' => $langs->trans("DateStart"), 'value' => -1); $formquestion[] = array('type' => 'date', 'name' => 'clone_date_end', 'label' => $langs->trans("DateEnd"), 'value' => -1); + $formquestion[] = array('type' => 'text', 'name' => 'amount', 'label' => $langs->trans("Amount"), 'value' => price($object->amount), 'morecss' => 'width100'); $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneSalary', $object->ref), 'confirm_clone', $formquestion, 'yes', 1, 250); } From c689ce1c52c6c3bae58975acb4e9d080ca3cb674 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Mon, 21 Nov 2022 16:08:00 +0000 Subject: [PATCH 0074/1128] Fixing style errors. --- htdocs/salaries/card.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/salaries/card.php b/htdocs/salaries/card.php index 66844d40f5b..7e3111743b3 100644 --- a/htdocs/salaries/card.php +++ b/htdocs/salaries/card.php @@ -380,9 +380,9 @@ if ($action == 'confirm_clone' && $confirm == 'yes' && ($user->rights->salaries- $object->paye = 0; $object->id = $object->ref = null; - if (GETPOST('amount', 'alphanohtml')) { - $object->amount = price2num(GETPOST('amount', 'alphanohtml'), 'MT', 2); - } + if (GETPOST('amount', 'alphanohtml')) { + $object->amount = price2num(GETPOST('amount', 'alphanohtml'), 'MT', 2); + } if (GETPOST('clone_label', 'alphanohtml')) { $object->label = GETPOST('clone_label', 'alphanohtml'); From 01a4d0414d2cf0504e7696110e166d5953283a43 Mon Sep 17 00:00:00 2001 From: Christian Foellmann Date: Tue, 22 Nov 2022 16:22:10 +0100 Subject: [PATCH 0075/1128] add applicant name --- htdocs/recruitment/recruitmentcandidature_agenda.php | 1 + htdocs/recruitment/recruitmentcandidature_card.php | 1 + htdocs/recruitment/recruitmentcandidature_document.php | 1 + htdocs/recruitment/recruitmentcandidature_note.php | 1 + 4 files changed, 4 insertions(+) diff --git a/htdocs/recruitment/recruitmentcandidature_agenda.php b/htdocs/recruitment/recruitmentcandidature_agenda.php index 04118f55572..ac4f54d115c 100644 --- a/htdocs/recruitment/recruitmentcandidature_agenda.php +++ b/htdocs/recruitment/recruitmentcandidature_agenda.php @@ -143,6 +143,7 @@ if ($object->id > 0) { $linkback = ''.$langs->trans("BackToList").''; $morehtmlref = '
'; + $morehtmlref.= $object->getFullName('', 1); /* // Ref customer $morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1); diff --git a/htdocs/recruitment/recruitmentcandidature_card.php b/htdocs/recruitment/recruitmentcandidature_card.php index 2452c9e530b..7cf9fb47b56 100644 --- a/htdocs/recruitment/recruitmentcandidature_card.php +++ b/htdocs/recruitment/recruitmentcandidature_card.php @@ -426,6 +426,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea $linkback = ''.$langs->trans("BackToList").''; $morehtmlref = '
'; + $morehtmlref.= $object->getFullName('', 1); /* // Ref customer $morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1); diff --git a/htdocs/recruitment/recruitmentcandidature_document.php b/htdocs/recruitment/recruitmentcandidature_document.php index 3f08c770111..ed0cb115ea7 100644 --- a/htdocs/recruitment/recruitmentcandidature_document.php +++ b/htdocs/recruitment/recruitmentcandidature_document.php @@ -121,6 +121,7 @@ if ($object->id) { $linkback = ''.$langs->trans("BackToList").''; $morehtmlref = '
'; + $morehtmlref.= $object->getFullName('', 1); /* // Ref customer $morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1); diff --git a/htdocs/recruitment/recruitmentcandidature_note.php b/htdocs/recruitment/recruitmentcandidature_note.php index 1649ab5ee5e..f04a22aaf1b 100644 --- a/htdocs/recruitment/recruitmentcandidature_note.php +++ b/htdocs/recruitment/recruitmentcandidature_note.php @@ -96,6 +96,7 @@ if ($id > 0 || !empty($ref)) { $linkback = ''.$langs->trans("BackToList").''; $morehtmlref = '
'; + $morehtmlref.= $object->getFullName('', 1); /* // Ref customer $morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1); From 638b7bc6534d9eb1eedc9eb827a99defbb5b3a1b Mon Sep 17 00:00:00 2001 From: FLIO Date: Tue, 22 Nov 2022 17:02:12 +0100 Subject: [PATCH 0076/1128] fix(scrutinizer) https://scrutinizer-ci.com/g/Dolibarr/dolibarr/issues/develop/files/htdocs/core/boxes/box_services_contracts.php?selectedLabels%5B0%5D=9&selectedSeverities%5B0%5D=10&orderField=lastFound&order=desc&honorSelectedPaths=0 --- htdocs/core/boxes/box_services_contracts.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/boxes/box_services_contracts.php b/htdocs/core/boxes/box_services_contracts.php index 3d1e640f34b..acc1d40eed5 100644 --- a/htdocs/core/boxes/box_services_contracts.php +++ b/htdocs/core/boxes/box_services_contracts.php @@ -124,7 +124,7 @@ class box_services_contracts extends ModeleBoxes $contractlinestatic->label = $objp->label; $contractlinestatic->description = $objp->description; $contractlinestatic->type = $objp->type; - $contractlinestatic->product_id = $objp->product_id; + $contractlinestatic->fk_productyy = $objp->product_id; $contractlinestatic->product_ref = $objp->product_ref; $contractlinestatic->product_type = $objp->product_type; $contractlinestatic->statut = $objp->contractline_status; From a5f4a8481e586b58765a90053b871010992d933b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 22 Nov 2022 22:14:01 +0100 Subject: [PATCH 0077/1128] Update modFournisseur.class.php --- htdocs/core/modules/modFournisseur.class.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/core/modules/modFournisseur.class.php b/htdocs/core/modules/modFournisseur.class.php index 1be5312fd64..09435e2c02b 100644 --- a/htdocs/core/modules/modFournisseur.class.php +++ b/htdocs/core/modules/modFournisseur.class.php @@ -900,8 +900,8 @@ class modFournisseur extends DolibarrModules } $sql_order = array( - "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->db->escape($this->const[0][2])."' AND type = 'order_supplier' AND entity = ".$conf->entity, - "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->db->escape($this->const[0][2])."','order_supplier',".$conf->entity.")", + "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->db->escape($this->const[0][2])."' AND type = 'order_supplier' AND entity = ".((int) $conf->entity), + "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->db->escape($this->const[0][2])."', 'order_supplier', ".((int) $conf->entity).")", ); //ODT template for Supplier Invoice $src = DOL_DOCUMENT_ROOT.'/install/doctemplates/supplier_invoices/template_supplier_invoices.odt'; @@ -920,8 +920,8 @@ class modFournisseur extends DolibarrModules } $sql_invoice = array( - "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->db->escape($this->const[2][2])."' AND type = 'invoice_supplier' AND entity = ".$conf->entity, - "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->db->escape($this->const[2][2])."','invoice_supplier',".$conf->entity.")", + "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->db->escape($this->const[2][2])."' AND type = 'invoice_supplier' AND entity = ".((int) $conf->entity), + "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->db->escape($this->const[2][2])."', 'invoice_supplier', ".((int) $conf->entity).")", ); $sql = array_merge($sql_order, $sql_invoice); From 8cc31725ee74f3fded34b039324d32d17452df56 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 22 Nov 2022 22:26:53 +0100 Subject: [PATCH 0078/1128] Update modFournisseur.class.php --- htdocs/core/modules/modFournisseur.class.php | 28 ++++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/htdocs/core/modules/modFournisseur.class.php b/htdocs/core/modules/modFournisseur.class.php index 09435e2c02b..5f61b5faf52 100644 --- a/htdocs/core/modules/modFournisseur.class.php +++ b/htdocs/core/modules/modFournisseur.class.php @@ -95,26 +95,15 @@ class modFournisseur extends DolibarrModules $this->const[$r][4] = 0; $r++; - /* OLD For supplier invoice, we must not have default pdf template on. In most cases, we need to join PDF from supplier, not have a document generated. - NEW Uncomment to add ability to generate PDF for Supplier Invoices which generated not from Order. - */ - + /* For supplier invoice, we must not have default pdf template on. In most cases, we need to join PDF from supplier, not have a document generated. $this->const[$r][0] = "INVOICE_SUPPLIER_ADDON_PDF"; $this->const[$r][1] = "chaine"; $this->const[$r][2] = "canelle"; $this->const[$r][3] = 'Nom du gestionnaire de generation des factures fournisseur en PDF'; $this->const[$r][4] = 0; $r++; - - // Add abbility ODT for Supplier Invoices - $this->const[$r][0] = "SUPPLIER_INVOICE_ADDON_PDF_ODT_PATH"; - $this->const[$r][1] = "chaine"; - $this->const[$r][2] = ""; - $this->const[$r][3] = ""; - $this->const[$r][4] = 0; - $r++; - - + */ + $this->const[$r][0] = "INVOICE_SUPPLIER_ADDON_NUMBER"; $this->const[$r][1] = "chaine"; $this->const[$r][2] = "mod_facture_fournisseur_cactus"; @@ -122,6 +111,7 @@ class modFournisseur extends DolibarrModules $this->const[$r][4] = 0; $r++; + // Add ability ODT for Supplier orders $this->const[$r][0] = "SUPPLIER_ORDER_ADDON_PDF_ODT_PATH"; $this->const[$r][1] = "chaine"; $this->const[$r][2] = "DOL_DATA_ROOT/doctemplates/supplier_orders"; @@ -129,6 +119,14 @@ class modFournisseur extends DolibarrModules $this->const[$r][4] = 0; $r++; + // Add ability ODT for Supplier Invoices + $this->const[$r][0] = "SUPPLIER_INVOICE_ADDON_PDF_ODT_PATH"; + $this->const[$r][1] = "chaine"; + $this->const[$r][2] = ""; + $this->const[$r][3] = ""; + $this->const[$r][4] = 0; + $r++; + // Boxes $this->boxes = array( 0=>array('file'=>'box_graph_invoices_supplier_permonth.php', 'enabledbydefaulton'=>'Home'), @@ -919,12 +917,14 @@ class modFournisseur extends DolibarrModules } } + /* $sql_invoice = array( "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->db->escape($this->const[2][2])."' AND type = 'invoice_supplier' AND entity = ".((int) $conf->entity), "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->db->escape($this->const[2][2])."', 'invoice_supplier', ".((int) $conf->entity).")", ); $sql = array_merge($sql_order, $sql_invoice); + */ //var_dump($sql); //die; From 1a7a5e89bab872a3811de18af3c2e31647ba8d51 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Tue, 22 Nov 2022 21:53:41 +0000 Subject: [PATCH 0079/1128] Fixing style errors. --- htdocs/core/modules/modFournisseur.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/modFournisseur.class.php b/htdocs/core/modules/modFournisseur.class.php index 5f61b5faf52..a8512795942 100644 --- a/htdocs/core/modules/modFournisseur.class.php +++ b/htdocs/core/modules/modFournisseur.class.php @@ -103,7 +103,7 @@ class modFournisseur extends DolibarrModules $this->const[$r][4] = 0; $r++; */ - + $this->const[$r][0] = "INVOICE_SUPPLIER_ADDON_NUMBER"; $this->const[$r][1] = "chaine"; $this->const[$r][2] = "mod_facture_fournisseur_cactus"; From 1c5888d6d27c8608a701b46d106efa09ba4a19ea Mon Sep 17 00:00:00 2001 From: Christian Foellmann Date: Wed, 23 Nov 2022 20:47:32 +0100 Subject: [PATCH 0080/1128] add hook 'llxFooter' --- htdocs/core/class/hookmanager.class.php | 1 + htdocs/main.inc.php | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/htdocs/core/class/hookmanager.class.php b/htdocs/core/class/hookmanager.class.php index 5f87d81db9d..4886a3fd5d0 100644 --- a/htdocs/core/class/hookmanager.class.php +++ b/htdocs/core/class/hookmanager.class.php @@ -195,6 +195,7 @@ class HookManager 'getFormatedSupplierRef', 'getIdProfUrl', 'getInputIdProf', + 'llxFooter', 'menuDropdownQuickaddItems', 'menuLeftMenuItems', 'moveUploadedFile', diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 4b580e7b808..e0ea7b1dbfc 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -3213,6 +3213,17 @@ if (!function_exists("llxFooter")) { $ext = 'layout='.$conf->browser->layout.'&version='.urlencode(DOL_VERSION); + // Hook to add more things on all pages within fiche DIV + $llxfooter = ''; + $parameters = array(); + $reshook = $hookmanager->executeHooks('llxFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + if (empty($reshook)) { + $llxfooter .= $hookmanager->resPrint; + } elseif ($reshook > 0) { + $llxfooter = $hookmanager->resPrint; + } + print $llxfooter; + // Global html output events ($mesgs, $errors, $warnings) dol_htmloutput_events($disabledoutputofmessages); From 9663cddcedbf75a075aadcc2487640ba8d43d774 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 25 Nov 2022 15:39:35 +0100 Subject: [PATCH 0081/1128] Update modFournisseur.class.php --- htdocs/core/modules/modFournisseur.class.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/modFournisseur.class.php b/htdocs/core/modules/modFournisseur.class.php index a8512795942..64d965cdcf0 100644 --- a/htdocs/core/modules/modFournisseur.class.php +++ b/htdocs/core/modules/modFournisseur.class.php @@ -901,6 +901,7 @@ class modFournisseur extends DolibarrModules "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->db->escape($this->const[0][2])."' AND type = 'order_supplier' AND entity = ".((int) $conf->entity), "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->db->escape($this->const[0][2])."', 'order_supplier', ".((int) $conf->entity).")", ); + //ODT template for Supplier Invoice $src = DOL_DOCUMENT_ROOT.'/install/doctemplates/supplier_invoices/template_supplier_invoices.odt'; $dirodt = DOL_DATA_ROOT.'/doctemplates/supplier_invoices'; @@ -925,8 +926,8 @@ class modFournisseur extends DolibarrModules $sql = array_merge($sql_order, $sql_invoice); */ - //var_dump($sql); - //die; + + $sql = $sql_order; return $this->_init($sql, $options); } From 15367cbe5f8f52435b6131a578e7780954416ce9 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Fri, 25 Nov 2022 14:44:27 +0000 Subject: [PATCH 0082/1128] Fixing style errors. --- htdocs/core/modules/modFournisseur.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/modFournisseur.class.php b/htdocs/core/modules/modFournisseur.class.php index 64d965cdcf0..7bd10fcaf9b 100644 --- a/htdocs/core/modules/modFournisseur.class.php +++ b/htdocs/core/modules/modFournisseur.class.php @@ -901,7 +901,7 @@ class modFournisseur extends DolibarrModules "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->db->escape($this->const[0][2])."' AND type = 'order_supplier' AND entity = ".((int) $conf->entity), "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->db->escape($this->const[0][2])."', 'order_supplier', ".((int) $conf->entity).")", ); - + //ODT template for Supplier Invoice $src = DOL_DOCUMENT_ROOT.'/install/doctemplates/supplier_invoices/template_supplier_invoices.odt'; $dirodt = DOL_DATA_ROOT.'/doctemplates/supplier_invoices'; @@ -926,7 +926,7 @@ class modFournisseur extends DolibarrModules $sql = array_merge($sql_order, $sql_invoice); */ - + $sql = $sql_order; return $this->_init($sql, $options); From 3a861af01e12d1d2b7d899501b755079dd147087 Mon Sep 17 00:00:00 2001 From: VESSILLER Date: Fri, 25 Nov 2022 17:19:34 +0100 Subject: [PATCH 0083/1128] FIX reload travis From ad07fdfd79a9bc7510eb958b71b9b6dc250d841d Mon Sep 17 00:00:00 2001 From: VESSILLER Date: Sun, 27 Nov 2022 01:06:40 +0100 Subject: [PATCH 0084/1128] FIX #22837 --- htdocs/core/class/html.formticket.class.php | 12 +++++++----- htdocs/ticket/card.php | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/htdocs/core/class/html.formticket.class.php b/htdocs/core/class/html.formticket.class.php index 7d116fd692a..cea007f8e61 100644 --- a/htdocs/core/class/html.formticket.class.php +++ b/htdocs/core/class/html.formticket.class.php @@ -127,12 +127,14 @@ class FormTicket /** * Show the form to input ticket * - * @param int $withdolfichehead With dol_get_fiche_head() and dol_get_fiche_end() - * @param string $mode Mode ('create' or 'edit') - * @param int $public 1=If we show the form for the public interface + * @param int $withdolfichehead With dol_get_fiche_head() and dol_get_fiche_end() + * @param string $mode Mode ('create' or 'edit') + * @param int $public 1=If we show the form for the public interface + * @param Contact|null $with_contact [=NULL] Contact to link to this ticket if exists + * @param string $action [=''] Action in card * @return void */ - public function showForm($withdolfichehead = 0, $mode = 'edit', $public = 0) + public function showForm($withdolfichehead = 0, $mode = 'edit', $public = 0, Contact $with_contact = null, $action = '') { global $conf, $langs, $user, $hookmanager; @@ -441,7 +443,7 @@ class FormTicket // Other attributes $parameters = array(); - $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $ticketstat, $this->action); // Note that $action and $object may have been modified by hook + $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $ticketstat, $action); // Note that $action and $object may have been modified by hook if (empty($reshook)) { print $ticketstat->showOptionals($extrafields, 'create'); } diff --git a/htdocs/ticket/card.php b/htdocs/ticket/card.php index 9c1a7c709b7..1b3dd4c8e37 100644 --- a/htdocs/ticket/card.php +++ b/htdocs/ticket/card.php @@ -700,7 +700,7 @@ if ($action == 'create' || $action == 'presend') { $formticket->withextrafields = 1; $formticket->param = array('origin' => GETPOST('origin'), 'originid' => GETPOST('originid')); - $formticket->showForm(1, 'create', 0); + $formticket->showForm(1, 'create', 0, null, $action); /*} elseif ($action == 'edit' && $user->rights->ticket->write && $object->fk_statut < Ticket::STATUS_CLOSED) { $formticket = new FormTicket($db); From be7d11aaff9e9106961fa814b115ab63da073156 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Tue, 29 Nov 2022 12:16:15 +0100 Subject: [PATCH 0085/1128] Update product.php --- htdocs/product/stock/product.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/htdocs/product/stock/product.php b/htdocs/product/stock/product.php index 0be0ac52945..b0771bc39d9 100644 --- a/htdocs/product/stock/product.php +++ b/htdocs/product/stock/product.php @@ -8,7 +8,7 @@ * Copyright (C) 2013-2018 Juanjo Menent * Copyright (C) 2014-2015 Cédric Gross * Copyright (C) 2015 Marcos García - * Copyright (C) 2018-2022 Frédéric France + * Copyright (C) 2018-2019 Frédéric France * Copyright (C) 2021 Gauthier VERDOL * * This program is free software; you can redistribute it and/or modify @@ -1132,7 +1132,6 @@ if (!$variants) { } foreach ($details as $pdluo) { $product_lot_static->id = $pdluo->lotid; - $product_lot_static->fk_product = $pdluo->fk_product_stock; $product_lot_static->batch = $pdluo->batch; $product_lot_static->eatby = $pdluo->eatby; $product_lot_static->sellby = $pdluo->sellby; From d5e6c08319ab297297ebae7bd74b516c1c29d260 Mon Sep 17 00:00:00 2001 From: VESSILLER Date: Thu, 1 Dec 2022 16:50:32 +0100 Subject: [PATCH 0086/1128] NEW operation type in email collector to load or create contact --- htdocs/admin/emailcollector_card.php | 1 + .../class/emailcollector.class.php | 114 ++++++++++++++++++ htdocs/langs/en_US/admin.lang | 1 + htdocs/langs/fr_FR/admin.lang | 1 + 4 files changed, 117 insertions(+) diff --git a/htdocs/admin/emailcollector_card.php b/htdocs/admin/emailcollector_card.php index 8dfafb19b63..b3d6e045470 100644 --- a/htdocs/admin/emailcollector_card.php +++ b/htdocs/admin/emailcollector_card.php @@ -668,6 +668,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea $arrayoftypes = array( 'loadthirdparty' => $langs->trans('LoadThirdPartyFromName', $langs->transnoentities("ThirdPartyName")), 'loadandcreatethirdparty' => $langs->trans('LoadThirdPartyFromNameOrCreate', $langs->transnoentities("ThirdPartyName")), + 'loadandcreatecontact' => $langs->trans('LoadContactFromEmailOrCreate', $langs->transnoentities("Email")), 'recordjoinpiece' => 'AttachJoinedDocumentsToObject', 'recordevent' => 'RecordEvent' ); diff --git a/htdocs/emailcollector/class/emailcollector.class.php b/htdocs/emailcollector/class/emailcollector.class.php index 8d72666ad53..db932e0a4ca 100644 --- a/htdocs/emailcollector/class/emailcollector.class.php +++ b/htdocs/emailcollector/class/emailcollector.class.php @@ -2141,6 +2141,120 @@ class EmailCollector extends CommonObject } } } + } + // Search and create contact + elseif ($operation['type'] == 'loadandcreatecontact') { + if (empty($operation['actionparam'])) { + $errorforactions++; + $this->error = "Action loadandcreatecontact has empty parameter. Must be 'SET:xxx' or 'EXTRACT:(body|subject):regex' to define how to extract data"; + $this->errors[] = $this->error; + } else { + $contact_static = new Contact($this->db); + // Overwrite values with values extracted from source email + $errorforthisaction = $this->overwritePropertiesOfObject($contact_static, $operation['actionparam'], $messagetext, $subject, $header, $operationslog); + if ($errorforthisaction) { + $errorforactions++; + } else { + if (!empty($contact_static->email) && $contact_static->email != $from) $from = $contact_static->email; + + $result = $contactstatic->fetch(0, null, '', $from); + if ($result < 0) { + $errorforactions++; + $this->error = 'Error when getting contact with email ' . $from; + $this->errors[] = $this->error; + break; + } elseif ($result == 0) { + dol_syslog("Contact with email " . $from . " was not found. We try to create it."); + $contactstatic = new Contact($this->db); + + // Create contact + $contactstatic->email = $from; + $operationslog .= '
We set property email='.dol_escape_htmltag($from); + + // Overwrite values with values extracted from source email + $errorforthisaction = $this->overwritePropertiesOfObject($contactstatic, $operation['actionparam'], $messagetext, $subject, $header, $operationslog); + + if ($errorforthisaction) { + $errorforactions++; + } else { + // Search country by name or code + if (!empty($contactstatic->country)) { + require_once DOL_DOCUMENT_ROOT . '/core/lib/company.lib.php'; + $result = getCountry('', 3, $this->db, '', 1, $contactstatic->country); + if ($result == 'NotDefined') { + $errorforactions++; + $this->error = "Error country not found by this name '" . $contactstatic->country . "'"; + } elseif (!($result > 0)) { + $errorforactions++; + $this->error = "Error when search country by this name '" . $contactstatic->country . "'"; + $this->errors[] = $this->db->lasterror(); + } else { + $contactstatic->country_id = $result; + $operationslog .= '
We set property country_id='.dol_escape_htmltag($result); + } + } elseif (!empty($contactstatic->country_code)) { + require_once DOL_DOCUMENT_ROOT . '/core/lib/company.lib.php'; + $result = getCountry($contactstatic->country_code, 3, $this->db); + if ($result == 'NotDefined') { + $errorforactions++; + $this->error = "Error country not found by this code '" . $contactstatic->country_code . "'"; + } elseif (!($result > 0)) { + $errorforactions++; + $this->error = "Error when search country by this code '" . $contactstatic->country_code . "'"; + $this->errors[] = $this->db->lasterror(); + } else { + $contactstatic->country_id = $result; + $operationslog .= '
We set property country_id='.dol_escape_htmltag($result); + } + } + + if (!$errorforactions) { + // Search state by name or code (for country if defined) + if (!empty($contactstatic->state)) { + require_once DOL_DOCUMENT_ROOT . '/core/lib/functions.lib.php'; + $result = dol_getIdFromCode($this->db, $contactstatic->state, 'c_departements', 'nom', 'rowid'); + if (empty($result)) { + $errorforactions++; + $this->error = "Error state not found by this name '" . $contactstatic->state . "'"; + } elseif (!($result > 0)) { + $errorforactions++; + $this->error = "Error when search state by this name '" . $contactstatic->state . "'"; + $this->errors[] = $this->db->lasterror(); + } else { + $contactstatic->state_id = $result; + $operationslog .= '
We set property state_id='.dol_escape_htmltag($result); + } + } elseif (!empty($contactstatic->state_code)) { + require_once DOL_DOCUMENT_ROOT . '/core/lib/functions.lib.php'; + $result = dol_getIdFromCode($this->db, $contactstatic->state_code, 'c_departements', 'code_departement', 'rowid'); + if (empty($result)) { + $errorforactions++; + $this->error = "Error state not found by this code '" . $contactstatic->state_code . "'"; + } elseif (!($result > 0)) { + $errorforactions++; + $this->error = "Error when search state by this code '" . $contactstatic->state_code . "'"; + $this->errors[] = $this->db->lasterror(); + } else { + $contactstatic->state_id = $result; + $operationslog .= '
We set property state_id='.dol_escape_htmltag($result); + } + } + } + + if (!$errorforactions) { + $result = $contactstatic->create($user); + if ($result <= 0) { + $errorforactions++; + $this->error = $contactstatic->error; + $this->errors = $contactstatic->errors; + } else { + $operationslog .= '
Contact created -> id = '.dol_escape_htmltag($contactstatic->id); + } + } + } + } + } + } } elseif ($operation['type'] == 'recordevent') { // Create event $actioncomm = new ActionComm($this->db); diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index b6c780a6be0..9fa5f7f1c28 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -2119,6 +2119,7 @@ CodeLastResult=Latest result code NbOfEmailsInInbox=Number of emails in source directory LoadThirdPartyFromName=Load third party searching on %s (load only) LoadThirdPartyFromNameOrCreate=Load third party searching on %s (create if not found) +LoadContactFromEmailOrCreate=Load contact searching on %s (create if not found) AttachJoinedDocumentsToObject=Save attached files into object documents if a ref of an object is found into email topic. WithDolTrackingID=Message from a conversation initiated by a first email sent from Dolibarr WithoutDolTrackingID=Message from a conversation initiated by a first email NOT sent from Dolibarr diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang index 79a266df816..6a59583e7c0 100644 --- a/htdocs/langs/fr_FR/admin.lang +++ b/htdocs/langs/fr_FR/admin.lang @@ -2115,6 +2115,7 @@ CodeLastResult=Dernier code de retour NbOfEmailsInInbox=Nombre de courriels dans le répertoire source LoadThirdPartyFromName=Charger le Tiers en cherchant sur %s (chargement uniquement) LoadThirdPartyFromNameOrCreate=Charger le Tiers en cherchant sur %s (créer si non trouvé) +LoadContactFromEmailOrCreate=Charger le Contact en cherchant sur %s (créer si non trouvé) AttachJoinedDocumentsToObject=Enregistrez les fichiers joints dans des documents d'objet si la référence d'un objet est trouvée dans le sujet de l'e-mail. WithDolTrackingID=Message d'une conversation initiée par un premier mail envoyé depuis Dolibarr WithoutDolTrackingID=Message d'une conversation initiée par un premier e-mail NON envoyé depuis Dolibarr From 3be0f0e1d0f2c206442cc83b7325d6f8ac6ac7d9 Mon Sep 17 00:00:00 2001 From: VESSILLER Date: Thu, 1 Dec 2022 17:21:41 +0100 Subject: [PATCH 0087/1128] FIX stickler-ci --- htdocs/emailcollector/class/emailcollector.class.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/htdocs/emailcollector/class/emailcollector.class.php b/htdocs/emailcollector/class/emailcollector.class.php index db932e0a4ca..1393913bb35 100644 --- a/htdocs/emailcollector/class/emailcollector.class.php +++ b/htdocs/emailcollector/class/emailcollector.class.php @@ -2141,9 +2141,7 @@ class EmailCollector extends CommonObject } } } - } - // Search and create contact - elseif ($operation['type'] == 'loadandcreatecontact') { + } elseif ($operation['type'] == 'loadandcreatecontact') { // Search and create contact if (empty($operation['actionparam'])) { $errorforactions++; $this->error = "Action loadandcreatecontact has empty parameter. Must be 'SET:xxx' or 'EXTRACT:(body|subject):regex' to define how to extract data"; From 3b45f894c59719ef3ede31600706a32a3ce42bae Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Fri, 2 Dec 2022 15:10:54 +0100 Subject: [PATCH 0088/1128] add mode Kanban to list of userGroup --- htdocs/user/class/usergroup.class.php | 28 ++++++++++ htdocs/user/group/list.php | 74 ++++++++++++++++++--------- 2 files changed, 79 insertions(+), 23 deletions(-) diff --git a/htdocs/user/class/usergroup.class.php b/htdocs/user/class/usergroup.class.php index bb8fa374eea..849b08bc7f6 100644 --- a/htdocs/user/class/usergroup.class.php +++ b/htdocs/user/class/usergroup.class.php @@ -917,4 +917,32 @@ class UserGroup extends CommonObject return $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams); } + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $langs; + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).''; + if (property_exists($this, 'members')) { + $return .= '
'.(!empty($this->members)? $this->members : 0).' '.$langs->trans('Users').''; + } + if (property_exists($this, 'nb_rights')) { + $return .= '
'.$langs->trans('NbOfPermissions').' : '.$this->nb_rights.'
'; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } diff --git a/htdocs/user/group/list.php b/htdocs/user/group/list.php index 4c91bd041dd..209be95e043 100644 --- a/htdocs/user/group/list.php +++ b/htdocs/user/group/list.php @@ -37,6 +37,8 @@ $search_group = GETPOST('search_group'); $optioncss = GETPOST('optioncss', 'alpha'); $massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists) $contextpage = GETPOST('optioncss', 'aZ09'); +$mode = GETPOST('mode', 'aZ'); + // Defini si peux lire/modifier utilisateurs et permisssions $caneditperms = ($user->admin || $user->hasRight("user", "user", "write")); @@ -152,6 +154,10 @@ if ($resql) { $i = 0; $param = "&search_group=".urlencode($search_group)."&sall=".urlencode($sall); + if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); + } + if ($optioncss != '') { $param .= '&optioncss='.$optioncss; } @@ -159,6 +165,9 @@ if ($resql) { $text = $langs->trans("ListOfGroups"); $newcardbutton = ''; + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); + if ($caneditperms) { $newcardbutton .= dolGetButtonTitle($langs->trans('NewGroup'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/user/group/card.php?action=create&leftmenu='); } @@ -172,6 +181,8 @@ if ($resql) { print ''; print ''; print ''; + print ''; + print_barre_liste($text, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, "", $num, $nbtotalofrecords, 'object_group', 0, $newcardbutton, '', $limit, 0, 0, 1); @@ -205,33 +216,50 @@ if ($resql) { $grouptemp = new UserGroup($db); - while ($i < $num) { + $imaxinloop = ($limit ? min($num, $limit) : $num); + + while ($i < $imaxinloop) { $obj = $db->fetch_object($resql); + $grouptemp->setVarsFromFetchObj($obj); - $grouptemp->id = $obj->rowid; - $grouptemp->name = $obj->name; - $grouptemp->note = $obj->note; + $grouptemp->name = $obj->name; + $grouptemp->note = $obj->note; + $grouptemp->members = $obj->nb; + $grouptemp->nb_rights = $obj->nbpermissions; - print '
'; - print $grouptemp->getNomUrl(1); - if (isModEnabled('multicompany') && !$obj->entity) { - print img_picto($langs->trans("GlobalGroup"), 'redstar'); + if ($mode == 'kanban') { + if ($i == 0) { + print '
'; + print '
'; + } + // Output Kanban + print $grouptemp->getKanbanView(''); + if ($i == ($imaxinloop - 1)) { + print '
'; + print '
'; + print $grouptemp->getNomUrl(1); + if (isModEnabled('multicompany') && !$obj->entity) { + print img_picto($langs->trans("GlobalGroup"), 'redstar'); + } + print "'.dol_escape_htmltag($mc->label).''.$obj->nb.''; + print ''.$obj->nbpermissions.''; + print ''.dol_print_date($db->jdate($obj->datec), "dayhour").''.dol_print_date($db->jdate($obj->datem), "dayhour").'
'.dol_escape_htmltag($mc->label).''.$obj->nb.''; - print ''.$obj->nbpermissions.''; - print ''.dol_print_date($db->jdate($obj->datec), "dayhour").''.dol_print_date($db->jdate($obj->datem), "dayhour").'
"; From 8426e955c8f221817653f9cc498db8eb60a7c713 Mon Sep 17 00:00:00 2001 From: Jesse Rovira Date: Fri, 2 Dec 2022 12:34:13 -0300 Subject: [PATCH 0089/1128] Showing Due date into last customer invoice at comm card --- htdocs/comm/card.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/htdocs/comm/card.php b/htdocs/comm/card.php index f578aa75cf5..0df573b7f9b 100644 --- a/htdocs/comm/card.php +++ b/htdocs/comm/card.php @@ -1418,7 +1418,7 @@ if ($object->id > 0) { $sql .= ', f.total_tva'; $sql .= ', f.total_ttc'; $sql .= ', f.entity'; - $sql .= ', f.datef as df, f.datec as dc, f.paye as paye, f.fk_statut as status'; + $sql .= ', f.datef as df, f.date_lim_reglement as dl, f.datec as dc, f.paye as paye, f.fk_statut as status'; $sql .= ', s.nom, s.rowid as socid'; $sql .= ', SUM(pf.amount) as am'; $sql .= " FROM ".MAIN_DB_PREFIX."societe as s,".MAIN_DB_PREFIX."facture as f"; @@ -1496,6 +1496,11 @@ if ($object->id > 0) { } else { print '!!!'; } + if ($objp->dl > 0) { + print ''.dol_print_date($db->jdate($objp->dl), 'day').''; + } else { + print '!!!'; + } print ''; print price($objp->total_ht); print ''; From f98381de8a45047a182d10df72c1509575f2a915 Mon Sep 17 00:00:00 2001 From: Jesse Rovira Date: Fri, 2 Dec 2022 13:36:17 -0300 Subject: [PATCH 0090/1128] Showing label for Due date into last customer invoice at comm card --- htdocs/comm/card.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/comm/card.php b/htdocs/comm/card.php index 0df573b7f9b..345a97e9e19 100644 --- a/htdocs/comm/card.php +++ b/htdocs/comm/card.php @@ -1492,12 +1492,12 @@ if ($object->id > 0) { //print $formfile->getDocumentsLink($facturestatic->element, $filename, $filedir); print ''; if ($objp->df > 0) { - print ''.dol_print_date($db->jdate($objp->df), 'day').''; + print ''.$langs->trans('DateInvoice').": ".dol_print_date($db->jdate($objp->df), 'day').''; } else { print '!!!'; } if ($objp->dl > 0) { - print ''.dol_print_date($db->jdate($objp->dl), 'day').''; + print ''.$langs->trans('DateMaxPayment').": ".dol_print_date($db->jdate($objp->dl), 'day').''; } else { print '!!!'; } From 19e3a8949a0476647849c18e4aeae45785ce6e73 Mon Sep 17 00:00:00 2001 From: FLIO Date: Mon, 5 Dec 2022 10:51:09 +0100 Subject: [PATCH 0091/1128] Fix(scrutinizer) --- htdocs/core/boxes/box_services_contracts.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/boxes/box_services_contracts.php b/htdocs/core/boxes/box_services_contracts.php index acc1d40eed5..433db55a515 100644 --- a/htdocs/core/boxes/box_services_contracts.php +++ b/htdocs/core/boxes/box_services_contracts.php @@ -124,7 +124,7 @@ class box_services_contracts extends ModeleBoxes $contractlinestatic->label = $objp->label; $contractlinestatic->description = $objp->description; $contractlinestatic->type = $objp->type; - $contractlinestatic->fk_productyy = $objp->product_id; + $contractlinestatic->fk_product = $objp->product_id; $contractlinestatic->product_ref = $objp->product_ref; $contractlinestatic->product_type = $objp->product_type; $contractlinestatic->statut = $objp->contractline_status; From 1c108f3583c76c00fd243f918d2fc84643b251fb Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Tue, 6 Dec 2022 16:11:14 +0100 Subject: [PATCH 0092/1128] New mode kaban for products list --- htdocs/product/class/product.class.php | 55 ++ htdocs/product/list.php | 1128 ++++++++++++------------ htdocs/theme/eldy/info-box.inc.php | 25 + 3 files changed, 655 insertions(+), 553 deletions(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index ffb72bfca78..b0b55cab66c 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -6238,6 +6238,61 @@ class Product extends CommonObject return $prodDurationHours; } + + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $langs,$conf; + + $return = '
'; + $return .= '
'; + $return .= '
'; + $label = ''; + + if ($this->is_photo_available($conf->product->multidir_output[$this->entity])) { + $label .= $this->show_photos('product', $conf->product->multidir_output[$this->entity]); + $return .= $label; + } else { + if ($this->type == Product::TYPE_PRODUCT) { + $label .= img_picto('', 'product'); + } elseif ($this->type == Product::TYPE_SERVICE) { + $label .= img_picto('', 'service'); + } + $return .= $label; + } + + $return .= '
'; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).''; + if (property_exists($this, 'label')) { + $return .= '
'.$this->label.''; + } + if (property_exists($this, 'price') && property_exists($this, 'price_ttc')) { + if ($this->price_base_type == 'TTC') { + $return .= '
'.price($this->price_ttc).' '.$langs->trans("TTC").''; + } else { + if ($this->status) { + $return .= '
'.price($this->price).' '.$langs->trans("HT").''; + } + } + } + if (property_exists($this, 'stock_reel')) { + $return .= '
'.$langs->trans('PhysicalStock').' : '.$this->stock_reel.''; + } + if (method_exists($this, 'getLibStatut')) { + $return .='
'.$this->getLibStatut(5, 1).' '.$this->getLibStatut(5, 0).''; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } /** diff --git a/htdocs/product/list.php b/htdocs/product/list.php index df9acd10cf7..f45f33c9de1 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -97,6 +97,8 @@ $search_accountancy_code_buy_export = GETPOST("search_accountancy_code_buy_expor $search_finished = GETPOST("search_finished", 'int'); $optioncss = GETPOST('optioncss', 'alpha'); $type = GETPOST("type", "int"); +$mode = GETPOST('mode', 'alpha'); + //Show/hide child products if (isModEnabled('variants') && !empty($conf->global->PRODUIT_ATTRIBUTES_HIDECHILD)) { @@ -642,6 +644,9 @@ if ($resql) { } $param = ''; + if (!empty($mode)) { + $param = "&mode=".urlencode($mode); + } if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -751,6 +756,8 @@ if ($resql) { $massactionbutton = $form->selectMassAction('', $arrayofmassactions); $newcardbutton = ''; + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); if ($type === "") { $perm = ($user->rights->produit->creer || $user->rights->service->creer); } elseif ($type == Product::TYPE_SERVICE) { @@ -784,6 +791,7 @@ if ($resql) { print ''; print ''; print ''; + print ''; //print ''; print ''; if (empty($arrayfields['p.fk_product_type']['checked'])) { @@ -1297,7 +1305,8 @@ if ($resql) { $i = 0; $totalarray = array(); $totalarray['nbfield'] = 0; - while ($i < min($num, $limit)) { + $imaxinloop = ($limit ? min($num, $limit) : $num); + while ($i < $imaxinloop) { $obj = $db->fetch_object($resql); // Multilangs @@ -1366,592 +1375,605 @@ if ($resql) { if ($product_static->isService()) { $usercancreadprice = getDolGlobalString('MAIN_USE_ADVANCED_PERMS')?$user->hasRight('service', 'service_advance', 'read_prices'):$user->hasRight('service', 'lire'); } + if ($mode == 'Kanban') { + if ($i == 0) { + print ''; + print '
'; + } + $product_static->price = $obj->price; + // Output Kanban + print $product_static->getKanbanView(''); + if ($i == ($imaxinloop - 1)) { + print '
'; + print ''; + } + } else { + print ''; - print ''; - - // Action column - if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->rowid, $arrayofselected)) { - $selected = 1; + // Action column + if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->rowid, $arrayofselected)) { + $selected = 1; + } + print ''; + } + print ''; + if (!$i) { + $totalarray['nbfield']++; } - print ''; } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Ref - if (!empty($arrayfields['p.rowid']['checked'])) { - print ''; - print $product_static->id; - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Ref - if (!empty($arrayfields['p.ref']['checked'])) { - print ''; - print $product_static->getNomUrl(1); - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Ref supplier - if (!empty($arrayfields['pfp.ref_fourn']['checked'])) { - print ''; - print $product_static->getNomUrl(1); - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Thumbnail - if (!empty($arrayfields['thumbnail']['checked'])) { - $product_thumbnail_html = ''; - if (!empty($product_static->entity)) { - $product_thumbnail = $product_static->show_photos('product', $conf->product->multidir_output[$product_static->entity], 1, 1, 0, 0, 0, 80); - if ($product_static->nbphoto > 0) { - $product_thumbnail_html = $product_thumbnail; + // Ref + if (!empty($arrayfields['p.rowid']['checked'])) { + print ''; + print $product_static->id; + print "\n"; + if (!$i) { + $totalarray['nbfield']++; } } - print '' . $product_thumbnail_html . ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Label - if (!empty($arrayfields['p.label']['checked'])) { - print ''.$obj->label.''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Type - if (!empty($arrayfields['p.fk_product_type']['checked'])) { - print ''; - $s = ''; - if ($obj->fk_product_type == 0) { - $s .= img_picto($langs->trans("Product"), 'product', 'class="paddingleftonly paddingrightonly colorgrey"'); - } else { - $s .= img_picto($langs->trans("Service"), 'service', 'class="paddingleftonly paddingrightonly colorgrey"'); - } - print $s; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Barcode - if (!empty($arrayfields['p.barcode']['checked'])) { - print ''.$obj->barcode.''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Duration - if (!empty($arrayfields['p.duration']['checked'])) { - print ''; - - if (preg_match('/([^a-z]+)[a-z]$/i', $obj->duration)) { - $duration_value = substr($obj->duration, 0, dol_strlen($obj->duration) - 1); - $duration_unit = substr($obj->duration, -1); - - if ((float) $duration_value > 1) { - $dur = array("i"=>$langs->trans("Minutes"), "h"=>$langs->trans("Hours"), "d"=>$langs->trans("Days"), "w"=>$langs->trans("Weeks"), "m"=>$langs->trans("Months"), "y"=>$langs->trans("Years")); - } elseif ((float) $duration_value > 0) { - $dur = array("i"=>$langs->trans("Minute"), "h"=>$langs->trans("Hour"), "d"=>$langs->trans("Day"), "w"=>$langs->trans("Week"), "m"=>$langs->trans("Month"), "y"=>$langs->trans("Year")); + // Ref + if (!empty($arrayfields['p.ref']['checked'])) { + print ''; + print $product_static->getNomUrl(1); + print "\n"; + if (!$i) { + $totalarray['nbfield']++; } - print $duration_value; - print ((!empty($duration_unit) && isset($dur[$duration_unit]) && $duration_value != '') ? ' '.$langs->trans($dur[$duration_unit]) : ''); - } elseif (!preg_match('/^[a-z]$/i', $obj->duration)) { // If duration is a simple char (like 's' of 'm'), we do not show value - print $obj->duration; } - print ''; - if (!$i) { - $totalarray['nbfield']++; + // Ref supplier + if (!empty($arrayfields['pfp.ref_fourn']['checked'])) { + print ''; + print $product_static->getNomUrl(1); + print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } } - } - // Finished - if (!empty($arrayfields['p.finished']['checked'])) { - print ''; - print $product_static->getLibFinished(); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } + // Thumbnail + if (!empty($arrayfields['thumbnail']['checked'])) { + $product_thumbnail_html = ''; + if (!empty($product_static->entity)) { + $product_thumbnail = $product_static->show_photos('product', $conf->product->multidir_output[$product_static->entity], 1, 1, 0, 0, 0, 80); + if ($product_static->nbphoto > 0) { + $product_thumbnail_html = $product_thumbnail; + } + } - // Weight - if (!empty($arrayfields['p.weight']['checked'])) { - print ''; - print $obj->weight; - print ''; - if (!$i) { - $totalarray['nbfield']++; + print '' . $product_thumbnail_html . ''; + if (!$i) { + $totalarray['nbfield']++; + } } - } - // Weight units - if (!empty($arrayfields['p.weight_units']['checked'])) { - print ''; - if ($product_static->weight != '') { - print measuringUnitString(0, 'weight', $product_static->weight_units); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Length - if (!empty($arrayfields['p.length']['checked'])) { - print ''; - print $obj->length; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Length units - if (!empty($arrayfields['p.length_units']['checked'])) { - print ''; - if ($product_static->length != '') { - print measuringUnitString(0, 'size', $product_static->length_units); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Width - if (!empty($arrayfields['p.width']['checked'])) { - print ''; - print $obj->width; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Width units - if (!empty($arrayfields['p.width_units']['checked'])) { - print ''; - if ($product_static->width != '') { - print measuringUnitString(0, 'size', $product_static->width_units); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Height - if (!empty($arrayfields['p.height']['checked'])) { - print ''; - print $obj->height; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Height units - if (!empty($arrayfields['p.height_units']['checked'])) { - print ''; - if ($product_static->height != '') { - print measuringUnitString(0, 'size', $product_static->height_units); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Surface - if (!empty($arrayfields['p.surface']['checked'])) { - print ''; - print $obj->surface; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Surface units - if (!empty($arrayfields['p.surface_units']['checked'])) { - print ''; - if ($product_static->surface != '') { - print measuringUnitString(0, 'surface', $product_static->surface_units); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Volume - if (!empty($arrayfields['p.volume']['checked'])) { - print ''; - print $obj->volume; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Volume units - if (!empty($arrayfields['p.volume_units']['checked'])) { - print ''; - if ($product_static->volume != '') { - print measuringUnitString(0, 'volume', $product_static->volume_units); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Unit - if (!empty($arrayfields['cu.label']['checked'])) { - print ''; - if (!empty($obj->cu_label)) { - print $langs->trans($obj->cu_label); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Sell price - if (!empty($arrayfields['p.sellprice']['checked'])) { - print ''; - if ($obj->tosell && $usercancreadprice) { - if ($obj->price_base_type == 'TTC') { - print ''.price($obj->price_ttc).' '.$langs->trans("TTC").''; + // Label + if (!empty($arrayfields['p.label']['checked'])) { + print ''.$obj->label.''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Type + if (!empty($arrayfields['p.fk_product_type']['checked'])) { + print ''; + $s = ''; + if ($obj->fk_product_type == 0) { + $s .= img_picto($langs->trans("Product"), 'product', 'class="paddingleftonly paddingrightonly colorgrey"'); } else { - print ''.price($obj->price).' '.$langs->trans("HT").''; + $s .= img_picto($langs->trans("Service"), 'service', 'class="paddingleftonly paddingrightonly colorgrey"'); + } + print $s; + print ''; + if (!$i) { + $totalarray['nbfield']++; } } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Multiprices - if (!empty($conf->global->PRODUIT_MULTIPRICES)) { - if (! isset($productpricescache)) { - $productpricescache=array(); - } - if (! isset($productpricescache[$obj->rowid])) { - $productpricescache[$obj->rowid] = array(); + // Barcode + if (!empty($arrayfields['p.barcode']['checked'])) { + print ''.$obj->barcode.''; + if (!$i) { + $totalarray['nbfield']++; + } } - if ($obj->tosell && $usercancreadprice) { - // Make 1 request for all price levels (without filter on price_level) and saved result into an cache array - // then reuse the cache array if we need prices for other price levels - $sqlp = "SELECT p.rowid, p.fk_product, p.price, p.price_ttc, p.price_level, p.date_price, p.price_base_type"; - $sqlp .= " FROM ".MAIN_DB_PREFIX."product_price as p"; - $sqlp .= " WHERE fk_product = ".((int) $obj->rowid); - $sqlp .= " ORDER BY p.date_price DESC, p.rowid DESC, p.price_level ASC"; - $resultp = $db->query($sqlp); - if ($resultp) { - $nump = $db->num_rows($resultp); - $j = 0; - while ($j < $nump) { - $objp = $db->fetch_object($resultp); + // Duration + if (!empty($arrayfields['p.duration']['checked'])) { + print ''; - if (empty($productpricescache[$obj->rowid][$objp->price_level])) { - $productpricescache[$obj->rowid][$objp->price_level]['price'] = $objp->price; - $productpricescache[$obj->rowid][$objp->price_level]['price_ttc'] = $objp->price_ttc; - $productpricescache[$obj->rowid][$objp->price_level]['price_base_type'] = $objp->price_base_type; + if (preg_match('/([^a-z]+)[a-z]$/i', $obj->duration)) { + $duration_value = substr($obj->duration, 0, dol_strlen($obj->duration) - 1); + $duration_unit = substr($obj->duration, -1); + + if ((float) $duration_value > 1) { + $dur = array("i"=>$langs->trans("Minutes"), "h"=>$langs->trans("Hours"), "d"=>$langs->trans("Days"), "w"=>$langs->trans("Weeks"), "m"=>$langs->trans("Months"), "y"=>$langs->trans("Years")); + } elseif ((float) $duration_value > 0) { + $dur = array("i"=>$langs->trans("Minute"), "h"=>$langs->trans("Hour"), "d"=>$langs->trans("Day"), "w"=>$langs->trans("Week"), "m"=>$langs->trans("Month"), "y"=>$langs->trans("Year")); + } + print $duration_value; + print ((!empty($duration_unit) && isset($dur[$duration_unit]) && $duration_value != '') ? ' '.$langs->trans($dur[$duration_unit]) : ''); + } elseif (!preg_match('/^[a-z]$/i', $obj->duration)) { // If duration is a simple char (like 's' of 'm'), we do not show value + print $obj->duration; + } + + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Finished + if (!empty($arrayfields['p.finished']['checked'])) { + print ''; + print $product_static->getLibFinished(); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Weight + if (!empty($arrayfields['p.weight']['checked'])) { + print ''; + print $obj->weight; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Weight units + if (!empty($arrayfields['p.weight_units']['checked'])) { + print ''; + if ($product_static->weight != '') { + print measuringUnitString(0, 'weight', $product_static->weight_units); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Length + if (!empty($arrayfields['p.length']['checked'])) { + print ''; + print $obj->length; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Length units + if (!empty($arrayfields['p.length_units']['checked'])) { + print ''; + if ($product_static->length != '') { + print measuringUnitString(0, 'size', $product_static->length_units); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Width + if (!empty($arrayfields['p.width']['checked'])) { + print ''; + print $obj->width; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Width units + if (!empty($arrayfields['p.width_units']['checked'])) { + print ''; + if ($product_static->width != '') { + print measuringUnitString(0, 'size', $product_static->width_units); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Height + if (!empty($arrayfields['p.height']['checked'])) { + print ''; + print $obj->height; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Height units + if (!empty($arrayfields['p.height_units']['checked'])) { + print ''; + if ($product_static->height != '') { + print measuringUnitString(0, 'size', $product_static->height_units); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Surface + if (!empty($arrayfields['p.surface']['checked'])) { + print ''; + print $obj->surface; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Surface units + if (!empty($arrayfields['p.surface_units']['checked'])) { + print ''; + if ($product_static->surface != '') { + print measuringUnitString(0, 'surface', $product_static->surface_units); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Volume + if (!empty($arrayfields['p.volume']['checked'])) { + print ''; + print $obj->volume; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Volume units + if (!empty($arrayfields['p.volume_units']['checked'])) { + print ''; + if ($product_static->volume != '') { + print measuringUnitString(0, 'volume', $product_static->volume_units); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Unit + if (!empty($arrayfields['cu.label']['checked'])) { + print ''; + if (!empty($obj->cu_label)) { + print $langs->trans($obj->cu_label); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Sell price + if (!empty($arrayfields['p.sellprice']['checked'])) { + print ''; + if ($obj->tosell && $usercancreadprice) { + if ($obj->price_base_type == 'TTC') { + print ''.price($obj->price_ttc).' '.$langs->trans("TTC").''; + } else { + print ''.price($obj->price).' '.$langs->trans("HT").''; + } + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + + // Multiprices + if (!empty($conf->global->PRODUIT_MULTIPRICES)) { + if (! isset($productpricescache)) { + $productpricescache=array(); + } + if (! isset($productpricescache[$obj->rowid])) { + $productpricescache[$obj->rowid] = array(); + } + + if ($obj->tosell && $usercancreadprice) { + // Make 1 request for all price levels (without filter on price_level) and saved result into an cache array + // then reuse the cache array if we need prices for other price levels + $sqlp = "SELECT p.rowid, p.fk_product, p.price, p.price_ttc, p.price_level, p.date_price, p.price_base_type"; + $sqlp .= " FROM ".MAIN_DB_PREFIX."product_price as p"; + $sqlp .= " WHERE fk_product = ".((int) $obj->rowid); + $sqlp .= " ORDER BY p.date_price DESC, p.rowid DESC, p.price_level ASC"; + $resultp = $db->query($sqlp); + if ($resultp) { + $nump = $db->num_rows($resultp); + $j = 0; + while ($j < $nump) { + $objp = $db->fetch_object($resultp); + + if (empty($productpricescache[$obj->rowid][$objp->price_level])) { + $productpricescache[$obj->rowid][$objp->price_level]['price'] = $objp->price; + $productpricescache[$obj->rowid][$objp->price_level]['price_ttc'] = $objp->price_ttc; + $productpricescache[$obj->rowid][$objp->price_level]['price_base_type'] = $objp->price_base_type; + } + + $j++; } - $j++; + $db->free($resultp); + } else { + dol_print_error($db); } + } - $db->free($resultp); + foreach ($arraypricelevel as $key => $value) { + if (!empty($arrayfields['p.sellprice'.$key]['checked'])) { + print ''; + if (!empty($productpricescache[$obj->rowid])) { + if ($productpricescache[$obj->rowid][$key]['price_base_type'] == 'TTC') { + print ''.price($productpricescache[$obj->rowid][$key]['price_ttc']).' '.$langs->trans("TTC").''; + } else { + print ''.price($productpricescache[$obj->rowid][$key]['price']).' '.$langs->trans("HT").''; + } + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + } + } + + // Better buy price + if (!empty($arrayfields['p.minbuyprice']['checked'])) { + print ''; + if ($obj->tobuy && $obj->minsellprice != '' && $usercancreadprice) { + //print price($obj->minsellprice).' '.$langs->trans("HT"); + if ($product_fourn->find_min_price_product_fournisseur($obj->rowid) > 0) { + if ($product_fourn->product_fourn_price_id > 0) { + if ((isModEnabled("fournisseur") && !empty($user->rights->fournisseur->lire) && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || (isModEnabled("supplier_order") && !empty($user->rights->supplier_order->lire)) || (isModEnabled("supplier_invoice") && !empty($user->rights->supplier_invoice->lire))) { + $htmltext = $product_fourn->display_price_product_fournisseur(1, 1, 0, 1); + print ''.$form->textwithpicto(price($product_fourn->fourn_unitprice * (1 - $product_fourn->fourn_remise_percent / 100) - $product_fourn->fourn_remise).' '.$langs->trans("HT"), $htmltext).''; + } else { + print ''.price($product_fourn->fourn_unitprice).' '.$langs->trans("HT").''; + } + } + } + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Number of buy prices + if (!empty($arrayfields['p.numbuyprice']['checked'])) { + print ''; + if ($obj->tobuy && $usercancreadprice) { + if (count($productFournList = $product_fourn->list_product_fournisseur_price($obj->rowid)) > 0) { + $htmltext = $product_fourn->display_price_product_fournisseur(1, 1, 0, 1, $productFournList); + print $form->textwithpicto(count($productFournList), $htmltext); + } + } + print ''; + } + + // VAT or Sell Tax Rate + if (!empty($arrayfields['p.tva_tx']['checked'])) { + print ''; + print vatrate($obj->tva_tx, true); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // WAP + if (!empty($arrayfields['p.pmp']['checked'])) { + print ''; + if ($usercancreadprice) { + print ''.price($product_static->pmp, 1, $langs).""; + } + print ''; + } + // Cost price + if (!empty($arrayfields['p.cost_price']['checked'])) { + print ''; + //print $obj->cost_price; + if ($usercancreadprice) { + print ''.price($obj->cost_price).' '.$langs->trans("HT").''; + } + print ''; + } + + // Limit alert + if (!empty($arrayfields['p.seuil_stock_alerte']['checked'])) { + print ''; + if ($obj->fk_product_type != 1) { + print $obj->seuil_stock_alerte; + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Desired stock + if (!empty($arrayfields['p.desiredstock']['checked'])) { + print ''; + if ($obj->fk_product_type != 1) { + print $obj->desiredstock; + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Stock real + if (!empty($arrayfields['p.stock']['checked'])) { + print ''; + if ($obj->fk_product_type != 1) { + if ($obj->seuil_stock_alerte != '' && $product_static->stock_reel < (float) $obj->seuil_stock_alerte) { + print img_warning($langs->trans("StockLowerThanLimit", $obj->seuil_stock_alerte)).' '; + } + if ($usercancreadprice) { + print price(price2num($product_static->stock_reel, 'MS')); + } + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Stock virtual + if (!empty($arrayfields['stock_virtual']['checked'])) { + print ''; + if ($obj->fk_product_type != 1) { + if ($obj->seuil_stock_alerte != '' && $product_static->stock_theorique < (float) $obj->seuil_stock_alerte) { + print img_warning($langs->trans("StockLowerThanLimit", $obj->seuil_stock_alerte)).' '; + } + if ($usercancreadprice) { + print price(price2num($product_static->stock_theorique, 'MS')); + } + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Lot/Serial + if (!empty($arrayfields['p.tobatch']['checked'])) { + print ''; + print $product_static->getLibStatut(1, 2); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Country + if (!empty($arrayfields['p.fk_country']['checked'])) { + print ''.getCountry($obj->fk_country, 0, $db).''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // State + if (!empty($arrayfields['p.fk_state']['checked'])) { + print ''; + if (!empty($obj->fk_state)) { + print getState($obj->fk_state, 0, $db); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Accountancy code sell + if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell']['checked'])) { + print ''.$obj->accountancy_code_sell.''; + if (!$i) { + $totalarray['nbfield']++; + } + } + if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell_intra']['checked'])) { + print ''.$obj->accountancy_code_sell_intra.''; + if (!$i) { + $totalarray['nbfield']++; + } + } + if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell_export']['checked'])) { + print ''.$obj->accountancy_code_sell_export.''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Accountancy code buy + if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy']['checked'])) { + print ''.$obj->accountancy_code_buy.''; + if (!$i) { + $totalarray['nbfield']++; + } + } + if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy_intra']['checked'])) { + print ''.$obj->accountancy_code_buy_intra.''; + if (!$i) { + $totalarray['nbfield']++; + } + } + if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy_export']['checked'])) { + print ''.$obj->accountancy_code_buy_export.''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Date creation + if (!empty($arrayfields['p.datec']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Date modification + if (!empty($arrayfields['p.tms']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Status (to sell) + if (!empty($arrayfields['p.tosell']['checked'])) { + print ''; + if (!empty($conf->use_javascript_ajax) && $user->hasRight("produit", "creer") && !empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) { + print ajax_object_onoff($product_static, 'status', 'tosell', 'ProductStatusOnSell', 'ProductStatusNotOnSell'); } else { - dol_print_error($db); + print $product_static->LibStatut($obj->tosell, 5, 0); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Status (to buy) + if (!empty($arrayfields['p.tobuy']['checked'])) { + print ''; + if (!empty($conf->use_javascript_ajax) && $user->hasRight("produit", "creer") && !empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) { + print ajax_object_onoff($product_static, 'status_buy', 'tobuy', 'ProductStatusOnBuy', 'ProductStatusNotOnBuy'); + } else { + print $product_static->LibStatut($obj->tobuy, 5, 1); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; } } - foreach ($arraypricelevel as $key => $value) { - if (!empty($arrayfields['p.sellprice'.$key]['checked'])) { - print ''; - if (!empty($productpricescache[$obj->rowid])) { - if ($productpricescache[$obj->rowid][$key]['price_base_type'] == 'TTC') { - print ''.price($productpricescache[$obj->rowid][$key]['price_ttc']).' '.$langs->trans("TTC").''; - } else { - print ''.price($productpricescache[$obj->rowid][$key]['price']).' '.$langs->trans("HT").''; - } - } - print ''; - if (!$i) { - $totalarray['nbfield']++; + // Action column + if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->rowid, $arrayofselected)) { + $selected = 1; } + print ''; + } + print ''; + if (!$i) { + $totalarray['nbfield']++; } } - } - // Better buy price - if (!empty($arrayfields['p.minbuyprice']['checked'])) { - print ''; - if ($obj->tobuy && $obj->minsellprice != '' && $usercancreadprice) { - //print price($obj->minsellprice).' '.$langs->trans("HT"); - if ($product_fourn->find_min_price_product_fournisseur($obj->rowid) > 0) { - if ($product_fourn->product_fourn_price_id > 0) { - if ((isModEnabled("fournisseur") && !empty($user->rights->fournisseur->lire) && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || (isModEnabled("supplier_order") && !empty($user->rights->supplier_order->lire)) || (isModEnabled("supplier_invoice") && !empty($user->rights->supplier_invoice->lire))) { - $htmltext = $product_fourn->display_price_product_fournisseur(1, 1, 0, 1); - print ''.$form->textwithpicto(price($product_fourn->fourn_unitprice * (1 - $product_fourn->fourn_remise_percent / 100) - $product_fourn->fourn_remise).' '.$langs->trans("HT"), $htmltext).''; - } else { - print ''.price($product_fourn->fourn_unitprice).' '.$langs->trans("HT").''; - } - } - } - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } + print "\n"; } - - // Number of buy prices - if (!empty($arrayfields['p.numbuyprice']['checked'])) { - print ''; - if ($obj->tobuy && $usercancreadprice) { - if (count($productFournList = $product_fourn->list_product_fournisseur_price($obj->rowid)) > 0) { - $htmltext = $product_fourn->display_price_product_fournisseur(1, 1, 0, 1, $productFournList); - print $form->textwithpicto(count($productFournList), $htmltext); - } - } - print ''; - } - - // VAT or Sell Tax Rate - if (!empty($arrayfields['p.tva_tx']['checked'])) { - print ''; - print vatrate($obj->tva_tx, true); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // WAP - if (!empty($arrayfields['p.pmp']['checked'])) { - print ''; - if ($usercancreadprice) { - print ''.price($product_static->pmp, 1, $langs).""; - } - print ''; - } - // Cost price - if (!empty($arrayfields['p.cost_price']['checked'])) { - print ''; - //print $obj->cost_price; - if ($usercancreadprice) { - print ''.price($obj->cost_price).' '.$langs->trans("HT").''; - } - print ''; - } - - // Limit alert - if (!empty($arrayfields['p.seuil_stock_alerte']['checked'])) { - print ''; - if ($obj->fk_product_type != 1) { - print $obj->seuil_stock_alerte; - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Desired stock - if (!empty($arrayfields['p.desiredstock']['checked'])) { - print ''; - if ($obj->fk_product_type != 1) { - print $obj->desiredstock; - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Stock real - if (!empty($arrayfields['p.stock']['checked'])) { - print ''; - if ($obj->fk_product_type != 1) { - if ($obj->seuil_stock_alerte != '' && $product_static->stock_reel < (float) $obj->seuil_stock_alerte) { - print img_warning($langs->trans("StockLowerThanLimit", $obj->seuil_stock_alerte)).' '; - } - if ($usercancreadprice) { - print price(price2num($product_static->stock_reel, 'MS')); - } - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Stock virtual - if (!empty($arrayfields['stock_virtual']['checked'])) { - print ''; - if ($obj->fk_product_type != 1) { - if ($obj->seuil_stock_alerte != '' && $product_static->stock_theorique < (float) $obj->seuil_stock_alerte) { - print img_warning($langs->trans("StockLowerThanLimit", $obj->seuil_stock_alerte)).' '; - } - if ($usercancreadprice) { - print price(price2num($product_static->stock_theorique, 'MS')); - } - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Lot/Serial - if (!empty($arrayfields['p.tobatch']['checked'])) { - print ''; - print $product_static->getLibStatut(1, 2); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Country - if (!empty($arrayfields['p.fk_country']['checked'])) { - print ''.getCountry($obj->fk_country, 0, $db).''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // State - if (!empty($arrayfields['p.fk_state']['checked'])) { - print ''; - if (!empty($obj->fk_state)) { - print getState($obj->fk_state, 0, $db); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Accountancy code sell - if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell']['checked'])) { - print ''.$obj->accountancy_code_sell.''; - if (!$i) { - $totalarray['nbfield']++; - } - } - if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell_intra']['checked'])) { - print ''.$obj->accountancy_code_sell_intra.''; - if (!$i) { - $totalarray['nbfield']++; - } - } - if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell_export']['checked'])) { - print ''.$obj->accountancy_code_sell_export.''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Accountancy code buy - if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy']['checked'])) { - print ''.$obj->accountancy_code_buy.''; - if (!$i) { - $totalarray['nbfield']++; - } - } - if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy_intra']['checked'])) { - print ''.$obj->accountancy_code_buy_intra.''; - if (!$i) { - $totalarray['nbfield']++; - } - } - if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy_export']['checked'])) { - print ''.$obj->accountancy_code_buy_export.''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Extra fields - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - // Date creation - if (!empty($arrayfields['p.datec']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Date modification - if (!empty($arrayfields['p.tms']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Status (to sell) - if (!empty($arrayfields['p.tosell']['checked'])) { - print ''; - if (!empty($conf->use_javascript_ajax) && $user->hasRight("produit", "creer") && !empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) { - print ajax_object_onoff($product_static, 'status', 'tosell', 'ProductStatusOnSell', 'ProductStatusNotOnSell'); - } else { - print $product_static->LibStatut($obj->tosell, 5, 0); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Status (to buy) - if (!empty($arrayfields['p.tobuy']['checked'])) { - print ''; - if (!empty($conf->use_javascript_ajax) && $user->hasRight("produit", "creer") && !empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) { - print ajax_object_onoff($product_static, 'status_buy', 'tobuy', 'ProductStatusOnBuy', 'ProductStatusNotOnBuy'); - } else { - print $product_static->LibStatut($obj->tobuy, 5, 1); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Action column - if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->rowid, $arrayofselected)) { - $selected = 1; - } - print ''; - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - print "\n"; $i++; } diff --git a/htdocs/theme/eldy/info-box.inc.php b/htdocs/theme/eldy/info-box.inc.php index 29f1a229054..b241d4d278b 100644 --- a/htdocs/theme/eldy/info-box.inc.php +++ b/htdocs/theme/eldy/info-box.inc.php @@ -173,6 +173,31 @@ a.info-box-text-a i.fa.fa-exclamation-triangle { bottom: 0; } +/* customize section img box on list of products */ +.info-box-img { + height: 105px !important; + width: 88px; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; + display: block; + overflow: hidden; + float: left; + text-align: center; + font-size: 2.8em; + line-height: 90px; + margin-right: 5px; + background: var(--colorbacktitle1) !important; +} +.info-box-img > img { + width: 90%; + position: relative; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + global->MAIN_DISABLE_GLOBAL_BOXSTATS) && !empty($conf->global->MAIN_INCLUDE_GLOBAL_STATS_IN_OPENED_DASHBOARD)) { ?> .info-box-icon-text{ opacity: 1; From 3f2367dc16406967486a3325c29cdda3c241ad9f Mon Sep 17 00:00:00 2001 From: Milen Karaganski Date: Wed, 7 Dec 2022 13:49:54 +0200 Subject: [PATCH 0093/1128] NEW|New [Bulk delete Project tasks] Massaction to delete multiple tasks from tab Taks of Project --- htdocs/core/lib/project.lib.php | 13 +++++++++++- htdocs/projet/tasks.php | 36 +++++++++++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index b944e8b47a5..7b0b30bcaef 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -569,9 +569,10 @@ function project_admin_prepare_head() * @param string $filterprogresscalc filter text * @param string $showbilltime Add the column 'TimeToBill' and 'TimeBilled' * @param array $arrayfields Array with displayed coloumn information + * @param array $arrayofselected Array with selected fields * @return int Nb of tasks shown */ -function projectLinesa(&$inc, $parent, &$lines, &$level, $var, $showproject, &$taskrole, $projectsListId = '', $addordertick = 0, $projectidfortotallink = 0, $filterprogresscalc = '', $showbilltime = 0, $arrayfields = array()) +function projectLinesa(&$inc, $parent, &$lines, &$level, $var, $showproject, &$taskrole, $projectsListId = '', $addordertick = 0, $projectidfortotallink = 0, $filterprogresscalc = '', $showbilltime = 0, $arrayfields = array(), $arrayofselected = array()) { global $user, $langs, $conf, $db, $hookmanager; global $projectstatic, $taskstatic, $extrafields; @@ -910,6 +911,16 @@ function projectLinesa(&$inc, $parent, &$lines, &$level, $var, $showproject, &$t // Tick to drag and drop print ''; + // Action column + print ''; + $selected = 0; + if (in_array($lines[$i]->id, $arrayofselected)) { + $selected = 1; + } + print ''; + + print ''; + print "\n"; if (!$showlineingray) { diff --git a/htdocs/projet/tasks.php b/htdocs/projet/tasks.php index 951406b4275..c619b25a37b 100644 --- a/htdocs/projet/tasks.php +++ b/htdocs/projet/tasks.php @@ -183,6 +183,14 @@ $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage; * Actions */ +if (GETPOST('cancel', 'alpha')) { + $action = 'list'; + $massaction = ''; +} +if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') { + $massaction = ''; +} + $parameters = array('id'=>$id); $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { @@ -413,6 +421,7 @@ $help_url = "EN:Module_Projects|FR:Module_Projets|ES:Módulo_Proyectos"; llxHeader("", $title, $help_url); +$arrayofselected = is_array($toselect) ? $toselect : array(); if ($id > 0 || !empty($ref)) { $result = $object->fetch($id, $ref); @@ -544,6 +553,17 @@ if ($id > 0 || !empty($ref)) { // Add $param from extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php'; + $arrayofmassactions = array( + 'clone'=>img_picto('', 'rightarrow', 'class="pictofixedwidth"').$langs->trans("Clone"), + ); + if ($permissiontodelete) { + $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete"); + } + if (in_array($massaction, array('presend', 'predelete'))) { + $arrayofmassactions = array(); + } + $massactionbutton = $form->selectMassAction('', $arrayofmassactions); + // Project card $linkback = ''.$langs->trans("BackToList").''; @@ -842,7 +862,11 @@ if ($action == 'create' && $user->rights->projet->creer && (empty($object->third $linktotasks .= dolGetButtonTitle($langs->trans('ViewGantt'), '', 'fa fa-stream imgforviewmode', DOL_URL_ROOT.'/projet/ganttview.php?id='.$object->id.'&withproject=1', '', 1, array('morecss'=>'reposition marginleftonly')); //print_barre_liste($title, 0, $_SERVER["PHP_SELF"], '', $sortfield, $sortorder, $linktotasks, $num, $totalnboflines, 'generic', 0, '', '', 0, 1); - print load_fiche_titre($title, $linktotasks.'   '.$linktocreatetask, 'projecttask'); + print load_fiche_titre($title, $linktotasks.'   '.$linktocreatetask, 'projecttask', '', '', '', $massactionbutton); + + $objecttmp = new Task($db); + $trackid = 'task'.$taskstatic->id; + include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php'; // Get list of tasks in tasksarray and taskarrayfiltered // We need all tasks (even not limited to a user because a task to user can have a parent that is not affected to him). @@ -877,6 +901,11 @@ if ($action == 'create' && $user->rights->projet->creer && (empty($object->third print ''; } + // Show the massaction checkboxes only when this page is not opend from the Extended POS + if ($massactionbutton && $contextpage != 'poslist') { + $selectedfields = $form->showCheckAddButtons('checkforselect', 1); + } + print '
'; print ''; @@ -987,6 +1016,8 @@ if ($action == 'create' && $user->rights->projet->creer && (empty($object->third include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php'; + print ''; + // Action column print ''; print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch '); print "\n"; @@ -1062,7 +1094,7 @@ if ($action == 'create' && $user->rights->projet->creer && (empty($object->third if (count($tasksarray) > 0) { // Show all lines in taskarray (recursive function to go down on tree) $j = 0; $level = 0; - $nboftaskshown = projectLinesa($j, 0, $tasksarray, $level, true, 0, $tasksrole, $object->id, 1, $object->id, $filterprogresscalc, ($object->usage_bill_time ? 1 : 0), $arrayfields); + $nboftaskshown = projectLinesa($j, 0, $tasksarray, $level, true, 0, $tasksrole, $object->id, 1, $object->id, $filterprogresscalc, ($object->usage_bill_time ? 1 : 0), $arrayfields, $arrayofselected); } else { $colspan = 10; if ($object->usage_bill_time) { From ccf40855d8f61981d2a083c98de38a6e07cc4464 Mon Sep 17 00:00:00 2001 From: Milen Karaganski Date: Wed, 7 Dec 2022 14:04:54 +0200 Subject: [PATCH 0094/1128] Removed "Clone" option from massactions list (work in progress) --- htdocs/projet/tasks.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/projet/tasks.php b/htdocs/projet/tasks.php index c619b25a37b..c891179617d 100644 --- a/htdocs/projet/tasks.php +++ b/htdocs/projet/tasks.php @@ -554,7 +554,7 @@ if ($id > 0 || !empty($ref)) { include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php'; $arrayofmassactions = array( - 'clone'=>img_picto('', 'rightarrow', 'class="pictofixedwidth"').$langs->trans("Clone"), + //'clone'=>img_picto('', 'rightarrow', 'class="pictofixedwidth"').$langs->trans("Clone"), ); if ($permissiontodelete) { $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete"); From 6b6cfb13395bb6e5d706691c02f17e425b3073f7 Mon Sep 17 00:00:00 2001 From: Milen Karaganski Date: Wed, 7 Dec 2022 16:57:22 +0200 Subject: [PATCH 0095/1128] Add mass action to clone selected tasks to another project --- htdocs/core/actions_massactions.inc.php | 60 +++++++++++++++++++ htdocs/core/class/html.form.class.php | 2 +- htdocs/core/tpl/massactions_pre.tpl.php | 12 ++++ htdocs/langs/en_US/main.lang | 3 + htdocs/langs/en_US/projects.lang | 3 +- htdocs/projet/class/project.class.php | 80 +++++++++++++++++++++++++ htdocs/projet/tasks.php | 7 ++- 7 files changed, 162 insertions(+), 5 deletions(-) diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php index ec2ecabcf0d..40ecab72a60 100644 --- a/htdocs/core/actions_massactions.inc.php +++ b/htdocs/core/actions_massactions.inc.php @@ -1707,6 +1707,66 @@ if (!$error && ($massaction == 'increaseholiday' || ($action == 'increaseholiday } } +//if (!$error && $massaction == 'clonetasks' && $user->rights->projet->creer) { +if (!$error && ($massaction == 'clonetasks' || ($action == 'clonetasks' && $confirm == 'yes'))) { + $num = 0; + + dol_include_once('/projet/class/task.class.php'); + + $origin_task = new Task($db); + $clone_task = new Task($db); + + foreach (GETPOST('selected') as $task) { + $origin_task->fetch($task, $ref = '', $loadparentdata = 0); + + $defaultref = ''; + $obj = empty($conf->global->PROJECT_TASK_ADDON) ? 'mod_task_simple' : $conf->global->PROJECT_TASK_ADDON; + if (!empty($conf->global->PROJECT_TASK_ADDON) && is_readable(DOL_DOCUMENT_ROOT . "/core/modules/project/task/" . $conf->global->PROJECT_TASK_ADDON . ".php")) { + require_once DOL_DOCUMENT_ROOT . "/core/modules/project/task/" . $conf->global->PROJECT_TASK_ADDON . '.php'; + $modTask = new $obj; + $defaultref = $modTask->getNextValue(0, $clone_task); + } + + if (!$error) { + $clone_task->fk_project = GETPOST('projectid', 'int'); + $clone_task->ref = $defaultref; + $clone_task->label = $origin_task->label; + $clone_task->description = $origin_task->description; + $clone_task->planned_workload = $origin_task->planned_workload; + $clone_task->fk_task_parent = $origin_task->fk_task_parent; + $clone_task->date_c = dol_now(); + $clone_task->date_start = $origin_task->date_start; + $clone_task->date_end = $origin_task->date_end; + $clone_task->progress = $origin_task->progress; + + // Fill array 'array_options' with data from add form + $ret = $extrafields->setOptionalsFromPost(null, $clone_task); + + $taskid = $clone_task->create($user); + + if ($taskid > 0) { + $result = $clone_task->add_contact(GETPOST("userid", 'int'), 'TASKEXECUTIVE', 'internal'); + $num++; + } else { + if ($db->lasterrno() == 'DB_ERROR_RECORD_ALREADY_EXISTS') { + $langs->load("projects"); + setEventMessages($langs->trans('NewTaskRefSuggested'), '', 'warnings'); + $duplicate_code_error = true; + } else { + setEventMessages($clone_task->error, $clone_task->errors, 'errors'); + } + $action = 'list'; + $error++; + } + } + } + + if (!$error) { + setEventMessage($langs->trans('NumberOfTasksCloned', $num)); + header("Refresh: 1;URL=".DOL_URL_ROOT.'/projet/tasks.php?id=' . GETPOST('projectid', 'int')); + } +} + $parameters['toselect'] = (empty($toselect) ? array() : $toselect); $parameters['uploaddir'] = $uploaddir; $parameters['massaction'] = $massaction; diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 9e26170f214..6df62ded8bd 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -7286,7 +7286,7 @@ class Form $out .= $this->selectProjectsList($selected, $htmlname, $filtertype, $limit, $status, 0, $socid, $showempty, $forcecombo, $morecss); } - if (empty($nooutput)) print $out; + if (!empty($nooutput)) print $out; else return $out; } diff --git a/htdocs/core/tpl/massactions_pre.tpl.php b/htdocs/core/tpl/massactions_pre.tpl.php index 5124a1dce35..e0293210cf6 100644 --- a/htdocs/core/tpl/massactions_pre.tpl.php +++ b/htdocs/core/tpl/massactions_pre.tpl.php @@ -40,6 +40,18 @@ if ($massaction == 'predelete') { print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassDeletion"), $langs->trans("ConfirmMassDeletionQuestion", count($toselect)), "delete", null, '', 0, 200, 500, 1); } +if ($massaction == 'preclonetasks') { + $selected = ''; + foreach (GETPOST('toselect') as $tmpselected) { + $selected .= '&selected[]=' . $tmpselected; + } + + $formquestion = array( + array('type' => 'other', 'name' => 'projectid', 'label' => $langs->trans('Project') .': ', 'value' => $form->selectProjects('', 'projectid', '', '', '', '', '', '', '', 1, 1)), + ); + print $form->formconfirm($_SERVER['PHP_SELF'] . '?id=' . $object->id . $selected . '', $langs->trans('ConfirmMassClone'), '', 'clonetasks', $formquestion, '', 1, 300, 590); +} + if ($massaction == 'preaffecttag' && isModEnabled('category')) { require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; $categ = new Categorie($db); diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index 87b4f8f3036..47a11b949aa 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -897,6 +897,9 @@ MassFilesArea=Area for files built by mass actions ShowTempMassFilesArea=Show area of files built by mass actions ConfirmMassDeletion=Bulk Delete confirmation ConfirmMassDeletionQuestion=Are you sure you want to delete the %s selected record(s)? +ConfirmMassClone=Bulk clone confirmation +ConfirmMassCloneQuestion=Select project to clone to +ConfirmMassCloneToOneProject=Clone to project %s RelatedObjects=Related Objects ClassifyBilled=Classify billed ClassifyUnbilled=Classify unbilled diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang index 2407d4b2d86..43eecc60b7b 100644 --- a/htdocs/langs/en_US/projects.lang +++ b/htdocs/langs/en_US/projects.lang @@ -258,6 +258,7 @@ RecordsClosed=%s project(s) closed SendProjectRef=Information project %s ModuleSalaryToDefineHourlyRateMustBeEnabled=Module 'Salaries' must be enabled to define employee hourly rate to have time spent valorized NewTaskRefSuggested=Task ref already used, a new task ref is required +NumberOfTasksCloned=%s task(s) cloned TimeSpentInvoiced=Time spent billed TimeSpentForIntervention=Time spent TimeSpentForInvoice=Time spent @@ -297,4 +298,4 @@ EnablePublicLeadForm=Enable the public form for contact NewLeadbyWeb=Your message or request has been recorded. We will answer or contact your soon. NewLeadForm=New contact form LeadFromPublicForm=Online lead from public form -ExportAccountingReportButtonLabel=Get report \ No newline at end of file +ExportAccountingReportButtonLabel=Get report diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index 9c8b4ebee26..90057832c23 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -747,6 +747,86 @@ class Project extends CommonObject } } + /** + * Load list of objects in memory from the database. + * + * @param string $sortorder Sort Order + * @param string $sortfield Sort field + * @param int $limit limit + * @param int $offset Offset + * @param array $filter Filter array. Example array('field'=>'valueforlike', 'customurl'=>...) + * @param string $filtermode Filter mode (AND or OR) + * @return array|int int <0 if KO, array of pages if OK + */ + public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, array $filter = array(), $filtermode = 'AND') + { + global $conf; + + dol_syslog(__METHOD__, LOG_DEBUG); + + $records = array(); + + $sql = 'SELECT '; + $sql .= $this->getFieldList('t'); + $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; + if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) { + $sql .= ' WHERE t.entity IN ('.getEntity($this->table_element).')'; + } else { + $sql .= ' WHERE 1 = 1'; + } + // Manage filter + $sqlwhere = array(); + if (count($filter) > 0) { + foreach ($filter as $key => $value) { + if ($key == 't.rowid') { + $sqlwhere[] = $key.'='.$value; + } elseif (in_array($this->fields[$key]['type'], array('date', 'datetime', 'timestamp'))) { + $sqlwhere[] = $key.' = \''.$this->db->idate($value).'\''; + } elseif ($key == 'customsql') { + $sqlwhere[] = $value; + } elseif (strpos($value, '%') === false) { + $sqlwhere[] = $key.' IN ('.$this->db->sanitize($this->db->escape($value)).')'; + } else { + $sqlwhere[] = $key.' LIKE \'%'.$this->db->escape($value).'%\''; + } + } + } + if (count($sqlwhere) > 0) { + $sql .= ' AND ('.implode(' '.$filtermode.' ', $sqlwhere).')'; + } + + if (!empty($sortfield)) { + $sql .= $this->db->order($sortfield, $sortorder); + } + if (!empty($limit)) { + $sql .= ' '.$this->db->plimit($limit, $offset); + } + + $resql = $this->db->query($sql); + if ($resql) { + $num = $this->db->num_rows($resql); + $i = 0; + while ($i < ($limit ? min($limit, $num) : $num)) { + $obj = $this->db->fetch_object($resql); + + $record = new self($this->db); + $record->setVarsFromFetchObj($obj); + + $records[$record->id] = $record; + + $i++; + } + $this->db->free($resql); + + return $records; + } else { + $this->errors[] = 'Error '.$this->db->lasterror(); + dol_syslog(__METHOD__.' '.join(',', $this->errors), LOG_ERR); + + return -1; + } + } + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps /** * Return list of elements for type, linked to a project diff --git a/htdocs/projet/tasks.php b/htdocs/projet/tasks.php index c891179617d..1fdf9939447 100644 --- a/htdocs/projet/tasks.php +++ b/htdocs/projet/tasks.php @@ -553,9 +553,10 @@ if ($id > 0 || !empty($ref)) { // Add $param from extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php'; - $arrayofmassactions = array( - //'clone'=>img_picto('', 'rightarrow', 'class="pictofixedwidth"').$langs->trans("Clone"), - ); + $arrayofmassactions = array(); + if ($user->rights->projet->creer) { + $arrayofmassactions['preclonetasks'] = img_picto('', 'rightarrow', 'class="pictofixedwidth"').$langs->trans("Clone"); + } if ($permissiontodelete) { $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete"); } From f0f66327b938927b0d255f4ed28a1f79fa83adc5 Mon Sep 17 00:00:00 2001 From: Milen Karaganski Date: Wed, 7 Dec 2022 17:47:01 +0200 Subject: [PATCH 0096/1128] Fix syntax error --- htdocs/projet/class/project.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index 90057832c23..7f0da4a6c98 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -792,7 +792,7 @@ class Project extends CommonObject } } if (count($sqlwhere) > 0) { - $sql .= ' AND ('.implode(' '.$filtermode.' ', $sqlwhere).')'; + $sql .= ' AND ('.implode("'.$filtermode.'", $sqlwhere).')'; } if (!empty($sortfield)) { From 5770d01c75af41c097e7fed679e844a44074b45b Mon Sep 17 00:00:00 2001 From: Milen Karaganski Date: Wed, 7 Dec 2022 17:57:43 +0200 Subject: [PATCH 0097/1128] Fix syntax error --- htdocs/projet/class/project.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index 7f0da4a6c98..7ab69e070a3 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -792,7 +792,7 @@ class Project extends CommonObject } } if (count($sqlwhere) > 0) { - $sql .= ' AND ('.implode("'.$filtermode.'", $sqlwhere).')'; + $sql .= ' AND ('.implode('"'.$filtermode.'"', $sqlwhere).')'; } if (!empty($sortfield)) { From 26e274beb9fddb67843ae1bf6f9793770e17e562 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Wed, 7 Dec 2022 16:59:19 +0100 Subject: [PATCH 0098/1128] NEW view mode for List of Orders --- htdocs/commande/list.php | 1208 ++++++++++++----------- htdocs/core/class/commonorder.class.php | 34 + htdocs/theme/eldy/info-box.inc.php | 16 + 3 files changed, 668 insertions(+), 590 deletions(-) diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index 0ac8d109575..abb52e87b62 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -60,6 +60,7 @@ $show_files = GETPOST('show_files', 'int'); $confirm = GETPOST('confirm', 'alpha'); $toselect = GETPOST('toselect', 'array'); $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'orderlist'; +$mode = GETPOST('mode', 'alpha'); // Search Parameters $search_datecloture_start = GETPOST('search_datecloture_start', 'int'); @@ -578,6 +579,9 @@ if (empty($reshook)) { // Make a redirect to avoid to bill twice if we make a refresh or back $param = ''; + if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); + } if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -1111,7 +1115,9 @@ if ($resql) { llxHeader('', $title, $help_url); $param = ''; - + if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); + } if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -1285,7 +1291,10 @@ if ($resql) { if (!empty($socid)) { $url .= '&socid='.$socid; } - $newcardbutton = dolGetButtonTitle($langs->trans('NewOrder'), '', 'fa fa-plus-circle', $url, '', $contextpage == 'orderlist' && $permissiontoadd); + $newcardbutton = ''; + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); + $newcardbutton .= dolGetButtonTitle($langs->trans('NewOrder'), '', 'fa fa-plus-circle', $url, '', $contextpage == 'orderlist' && $permissiontoadd); // Lines of title fields print '
'; @@ -1300,6 +1309,8 @@ if ($resql) { print ''; print ''; print ''; + print ''; + print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'order', 0, $newcardbutton, '', $limit, 0, 0, 1); @@ -1949,6 +1960,9 @@ if ($resql) { $generic_commande->note_public = $obj->note_public; $generic_commande->note_private = $obj->note_private; + $generic_commande->thirdparty = $companystatic; + + $projectstatic->id = $obj->project_id; $projectstatic->ref = $obj->project_ref; $projectstatic->title = $obj->project_label; @@ -1961,655 +1975,669 @@ if ($resql) { $total_margin += $marginInfo['total_margin']; } - print '
'; - - // Action column - if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { - print ''; } - print ''; - } + } else { + print ''; - // Ref - if (!empty($arrayfields['c.ref']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Ref customer - if (!empty($arrayfields['c.ref_client']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Project ref - if (!empty($arrayfields['p.ref']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Project label - if (!empty($arrayfields['p.title']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Third party - if (!empty($arrayfields['s.nom']['checked'])) { - print ''; + } + + // Ref + if (!empty($arrayfields['c.ref']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; } } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Alias name - if (!empty($arrayfields['s.name_alias']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Parent company - if (!empty($arrayfields['s2.nom']['checked'])) { - print ''; + if (!$i) { + $totalarray['nbfield']++; } } - print ""; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Town - if (!empty($arrayfields['s.town']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Zip - if (!empty($arrayfields['s.zip']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // State - if (!empty($arrayfields['state.nom']['checked'])) { - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Country - if (!empty($arrayfields['country.code_iso']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Type ent - if (!empty($arrayfields['typent.code']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Order date - if (!empty($arrayfields['c.date_commande']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Plannned date of delivery - if (!empty($arrayfields['c.date_delivery']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Shipping Method - if (!empty($arrayfields['c.fk_shipping_method']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Payment terms - if (!empty($arrayfields['c.fk_cond_reglement']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Payment mode - if (!empty($arrayfields['c.fk_mode_reglement']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Channel - if (!empty($arrayfields['c.fk_input_reason']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Amount HT/net - if (!empty($arrayfields['c.total_ht']['checked'])) { - print '\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'c.total_ht'; - } - if (isset($totalarray['val']['c.total_ht'])) { - $totalarray['val']['c.total_ht'] += $obj->total_ht; - } else { - $totalarray['val']['c.total_ht'] = $obj->total_ht; - } - } - - // Amount VAT - if (!empty($arrayfields['c.total_vat']['checked'])) { - print '\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'c.total_tva'; - } - if (isset($totalarray['val']['c.total_tva'])) { - $totalarray['val']['c.total_tva'] += $obj->total_tva; - } else { - $totalarray['val']['c.total_tva'] = $obj->total_tva; - } - } - - // Amount TTC / gross - if (!empty($arrayfields['c.total_ttc']['checked'])) { - print '\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'c.total_ttc'; - } - if (isset($totalarray['val']['c.total_ttc'])) { - $totalarray['val']['c.total_ttc'] += $obj->total_ttc; - } else { - $totalarray['val']['c.total_ttc'] = $obj->total_ttc; - } - } - - // Currency - if (!empty($arrayfields['c.multicurrency_code']['checked'])) { - print '\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Currency rate - if (!empty($arrayfields['c.multicurrency_tx']['checked'])) { - print '\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Amount HT/net in foreign currency - if (!empty($arrayfields['c.multicurrency_total_ht']['checked'])) { - print '\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Amount VAT in foreign currency - if (!empty($arrayfields['c.multicurrency_total_vat']['checked'])) { - print '\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Amount TTC / gross in foreign currency - if (!empty($arrayfields['c.multicurrency_total_ttc']['checked'])) { - print '\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - $userstatic->id = $obj->fk_user_author; - $userstatic->login = $obj->login; - $userstatic->lastname = $obj->lastname; - $userstatic->firstname = $obj->firstname; - $userstatic->email = $obj->user_email; - $userstatic->statut = $obj->user_statut; - $userstatic->entity = $obj->entity; - $userstatic->photo = $obj->photo; - $userstatic->office_phone = $obj->office_phone; - $userstatic->office_fax = $obj->office_fax; - $userstatic->user_mobile = $obj->user_mobile; - $userstatic->job = $obj->job; - $userstatic->gender = $obj->gender; - - // Author - if (!empty($arrayfields['u.login']['checked'])) { - print '\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Sales representatives - if (!empty($arrayfields['sale_representative']['checked'])) { - print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Project label + if (!empty($arrayfields['p.title']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Third party + if (!empty($arrayfields['s.nom']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Total buying or cost price - if (!empty($arrayfields['total_pa']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; + // Alias name + if (!empty($arrayfields['s.name_alias']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } - } - // Total margin - if (!empty($arrayfields['total_margin']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; + // Parent company + if (!empty($arrayfields['s2.nom']['checked'])) { + print '"; + if (!$i) { + $totalarray['nbfield']++; + } } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'total_margin'; - } - $totalarray['val']['total_margin'] += $marginInfo['total_margin']; - } - // Total margin rate - if (!empty($arrayfields['total_margin_rate']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; + // Town + if (!empty($arrayfields['s.town']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } - } - // Total mark rate - if (!empty($arrayfields['total_mark_rate']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; + // Zip + if (!empty($arrayfields['s.zip']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'total_mark_rate'; + + // State + if (!empty($arrayfields['state.nom']['checked'])) { + print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } } - if ($i >= $imaxinloop - 1) { - if (!empty($total_ht)) { - $totalarray['val']['total_mark_rate'] = price2num($total_margin * 100 / $total_ht, 'MT'); + + // Country + if (!empty($arrayfields['country.code_iso']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Type ent + if (!empty($arrayfields['typent.code']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Order date + if (!empty($arrayfields['c.date_commande']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Plannned date of delivery + if (!empty($arrayfields['c.date_delivery']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Shipping Method + if (!empty($arrayfields['c.fk_shipping_method']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Payment terms + if (!empty($arrayfields['c.fk_cond_reglement']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Payment mode + if (!empty($arrayfields['c.fk_mode_reglement']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Channel + if (!empty($arrayfields['c.fk_input_reason']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Amount HT/net + if (!empty($arrayfields['c.total_ht']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'c.total_ht'; + } + if (isset($totalarray['val']['c.total_ht'])) { + $totalarray['val']['c.total_ht'] += $obj->total_ht; } else { - $totalarray['val']['total_mark_rate'] = ''; + $totalarray['val']['c.total_ht'] = $obj->total_ht; } } - } - // Extra fields - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - - // Date creation - if (!empty($arrayfields['c.datec']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; + // Amount VAT + if (!empty($arrayfields['c.total_vat']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'c.total_tva'; + } + if (isset($totalarray['val']['c.total_tva'])) { + $totalarray['val']['c.total_tva'] += $obj->total_tva; + } else { + $totalarray['val']['c.total_tva'] = $obj->total_tva; + } } - } - // Date modification - if (!empty($arrayfields['c.tms']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; + // Amount TTC / gross + if (!empty($arrayfields['c.total_ttc']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'c.total_ttc'; + } + if (isset($totalarray['val']['c.total_ttc'])) { + $totalarray['val']['c.total_ttc'] += $obj->total_ttc; + } else { + $totalarray['val']['c.total_ttc'] = $obj->total_ttc; + } } - } - // Date cloture - if (!empty($arrayfields['c.date_cloture']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; + // Currency + if (!empty($arrayfields['c.multicurrency_code']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } } - } - // Note public - if (!empty($arrayfields['c.note_public']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; + // Currency rate + if (!empty($arrayfields['c.multicurrency_tx']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } } - } - // Note private - if (!empty($arrayfields['c.note_private']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; + // Amount HT/net in foreign currency + if (!empty($arrayfields['c.multicurrency_total_ht']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount VAT in foreign currency + if (!empty($arrayfields['c.multicurrency_total_vat']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount TTC / gross in foreign currency + if (!empty($arrayfields['c.multicurrency_total_ttc']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } } - } - // Show shippable Icon (this creates subloops, so may be slow) - if (!empty($arrayfields['shippable']['checked'])) { - print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Sales representatives + if (!empty($arrayfields['sale_representative']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } - // Get local and virtual stock and store it into cache - if (empty($productstat_cache[$generic_commande->lines[$lig]->fk_product])) { - $generic_product->load_stock('nobatch,warehouseopen'); // ->load_virtual_stock() is already included into load_stock() - $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stock_reel'] = $generic_product->stock_reel; - $productstat_cachevirtual[$generic_commande->lines[$lig]->fk_product]['stock_reel'] = $generic_product->stock_theorique; + // Total buying or cost price + if (!empty($arrayfields['total_pa']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Total margin + if (!empty($arrayfields['total_margin']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'total_margin'; + } + $totalarray['val']['total_margin'] += $marginInfo['total_margin']; + } + + // Total margin rate + if (!empty($arrayfields['total_margin_rate']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Total mark rate + if (!empty($arrayfields['total_mark_rate']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'total_mark_rate'; + } + if ($i >= $imaxinloop - 1) { + if (!empty($total_ht)) { + $totalarray['val']['total_mark_rate'] = price2num($total_margin * 100 / $total_ht, 'MT'); + } else { + $totalarray['val']['total_mark_rate'] = ''; + } + } + } + + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + + // Date creation + if (!empty($arrayfields['c.datec']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Date modification + if (!empty($arrayfields['c.tms']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Date cloture + if (!empty($arrayfields['c.date_cloture']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Note public + if (!empty($arrayfields['c.note_public']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Note private + if (!empty($arrayfields['c.note_private']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Show shippable Icon (this creates subloops, so may be slow) + if (!empty($arrayfields['shippable']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; } } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Billed - if (!empty($arrayfields['c.facture']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Import key - if (!empty($arrayfields['c.import_key']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Status - if (!empty($arrayfields['c.fk_statut']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Action column - if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { - print ''; + if (!$i) { + $totalarray['nbfield']++; } - print ''; } - print ''; - if (!$i) { - $totalarray['nbfield']++; + + // Import key + if (!empty($arrayfields['c.import_key']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } + + // Status + if (!empty($arrayfields['c.fk_statut']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Action column + if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + print "\n"; + + $total += $obj->total_ht; + $subtotal += $obj->total_ht; } - - print "\n"; - - $total += $obj->total_ht; - $subtotal += $obj->total_ht; $i++; } diff --git a/htdocs/core/class/commonorder.class.php b/htdocs/core/class/commonorder.class.php index 870d4c1d8df..f899fbf9424 100644 --- a/htdocs/core/class/commonorder.class.php +++ b/htdocs/core/class/commonorder.class.php @@ -31,6 +31,40 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/commonincoterm.class.php'; abstract class CommonOrder extends CommonObject { use CommonIncoterm; + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $langs, $conf; + + $return = '
'; + $return .= '
'; + $return .= '
'; + $return .= img_picto('', 'order'); + + $return .= '
'; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).''; + + if (property_exists($this, 'thirdparty') && is_object($this->thirdparty)) { + $return .= '
'.$this->thirdparty->getNomUrl(1).''; + } + if (property_exists($this, 'total_ht')) { + $return .= '
'.price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency).' '.$langs->trans('HT').''; + } + if (method_exists($this, 'getLibStatut')) { + $return .= '
'.$this->getLibStatut(5).'
'; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } /** diff --git a/htdocs/theme/eldy/info-box.inc.php b/htdocs/theme/eldy/info-box.inc.php index 29f1a229054..fba67554a59 100644 --- a/htdocs/theme/eldy/info-box.inc.php +++ b/htdocs/theme/eldy/info-box.inc.php @@ -101,6 +101,22 @@ if (!defined('ISLOADEDBYSTEELSHEET')) { font-size: 25px; line-height: 92px; } +.info-box-order { + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; + display: block; + overflow: hidden; + float: left; + height: 115px; + width: 88px; + text-align: center; + font-size: 2.3em; + line-height: 115px; + margin-right: 10px; + background: var(--colorbacktitle1) !important; +} .opened-dash-board-wrap .info-box .info-box-icon { font-size: 2em; } From 52ec95d7bff99e25342d2d26a484a2b3fccad402 Mon Sep 17 00:00:00 2001 From: Milen Karaganski Date: Wed, 7 Dec 2022 18:08:10 +0200 Subject: [PATCH 0099/1128] Removed unnecessary fetchAll() method from project class --- htdocs/projet/class/project.class.php | 80 --------------------------- 1 file changed, 80 deletions(-) diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index 7ab69e070a3..9c8b4ebee26 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -747,86 +747,6 @@ class Project extends CommonObject } } - /** - * Load list of objects in memory from the database. - * - * @param string $sortorder Sort Order - * @param string $sortfield Sort field - * @param int $limit limit - * @param int $offset Offset - * @param array $filter Filter array. Example array('field'=>'valueforlike', 'customurl'=>...) - * @param string $filtermode Filter mode (AND or OR) - * @return array|int int <0 if KO, array of pages if OK - */ - public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, array $filter = array(), $filtermode = 'AND') - { - global $conf; - - dol_syslog(__METHOD__, LOG_DEBUG); - - $records = array(); - - $sql = 'SELECT '; - $sql .= $this->getFieldList('t'); - $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; - if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) { - $sql .= ' WHERE t.entity IN ('.getEntity($this->table_element).')'; - } else { - $sql .= ' WHERE 1 = 1'; - } - // Manage filter - $sqlwhere = array(); - if (count($filter) > 0) { - foreach ($filter as $key => $value) { - if ($key == 't.rowid') { - $sqlwhere[] = $key.'='.$value; - } elseif (in_array($this->fields[$key]['type'], array('date', 'datetime', 'timestamp'))) { - $sqlwhere[] = $key.' = \''.$this->db->idate($value).'\''; - } elseif ($key == 'customsql') { - $sqlwhere[] = $value; - } elseif (strpos($value, '%') === false) { - $sqlwhere[] = $key.' IN ('.$this->db->sanitize($this->db->escape($value)).')'; - } else { - $sqlwhere[] = $key.' LIKE \'%'.$this->db->escape($value).'%\''; - } - } - } - if (count($sqlwhere) > 0) { - $sql .= ' AND ('.implode('"'.$filtermode.'"', $sqlwhere).')'; - } - - if (!empty($sortfield)) { - $sql .= $this->db->order($sortfield, $sortorder); - } - if (!empty($limit)) { - $sql .= ' '.$this->db->plimit($limit, $offset); - } - - $resql = $this->db->query($sql); - if ($resql) { - $num = $this->db->num_rows($resql); - $i = 0; - while ($i < ($limit ? min($limit, $num) : $num)) { - $obj = $this->db->fetch_object($resql); - - $record = new self($this->db); - $record->setVarsFromFetchObj($obj); - - $records[$record->id] = $record; - - $i++; - } - $this->db->free($resql); - - return $records; - } else { - $this->errors[] = 'Error '.$this->db->lasterror(); - dol_syslog(__METHOD__.' '.join(',', $this->errors), LOG_ERR); - - return -1; - } - } - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps /** * Return list of elements for type, linked to a project From eecd0f2f8254b4e0d2ee42454927abb081ab0891 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Thu, 8 Dec 2022 16:33:31 +0100 Subject: [PATCH 0100/1128] fix --- htdocs/core/lib/project.lib.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index beac7180297..3c7e7303581 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -1074,8 +1074,7 @@ function projectLinesa(&$inc, $parent, &$lines, &$level, $var, $showproject, &$t * @param int $level Level (start to 0, then increased/decrease by recursive call) * @param string $projectsrole Array of roles user has on project * @param string $tasksrole Array of roles user has on task - * @param string $mine Show only task lines I am assigned to -<<<<<<<<< Temporary merge branch 1 + * @param string $mine Show only task lines I am assigned to <<<<<<<<< Temporary merge branch 1 * @param int $restricteditformytask 0=No restriction, 1=Enable add time only if task is a task i am affected to * @param int $preselectedday Preselected day * @param array $isavailable Array with data that say if user is available for several days for morning and afternoon From 93ee9a7496d7e6a355d73d9c3623624c475c9a07 Mon Sep 17 00:00:00 2001 From: atm-lena Date: Fri, 9 Dec 2022 12:56:35 +0100 Subject: [PATCH 0101/1128] Delete links when MO is deleted --- htdocs/mrp/class/mo.class.php | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/htdocs/mrp/class/mo.class.php b/htdocs/mrp/class/mo.class.php index d186c6e533b..9aa1ef5bd8e 100644 --- a/htdocs/mrp/class/mo.class.php +++ b/htdocs/mrp/class/mo.class.php @@ -744,8 +744,31 @@ class Mo extends CommonObject */ public function delete(User $user, $notrigger = false) { - return $this->deleteCommon($user, $notrigger); - //return $this->deleteCommon($user, $notrigger, 1); + $this->db->begin(); + + $error = 0; + + // Delete linked object + $res = $this->deleteObjectLinked(); + if ($res < 0) { + $error++; + } + + if(!$error){ + $res = $this->deleteCommon($user, $notrigger); + if($res < 0){ + $error++; + } + } + + if(!$error){ + dol_syslog(get_class($this)."::delete ".$this->id." by ".$user->id, LOG_DEBUG); + $this->db->commit(); + return $res; + } else { + $this->db->rollback(); + return -1; + } } /** From 488a434c8b031230e87980af561aa45321056ca0 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Fri, 9 Dec 2022 11:58:27 +0000 Subject: [PATCH 0102/1128] Fixing style errors. --- htdocs/mrp/class/mo.class.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/mrp/class/mo.class.php b/htdocs/mrp/class/mo.class.php index 9aa1ef5bd8e..5eeb387fc88 100644 --- a/htdocs/mrp/class/mo.class.php +++ b/htdocs/mrp/class/mo.class.php @@ -754,14 +754,14 @@ class Mo extends CommonObject $error++; } - if(!$error){ + if (!$error) { $res = $this->deleteCommon($user, $notrigger); - if($res < 0){ + if ($res < 0) { $error++; } } - if(!$error){ + if (!$error) { dol_syslog(get_class($this)."::delete ".$this->id." by ".$user->id, LOG_DEBUG); $this->db->commit(); return $res; From 7c352c9cefe8e241c0dd862d9c148dff11519b33 Mon Sep 17 00:00:00 2001 From: atm-lena Date: Fri, 9 Dec 2022 17:00:11 +0100 Subject: [PATCH 0103/1128] BOM : calculate total cost of lines --- htdocs/bom/class/bom.class.php | 3 ++- htdocs/bom/tpl/objectline_view.tpl.php | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/htdocs/bom/class/bom.class.php b/htdocs/bom/class/bom.class.php index 0e57bebd922..4dfb47a3887 100644 --- a/htdocs/bom/class/bom.class.php +++ b/htdocs/bom/class/bom.class.php @@ -1073,7 +1073,8 @@ class BOM extends CommonObject if ($res>0) { $bom_child->calculateCosts(); $line->childBom[] = $bom_child; - $this->total_cost += $bom_child->total_cost * $line->qty; + $line->total_cost = price2num( $bom_child->total_cost * $line->qty, 'MT'); + $this->total_cost += $line->total_cost; } else { $this->error = $bom_child->error; return -2; diff --git a/htdocs/bom/tpl/objectline_view.tpl.php b/htdocs/bom/tpl/objectline_view.tpl.php index 61b394a3b0f..3897b875652 100644 --- a/htdocs/bom/tpl/objectline_view.tpl.php +++ b/htdocs/bom/tpl/objectline_view.tpl.php @@ -239,13 +239,13 @@ if ($resql) { // Cost if (!empty($sub_bom->id)) { $sub_bom->calculateCosts(); - print ''; + print ''; $total_cost+= $sub_bom->total_cost * $sub_bom_line->qty * $line->qty; } elseif ($sub_bom_product->cost_price > 0) { - print ''; + print ''; $total_cost+= $sub_bom_product->cost_price * $sub_bom_line->qty * $line->qty; } elseif ($sub_bom_product->pmp > 0) { // PMP if cost price isn't defined - print ''; + print ''; $total_cost.= $sub_bom_product->pmp * $sub_bom_line->qty * $line->qty; } else { // Minimum purchase price if cost price and PMP aren't defined $sql_supplier_price = 'SELECT MIN(price) AS min_price, quantity AS qty FROM '.MAIN_DB_PREFIX.'product_fournisseur_price'; @@ -255,7 +255,7 @@ if ($resql) { $obj = $object->db->fetch_object($resql_supplier_price); $line_cost = $obj->min_price/$obj->qty * $sub_bom_line->qty * $line->qty; - print ''; + print ''; $total_cost+= $line_cost; } } From 95f437b45c8103cb8a871e49939fd1cb81bbf238 Mon Sep 17 00:00:00 2001 From: atm-lena Date: Mon, 12 Dec 2022 10:05:44 +0100 Subject: [PATCH 0104/1128] deleteObjectLinked() in deleteCommon() function --- htdocs/core/class/commonobject.class.php | 6 ++++++ htdocs/mrp/class/mo.class.php | 27 ++---------------------- 2 files changed, 8 insertions(+), 25 deletions(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 3e10ea82eaa..de19d651ba2 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -9472,6 +9472,12 @@ abstract class CommonObject } } + // Delete linked object + $res = $this->deleteObjectLinked(); + if ($res < 0) { + $error++; + } + // Commit or rollback if ($error) { $this->db->rollback(); diff --git a/htdocs/mrp/class/mo.class.php b/htdocs/mrp/class/mo.class.php index 9aa1ef5bd8e..d186c6e533b 100644 --- a/htdocs/mrp/class/mo.class.php +++ b/htdocs/mrp/class/mo.class.php @@ -744,31 +744,8 @@ class Mo extends CommonObject */ public function delete(User $user, $notrigger = false) { - $this->db->begin(); - - $error = 0; - - // Delete linked object - $res = $this->deleteObjectLinked(); - if ($res < 0) { - $error++; - } - - if(!$error){ - $res = $this->deleteCommon($user, $notrigger); - if($res < 0){ - $error++; - } - } - - if(!$error){ - dol_syslog(get_class($this)."::delete ".$this->id." by ".$user->id, LOG_DEBUG); - $this->db->commit(); - return $res; - } else { - $this->db->rollback(); - return -1; - } + return $this->deleteCommon($user, $notrigger); + //return $this->deleteCommon($user, $notrigger, 1); } /** From d3f9f5c0cdc6444f4970d1700fc83f5e3ee6a0d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Mon, 12 Dec 2022 11:16:58 +0100 Subject: [PATCH 0105/1128] display lot with getNomUrl --- htdocs/reception/card.php | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/htdocs/reception/card.php b/htdocs/reception/card.php index 3e99bc1194c..8f28dc72bb8 100644 --- a/htdocs/reception/card.php +++ b/htdocs/reception/card.php @@ -1952,22 +1952,16 @@ if ($action == 'create') { if (isset($lines[$i]->batch)) { print ''; print ''; + print $detail . ''; } else { print ''; } From 2ad663c627e846d0a87e3ba85989f150ce06865f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Mon, 12 Dec 2022 11:20:00 +0100 Subject: [PATCH 0106/1128] fix path --- htdocs/reception/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/reception/card.php b/htdocs/reception/card.php index 8f28dc72bb8..4666f360354 100644 --- a/htdocs/reception/card.php +++ b/htdocs/reception/card.php @@ -1954,7 +1954,7 @@ if ($action == 'create') { print ''; + print ''; print ''; } else { print ''; + print ''; + print ''; print ''; } From 799b8b8e242ec3c74e4758df841b22fbc4efc00e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Mon, 12 Dec 2022 11:55:43 +0100 Subject: [PATCH 0109/1128] Update card.php --- htdocs/reception/card.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/htdocs/reception/card.php b/htdocs/reception/card.php index 7ed0f112470..e20cd531565 100644 --- a/htdocs/reception/card.php +++ b/htdocs/reception/card.php @@ -1959,6 +1959,16 @@ if ($action == 'create') { $reslot = $productlot->fetch(0, $lines[$i]->fk_product, $lines[$i]->batch); if ($reslot > 0) { $detail = $productlot->getNomUrl(1); + } else { + // lot is not created and info is only in reception lines + $batchinfo = $langs->trans("Batch").': '.$lines[$i]->batch; + if (empty($conf->global->PRODUCT_DISABLE_SELLBY)) { + $batchinfo .= ' - '.$langs->trans("SellByDate").': '.dol_print_date($lines[$i]->sellby, "day"); + } + if (empty($conf->global->PRODUCT_DISABLE_EATBY)) { + $batchinfo .= ' - '.$langs->trans("EatByDate").': '.dol_print_date($lines[$i]->eatby, "day"); + } + $detail = $form->textwithtooltip(img_picto('', 'object_barcode').' '.$langs->trans("DetailBatchNumber"), $batchinfo); } } print $detail . ''; From 88ab5d72030ee0f5d1b2b306456907d0175b055b Mon Sep 17 00:00:00 2001 From: VESSILLER Date: Tue, 13 Dec 2022 15:48:00 +0100 Subject: [PATCH 0110/1128] NEW Quadratus export with attachments in accountancy export --- htdocs/accountancy/bookkeeping/list.php | 96 ++++++---- .../class/accountancyexport.class.php | 177 +++++++++++++++++- htdocs/accountancy/tpl/export_journal.tpl.php | 8 +- htdocs/langs/en_US/accountancy.lang | 2 + htdocs/langs/fr_FR/accountancy.lang | 2 + 5 files changed, 233 insertions(+), 52 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php index f0e95c3efb7..2d48bc706ea 100644 --- a/htdocs/accountancy/bookkeeping/list.php +++ b/htdocs/accountancy/bookkeeping/list.php @@ -715,58 +715,62 @@ if ($action == 'export_fileconfirm' && $user->hasRight('accounting', 'mouvements } } - $mimetype = $accountancyexport->getMimeType($formatexportset); - - top_httphead($mimetype, 1); - - // Output data on screen - $accountancyexport->export($object->lines, $formatexportset); - $notifiedexportdate = GETPOST('notifiedexportdate', 'alpha'); $notifiedvalidationdate = GETPOST('notifiedvalidationdate', 'alpha'); + $withAttachment = !empty(trim(GETPOST('notifiedexportfull', 'alphanohtml'))) ? 1 : 0; - if (!empty($accountancyexport->errors)) { - dol_print_error('', '', $accountancyexport->errors); - } elseif (!empty($notifiedexportdate) || !empty($notifiedvalidationdate)) { - // Specify as export : update field date_export or date_validated - $error = 0; - $db->begin(); + // Output data on screen or download + $result = $accountancyexport->export($object->lines, $formatexportset, $withAttachment); - if (is_array($object->lines)) { - foreach ($object->lines as $movement) { - $now = dol_now(); + $error = 0; + if ($result < 0) { + $error++; + } else { + if (!empty($notifiedexportdate) || !empty($notifiedvalidationdate)) { + if (is_array($object->lines)) { + // Specify as export : update field date_export or date_validated + $db->begin(); - $sql = " UPDATE ".MAIN_DB_PREFIX."accounting_bookkeeping"; - $sql .= " SET"; - if (!empty($notifiedexportdate) && !empty($notifiedvalidationdate)) { - $sql .= " date_export = '".$db->idate($now)."'"; - $sql .= ", date_validated = '".$db->idate($now)."'"; - } elseif (!empty($notifiedexportdate)) { - $sql .= " date_export = '".$db->idate($now)."'"; - } elseif (!empty($notifiedvalidationdate)) { - $sql .= " date_validated = '".$db->idate($now)."'"; + foreach ($object->lines as $movement) { + $now = dol_now(); + + $sql = " UPDATE ".MAIN_DB_PREFIX."accounting_bookkeeping"; + $sql .= " SET"; + if (!empty($notifiedexportdate) && !empty($notifiedvalidationdate)) { + $sql .= " date_export = '".$db->idate($now)."'"; + $sql .= ", date_validated = '".$db->idate($now)."'"; + } elseif (!empty($notifiedexportdate)) { + $sql .= " date_export = '".$db->idate($now)."'"; + } elseif (!empty($notifiedvalidationdate)) { + $sql .= " date_validated = '".$db->idate($now)."'"; + } + $sql .= " WHERE rowid = ".((int) $movement->id); + + dol_syslog("/accountancy/bookkeeping/list.php Function export_file Specify movements as exported", LOG_DEBUG); + + $result = $db->query($sql); + if (!$result) { + $error++; + break; + } } - $sql .= " WHERE rowid = ".((int) $movement->id); - dol_syslog("/accountancy/bookkeeping/list.php Function export_file Specify movements as exported", LOG_DEBUG); - - $result = $db->query($sql); - if (!$result) { + if (!$error) { + $db->commit(); + } else { $error++; - break; + $accountancyexport->errors[] = $langs->trans('NotAllExportedMovementsCouldBeRecordedAsExportedOrValidated'); + $db->rollback(); } } } - - if (!$error) { - $db->commit(); - } else { - $error++; - $db->rollback(); - dol_print_error('', $langs->trans("NotAllExportedMovementsCouldBeRecordedAsExportedOrValidated")); - } } - exit; + + if ($error) { + setEventMessages('', $accountancyexport->errors, 'errors'); + header('Location: '.$_SERVER['PHP_SELF']); + } + exit(); // download or show errors } } @@ -854,7 +858,17 @@ if ($action == 'export_file') { $form_question['separator3'] = array('name'=>'separator3', 'type'=>'separator'); } - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?'.$param, $langs->trans("ExportFilteredList").' ('.$listofformat[$formatexportset].')', $langs->trans('ConfirmExportFile'), 'export_fileconfirm', $form_question, '', 1, 350, 600); + // add documents in an archive for accountancy export (Quadratus) + if(getDolGlobalString('ACCOUNTING_EXPORT_MODELCSV') == AccountancyExport::$EXPORT_TYPE_QUADRATUS) { + $form_question['notifiedexportfull'] = array( + 'name' => 'notifiedexportfull', + 'type' => 'checkbox', + 'label' => $langs->trans('NotifiedExportFull'), + 'value' => 'false', + ); + } + + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?'.$param, $langs->trans("ExportFilteredList").' ('.$listofformat[$formatexportset].')', $langs->trans('ConfirmExportFile'), 'export_fileconfirm', $form_question, '', 1, 400, 600); } //if ($action == 'delbookkeepingyear') { diff --git a/htdocs/accountancy/class/accountancyexport.class.php b/htdocs/accountancy/class/accountancyexport.class.php index 3c45315ffa9..76b6782c174 100644 --- a/htdocs/accountancy/class/accountancyexport.class.php +++ b/htdocs/accountancy/class/accountancyexport.class.php @@ -36,6 +36,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/functions.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; /** @@ -313,9 +314,10 @@ class AccountancyExport * * @param array $TData Array with data * @param int $formatexportset Id of export format - * @return void + * @param int $withAttachment [=0] Not add files or 1 to have attached in an archive (ex : Quadratus) + * @return int <0 if KO, >0 OK */ - public function export(&$TData, $formatexportset) + public function export(&$TData, $formatexportset, $withAttachment = 0) { global $conf, $langs; global $search_date_end; // Used into /accountancy/tpl/export_journal.tpl.php @@ -325,8 +327,44 @@ class AccountancyExport $type_export = 'general_ledger'; global $db; // The tpl file use $db + $completefilename = ''; + $exportFile = null; + $exportFileName = ''; + $exportFilePath = ''; + $archiveFileList = array(); + if ($withAttachment == 1) { + // PHP ZIP extension must be enabled + if (!extension_loaded('zip')) { + $langs->load('install'); + $this->errors[] = $langs->trans('ErrorPHPDoesNotSupport', 'ZIP');; + return -1; + } + } else { + $mimetype = $this->getMimeType($formatexportset); + top_httphead($mimetype, 1); + } include DOL_DOCUMENT_ROOT.'/accountancy/tpl/export_journal.tpl.php'; + if ($withAttachment == 1 && !empty($completefilename)) { + // create export file + $tmpDir = !empty($conf->accounting->multidir_temp[$conf->entity]) ? $conf->accounting->multidir_temp[$conf->entity] : $conf->accounting->dir_temp; + $exportFileFullName = $completefilename; + $exportFileBaseName = basename($exportFileFullName); + $exportFileName = pathinfo($exportFileBaseName, PATHINFO_FILENAME); + $exportFilePath = $tmpDir.'/'.$exportFileFullName; + $exportFile = fopen($exportFilePath, 'w'); + if (!$exportFile) { + $this->errors[] = $langs->trans('ErrorFileNotFound', $exportFilePath); + return -1; + } + $archiveFileList[0] = array( + 'path' => $exportFilePath, + 'name' => $exportFileFullName, + ); + // archive name and path + $archiveFullName = $exportFileName.'.zip'; + $archivePath = $tmpDir.'/'.$archiveFullName; + } switch ($formatexportset) { case self::$EXPORT_TYPE_CONFIGURABLE: @@ -345,7 +383,7 @@ class AccountancyExport $this->exportCiel($TData); break; case self::$EXPORT_TYPE_QUADRATUS: - $this->exportQuadratus($TData); + $archiveFileList = $this->exportQuadratus($TData, $exportFile, $archiveFileList, $withAttachment); break; case self::$EXPORT_TYPE_WINFIC: $this->exportWinfic($TData); @@ -399,6 +437,69 @@ class AccountancyExport } break; } + + // create and download export file or archive + if ($withAttachment == 1) { + $error = 0; + + // close export file + if ($exportFile) { + fclose($exportFile); + } + + if (!empty($archiveFullName) && !empty($archivePath) && !empty($archiveFileList)) { + // archive files + $downloadFileMimeType = 'application/zip'; + $downloadFileFullName = $archiveFullName; + $downloadFilePath = $archivePath; + + // create archive + $archive = new ZipArchive(); + $res = $archive->open($archivePath, ZipArchive::OVERWRITE | ZipArchive::CREATE); + if ($res !== true) { + $error++; + $this->errors[] = $langs->trans('ErrorFileNotFound', $archivePath); + } + if (!$error) { + // add files + foreach ($archiveFileList as $archiveFileArr) { + $res = $archive->addFile($archiveFileArr['path'], $archiveFileArr['name']); + if (!$res) { + $error++; + $this->errors[] = $langs->trans('ErrorArchiveAddFile', $archiveFileArr['name']); + break; + } + } + } + if (!$error) { + // close archive + $archive->close(); + } + } elseif (!empty($exportFileFullName) && !empty($exportFilePath)) { + // only one file to download + $downloadFileMimeType = 'text/csv'; + $downloadFileFullName = $exportFileFullName; + $downloadFilePath = $exportFilePath; + } + + if (!$error) { + // download export file + if (!empty($downloadFileMimeType) && !empty($downloadFileFullName) && !empty($downloadFilePath)) { + header('Content-Type: '.$downloadFileMimeType); + header('Content-Disposition: attachment; filename='.$downloadFileFullName); + header('Cache-Control: Public, must-revalidate'); + header('Pragma: public'); + header('Content-Length: '.dol_filesize($downloadFilePath)); + readfileLowMemory($downloadFilePath); + } + } + + if ($error) { + return -1; + } + } + + return 1; } @@ -584,10 +685,13 @@ class AccountancyExport * Help : https://docplayer.fr/20769649-Fichier-d-entree-ascii-dans-quadracompta.html * In QuadraCompta | Use menu : "Outils" > "Suivi des dossiers" > "Import ASCII(Compta)" * - * @param array $TData data - * @return void + * @param array $TData Data + * @param resource $exportFile [=null] File resource to export or print if null + * @param array $archiveFileList [=array()] Archive file list : array of ['path', 'name'] + * @param bool $withAttachment [=0] Not add files or 1 to have attached in an archive + * @return array Archive file list : array of ['path', 'name'] */ - public function exportQuadratus(&$TData) + public function exportQuadratus(&$TData, $exportFile = null, $archiveFileList = array(), $withAttachment = 0) { global $conf, $db; @@ -637,7 +741,11 @@ class AccountancyExport $Tab['end_line'] = $end_line; - print implode($Tab); + if ($exportFile) { + fwrite($exportFile, implode($Tab)); + } else { + print implode($Tab); + } } $Tab = array(); @@ -708,12 +816,63 @@ class AccountancyExport // We need to keep the 10 lastest number of invoice doc_ref not the beginning part that is the unusefull almost same part // $Tab['num_piece3'] = str_pad(self::trunc($data->piece_num, 10), 10); $Tab['num_piece3'] = substr(self::trunc($data->doc_ref, 20), -10); - $Tab['filler4'] = str_repeat(' ', 73); + $Tab['reserved'] = str_repeat(' ', 10); // position 159 + $Tab['currency_amount'] = str_repeat(' ', 13); // position 169 + // get document file + $attachmentFileName = ''; + if ($withAttachment == 1) { + $attachmentFileKey = trim($data->piece_num); + if (!isset($archiveFileList[$attachmentFileKey])) { + $objectDirPath = ''; + $objectFileName = dol_sanitizeFileName($data->doc_ref); + if ($data->doc_type == 'customer_invoice') { + $objectDirPath = !empty($conf->facture->multidir_output[$conf->entity]) ? $conf->facture->multidir_output[$conf->entity] : $conf->facture->dir_output; + } elseif ($data->doc_type == 'expense_report') { + $objectDirPath = !empty($conf->expensereport->multidir_output[$conf->entity]) ? $conf->expensereport->multidir_output[$conf->entity] : $conf->factureexpensereport->dir_output; + } elseif ($data->doc_type == 'supplier_invoice') { + $objectDirPath = !empty($conf->fournisseur->facture->multidir_output[$conf->entity]) ? $conf->fournisseur->facture->multidir_output[$conf->entity] : $conf->fournisseur->facture->dir_output; + } + $arrayofinclusion = array(); + $arrayofinclusion[] = '^'.preg_quote($objectFileName, '/').'\.pdf$'; + $fileFoundList = dol_dir_list($objectDirPath.'/'.$objectFileName, 'files', 0, implode('|', $arrayofinclusion), '(\.meta|_preview.*\.png)$', 'date', SORT_DESC, 0, true); + if (!empty($fileFoundList)) { + $attachmentFileNameTrunc = str_pad(self::trunc($data->piece_num, 8), 8, '0', STR_PAD_LEFT); + foreach ($fileFoundList as $fileFound) { + if (strstr($fileFound['name'], $objectFileName)) { + $fileFoundPath = $objectDirPath.'/'.$objectFileName.'/'.$fileFound['name']; + if (file_exists($fileFoundPath)) { + $archiveFileList[$attachmentFileKey] = array( + 'path' => $fileFoundPath, + 'name' => $attachmentFileNameTrunc.'.pdf', + ); + break; + } + } + } + } + } + + if (isset($archiveFileList[$attachmentFileKey])) { + $attachmentFileName = $archiveFileList[$attachmentFileKey]['name']; + } + } + if (dol_strlen($attachmentFileName) == 12) { + $Tab['attachment'] = $attachmentFileName; // position 182 + } else { + $Tab['attachment'] = str_repeat(' ', 12); // position 182 + } + $Tab['filler4'] = str_repeat(' ', 38); $Tab['end_line'] = $end_line; - print implode($Tab); + if ($exportFile) { + fwrite($exportFile, implode($Tab)); + } else { + print implode($Tab); + } } + + return $archiveFileList; } /** diff --git a/htdocs/accountancy/tpl/export_journal.tpl.php b/htdocs/accountancy/tpl/export_journal.tpl.php index 22537a60a39..833b81fc8c0 100644 --- a/htdocs/accountancy/tpl/export_journal.tpl.php +++ b/htdocs/accountancy/tpl/export_journal.tpl.php @@ -33,7 +33,9 @@ $siren = getDolGlobalString('MAIN_INFO_SIREN'); $date_export = "_".dol_print_date(dol_now(), '%Y%m%d%H%M%S'); $endaccountingperiod = dol_print_date(dol_now(), '%Y%m%d'); -header('Content-Type: text/csv'); +if (!isset($withAttachments) || $withAttachments == 1) { + header('Content-Type: text/csv'); +} include_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountancyexport.class.php'; $accountancyexport = new AccountancyExport($db); @@ -66,4 +68,6 @@ if (($accountancyexport->getFormatCode($formatexportset) == 'fec' || $accountanc $completefilename = ($code ? $code."_" : "").($prefix ? $prefix."_" : "").$filename.($nodateexport ? "" : $date_export).".".$format; } -header('Content-Disposition: attachment;filename='.$completefilename); +if (!isset($withAttachments) || $withAttachments == 1) { + header('Content-Disposition: attachment;filename=' . $completefilename); +} diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang index e988764d8ba..5ea3c692aee 100644 --- a/htdocs/langs/en_US/accountancy.lang +++ b/htdocs/langs/en_US/accountancy.lang @@ -342,6 +342,7 @@ ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Flag exported lines as Exported (to modify a line, you will need to delete the whole transaction and re-transfert it into accounting) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=Date validation and lock ConfirmExportFile=Confirmation of the generation of the accounting export file ? ExportDraftJournal=Export draft journal @@ -442,6 +443,7 @@ AccountancyErrorMismatchLetterCode=Mismatch in reconcile code AccountancyErrorMismatchBalanceAmount=The balance (%s) is not equal to 0 AccountancyErrorLetteringBookkeeping=Errors have occurred concerning the transactions: %s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Accounting entries diff --git a/htdocs/langs/fr_FR/accountancy.lang b/htdocs/langs/fr_FR/accountancy.lang index 53edef4c0a1..0d2b7bb69a2 100644 --- a/htdocs/langs/fr_FR/accountancy.lang +++ b/htdocs/langs/fr_FR/accountancy.lang @@ -337,6 +337,7 @@ ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Désactiver la liaison et le transf ## Export NotifiedExportDate=Marquer les lignes exportées comme Exportées (pour modifier une ligne, vous devrez supprimer toute la transaction et la retransférer en comptabilité) NotifiedValidationDate=Validez et verrouillez les entrées exportées (même effet que la fonctionnalité "%s", la modification et la suppression des lignes ne seront définitivement plus possibles) +NotifiedExportFull=Exporter les pièces ? DateValidationAndLock=Validation et verrouillage de la date ConfirmExportFile=Confirmation de la génération du fichier d'export comptable ? ExportDraftJournal=Exporter le journal brouillon @@ -437,6 +438,7 @@ AccountancyErrorMismatchLetterCode=Non-concordance dans le code de réconciliati AccountancyErrorMismatchBalanceAmount=Le solde (%s) n'est pas égal à 0 AccountancyErrorLetteringBookkeeping=Des erreurs sont survenues concernant les transactions : %s ErrorAccountNumberAlreadyExists=Le code comptable %s existe déjà +ErrorArchiveAddFile=Impossible d'ajouter le fichier "%s" dans l'archive ## Import ImportAccountingEntries=Écritures comptables From 6dedeb368d1f18d610dcd21ac4de81d30eb8bbfd Mon Sep 17 00:00:00 2001 From: VESSILLER Date: Tue, 13 Dec 2022 15:51:23 +0100 Subject: [PATCH 0111/1128] NEW Quadratus export with attachments in accountancy export --- htdocs/accountancy/tpl/export_journal.tpl.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/accountancy/tpl/export_journal.tpl.php b/htdocs/accountancy/tpl/export_journal.tpl.php index 833b81fc8c0..4dc4dedbe0e 100644 --- a/htdocs/accountancy/tpl/export_journal.tpl.php +++ b/htdocs/accountancy/tpl/export_journal.tpl.php @@ -33,7 +33,7 @@ $siren = getDolGlobalString('MAIN_INFO_SIREN'); $date_export = "_".dol_print_date(dol_now(), '%Y%m%d%H%M%S'); $endaccountingperiod = dol_print_date(dol_now(), '%Y%m%d'); -if (!isset($withAttachments) || $withAttachments == 1) { +if (empty($withAttachment)) { header('Content-Type: text/csv'); } @@ -68,6 +68,6 @@ if (($accountancyexport->getFormatCode($formatexportset) == 'fec' || $accountanc $completefilename = ($code ? $code."_" : "").($prefix ? $prefix."_" : "").$filename.($nodateexport ? "" : $date_export).".".$format; } -if (!isset($withAttachments) || $withAttachments == 1) { +if (empty($withAttachment)) { header('Content-Disposition: attachment;filename=' . $completefilename); } From 787618d9d6927a25faa0ae6bdf8f9fa67dedb67f Mon Sep 17 00:00:00 2001 From: VESSILLER Date: Tue, 13 Dec 2022 16:36:49 +0100 Subject: [PATCH 0112/1128] NEW Copyrights --- htdocs/accountancy/bookkeeping/list.php | 3 ++- htdocs/accountancy/class/accountancyexport.class.php | 3 ++- htdocs/accountancy/tpl/export_journal.tpl.php | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php index 2d48bc706ea..2f255dec734 100644 --- a/htdocs/accountancy/bookkeeping/list.php +++ b/htdocs/accountancy/bookkeeping/list.php @@ -1,9 +1,10 @@ * Copyright (C) 2013-2016 Florian Henry - * Copyright (C) 2013-2022 Alexandre Spangaro + * Copyright (C) 2013-2022 Open-DSI * Copyright (C) 2016-2017 Laurent Destailleur * Copyright (C) 2018-2021 Frédéric France + * Copyright (C) 2022 Progiseize * * 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 diff --git a/htdocs/accountancy/class/accountancyexport.class.php b/htdocs/accountancy/class/accountancyexport.class.php index 76b6782c174..e101c09abd3 100644 --- a/htdocs/accountancy/class/accountancyexport.class.php +++ b/htdocs/accountancy/class/accountancyexport.class.php @@ -5,13 +5,14 @@ * Copyright (C) 2015 Florian Henry * Copyright (C) 2015 Raphaël Doursenaud * Copyright (C) 2016 Pierre-Henry Favre - * Copyright (C) 2016-2021 Alexandre Spangaro + * Copyright (C) 2016-2022 Open-DSI * Copyright (C) 2013-2017 Olivier Geffroy * Copyright (C) 2017 Elarifr. Ari Elbaz * Copyright (C) 2017-2019 Frédéric France * Copyright (C) 2017 André Schild * Copyright (C) 2020 Guillaume Alexandre * Copyright (C) 2022 Joachim Kueter + * Copyright (C) 2022 Progiseize * * 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 diff --git a/htdocs/accountancy/tpl/export_journal.tpl.php b/htdocs/accountancy/tpl/export_journal.tpl.php index 4dc4dedbe0e..f57d54fcfbd 100644 --- a/htdocs/accountancy/tpl/export_journal.tpl.php +++ b/htdocs/accountancy/tpl/export_journal.tpl.php @@ -1,6 +1,7 @@ +/* Copyright (C) 2015-2022 Open-DSI * Copyright (C) 2016 Charlie Benke + * Copyright (C) 2022 Progiseize * * 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 From fb16a97d6d4e743c8f8a44884399a81badba2a88 Mon Sep 17 00:00:00 2001 From: VESSILLER Date: Tue, 13 Dec 2022 18:13:24 +0100 Subject: [PATCH 0113/1128] FIX stickler-ci --- htdocs/accountancy/bookkeeping/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php index 2f255dec734..781b20edc2e 100644 --- a/htdocs/accountancy/bookkeeping/list.php +++ b/htdocs/accountancy/bookkeeping/list.php @@ -860,7 +860,7 @@ if ($action == 'export_file') { } // add documents in an archive for accountancy export (Quadratus) - if(getDolGlobalString('ACCOUNTING_EXPORT_MODELCSV') == AccountancyExport::$EXPORT_TYPE_QUADRATUS) { + if (getDolGlobalString('ACCOUNTING_EXPORT_MODELCSV') == AccountancyExport::$EXPORT_TYPE_QUADRATUS) { $form_question['notifiedexportfull'] = array( 'name' => 'notifiedexportfull', 'type' => 'checkbox', From b597a43b21a7488bd271f05d99da65539a3f0d96 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Wed, 14 Dec 2022 08:37:30 +0000 Subject: [PATCH 0114/1128] Fixing style errors. --- htdocs/bom/class/bom.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/bom/class/bom.class.php b/htdocs/bom/class/bom.class.php index 4dfb47a3887..7f9a1aa09c6 100644 --- a/htdocs/bom/class/bom.class.php +++ b/htdocs/bom/class/bom.class.php @@ -1073,7 +1073,7 @@ class BOM extends CommonObject if ($res>0) { $bom_child->calculateCosts(); $line->childBom[] = $bom_child; - $line->total_cost = price2num( $bom_child->total_cost * $line->qty, 'MT'); + $line->total_cost = price2num($bom_child->total_cost * $line->qty, 'MT'); $this->total_cost += $line->total_cost; } else { $this->error = $bom_child->error; From b906619ce1826babbaca1c8fd89914fb6349bb67 Mon Sep 17 00:00:00 2001 From: Gauthier PC portable 024 Date: Wed, 14 Dec 2022 10:31:11 +0100 Subject: [PATCH 0115/1128] FIX : methods declaration (backport fix 67b9a7dc07d708231d12b5e58800334d4a01ef98) --- htdocs/projet/class/taskstats.class.php | 31 +++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/htdocs/projet/class/taskstats.class.php b/htdocs/projet/class/taskstats.class.php index a5b088f01e8..16bd0afd480 100644 --- a/htdocs/projet/class/taskstats.class.php +++ b/htdocs/projet/class/taskstats.class.php @@ -193,4 +193,35 @@ class TaskStats extends Stats // var_dump($res);print '
'; return $res; } + + /** + * Return the Task amount by month for a year + * + * @param int $year Year to scan + * @param int $format 0=Label of abscissa is a translated text, 1=Label of abscissa is month number, 2=Label of abscissa is first letter of month + * @return array Array with amount by month + */ + public function getAmountByMonth($year, $format = 0) + { + // Return an empty array at the moment because task has no amount + return array(); + } + + /** + * Return average of entity by month + * @param int $year year number + * @return int value + */ + protected function getAverageByMonth($year) + { + $sql = "SELECT date_format(datef,'%m') as dm, AVG(f.".$this->field.")"; + $sql .= " FROM ".$this->from; + $sql .= " WHERE f.datef BETWEEN '".$this->db->idate(dol_get_first_day($year))."' AND '".$this->db->idate(dol_get_last_day($year))."'"; + $sql .= " AND ".$this->where; + $sql .= " GROUP BY dm"; + $sql .= $this->db->order('dm', 'DESC'); + + return $this->_getAverageByMonth($year, $sql); + } + } From d679a321551fc33cc610ef66770326088e157eb9 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Wed, 14 Dec 2022 09:36:25 +0000 Subject: [PATCH 0116/1128] Fixing style errors. --- htdocs/projet/class/taskstats.class.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/projet/class/taskstats.class.php b/htdocs/projet/class/taskstats.class.php index 16bd0afd480..39efd957bb5 100644 --- a/htdocs/projet/class/taskstats.class.php +++ b/htdocs/projet/class/taskstats.class.php @@ -223,5 +223,4 @@ class TaskStats extends Stats return $this->_getAverageByMonth($year, $sql); } - } From ed8900594190903165a2ef87fe9e810cd87961f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Prud=27homme?= Date: Wed, 14 Dec 2022 11:45:40 +0100 Subject: [PATCH 0117/1128] Fix #23019 Impossible to add task times to an existing draft invoice --- htdocs/projet/tasks/time.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index debfb427111..6ff81ff3fbf 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -1240,7 +1240,7 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser print $langs->trans('InvoiceToUse'); print ''; print '
'; print ''; /*print ''; From 4c43d81872e9e5d70d6f84e67c0d09e44fcdb402 Mon Sep 17 00:00:00 2001 From: hystepik Date: Wed, 14 Dec 2022 15:39:02 +0100 Subject: [PATCH 0118/1128] Fix #23064 : diplays total at end of inter list --- htdocs/fichinter/list.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/htdocs/fichinter/list.php b/htdocs/fichinter/list.php index 4ab4f0a90e3..9f887c36900 100644 --- a/htdocs/fichinter/list.php +++ b/htdocs/fichinter/list.php @@ -496,7 +496,7 @@ $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfi $selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : ''); print '
'; -print '
 '; $searchpicto = $form->showFilterButtons(); @@ -1055,6 +1086,7 @@ if ($action == 'create' && $user->rights->projet->creer && (empty($object->third $parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder); $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; + print '
'; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->rowid, $arrayofselected)) { - $selected = 1; - } - print ''; + if ($mode == 'kanban') { + if ($i == 0) { + print '
'; + print '
'; } - if (!$i) { - $totalarray['nbfield']++; + + print $generic_commande->getKanbanView(''); + + if ($i == ($imaxinloop - 1)) { + print '
'; + print '
'; - print $generic_commande->getNomUrl(1, ($search_status != 2 ? 0 : $obj->fk_statut), 0, 0, 0, 1, 1); - - $filename = dol_sanitizeFileName($obj->ref); - $filedir = $conf->commande->multidir_output[$conf->entity].'/'.dol_sanitizeFileName($obj->ref); - $urlsource = $_SERVER['PHP_SELF'].'?id='.$obj->rowid; - print $formfile->getDocumentsLink($generic_commande->element, $filename, $filedir); - - print ''.$obj->ref_client.''; - if ($obj->project_id > 0) { - print $projectstatic->getNomUrl(1); - } - print ''; - if ($obj->project_id > 0) { - print $projectstatic->title; - } - print ''; - print $getNomUrl_cache[$obj->socid]; - - // If module invoices enabled and user with invoice creation permissions - if (isModEnabled('facture') && !empty($conf->global->ORDER_BILLING_ALL_CUSTOMER)) { - if ($user->rights->facture->creer) { - if (($obj->fk_statut > 0 && $obj->fk_statut < 3) || ($obj->fk_statut == 3 && $obj->billed == 0)) { - print ' '; - print img_picto($langs->trans("CreateInvoiceForThisCustomer").' : '.$companystatic->name, 'object_bill', 'hideonsmartphone').''; + // Action column + if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->rowid, $arrayofselected)) { + $selected = 1; } + print ''; + } + if (!$i) { + $totalarray['nbfield']++; + } + print ''; + print $generic_commande->getNomUrl(1, ($search_status != 2 ? 0 : $obj->fk_statut), 0, 0, 0, 1, 1); + + $filename = dol_sanitizeFileName($obj->ref); + $filedir = $conf->commande->multidir_output[$conf->entity].'/'.dol_sanitizeFileName($obj->ref); + $urlsource = $_SERVER['PHP_SELF'].'?id='.$obj->rowid; + print $formfile->getDocumentsLink($generic_commande->element, $filename, $filedir); + + print ''; - print $obj->alias; - print ''; - if ($obj->fk_parent > 0) { - if (!isset($company_url_list[$obj->fk_parent])) { - $companyparent = new Societe($db); - $res = $companyparent->fetch($obj->fk_parent); - if ($res > 0) { - $company_url_list[$obj->fk_parent] = $companyparent->getNomUrl(1); - } - } - if (isset($company_url_list[$obj->fk_parent])) { - print $company_url_list[$obj->fk_parent]; + // Ref customer + if (!empty($arrayfields['c.ref_client']['checked'])) { + print ''.$obj->ref_client.''; - print $obj->town; - print ''; - print $obj->zip; - print '".$obj->state_name."'; - $tmparray = getCountry($obj->fk_pays, 'all'); - print $tmparray['label']; - print ''; - if (empty($typenArray)) { - $typenArray = $formcompany->typent_array(1); - } - print $typenArray[$obj->typent_code]; - print ''; - print dol_print_date($db->jdate($obj->date_commande), 'day'); - // Warning late icon and note - if ($generic_commande->hasDelay()) { - print img_picto($langs->trans("Late").' : '.$generic_commande->showDelay(), "warning"); - } - print ''; - print dol_print_date($db->jdate($obj->date_delivery), 'dayhour'); - print ''; - $form->formSelectShippingMethod('', $obj->fk_shipping_method, 'none', 1); - print ''; - $form->form_conditions_reglement($_SERVER['PHP_SELF'], $obj->fk_cond_reglement, 'none', 0, '', 1, $obj->deposit_percent); - print ''; - $form->form_modes_reglement($_SERVER['PHP_SELF'], $obj->fk_mode_reglement, 'none', '', -1); - print ''; - $form->formInputReason($_SERVER['PHP_SELF'], $obj->fk_input_reason, 'none', ''); - print ''.price($obj->total_ht)."'.price($obj->total_tva)."'.price($obj->total_ttc)."'.$obj->multicurrency_code.' - '.$langs->trans('Currency'.$obj->multicurrency_code)."'; - $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$obj->rowid, $obj->multicurrency_tx, 'none', $obj->multicurrency_code); - print "'.price($obj->multicurrency_total_ht)."'.price($obj->multicurrency_total_vat)."'.price($obj->multicurrency_total_ttc)."'; - if ($userstatic->id) { - print $userstatic->getNomUrl(-1); - } else { - print ' '; - } - print "'; - if ($obj->socid > 0) { - $listsalesrepresentatives = $companystatic->getSalesRepresentatives($user); - if ($listsalesrepresentatives < 0) { - dol_print_error($db); + // Project ref + if (!empty($arrayfields['p.ref']['checked'])) { + print ''; + if ($obj->project_id > 0) { + print $projectstatic->getNomUrl(1); } - $nbofsalesrepresentative = count($listsalesrepresentatives); - if ($nbofsalesrepresentative > 6) { - // We print only number - print $nbofsalesrepresentative; - } elseif ($nbofsalesrepresentative > 0) { - $j = 0; - foreach ($listsalesrepresentatives as $val) { - $userstatic->id = $val['id']; - $userstatic->lastname = $val['lastname']; - $userstatic->firstname = $val['firstname']; - $userstatic->email = $val['email']; - $userstatic->statut = $val['statut']; - $userstatic->entity = $val['entity']; - $userstatic->photo = $val['photo']; - $userstatic->login = $val['login']; - $userstatic->office_phone = $val['office_phone']; - $userstatic->office_fax = $val['office_fax']; - $userstatic->user_mobile = $val['user_mobile']; - $userstatic->job = $val['job']; - $userstatic->gender = $val['gender']; - //print '
': - print ($nbofsalesrepresentative < 2) ? $userstatic->getNomUrl(-1, '', 0, 0, 12) : $userstatic->getNomUrl(-2); - $j++; - if ($j < $nbofsalesrepresentative) { - print ' '; + print '
'; + if ($obj->project_id > 0) { + print $projectstatic->title; + } + print ''; + print $getNomUrl_cache[$obj->socid]; + + // If module invoices enabled and user with invoice creation permissions + if (isModEnabled('facture') && !empty($conf->global->ORDER_BILLING_ALL_CUSTOMER)) { + if ($user->rights->facture->creer) { + if (($obj->fk_statut > 0 && $obj->fk_statut < 3) || ($obj->fk_statut == 3 && $obj->billed == 0)) { + print ' '; + print img_picto($langs->trans("CreateInvoiceForThisCustomer").' : '.$companystatic->name, 'object_bill', 'hideonsmartphone').''; } - //print ''; } } - //else print $langs->trans("NoSalesRepresentativeAffected"); - } else { - print ' '; + print ''.price($marginInfo['pa_total']).''; + print $obj->alias; + print ''.price($marginInfo['total_margin']).''; + if ($obj->fk_parent > 0) { + if (!isset($company_url_list[$obj->fk_parent])) { + $companyparent = new Societe($db); + $res = $companyparent->fetch($obj->fk_parent); + if ($res > 0) { + $company_url_list[$obj->fk_parent] = $companyparent->getNomUrl(1); + } + } + if (isset($company_url_list[$obj->fk_parent])) { + print $company_url_list[$obj->fk_parent]; + } + } + print "'.(($marginInfo['total_margin_rate'] == '') ? '' : price($marginInfo['total_margin_rate'], null, null, null, null, 2).'%').''; + print $obj->town; + print ''.(($marginInfo['total_mark_rate'] == '') ? '' : price($marginInfo['total_mark_rate'], null, null, null, null, 2).'%').''; + print $obj->zip; + print '".$obj->state_name."'; + $tmparray = getCountry($obj->fk_pays, 'all'); + print $tmparray['label']; + print ''; + if (empty($typenArray)) { + $typenArray = $formcompany->typent_array(1); + } + print $typenArray[$obj->typent_code]; + print ''; + print dol_print_date($db->jdate($obj->date_commande), 'day'); + // Warning late icon and note + if ($generic_commande->hasDelay()) { + print img_picto($langs->trans("Late").' : '.$generic_commande->showDelay(), "warning"); + } + print ''; + print dol_print_date($db->jdate($obj->date_delivery), 'dayhour'); + print ''; + $form->formSelectShippingMethod('', $obj->fk_shipping_method, 'none', 1); + print ''; + $form->form_conditions_reglement($_SERVER['PHP_SELF'], $obj->fk_cond_reglement, 'none', 0, '', 1, $obj->deposit_percent); + print ''; + $form->form_modes_reglement($_SERVER['PHP_SELF'], $obj->fk_mode_reglement, 'none', '', -1); + print ''; + $form->formInputReason($_SERVER['PHP_SELF'], $obj->fk_input_reason, 'none', ''); + print ''.price($obj->total_ht)."'; - print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); - print ''.price($obj->total_tva)."'; - print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); - print ''.price($obj->total_ttc)."'; - print dol_print_date($db->jdate($obj->date_cloture), 'dayhour', 'tzuser'); - print ''.$obj->multicurrency_code.' - '.$langs->trans('Currency'.$obj->multicurrency_code)."'; - print dol_string_nohtmltag($obj->note_public); - print ''; + $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$obj->rowid, $obj->multicurrency_tx, 'none', $obj->multicurrency_code); + print "'; - print dol_string_nohtmltag($obj->note_private); - print ''.price($obj->multicurrency_total_ht)."'.price($obj->multicurrency_total_vat)."'.price($obj->multicurrency_total_ttc)."'; - if (!empty($show_shippable_command) && isModEnabled('stock')) { - if (($obj->fk_statut > $generic_commande::STATUS_DRAFT) && ($obj->fk_statut < $generic_commande::STATUS_CLOSED)) { - $generic_commande->getLinesArray(); // Load array ->lines - $generic_commande->loadExpeditions(); // Load array ->expeditions + $userstatic->id = $obj->fk_user_author; + $userstatic->login = $obj->login; + $userstatic->lastname = $obj->lastname; + $userstatic->firstname = $obj->firstname; + $userstatic->email = $obj->user_email; + $userstatic->statut = $obj->user_statut; + $userstatic->entity = $obj->entity; + $userstatic->photo = $obj->photo; + $userstatic->office_phone = $obj->office_phone; + $userstatic->office_fax = $obj->office_fax; + $userstatic->user_mobile = $obj->user_mobile; + $userstatic->job = $obj->job; + $userstatic->gender = $obj->gender; - $numlines = count($generic_commande->lines); // Loop on each line of order - for ($lig = 0; $lig < $numlines; $lig++) { - if (isset($generic_commande->expeditions[$generic_commande->lines[$lig]->id])) { - $reliquat = $generic_commande->lines[$lig]->qty - $generic_commande->expeditions[$generic_commande->lines[$lig]->id]; - } else { - $reliquat = $generic_commande->lines[$lig]->qty; + // Author + if (!empty($arrayfields['u.login']['checked'])) { + print ''; + if ($userstatic->id) { + print $userstatic->getNomUrl(-1); + } else { + print ' '; + } + print "'; + if ($obj->socid > 0) { + $listsalesrepresentatives = $companystatic->getSalesRepresentatives($user); + if ($listsalesrepresentatives < 0) { + dol_print_error($db); + } + $nbofsalesrepresentative = count($listsalesrepresentatives); + if ($nbofsalesrepresentative > 6) { + // We print only number + print $nbofsalesrepresentative; + } elseif ($nbofsalesrepresentative > 0) { + $j = 0; + foreach ($listsalesrepresentatives as $val) { + $userstatic->id = $val['id']; + $userstatic->lastname = $val['lastname']; + $userstatic->firstname = $val['firstname']; + $userstatic->email = $val['email']; + $userstatic->statut = $val['statut']; + $userstatic->entity = $val['entity']; + $userstatic->photo = $val['photo']; + $userstatic->login = $val['login']; + $userstatic->office_phone = $val['office_phone']; + $userstatic->office_fax = $val['office_fax']; + $userstatic->user_mobile = $val['user_mobile']; + $userstatic->job = $val['job']; + $userstatic->gender = $val['gender']; + //print '
': + print ($nbofsalesrepresentative < 2) ? $userstatic->getNomUrl(-1, '', 0, 0, 12) : $userstatic->getNomUrl(-2); + $j++; + if ($j < $nbofsalesrepresentative) { + print ' '; + } + //print '
'; } - if ($generic_commande->lines[$lig]->product_type == 0 && $generic_commande->lines[$lig]->fk_product > 0) { // If line is a product and not a service - $nbprod++; // order contains real products - $generic_product->id = $generic_commande->lines[$lig]->fk_product; + } + //else print $langs->trans("NoSalesRepresentativeAffected"); + } else { + print ' '; + } + print '
'.price($marginInfo['pa_total']).''.price($marginInfo['total_margin']).''.(($marginInfo['total_margin_rate'] == '') ? '' : price($marginInfo['total_margin_rate'], null, null, null, null, 2).'%').''.(($marginInfo['total_mark_rate'] == '') ? '' : price($marginInfo['total_mark_rate'], null, null, null, null, 2).'%').''; + print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); + print ''; + print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); + print ''; + print dol_print_date($db->jdate($obj->date_cloture), 'dayhour', 'tzuser'); + print ''; + print dol_string_nohtmltag($obj->note_public); + print ''; + print dol_string_nohtmltag($obj->note_private); + print ''; + if (!empty($show_shippable_command) && isModEnabled('stock')) { + if (($obj->fk_statut > $generic_commande::STATUS_DRAFT) && ($obj->fk_statut < $generic_commande::STATUS_CLOSED)) { + $generic_commande->getLinesArray(); // Load array ->lines + $generic_commande->loadExpeditions(); // Load array ->expeditions + + $numlines = count($generic_commande->lines); // Loop on each line of order + for ($lig = 0; $lig < $numlines; $lig++) { + if (isset($generic_commande->expeditions[$generic_commande->lines[$lig]->id])) { + $reliquat = $generic_commande->lines[$lig]->qty - $generic_commande->expeditions[$generic_commande->lines[$lig]->id]; } else { - $generic_product->stock_reel = $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stock_reel']; - $generic_product->stock_theorique = $productstat_cachevirtual[$generic_commande->lines[$lig]->fk_product]['stock_reel'] = $generic_product->stock_theorique; + $reliquat = $generic_commande->lines[$lig]->qty; } + if ($generic_commande->lines[$lig]->product_type == 0 && $generic_commande->lines[$lig]->fk_product > 0) { // If line is a product and not a service + $nbprod++; // order contains real products + $generic_product->id = $generic_commande->lines[$lig]->fk_product; - if ($reliquat > $generic_product->stock_reel) { - $notshippable++; - } - if (empty($conf->global->SHIPPABLE_ORDER_ICON_IN_LIST)) { // Default code. Default should be this case. - $text_info .= $reliquat.' x '.$generic_commande->lines[$lig]->product_ref.' '.dol_trunc($generic_commande->lines[$lig]->product_label, 20); - $text_info .= ' - '.$langs->trans("Stock").': '.$generic_product->stock_reel.''; - $text_info .= ' - '.$langs->trans("VirtualStock").': '.$generic_product->stock_theorique.''; - $text_info .= ($reliquat != $generic_commande->lines[$lig]->qty ? ' ('.$langs->trans("QtyInOtherShipments").' '.($generic_commande->lines[$lig]->qty - $reliquat).')' : ''); - $text_info .= '
'; - } else { // BUGGED CODE. - // DOES NOT TAKE INTO ACCOUNT MANUFACTURING. THIS CODE SHOULD BE USELESS. PREVIOUS CODE SEEMS COMPLETE. - // COUNT STOCK WHEN WE SHOULD ALREADY HAVE VALUE - // Detailed virtual stock, looks bugged, uncomplete and need heavy load. - // stock order and stock order_supplier - $stock_order = 0; - $stock_order_supplier = 0; - if (!empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT) || !empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT_CLOSE)) { // What about other options ? - if (isModEnabled('commande')) { - if (empty($productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_customer'])) { - $generic_product->load_stats_commande(0, '1,2'); - $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_customer'] = $generic_product->stats_commande['qty']; - } else { - $generic_product->stats_commande['qty'] = $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_customer']; + // Get local and virtual stock and store it into cache + if (empty($productstat_cache[$generic_commande->lines[$lig]->fk_product])) { + $generic_product->load_stock('nobatch,warehouseopen'); // ->load_virtual_stock() is already included into load_stock() + $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stock_reel'] = $generic_product->stock_reel; + $productstat_cachevirtual[$generic_commande->lines[$lig]->fk_product]['stock_reel'] = $generic_product->stock_theorique; + } else { + $generic_product->stock_reel = $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stock_reel']; + $generic_product->stock_theorique = $productstat_cachevirtual[$generic_commande->lines[$lig]->fk_product]['stock_reel'] = $generic_product->stock_theorique; + } + + if ($reliquat > $generic_product->stock_reel) { + $notshippable++; + } + if (empty($conf->global->SHIPPABLE_ORDER_ICON_IN_LIST)) { // Default code. Default should be this case. + $text_info .= $reliquat.' x '.$generic_commande->lines[$lig]->product_ref.' '.dol_trunc($generic_commande->lines[$lig]->product_label, 20); + $text_info .= ' - '.$langs->trans("Stock").': '.$generic_product->stock_reel.''; + $text_info .= ' - '.$langs->trans("VirtualStock").': '.$generic_product->stock_theorique.''; + $text_info .= ($reliquat != $generic_commande->lines[$lig]->qty ? ' ('.$langs->trans("QtyInOtherShipments").' '.($generic_commande->lines[$lig]->qty - $reliquat).')' : ''); + $text_info .= '
'; + } else { // BUGGED CODE. + // DOES NOT TAKE INTO ACCOUNT MANUFACTURING. THIS CODE SHOULD BE USELESS. PREVIOUS CODE SEEMS COMPLETE. + // COUNT STOCK WHEN WE SHOULD ALREADY HAVE VALUE + // Detailed virtual stock, looks bugged, uncomplete and need heavy load. + // stock order and stock order_supplier + $stock_order = 0; + $stock_order_supplier = 0; + if (!empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT) || !empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT_CLOSE)) { // What about other options ? + if (isModEnabled('commande')) { + if (empty($productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_customer'])) { + $generic_product->load_stats_commande(0, '1,2'); + $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_customer'] = $generic_product->stats_commande['qty']; + } else { + $generic_product->stats_commande['qty'] = $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_customer']; + } + $stock_order = $generic_product->stats_commande['qty']; } - $stock_order = $generic_product->stats_commande['qty']; + if ((isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled("supplier_order")) { + if (empty($productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_supplier'])) { + $generic_product->load_stats_commande_fournisseur(0, '3'); + $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_supplier'] = $generic_product->stats_commande_fournisseur['qty']; + } else { + $generic_product->stats_commande_fournisseur['qty'] = $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_supplier']; + } + $stock_order_supplier = $generic_product->stats_commande_fournisseur['qty']; + } + } + $text_info .= $reliquat.' x '.$generic_commande->lines[$lig]->ref.' '.dol_trunc($generic_commande->lines[$lig]->product_label, 20); + $text_stock_reel = $generic_product->stock_reel.'/'.$stock_order; + if ($stock_order > $generic_product->stock_reel && !($generic_product->stock_reel < $generic_commande->lines[$lig]->qty)) { + $warning++; + $text_warning .= ''.$langs->trans('Available').' : '.$text_stock_reel.''; + } + if ($reliquat > $generic_product->stock_reel) { + $text_info .= ''.$langs->trans('Available').' : '.$text_stock_reel.''; + } else { + $text_info .= ''.$langs->trans('Available').' : '.$text_stock_reel.''; } if ((isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled("supplier_order")) { - if (empty($productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_supplier'])) { - $generic_product->load_stats_commande_fournisseur(0, '3'); - $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_supplier'] = $generic_product->stats_commande_fournisseur['qty']; - } else { - $generic_product->stats_commande_fournisseur['qty'] = $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_supplier']; - } - $stock_order_supplier = $generic_product->stats_commande_fournisseur['qty']; + $text_info .= ' '.$langs->trans('SupplierOrder').' : '.$stock_order_supplier; } + $text_info .= ($reliquat != $generic_commande->lines[$lig]->qty ? ' ('.$langs->trans("QtyInOtherShipments").' '.($generic_commande->lines[$lig]->qty - $reliquat).')' : ''); + $text_info .= '
'; } - $text_info .= $reliquat.' x '.$generic_commande->lines[$lig]->ref.' '.dol_trunc($generic_commande->lines[$lig]->product_label, 20); - $text_stock_reel = $generic_product->stock_reel.'/'.$stock_order; - if ($stock_order > $generic_product->stock_reel && !($generic_product->stock_reel < $generic_commande->lines[$lig]->qty)) { - $warning++; - $text_warning .= ''.$langs->trans('Available').' : '.$text_stock_reel.''; - } - if ($reliquat > $generic_product->stock_reel) { - $text_info .= ''.$langs->trans('Available').' : '.$text_stock_reel.''; - } else { - $text_info .= ''.$langs->trans('Available').' : '.$text_stock_reel.''; - } - if ((isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled("supplier_order")) { - $text_info .= ' '.$langs->trans('SupplierOrder').' : '.$stock_order_supplier; - } - $text_info .= ($reliquat != $generic_commande->lines[$lig]->qty ? ' ('.$langs->trans("QtyInOtherShipments").' '.($generic_commande->lines[$lig]->qty - $reliquat).')' : ''); - $text_info .= '
'; } } + if ($notshippable == 0) { + $text_icon = img_picto('', 'dolly', '', false, 0, 0, '', 'green paddingleft'); + $text_info = $text_icon.' '.$langs->trans('Shippable').'
'.$text_info; + } else { + $text_icon = img_picto('', 'dolly', '', false, 0, 0, '', 'error paddingleft'); + $text_info = $text_icon.' '.$langs->trans('NonShippable').'
'.$text_info; + } } - if ($notshippable == 0) { - $text_icon = img_picto('', 'dolly', '', false, 0, 0, '', 'green paddingleft'); - $text_info = $text_icon.' '.$langs->trans('Shippable').'
'.$text_info; - } else { - $text_icon = img_picto('', 'dolly', '', false, 0, 0, '', 'error paddingleft'); - $text_info = $text_icon.' '.$langs->trans('NonShippable').'
'.$text_info; + + if ($nbprod) { + print $form->textwithtooltip('', $text_info, 2, 1, $text_icon, '', 2); + } + if ($warning) { // Always false in default mode + print $form->textwithtooltip('', $langs->trans('NotEnoughForAllOrders').'
'.$text_warning, 2, 1, img_picto('', 'error'), '', 2); } } - - if ($nbprod) { - print $form->textwithtooltip('', $text_info, 2, 1, $text_icon, '', 2); - } - if ($warning) { // Always false in default mode - print $form->textwithtooltip('', $langs->trans('NotEnoughForAllOrders').'
'.$text_warning, 2, 1, img_picto('', 'error'), '', 2); + print '
'.yn($obj->billed).''.$obj->import_key.''.$generic_commande->LibStatut($obj->fk_statut, $obj->billed, 5, 1).''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->rowid, $arrayofselected)) { - $selected = 1; + // Billed + if (!empty($arrayfields['c.facture']['checked'])) { + print ''.yn($obj->billed).''.$obj->import_key.''.$generic_commande->LibStatut($obj->fk_statut, $obj->billed, 5, 1).''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->rowid, $arrayofselected)) { + $selected = 1; + } + print ''; + } + print '
'.price($sub_bom->total_cost * $sub_bom_line->qty * $line->qty).''.price2num($sub_bom->total_cost * $sub_bom_line->qty * $line->qty, 'MT').''.price($sub_bom_product->cost_price * $sub_bom_line->qty * $line->qty).''.price2num($sub_bom_product->cost_price * $sub_bom_line->qty * $line->qty, 'MT').''.price($sub_bom_product->pmp * $sub_bom_line->qty * $line->qty).''.price2num($sub_bom_product->pmp * $sub_bom_line->qty * $line->qty, 'MT').''.price($line_cost).''.price2num($line_cost, 'MT').''; - $detail = ''; - if ($lines[$i]->product->status_batch) { - $detail .= $langs->trans("Batch").': '.$lines[$i]->batch; - if (empty($conf->global->PRODUCT_DISABLE_SELLBY)) { - $detail .= ' - '.$langs->trans("SellByDate").': '.dol_print_date($lines[$i]->sellby, "day"); + $detail = $langs->trans("NA"); + if ($lines[$i]->product->status_batch && $lines[$i]->fk_product > 0) { + require_once DOL_DOCUMENT_ROOT.'/product/stock/productlot.class.php'; + $productlot = new Productlot($db); + $reslot = $productlot->fetch(0, $lines[$i]->fk_product, $lines[$i]->batch); + if ($reslot > 0) { + $detail = $productlot->getNomUrl(1); } - if (empty($conf->global->PRODUCT_DISABLE_EATBY)) { - $detail .= ' - '.$langs->trans("EatByDate").': '.dol_print_date($lines[$i]->eatby, "day"); - } - $detail .= '
'; - - print $form->textwithtooltip(img_picto('', 'object_barcode').' '.$langs->trans("DetailBatchNumber"), $detail); - } else { - print $langs->trans("NA"); } - print '
'; $detail = $langs->trans("NA"); if ($lines[$i]->product->status_batch && $lines[$i]->fk_product > 0) { - require_once DOL_DOCUMENT_ROOT.'/product/stock/productlot.class.php'; + require_once DOL_DOCUMENT_ROOT.'/product/stock/class/productlot.class.php'; $productlot = new Productlot($db); $reslot = $productlot->fetch(0, $lines[$i]->fk_product, $lines[$i]->batch); if ($reslot > 0) { From 64a686aad4128967391f54dd1c3338da753e389e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Mon, 12 Dec 2022 11:21:28 +0100 Subject: [PATCH 0107/1128] Update card.php --- htdocs/reception/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/reception/card.php b/htdocs/reception/card.php index 4666f360354..7ed0f112470 100644 --- a/htdocs/reception/card.php +++ b/htdocs/reception/card.php @@ -1951,7 +1951,7 @@ if ($action == 'create') { if (isModEnabled('productbatch')) { if (isset($lines[$i]->batch)) { print ''; - print ''; + print ''; $detail = $langs->trans("NA"); if ($lines[$i]->product->status_batch && $lines[$i]->fk_product > 0) { require_once DOL_DOCUMENT_ROOT.'/product/stock/class/productlot.class.php'; From 92bff0fcfbbba88af2b422d4cefa6b4c3d38cd8f Mon Sep 17 00:00:00 2001 From: atm-lena Date: Mon, 12 Dec 2022 11:41:54 +0100 Subject: [PATCH 0108/1128] Missing Unit TD for sub-bom lines --- htdocs/bom/tpl/objectline_view.tpl.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/htdocs/bom/tpl/objectline_view.tpl.php b/htdocs/bom/tpl/objectline_view.tpl.php index 3897b875652..bb83e62c07f 100644 --- a/htdocs/bom/tpl/objectline_view.tpl.php +++ b/htdocs/bom/tpl/objectline_view.tpl.php @@ -218,11 +218,16 @@ if ($resql) { } // Qty + $label = $sub_bom_product->getLabelOfUnit('long'); if ($sub_bom_line->qty_frozen > 0) { print ''.price($sub_bom_line->qty, 0, '', 0, 0).''.($label !== '') ? $langs->trans($label) : '' . ''.$langs->trans('Yes').''.price($sub_bom_line->qty * $line->qty, 0, '', 0, 0).''; + print ''.($label !== '') ? $langs->trans($label) : '' . ' '; - $form->selectInvoice('invoice', '', 'invoiceid', 24, 0, $langs->trans('NewInvoice'), 1, 0, 0, 'maxwidth500', '', 'all'); + $form->selectInvoice($projectstatic->thirdparty->id, '', 'invoiceid', 24, 0, $langs->trans('NewInvoice'), 1, 0, 0, 'maxwidth500', '', 'all'); print '
'."\n"; +print '
'."\n"; // Fields title search // -------------------------------------------------------------------- @@ -844,6 +844,9 @@ while ($i < $imaxinloop) { if (!$i) { $totalarray['type'][$totalarray['nbfield']] = 'duration'; } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'fd.duree'; + } $totalarray['val']['fd.duree'] += $obj->duree; } // Action column From 1a16e41ce3f49d17c807fa159842ad645fd8af3d Mon Sep 17 00:00:00 2001 From: Gauthier PC portable 024 Date: Wed, 14 Dec 2022 16:04:35 +0100 Subject: [PATCH 0119/1128] FIX : Can't see all time spent by all user --- htdocs/projet/tasks/time.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index ef8ac6aa9df..3be8c731545 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -162,7 +162,7 @@ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x' $search_date_update = ''; $search_task_ref = ''; $search_task_label = ''; - $search_user = 0; + $search_user = -1; $search_valuebilled = ''; $toselect = ''; $search_array_options = array(); @@ -1277,7 +1277,7 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser if (empty($search_user)) { $search_user = $user->id; } - $sql .= " AND t.fk_user = ".((int) $search_user); + if($search_user > 0) $sql .= " AND t.fk_user = ".((int) $search_user); } if ($search_note) { From 70b6b3d82d5053816d3f9b6be918588a52727a30 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Wed, 14 Dec 2022 15:21:42 +0000 Subject: [PATCH 0120/1128] Fixing style errors. --- htdocs/projet/tasks/time.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index 3be8c731545..67024ee8fa5 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -1277,7 +1277,7 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser if (empty($search_user)) { $search_user = $user->id; } - if($search_user > 0) $sql .= " AND t.fk_user = ".((int) $search_user); + if ($search_user > 0) $sql .= " AND t.fk_user = ".((int) $search_user); } if ($search_note) { From 1ebd2135e0f15c34fa62674ec9b19a7fcf4e6412 Mon Sep 17 00:00:00 2001 From: atm-lena Date: Thu, 15 Dec 2022 15:00:27 +0100 Subject: [PATCH 0121/1128] Fix stickler error --- htdocs/bom/tpl/objectline_view.tpl.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/htdocs/bom/tpl/objectline_view.tpl.php b/htdocs/bom/tpl/objectline_view.tpl.php index bb83e62c07f..f9b39c517e9 100644 --- a/htdocs/bom/tpl/objectline_view.tpl.php +++ b/htdocs/bom/tpl/objectline_view.tpl.php @@ -221,12 +221,15 @@ if ($resql) { $label = $sub_bom_product->getLabelOfUnit('long'); if ($sub_bom_line->qty_frozen > 0) { print ''; - print ''; + print ''; print ''; } else { print ''; print ''; + if($label !== '') print $langs->trans($label); + print ''; print ''; print ''; } From eff01374b1163a8bf304f5c1a7a190bef44e5c43 Mon Sep 17 00:00:00 2001 From: atm-lena Date: Thu, 15 Dec 2022 15:09:50 +0100 Subject: [PATCH 0122/1128] Change place of deleteobjectlinked in deletecommon function --- htdocs/core/class/commonobject.class.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index de19d651ba2..d7d41a545ef 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -9455,6 +9455,12 @@ abstract class CommonObject } } + // Delete linked object + $res = $this->deleteObjectLinked(); + if ($res < 0) { + $error++; + } + if (!$error && !empty($this->isextrafieldmanaged)) { $result = $this->deleteExtraFields(); if ($result < 0) { @@ -9472,12 +9478,6 @@ abstract class CommonObject } } - // Delete linked object - $res = $this->deleteObjectLinked(); - if ($res < 0) { - $error++; - } - // Commit or rollback if ($error) { $this->db->rollback(); From 9b548e41259741921d327fb2f5dc548d856f914a Mon Sep 17 00:00:00 2001 From: Gauthier PC portable 024 Date: Thu, 15 Dec 2022 16:08:44 +0100 Subject: [PATCH 0123/1128] FIX : "read" right of hrm evaluations must allow to see only user evaluations and those of subordinates, readall is another right + several fixes --- htdocs/core/modules/modHRM.class.php | 8 ++++++++ htdocs/hrm/class/evaluation.class.php | 6 ++++-- htdocs/hrm/evaluation_card.php | 2 +- htdocs/hrm/evaluation_list.php | 8 +++++++- htdocs/langs/en_US/admin.lang | 13 +++++++------ htdocs/langs/fr_FR/admin.lang | 11 ++++++----- 6 files changed, 33 insertions(+), 15 deletions(-) diff --git a/htdocs/core/modules/modHRM.class.php b/htdocs/core/modules/modHRM.class.php index 7df3bcc6dcf..b35c8736fd8 100644 --- a/htdocs/core/modules/modHRM.class.php +++ b/htdocs/core/modules/modHRM.class.php @@ -265,6 +265,14 @@ class modHRM extends DolibarrModules $this->rights[$r][4] = 'write_personal_information'; $this->rights[$r][5] = 'write'; // In php code, permission will be checked by test if ($user->rights->hrm->write_personal_information->write) $r++; + + // Evaluation + $this->rights[$r][0] = 4033; // Permission id (must not be already used) + $this->rights[$r][1] = 'Read all evaluations'; // Permission label + $this->rights[$r][3] = 0; // Permission by default for new user (0/1) + $this->rights[$r][4] = 'evaluation'; + $this->rights[$r][5] = 'readall'; // In php code, permission will be checked by test if ($user->rights->hrm->evaluation->read) + $r++; } /** diff --git a/htdocs/hrm/class/evaluation.class.php b/htdocs/hrm/class/evaluation.class.php index 77403631725..5dfab9b9b10 100644 --- a/htdocs/hrm/class/evaluation.class.php +++ b/htdocs/hrm/class/evaluation.class.php @@ -118,7 +118,7 @@ class Evaluation extends CommonObject 'import_key' => array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>'1', 'position'=>1000, 'notnull'=>-1, 'visible'=>-2,), 'status' => array('type'=>'smallint', 'label'=>'Status', 'enabled'=>'1', 'position'=>1000, 'notnull'=>1, 'default'=>0, 'visible'=>5, 'index'=>1, 'arrayofkeyval'=>array('0'=>'Draft', '1'=>'Validated', '6' => 'Closed'),), 'date_eval' => array('type'=>'date', 'label'=>'DateEval', 'enabled'=>'1', 'position'=>502, 'notnull'=>1, 'visible'=>1,), - 'fk_user' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'User', 'enabled'=>'1', 'position'=>504, 'notnull'=>1, 'visible'=>1,), + 'fk_user' => array('type'=>'integer:User:user/class/user.class.php:0', 'label'=>'User', 'enabled'=>'1', 'position'=>504, 'notnull'=>1, 'visible'=>1,), 'fk_job' => array('type'=>'integer:Job:/hrm/class/job.class.php', 'label'=>'Job', 'enabled'=>'1', 'position'=>505, 'notnull'=>1, 'visible'=>1,), ); public $rowid; @@ -182,7 +182,7 @@ class Evaluation extends CommonObject */ public function __construct(DoliDB $db) { - global $conf, $langs; + global $conf, $langs, $user; $this->db = $db; @@ -193,6 +193,8 @@ class Evaluation extends CommonObject $this->fields['entity']['enabled'] = 0; } + if(empty($user->rights->hrm->evaluation->readall)) $this->fields['fk_user']['type'].= ':rowid IN('.implode(", ", $user->getAllChildIds(1)).')'; + $this->date_eval = dol_now(); // Unset fields that are disabled diff --git a/htdocs/hrm/evaluation_card.php b/htdocs/hrm/evaluation_card.php index 9c73d8c99b6..80110a3e8a0 100644 --- a/htdocs/hrm/evaluation_card.php +++ b/htdocs/hrm/evaluation_card.php @@ -82,7 +82,7 @@ include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be includ $permissiontoread = $user->rights->hrm->evaluation->read; $permissiontoadd = $user->rights->hrm->evaluation->write; // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php -$permissiontovalidate = $user->rights->hrm->evaluation_advance->validate; +$permissiontovalidate = (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && $user->rights->hrm->evaluation_advance->validate) || (empty($conf->global->MAIN_USE_ADVANCED_PERMS) && $permissiontoadd); $permissiontoClose = $user->rights->hrm->evaluation->write; $permissiontodelete = $user->rights->hrm->evaluation->delete/* || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_DRAFT)*/; $permissiondellink = $user->rights->hrm->evaluation->write; // Used by the include of actions_dellink.inc.php diff --git a/htdocs/hrm/evaluation_list.php b/htdocs/hrm/evaluation_list.php index cc584b2e8d4..fb940b9dbb9 100644 --- a/htdocs/hrm/evaluation_list.php +++ b/htdocs/hrm/evaluation_list.php @@ -131,6 +131,7 @@ $object->fields = dol_sort_array($object->fields, 'position'); $arrayfields = dol_sort_array($arrayfields, 'position'); $permissiontoread = $user->rights->hrm->evaluation->read; +$permissiontoreadall = $user->rights->hrm->evaluation->readall; $permissiontoadd = $user->rights->hrm->evaluation->write; $permissiontodelete = $user->rights->hrm->evaluation->delete; @@ -146,7 +147,7 @@ if ($user->socid > 0) accessforbidden(); //$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0); //restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft); //if (empty($conf->hrm->enabled)) accessforbidden(); -//if (!$permissiontoread) accessforbidden(); +if (!$permissiontoread) accessforbidden(); @@ -273,6 +274,11 @@ foreach ($search as $key => $val) { if ($search_all) { $sql .= natural_search(array_keys($fieldstosearchall), $search_all); } + +if(empty($permissiontoreadall)) { + $sql.= " AND t.fk_user IN(".implode(", ", $user->getAllChildIds(1)).") "; +} + //$sql.= dolSqlDateFilter("t.field", $search_xxxday, $search_xxxmonth, $search_xxxyear); // Add where from extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php'; diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 7dd27ff29ab..f53323759d8 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -969,13 +969,14 @@ Permission3301=Generate new modules Permission4001=Read skill/job/position Permission4002=Create/modify skill/job/position Permission4003=Delete skill/job/position -Permission4020=Read evaluations -Permission4021=Create/modify your evaluation -Permission4022=Validate evaluation -Permission4023=Delete evaluation -Permission4030=See comparison menu +Permission4021=Read evaluations (yours and your subordinates) +Permission4022=Create/modify evaluations +Permission4023=Validate evaluation +Permission4025=Delete evaluation +Permission4028=See comparison menu Permission4031=Read personal information Permission4032=Write personal information +Permission4033=Read all evaluations (even those of user not subordinates) Permission10001=Read website content Permission10002=Create/modify website content (html and javascript content) Permission10003=Create/modify website content (dynamic php code). Dangerous, must be reserved to restricted developers. @@ -2280,4 +2281,4 @@ INVOICE_ADD_SWISS_QR_CODE=Show the swiss QR-Bill code on invoices UrlSocialNetworksDesc=Url link of social network. Use {socialid} for the variable part that contains the social network ID. IfThisCategoryIsChildOfAnother=If this category is a child of another one NoName=No name -CIDLookupURL=The module brings an URL that can be used by an external tool to get the name of a thirdparty or contact from its phone number. URL to use is: \ No newline at end of file +CIDLookupURL=The module brings an URL that can be used by an external tool to get the name of a thirdparty or contact from its phone number. URL to use is: diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang index ed427b72ff1..91b925bd4f7 100644 --- a/htdocs/langs/fr_FR/admin.lang +++ b/htdocs/langs/fr_FR/admin.lang @@ -971,13 +971,14 @@ Permission3301=Générer de nouveaux modules Permission4001=Lire compétence/emploi/poste Permission4002=Créer/modifier une compétence/un emploi/un poste Permission4003=Supprimer compétence/emploi/poste -Permission4020=Lire les évaluations -Permission4021=Créer/modifier votre évaluation -Permission4022=Valider l'évaluation -Permission4023=Supprimer l'évaluation -Permission4030=Voir menu de comparaison +Permission4021=Lire les évaluations (les vôtres et celles de vos subordonnés) +Permission4022=Créer/modifier les évaluations +Permission4023=Valider l'évaluation +Permission4025=Supprimer l'évaluation +Permission4028=Voir menu de comparaison Permission4031=Lire les informations personnelles Permission4032=Ecrire les informations personnelles +Permission4033=Lire toutes les évaluations (même celles des utilisateurs non subordonnés) Permission10001=Lire le contenu du site Permission10002=Créer/modifier le contenu du site Web (contenu HTML et JavaScript) Permission10003=Créer/modifier le contenu du site Web (code php dynamique). Dangereux, doit être réservé à un nombre restreint de développeurs. From c9bf5f85ea26fbfc0d78ada13041ac2eae7a529f Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Thu, 15 Dec 2022 15:24:52 +0000 Subject: [PATCH 0124/1128] Fixing style errors. --- htdocs/hrm/class/evaluation.class.php | 2 +- htdocs/hrm/evaluation_list.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/hrm/class/evaluation.class.php b/htdocs/hrm/class/evaluation.class.php index 5dfab9b9b10..6e8c4072a69 100644 --- a/htdocs/hrm/class/evaluation.class.php +++ b/htdocs/hrm/class/evaluation.class.php @@ -193,7 +193,7 @@ class Evaluation extends CommonObject $this->fields['entity']['enabled'] = 0; } - if(empty($user->rights->hrm->evaluation->readall)) $this->fields['fk_user']['type'].= ':rowid IN('.implode(", ", $user->getAllChildIds(1)).')'; + if (empty($user->rights->hrm->evaluation->readall)) $this->fields['fk_user']['type'].= ':rowid IN('.implode(", ", $user->getAllChildIds(1)).')'; $this->date_eval = dol_now(); diff --git a/htdocs/hrm/evaluation_list.php b/htdocs/hrm/evaluation_list.php index fb940b9dbb9..b2eeaf2c886 100644 --- a/htdocs/hrm/evaluation_list.php +++ b/htdocs/hrm/evaluation_list.php @@ -275,7 +275,7 @@ if ($search_all) { $sql .= natural_search(array_keys($fieldstosearchall), $search_all); } -if(empty($permissiontoreadall)) { +if (empty($permissiontoreadall)) { $sql.= " AND t.fk_user IN(".implode(", ", $user->getAllChildIds(1)).") "; } From 6a71e47d57204adb60299ad76ed2c72a32985700 Mon Sep 17 00:00:00 2001 From: Gauthier PC portable 024 Date: Thu, 15 Dec 2022 17:06:08 +0100 Subject: [PATCH 0125/1128] FIX : travis --- htdocs/hrm/class/evaluation.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/hrm/class/evaluation.class.php b/htdocs/hrm/class/evaluation.class.php index 5dfab9b9b10..9453211bfe6 100644 --- a/htdocs/hrm/class/evaluation.class.php +++ b/htdocs/hrm/class/evaluation.class.php @@ -193,7 +193,7 @@ class Evaluation extends CommonObject $this->fields['entity']['enabled'] = 0; } - if(empty($user->rights->hrm->evaluation->readall)) $this->fields['fk_user']['type'].= ':rowid IN('.implode(", ", $user->getAllChildIds(1)).')'; + if(empty($user->rights->hrm->evaluation->readall)) $this->fields['fk_user']['type'].= ':rowid IN('.$this->db->sanitize(implode(", ", $user->getAllChildIds(1))).')'; $this->date_eval = dol_now(); From 4b833d1c751e101449fc2e1184ad26e5e86840c8 Mon Sep 17 00:00:00 2001 From: Gauthier PC portable 024 Date: Thu, 15 Dec 2022 17:45:30 +0100 Subject: [PATCH 0126/1128] FIX : travis --- htdocs/hrm/evaluation_list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/hrm/evaluation_list.php b/htdocs/hrm/evaluation_list.php index b2eeaf2c886..84080f930fa 100644 --- a/htdocs/hrm/evaluation_list.php +++ b/htdocs/hrm/evaluation_list.php @@ -276,7 +276,7 @@ if ($search_all) { } if (empty($permissiontoreadall)) { - $sql.= " AND t.fk_user IN(".implode(", ", $user->getAllChildIds(1)).") "; + $sql.= " AND t.fk_user IN(".$db->sanitize(implode(", ", $user->getAllChildIds(1))).") "; } //$sql.= dolSqlDateFilter("t.field", $search_xxxday, $search_xxxmonth, $search_xxxyear); From c0a0b977bf223d884dad6b2e41bf909ebbad7a0f Mon Sep 17 00:00:00 2001 From: hystepik Date: Fri, 16 Dec 2022 16:20:43 +0100 Subject: [PATCH 0127/1128] Fix #19485 : add of missing tickets trad key for menu --- htdocs/langs/en_US/ticket.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/langs/en_US/ticket.lang b/htdocs/langs/en_US/ticket.lang index 0b54b1d5fa8..9897422d0c9 100644 --- a/htdocs/langs/en_US/ticket.lang +++ b/htdocs/langs/en_US/ticket.lang @@ -27,6 +27,7 @@ Permission56003=Delete tickets Permission56004=Manage tickets Permission56005=See tickets of all third parties (not effective for external users, always be limited to the third party they depend on) +Tickets=Tickets TicketDictType=Ticket - Types TicketDictCategory=Ticket - Groupes TicketDictSeverity=Ticket - Severities From 923b5d09ef196e502ae1528838058e012e9a1551 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 12:27:32 +0100 Subject: [PATCH 0128/1128] update code toward php 8 compliance --- htdocs/core/modules/asset/doc/pdf_standard_asset.modules.php | 2 +- htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php | 2 +- .../core/modules/supplier_proposal/doc/pdf_aurore.modules.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/modules/asset/doc/pdf_standard_asset.modules.php b/htdocs/core/modules/asset/doc/pdf_standard_asset.modules.php index f3bb6f57867..6be719fe6bc 100644 --- a/htdocs/core/modules/asset/doc/pdf_standard_asset.modules.php +++ b/htdocs/core/modules/asset/doc/pdf_standard_asset.modules.php @@ -945,7 +945,7 @@ class pdf_standard_asset extends ModelePDFAsset $pdf->SetXY($this->marge_gauche, $posy); // Logo - if (empty($conf->global->PDF_DISABLE_MYCOMPANY_LOGO)) { + if (!getDolGlobalInt('PDF_DISABLE_MYCOMPANY_LOGO')) { if ($this->emetteur->logo) { $logodir = $conf->mycompany->dir_output; if (!empty($conf->mycompany->multidir_output[$object->entity])) { diff --git a/htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php b/htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php index 5082c14a144..eaf19b2375c 100644 --- a/htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php +++ b/htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php @@ -1165,7 +1165,7 @@ class pdf_muscadet extends ModelePDFSuppliersOrders $pdf->SetXY($this->marge_gauche, $posy); // Logo - if (empty($conf->global->PDF_DISABLE_MYCOMPANY_LOGO)) { + if (!getDolGlobalInt('PDF_DISABLE_MYCOMPANY_LOGO')) { if ($this->emetteur->logo) { $logodir = $conf->mycompany->dir_output; if (!empty($conf->mycompany->multidir_output[$object->entity])) { diff --git a/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php b/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php index 6cb651b49fd..bf727844dfd 100644 --- a/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php +++ b/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php @@ -1253,7 +1253,7 @@ class pdf_aurore extends ModelePDFSupplierProposal $pdf->SetXY($this->marge_gauche, $posy); // Logo - if (empty($conf->global->PDF_DISABLE_MYCOMPANY_LOGO)) { + if (!getDolGlobalInt('PDF_DISABLE_MYCOMPANY_LOGO')) { if ($this->emetteur->logo) { $logodir = $conf->mycompany->dir_output; if (!empty($conf->mycompany->multidir_output[$object->entity])) { From fd734408659b602857fb219b9f430c24c4ea4acc Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 12:31:37 +0100 Subject: [PATCH 0129/1128] update code toward php 8 compliance --- htdocs/core/modules/commande/doc/pdf_einstein.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/commande/doc/pdf_einstein.modules.php b/htdocs/core/modules/commande/doc/pdf_einstein.modules.php index e0dff278f96..fee4d638e9a 100644 --- a/htdocs/core/modules/commande/doc/pdf_einstein.modules.php +++ b/htdocs/core/modules/commande/doc/pdf_einstein.modules.php @@ -1304,7 +1304,7 @@ class pdf_einstein extends ModelePDFCommandes $pdf->SetXY($this->marge_gauche, $posy); // Logo - if (empty($conf->global->PDF_DISABLE_MYCOMPANY_LOGO)) { + if (!getDolGlobalInt('PDF_DISABLE_MYCOMPANY_LOGO')) { if ($this->emetteur->logo) { $logodir = $conf->mycompany->dir_output; if (!empty($conf->mycompany->multidir_output[$object->entity])) { From 0ed3717fcc01e05fafbb284b5277ea7bec6249d7 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 12:32:09 +0100 Subject: [PATCH 0130/1128] update code toward php 8 compliance --- htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php index c8196d41a63..0ca905425a7 100644 --- a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php +++ b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php @@ -1471,7 +1471,7 @@ class pdf_eratosthene extends ModelePDFCommandes $pdf->SetXY($this->marge_gauche, $posy); // Logo - if (empty($conf->global->PDF_DISABLE_MYCOMPANY_LOGO)) { + if (!getDolGlobalInt('PDF_DISABLE_MYCOMPANY_LOGO')) { if ($this->emetteur->logo) { $logodir = $conf->mycompany->dir_output; if (!empty($conf->mycompany->multidir_output[$object->entity])) { From d9c5774660f7608b93f04ca210a89125e0788e40 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 12:32:36 +0100 Subject: [PATCH 0131/1128] update code toward php 8 compliance --- htdocs/core/modules/facture/doc/pdf_crabe.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php index ee4cc9b5d0d..36d70fea056 100644 --- a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php @@ -1777,7 +1777,7 @@ class pdf_crabe extends ModelePDFFactures $pdf->SetXY($this->marge_gauche, $posy); // Logo - if (empty($conf->global->PDF_DISABLE_MYCOMPANY_LOGO)) { + if (!getDolGlobalInt('PDF_DISABLE_MYCOMPANY_LOGO')) { if ($this->emetteur->logo) { $logodir = $conf->mycompany->dir_output; if (!empty($conf->mycompany->multidir_output[$object->entity])) { From 2d6494217c6b00b903df0a7b6127049cddd63d64 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 12:33:33 +0100 Subject: [PATCH 0132/1128] update code toward php 8 compliance --- htdocs/core/modules/facture/doc/pdf_sponge.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php index adf47af3cce..0ff94ced20a 100644 --- a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php @@ -2082,7 +2082,7 @@ class pdf_sponge extends ModelePDFFactures $pdf->SetXY($this->marge_gauche, $posy); // Logo - if (empty($conf->global->PDF_DISABLE_MYCOMPANY_LOGO)) { + if (!getDolGlobalInt('PDF_DISABLE_MYCOMPANY_LOGO')) { if ($this->emetteur->logo) { $logodir = $conf->mycompany->dir_output; if (!empty($conf->mycompany->multidir_output[$object->entity])) { From 3c59ea8e16e91da87d33671359689774e6c46e5c Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 12:34:04 +0100 Subject: [PATCH 0133/1128] update code toward php 8 compliance --- htdocs/core/modules/propale/doc/pdf_azur.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/propale/doc/pdf_azur.modules.php b/htdocs/core/modules/propale/doc/pdf_azur.modules.php index e1afcc0c7a0..25d4a6bdf26 100644 --- a/htdocs/core/modules/propale/doc/pdf_azur.modules.php +++ b/htdocs/core/modules/propale/doc/pdf_azur.modules.php @@ -1501,7 +1501,7 @@ class pdf_azur extends ModelePDFPropales $pdf->SetXY($this->marge_gauche, $posy); // Logo - if (empty($conf->global->PDF_DISABLE_MYCOMPANY_LOGO)) { + if (!getDolGlobalInt('PDF_DISABLE_MYCOMPANY_LOGO')) { if ($this->emetteur->logo) { $logodir = $conf->mycompany->dir_output; if (!empty($conf->mycompany->multidir_output[$object->entity])) { From 61c4d3b7942fd7949576685a1c78b089d24319a3 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 12:34:28 +0100 Subject: [PATCH 0134/1128] update code toward php 8 compliance --- htdocs/core/modules/propale/doc/pdf_cyan.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/propale/doc/pdf_cyan.modules.php b/htdocs/core/modules/propale/doc/pdf_cyan.modules.php index 3444664effa..1a3f6943a35 100644 --- a/htdocs/core/modules/propale/doc/pdf_cyan.modules.php +++ b/htdocs/core/modules/propale/doc/pdf_cyan.modules.php @@ -1574,7 +1574,7 @@ class pdf_cyan extends ModelePDFPropales $pdf->SetXY($this->marge_gauche, $posy); // Logo - if (empty($conf->global->PDF_DISABLE_MYCOMPANY_LOGO)) { + if (!getDolGlobalInt('PDF_DISABLE_MYCOMPANY_LOGO')) { if ($this->emetteur->logo) { $logodir = $conf->mycompany->dir_output; if (!empty($conf->mycompany->multidir_output[$object->entity])) { From 098b3aaaa4f2483b90e2797628dd6e140cf89a3a Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 12:35:08 +0100 Subject: [PATCH 0135/1128] update code toward php 8 compliance --- .../modules/stocktransfer/doc/pdf_eagle_proforma.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/stocktransfer/doc/pdf_eagle_proforma.modules.php b/htdocs/core/modules/stocktransfer/doc/pdf_eagle_proforma.modules.php index 2ab70767205..08ae1c8ac37 100644 --- a/htdocs/core/modules/stocktransfer/doc/pdf_eagle_proforma.modules.php +++ b/htdocs/core/modules/stocktransfer/doc/pdf_eagle_proforma.modules.php @@ -1186,7 +1186,7 @@ class pdf_eagle_proforma extends ModelePDFCommandes $pdf->SetXY($this->marge_gauche, $posy); // Logo - if (empty($conf->global->PDF_DISABLE_MYCOMPANY_LOGO)) { + if (!getDolGlobalInt('PDF_DISABLE_MYCOMPANY_LOGO')) { if ($this->emetteur->logo) { $logodir = $conf->mycompany->dir_output; if (!empty($conf->mycompany->multidir_output[$object->entity])) $logodir = $conf->mycompany->multidir_output[$object->entity]; From 6ed673788e5433e863340ddebfd4288f5c5a9a91 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 12:36:33 +0100 Subject: [PATCH 0136/1128] update code toward php 8 compliance --- htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php b/htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php index df584684f62..08327fefc67 100644 --- a/htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php +++ b/htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php @@ -1256,7 +1256,7 @@ class pdf_cornas extends ModelePDFSuppliersOrders $pdf->SetXY($this->marge_gauche, $posy); // Logo - if (empty($conf->global->PDF_DISABLE_MYCOMPANY_LOGO)) { + if (!getDolGlobalInt('PDF_DISABLE_MYCOMPANY_LOGO')) { if ($this->emetteur->logo) { $logodir = $conf->mycompany->dir_output; if (!empty($conf->mycompany->multidir_output[$object->entity])) { From 29e40f467e924dfa68fa934a85c7b241841ca14c Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 12:39:52 +0100 Subject: [PATCH 0137/1128] update code toward php 8 compliance --- htdocs/core/modules/propale/doc/pdf_cyan.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/propale/doc/pdf_cyan.modules.php b/htdocs/core/modules/propale/doc/pdf_cyan.modules.php index 1a3f6943a35..e0e9e18a031 100644 --- a/htdocs/core/modules/propale/doc/pdf_cyan.modules.php +++ b/htdocs/core/modules/propale/doc/pdf_cyan.modules.php @@ -1580,7 +1580,7 @@ class pdf_cyan extends ModelePDFPropales if (!empty($conf->mycompany->multidir_output[$object->entity])) { $logodir = $conf->mycompany->multidir_output[$object->entity]; } - if (empty($conf->global->MAIN_PDF_USE_LARGE_LOGO)) { + if (!getDolGlobalInt('MAIN_PDF_USE_LARGE_LOGO')) { $logo = $logodir.'/logos/thumbs/'.$this->emetteur->logo_small; } else { $logo = $logodir.'/logos/'.$this->emetteur->logo; From 76126d119d8eb6dac0fb2f3f00af50fc56f08693 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 12:40:33 +0100 Subject: [PATCH 0138/1128] update code toward php 8 compliance --- htdocs/core/modules/asset/doc/pdf_standard_asset.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/asset/doc/pdf_standard_asset.modules.php b/htdocs/core/modules/asset/doc/pdf_standard_asset.modules.php index 6be719fe6bc..2bdda4421dc 100644 --- a/htdocs/core/modules/asset/doc/pdf_standard_asset.modules.php +++ b/htdocs/core/modules/asset/doc/pdf_standard_asset.modules.php @@ -951,7 +951,7 @@ class pdf_standard_asset extends ModelePDFAsset if (!empty($conf->mycompany->multidir_output[$object->entity])) { $logodir = $conf->mycompany->multidir_output[$object->entity]; } - if (empty($conf->global->MAIN_PDF_USE_LARGE_LOGO)) { + if (!getDolGlobalInt('MAIN_PDF_USE_LARGE_LOGO')) { $logo = $logodir.'/logos/thumbs/'.$this->emetteur->logo_small; } else { $logo = $logodir.'/logos/'.$this->emetteur->logo; From b83bc96ac879495cbd285df5d5cd29319bc883c8 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 12:40:57 +0100 Subject: [PATCH 0139/1128] update code toward php 8 compliance --- htdocs/core/modules/commande/doc/pdf_einstein.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/commande/doc/pdf_einstein.modules.php b/htdocs/core/modules/commande/doc/pdf_einstein.modules.php index fee4d638e9a..aabbbb0c567 100644 --- a/htdocs/core/modules/commande/doc/pdf_einstein.modules.php +++ b/htdocs/core/modules/commande/doc/pdf_einstein.modules.php @@ -1310,7 +1310,7 @@ class pdf_einstein extends ModelePDFCommandes if (!empty($conf->mycompany->multidir_output[$object->entity])) { $logodir = $conf->mycompany->multidir_output[$object->entity]; } - if (empty($conf->global->MAIN_PDF_USE_LARGE_LOGO)) { + if (!getDolGlobalInt('MAIN_PDF_USE_LARGE_LOGO')) { $logo = $logodir.'/logos/thumbs/'.$this->emetteur->logo_small; } else { $logo = $logodir.'/logos/'.$this->emetteur->logo; From 7d97fb5e0d51297e98a76fd65b3e7c23c5e8802e Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 12:41:20 +0100 Subject: [PATCH 0140/1128] update code toward php 8 compliance --- htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php index 0ca905425a7..24fa76e8af8 100644 --- a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php +++ b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php @@ -1477,7 +1477,7 @@ class pdf_eratosthene extends ModelePDFCommandes if (!empty($conf->mycompany->multidir_output[$object->entity])) { $logodir = $conf->mycompany->multidir_output[$object->entity]; } - if (empty($conf->global->MAIN_PDF_USE_LARGE_LOGO)) { + if (!getDolGlobalInt('MAIN_PDF_USE_LARGE_LOGO')) { $logo = $logodir.'/logos/thumbs/'.$this->emetteur->logo_small; } else { $logo = $logodir.'/logos/'.$this->emetteur->logo; From a5292d10b346f0d395c7b8c1c4aac843b52c1c28 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 12:41:53 +0100 Subject: [PATCH 0141/1128] update code toward php 8 compliance --- htdocs/core/modules/expedition/doc/pdf_espadon.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php b/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php index b87298d3dd8..9e5d2fe5c25 100644 --- a/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php +++ b/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php @@ -974,7 +974,7 @@ class pdf_espadon extends ModelePdfExpedition if (!empty($conf->mycompany->multidir_output[$object->entity])) { $logodir = $conf->mycompany->multidir_output[$object->entity]; } - if (empty($conf->global->MAIN_PDF_USE_LARGE_LOGO)) { + if (!getDolGlobalInt('MAIN_PDF_USE_LARGE_LOGO')) { $logo = $logodir.'/logos/thumbs/'.$this->emetteur->logo_small; } else { $logo = $logodir.'/logos/'.$this->emetteur->logo; From 618b09e00ab0fa4e4d05f3e01e139f08f9cd9587 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 12:42:57 +0100 Subject: [PATCH 0142/1128] update code toward php 8 compliance --- htdocs/core/modules/expedition/doc/pdf_merou.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/expedition/doc/pdf_merou.modules.php b/htdocs/core/modules/expedition/doc/pdf_merou.modules.php index e847dc26fec..e5b6b3fd8de 100644 --- a/htdocs/core/modules/expedition/doc/pdf_merou.modules.php +++ b/htdocs/core/modules/expedition/doc/pdf_merou.modules.php @@ -553,7 +553,7 @@ class pdf_merou extends ModelePdfExpedition if (!empty($conf->mycompany->multidir_output[$object->entity])) { $logodir = $conf->mycompany->multidir_output[$object->entity]; } - if (empty($conf->global->MAIN_PDF_USE_LARGE_LOGO)) { + if (!getDolGlobalInt('MAIN_PDF_USE_LARGE_LOGO')) { $logo = $logodir.'/logos/thumbs/'.$this->emetteur->logo_small; } else { $logo = $logodir.'/logos/'.$this->emetteur->logo; From 55b930a08936b566b1a07fc6ae5c8e5960b9cc87 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 12:43:25 +0100 Subject: [PATCH 0143/1128] update code toward php 8 compliance --- htdocs/core/modules/expedition/doc/pdf_rouget.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/expedition/doc/pdf_rouget.modules.php b/htdocs/core/modules/expedition/doc/pdf_rouget.modules.php index 71fb4c4c194..bbd3cb0ade1 100644 --- a/htdocs/core/modules/expedition/doc/pdf_rouget.modules.php +++ b/htdocs/core/modules/expedition/doc/pdf_rouget.modules.php @@ -919,7 +919,7 @@ class pdf_rouget extends ModelePdfExpedition if (!empty($conf->mycompany->multidir_output[$object->entity])) { $logodir = $conf->mycompany->multidir_output[$object->entity]; } - if (empty($conf->global->MAIN_PDF_USE_LARGE_LOGO)) { + if (!getDolGlobalInt('MAIN_PDF_USE_LARGE_LOGO')) { $logo = $logodir.'/logos/thumbs/'.$this->emetteur->logo_small; } else { $logo = $logodir.'/logos/'.$this->emetteur->logo; From 3e34ada2b50218cf2d2507719ff699ab6eb3685b Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 12:43:47 +0100 Subject: [PATCH 0144/1128] update code toward php 8 compliance --- htdocs/core/modules/facture/doc/pdf_crabe.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php index 36d70fea056..7e29855dd2a 100644 --- a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php @@ -1783,7 +1783,7 @@ class pdf_crabe extends ModelePDFFactures if (!empty($conf->mycompany->multidir_output[$object->entity])) { $logodir = $conf->mycompany->multidir_output[$object->entity]; } - if (empty($conf->global->MAIN_PDF_USE_LARGE_LOGO)) { + if (!getDolGlobalInt('MAIN_PDF_USE_LARGE_LOGO')) { $logo = $logodir.'/logos/thumbs/'.$this->emetteur->logo_small; } else { $logo = $logodir.'/logos/'.$this->emetteur->logo; From efe46f2235560fda2d08f6d8d6fbd5b4ee59f364 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 12:44:28 +0100 Subject: [PATCH 0145/1128] update code toward php 8 compliance --- htdocs/core/modules/facture/doc/pdf_sponge.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php index 0ff94ced20a..2227dba791d 100644 --- a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php @@ -2088,7 +2088,7 @@ class pdf_sponge extends ModelePDFFactures if (!empty($conf->mycompany->multidir_output[$object->entity])) { $logodir = $conf->mycompany->multidir_output[$object->entity]; } - if (empty($conf->global->MAIN_PDF_USE_LARGE_LOGO)) { + if (!getDolGlobalInt('MAIN_PDF_USE_LARGE_LOGO')) { $logo = $logodir.'/logos/thumbs/'.$this->emetteur->logo_small; } else { $logo = $logodir.'/logos/'.$this->emetteur->logo; From ab42ebfcdb26259a4b241d529804576f2c2b976b Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 12:44:52 +0100 Subject: [PATCH 0146/1128] update code toward php 8 compliance --- htdocs/core/modules/propale/doc/pdf_azur.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/propale/doc/pdf_azur.modules.php b/htdocs/core/modules/propale/doc/pdf_azur.modules.php index 25d4a6bdf26..6e89e57e71b 100644 --- a/htdocs/core/modules/propale/doc/pdf_azur.modules.php +++ b/htdocs/core/modules/propale/doc/pdf_azur.modules.php @@ -1507,7 +1507,7 @@ class pdf_azur extends ModelePDFPropales if (!empty($conf->mycompany->multidir_output[$object->entity])) { $logodir = $conf->mycompany->multidir_output[$object->entity]; } - if (empty($conf->global->MAIN_PDF_USE_LARGE_LOGO)) { + if (!getDolGlobalInt('MAIN_PDF_USE_LARGE_LOGO')) { $logo = $logodir.'/logos/thumbs/'.$this->emetteur->logo_small; } else { $logo = $logodir.'/logos/'.$this->emetteur->logo; From 99e575d9b40d690442b7aeecc1e81ce5fd34ed26 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 12:45:24 +0100 Subject: [PATCH 0147/1128] update code toward php 8 compliance --- .../modules/stocktransfer/doc/pdf_eagle_proforma.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/stocktransfer/doc/pdf_eagle_proforma.modules.php b/htdocs/core/modules/stocktransfer/doc/pdf_eagle_proforma.modules.php index 08ae1c8ac37..55b75118ab4 100644 --- a/htdocs/core/modules/stocktransfer/doc/pdf_eagle_proforma.modules.php +++ b/htdocs/core/modules/stocktransfer/doc/pdf_eagle_proforma.modules.php @@ -1190,7 +1190,7 @@ class pdf_eagle_proforma extends ModelePDFCommandes if ($this->emetteur->logo) { $logodir = $conf->mycompany->dir_output; if (!empty($conf->mycompany->multidir_output[$object->entity])) $logodir = $conf->mycompany->multidir_output[$object->entity]; - if (empty($conf->global->MAIN_PDF_USE_LARGE_LOGO)) { + if (!getDolGlobalInt('MAIN_PDF_USE_LARGE_LOGO')) { $logo = $logodir.'/logos/thumbs/'.$this->emetteur->logo_small; } else { $logo = $logodir.'/logos/'.$this->emetteur->logo; From 286cdc0df4ca50eef83b5db5be38baafad679013 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 12:45:48 +0100 Subject: [PATCH 0148/1128] update code toward php 8 compliance --- htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php b/htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php index 08327fefc67..72ccdc24996 100644 --- a/htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php +++ b/htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php @@ -1262,7 +1262,7 @@ class pdf_cornas extends ModelePDFSuppliersOrders if (!empty($conf->mycompany->multidir_output[$object->entity])) { $logodir = $conf->mycompany->multidir_output[$object->entity]; } - if (empty($conf->global->MAIN_PDF_USE_LARGE_LOGO)) { + if (!getDolGlobalInt('MAIN_PDF_USE_LARGE_LOGO')) { $logo = $logodir.'/logos/thumbs/'.$this->emetteur->logo_small; } else { $logo = $logodir.'/logos/'.$this->emetteur->logo; From 28679a9e403a6a868ec23268eacdf9646949c9c6 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 12:46:14 +0100 Subject: [PATCH 0149/1128] update code toward php 8 compliance --- htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php b/htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php index eaf19b2375c..e46bc637637 100644 --- a/htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php +++ b/htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php @@ -1171,7 +1171,7 @@ class pdf_muscadet extends ModelePDFSuppliersOrders if (!empty($conf->mycompany->multidir_output[$object->entity])) { $logodir = $conf->mycompany->multidir_output[$object->entity]; } - if (empty($conf->global->MAIN_PDF_USE_LARGE_LOGO)) { + if (!getDolGlobalInt('MAIN_PDF_USE_LARGE_LOGO')) { $logo = $logodir.'/logos/thumbs/'.$this->emetteur->logo_small; } else { $logo = $logodir.'/logos/'.$this->emetteur->logo; From 4c867a2f0432283a4d6d8804ba6418370346244c Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 12:46:38 +0100 Subject: [PATCH 0150/1128] update code toward php 8 compliance --- .../core/modules/supplier_proposal/doc/pdf_aurore.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php b/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php index bf727844dfd..9918616714d 100644 --- a/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php +++ b/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php @@ -1259,7 +1259,7 @@ class pdf_aurore extends ModelePDFSupplierProposal if (!empty($conf->mycompany->multidir_output[$object->entity])) { $logodir = $conf->mycompany->multidir_output[$object->entity]; } - if (empty($conf->global->MAIN_PDF_USE_LARGE_LOGO)) { + if (!getDolGlobalInt('MAIN_PDF_USE_LARGE_LOGO')) { $logo = $logodir.'/logos/thumbs/'.$this->emetteur->logo_small; } else { $logo = $logodir.'/logos/'.$this->emetteur->logo; From 8ecd895dc7cc4b3d6c2aa08e91457c883d16e369 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 14:43:55 +0100 Subject: [PATCH 0151/1128] update code toward php 8 compliance --- .../core/modules/mymodule/doc/pdf_standard_myobject.modules.php | 2 +- .../doc/pdf_standard_recruitmentjobposition.modules.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/modulebuilder/template/core/modules/mymodule/doc/pdf_standard_myobject.modules.php b/htdocs/modulebuilder/template/core/modules/mymodule/doc/pdf_standard_myobject.modules.php index bd5348b1566..7b3bb92f708 100644 --- a/htdocs/modulebuilder/template/core/modules/mymodule/doc/pdf_standard_myobject.modules.php +++ b/htdocs/modulebuilder/template/core/modules/mymodule/doc/pdf_standard_myobject.modules.php @@ -919,7 +919,7 @@ class pdf_standard_myobject extends ModelePDFMyObject if (!empty($conf->mycompany->multidir_output[$object->entity])) { $logodir = $conf->mycompany->multidir_output[$object->entity]; } - if (empty($conf->global->MAIN_PDF_USE_LARGE_LOGO)) { + if (!getDolGlobalInt('MAIN_PDF_USE_LARGE_LOGO')) { $logo = $logodir.'/logos/thumbs/'.$this->emetteur->logo_small; } else { $logo = $logodir.'/logos/'.$this->emetteur->logo; diff --git a/htdocs/recruitment/core/modules/recruitment/doc/pdf_standard_recruitmentjobposition.modules.php b/htdocs/recruitment/core/modules/recruitment/doc/pdf_standard_recruitmentjobposition.modules.php index 94e93c87baa..f1a919b4f05 100644 --- a/htdocs/recruitment/core/modules/recruitment/doc/pdf_standard_recruitmentjobposition.modules.php +++ b/htdocs/recruitment/core/modules/recruitment/doc/pdf_standard_recruitmentjobposition.modules.php @@ -838,7 +838,7 @@ class pdf_standard_recruitmentjobposition extends ModelePDFRecruitmentJobPositio if (!empty($conf->mycompany->multidir_output[$object->entity])) { $logodir = $conf->mycompany->multidir_output[$object->entity]; } - if (empty($conf->global->MAIN_PDF_USE_LARGE_LOGO)) { + if (!getDolGlobalInt('MAIN_PDF_USE_LARGE_LOGO')) { $logo = $logodir.'/logos/thumbs/'.$this->emetteur->logo_small; } else { $logo = $logodir.'/logos/'.$this->emetteur->logo; From 310b40bcb2f02c6053ab7df8fe74e7cdb85a9d2b Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 14:48:52 +0100 Subject: [PATCH 0152/1128] update code toward php 8 compliance --- .../core/modules/mymodule/doc/pdf_standard_myobject.modules.php | 2 +- .../doc/pdf_standard_recruitmentjobposition.modules.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/modulebuilder/template/core/modules/mymodule/doc/pdf_standard_myobject.modules.php b/htdocs/modulebuilder/template/core/modules/mymodule/doc/pdf_standard_myobject.modules.php index 7b3bb92f708..5c277b85ae4 100644 --- a/htdocs/modulebuilder/template/core/modules/mymodule/doc/pdf_standard_myobject.modules.php +++ b/htdocs/modulebuilder/template/core/modules/mymodule/doc/pdf_standard_myobject.modules.php @@ -913,7 +913,7 @@ class pdf_standard_myobject extends ModelePDFMyObject $pdf->SetXY($this->marge_gauche, $posy); // Logo - if (empty($conf->global->PDF_DISABLE_MYCOMPANY_LOGO)) { + if (!getDolGlobalInt('PDF_DISABLE_MYCOMPANY_LOGO')) { if ($this->emetteur->logo) { $logodir = $conf->mycompany->dir_output; if (!empty($conf->mycompany->multidir_output[$object->entity])) { diff --git a/htdocs/recruitment/core/modules/recruitment/doc/pdf_standard_recruitmentjobposition.modules.php b/htdocs/recruitment/core/modules/recruitment/doc/pdf_standard_recruitmentjobposition.modules.php index f1a919b4f05..1a58085d8c9 100644 --- a/htdocs/recruitment/core/modules/recruitment/doc/pdf_standard_recruitmentjobposition.modules.php +++ b/htdocs/recruitment/core/modules/recruitment/doc/pdf_standard_recruitmentjobposition.modules.php @@ -832,7 +832,7 @@ class pdf_standard_recruitmentjobposition extends ModelePDFRecruitmentJobPositio $pdf->SetXY($this->marge_gauche, $posy); // Logo - if (empty($conf->global->PDF_DISABLE_MYCOMPANY_LOGO)) { + if (!getDolGlobalInt('PDF_DISABLE_MYCOMPANY_LOGO')) { if ($this->emetteur->logo) { $logodir = $conf->mycompany->dir_output; if (!empty($conf->mycompany->multidir_output[$object->entity])) { From cac7ba3a2053eb799ddb8619efcccb3c10ab6843 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 15:28:35 +0100 Subject: [PATCH 0153/1128] update code toward php 8 compliance --- htdocs/core/modules/commande/doc/pdf_einstein.modules.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/commande/doc/pdf_einstein.modules.php b/htdocs/core/modules/commande/doc/pdf_einstein.modules.php index aabbbb0c567..120d9244988 100644 --- a/htdocs/core/modules/commande/doc/pdf_einstein.modules.php +++ b/htdocs/core/modules/commande/doc/pdf_einstein.modules.php @@ -237,8 +237,8 @@ class pdf_einstein extends ModelePDFCommandes $outputlangs->loadLangs(array("main", "dict", "companies", "bills", "products", "orders", "deliveries")); // Show Draft Watermark - if ($object->statut == $object::STATUS_DRAFT && (!empty($conf->global->COMMANDE_DRAFT_WATERMARK))) { - $this->watermark = $conf->global->COMMANDE_DRAFT_WATERMARK; + if ($object->statut == $object::STATUS_DRAFT && getDolGlobalString('COMMANDE_DRAFT_WATERMARK')) { + $this->watermark = getDolGlobalString('COMMANDE_DRAFT_WATERMARK'); } global $outputlangsbis; From a909ac83715f419560e92dcd264046ea5cec2c6d Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 15:29:36 +0100 Subject: [PATCH 0154/1128] update code toward php 8 compliance --- htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php index 24fa76e8af8..3d6038f39d8 100644 --- a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php +++ b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php @@ -221,8 +221,8 @@ class pdf_eratosthene extends ModelePDFCommandes $outputlangs->loadLangs(array("main", "dict", "companies", "bills", "products", "orders", "deliveries")); // Show Draft Watermark - if ($object->statut == $object::STATUS_DRAFT && (!empty($conf->global->COMMANDE_DRAFT_WATERMARK))) { - $this->watermark = $conf->global->COMMANDE_DRAFT_WATERMARK; + if ($object->statut == $object::STATUS_DRAFT && getDolGlobalString('COMMANDE_DRAFT_WATERMARK')) { + $this->watermark = getDolGlobalString('COMMANDE_DRAFT_WATERMARK'); } global $outputlangsbis; From dfbf298b938d62de586e804b0b8b7b80a6e85e54 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 15:30:31 +0100 Subject: [PATCH 0155/1128] update code toward php 8 compliance --- htdocs/core/modules/delivery/doc/pdf_storm.modules.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/delivery/doc/pdf_storm.modules.php b/htdocs/core/modules/delivery/doc/pdf_storm.modules.php index 46a70464583..3db75e6ca9b 100644 --- a/htdocs/core/modules/delivery/doc/pdf_storm.modules.php +++ b/htdocs/core/modules/delivery/doc/pdf_storm.modules.php @@ -752,8 +752,8 @@ class pdf_storm extends ModelePDFDeliveryOrder pdf_pagehead($pdf, $outputlangs, $this->page_hauteur); // Show Draft Watermark - if ($object->statut == 0 && (!empty($conf->global->COMMANDE_DRAFT_WATERMARK))) { - pdf_watermark($pdf, $outputlangs, $this->page_hauteur, $this->page_largeur, 'mm', $conf->global->COMMANDE_DRAFT_WATERMARK); + if ($object->statut == 0 && getDolGlobalString('COMMANDE_DRAFT_WATERMARK')) { + pdf_watermark($pdf, $outputlangs, $this->page_hauteur, $this->page_largeur, 'mm', getDolGlobalString('COMMANDE_DRAFT_WATERMARK')); } $pdf->SetTextColor(0, 0, 60); From 2ae2257f5e7c18832b4f846376aae3c7dc788abe Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 15:31:17 +0100 Subject: [PATCH 0156/1128] update code toward php 8 compliance --- htdocs/core/modules/delivery/doc/pdf_typhon.modules.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/delivery/doc/pdf_typhon.modules.php b/htdocs/core/modules/delivery/doc/pdf_typhon.modules.php index 5936f874a1b..281dbf65026 100644 --- a/htdocs/core/modules/delivery/doc/pdf_typhon.modules.php +++ b/htdocs/core/modules/delivery/doc/pdf_typhon.modules.php @@ -751,8 +751,8 @@ class pdf_typhon extends ModelePDFDeliveryOrder pdf_pagehead($pdf, $outputlangs, $this->page_hauteur); // Show Draft Watermark - if ($object->statut == 0 && (!empty($conf->global->COMMANDE_DRAFT_WATERMARK))) { - pdf_watermark($pdf, $outputlangs, $this->page_hauteur, $this->page_largeur, 'mm', $conf->global->COMMANDE_DRAFT_WATERMARK); + if ($object->statut == 0 && getDolGlobalString('COMMANDE_DRAFT_WATERMARK')) { + pdf_watermark($pdf, $outputlangs, $this->page_hauteur, $this->page_largeur, 'mm', getDolGlobalString('COMMANDE_DRAFT_WATERMARK')); } $pdf->SetTextColor(0, 0, 60); From 57194826a5f791a361577d99b5d663d69f713188 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 15:47:07 +0100 Subject: [PATCH 0157/1128] update code toward php 8 compliance --- htdocs/core/modules/movement/doc/pdf_standard.modules.php | 4 ++-- htdocs/core/modules/mrp/doc/pdf_vinci.modules.php | 4 ++-- htdocs/core/modules/product/doc/pdf_standard.modules.php | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/core/modules/movement/doc/pdf_standard.modules.php b/htdocs/core/modules/movement/doc/pdf_standard.modules.php index 094e19a280a..87e72f66eb6 100644 --- a/htdocs/core/modules/movement/doc/pdf_standard.modules.php +++ b/htdocs/core/modules/movement/doc/pdf_standard.modules.php @@ -961,8 +961,8 @@ class pdf_standard extends ModelePDFMovement pdf_pagehead($pdf, $outputlangs, $this->page_hauteur); // Show Draft Watermark - if ($object->statut == 0 && (!empty($conf->global->COMMANDE_DRAFT_WATERMARK))) { - pdf_watermark($pdf, $outputlangs, $this->page_hauteur, $this->page_largeur, 'mm', $conf->global->COMMANDE_DRAFT_WATERMARK); + if ($object->statut == 0 && getDolGlobalString('COMMANDE_DRAFT_WATERMARK')) { + pdf_watermark($pdf, $outputlangs, $this->page_hauteur, $this->page_largeur, 'mm', getDolGlobalString('COMMANDE_DRAFT_WATERMARK')); } $pdf->SetTextColor(0, 0, 60); diff --git a/htdocs/core/modules/mrp/doc/pdf_vinci.modules.php b/htdocs/core/modules/mrp/doc/pdf_vinci.modules.php index c5dc9dd8b19..784c784f849 100644 --- a/htdocs/core/modules/mrp/doc/pdf_vinci.modules.php +++ b/htdocs/core/modules/mrp/doc/pdf_vinci.modules.php @@ -1085,9 +1085,9 @@ class pdf_vinci extends ModelePDFMo //pdf_pagehead($pdf,$outputlangs,$this->page_hauteur); //Affiche le filigrane brouillon - Print Draft Watermark - /*if($object->statut==0 && (!empty($conf->global->COMMANDE_DRAFT_WATERMARK)) ) + /*if($object->statut==0 && getDolGlobalString('COMMANDE_DRAFT_WATERMARK')) { - pdf_watermark($pdf,$outputlangs,$this->page_hauteur,$this->page_largeur,'mm',$conf->global->COMMANDE_DRAFT_WATERMARK); + pdf_watermark($pdf,$outputlangs,$this->page_hauteur,$this->page_largeur,'mm',getDolGlobalString('COMMANDE_DRAFT_WATERMARK')); }*/ //Print content diff --git a/htdocs/core/modules/product/doc/pdf_standard.modules.php b/htdocs/core/modules/product/doc/pdf_standard.modules.php index 89df34f8f73..8baef2ffa75 100644 --- a/htdocs/core/modules/product/doc/pdf_standard.modules.php +++ b/htdocs/core/modules/product/doc/pdf_standard.modules.php @@ -687,8 +687,8 @@ class pdf_standard extends ModelePDFProduct pdf_pagehead($pdf, $outputlangs, $this->page_hauteur); // Show Draft Watermark - if ($object->statut == 0 && (!empty($conf->global->COMMANDE_DRAFT_WATERMARK))) { - pdf_watermark($pdf, $outputlangs, $this->page_hauteur, $this->page_largeur, 'mm', $conf->global->COMMANDE_DRAFT_WATERMARK); + if ($object->statut == 0 && getDolGlobalString('COMMANDE_DRAFT_WATERMARK')) { + pdf_watermark($pdf, $outputlangs, $this->page_hauteur, $this->page_largeur, 'mm', getDolGlobalString('COMMANDE_DRAFT_WATERMARK')); } $pdf->SetTextColor(0, 0, 60); From f62b671c82e8309e21ce659ee6c0556623ee5f56 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 15:48:10 +0100 Subject: [PATCH 0158/1128] update code toward php 8 compliance --- .../modules/stocktransfer/doc/pdf_eagle_proforma.modules.php | 4 ++-- htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/core/modules/stocktransfer/doc/pdf_eagle_proforma.modules.php b/htdocs/core/modules/stocktransfer/doc/pdf_eagle_proforma.modules.php index 55b75118ab4..a2dbf10b3e9 100644 --- a/htdocs/core/modules/stocktransfer/doc/pdf_eagle_proforma.modules.php +++ b/htdocs/core/modules/stocktransfer/doc/pdf_eagle_proforma.modules.php @@ -1173,8 +1173,8 @@ class pdf_eagle_proforma extends ModelePDFCommandes pdf_pagehead($pdf, $outputlangs, $this->page_hauteur); // Show Draft Watermark - if ($object->statut == 0 && (!empty($conf->global->COMMANDE_DRAFT_WATERMARK))) { - pdf_watermark($pdf, $outputlangs, $this->page_hauteur, $this->page_largeur, 'mm', $conf->global->COMMANDE_DRAFT_WATERMARK); + if ($object->statut == 0 && getDolGlobalString('COMMANDE_DRAFT_WATERMARK')) { + pdf_watermark($pdf, $outputlangs, $this->page_hauteur, $this->page_largeur, 'mm', getDolGlobalString('COMMANDE_DRAFT_WATERMARK')); } $pdf->SetTextColor(0, 0, 60); diff --git a/htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php b/htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php index 72ccdc24996..aed616ae346 100644 --- a/htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php +++ b/htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php @@ -1241,9 +1241,9 @@ class pdf_cornas extends ModelePDFSuppliersOrders //pdf_pagehead($pdf,$outputlangs,$this->page_hauteur); //Affiche le filigrane brouillon - Print Draft Watermark - /*if($object->statut==0 && (!empty($conf->global->COMMANDE_DRAFT_WATERMARK)) ) + /*if($object->statut==0 && getDolGlobalString('COMMANDE_DRAFT_WATERMARK')) { - pdf_watermark($pdf,$outputlangs,$this->page_hauteur,$this->page_largeur,'mm',$conf->global->COMMANDE_DRAFT_WATERMARK); + pdf_watermark($pdf,$outputlangs,$this->page_hauteur,$this->page_largeur,'mm',getDolGlobalString('COMMANDE_DRAFT_WATERMARK')); }*/ //Print content From e0e6673bd5255912ffcc3d66fb4b179a43aed176 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 17 Dec 2022 15:50:04 +0100 Subject: [PATCH 0159/1128] update code toward php 8 compliance --- .../core/modules/supplier_order/doc/pdf_muscadet.modules.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php b/htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php index e46bc637637..6d8564a4779 100644 --- a/htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php +++ b/htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php @@ -1150,9 +1150,9 @@ class pdf_muscadet extends ModelePDFSuppliersOrders //pdf_pagehead($pdf,$outputlangs,$this->page_hauteur); //Affiche le filigrane brouillon - Print Draft Watermark - /*if($object->statut==0 && (!empty($conf->global->COMMANDE_DRAFT_WATERMARK)) ) + /*if($object->statut==0 && getDolGlobalString('COMMANDE_DRAFT_WATERMARK')) { - pdf_watermark($pdf,$outputlangs,$this->page_hauteur,$this->page_largeur,'mm',$conf->global->COMMANDE_DRAFT_WATERMARK); + pdf_watermark($pdf,$outputlangs,$this->page_hauteur,$this->page_largeur,'mm',getDolGlobalString('COMMANDE_DRAFT_WATERMARK')); }*/ //Print content From 0ba12ec3379475e0f64c9d90d741e0c52b199487 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Sat, 17 Dec 2022 14:50:48 +0000 Subject: [PATCH 0160/1128] Fixing style errors. --- htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php b/htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php index 6d8564a4779..6f868d8e09c 100644 --- a/htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php +++ b/htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php @@ -1150,7 +1150,7 @@ class pdf_muscadet extends ModelePDFSuppliersOrders //pdf_pagehead($pdf,$outputlangs,$this->page_hauteur); //Affiche le filigrane brouillon - Print Draft Watermark - /*if($object->statut==0 && getDolGlobalString('COMMANDE_DRAFT_WATERMARK')) + /*if($object->statut==0 && getDolGlobalString('COMMANDE_DRAFT_WATERMARK')) { pdf_watermark($pdf,$outputlangs,$this->page_hauteur,$this->page_largeur,'mm',getDolGlobalString('COMMANDE_DRAFT_WATERMARK')); }*/ From ae3b9970dd60791dd86a53774aeafc5004145e5e Mon Sep 17 00:00:00 2001 From: Milen Karaganski Date: Sat, 17 Dec 2022 18:02:42 +0200 Subject: [PATCH 0161/1128] fix html.form.class.php --- htdocs/core/class/html.form.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 6df62ded8bd..9e26170f214 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -7286,7 +7286,7 @@ class Form $out .= $this->selectProjectsList($selected, $htmlname, $filtertype, $limit, $status, 0, $socid, $showempty, $forcecombo, $morecss); } - if (!empty($nooutput)) print $out; + if (empty($nooutput)) print $out; else return $out; } From 748d8cdc542dcc6dc3134fd5c35cf681292668d0 Mon Sep 17 00:00:00 2001 From: daraelmin Date: Sat, 17 Dec 2022 17:10:46 +0100 Subject: [PATCH 0162/1128] Fix Darkmode bgcolor for warning --- htdocs/theme/eldy/global.inc.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 6102e8584e8..73e5ed5d666 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -53,6 +53,7 @@ --productlinestockod: #002200; --productlinestocktoolow: #884400; --infoboxmoduleenabledbgcolor : linear-gradient(0.4turn, #fff, #fff, #fff, #e4efe8); + --tablevalidbgcolor: rgb(252, 248, 227); } global->THEME_DARKMODEENABLED)) { --amountpaymentcomplete:rgb(101,184,77); --amountremaintopaybackcolor:rbg(245,130,46); --infoboxmoduleenabledbgcolor : linear-gradient(0.4turn, #000, #000, #000, #274231); + --tablevalidbgcolor: rgb(80, 64, 33); } body, button { @@ -5001,7 +5003,7 @@ table.valid { padding-right: 4px; padding-bottom: 4px; margin: 0px 0px; - background: #fcf8e3; + background: var(--tablevalidbgcolor); } .validtitre { From e444cbfbd42d47c72f5ad49f14ad05434bf51ef0 Mon Sep 17 00:00:00 2001 From: daraelmin Date: Sat, 17 Dec 2022 17:20:34 +0100 Subject: [PATCH 0163/1128] Fix Darkmode color of menu without link --- htdocs/theme/eldy/global.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 6102e8584e8..e1d43513ff3 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -3164,7 +3164,7 @@ a.vmenu:link, a.vmenu:visited { a.vsmenu:link, a.vsmenu:visited, a.vsmenu:hover, a.vsmenu:active, span.vsmenu { font-family: ; text-align: ; - color: #202020; + color: var(--colortextbackvmenu); margin: 1px 1px 1px 6px; } span.vsmenudisabled, font.vsmenudisabled { From 6a658499e736432506d476ebb365bcbbbe4b536d Mon Sep 17 00:00:00 2001 From: daraelmin Date: Sat, 17 Dec 2022 21:16:03 +0100 Subject: [PATCH 0164/1128] Fix #23077 - Cannot update subscription note --- htdocs/adherents/subscription/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/adherents/subscription/card.php b/htdocs/adherents/subscription/card.php index 5967d670856..37d0f2a9b5b 100644 --- a/htdocs/adherents/subscription/card.php +++ b/htdocs/adherents/subscription/card.php @@ -108,7 +108,7 @@ if ($user->rights->adherent->cotisation->creer && $action == 'update' && !$cance $object->dateh = dol_mktime($_POST['datesubhour'], $_POST['datesubmin'], 0, $_POST['datesubmonth'], $_POST['datesubday'], $_POST['datesubyear']); $object->datef = dol_mktime($_POST['datesubendhour'], $_POST['datesubendmin'], 0, $_POST['datesubendmonth'], $_POST['datesubendday'], $_POST['datesubendyear']); $object->fk_type = $typeid; - $object->note = $note; + $object->note_public = $note; $object->amount = $amount; //print 'datef='.$object->datef.' '.$_POST['datesubendday']; From 49de4dcda69c97d4162d32322a9b9a63089ec935 Mon Sep 17 00:00:00 2001 From: Manny Isles Date: Mon, 19 Dec 2022 15:37:35 +0800 Subject: [PATCH 0165/1128] I think it should be $obj->rowid I think it should be $obj->rowid because when its `$obj->id` then it goes nowhere. --- htdocs/accountancy/admin/subaccount.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/accountancy/admin/subaccount.php b/htdocs/accountancy/admin/subaccount.php index c9f78596bcd..4f2274269d8 100644 --- a/htdocs/accountancy/admin/subaccount.php +++ b/htdocs/accountancy/admin/subaccount.php @@ -408,7 +408,7 @@ if ($resql) { $s .= ''.$langs->trans("Supplier").''; } elseif ($obj->type == 3) { // User - $s .= ''.$langs->trans("Employee").''; + $s .= ''.$langs->trans("Employee").''; } print $s; print ''; From 48b4caaa70178498146b230b9c1fceb826502c1c Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Mon, 19 Dec 2022 09:41:39 +0000 Subject: [PATCH 0166/1128] Fixing style errors. --- htdocs/bom/tpl/objectline_view.tpl.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/bom/tpl/objectline_view.tpl.php b/htdocs/bom/tpl/objectline_view.tpl.php index f9b39c517e9..85bd4d6b02a 100644 --- a/htdocs/bom/tpl/objectline_view.tpl.php +++ b/htdocs/bom/tpl/objectline_view.tpl.php @@ -228,7 +228,7 @@ if ($resql) { } else { print ''; print ''; print ''; print ''; From f90b887ec257c2580c9a8db36c4f39254fd8be13 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Mon, 19 Dec 2022 13:48:08 +0100 Subject: [PATCH 0167/1128] NEW mode view for list adherent --- htdocs/adherents/class/adherent.class.php | 36 ++ htdocs/adherents/list.php | 541 +++++++++++----------- 2 files changed, 319 insertions(+), 258 deletions(-) diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php index 4c68b3e91ec..ec2cd91813d 100644 --- a/htdocs/adherents/class/adherent.class.php +++ b/htdocs/adherents/class/adherent.class.php @@ -3167,4 +3167,40 @@ class Adherent extends CommonObject return $nbko; } + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + + $return = '
'; + $return .= '
'; + $return .= ''; + + if (property_exists($this, 'photo') || !empty($this->photo)) { + $return.= Form::showphoto('memberphoto', $this, 0, 60, 0, 'photokanban photoref photowithmargin photologintooltip', 'small', 0, 1); + } else { + $return .= img_picto('', 'user'); + } + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).''; + if (property_exists($this, 'type')) { + $return .= '
'.$this->type.''; + } + if (method_exists($this, 'getmorphylib')) { + $return .= '
'.$this->getmorphylib('', 2).''; + } + if (method_exists($this, 'getLibStatut')) { + $return .= '
'.$this->getLibStatut(5).'
'; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } diff --git a/htdocs/adherents/list.php b/htdocs/adherents/list.php index c2b81860210..6ef559deb75 100644 --- a/htdocs/adherents/list.php +++ b/htdocs/adherents/list.php @@ -47,6 +47,7 @@ $show_files = GETPOST('show_files', 'int'); $confirm = GETPOST('confirm', 'alpha'); $toselect = GETPOST('toselect', 'array'); $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'memberslist'; // To manage different context of search +$mode = GETPOST('mode', 'alpha'); // Search fields @@ -535,6 +536,9 @@ if ($search_type > 0) { } $param = ''; +if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); +} if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -636,6 +640,8 @@ if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'pr $massactionbutton = $form->selectMassAction('', $arrayofmassactions); $newcardbutton = ''; +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); if ($user->hasRight('adherent', 'creer')) { $newcardbutton .= dolGetButtonTitle($langs->trans('NewMember'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/adherents/card.php?action=create'); } @@ -650,6 +656,8 @@ print ''; print ''; print ''; print ''; +print ''; + print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, $object->picto, 0, $newcardbutton, '', $limit, 0, 0, 1); @@ -988,276 +996,293 @@ while ($i < min($num, $limit)) { } $memberstatic->company = $companyname; - print '
'; - - // Action column - if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { - print ''; - } - - if (!empty($conf->global->MAIN_SHOW_TECHNICAL_ID)) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Ref - if (!empty($arrayfields['d.ref']['checked'])) { - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Civility - if (!empty($arrayfields['d.civility']['checked'])) { - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Firstname - if (!empty($arrayfields['d.firstname']['checked'])) { - print '\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Lastname - if (!empty($arrayfields['d.lastname']['checked'])) { - print '\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Gender - if (!empty($arrayfields['d.gender']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Company - if (!empty($arrayfields['d.company']['checked'])) { - print '\n"; - } - // Login - if (!empty($arrayfields['d.login']['checked'])) { - print '\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Nature (Moral/Physical) - if (!empty($arrayfields['d.morphy']['checked'])) { - print '\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Type label - if (!empty($arrayfields['t.libelle']['checked'])) { $membertypestatic->id = $obj->type_id; $membertypestatic->label = $obj->type; - print ''; - if (!$i) { - $totalarray['nbfield']++; + $memberstatic->type = $membertypestatic->label; + $memberstatic->photo = $obj->photo; + // Output Kanban + print $memberstatic->getKanbanView(''); + if ($i == (min($num, $limit) - 1)) { + print ''; + print ''; } - } - // Address - if (!empty($arrayfields['d.address']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Zip - if (!empty($arrayfields['d.zip']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Town - if (!empty($arrayfields['d.town']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // State - if (!empty($arrayfields['state.nom']['checked'])) { - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Country - if (!empty($arrayfields['country.code_iso']['checked'])) { - $tmparray = getCountry($obj->country, 'all'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Phone pro - if (!empty($arrayfields['d.phone']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Phone perso - if (!empty($arrayfields['d.phone_perso']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Phone mobile - if (!empty($arrayfields['d.phone_mobile']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // EMail - if (!empty($arrayfields['d.email']['checked'])) { - print '\n"; - } - // End of subscription date - $datefin = $db->jdate($obj->datefin); - if (!empty($arrayfields['d.datefin']['checked'])) { - print ''; + + // Action column + if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + } + + if (!empty($conf->global->MAIN_SHOW_TECHNICAL_ID)) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Ref + if (!empty($arrayfields['d.ref']['checked'])) { + print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Civility + if (!empty($arrayfields['d.civility']['checked'])) { + print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Firstname + if (!empty($arrayfields['d.firstname']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Lastname + if (!empty($arrayfields['d.lastname']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Gender + if (!empty($arrayfields['d.gender']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Company + if (!empty($arrayfields['d.company']['checked'])) { + print '\n"; + } + // Login + if (!empty($arrayfields['d.login']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Nature (Moral/Physical) + if (!empty($arrayfields['d.morphy']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Type label + if (!empty($arrayfields['t.libelle']['checked'])) { + $membertypestatic->id = $obj->type_id; + $membertypestatic->label = $obj->type; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Address + if (!empty($arrayfields['d.address']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Zip + if (!empty($arrayfields['d.zip']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Town + if (!empty($arrayfields['d.town']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // State + if (!empty($arrayfields['state.nom']['checked'])) { + print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Country + if (!empty($arrayfields['country.code_iso']['checked'])) { + $tmparray = getCountry($obj->country, 'all'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Phone pro + if (!empty($arrayfields['d.phone']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Phone perso + if (!empty($arrayfields['d.phone_perso']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Phone mobile + if (!empty($arrayfields['d.phone_mobile']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // EMail + if (!empty($arrayfields['d.email']['checked'])) { + print '\n"; + } + // End of subscription date + $datefin = $db->jdate($obj->datefin); + if (!empty($arrayfields['d.datefin']['checked'])) { + print ''; + } + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Date creation + if (!empty($arrayfields['d.datec']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; } } - print ''; - } - // Extra fields - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - // Date creation - if (!empty($arrayfields['d.datec']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Birth - if (!empty($arrayfields['d.birth']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Date modification - if (!empty($arrayfields['d.tms']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Status - if (!empty($arrayfields['d.statut']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - if (!empty($arrayfields['d.import_key']['checked'])) { - print '\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Action column - if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { - print ''; + if (!$i) { + $totalarray['nbfield']++; } - print ''; } - print ''; - } - if (!$i) { - $totalarray['nbfield']++; - } + // Date modification + if (!empty($arrayfields['d.tms']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Status + if (!empty($arrayfields['d.statut']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + if (!empty($arrayfields['d.import_key']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Action column + if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + } + if (!$i) { + $totalarray['nbfield']++; + } - print ''."\n"; + print ''."\n"; + } $i++; } From 517af503ed225d26e7a76df5e9891031fff2aa91 Mon Sep 17 00:00:00 2001 From: VESSILLER Date: Mon, 19 Dec 2022 14:27:22 +0100 Subject: [PATCH 0168/1128] NEW category of operation for crabe PDF model --- .../modules/facture/doc/pdf_crabe.modules.php | 57 +++++++++++++++++++ .../facture/doc/pdf_sponge.modules.php | 20 ++++--- 2 files changed, 68 insertions(+), 9 deletions(-) diff --git a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php index ee4cc9b5d0d..30a61fbb1d3 100644 --- a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php @@ -132,6 +132,11 @@ class pdf_crabe extends ModelePDFFactures */ public $posxprogress; + /** + * @var int Category of operation + */ + public $categoryOfOperation = -1; // unknown by default + /** * Constructor @@ -402,11 +407,37 @@ class pdf_crabe extends ModelePDFFactures $pdf->SetMargins($this->marge_gauche, $this->marge_haute, $this->marge_droite); // Left, Top, Right // Set $this->atleastonediscount if you have at least one discount + // and determine category of operation + $categoryOfOperation = 0; + $nbProduct = 0; + $nbService = 0; for ($i = 0; $i < $nblines; $i++) { if ($object->lines[$i]->remise_percent) { $this->atleastonediscount++; } + + // determine category of operation + if ($categoryOfOperation < 2) { + $lineProductType = $object->lines[$i]->product_type; + if ($lineProductType == Product::TYPE_PRODUCT) { + $nbProduct++; + } elseif ($lineProductType == Product::TYPE_SERVICE) { + $nbService++; + } + if ($nbProduct > 0 && $nbService > 0) { + // mixed products and services + $categoryOfOperation = 2; + } + } } + // determine category of operation + if ($categoryOfOperation <= 0) { + // only services + if ($nbProduct == 0 && $nbService > 0) { + $categoryOfOperation = 1; + } + } + $this->categoryOfOperation = $categoryOfOperation; if (empty($this->atleastonediscount)) { // retrieve space not used by discount $delta = ($this->posxprogress - $this->posxdiscount); $this->posxpicture += $delta; @@ -1128,6 +1159,10 @@ class pdf_crabe extends ModelePDFFactures } $posxval = 52; + $posxend = 110; // End of x for text on left side + if ($this->page_largeur < 210) { // To work with US executive format + $posxend -= 10; + } // Show payments conditions if ($object->type != 2 && ($object->cond_reglement_code || $object->cond_reglement)) { @@ -1145,6 +1180,21 @@ class pdf_crabe extends ModelePDFFactures $posy = $pdf->GetY() + 3; // We need spaces for 2 lines payment conditions } + // Show category of operations + if (getDolGlobalInt('INVOICE_CATEGORY_OF_OPERATION') == 2 && $this->categoryOfOperation >= 0) { + $pdf->SetFont('', 'B', $default_font_size - 2); + $pdf->SetXY($this->marge_gauche, $posy); + $categoryOfOperationTitle = $outputlangs->transnoentities("MentionCategoryOfOperations").' : '; + $pdf->MultiCell($posxval - $this->marge_gauche, 4, $categoryOfOperationTitle, 0, 'L'); + + $pdf->SetFont('', '', $default_font_size - 2); + $pdf->SetXY($posxval, $posy); + $categoryOfOperationLabel = $outputlangs->transnoentities("MentionCategoryOfOperations" . $this->categoryOfOperation); + $pdf->MultiCell($posxend - $posxval, 4, $categoryOfOperationLabel, 0, 'L'); + + $posy = $pdf->GetY() + 3; // for 2 lines + } + if ($object->type != 2) { // Check a payment mode is defined if (empty($object->mode_reglement_code) @@ -1659,6 +1709,13 @@ class pdf_crabe extends ModelePDFFactures $pdf->SetFont('', '', $default_font_size - 2); if (empty($hidetop)) { + // Show category of operations + if (getDolGlobalInt('INVOICE_CATEGORY_OF_OPERATION') == 1 && $this->categoryOfOperation >= 0) { + $categoryOfOperations = $outputlangs->transnoentities("MentionCategoryOfOperations") . ' : ' . $outputlangs->transnoentities("MentionCategoryOfOperations" . $this->categoryOfOperation); + $pdf->SetXY($this->marge_gauche, $tab_top - 4); + $pdf->MultiCell(($pdf->GetStringWidth($categoryOfOperations)) + 4, 2, $categoryOfOperations); + } + $titre = $outputlangs->transnoentities("AmountInCurrency", $outputlangs->transnoentitiesnoconv("Currency".$currency)); $pdf->SetXY($this->page_largeur - $this->marge_droite - ($pdf->GetStringWidth($titre) + 3), $tab_top - 4); $pdf->MultiCell(($pdf->GetStringWidth($titre) + 3), 2, $titre); diff --git a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php index adf47af3cce..072ddb566bd 100644 --- a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php @@ -445,15 +445,17 @@ class pdf_sponge extends ModelePDFFactures } // determine category of operation - $lineProductType = $object->lines[$i]->product_type; - if ($lineProductType == Product::TYPE_PRODUCT) { - $nbProduct++; - } elseif ($lineProductType == Product::TYPE_SERVICE) { - $nbService++; - } - if ($nbProduct > 0 && $nbService > 0) { - // mixed products and services - $categoryOfOperation = 2; + if ($categoryOfOperation < 2) { + $lineProductType = $object->lines[$i]->product_type; + if ($lineProductType == Product::TYPE_PRODUCT) { + $nbProduct++; + } elseif ($lineProductType == Product::TYPE_SERVICE) { + $nbService++; + } + if ($nbProduct > 0 && $nbService > 0) { + // mixed products and services + $categoryOfOperation = 2; + } } } // determine category of operation From abd5a86f348256fa6ab2eb09b93bed678f0ff9d2 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Mon, 19 Dec 2022 15:19:12 +0100 Subject: [PATCH 0169/1128] mode Kanban for subscription list --- htdocs/adherents/class/subscription.class.php | 32 ++ htdocs/adherents/subscription/list.php | 275 ++++++++++-------- 2 files changed, 187 insertions(+), 120 deletions(-) diff --git a/htdocs/adherents/class/subscription.class.php b/htdocs/adherents/class/subscription.class.php index b3cfe027197..411fdb2181f 100644 --- a/htdocs/adherents/class/subscription.class.php +++ b/htdocs/adherents/class/subscription.class.php @@ -505,4 +505,36 @@ class Subscription extends CommonObject dol_print_error($this->db); } } + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + $return .= ''; + + $return .= '
'; + $return .= ''.(property_exists($this, 'fk_adherent')? $this->fk_adherent: $this->ref ).''; + if (property_exists($this, 'dateh') || property_exists($this, 'datef')) { + $return .= '
'.dol_print_date($this->dateh, 'day').' - '.dol_print_date($this->datef, 'day').''; + } + + if (property_exists($this, 'fk_bank')) { + $return .= '
'.$this->fk_bank.''; + } + if (property_exists($this, 'amount')) { + $return .= '
'.price($this->amount).'
'; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } diff --git a/htdocs/adherents/subscription/list.php b/htdocs/adherents/subscription/list.php index 1523bd4ee90..5aa19c6c6d0 100644 --- a/htdocs/adherents/subscription/list.php +++ b/htdocs/adherents/subscription/list.php @@ -37,6 +37,8 @@ $massaction = GETPOST('massaction', 'alpha'); $confirm = GETPOST('confirm', 'alpha'); $toselect = GETPOST('toselect', 'array'); $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'subscriptionlist'; // To manage different context of search +$mode = GETPOST('mode', 'alpha'); + $statut = (GETPOSTISSET("statut") ?GETPOST("statut", "alpha") : 1); $search_ref = GETPOST('search_ref', 'alpha'); @@ -253,6 +255,9 @@ if (!empty($date_select)) { } $param = ''; +if (!empty($mode)) { + $param .='&mode='.urlencode($mode); +} if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -298,6 +303,9 @@ if (in_array($massaction, array('presend', 'predelete'))) { $massactionbutton = $form->selectMassAction('', $arrayofmassactions); $newcardbutton = ''; +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); + if ($user->rights->adherent->cotisation->creer) { $newcardbutton .= dolGetButtonTitle($langs->trans('NewSubscription'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/adherents/list.php?status=-1,1'); } @@ -313,6 +321,8 @@ print ''; print ''; print ''; print ''; +print ''; + print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, $subscription->picto, 0, $newcardbutton, '', $limit, 0, 0, 1); @@ -506,144 +516,169 @@ while ($i < min($num, $limit)) { $adht->fetch($typeid); $adherent->need_subscription = $adht->subscription; - - print '
'; - - // Ref - if (!empty($arrayfields['d.ref']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; + + if ($mode == 'kanban') { + if ($i == 0) { + print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Lastname - if (!empty($arrayfields['d.lastname']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Firstname - if (!empty($arrayfields['d.firstname']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Login - if (!empty($arrayfields['d.login']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Label - if (!empty($arrayfields['t.libelle']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Banque - if (!empty($arrayfields['d.bank']['checked'])) { - print '\n"; - if (!$i) { - $totalarray['nbfield']++; + // Output Kanban + print $subscription->getKanbanView(''); + if ($i == (min($num, $limit) - 1)) { + print ''; + print ''; } } - // Date start - if (!empty($arrayfields['c.dateadh']['checked'])) { - print '\n"; - if (!$i) { - $totalarray['nbfield']++; + else { + print ''; + + // Ref + if (!empty($arrayfields['d.ref']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } - } - // Date end - if (!empty($arrayfields['c.datef']['checked'])) { - print '\n"; - if (!$i) { - $totalarray['nbfield']++; + // Type + if (!empty($arrayfields['d.fk_type']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } - } - // Price - if (!empty($arrayfields['d.amount']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; + + // Lastname + if (!empty($arrayfields['d.lastname']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'd.amount'; + // Firstname + if (!empty($arrayfields['d.firstname']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } - if (empty($totalarray['val']['d.amount'])) { - $totalarray['val']['d.amount'] = $obj->subscription; - } else { - $totalarray['val']['d.amount'] += $obj->subscription; + + // Login + if (!empty($arrayfields['d.login']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Label + if (!empty($arrayfields['t.libelle']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Banque + if (!empty($arrayfields['d.bank']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Date start + if (!empty($arrayfields['c.dateadh']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Date end + if (!empty($arrayfields['c.datef']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Price + if (!empty($arrayfields['d.amount']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'd.amount'; + } + if (empty($totalarray['val']['d.amount'])) { + $totalarray['val']['d.amount'] = $obj->subscription; + } else { + $totalarray['val']['d.amount'] += $obj->subscription; + } + } + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Date creation + if (!empty($arrayfields['c.datec']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Date modification + if (!empty($arrayfields['c.tms']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Action column + print ''; if (!$i) { $totalarray['nbfield']++; } - } - // Date modification - if (!empty($arrayfields['c.tms']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Action column - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - print "\n"; + print "\n"; + } $i++; } From 0c75e5bb2d81adb5cfa356e528c0cf77ec2c94c2 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Mon, 19 Dec 2022 15:19:18 +0100 Subject: [PATCH 0170/1128] mode Kanban for subscription list --- htdocs/adherents/class/subscription.class.php | 2 +- htdocs/adherents/subscription/list.php | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/htdocs/adherents/class/subscription.class.php b/htdocs/adherents/class/subscription.class.php index 411fdb2181f..12e19fd9c3a 100644 --- a/htdocs/adherents/class/subscription.class.php +++ b/htdocs/adherents/class/subscription.class.php @@ -525,7 +525,7 @@ class Subscription extends CommonObject if (property_exists($this, 'dateh') || property_exists($this, 'datef')) { $return .= '
'.dol_print_date($this->dateh, 'day').' - '.dol_print_date($this->datef, 'day').''; } - + if (property_exists($this, 'fk_bank')) { $return .= '
'.$this->fk_bank.''; } diff --git a/htdocs/adherents/subscription/list.php b/htdocs/adherents/subscription/list.php index 5aa19c6c6d0..501bd9c80e5 100644 --- a/htdocs/adherents/subscription/list.php +++ b/htdocs/adherents/subscription/list.php @@ -516,13 +516,13 @@ while ($i < min($num, $limit)) { $adht->fetch($typeid); $adherent->need_subscription = $adht->subscription; - + if ($mode == 'kanban') { if ($i == 0) { print '
'; } - } - - else { + } else { print ''; // Ref From 55b51b94f11c89c0d3f116ccce7b1b01a94171ab Mon Sep 17 00:00:00 2001 From: Braito Date: Tue, 20 Dec 2022 10:13:47 +0100 Subject: [PATCH 0171/1128] php 8 warning --- htdocs/projet/card.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/projet/card.php b/htdocs/projet/card.php index aabf14e8655..c4b5c29a149 100644 --- a/htdocs/projet/card.php +++ b/htdocs/projet/card.php @@ -489,11 +489,11 @@ llxHeader("", $title, $help_url); $titleboth = $langs->trans("LeadsOrProjects"); $titlenew = $langs->trans("NewLeadOrProject"); // Leads and opportunities by default -if (empty($conf->global->PROJECT_USE_OPPORTUNITIES)) { +if (!getDolGlobalInt('PROJECT_USE_OPPORTUNITIES')) { $titleboth = $langs->trans("Projects"); $titlenew = $langs->trans("NewProject"); } -if ($conf->global->PROJECT_USE_OPPORTUNITIES == 2) { // 2 = leads only +if (isset($conf->global->PROJECT_USE_OPPORTUNITIES) && $conf->global->PROJECT_USE_OPPORTUNITIES == 2) { // 2 = leads only $titleboth = $langs->trans("Leads"); $titlenew = $langs->trans("NewLead"); } From b3aef891e2788c62155fb0a54449bed5aa724f85 Mon Sep 17 00:00:00 2001 From: Francis Appels Date: Tue, 20 Dec 2022 10:24:43 +0100 Subject: [PATCH 0172/1128] FIX trigger LINEORDER_DELETE, extrafields should be removed after delete trigger. --- htdocs/commande/class/commande.class.php | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 73988594e6f..f90fac176dc 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -4331,16 +4331,6 @@ class OrderLine extends CommonOrderLine dol_syslog("OrderLine::delete", LOG_DEBUG); $resql = $this->db->query($sql); if ($resql) { - // Remove extrafields - if (!$error) { - $this->id = $this->rowid; - $result = $this->deleteExtraFields(); - if ($result < 0) { - $error++; - dol_syslog(get_class($this)."::delete error -4 ".$this->error, LOG_ERR); - } - } - if (!$error && !$notrigger) { // Call trigger $result = $this->call_trigger('LINEORDER_DELETE', $user); @@ -4350,6 +4340,15 @@ class OrderLine extends CommonOrderLine // End call triggers } + // Remove extrafields + if (!$error) { + $result = $this->deleteExtraFields(); + if ($result < 0) { + $error++; + dol_syslog(get_class($this)."::delete error -4 ".$this->error, LOG_ERR); + } + } + if (!$error) { $this->db->commit(); return 1; From a08c468a5e7f247e80d0a145333704aa04c65e7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ili=C3=A8s=20BENYAHIA?= Date: Tue, 20 Dec 2022 11:00:41 +0100 Subject: [PATCH 0173/1128] When no language selected, value is 0 so it enters in the condition filter_lang != '' anyway --- htdocs/core/modules/mailings/contacts1.modules.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/htdocs/core/modules/mailings/contacts1.modules.php b/htdocs/core/modules/mailings/contacts1.modules.php index decbc81716b..38a82907124 100644 --- a/htdocs/core/modules/mailings/contacts1.modules.php +++ b/htdocs/core/modules/mailings/contacts1.modules.php @@ -408,7 +408,7 @@ class mailing_contacts1 extends MailingTargets } // Filter on language - if ($filter_lang != '') { + if (!empty($filter_lang)) { $sql .= " AND sp.default_lang = '".$this->db->escape($filter_lang)."'"; } @@ -439,7 +439,6 @@ class mailing_contacts1 extends MailingTargets $sql .= " ORDER BY sp.email"; // print "wwwwwwx".$sql; - // Stocke destinataires dans cibles $result = $this->db->query($sql); if ($result) { From aed3f841bc1424304bc44e71449456d38ea3a2f7 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Tue, 20 Dec 2022 11:27:55 +0100 Subject: [PATCH 0174/1128] New View mode for Adherent Type list --- .../adherents/class/adherent_type.class.php | 42 +++++++++++ htdocs/adherents/type.php | 71 ++++++++++++------- 2 files changed, 89 insertions(+), 24 deletions(-) diff --git a/htdocs/adherents/class/adherent_type.class.php b/htdocs/adherents/class/adherent_type.class.php index 4516b132982..25211f11bd9 100644 --- a/htdocs/adherents/class/adherent_type.class.php +++ b/htdocs/adherents/class/adherent_type.class.php @@ -927,4 +927,46 @@ class AdherentType extends CommonObject return ''; } + + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return void HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $langs,$user; + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).''; + if ($user->rights->adherent->configurer) { + $return .= 'ref.'">'.img_edit().''; + } else { + $return .= ' '; + } + if (property_exists($this, 'vote')) { + $return .= '
'.$langs->trans("VoteAllowed").' : '.yn($this->vote).''; + } + if (property_exists($this, 'amount')) { + if (is_null($this->amount) || $this->amount === '') { + $return .= '
'; + } else { + $return .= '
'.$langs->trans("Amount").''; + $return .= ' : '.price($this->amount).''; + } + } + if (method_exists($this, 'getLibStatut')) { + $return .= '
'.$this->getLibStatut(5).'
'; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + print $return; + } } diff --git a/htdocs/adherents/type.php b/htdocs/adherents/type.php index 257e7266e5a..6a2dbdb125d 100644 --- a/htdocs/adherents/type.php +++ b/htdocs/adherents/type.php @@ -44,6 +44,7 @@ $action = GETPOST('action', 'aZ09'); $cancel = GETPOST('cancel', 'alpha'); $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : str_replace('_', '', basename(dirname(__FILE__)).basename(__FILE__, '.php')); // To manage different context of search $backtopage = GETPOST('backtopage', 'alpha'); +$mode = GETPOST('mode', 'alopha'); $sall = GETPOST("sall", "alpha"); $filter = GETPOST("filter", 'alpha'); @@ -248,6 +249,9 @@ if (!$rowid && $action != 'create' && $action != 'edit') { $i = 0; $param = ''; + if (!empty($mode)) { + $param .= '&mode'.urlencode($mode); + } if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.$contextpage; } @@ -256,6 +260,9 @@ if (!$rowid && $action != 'create' && $action != 'edit') { } $newcardbutton = ''; + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); + if ($user->rights->adherent->configurer) { $newcardbutton .= dolGetButtonTitle($langs->trans('NewMemberType'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/adherents/type.php?action=create'); } @@ -269,6 +276,8 @@ if (!$rowid && $action != 'create' && $action != 'edit') { print ''; print ''; print ''; + print ''; + print_barre_liste($langs->trans("MembersTypes"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'members', 0, $newcardbutton, '', $limit, 0, 0, 1); @@ -302,32 +311,46 @@ if (!$rowid && $action != 'create' && $action != 'edit') { $membertype->amount = $objp->amount; $membertype->caneditamount = $objp->caneditamount; - print '
'; - print ''; - print ''; - print ''; + } } else { - print $langs->trans("MorAndPhy"); + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + if ($user->rights->adherent->configurer) { + print ''; + } else { + print ''; + } + print ""; } - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - if ($user->rights->adherent->configurer) { - print ''; - } else { - print ''; - } - print ""; $i++; } From ec32d284eb0acb59ff9bc720f6170934579006d8 Mon Sep 17 00:00:00 2001 From: Florian Date: Tue, 20 Dec 2022 11:31:44 +0100 Subject: [PATCH 0175/1128] FIX : Product list in setup.php in new Module --- htdocs/modulebuilder/template/admin/setup.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/htdocs/modulebuilder/template/admin/setup.php b/htdocs/modulebuilder/template/admin/setup.php index 1c46028b142..9ee07b3a1fd 100644 --- a/htdocs/modulebuilder/template/admin/setup.php +++ b/htdocs/modulebuilder/template/admin/setup.php @@ -55,6 +55,8 @@ global $langs, $user; // Libraries require_once DOL_DOCUMENT_ROOT."/core/lib/admin.lib.php"; require_once '../lib/mymodule.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; + //require_once "../class/myclass.class.php"; // Translations From 54bd44e14af1744946b0d8d8148080b84be49422 Mon Sep 17 00:00:00 2001 From: kkhelifa Date: Tue, 20 Dec 2022 11:43:42 +0100 Subject: [PATCH 0176/1128] NEW : notify also the contributor affected to a ticket if a new message public is post (add global TICKET_PUBLIC_NOTIFICATION_NEW_MESSAGE_ALSO_CONTRIBUTOR) --- htdocs/ticket/class/ticket.class.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/htdocs/ticket/class/ticket.class.php b/htdocs/ticket/class/ticket.class.php index 2a3160b3b67..10c0541c168 100644 --- a/htdocs/ticket/class/ticket.class.php +++ b/htdocs/ticket/class/ticket.class.php @@ -2449,6 +2449,16 @@ class Ticket extends CommonObject $assigned_user_dont_have_email = $assigned_user->getFullName($langs); } } + if (!empty($conf->global->TICKET_PUBLIC_NOTIFICATION_NEW_MESSAGE_ALSO_CONTRIBUTOR)) { + $contactList = $object->liste_contact(-1, 'internal', 0, 'CONTRIBUTOR'); + if (is_array($contactList)) { + foreach ($contactList as $contactArray) { + if (!empty($contactArray['email'])) { + $sendto[] = dolGetFirstLastname($contactArray['firstname'], $contactArray['lastname']) . " <" . $contactArray['email'] . ">"; + } + } + } + } if (empty($sendto)) { if (!empty($conf->global->TICKET_PUBLIC_NOTIFICATION_NEW_MESSAGE_DEFAULT_EMAIL)) { $sendto[] = $conf->global->TICKET_PUBLIC_NOTIFICATION_NEW_MESSAGE_DEFAULT_EMAIL; From 6890b18189c453d8485a92d939be34cf125a5ba6 Mon Sep 17 00:00:00 2001 From: kkhelifa Date: Tue, 20 Dec 2022 11:54:02 +0100 Subject: [PATCH 0177/1128] NEW : set ticket status to answered if the client has answered from the public interface --- htdocs/ticket/class/ticket.class.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/htdocs/ticket/class/ticket.class.php b/htdocs/ticket/class/ticket.class.php index 2a3160b3b67..ca78b2fc2fe 100644 --- a/htdocs/ticket/class/ticket.class.php +++ b/htdocs/ticket/class/ticket.class.php @@ -2677,7 +2677,10 @@ class Ticket extends CommonObject } // Set status to "answered" if not set yet, but only if internal user and not private message - if ($object->status < 3 && !$user->socid && !$private) { + // Or set status to "answered" if the client has answered and if the ticket has started + if (($object->status < self::STATUS_IN_PROGRESS && !$user->socid && !$private) || + ($object->status > self::STATUS_IN_PROGRESS && $public_area) + ) { $object->setStatut(3); } return 1; From 2f64eaff0514d8d3b1506fdbf26c485f000cfeb1 Mon Sep 17 00:00:00 2001 From: Florian Date: Tue, 20 Dec 2022 12:25:20 +0100 Subject: [PATCH 0178/1128] FIX : CI --- htdocs/modulebuilder/template/admin/setup.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/modulebuilder/template/admin/setup.php b/htdocs/modulebuilder/template/admin/setup.php index 9ee07b3a1fd..7bf97081341 100644 --- a/htdocs/modulebuilder/template/admin/setup.php +++ b/htdocs/modulebuilder/template/admin/setup.php @@ -57,6 +57,7 @@ require_once DOL_DOCUMENT_ROOT."/core/lib/admin.lib.php"; require_once '../lib/mymodule.lib.php'; require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; + //require_once "../class/myclass.class.php"; // Translations From a4d5a7ed1f14ef383515c5f206436464f2f672ca Mon Sep 17 00:00:00 2001 From: Mathieu Date: Tue, 20 Dec 2022 12:36:50 +0100 Subject: [PATCH 0179/1128] FIX#23072 --- htdocs/core/tpl/card_presend.tpl.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/tpl/card_presend.tpl.php b/htdocs/core/tpl/card_presend.tpl.php index 2f6acb67ece..60e794ba7ca 100644 --- a/htdocs/core/tpl/card_presend.tpl.php +++ b/htdocs/core/tpl/card_presend.tpl.php @@ -70,7 +70,7 @@ if ($action == 'presend') { $outputlangs = new Translate('', $conf); $outputlangs->setDefaultLang($newlang); // Load traductions files required by page - $outputlangs->loadLangs(array('commercial', 'bills', 'orders', 'contracts', 'members', 'propal', 'products', 'supplier_proposal', 'interventions', 'receptions')); + $outputlangs->loadLangs(array('commercial', 'bills', 'orders', 'contracts', 'members', 'propal', 'products', 'supplier_proposal', 'interventions', 'receptions', 'sendings')); } $topicmail = ''; From a849283e378b883ec59c6702efa1dcd2cbc2010e Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Tue, 20 Dec 2022 12:41:54 +0100 Subject: [PATCH 0180/1128] update return type --- htdocs/adherents/class/adherent_type.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/adherents/class/adherent_type.class.php b/htdocs/adherents/class/adherent_type.class.php index 25211f11bd9..e0311aacd34 100644 --- a/htdocs/adherents/class/adherent_type.class.php +++ b/htdocs/adherents/class/adherent_type.class.php @@ -933,7 +933,7 @@ class AdherentType extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return void HTML Code for Kanban thumb. + * @return string HTML Code for Kanban thumb. */ public function getKanbanView($option = '') { @@ -967,6 +967,6 @@ class AdherentType extends CommonObject $return .= ''; $return .= ''; $return .= ''; - print $return; + return $return; } } From 0a454dfa7adabc0a53aa310b1d806c3488aab616 Mon Sep 17 00:00:00 2001 From: Ferran Marcet Date: Tue, 20 Dec 2022 12:44:38 +0100 Subject: [PATCH 0181/1128] New: Register project closing automatically in the agenda --- ...terface_50_modAgenda_ActionsAuto.class.php | 11 ++++++ .../mysql/data/llx_c_action_trigger.sql | 1 + .../install/mysql/migration/17.0.0-18.0.0.sql | 36 +++++++++++++++++++ htdocs/langs/eu_ES/projects.lang | 1 + 4 files changed, 49 insertions(+) create mode 100644 htdocs/install/mysql/migration/17.0.0-18.0.0.sql diff --git a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php index e3f798dec62..be78b6ecc18 100644 --- a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php +++ b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php @@ -5,6 +5,7 @@ * Copyright (C) 2013 Cedric GROSS * Copyright (C) 2014 Marcos García * Copyright (C) 2015 Bahfir Abbes + * Copyright (C) 2022 Ferran Marcet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -861,6 +862,16 @@ class InterfaceActionsAuto extends DolibarrTriggers // Parameters $object->sendtoid defined by caller //$object->sendtoid=0; + } elseif ($action == 'PROJECT_CLOSE') { + // Load translation files required by the page + $langs->loadLangs(array("agenda", "other", "projects")); + + if (empty($object->actionmsg2)) { + $object->actionmsg2 = $langs->transnoentities("ProjectClosedInDolibarr", $object->ref); + } + $object->actionmsg = $langs->transnoentities("ProjectClosedInDolibarr", $object->ref); + + $object->sendtoid = 0; } elseif ($action == 'TASK_CREATE') { // Project tasks // Load translation files required by the page diff --git a/htdocs/install/mysql/data/llx_c_action_trigger.sql b/htdocs/install/mysql/data/llx_c_action_trigger.sql index ae0ac58be62..98fa2523a3f 100644 --- a/htdocs/install/mysql/data/llx_c_action_trigger.sql +++ b/htdocs/install/mysql/data/llx_c_action_trigger.sql @@ -126,6 +126,7 @@ insert into llx_c_action_trigger (code,label,description,elementtype,rang) value insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROJECT_MODIFY','Project modified','Executed when a project is modified','project',142); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROJECT_DELETE','Project deleted','Executed when a project is deleted','project',143); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROJECT_SENTBYMAIL','Project sent by mail','Executed when a project is sent by email','project',144); +insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROJECT_CLOSE','Project closed','Executed when a project is closed','project',145); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_CREATE','Ticket created','Executed when a ticket is created','ticket',161); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_MODIFY','Ticket modified','Executed when a ticket is modified','ticket',163); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_ASSIGNED','Ticket assigned','Executed when a ticket is modified','ticket',164); diff --git a/htdocs/install/mysql/migration/17.0.0-18.0.0.sql b/htdocs/install/mysql/migration/17.0.0-18.0.0.sql new file mode 100644 index 00000000000..6bded10bec6 --- /dev/null +++ b/htdocs/install/mysql/migration/17.0.0-18.0.0.sql @@ -0,0 +1,36 @@ +-- +-- Be carefull to requests order. +-- This file must be loaded by calling /install/index.php page +-- when current version is 18.0.0 or higher. +-- +-- To restrict request to Mysql version x.y minimum use -- VMYSQLx.y +-- To restrict request to Pgsql version x.y minimum use -- VPGSQLx.y +-- To rename a table: ALTER TABLE llx_table RENAME TO llx_table_new; +-- To add a column: ALTER TABLE llx_table ADD COLUMN newcol varchar(60) NOT NULL DEFAULT '0' AFTER existingcol; +-- To rename a column: ALTER TABLE llx_table CHANGE COLUMN oldname newname varchar(60); +-- To drop a column: ALTER TABLE llx_table DROP COLUMN oldname; +-- To change type of field: ALTER TABLE llx_table MODIFY COLUMN name varchar(60); +-- To drop a foreign key: ALTER TABLE llx_table DROP FOREIGN KEY fk_name; +-- To create a unique index ALTER TABLE llx_table ADD UNIQUE INDEX uk_table_field (field); +-- To drop an index: -- VMYSQL4.1 DROP INDEX nomindex on llx_table; +-- To drop an index: -- VPGSQL8.2 DROP INDEX nomindex; +-- To make pk to be auto increment (mysql): +-- -- VMYSQL4.3 ALTER TABLE llx_table ADD PRIMARY KEY(rowid); +-- -- VMYSQL4.3 ALTER TABLE llx_table CHANGE COLUMN rowid rowid INTEGER NOT NULL AUTO_INCREMENT; +-- To make pk to be auto increment (postgres): +-- -- VPGSQL8.2 CREATE SEQUENCE llx_table_rowid_seq OWNED BY llx_table.rowid; +-- -- VPGSQL8.2 ALTER TABLE llx_table ADD PRIMARY KEY (rowid); +-- -- VPGSQL8.2 ALTER TABLE llx_table ALTER COLUMN rowid SET DEFAULT nextval('llx_table_rowid_seq'); +-- -- VPGSQL8.2 SELECT setval('llx_table_rowid_seq', MAX(rowid)) FROM llx_table; +-- To set a field as NULL: -- VMYSQL4.3 ALTER TABLE llx_table MODIFY COLUMN name varchar(60) NULL; +-- To set a field as NULL: -- VPGSQL8.2 ALTER TABLE llx_table ALTER COLUMN name DROP NOT NULL; +-- To set a field as NOT NULL: -- VMYSQL4.3 ALTER TABLE llx_table MODIFY COLUMN name varchar(60) NOT NULL; +-- To set a field as NOT NULL: -- VPGSQL8.2 ALTER TABLE llx_table ALTER COLUMN name SET NOT NULL; +-- To set a field as default NULL: -- VPGSQL8.2 ALTER TABLE llx_table ALTER COLUMN name SET DEFAULT NULL; +-- Note: fields with type BLOB/TEXT can't have default value. +-- To rebuild sequence for postgresql after insert by forcing id autoincrement fields: +-- -- VPGSQL8.2 SELECT dol_util_rebuild_sequences(); + +-- v18 + +insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROJECT_CLOSE','Project closed','Executed when a project is closed','project',145); diff --git a/htdocs/langs/eu_ES/projects.lang b/htdocs/langs/eu_ES/projects.lang index ee6916fbc5e..8224129060e 100644 --- a/htdocs/langs/eu_ES/projects.lang +++ b/htdocs/langs/eu_ES/projects.lang @@ -156,6 +156,7 @@ ProjectsAndTasksLines=Projects and tasks ProjectCreatedInDolibarr=Project %s created ProjectValidatedInDolibarr=Project %s validated ProjectModifiedInDolibarr=Project %s modified +ProjectClosedInDolibarr=Project %s closed TaskCreatedInDolibarr=Task %s created TaskModifiedInDolibarr=Task %s modified TaskDeletedInDolibarr=Task %s deleted From 47b71775ceadcfa1ff0d8a0c6368c2bbddc2f588 Mon Sep 17 00:00:00 2001 From: Nicolas Date: Tue, 20 Dec 2022 13:11:54 +0100 Subject: [PATCH 0182/1128] FIX #21711 --- htdocs/core/js/lib_foot.js.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/core/js/lib_foot.js.php b/htdocs/core/js/lib_foot.js.php index 764fde5097e..08b4e48c68d 100644 --- a/htdocs/core/js/lib_foot.js.php +++ b/htdocs/core/js/lib_foot.js.php @@ -111,6 +111,7 @@ if (!defined('JS_JQUERY_DISABLE_DROPDOWN')) { console.log("toggle dropdown dt a"); //$(this).parent().parent().find(\'dd ul\').slideToggle(\'fast\'); + $(".ulselectedfields").removeClass("open"); $(this).parent().parent().find(\'dd ul\').toggleClass("open"); if ($(this).parent().parent().find(\'dd ul\').hasClass("open")) { From 6288ef5261fb9558173d9b5180e2c6a6c83159f9 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Tue, 20 Dec 2022 13:35:53 +0100 Subject: [PATCH 0183/1128] Add View mode to Contact adress --- htdocs/contact/class/contact.class.php | 44 +++ htdocs/contact/list.php | 491 +++++++++++++------------ 2 files changed, 303 insertions(+), 232 deletions(-) diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php index d535da76199..c028c80b07b 100644 --- a/htdocs/contact/class/contact.class.php +++ b/htdocs/contact/class/contact.class.php @@ -2115,4 +2115,48 @@ class Contact extends CommonObject } return 0; } + + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $langs; + $return = '
'; + $return .= '
'; + $return .= ''; + //var_dump($this->photo);exit; + if (property_exists($this, 'photo') && !is_null($this->photo)) { + $return.= Form::showphoto('contact', $this, 0, 60, 0, 'photokanban photoref photowithmargin photologintooltip', 'small', 0, 1); + } else { + $return .= img_picto('', $this->picto); + } + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(1) : $this->ref).''; + if (property_exists($this, 'socid') && !is_null($this->socid)) { + $return .= '
'.$this->socid.''; + } else { + if (property_exists($this, 'phone_pro')) { + $return .= '
'.$langs->trans("Phone").''; + $return .= ' : '.$this->phone_pro.''; + } + } + + if (method_exists($this, 'LibPubPriv')) { + $return .= '
'.$langs->trans("Visibility").''; + $return .= ' : '.$this->LibPubPriv($this->priv).''; + } + if (method_exists($this, 'getLibStatut')) { + $return .= '
'.$this->getLibStatut(5).'
'; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } diff --git a/htdocs/contact/list.php b/htdocs/contact/list.php index e8c4174af71..59f504ec886 100644 --- a/htdocs/contact/list.php +++ b/htdocs/contact/list.php @@ -53,6 +53,7 @@ $show_files = GETPOST('show_files', 'int'); $confirm = GETPOST('confirm', 'alpha'); $toselect = GETPOST('toselect', 'array'); $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'contactlist'; +$mode = GETPOST('mode', 'alpha'); // Security check $id = GETPOST('id', 'int'); @@ -680,6 +681,9 @@ $help_url = 'EN:Module_Third_Parties|FR:Module_Tiers|ES:Módulo_Empresas'; llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', 'bodyforlist'); $param = ''; +if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); +} if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -789,7 +793,10 @@ if (in_array($massaction, array('presend', 'predelete','preaffecttag'))) { } $massactionbutton = $form->selectMassAction('', $arrayofmassactions); -$newcardbutton = dolGetButtonTitle($langs->trans('NewContactAddress'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/contact/card.php?action=create', '', $user->rights->societe->contact->creer); +$newcardbutton = ''; +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('NewContactAddress'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/contact/card.php?action=create', '', $user->rights->societe->contact->creer); print ''; if ($optioncss != '') { @@ -802,6 +809,8 @@ print ''; //print ''; print ''; print ''; +print 'fk_prospectlevel = $obj->fk_prospectcontactlevel; - print '
'; + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + } + } else { + print ''; - // Action column - if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { - print ''; } - print ''; - } - // ID - if (!empty($arrayfields['p.rowid']['checked'])) { - print '\n"; - if (!$i) { - $totalarray['nbfield']++; + // ID + if (!empty($arrayfields['p.rowid']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } } - } - // Name - if (!empty($arrayfields['p.lastname']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; + // Name + if (!empty($arrayfields['p.lastname']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } - } - // Firstname - if (!empty($arrayfields['p.firstname']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; + // Firstname + if (!empty($arrayfields['p.firstname']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } - } - // Job position - if (!empty($arrayfields['p.poste']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; + // Job position + if (!empty($arrayfields['p.poste']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } - } - // Address - if (!empty($arrayfields['p.address']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; + // Address + if (!empty($arrayfields['p.address']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } - } - // Zip - if (!empty($arrayfields['p.zip']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; + // Zip + if (!empty($arrayfields['p.zip']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } - } - // Town - if (!empty($arrayfields['p.town']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; + // Town + if (!empty($arrayfields['p.town']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } - } - // State - /*if (!empty($arrayfields['state.nom']['checked'])) - { - print "\n"; - if (! $i) $totalarray['nbfield']++; - } - // Region - if (!empty($arrayfields['region.nom']['checked'])) - { - print "\n"; - if (! $i) $totalarray['nbfield']++; - }*/ - // Country - if (!empty($arrayfields['country.code_iso']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; + // State + /*if (!empty($arrayfields['state.nom']['checked'])) + { + print "\n"; + if (! $i) $totalarray['nbfield']++; } - } - // Phone - if (!empty($arrayfields['p.phone']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; + // Region + if (!empty($arrayfields['region.nom']['checked'])) + { + print "\n"; + if (! $i) $totalarray['nbfield']++; + }*/ + // Country + if (!empty($arrayfields['country.code_iso']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } - } - // Phone perso - if (!empty($arrayfields['p.phone_perso']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; + // Phone + if (!empty($arrayfields['p.phone']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } - } - // Phone mobile - if (!empty($arrayfields['p.phone_mobile']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; + // Phone perso + if (!empty($arrayfields['p.phone_perso']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } - } - // Fax - if (!empty($arrayfields['p.fax']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; + // Phone mobile + if (!empty($arrayfields['p.phone_mobile']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } - } - // EMail - if (!empty($arrayfields['p.email']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; + // Fax + if (!empty($arrayfields['p.fax']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } - } - // No EMail - if (!empty($arrayfields['unsubscribed']['checked'])) { - print ''; + if (!$i) { + $totalarray['nbfield']++; + } } - print ''; - if (!$i) { - $totalarray['nbfield']++; + // No EMail + if (!empty($arrayfields['unsubscribed']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } - } - if (isModEnabled('socialnetworks')) { - foreach ($socialnetworks as $key => $value) { - if ($value['active'] && !empty($arrayfields['p.'.$key]['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; + if (isModEnabled('socialnetworks')) { + foreach ($socialnetworks as $key => $value) { + if ($value['active'] && !empty($arrayfields['p.'.$key]['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } } } - } - // Company - if (!empty($arrayfields['p.fk_soc']['checked']) || !empty($arrayfields['s.nom']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Private/Public - if (!empty($arrayfields['p.priv']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - if (!empty($arrayfields['p.fk_prospectcontactlevel']['checked'])) { - // Prospect level - print '"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - if (!empty($arrayfields['p.fk_stcommcontact']['checked'])) { - // Prospect status - print ''; + if (!$i) { + $totalarray['nbfield']++; } } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Extra fields - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - // Date creation - if (!empty($arrayfields['p.datec']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Date modification - if (!empty($arrayfields['p.tms']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Status - if (!empty($arrayfields['p.statut']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Import key - if (!empty($arrayfields['p.import_key']['checked'])) { - print '\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Action column - if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { - print ''; + if (!$i) { + $totalarray['nbfield']++; } - print ''; } - print ''; - } - if (!$i) { - $totalarray['nbfield']++; - } - print "\n"; + if (!empty($arrayfields['p.fk_prospectcontactlevel']['checked'])) { + // Prospect level + print '"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + if (!empty($arrayfields['p.fk_stcommcontact']['checked'])) { + // Prospect status + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Date creation + if (!empty($arrayfields['p.datec']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Date modification + if (!empty($arrayfields['p.tms']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Status + if (!empty($arrayfields['p.statut']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Import key + if (!empty($arrayfields['p.import_key']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Action column + if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + } + if (!$i) { + $totalarray['nbfield']++; + } + + print "\n"; + } $i++; } From c142a79a46cba5ed8b121a63f702fff2048546c4 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Tue, 20 Dec 2022 15:00:54 +0100 Subject: [PATCH 0184/1128] close input field --- htdocs/contact/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/contact/list.php b/htdocs/contact/list.php index 59f504ec886..3a53fad67a8 100644 --- a/htdocs/contact/list.php +++ b/htdocs/contact/list.php @@ -809,7 +809,7 @@ print ''; //print ''; print ''; print ''; -print ''; print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'address', 0, $newcardbutton, '', $limit, 0, 0, 1); From 7d647fedc5df149d1c4c3ff02d5d9e787bb34d57 Mon Sep 17 00:00:00 2001 From: ATM john Date: Tue, 20 Dec 2022 15:17:55 +0100 Subject: [PATCH 0185/1128] Fix validation for min string --- htdocs/core/class/validate.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/validate.class.php b/htdocs/core/class/validate.class.php index 9d8832c36ce..31cf6300aff 100644 --- a/htdocs/core/class/validate.class.php +++ b/htdocs/core/class/validate.class.php @@ -191,7 +191,7 @@ class Validate */ public function isMinLength($string, $length) { - if (!strlen($string) < $length) { + if (strlen($string) < $length) { $this->error = $this->outputLang->trans('RequireMinLength', $length); return false; } From 7367d77cb184da08c0f7ff1715fd695beb3b9465 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Tue, 20 Dec 2022 17:00:15 +0100 Subject: [PATCH 0186/1128] Add mode Kanban to expedition list --- htdocs/core/class/commonobjectline.class.php | 33 ++ htdocs/expedition/list.php | 422 ++++++++++--------- 2 files changed, 255 insertions(+), 200 deletions(-) diff --git a/htdocs/core/class/commonobjectline.class.php b/htdocs/core/class/commonobjectline.class.php index 972ab7e4476..58dd0566f8e 100644 --- a/htdocs/core/class/commonobjectline.class.php +++ b/htdocs/core/class/commonobjectline.class.php @@ -166,4 +166,37 @@ abstract class CommonObjectLine extends CommonObject { return 0; } + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $db, $langs; + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + //$return .= ''; // Can be image + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(1) : '').''; + if (property_exists($this, 'date_delivery')) { + $return .= '
'.dol_print_date($db->jdate($this->date_delivery), "dayhour").''; + } + if (property_exists($this, 'town') && !empty($this->town)) { + $return .= '
'.$langs->trans("Town").''; + $return .= ' : '.$this->town.''; + } + if (method_exists($this, 'getLibStatut')) { + $return .= '
'.$this->getLibStatut(5).'
'; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } diff --git a/htdocs/expedition/list.php b/htdocs/expedition/list.php index 14544087647..0d73dbd3438 100644 --- a/htdocs/expedition/list.php +++ b/htdocs/expedition/list.php @@ -78,6 +78,7 @@ $search_sale = GETPOST('search_sale', 'int'); $search_categ_cus = GETPOST("search_categ_cus", 'int'); $search_product_category = GETPOST('search_product_category', 'int'); $optioncss = GETPOST('optioncss', 'alpha'); +$mode = GETPOST('mode', 'alpha'); $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit; $sortfield = GETPOST('sortfield', 'aZ09comma'); @@ -489,6 +490,9 @@ $arrayofselected = is_array($toselect) ? $toselect : array(); $expedition = new Expedition($db); $param = ''; +if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); +} if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -577,7 +581,10 @@ $massactionbutton = $form->selectMassAction('', $arrayofmassactions); // $url = DOL_URL_ROOT.'/expedition/card.php?action=create'; // if (!empty($socid)) $url .= '&socid='.$socid; // $newcardbutton = dolGetButtonTitle($langs->trans('NewSending'), '', 'fa fa-plus-circle', $url, '', $user->rights->expedition->creer); -$newcardbutton = dolGetButtonTitle($langs->trans('NewSending'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/expedition/card.php?action=create2', '', $user->rights->expedition->creer); +$newcardbutton = ''; +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('NewSending'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/expedition/card.php?action=create2', '', $user->rights->expedition->creer); $i = 0; print ''."\n"; @@ -589,6 +596,7 @@ print ''; print ''; print ''; +print ''; print_barre_liste($langs->trans('ListOfSendings'), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'dolly', 0, $newcardbutton, '', $limit, 0, 0, 1); @@ -892,213 +900,227 @@ while ($i < min($num, $limit)) { $object = new Expedition($db); $object->fetch($obj->rowid); - print '
'; + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + } + } else { + print ''; - // Action column - if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { - print ''; - } - // Ref - if (!empty($arrayfields['e.ref']['checked'])) { - print '\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Ref customer - if (!empty($arrayfields['e.ref_customer']['checked'])) { - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Third party - if (!empty($arrayfields['s.nom']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Town - if (!empty($arrayfields['s.town']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Zip - if (!empty($arrayfields['s.zip']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // State - if (!empty($arrayfields['state.nom']['checked'])) { - print '\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Country - if (!empty($arrayfields['country.code_iso']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Type ent - if (!empty($arrayfields['typent.code']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Weight - if (!empty($arrayfields['e.weight']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Date delivery planed - if (!empty($arrayfields['e.date_delivery']['checked'])) { - print '\n"; - } - if (!empty($arrayfields['e.fk_shipping_method']['checked'])) { - // Get code using getLabelFromKey - $code=$langs->getLabelFromKey($db, $shipment->shipping_method_id, 'c_shipment_mode', 'rowid', 'code'); - print ''; - } - // Tracking number - if (!empty($arrayfields['e.tracking_number']['checked'])) { - $shipment->getUrlTrackingStatus($obj->tracking_number); - print '\n"; - //print $form->editfieldval("TrackingNumber", 'tracking_number', $obj->tracking_url, $obj, $user->rights->expedition->creer, 'string', $obj->tracking_number); - if (!$i) { - $totalarray['nbfield']++; - } - } - - if (!empty($arrayfields['l.ref']['checked']) || !empty($arrayfields['l.date_delivery']['checked'])) { - $shipment->fetchObjectLinked($shipment->id, $shipment->element); - $receiving = ''; - if (is_array($shipment->linkedObjects['delivery']) && count($shipment->linkedObjects['delivery']) > 0) { - $receiving = reset($shipment->linkedObjects['delivery']); - } - - if (!empty($arrayfields['l.ref']['checked'])) { - // Ref - print ''; } - - if (!empty($arrayfields['l.date_delivery']['checked'])) { - // Date received - print ''."\n"; - } - } - - // Extra fields - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - // Date creation - if (!empty($arrayfields['e.datec']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Date modification - if (!empty($arrayfields['e.tms']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Status - if (!empty($arrayfields['e.fk_statut']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Billed - if (!empty($arrayfields['e.billed']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Action column - if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { - print '\n"; + if (!$i) { + $totalarray['nbfield']++; } - print ''; } - print ''; - } - if (!$i) { - $totalarray['nbfield']++; - } - print "\n"; + // Ref customer + if (!empty($arrayfields['e.ref_customer']['checked'])) { + print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Third party + if (!empty($arrayfields['s.nom']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Town + if (!empty($arrayfields['s.town']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Zip + if (!empty($arrayfields['s.zip']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // State + if (!empty($arrayfields['state.nom']['checked'])) { + print '\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Country + if (!empty($arrayfields['country.code_iso']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Type ent + if (!empty($arrayfields['typent.code']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Weight + if (!empty($arrayfields['e.weight']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Date delivery planed + if (!empty($arrayfields['e.date_delivery']['checked'])) { + print '\n"; + } + if (!empty($arrayfields['e.fk_shipping_method']['checked'])) { + // Get code using getLabelFromKey + $code=$langs->getLabelFromKey($db, $shipment->shipping_method_id, 'c_shipment_mode', 'rowid', 'code'); + print ''; + } + // Tracking number + if (!empty($arrayfields['e.tracking_number']['checked'])) { + $shipment->getUrlTrackingStatus($obj->tracking_number); + print '\n"; + //print $form->editfieldval("TrackingNumber", 'tracking_number', $obj->tracking_url, $obj, $user->rights->expedition->creer, 'string', $obj->tracking_number); + if (!$i) { + $totalarray['nbfield']++; + } + } + + if (!empty($arrayfields['l.ref']['checked']) || !empty($arrayfields['l.date_delivery']['checked'])) { + $shipment->fetchObjectLinked($shipment->id, $shipment->element); + $receiving = ''; + if (is_array($shipment->linkedObjects['delivery']) && count($shipment->linkedObjects['delivery']) > 0) { + $receiving = reset($shipment->linkedObjects['delivery']); + } + + if (!empty($arrayfields['l.ref']['checked'])) { + // Ref + print ''; + } + + if (!empty($arrayfields['l.date_delivery']['checked'])) { + // Date received + print ''."\n"; + } + } + + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Date creation + if (!empty($arrayfields['e.datec']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Date modification + if (!empty($arrayfields['e.tms']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Status + if (!empty($arrayfields['e.fk_statut']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Billed + if (!empty($arrayfields['e.billed']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Action column + if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + } + if (!$i) { + $totalarray['nbfield']++; + } + + print "\n"; + } $i++; } From 23b922f0b252fc1b4149867437ab32dc2465686e Mon Sep 17 00:00:00 2001 From: kkhelifa Date: Tue, 20 Dec 2022 17:38:01 +0100 Subject: [PATCH 0187/1128] NEW : Add sent info in the parameters provided to the hook sendMailAfter --- htdocs/core/class/CMailFile.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/CMailFile.class.php b/htdocs/core/class/CMailFile.class.php index a7a87e1ce6e..cf0bfa6ed3b 100644 --- a/htdocs/core/class/CMailFile.class.php +++ b/htdocs/core/class/CMailFile.class.php @@ -1123,7 +1123,7 @@ class CMailFile return 'Bad value for sendmode'; } - $parameters = array(); + $parameters = array('sent' => $res); $action = ''; $reshook = $hookmanager->executeHooks('sendMailAfter', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { From 9ecf353342c2e0e5abffbf1ba0fdc6a06df16bf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Tue, 20 Dec 2022 17:57:19 +0100 Subject: [PATCH 0188/1128] fix warnings --- htdocs/adherents/card.php | 42 +++++++++++------------ htdocs/adherents/class/adherent.class.php | 6 ++-- htdocs/adherents/subscription.php | 2 +- htdocs/public/members/new.php | 2 +- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/htdocs/adherents/card.php b/htdocs/adherents/card.php index 56e7868ec5a..b70274c10cc 100644 --- a/htdocs/adherents/card.php +++ b/htdocs/adherents/card.php @@ -6,7 +6,7 @@ * Copyright (C) 2012 Marcos García * Copyright (C) 2012-2020 Philippe Grand * Copyright (C) 2015-2018 Alexandre Spangaro - * Copyright (C) 2018-2021 Frédéric France + * Copyright (C) 2018-2022 Frédéric France * Copyright (C) 2021 Waël Almoman * * This program is free software; you can redistribute it and/or modify @@ -305,23 +305,23 @@ if (empty($reshook)) { $object->phone = trim(GETPOST("phone", 'alpha')); $object->phone_perso = trim(GETPOST("phone_perso", 'alpha')); $object->phone_mobile = trim(GETPOST("phone_mobile", 'alpha')); - $object->email = preg_replace('/\s+/', '', GETPOST("member_email", 'alpha')); - $object->url = trim(GETPOST('member_url', 'custom', 0, FILTER_SANITIZE_URL)); + $object->email = preg_replace('/\s+/', '', GETPOST("member_email", 'alpha')); + $object->url = trim(GETPOST('member_url', 'custom', 0, FILTER_SANITIZE_URL)); $object->socialnetworks = array(); foreach ($socialnetworks as $key => $value) { if (GETPOSTISSET($key) && GETPOST($key, 'alphanohtml') != '') { $object->socialnetworks[$key] = trim(GETPOST($key, 'alphanohtml')); } } - //$object->skype = trim(GETPOST("skype", 'alpha')); - //$object->twitter = trim(GETPOST("twitter", 'alpha')); - //$object->facebook = trim(GETPOST("facebook", 'alpha')); - //$object->linkedin = trim(GETPOST("linkedin", 'alpha')); - $object->birth = $birthdate; + //$object->skype = trim(GETPOST("skype", 'alpha')); + //$object->twitter = trim(GETPOST("twitter", 'alpha')); + //$object->facebook = trim(GETPOST("facebook", 'alpha')); + //$object->linkedin = trim(GETPOST("linkedin", 'alpha')); + $object->birth = $birthdate; $object->default_lang = GETPOST('default_lang', 'alpha'); - $object->typeid = GETPOST("typeid", 'int'); - //$object->note = trim(GETPOST("comment","alpha")); - $object->morphy = GETPOST("morphy", 'alpha'); + $object->typeid = GETPOST("typeid", 'int'); + //$object->note = trim(GETPOST("comment","alpha")); + $object->morphy = GETPOST("morphy", 'alpha'); if (GETPOST('deletephoto', 'alpha')) { $object->photo = ''; @@ -330,8 +330,8 @@ if (empty($reshook)) { } // Get status and public property - $object->statut = GETPOST("statut", 'alpha'); - $object->public = GETPOST("public", 'alpha'); + $object->statut = GETPOST("statut", 'alpha'); + $object->public = GETPOST("public", 'alpha'); // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost(null, $object, '@GETPOSTISSET'); @@ -454,7 +454,7 @@ if (empty($reshook)) { // $facebook=GETPOST("member_facebook", 'alpha'); // $linkedin=GETPOST("member_linkedin", 'alpha'); $email = preg_replace('/\s+/', '', GETPOST("member_email", 'alpha')); - $url = trim(GETPOST('url', 'custom', 0, FILTER_SANITIZE_URL)); + $url = trim(GETPOST('url', 'custom', 0, FILTER_SANITIZE_URL)); $login = GETPOST("member_login", 'alphanohtml'); $pass = GETPOST("password", 'none'); // For password, we use 'none' $photo = GETPOST("photo", 'alphanohtml'); @@ -1524,7 +1524,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) { $subject = $arraydefaultmessage->topic; - $msg = $arraydefaultmessage->content; + $msg = $arraydefaultmessage->content; } $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object); @@ -1533,10 +1533,10 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnValid()), $substitutionarray, $outputlangs); $tmp = $langs->trans("SendingAnEMailToMember"); - $tmp .= '
'.$langs->trans("MailFrom").': '.$conf->global->ADHERENT_MAIL_FROM.', '; + $tmp .= '
'.$langs->trans("MailFrom").': '.getDolGlobalString('ADHERENT_MAIL_FROM').', '; $tmp .= '
'.$langs->trans("MailRecipient").': '.$object->email.''; $helpcontent = ''; - $helpcontent .= ''.$langs->trans("MailFrom").': '.$conf->global->ADHERENT_MAIL_FROM.'
'."\n"; + $helpcontent .= ''.$langs->trans("MailFrom").': '.getDolGlobalString('ADHERENT_MAIL_FROM').'
'."\n"; $helpcontent .= ''.$langs->trans("MailRecipient").': '.$object->email.'
'."\n"; $helpcontent .= ''.$langs->trans("Subject").':
'."\n"; $helpcontent .= $subjecttosend."\n"; @@ -1596,10 +1596,10 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnResiliate()), $substitutionarray, $outputlangs); $tmp = $langs->trans("SendingAnEMailToMember"); - $tmp .= '
('.$langs->trans("MailFrom").': '.$conf->global->ADHERENT_MAIL_FROM.', '; + $tmp .= '
('.$langs->trans("MailFrom").': '.getDolGlobalString('ADHERENT_MAIL_FROM').', '; $tmp .= $langs->trans("MailRecipient").': '.$object->email.')'; $helpcontent = ''; - $helpcontent .= ''.$langs->trans("MailFrom").': '.$conf->global->ADHERENT_MAIL_FROM.'
'."\n"; + $helpcontent .= ''.$langs->trans("MailFrom").': '.getDolGlobalString('ADHERENT_MAIL_FROM').'
'."\n"; $helpcontent .= ''.$langs->trans("MailRecipient").': '.$object->email.'
'."\n"; $helpcontent .= ''.$langs->trans("Subject").':
'."\n"; $helpcontent .= $subjecttosend."\n"; @@ -1656,10 +1656,10 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnExclude()), $substitutionarray, $outputlangs); $tmp = $langs->trans("SendingAnEMailToMember"); - $tmp .= '
('.$langs->trans("MailFrom").': '.$conf->global->ADHERENT_MAIL_FROM.', '; + $tmp .= '
('.$langs->trans("MailFrom").': '.getDolGlobalString('ADHERENT_MAIL_FROM').', '; $tmp .= $langs->trans("MailRecipient").': '.$object->email.')'; $helpcontent = ''; - $helpcontent .= ''.$langs->trans("MailFrom").': '.$conf->global->ADHERENT_MAIL_FROM.'
'."\n"; + $helpcontent .= ''.$langs->trans("MailFrom").': '.getDolGlobalString('ADHERENT_MAIL_FROM').'
'."\n"; $helpcontent .= ''.$langs->trans("MailRecipient").': '.$object->email.'
'."\n"; $helpcontent .= ''.$langs->trans("Subject").':
'."\n"; $helpcontent .= $subjecttosend."\n"; diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php index 4c68b3e91ec..ad3de63930a 100644 --- a/htdocs/adherents/class/adherent.class.php +++ b/htdocs/adherents/class/adherent.class.php @@ -425,8 +425,8 @@ class Adherent extends CommonObject // Envoi mail confirmation $from = $conf->email_from; - if (!empty($conf->global->ADHERENT_MAIL_FROM)) { - $from = $conf->global->ADHERENT_MAIL_FROM; + if (!empty(getDolGlobalString('ADHERENT_MAIL_FROM'))) { + $from = getDolGlobalString('ADHERENT_MAIL_FROM'); } $trackid = 'mem'.$this->id; @@ -3015,7 +3015,7 @@ class Adherent extends CommonObject $subject = make_substitutions($arraydefaultmessage->topic, $substitutionarray, $outputlangs); $msg = make_substitutions($arraydefaultmessage->content, $substitutionarray, $outputlangs); - $from = $conf->global->ADHERENT_MAIL_FROM; + $from = getDolGlobalString('ADHERENT_MAIL_FROM'); $to = $adherent->email; $trackid = 'mem'.$adherent->id; diff --git a/htdocs/adherents/subscription.php b/htdocs/adherents/subscription.php index 93b57a630e1..aa505691fda 100644 --- a/htdocs/adherents/subscription.php +++ b/htdocs/adherents/subscription.php @@ -1142,7 +1142,7 @@ if ($rowid > 0) { $tmp = 'global->ADHERENT_DEFAULT_SENDINFOBYMAIL) ? ' checked' : '')).'>'; $helpcontent = ''; - $helpcontent .= ''.$langs->trans("MailFrom").': '.$conf->global->ADHERENT_MAIL_FROM.'
'."\n"; + $helpcontent .= ''.$langs->trans("MailFrom").': '.getDolGlobalString('ADHERENT_MAIL_FROM').'
'."\n"; $helpcontent .= ''.$langs->trans("MailRecipient").': '.$object->email.'
'."\n"; $helpcontent .= ''.$langs->trans("MailTopic").':
'."\n"; if ($subjecttosend) { diff --git a/htdocs/public/members/new.php b/htdocs/public/members/new.php index 5f5e560c87d..562000c0651 100644 --- a/htdocs/public/members/new.php +++ b/htdocs/public/members/new.php @@ -404,7 +404,7 @@ if (empty($reshook) && $action == 'add') { } $to = $adh->makeSubstitution($conf->global->MAIN_INFO_SOCIETE_MAIL); - $from = $conf->global->ADHERENT_MAIL_FROM; + $from = getDolGlobalString('ADHERENT_MAIL_FROM'); $mailfile = new CMailFile( '['.$appli.'] '.$conf->global->ADHERENT_AUTOREGISTER_NOTIF_MAIL_SUBJECT, $to, From 0c78b779897d9ebaa46aed55434e05b8934b204d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Tue, 20 Dec 2022 18:05:07 +0100 Subject: [PATCH 0189/1128] fix warnings --- htdocs/adherents/card.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/adherents/card.php b/htdocs/adherents/card.php index b70274c10cc..784982866af 100644 --- a/htdocs/adherents/card.php +++ b/htdocs/adherents/card.php @@ -659,7 +659,7 @@ if (empty($reshook)) { $outputlangs->loadLangs(array("main", "members", "companies", "install", "other")); // Get email content from template $arraydefaultmessage = null; - $labeltouse = $conf->global->ADHERENT_EMAIL_TEMPLATE_MEMBER_VALIDATION; + $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_MEMBER_VALIDATION'); if (!empty($labeltouse)) { $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse); @@ -731,7 +731,7 @@ if (empty($reshook)) { $outputlangs->loadLangs(array("main", "members", "companies", "install", "other")); // Get email content from template $arraydefaultmessage = null; - $labeltouse = $conf->global->ADHERENT_EMAIL_TEMPLATE_CANCELATION; + $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_CANCELATION'); if (!empty($labeltouse)) { $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse); @@ -802,7 +802,7 @@ if (empty($reshook)) { $outputlangs->loadLangs(array("main", "members", "companies", "install", "other")); // Get email content from template $arraydefaultmessage = null; - $labeltouse = $conf->global->ADHERENT_EMAIL_TEMPLATE_EXCLUSION; + $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_EXCLUSION'); if (!empty($labeltouse)) { $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse); @@ -1639,7 +1639,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { $outputlangs->loadLangs(array("main", "members")); // Get email content from template $arraydefaultmessage = null; - $labeltouse = $conf->global->ADHERENT_EMAIL_TEMPLATE_EXCLUSION; + $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_EXCLUSION'); if (!empty($labeltouse)) { $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse); From 5a5794b64a5be9dc7a6c3d537d2c2c6010bb1a30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Tue, 20 Dec 2022 18:22:10 +0100 Subject: [PATCH 0190/1128] fix warnings --- htdocs/admin/system/security.php | 35 +++++++++++++++----------------- htdocs/takepos/css/pos.css.php | 4 ++-- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/htdocs/admin/system/security.php b/htdocs/admin/system/security.php index f8f47baebf9..1d633d01f6e 100644 --- a/htdocs/admin/system/security.php +++ b/htdocs/admin/system/security.php @@ -487,7 +487,7 @@ if (empty($conf->api->enabled) && empty($conf->webservices->enabled)) { print '
'; } if (!empty($conf->api->enabled)) { - print 'API_ENDPOINT_RULES = '.(empty($conf->global->API_ENDPOINT_RULES) ? ''.$langs->trans("Undefined").'   ('.$langs->trans("Example").': login:0,users:0,setup:1,status:1,tickets:1,...)' : $conf->global->API_ENDPOINT_RULES)."
\n"; + print 'API_ENDPOINT_RULES = '.getDolGlobalString('API_ENDPOINT_RULES', ''.$langs->trans("Undefined").'   ('.$langs->trans("Example").': login:0,users:0,setup:1,status:1,tickets:1,...)')."
\n"; print '
'; } } @@ -501,19 +501,19 @@ print '
'; print load_fiche_titre($langs->trans("OtherSetup"), '', 'folder'); -print 'MAIN_ALLOW_SVG_FILES_AS_IMAGES = '.(empty($conf->global->MAIN_ALLOW_SVG_FILES_AS_IMAGES) ? '0' : $conf->global->MAIN_ALLOW_SVG_FILES_AS_IMAGES).'   ('.$langs->trans("Recommended").': 0)
'; +print 'MAIN_ALLOW_SVG_FILES_AS_IMAGES = '.getDolGlobalString('MAIN_ALLOW_SVG_FILES_AS_IMAGES', '0').'   ('.$langs->trans("Recommended").': 0)
'; print '
'; -print 'MAIN_ALWAYS_CREATE_LOCK_AFTER_LAST_UPGRADE = '.(empty($conf->global->MAIN_ALWAYS_CREATE_LOCK_AFTER_LAST_UPGRADE) ? ''.$langs->trans("Undefined").'' : $conf->global->MAIN_ALWAYS_CREATE_LOCK_AFTER_LAST_UPGRADE).'   ('.$langs->trans("Recommended").': 1)
'; +print 'MAIN_ALWAYS_CREATE_LOCK_AFTER_LAST_UPGRADE = '.getDolGlobalString('MAIN_ALWAYS_CREATE_LOCK_AFTER_LAST_UPGRADE', ''.$langs->trans("Undefined").'').'   ('.$langs->trans("Recommended").': 1)
'; print '
'; //print ''.$langs->trans("PasswordEncryption").': '; -print 'MAIN_SECURITY_HASH_ALGO = '.(empty($conf->global->MAIN_SECURITY_HASH_ALGO) ? ''.$langs->trans("Undefined").'' : $conf->global->MAIN_SECURITY_HASH_ALGO)."   "; +print 'MAIN_SECURITY_HASH_ALGO = '.getDolGlobalString('MAIN_SECURITY_HASH_ALGO', ''.$langs->trans("Undefined").'')."   "; if (empty($conf->global->MAIN_SECURITY_HASH_ALGO)) { print '     If unset: \'md5\''; } if ($conf->global->MAIN_SECURITY_HASH_ALGO != 'password_hash') { - print '
MAIN_SECURITY_SALT = '.(empty($conf->global->MAIN_SECURITY_SALT) ? ''.$langs->trans("Undefined").'' : $conf->global->MAIN_SECURITY_SALT).'
'; + print '
MAIN_SECURITY_SALT = '.getDolGlobalString('MAIN_SECURITY_SALT', ''.$langs->trans("Undefined").'').'
'; } else { print '('.$langs->trans("Recommended").': password_hash)'; print '
'; @@ -528,10 +528,10 @@ if ($conf->global->MAIN_SECURITY_HASH_ALGO != 'password_hash') { } print '
'; -print 'MAIN_SECURITY_ANTI_SSRF_SERVER_IP = '.(empty($conf->global->MAIN_SECURITY_ANTI_SSRF_SERVER_IP) ? ''.$langs->trans("Undefined").'   ('.$langs->trans("Recommended").': List of static IPs of server separated with coma - '.$langs->trans("Note").': common loopback ip like 127.*.*.*, [::1] are already added)' : $conf->global->MAIN_SECURITY_ANTI_SSRF_SERVER_IP)."
"; +print 'MAIN_SECURITY_ANTI_SSRF_SERVER_IP = '.getDolGlobalString('MAIN_SECURITY_ANTI_SSRF_SERVER_IP', ''.$langs->trans("Undefined").'   ('.$langs->trans("Recommended").': List of static IPs of server separated with coma - '.$langs->trans("Note").': common loopback ip like 127.*.*.*, [::1] are already added)')."
"; print '
'; -print 'MAIN_SECURITY_CSRF_WITH_TOKEN = '.(empty($conf->global->MAIN_SECURITY_CSRF_WITH_TOKEN) ? ''.$langs->trans("Undefined").'' : $conf->global->MAIN_SECURITY_CSRF_WITH_TOKEN).'   ('.$langs->trans("Recommended").': '.$langs->trans("Undefined").' '.$langs->trans("or").' 2)'."
"; +print 'MAIN_SECURITY_CSRF_WITH_TOKEN = '.getDolGlobalString('MAIN_SECURITY_CSRF_WITH_TOKEN', ''.$langs->trans("Undefined").'').'   ('.$langs->trans("Recommended").': '.$langs->trans("Undefined").' '.$langs->trans("or").' 2)'."
"; print '
'; print '
'; @@ -559,31 +559,31 @@ if ($execmethod == 2) { print '
'; print '
'; -print 'MAIN_RESTRICTHTML_ONLY_VALID_HTML = '.(empty($conf->global->MAIN_RESTRICTHTML_ONLY_VALID_HTML) ? ''.$langs->trans("Undefined").'   ('.$langs->trans("Recommended").': 1)' : $conf->global->MAIN_RESTRICTHTML_ONLY_VALID_HTML)."
"; +print 'MAIN_RESTRICTHTML_ONLY_VALID_HTML = '.getDolGlobalString('MAIN_RESTRICTHTML_ONLY_VALID_HTML', ''.$langs->trans("Undefined").'   ('.$langs->trans("Recommended").': 1)')."
"; print '
'; -print 'MAIN_RESTRICTHTML_REMOVE_ALSO_BAD_ATTRIBUTES = '.(empty($conf->global->MAIN_RESTRICTHTML_REMOVE_ALSO_BAD_ATTRIBUTES) ? ''.$langs->trans("Undefined").'   ('.$langs->trans("Recommended").': 1)' : $conf->global->MAIN_RESTRICTHTML_REMOVE_ALSO_BAD_ATTRIBUTES)."
"; +print 'MAIN_RESTRICTHTML_REMOVE_ALSO_BAD_ATTRIBUTES = '.getDolGlobalString('MAIN_RESTRICTHTML_REMOVE_ALSO_BAD_ATTRIBUTES', ''.$langs->trans("Undefined").'   ('.$langs->trans("Recommended").': 1)')."
"; print '
'; -print 'MAIN_SECURITY_CSRF_TOKEN_RENEWAL_ON_EACH_CALL = '.(empty($conf->global->MAIN_SECURITY_CSRF_TOKEN_RENEWAL_ON_EACH_CALL) ? ''.$langs->trans("Undefined").'   ('.$langs->trans("Recommended").': '.$langs->trans("Undefined").' '.$langs->trans("or").' 0)' : $conf->global->MAIN_SECURITY_CSRF_TOKEN_RENEWAL_ON_EACH_CALL)."
"; +print 'MAIN_SECURITY_CSRF_TOKEN_RENEWAL_ON_EACH_CALL = '.getDolGlobalString('MAIN_SECURITY_CSRF_TOKEN_RENEWAL_ON_EACH_CALL', ''.$langs->trans("Undefined").'   ('.$langs->trans("Recommended").': '.$langs->trans("Undefined").' '.$langs->trans("or").' 0)')."
"; print '
'; -print 'MAIN_SECURITY_FORCECSP = '.(empty($conf->global->MAIN_SECURITY_FORCECSP) ? ''.$langs->trans("Undefined").'' : $conf->global->MAIN_SECURITY_FORCECSP).'   ('.$langs->trans("Example").": \"frame-ancestors 'self'; default-src 'self'; img-src *;\")
"; +print 'MAIN_SECURITY_FORCECSP = '.getDolGlobalString('MAIN_SECURITY_FORCECSP', ''.$langs->trans("Undefined").'').'   ('.$langs->trans("Example").": \"frame-ancestors 'self'; default-src 'self'; img-src *;\")
"; print '
'; -print 'MAIN_SECURITY_FORCERP = '.(empty($conf->global->MAIN_SECURITY_FORCERP) ? ''.$langs->trans("Undefined").'' : $conf->global->MAIN_SECURITY_FORCERP).'   ('.$langs->trans("Recommended").': '.$langs->trans("Undefined").' '.$langs->trans("or")." \"same-origin\" so browser doesn't send any referrer when going into another web site domain)
"; +print 'MAIN_SECURITY_FORCERP = '.getDolGlobalString('MAIN_SECURITY_FORCERP', ''.$langs->trans("Undefined").'').'   ('.$langs->trans("Recommended").': '.$langs->trans("Undefined").' '.$langs->trans("or")." \"same-origin\" so browser doesn't send any referrer when going into another web site domain)
"; print '
'; -print 'WEBSITE_MAIN_SECURITY_FORCECSP = '.(empty($conf->global->WEBSITE_MAIN_SECURITY_FORCECSP) ? ''.$langs->trans("Undefined").'' : $conf->global->WEBSITE_MAIN_SECURITY_FORCECSP).'   ('.$langs->trans("Example").": \"frame-ancestors 'self'; default-src 'self'; style-src https://cdnjs.cloudflare.com https://fonts.googleapis.com; script-src https://cdn.transifex.com https://www.googletagmanager.com; object-src https://youtube.com; frame-src https://youtube.com; img-src *;\")
"; +print 'WEBSITE_MAIN_SECURITY_FORCECSP = '.getDolGlobalString('WEBSITE_MAIN_SECURITY_FORCECSP', ''.$langs->trans("Undefined").'').'   ('.$langs->trans("Example").": \"frame-ancestors 'self'; default-src 'self'; style-src https://cdnjs.cloudflare.com https://fonts.googleapis.com; script-src https://cdn.transifex.com https://www.googletagmanager.com; object-src https://youtube.com; frame-src https://youtube.com; img-src *;\")
"; print '
'; -print 'WEBSITE_MAIN_SECURITY_FORCERP = '.(empty($conf->global->WEBSITE_MAIN_SECURITY_FORCERP) ? ''.$langs->trans("Undefined").'' : $conf->global->WEBSITE_MAIN_SECURITY_FORCERP).'   ('.$langs->trans("Recommended").': '.$langs->trans("Undefined").' '.$langs->trans("or")." \"strict-origin-when-cross-origin\")
"; +print 'WEBSITE_MAIN_SECURITY_FORCERP = '.getDolGlobalString('WEBSITE_MAIN_SECURITY_FORCERP', ''.$langs->trans("Undefined").'').'   ('.$langs->trans("Recommended").': '.$langs->trans("Undefined").' '.$langs->trans("or")." \"strict-origin-when-cross-origin\")
"; print '
'; -print 'WEBSITE_MAIN_SECURITY_FORCESTS = '.(empty($conf->global->WEBSITE_MAIN_SECURITY_FORCESTS) ? ''.$langs->trans("Undefined").'' : $conf->global->WEBSITE_MAIN_SECURITY_FORCESTS).'   ('.$langs->trans("Example").": \"max-age=31536000; includeSubDomains\")
"; +print 'WEBSITE_MAIN_SECURITY_FORCESTS = '.getDolGlobalString('>WEBSITE_MAIN_SECURITY_FORCESTS', ''.$langs->trans("Undefined").'').'   ('.$langs->trans("Example").": \"max-age=31536000; includeSubDomains\")
"; print '
'; -print 'WEBSITE_MAIN_SECURITY_FORCEPP = '.(empty($conf->global->WEBSITE_MAIN_SECURITY_FORCEPP) ? ''.$langs->trans("Undefined").'' : $conf->global->WEBSITE_MAIN_SECURITY_FORCEPP).'   ('.$langs->trans("Example").": \"camera: 'none'; microphone: 'none';\")
"; +print 'WEBSITE_MAIN_SECURITY_FORCEPP = '.getDolGlobalString('WEBSITE_MAIN_SECURITY_FORCEPP', ''.$langs->trans("Undefined").'').'   ('.$langs->trans("Example").": \"camera: 'none'; microphone: 'none';\")
"; print '
'; print '
'; @@ -605,9 +605,6 @@ $urlexamplebase = 'https://github.com/Dolibarr/dolibarr/blob/develop/dev/setup/a print '- You can also protect the application using a HTTP Basic authentication layer (see apache2 virtualhost example on GitHub)
'; - - - // End of page llxFooter(); $db->close(); diff --git a/htdocs/takepos/css/pos.css.php b/htdocs/takepos/css/pos.css.php index 921ec1bea40..b1aa9b29804 100644 --- a/htdocs/takepos/css/pos.css.php +++ b/htdocs/takepos/css/pos.css.php @@ -342,9 +342,9 @@ div.paymentbordline ?> overflow-x: hidden; overfloy-y: scroll; - + ?> overflow: visible; Date: Tue, 20 Dec 2022 17:27:12 +0000 Subject: [PATCH 0191/1128] Fixing style errors. --- htdocs/takepos/css/pos.css.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/takepos/css/pos.css.php b/htdocs/takepos/css/pos.css.php index b1aa9b29804..5a773fc3347 100644 --- a/htdocs/takepos/css/pos.css.php +++ b/htdocs/takepos/css/pos.css.php @@ -342,7 +342,7 @@ div.paymentbordline ?> overflow-x: hidden; overfloy-y: scroll; - overflow: visible; From 172aa02eff8efcdc06db6c80aefab42cb0abfa11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Tue, 20 Dec 2022 18:30:53 +0100 Subject: [PATCH 0192/1128] fix typo in url --- htdocs/admin/system/security.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/admin/system/security.php b/htdocs/admin/system/security.php index 1d633d01f6e..f2f60af751f 100644 --- a/htdocs/admin/system/security.php +++ b/htdocs/admin/system/security.php @@ -598,7 +598,7 @@ print ''; print '
'; $urlexamplebase = 'https://github.com/Dolibarr/dolibarr/blob/develop/dev/setup/fail2ban/filter.d/'; print '- Login process (see fail2ban example on GitHub)
'; -print '- '.DOL_URL_ROOT.'/passwordforgotten.php (see fail2ban example on GitHub)
'; +print '- '.DOL_URL_ROOT.'/passwordforgotten.php (see fail2ban example on GitHub)
'; print '- '.DOL_URL_ROOT.'/public/* (see fail2ban example on GitHub)
'; print '
'; $urlexamplebase = 'https://github.com/Dolibarr/dolibarr/blob/develop/dev/setup/apache/'; From 6c24230d9e911512c8ca321a1623689c01668498 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Tue, 20 Dec 2022 18:34:50 +0100 Subject: [PATCH 0193/1128] fix typo --- htdocs/admin/system/security.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/admin/system/security.php b/htdocs/admin/system/security.php index f8f47baebf9..cab41cc6263 100644 --- a/htdocs/admin/system/security.php +++ b/htdocs/admin/system/security.php @@ -598,7 +598,7 @@ print ''; print '
'; $urlexamplebase = 'https://github.com/Dolibarr/dolibarr/blob/develop/dev/setup/fail2ban/filter.d/'; print '- Login process (see fail2ban example on GitHub)
'; -print '- '.DOL_URL_ROOT.'/passwordforgotten.php (see fail2ban example on GitHub)
'; +print '- '.DOL_URL_ROOT.'/passwordforgotten.php (see fail2ban example on GitHub)
'; print '- '.DOL_URL_ROOT.'/public/* (see fail2ban example on GitHub)
'; print '
'; $urlexamplebase = 'https://github.com/Dolibarr/dolibarr/blob/develop/dev/setup/apache/'; From aad39a32c7a77dd5ea59f15f29be9d2008e342ee Mon Sep 17 00:00:00 2001 From: UT from dolibit <45215329+dolibit-ut@users.noreply.github.com> Date: Tue, 20 Dec 2022 18:42:21 +0100 Subject: [PATCH 0194/1128] Update ChangeLog sorting --- ChangeLog | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1697b668934..6654303bdf5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -36,7 +36,6 @@ NEW: Accountancy - Add a way to clean some words when you generate thirdparty ac NEW: Accountancy - Added an option during export to export or not the lettering FPC21 NEW: Accountancy - Manage supplier deposit with specific account NEW: Accountancy - Model Digitaria - Add a way to clean some words when you generate thirdparty accounting account FPC22 -NEW: Add a button "Test collect" in email collector NEW: Add a constant to disallow modification of the product reference. NEW: Add a method doAutoRenewContracts that can be used as a cron task. NEW: Add " as enclosure by default for CSV export. Keep removing CR/LF. @@ -50,9 +49,6 @@ NEW: Add extrafield type "IP" to store IP addresses NEW: Add fail2ban rules examples to limit access to /public pages NEW: Add filter "Product subject to lot/Serial" in stock per lot/serial NEW: Add hidden option MAIN_EMAIL_SUPPORT_ACK to restore Email ack checkbox (feature abandonned by mailers) -NEW: Add IMAP port setting on email collector module -NEW: Adding JAPAN Chart-of-Account and regions/departments -NEW: Adding NIF verification for Algeria NEW: Add link to create an element from the category page NEW: add margin infos to takepos invoice lines NEW: Add max size send for "backup and link to mail" option @@ -92,16 +88,22 @@ NEW: Change filter type on tickets list into a multiselect combo NEW: conf TIMESPENT_ALWAYS_UPDATE_THM, when it's on we always check current thm of user to update it in task time line NEW: constant PROPAL_NEW_AS_SIGNED NEW: show date delivery planned on orders linked to company and product -NEW: Default template of contract is not mandatory NEW: Default values in extrafields are not more limited to 255 char. NEW: display currency in takepos menu NEW: Enable online signature for interventions NEW: Encrypt all sensitive constants in llx_const NEW: extrafield price with currency NEW: filter on reception dates (from / to) in cheque paiement card +NEW: Contracts: Default template of contract is not mandatory +NEW: Contracts: Manage Position (Rank) on Contract Lines +NEW: EMail-Collector: add IMAP port setting +NEW: EMail-Collector: add a button "Test collect" NEW: Members: default_lang for members NEW: Members: Table of membership types NEW: Members: add free membership amounts at the membership type level +NEW: Projects: add author on list +NEW: Proposals: show delivery mode on PDF for proposals +NEW: Reception: add a from/to on search on date field NEW: TakePOS: Header Scroll in TakePOS NEW: TakePOS: add price to product box in TakePOS NEW: TakePOS: add setup parameters, can setup terminal name @@ -124,7 +126,6 @@ NEW: The link "add to bookmark" is always on top in the bookmark popup NEW: MAIN_SEARCH_CATEGORY_PRODUCT_ON_LISTS const to show category customer filter NEW: Make module WebservicesClient deprecated. Use module WebHook instead. NEW: manage no email with thirdparties (better for GDPR) -NEW: Manage Position (Rank) on Contract Lines NEW: Manage VAT on all lines on purchases cycle NEW: manage virtual stock at a future date NEW: On a bank reconciled line, we can modify the bank receipt @@ -139,9 +140,7 @@ NEW: possibility to select scopes with checkbox for Oauth tokens NEW: private and public note on user, thirdparty and contact list NEW: product categories filter on inventory list NEW: Product supplier price: autofill default supplier VAT -NEW: Project - Add author on list NEW: Public counters feature -NEW: Reception - Add a from/to on search on date field NEW: Start a simple support of recurrent events on agenda NEW: Resize parent company column in order list NEW: Saved token of OAUTH module are now encrypted into llx_oauth_token @@ -164,19 +163,23 @@ NEW: The purge of files can purge only if older than a number of seconds NEW: Update ActionComm type_code on email message ticket NEW: VAT - Admin - Add information on deadline day for submission of VAT declaration NEW: expand/collapse permissions on user permission page -NEW: Show delivery mode on PDF for proposals NEW: Add the target to select attendees of event for emailings + Localisation: +NEW: adding JAPAN Chart-of-Account and regions/departments +NEW: adding NIF verification for Algeria + Modules NEW: Experimental module Asset + For developers or integrators: ------------------------------ NEW: ModuleBuilder can generate code of class from an existing SQL table -NEW: #22370 Modulebuilder supports 'alwayseditable' (like extrafields) NEW: #20912 Add trigger to record the event of sending an email from a project NEW: #21750 Added "Get lines and Post lines from BOM" at the REST Service +NEW: #22370 Modulebuilder supports 'alwayseditable' (like extrafields) NEW: Removed completely the need for the library adodbtime NEW: hook on agenda pages NEW: hook to complete payment in TakePOS From 0051ca15c3639f50b7b46dbf281593c39cad8adc Mon Sep 17 00:00:00 2001 From: UT from dolibit <45215329+dolibit-ut@users.noreply.github.com> Date: Tue, 20 Dec 2022 21:08:13 +0100 Subject: [PATCH 0195/1128] Update new.php NOIPCHECK was twice --- htdocs/public/members/new.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/htdocs/public/members/new.php b/htdocs/public/members/new.php index 5f5e560c87d..7cca5b7f976 100644 --- a/htdocs/public/members/new.php +++ b/htdocs/public/members/new.php @@ -52,9 +52,7 @@ if (!defined('NOIPCHECK')) { if (!defined('NOBROWSERNOTIF')) { define('NOBROWSERNOTIF', '1'); } -if (!defined('NOIPCHECK')) { - define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip -} + // For MultiCompany module. // Do not use GETPOST here, function is not defined and define must be done before including main.inc.php From a914ac0efcea00d39ad7a44f5ead153dce743ba2 Mon Sep 17 00:00:00 2001 From: UT from dolibit <45215329+dolibit-ut@users.noreply.github.com> Date: Tue, 20 Dec 2022 21:10:04 +0100 Subject: [PATCH 0196/1128] Update new.php NOIPCHECK was twice --- htdocs/public/project/new.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/htdocs/public/project/new.php b/htdocs/public/project/new.php index 7603c046006..484b32f2416 100644 --- a/htdocs/public/project/new.php +++ b/htdocs/public/project/new.php @@ -39,9 +39,7 @@ if (!defined('NOIPCHECK')) { if (!defined('NOBROWSERNOTIF')) { define('NOBROWSERNOTIF', '1'); } -if (!defined('NOIPCHECK')) { - define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip -} + // For MultiCompany module. // Do not use GETPOST here, function is not defined and define must be done before including main.inc.php From fcec48ea7f88a8035f4d6b8ce597bdd2dfb63bc6 Mon Sep 17 00:00:00 2001 From: UT from dolibit <45215329+dolibit-ut@users.noreply.github.com> Date: Tue, 20 Dec 2022 21:16:17 +0100 Subject: [PATCH 0197/1128] Update mailing-read.php --- htdocs/public/emailing/mailing-read.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/htdocs/public/emailing/mailing-read.php b/htdocs/public/emailing/mailing-read.php index 1c2bd6cea98..5829c62dbd7 100644 --- a/htdocs/public/emailing/mailing-read.php +++ b/htdocs/public/emailing/mailing-read.php @@ -46,8 +46,8 @@ if (!defined('NOREQUIREMENU')) { if (!defined('NOIPCHECK')) { define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip } -if (!defined("NOSESSION")) { - define("NOSESSION", '1'); +if (!defined('NOSESSION')) { + define('NOSESSION', '1'); } /** @@ -58,6 +58,8 @@ if (!defined("NOSESSION")) { function llxHeader() { } + + /** * Footer empty * @@ -121,19 +123,19 @@ if (!empty($tag)) { } */ - //Update status of target + // Update status of target $statut = '2'; $sql = "UPDATE ".MAIN_DB_PREFIX."mailing_cibles SET statut=".((int) $statut)." WHERE rowid = ".((int) $obj->rowid); $resql = $db->query($sql); if (!$resql) dol_print_error($db); - //Update status communication of thirdparty prospect + // Update status communication of thirdparty prospect if ($obj->source_id > 0 && $obj->source_type == 'thirdparty' && $obj->entity) { $sql = "UPDATE ".MAIN_DB_PREFIX.'societe SET fk_stcomm = 3 WHERE fk_stcomm <> -1 AND entity = '.((int) $obj->entity).' AND rowid = '.((int) $obj->source_id); $resql = $db->query($sql); } - //Update status communication of contact prospect + // Update status communication of contact prospect if ($obj->source_id > 0 && $obj->source_type == 'contact' && $obj->entity) { $sql = "UPDATE ".MAIN_DB_PREFIX.'societe SET fk_stcomm = 3 WHERE fk_stcomm <> -1 AND entity = '.((int) $obj->entity).' AND rowid IN (SELECT sc.fk_soc FROM '.MAIN_DB_PREFIX.'socpeople AS sc WHERE sc.rowid = '.((int) $obj->source_id).')'; $resql = $db->query($sql); From 3c91abd6b7f2b2500377568af2916d9c93598edc Mon Sep 17 00:00:00 2001 From: UT from dolibit <45215329+dolibit-ut@users.noreply.github.com> Date: Tue, 20 Dec 2022 21:17:56 +0100 Subject: [PATCH 0198/1128] Update attendee_new.php NOIPCHECK was twice --- htdocs/public/eventorganization/attendee_new.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/htdocs/public/eventorganization/attendee_new.php b/htdocs/public/eventorganization/attendee_new.php index cb4ba38e628..7e02fda5e13 100644 --- a/htdocs/public/eventorganization/attendee_new.php +++ b/htdocs/public/eventorganization/attendee_new.php @@ -33,9 +33,7 @@ if (!defined('NOIPCHECK')) { if (!defined('NOBROWSERNOTIF')) { define('NOBROWSERNOTIF', '1'); } -if (!defined('NOIPCHECK')) { - define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip -} + // For MultiCompany module. // Do not use GETPOST here, function is not defined and define must be done before including main.inc.php From a289c57725d5e12eb5ab4bc2ec074ae8cba5a410 Mon Sep 17 00:00:00 2001 From: UT from dolibit <45215329+dolibit-ut@users.noreply.github.com> Date: Tue, 20 Dec 2022 21:20:30 +0100 Subject: [PATCH 0199/1128] Update new.php NOIPCHECK was twice --- htdocs/public/partnership/new.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/htdocs/public/partnership/new.php b/htdocs/public/partnership/new.php index b6444753eb7..af2583abece 100644 --- a/htdocs/public/partnership/new.php +++ b/htdocs/public/partnership/new.php @@ -40,9 +40,7 @@ if (!defined('NOIPCHECK')) { if (!defined('NOBROWSERNOTIF')) { define('NOBROWSERNOTIF', '1'); } -if (!defined('NOIPCHECK')) { - define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip -} + // For MultiCompany module. // Do not use GETPOST here, function is not defined and define must be done before including main.inc.php From 19cb37160d667b1f5dca93e524b377ff5313db00 Mon Sep 17 00:00:00 2001 From: UT from dolibit <45215329+dolibit-ut@users.noreply.github.com> Date: Tue, 20 Dec 2022 21:23:23 +0100 Subject: [PATCH 0200/1128] Update suggestbooth.php NOIPCHECK was twice --- htdocs/public/project/suggestbooth.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/htdocs/public/project/suggestbooth.php b/htdocs/public/project/suggestbooth.php index 68e469b6a00..7005265053e 100644 --- a/htdocs/public/project/suggestbooth.php +++ b/htdocs/public/project/suggestbooth.php @@ -33,9 +33,7 @@ if (!defined('NOIPCHECK')) { if (!defined('NOBROWSERNOTIF')) { define('NOBROWSERNOTIF', '1'); } -if (!defined('NOIPCHECK')) { - define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip -} + // For MultiCompany module. // Do not use GETPOST here, function is not defined and define must be done before including main.inc.php From 6c6eb077580d41042f610e216935640d3bb18978 Mon Sep 17 00:00:00 2001 From: UT from dolibit <45215329+dolibit-ut@users.noreply.github.com> Date: Tue, 20 Dec 2022 21:24:10 +0100 Subject: [PATCH 0201/1128] Update suggestconference.php NOIPCHECK was twice --- htdocs/public/project/suggestconference.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/htdocs/public/project/suggestconference.php b/htdocs/public/project/suggestconference.php index 5590b0bf94c..9f0dd6638db 100644 --- a/htdocs/public/project/suggestconference.php +++ b/htdocs/public/project/suggestconference.php @@ -33,9 +33,7 @@ if (!defined('NOIPCHECK')) { if (!defined('NOBROWSERNOTIF')) { define('NOBROWSERNOTIF', '1'); } -if (!defined('NOIPCHECK')) { - define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip -} + // For MultiCompany module. // Do not use GETPOST here, function is not defined and define must be done before including main.inc.php From e97104fcaaf6e809ddb40e775bcbac82395de853 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 20 Dec 2022 13:49:44 +0100 Subject: [PATCH 0202/1128] Fix selection of opp status --- htdocs/langs/en_US/projects.lang | 5 +- htdocs/projet/card.php | 187 ++++++++++++++++++++++++------- 2 files changed, 152 insertions(+), 40 deletions(-) diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang index 2407d4b2d86..6d2f67ee675 100644 --- a/htdocs/langs/en_US/projects.lang +++ b/htdocs/langs/en_US/projects.lang @@ -125,7 +125,8 @@ ValidateProject=Validate projet ConfirmValidateProject=Are you sure you want to validate this project? CloseAProject=Close project ConfirmCloseAProject=Are you sure you want to close this project? -AlsoCloseAProject=Also close project (keep it open if you still need to follow production tasks on it) +AlsoCloseAProject=Also close project +AlsoCloseAProjectTooltip=Keep it open if you still need to follow production tasks on it ReOpenAProject=Open project ConfirmReOpenAProject=Are you sure you want to re-open this project? ProjectContact=Contacts of project @@ -168,7 +169,7 @@ OpportunityProbability=Lead probability OpportunityProbabilityShort=Lead probab. OpportunityAmount=Lead amount OpportunityAmountShort=Lead amount -OpportunityWeightedAmount=Opportunity weighted amount +OpportunityWeightedAmount=Amount of opportunity, weighted by probability OpportunityWeightedAmountShort=Opp. weighted amount OpportunityAmountAverageShort=Average lead amount OpportunityAmountWeigthedShort=Weighted lead amount diff --git a/htdocs/projet/card.php b/htdocs/projet/card.php index 1bdcccbaecf..78dd11c9fd0 100644 --- a/htdocs/projet/card.php +++ b/htdocs/projet/card.php @@ -567,7 +567,7 @@ if ($action == 'create' && $user->rights->projet->creer) { print ''; // Label - print '
'; + print ''; // Usage (opp, task, bill time, ...) if (!empty($conf->global->PROJECT_USE_OPPORTUNITIES) || empty($conf->global->PROJECT_HIDE_TASKS) || isModEnabled('eventorganization')) { @@ -602,12 +602,46 @@ if ($action == 'create' && $user->rights->projet->creer) { print ' '; $htmltext = $langs->trans("ProjectFollowTasks"); print ''; + print ''; print '
'; } if (empty($conf->global->PROJECT_HIDE_TASKS) && !empty($conf->global->PROJECT_BILL_TIME_SPENT)) { print ' '; $htmltext = $langs->trans("ProjectBillTimeDescription"); print ''; + print ''; print '
'; } if (isModEnabled('eventorganization')) { @@ -706,24 +740,26 @@ if ($action == 'create' && $user->rights->projet->creer) { print ''; print ''; // Opportunity probability - print ''; - print ''; print ''; // Opportunity amount print ''; - print ''; + print ''; print ''; } // Budget - print ''; - print ''; + print ''; + print ''; print ''; // Date project @@ -780,6 +816,7 @@ if ($action == 'create' && $user->rights->projet->creer) { print ''; // Change probability from status or role of project + // Set also dependencies between use taks and bill time print ''; print '
'; @@ -930,12 +972,52 @@ if ($action == 'create' && $user->rights->projet->creer) { print 'usage_task ? ' checked="checked"' : '')) . '"> '; $htmltext = $langs->trans("ProjectFollowTasks"); print ''; + print ''; print '
'; } if (empty($conf->global->PROJECT_HIDE_TASKS) && !empty($conf->global->PROJECT_BILL_TIME_SPENT)) { print 'usage_bill_time ? ' checked="checked"' : '')) . '"> '; $htmltext = $langs->trans("ProjectBillTimeDescription"); print ''; + print ''; print '
'; } if (isModEnabled('eventorganization')) { @@ -944,7 +1026,14 @@ if ($action == 'create' && $user->rights->projet->creer) { print ''; print ''; } @@ -1013,32 +1100,34 @@ if ($action == 'create' && $user->rights->projet->creer) { // Opportunity status print ''; print ''; - print ''; + print '
'; + print $formproject->selectOpportunityStatus('opp_status', $object->opp_status, 1, 0, 0, 0, 'inline-block valignmiddle', 1, 1); // Opportunity probability - print '
'; - print ''; print ''; // Opportunity amount print ''; - print ''; print ''; } // Budget - print ''; - print ''; + print ''; print ''; @@ -1180,14 +1269,13 @@ if ($action == 'create' && $user->rights->projet->creer) { if ($code) { print $langs->trans("OppStatus".$code); } - print ''; // Opportunity percent - print ''; + print ''; // Opportunity Amount print ''; echo ''; echo ''; print ''; print ''; - if ($user->rights->adherent->configurer) { + if ($user->hasRight('adherent', 'configurer')) { print ''; } else { print ''; diff --git a/htdocs/adherents/type_translation.php b/htdocs/adherents/type_translation.php index 9539250cb44..85b346b4225 100644 --- a/htdocs/adherents/type_translation.php +++ b/htdocs/adherents/type_translation.php @@ -71,7 +71,7 @@ if ($action == 'delete' && GETPOST('langtodelete', 'alpha')) { } // Add translation -if ($action == 'vadd' && $cancel != $langs->trans("Cancel") && $user->rights->adherent->configurer) { +if ($action == 'vadd' && $cancel != $langs->trans("Cancel") && $user->hasRight('adherent', 'configurer')) { $object = new AdherentType($db); $object->fetch($id); $current_lang = $langs->getDefaultLang(); @@ -99,7 +99,7 @@ if ($action == 'vadd' && $cancel != $langs->trans("Cancel") && $user->rights->ad } // Edit translation -if ($action == 'vedit' && $cancel != $langs->trans("Cancel") && $user->rights->adherent->configurer) { +if ($action == 'vedit' && $cancel != $langs->trans("Cancel") && $user->hasRight('adherent', 'configurer')) { $object = new AdherentType($db); $object->fetch($id); $current_lang = $langs->getDefaultLang(); @@ -125,7 +125,7 @@ if ($action == 'vedit' && $cancel != $langs->trans("Cancel") && $user->rights->a } // Delete translation -if ($action == 'vdelete' && $cancel != $langs->trans("Cancel") && $user->rights->adherent->configurer) { +if ($action == 'vdelete' && $cancel != $langs->trans("Cancel") && $user->hasRight('adherent', 'configurer')) { $object = new AdherentType($db); $object->fetch($id); $langtodelete = GETPOST('langdel', 'alpha'); diff --git a/htdocs/adherents/vcard.php b/htdocs/adherents/vcard.php index 1b5a0e5d0fe..9f6c5adcaeb 100644 --- a/htdocs/adherents/vcard.php +++ b/htdocs/adherents/vcard.php @@ -35,7 +35,7 @@ $id = GETPOST('id', 'int'); $ref = GETPOST('ref', 'alphanohtml'); $object = new adherent($db); - +global $user; // Fetch object if ($id > 0 || !empty($ref)) { // Load member @@ -46,10 +46,10 @@ if ($id > 0 || !empty($ref)) { // Define variables to know what current user can do on properties of user linked to edited member if ($object->user_id) { // $User is the user who edits, $object->user_id is the id of the related user in the edited member - $caneditfielduser = ((($user->id == $object->user_id) && $user->rights->user->self->creer) - || (($user->id != $object->user_id) && $user->rights->user->user->creer)); - $caneditpassworduser = ((($user->id == $object->user_id) && $user->rights->user->self->password) - || (($user->id != $object->user_id) && $user->rights->user->user->password)); + $caneditfielduser = ((($user->id == $object->user_id) && $user->hasRight('user', 'self', 'creer')) + || (($user->id != $object->user_id) && $user->hasRight('user', 'user', 'creer'))); + $caneditpassworduser = ((($user->id == $object->user_id) && $user->hasRight('user', 'self', 'password')) + || (($user->id != $object->user_id) && $user->hasRight('user', 'user', 'password'))); } } From 6bb8badfdfb2b035ad8bc2a40a932ef2195aebae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Wed, 21 Dec 2022 08:50:13 +0100 Subject: [PATCH 0204/1128] use user->hasRight --- .../canvas/default/tpl/adherentcard_view.tpl.php | 2 +- htdocs/adherents/card.php | 4 ++-- htdocs/adherents/ldap.php | 6 +++--- htdocs/adherents/list.php | 2 +- htdocs/adherents/partnership.php | 14 +++++++------- htdocs/adherents/subscription.php | 4 ++-- htdocs/adherents/vcard.php | 4 ++-- 7 files changed, 18 insertions(+), 18 deletions(-) diff --git a/htdocs/adherents/canvas/default/tpl/adherentcard_view.tpl.php b/htdocs/adherents/canvas/default/tpl/adherentcard_view.tpl.php index a3b3789d492..1ad9e4ff3d4 100644 --- a/htdocs/adherents/canvas/default/tpl/adherentcard_view.tpl.php +++ b/htdocs/adherents/canvas/default/tpl/adherentcard_view.tpl.php @@ -128,7 +128,7 @@ if (empty($user->socid)) { echo ''.$langs->trans('Modify').''; } - if (!$this->control->tpl['user_id'] && $user->rights->user->user->creer) { + if (!$this->control->tpl['user_id'] && $user->hasRight('user', 'user', 'creer')) { echo ''.$langs->trans("CreateDolibarrLogin").''; } diff --git a/htdocs/adherents/card.php b/htdocs/adherents/card.php index 784982866af..273f79b8ac8 100644 --- a/htdocs/adherents/card.php +++ b/htdocs/adherents/card.php @@ -342,7 +342,7 @@ if (empty($reshook)) { // Check if we need to also synchronize user information $nosyncuser = 0; if ($object->user_id) { // If linked to a user - if ($user->id != $object->user_id && empty($user->rights->user->user->creer)) { + if ($user->id != $object->user_id && !$user->hasRight('user', 'user', 'creer')) { $nosyncuser = 1; // Disable synchronizing } } @@ -350,7 +350,7 @@ if (empty($reshook)) { // Check if we need to also synchronize password information $nosyncuserpass = 0; if ($object->user_id) { // If linked to a user - if ($user->id != $object->user_id && empty($user->rights->user->user->password)) { + if ($user->id != $object->user_id && !$user->hasRight('user', 'user', 'password')) { $nosyncuserpass = 1; // Disable synchronizing } } diff --git a/htdocs/adherents/ldap.php b/htdocs/adherents/ldap.php index 7f09bccb3d3..83b7e5f3764 100644 --- a/htdocs/adherents/ldap.php +++ b/htdocs/adherents/ldap.php @@ -51,14 +51,14 @@ if ($id > 0 || !empty($ref)) { $result = $object->fetch($id, $ref); // Define variables to know what current user can do on users - $canadduser = (!empty($user->admin) || !empty($user->rights->user->user->creer)); + $canadduser = (!empty($user->admin) || $user->hasRight('user', 'user', 'creer')); // Define variables to know what current user can do on properties of user linked to edited member if ($object->user_id) { // $User is the user who edits, $object->user_id is the id of the related user in the edited member $caneditfielduser = ((($user->id == $object->user_id) && !empty($user->rights->user->self->creer)) - || (($user->id != $object->user_id) && !empty($user->rights->user->user->creer))); + || (($user->id != $object->user_id) && $user->hasRight('user', 'user', 'creer'))); $caneditpassworduser = ((($user->id == $object->user_id) && $user->rights->user->self->password) - || (($user->id != $object->user_id) && !empty($user->rights->user->user->password))); + || (($user->id != $object->user_id) && $user->hasRight('user', 'user', 'password'))); } } diff --git a/htdocs/adherents/list.php b/htdocs/adherents/list.php index c2b81860210..a1d929ec3e9 100644 --- a/htdocs/adherents/list.php +++ b/htdocs/adherents/list.php @@ -262,7 +262,7 @@ if (empty($reshook)) { } // Create external user - if ($massaction == 'createexternaluser' && $user->hasRight('adherent', 'creer') && $user->rights->user->user->creer) { + if ($massaction == 'createexternaluser' && $user->hasRight('adherent', 'creer') && $user->hasRight('user', 'user', 'creer')) { $tmpmember = new Adherent($db); $error = 0; $nbcreated = 0; diff --git a/htdocs/adherents/partnership.php b/htdocs/adherents/partnership.php index 805a3137226..3664187b34e 100644 --- a/htdocs/adherents/partnership.php +++ b/htdocs/adherents/partnership.php @@ -76,13 +76,13 @@ foreach ($object->fields as $key => $val) { // Load object include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once. -$permissiontoread = $user->rights->partnership->read; -$permissiontoadd = $user->rights->partnership->write; // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php -$permissiontodelete = $user->rights->partnership->delete || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_DRAFT); -$permissionnote = $user->rights->partnership->write; // Used by the include of actions_setnotes.inc.php -$permissiondellink = $user->rights->partnership->write; // Used by the include of actions_dellink.inc.php -$usercanclose = $user->rights->partnership->write; // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php -$upload_dir = $conf->partnership->multidir_output[isset($object->entity) ? $object->entity : 1]; +$permissiontoread = $user->hasRight('partnership', 'read'); +$permissiontoadd = $user->hasRight('partnership', 'write'); // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php +$permissiontodelete = $user->hasRight('partnership', 'delete') || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_DRAFT); +$permissionnote = $user->hasRight('partnership', 'write'); // Used by the include of actions_setnotes.inc.php +$permissiondellink = $user->hasRight('partnership', 'write'); // Used by the include of actions_dellink.inc.php +$usercanclose = $user->hasRight('partnership', 'write'); // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php +$upload_dir = $conf->partnership->multidir_output[isset($object->entity) ? $object->entity : 1]; if (getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR') != 'member') { diff --git a/htdocs/adherents/subscription.php b/htdocs/adherents/subscription.php index 154a1bffd1f..8c423d53029 100644 --- a/htdocs/adherents/subscription.php +++ b/htdocs/adherents/subscription.php @@ -151,9 +151,9 @@ if (empty($reshook) && $action == 'confirm_create_thirdparty' && $confirm == 'ye } } -if (empty($reshook) && $action == 'setuserid' && ($user->rights->user->self->creer || $user->rights->user->user->creer)) { +if (empty($reshook) && $action == 'setuserid' && ($user->rights->user->self->creer || $user->hasRight('user', 'user', 'creer'))) { $error = 0; - if (empty($user->rights->user->user->creer)) { // If can edit only itself user, we can link to itself only + if (!$user->hasRight('user', 'user', 'creer')) { // If can edit only itself user, we can link to itself only if (GETPOST("userid", 'int') != $user->id && GETPOST("userid", 'int') != $object->user_id) { $error++; setEventMessages($langs->trans("ErrorUserPermissionAllowsToLinksToItselfOnly"), null, 'errors'); diff --git a/htdocs/adherents/vcard.php b/htdocs/adherents/vcard.php index 9f6c5adcaeb..9f11b5be2bf 100644 --- a/htdocs/adherents/vcard.php +++ b/htdocs/adherents/vcard.php @@ -35,14 +35,14 @@ $id = GETPOST('id', 'int'); $ref = GETPOST('ref', 'alphanohtml'); $object = new adherent($db); -global $user; + // Fetch object if ($id > 0 || !empty($ref)) { // Load member $result = $object->fetch($id, $ref); // Define variables to know what current user can do on users - $canadduser = ($user->admin || $user->rights->user->user->creer); + $canadduser = ($user->admin || $user->hasRight('user', 'user', 'creer')); // Define variables to know what current user can do on properties of user linked to edited member if ($object->user_id) { // $User is the user who edits, $object->user_id is the id of the related user in the edited member From b1b46556beae7a7da19b99205f6948ab9ad344a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Wed, 21 Dec 2022 09:17:07 +0100 Subject: [PATCH 0205/1128] fix stickler --- htdocs/admin/system/security.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/admin/system/security.php b/htdocs/admin/system/security.php index f2f60af751f..dd21524e7c2 100644 --- a/htdocs/admin/system/security.php +++ b/htdocs/admin/system/security.php @@ -574,7 +574,8 @@ print '
'; print 'MAIN_SECURITY_FORCERP = '.getDolGlobalString('MAIN_SECURITY_FORCERP', ''.$langs->trans("Undefined").'').'   ('.$langs->trans("Recommended").': '.$langs->trans("Undefined").' '.$langs->trans("or")." \"same-origin\" so browser doesn't send any referrer when going into another web site domain)
"; print '
'; -print 'WEBSITE_MAIN_SECURITY_FORCECSP = '.getDolGlobalString('WEBSITE_MAIN_SECURITY_FORCECSP', ''.$langs->trans("Undefined").'').'   ('.$langs->trans("Example").": \"frame-ancestors 'self'; default-src 'self'; style-src https://cdnjs.cloudflare.com https://fonts.googleapis.com; script-src https://cdn.transifex.com https://www.googletagmanager.com; object-src https://youtube.com; frame-src https://youtube.com; img-src *;\")
"; +print 'WEBSITE_MAIN_SECURITY_FORCECSP = '.getDolGlobalString('WEBSITE_MAIN_SECURITY_FORCECSP', ''.$langs->trans("Undefined").''); +print '   ('.$langs->trans("Example").": \"frame-ancestors 'self'; default-src 'self'; style-src https://cdnjs.cloudflare.com https://fonts.googleapis.com; script-src https://cdn.transifex.com https://www.googletagmanager.com; object-src https://youtube.com; frame-src https://youtube.com; img-src *;\")
"; print '
'; print 'WEBSITE_MAIN_SECURITY_FORCERP = '.getDolGlobalString('WEBSITE_MAIN_SECURITY_FORCERP', ''.$langs->trans("Undefined").'').'   ('.$langs->trans("Recommended").': '.$langs->trans("Undefined").' '.$langs->trans("or")." \"strict-origin-when-cross-origin\")
"; From 0582653a679d0da3399f399ed39d634d46c99d57 Mon Sep 17 00:00:00 2001 From: Gauthier PC portable 024 Date: Wed, 21 Dec 2022 10:55:03 +0100 Subject: [PATCH 0206/1128] FIX : get multicurrency infos of propal when create order from propal with "WORKFLOW_PROPAL_AUTOCREATE_ORDER" conf --- htdocs/commande/class/commande.class.php | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 54e50baa9f7..2e20567e4c5 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -1355,6 +1355,27 @@ class Commande extends CommonOrder $this->origin = $object->element; $this->origin_id = $object->id; + // Multicurrency (test on $this->multicurrency_tx because we should take the default rate only if not using origin rate) + if (!empty($conf->multicurrency->enabled)) { + if (!empty($object->multicurrency_code)) { + $this->multicurrency_code = $object->multicurrency_code; + } + if (!empty($conf->global->MULTICURRENCY_USE_ORIGIN_TX) && !empty($object->multicurrency_tx)) { + $this->multicurrency_tx = $object->multicurrency_tx; + } + + if (!empty($this->multicurrency_code) && empty($this->multicurrency_tx)) { + list($this->fk_multicurrency, $this->multicurrency_tx) = MultiCurrency::getIdAndTxFromCode($this->db, $this->multicurrency_code, $this->date_commande); + } else { + $this->fk_multicurrency = MultiCurrency::getIdFromCode($this->db, $this->multicurrency_code); + } + if (empty($this->fk_multicurrency)) { + $this->multicurrency_code = $conf->currency; + $this->fk_multicurrency = 0; + $this->multicurrency_tx = 1; + } + } + // get extrafields from original line $object->fetch_optionals(); From 3b9d39c1d2fae893b272532167353a64ba866ba1 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Wed, 21 Dec 2022 10:00:26 +0000 Subject: [PATCH 0207/1128] Fixing style errors. --- htdocs/commande/class/commande.class.php | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 2e20567e4c5..12054c3ccb8 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -1355,7 +1355,7 @@ class Commande extends CommonOrder $this->origin = $object->element; $this->origin_id = $object->id; - // Multicurrency (test on $this->multicurrency_tx because we should take the default rate only if not using origin rate) + // Multicurrency (test on $this->multicurrency_tx because we should take the default rate only if not using origin rate) if (!empty($conf->multicurrency->enabled)) { if (!empty($object->multicurrency_code)) { $this->multicurrency_code = $object->multicurrency_code; @@ -1364,16 +1364,16 @@ class Commande extends CommonOrder $this->multicurrency_tx = $object->multicurrency_tx; } - if (!empty($this->multicurrency_code) && empty($this->multicurrency_tx)) { - list($this->fk_multicurrency, $this->multicurrency_tx) = MultiCurrency::getIdAndTxFromCode($this->db, $this->multicurrency_code, $this->date_commande); - } else { - $this->fk_multicurrency = MultiCurrency::getIdFromCode($this->db, $this->multicurrency_code); - } - if (empty($this->fk_multicurrency)) { - $this->multicurrency_code = $conf->currency; - $this->fk_multicurrency = 0; - $this->multicurrency_tx = 1; - } + if (!empty($this->multicurrency_code) && empty($this->multicurrency_tx)) { + list($this->fk_multicurrency, $this->multicurrency_tx) = MultiCurrency::getIdAndTxFromCode($this->db, $this->multicurrency_code, $this->date_commande); + } else { + $this->fk_multicurrency = MultiCurrency::getIdFromCode($this->db, $this->multicurrency_code); + } + if (empty($this->fk_multicurrency)) { + $this->multicurrency_code = $conf->currency; + $this->fk_multicurrency = 0; + $this->multicurrency_tx = 1; + } } // get extrafields from original line From 471260738ab41260459150b7ad3ccefbb9af4574 Mon Sep 17 00:00:00 2001 From: IC-Florian <71641704+IC-Florian@users.noreply.github.com> Date: Wed, 21 Dec 2022 12:03:32 +0100 Subject: [PATCH 0208/1128] FIX : Product list in setup.php in new Module --- htdocs/modulebuilder/template/admin/setup.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/modulebuilder/template/admin/setup.php b/htdocs/modulebuilder/template/admin/setup.php index 1c46028b142..37fa410f1e7 100644 --- a/htdocs/modulebuilder/template/admin/setup.php +++ b/htdocs/modulebuilder/template/admin/setup.php @@ -55,6 +55,7 @@ global $langs, $user; // Libraries require_once DOL_DOCUMENT_ROOT."/core/lib/admin.lib.php"; require_once '../lib/mymodule.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; //require_once "../class/myclass.class.php"; // Translations From a48d1ae8e392cc2b2ad9d9c324983d1e6193c1b1 Mon Sep 17 00:00:00 2001 From: Gauthier PC portable 024 Date: Wed, 21 Dec 2022 12:31:24 +0100 Subject: [PATCH 0209/1128] FIX : multicurrency_tx and not currency_tx --- htdocs/compta/facture/card.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index c0d7cf53a5d..4f3d9230899 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -2929,8 +2929,8 @@ if ($action == 'create') { $remise_absolue = (!empty($expesrc->remise_absolue) ? $expesrc->remise_absolue : (!empty($soc->remise_absolue) ? $soc->remise_absolue : 0)); if (!empty($conf->multicurrency->enabled)) { - $currency_code = (!empty($expesrc->currency_code) ? $expesrc->currency_code : (!empty($soc->currency_code) ? $soc->currency_code : $objectsrc->multicurrency_code)); - $currency_tx = (!empty($expesrc->currency_tx) ? $expesrc->currency_tx : (!empty($soc->currency_tx) ? $soc->currency_tx : $objectsrc->currency_tx)); + $currency_code = (!empty($expesrc->multicurrency_code) ? $expesrc->multicurrency_code : (!empty($soc->multicurrency_code) ? $soc->multicurrency_code : $objectsrc->multicurrency_code)); + $currency_tx = (!empty($expesrc->multicurrency_tx) ? $expesrc->multicurrency_tx : (!empty($soc->multicurrency_tx) ? $soc->multicurrency_tx : $objectsrc->multicurrency_tx)); } //Replicate extrafields From c033a4778e68f8371ff7a4983a0751de0ed6b591 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josep=20Llu=C3=ADs?= Date: Wed, 21 Dec 2022 13:17:18 +0100 Subject: [PATCH 0210/1128] New filter for Signed+Billed in proposals New filter for Signed+Billed in proposals --- htdocs/core/class/html.formpropal.class.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/htdocs/core/class/html.formpropal.class.php b/htdocs/core/class/html.formpropal.class.php index e23e71a8124..d9c458161bc 100644 --- a/htdocs/core/class/html.formpropal.class.php +++ b/htdocs/core/class/html.formpropal.class.php @@ -132,6 +132,14 @@ class FormPropal print ''; $i++; } + //Option for Signed+Billed + if ($selected != '' && $selected == "2,4") { + print ''; print ''; print ajax_combobox($htmlname, array(), 0, 0, 'resolve', ($showempty < 0 ? (string) $showempty : '-1'), $morecss); From 3004c3cd920b815651aaa36c491cd4444d7fb1e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josep=20Llu=C3=ADs?= Date: Wed, 21 Dec 2022 13:22:56 +0100 Subject: [PATCH 0211/1128] Update html.formpropal.class.php --- htdocs/core/class/html.formpropal.class.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/core/class/html.formpropal.class.php b/htdocs/core/class/html.formpropal.class.php index d9c458161bc..48551926e1f 100644 --- a/htdocs/core/class/html.formpropal.class.php +++ b/htdocs/core/class/html.formpropal.class.php @@ -1,5 +1,6 @@ + * Copyright (C) 2022 Josep Lluís Amador * * 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 From 80d6c262029ec69caec69db358fa4fbae5cc89ec Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Wed, 21 Dec 2022 12:31:33 +0000 Subject: [PATCH 0212/1128] Fixing style errors. --- htdocs/core/class/html.formpropal.class.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/htdocs/core/class/html.formpropal.class.php b/htdocs/core/class/html.formpropal.class.php index 48551926e1f..fbbf2c97fb7 100644 --- a/htdocs/core/class/html.formpropal.class.php +++ b/htdocs/core/class/html.formpropal.class.php @@ -135,12 +135,12 @@ class FormPropal } //Option for Signed+Billed if ($selected != '' && $selected == "2,4") { - print ''; + print ''; print ''; print ajax_combobox($htmlname, array(), 0, 0, 'resolve', ($showempty < 0 ? (string) $showempty : '-1'), $morecss); From 69b0cf9bcfeeab25166131128b3f229477255771 Mon Sep 17 00:00:00 2001 From: Gauthier PC portable 024 Date: Wed, 21 Dec 2022 14:05:54 +0100 Subject: [PATCH 0213/1128] FIX : include class multicurrency --- htdocs/commande/class/commande.class.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 12054c3ccb8..d56eeb2af0e 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -1281,6 +1281,7 @@ class Commande extends CommonOrder { global $conf, $hookmanager; + dol_include_once('/multicurrency/class/multicurrency.class.php'); dol_include_once('/core/class/extrafields.class.php'); $error = 0; From ca95d26f17d29426a6d12e45610b3f75246ffb60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josep=20Llu=C3=ADs?= Date: Wed, 21 Dec 2022 14:21:16 +0100 Subject: [PATCH 0214/1128] NEW option filter in proposals NEW option filter for NoSalesRepresentativeAffected in proposals list --- htdocs/comm/propal/list.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php index ed86a61d7bd..2426abad9f4 100644 --- a/htdocs/comm/propal/list.php +++ b/htdocs/comm/propal/list.php @@ -16,6 +16,7 @@ * Copyright (C) 2019-2021 Alexandre Spangaro * Copyright (C) 2021 Anthony Berton * Copyright (C) 2021 Frédéric France + * Copyright (C) 2022 Josep Lluís Amador * * 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 @@ -610,7 +611,9 @@ $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'user as u ON p.fk_user_author = u.rowid'; $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."projet as pr ON pr.rowid = p.fk_projet"; $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_availability as ava on (ava.rowid = p.fk_availability)"; // We'll need this table joined to the select in order to filter by sale -if ($search_sale > 0 || (empty($user->rights->societe->client->voir) && !$socid)) { +if ($search_sale == -2) { + $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON (sc.fk_soc = p.fk_soc)"; +} elseif ($search_sale > 0 || (empty($user->rights->societe->client->voir) && !$socid)) { $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; } if ($search_user > 0) { @@ -746,7 +749,9 @@ if ($search_date_delivery_start) { if ($search_date_delivery_end) { $sql .= " AND p.date_livraison <= '".$db->idate($search_date_delivery_end)."'"; } -if ($search_sale > 0) { +if ($search_sale == -2) { + $sql .= " AND sc.fk_user IS NULL"; +} elseif ($search_sale > 0) { $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $search_sale); } if ($search_user > 0) { @@ -1117,7 +1122,7 @@ if ($resql) { $langs->load("commercial"); $moreforfilter .= '
'; $tmptitle = $langs->trans('ThirdPartiesOfSaleRepresentative'); - $moreforfilter .= img_picto($tmptitle, 'user', 'class="pictofixedwidth"').$formother->select_salesrepresentatives($search_sale, 'search_sale', $user, 0, $tmptitle, 'maxwidth250 widthcentpercentminusx'); + $moreforfilter .= img_picto($tmptitle, 'user', 'class="pictofixedwidth"').$formother->select_salesrepresentatives($search_sale, 'search_sale', $user, 0, $tmptitle, 'maxwidth250 widthcentpercentminusx', 1); $moreforfilter .= '
'; } // If the user can view prospects other than his' From 690562c22ef7d1e9d49054f21d60bf3663fb7789 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Wed, 21 Dec 2022 16:43:38 +0100 Subject: [PATCH 0215/1128] add numbering modules for members --- htdocs/adherents/admin/member.php | 102 ++++++++++- htdocs/adherents/class/adherent.class.php | 44 ++++- htdocs/core/class/conf.class.php | 46 ++--- .../core/modules/asset/mod_asset_advanced.php | 2 +- htdocs/core/modules/asset/modules_asset.php | 2 +- .../barcode/doc/phpbarcode.modules.php | 2 +- htdocs/core/modules/bom/mod_bom_advanced.php | 2 +- htdocs/core/modules/bom/modules_bom.php | 2 +- .../cheque/mod_chequereceipt_thyme.php | 2 +- .../modules/cheque/modules_chequereceipts.php | 2 +- .../modules/commande/mod_commande_saphir.php | 2 +- .../modules/commande/modules_commande.php | 2 +- .../modules/delivery/mod_delivery_jade.php | 2 +- .../modules/delivery/mod_delivery_saphir.php | 4 +- .../modules/delivery/modules_delivery.php | 2 +- htdocs/core/modules/dons/modules_don.php | 2 +- .../expensereport/mod_expensereport_sand.php | 2 +- .../core/modules/facture/mod_facture_mars.php | 2 +- .../modules/facture/mod_facture_mercure.php | 2 +- .../modules/facture/mod_facture_terre.php | 2 +- .../core/modules/facture/modules_facture.php | 2 +- htdocs/core/modules/fichinter/mod_arctic.php | 2 +- .../modules/hrm/mod_evaluation_advanced.php | 2 +- .../core/modules/hrm/modules_evaluation.php | 2 +- .../modules/member/mod_member_advanced.php | 165 ++++++++++++++++++ .../core/modules/member/mod_member_simple.php | 85 +++------ .../modules/member/modules_member.class.php | 60 ++++++- htdocs/core/modules/mrp/mod_mo_advanced.php | 2 +- htdocs/core/modules/mrp/modules_mo.php | 2 +- .../core/modules/payment/mod_payment_ant.php | 2 +- .../core/modules/payment/modules_payment.php | 2 +- .../modules/product/modules_product.class.php | 2 +- .../product_batch/mod_lot_advanced.php | 2 +- .../modules/product_batch/mod_sn_advanced.php | 2 +- .../modules_product_batch.class.php | 2 +- .../modules/project/mod_project_universal.php | 2 +- .../core/modules/project/modules_project.php | 2 +- .../project/task/mod_task_universal.php | 2 +- .../modules/project/task/modules_task.php | 2 +- .../modules/propale/mod_propale_saphir.php | 2 +- .../core/modules/propale/modules_propale.php | 2 +- .../modules/societe/modules_societe.class.php | 2 +- .../mod_stocktransfer_advanced.php | 2 +- .../stocktransfer/modules_stocktransfer.php | 2 +- .../mod_commande_fournisseur_muguet.php | 2 +- .../mod_commande_fournisseur_orchidee.php | 4 +- .../mod_supplier_payment_brodator.php | 2 +- .../modules_supplier_payment.php | 2 +- .../mod_supplier_proposal_saphir.php | 2 +- .../modules_supplier_proposal.php | 2 +- .../takepos/mod_takepos_ref_universal.php | 2 +- .../core/modules/takepos/modules_takepos.php | 2 +- .../modules/ticket/mod_ticket_universal.php | 2 +- htdocs/core/modules/ticket/modules_ticket.php | 2 +- .../workstation/mod_workstation_advanced.php | 2 +- .../workstation/modules_workstation.php | 2 +- .../mod_knowledgerecord_advanced.php | 2 +- .../modules_knowledgerecord.php | 2 +- htdocs/langs/en_US/admin.lang | 3 + htdocs/langs/en_US/members.lang | 5 +- .../mymodule/mod_myobject_advanced.php | 2 +- .../modules/mymodule/modules_myobject.php | 2 +- .../partnership/mod_partnership_advanced.php | 2 +- .../partnership/modules_partnership.php | 2 +- .../mod_recruitmentcandidature_advanced.php | 2 +- .../mod_recruitmentjobposition_advanced.php | 2 +- .../modules_recruitmentcandidature.php | 2 +- .../modules_recruitmentjobposition.php | 2 +- 68 files changed, 479 insertions(+), 155 deletions(-) create mode 100644 htdocs/core/modules/member/mod_member_advanced.php diff --git a/htdocs/adherents/admin/member.php b/htdocs/adherents/admin/member.php index d20bd784ced..f9e15e88fca 100644 --- a/htdocs/adherents/admin/member.php +++ b/htdocs/adherents/admin/member.php @@ -152,10 +152,13 @@ if ($action == 'set_default') { setEventMessages('RecordModifiedSuccessfully', null, 'mesgs'); $db->commit(); } -} - -// Action to update or add a constant -if ($action == 'update' || $action == 'add') { +} elseif ($action == 'setcodemember') { + $result = dolibarr_set_const($db, "MEMBER_CODEMEMBER_ADDON", $value, 'chaine', 0, '', $conf->entity); + if ($result <= 0) { + dol_print_error($db); + } +} elseif ($action == 'update' || $action == 'add') { + // Action to update or add a constant $constname = GETPOST('constname', 'alpha'); $constvalue = (GETPOST('constvalue_'.$constname) ? GETPOST('constvalue_'.$constname) : GETPOST('constvalue')); @@ -223,6 +226,97 @@ $head = member_admin_prepare_head(); print dol_get_fiche_head($head, 'general', $langs->trans("Members"), -1, 'user'); +$dirModMember = array_merge(array('/core/modules/member/'), $conf->modules_parts['member']); +foreach ($conf->modules_parts['models'] as $mo) { + //Add more models + $dirModMember[] = $mo.'core/modules/member/'; +} + +// Module to manage customer/supplier code + +print load_fiche_titre($langs->trans("MemberCodeChecker"), '', ''); + +print '
'; +print '
'.price($sub_bom_line->qty, 0, '', 0, 0).''.($label !== '') ? $langs->trans($label) : '' . ''; + if ($label !== '') print $langs->trans($label); + print ''.$langs->trans('Yes').''.price($sub_bom_line->qty * $line->qty, 0, '', 0, 0).''; - print ''.($label !== '') ? $langs->trans($label) : '' . ' '.price($sub_bom_line->qty * $line->qty, 0, '', 0, 0).''; - if($label !== '') print $langs->trans($label); + if ($label !== '') print $langs->trans($label); print ' 
'; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->rowid, $arrayofselected)) { - $selected = 1; - } - print ''; + if ($mode == 'kanban') { + if ($i == 0) { + print '
'; + print '
'; } - print '
'.$obj->rowid.'"; - print $memberstatic->getNomUrl(-1, 0, 'card', 'ref', '', -1, 0, 1); - print ""; - print $obj->civility; - print "'; - print $memberstatic->getNomUrl(0, 0, 'card', 'firstname'); - //print $obj->firstname; - print "'; - print $memberstatic->getNomUrl(0, 0, 'card', 'lastname'); - //print $obj->lastname; - print "'; - if ($obj->gender) { - print $langs->trans("Gender".$obj->gender); - } - print ''; - print $companynametoshow; - print "'.$obj->login."'; - print $memberstatic->getmorphylib('', 2); - print "'; - print $membertypestatic->getNomUrl(1, 32); - print '
'; - print $obj->address; - print ''; - print $obj->zip; - print ''; - print $obj->town; - print '".$obj->state_name."'; - print dol_escape_htmltag($tmparray['label']); - print ''; - print $obj->phone; - print ''; - print $obj->phone_perso; - print ''; - print $obj->phone_mobile; - print ''; - print dol_print_email($obj->email, 0, 0, 1, 64, 1, 1); - print "'; - if ($datefin) { - print dol_print_date($datefin, 'day'); - if ($memberstatic->hasDelay()) { - $textlate = ' ('.$langs->trans("DateReference").' > '.$langs->trans("DateToday").' '.(ceil($conf->adherent->subscription->warning_delay / 60 / 60 / 24) >= 0 ? '+' : '').ceil($conf->adherent->subscription->warning_delay / 60 / 60 / 24).' '.$langs->trans("days").')'; - print " ".img_warning($langs->trans("SubscriptionLate").$textlate); + } else { + print '
'; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->rowid, $arrayofselected)) { + $selected = 1; + } + print ''; } - } else { - if (!empty($obj->subscription)) { - print ''.$langs->trans("SubscriptionNotReceived").''; - if ($obj->statut > 0) { - print " ".img_warning(); + print ''.$obj->rowid.'"; + print $memberstatic->getNomUrl(-1, 0, 'card', 'ref', '', -1, 0, 1); + print ""; + print $obj->civility; + print "'; + print $memberstatic->getNomUrl(0, 0, 'card', 'firstname'); + //print $obj->firstname; + print "'; + print $memberstatic->getNomUrl(0, 0, 'card', 'lastname'); + //print $obj->lastname; + print "'; + if ($obj->gender) { + print $langs->trans("Gender".$obj->gender); + } + print ''; + print $companynametoshow; + print "'.$obj->login."'; + print $memberstatic->getmorphylib('', 2); + print "'; + print $membertypestatic->getNomUrl(1, 32); + print ''; + print $obj->address; + print ''; + print $obj->zip; + print ''; + print $obj->town; + print '".$obj->state_name."'; + print dol_escape_htmltag($tmparray['label']); + print ''; + print $obj->phone; + print ''; + print $obj->phone_perso; + print ''; + print $obj->phone_mobile; + print ''; + print dol_print_email($obj->email, 0, 0, 1, 64, 1, 1); + print "'; + if ($datefin) { + print dol_print_date($datefin, 'day'); + if ($memberstatic->hasDelay()) { + $textlate = ' ('.$langs->trans("DateReference").' > '.$langs->trans("DateToday").' '.(ceil($conf->adherent->subscription->warning_delay / 60 / 60 / 24) >= 0 ? '+' : '').ceil($conf->adherent->subscription->warning_delay / 60 / 60 / 24).' '.$langs->trans("days").')'; + print " ".img_warning($langs->trans("SubscriptionLate").$textlate); } } else { - print ' '; + if (!empty($obj->subscription)) { + print ''.$langs->trans("SubscriptionNotReceived").''; + if ($obj->statut > 0) { + print " ".img_warning(); + } + } else { + print ' '; + } + } + print ''; + print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); + print ''; - print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); - print ''; - print dol_print_date($db->jdate($obj->birth), 'day', 'tzuser'); - print ''; - print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); - print ''; - print $memberstatic->LibStatut($obj->statut, $obj->subscription, $datefin, 5); - print ''; - print dol_escape_htmltag($obj->import_key); - print "'; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->rowid, $arrayofselected)) { - $selected = 1; + // Birth + if (!empty($arrayfields['d.birth']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->birth), 'day', 'tzuser'); + print ''; + print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); + print ''; + print $memberstatic->LibStatut($obj->statut, $obj->subscription, $datefin, 5); + print ''; + print dol_escape_htmltag($obj->import_key); + print "'; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->rowid, $arrayofselected)) { + $selected = 1; + } + print ''; + } + print '
'.$subscription->getNomUrl(1).'
'; + print '
'; } - } - // Type - if (!empty($arrayfields['d.fk_type']['checked'])) { - print '
'; - if ($typeid > 0) { - print $adht->getNomUrl(1); - } - print ''.$adherent->getNomUrl(-1, 0, 'card', 'lastname').''.$adherent->firstname.''.$adherent->login.''; - print $obj->note; - print ''; + + //fetch informations needs on this mode + $subscription->fk_adherent = $adherent->getNomUrl(1); + $subscription->fk_type = $adht->getNomUrl(1); + $subscription->amount = $obj->subscription; if ($obj->fk_account > 0) { $accountstatic->id = $obj->fk_account; $accountstatic->fetch($obj->fk_account); - //$accountstatic->label=$obj->label; - print $accountstatic->getNomUrl(1); + $subscription->fk_bank = $accountstatic->getNomUrl(1); } - print "
'.dol_print_date($db->jdate($obj->dateadh), 'day')."
'.$subscription->getNomUrl(1).''.dol_print_date($db->jdate($obj->datef), 'day')."'; + if ($typeid > 0) { + print $adht->getNomUrl(1); + } + print ''.price($obj->subscription).''.$adherent->getNomUrl(-1, 0, 'card', 'lastname').''.$adherent->firstname.''.$adherent->login.''; + print $obj->note; + print ''; + if ($obj->fk_account > 0) { + $accountstatic->id = $obj->fk_account; + $accountstatic->fetch($obj->fk_account); + //$accountstatic->label=$obj->label; + print $accountstatic->getNomUrl(1); + } + print "'.dol_print_date($db->jdate($obj->dateadh), 'day')."'.dol_print_date($db->jdate($obj->datef), 'day')."'.price($obj->subscription).''; + print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); + print ''; + print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->crowid, $arrayofselected)) { + $selected = 1; + } + print ''; } - } - // Extra fields - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - // Date creation - if (!empty($arrayfields['c.datec']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); print ''; - print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->crowid, $arrayofselected)) { - $selected = 1; - } - print ''; - } - print '
'; print '
'; } - + //fetch informations needs on this mode $subscription->fk_adherent = $adherent->getNomUrl(1); $subscription->fk_type = $adht->getNomUrl(1); @@ -538,9 +538,7 @@ while ($i < min($num, $limit)) { print '
'; print '
'; - print $membertype->getNomUrl(1); - //'.img_object($langs->trans("ShowType"),'group').' '.$objp->rowid.' - print ''.dol_escape_htmltag($objp->label).''; - if ($objp->morphy == 'phy') { - print $langs->trans("Physical"); - } elseif ($objp->morphy == 'mor') { - print $langs->trans("Moral"); + if ($mode == 'kanban') { + if ($i == 0) { + print '
'; + print '
'; + } + //output kanban + $membertype->label = $objp->label; + $membertype->getKanbanView(''); + if ($i == ($imaxinloop - 1)) { + print '
'; + print '
'; + print $membertype->getNomUrl(1); + //'.img_object($langs->trans("ShowType"),'group').' '.$objp->rowid.' + print ''.dol_escape_htmltag($objp->label).''; + if ($objp->morphy == 'phy') { + print $langs->trans("Physical"); + } elseif ($objp->morphy == 'mor') { + print $langs->trans("Moral"); + } else { + print $langs->trans("MorAndPhy"); + } + print ''.yn($objp->subscription).''.(is_null($objp->amount) || $objp->amount === '' ? '' : price($objp->amount)).''.yn($objp->caneditamount).''.yn($objp->vote).''.$membertype->getLibStatut(5).'rowid.'">'.img_edit().' 
'.yn($objp->subscription).''.(is_null($objp->amount) || $objp->amount === '' ? '' : price($objp->amount)).''.yn($objp->caneditamount).''.yn($objp->vote).''.$membertype->getLibStatut(5).'rowid.'">'.img_edit().' 
'; + print '
'; + } + $contactstatic->photo = $obj->photo; + $soc = new Societe($db); + $soc->fetch($obj->socid); + if ($obj->socid) { + $contactstatic->socid = $soc->getNomUrl(1); + } + print $contactstatic->getKanbanView(''); + if ($i == min($num, $limit) - 1) { + print '
'; + print '
'; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->rowid, $arrayofselected)) { - $selected = 1; + // Action column + if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->rowid, $arrayofselected)) { + $selected = 1; + } + print ''; } - print ''; + print ''; - print dol_escape_htmltag($obj->rowid); - print "'; + print dol_escape_htmltag($obj->rowid); + print "'; - print $contactstatic->getNomUrl(1); - print ''; + print $contactstatic->getNomUrl(1); + print ''.dol_escape_htmltag($obj->firstname).''.dol_escape_htmltag($obj->firstname).''.dol_escape_htmltag($obj->poste).''.dol_escape_htmltag($obj->poste).''.dol_escape_htmltag($obj->address).''.dol_escape_htmltag($obj->address).''.dol_escape_htmltag($obj->zip).''.dol_escape_htmltag($obj->zip).''.dol_escape_htmltag($obj->town).''.dol_escape_htmltag($obj->town).'".$obj->state_name."".$obj->region_name."'; - $tmparray = getCountry($obj->fk_pays, 'all'); - print dol_escape_htmltag($tmparray['label']); - print '".$obj->state_name."'.dol_print_phone($obj->phone_pro, $obj->country_code, $obj->rowid, $obj->socid, 'AC_TEL', ' ', 'phone').'".$obj->region_name."'; + $tmparray = getCountry($obj->fk_pays, 'all'); + print dol_escape_htmltag($tmparray['label']); + print ''.dol_print_phone($obj->phone_perso, $obj->country_code, $obj->rowid, $obj->socid, 'AC_TEL', ' ', 'phone').''.dol_print_phone($obj->phone_pro, $obj->country_code, $obj->rowid, $obj->socid, 'AC_TEL', ' ', 'phone').''.dol_print_phone($obj->phone_mobile, $obj->country_code, $obj->rowid, $obj->socid, 'AC_TEL', ' ', 'mobile').''.dol_print_phone($obj->phone_perso, $obj->country_code, $obj->rowid, $obj->socid, 'AC_TEL', ' ', 'phone').''.dol_print_phone($obj->fax, $obj->country_code, $obj->rowid, $obj->socid, 'AC_TEL', ' ', 'fax').''.dol_print_phone($obj->phone_mobile, $obj->country_code, $obj->rowid, $obj->socid, 'AC_TEL', ' ', 'mobile').''.dol_print_email($obj->email, $obj->rowid, $obj->socid, 'AC_EMAIL', 18, 0, 1).''.dol_print_phone($obj->fax, $obj->country_code, $obj->rowid, $obj->socid, 'AC_TEL', ' ', 'fax').''; - if (empty($obj->email)) { - //print ''.$langs->trans("NoEmail").''; - } else { - print yn(($obj->unsubscribed > 0) ? 1 : 0); + // EMail + if (!empty($arrayfields['p.email']['checked'])) { + print ''.dol_print_email($obj->email, $obj->rowid, $obj->socid, 'AC_EMAIL', 18, 0, 1).''; + if (empty($obj->email)) { + //print ''.$langs->trans("NoEmail").''; + } else { + print yn(($obj->unsubscribed > 0) ? 1 : 0); + } + print ''.(empty($arraysocialnetworks[$key]) ? '' : dol_print_socialnetworks($arraysocialnetworks[$key], $obj->rowid, $obj->socid, $key, $socialnetworks)).''.(empty($arraysocialnetworks[$key]) ? '' : dol_print_socialnetworks($arraysocialnetworks[$key], $obj->rowid, $obj->socid, $key, $socialnetworks)).''; - if ($obj->socid) { - $objsoc = new Societe($db); - $objsoc->fetch($obj->socid); - print $objsoc->getNomUrl(1); - } else { - print ' '; - } - print ''.$contactstatic->LibPubPriv($obj->priv).''; - print $contactstatic->getLibProspLevel(); - print "
'; - print '
'.$contactstatic->libProspCommStatut($obj->stcomm_id, 2, $contactstatic->cacheprospectstatus[$obj->stcomm_id]['label'], $obj->stcomm_picto); - print '
-
'; - foreach ($contactstatic->cacheprospectstatus as $key => $val) { - $titlealt = 'default'; - if (!empty($val['code']) && !in_array($val['code'], array('ST_NO', 'ST_NEVER', 'ST_TODO', 'ST_PEND', 'ST_DONE'))) { - $titlealt = $val['label']; + // Company + if (!empty($arrayfields['p.fk_soc']['checked']) || !empty($arrayfields['s.nom']['checked'])) { + print '
'; + if ($obj->socid) { + $objsoc = new Societe($db); + $objsoc->fetch($obj->socid); + print $objsoc->getNomUrl(1); + } else { + print ' '; } - if ($obj->stcomm_id != $val['id']) { - print ''.img_action($titlealt, $val['code'], $val['picto']).''; + print ''; - print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); - print ''; - print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); - print ''.$contactstatic->getLibStatut(5).''; - print dol_escape_htmltag($obj->import_key); - print "'; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->rowid, $arrayofselected)) { - $selected = 1; + // Private/Public + if (!empty($arrayfields['p.priv']['checked'])) { + print ''.$contactstatic->LibPubPriv($obj->priv).'
'; + print $contactstatic->getLibProspLevel(); + print "
'; + print '
'.$contactstatic->libProspCommStatut($obj->stcomm_id, 2, $contactstatic->cacheprospectstatus[$obj->stcomm_id]['label'], $obj->stcomm_picto); + print '
-
'; + foreach ($contactstatic->cacheprospectstatus as $key => $val) { + $titlealt = 'default'; + if (!empty($val['code']) && !in_array($val['code'], array('ST_NO', 'ST_NEVER', 'ST_TODO', 'ST_PEND', 'ST_DONE'))) { + $titlealt = $val['label']; + } + if ($obj->stcomm_id != $val['id']) { + print ''.img_action($titlealt, $val['code'], $val['picto']).''; + } + } + print '
'; + print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); + print ''; + print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); + print ''.$contactstatic->getLibStatut(5).''; + print dol_escape_htmltag($obj->import_key); + print "'; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->rowid, $arrayofselected)) { + $selected = 1; + } + print ''; + } + print '
'; + print '
'; + } + $object->socid = $companystatic->getNomUrl(1); + $object->date_delivery = $obj->delivery_date; + $object->town = $obj->town; + print $object->getKanbanView(''); + if ($i == min($num, $limit) - 1) { + print '
'; + print '
'; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->rowid, $arrayofselected)) { - $selected = 1; + // Action column + if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->rowid, $arrayofselected)) { + $selected = 1; + } + print ''; } - print ''; - } - print ''; - print $shipment->getNomUrl(1); - print ""; - print $obj->ref_customer; - print "'; - print $companystatic->getNomUrl(1); - print ''; - print $obj->town; - print ''; - print $obj->zip; - print ''.$obj->state_name."'; - $tmparray = getCountry($obj->fk_pays, 'all'); - print $tmparray['label']; - print ''; - if (isset($typenArray[$obj->typent_code])) { - print $typenArray[$obj->typent_code]; - } - print ''; - if (empty($object->trueWeight)) { - $tmparray = $object->getTotalWeightVolume(); - print showDimensionInBestUnit($tmparray['weight'], 0, "weight", $langs, isset($conf->global->MAIN_WEIGHT_DEFAULT_ROUND) ? $conf->global->MAIN_WEIGHT_DEFAULT_ROUND : -1, isset($conf->global->MAIN_WEIGHT_DEFAULT_UNIT) ? $conf->global->MAIN_WEIGHT_DEFAULT_UNIT : 'no'); - print $form->textwithpicto('', $langs->trans('EstimatedWeight'), 1); - } else { - print $object->trueWeight; - print ($object->trueWeight && $object->weight_units != '') ? ' '.measuringUnitString(0, "weight", $object->weight_units) : ''; - } - print ''; - print dol_print_date($db->jdate($obj->delivery_date), "dayhour"); - print "'; - if ($shipment->shipping_method_id > 0) print $langs->trans("SendingMethod".strtoupper($code)); - print ''.$shipment->tracking_url."'; - print !empty($receiving) ? $receiving->getNomUrl($db) : ''; print ''; - print dol_print_date($db->jdate($obj->date_reception), "day"); - print ''; - print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); - print ''; - print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); - print ''.$shipment->LibStatut($obj->fk_statut, 5).''.yn($obj->billed).''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->rowid, $arrayofselected)) { - $selected = 1; + // Ref + if (!empty($arrayfields['e.ref']['checked'])) { + print ''; + print $shipment->getNomUrl(1); + print "
"; + print $obj->ref_customer; + print "'; + print $companystatic->getNomUrl(1); + print ''; + print $obj->town; + print ''; + print $obj->zip; + print ''.$obj->state_name."'; + $tmparray = getCountry($obj->fk_pays, 'all'); + print $tmparray['label']; + print ''; + if (isset($typenArray[$obj->typent_code])) { + print $typenArray[$obj->typent_code]; + } + print ''; + if (empty($object->trueWeight)) { + $tmparray = $object->getTotalWeightVolume(); + print showDimensionInBestUnit($tmparray['weight'], 0, "weight", $langs, isset($conf->global->MAIN_WEIGHT_DEFAULT_ROUND) ? $conf->global->MAIN_WEIGHT_DEFAULT_ROUND : -1, isset($conf->global->MAIN_WEIGHT_DEFAULT_UNIT) ? $conf->global->MAIN_WEIGHT_DEFAULT_UNIT : 'no'); + print $form->textwithpicto('', $langs->trans('EstimatedWeight'), 1); + } else { + print $object->trueWeight; + print ($object->trueWeight && $object->weight_units != '') ? ' '.measuringUnitString(0, "weight", $object->weight_units) : ''; + } + print ''; + print dol_print_date($db->jdate($obj->delivery_date), "dayhour"); + print "'; + if ($shipment->shipping_method_id > 0) print $langs->trans("SendingMethod".strtoupper($code)); + print ''.$shipment->tracking_url."'; + print !empty($receiving) ? $receiving->getNomUrl($db) : ''; + print ''; + print dol_print_date($db->jdate($obj->date_reception), "day"); + print ''; + print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); + print ''; + print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); + print ''.$shipment->LibStatut($obj->fk_statut, 5).''.yn($obj->billed).''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->rowid, $arrayofselected)) { + $selected = 1; + } + print ''; + } + print '
'.$langs->trans("ProjectLabel").'
'.$langs->trans("Label").'
'.$langs->trans("OpportunityStatus").''; print $formproject->selectOpportunityStatus('opp_status', GETPOSTISSET('opp_status') ? GETPOST('opp_status') : $object->opp_status, 1, 0, 0, 0, '', 0, 1); - print '
'.$langs->trans("OpportunityProbability").' %'; + print ' %'; print ''; print '
'.$langs->trans("OpportunityAmount").''; + print ' '.$langs->getCurrencySymbol($conf->currency); + print '
'.$langs->trans("Budget").'
'.$langs->trans("Budget").''; + print ' '.$langs->getCurrencySymbol($conf->currency); + print '
'.$langs->trans("OpportunityStatus").''; - print $formproject->selectOpportunityStatus('opp_status', $object->opp_status, 1, 0, 0, 0, 'inline-block valignmiddle', 0, 1); - print ''; - print '
'.$langs->trans("OpportunityProbability").' %'; - print ''; + print ' %'; + print ''; + print ''; + + print ''; + print '
'.$langs->trans("OpportunityAmount").''; + print ''; print $langs->getCurrencySymbol($conf->currency); print '
'.$langs->trans("Budget").''; + print '
'.$langs->trans("Budget").''; print $langs->getCurrencySymbol($conf->currency); print '
'.$langs->trans("OpportunityProbability").''; + print ' / '; if (strcmp($object->opp_percent, '')) { print price($object->opp_percent, 0, $langs, 1, 0).' %'; } - print '
'.$langs->trans("OpportunityAmount").''; @@ -1268,6 +1356,25 @@ if ($action == 'create' && $user->rights->projet->creer) { print ''; + // Set also dependencies between use taks and bill time + print ''; + // Change probability from status if (!empty($conf->use_javascript_ajax) && !empty($conf->global->PROJECT_USE_OPPORTUNITIES)) { // Default value to close or not when we set opp to 'WON'. @@ -1308,19 +1415,23 @@ if ($action == 'create' && $user->rights->projet->creer) { } /* Change percent with default percent (defaultpercent) if new status (defaultpercent) is higher than current (jQuery("#opp_percent").val()) */ - console.log("oldpercent="+oldpercent); if (oldpercent != \'\' && (parseFloat(defaultpercent) < parseFloat(oldpercent))) { - if (jQuery("#opp_percent").val() != \'\' && oldpercent != \'\') jQuery("#oldopppercent").text(\' - '.dol_escape_js($langs->transnoentities("PreviousValue")).': \'+oldpercent+\' %\'); - if (parseFloat(oldpercent) != 100) { jQuery("#opp_percent").val(oldpercent); } - else { jQuery("#opp_percent").val(defaultpercent); } + console.log("oldpercent="+oldpercent+" defaultpercent="+defaultpercent+" def < old"); + if (jQuery("#opp_percent").val() != \'\' && oldpercent != \'\') { + jQuery("#oldopppercent").text(\' - '.dol_escape_js($langs->transnoentities("PreviousValue")).': \'+price2numjs(oldpercent)+\' %\'); + } + + if (parseFloat(oldpercent) != 100 && elemcode != \'LOST\') { jQuery("#opp_percent").val(oldpercent); } + else { jQuery("#opp_percent").val(price2numjs(defaultpercent)); } } else { + console.log("oldpercent="+oldpercent+" defaultpercent="+defaultpercent); if ((parseFloat(jQuery("#opp_percent").val()) < parseFloat(defaultpercent))); { - if (jQuery("#opp_percent").val() != \'\' && oldpercent != \'\') jQuery("#oldopppercent").text(\' - '.dol_escape_js($langs->transnoentities("PreviousValue")).': \'+oldpercent+\' %\'); - jQuery("#opp_percent").val(defaultpercent); + if (jQuery("#opp_percent").val() != \'\' && oldpercent != \'\') jQuery("#oldopppercent").text(\' - '.dol_escape_js($langs->transnoentities("PreviousValue")).': \'+price2numjs(oldpercent)+\' %\'); + jQuery("#opp_percent").val(price2numjs(defaultpercent)); } } } From 3680f20465624c9fa4d70dd22d1f7ad976341fdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Wed, 21 Dec 2022 08:41:19 +0100 Subject: [PATCH 0203/1128] use user->hasRight --- .../actions_adherentcard_default.class.php | 2 +- .../default/tpl/adherentcard_view.tpl.php | 4 ++-- htdocs/adherents/class/api_members.class.php | 16 ++++++++-------- .../adherents/class/api_memberstypes.class.php | 10 +++++----- .../class/api_subscriptions.class.php | 8 ++++---- htdocs/adherents/htpasswd.php | 2 +- htdocs/adherents/subscription.php | 6 +++--- htdocs/adherents/subscription/card.php | 18 +++++++++--------- htdocs/adherents/subscription/info.php | 2 +- htdocs/adherents/subscription/list.php | 4 ++-- htdocs/adherents/tpl/linkedobjectblock.tpl.php | 2 +- htdocs/adherents/type.php | 8 ++++---- htdocs/adherents/type_translation.php | 6 +++--- htdocs/adherents/vcard.php | 10 +++++----- 14 files changed, 49 insertions(+), 49 deletions(-) diff --git a/htdocs/adherents/canvas/default/actions_adherentcard_default.class.php b/htdocs/adherents/canvas/default/actions_adherentcard_default.class.php index c79143ab345..18b778fc346 100644 --- a/htdocs/adherents/canvas/default/actions_adherentcard_default.class.php +++ b/htdocs/adherents/canvas/default/actions_adherentcard_default.class.php @@ -112,7 +112,7 @@ class ActionsAdherentCardDefault extends ActionsAdherentCardCommon $this->tpl['actionsdone'] = show_actions_done($conf, $langs, $db, $objsoc, $this->object, 1); } else { // Confirm delete contact - if ($action == 'delete' && $user->rights->adherent->supprimer) { + if ($action == 'delete' && $user->hasRight('adherent', 'supprimer')) { $this->tpl['action_delete'] = $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$this->object->id, $langs->trans("DeleteAdherent"), $langs->trans("ConfirmDeleteAdherent"), "confirm_delete", '', 0, 1); } } diff --git a/htdocs/adherents/canvas/default/tpl/adherentcard_view.tpl.php b/htdocs/adherents/canvas/default/tpl/adherentcard_view.tpl.php index 14da758457f..a3b3789d492 100644 --- a/htdocs/adherents/canvas/default/tpl/adherentcard_view.tpl.php +++ b/htdocs/adherents/canvas/default/tpl/adherentcard_view.tpl.php @@ -132,8 +132,8 @@ if (empty($user->socid)) { echo ''.$langs->trans("CreateDolibarrLogin").''; } - if ($user->rights->adherent->supprimer) { - print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$this->control->tpl['id'].'&action=delete&token='.newToken().'&canvas='.$canvas, 'delete', $user->rights->adherent->supprimer); + if ($user->hasRight('adherent', 'supprimer')) { + print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$this->control->tpl['id'].'&action=delete&token='.newToken().'&canvas='.$canvas, 'delete', $user->hasRight('adherent', 'supprimer')); } echo '
'; diff --git a/htdocs/adherents/class/api_members.class.php b/htdocs/adherents/class/api_members.class.php index 51ef1153a57..1e1f8db1bbf 100644 --- a/htdocs/adherents/class/api_members.class.php +++ b/htdocs/adherents/class/api_members.class.php @@ -62,7 +62,7 @@ class Members extends DolibarrApi */ public function get($id) { - if (!DolibarrApiAccess::$user->rights->adherent->lire) { + if (!DolibarrApiAccess::$user->hasRight('adherent', 'lire')) { throw new RestException(401); } @@ -99,7 +99,7 @@ class Members extends DolibarrApi */ public function getByThirdparty($thirdparty) { - if (!DolibarrApiAccess::$user->rights->adherent->lire) { + if (!DolibarrApiAccess::$user->hasRight('adherent', 'lire')) { throw new RestException(401); } @@ -132,7 +132,7 @@ class Members extends DolibarrApi */ public function getByThirdpartyEmail($email) { - if (!DolibarrApiAccess::$user->rights->adherent->lire) { + if (!DolibarrApiAccess::$user->hasRight('adherent', 'lire')) { throw new RestException(401); } @@ -171,7 +171,7 @@ class Members extends DolibarrApi */ public function getByThirdpartyBarcode($barcode) { - if (!DolibarrApiAccess::$user->rights->adherent->lire) { + if (!DolibarrApiAccess::$user->hasRight('adherent', 'lire')) { throw new RestException(401); } @@ -217,7 +217,7 @@ class Members extends DolibarrApi $obj_ret = array(); - if (!DolibarrApiAccess::$user->rights->adherent->lire) { + if (!DolibarrApiAccess::$user->hasRight('adherent', 'lire')) { throw new RestException(401); } @@ -370,7 +370,7 @@ class Members extends DolibarrApi */ public function delete($id) { - if (!DolibarrApiAccess::$user->rights->adherent->supprimer) { + if (!DolibarrApiAccess::$user->hasRight('adherent', 'supprimer')) { throw new RestException(401); } $member = new Adherent($this->db); @@ -464,7 +464,7 @@ class Members extends DolibarrApi { $obj_ret = array(); - if (!DolibarrApiAccess::$user->rights->adherent->cotisation->lire) { + if (!DolibarrApiAccess::$user->hasRight('adherent', 'cotisation', 'lire')) { throw new RestException(401); } @@ -495,7 +495,7 @@ class Members extends DolibarrApi */ public function createSubscription($id, $start_date, $end_date, $amount, $label = '') { - if (!DolibarrApiAccess::$user->rights->adherent->cotisation->creer) { + if (!DolibarrApiAccess::$user->hasRight('adherent', 'cotisation', 'creer')) { throw new RestException(401); } diff --git a/htdocs/adherents/class/api_memberstypes.class.php b/htdocs/adherents/class/api_memberstypes.class.php index 95c514bfedf..e7c039d1038 100644 --- a/htdocs/adherents/class/api_memberstypes.class.php +++ b/htdocs/adherents/class/api_memberstypes.class.php @@ -55,7 +55,7 @@ class MembersTypes extends DolibarrApi */ public function get($id) { - if (!DolibarrApiAccess::$user->rights->adherent->lire) { + if (!DolibarrApiAccess::$user->hasRight('adherent', 'lire')) { throw new RestException(401); } @@ -92,7 +92,7 @@ class MembersTypes extends DolibarrApi $obj_ret = array(); - if (!DolibarrApiAccess::$user->rights->adherent->lire) { + if (!DolibarrApiAccess::$user->hasRight('adherent', 'lire')) { throw new RestException(401); } @@ -151,7 +151,7 @@ class MembersTypes extends DolibarrApi */ public function post($request_data = null) { - if (!DolibarrApiAccess::$user->rights->adherent->configurer) { + if (!DolibarrApiAccess::$user->hasRight('adherent', 'configurer')) { throw new RestException(401); } // Check mandatory fields @@ -176,7 +176,7 @@ class MembersTypes extends DolibarrApi */ public function put($id, $request_data = null) { - if (!DolibarrApiAccess::$user->rights->adherent->configurer) { + if (!DolibarrApiAccess::$user->hasRight('adherent', 'configurer')) { throw new RestException(401); } @@ -216,7 +216,7 @@ class MembersTypes extends DolibarrApi */ public function delete($id) { - if (!DolibarrApiAccess::$user->rights->adherent->configurer) { + if (!DolibarrApiAccess::$user->hasRight('adherent', 'configurer')) { throw new RestException(401); } $membertype = new AdherentType($this->db); diff --git a/htdocs/adherents/class/api_subscriptions.class.php b/htdocs/adherents/class/api_subscriptions.class.php index 67484a723fd..dd01ca94027 100644 --- a/htdocs/adherents/class/api_subscriptions.class.php +++ b/htdocs/adherents/class/api_subscriptions.class.php @@ -58,7 +58,7 @@ class Subscriptions extends DolibarrApi */ public function get($id) { - if (!DolibarrApiAccess::$user->rights->adherent->cotisation->lire) { + if (!DolibarrApiAccess::$user->hasRight('adherent', 'cotisation', 'lire')) { throw new RestException(401); } @@ -91,7 +91,7 @@ class Subscriptions extends DolibarrApi $obj_ret = array(); - if (!DolibarrApiAccess::$user->rights->adherent->cotisation->lire) { + if (!DolibarrApiAccess::$user->hasRight('adherent', 'cotisation', 'lire')) { throw new RestException(401); } @@ -148,7 +148,7 @@ class Subscriptions extends DolibarrApi */ public function post($request_data = null) { - if (!DolibarrApiAccess::$user->rights->adherent->cotisation->creer) { + if (!DolibarrApiAccess::$user->hasRight('adherent', 'cotisation', 'creer')) { throw new RestException(401); } // Check mandatory fields @@ -206,7 +206,7 @@ class Subscriptions extends DolibarrApi public function delete($id) { // The right to delete a subscription comes with the right to create one. - if (!DolibarrApiAccess::$user->rights->adherent->cotisation->creer) { + if (!DolibarrApiAccess::$user->hasRight('adherent', 'cotisation', 'creer')) { throw new RestException(401); } $subscription = new Subscription($this->db); diff --git a/htdocs/adherents/htpasswd.php b/htdocs/adherents/htpasswd.php index a97a0a74d28..a36f8092add 100644 --- a/htdocs/adherents/htpasswd.php +++ b/htdocs/adherents/htpasswd.php @@ -37,7 +37,7 @@ $sortorder = GETPOST('sortorder', 'aZ09'); if (!isModEnabled('adherent')) { accessforbidden(); } -if (empty($user->rights->adherent->export)) { +if (!$user->hasRight('adherent', 'export')) { accessforbidden(); } diff --git a/htdocs/adherents/subscription.php b/htdocs/adherents/subscription.php index aa505691fda..154a1bffd1f 100644 --- a/htdocs/adherents/subscription.php +++ b/htdocs/adherents/subscription.php @@ -201,7 +201,7 @@ if (empty($reshook) && $action == 'setsocid') { } } -if ($user->rights->adherent->cotisation->creer && $action == 'subscription' && !$cancel) { +if ($user->hasRight('adherent', 'cotisation', 'creer') && $action == 'subscription' && !$cancel) { $error = 0; $langs->load("banks"); @@ -674,7 +674,7 @@ if ($rowid > 0) { */ // Button to create a new subscription if member no draft (-1) neither resiliated (0) neither excluded (-2) - if ($user->rights->adherent->cotisation->creer) { + if ($user->hasRight('adherent', 'cotisation', 'creer')) { if ($action != 'addsubscription' && $action != 'create_thirdparty') { print '
'; @@ -814,7 +814,7 @@ if ($rowid > 0) { /* * Add new subscription form */ - if (($action == 'addsubscription' || $action == 'create_thirdparty') && $user->rights->adherent->cotisation->creer) { + if (($action == 'addsubscription' || $action == 'create_thirdparty') && $user->hasRight('adherent', 'cotisation', 'creer')) { print '
'; print load_fiche_titre($langs->trans("NewCotisation")); diff --git a/htdocs/adherents/subscription/card.php b/htdocs/adherents/subscription/card.php index 83f1a01441c..15b33d0018a 100644 --- a/htdocs/adherents/subscription/card.php +++ b/htdocs/adherents/subscription/card.php @@ -49,13 +49,13 @@ $note = GETPOST('note', 'alpha'); $typeid = (int) GETPOST('typeid', 'int'); $amount = price2num(GETPOST('amount', 'alpha'), 'MT'); -if (empty($user->rights->adherent->cotisation->lire)) { +if (!$user->hasRight('adherent', 'cotisation', 'lire')) { accessforbidden(); } -$permissionnote = $user->rights->adherent->cotisation->creer; // Used by the include of actions_setnotes.inc.php -$permissiondellink = $user->rights->adherent->cotisation->creer; // Used by the include of actions_dellink.inc.php -$permissiontoedit = $user->rights->adherent->cotisation->creer; // Used by the include of actions_lineupdonw.inc.php +$permissionnote = $user->hasRight('adherent', 'cotisation', 'creer'); // Used by the include of actions_setnotes.inc.php +$permissiondellink = $user->hasRight('adherent', 'cotisation', 'creer'); // Used by the include of actions_dellink.inc.php +$permissiontoedit = $user->hasRight('adherent', 'cotisation', 'creer'); // Used by the include of actions_lineupdonw.inc.php $hookmanager->initHooks(array('subscriptioncard', 'globalcard')); @@ -78,7 +78,7 @@ include DOL_DOCUMENT_ROOT.'/core/actions_dellink.inc.php'; // Must be include, n //include DOL_DOCUMENT_ROOT.'/core/actions_lineupdown.inc.php'; // Must be include, not include_once -if ($user->rights->adherent->cotisation->creer && $action == 'update' && !$cancel) { +if ($user->hasRight('adherent', 'cotisation', 'creer') && $action == 'update' && !$cancel) { // Load current object $result = $object->fetch($rowid); if ($result > 0) { @@ -140,7 +140,7 @@ if ($user->rights->adherent->cotisation->creer && $action == 'update' && !$cance } } -if ($action == 'confirm_delete' && $confirm == 'yes' && $user->rights->adherent->cotisation->creer) { +if ($action == 'confirm_delete' && $confirm == 'yes' && $user->hasRight('adherent', 'cotisation', 'creer')) { $result = $object->fetch($rowid); $result = $object->delete($user); if ($result > 0) { @@ -166,7 +166,7 @@ llxHeader('', $langs->trans("SubscriptionCard"), $help_url); dol_htmloutput_errors($errmsg); -if ($user->rights->adherent->cotisation->creer && $action == 'edit') { +if ($user->hasRight('adherent', 'cotisation', 'creer') && $action == 'edit') { /******************************************** * * Subscription card in edit mode @@ -350,7 +350,7 @@ if ($rowid && $action != 'edit') { */ print '
'; - if ($user->rights->adherent->cotisation->creer) { + if ($user->hasRight('adherent', 'cotisation', 'creer')) { if (!empty($bankline->rappro)) { print '"; } else { @@ -359,7 +359,7 @@ if ($rowid && $action != 'edit') { } // Delete - if ($user->rights->adherent->cotisation->creer) { + if ($user->hasRight('adherent', 'cotisation', 'creer')) { print '\n"; } diff --git a/htdocs/adherents/subscription/info.php b/htdocs/adherents/subscription/info.php index 5faf1d31760..14afbafca50 100644 --- a/htdocs/adherents/subscription/info.php +++ b/htdocs/adherents/subscription/info.php @@ -32,7 +32,7 @@ require_once DOL_DOCUMENT_ROOT.'/adherents/class/subscription.class.php'; // Load translation files required by the page $langs->loadLangs(array("companies", "members", "bills", "users")); -if (empty($user->rights->adherent->lire)) { +if (!$user->hasRight('adherent', 'lire')) { accessforbidden(); } diff --git a/htdocs/adherents/subscription/list.php b/htdocs/adherents/subscription/list.php index 1523bd4ee90..a3d2bda0ba4 100644 --- a/htdocs/adherents/subscription/list.php +++ b/htdocs/adherents/subscription/list.php @@ -291,14 +291,14 @@ $arrayofmassactions = array( //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"), //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"), ); -//if ($user->rights->adherent->supprimer) $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete"); +//if ($user->hasRight('adherent', 'supprimer')) $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete"); if (in_array($massaction, array('presend', 'predelete'))) { $arrayofmassactions = array(); } $massactionbutton = $form->selectMassAction('', $arrayofmassactions); $newcardbutton = ''; -if ($user->rights->adherent->cotisation->creer) { +if ($user->hasRight('adherent', 'cotisation', 'creer')) { $newcardbutton .= dolGetButtonTitle($langs->trans('NewSubscription'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/adherents/list.php?status=-1,1'); } diff --git a/htdocs/adherents/tpl/linkedobjectblock.tpl.php b/htdocs/adherents/tpl/linkedobjectblock.tpl.php index 5928b706a8e..d4efa349202 100644 --- a/htdocs/adherents/tpl/linkedobjectblock.tpl.php +++ b/htdocs/adherents/tpl/linkedobjectblock.tpl.php @@ -39,7 +39,7 @@ foreach ($linkedObjectBlock as $key => $objectlink) { echo '
'.dol_print_date($objectlink->dateh, 'day').''; - if ($user->rights->adherent->lire) { + if ($user->hasRight('adherent', 'lire')) { $total = $total + $objectlink->amount; echo price($objectlink->amount); } diff --git a/htdocs/adherents/type.php b/htdocs/adherents/type.php index 962624db428..ea95b7eef1a 100644 --- a/htdocs/adherents/type.php +++ b/htdocs/adherents/type.php @@ -171,7 +171,7 @@ if ($action == 'add' && $user->hasRight('adherent', 'configurer')) { } } -if ($action == 'update' && $user->rights->adherent->configurer) { +if ($action == 'update' && $user->hasRight('adherent', 'configurer')) { $object->fetch($rowid); $object->oldcopy = dol_clone($object); @@ -207,7 +207,7 @@ if ($action == 'update' && $user->rights->adherent->configurer) { exit; } -if ($action == 'confirm_delete' && !empty($user->rights->adherent->configurer)) { +if ($action == 'confirm_delete' && $user->hasRight('adherent', 'configurer')) { $object->fetch($rowid); $res = $object->delete(); @@ -257,7 +257,7 @@ if (!$rowid && $action != 'create' && $action != 'edit') { } $newcardbutton = ''; - if ($user->rights->adherent->configurer) { + if ($user->hasRight('adherent', 'configurer')) { $newcardbutton .= dolGetButtonTitle($langs->trans('NewMemberType'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/adherents/type.php?action=create'); } @@ -323,7 +323,7 @@ if (!$rowid && $action != 'create' && $action != 'edit') { print ''.yn($objp->caneditamount).''.yn($objp->vote).''.$membertype->getLibStatut(5).'rowid.'">'.img_edit().' 
'."\n"; +print ''."\n"; +print ' '; +print ' '; +print ' '; +print ' '; +print ' '; +print "\n"; + +$arrayofmodules = array(); + +foreach ($dirModMember as $dirroot) { + $dir = dol_buildpath($dirroot, 0); + + $handle = @opendir($dir); + if (is_resource($handle)) { + // Loop on each module find in opened directory + while (($file = readdir($handle)) !== false) { + // module filename has to start with mod_member_ + if (substr($file, 0, 11) == 'mod_member_' && substr($file, -3) == 'php') { + $file = substr($file, 0, dol_strlen($file) - 4); + try { + dol_include_once($dirroot.$file.'.php'); + } catch (Exception $e) { + dol_syslog($e->getMessage(), LOG_ERR); + continue; + } + $modCodeMember = new $file; + // Show modules according to features level + if ($modCodeMember->version == 'development' && $conf->global->MAIN_FEATURES_LEVEL < 2) { + continue; + } + if ($modCodeMember->version == 'experimental' && $conf->global->MAIN_FEATURES_LEVEL < 1) { + continue; + } + + $arrayofmodules[$file] = $modCodeMember; + } + } + closedir($handle); + } +} + +$arrayofmodules = dol_sort_array($arrayofmodules, 'position'); + +foreach ($arrayofmodules as $file => $modCodeMember) { + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + + if (getDolGlobalString('MEMBER_CODEMEMBER_ADDON') == "$file") { + print '\n"; + } else { + $disabled = (isModEnabled('multicompany') && (is_object($mc) && !empty($mc->sharings['referent']) && $mc->sharings['referent'] != $conf->entity) ? true : false); + print ''; + } + + print ''; + + print ''; +} +print '
'.$langs->trans("Name").''.$langs->trans("Description").''.$langs->trans("Example").''.$langs->trans("Status").''.$langs->trans("ShortInfo").'
'.$modCodeMember->name.''.$modCodeMember->info($langs).''.$modCodeMember->getExample($langs).''."\n"; + print img_picto($langs->trans("Activated"), 'switch_on'); + print "'; + if (!$disabled) { + print ''; + } + print img_picto($langs->trans("Disabled"), 'switch_off'); + if (!$disabled) { + print ''; + } + print ''; + $s = $modCodeMember->getToolTip($langs, null, -1); + print $form->textwithpicto('', $s, 1); + print '
'; +print '
'; + +print "
"; + print '
'; print ''; print ''; diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php index 4c68b3e91ec..c4936fb6115 100644 --- a/htdocs/adherents/class/adherent.class.php +++ b/htdocs/adherents/class/adherent.class.php @@ -92,6 +92,7 @@ class Adherent extends CommonObject /** * @var string company name * @deprecated + * @see $company */ public $societe; @@ -102,8 +103,14 @@ class Adherent extends CommonObject /** * @var int Thirdparty ID + * @deprecated + * @see $socid */ public $fk_soc; + + /** + * @var int socid + */ public $socid; /** @@ -154,24 +161,28 @@ class Adherent extends CommonObject /** * @var string skype account * @deprecated + * @see $socialnetworks */ public $skype; /** * @var string twitter account * @deprecated + * @see $socialnetworks */ public $twitter; /** * @var string facebook account * @deprecated + * @see $socialnetworks */ public $facebook; /** * @var string linkedin account * @deprecated + * @see $socialnetworks */ public $linkedin; @@ -259,10 +270,19 @@ class Adherent extends CommonObject */ public $type; + /** + * @var int need_subscription + */ public $need_subscription; + /** + * @var int user_id + */ public $user_id; + /** + * @var string user_login + */ public $user_login; public $datefin; @@ -576,7 +596,7 @@ class Adherent extends CommonObject */ public function create($user, $notrigger = 0) { - global $conf, $langs; + global $conf, $langs, $mysoc; $error = 0; @@ -624,7 +644,22 @@ class Adherent extends CommonObject $id = $this->db->last_insert_id(MAIN_DB_PREFIX."adherent"); if ($id > 0) { $this->id = $id; - $this->ref = (string) $id; + if (getDolGlobalString('MEMBER_CODEMEMBER_ADDON') == '') { + // keep old numbering + $this->ref = (string) $id; + } else { + // auto code + $modfile = dol_buildpath('core/modules/member/'.getDolGlobalString('MEMBER_CODEMEMBER_ADDON').'.php', 0); + try { + require_once($modfile); + $modname = getDolGlobalString('MEMBER_CODEMEMBER_ADDON'); + $modCodeMember = new $modname; + $this->ref = $modCodeMember->getNextValue($mysoc, $this); + } catch (Exception $e) { + dol_syslog($e->getMessage(), LOG_ERR); + $error++; + } + } // Update minor fields $result = $this->update($user, 1, 1, 0, 0, 'add'); // nosync is 1 to avoid update data of user @@ -1505,7 +1540,7 @@ class Adherent extends CommonObject require_once DOL_DOCUMENT_ROOT.'/adherents/class/subscription.class.php'; - $sql = "SELECT c.rowid, c.fk_adherent, c.fk_type, c.subscription, c.note, c.fk_bank,"; + $sql = "SELECT c.rowid, c.fk_adherent, c.fk_type, c.subscription, c.note as note_public, c.fk_bank,"; $sql .= " c.tms as datem,"; $sql .= " c.datec as datec,"; $sql .= " c.dateadh as dateh,"; @@ -1537,7 +1572,8 @@ class Adherent extends CommonObject $subscription->fk_adherent = $obj->fk_adherent; $subscription->fk_type = $obj->fk_type; $subscription->amount = $obj->subscription; - $subscription->note = $obj->note; + $subscription->note = $obj->note_public; + $subscription->note_public = $obj->note_public; $subscription->fk_bank = $obj->fk_bank; $subscription->datem = $this->db->jdate($obj->datem); $subscription->datec = $this->db->jdate($obj->datec); diff --git a/htdocs/core/class/conf.class.php b/htdocs/core/class/conf.class.php index 279ccded71c..4bc04a27037 100644 --- a/htdocs/core/class/conf.class.php +++ b/htdocs/core/class/conf.class.php @@ -133,6 +133,7 @@ class Conf 'barcode' => array(), 'models' => array(), 'societe' => array(), + 'member' => array(), 'hooks' => array(), 'dir' => array(), 'syslog' => array() @@ -145,22 +146,22 @@ class Conf $this->expedition_bon = new stdClass(); $this->delivery_note = new stdClass(); $this->fournisseur = new stdClass(); - $this->product = new stdClass(); - $this->service = new stdClass(); - $this->contrat = new stdClass(); - $this->actions = new stdClass(); - $this->agenda = new stdClass(); + $this->product = new stdClass(); + $this->service = new stdClass(); + $this->contrat = new stdClass(); + $this->actions = new stdClass(); + $this->agenda = new stdClass(); $this->commande = new stdClass(); $this->propal = new stdClass(); - $this->facture = new stdClass(); - $this->contrat = new stdClass(); + $this->facture = new stdClass(); + $this->contrat = new stdClass(); $this->user = new stdClass(); - $this->adherent = new stdClass(); + $this->adherent = new stdClass(); $this->bank = new stdClass(); - $this->notification = new stdClass(); + $this->notification = new stdClass(); $this->mailing = new stdClass(); - $this->expensereport = new stdClass(); - $this->productbatch = new stdClass(); + $this->expensereport = new stdClass(); + $this->productbatch = new stdClass(); } /** @@ -215,22 +216,22 @@ class Conf $this->expedition_bon = new stdClass(); $this->delivery_note = new stdClass(); $this->fournisseur = new stdClass(); - $this->product = new stdClass(); - $this->service = new stdClass(); - $this->contrat = new stdClass(); - $this->actions = new stdClass(); - $this->agenda = new stdClass(); + $this->product = new stdClass(); + $this->service = new stdClass(); + $this->contrat = new stdClass(); + $this->actions = new stdClass(); + $this->agenda = new stdClass(); $this->commande = new stdClass(); $this->propal = new stdClass(); - $this->facture = new stdClass(); - $this->contrat = new stdClass(); + $this->facture = new stdClass(); + $this->contrat = new stdClass(); $this->user = new stdClass(); - $this->adherent = new stdClass(); + $this->adherent = new stdClass(); $this->bank = new stdClass(); - $this->notification = new stdClass(); + $this->notification = new stdClass(); $this->mailing = new stdClass(); - $this->expensereport = new stdClass(); - $this->productbatch = new stdClass(); + $this->expensereport = new stdClass(); + $this->productbatch = new stdClass(); // Common arrays $this->cache = array(); @@ -249,6 +250,7 @@ class Conf 'barcode' => array(), 'models' => array(), 'societe' => array(), + 'member' => array(), 'hooks' => array(), 'dir' => array(), 'syslog' => array(), diff --git a/htdocs/core/modules/asset/mod_asset_advanced.php b/htdocs/core/modules/asset/mod_asset_advanced.php index 34780c3423f..6266ce36bc0 100644 --- a/htdocs/core/modules/asset/mod_asset_advanced.php +++ b/htdocs/core/modules/asset/mod_asset_advanced.php @@ -53,7 +53,7 @@ class mod_asset_advanced extends ModeleNumRefAsset /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/asset/modules_asset.php b/htdocs/core/modules/asset/modules_asset.php index f7f361a10cc..6f399bbdc36 100644 --- a/htdocs/core/modules/asset/modules_asset.php +++ b/htdocs/core/modules/asset/modules_asset.php @@ -121,7 +121,7 @@ abstract class ModeleNumRefAsset /** * Returns the default description of the numbering template * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/barcode/doc/phpbarcode.modules.php b/htdocs/core/modules/barcode/doc/phpbarcode.modules.php index 4add94ffafb..d45a8f86cfc 100644 --- a/htdocs/core/modules/barcode/doc/phpbarcode.modules.php +++ b/htdocs/core/modules/barcode/doc/phpbarcode.modules.php @@ -58,7 +58,7 @@ class modPhpbarcode extends ModeleBarCode /** * Return description * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/bom/mod_bom_advanced.php b/htdocs/core/modules/bom/mod_bom_advanced.php index 2228d643434..22957b16997 100644 --- a/htdocs/core/modules/bom/mod_bom_advanced.php +++ b/htdocs/core/modules/bom/mod_bom_advanced.php @@ -54,7 +54,7 @@ class mod_bom_advanced extends ModeleNumRefboms /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/bom/modules_bom.php b/htdocs/core/modules/bom/modules_bom.php index 84182993756..9e68b527b9d 100644 --- a/htdocs/core/modules/bom/modules_bom.php +++ b/htdocs/core/modules/bom/modules_bom.php @@ -87,7 +87,7 @@ abstract class ModeleNumRefBoms /** * Returns the default description of the numbering template * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/cheque/mod_chequereceipt_thyme.php b/htdocs/core/modules/cheque/mod_chequereceipt_thyme.php index 40d63e63143..019d6ebb0df 100644 --- a/htdocs/core/modules/cheque/mod_chequereceipt_thyme.php +++ b/htdocs/core/modules/cheque/mod_chequereceipt_thyme.php @@ -48,7 +48,7 @@ class mod_chequereceipt_thyme extends ModeleNumRefChequeReceipts /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/cheque/modules_chequereceipts.php b/htdocs/core/modules/cheque/modules_chequereceipts.php index e50a6877848..f8802ef30af 100644 --- a/htdocs/core/modules/cheque/modules_chequereceipts.php +++ b/htdocs/core/modules/cheque/modules_chequereceipts.php @@ -54,7 +54,7 @@ abstract class ModeleNumRefChequeReceipts /** * Return the default description of numbering module * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/commande/mod_commande_saphir.php b/htdocs/core/modules/commande/mod_commande_saphir.php index 07dcfdced9e..a7809f2a181 100644 --- a/htdocs/core/modules/commande/mod_commande_saphir.php +++ b/htdocs/core/modules/commande/mod_commande_saphir.php @@ -54,7 +54,7 @@ class mod_commande_saphir extends ModeleNumRefCommandes /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/commande/modules_commande.php b/htdocs/core/modules/commande/modules_commande.php index 4f3378a0683..1ded188bae9 100644 --- a/htdocs/core/modules/commande/modules_commande.php +++ b/htdocs/core/modules/commande/modules_commande.php @@ -88,7 +88,7 @@ abstract class ModeleNumRefCommandes /** * Renvoie la description par defaut du modele de numerotation * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/delivery/mod_delivery_jade.php b/htdocs/core/modules/delivery/mod_delivery_jade.php index 605265fde00..3c238887e64 100644 --- a/htdocs/core/modules/delivery/mod_delivery_jade.php +++ b/htdocs/core/modules/delivery/mod_delivery_jade.php @@ -63,7 +63,7 @@ class mod_delivery_jade extends ModeleNumRefDeliveryOrder /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/delivery/mod_delivery_saphir.php b/htdocs/core/modules/delivery/mod_delivery_saphir.php index 7fc9b2e6e52..b7f241c9960 100644 --- a/htdocs/core/modules/delivery/mod_delivery_saphir.php +++ b/htdocs/core/modules/delivery/mod_delivery_saphir.php @@ -58,7 +58,7 @@ class mod_delivery_saphir extends ModeleNumRefDeliveryOrder /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { @@ -162,7 +162,7 @@ class mod_delivery_saphir extends ModeleNumRefDeliveryOrder * * @param Societe $objsoc Object thirdparty * @param Object $object Objet livraison - * @return string Texte descripif + * @return string Texte descriptif */ public function delivery_get_num($objsoc = 0, $object = '') { diff --git a/htdocs/core/modules/delivery/modules_delivery.php b/htdocs/core/modules/delivery/modules_delivery.php index 5bd3bd33866..d8a5895a258 100644 --- a/htdocs/core/modules/delivery/modules_delivery.php +++ b/htdocs/core/modules/delivery/modules_delivery.php @@ -90,7 +90,7 @@ abstract class ModeleNumRefDeliveryOrder /** * Renvoi la description par defaut du modele de numerotation * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/dons/modules_don.php b/htdocs/core/modules/dons/modules_don.php index cd332c48fcb..17b68024006 100644 --- a/htdocs/core/modules/dons/modules_don.php +++ b/htdocs/core/modules/dons/modules_don.php @@ -86,7 +86,7 @@ abstract class ModeleNumRefDons /** * Renvoi la description par defaut du modele de numerotation * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/expensereport/mod_expensereport_sand.php b/htdocs/core/modules/expensereport/mod_expensereport_sand.php index d14f17de067..1031741e946 100644 --- a/htdocs/core/modules/expensereport/mod_expensereport_sand.php +++ b/htdocs/core/modules/expensereport/mod_expensereport_sand.php @@ -57,7 +57,7 @@ class mod_expensereport_sand extends ModeleNumRefExpenseReport /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/facture/mod_facture_mars.php b/htdocs/core/modules/facture/mod_facture_mars.php index 9e0ff0d5b4e..35430f71940 100644 --- a/htdocs/core/modules/facture/mod_facture_mars.php +++ b/htdocs/core/modules/facture/mod_facture_mars.php @@ -72,7 +72,7 @@ class mod_facture_mars extends ModeleNumRefFactures /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/facture/mod_facture_mercure.php b/htdocs/core/modules/facture/mod_facture_mercure.php index 321741ea8a0..c673e69a6e7 100644 --- a/htdocs/core/modules/facture/mod_facture_mercure.php +++ b/htdocs/core/modules/facture/mod_facture_mercure.php @@ -49,7 +49,7 @@ class mod_facture_mercure extends ModeleNumRefFactures /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/facture/mod_facture_terre.php b/htdocs/core/modules/facture/mod_facture_terre.php index 2b11ee3976f..10a784dc005 100644 --- a/htdocs/core/modules/facture/mod_facture_terre.php +++ b/htdocs/core/modules/facture/mod_facture_terre.php @@ -88,7 +88,7 @@ class mod_facture_terre extends ModeleNumRefFactures /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/facture/modules_facture.php b/htdocs/core/modules/facture/modules_facture.php index 480c532cc1f..cdec804d778 100644 --- a/htdocs/core/modules/facture/modules_facture.php +++ b/htdocs/core/modules/facture/modules_facture.php @@ -96,7 +96,7 @@ abstract class ModeleNumRefFactures /** * Renvoi la description par defaut du modele de numerotation * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/fichinter/mod_arctic.php b/htdocs/core/modules/fichinter/mod_arctic.php index 8efd936601b..bd6529b7a33 100644 --- a/htdocs/core/modules/fichinter/mod_arctic.php +++ b/htdocs/core/modules/fichinter/mod_arctic.php @@ -59,7 +59,7 @@ class mod_arctic extends ModeleNumRefFicheinter /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/hrm/mod_evaluation_advanced.php b/htdocs/core/modules/hrm/mod_evaluation_advanced.php index cdb1cc20109..958573e13f0 100644 --- a/htdocs/core/modules/hrm/mod_evaluation_advanced.php +++ b/htdocs/core/modules/hrm/mod_evaluation_advanced.php @@ -54,7 +54,7 @@ class mod_evaluation_advanced extends ModeleNumRefEvaluation /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/hrm/modules_evaluation.php b/htdocs/core/modules/hrm/modules_evaluation.php index 36fc7e26d81..56bb769e1d0 100644 --- a/htdocs/core/modules/hrm/modules_evaluation.php +++ b/htdocs/core/modules/hrm/modules_evaluation.php @@ -86,7 +86,7 @@ abstract class ModeleNumRefEvaluation /** * Returns the default description of the numbering template * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/member/mod_member_advanced.php b/htdocs/core/modules/member/mod_member_advanced.php new file mode 100644 index 00000000000..3edb86030e8 --- /dev/null +++ b/htdocs/core/modules/member/mod_member_advanced.php @@ -0,0 +1,165 @@ + + * Copyright (C) 2022 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/ + */ + +/** + * \file htdocs/core/modules/member/mod_member_advanced.php + * \ingroup member + * \brief File with class to manage the numbering module Advanced for member references + */ + +require_once DOL_DOCUMENT_ROOT.'/core/modules/member/modules_member.class.php'; + + +/** + * Class to manage the numbering module Advanced for member references + */ +class mod_member_advanced extends ModeleNumRefMembers +{ + /** + * Dolibarr version of the loaded document + * @var string + */ + public $version = 'dolibarr'; + + /** + * prefix + * + * @var string + */ + public $prefix = 'MEM'; + + /** + * @var string Error code (or message) + */ + public $error = ''; + + /** + * @var string model name + */ + public $name = 'Advanced'; + + /** + * @var int Automatic numbering + */ + public $code_auto = 1; + + /** + * Return description of numbering module + * + * @return string Text with description + */ + public function info() + { + global $langs; + return $langs->trans("AdvancedNumRefModelDesc", $this->prefix); + } + + + /** + * Return an example of numbering module values + * + * @return string Example + */ + public function getExample() + { + return $this->prefix."2301-0001"; + } + + + /** + * Checks if the numbers already in the database do not + * cause conflicts that would prevent this numbering working. + * + * @return boolean false if conflict, true if ok + */ + public function canBeActivated() + { + global $conf, $langs, $db; + + $coyymm = ''; + $max = ''; + + $posindice = strlen($this->prefix) + 6; + $sql = "SELECT MAX(CAST(SUBSTRING(ref FROM ".$posindice.") AS SIGNED)) as max"; + $sql .= " FROM ".MAIN_DB_PREFIX."adherent"; + $sql .= " WHERE ref LIKE '".$db->escape($this->prefix)."____-%'"; + $sql .= " AND entity = ".$conf->entity; + $resql = $db->query($sql); + if ($resql) { + $row = $db->fetch_row($resql); + if ($row) { + $coyymm = substr($row[0], 0, 6); + $max = $row[0]; + } + } + if (!$coyymm || preg_match('/'.$this->prefix.'[0-9][0-9][0-9][0-9]/i', $coyymm)) { + return true; + } else { + $langs->load("errors"); + $this->error = $langs->trans('ErrorNumRefModel', $max); + return false; + } + } + + + /** + * Return next value + * + * @param Societe $objsoc Object third party + * @param Member $object Object we need next value for + * @return string Value if OK, 0 if KO + */ + public function getNextValue($objsoc, $object) + { + global $db, $conf; + + // First, we get the max value + $posindice = strlen($this->prefix) + 6; + $sql = "SELECT MAX(CAST(SUBSTRING(ref FROM ".$posindice.") AS SIGNED)) as max"; + $sql .= " FROM ".MAIN_DB_PREFIX."adherent"; + $sql .= " WHERE ref LIKE '".$db->escape($this->prefix)."____-%'"; + $sql .= " AND entity = ".$conf->entity; + + $resql = $db->query($sql); + if ($resql) { + $obj = $db->fetch_object($resql); + if ($obj) { + $max = intval($obj->max); + } else { + $max = 0; + } + } else { + dol_syslog("mod_member_advanced::getNextValue", LOG_DEBUG); + return -1; + } + + $date = empty($object->datec) ? dol_now() : $object->datec; + + $yymm = dol_print_date($date, '%y%m', 'gmt'); + + if ($max >= (pow(10, 4) - 1)) { + $num = $max + 1; // If counter > 9999, we do not format on 4 chars, we take number as it is + } else { + $num = sprintf("%04s", $max + 1); + } + + dol_syslog("mod_member_advanced::getNextValue return ".$this->prefix.$yymm."-".$num, LOG_INFO); + return $this->prefix.$yymm."-".$num; + } +} diff --git a/htdocs/core/modules/member/mod_member_simple.php b/htdocs/core/modules/member/mod_member_simple.php index 50eccd0f244..c45738c85cb 100644 --- a/htdocs/core/modules/member/mod_member_simple.php +++ b/htdocs/core/modules/member/mod_member_simple.php @@ -1,5 +1,6 @@ + * Copyright (C) 2022 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 @@ -34,27 +35,29 @@ class mod_member_simple extends ModeleNumRefMembers * Dolibarr version of the loaded document * @var string */ - public $version = 'dolibarr'; // 'development', 'experimental', 'dolibarr' + public $version = 'dolibarr'; - public $prefix = 'MEM'; + /** + * prefix + * + * @var string + */ + public $prefix = ''; /** * @var string Error code (or message) */ public $error = ''; - /** - * @var string Nom du modele - * @deprecated - * @see $name - */ - public $nom = 'Simple'; - /** * @var string model name */ public $name = 'Simple'; + /** + * @var int Automatic numbering + */ + public $code_auto = 1; /** * Return description of numbering module @@ -64,7 +67,7 @@ class mod_member_simple extends ModeleNumRefMembers public function info() { global $langs; - return $langs->trans("SimpleNumRefModelDesc", $this->prefix); + return $langs->trans("SimpleRefNumRefModelDesc"); } @@ -75,7 +78,7 @@ class mod_member_simple extends ModeleNumRefMembers */ public function getExample() { - return $this->prefix."0501-0001"; + return "1"; } @@ -92,11 +95,9 @@ class mod_member_simple extends ModeleNumRefMembers $coyymm = ''; $max = ''; - $posindice = strlen($this->prefix) + 6; - $sql = "SELECT MAX(CAST(SUBSTRING(ref FROM ".$posindice.") AS SIGNED)) as max"; + $sql = "SELECT MAX(CAST(ref AS SIGNED)) as max"; $sql .= " FROM ".MAIN_DB_PREFIX."adherent"; - $sql .= " WHERE ref LIKE '".$db->escape($this->prefix)."____-%'"; - $sql .= " AND entity = ".$conf->entity; + $sql .= " WHERE entity = ".$conf->entity; $resql = $db->query($sql); if ($resql) { $row = $db->fetch_row($resql); @@ -105,7 +106,7 @@ class mod_member_simple extends ModeleNumRefMembers $max = $row[0]; } } - if (!$coyymm || preg_match('/'.$this->prefix.'[0-9][0-9][0-9][0-9]/i', $coyymm)) { + if (!$coyymm || preg_match('/[0-9][0-9][0-9][0-9]/i', $coyymm)) { return true; } else { $langs->load("errors"); @@ -119,65 +120,31 @@ class mod_member_simple extends ModeleNumRefMembers * Return next value * * @param Societe $objsoc Object third party - * @param Object $object Object we need next value for + * @param Member $object Object we need next value for * @return string Value if OK, 0 if KO */ public function getNextValue($objsoc, $object) { - global $db, $conf; + global $conf, $db; - /* - // First, we get the max value - $posindice = strlen($this->prefix) + 6; - $sql = "SELECT MAX(CAST(SUBSTRING(ref FROM ".$posindice.") AS SIGNED)) as max"; + // the ref of a member is the rowid + $sql = "SELECT MAX(CAST(ref AS SIGNED)) as max"; $sql .= " FROM ".MAIN_DB_PREFIX."adherent"; - $sql .= " WHERE ref LIKE '".$db->escape($this->prefix)."____-%'"; - $sql .= " AND entity = ".$conf->entity; + $sql .= " WHERE entity = ".(int) $conf->entity; $resql = $db->query($sql); if ($resql) { $obj = $db->fetch_object($resql); if ($obj) { - $max = intval($obj->max); + $max = intval($obj->max) + 1; } else { - $max = 0; + $max = 1; } } else { dol_syslog("mod_member_simple::getNextValue", LOG_DEBUG); return -1; } - - $date = empty($object->date_c) ? dol_now() : $object->date_c; - - //$yymm = strftime("%y%m",time()); - $yymm = strftime("%y%m", $date); - - if ($max >= (pow(10, 4) - 1)) { - $num = $max + 1; // If counter > 9999, we do not format on 4 chars, we take number as it is - } else { - $num = sprintf("%04s", $max + 1); - } - - dol_syslog("mod_member_simple::getNextValue return ".$this->prefix.$yymm."-".$num); - return $this->prefix.$yymm."-".$num; - */ - - // For the moment, the ref of a member is the rowid - $sql = "SELECT MAX(rowid) as max"; - $sql .= " FROM ".MAIN_DB_PREFIX."adherent"; - - $resql = $db->query($sql); - if ($resql) { - $obj = $db->fetch_object($resql); - if ($obj) { - $max = intval($obj->max); - } else { - $max = 0; - } - } else { - dol_syslog("mod_member_simple::getNextValue", LOG_DEBUG); - return -1; - } - return ($max + 1); + $max = str_pad((string) $max, getDolGlobalInt('MEMBER_MOD_SIMPLE_LPAD'), "0", STR_PAD_LEFT); + return $max; } } diff --git a/htdocs/core/modules/member/modules_member.class.php b/htdocs/core/modules/member/modules_member.class.php index cdc37231901..d63675b2907 100644 --- a/htdocs/core/modules/member/modules_member.class.php +++ b/htdocs/core/modules/member/modules_member.class.php @@ -84,9 +84,9 @@ abstract class ModeleNumRefMembers } /** - * Renvoi la description par defaut du modele de numerotation + * Renvoie la description par defaut du modele de numerotation * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { @@ -95,6 +95,16 @@ abstract class ModeleNumRefMembers return $langs->trans("NoDescription"); } + /** + * Return name of module + * + * @return string Module name + */ + public function getName() + { + return $this->name; + } + /** * Return an example of numbering * @@ -153,4 +163,50 @@ abstract class ModeleNumRefMembers return $langs->trans("NotAvailable"); } } + + /** + * Return description of module parameters + * + * @param Translate $langs Output language + * @param Societe $soc Third party object + * @return string HTML translated description + */ + public function getToolTip($langs, $soc) + { + global $conf; + + $langs->loadLangs(array("admin", "companies")); + + $strikestart = ''; + $strikeend = ''; + if (!empty($conf->global->MAIN_MEMBER_CODE_ALWAYS_REQUIRED) && !empty($this->code_null)) { + $strikestart = ''; + $strikeend = ' '.yn(1, 1, 2).' ('.$langs->trans("ForcedToByAModule", $langs->transnoentities("yes")).')'; + } + + $s = ''; + $s .= $langs->trans("Name").': '.$this->getName().'
'; + $s .= $langs->trans("Version").': '.$this->getVersion().'
'; + $s .= $langs->trans("MemberCodeDesc").'
'; + $s .= $langs->trans("ValidityControledByModule").': '.$this->getName().'
'; + $s .= '
'; + $s .= ''.$langs->trans("ThisIsModuleRules").':
'; + + $s .= $langs->trans("Required").': '.$strikestart; + $s .= yn(!$this->code_null, 1, 2).$strikeend; + $s .= '
'; + $s .= $langs->trans("CanBeModifiedIfOk").': '; + $s .= yn($this->code_modifiable, 1, 2); + $s .= '
'; + $s .= $langs->trans("CanBeModifiedIfKo").': '.yn($this->code_modifiable_invalide, 1, 2).'
'; + $s .= $langs->trans("AutomaticCode").': '.yn($this->code_auto, 1, 2).'
'; + $s .= '
'; + $nextval = $this->getNextValue($soc, 0); + if (empty($nextval)) { + $nextval = $langs->trans("Undefined"); + } + $s .= $langs->trans("NextValue").' ('.$langs->trans("Member").')'.': '.$nextval.'
'; + + return $s; + } } diff --git a/htdocs/core/modules/mrp/mod_mo_advanced.php b/htdocs/core/modules/mrp/mod_mo_advanced.php index 5588d1cae16..5808a3ef709 100644 --- a/htdocs/core/modules/mrp/mod_mo_advanced.php +++ b/htdocs/core/modules/mrp/mod_mo_advanced.php @@ -55,7 +55,7 @@ class mod_mo_advanced extends ModeleNumRefMos /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/mrp/modules_mo.php b/htdocs/core/modules/mrp/modules_mo.php index 454df89bcde..6dc69d2e562 100644 --- a/htdocs/core/modules/mrp/modules_mo.php +++ b/htdocs/core/modules/mrp/modules_mo.php @@ -87,7 +87,7 @@ abstract class ModeleNumRefMos /** * Returns the default description of the numbering template * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/payment/mod_payment_ant.php b/htdocs/core/modules/payment/mod_payment_ant.php index 958074202fe..95827fbeaff 100644 --- a/htdocs/core/modules/payment/mod_payment_ant.php +++ b/htdocs/core/modules/payment/mod_payment_ant.php @@ -57,7 +57,7 @@ class mod_payment_ant extends ModeleNumRefPayments /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/payment/modules_payment.php b/htdocs/core/modules/payment/modules_payment.php index f19e80dd3d2..f040629c5f7 100644 --- a/htdocs/core/modules/payment/modules_payment.php +++ b/htdocs/core/modules/payment/modules_payment.php @@ -41,7 +41,7 @@ abstract class ModeleNumRefPayments /** * Return the default description of numbering module * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/product/modules_product.class.php b/htdocs/core/modules/product/modules_product.class.php index 6c47847ef60..0160c1a8e6c 100644 --- a/htdocs/core/modules/product/modules_product.class.php +++ b/htdocs/core/modules/product/modules_product.class.php @@ -107,7 +107,7 @@ abstract class ModeleProductCode /** Renvoi la description par defaut du modele de numerotation * * @param Translate $langs Object langs - * @return string Texte descripif + * @return string Texte descriptif */ public function info($langs) { diff --git a/htdocs/core/modules/product_batch/mod_lot_advanced.php b/htdocs/core/modules/product_batch/mod_lot_advanced.php index d6128573f97..87363db33ea 100644 --- a/htdocs/core/modules/product_batch/mod_lot_advanced.php +++ b/htdocs/core/modules/product_batch/mod_lot_advanced.php @@ -55,7 +55,7 @@ class mod_lot_advanced extends ModeleNumRefBatch /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/product_batch/mod_sn_advanced.php b/htdocs/core/modules/product_batch/mod_sn_advanced.php index 6c796f06c3b..5b1b716dc1c 100644 --- a/htdocs/core/modules/product_batch/mod_sn_advanced.php +++ b/htdocs/core/modules/product_batch/mod_sn_advanced.php @@ -55,7 +55,7 @@ class mod_sn_advanced extends ModeleNumRefBatch /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/product_batch/modules_product_batch.class.php b/htdocs/core/modules/product_batch/modules_product_batch.class.php index ea64bd98609..cb9bbbb4148 100644 --- a/htdocs/core/modules/product_batch/modules_product_batch.class.php +++ b/htdocs/core/modules/product_batch/modules_product_batch.class.php @@ -89,7 +89,7 @@ abstract class ModeleNumRefBatch /** * Returns the default description of the numbering template * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/project/mod_project_universal.php b/htdocs/core/modules/project/mod_project_universal.php index 1020c42ebf6..3962b5994fc 100644 --- a/htdocs/core/modules/project/mod_project_universal.php +++ b/htdocs/core/modules/project/mod_project_universal.php @@ -62,7 +62,7 @@ class mod_project_universal extends ModeleNumRefProjects /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/project/modules_project.php b/htdocs/core/modules/project/modules_project.php index 894df4bf8f3..8be91eed228 100644 --- a/htdocs/core/modules/project/modules_project.php +++ b/htdocs/core/modules/project/modules_project.php @@ -145,7 +145,7 @@ abstract class ModeleNumRefProjects /** * Renvoi la description par defaut du modele de numerotation * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/project/task/mod_task_universal.php b/htdocs/core/modules/project/task/mod_task_universal.php index 6de02dcaf99..63d0465b155 100644 --- a/htdocs/core/modules/project/task/mod_task_universal.php +++ b/htdocs/core/modules/project/task/mod_task_universal.php @@ -57,7 +57,7 @@ class mod_task_universal extends ModeleNumRefTask /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/project/task/modules_task.php b/htdocs/core/modules/project/task/modules_task.php index 09ba33332f1..ffccf3edd45 100644 --- a/htdocs/core/modules/project/task/modules_task.php +++ b/htdocs/core/modules/project/task/modules_task.php @@ -86,7 +86,7 @@ abstract class ModeleNumRefTask /** * Renvoi la description par defaut du modele de numerotation * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/propale/mod_propale_saphir.php b/htdocs/core/modules/propale/mod_propale_saphir.php index 98c9803d55c..61e9c692b71 100644 --- a/htdocs/core/modules/propale/mod_propale_saphir.php +++ b/htdocs/core/modules/propale/mod_propale_saphir.php @@ -60,7 +60,7 @@ class mod_propale_saphir extends ModeleNumRefPropales /** * Return description of module * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/propale/modules_propale.php b/htdocs/core/modules/propale/modules_propale.php index dcb386947a3..47e1b7865f0 100644 --- a/htdocs/core/modules/propale/modules_propale.php +++ b/htdocs/core/modules/propale/modules_propale.php @@ -89,7 +89,7 @@ abstract class ModeleNumRefPropales /** * Renvoi la description par defaut du modele de numerotation * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/societe/modules_societe.class.php b/htdocs/core/modules/societe/modules_societe.class.php index e8b0fbe9193..07082ca725d 100644 --- a/htdocs/core/modules/societe/modules_societe.class.php +++ b/htdocs/core/modules/societe/modules_societe.class.php @@ -78,7 +78,7 @@ abstract class ModeleThirdPartyCode /** Renvoi la description par defaut du modele de numerotation * * @param Translate $langs Object langs - * @return string Texte descripif + * @return string Texte descriptif */ public function info($langs) { diff --git a/htdocs/core/modules/stocktransfer/mod_stocktransfer_advanced.php b/htdocs/core/modules/stocktransfer/mod_stocktransfer_advanced.php index dd29e48d0b8..990d6abcef3 100644 --- a/htdocs/core/modules/stocktransfer/mod_stocktransfer_advanced.php +++ b/htdocs/core/modules/stocktransfer/mod_stocktransfer_advanced.php @@ -55,7 +55,7 @@ class mod_stocktransfer_advanced extends ModeleNumRefStockTransfer /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/stocktransfer/modules_stocktransfer.php b/htdocs/core/modules/stocktransfer/modules_stocktransfer.php index 3da0a0ae644..ecfce55569e 100644 --- a/htdocs/core/modules/stocktransfer/modules_stocktransfer.php +++ b/htdocs/core/modules/stocktransfer/modules_stocktransfer.php @@ -87,7 +87,7 @@ abstract class ModeleNumRefStockTransfer /** * Returns the default description of the numbering template * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/supplier_order/mod_commande_fournisseur_muguet.php b/htdocs/core/modules/supplier_order/mod_commande_fournisseur_muguet.php index 5aa92995c4c..211ca95a6bf 100644 --- a/htdocs/core/modules/supplier_order/mod_commande_fournisseur_muguet.php +++ b/htdocs/core/modules/supplier_order/mod_commande_fournisseur_muguet.php @@ -178,7 +178,7 @@ class mod_commande_fournisseur_muguet extends ModeleNumRefSuppliersOrders * * @param Societe $objsoc Object third party * @param Object $object Object - * @return string Texte descripif + * @return string Texte descriptif */ public function commande_get_num($objsoc = 0, $object = '') { diff --git a/htdocs/core/modules/supplier_order/mod_commande_fournisseur_orchidee.php b/htdocs/core/modules/supplier_order/mod_commande_fournisseur_orchidee.php index 8f67f28b42d..759168a8c48 100644 --- a/htdocs/core/modules/supplier_order/mod_commande_fournisseur_orchidee.php +++ b/htdocs/core/modules/supplier_order/mod_commande_fournisseur_orchidee.php @@ -59,7 +59,7 @@ class mod_commande_fournisseur_orchidee extends ModeleNumRefSuppliersOrders /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { @@ -150,7 +150,7 @@ class mod_commande_fournisseur_orchidee extends ModeleNumRefSuppliersOrders * * @param Societe $objsoc Object third party * @param Object $object Object - * @return string Texte descripif + * @return string Texte descriptif */ public function commande_get_num($objsoc = 0, $object = '') { diff --git a/htdocs/core/modules/supplier_payment/mod_supplier_payment_brodator.php b/htdocs/core/modules/supplier_payment/mod_supplier_payment_brodator.php index 292662a14ad..d3a8f7a7c06 100644 --- a/htdocs/core/modules/supplier_payment/mod_supplier_payment_brodator.php +++ b/htdocs/core/modules/supplier_payment/mod_supplier_payment_brodator.php @@ -57,7 +57,7 @@ class mod_supplier_payment_brodator extends ModeleNumRefSupplierPayments /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/supplier_payment/modules_supplier_payment.php b/htdocs/core/modules/supplier_payment/modules_supplier_payment.php index c5db770bdb4..17579e73555 100644 --- a/htdocs/core/modules/supplier_payment/modules_supplier_payment.php +++ b/htdocs/core/modules/supplier_payment/modules_supplier_payment.php @@ -111,7 +111,7 @@ abstract class ModeleNumRefSupplierPayments /** * Return the default description of numbering module * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/supplier_proposal/mod_supplier_proposal_saphir.php b/htdocs/core/modules/supplier_proposal/mod_supplier_proposal_saphir.php index c73a8a16db6..6c3779314e5 100644 --- a/htdocs/core/modules/supplier_proposal/mod_supplier_proposal_saphir.php +++ b/htdocs/core/modules/supplier_proposal/mod_supplier_proposal_saphir.php @@ -60,7 +60,7 @@ class mod_supplier_proposal_saphir extends ModeleNumRefSupplierProposal /** * Return description of module * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/supplier_proposal/modules_supplier_proposal.php b/htdocs/core/modules/supplier_proposal/modules_supplier_proposal.php index 5a3d9e2280a..036031e16e5 100644 --- a/htdocs/core/modules/supplier_proposal/modules_supplier_proposal.php +++ b/htdocs/core/modules/supplier_proposal/modules_supplier_proposal.php @@ -89,7 +89,7 @@ abstract class ModeleNumRefSupplierProposal /** * Renvoi la description par defaut du modele de numerotation * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/takepos/mod_takepos_ref_universal.php b/htdocs/core/modules/takepos/mod_takepos_ref_universal.php index 7b515ca6b3b..909a0e816b7 100644 --- a/htdocs/core/modules/takepos/mod_takepos_ref_universal.php +++ b/htdocs/core/modules/takepos/mod_takepos_ref_universal.php @@ -54,7 +54,7 @@ class mod_takepos_ref_universal extends ModeleNumRefTakepos /** * return description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/takepos/modules_takepos.php b/htdocs/core/modules/takepos/modules_takepos.php index 89b3dbde5bc..12f6256f25a 100644 --- a/htdocs/core/modules/takepos/modules_takepos.php +++ b/htdocs/core/modules/takepos/modules_takepos.php @@ -54,7 +54,7 @@ abstract class ModeleNumRefTakepos /** * Renvoi la description par defaut du modele de numerotation * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/ticket/mod_ticket_universal.php b/htdocs/core/modules/ticket/mod_ticket_universal.php index 8efc2f6a4e5..b86f8624fe3 100644 --- a/htdocs/core/modules/ticket/mod_ticket_universal.php +++ b/htdocs/core/modules/ticket/mod_ticket_universal.php @@ -55,7 +55,7 @@ class mod_ticket_universal extends ModeleNumRefTicket /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/ticket/modules_ticket.php b/htdocs/core/modules/ticket/modules_ticket.php index c8561382436..18d00449745 100644 --- a/htdocs/core/modules/ticket/modules_ticket.php +++ b/htdocs/core/modules/ticket/modules_ticket.php @@ -80,7 +80,7 @@ abstract class ModeleNumRefTicket /** * Renvoi la description par defaut du modele de numerotation * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/workstation/mod_workstation_advanced.php b/htdocs/core/modules/workstation/mod_workstation_advanced.php index 125aa0f7c53..ea13afdc70c 100644 --- a/htdocs/core/modules/workstation/mod_workstation_advanced.php +++ b/htdocs/core/modules/workstation/mod_workstation_advanced.php @@ -55,7 +55,7 @@ class mod_workstation_advanced extends ModeleNumRefWorkstation /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/core/modules/workstation/modules_workstation.php b/htdocs/core/modules/workstation/modules_workstation.php index c8052ed4ff8..f54a8ca1a95 100644 --- a/htdocs/core/modules/workstation/modules_workstation.php +++ b/htdocs/core/modules/workstation/modules_workstation.php @@ -87,7 +87,7 @@ abstract class ModeleNumRefWorkstation /** * Returns the default description of the numbering template * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/knowledgemanagement/core/modules/knowledgemanagement/mod_knowledgerecord_advanced.php b/htdocs/knowledgemanagement/core/modules/knowledgemanagement/mod_knowledgerecord_advanced.php index ba0cf9818dc..d3e874c1cf1 100644 --- a/htdocs/knowledgemanagement/core/modules/knowledgemanagement/mod_knowledgerecord_advanced.php +++ b/htdocs/knowledgemanagement/core/modules/knowledgemanagement/mod_knowledgerecord_advanced.php @@ -54,7 +54,7 @@ class mod_knowledgerecord_advanced extends ModeleNumRefKnowledgeRecord /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/knowledgemanagement/core/modules/knowledgemanagement/modules_knowledgerecord.php b/htdocs/knowledgemanagement/core/modules/knowledgemanagement/modules_knowledgerecord.php index edfe6beff62..0c80ff111bd 100644 --- a/htdocs/knowledgemanagement/core/modules/knowledgemanagement/modules_knowledgerecord.php +++ b/htdocs/knowledgemanagement/core/modules/knowledgemanagement/modules_knowledgerecord.php @@ -86,7 +86,7 @@ abstract class ModeleNumRefKnowledgeRecord /** * Returns the default description of the numbering template * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 28205d1dcba..038ff2d7ba1 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1302,6 +1302,8 @@ YouMustRunCommandFromCommandLineAfterLoginToUser=You must run this command from YourPHPDoesNotHaveSSLSupport=SSL functions not available in your PHP DownloadMoreSkins=More skins to download SimpleNumRefModelDesc=Returns the reference number in the format %syymm-nnnn where yy is the year, mm is the month and nnnn is a sequential auto-incrementing number with no reset +SimpleRefNumRefModelDesc=Returns the reference number in the format n where n is a sequential auto-incrementing number with no reset +AdvancedNumRefModelDesc=Returns the reference number in the format %syymm-nnnn where yy is the year, mm is the month and nnnn is a sequential auto-incrementing number with no reset SimpleNumRefNoDateModelDesc=Returns the reference number in the format %s-nnnn where nnnn is a sequential auto-incrementing number with no reset ShowProfIdInAddress=Show professional ID with addresses ShowVATIntaInAddress=Hide intra-Community VAT number @@ -1488,6 +1490,7 @@ WatermarkOnDraftContractCards=Watermark on draft contracts (none if empty) ##### Members ##### MembersSetup=Members module setup MemberMainOptions=Main options +MemberCodeChecker=Options for automatic generation of member codes AdherentLoginRequired= Manage a Login for each member AdherentMailRequired=Email required to create a new member MemberSendInformationByMailByDefault=Checkbox to send mail confirmation to members (validation or new subscription) is on by default diff --git a/htdocs/langs/en_US/members.lang b/htdocs/langs/en_US/members.lang index 71f01b36739..eb911c1cdbf 100644 --- a/htdocs/langs/en_US/members.lang +++ b/htdocs/langs/en_US/members.lang @@ -98,7 +98,7 @@ MorAndPhy=Corporation and Individual Reenable=Re-Enable ExcludeMember=Exclude a member Exclude=Exclude -ConfirmExcludeMember=Are you sure you want to exclude this member ? +ConfirmExcludeMember=Are you sure you want to exclude this member ? ResiliateMember=Terminate a member ConfirmResiliateMember=Are you sure you want to terminate this member? DeleteMember=Delete a member @@ -230,4 +230,5 @@ ForceMemberNature=Force member nature (Individual or Corporation) CreateDolibarrLoginDesc=The creation of a user login for members allows them to connect to the application. Depending on the authorizations granted, they will be able, for example, to consult or modify their file themselves. CreateDolibarrThirdPartyDesc=A thirdparty is the legal entity that will be used on the invoice if you decide to generate invoice for each contribution. You will be able to create it later during the process of recording the contribution. MemberFirstname=Member firstname -MemberLastname=Member lastname \ No newline at end of file +MemberLastname=Member lastname +MemberCodeDesc=Member Code, unique for all members diff --git a/htdocs/modulebuilder/template/core/modules/mymodule/mod_myobject_advanced.php b/htdocs/modulebuilder/template/core/modules/mymodule/mod_myobject_advanced.php index cce647de224..559b5007ea1 100644 --- a/htdocs/modulebuilder/template/core/modules/mymodule/mod_myobject_advanced.php +++ b/htdocs/modulebuilder/template/core/modules/mymodule/mod_myobject_advanced.php @@ -54,7 +54,7 @@ class mod_myobject_advanced extends ModeleNumRefMyObject /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/modulebuilder/template/core/modules/mymodule/modules_myobject.php b/htdocs/modulebuilder/template/core/modules/mymodule/modules_myobject.php index c2eeb232219..53c922eeefb 100644 --- a/htdocs/modulebuilder/template/core/modules/mymodule/modules_myobject.php +++ b/htdocs/modulebuilder/template/core/modules/mymodule/modules_myobject.php @@ -122,7 +122,7 @@ abstract class ModeleNumRefMyObject /** * Returns the default description of the numbering template * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/partnership/core/modules/partnership/mod_partnership_advanced.php b/htdocs/partnership/core/modules/partnership/mod_partnership_advanced.php index 676de032659..e638160ba4d 100644 --- a/htdocs/partnership/core/modules/partnership/mod_partnership_advanced.php +++ b/htdocs/partnership/core/modules/partnership/mod_partnership_advanced.php @@ -54,7 +54,7 @@ class mod_partnership_advanced extends ModeleNumRefPartnership /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/partnership/core/modules/partnership/modules_partnership.php b/htdocs/partnership/core/modules/partnership/modules_partnership.php index 005d77835b6..f67c0f76bb0 100644 --- a/htdocs/partnership/core/modules/partnership/modules_partnership.php +++ b/htdocs/partnership/core/modules/partnership/modules_partnership.php @@ -86,7 +86,7 @@ abstract class ModeleNumRefPartnership /** * Returns the default description of the numbering template * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/recruitment/core/modules/recruitment/mod_recruitmentcandidature_advanced.php b/htdocs/recruitment/core/modules/recruitment/mod_recruitmentcandidature_advanced.php index 9635eba3e58..89ed4de1381 100644 --- a/htdocs/recruitment/core/modules/recruitment/mod_recruitmentcandidature_advanced.php +++ b/htdocs/recruitment/core/modules/recruitment/mod_recruitmentcandidature_advanced.php @@ -54,7 +54,7 @@ class mod_recruitmentcandidature_advanced extends ModeleNumRefRecruitmentCandida /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/recruitment/core/modules/recruitment/mod_recruitmentjobposition_advanced.php b/htdocs/recruitment/core/modules/recruitment/mod_recruitmentjobposition_advanced.php index 4f781a18214..d6bbaf4cbea 100644 --- a/htdocs/recruitment/core/modules/recruitment/mod_recruitmentjobposition_advanced.php +++ b/htdocs/recruitment/core/modules/recruitment/mod_recruitmentjobposition_advanced.php @@ -54,7 +54,7 @@ class mod_recruitmentjobposition_advanced extends ModeleNumRefRecruitmentJobPosi /** * Returns the description of the numbering model * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/recruitment/core/modules/recruitment/modules_recruitmentcandidature.php b/htdocs/recruitment/core/modules/recruitment/modules_recruitmentcandidature.php index 089aa720fa7..b831c2bfd6c 100644 --- a/htdocs/recruitment/core/modules/recruitment/modules_recruitmentcandidature.php +++ b/htdocs/recruitment/core/modules/recruitment/modules_recruitmentcandidature.php @@ -86,7 +86,7 @@ abstract class ModeleNumRefRecruitmentCandidature /** * Returns the default description of the numbering template * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { diff --git a/htdocs/recruitment/core/modules/recruitment/modules_recruitmentjobposition.php b/htdocs/recruitment/core/modules/recruitment/modules_recruitmentjobposition.php index 9efabac2d37..3621d0e798a 100644 --- a/htdocs/recruitment/core/modules/recruitment/modules_recruitmentjobposition.php +++ b/htdocs/recruitment/core/modules/recruitment/modules_recruitmentjobposition.php @@ -122,7 +122,7 @@ abstract class ModeleNumRefRecruitmentJobPosition /** * Returns the default description of the numbering template * - * @return string Texte descripif + * @return string Texte descriptif */ public function info() { From 46ac466d3cf587fcbd7a871985aa7474a4b567f5 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Wed, 21 Dec 2022 16:08:34 +0000 Subject: [PATCH 0216/1128] Fixing style errors. --- htdocs/adherents/class/adherent.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php index c4936fb6115..5cf0ca69251 100644 --- a/htdocs/adherents/class/adherent.class.php +++ b/htdocs/adherents/class/adherent.class.php @@ -651,7 +651,7 @@ class Adherent extends CommonObject // auto code $modfile = dol_buildpath('core/modules/member/'.getDolGlobalString('MEMBER_CODEMEMBER_ADDON').'.php', 0); try { - require_once($modfile); + require_once $modfile; $modname = getDolGlobalString('MEMBER_CODEMEMBER_ADDON'); $modCodeMember = new $modname; $this->ref = $modCodeMember->getNextValue($mysoc, $this); From 2c7e0afabd7c04cbde50fcd9734edc75ac60cb35 Mon Sep 17 00:00:00 2001 From: Gauthier PC portable 024 Date: Wed, 21 Dec 2022 17:17:33 +0100 Subject: [PATCH 0217/1128] FIX : travis --- htdocs/commande/class/commande.class.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index d56eeb2af0e..33de271b45d 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -1366,7 +1366,9 @@ class Commande extends CommonOrder } if (!empty($this->multicurrency_code) && empty($this->multicurrency_tx)) { - list($this->fk_multicurrency, $this->multicurrency_tx) = MultiCurrency::getIdAndTxFromCode($this->db, $this->multicurrency_code, $this->date_commande); + $tmparray = MultiCurrency::getIdAndTxFromCode($this->db, $this->multicurrency_code, $this->date_commande); + $this->fk_multicurrency = $tmparray[0]; + $this->multicurrency_tx = $tmparray[1]; } else { $this->fk_multicurrency = MultiCurrency::getIdFromCode($this->db, $this->multicurrency_code); } From f11418c1085e1487ab0bd0ad20cf46ab388a75c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Wed, 21 Dec 2022 17:23:33 +0100 Subject: [PATCH 0218/1128] doc translation --- htdocs/core/modules/asset/mod_asset_advanced.php | 2 +- htdocs/core/modules/asset/modules_asset.php | 2 +- htdocs/core/modules/barcode/doc/phpbarcode.modules.php | 2 +- htdocs/core/modules/bom/mod_bom_advanced.php | 2 +- htdocs/core/modules/bom/modules_bom.php | 2 +- htdocs/core/modules/cheque/mod_chequereceipt_thyme.php | 2 +- htdocs/core/modules/cheque/modules_chequereceipts.php | 2 +- htdocs/core/modules/commande/mod_commande_saphir.php | 2 +- htdocs/core/modules/commande/modules_commande.php | 2 +- htdocs/core/modules/delivery/mod_delivery_jade.php | 4 ++-- htdocs/core/modules/delivery/mod_delivery_saphir.php | 4 ++-- htdocs/core/modules/delivery/modules_delivery.php | 2 +- htdocs/core/modules/dons/modules_don.php | 2 +- htdocs/core/modules/expensereport/mod_expensereport_sand.php | 2 +- htdocs/core/modules/facture/mod_facture_mars.php | 2 +- htdocs/core/modules/facture/mod_facture_mercure.php | 2 +- htdocs/core/modules/facture/mod_facture_terre.php | 2 +- htdocs/core/modules/facture/modules_facture.php | 2 +- htdocs/core/modules/fichinter/mod_arctic.php | 2 +- htdocs/core/modules/hrm/mod_evaluation_advanced.php | 2 +- htdocs/core/modules/hrm/modules_evaluation.php | 2 +- htdocs/core/modules/member/modules_member.class.php | 2 +- htdocs/core/modules/mrp/mod_mo_advanced.php | 2 +- htdocs/core/modules/mrp/modules_mo.php | 2 +- htdocs/core/modules/payment/mod_payment_ant.php | 2 +- htdocs/core/modules/payment/modules_payment.php | 2 +- htdocs/core/modules/product/modules_product.class.php | 2 +- htdocs/core/modules/product_batch/mod_lot_advanced.php | 2 +- htdocs/core/modules/product_batch/mod_sn_advanced.php | 2 +- .../modules/product_batch/modules_product_batch.class.php | 2 +- htdocs/core/modules/project/mod_project_universal.php | 2 +- htdocs/core/modules/project/modules_project.php | 2 +- htdocs/core/modules/project/task/mod_task_universal.php | 2 +- htdocs/core/modules/project/task/modules_task.php | 2 +- htdocs/core/modules/propale/mod_propale_saphir.php | 2 +- htdocs/core/modules/propale/modules_propale.php | 2 +- htdocs/core/modules/societe/modules_societe.class.php | 2 +- .../core/modules/stocktransfer/mod_stocktransfer_advanced.php | 2 +- htdocs/core/modules/stocktransfer/modules_stocktransfer.php | 2 +- .../supplier_order/mod_commande_fournisseur_muguet.php | 2 +- .../supplier_order/mod_commande_fournisseur_orchidee.php | 4 ++-- .../supplier_payment/mod_supplier_payment_brodator.php | 2 +- .../modules/supplier_payment/modules_supplier_payment.php | 2 +- .../supplier_proposal/mod_supplier_proposal_saphir.php | 2 +- .../modules/supplier_proposal/modules_supplier_proposal.php | 2 +- htdocs/core/modules/takepos/mod_takepos_ref_universal.php | 2 +- htdocs/core/modules/takepos/modules_takepos.php | 2 +- htdocs/core/modules/ticket/mod_ticket_universal.php | 2 +- htdocs/core/modules/ticket/modules_ticket.php | 2 +- htdocs/core/modules/workstation/mod_workstation_advanced.php | 2 +- htdocs/core/modules/workstation/modules_workstation.php | 2 +- .../knowledgemanagement/mod_knowledgerecord_advanced.php | 2 +- .../modules/knowledgemanagement/modules_knowledgerecord.php | 2 +- .../template/core/modules/mymodule/mod_myobject_advanced.php | 2 +- .../template/core/modules/mymodule/modules_myobject.php | 2 +- .../core/modules/partnership/mod_partnership_advanced.php | 2 +- .../core/modules/partnership/modules_partnership.php | 2 +- .../recruitment/mod_recruitmentcandidature_advanced.php | 2 +- .../recruitment/mod_recruitmentjobposition_advanced.php | 2 +- .../modules/recruitment/modules_recruitmentcandidature.php | 2 +- .../modules/recruitment/modules_recruitmentjobposition.php | 2 +- 61 files changed, 64 insertions(+), 64 deletions(-) diff --git a/htdocs/core/modules/asset/mod_asset_advanced.php b/htdocs/core/modules/asset/mod_asset_advanced.php index 6266ce36bc0..995e067b822 100644 --- a/htdocs/core/modules/asset/mod_asset_advanced.php +++ b/htdocs/core/modules/asset/mod_asset_advanced.php @@ -53,7 +53,7 @@ class mod_asset_advanced extends ModeleNumRefAsset /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/asset/modules_asset.php b/htdocs/core/modules/asset/modules_asset.php index 6f399bbdc36..0b90eab00e3 100644 --- a/htdocs/core/modules/asset/modules_asset.php +++ b/htdocs/core/modules/asset/modules_asset.php @@ -121,7 +121,7 @@ abstract class ModeleNumRefAsset /** * Returns the default description of the numbering template * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/barcode/doc/phpbarcode.modules.php b/htdocs/core/modules/barcode/doc/phpbarcode.modules.php index d45a8f86cfc..d11d052cc02 100644 --- a/htdocs/core/modules/barcode/doc/phpbarcode.modules.php +++ b/htdocs/core/modules/barcode/doc/phpbarcode.modules.php @@ -58,7 +58,7 @@ class modPhpbarcode extends ModeleBarCode /** * Return description * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/bom/mod_bom_advanced.php b/htdocs/core/modules/bom/mod_bom_advanced.php index 22957b16997..81c4792630f 100644 --- a/htdocs/core/modules/bom/mod_bom_advanced.php +++ b/htdocs/core/modules/bom/mod_bom_advanced.php @@ -54,7 +54,7 @@ class mod_bom_advanced extends ModeleNumRefboms /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/bom/modules_bom.php b/htdocs/core/modules/bom/modules_bom.php index 9e68b527b9d..4c58e57c546 100644 --- a/htdocs/core/modules/bom/modules_bom.php +++ b/htdocs/core/modules/bom/modules_bom.php @@ -87,7 +87,7 @@ abstract class ModeleNumRefBoms /** * Returns the default description of the numbering template * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/cheque/mod_chequereceipt_thyme.php b/htdocs/core/modules/cheque/mod_chequereceipt_thyme.php index 019d6ebb0df..5534bf38698 100644 --- a/htdocs/core/modules/cheque/mod_chequereceipt_thyme.php +++ b/htdocs/core/modules/cheque/mod_chequereceipt_thyme.php @@ -48,7 +48,7 @@ class mod_chequereceipt_thyme extends ModeleNumRefChequeReceipts /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/cheque/modules_chequereceipts.php b/htdocs/core/modules/cheque/modules_chequereceipts.php index f8802ef30af..519b13db443 100644 --- a/htdocs/core/modules/cheque/modules_chequereceipts.php +++ b/htdocs/core/modules/cheque/modules_chequereceipts.php @@ -54,7 +54,7 @@ abstract class ModeleNumRefChequeReceipts /** * Return the default description of numbering module * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/commande/mod_commande_saphir.php b/htdocs/core/modules/commande/mod_commande_saphir.php index a7809f2a181..b62124f7652 100644 --- a/htdocs/core/modules/commande/mod_commande_saphir.php +++ b/htdocs/core/modules/commande/mod_commande_saphir.php @@ -54,7 +54,7 @@ class mod_commande_saphir extends ModeleNumRefCommandes /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/commande/modules_commande.php b/htdocs/core/modules/commande/modules_commande.php index 1ded188bae9..7b3fc6eb967 100644 --- a/htdocs/core/modules/commande/modules_commande.php +++ b/htdocs/core/modules/commande/modules_commande.php @@ -88,7 +88,7 @@ abstract class ModeleNumRefCommandes /** * Renvoie la description par defaut du modele de numerotation * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/delivery/mod_delivery_jade.php b/htdocs/core/modules/delivery/mod_delivery_jade.php index 3c238887e64..d348957afd3 100644 --- a/htdocs/core/modules/delivery/mod_delivery_jade.php +++ b/htdocs/core/modules/delivery/mod_delivery_jade.php @@ -63,7 +63,7 @@ class mod_delivery_jade extends ModeleNumRefDeliveryOrder /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { @@ -174,7 +174,7 @@ class mod_delivery_jade extends ModeleNumRefDeliveryOrder * * @param Societe $objsoc Object thirdparty * @param Object $object Object livraison - * @return string Texte descriptif + * @return string Descriptive text */ public function delivery_get_num($objsoc = 0, $object = '') { diff --git a/htdocs/core/modules/delivery/mod_delivery_saphir.php b/htdocs/core/modules/delivery/mod_delivery_saphir.php index b7f241c9960..68da925e62b 100644 --- a/htdocs/core/modules/delivery/mod_delivery_saphir.php +++ b/htdocs/core/modules/delivery/mod_delivery_saphir.php @@ -58,7 +58,7 @@ class mod_delivery_saphir extends ModeleNumRefDeliveryOrder /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { @@ -162,7 +162,7 @@ class mod_delivery_saphir extends ModeleNumRefDeliveryOrder * * @param Societe $objsoc Object thirdparty * @param Object $object Objet livraison - * @return string Texte descriptif + * @return string Descriptive text */ public function delivery_get_num($objsoc = 0, $object = '') { diff --git a/htdocs/core/modules/delivery/modules_delivery.php b/htdocs/core/modules/delivery/modules_delivery.php index d8a5895a258..ae268f94cf2 100644 --- a/htdocs/core/modules/delivery/modules_delivery.php +++ b/htdocs/core/modules/delivery/modules_delivery.php @@ -90,7 +90,7 @@ abstract class ModeleNumRefDeliveryOrder /** * Renvoi la description par defaut du modele de numerotation * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/dons/modules_don.php b/htdocs/core/modules/dons/modules_don.php index 17b68024006..449c87c45fc 100644 --- a/htdocs/core/modules/dons/modules_don.php +++ b/htdocs/core/modules/dons/modules_don.php @@ -86,7 +86,7 @@ abstract class ModeleNumRefDons /** * Renvoi la description par defaut du modele de numerotation * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/expensereport/mod_expensereport_sand.php b/htdocs/core/modules/expensereport/mod_expensereport_sand.php index 1031741e946..920861f2b3e 100644 --- a/htdocs/core/modules/expensereport/mod_expensereport_sand.php +++ b/htdocs/core/modules/expensereport/mod_expensereport_sand.php @@ -57,7 +57,7 @@ class mod_expensereport_sand extends ModeleNumRefExpenseReport /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/facture/mod_facture_mars.php b/htdocs/core/modules/facture/mod_facture_mars.php index 35430f71940..fb4ba06b9ce 100644 --- a/htdocs/core/modules/facture/mod_facture_mars.php +++ b/htdocs/core/modules/facture/mod_facture_mars.php @@ -72,7 +72,7 @@ class mod_facture_mars extends ModeleNumRefFactures /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/facture/mod_facture_mercure.php b/htdocs/core/modules/facture/mod_facture_mercure.php index c673e69a6e7..e67cb252a17 100644 --- a/htdocs/core/modules/facture/mod_facture_mercure.php +++ b/htdocs/core/modules/facture/mod_facture_mercure.php @@ -49,7 +49,7 @@ class mod_facture_mercure extends ModeleNumRefFactures /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/facture/mod_facture_terre.php b/htdocs/core/modules/facture/mod_facture_terre.php index 10a784dc005..0e6ce61093b 100644 --- a/htdocs/core/modules/facture/mod_facture_terre.php +++ b/htdocs/core/modules/facture/mod_facture_terre.php @@ -88,7 +88,7 @@ class mod_facture_terre extends ModeleNumRefFactures /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/facture/modules_facture.php b/htdocs/core/modules/facture/modules_facture.php index cdec804d778..57cb347bd70 100644 --- a/htdocs/core/modules/facture/modules_facture.php +++ b/htdocs/core/modules/facture/modules_facture.php @@ -96,7 +96,7 @@ abstract class ModeleNumRefFactures /** * Renvoi la description par defaut du modele de numerotation * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/fichinter/mod_arctic.php b/htdocs/core/modules/fichinter/mod_arctic.php index bd6529b7a33..d1f313e1bd5 100644 --- a/htdocs/core/modules/fichinter/mod_arctic.php +++ b/htdocs/core/modules/fichinter/mod_arctic.php @@ -59,7 +59,7 @@ class mod_arctic extends ModeleNumRefFicheinter /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/hrm/mod_evaluation_advanced.php b/htdocs/core/modules/hrm/mod_evaluation_advanced.php index 958573e13f0..7e495e449f3 100644 --- a/htdocs/core/modules/hrm/mod_evaluation_advanced.php +++ b/htdocs/core/modules/hrm/mod_evaluation_advanced.php @@ -54,7 +54,7 @@ class mod_evaluation_advanced extends ModeleNumRefEvaluation /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/hrm/modules_evaluation.php b/htdocs/core/modules/hrm/modules_evaluation.php index 56bb769e1d0..a28d3f2ef9d 100644 --- a/htdocs/core/modules/hrm/modules_evaluation.php +++ b/htdocs/core/modules/hrm/modules_evaluation.php @@ -86,7 +86,7 @@ abstract class ModeleNumRefEvaluation /** * Returns the default description of the numbering template * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/member/modules_member.class.php b/htdocs/core/modules/member/modules_member.class.php index d63675b2907..4014fcd34e2 100644 --- a/htdocs/core/modules/member/modules_member.class.php +++ b/htdocs/core/modules/member/modules_member.class.php @@ -86,7 +86,7 @@ abstract class ModeleNumRefMembers /** * Renvoie la description par defaut du modele de numerotation * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/mrp/mod_mo_advanced.php b/htdocs/core/modules/mrp/mod_mo_advanced.php index 5808a3ef709..cd134537ea2 100644 --- a/htdocs/core/modules/mrp/mod_mo_advanced.php +++ b/htdocs/core/modules/mrp/mod_mo_advanced.php @@ -55,7 +55,7 @@ class mod_mo_advanced extends ModeleNumRefMos /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/mrp/modules_mo.php b/htdocs/core/modules/mrp/modules_mo.php index 6dc69d2e562..1b3af7f6b8c 100644 --- a/htdocs/core/modules/mrp/modules_mo.php +++ b/htdocs/core/modules/mrp/modules_mo.php @@ -87,7 +87,7 @@ abstract class ModeleNumRefMos /** * Returns the default description of the numbering template * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/payment/mod_payment_ant.php b/htdocs/core/modules/payment/mod_payment_ant.php index 95827fbeaff..03a6109bd67 100644 --- a/htdocs/core/modules/payment/mod_payment_ant.php +++ b/htdocs/core/modules/payment/mod_payment_ant.php @@ -57,7 +57,7 @@ class mod_payment_ant extends ModeleNumRefPayments /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/payment/modules_payment.php b/htdocs/core/modules/payment/modules_payment.php index f040629c5f7..68b864fe94d 100644 --- a/htdocs/core/modules/payment/modules_payment.php +++ b/htdocs/core/modules/payment/modules_payment.php @@ -41,7 +41,7 @@ abstract class ModeleNumRefPayments /** * Return the default description of numbering module * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/product/modules_product.class.php b/htdocs/core/modules/product/modules_product.class.php index 0160c1a8e6c..4c3ec2214e6 100644 --- a/htdocs/core/modules/product/modules_product.class.php +++ b/htdocs/core/modules/product/modules_product.class.php @@ -107,7 +107,7 @@ abstract class ModeleProductCode /** Renvoi la description par defaut du modele de numerotation * * @param Translate $langs Object langs - * @return string Texte descriptif + * @return string Descriptive text */ public function info($langs) { diff --git a/htdocs/core/modules/product_batch/mod_lot_advanced.php b/htdocs/core/modules/product_batch/mod_lot_advanced.php index 87363db33ea..27cc509ea02 100644 --- a/htdocs/core/modules/product_batch/mod_lot_advanced.php +++ b/htdocs/core/modules/product_batch/mod_lot_advanced.php @@ -55,7 +55,7 @@ class mod_lot_advanced extends ModeleNumRefBatch /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/product_batch/mod_sn_advanced.php b/htdocs/core/modules/product_batch/mod_sn_advanced.php index 5b1b716dc1c..91fc99a1363 100644 --- a/htdocs/core/modules/product_batch/mod_sn_advanced.php +++ b/htdocs/core/modules/product_batch/mod_sn_advanced.php @@ -55,7 +55,7 @@ class mod_sn_advanced extends ModeleNumRefBatch /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/product_batch/modules_product_batch.class.php b/htdocs/core/modules/product_batch/modules_product_batch.class.php index cb9bbbb4148..1446d20aeda 100644 --- a/htdocs/core/modules/product_batch/modules_product_batch.class.php +++ b/htdocs/core/modules/product_batch/modules_product_batch.class.php @@ -89,7 +89,7 @@ abstract class ModeleNumRefBatch /** * Returns the default description of the numbering template * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/project/mod_project_universal.php b/htdocs/core/modules/project/mod_project_universal.php index 3962b5994fc..889164fbfe5 100644 --- a/htdocs/core/modules/project/mod_project_universal.php +++ b/htdocs/core/modules/project/mod_project_universal.php @@ -62,7 +62,7 @@ class mod_project_universal extends ModeleNumRefProjects /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/project/modules_project.php b/htdocs/core/modules/project/modules_project.php index 8be91eed228..3d656b08683 100644 --- a/htdocs/core/modules/project/modules_project.php +++ b/htdocs/core/modules/project/modules_project.php @@ -145,7 +145,7 @@ abstract class ModeleNumRefProjects /** * Renvoi la description par defaut du modele de numerotation * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/project/task/mod_task_universal.php b/htdocs/core/modules/project/task/mod_task_universal.php index 63d0465b155..55c1a3ff89d 100644 --- a/htdocs/core/modules/project/task/mod_task_universal.php +++ b/htdocs/core/modules/project/task/mod_task_universal.php @@ -57,7 +57,7 @@ class mod_task_universal extends ModeleNumRefTask /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/project/task/modules_task.php b/htdocs/core/modules/project/task/modules_task.php index ffccf3edd45..ecd0ab954f2 100644 --- a/htdocs/core/modules/project/task/modules_task.php +++ b/htdocs/core/modules/project/task/modules_task.php @@ -86,7 +86,7 @@ abstract class ModeleNumRefTask /** * Renvoi la description par defaut du modele de numerotation * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/propale/mod_propale_saphir.php b/htdocs/core/modules/propale/mod_propale_saphir.php index 61e9c692b71..74395dcc599 100644 --- a/htdocs/core/modules/propale/mod_propale_saphir.php +++ b/htdocs/core/modules/propale/mod_propale_saphir.php @@ -60,7 +60,7 @@ class mod_propale_saphir extends ModeleNumRefPropales /** * Return description of module * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/propale/modules_propale.php b/htdocs/core/modules/propale/modules_propale.php index 47e1b7865f0..ba1afbbb037 100644 --- a/htdocs/core/modules/propale/modules_propale.php +++ b/htdocs/core/modules/propale/modules_propale.php @@ -89,7 +89,7 @@ abstract class ModeleNumRefPropales /** * Renvoi la description par defaut du modele de numerotation * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/societe/modules_societe.class.php b/htdocs/core/modules/societe/modules_societe.class.php index 07082ca725d..55ae34abab3 100644 --- a/htdocs/core/modules/societe/modules_societe.class.php +++ b/htdocs/core/modules/societe/modules_societe.class.php @@ -78,7 +78,7 @@ abstract class ModeleThirdPartyCode /** Renvoi la description par defaut du modele de numerotation * * @param Translate $langs Object langs - * @return string Texte descriptif + * @return string Descriptive text */ public function info($langs) { diff --git a/htdocs/core/modules/stocktransfer/mod_stocktransfer_advanced.php b/htdocs/core/modules/stocktransfer/mod_stocktransfer_advanced.php index 990d6abcef3..c19067c019d 100644 --- a/htdocs/core/modules/stocktransfer/mod_stocktransfer_advanced.php +++ b/htdocs/core/modules/stocktransfer/mod_stocktransfer_advanced.php @@ -55,7 +55,7 @@ class mod_stocktransfer_advanced extends ModeleNumRefStockTransfer /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/stocktransfer/modules_stocktransfer.php b/htdocs/core/modules/stocktransfer/modules_stocktransfer.php index ecfce55569e..6c0213afb0c 100644 --- a/htdocs/core/modules/stocktransfer/modules_stocktransfer.php +++ b/htdocs/core/modules/stocktransfer/modules_stocktransfer.php @@ -87,7 +87,7 @@ abstract class ModeleNumRefStockTransfer /** * Returns the default description of the numbering template * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/supplier_order/mod_commande_fournisseur_muguet.php b/htdocs/core/modules/supplier_order/mod_commande_fournisseur_muguet.php index 211ca95a6bf..7ebc035ef61 100644 --- a/htdocs/core/modules/supplier_order/mod_commande_fournisseur_muguet.php +++ b/htdocs/core/modules/supplier_order/mod_commande_fournisseur_muguet.php @@ -178,7 +178,7 @@ class mod_commande_fournisseur_muguet extends ModeleNumRefSuppliersOrders * * @param Societe $objsoc Object third party * @param Object $object Object - * @return string Texte descriptif + * @return string Descriptive text */ public function commande_get_num($objsoc = 0, $object = '') { diff --git a/htdocs/core/modules/supplier_order/mod_commande_fournisseur_orchidee.php b/htdocs/core/modules/supplier_order/mod_commande_fournisseur_orchidee.php index 759168a8c48..f829048e623 100644 --- a/htdocs/core/modules/supplier_order/mod_commande_fournisseur_orchidee.php +++ b/htdocs/core/modules/supplier_order/mod_commande_fournisseur_orchidee.php @@ -59,7 +59,7 @@ class mod_commande_fournisseur_orchidee extends ModeleNumRefSuppliersOrders /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { @@ -150,7 +150,7 @@ class mod_commande_fournisseur_orchidee extends ModeleNumRefSuppliersOrders * * @param Societe $objsoc Object third party * @param Object $object Object - * @return string Texte descriptif + * @return string Descriptive text */ public function commande_get_num($objsoc = 0, $object = '') { diff --git a/htdocs/core/modules/supplier_payment/mod_supplier_payment_brodator.php b/htdocs/core/modules/supplier_payment/mod_supplier_payment_brodator.php index d3a8f7a7c06..a3e938a38ac 100644 --- a/htdocs/core/modules/supplier_payment/mod_supplier_payment_brodator.php +++ b/htdocs/core/modules/supplier_payment/mod_supplier_payment_brodator.php @@ -57,7 +57,7 @@ class mod_supplier_payment_brodator extends ModeleNumRefSupplierPayments /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/supplier_payment/modules_supplier_payment.php b/htdocs/core/modules/supplier_payment/modules_supplier_payment.php index 17579e73555..9409c4c688b 100644 --- a/htdocs/core/modules/supplier_payment/modules_supplier_payment.php +++ b/htdocs/core/modules/supplier_payment/modules_supplier_payment.php @@ -111,7 +111,7 @@ abstract class ModeleNumRefSupplierPayments /** * Return the default description of numbering module * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/supplier_proposal/mod_supplier_proposal_saphir.php b/htdocs/core/modules/supplier_proposal/mod_supplier_proposal_saphir.php index 6c3779314e5..d4282eb80ec 100644 --- a/htdocs/core/modules/supplier_proposal/mod_supplier_proposal_saphir.php +++ b/htdocs/core/modules/supplier_proposal/mod_supplier_proposal_saphir.php @@ -60,7 +60,7 @@ class mod_supplier_proposal_saphir extends ModeleNumRefSupplierProposal /** * Return description of module * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/supplier_proposal/modules_supplier_proposal.php b/htdocs/core/modules/supplier_proposal/modules_supplier_proposal.php index 036031e16e5..033f17e7c06 100644 --- a/htdocs/core/modules/supplier_proposal/modules_supplier_proposal.php +++ b/htdocs/core/modules/supplier_proposal/modules_supplier_proposal.php @@ -89,7 +89,7 @@ abstract class ModeleNumRefSupplierProposal /** * Renvoi la description par defaut du modele de numerotation * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/takepos/mod_takepos_ref_universal.php b/htdocs/core/modules/takepos/mod_takepos_ref_universal.php index 909a0e816b7..3ebc5858ae4 100644 --- a/htdocs/core/modules/takepos/mod_takepos_ref_universal.php +++ b/htdocs/core/modules/takepos/mod_takepos_ref_universal.php @@ -54,7 +54,7 @@ class mod_takepos_ref_universal extends ModeleNumRefTakepos /** * return description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/takepos/modules_takepos.php b/htdocs/core/modules/takepos/modules_takepos.php index 12f6256f25a..34a21fb8334 100644 --- a/htdocs/core/modules/takepos/modules_takepos.php +++ b/htdocs/core/modules/takepos/modules_takepos.php @@ -54,7 +54,7 @@ abstract class ModeleNumRefTakepos /** * Renvoi la description par defaut du modele de numerotation * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/ticket/mod_ticket_universal.php b/htdocs/core/modules/ticket/mod_ticket_universal.php index b86f8624fe3..8cd2cd6f614 100644 --- a/htdocs/core/modules/ticket/mod_ticket_universal.php +++ b/htdocs/core/modules/ticket/mod_ticket_universal.php @@ -55,7 +55,7 @@ class mod_ticket_universal extends ModeleNumRefTicket /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/ticket/modules_ticket.php b/htdocs/core/modules/ticket/modules_ticket.php index 18d00449745..0c72c399832 100644 --- a/htdocs/core/modules/ticket/modules_ticket.php +++ b/htdocs/core/modules/ticket/modules_ticket.php @@ -80,7 +80,7 @@ abstract class ModeleNumRefTicket /** * Renvoi la description par defaut du modele de numerotation * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/workstation/mod_workstation_advanced.php b/htdocs/core/modules/workstation/mod_workstation_advanced.php index ea13afdc70c..253e4224b64 100644 --- a/htdocs/core/modules/workstation/mod_workstation_advanced.php +++ b/htdocs/core/modules/workstation/mod_workstation_advanced.php @@ -55,7 +55,7 @@ class mod_workstation_advanced extends ModeleNumRefWorkstation /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/core/modules/workstation/modules_workstation.php b/htdocs/core/modules/workstation/modules_workstation.php index f54a8ca1a95..a99dab9b17a 100644 --- a/htdocs/core/modules/workstation/modules_workstation.php +++ b/htdocs/core/modules/workstation/modules_workstation.php @@ -87,7 +87,7 @@ abstract class ModeleNumRefWorkstation /** * Returns the default description of the numbering template * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/knowledgemanagement/core/modules/knowledgemanagement/mod_knowledgerecord_advanced.php b/htdocs/knowledgemanagement/core/modules/knowledgemanagement/mod_knowledgerecord_advanced.php index d3e874c1cf1..f2d0f448a69 100644 --- a/htdocs/knowledgemanagement/core/modules/knowledgemanagement/mod_knowledgerecord_advanced.php +++ b/htdocs/knowledgemanagement/core/modules/knowledgemanagement/mod_knowledgerecord_advanced.php @@ -54,7 +54,7 @@ class mod_knowledgerecord_advanced extends ModeleNumRefKnowledgeRecord /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/knowledgemanagement/core/modules/knowledgemanagement/modules_knowledgerecord.php b/htdocs/knowledgemanagement/core/modules/knowledgemanagement/modules_knowledgerecord.php index 0c80ff111bd..8e19931fbdb 100644 --- a/htdocs/knowledgemanagement/core/modules/knowledgemanagement/modules_knowledgerecord.php +++ b/htdocs/knowledgemanagement/core/modules/knowledgemanagement/modules_knowledgerecord.php @@ -86,7 +86,7 @@ abstract class ModeleNumRefKnowledgeRecord /** * Returns the default description of the numbering template * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/modulebuilder/template/core/modules/mymodule/mod_myobject_advanced.php b/htdocs/modulebuilder/template/core/modules/mymodule/mod_myobject_advanced.php index 559b5007ea1..a31a63f0b14 100644 --- a/htdocs/modulebuilder/template/core/modules/mymodule/mod_myobject_advanced.php +++ b/htdocs/modulebuilder/template/core/modules/mymodule/mod_myobject_advanced.php @@ -54,7 +54,7 @@ class mod_myobject_advanced extends ModeleNumRefMyObject /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/modulebuilder/template/core/modules/mymodule/modules_myobject.php b/htdocs/modulebuilder/template/core/modules/mymodule/modules_myobject.php index 53c922eeefb..1037dba63b6 100644 --- a/htdocs/modulebuilder/template/core/modules/mymodule/modules_myobject.php +++ b/htdocs/modulebuilder/template/core/modules/mymodule/modules_myobject.php @@ -122,7 +122,7 @@ abstract class ModeleNumRefMyObject /** * Returns the default description of the numbering template * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/partnership/core/modules/partnership/mod_partnership_advanced.php b/htdocs/partnership/core/modules/partnership/mod_partnership_advanced.php index e638160ba4d..9d3e2042010 100644 --- a/htdocs/partnership/core/modules/partnership/mod_partnership_advanced.php +++ b/htdocs/partnership/core/modules/partnership/mod_partnership_advanced.php @@ -54,7 +54,7 @@ class mod_partnership_advanced extends ModeleNumRefPartnership /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/partnership/core/modules/partnership/modules_partnership.php b/htdocs/partnership/core/modules/partnership/modules_partnership.php index f67c0f76bb0..4d1f6c0b107 100644 --- a/htdocs/partnership/core/modules/partnership/modules_partnership.php +++ b/htdocs/partnership/core/modules/partnership/modules_partnership.php @@ -86,7 +86,7 @@ abstract class ModeleNumRefPartnership /** * Returns the default description of the numbering template * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/recruitment/core/modules/recruitment/mod_recruitmentcandidature_advanced.php b/htdocs/recruitment/core/modules/recruitment/mod_recruitmentcandidature_advanced.php index 89ed4de1381..6ed0a027310 100644 --- a/htdocs/recruitment/core/modules/recruitment/mod_recruitmentcandidature_advanced.php +++ b/htdocs/recruitment/core/modules/recruitment/mod_recruitmentcandidature_advanced.php @@ -54,7 +54,7 @@ class mod_recruitmentcandidature_advanced extends ModeleNumRefRecruitmentCandida /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/recruitment/core/modules/recruitment/mod_recruitmentjobposition_advanced.php b/htdocs/recruitment/core/modules/recruitment/mod_recruitmentjobposition_advanced.php index d6bbaf4cbea..a49a4714b24 100644 --- a/htdocs/recruitment/core/modules/recruitment/mod_recruitmentjobposition_advanced.php +++ b/htdocs/recruitment/core/modules/recruitment/mod_recruitmentjobposition_advanced.php @@ -54,7 +54,7 @@ class mod_recruitmentjobposition_advanced extends ModeleNumRefRecruitmentJobPosi /** * Returns the description of the numbering model * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/recruitment/core/modules/recruitment/modules_recruitmentcandidature.php b/htdocs/recruitment/core/modules/recruitment/modules_recruitmentcandidature.php index b831c2bfd6c..362e890c6ef 100644 --- a/htdocs/recruitment/core/modules/recruitment/modules_recruitmentcandidature.php +++ b/htdocs/recruitment/core/modules/recruitment/modules_recruitmentcandidature.php @@ -86,7 +86,7 @@ abstract class ModeleNumRefRecruitmentCandidature /** * Returns the default description of the numbering template * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { diff --git a/htdocs/recruitment/core/modules/recruitment/modules_recruitmentjobposition.php b/htdocs/recruitment/core/modules/recruitment/modules_recruitmentjobposition.php index 3621d0e798a..aaf8bed6c53 100644 --- a/htdocs/recruitment/core/modules/recruitment/modules_recruitmentjobposition.php +++ b/htdocs/recruitment/core/modules/recruitment/modules_recruitmentjobposition.php @@ -122,7 +122,7 @@ abstract class ModeleNumRefRecruitmentJobPosition /** * Returns the default description of the numbering template * - * @return string Texte descriptif + * @return string Descriptive text */ public function info() { From 42cf7acfe52992e4cc277553a3d9b03db575e94d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Wed, 21 Dec 2022 17:26:16 +0100 Subject: [PATCH 0219/1128] doc translation --- htdocs/core/modules/commande/modules_commande.php | 2 +- htdocs/core/modules/delivery/modules_delivery.php | 2 +- htdocs/core/modules/dons/modules_don.php | 2 +- htdocs/core/modules/facture/modules_facture.php | 2 +- htdocs/core/modules/member/modules_member.class.php | 2 +- htdocs/core/modules/product/modules_product.class.php | 2 +- htdocs/core/modules/project/modules_project.php | 2 +- htdocs/core/modules/project/task/modules_task.php | 2 +- htdocs/core/modules/propale/modules_propale.php | 2 +- htdocs/core/modules/societe/modules_societe.class.php | 2 +- .../modules/supplier_proposal/modules_supplier_proposal.php | 2 +- htdocs/core/modules/takepos/modules_takepos.php | 2 +- htdocs/core/modules/ticket/modules_ticket.php | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/htdocs/core/modules/commande/modules_commande.php b/htdocs/core/modules/commande/modules_commande.php index 7b3fc6eb967..055286ddf37 100644 --- a/htdocs/core/modules/commande/modules_commande.php +++ b/htdocs/core/modules/commande/modules_commande.php @@ -86,7 +86,7 @@ abstract class ModeleNumRefCommandes } /** - * Renvoie la description par defaut du modele de numerotation + * Returns the default description of the numbering pattern * * @return string Descriptive text */ diff --git a/htdocs/core/modules/delivery/modules_delivery.php b/htdocs/core/modules/delivery/modules_delivery.php index ae268f94cf2..66e9727bc7b 100644 --- a/htdocs/core/modules/delivery/modules_delivery.php +++ b/htdocs/core/modules/delivery/modules_delivery.php @@ -88,7 +88,7 @@ abstract class ModeleNumRefDeliveryOrder } /** - * Renvoi la description par defaut du modele de numerotation + * Returns the default description of the numbering pattern * * @return string Descriptive text */ diff --git a/htdocs/core/modules/dons/modules_don.php b/htdocs/core/modules/dons/modules_don.php index 449c87c45fc..6bb78ab98ac 100644 --- a/htdocs/core/modules/dons/modules_don.php +++ b/htdocs/core/modules/dons/modules_don.php @@ -84,7 +84,7 @@ abstract class ModeleNumRefDons } /** - * Renvoi la description par defaut du modele de numerotation + * Returns the default description of the numbering pattern * * @return string Descriptive text */ diff --git a/htdocs/core/modules/facture/modules_facture.php b/htdocs/core/modules/facture/modules_facture.php index 57cb347bd70..b0d3c4682ba 100644 --- a/htdocs/core/modules/facture/modules_facture.php +++ b/htdocs/core/modules/facture/modules_facture.php @@ -94,7 +94,7 @@ abstract class ModeleNumRefFactures } /** - * Renvoi la description par defaut du modele de numerotation + * Returns the default description of the numbering pattern * * @return string Descriptive text */ diff --git a/htdocs/core/modules/member/modules_member.class.php b/htdocs/core/modules/member/modules_member.class.php index 4014fcd34e2..24f487d501e 100644 --- a/htdocs/core/modules/member/modules_member.class.php +++ b/htdocs/core/modules/member/modules_member.class.php @@ -84,7 +84,7 @@ abstract class ModeleNumRefMembers } /** - * Renvoie la description par defaut du modele de numerotation + * Returns the default description of the numbering pattern * * @return string Descriptive text */ diff --git a/htdocs/core/modules/product/modules_product.class.php b/htdocs/core/modules/product/modules_product.class.php index 4c3ec2214e6..3a856763144 100644 --- a/htdocs/core/modules/product/modules_product.class.php +++ b/htdocs/core/modules/product/modules_product.class.php @@ -104,7 +104,7 @@ abstract class ModeleProductCode */ public $error = ''; - /** Renvoi la description par defaut du modele de numerotation + /** Returns the default description of the numbering pattern * * @param Translate $langs Object langs * @return string Descriptive text diff --git a/htdocs/core/modules/project/modules_project.php b/htdocs/core/modules/project/modules_project.php index 3d656b08683..6f55426e65f 100644 --- a/htdocs/core/modules/project/modules_project.php +++ b/htdocs/core/modules/project/modules_project.php @@ -143,7 +143,7 @@ abstract class ModeleNumRefProjects } /** - * Renvoi la description par defaut du modele de numerotation + * Returns the default description of the numbering pattern * * @return string Descriptive text */ diff --git a/htdocs/core/modules/project/task/modules_task.php b/htdocs/core/modules/project/task/modules_task.php index ecd0ab954f2..6614369aa43 100644 --- a/htdocs/core/modules/project/task/modules_task.php +++ b/htdocs/core/modules/project/task/modules_task.php @@ -84,7 +84,7 @@ abstract class ModeleNumRefTask } /** - * Renvoi la description par defaut du modele de numerotation + * Returns the default description of the numbering pattern * * @return string Descriptive text */ diff --git a/htdocs/core/modules/propale/modules_propale.php b/htdocs/core/modules/propale/modules_propale.php index ba1afbbb037..b58ae681ef2 100644 --- a/htdocs/core/modules/propale/modules_propale.php +++ b/htdocs/core/modules/propale/modules_propale.php @@ -87,7 +87,7 @@ abstract class ModeleNumRefPropales } /** - * Renvoi la description par defaut du modele de numerotation + * Returns the default description of the numbering pattern * * @return string Descriptive text */ diff --git a/htdocs/core/modules/societe/modules_societe.class.php b/htdocs/core/modules/societe/modules_societe.class.php index 55ae34abab3..a1067c14d30 100644 --- a/htdocs/core/modules/societe/modules_societe.class.php +++ b/htdocs/core/modules/societe/modules_societe.class.php @@ -75,7 +75,7 @@ abstract class ModeleThirdPartyCode public $errors; - /** Renvoi la description par defaut du modele de numerotation + /** Returns the default description of the numbering pattern * * @param Translate $langs Object langs * @return string Descriptive text diff --git a/htdocs/core/modules/supplier_proposal/modules_supplier_proposal.php b/htdocs/core/modules/supplier_proposal/modules_supplier_proposal.php index 033f17e7c06..42c935ca13c 100644 --- a/htdocs/core/modules/supplier_proposal/modules_supplier_proposal.php +++ b/htdocs/core/modules/supplier_proposal/modules_supplier_proposal.php @@ -87,7 +87,7 @@ abstract class ModeleNumRefSupplierProposal } /** - * Renvoi la description par defaut du modele de numerotation + * Returns the default description of the numbering pattern * * @return string Descriptive text */ diff --git a/htdocs/core/modules/takepos/modules_takepos.php b/htdocs/core/modules/takepos/modules_takepos.php index 34a21fb8334..bd554a85a65 100644 --- a/htdocs/core/modules/takepos/modules_takepos.php +++ b/htdocs/core/modules/takepos/modules_takepos.php @@ -52,7 +52,7 @@ abstract class ModeleNumRefTakepos } /** - * Renvoi la description par defaut du modele de numerotation + * Returns the default description of the numbering pattern * * @return string Descriptive text */ diff --git a/htdocs/core/modules/ticket/modules_ticket.php b/htdocs/core/modules/ticket/modules_ticket.php index 0c72c399832..263803162fd 100644 --- a/htdocs/core/modules/ticket/modules_ticket.php +++ b/htdocs/core/modules/ticket/modules_ticket.php @@ -78,7 +78,7 @@ abstract class ModeleNumRefTicket } /** - * Renvoi la description par defaut du modele de numerotation + * Returns the default description of the numbering pattern * * @return string Descriptive text */ From 1feb6a10f8cb46d7fd2de18be4ad890bc42026a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Wed, 21 Dec 2022 17:30:07 +0100 Subject: [PATCH 0220/1128] fix stickler --- htdocs/core/modules/member/modules_member.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/member/modules_member.class.php b/htdocs/core/modules/member/modules_member.class.php index 24f487d501e..a356c76ee7c 100644 --- a/htdocs/core/modules/member/modules_member.class.php +++ b/htdocs/core/modules/member/modules_member.class.php @@ -205,7 +205,7 @@ abstract class ModeleNumRefMembers if (empty($nextval)) { $nextval = $langs->trans("Undefined"); } - $s .= $langs->trans("NextValue").' ('.$langs->trans("Member").')'.': '.$nextval.'
'; + $s .= $langs->trans("NextValue").' ('.$langs->trans("Member").'): '.$nextval.'
'; return $s; } From fec9184cfd2fb7e3977b52ef6c520a8d0eb1c9e1 Mon Sep 17 00:00:00 2001 From: daraelmin Date: Wed, 21 Dec 2022 17:43:50 +0100 Subject: [PATCH 0221/1128] Fix box member and dolgraph should display same info --- htdocs/core/boxes/box_members_by_type.php | 49 +++++++++++++++++++++-- 1 file changed, 45 insertions(+), 4 deletions(-) diff --git a/htdocs/core/boxes/box_members_by_type.php b/htdocs/core/boxes/box_members_by_type.php index 2e25da59564..9fcfb7e325a 100644 --- a/htdocs/core/boxes/box_members_by_type.php +++ b/htdocs/core/boxes/box_members_by_type.php @@ -92,6 +92,7 @@ class box_members_by_type extends ModeleBoxes if ($user->rights->adherent->lire) { $MembersToValidate = array(); + $MembersPending = array(); $MembersValidated = array(); $MembersUpToDate = array(); $MembersExcluded = array(); @@ -169,34 +170,63 @@ class box_members_by_type extends ModeleBoxes } $this->db->free($result); } + // Members pendding (Waiting for first subscription) + $sql = "SELECT count(*) as somme , d.fk_adherent_type"; + $sql .= " FROM " . MAIN_DB_PREFIX . "adherent as d, " . MAIN_DB_PREFIX . "adherent_type as t"; + $sql .= " WHERE d.entity IN (" . getEntity('adherent') . ")"; + $sql .= " AND d.statut = 1 AND (d.datefin IS NULL AND t.subscription = 1)"; + $sql .= " AND t.rowid = d.fk_adherent_type"; + $sql .= " GROUP BY d.fk_adherent_type"; + + dol_syslog("index.php::select nb of uptodate members by type", LOG_DEBUG); + $result = $this->db->query($sql); + if ($result) { + $num2 = $this->db->num_rows($result); + $i = 0; + while ($i < $num2) { + $objp = $this->db->fetch_object($result); + $MembersPending[$objp->fk_adherent_type] = $objp->somme; + $i++; + } + $this->db->free($result); + } $line = 0; $this->info_box_contents[$line][] = array( 'td' => 'class=""', 'text' => '', ); + // Draft $labelstatus = $staticmember->LibStatut($staticmember::STATUS_DRAFT, 0, 0, 1); $this->info_box_contents[$line][] = array( 'td' => 'class="right tdoverflowmax100" width="15%" title="'.dol_escape_htmltag($labelstatus).'"', 'text' => $labelstatus ); - $labelstatus = $langs->trans("UpToDate"); + // Pending (Waiting for first subscription) + $labelstatus = $staticmember->LibStatut($staticmember::STATUS_VALIDATED, 1, 0, 1); + $this->info_box_contents[$line][] = array( + 'td' => 'class="right tdoverflowmax100" width="15%" title="'.dol_escape_htmltag($labelstatus).'"', + 'text' => $labelstatus + ); + // Up to date $labelstatus = $staticmember->LibStatut($staticmember::STATUS_VALIDATED, 1, dol_now() + 86400, 1); $this->info_box_contents[$line][] = array( 'td' => 'class="right tdoverflowmax100" width="15%" title="'.dol_escape_htmltag($labelstatus).'"', 'text' => $labelstatus, ); - $labelstatus = $langs->trans("OutOfDate"); + // Expired $labelstatus = $staticmember->LibStatut($staticmember::STATUS_VALIDATED, 1, dol_now() - 86400, 1); $this->info_box_contents[$line][] = array( 'td' => 'class="right tdoverflowmax100" width="15%" title="'.dol_escape_htmltag($labelstatus).'"', 'text' => $labelstatus ); + // Excluded $labelstatus = $staticmember->LibStatut($staticmember::STATUS_EXCLUDED, 0, 0, 1); $this->info_box_contents[$line][] = array( 'td' => 'class="right tdoverflowmax100" width="15%" title="'.dol_escape_htmltag($labelstatus).'"', 'text' => $labelstatus ); + // Resiliated $labelstatus = $staticmember->LibStatut($staticmember::STATUS_RESILIATED, 0, 0, 1); $this->info_box_contents[$line][] = array( 'td' => 'class="right tdoverflowmax100" width="15%" title="'.dol_escape_htmltag($labelstatus).'"', @@ -205,7 +235,8 @@ class box_members_by_type extends ModeleBoxes $line++; foreach ($AdherentType as $key => $adhtype) { $SumToValidate += isset($MembersToValidate[$key]) ? $MembersToValidate[$key] : 0; - $SumValidated += isset($MembersValidated[$key]) ? $MembersValidated[$key] - (isset($MembersUpToDate[$key]) ? $MembersUpToDate[$key] : 0) : 0; + $SumPending += isset($MembersPending[$key]) ? $MembersPending[$key] : 0; + $SumExpired += isset($MembersValidated[$key]) ? $MembersValidated[$key] - (isset($MembersUpToDate[$key]) ? $MembersUpToDate[$key] : 0) - (isset($MembersPending[$key]) ? $MembersPending[$key] : 0): 0; $SumUpToDate += isset($MembersUpToDate[$key]) ? $MembersUpToDate[$key] : 0; $SumExcluded += isset($MembersExcluded[$key]) ? $MembersExcluded [$key] : 0; $SumResiliated += isset($MembersResiliated[$key]) ? $MembersResiliated[$key] : 0; @@ -220,6 +251,11 @@ class box_members_by_type extends ModeleBoxes 'text' => (isset($MembersToValidate[$key]) && $MembersToValidate[$key] > 0 ? $MembersToValidate[$key] : '') . ' ' . $staticmember->LibStatut(Adherent::STATUS_DRAFT, 1, 0, 3), 'asis' => 1, ); + $this->info_box_contents[$line][] = array( + 'td' => 'class="right"', + 'text' => (isset($MembersPending[$key]) && $MembersPending[$key] > 0 ? $MembersPending[$key] : '') . ' ' . $staticmember->LibStatut(Adherent::STATUS_VALIDATED, 1, 0, 3), + 'asis' => 1, + ); $this->info_box_contents[$line][] = array( 'td' => 'class="right"', 'text' => (isset($MembersUpToDate[$key]) && $MembersUpToDate[$key] > 0 ? $MembersUpToDate[$key] : '') . ' ' . $staticmember->LibStatut(Adherent::STATUS_VALIDATED, 1, $now, 3), @@ -260,6 +296,11 @@ class box_members_by_type extends ModeleBoxes 'text' => $SumToValidate.' '.$staticmember->LibStatut(Adherent::STATUS_DRAFT, 1, 0, 3), 'asis' => 1 ); + $this->info_box_contents[$line][] = array( + 'td' => 'class="liste_total right"', + 'text' => $SumPending.' '.$staticmember->LibStatut(Adherent::STATUS_VALIDATED, 1, 0, 3), + 'asis' => 1 + ); $this->info_box_contents[$line][] = array( 'td' => 'class="liste_total right"', 'text' => $SumUpToDate.' '.$staticmember->LibStatut(Adherent::STATUS_VALIDATED, 1, $now, 3), @@ -267,7 +308,7 @@ class box_members_by_type extends ModeleBoxes ); $this->info_box_contents[$line][] = array( 'td' => 'class="liste_total right"', - 'text' => $SumValidated.' '.$staticmember->LibStatut(Adherent::STATUS_VALIDATED, 1, 1, 3), + 'text' => $SumExpired.' '.$staticmember->LibStatut(Adherent::STATUS_VALIDATED, 1, 1, 3), 'asis' => 1 ); $this->info_box_contents[$line][] = array( From a48b738c18b47bea3c5a7888b6847f276288a754 Mon Sep 17 00:00:00 2001 From: daraelmin Date: Wed, 21 Dec 2022 17:58:40 +0100 Subject: [PATCH 0222/1128] Fix White bg-color badge in darkmode --- htdocs/theme/eldy/badges.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/theme/eldy/badges.inc.php b/htdocs/theme/eldy/badges.inc.php index 1e6dfb54dbc..aae4e50fb29 100644 --- a/htdocs/theme/eldy/badges.inc.php +++ b/htdocs/theme/eldy/badges.inc.php @@ -246,7 +246,7 @@ function _createStatusBadgeCss($statusName, $statusVarNamePrefix = '', $commentL if (in_array((string) $statusName, $TBadgeBorderOnly)) { $thisBadgeTextColor = '#212529'; - $thisBadgeBackgroundColor = "#fff"; + $thisBadgeBackgroundColor = ""; } if (in_array((string) $statusName, array('0', '5', '9'))) { From cfced376efc94b5950762b06431981a75ab2b728 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Wed, 21 Dec 2022 18:18:38 +0100 Subject: [PATCH 0223/1128] New mode view for BOM list --- htdocs/bom/bom_list.php | 161 +++++++++++++++++++-------------- htdocs/bom/class/bom.class.php | 40 ++++++++ 2 files changed, 133 insertions(+), 68 deletions(-) diff --git a/htdocs/bom/bom_list.php b/htdocs/bom/bom_list.php index 337ff51c3ef..cb97bc849d8 100644 --- a/htdocs/bom/bom_list.php +++ b/htdocs/bom/bom_list.php @@ -42,6 +42,8 @@ $toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'bomlist'; // To manage different context of search $backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print') +$mode = GETPOST('mode', 'alpha'); // mode view (kanban or common) + // Load variable for pagination $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit; @@ -433,6 +435,9 @@ llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', ''); $arrayofselected = is_array($toselect) ? $toselect : array(); $param = ''; +if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); +} if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -483,7 +488,11 @@ print ''; print ''; print ''; print ''; +print ''; +$newcardbutton .= ''; +$newcardbutton = dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton = dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); $newcardbutton = dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/bom/bom_card.php?action=create&backtopage='.urlencode($_SERVER['PHP_SELF']), '', $user->rights->bom->write); print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'object_'.$object->picto, 0, $newcardbutton, '', $limit, 0, 0, 1); @@ -648,90 +657,106 @@ while ($i < ($limit ? min($num, $limit) : $num)) { // Store properties in $object $object->setVarsFromFetchObj($obj); - // Show here line of result - print ''; - // Action column - if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($object->id, $arrayofselected)) { - $selected = 1; - } - print ''; - } - print ''; - } - foreach ($object->fields as $key => $val) { - $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); - if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) { - $cssforfield .= ($cssforfield ? ' ' : '').'center'; - } elseif ($key == 'status') { - $cssforfield .= ($cssforfield ? ' ' : '').'center'; + // mode view kanban + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + print '
'; } - if (in_array($val['type'], array('timestamp'))) { - $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; - } elseif ($key == 'ref') { - $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; - } + print $object->getKanbanView(''); - if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'status')) && empty($val['arrayofkeyval'])) { - $cssforfield .= ($cssforfield ? ' ' : '').'right'; - } - if (!empty($arrayfields['t.'.$key]['checked'])) { - print ''; - if ($key == 'status') { - print $object->getLibStatut(5); - } elseif ($key == 'rowid') { - print $object->showOutputField($val, $key, $object->id, ''); - } else { - print $object->showOutputField($val, $key, $object->$key, ''); + if ($i == min($num, $limit)-1) { + print '
'; + print ''; + } + } else { + // Show here line of result + print ''; + // Action column + if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($object->id, $arrayofselected)) { + $selected = 1; + } + print ''; } print ''; - if (!$i) { - $totalarray['nbfield']++; + } + foreach ($object->fields as $key => $val) { + $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); + if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) { + $cssforfield .= ($cssforfield ? ' ' : '').'center'; + } elseif ($key == 'status') { + $cssforfield .= ($cssforfield ? ' ' : '').'center'; } - if (!empty($val['isameasure']) && $val['isameasure'] == 1) { + + if (in_array($val['type'], array('timestamp'))) { + $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; + } elseif ($key == 'ref') { + $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; + } + + if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'status')) && empty($val['arrayofkeyval'])) { + $cssforfield .= ($cssforfield ? ' ' : '').'right'; + } + + if (!empty($arrayfields['t.'.$key]['checked'])) { + print ''; + if ($key == 'status') { + print $object->getLibStatut(5); + } elseif ($key == 'rowid') { + print $object->showOutputField($val, $key, $object->id, ''); + } else { + print $object->showOutputField($val, $key, $object->$key, ''); + } + print ''; if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key; + $totalarray['nbfield']++; } - if (!isset($totalarray['val'])) { - $totalarray['val'] = array(); + if (!empty($val['isameasure']) && $val['isameasure'] == 1) { + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key; + } + if (!isset($totalarray['val'])) { + $totalarray['val'] = array(); + } + if (!isset($totalarray['val']['t.'.$key])) { + $totalarray['val']['t.'.$key] = 0; + } + $totalarray['val']['t.'.$key] += $object->$key; } - if (!isset($totalarray['val']['t.'.$key])) { - $totalarray['val']['t.'.$key] = 0; - } - $totalarray['val']['t.'.$key] += $object->$key; } } - } - // Extra fields - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - // Action column - if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($object->id, $arrayofselected)) { - $selected = 1; + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Action column + if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($object->id, $arrayofselected)) { + $selected = 1; + } + print ''; } - print ''; + print ''; + } + if (!$i) { + $totalarray['nbfield']++; } - print ''; - } - if (!$i) { - $totalarray['nbfield']++; - } - print ''."\n"; + print ''."\n"; - $i++; + $i++; + } } // Show total line diff --git a/htdocs/bom/class/bom.class.php b/htdocs/bom/class/bom.class.php index cd5b119cabf..e5d9cc82617 100644 --- a/htdocs/bom/class/bom.class.php +++ b/htdocs/bom/class/bom.class.php @@ -1515,6 +1515,46 @@ class BOM extends CommonObject } } } + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $db,$langs; + $prod = new Product($db); + $prod->fetch($this->fk_product); + + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : '').''; + if (property_exists($this, 'fields') && !empty($this->fields['bomtype']['arrayofkeyval'])) { + $return .= '
'.$langs->trans("Type").' : '; + if ($this->bomtype == 0) { + $return .= ''.$this->fields['bomtype']['arrayofkeyval'][0].''; + } else { + $return .= ''.$this->fields['bomtype']['arrayofkeyval'][1].''; + } + } + if (property_exists($this, 'fk_product') && !is_null($this->fk_product)) { + $return .= '
'.$prod->getNomUrl(1).''; + } + if (method_exists($this, 'getLibStatut')) { + $return .= '
'.$this->getLibStatut(5).'
'; + } + + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } From c09751dfd54e78bd7140da84caf1bb811eac37c9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 21 Dec 2022 19:26:17 +0100 Subject: [PATCH 0224/1128] FIx #23288 --- htdocs/takepos/send.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/takepos/send.php b/htdocs/takepos/send.php index ffa7e0c5c35..a8e13ac01a9 100644 --- a/htdocs/takepos/send.php +++ b/htdocs/takepos/send.php @@ -81,7 +81,7 @@ if ($action == "send") { $msg = "".$arraydefaultmessage->content."
".$receipt.""; $sendto = $email; $from = $mysoc->email; - $mail = new CMailFile($subject, $sendto, $from, $msg, array(), array(), array(), '', '', 0, 1); + $mail = new CMailFile($subject, $sendto, $from, $msg, array(), array(), array(), '', '', 0, 1, '', '', '', '', '', '', DOL_DOCUMENT_ROOT.'/documents/takepos/temp'); if ($mail->error || !empty($mail->errors)) { setEventMessages($mail->error, $mail->errors, 'errors'); } else { From 45fdebcda279a3d1b2d39c7ab66752c7b39847d6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 21 Dec 2022 19:33:02 +0100 Subject: [PATCH 0225/1128] Merge branch '17.0' of git@github.com:Dolibarr/dolibarr.git into 17.0 --- htdocs/takepos/invoice.php | 2 +- htdocs/takepos/receipt.php | 2 +- htdocs/takepos/send.php | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/takepos/invoice.php b/htdocs/takepos/invoice.php index 6be323a1a7a..ccc1fde97eb 100644 --- a/htdocs/takepos/invoice.php +++ b/htdocs/takepos/invoice.php @@ -1094,7 +1094,7 @@ function Print(id, gift){ function TakeposPrinting(id){ var receipt; console.log("TakeposPrinting" + id); - $.get("receipt.php?facid="+id, function(data, status){ + $.get("receipt.php?facid="+id, function(data, status) { receipt=data.replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, ''); $.ajax({ type: "POST", diff --git a/htdocs/takepos/receipt.php b/htdocs/takepos/receipt.php index 400d05415aa..39fe2113071 100644 --- a/htdocs/takepos/receipt.php +++ b/htdocs/takepos/receipt.php @@ -85,7 +85,7 @@ $hookmanager->initHooks(array('takeposfrontend'), $facid); $reshook = $hookmanager->executeHooks('TakeposReceipt', $parameters, $object); if (!empty($hookmanager->resPrint)) { print $hookmanager->resPrint; - exit; + return; // Receipt page can be called by the takepos/send.php page that use ob_start/end so we must use return and not exit to stop page } // IMPORTANT: This file is sended to 'Takepos Printing' application. Keep basic file. No external files as css, js... If you need images use absolute path. diff --git a/htdocs/takepos/send.php b/htdocs/takepos/send.php index a8e13ac01a9..7397c962555 100644 --- a/htdocs/takepos/send.php +++ b/htdocs/takepos/send.php @@ -69,12 +69,12 @@ if ($action == "send") { include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php'; $formmail = new FormMail($db); $outputlangs = new Translate('', $conf); - $model_id = $conf->global->TAKEPOS_EMAIL_TEMPLATE_INVOICE; + $model_id = getDolGlobalString('TAKEPOS_EMAIL_TEMPLATE_INVOICE'); $arraydefaultmessage = $formmail->getEMailTemplate($db, 'facture_send', $user, $outputlangs, $model_id); $subject = $arraydefaultmessage->topic; ob_start(); // turn on output receipt - include 'receipt.php'; + include DOL_DOCUMENT_ROOT.'/takepos/receipt.php'; $receipt = ob_get_contents(); // get the contents of the output buffer ob_end_clean(); From e0db1fdbd97eba8cd469e8b164c762a96ba8370a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Wed, 21 Dec 2022 19:59:01 +0100 Subject: [PATCH 0226/1128] fix asset numbering modules --- htdocs/asset/admin/setup.php | 14 +++---- .../core/modules/asset/mod_asset_advanced.php | 42 ++++++++----------- .../core/modules/asset/mod_asset_standard.php | 10 +++-- 3 files changed, 29 insertions(+), 37 deletions(-) diff --git a/htdocs/asset/admin/setup.php b/htdocs/asset/admin/setup.php index 67448b0e304..965566c3a74 100644 --- a/htdocs/asset/admin/setup.php +++ b/htdocs/asset/admin/setup.php @@ -68,16 +68,14 @@ $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']); * Actions */ -if ((float) DOL_VERSION >= 6) { - include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php'; -} +include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php'; if ($action == 'updateMask') { - $maskconstorder = GETPOST('maskconstorder', 'alpha'); - $maskorder = GETPOST('maskorder', 'alpha'); + $maskconst = GETPOST('maskconst', 'alpha'); + $mask = GETPOST('mask', 'alpha'); - if ($maskconstorder) { - $res = dolibarr_set_const($db, $maskconstorder, $maskorder, 'chaine', 0, '', $conf->entity); + if ($maskconst) { + $res = dolibarr_set_const($db, $maskconst, $mask, 'chaine', 0, '', $conf->entity); if (!($res > 0)) { $error++; } @@ -206,7 +204,7 @@ foreach ($myTmpObjects as $myTmpObjectKey => $myTmpObjectArray) { } if ($myTmpObjectArray['includerefgeneration']) { /* - * Orders Numbering model + * Assets Numbering model */ $setupnotempty++; diff --git a/htdocs/core/modules/asset/mod_asset_advanced.php b/htdocs/core/modules/asset/mod_asset_advanced.php index 34780c3423f..4c30f824140 100644 --- a/htdocs/core/modules/asset/mod_asset_advanced.php +++ b/htdocs/core/modules/asset/mod_asset_advanced.php @@ -3,7 +3,7 @@ * Copyright (C) 2004-2007 Laurent Destailleur * Copyright (C) 2005-2009 Regis Houssin * Copyright (C) 2008 Raphael Bertrand (Resultic) - * Copyright (C) 2019 Frédéric France + * Copyright (C) 2019-2022 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 @@ -63,12 +63,12 @@ class mod_asset_advanced extends ModeleNumRefAsset $form = new Form($db); - $texte = $langs->trans('GenericNumRefModelDesc')."
\n"; - $texte .= ''; - $texte .= ''; - $texte .= ''; - $texte .= ''; - $texte .= ''; + $text = $langs->trans('GenericNumRefModelDesc')."
\n"; + $text .= ''; + $text .= ''; + $text .= ''; + $text .= ''; + $text .= '
'; $tooltip = $langs->trans("GenericMaskCodes", $langs->transnoentities("Asset"), $langs->transnoentities("Asset")); $tooltip .= $langs->trans("GenericMaskCodes2"); @@ -77,17 +77,17 @@ class mod_asset_advanced extends ModeleNumRefAsset $tooltip .= $langs->trans("GenericMaskCodes5"); // Parametrage du prefix - $texte .= ''; - $texte .= ''; + $text .= ''; + $text .= ''; - $texte .= ''; + $text .= ''; - $texte .= ''; + $text .= ''; - $texte .= '
'.$langs->trans("Mask").':'.$form->textwithpicto('', $tooltip, 1, 1).'
'.$langs->trans("Mask").':'.$form->textwithpicto('', $tooltip, 1, 1).'   
'; - $texte .= ''; + $text .= ''; + $text .= ''; - return $texte; + return $text; } /** @@ -102,16 +102,8 @@ class mod_asset_advanced extends ModeleNumRefAsset $object = new Asset($db); $object->initAsSpecimen(); - /*$old_code_client = $mysoc->code_client; - $old_code_type = $mysoc->typent_code; - $mysoc->code_client = 'CCCCCCCCCC'; - $mysoc->typent_code = 'TTTTTTTTTT';*/ - $numExample = $this->getNextValue($object); - /*$mysoc->code_client = $old_code_client; - $mysoc->typent_code = $old_code_type;*/ - if (!$numExample) { $numExample = $langs->trans('NotConfigured'); } @@ -121,7 +113,7 @@ class mod_asset_advanced extends ModeleNumRefAsset /** * Return next free value * - * @param Object $object Object we need next value for + * @param Asset $object Object we need next value for * @return string Value if KO, <0 if KO */ public function getNextValue($object) @@ -131,7 +123,7 @@ class mod_asset_advanced extends ModeleNumRefAsset require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; // We get cursor rule - $mask = getDolGlobalString('ASSET_ASSET_ADVANCED_MASK'); + $mask = getDolGlobalString('ASSET_ADVANCED_MASK'); if (!$mask) { $this->error = 'NotConfigured'; @@ -140,7 +132,7 @@ class mod_asset_advanced extends ModeleNumRefAsset $date = $object->date; - $numFinal = get_next_value($db, $mask, 'asset_asset', 'ref', '', null, $date); + $numFinal = get_next_value($db, $mask, 'asset', 'ref', '', null, $date); return $numFinal; } diff --git a/htdocs/core/modules/asset/mod_asset_standard.php b/htdocs/core/modules/asset/mod_asset_standard.php index 2e3ee3938e1..4fbf889fc9b 100644 --- a/htdocs/core/modules/asset/mod_asset_standard.php +++ b/htdocs/core/modules/asset/mod_asset_standard.php @@ -1,6 +1,7 @@ - * Copyright (C) 2005-2009 Regis Houssin +/* Copyright (C) 2005-2010 Laurent Destailleur + * Copyright (C) 2005-2009 Regis Houssin + * Copyright (C) 2022 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 @@ -83,7 +84,8 @@ class mod_asset_standard extends ModeleNumRefAsset { global $conf, $langs, $db; - $coyymm = ''; $max = ''; + $coyymm = ''; + $max = ''; $posindice = strlen($this->prefix) + 6; $sql = "SELECT MAX(CAST(SUBSTRING(ref FROM ".$posindice.") AS SIGNED)) as max"; @@ -124,7 +126,7 @@ class mod_asset_standard extends ModeleNumRefAsset // first we get the max value $posindice = strlen($this->prefix) + 6; $sql = "SELECT MAX(CAST(SUBSTRING(ref FROM ".$posindice.") AS SIGNED)) as max"; - $sql .= " FROM ".MAIN_DB_PREFIX."asset_asset"; + $sql .= " FROM ".MAIN_DB_PREFIX."asset"; $sql .= " WHERE ref LIKE '".$db->escape($this->prefix)."____-%'"; if ($object->ismultientitymanaged == 1) { $sql .= " AND entity = ".$conf->entity; From 951ea25459a8dd439e111b9caa56166e41aa234c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Wed, 21 Dec 2022 20:11:18 +0100 Subject: [PATCH 0227/1128] clean code --- htdocs/admin/eventorganization.php | 4 +--- htdocs/admin/hrm.php | 4 +--- htdocs/recruitment/admin/setup.php | 4 +--- htdocs/recruitment/admin/setup_candidatures.php | 4 +--- htdocs/zapier/admin/setup.php | 5 +---- 5 files changed, 5 insertions(+), 16 deletions(-) diff --git a/htdocs/admin/eventorganization.php b/htdocs/admin/eventorganization.php index cc9b8d7bca8..528a6bf2a9c 100644 --- a/htdocs/admin/eventorganization.php +++ b/htdocs/admin/eventorganization.php @@ -83,9 +83,7 @@ if ($cancel) { $action =''; } -if ((float) DOL_VERSION >= 6) { - include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php'; -} +include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php'; if ($action == 'updateMask') { $maskconstorder = GETPOST('maskconstorder', 'alpha'); diff --git a/htdocs/admin/hrm.php b/htdocs/admin/hrm.php index 838e9bf9a0b..73931ebf83d 100644 --- a/htdocs/admin/hrm.php +++ b/htdocs/admin/hrm.php @@ -70,9 +70,7 @@ $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']); * Actions */ -if ((float) DOL_VERSION >= 6) { - include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php'; -} +include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php'; if ($action == 'update') { $max_rank = GETPOST('HRM_MAXRANK', 'int'); diff --git a/htdocs/recruitment/admin/setup.php b/htdocs/recruitment/admin/setup.php index 517bbca5c19..4b9fc9a133f 100644 --- a/htdocs/recruitment/admin/setup.php +++ b/htdocs/recruitment/admin/setup.php @@ -88,9 +88,7 @@ $setupnotempty = 0; * Actions */ -if ((float) DOL_VERSION >= 6) { - include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php'; -} +include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php'; if ($action == 'updateMask') { $maskconstjob = GETPOST('maskconstjob', 'alpha'); diff --git a/htdocs/recruitment/admin/setup_candidatures.php b/htdocs/recruitment/admin/setup_candidatures.php index adc12a656f4..584dee06ab4 100644 --- a/htdocs/recruitment/admin/setup_candidatures.php +++ b/htdocs/recruitment/admin/setup_candidatures.php @@ -88,9 +88,7 @@ $setupnotempty = 0; * Actions */ -if ((float) DOL_VERSION >= 6) { - include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php'; -} +include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php'; if ($action == 'updateMask') { $maskconstcand = GETPOST('maskconstcand', 'alpha'); diff --git a/htdocs/zapier/admin/setup.php b/htdocs/zapier/admin/setup.php index 6737d23354f..6fe6365d1b9 100644 --- a/htdocs/zapier/admin/setup.php +++ b/htdocs/zapier/admin/setup.php @@ -54,10 +54,7 @@ if (empty($user->admin)) accessforbidden(); * Actions */ -if ((float) DOL_VERSION >= 6) { - include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php'; -} - +include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php'; /* * View From 1681674cdf7d0b14f4986630bb8b3bc58937fd27 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 21 Dec 2022 20:45:11 +0100 Subject: [PATCH 0228/1128] Update card.php --- htdocs/projet/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/projet/card.php b/htdocs/projet/card.php index c4b5c29a149..7fe1f8f77e0 100644 --- a/htdocs/projet/card.php +++ b/htdocs/projet/card.php @@ -493,7 +493,7 @@ if (!getDolGlobalInt('PROJECT_USE_OPPORTUNITIES')) { $titleboth = $langs->trans("Projects"); $titlenew = $langs->trans("NewProject"); } -if (isset($conf->global->PROJECT_USE_OPPORTUNITIES) && $conf->global->PROJECT_USE_OPPORTUNITIES == 2) { // 2 = leads only +if (getDolGlobalInt('PROJECT_USE_OPPORTUNITIES') == 2) { // 2 = leads only $titleboth = $langs->trans("Leads"); $titlenew = $langs->trans("NewLead"); } From 50d4b6c2b2d67a4172a6e33503662bd637e20f56 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 21 Dec 2022 21:00:44 +0100 Subject: [PATCH 0229/1128] css --- htdocs/core/lib/project.lib.php | 2 +- htdocs/projet/index.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index 3c7e7303581..4c7b85f45ab 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -2596,7 +2596,7 @@ function print_projecttasks_array($db, $form, $socid, $projectsListId, $mytasks print ''; print $projectstatic->getNomUrl(1, '', 0, '', '-', 0, -1, 'nowraponall'); if (!in_array('projectlabel', $hiddenfields)) { - print '
'.dol_trunc($objp->title, 24).''; + print '
'.dol_escape_htmltag($objp->title).''; } print ''; diff --git a/htdocs/projet/index.php b/htdocs/projet/index.php index 2698a4b1a21..044728227cf 100644 --- a/htdocs/projet/index.php +++ b/htdocs/projet/index.php @@ -310,7 +310,7 @@ if ($resql) { $companystatic = new Societe($db); // We need a clean new object for next loop because current one has some properties set. - +// List of open projects per thirdparty $sql = "SELECT COUNT(p.rowid) as nb, SUM(p.opp_amount)"; $sql .= ", s.rowid as socid, s.nom as name, s.name_alias"; $sql .= ", s.code_client, s.code_compta, s.client"; From b0fdf83922f0b9780ee5237ca2f29a2733983ef0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 21 Dec 2022 21:09:50 +0100 Subject: [PATCH 0230/1128] Removed <<<<<<< string --- htdocs/core/lib/project.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index 4c7b85f45ab..7fdb3aecda1 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -1074,7 +1074,7 @@ function projectLinesa(&$inc, $parent, &$lines, &$level, $var, $showproject, &$t * @param int $level Level (start to 0, then increased/decrease by recursive call) * @param string $projectsrole Array of roles user has on project * @param string $tasksrole Array of roles user has on task - * @param string $mine Show only task lines I am assigned to <<<<<<<<< Temporary merge branch 1 + * @param string $mine Show only task lines I am assigned to * @param int $restricteditformytask 0=No restriction, 1=Enable add time only if task is a task i am affected to * @param int $preselectedday Preselected day * @param array $isavailable Array with data that say if user is available for several days for morning and afternoon From 9c0b2e6abe2eae73c6d8fdfd91758b23aa421527 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 21 Dec 2022 21:15:21 +0100 Subject: [PATCH 0231/1128] Too many bug in module. Restore the develop status. --- htdocs/core/modules/modAsset.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/modAsset.class.php b/htdocs/core/modules/modAsset.class.php index 3a7caa1cb57..a0fb405887e 100644 --- a/htdocs/core/modules/modAsset.class.php +++ b/htdocs/core/modules/modAsset.class.php @@ -63,7 +63,7 @@ class modAsset extends DolibarrModules $this->descriptionlong = "Asset module to manage assets module and depreciation charge on Dolibarr"; // Possible values for version are: 'development', 'experimental', 'dolibarr', 'dolibarr_deprecated' or a version string like 'x.y.z' - $this->version = 'experimental'; + $this->version = 'development'; // Key used in llx_const table to save module status enabled/disabled (where ASSETS 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. From a35fe49100530d17b446e6ffa86540c024e2a80e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 21 Dec 2022 21:24:54 +0100 Subject: [PATCH 0232/1128] FIX Trigger must be inside the transaction --- htdocs/core/class/commonobject.class.php | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 37f250bf92f..e9e621bcb7d 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -9723,23 +9723,24 @@ abstract class CommonObject $tmpforobjectclass = get_class($this); $tmpforobjectlineclass = ucfirst($tmpforobjectclass).'Line'; + $this->db->begin(); + // Call trigger $result = $this->call_trigger('LINE'.strtoupper($tmpforobjectclass).'_DELETE', $user); if ($result < 0) { - return -1; + $error++; } // End call triggers - $this->db->begin(); + if (empty($error)) { + $sql = "DELETE FROM ".$this->db->prefix().$this->table_element_line; + $sql .= " WHERE rowid = ".((int) $idline); - $sql = "DELETE FROM ".$this->db->prefix().$this->table_element_line; - $sql .= " WHERE rowid = ".((int) $idline); - - dol_syslog(get_class($this)."::deleteLineCommon", LOG_DEBUG); - $resql = $this->db->query($sql); - if (!$resql) { - $this->error = "Error ".$this->db->lasterror(); - $error++; + $resql = $this->db->query($sql); + if (!$resql) { + $this->error = "Error ".$this->db->lasterror(); + $error++; + } } if (empty($error)) { From a5e5362cb0e540d2cb5841c9451dde9bd95feaea Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 21 Dec 2022 21:24:54 +0100 Subject: [PATCH 0233/1128] FIX Trigger must be inside the transaction --- htdocs/core/class/commonobject.class.php | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 574553016b4..d1b0ca0164c 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -9729,23 +9729,24 @@ abstract class CommonObject $tmpforobjectclass = get_class($this); $tmpforobjectlineclass = ucfirst($tmpforobjectclass).'Line'; + $this->db->begin(); + // Call trigger $result = $this->call_trigger('LINE'.strtoupper($tmpforobjectclass).'_DELETE', $user); if ($result < 0) { - return -1; + $error++; } // End call triggers - $this->db->begin(); + if (empty($error)) { + $sql = "DELETE FROM ".$this->db->prefix().$this->table_element_line; + $sql .= " WHERE rowid = ".((int) $idline); - $sql = "DELETE FROM ".$this->db->prefix().$this->table_element_line; - $sql .= " WHERE rowid = ".((int) $idline); - - dol_syslog(get_class($this)."::deleteLineCommon", LOG_DEBUG); - $resql = $this->db->query($sql); - if (!$resql) { - $this->error = "Error ".$this->db->lasterror(); - $error++; + $resql = $this->db->query($sql); + if (!$resql) { + $this->error = "Error ".$this->db->lasterror(); + $error++; + } } if (empty($error)) { From d608e3b26b97b1210281a97c3550fae1a1897eb0 Mon Sep 17 00:00:00 2001 From: daraelmin Date: Wed, 21 Dec 2022 21:55:43 +0100 Subject: [PATCH 0234/1128] Use transparent color for negative color in chart part --- htdocs/core/class/dolgraph.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/dolgraph.class.php b/htdocs/core/class/dolgraph.class.php index 57f0bca4e36..6ef5b69ba3e 100644 --- a/htdocs/core/class/dolgraph.class.php +++ b/htdocs/core/class/dolgraph.class.php @@ -1211,7 +1211,7 @@ class DolGraph $tmp = str_replace('#', '', $this->datacolor[$i]); if (strpos($tmp, '-') !== false) { $foundnegativecolor++; - $color = '#FFFFFF'; // If $val is '-123' + $color = 'rgba(0,0,0,.0)'; // If $val is '-123' } else { $color = "#" . $tmp; // If $val is '123' or '#123' } From 14d4237ac22d740e5bf80bd6a3fe69574d5a7297 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 21 Dec 2022 22:02:21 +0100 Subject: [PATCH 0235/1128] Fix bad version --- htdocs/filefunc.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/filefunc.inc.php b/htdocs/filefunc.inc.php index 50c28742168..aca15e9d7a3 100644 --- a/htdocs/filefunc.inc.php +++ b/htdocs/filefunc.inc.php @@ -34,7 +34,7 @@ if (!defined('DOL_APPLICATION_TITLE')) { define('DOL_APPLICATION_TITLE', 'Dolibarr'); } if (!defined('DOL_VERSION')) { - define('DOL_VERSION', '18.0.0-beta'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c + define('DOL_VERSION', '18.0.0-alpha'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c } if (!defined('EURO')) { From a0f282d100b9d87ad92690e60dffcb2ae053751a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 21 Dec 2022 23:34:32 +0100 Subject: [PATCH 0236/1128] Try a fix of phpunit regression --- test/phpunit/phpunittest.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/phpunit/phpunittest.xml b/test/phpunit/phpunittest.xml index 84b31a8dd3b..8157d3f3e7a 100644 --- a/test/phpunit/phpunittest.xml +++ b/test/phpunit/phpunittest.xml @@ -1,8 +1,8 @@ Date: Thu, 22 Dec 2022 00:02:22 +0100 Subject: [PATCH 0237/1128] Add log to test phpunit pb --- test/phpunit/AdminLibTest.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/phpunit/AdminLibTest.php b/test/phpunit/AdminLibTest.php index 9ce135da263..0273960fb30 100644 --- a/test/phpunit/AdminLibTest.php +++ b/test/phpunit/AdminLibTest.php @@ -69,6 +69,8 @@ class AdminLibTest extends PHPUnit\Framework\TestCase $this->savdb=$db; print __METHOD__." db->type=".$db->type." user->id=".$user->id; + var_dump($GLOBALS); + //print " - db ".$db->db; print "\n"; } From 49e8b53fabaddd349b316104026ac4b6270687bb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 00:33:03 +0100 Subject: [PATCH 0238/1128] Try fix for phpunit regression --- .travis.yml | 2 +- test/phpunit/AdminLibTest.php | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 45be1a9a6ba..4cf634d6b03 100644 --- a/.travis.yml +++ b/.travis.yml @@ -86,7 +86,7 @@ install: rm $TRAVIS_BUILD_DIR/composer.json rm $TRAVIS_BUILD_DIR/composer.lock composer -V - composer self-update + composer self-update 2.4.4 composer -n init composer -n config vendor-dir htdocs/includes composer -n config -g vendor-dir htdocs/includes diff --git a/test/phpunit/AdminLibTest.php b/test/phpunit/AdminLibTest.php index 0273960fb30..95a54fe6502 100644 --- a/test/phpunit/AdminLibTest.php +++ b/test/phpunit/AdminLibTest.php @@ -69,7 +69,6 @@ class AdminLibTest extends PHPUnit\Framework\TestCase $this->savdb=$db; print __METHOD__." db->type=".$db->type." user->id=".$user->id; - var_dump($GLOBALS); //print " - db ".$db->db; print "\n"; From 599aa6009a686ced404e35879d4439e4510779c3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 00:37:33 +0100 Subject: [PATCH 0239/1128] Try to solve phpunit regression --- test/phpunit/AdminLibTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/test/phpunit/AdminLibTest.php b/test/phpunit/AdminLibTest.php index 95a54fe6502..a40e2257f3e 100644 --- a/test/phpunit/AdminLibTest.php +++ b/test/phpunit/AdminLibTest.php @@ -46,6 +46,7 @@ $conf->global->MAIN_DISABLE_ALL_MAILS=1; */ class AdminLibTest extends PHPUnit\Framework\TestCase { + protected $backupGlobalsBlacklist = array('conf', 'user', 'langs', 'db'); protected $savconf; protected $savuser; protected $savlangs; From bd90d783c7eedb015069e84e7a0da37e11117178 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 00:48:56 +0100 Subject: [PATCH 0240/1128] Reduce code --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4cf634d6b03..ec2205eb718 100644 --- a/.travis.yml +++ b/.travis.yml @@ -87,8 +87,8 @@ install: rm $TRAVIS_BUILD_DIR/composer.lock composer -V composer self-update 2.4.4 - composer -n init - composer -n config vendor-dir htdocs/includes + #composer -n init + #composer -n config vendor-dir htdocs/includes composer -n config -g vendor-dir htdocs/includes echo From 394c3d5c3c1d33e3ef68567ab2c8c0342a9e24a2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 00:59:54 +0100 Subject: [PATCH 0241/1128] Fix var --- htdocs/modulebuilder/template/class/myobject.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/modulebuilder/template/class/myobject.class.php b/htdocs/modulebuilder/template/class/myobject.class.php index 2fe7d983513..afd7b4860fb 100644 --- a/htdocs/modulebuilder/template/class/myobject.class.php +++ b/htdocs/modulebuilder/template/class/myobject.class.php @@ -853,7 +853,7 @@ class MyObject extends CommonObject //if ($withpicto != 2) $result.=(($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : ''); global $action, $hookmanager; - $hookmanager->initHooks(array('myobjectdao')); + $hookmanager->initHooks(array($this->element.'dao')); $parameters = array('id'=>$this->id, 'getnomurl' => &$result); $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks if ($reshook > 0) { From e75617268b1e6ee71cbbfd77363fdbf0952329c7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 01:04:06 +0100 Subject: [PATCH 0242/1128] Log --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ec2205eb718..62d04901e17 100644 --- a/.travis.yml +++ b/.travis.yml @@ -82,7 +82,7 @@ before_install: install: - | - echo "Updating Composer" + echo "Updating Composer (version 2.5 is bugged and generate phpunit error Exception: Serialization of 'Closure' is not allowed)" rm $TRAVIS_BUILD_DIR/composer.json rm $TRAVIS_BUILD_DIR/composer.lock composer -V From 5dfd9af695eb06aa9015539c033df633adac055e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 01:07:02 +0100 Subject: [PATCH 0243/1128] Removed not required rm --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index d23f98a7eca..39b0f2042a1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -83,8 +83,8 @@ before_install: install: - | echo "Updating Composer (version 2.5 is bugged and generate phpunit error Exception: Serialization of 'Closure' is not allowed)" - rm $TRAVIS_BUILD_DIR/composer.json - rm $TRAVIS_BUILD_DIR/composer.lock + #rm $TRAVIS_BUILD_DIR/composer.json + #rm $TRAVIS_BUILD_DIR/composer.lock composer -V composer self-update 2.4.4 #composer -n init From 36e634c67f10fb75e39712414c2f8f7c41c4002a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 01:19:50 +0100 Subject: [PATCH 0244/1128] Css --- htdocs/compta/resultat/clientfourn.php | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/htdocs/compta/resultat/clientfourn.php b/htdocs/compta/resultat/clientfourn.php index 5fdf7220662..71cd33a93cd 100644 --- a/htdocs/compta/resultat/clientfourn.php +++ b/htdocs/compta/resultat/clientfourn.php @@ -321,7 +321,7 @@ if ($modecompta == 'BOOKKEEPING') { if ($showaccountdetail == 'no') { if ($objp->pcg_type != $oldpcgtype) { - print ''.$objp->pcg_type.''; + print ''.dol_escape_htmltag($objp->pcg_type).''; $oldpcgtype = $objp->pcg_type; } } @@ -330,17 +330,17 @@ if ($modecompta == 'BOOKKEEPING') { print ''; print ''; print ''; - print $objp->pcg_type; - print ($objp->name ? ' ('.$objp->name.')' : ' ('.$langs->trans("Unknown").')'); + print dol_escape_htmltag($objp->pcg_type); + print ($objp->name ? ' ('.dol_escape_htmltag($objp->name).')' : ' ('.$langs->trans("Unknown").')'); print "\n"; - print ''.price($objp->amount)."\n"; + print ''.price($objp->amount)."\n"; print "\n"; } else { print ''; print ''; - print $objp->pcg_type; + print dol_escape_htmltag($objp->pcg_type); print "\n"; - print ''.price($objp->amount)."\n"; + print ''.price($objp->amount)."\n"; print "\n"; } @@ -380,7 +380,7 @@ if ($modecompta == 'BOOKKEEPING') { print ''; print ''; print '     '.length_accountg($cpt['account_number']).' - '.$cpt['account_label'].''; - print ''.price($resultN).''; + print ''.price($resultN).''; print "\n"; } } @@ -1539,27 +1539,27 @@ print ''; print ''.$langs->trans("Income").''; if ($modecompta == 'CREANCES-DETTES') { - print ''.price(price2num($total_ht_income, 'MT')).''; + print ''.price(price2num($total_ht_income, 'MT')).''; } elseif ($modecompta == 'RECETTES-DEPENSES') { print ''; } -print ''.price(price2num($total_ttc_income, 'MT')).''; +print ''.price(price2num($total_ttc_income, 'MT')).''; print ''; print ''.$langs->trans("Outcome").''; if ($modecompta == 'CREANCES-DETTES') { - print ''.price(price2num(-$total_ht_outcome, 'MT')).''; + print ''.price(price2num(-$total_ht_outcome, 'MT')).''; } elseif ($modecompta == 'RECETTES-DEPENSES') { print ''; } -print ''.price(price2num(-$total_ttc_outcome, 'MT')).''; +print ''.price(price2num(-$total_ttc_outcome, 'MT')).''; print ''; print ''.$langs->trans("Profit").''; if ($modecompta == 'CREANCES-DETTES') { - print ''.price(price2num($total_ht, 'MT')).''; + print ''.price(price2num($total_ht, 'MT')).''; } elseif ($modecompta == 'RECETTES-DEPENSES') { print ''; } -print ''.price(price2num($total_ttc, 'MT')).''; +print ''.price(price2num($total_ttc, 'MT')).''; print ''; print ""; From 7318fb1903323b681ee2aac9ce2fa34f1db8a53c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 01:42:53 +0100 Subject: [PATCH 0245/1128] Fix filter on active on list of account --- htdocs/accountancy/admin/card.php | 3 +- .../core/class/html.formaccounting.class.php | 31 +++++++++++-------- htdocs/langs/en_US/accountancy.lang | 16 +++++----- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/htdocs/accountancy/admin/card.php b/htdocs/accountancy/admin/card.php index 9eabd378e11..97d2509b898 100644 --- a/htdocs/accountancy/admin/card.php +++ b/htdocs/accountancy/admin/card.php @@ -329,7 +329,8 @@ if ($action == 'create') { // Account parent print ''.$langs->trans("Accountparent").''; print ''; - print $formaccounting->select_account($object->account_parent, 'account_parent', 1); + // Note: We accept disabled account as parent account so we can build a hierarchy and use only childs + print $formaccounting->select_account($object->account_parent, 'account_parent', 1, array(), 0, 0, 'minwidth100 maxwidth300 maxwidthonsmartphone', 1, ''); print ''; // Chart of accounts type diff --git a/htdocs/core/class/html.formaccounting.class.php b/htdocs/core/class/html.formaccounting.class.php index 10e23f3d2e4..19ef75c8aaa 100644 --- a/htdocs/core/class/html.formaccounting.class.php +++ b/htdocs/core/class/html.formaccounting.class.php @@ -331,17 +331,18 @@ class FormAccounting extends Form /** * Return list of accounts with label by chart of accounts * - * @param string $selectid Preselected id of accounting accounts (depends on $select_in) - * @param string $htmlname Name of HTML field id. If name start with '.', it is name of HTML css class, so several component with same name in different forms can be used. - * @param int|string $showempty 1=Add an empty field, 2=Add an empty field+'None' field - * @param array $event Event options - * @param int $select_in 0=selectid value is a aa.rowid (default) or 1=selectid is aa.account_number - * @param int $select_out Set value returned by select. 0=rowid (default), 1=account_number - * @param string $morecss More css non HTML object - * @param string $usecache Key to use to store result into a cache. Next call with same key will reuse the cache. - * @return string String with HTML select + * @param string $selectid Preselected id of accounting accounts (depends on $select_in) + * @param string $htmlname Name of HTML field id. If name start with '.', it is name of HTML css class, so several component with same name in different forms can be used. + * @param int|string $showempty 1=Add an empty field, 2=Add an empty field+'None' field + * @param array $event Event options + * @param int $select_in 0=selectid value is a aa.rowid (default) or 1=selectid is aa.account_number + * @param int $select_out Set value returned by select. 0=rowid (default), 1=account_number + * @param string $morecss More css non HTML object + * @param string $usecache Key to use to store result into a cache. Next call with same key will reuse the cache. + * @param string $active Filter on status active or not: '0', '1' or '' for no filter + * @return string String with HTML select */ - public function select_account($selectid, $htmlname = 'account', $showempty = 0, $event = array(), $select_in = 0, $select_out = 0, $morecss = 'minwidth100 maxwidth300 maxwidthonsmartphone', $usecache = '') + public function select_account($selectid, $htmlname = 'account', $showempty = 0, $event = array(), $select_in = 0, $select_out = 0, $morecss = 'minwidth100 maxwidth300 maxwidthonsmartphone', $usecache = '', $active = '1') { // phpcs:enable global $conf, $langs; @@ -360,14 +361,18 @@ class FormAccounting extends Form $options = $options + $this->options_cache[$usecache]; // We use + instead of array_merge because we don't want to reindex key from 0 $selected = $selectid; } else { - $trunclength = empty($conf->global->ACCOUNTING_LENGTH_DESCRIPTION_ACCOUNT) ? 50 : $conf->global->ACCOUNTING_LENGTH_DESCRIPTION_ACCOUNT; + $trunclength = getDolGlobalInt('ACCOUNTING_LENGTH_DESCRIPTION_ACCOUNT', 50); $sql = "SELECT DISTINCT aa.account_number, aa.label, aa.labelshort, aa.rowid, aa.fk_pcg_version"; $sql .= " FROM ".$this->db->prefix()."accounting_account as aa"; $sql .= " INNER JOIN ".$this->db->prefix()."accounting_system as asy ON aa.fk_pcg_version = asy.pcg_version"; $sql .= " AND asy.rowid = ".((int) $conf->global->CHARTOFACCOUNTS); - $sql .= " AND aa.active = 1"; - $sql .= " AND aa.entity=".$conf->entity; + if ($active === '1') { + $sql .= " AND aa.active = 1"; + } elseif ($active === '0') { + $sql .= " AND aa.active = 0"; + } + $sql .= " AND aa.entity=".((int) $conf->entity); $sql .= " ORDER BY aa.account_number"; dol_syslog(get_class($this)."::select_account", LOG_DEBUG); diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang index a3ed5f9b7b6..b6bf1b90aef 100644 --- a/htdocs/langs/en_US/accountancy.lang +++ b/htdocs/langs/en_US/accountancy.lang @@ -271,13 +271,13 @@ Reconcilable=Reconcilable TotalVente=Total turnover before tax TotalMarge=Total sales margin -DescVentilCustomer=Consult here the list of customer invoice lines bound (or not) to a product accounting account -DescVentilMore=In most cases, if you use predefined products or services and you set the account number on the product/service card, the application will be able to make all the binding between your invoice lines and the accounting account of your chart of accounts, just in one click with the button "%s". If account was not set on product/service cards or if you still have some lines not bound to an account, you will have to make a manual binding from the menu "%s". -DescVentilDoneCustomer=Consult here the list of the lines of invoices customers and their product accounting account -DescVentilTodoCustomer=Bind invoice lines not already bound with a product accounting account -ChangeAccount=Change the product/service accounting account for selected lines with the following accounting account: +DescVentilCustomer=Consult here the list of customer invoice lines bound (or not) to a product account from chart of account +DescVentilMore=In most cases, if you use predefined products or services and you set the account (from chart of account) on the product/service card, the application will be able to make all the binding between your invoice lines and the accounting account of your chart of accounts, just in one click with the button "%s". If account was not set on product/service cards or if you still have some lines not bound to an account, you will have to make a manual binding from the menu "%s". +DescVentilDoneCustomer=Consult here the list of the lines of invoices customers and their product account from chart of account +DescVentilTodoCustomer=Bind invoice lines not already bound with a product account from chart of account +ChangeAccount=Change the product/service account (from chart of account) for the selected lines with the following account: Vide=- -DescVentilSupplier=Consult here the list of vendor invoice lines bound or not yet bound to a product accounting account (only record not already transfered in accountancy are visible) +DescVentilSupplier=Consult here the list of vendor invoice lines bound or not yet bound to a product account from chart of account (only record not already transfered in accountancy are visible) DescVentilDoneSupplier=Consult here the list of the lines of vendor invoices and their accounting account DescVentilTodoExpenseReport=Bind expense report lines not already bound with a fee accounting account DescVentilExpenseReport=Consult here the list of expense report lines bound (or not) to a fee accounting account @@ -295,14 +295,14 @@ DescValidateMovements=Any modification or deletion of writing, lettering and del ValidateHistory=Bind Automatically AutomaticBindingDone=Automatic bindings done (%s) - Automatic binding not possible for some record (%s) -ErrorAccountancyCodeIsAlreadyUse=Error, you cannot delete this accounting account because it is used +ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s Balancing=Balancing FicheVentilation=Binding card GeneralLedgerIsWritten=Transactions are written in the Ledger GeneralLedgerSomeRecordWasNotRecorded=Some of the transactions could not be journalized. If there is no other error message, this is probably because they were already journalized. NoNewRecordSaved=No more record to transfer -ListOfProductsWithoutAccountingAccount=List of products not bound to any accounting account +ListOfProductsWithoutAccountingAccount=List of products not bound to any account of chart of account ChangeBinding=Change the binding Accounted=Accounted in ledger NotYetAccounted=Not yet transferred to accounting From 3968161686cfd7b2335e655fb87e36fd4ecb6f9d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 01:42:53 +0100 Subject: [PATCH 0246/1128] Fix filter on active on list of account --- htdocs/accountancy/admin/card.php | 3 +- .../core/class/html.formaccounting.class.php | 31 +++++++++++-------- htdocs/langs/en_US/accountancy.lang | 16 +++++----- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/htdocs/accountancy/admin/card.php b/htdocs/accountancy/admin/card.php index 9eabd378e11..97d2509b898 100644 --- a/htdocs/accountancy/admin/card.php +++ b/htdocs/accountancy/admin/card.php @@ -329,7 +329,8 @@ if ($action == 'create') { // Account parent print ''.$langs->trans("Accountparent").''; print ''; - print $formaccounting->select_account($object->account_parent, 'account_parent', 1); + // Note: We accept disabled account as parent account so we can build a hierarchy and use only childs + print $formaccounting->select_account($object->account_parent, 'account_parent', 1, array(), 0, 0, 'minwidth100 maxwidth300 maxwidthonsmartphone', 1, ''); print ''; // Chart of accounts type diff --git a/htdocs/core/class/html.formaccounting.class.php b/htdocs/core/class/html.formaccounting.class.php index 10e23f3d2e4..19ef75c8aaa 100644 --- a/htdocs/core/class/html.formaccounting.class.php +++ b/htdocs/core/class/html.formaccounting.class.php @@ -331,17 +331,18 @@ class FormAccounting extends Form /** * Return list of accounts with label by chart of accounts * - * @param string $selectid Preselected id of accounting accounts (depends on $select_in) - * @param string $htmlname Name of HTML field id. If name start with '.', it is name of HTML css class, so several component with same name in different forms can be used. - * @param int|string $showempty 1=Add an empty field, 2=Add an empty field+'None' field - * @param array $event Event options - * @param int $select_in 0=selectid value is a aa.rowid (default) or 1=selectid is aa.account_number - * @param int $select_out Set value returned by select. 0=rowid (default), 1=account_number - * @param string $morecss More css non HTML object - * @param string $usecache Key to use to store result into a cache. Next call with same key will reuse the cache. - * @return string String with HTML select + * @param string $selectid Preselected id of accounting accounts (depends on $select_in) + * @param string $htmlname Name of HTML field id. If name start with '.', it is name of HTML css class, so several component with same name in different forms can be used. + * @param int|string $showempty 1=Add an empty field, 2=Add an empty field+'None' field + * @param array $event Event options + * @param int $select_in 0=selectid value is a aa.rowid (default) or 1=selectid is aa.account_number + * @param int $select_out Set value returned by select. 0=rowid (default), 1=account_number + * @param string $morecss More css non HTML object + * @param string $usecache Key to use to store result into a cache. Next call with same key will reuse the cache. + * @param string $active Filter on status active or not: '0', '1' or '' for no filter + * @return string String with HTML select */ - public function select_account($selectid, $htmlname = 'account', $showempty = 0, $event = array(), $select_in = 0, $select_out = 0, $morecss = 'minwidth100 maxwidth300 maxwidthonsmartphone', $usecache = '') + public function select_account($selectid, $htmlname = 'account', $showempty = 0, $event = array(), $select_in = 0, $select_out = 0, $morecss = 'minwidth100 maxwidth300 maxwidthonsmartphone', $usecache = '', $active = '1') { // phpcs:enable global $conf, $langs; @@ -360,14 +361,18 @@ class FormAccounting extends Form $options = $options + $this->options_cache[$usecache]; // We use + instead of array_merge because we don't want to reindex key from 0 $selected = $selectid; } else { - $trunclength = empty($conf->global->ACCOUNTING_LENGTH_DESCRIPTION_ACCOUNT) ? 50 : $conf->global->ACCOUNTING_LENGTH_DESCRIPTION_ACCOUNT; + $trunclength = getDolGlobalInt('ACCOUNTING_LENGTH_DESCRIPTION_ACCOUNT', 50); $sql = "SELECT DISTINCT aa.account_number, aa.label, aa.labelshort, aa.rowid, aa.fk_pcg_version"; $sql .= " FROM ".$this->db->prefix()."accounting_account as aa"; $sql .= " INNER JOIN ".$this->db->prefix()."accounting_system as asy ON aa.fk_pcg_version = asy.pcg_version"; $sql .= " AND asy.rowid = ".((int) $conf->global->CHARTOFACCOUNTS); - $sql .= " AND aa.active = 1"; - $sql .= " AND aa.entity=".$conf->entity; + if ($active === '1') { + $sql .= " AND aa.active = 1"; + } elseif ($active === '0') { + $sql .= " AND aa.active = 0"; + } + $sql .= " AND aa.entity=".((int) $conf->entity); $sql .= " ORDER BY aa.account_number"; dol_syslog(get_class($this)."::select_account", LOG_DEBUG); diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang index a3ed5f9b7b6..b6bf1b90aef 100644 --- a/htdocs/langs/en_US/accountancy.lang +++ b/htdocs/langs/en_US/accountancy.lang @@ -271,13 +271,13 @@ Reconcilable=Reconcilable TotalVente=Total turnover before tax TotalMarge=Total sales margin -DescVentilCustomer=Consult here the list of customer invoice lines bound (or not) to a product accounting account -DescVentilMore=In most cases, if you use predefined products or services and you set the account number on the product/service card, the application will be able to make all the binding between your invoice lines and the accounting account of your chart of accounts, just in one click with the button "%s". If account was not set on product/service cards or if you still have some lines not bound to an account, you will have to make a manual binding from the menu "%s". -DescVentilDoneCustomer=Consult here the list of the lines of invoices customers and their product accounting account -DescVentilTodoCustomer=Bind invoice lines not already bound with a product accounting account -ChangeAccount=Change the product/service accounting account for selected lines with the following accounting account: +DescVentilCustomer=Consult here the list of customer invoice lines bound (or not) to a product account from chart of account +DescVentilMore=In most cases, if you use predefined products or services and you set the account (from chart of account) on the product/service card, the application will be able to make all the binding between your invoice lines and the accounting account of your chart of accounts, just in one click with the button "%s". If account was not set on product/service cards or if you still have some lines not bound to an account, you will have to make a manual binding from the menu "%s". +DescVentilDoneCustomer=Consult here the list of the lines of invoices customers and their product account from chart of account +DescVentilTodoCustomer=Bind invoice lines not already bound with a product account from chart of account +ChangeAccount=Change the product/service account (from chart of account) for the selected lines with the following account: Vide=- -DescVentilSupplier=Consult here the list of vendor invoice lines bound or not yet bound to a product accounting account (only record not already transfered in accountancy are visible) +DescVentilSupplier=Consult here the list of vendor invoice lines bound or not yet bound to a product account from chart of account (only record not already transfered in accountancy are visible) DescVentilDoneSupplier=Consult here the list of the lines of vendor invoices and their accounting account DescVentilTodoExpenseReport=Bind expense report lines not already bound with a fee accounting account DescVentilExpenseReport=Consult here the list of expense report lines bound (or not) to a fee accounting account @@ -295,14 +295,14 @@ DescValidateMovements=Any modification or deletion of writing, lettering and del ValidateHistory=Bind Automatically AutomaticBindingDone=Automatic bindings done (%s) - Automatic binding not possible for some record (%s) -ErrorAccountancyCodeIsAlreadyUse=Error, you cannot delete this accounting account because it is used +ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s Balancing=Balancing FicheVentilation=Binding card GeneralLedgerIsWritten=Transactions are written in the Ledger GeneralLedgerSomeRecordWasNotRecorded=Some of the transactions could not be journalized. If there is no other error message, this is probably because they were already journalized. NoNewRecordSaved=No more record to transfer -ListOfProductsWithoutAccountingAccount=List of products not bound to any accounting account +ListOfProductsWithoutAccountingAccount=List of products not bound to any account of chart of account ChangeBinding=Change the binding Accounted=Accounted in ledger NotYetAccounted=Not yet transferred to accounting From b2c27cc8564cf404d1108649e8e8cbf4838bff50 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 02:11:05 +0100 Subject: [PATCH 0247/1128] FIX Duplicate test --- htdocs/accountancy/admin/categories_list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/accountancy/admin/categories_list.php b/htdocs/accountancy/admin/categories_list.php index 3a6664b8b44..a33616fc09e 100644 --- a/htdocs/accountancy/admin/categories_list.php +++ b/htdocs/accountancy/admin/categories_list.php @@ -190,7 +190,7 @@ if (GETPOST('actionadd', 'alpha') || GETPOST('actionmodify', 'alpha')) { setEventMessages($langs->transnoentities('ErrorCodeCantContainZero'), null, 'errors'); } } - if (!is_numeric(GETPOST('position', 'alpha'))) { + if (GETPOST('position') && !is_numeric(GETPOST('position', 'alpha'))) { $langs->loadLangs(array("errors")); $ok = 0; setEventMessages($langs->transnoentities('ErrorFieldMustBeANumeric', $langs->transnoentities("Position")), null, 'errors'); From 44f1699683eb3a99a53103ef49128a350ba5067d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 03:06:53 +0100 Subject: [PATCH 0248/1128] FIX Debug v17 --- htdocs/accountancy/admin/account.php | 4 +-- htdocs/accountancy/admin/categories.php | 29 ++++++++++--------- htdocs/accountancy/admin/categories_list.php | 12 ++++---- .../core/class/html.formaccounting.class.php | 6 +++- htdocs/core/lib/functions.lib.php | 19 +++++++----- 5 files changed, 40 insertions(+), 30 deletions(-) diff --git a/htdocs/accountancy/admin/account.php b/htdocs/accountancy/admin/account.php index 2a23ee5eb85..21d60103135 100644 --- a/htdocs/accountancy/admin/account.php +++ b/htdocs/accountancy/admin/account.php @@ -399,7 +399,7 @@ if ($resql) { } print ""; print ajax_combobox("chartofaccounts"); - print ''; + print ''; print '
'; @@ -436,7 +436,7 @@ if ($resql) { } if (!empty($arrayfields['aa.account_parent']['checked'])) { print ''; - print $formaccounting->select_account($search_accountparent, 'search_accountparent', 2); + print $formaccounting->select_account($search_accountparent, 'search_accountparent', 2, array(), 0, 0, 'maxwidth150'); print ''; } if (!empty($arrayfields['aa.pcg_type']['checked'])) { diff --git a/htdocs/accountancy/admin/categories.php b/htdocs/accountancy/admin/categories.php index 7b86902e009..87e6a3b490c 100644 --- a/htdocs/accountancy/admin/categories.php +++ b/htdocs/accountancy/admin/categories.php @@ -110,18 +110,22 @@ print ''; // Select the category print ''; print ''; +print '
'.$langs->trans("AccountingCategory").''; -$formaccounting->select_accounting_category($cat_id, 'account_category', 1, 0, 0, 1); -print ''; +$formaccounting->select_accounting_category($cat_id, 'account_category', 1, 0, 0, 0); +print ''; print '
'; + +print dol_get_fiche_end(); + + // Select the accounts if (!empty($cat_id)) { $return = $accountingcategory->getAccountsWithNoCategory($cat_id); if ($return < 0) { setEventMessages(null, $accountingcategory->errors, 'errors'); } - print ''.$langs->trans("AddAccountFromBookKeepingWithNoCategories").''; - print ''; + print '
'; $arraykeyvalue = array(); foreach ($accountingcategory->lines_cptbk as $key => $val) { @@ -130,8 +134,9 @@ if (!empty($cat_id)) { } if (is_array($accountingcategory->lines_cptbk) && count($accountingcategory->lines_cptbk) > 0) { - print $form->multiselectarray('cpt_bk', $arraykeyvalue, GETPOST('cpt_bk', 'array'), null, null, null, null, "90%"); - print '
'; + print img_picto($langs->trans("AccountingAccount"), 'accounting_account', 'class="pictofixedwith"'); + print $form->multiselectarray('cpt_bk', $arraykeyvalue, GETPOST('cpt_bk', 'array'), null, null, '', 0, "80%", '', '', $langs->transnoentitiesnoconv("AddAccountFromBookKeepingWithNoCategories")); + //print '
'; /*print '
'; print ajax_combobox('cpt_bk'); */ - print ' '; + print ' '; } - print ''; } -print ''; - -print dol_get_fiche_end(); - print ''; if ($action == 'display' || $action == 'delete') { - print "\n"; + print '
'; + print '
'."\n"; print ''; print '"; print '"; @@ -177,6 +178,8 @@ if ($action == 'display' || $action == 'delete') { print ""; print "\n"; } + } else { + print ''; } } diff --git a/htdocs/accountancy/admin/categories_list.php b/htdocs/accountancy/admin/categories_list.php index a33616fc09e..0e7bd908c9a 100644 --- a/htdocs/accountancy/admin/categories_list.php +++ b/htdocs/accountancy/admin/categories_list.php @@ -605,7 +605,7 @@ if ($resql) { if ($showfield) { if ($value == 'country') { print ''; $filterfound++; } else { @@ -725,11 +725,11 @@ if ($resql) { print ''; print ''; print ''; print ''; } else { @@ -887,10 +887,10 @@ function fieldListAccountingCategories($fieldlist, $obj = '', $tabname = '', $co if ($context == 'add') { $fieldname = 'country_id'; $preselectcountrycode = GETPOSTISSET('country_id') ? GETPOST('country_id', 'int') : $mysoc->country_code; - print $form->select_country($preselectcountrycode, $fieldname, '', 28, 'maxwidth200 maxwidthonsmartphone'); + print $form->select_country($preselectcountrycode, $fieldname, '', 28, 'maxwidth150 maxwidthonsmartphone'); } else { $preselectcountrycode = (empty($obj->country_code) ? (empty($obj->country) ? $mysoc->country_code : $obj->country) : $obj->country_code); - print $form->select_country($preselectcountrycode, $fieldname, '', 28, 'maxwidth200 maxwidthonsmartphone'); + print $form->select_country($preselectcountrycode, $fieldname, '', 28, 'maxwidth150 maxwidthonsmartphone'); } print ''; } elseif ($fieldlist[$field] == 'country_id') { diff --git a/htdocs/core/class/html.formaccounting.class.php b/htdocs/core/class/html.formaccounting.class.php index 19ef75c8aaa..8ebac3611cb 100644 --- a/htdocs/core/class/html.formaccounting.class.php +++ b/htdocs/core/class/html.formaccounting.class.php @@ -270,12 +270,16 @@ class FormAccounting extends Form } while ($i < $num) { $obj = $this->db->fetch_object($resql); + + $titletoshowhtml = ($maxlen ? dol_trunc($obj->type, $maxlen) : $obj->type).($obj->range_account ? ' ('.$obj->range_account.')' : ''); + $titletoshow = ($maxlen ? dol_trunc($obj->type, $maxlen) : $obj->type).($obj->range_account ? ' ('.$obj->range_account.')' : ''); + $out .= ''; $i++; diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 3af565a1baf..00defaf909c 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -6914,24 +6914,27 @@ function dol_string_nohtmltag($stringtoclean, $removelinefeed = 1, $pagecodeto = /** * Clean a string to keep only desirable HTML tags. - * WARNING: This also clean HTML comments (used to obfuscate tag name). + * WARNING: This also clean HTML comments (because they can be used to obfuscate tag name). * * @param string $stringtoclean String to clean * @param int $cleanalsosomestyles Remove absolute/fixed positioning from inline styles * @param int $removeclassattribute 1=Remove the class attribute from tags * @param int $cleanalsojavascript Remove also occurence of 'javascript:'. * @param int $allowiframe Allow iframe tags. + * @param array $allowed_tags List of allowed tags to replace the default list * @return string String cleaned * * @see dol_escape_htmltag() strip_tags() dol_string_nohtmltag() dol_string_neverthesehtmltags() */ -function dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles = 1, $removeclassattribute = 1, $cleanalsojavascript = 0, $allowiframe = 0) +function dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles = 1, $removeclassattribute = 1, $cleanalsojavascript = 0, $allowiframe = 0, $allowed_tags = array()) { - $allowed_tags = array( - "html", "head", "meta", "body", "article", "a", "abbr", "b", "blockquote", "br", "cite", "div", "dl", "dd", "dt", "em", "font", "img", "ins", "hr", "i", "li", "link", - "ol", "p", "q", "s", "section", "span", "strike", "strong", "title", "table", "tr", "th", "td", "u", "ul", "sup", "sub", "blockquote", "pre", "h1", "h2", "h3", "h4", "h5", "h6", - "comment" // this tags is added to manage comment that are replaced into ... - ); + if (empty($allowed_tags)) { + $allowed_tags = array( + "html", "head", "meta", "body", "article", "a", "abbr", "b", "blockquote", "br", "cite", "div", "dl", "dd", "dt", "em", "font", "img", "ins", "hr", "i", "li", "link", + "ol", "p", "q", "s", "section", "span", "strike", "strong", "title", "table", "tr", "th", "td", "u", "ul", "sup", "sub", "blockquote", "pre", "h1", "h2", "h3", "h4", "h5", "h6" + ); + } + $allowed_tags[] = "comment"; // this tags is added to manage comment that are replaced into ... if ($allowiframe) { $allowed_tags[] = "iframe"; } @@ -6949,7 +6952,7 @@ function dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles = 1, $stringtoclean = preg_replace('/:/i', ':', $stringtoclean); $stringtoclean = preg_replace('/:|�+58|:/i', '', $stringtoclean); // refused string ':' encoded (no reason to have a : encoded like this) to disable 'javascript:...' - $temp = strip_tags($stringtoclean, $allowed_tags_string); // Warning: This remove also undesired changing string obfuscated with that pass injection detection into harmfull string + $temp = strip_tags($stringtoclean, $allowed_tags_string); // Warning: This remove also undesired , so may changes string obfuscated with that pass the injection detection into a harmfull string if ($cleanalsosomestyles) { // Clean for remaining html tags $temp = preg_replace('/position\s*:\s*(absolute|fixed)\s*!\s*important/i', '', $temp); // Note: If hacker try to introduce css comment into string to bypass this regex, the string must also be encoded by the dol_htmlentitiesbr during output so it become harmless From 242713bb972d2294c5a6542ded6c1ebfd6a947b9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 02:11:05 +0100 Subject: [PATCH 0249/1128] FIX Duplicate test --- htdocs/accountancy/admin/categories_list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/accountancy/admin/categories_list.php b/htdocs/accountancy/admin/categories_list.php index 3a6664b8b44..a33616fc09e 100644 --- a/htdocs/accountancy/admin/categories_list.php +++ b/htdocs/accountancy/admin/categories_list.php @@ -190,7 +190,7 @@ if (GETPOST('actionadd', 'alpha') || GETPOST('actionmodify', 'alpha')) { setEventMessages($langs->transnoentities('ErrorCodeCantContainZero'), null, 'errors'); } } - if (!is_numeric(GETPOST('position', 'alpha'))) { + if (GETPOST('position') && !is_numeric(GETPOST('position', 'alpha'))) { $langs->loadLangs(array("errors")); $ok = 0; setEventMessages($langs->transnoentities('ErrorFieldMustBeANumeric', $langs->transnoentities("Position")), null, 'errors'); From 46db4b51d18d40128c508ed3f486dda52b0d5286 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 03:06:53 +0100 Subject: [PATCH 0250/1128] FIX Debug v17 --- htdocs/accountancy/admin/account.php | 4 +-- htdocs/accountancy/admin/categories.php | 29 ++++++++++--------- htdocs/accountancy/admin/categories_list.php | 12 ++++---- .../core/class/html.formaccounting.class.php | 6 +++- htdocs/core/lib/functions.lib.php | 19 +++++++----- 5 files changed, 40 insertions(+), 30 deletions(-) diff --git a/htdocs/accountancy/admin/account.php b/htdocs/accountancy/admin/account.php index 2a23ee5eb85..21d60103135 100644 --- a/htdocs/accountancy/admin/account.php +++ b/htdocs/accountancy/admin/account.php @@ -399,7 +399,7 @@ if ($resql) { } print ""; print ajax_combobox("chartofaccounts"); - print ''; + print ''; print '
'; @@ -436,7 +436,7 @@ if ($resql) { } if (!empty($arrayfields['aa.account_parent']['checked'])) { print '
'; } if (!empty($arrayfields['aa.pcg_type']['checked'])) { diff --git a/htdocs/accountancy/admin/categories.php b/htdocs/accountancy/admin/categories.php index 7b86902e009..87e6a3b490c 100644 --- a/htdocs/accountancy/admin/categories.php +++ b/htdocs/accountancy/admin/categories.php @@ -110,18 +110,22 @@ print '
'.$langs->trans("AccountAccounting")."'.$langs->trans("Label")."
'.$langs->trans("NoRecordFound").'
'; - print $form->select_country($search_country_id, 'search_country_id', '', 28, 'maxwidth200 maxwidthonsmartphone'); + print $form->select_country($search_country_id, 'search_country_id', '', 28, 'maxwidth150 maxwidthonsmartphone'); print ''; + print '
'; print ''; print ''; - print ''; - print '
'; - print ''; + print ''; + print ''; print '
'; - print $formaccounting->select_account($search_accountparent, 'search_accountparent', 2); + print $formaccounting->select_account($search_accountparent, 'search_accountparent', 2, array(), 0, 0, 'maxwidth150'); print '
'; // Select the category print ''; print ''; +print '
'.$langs->trans("AccountingCategory").''; -$formaccounting->select_accounting_category($cat_id, 'account_category', 1, 0, 0, 1); -print ''; +$formaccounting->select_accounting_category($cat_id, 'account_category', 1, 0, 0, 0); +print ''; print '
'; + +print dol_get_fiche_end(); + + // Select the accounts if (!empty($cat_id)) { $return = $accountingcategory->getAccountsWithNoCategory($cat_id); if ($return < 0) { setEventMessages(null, $accountingcategory->errors, 'errors'); } - print ''.$langs->trans("AddAccountFromBookKeepingWithNoCategories").''; - print ''; + print '
'; $arraykeyvalue = array(); foreach ($accountingcategory->lines_cptbk as $key => $val) { @@ -130,8 +134,9 @@ if (!empty($cat_id)) { } if (is_array($accountingcategory->lines_cptbk) && count($accountingcategory->lines_cptbk) > 0) { - print $form->multiselectarray('cpt_bk', $arraykeyvalue, GETPOST('cpt_bk', 'array'), null, null, null, null, "90%"); - print '
'; + print img_picto($langs->trans("AccountingAccount"), 'accounting_account', 'class="pictofixedwith"'); + print $form->multiselectarray('cpt_bk', $arraykeyvalue, GETPOST('cpt_bk', 'array'), null, null, '', 0, "80%", '', '', $langs->transnoentitiesnoconv("AddAccountFromBookKeepingWithNoCategories")); + //print '
'; /*print '
'; print ajax_combobox('cpt_bk'); */ - print ' '; + print ' '; } - print ''; } -print ''; - -print dol_get_fiche_end(); - print ''; if ($action == 'display' || $action == 'delete') { - print "\n"; + print '
'; + print '
'."\n"; print ''; print '"; print '"; @@ -177,6 +178,8 @@ if ($action == 'display' || $action == 'delete') { print ""; print "\n"; } + } else { + print ''; } } diff --git a/htdocs/accountancy/admin/categories_list.php b/htdocs/accountancy/admin/categories_list.php index a33616fc09e..0e7bd908c9a 100644 --- a/htdocs/accountancy/admin/categories_list.php +++ b/htdocs/accountancy/admin/categories_list.php @@ -605,7 +605,7 @@ if ($resql) { if ($showfield) { if ($value == 'country') { print ''; $filterfound++; } else { @@ -725,11 +725,11 @@ if ($resql) { print ''; print ''; print ''; print ''; } else { @@ -887,10 +887,10 @@ function fieldListAccountingCategories($fieldlist, $obj = '', $tabname = '', $co if ($context == 'add') { $fieldname = 'country_id'; $preselectcountrycode = GETPOSTISSET('country_id') ? GETPOST('country_id', 'int') : $mysoc->country_code; - print $form->select_country($preselectcountrycode, $fieldname, '', 28, 'maxwidth200 maxwidthonsmartphone'); + print $form->select_country($preselectcountrycode, $fieldname, '', 28, 'maxwidth150 maxwidthonsmartphone'); } else { $preselectcountrycode = (empty($obj->country_code) ? (empty($obj->country) ? $mysoc->country_code : $obj->country) : $obj->country_code); - print $form->select_country($preselectcountrycode, $fieldname, '', 28, 'maxwidth200 maxwidthonsmartphone'); + print $form->select_country($preselectcountrycode, $fieldname, '', 28, 'maxwidth150 maxwidthonsmartphone'); } print ''; } elseif ($fieldlist[$field] == 'country_id') { diff --git a/htdocs/core/class/html.formaccounting.class.php b/htdocs/core/class/html.formaccounting.class.php index 19ef75c8aaa..8ebac3611cb 100644 --- a/htdocs/core/class/html.formaccounting.class.php +++ b/htdocs/core/class/html.formaccounting.class.php @@ -270,12 +270,16 @@ class FormAccounting extends Form } while ($i < $num) { $obj = $this->db->fetch_object($resql); + + $titletoshowhtml = ($maxlen ? dol_trunc($obj->type, $maxlen) : $obj->type).($obj->range_account ? ' ('.$obj->range_account.')' : ''); + $titletoshow = ($maxlen ? dol_trunc($obj->type, $maxlen) : $obj->type).($obj->range_account ? ' ('.$obj->range_account.')' : ''); + $out .= ''; $i++; diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index ca7e346b2bd..24e4a332e10 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -6914,24 +6914,27 @@ function dol_string_nohtmltag($stringtoclean, $removelinefeed = 1, $pagecodeto = /** * Clean a string to keep only desirable HTML tags. - * WARNING: This also clean HTML comments (used to obfuscate tag name). + * WARNING: This also clean HTML comments (because they can be used to obfuscate tag name). * * @param string $stringtoclean String to clean * @param int $cleanalsosomestyles Remove absolute/fixed positioning from inline styles * @param int $removeclassattribute 1=Remove the class attribute from tags * @param int $cleanalsojavascript Remove also occurence of 'javascript:'. * @param int $allowiframe Allow iframe tags. + * @param array $allowed_tags List of allowed tags to replace the default list * @return string String cleaned * * @see dol_escape_htmltag() strip_tags() dol_string_nohtmltag() dol_string_neverthesehtmltags() */ -function dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles = 1, $removeclassattribute = 1, $cleanalsojavascript = 0, $allowiframe = 0) +function dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles = 1, $removeclassattribute = 1, $cleanalsojavascript = 0, $allowiframe = 0, $allowed_tags = array()) { - $allowed_tags = array( - "html", "head", "meta", "body", "article", "a", "abbr", "b", "blockquote", "br", "cite", "div", "dl", "dd", "dt", "em", "font", "img", "ins", "hr", "i", "li", "link", - "ol", "p", "q", "s", "section", "span", "strike", "strong", "title", "table", "tr", "th", "td", "u", "ul", "sup", "sub", "blockquote", "pre", "h1", "h2", "h3", "h4", "h5", "h6", - "comment" // this tags is added to manage comment that are replaced into ... - ); + if (empty($allowed_tags)) { + $allowed_tags = array( + "html", "head", "meta", "body", "article", "a", "abbr", "b", "blockquote", "br", "cite", "div", "dl", "dd", "dt", "em", "font", "img", "ins", "hr", "i", "li", "link", + "ol", "p", "q", "s", "section", "span", "strike", "strong", "title", "table", "tr", "th", "td", "u", "ul", "sup", "sub", "blockquote", "pre", "h1", "h2", "h3", "h4", "h5", "h6" + ); + } + $allowed_tags[] = "comment"; // this tags is added to manage comment that are replaced into ... if ($allowiframe) { $allowed_tags[] = "iframe"; } @@ -6949,7 +6952,7 @@ function dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles = 1, $stringtoclean = preg_replace('/:/i', ':', $stringtoclean); $stringtoclean = preg_replace('/:|�+58|:/i', '', $stringtoclean); // refused string ':' encoded (no reason to have a : encoded like this) to disable 'javascript:...' - $temp = strip_tags($stringtoclean, $allowed_tags_string); // Warning: This remove also undesired changing string obfuscated with that pass injection detection into harmfull string + $temp = strip_tags($stringtoclean, $allowed_tags_string); // Warning: This remove also undesired , so may changes string obfuscated with that pass the injection detection into a harmfull string if ($cleanalsosomestyles) { // Clean for remaining html tags $temp = preg_replace('/position\s*:\s*(absolute|fixed)\s*!\s*important/i', '', $temp); // Note: If hacker try to introduce css comment into string to bypass this regex, the string must also be encoded by the dol_htmlentitiesbr during output so it become harmless From 58fe0721c379c1b88fc372c4c8af893486071038 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 03:15:23 +0100 Subject: [PATCH 0251/1128] Try fix in travis --- .travis.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1469894dfc3..6ae9da1b2c2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -96,10 +96,9 @@ notifications: install: - | echo "Updating Composer (version 2.5 is bugged and generate phpunit error Exception: Serialization of 'Closure' is not allowed)" + composer -V #rm $TRAVIS_BUILD_DIR/composer.json #rm $TRAVIS_BUILD_DIR/composer.lock - composer -V - composer self-update 2.4.4 #composer -n init #composer -n config vendor-dir htdocs/includes composer -n config -g vendor-dir htdocs/includes @@ -108,6 +107,7 @@ install: - | echo "Installing Composer dependencies - PHP Unit, Parallel Lint, PHP CodeSniffer, PHP Vardump check - for $TRAVIS_PHP_VERSION" if [ "$TRAVIS_PHP_VERSION" = '7.0' ] || [ "$TRAVIS_PHP_VERSION" = '7.1' ] || [ "$TRAVIS_PHP_VERSION" = '7.2' ]; then + composer self-update 2.2.18 composer -n require phpunit/phpunit ^6 \ php-parallel-lint/php-parallel-lint ^1 \ php-parallel-lint/php-console-highlighter ^0 \ @@ -115,6 +115,7 @@ install: squizlabs/php_codesniffer ^3 fi if [ "$TRAVIS_PHP_VERSION" = '7.3' ] || [ "$TRAVIS_PHP_VERSION" = '7.4' ]; then + composer self-update 2.2.18 composer -n require phpunit/phpunit ^7 \ php-parallel-lint/php-parallel-lint ^1.2 \ php-parallel-lint/php-console-highlighter ^0 \ @@ -123,6 +124,7 @@ install: fi # phpunit 9 is required for php 8 if [ "$TRAVIS_PHP_VERSION" = '8.0' ] || [ "$TRAVIS_PHP_VERSION" = '8.1' ] || [ "$TRAVIS_PHP_VERSION" = 'nightly' ]; then + composer self-update 2.4.4 composer -n require --ignore-platform-reqs phpunit/phpunit ^8 \ php-parallel-lint/php-parallel-lint ^1.2 \ php-parallel-lint/php-console-highlighter ^0 \ From fc18a28232008b5a7e0d92419c05c7591355d0f6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 03:23:53 +0100 Subject: [PATCH 0252/1128] Log --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6ae9da1b2c2..882c6e74620 100644 --- a/.travis.yml +++ b/.travis.yml @@ -95,7 +95,7 @@ notifications: install: - | - echo "Updating Composer (version 2.5 is bugged and generate phpunit error Exception: Serialization of 'Closure' is not allowed)" + echo "Updating Composer config" composer -V #rm $TRAVIS_BUILD_DIR/composer.json #rm $TRAVIS_BUILD_DIR/composer.lock @@ -105,7 +105,8 @@ install: echo - | - echo "Installing Composer dependencies - PHP Unit, Parallel Lint, PHP CodeSniffer, PHP Vardump check - for $TRAVIS_PHP_VERSION" + echo "Update Composer version and Install tools - PHP Unit, Parallel Lint, PHP CodeSniffer, PHP Vardump check - for $TRAVIS_PHP_VERSION" + echo "(version 2.5 is bugged and generate phpunit error Exception: Serialization of 'Closure' is not allowed)" if [ "$TRAVIS_PHP_VERSION" = '7.0' ] || [ "$TRAVIS_PHP_VERSION" = '7.1' ] || [ "$TRAVIS_PHP_VERSION" = '7.2' ]; then composer self-update 2.2.18 composer -n require phpunit/phpunit ^6 \ From 2959704b80d7607f8c9be25c77eaf2579b193f0f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 03:54:53 +0100 Subject: [PATCH 0253/1128] Fix look and feel --- htdocs/accountancy/customer/lines.php | 4 ++++ htdocs/accountancy/customer/list.php | 4 ++++ htdocs/accountancy/expensereport/lines.php | 7 +++++++ htdocs/accountancy/expensereport/list.php | 3 +++ htdocs/accountancy/supplier/lines.php | 4 ++++ htdocs/accountancy/supplier/list.php | 3 +++ 6 files changed, 25 insertions(+) diff --git a/htdocs/accountancy/customer/lines.php b/htdocs/accountancy/customer/lines.php index e4f7d556c16..b8df8890a01 100644 --- a/htdocs/accountancy/customer/lines.php +++ b/htdocs/accountancy/customer/lines.php @@ -529,6 +529,10 @@ if ($result) { print ''; $i++; } + if ($num_lines == 0) { + print ''; + } + print '
'.$langs->trans("AccountAccounting")."'.$langs->trans("Label")."
'.$langs->trans("NoRecordFound").'
'; - print $form->select_country($search_country_id, 'search_country_id', '', 28, 'maxwidth200 maxwidthonsmartphone'); + print $form->select_country($search_country_id, 'search_country_id', '', 28, 'maxwidth150 maxwidthonsmartphone'); print ''; + print '
'; print ''; print ''; - print ''; - print '
'; - print ''; + print ''; + print ''; print '
'.$langs->trans("NoRecordFound").'
'; print ""; diff --git a/htdocs/accountancy/customer/list.php b/htdocs/accountancy/customer/list.php index 57a9dd99e5e..021c1ec7821 100644 --- a/htdocs/accountancy/customer/list.php +++ b/htdocs/accountancy/customer/list.php @@ -749,6 +749,10 @@ if ($result) { print ''; $i++; } + if ($num_lines == 0) { + print ''.$langs->trans("NoRecordFound").''; + } + print ''; print ""; diff --git a/htdocs/accountancy/expensereport/lines.php b/htdocs/accountancy/expensereport/lines.php index aef45ae3ce1..1d0653fc5ac 100644 --- a/htdocs/accountancy/expensereport/lines.php +++ b/htdocs/accountancy/expensereport/lines.php @@ -427,6 +427,13 @@ if ($result) { print ""; $i++; } + if ($num_lines == 0) { + $colspan=10; + if (!empty($conf->global->ACCOUNTANCY_USE_EXPENSE_REPORT_VALIDATION_DATE)) { + $colspan++; + } + print ''.$langs->trans("NoRecordFound").''; + } print ""; print ""; diff --git a/htdocs/accountancy/expensereport/list.php b/htdocs/accountancy/expensereport/list.php index b90a8a2c573..9cfbd940875 100644 --- a/htdocs/accountancy/expensereport/list.php +++ b/htdocs/accountancy/expensereport/list.php @@ -513,6 +513,9 @@ if ($result) { print ""; $i++; } + if ($num_lines == 0) { + print ''.$langs->trans("NoRecordFound").''; + } print ''; print ""; diff --git a/htdocs/accountancy/supplier/lines.php b/htdocs/accountancy/supplier/lines.php index 25368f30c61..ea9841d2fbb 100644 --- a/htdocs/accountancy/supplier/lines.php +++ b/htdocs/accountancy/supplier/lines.php @@ -558,6 +558,10 @@ if ($result) { print ''; $i++; } + if ($num_lines == 0) { + print ''.$langs->trans("NoRecordFound").''; + } + print ''; print ""; diff --git a/htdocs/accountancy/supplier/list.php b/htdocs/accountancy/supplier/list.php index b78227a67f6..3b8e93cb54b 100644 --- a/htdocs/accountancy/supplier/list.php +++ b/htdocs/accountancy/supplier/list.php @@ -777,6 +777,9 @@ if ($result) { print ''; $i++; } + if ($num_lines == 0) { + print ''.$langs->trans("NoRecordFound").''; + } print ''; print ""; From e1093b541e1d490532e6110b00c96bfccb1b87e2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 03:54:53 +0100 Subject: [PATCH 0254/1128] Fix look and feel --- htdocs/accountancy/customer/lines.php | 4 ++++ htdocs/accountancy/customer/list.php | 4 ++++ htdocs/accountancy/expensereport/lines.php | 7 +++++++ htdocs/accountancy/expensereport/list.php | 3 +++ htdocs/accountancy/supplier/lines.php | 4 ++++ htdocs/accountancy/supplier/list.php | 3 +++ 6 files changed, 25 insertions(+) diff --git a/htdocs/accountancy/customer/lines.php b/htdocs/accountancy/customer/lines.php index e4f7d556c16..b8df8890a01 100644 --- a/htdocs/accountancy/customer/lines.php +++ b/htdocs/accountancy/customer/lines.php @@ -529,6 +529,10 @@ if ($result) { print ''; $i++; } + if ($num_lines == 0) { + print ''.$langs->trans("NoRecordFound").''; + } + print ''; print ""; diff --git a/htdocs/accountancy/customer/list.php b/htdocs/accountancy/customer/list.php index 57a9dd99e5e..021c1ec7821 100644 --- a/htdocs/accountancy/customer/list.php +++ b/htdocs/accountancy/customer/list.php @@ -749,6 +749,10 @@ if ($result) { print ''; $i++; } + if ($num_lines == 0) { + print ''.$langs->trans("NoRecordFound").''; + } + print ''; print ""; diff --git a/htdocs/accountancy/expensereport/lines.php b/htdocs/accountancy/expensereport/lines.php index aef45ae3ce1..1d0653fc5ac 100644 --- a/htdocs/accountancy/expensereport/lines.php +++ b/htdocs/accountancy/expensereport/lines.php @@ -427,6 +427,13 @@ if ($result) { print ""; $i++; } + if ($num_lines == 0) { + $colspan=10; + if (!empty($conf->global->ACCOUNTANCY_USE_EXPENSE_REPORT_VALIDATION_DATE)) { + $colspan++; + } + print ''.$langs->trans("NoRecordFound").''; + } print ""; print ""; diff --git a/htdocs/accountancy/expensereport/list.php b/htdocs/accountancy/expensereport/list.php index b90a8a2c573..9cfbd940875 100644 --- a/htdocs/accountancy/expensereport/list.php +++ b/htdocs/accountancy/expensereport/list.php @@ -513,6 +513,9 @@ if ($result) { print ""; $i++; } + if ($num_lines == 0) { + print ''.$langs->trans("NoRecordFound").''; + } print ''; print ""; diff --git a/htdocs/accountancy/supplier/lines.php b/htdocs/accountancy/supplier/lines.php index 25368f30c61..ea9841d2fbb 100644 --- a/htdocs/accountancy/supplier/lines.php +++ b/htdocs/accountancy/supplier/lines.php @@ -558,6 +558,10 @@ if ($result) { print ''; $i++; } + if ($num_lines == 0) { + print ''.$langs->trans("NoRecordFound").''; + } + print ''; print ""; diff --git a/htdocs/accountancy/supplier/list.php b/htdocs/accountancy/supplier/list.php index b78227a67f6..3b8e93cb54b 100644 --- a/htdocs/accountancy/supplier/list.php +++ b/htdocs/accountancy/supplier/list.php @@ -777,6 +777,9 @@ if ($result) { print ''; $i++; } + if ($num_lines == 0) { + print ''.$langs->trans("NoRecordFound").''; + } print ''; print ""; From 0e85c84965c69e56fe94d6b3661a99c97e5d21ed Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Thu, 22 Dec 2022 09:59:58 +0000 Subject: [PATCH 0255/1128] Fixing style errors. --- htdocs/core/class/commonorder.class.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/core/class/commonorder.class.php b/htdocs/core/class/commonorder.class.php index 38d2cf9edc5..08753b54ba4 100644 --- a/htdocs/core/class/commonorder.class.php +++ b/htdocs/core/class/commonorder.class.php @@ -71,7 +71,6 @@ abstract class CommonOrder extends CommonObject * @var string code */ public $code = ""; - } /** From 20cd8348394af379df498ee23fa0391176745322 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Thu, 22 Dec 2022 10:15:21 +0000 Subject: [PATCH 0256/1128] Fixing style errors. --- htdocs/product/list.php | 1339 +++++++++++++++++++-------------------- 1 file changed, 667 insertions(+), 672 deletions(-) diff --git a/htdocs/product/list.php b/htdocs/product/list.php index c4473a9376a..f7634c7311b 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -675,7 +675,7 @@ if (GETPOST('delprod')) { $param = ''; if (!empty($mode)) { - $param = "&mode=".urlencode($mode); + $param = "&mode=".urlencode($mode); } if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); @@ -788,26 +788,26 @@ $massactionbutton = $form->selectMassAction('', $arrayofmassactions); $newcardbutton = ''; $newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); $newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); - if ($type === "") { - $perm = ($user->rights->produit->creer || $user->rights->service->creer); - } elseif ($type == Product::TYPE_SERVICE) { - $perm = $user->rights->service->creer; - } elseif ($type == Product::TYPE_PRODUCT) { - $perm = $user->rights->produit->creer; - } +if ($type === "") { + $perm = ($user->rights->produit->creer || $user->rights->service->creer); +} elseif ($type == Product::TYPE_SERVICE) { + $perm = $user->rights->service->creer; +} elseif ($type == Product::TYPE_PRODUCT) { + $perm = $user->rights->produit->creer; +} $oldtype = $type; $params = array(); - if ($type === "") { - $params['forcenohideoftext'] = 1; - } - if ($type === "") { - $newcardbutton .= dolGetButtonTitle($langs->trans('NewProduct'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/product/card.php?action=create&type=0', '', $perm, $params); - $type = Product::TYPE_SERVICE; - } +if ($type === "") { + $params['forcenohideoftext'] = 1; +} +if ($type === "") { + $newcardbutton .= dolGetButtonTitle($langs->trans('NewProduct'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/product/card.php?action=create&type=0', '', $perm, $params); + $type = Product::TYPE_SERVICE; +} $label = 'NewProduct'; - if ($type == Product::TYPE_SERVICE) { - $label = 'NewService'; - } +if ($type == Product::TYPE_SERVICE) { + $label = 'NewService'; +} $newcardbutton .= dolGetButtonTitle($langs->trans($label), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/product/card.php?action=create&type='.$type, '', $perm, $params); @@ -1337,679 +1337,99 @@ print "\n"; $totalarray = array(); $totalarray['nbfield'] = 0; $imaxinloop = ($limit ? min($num, $limit) : $num); - while ($i < $imaxinloop) { - $obj = $db->fetch_object($resql); +while ($i < $imaxinloop) { + $obj = $db->fetch_object($resql); - // Multilangs - if (getDolGlobalInt('MAIN_MULTILANGS')) { // If multilang is enabled - $sql = "SELECT label"; - $sql .= " FROM ".MAIN_DB_PREFIX."product_lang"; - $sql .= " WHERE fk_product = ".((int) $obj->rowid); - $sql .= " AND lang = '".$db->escape($langs->getDefaultLang())."'"; - $sql .= " LIMIT 1"; - - $result = $db->query($sql); - if ($result) { - $objtp = $db->fetch_object($result); - if (!empty($objtp->label)) { - $obj->label = $objtp->label; - } + // Multilangs + if (getDolGlobalInt('MAIN_MULTILANGS')) { // If multilang is enabled + $sql = "SELECT label"; + $sql .= " FROM ".MAIN_DB_PREFIX."product_lang"; + $sql .= " WHERE fk_product = ".((int) $obj->rowid); + $sql .= " AND lang = '".$db->escape($langs->getDefaultLang())."'"; + $sql .= " LIMIT 1"; + $result = $db->query($sql); + if ($result) { + $objtp = $db->fetch_object($result); + if (!empty($objtp->label)) { + $obj->label = $objtp->label; } } } +} $parameters = array('staticdata' => $obj); // Note that $action and $object may have been modified by hook // do product_static fetch in hook if wanted or anything else $reshook = $hookmanager->executeHooks('loadStaticObject', $parameters, $product_static, $action); - if (empty($reshook)) { - $product_static->id = $obj->rowid; - $product_static->ref = $obj->ref; - $product_static->ref_fourn = empty($obj->ref_supplier) ? '' : $obj->ref_supplier; // deprecated - $product_static->ref_supplier = empty($obj->ref_supplier) ? '' : $obj->ref_supplier; - $product_static->label = $obj->label; - $product_static->finished = $obj->finished; - $product_static->type = $obj->fk_product_type; - $product_static->status_buy = $obj->tobuy; - $product_static->status = $obj->tosell; - $product_static->status_batch = $obj->tobatch; - $product_static->entity = $obj->entity; - $product_static->pmp = $obj->pmp; - $product_static->accountancy_code_sell = $obj->accountancy_code_sell; - $product_static->accountancy_code_sell_export = $obj->accountancy_code_sell_export; - $product_static->accountancy_code_sell_intra = $obj->accountancy_code_sell_intra; - $product_static->accountancy_code_buy = $obj->accountancy_code_buy; - $product_static->accountancy_code_buy_intra = $obj->accountancy_code_buy_intra; - $product_static->accountancy_code_buy_export = $obj->accountancy_code_buy_export; - $product_static->length = $obj->length; - $product_static->length_units = $obj->length_units; - $product_static->width = $obj->width; - $product_static->width_units = $obj->width_units; - $product_static->height = $obj->height; - $product_static->height_units = $obj->height_units; - $product_static->weight = $obj->weight; - $product_static->weight_units = $obj->weight_units; - $product_static->volume = $obj->volume; - $product_static->volume_units = $obj->volume_units; - $product_static->surface = $obj->surface; - $product_static->surface_units = $obj->surface_units; - if (!empty($conf->global->PRODUCT_USE_UNITS)) { - $product_static->fk_unit = $obj->fk_unit; - } +if (empty($reshook)) { + $product_static->id = $obj->rowid; + $product_static->ref = $obj->ref; + $product_static->ref_fourn = empty($obj->ref_supplier) ? '' : $obj->ref_supplier; // deprecated + $product_static->ref_supplier = empty($obj->ref_supplier) ? '' : $obj->ref_supplier; + $product_static->label = $obj->label; + $product_static->finished = $obj->finished; + $product_static->type = $obj->fk_product_type; + $product_static->status_buy = $obj->tobuy; + $product_static->status = $obj->tosell; + $product_static->status_batch = $obj->tobatch; + $product_static->entity = $obj->entity; + $product_static->pmp = $obj->pmp; + $product_static->accountancy_code_sell = $obj->accountancy_code_sell; + $product_static->accountancy_code_sell_export = $obj->accountancy_code_sell_export; + $product_static->accountancy_code_sell_intra = $obj->accountancy_code_sell_intra; + $product_static->accountancy_code_buy = $obj->accountancy_code_buy; + $product_static->accountancy_code_buy_intra = $obj->accountancy_code_buy_intra; + $product_static->accountancy_code_buy_export = $obj->accountancy_code_buy_export; + $product_static->length = $obj->length; + $product_static->length_units = $obj->length_units; + $product_static->width = $obj->width; + $product_static->width_units = $obj->width_units; + $product_static->height = $obj->height; + $product_static->height_units = $obj->height_units; + $product_static->weight = $obj->weight; + $product_static->weight_units = $obj->weight_units; + $product_static->volume = $obj->volume; + $product_static->volume_units = $obj->volume_units; + $product_static->surface = $obj->surface; + $product_static->surface_units = $obj->surface_units; + if (!empty($conf->global->PRODUCT_USE_UNITS)) { + $product_static->fk_unit = $obj->fk_unit; + } - // STOCK_DISABLE_OPTIM_LOAD can be set to force load_stock whatever is permissions on stock. - if ((isModEnabled('stock') && $user->rights->stock->lire && $search_type != 1) || !empty($conf->global->STOCK_DISABLE_OPTIM_LOAD)) { // To optimize call of load_stock - if ($product_static->type != 1 || !empty($conf->global->STOCK_SUPPORTS_SERVICES)) { // Not a service - $option = 'nobatch'; - if (empty($arrayfields['stock_virtual']['checked'])) { - $option .= ',novirtual'; - } - $product_static->load_stock($option); // Load stock_reel + stock_warehouse. This can also call load_virtual_stock() + // STOCK_DISABLE_OPTIM_LOAD can be set to force load_stock whatever is permissions on stock. + if ((isModEnabled('stock') && $user->rights->stock->lire && $search_type != 1) || !empty($conf->global->STOCK_DISABLE_OPTIM_LOAD)) { // To optimize call of load_stock + if ($product_static->type != 1 || !empty($conf->global->STOCK_SUPPORTS_SERVICES)) { // Not a service + $option = 'nobatch'; + if (empty($arrayfields['stock_virtual']['checked'])) { + $option .= ',novirtual'; } + $product_static->load_stock($option); // Load stock_reel + stock_warehouse. This can also call load_virtual_stock() } } +} $usercancreadprice = getDolGlobalString('MAIN_USE_ADVANCED_PERMS')?$user->hasRight('product', 'product_advance', 'read_prices'):$user->hasRight('product', 'lire'); - if ($product_static->isService()) { - $usercancreadprice = getDolGlobalString('MAIN_USE_ADVANCED_PERMS')?$user->hasRight('service', 'service_advance', 'read_prices'):$user->hasRight('service', 'lire'); - } - if ($mode == 'Kanban') { - if ($i == 0) { - print ''; - print '
'; - } - $product_static->price = $obj->price; - // Output Kanban - print $product_static->getKanbanView(''); - if ($i == ($imaxinloop - 1)) { - print '
'; - print ''; - } - } else { - print ''; - - // Action column - if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->rowid, $arrayofselected)) { - $selected = 1; - } - print ''; - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Ref - if (!empty($arrayfields['p.rowid']['checked'])) { - print ''; - print $product_static->id; - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Ref - if (!empty($arrayfields['p.ref']['checked'])) { - print ''; - print $product_static->getNomUrl(1); - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Ref supplier - if (!empty($arrayfields['pfp.ref_fourn']['checked'])) { - print ''; - print $product_static->getNomUrl(1); - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Thumbnail - if (!empty($arrayfields['thumbnail']['checked'])) { - $product_thumbnail_html = ''; - if (!empty($product_static->entity)) { - $product_thumbnail = $product_static->show_photos('product', $conf->product->multidir_output[$product_static->entity], 1, 1, 0, 0, 0, 80); - if ($product_static->nbphoto > 0) { - $product_thumbnail_html = $product_thumbnail; - } - } - - print '' . $product_thumbnail_html . ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Label - if (!empty($arrayfields['p.label']['checked'])) { - print ''.$obj->label.''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Type - if (!empty($arrayfields['p.fk_product_type']['checked'])) { - print ''; - $s = ''; - if ($obj->fk_product_type == 0) { - $s .= img_picto($langs->trans("Product"), 'product', 'class="paddingleftonly paddingrightonly colorgrey"'); - } else { - $s .= img_picto($langs->trans("Service"), 'service', 'class="paddingleftonly paddingrightonly colorgrey"'); - } - print $s; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Barcode - if (!empty($arrayfields['p.barcode']['checked'])) { - print ''.$obj->barcode.''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Duration - if (!empty($arrayfields['p.duration']['checked'])) { - print ''; - - if (preg_match('/([^a-z]+)[a-z]$/i', $obj->duration)) { - $duration_value = substr($obj->duration, 0, dol_strlen($obj->duration) - 1); - $duration_unit = substr($obj->duration, -1); - - if ((float) $duration_value > 1) { - $dur = array("i"=>$langs->trans("Minutes"), "h"=>$langs->trans("Hours"), "d"=>$langs->trans("Days"), "w"=>$langs->trans("Weeks"), "m"=>$langs->trans("Months"), "y"=>$langs->trans("Years")); - } elseif ((float) $duration_value > 0) { - $dur = array("i"=>$langs->trans("Minute"), "h"=>$langs->trans("Hour"), "d"=>$langs->trans("Day"), "w"=>$langs->trans("Week"), "m"=>$langs->trans("Month"), "y"=>$langs->trans("Year")); - } - print $duration_value; - print ((!empty($duration_unit) && isset($dur[$duration_unit]) && $duration_value != '') ? ' '.$langs->trans($dur[$duration_unit]) : ''); - } elseif (!preg_match('/^[a-z]$/i', $obj->duration)) { // If duration is a simple char (like 's' of 'm'), we do not show value - print $obj->duration; - } - - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Finished - if (!empty($arrayfields['p.finished']['checked'])) { - print ''; - print $product_static->getLibFinished(); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Weight - if (!empty($arrayfields['p.weight']['checked'])) { - print ''; - print $obj->weight; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Weight units - if (!empty($arrayfields['p.weight_units']['checked'])) { - print ''; - if ($product_static->weight != '') { - print measuringUnitString(0, 'weight', $product_static->weight_units); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Length - if (!empty($arrayfields['p.length']['checked'])) { - print ''; - print $obj->length; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Length units - if (!empty($arrayfields['p.length_units']['checked'])) { - print ''; - if ($product_static->length != '') { - print measuringUnitString(0, 'size', $product_static->length_units); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Width - if (!empty($arrayfields['p.width']['checked'])) { - print ''; - print $obj->width; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Width units - if (!empty($arrayfields['p.width_units']['checked'])) { - print ''; - if ($product_static->width != '') { - print measuringUnitString(0, 'size', $product_static->width_units); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Height - if (!empty($arrayfields['p.height']['checked'])) { - print ''; - print $obj->height; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Height units - if (!empty($arrayfields['p.height_units']['checked'])) { - print ''; - if ($product_static->height != '') { - print measuringUnitString(0, 'size', $product_static->height_units); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Surface - if (!empty($arrayfields['p.surface']['checked'])) { - print ''; - print $obj->surface; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Surface units - if (!empty($arrayfields['p.surface_units']['checked'])) { - print ''; - if ($product_static->surface != '') { - print measuringUnitString(0, 'surface', $product_static->surface_units); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Volume - if (!empty($arrayfields['p.volume']['checked'])) { - print ''; - print $obj->volume; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Volume units - if (!empty($arrayfields['p.volume_units']['checked'])) { - print ''; - if ($product_static->volume != '') { - print measuringUnitString(0, 'volume', $product_static->volume_units); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Unit - if (!empty($arrayfields['cu.label']['checked'])) { - print ''; - if (!empty($obj->cu_label)) { - print $langs->trans($obj->cu_label); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Sell price - if (!empty($arrayfields['p.sellprice']['checked'])) { - print ''; - if ($obj->tosell && $usercancreadprice) { - if ($obj->price_base_type == 'TTC') { - print ''.price($obj->price_ttc).' '.$langs->trans("TTC").''; - } else { - print ''.price($obj->price).' '.$langs->trans("HT").''; - } - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - - // Multiprices - if (!empty($conf->global->PRODUIT_MULTIPRICES)) { - if (! isset($productpricescache)) { - $productpricescache=array(); - } - if (! isset($productpricescache[$obj->rowid])) { - $productpricescache[$obj->rowid] = array(); - } - - if ($obj->tosell && $usercancreadprice) { - // Make 1 request for all price levels (without filter on price_level) and saved result into an cache array - // then reuse the cache array if we need prices for other price levels - $sqlp = "SELECT p.rowid, p.fk_product, p.price, p.price_ttc, p.price_level, p.date_price, p.price_base_type"; - $sqlp .= " FROM ".MAIN_DB_PREFIX."product_price as p"; - $sqlp .= " WHERE fk_product = ".((int) $obj->rowid); - $sqlp .= " ORDER BY p.date_price DESC, p.rowid DESC, p.price_level ASC"; - $resultp = $db->query($sqlp); - if ($resultp) { - $nump = $db->num_rows($resultp); - $j = 0; - while ($j < $nump) { - $objp = $db->fetch_object($resultp); - - if (empty($productpricescache[$obj->rowid][$objp->price_level])) { - $productpricescache[$obj->rowid][$objp->price_level]['price'] = $objp->price; - $productpricescache[$obj->rowid][$objp->price_level]['price_ttc'] = $objp->price_ttc; - $productpricescache[$obj->rowid][$objp->price_level]['price_base_type'] = $objp->price_base_type; - } - - $j++; - } - - $db->free($resultp); - } else { - dol_print_error($db); - } - } - - foreach ($arraypricelevel as $key => $value) { - if (!empty($arrayfields['p.sellprice'.$key]['checked'])) { - print ''; - if (!empty($productpricescache[$obj->rowid])) { - if ($productpricescache[$obj->rowid][$key]['price_base_type'] == 'TTC') { - print ''.price($productpricescache[$obj->rowid][$key]['price_ttc']).' '.$langs->trans("TTC").''; - } else { - print ''.price($productpricescache[$obj->rowid][$key]['price']).' '.$langs->trans("HT").''; - } - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - - } - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - } +if ($product_static->isService()) { + $usercancreadprice = getDolGlobalString('MAIN_USE_ADVANCED_PERMS')?$user->hasRight('service', 'service_advance', 'read_prices'):$user->hasRight('service', 'lire'); +} +if ($mode == 'Kanban') { + if ($i == 0) { + print ''; + print '
'; } - - // Better buy price - if (!empty($arrayfields['p.minbuyprice']['checked'])) { - print ''; - if ($product_static->status_buy && $obj->bestpurchaseprice != '' && $usercancreadprice) { - if ($product_fourn->find_min_price_product_fournisseur($obj->rowid) > 0) { - if ($product_fourn->product_fourn_price_id > 0) { - if ((isModEnabled("fournisseur") && !empty($user->rights->fournisseur->lire) && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || (isModEnabled("supplier_order") && !empty($user->rights->supplier_order->lire)) || (isModEnabled("supplier_invoice") && !empty($user->rights->supplier_invoice->lire))) { - $htmltext = $product_fourn->display_price_product_fournisseur(1, 1, 0, 1); - print ''.$form->textwithpicto(price($product_fourn->fourn_unitprice * (1 - $product_fourn->fourn_remise_percent / 100) - $product_fourn->fourn_remise).' '.$langs->trans("HT"), $htmltext).''; - } else { - print ''.price($product_fourn->fourn_unitprice).' '.$langs->trans("HT").''; - - } - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Number of buy prices - if (!empty($arrayfields['p.numbuyprice']['checked'])) { - print ''; - if ($product_static->status_buy && $usercancreadprice) { - if (count($productFournList = $product_fourn->list_product_fournisseur_price($obj->rowid)) > 0) { - $htmltext = $product_fourn->display_price_product_fournisseur(1, 1, 0, 1, $productFournList); - print $form->textwithpicto(count($productFournList), $htmltext); - } - } - print ''; - } - - // VAT or Sell Tax Rate - if (!empty($arrayfields['p.tva_tx']['checked'])) { - print ''; - print vatrate($obj->tva_tx, true); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // WAP - if (!empty($arrayfields['p.pmp']['checked'])) { - print ''; - if ($usercancreadprice) { - print ''.price($product_static->pmp, 1, $langs).""; - } - print ''; - } - // Cost price - if (!empty($arrayfields['p.cost_price']['checked'])) { - print ''; - //print $obj->cost_price; - if ($usercancreadprice) { - print ''.price($obj->cost_price).' '.$langs->trans("HT").''; - } - print ''; - } - - // Limit alert - if (!empty($arrayfields['p.seuil_stock_alerte']['checked'])) { - print ''; - if ($product_static->type != 1) { - print $obj->seuil_stock_alerte; - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Desired stock - if (!empty($arrayfields['p.desiredstock']['checked'])) { - print ''; - if ($product_static->type != 1) { - print $obj->desiredstock; - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Stock real - if (!empty($arrayfields['p.stock']['checked'])) { - print ''; - if ($product_static->type != 1) { - if ($obj->seuil_stock_alerte != '' && $product_static->stock_reel < (float) $obj->seuil_stock_alerte) { - print img_warning($langs->trans("StockLowerThanLimit", $obj->seuil_stock_alerte)).' '; - } - if ($usercancreadprice) { - print price(price2num($product_static->stock_reel, 'MS')); - } - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Stock virtual - if (!empty($arrayfields['stock_virtual']['checked'])) { - print ''; - if ($product_static->type != 1) { - if ($obj->seuil_stock_alerte != '' && $product_static->stock_theorique < (float) $obj->seuil_stock_alerte) { - print img_warning($langs->trans("StockLowerThanLimit", $obj->seuil_stock_alerte)).' '; - } - if ($usercancreadprice) { - print price(price2num($product_static->stock_theorique, 'MS')); - } - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Lot/Serial - if (!empty($arrayfields['p.tobatch']['checked'])) { - print ''; - print $product_static->getLibStatut(1, 2); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Country - if (!empty($arrayfields['p.fk_country']['checked'])) { - print ''.getCountry($obj->fk_country, 0, $db).''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // State - if (!empty($arrayfields['p.fk_state']['checked'])) { - print ''; - if (!empty($obj->fk_state)) { - print getState($obj->fk_state, 0, $db); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Accountancy code sell - if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell']['checked'])) { - print ''.$product_static->accountancy_code_sell.''; - if (!$i) { - $totalarray['nbfield']++; - } - } - if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell_intra']['checked'])) { - print ''.$product_static->accountancy_code_sell_intra.''; - if (!$i) { - $totalarray['nbfield']++; - } - } - if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell_export']['checked'])) { - print ''.$product_static->accountancy_code_sell_export.''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Accountancy code buy - if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy']['checked'])) { - print ''.$product_static->accountancy_code_buy.''; - if (!$i) { - $totalarray['nbfield']++; - } - } - if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy_intra']['checked'])) { - print ''.$product_static->accountancy_code_buy_intra.''; - if (!$i) { - $totalarray['nbfield']++; - } - } - if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy_export']['checked'])) { - print ''.$product_static->accountancy_code_buy_export.''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Extra fields - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - // Date creation - if (!empty($arrayfields['p.datec']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Date modification - if (!empty($arrayfields['p.tms']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Status (to sell) - if (!empty($arrayfields['p.tosell']['checked'])) { - print ''; - if (!empty($conf->use_javascript_ajax) && $user->hasRight("produit", "creer") && !empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) { - print ajax_object_onoff($product_static, 'status', 'tosell', 'ProductStatusOnSell', 'ProductStatusNotOnSell'); - } else { - print $product_static->LibStatut($product_static->status, 5, 0); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Status (to buy) - if (!empty($arrayfields['p.tobuy']['checked'])) { - print ''; - if (!empty($conf->use_javascript_ajax) && $user->hasRight("produit", "creer") && !empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) { - print ajax_object_onoff($product_static, 'status_buy', 'tobuy', 'ProductStatusOnBuy', 'ProductStatusNotOnBuy'); - } else { - print $product_static->LibStatut($product_static->status_buy, 5, 1); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } + $product_static->price = $obj->price; + // Output Kanban + print $product_static->getKanbanView(''); + if ($i == ($imaxinloop - 1)) { + print '
'; + print ''; } +} else { + print ''; // Action column - if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { print ''; if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined $selected = 0; @@ -2023,9 +1443,584 @@ print "\n"; $totalarray['nbfield']++; } } + // Ref + if (!empty($arrayfields['p.rowid']['checked'])) { + print ''; + print $product_static->id; + print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Ref + if (!empty($arrayfields['p.ref']['checked'])) { + print ''; + print $product_static->getNomUrl(1); + print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Ref supplier + if (!empty($arrayfields['pfp.ref_fourn']['checked'])) { + print ''; + print $product_static->getNomUrl(1); + print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Thumbnail + if (!empty($arrayfields['thumbnail']['checked'])) { + $product_thumbnail_html = ''; + if (!empty($product_static->entity)) { + $product_thumbnail = $product_static->show_photos('product', $conf->product->multidir_output[$product_static->entity], 1, 1, 0, 0, 0, 80); + if ($product_static->nbphoto > 0) { + $product_thumbnail_html = $product_thumbnail; + } + } + + print '' . $product_thumbnail_html . ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Label + if (!empty($arrayfields['p.label']['checked'])) { + print ''.$obj->label.''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Type + if (!empty($arrayfields['p.fk_product_type']['checked'])) { + print ''; + $s = ''; + if ($obj->fk_product_type == 0) { + $s .= img_picto($langs->trans("Product"), 'product', 'class="paddingleftonly paddingrightonly colorgrey"'); + } else { + $s .= img_picto($langs->trans("Service"), 'service', 'class="paddingleftonly paddingrightonly colorgrey"'); + } + print $s; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Barcode + if (!empty($arrayfields['p.barcode']['checked'])) { + print ''.$obj->barcode.''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Duration + if (!empty($arrayfields['p.duration']['checked'])) { + print ''; + + if (preg_match('/([^a-z]+)[a-z]$/i', $obj->duration)) { + $duration_value = substr($obj->duration, 0, dol_strlen($obj->duration) - 1); + $duration_unit = substr($obj->duration, -1); + + if ((float) $duration_value > 1) { + $dur = array("i"=>$langs->trans("Minutes"), "h"=>$langs->trans("Hours"), "d"=>$langs->trans("Days"), "w"=>$langs->trans("Weeks"), "m"=>$langs->trans("Months"), "y"=>$langs->trans("Years")); + } elseif ((float) $duration_value > 0) { + $dur = array("i"=>$langs->trans("Minute"), "h"=>$langs->trans("Hour"), "d"=>$langs->trans("Day"), "w"=>$langs->trans("Week"), "m"=>$langs->trans("Month"), "y"=>$langs->trans("Year")); + } + print $duration_value; + print ((!empty($duration_unit) && isset($dur[$duration_unit]) && $duration_value != '') ? ' '.$langs->trans($dur[$duration_unit]) : ''); + } elseif (!preg_match('/^[a-z]$/i', $obj->duration)) { // If duration is a simple char (like 's' of 'm'), we do not show value + print $obj->duration; + } + + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Finished + if (!empty($arrayfields['p.finished']['checked'])) { + print ''; + print $product_static->getLibFinished(); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Weight + if (!empty($arrayfields['p.weight']['checked'])) { + print ''; + print $obj->weight; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Weight units + if (!empty($arrayfields['p.weight_units']['checked'])) { + print ''; + if ($product_static->weight != '') { + print measuringUnitString(0, 'weight', $product_static->weight_units); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Length + if (!empty($arrayfields['p.length']['checked'])) { + print ''; + print $obj->length; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Length units + if (!empty($arrayfields['p.length_units']['checked'])) { + print ''; + if ($product_static->length != '') { + print measuringUnitString(0, 'size', $product_static->length_units); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Width + if (!empty($arrayfields['p.width']['checked'])) { + print ''; + print $obj->width; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Width units + if (!empty($arrayfields['p.width_units']['checked'])) { + print ''; + if ($product_static->width != '') { + print measuringUnitString(0, 'size', $product_static->width_units); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Height + if (!empty($arrayfields['p.height']['checked'])) { + print ''; + print $obj->height; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Height units + if (!empty($arrayfields['p.height_units']['checked'])) { + print ''; + if ($product_static->height != '') { + print measuringUnitString(0, 'size', $product_static->height_units); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Surface + if (!empty($arrayfields['p.surface']['checked'])) { + print ''; + print $obj->surface; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Surface units + if (!empty($arrayfields['p.surface_units']['checked'])) { + print ''; + if ($product_static->surface != '') { + print measuringUnitString(0, 'surface', $product_static->surface_units); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Volume + if (!empty($arrayfields['p.volume']['checked'])) { + print ''; + print $obj->volume; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Volume units + if (!empty($arrayfields['p.volume_units']['checked'])) { + print ''; + if ($product_static->volume != '') { + print measuringUnitString(0, 'volume', $product_static->volume_units); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Unit + if (!empty($arrayfields['cu.label']['checked'])) { + print ''; + if (!empty($obj->cu_label)) { + print $langs->trans($obj->cu_label); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Sell price + if (!empty($arrayfields['p.sellprice']['checked'])) { + print ''; + if ($obj->tosell && $usercancreadprice) { + if ($obj->price_base_type == 'TTC') { + print ''.price($obj->price_ttc).' '.$langs->trans("TTC").''; + } else { + print ''.price($obj->price).' '.$langs->trans("HT").''; + } + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + + // Multiprices + if (!empty($conf->global->PRODUIT_MULTIPRICES)) { + if (! isset($productpricescache)) { + $productpricescache=array(); + } + if (! isset($productpricescache[$obj->rowid])) { + $productpricescache[$obj->rowid] = array(); + } + + if ($obj->tosell && $usercancreadprice) { + // Make 1 request for all price levels (without filter on price_level) and saved result into an cache array + // then reuse the cache array if we need prices for other price levels + $sqlp = "SELECT p.rowid, p.fk_product, p.price, p.price_ttc, p.price_level, p.date_price, p.price_base_type"; + $sqlp .= " FROM ".MAIN_DB_PREFIX."product_price as p"; + $sqlp .= " WHERE fk_product = ".((int) $obj->rowid); + $sqlp .= " ORDER BY p.date_price DESC, p.rowid DESC, p.price_level ASC"; + $resultp = $db->query($sqlp); + if ($resultp) { + $nump = $db->num_rows($resultp); + $j = 0; + while ($j < $nump) { + $objp = $db->fetch_object($resultp); + + if (empty($productpricescache[$obj->rowid][$objp->price_level])) { + $productpricescache[$obj->rowid][$objp->price_level]['price'] = $objp->price; + $productpricescache[$obj->rowid][$objp->price_level]['price_ttc'] = $objp->price_ttc; + $productpricescache[$obj->rowid][$objp->price_level]['price_base_type'] = $objp->price_base_type; + } + + $j++; + } + + $db->free($resultp); + } else { + dol_print_error($db); + } + } + + foreach ($arraypricelevel as $key => $value) { + if (!empty($arrayfields['p.sellprice'.$key]['checked'])) { + print ''; + if (!empty($productpricescache[$obj->rowid])) { + if ($productpricescache[$obj->rowid][$key]['price_base_type'] == 'TTC') { + print ''.price($productpricescache[$obj->rowid][$key]['price_ttc']).' '.$langs->trans("TTC").''; + } else { + print ''.price($productpricescache[$obj->rowid][$key]['price']).' '.$langs->trans("HT").''; + } + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } +} + } + + // Better buy price +if (!empty($arrayfields['p.minbuyprice']['checked'])) { + print ''; + if ($product_static->status_buy && $obj->bestpurchaseprice != '' && $usercancreadprice) { + if ($product_fourn->find_min_price_product_fournisseur($obj->rowid) > 0) { + if ($product_fourn->product_fourn_price_id > 0) { + if ((isModEnabled("fournisseur") && !empty($user->rights->fournisseur->lire) && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || (isModEnabled("supplier_order") && !empty($user->rights->supplier_order->lire)) || (isModEnabled("supplier_invoice") && !empty($user->rights->supplier_invoice->lire))) { + $htmltext = $product_fourn->display_price_product_fournisseur(1, 1, 0, 1); + print ''.$form->textwithpicto(price($product_fourn->fourn_unitprice * (1 - $product_fourn->fourn_remise_percent / 100) - $product_fourn->fourn_remise).' '.$langs->trans("HT"), $htmltext).''; + } else { + print ''.price($product_fourn->fourn_unitprice).' '.$langs->trans("HT").''; + } + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } +} + + // Number of buy prices +if (!empty($arrayfields['p.numbuyprice']['checked'])) { + print ''; + if ($product_static->status_buy && $usercancreadprice) { + if (count($productFournList = $product_fourn->list_product_fournisseur_price($obj->rowid)) > 0) { + $htmltext = $product_fourn->display_price_product_fournisseur(1, 1, 0, 1, $productFournList); + print $form->textwithpicto(count($productFournList), $htmltext); + } + } + print ''; +} + + // VAT or Sell Tax Rate +if (!empty($arrayfields['p.tva_tx']['checked'])) { + print ''; + print vatrate($obj->tva_tx, true); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } +} + + // WAP +if (!empty($arrayfields['p.pmp']['checked'])) { + print ''; + if ($usercancreadprice) { + print ''.price($product_static->pmp, 1, $langs).""; + } + print ''; +} + // Cost price +if (!empty($arrayfields['p.cost_price']['checked'])) { + print ''; + //print $obj->cost_price; + if ($usercancreadprice) { + print ''.price($obj->cost_price).' '.$langs->trans("HT").''; + } + print ''; +} + + // Limit alert +if (!empty($arrayfields['p.seuil_stock_alerte']['checked'])) { + print ''; + if ($product_static->type != 1) { + print $obj->seuil_stock_alerte; + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } +} + // Desired stock +if (!empty($arrayfields['p.desiredstock']['checked'])) { + print ''; + if ($product_static->type != 1) { + print $obj->desiredstock; + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } +} + // Stock real +if (!empty($arrayfields['p.stock']['checked'])) { + print ''; + if ($product_static->type != 1) { + if ($obj->seuil_stock_alerte != '' && $product_static->stock_reel < (float) $obj->seuil_stock_alerte) { + print img_warning($langs->trans("StockLowerThanLimit", $obj->seuil_stock_alerte)).' '; + } + if ($usercancreadprice) { + print price(price2num($product_static->stock_reel, 'MS')); + } + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } +} + // Stock virtual +if (!empty($arrayfields['stock_virtual']['checked'])) { + print ''; + if ($product_static->type != 1) { + if ($obj->seuil_stock_alerte != '' && $product_static->stock_theorique < (float) $obj->seuil_stock_alerte) { + print img_warning($langs->trans("StockLowerThanLimit", $obj->seuil_stock_alerte)).' '; + } + if ($usercancreadprice) { + print price(price2num($product_static->stock_theorique, 'MS')); + } + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } +} + // Lot/Serial +if (!empty($arrayfields['p.tobatch']['checked'])) { + print ''; + print $product_static->getLibStatut(1, 2); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } +} + // Country +if (!empty($arrayfields['p.fk_country']['checked'])) { + print ''.getCountry($obj->fk_country, 0, $db).''; + if (!$i) { + $totalarray['nbfield']++; + } +} + // State +if (!empty($arrayfields['p.fk_state']['checked'])) { + print ''; + if (!empty($obj->fk_state)) { + print getState($obj->fk_state, 0, $db); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } +} + // Accountancy code sell +if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell']['checked'])) { + print ''.$product_static->accountancy_code_sell.''; + if (!$i) { + $totalarray['nbfield']++; + } +} +if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell_intra']['checked'])) { + print ''.$product_static->accountancy_code_sell_intra.''; + if (!$i) { + $totalarray['nbfield']++; + } +} +if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell_export']['checked'])) { + print ''.$product_static->accountancy_code_sell_export.''; + if (!$i) { + $totalarray['nbfield']++; + } +} + // Accountancy code buy +if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy']['checked'])) { + print ''.$product_static->accountancy_code_buy.''; + if (!$i) { + $totalarray['nbfield']++; + } +} +if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy_intra']['checked'])) { + print ''.$product_static->accountancy_code_buy_intra.''; + if (!$i) { + $totalarray['nbfield']++; + } +} +if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy_export']['checked'])) { + print ''.$product_static->accountancy_code_buy_export.''; + if (!$i) { + $totalarray['nbfield']++; + } +} + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Date creation +if (!empty($arrayfields['p.datec']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } +} + // Date modification +if (!empty($arrayfields['p.tms']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } +} + + // Status (to sell) +if (!empty($arrayfields['p.tosell']['checked'])) { + print ''; + if (!empty($conf->use_javascript_ajax) && $user->hasRight("produit", "creer") && !empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) { + print ajax_object_onoff($product_static, 'status', 'tosell', 'ProductStatusOnSell', 'ProductStatusNotOnSell'); + } else { + print $product_static->LibStatut($product_static->status, 5, 0); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } +} + // Status (to buy) +if (!empty($arrayfields['p.tobuy']['checked'])) { + print ''; + if (!empty($conf->use_javascript_ajax) && $user->hasRight("produit", "creer") && !empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) { + print ajax_object_onoff($product_static, 'status_buy', 'tobuy', 'ProductStatusOnBuy', 'ProductStatusNotOnBuy'); + } else { + print $product_static->LibStatut($product_static->status_buy, 5, 1); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } +} + + // Action column +if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->rowid, $arrayofselected)) { + $selected = 1; + } + print ''; + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } +} print "\n"; - + } $i++; } From 53ba5c0a4939e019a34e265bb8528e0b163cd781 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Thu, 22 Dec 2022 10:22:57 +0000 Subject: [PATCH 0257/1128] Fixing style errors. --- htdocs/adherents/type.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/htdocs/adherents/type.php b/htdocs/adherents/type.php index 0d8b37bbeb9..3796522e70e 100644 --- a/htdocs/adherents/type.php +++ b/htdocs/adherents/type.php @@ -264,9 +264,8 @@ if (!$rowid && $action != 'create' && $action != 'edit') { $newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); $newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); - - if ($user->hasRight('adherent', 'configurer')) { + if ($user->hasRight('adherent', 'configurer')) { $newcardbutton .= dolGetButtonTitle($langs->trans('NewMemberType'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/adherents/type.php?action=create'); } @@ -327,8 +326,7 @@ if (!$rowid && $action != 'create' && $action != 'edit') { print ''; print ''; } - } - else { + } else { print ''; print ''; print $membertype->getNomUrl(1); From d7d07cb2040dfa7fbb1e31a11f573e4310c8e42c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 12:27:32 +0100 Subject: [PATCH 0258/1128] Fix warning --- htdocs/compta/resultat/clientfourn.php | 2 +- htdocs/main.inc.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/resultat/clientfourn.php b/htdocs/compta/resultat/clientfourn.php index 71cd33a93cd..54f242edb7c 100644 --- a/htdocs/compta/resultat/clientfourn.php +++ b/htdocs/compta/resultat/clientfourn.php @@ -367,7 +367,7 @@ if ($modecompta == 'BOOKKEEPING') { $cpts = $AccCat->getCptsCat(0, $tmppredefinedgroupwhere); foreach ($cpts as $j => $cpt) { - $return = $AccCat->getSumDebitCredit($cpt['account_number'], $date_start, $date_end, $cpt['dc']); + $return = $AccCat->getSumDebitCredit($cpt['account_number'], $date_start, $date_end, (empty($cpt['dc']) ? 0 : $cpt['dc'])); if ($return < 0) { setEventMessages(null, $AccCat->errors, 'errors'); $resultN = 0; diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index b383a6eb7c2..417295cb116 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -998,7 +998,7 @@ if (!defined('NOLOGIN')) { $hookmanager->initHooks(array('main')); // Code for search criteria persistence. - if (!empty($_GET['save_lastsearch_values'])) { // We must use $_GET here + if (!empty($_GET['save_lastsearch_values']) && !empty($_SERVER["HTTP_REFERER"])) { // We must use $_GET here $relativepathstring = preg_replace('/\?.*$/', '', $_SERVER["HTTP_REFERER"]); $relativepathstring = preg_replace('/^https?:\/\/[^\/]*/', '', $relativepathstring); // Get full path except host server // Clean $relativepathstring From d1837608415f261396c68df8065499ecdfbc3bf7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 13:21:46 +0100 Subject: [PATCH 0259/1128] Clean code --- htdocs/admin/system/perf.php | 9 +++++++-- htdocs/admin/system/security.php | 10 ++++++++-- htdocs/langs/en_US/admin.lang | 4 ++-- htdocs/user/hierarchy.php | 3 +++ 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/htdocs/admin/system/perf.php b/htdocs/admin/system/perf.php index 6d7ef8f1863..d9affa9684f 100644 --- a/htdocs/admin/system/perf.php +++ b/htdocs/admin/system/perf.php @@ -50,8 +50,13 @@ llxHeader(); print load_fiche_titre($langs->trans("PerfDolibarr"), '', 'title_setup'); -print ''.$langs->trans("YouMayFindPerfAdviceHere", 'https://wiki.dolibarr.org/index.php/FAQ_Increase_Performance').' ('.$langs->trans("Reload").')
'; - +print ''.$langs->trans("YouMayFindPerfAdviceHere", 'https://wiki.dolibarr.org/index.php/FAQ_Increase_Performance').''; +print '     '; +print ''; +print img_picto($langs->trans("Reload"), 'refresh').' '; +print $langs->trans("Reload"); +print ''; +print '
'; print '
'; print '
'; diff --git a/htdocs/admin/system/security.php b/htdocs/admin/system/security.php index cab41cc6263..c23bdb3051f 100644 --- a/htdocs/admin/system/security.php +++ b/htdocs/admin/system/security.php @@ -41,7 +41,7 @@ if (GETPOST('action', 'aZ09') == 'donothing') { exit; } -$execmethod = empty($conf->global->MAIN_EXEC_USE_POPEN) ? 1 : $conf->global->MAIN_EXEC_USE_POPEN; +$execmethod = getDolGlobalInt('MAIN_EXEC_USE_POPEN', 1); /* @@ -52,7 +52,13 @@ llxHeader(); print load_fiche_titre($langs->trans("Security"), '', 'title_setup'); -print ''.$langs->trans("YouMayFindSecurityAdviceHere", 'hhttps://wiki.dolibarr.org/index.php/Security_information').' ('.$langs->trans("Reload").')
'; +print ''.$langs->trans("YouMayFindSecurityAdviceHere", 'hhttps://wiki.dolibarr.org/index.php/Security_information').''; +print '     '; +print ''; +print img_picto($langs->trans("Reload"), 'refresh').' '; +print $langs->trans("Reload"); +print ''; +print '
'; print '
'; print load_fiche_titre($langs->trans("PHPSetup"), '', 'folder'); diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 62176a37c41..ead160f3a09 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -2224,12 +2224,12 @@ MailToPartnership=Partnership AGENDA_EVENT_DEFAULT_STATUS=Default event status when creating a event from the form YouShouldDisablePHPFunctions=You should disable PHP functions IfCLINotRequiredYouShouldDisablePHPFunctions=Except if you need to run system commands in custom code, you shoud disable PHP functions -PHPFunctionsRequiredForCLI=For shell purpose (like scheduled job backup or running an anitivurs program), you must keep PHP functions +PHPFunctionsRequiredForCLI=For shell purpose (like scheduled job backup or running an antivirus program), you must keep PHP functions NoWritableFilesFoundIntoRootDir=No writable files or directories of the common programs were found into your root directory (Good) RecommendedValueIs=Recommended: %s Recommended=Recommended NotRecommended=Not recommended -ARestrictedPath=Some restricted path +ARestrictedPath=Some restricted path for data files CheckForModuleUpdate=Check for external modules updates CheckForModuleUpdateHelp=This action will connect to editors of external modules to check if a new version is available. ModuleUpdateAvailable=An update is available diff --git a/htdocs/user/hierarchy.php b/htdocs/user/hierarchy.php index 44ab46193d9..ce18b9d5011 100644 --- a/htdocs/user/hierarchy.php +++ b/htdocs/user/hierarchy.php @@ -42,6 +42,9 @@ if ($user->socid > 0) { $optioncss = GETPOST('optioncss', 'alpha'); $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'userlist'; // To manage different context of search $mode = GETPOST("mode", 'alpha'); +if (empty($mode)) { + $mode = 'hierarchy'; +} $sortfield = GETPOST('sortfield', 'aZ09comma'); $sortorder = GETPOST('sortorder', 'aZ09comma'); From 6e671ee44c6b8457c112bfe694f9b94962447aee Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Thu, 22 Dec 2022 14:04:22 +0100 Subject: [PATCH 0260/1128] modify variable db --- htdocs/core/class/commonobjectline.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/commonobjectline.class.php b/htdocs/core/class/commonobjectline.class.php index 58dd0566f8e..e39087a4309 100644 --- a/htdocs/core/class/commonobjectline.class.php +++ b/htdocs/core/class/commonobjectline.class.php @@ -175,7 +175,7 @@ abstract class CommonObjectLine extends CommonObject */ public function getKanbanView($option = '') { - global $db, $langs; + global $langs; $return = '
'; $return .= '
'; $return .= ''; @@ -185,7 +185,7 @@ abstract class CommonObjectLine extends CommonObject $return .= '
'; $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(1) : '').''; if (property_exists($this, 'date_delivery')) { - $return .= '
'.dol_print_date($db->jdate($this->date_delivery), "dayhour").''; + $return .= '
'.dol_print_date($this->db->jdate($this->date_delivery), "dayhour").''; } if (property_exists($this, 'town') && !empty($this->town)) { $return .= '
'.$langs->trans("Town").''; From 709d6a8f78893d9b32de88616a0ca9b5f2fda8bc Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 14:17:31 +0100 Subject: [PATCH 0261/1128] Doc --- htdocs/ticket/class/ticket.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/ticket/class/ticket.class.php b/htdocs/ticket/class/ticket.class.php index 2aacffefcd1..58ba2e18660 100644 --- a/htdocs/ticket/class/ticket.class.php +++ b/htdocs/ticket/class/ticket.class.php @@ -236,7 +236,7 @@ class Ticket extends CommonObject const STATUS_READ = 1; const STATUS_ASSIGNED = 2; const STATUS_IN_PROGRESS = 3; - const STATUS_NEED_MORE_INFO = 5; + const STATUS_NEED_MORE_INFO = 5; // waiting requester feedback const STATUS_WAITING = 7; // on hold const STATUS_CLOSED = 8; // Closed - Solved const STATUS_CANCELED = 9; // Closed - Not solved From 9a162100c044fbaa072d110970a3a48ab7856647 Mon Sep 17 00:00:00 2001 From: kkhelifa Date: Tue, 20 Dec 2022 11:54:02 +0100 Subject: [PATCH 0262/1128] NEW : set ticket status to answered if the client has answered from the public interface --- htdocs/ticket/class/ticket.class.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/htdocs/ticket/class/ticket.class.php b/htdocs/ticket/class/ticket.class.php index 58ba2e18660..6763ce02e84 100644 --- a/htdocs/ticket/class/ticket.class.php +++ b/htdocs/ticket/class/ticket.class.php @@ -2667,7 +2667,10 @@ class Ticket extends CommonObject } // Set status to "answered" if not set yet, but only if internal user and not private message - if ($object->status < 3 && !$user->socid && !$private) { + // Or set status to "answered" if the client has answered and if the ticket has started + if (($object->status < self::STATUS_IN_PROGRESS && !$user->socid && !$private) || + ($object->status > self::STATUS_IN_PROGRESS && $public_area) + ) { $object->setStatut(3); } return 1; From b0bf5d8298c427680c4da09faa8ff639daf01eab Mon Sep 17 00:00:00 2001 From: Manny Isles Date: Mon, 19 Dec 2022 15:37:35 +0800 Subject: [PATCH 0263/1128] I think it should be $obj->rowid I think it should be $obj->rowid because when its `$obj->id` then it goes nowhere. --- htdocs/accountancy/admin/subaccount.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/accountancy/admin/subaccount.php b/htdocs/accountancy/admin/subaccount.php index c9f78596bcd..4f2274269d8 100644 --- a/htdocs/accountancy/admin/subaccount.php +++ b/htdocs/accountancy/admin/subaccount.php @@ -408,7 +408,7 @@ if ($resql) { $s .= ''.$langs->trans("Supplier").''; } elseif ($obj->type == 3) { // User - $s .= ''.$langs->trans("Employee").''; + $s .= ''.$langs->trans("Employee").''; } print $s; print ''; From 5c2425bd2bd45a29a0522c8f185ffc9e8cfbab6e Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Thu, 22 Dec 2022 14:36:55 +0100 Subject: [PATCH 0264/1128] fix --- htdocs/core/class/commonobjectline.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/commonobjectline.class.php b/htdocs/core/class/commonobjectline.class.php index e39087a4309..b116519ad53 100644 --- a/htdocs/core/class/commonobjectline.class.php +++ b/htdocs/core/class/commonobjectline.class.php @@ -167,7 +167,7 @@ abstract class CommonObjectLine extends CommonObject return 0; } - /** + /** * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) From 5686ffd9fad283b41c28a7618caeabffea8055ff Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 14:45:22 +0100 Subject: [PATCH 0265/1128] Update evaluation.class.php --- htdocs/hrm/class/evaluation.class.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/htdocs/hrm/class/evaluation.class.php b/htdocs/hrm/class/evaluation.class.php index c4b8bd46178..8ffa387baa7 100644 --- a/htdocs/hrm/class/evaluation.class.php +++ b/htdocs/hrm/class/evaluation.class.php @@ -189,11 +189,13 @@ class Evaluation extends CommonObject if (empty($conf->global->MAIN_SHOW_TECHNICAL_ID) && isset($this->fields['rowid'])) { $this->fields['rowid']['visible'] = 0; } - if (empty($conf->multicompany->enabled) && isset($this->fields['entity'])) { + if (isModEnabled('multicompany') && isset($this->fields['entity'])) { $this->fields['entity']['enabled'] = 0; } - if (empty($user->rights->hrm->evaluation->readall)) $this->fields['fk_user']['type'].= ':rowid IN('.$this->db->sanitize(implode(", ", $user->getAllChildIds(1))).')'; + if (empty($user->rights->hrm->evaluation->readall)) { + $this->fields['fk_user']['type'].= ':rowid IN('.$this->db->sanitize(implode(", ", $user->getAllChildIds(1))).')'; + } $this->date_eval = dol_now(); From bb1659fb70ac5452c1d9404728a46f742a6f2c0b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 14:45:56 +0100 Subject: [PATCH 0266/1128] Update evaluation.class.php --- htdocs/hrm/class/evaluation.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/hrm/class/evaluation.class.php b/htdocs/hrm/class/evaluation.class.php index 8ffa387baa7..0125e7f882c 100644 --- a/htdocs/hrm/class/evaluation.class.php +++ b/htdocs/hrm/class/evaluation.class.php @@ -189,7 +189,7 @@ class Evaluation extends CommonObject if (empty($conf->global->MAIN_SHOW_TECHNICAL_ID) && isset($this->fields['rowid'])) { $this->fields['rowid']['visible'] = 0; } - if (isModEnabled('multicompany') && isset($this->fields['entity'])) { + if (!isModEnabled('multicompany') && isset($this->fields['entity'])) { $this->fields['entity']['enabled'] = 0; } From 2a68836375fd0cdb9f1b03068fcfdfac0f61711b Mon Sep 17 00:00:00 2001 From: IC-Florian <71641704+IC-Florian@users.noreply.github.com> Date: Thu, 22 Dec 2022 14:52:03 +0100 Subject: [PATCH 0267/1128] New require for product in generateOutputField --- htdocs/core/class/html.formsetup.class.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/htdocs/core/class/html.formsetup.class.php b/htdocs/core/class/html.formsetup.class.php index 1cfddb588fd..4f88c597178 100644 --- a/htdocs/core/class/html.formsetup.class.php +++ b/htdocs/core/class/html.formsetup.class.php @@ -1103,6 +1103,9 @@ class FormSetupItem $out.= $this->langs->trans("NorProspectNorCustomer"); } } elseif ($this->type == 'product') { + if (!class_exists("Product")){ + require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; + } $product = new Product($this->db); $resprod = $product->fetch($this->fieldValue); if ($resprod > 0) { From 56d05c09b2fd02450831083af0ec5ca560478378 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Thu, 22 Dec 2022 13:52:39 +0000 Subject: [PATCH 0268/1128] Fixing style errors. --- htdocs/core/class/html.formsetup.class.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/class/html.formsetup.class.php b/htdocs/core/class/html.formsetup.class.php index 4f88c597178..611455f003f 100644 --- a/htdocs/core/class/html.formsetup.class.php +++ b/htdocs/core/class/html.formsetup.class.php @@ -1103,9 +1103,9 @@ class FormSetupItem $out.= $this->langs->trans("NorProspectNorCustomer"); } } elseif ($this->type == 'product') { - if (!class_exists("Product")){ - require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; - } + if (!class_exists("Product")) { + require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; + } $product = new Product($this->db); $resprod = $product->fetch($this->fieldValue); if ($resprod > 0) { From 451f802cd1e834979ff4eb0df64e40c0b2c7a263 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 15:35:38 +0100 Subject: [PATCH 0269/1128] Enhance kanban views --- htdocs/core/class/commonorder.class.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/htdocs/core/class/commonorder.class.php b/htdocs/core/class/commonorder.class.php index 08753b54ba4..9002d50ed39 100644 --- a/htdocs/core/class/commonorder.class.php +++ b/htdocs/core/class/commonorder.class.php @@ -45,21 +45,20 @@ abstract class CommonOrder extends CommonObject $return = '
'; $return .= '
'; - $return .= '
'; + $return .= '
'; $return .= img_picto('', 'order'); - $return .= '
'; $return .= '
'; $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).''; if (property_exists($this, 'thirdparty') && is_object($this->thirdparty)) { - $return .= '
'.$this->thirdparty->getNomUrl(1).''; + $return .= '
'.$this->thirdparty->getNomUrl(1).'
'; } if (property_exists($this, 'total_ht')) { - $return .= '
'.price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency).' '.$langs->trans('HT').''; + $return .= '
'.price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency).' '.$langs->trans('HT').'
'; } if (method_exists($this, 'getLibStatut')) { - $return .= '
'.$this->getLibStatut(5).'
'; + $return .= '
'.$this->getLibStatut(5).'
'; } $return .= '
'; $return .= '
'; From 68ebd850f419a01115b2308154ec0f3eedaeadfc Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 16:21:25 +0100 Subject: [PATCH 0270/1128] Debug v17 --- htdocs/adherents/subscription/list.php | 12 ++++++------ htdocs/bookmarks/list.php | 2 +- htdocs/comm/mailing/list.php | 2 +- htdocs/compta/clients.php | 2 +- htdocs/compta/deplacement/index.php | 2 +- htdocs/compta/deplacement/list.php | 2 +- htdocs/core/boxes/box_members_by_type.php | 4 +++- htdocs/eventorganization/conferenceorbooth_list.php | 4 ++-- htdocs/expensereport/index.php | 2 +- htdocs/expensereport/list.php | 2 +- htdocs/fichinter/list.php | 2 +- htdocs/langs/en_US/eventorganization.lang | 5 +++-- htdocs/langs/en_US/expensereports.lang | 2 +- htdocs/product/stock/list.php | 2 +- htdocs/ticket/card.php | 3 --- htdocs/user/group/list.php | 4 ++-- 16 files changed, 26 insertions(+), 26 deletions(-) diff --git a/htdocs/adherents/subscription/list.php b/htdocs/adherents/subscription/list.php index 1523bd4ee90..ffdd1d580a3 100644 --- a/htdocs/adherents/subscription/list.php +++ b/htdocs/adherents/subscription/list.php @@ -242,16 +242,16 @@ if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $ exit; } -$help_url = 'EN:Module_Foundations|FR:Module_Adhérents|ES:Módulo_Miembros'; -llxHeader('', $langs->trans("ListOfSubscriptions"), $help_url); - -$i = 0; - -$title = $langs->trans("ListOfSubscriptions"); +$title = $langs->trans("Subscriptions"); if (!empty($date_select)) { $title .= ' ('.$langs->trans("Year").' '.$date_select.')'; } +$help_url = 'EN:Module_Foundations|FR:Module_Adhérents|ES:Módulo_Miembros'; +llxHeader('', $title, $help_url); + +$i = 0; + $param = ''; if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); diff --git a/htdocs/bookmarks/list.php b/htdocs/bookmarks/list.php index 56aae3a15f7..9434cf031a2 100644 --- a/htdocs/bookmarks/list.php +++ b/htdocs/bookmarks/list.php @@ -99,7 +99,7 @@ if ($action == 'delete') { $form = new Form($db); -$title = $langs->trans("ListOfBookmarks"); +$title = $langs->trans("Bookmarks"); llxHeader('', $title); diff --git a/htdocs/comm/mailing/list.php b/htdocs/comm/mailing/list.php index 13a7e63d364..735bef1e688 100644 --- a/htdocs/comm/mailing/list.php +++ b/htdocs/comm/mailing/list.php @@ -187,7 +187,7 @@ $resql = $db->query($sql); if ($resql) { $num = $db->num_rows($resql); - $title = $langs->trans("ListOfEMailings"); + $title = $langs->trans("EMailings"); if ($filteremail) { $title .= ' ('.$langs->trans("SentTo", $filteremail).')'; } diff --git a/htdocs/compta/clients.php b/htdocs/compta/clients.php index cd472c270e3..8db4516d3dd 100644 --- a/htdocs/compta/clients.php +++ b/htdocs/compta/clients.php @@ -133,7 +133,7 @@ if ($resql) { $langs->load('commercial'); - print_barre_liste($langs->trans("ListOfCustomers"), $page, $_SERVER["PHP_SELF"], "", $sortfield, $sortorder, '', $num); + print_barre_liste($langs->trans("Customers"), $page, $_SERVER["PHP_SELF"], "", $sortfield, $sortorder, '', $num); print '
'; diff --git a/htdocs/compta/deplacement/index.php b/htdocs/compta/deplacement/index.php index a4a782de603..6f4613097d9 100644 --- a/htdocs/compta/deplacement/index.php +++ b/htdocs/compta/deplacement/index.php @@ -68,7 +68,7 @@ $childids[] = $user->id; //$help_url='EN:Module_Donations|FR:Module_Dons|ES:Módulo_Donaciones'; $help_url = ''; -llxHeader('', $langs->trans("ListOfFees"), $help_url); +llxHeader('', $langs->trans("TripsAndExpenses"), $help_url); diff --git a/htdocs/compta/deplacement/list.php b/htdocs/compta/deplacement/list.php index cae06774332..c1c5e5cb851 100644 --- a/htdocs/compta/deplacement/list.php +++ b/htdocs/compta/deplacement/list.php @@ -131,7 +131,7 @@ $resql = $db->query($sql); if ($resql) { $num = $db->num_rows($resql); - print_barre_liste($langs->trans("ListOfFees"), $page, $_SERVER["PHP_SELF"], "&socid=$socid", $sortfield, $sortorder, '', $num); + print_barre_liste($langs->trans("TripsAndExpenses"), $page, $_SERVER["PHP_SELF"], "&socid=$socid", $sortfield, $sortorder, '', $num); $i = 0; print ''."\n"; diff --git a/htdocs/core/boxes/box_members_by_type.php b/htdocs/core/boxes/box_members_by_type.php index 9fcfb7e325a..b3f3504cee8 100644 --- a/htdocs/core/boxes/box_members_by_type.php +++ b/htdocs/core/boxes/box_members_by_type.php @@ -99,7 +99,8 @@ class box_members_by_type extends ModeleBoxes $MembersResiliated = array(); $SumToValidate = 0; - $SumValidated = 0; + $SumPending = 0; + $SumExpired = 0; $SumUpToDate = 0; $SumResiliated = 0; $SumExcluded = 0; @@ -233,6 +234,7 @@ class box_members_by_type extends ModeleBoxes 'text' => $labelstatus ); $line++; + foreach ($AdherentType as $key => $adhtype) { $SumToValidate += isset($MembersToValidate[$key]) ? $MembersToValidate[$key] : 0; $SumPending += isset($MembersPending[$key]) ? $MembersPending[$key] : 0; diff --git a/htdocs/eventorganization/conferenceorbooth_list.php b/htdocs/eventorganization/conferenceorbooth_list.php index f69d86c62e7..dd7bfd93a47 100644 --- a/htdocs/eventorganization/conferenceorbooth_list.php +++ b/htdocs/eventorganization/conferenceorbooth_list.php @@ -257,7 +257,7 @@ if ($projectid > 0 || $projectref) { } $help_url = "EN:Module_Projects|FR:Module_Projets|ES:Módulo_Proyectos"; - $title = $langs->trans("Project") . ' - ' . $langs->trans("ListOfConferencesOrBooths") . ' - ' . $project->ref . ' ' . $project->name; + $title = $langs->trans("Project") . ' - ' . $langs->trans("EventOrganizationConfOrBoothes") . ' - ' . $project->ref . ' ' . $project->name; if (!empty($conf->global->MAIN_HTML_TITLE) && preg_match('/projectnameonly/', $conf->global->MAIN_HTML_TITLE) && $project->name) { $title = $project->ref . ' ' . $project->name . ' - ' . $langs->trans("ListOfConferencesOrBooths"); } @@ -675,7 +675,7 @@ print ''; print ''; print ''; -$title = $langs->trans("ListOfConferencesOrBooths"); +$title = $langs->trans("EventOrganizationConfOrBoothes"); $newcardbutton = dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/eventorganization/conferenceorbooth_card.php?action=create'.(!empty($project->id)?'&withproject=1&fk_project='.$project->id:'').(!empty($project->socid)?'&fk_soc='.$project->socid:'').'&backtopage='.urlencode($_SERVER['PHP_SELF']).(!empty($project->id)?'?projectid='.$project->id:''), '', $permissiontoadd); diff --git a/htdocs/expensereport/index.php b/htdocs/expensereport/index.php index fced8a58e14..c8048e78621 100644 --- a/htdocs/expensereport/index.php +++ b/htdocs/expensereport/index.php @@ -78,7 +78,7 @@ $childids[] = $user->id; $help_url = "EN:Module_Expense_Reports|FR:Module_Notes_de_frais"; -llxHeader('', $langs->trans("ListOfFees"), $help_url); +llxHeader('', $langs->trans("TripsAndExpenses"), $help_url); $label = $somme = $nb = array(); diff --git a/htdocs/expensereport/list.php b/htdocs/expensereport/list.php index bded18fa597..ad16d5fb09f 100644 --- a/htdocs/expensereport/list.php +++ b/htdocs/expensereport/list.php @@ -254,7 +254,7 @@ $formexpensereport = new FormExpenseReport($db); $fuser = new User($db); -$title = $langs->trans("ListOfTrips"); +$title = $langs->trans("TripsAndExpenses"); llxHeader('', $title); $max_year = 5; diff --git a/htdocs/fichinter/list.php b/htdocs/fichinter/list.php index 9e8f7896860..5a44e9069cd 100644 --- a/htdocs/fichinter/list.php +++ b/htdocs/fichinter/list.php @@ -213,7 +213,7 @@ if (isModEnabled('contrat')) { $now = dol_now(); $help_url = ''; -$title = $langs->trans("ListOfInterventions"); +$title = $langs->trans("Interventions"); $morejs = array(); $morecss = array(); diff --git a/htdocs/langs/en_US/eventorganization.lang b/htdocs/langs/en_US/eventorganization.lang index f9531260c97..17cdda6525e 100644 --- a/htdocs/langs/en_US/eventorganization.lang +++ b/htdocs/langs/en_US/eventorganization.lang @@ -54,6 +54,7 @@ EVENTORGANIZATION_FILTERATTENDEES_TYPE = In the form to create/add an attendee, # Object # EventOrganizationConfOrBooth= Conference Or Booth +EventOrganizationConfOrBoothes=Conferences or Boothes ManageOrganizeEvent = Manage the organization of an event ConferenceOrBooth = Conference Or Booth ConferenceOrBoothTab = Conference Or Booth @@ -114,8 +115,8 @@ EvntOrgRegistrationHelpMessage = Here, you can vote for a conference or suggest EvntOrgRegistrationConfHelpMessage = Here, you can suggest a new conference to animate during the event. EvntOrgRegistrationBoothHelpMessage = Here, you can apply to have a booth during the event. ListOfSuggestedConferences = List of suggested conferences -ListOfSuggestedBooths = List of suggested booths -ListOfConferencesOrBooths=List of conferences or booths of event project +ListOfSuggestedBooths=Suggested booths +ListOfConferencesOrBooths=Conferences or booths of event project SuggestConference = Suggest a new conference SuggestBooth = Suggest a booth ViewAndVote = View and vote for suggested events diff --git a/htdocs/langs/en_US/expensereports.lang b/htdocs/langs/en_US/expensereports.lang index f3b5f07f241..5a5e06cf9c7 100644 --- a/htdocs/langs/en_US/expensereports.lang +++ b/htdocs/langs/en_US/expensereports.lang @@ -108,7 +108,7 @@ TripId=Id expense report TripNDF=Informations expense report TripSociete=Information company Trips=Expense reports -TripsAndExpenses=Expenses reports +TripsAndExpenses=Expense reports TripsAndExpensesStatistics=Expense reports statistics TypeFees=Types of fees UploadANewFileNow=Upload a new document now diff --git a/htdocs/product/stock/list.php b/htdocs/product/stock/list.php index bd8b5a2932a..f5398e84939 100644 --- a/htdocs/product/stock/list.php +++ b/htdocs/product/stock/list.php @@ -194,7 +194,7 @@ $warehouse = new Entrepot($db); $now = dol_now(); $help_url = 'EN:Module_Stocks_En|FR:Module_Stock|ES:Módulo_Stocks'; -$title = $langs->trans("ListOfWarehouses"); +$title = $langs->trans("Warehouses"); $totalarray = array(); $totalarray['nbfield'] = 0; diff --git a/htdocs/ticket/card.php b/htdocs/ticket/card.php index fdc3ac6e340..f00d4223878 100755 --- a/htdocs/ticket/card.php +++ b/htdocs/ticket/card.php @@ -827,9 +827,6 @@ if ($action == 'create' || $action == 'presend') { // Confirmation abandon if ($action == 'abandon') { print $form->formconfirm($url_page_current."?track_id=".$object->track_id, $langs->trans("AbandonTicket"), $langs->trans("ConfirmAbandonTicket"), "confirm_abandon", '', '', 1); - if ($ret == 'html') { - print '
'; - } } // Confirmation delete if ($action == 'delete') { diff --git a/htdocs/user/group/list.php b/htdocs/user/group/list.php index 4c91bd041dd..31d5aa93d02 100644 --- a/htdocs/user/group/list.php +++ b/htdocs/user/group/list.php @@ -121,7 +121,7 @@ if (empty($reshook)) { /* * View */ -$title = $langs->trans("ListOfGroups"); +$title = $langs->trans("UserGroups"); $help_url=""; llxHeader('', $title, $help_url); @@ -156,7 +156,7 @@ if ($resql) { $param .= '&optioncss='.$optioncss; } - $text = $langs->trans("ListOfGroups"); + $text = $langs->trans("UserGroups"); $newcardbutton = ''; if ($caneditperms) { From 1b03c423b94427c6eef855b9678b797c984c5f37 Mon Sep 17 00:00:00 2001 From: ksar <35605507+ksar-ksar@users.noreply.github.com> Date: Thu, 22 Dec 2022 17:13:11 +0100 Subject: [PATCH 0271/1128] FIX #23281 --- htdocs/admin/perms.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/admin/perms.php b/htdocs/admin/perms.php index d2f0d79e4f3..60f8c9d064a 100644 --- a/htdocs/admin/perms.php +++ b/htdocs/admin/perms.php @@ -226,7 +226,7 @@ if ($result) { // Tick if ($obj->bydefault == 1) { print ''; - print ''; + print ''; //print img_edit_remove(); print img_picto('', 'switch_on'); print ''; From 4110669098b9507a3df30cfc6599d7cfe3c2d9b3 Mon Sep 17 00:00:00 2001 From: Randall Mora <50120822+randallmoraes@users.noreply.github.com> Date: Thu, 22 Dec 2022 10:30:58 -0600 Subject: [PATCH 0272/1128] Update perf.php Check validate when BROTLI_COMPRESS is enable --- htdocs/admin/system/perf.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/admin/system/perf.php b/htdocs/admin/system/perf.php index 6d7ef8f1863..a3c49ff6654 100644 --- a/htdocs/admin/system/perf.php +++ b/htdocs/admin/system/perf.php @@ -198,7 +198,7 @@ jQuery(document).ready(function() { compphpstring=getphpurl.getResponseHeader(\'Content-Encoding\'); /* alert(\'php:\'+getphpurl.getAllResponseHeaders()); */ /*alert(\'php:\'+compphpstring);*/ - if (compphpstring == null || (compphpstring.indexOf("gzip") == -1 && compphpstring.indexOf("deflate") == -1)) + if (compphpstring == null || (compphpstring.indexOf("gzip") == -1 && compphpstring.indexOf("deflate") == -1 && compphpstring.indexOf("br") == -1)) { jQuery("#httpcompphpok").hide(); jQuery("#httpcompphpko").show(); @@ -238,7 +238,7 @@ jQuery(document).ready(function() { compcssstring=getcssurl.getResponseHeader(\'Content-Encoding\'); /* alert(\'php:\'+getcssurl.getAllResponseHeaders()); */ /*alert(\'php:\'+compcssstring);*/ - if (compcssstring == null || (compcssstring.indexOf("gzip") == -1 && compcssstring.indexOf("deflate") == -1)) + if (compcssstring == null || (compcssstring.indexOf("gzip") == -1 && compcssstring.indexOf("deflate") == -1 && compcssstring.indexOf("br") == -1)) { jQuery("#httpcompcssok").hide(); jQuery("#httpcompcssko").show(); @@ -278,7 +278,7 @@ jQuery(document).ready(function() { compcssphpstring=getcssphpurl.getResponseHeader(\'Content-Encoding\'); /* alert(\'php:\'+getcssphpurl.getAllResponseHeaders()); */ /*alert(\'php:\'+compcssphpstring);*/ - if (compcssphpstring == null || (compcssphpstring.indexOf("gzip") == -1 && compcssphpstring.indexOf("deflate") == -1)) + if (compcssphpstring == null || (compcssphpstring.indexOf("gzip") == -1 && compcssphpstring.indexOf("deflate") == -1 && compcssphpstring.indexOf("br") == -1)) { jQuery("#httpcompcssphpok").hide(); jQuery("#httpcompcssphpko").show(); @@ -318,7 +318,7 @@ jQuery(document).ready(function() { compimgstring=getimgurl.getResponseHeader(\'Content-Encoding\'); /* alert(\'php:\'+getimgurl.getAllResponseHeaders()); */ /*alert(\'php:\'+compimgstring);*/ - if (compimgstring == null || (compimgstring.indexOf("gzip") == -1 && compimgstring.indexOf("deflate") == -1)) + if (compimgstring == null || (compimgstring.indexOf("gzip") == -1 && compimgstring.indexOf("deflate") == -1 && compimgstring.indexOf("br") == -1)) { jQuery("#httpcompimgok").hide(); jQuery("#httpcompimgko").show(); @@ -358,7 +358,7 @@ jQuery(document).ready(function() { compjsstring=getjsurl.getResponseHeader(\'Content-Encoding\'); /* alert(\'js:\'+getjsurl.getAllResponseHeaders()); */ /*alert(\'js:\'+compjsstring);*/ - if (compjsstring == null || (compjsstring.indexOf("gzip") == -1 && compjsstring.indexOf("deflate") == -1)) + if (compjsstring == null || (compjsstring.indexOf("gzip") == -1 && compjsstring.indexOf("deflate") == -1 && compjsstring.indexOf("br") == -1)) { jQuery("#httpcompjsok").hide(); jQuery("#httpcompjsko").show(); @@ -398,7 +398,7 @@ jQuery(document).ready(function() { compjsphpstring=getjsphpurl.getResponseHeader(\'Content-Encoding\'); /* alert(\'php:\'+getjsphpurl.getAllResponseHeaders()); */ /*alert(\'php:\'+compjsphpstring);*/ - if (compjsphpstring == null || (compjsphpstring.indexOf("gzip") == -1 && compjsphpstring.indexOf("deflate") == -1)) + if (compjsphpstring == null || (compjsphpstring.indexOf("gzip") == -1 && compjsphpstring.indexOf("deflate") == -1 && compjsphpstring.indexOf("br") == -1)) { jQuery("#httpcompjsphpok").hide(); jQuery("#httpcompjsphpko").show(); From d1c8610ed25ba9a05819fc363351f09d7bd9f84a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 20:36:11 +0100 Subject: [PATCH 0273/1128] Trans --- htdocs/contrat/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/contrat/list.php b/htdocs/contrat/list.php index 07cf120f4cc..4b49840f681 100644 --- a/htdocs/contrat/list.php +++ b/htdocs/contrat/list.php @@ -619,7 +619,7 @@ print ''; print ''; print ''; -print_barre_liste($langs->trans("ListOfContracts"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'contract', 0, $newcardbutton, '', $limit, 0, 0, 1); +print_barre_liste($langs->trans("Contracts"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'contract', 0, $newcardbutton, '', $limit, 0, 0, 1); $topicmail = "SendContractRef"; $modelmail = "contract"; From 020177a778d30783a65e5fd14b5122d3faa0cace Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Dec 2022 21:11:28 +0100 Subject: [PATCH 0274/1128] FIX dark theme --- htdocs/theme/eldy/global.inc.php | 16 +++---- htdocs/theme/md/style.css.php | 73 ++++++++++++++++++++++++++++++-- 2 files changed, 78 insertions(+), 11 deletions(-) diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 1a45f1eaf60..993a8da554d 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -60,7 +60,9 @@ if (!empty($conf->global->THEME_DARKMODEENABLED)) { print "/* For dark mode */\n"; if ($conf->global->THEME_DARKMODEENABLED != 2) { - print "@media (prefers-color-scheme: dark) {"; + print "@media not print and (prefers-color-scheme: dark) {"; + } else { + print "@media not print {"; } print ":root { --colorbackhmenu1: #3d3e40; @@ -104,15 +106,13 @@ if (!empty($conf->global->THEME_DARKMODEENABLED)) { --amountpaymentcomplete:rgb(101,184,77); --amountremaintopaybackcolor:rbg(245,130,46); --infoboxmoduleenabledbgcolor : linear-gradient(0.4turn, #000, #000, #000, #274231); - --tablevalidbgcolor: rgb(80, 64, 33); + --tablevalidbgcolor: rgb(80, 64, 33); } body, button { color: #bbb; - }\n"; - if ($conf->global->THEME_DARKMODEENABLED != 2) { - print "}\n"; - } + }\n + }\n"; } ?> @@ -3238,7 +3238,6 @@ div.blockvmenubookmarks div.blockvmenupair, div.blockvmenuimpair, div.blockvmenubookmarks, div.blockvmenuend { font-family: ; - color: #000000; text-align: ; text-decoration: none; padding-left: 5px; @@ -3247,6 +3246,7 @@ div.blockvmenupair, div.blockvmenuimpair, div.blockvmenubookmarks, div.blockvmen padding-bottom: 7px; margin: 0 0 0 2px; + color: var(--colortext); background: var(--colorbackvmenu1); border-left: 1px solid #AAA; @@ -4183,7 +4183,7 @@ tr.pair td .nobordernopadding tr td, tr.impair td .nobordernopadding tr td { border-bottom: 0px !important; } table.nobottomiftotal tr.liste_total td { - background-color: #fff; + background-color: var(--inputbackgroundcolor); border-bottom: 0px !important; diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 05d11777884..bfbedc6830a 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -320,7 +320,9 @@ print '*/'."\n"; --colorbacklinebreak: rgb(); --colorbackbody: rgb(); --colorbackmobilemenu: #f8f8f8; + --colorbackgrey: #f0f0f0; --colortexttitlenotab: rgb(); + --colortexttitlenotab2: rgb(); --colortexttitle: rgb(); --colortexttitlelink: rgba(, 0.9); --colortext: rgb(); @@ -330,6 +332,8 @@ print '*/'."\n"; --colortopbordertitle1: rgb(); --listetotal: #551188; --inputbackgroundcolor: #FFF; + --inputbackgroundcolordisabled: #eee; + --inputcolordisabled: rgb(80, 80, 80); --inputbordercolor: rgba(0,0,0,.2); --tooltipbgcolor: ; --tooltipfontcolor : ; @@ -347,10 +351,71 @@ print '*/'."\n"; --productlinestockod: #002200; --productlinestocktoolow: #884400; --infoboxmoduleenabledbgcolor : linear-gradient(0.4turn, #fff, #fff, #fff, #e4efe8); + --tablevalidbgcolor: rgb(252, 248, 227); --butactionbg : #; --textbutaction : #; } +global->THEME_DARKMODEENABLED)) { + print "/* For dark mode */\n"; + if ($conf->global->THEME_DARKMODEENABLED != 2) { + print "@media not print and (prefers-color-scheme: dark) {"; + } else { + print "@media not print {"; + } + print ":root { + --colorbackhmenu1: #3d3e40; + --colorbackvmenu1: #2b2c2e; + --colorbacktitle1: #2b2d2f; + --colorbacktabcard1: #1d1e20; /* Must be same than colorbackbody */ + --colorbacktabactive: rgb(220,220,220); + --colorbacklineimpair1: #38393d; + --colorbacklineimpair2: #2b2d2f; + --colorbacklinepair1: #38393d; + --colorbacklinepair2: #2b2d2f; + --colorbacklinepairhover: #2b2d2f; + --colorbacklinepairchecked: #0e5ccd; + --colorbackbody: #1d1e20; + --colorbackmobilemenu: #080808; + --colorbackgrey: #0f0f0f; + --tooltipbgcolor: #2b2d2f; + --colortexttitlenotab: rgb(220,220,220); + --colortexttitlenotab2: rgb(220,220,220); + --colortexttitle: rgb(220,220,220); + --colortext: rgb(220,220,220); + --colortextlink: #4390dc; + --colortexttitlelink: #4390dc; + --colortextbackhmenu: rgb(220,220,220); + --colortextbackvmenu: rgb(220,220,220); + --tooltipfontcolor : rgb(220,220,220); + --listetotal: rgb(245, 83, 158); + --inputbackgroundcolor: rgb(70, 70, 70); + --inputbackgroundcolordisabled: rgb(60, 60, 60); + --inputcolordisabled: rgb(140, 140, 140); + --inputbordercolor: rgb(220,220,220); + --oddevencolor: rgb(220,220,220); + --colorboxstatsborder: rgb(65,100,138); + --dolgraphbg: #1d1e20; + --fieldrequiredcolor: rgb(250,183,59); + --colortextbacktab: rgb(220,220,220); + --colorboxiconbg: rgb(36,38,39); + --refidnocolor: rgb(220,220,220); + --tableforfieldcolor:rgb(220,220,220); + --amountremaintopaycolor:rgb(252,84,91); + --amountpaymentcomplete:rgb(101,184,77); + --amountremaintopaybackcolor:rbg(245,130,46); + --infoboxmoduleenabledbgcolor : linear-gradient(0.4turn, #000, #000, #000, #274231); + --tablevalidbgcolor: rgb(80, 64, 33); + } + + body, button { + color: #bbb; + }\n + }\n"; +} +?> + body { background-color: #FFFFFF; @@ -452,7 +517,7 @@ input, select { } #mainbody input.button:not(.buttongen):not(.bordertransp), #mainbody a.button:not(.buttongen):not(.bordertransp) { background: var(--butactionbg); - color: var(--textbutaction)!important; + color: var(--textbutaction) !important; border-radius: 3px; border-collapse: collapse; border: none; @@ -3201,7 +3266,6 @@ li#mainmenutd_companylogo { div.blockvmenupair, div.blockvmenuimpair { font-family: ; - color: #000000; text-align: ; text-decoration: none; padding-left: 5px; @@ -3210,6 +3274,9 @@ div.blockvmenupair, div.blockvmenuimpair padding-bottom: 3px; margin: 1px 0px 8px 0px; + color: var(--colortext); + background: var(--colorbackvmenu1); + padding-bottom: 10px; border-bottom: 1px solid #e0e0e0; } @@ -4118,7 +4185,7 @@ tr.pair td .nobordernopadding tr td, tr.impair td .nobordernopadding tr td { } /* table.nobottomiftotal tr.liste_total td { - background-color: #fff; + background-color: var(--inputbackgroundcolor); border-bottom: 0px !important; From d7dd584d62826bd20cf67c0c2e15436a2b413f67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20France?= Date: Thu, 22 Dec 2022 21:59:24 +0100 Subject: [PATCH 0275/1128] clean code --- htdocs/bookcal/admin/about.php | 27 +-------- .../admin/availabilities_extrafields.php | 27 +-------- htdocs/bookcal/admin/booking_extrafields.php | 27 +-------- htdocs/bookcal/admin/setup.php | 27 +-------- htdocs/bookcal/availabilities_agenda.php | 55 +----------------- htdocs/bookcal/availabilities_card.php | 56 +------------------ htdocs/bookcal/availabilities_contact.php | 34 +---------- htdocs/bookcal/availabilities_document.php | 55 +----------------- htdocs/bookcal/availabilities_list.php | 52 +---------------- htdocs/bookcal/availabilities_note.php | 55 +----------------- htdocs/bookcal/bookcalindex.php | 30 +--------- htdocs/bookcal/booking_agenda.php | 55 +----------------- htdocs/bookcal/booking_card.php | 56 +------------------ htdocs/bookcal/booking_contact.php | 34 +---------- htdocs/bookcal/booking_document.php | 55 +----------------- htdocs/bookcal/booking_list.php | 52 +---------------- htdocs/bookcal/booking_note.php | 55 +----------------- htdocs/core/modules/modBookCal.class.php | 7 +-- 18 files changed, 39 insertions(+), 720 deletions(-) diff --git a/htdocs/bookcal/admin/about.php b/htdocs/bookcal/admin/about.php index 85f0efcdebb..2ff4e874450 100644 --- a/htdocs/bookcal/admin/about.php +++ b/htdocs/bookcal/admin/about.php @@ -23,32 +23,7 @@ */ // Load Dolibarr environment -$res = 0; -// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) -if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { - $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; -} -// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME -$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1; -while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { - $i--; $j--; -} -if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { - $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; -} -if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { - $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; -} -// Try main.inc.php using relative path -if (!$res && file_exists("../../main.inc.php")) { - $res = @include "../../main.inc.php"; -} -if (!$res && file_exists("../../../main.inc.php")) { - $res = @include "../../../main.inc.php"; -} -if (!$res) { - die("Include of main fails"); -} +require '../../main.inc.php'; // Libraries require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; diff --git a/htdocs/bookcal/admin/availabilities_extrafields.php b/htdocs/bookcal/admin/availabilities_extrafields.php index 9d16d7b5395..ba7dca39570 100644 --- a/htdocs/bookcal/admin/availabilities_extrafields.php +++ b/htdocs/bookcal/admin/availabilities_extrafields.php @@ -27,32 +27,7 @@ */ // Load Dolibarr environment -$res = 0; -// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) -if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { - $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; -} -// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME -$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1; -while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { - $i--; $j--; -} -if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { - $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; -} -if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { - $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; -} -// Try main.inc.php using relative path -if (!$res && file_exists("../../main.inc.php")) { - $res = @include "../../main.inc.php"; -} -if (!$res && file_exists("../../../main.inc.php")) { - $res = @include "../../../main.inc.php"; -} -if (!$res) { - die("Include of main fails"); -} +require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; require_once '../lib/bookcal.lib.php'; diff --git a/htdocs/bookcal/admin/booking_extrafields.php b/htdocs/bookcal/admin/booking_extrafields.php index 30122d95048..2e9163af158 100644 --- a/htdocs/bookcal/admin/booking_extrafields.php +++ b/htdocs/bookcal/admin/booking_extrafields.php @@ -27,32 +27,7 @@ */ // Load Dolibarr environment -$res = 0; -// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) -if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { - $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; -} -// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME -$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1; -while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { - $i--; $j--; -} -if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { - $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; -} -if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { - $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; -} -// Try main.inc.php using relative path -if (!$res && file_exists("../../main.inc.php")) { - $res = @include "../../main.inc.php"; -} -if (!$res && file_exists("../../../main.inc.php")) { - $res = @include "../../../main.inc.php"; -} -if (!$res) { - die("Include of main fails"); -} +require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; require_once '../lib/bookcal.lib.php'; diff --git a/htdocs/bookcal/admin/setup.php b/htdocs/bookcal/admin/setup.php index c4fd74404eb..ca9d571ebfe 100644 --- a/htdocs/bookcal/admin/setup.php +++ b/htdocs/bookcal/admin/setup.php @@ -23,32 +23,7 @@ */ // Load Dolibarr environment -$res = 0; -// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) -if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { - $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; -} -// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME -$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1; -while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { - $i--; $j--; -} -if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { - $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; -} -if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { - $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; -} -// Try main.inc.php using relative path -if (!$res && file_exists("../../main.inc.php")) { - $res = @include "../../main.inc.php"; -} -if (!$res && file_exists("../../../main.inc.php")) { - $res = @include "../../../main.inc.php"; -} -if (!$res) { - die("Include of main fails"); -} +require '../../main.inc.php'; global $langs, $user; diff --git a/htdocs/bookcal/availabilities_agenda.php b/htdocs/bookcal/availabilities_agenda.php index c3e66a17257..299acca7374 100644 --- a/htdocs/bookcal/availabilities_agenda.php +++ b/htdocs/bookcal/availabilities_agenda.php @@ -22,63 +22,14 @@ * \brief Tab of events on Availabilities */ -//if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); // Do not create database handler $db -//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); // Do not load object $user -//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); // Do not load object $mysoc -//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1'); // Do not load object $langs -//if (! defined('NOSCANGETFORINJECTION')) define('NOSCANGETFORINJECTION', '1'); // Do not check injection attack on GET parameters -//if (! defined('NOSCANPOSTFORINJECTION')) define('NOSCANPOSTFORINJECTION', '1'); // Do not check injection attack on POST parameters -//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK', '1'); // Do not check CSRF attack (test on referer + on token if option MAIN_SECURITY_CSRF_WITH_TOKEN is on). -//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on) -//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK', '1'); // Do not check style html tag into posted data -//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); // If there is no need to load and show top and left menu -//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); // If we don't need to load the html.form.class.php -//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); // Do not load ajax.lib.php library -//if (! defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session). This include the NOIPCHECK too. -//if (! defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip -//if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT', 'auto'); // Force lang to a particular value -//if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler -//if (! defined("NOREDIRECTBYMAINTOLOGIN")) define('NOREDIRECTBYMAINTOLOGIN', 1); // The main.inc.php does not make a redirect if not logged, instead show simple error message -//if (! defined("FORCECSP")) define('FORCECSP', 'none'); // Disable all Content Security Policies -//if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET -//if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification - // Load Dolibarr environment -$res = 0; -// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) -if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { - $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; -} -// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME -$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1; -while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { - $i--; $j--; -} -if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { - $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; -} -if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { - $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; -} -// Try main.inc.php using relative path -if (!$res && file_exists("../main.inc.php")) { - $res = @include "../main.inc.php"; -} -if (!$res && file_exists("../../main.inc.php")) { - $res = @include "../../main.inc.php"; -} -if (!$res && file_exists("../../../main.inc.php")) { - $res = @include "../../../main.inc.php"; -} -if (!$res) { - die("Include of main fails"); -} +require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; -dol_include_once('/bookcal/class/availabilities.class.php'); -dol_include_once('/bookcal/lib/bookcal_availabilities.lib.php'); +require_once DOL_DOCUMENT_ROOT.'/bookcal/class/availabilities.class.php'; +require_once DOL_DOCUMENT_ROOT.'/bookcal/lib/bookcal_availabilities.lib.php'; // Load translation files required by the page diff --git a/htdocs/bookcal/availabilities_card.php b/htdocs/bookcal/availabilities_card.php index b9f5277d4ae..fd3c310958b 100644 --- a/htdocs/bookcal/availabilities_card.php +++ b/htdocs/bookcal/availabilities_card.php @@ -22,64 +22,14 @@ * \brief Page to create/edit/view availabilities */ -//if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); // Do not create database handler $db -//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); // Do not load object $user -//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); // Do not load object $mysoc -//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1'); // Do not load object $langs -//if (! defined('NOSCANGETFORINJECTION')) define('NOSCANGETFORINJECTION', '1'); // Do not check injection attack on GET parameters -//if (! defined('NOSCANPOSTFORINJECTION')) define('NOSCANPOSTFORINJECTION', '1'); // Do not check injection attack on POST parameters -//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK', '1'); // Do not check CSRF attack (test on referer + on token). -//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on) -//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK', '1'); // Do not check style html tag into posted data -//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); // If there is no need to load and show top and left menu -//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); // If we don't need to load the html.form.class.php -//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); // Do not load ajax.lib.php library -//if (! defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session). This include the NOIPCHECK too. -//if (! defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip -//if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT', 'auto'); // Force lang to a particular value -//if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler -//if (! defined("NOREDIRECTBYMAINTOLOGIN")) define('NOREDIRECTBYMAINTOLOGIN', 1); // The main.inc.php does not make a redirect if not logged, instead show simple error message -//if (! defined("FORCECSP")) define('FORCECSP', 'none'); // Disable all Content Security Policies -//if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET -//if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification -//if (! defined('NOSESSION')) define('NOSESSION', '1'); // Disable session - // Load Dolibarr environment -$res = 0; -// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) -if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { - $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; -} -// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME -$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1; -while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { - $i--; $j--; -} -if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { - $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; -} -if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { - $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; -} -// Try main.inc.php using relative path -if (!$res && file_exists("../main.inc.php")) { - $res = @include "../main.inc.php"; -} -if (!$res && file_exists("../../main.inc.php")) { - $res = @include "../../main.inc.php"; -} -if (!$res && file_exists("../../../main.inc.php")) { - $res = @include "../../../main.inc.php"; -} -if (!$res) { - die("Include of main fails"); -} +require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php'; -dol_include_once('/bookcal/class/availabilities.class.php'); -dol_include_once('/bookcal/lib/bookcal_availabilities.lib.php'); +require_once DOL_DOCUMENT_ROOT.'/bookcal/class/availabilities.class.php'; +require_once DOL_DOCUMENT_ROOT.'/bookcal/lib/bookcal_availabilities.lib.php'; // Load translation files required by the page $langs->loadLangs(array("bookcal@bookcal", "other")); diff --git a/htdocs/bookcal/availabilities_contact.php b/htdocs/bookcal/availabilities_contact.php index dd01e8bf046..41508aaa46a 100644 --- a/htdocs/bookcal/availabilities_contact.php +++ b/htdocs/bookcal/availabilities_contact.php @@ -23,40 +23,12 @@ */ // Load Dolibarr environment -$res = 0; -// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) -if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { - $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; -} -// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME -$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1; -while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { - $i--; $j--; -} -if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { - $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; -} -if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { - $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; -} -// Try main.inc.php using relative path -if (!$res && file_exists("../main.inc.php")) { - $res = @include "../main.inc.php"; -} -if (!$res && file_exists("../../main.inc.php")) { - $res = @include "../../main.inc.php"; -} -if (!$res && file_exists("../../../main.inc.php")) { - $res = @include "../../../main.inc.php"; -} -if (!$res) { - die("Include of main fails"); -} +require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; -dol_include_once('/bookcal/class/availabilities.class.php'); -dol_include_once('/bookcal/lib/bookcal_availabilities.lib.php'); +require_once DOL_DOCUMENT_ROOT.'/bookcal/class/availabilities.class.php'; +require_once DOL_DOCUMENT_ROOT.'/bookcal/lib/bookcal_availabilities.lib.php'; // Load translation files required by the page $langs->loadLangs(array("bookcal@bookcal", "companies", "other", "mails")); diff --git a/htdocs/bookcal/availabilities_document.php b/htdocs/bookcal/availabilities_document.php index 5bab9356ee1..e7335bff74c 100644 --- a/htdocs/bookcal/availabilities_document.php +++ b/htdocs/bookcal/availabilities_document.php @@ -22,64 +22,15 @@ * \brief Tab for documents linked to Availabilities */ -//if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); // Do not create database handler $db -//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); // Do not load object $user -//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); // Do not load object $mysoc -//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1'); // Do not load object $langs -//if (! defined('NOSCANGETFORINJECTION')) define('NOSCANGETFORINJECTION', '1'); // Do not check injection attack on GET parameters -//if (! defined('NOSCANPOSTFORINJECTION')) define('NOSCANPOSTFORINJECTION', '1'); // Do not check injection attack on POST parameters -//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK', '1'); // Do not check CSRF attack (test on referer + on token if option MAIN_SECURITY_CSRF_WITH_TOKEN is on). -//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on) -//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK', '1'); // Do not check style html tag into posted data -//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); // If there is no need to load and show top and left menu -//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); // If we don't need to load the html.form.class.php -//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); // Do not load ajax.lib.php library -//if (! defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session). This include the NOIPCHECK too. -//if (! defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip -//if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT', 'auto'); // Force lang to a particular value -//if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler -//if (! defined("NOREDIRECTBYMAINTOLOGIN")) define('NOREDIRECTBYMAINTOLOGIN', 1); // The main.inc.php does not make a redirect if not logged, instead show simple error message -//if (! defined("FORCECSP")) define('FORCECSP', 'none'); // Disable all Content Security Policies -//if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET -//if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification - // Load Dolibarr environment -$res = 0; -// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) -if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { - $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; -} -// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME -$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1; -while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { - $i--; $j--; -} -if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { - $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; -} -if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { - $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; -} -// Try main.inc.php using relative path -if (!$res && file_exists("../main.inc.php")) { - $res = @include "../main.inc.php"; -} -if (!$res && file_exists("../../main.inc.php")) { - $res = @include "../../main.inc.php"; -} -if (!$res && file_exists("../../../main.inc.php")) { - $res = @include "../../../main.inc.php"; -} -if (!$res) { - die("Include of main fails"); -} +require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; -dol_include_once('/bookcal/class/availabilities.class.php'); -dol_include_once('/bookcal/lib/bookcal_availabilities.lib.php'); +require_once DOL_DOCUMENT_ROOT.'/bookcal/class/availabilities.class.php'; +require_once DOL_DOCUMENT_ROOT.'/bookcal/lib/bookcal_availabilities.lib.php'; // Load translation files required by the page $langs->loadLangs(array("bookcal@bookcal", "companies", "other", "mails")); diff --git a/htdocs/bookcal/availabilities_list.php b/htdocs/bookcal/availabilities_list.php index 6c5b4c2ed64..9af4b65a022 100644 --- a/htdocs/bookcal/availabilities_list.php +++ b/htdocs/bookcal/availabilities_list.php @@ -22,58 +22,8 @@ * \brief List page for availabilities */ -//if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); // Do not create database handler $db -//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); // Do not load object $user -//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); // Do not load object $mysoc -//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1'); // Do not load object $langs -//if (! defined('NOSCANGETFORINJECTION')) define('NOSCANGETFORINJECTION', '1'); // Do not check injection attack on GET parameters -//if (! defined('NOSCANPOSTFORINJECTION')) define('NOSCANPOSTFORINJECTION', '1'); // Do not check injection attack on POST parameters -//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK', '1'); // Do not check CSRF attack (test on referer + on token if option MAIN_SECURITY_CSRF_WITH_TOKEN is on). -//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on) -//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK', '1'); // Do not check style html tag into posted data -//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); // If there is no need to load and show top and left menu -//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); // If we don't need to load the html.form.class.php -//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); // Do not load ajax.lib.php library -//if (! defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session). This include the NOIPCHECK too. -//if (! defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip -//if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT', 'auto'); // Force lang to a particular value -//if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler -//if (! defined("NOREDIRECTBYMAINTOLOGIN")) define('NOREDIRECTBYMAINTOLOGIN', 1); // The main.inc.php does not make a redirect if not logged, instead show simple error message -//if (! defined("FORCECSP")) define('FORCECSP', 'none'); // Disable all Content Security Policies -//if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET -//if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification -//if (! defined('NOSESSION')) define('NOSESSION', '1'); // On CLI mode, no need to use web sessions - // Load Dolibarr environment -$res = 0; -// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) -if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { - $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; -} -// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME -$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1; -while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { - $i--; $j--; -} -if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { - $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; -} -if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { - $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; -} -// Try main.inc.php using relative path -if (!$res && file_exists("../main.inc.php")) { - $res = @include "../main.inc.php"; -} -if (!$res && file_exists("../../main.inc.php")) { - $res = @include "../../main.inc.php"; -} -if (!$res && file_exists("../../../main.inc.php")) { - $res = @include "../../../main.inc.php"; -} -if (!$res) { - die("Include of main fails"); -} +require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; diff --git a/htdocs/bookcal/availabilities_note.php b/htdocs/bookcal/availabilities_note.php index faae7a08834..44ced158e03 100644 --- a/htdocs/bookcal/availabilities_note.php +++ b/htdocs/bookcal/availabilities_note.php @@ -22,60 +22,11 @@ * \brief Tab for notes on Availabilities */ -//if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); // Do not create database handler $db -//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); // Do not load object $user -//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); // Do not load object $mysoc -//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1'); // Do not load object $langs -//if (! defined('NOSCANGETFORINJECTION')) define('NOSCANGETFORINJECTION', '1'); // Do not check injection attack on GET parameters -//if (! defined('NOSCANPOSTFORINJECTION')) define('NOSCANPOSTFORINJECTION', '1'); // Do not check injection attack on POST parameters -//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK', '1'); // Do not check CSRF attack (test on referer + on token if option MAIN_SECURITY_CSRF_WITH_TOKEN is on). -//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on) -//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK', '1'); // Do not check style html tag into posted data -//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); // If there is no need to load and show top and left menu -//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); // If we don't need to load the html.form.class.php -//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); // Do not load ajax.lib.php library -//if (! defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session). This include the NOIPCHECK too. -//if (! defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip -//if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT', 'auto'); // Force lang to a particular value -//if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler -//if (! defined("NOREDIRECTBYMAINTOLOGIN")) define('NOREDIRECTBYMAINTOLOGIN', 1); // The main.inc.php does not make a redirect if not logged, instead show simple error message -//if (! defined("FORCECSP")) define('FORCECSP', 'none'); // Disable all Content Security Policies -//if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET -//if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification - // Load Dolibarr environment -$res = 0; -// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) -if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { - $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; -} -// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME -$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1; -while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { - $i--; $j--; -} -if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { - $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; -} -if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { - $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; -} -// Try main.inc.php using relative path -if (!$res && file_exists("../main.inc.php")) { - $res = @include "../main.inc.php"; -} -if (!$res && file_exists("../../main.inc.php")) { - $res = @include "../../main.inc.php"; -} -if (!$res && file_exists("../../../main.inc.php")) { - $res = @include "../../../main.inc.php"; -} -if (!$res) { - die("Include of main fails"); -} +require '../main.inc.php'; -dol_include_once('/bookcal/class/availabilities.class.php'); -dol_include_once('/bookcal/lib/bookcal_availabilities.lib.php'); +require_once DOL_DOCUMENT_ROOT.'/bookcal/class/availabilities.class.php'; +require_once DOL_DOCUMENT_ROOT.'/bookcal/lib/bookcal_availabilities.lib.php'; // Load translation files required by the page $langs->loadLangs(array("bookcal@bookcal", "companies")); diff --git a/htdocs/bookcal/bookcalindex.php b/htdocs/bookcal/bookcalindex.php index 1b4e360e4ce..6ec6ae6fb3e 100644 --- a/htdocs/bookcal/bookcalindex.php +++ b/htdocs/bookcal/bookcalindex.php @@ -25,35 +25,7 @@ */ // Load Dolibarr environment -$res = 0; -// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) -if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { - $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; -} -// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME -$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1; -while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { - $i--; $j--; -} -if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { - $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; -} -if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { - $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; -} -// Try main.inc.php using relative path -if (!$res && file_exists("../main.inc.php")) { - $res = @include "../main.inc.php"; -} -if (!$res && file_exists("../../main.inc.php")) { - $res = @include "../../main.inc.php"; -} -if (!$res && file_exists("../../../main.inc.php")) { - $res = @include "../../../main.inc.php"; -} -if (!$res) { - die("Include of main fails"); -} +require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; diff --git a/htdocs/bookcal/booking_agenda.php b/htdocs/bookcal/booking_agenda.php index dec1ebee921..10a75fc9f8a 100644 --- a/htdocs/bookcal/booking_agenda.php +++ b/htdocs/bookcal/booking_agenda.php @@ -22,63 +22,14 @@ * \brief Tab of events on Booking */ -//if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); // Do not create database handler $db -//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); // Do not load object $user -//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); // Do not load object $mysoc -//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1'); // Do not load object $langs -//if (! defined('NOSCANGETFORINJECTION')) define('NOSCANGETFORINJECTION', '1'); // Do not check injection attack on GET parameters -//if (! defined('NOSCANPOSTFORINJECTION')) define('NOSCANPOSTFORINJECTION', '1'); // Do not check injection attack on POST parameters -//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK', '1'); // Do not check CSRF attack (test on referer + on token if option MAIN_SECURITY_CSRF_WITH_TOKEN is on). -//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on) -//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK', '1'); // Do not check style html tag into posted data -//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); // If there is no need to load and show top and left menu -//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); // If we don't need to load the html.form.class.php -//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); // Do not load ajax.lib.php library -//if (! defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session). This include the NOIPCHECK too. -//if (! defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip -//if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT', 'auto'); // Force lang to a particular value -//if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler -//if (! defined("NOREDIRECTBYMAINTOLOGIN")) define('NOREDIRECTBYMAINTOLOGIN', 1); // The main.inc.php does not make a redirect if not logged, instead show simple error message -//if (! defined("FORCECSP")) define('FORCECSP', 'none'); // Disable all Content Security Policies -//if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET -//if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification - // Load Dolibarr environment -$res = 0; -// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) -if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { - $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; -} -// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME -$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1; -while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { - $i--; $j--; -} -if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { - $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; -} -if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { - $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; -} -// Try main.inc.php using relative path -if (!$res && file_exists("../main.inc.php")) { - $res = @include "../main.inc.php"; -} -if (!$res && file_exists("../../main.inc.php")) { - $res = @include "../../main.inc.php"; -} -if (!$res && file_exists("../../../main.inc.php")) { - $res = @include "../../../main.inc.php"; -} -if (!$res) { - die("Include of main fails"); -} +require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; -dol_include_once('/bookcal/class/booking.class.php'); -dol_include_once('/bookcal/lib/bookcal_booking.lib.php'); +require_once DOL_DOCUMENT_ROOT.'/bookcal/class/booking.class.php'; +require_once DOL_DOCUMENT_ROOT.'/bookcal/lib/bookcal_booking.lib.php'; // Load translation files required by the page diff --git a/htdocs/bookcal/booking_card.php b/htdocs/bookcal/booking_card.php index 0240ab2dccc..3f041f0d79d 100644 --- a/htdocs/bookcal/booking_card.php +++ b/htdocs/bookcal/booking_card.php @@ -22,64 +22,14 @@ * \brief Page to create/edit/view booking */ -//if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); // Do not create database handler $db -//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); // Do not load object $user -//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); // Do not load object $mysoc -//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1'); // Do not load object $langs -//if (! defined('NOSCANGETFORINJECTION')) define('NOSCANGETFORINJECTION', '1'); // Do not check injection attack on GET parameters -//if (! defined('NOSCANPOSTFORINJECTION')) define('NOSCANPOSTFORINJECTION', '1'); // Do not check injection attack on POST parameters -//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK', '1'); // Do not check CSRF attack (test on referer + on token). -//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on) -//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK', '1'); // Do not check style html tag into posted data -//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); // If there is no need to load and show top and left menu -//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); // If we don't need to load the html.form.class.php -//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); // Do not load ajax.lib.php library -//if (! defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session). This include the NOIPCHECK too. -//if (! defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip -//if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT', 'auto'); // Force lang to a particular value -//if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler -//if (! defined("NOREDIRECTBYMAINTOLOGIN")) define('NOREDIRECTBYMAINTOLOGIN', 1); // The main.inc.php does not make a redirect if not logged, instead show simple error message -//if (! defined("FORCECSP")) define('FORCECSP', 'none'); // Disable all Content Security Policies -//if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET -//if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification -//if (! defined('NOSESSION')) define('NOSESSION', '1'); // Disable session - // Load Dolibarr environment -$res = 0; -// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) -if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { - $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; -} -// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME -$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1; -while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { - $i--; $j--; -} -if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { - $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; -} -if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { - $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; -} -// Try main.inc.php using relative path -if (!$res && file_exists("../main.inc.php")) { - $res = @include "../main.inc.php"; -} -if (!$res && file_exists("../../main.inc.php")) { - $res = @include "../../main.inc.php"; -} -if (!$res && file_exists("../../../main.inc.php")) { - $res = @include "../../../main.inc.php"; -} -if (!$res) { - die("Include of main fails"); -} +require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php'; -dol_include_once('/bookcal/class/booking.class.php'); -dol_include_once('/bookcal/lib/bookcal_booking.lib.php'); +require_once DOL_DOCUMENT_ROOT.'/bookcal/class/booking.class.php'; +require_once DOL_DOCUMENT_ROOT.'/bookcal/lib/bookcal_booking.lib.php'; // Load translation files required by the page $langs->loadLangs(array("bookcal@bookcal", "other")); diff --git a/htdocs/bookcal/booking_contact.php b/htdocs/bookcal/booking_contact.php index 923976adb47..bb73368b770 100644 --- a/htdocs/bookcal/booking_contact.php +++ b/htdocs/bookcal/booking_contact.php @@ -23,40 +23,12 @@ */ // Load Dolibarr environment -$res = 0; -// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) -if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { - $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; -} -// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME -$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1; -while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { - $i--; $j--; -} -if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { - $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; -} -if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { - $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; -} -// Try main.inc.php using relative path -if (!$res && file_exists("../main.inc.php")) { - $res = @include "../main.inc.php"; -} -if (!$res && file_exists("../../main.inc.php")) { - $res = @include "../../main.inc.php"; -} -if (!$res && file_exists("../../../main.inc.php")) { - $res = @include "../../../main.inc.php"; -} -if (!$res) { - die("Include of main fails"); -} +require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; -dol_include_once('/bookcal/class/booking.class.php'); -dol_include_once('/bookcal/lib/bookcal_booking.lib.php'); +require_once DOL_DOCUMENT_ROOT.'/bookcal/class/booking.class.php'; +require_once DOL_DOCUMENT_ROOT.'/bookcal/lib/bookcal_booking.lib.php'; // Load translation files required by the page $langs->loadLangs(array("bookcal@bookcal", "companies", "other", "mails")); diff --git a/htdocs/bookcal/booking_document.php b/htdocs/bookcal/booking_document.php index 81342e1a7b6..c102597e189 100644 --- a/htdocs/bookcal/booking_document.php +++ b/htdocs/bookcal/booking_document.php @@ -22,64 +22,15 @@ * \brief Tab for documents linked to Booking */ -//if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); // Do not create database handler $db -//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); // Do not load object $user -//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); // Do not load object $mysoc -//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1'); // Do not load object $langs -//if (! defined('NOSCANGETFORINJECTION')) define('NOSCANGETFORINJECTION', '1'); // Do not check injection attack on GET parameters -//if (! defined('NOSCANPOSTFORINJECTION')) define('NOSCANPOSTFORINJECTION', '1'); // Do not check injection attack on POST parameters -//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK', '1'); // Do not check CSRF attack (test on referer + on token if option MAIN_SECURITY_CSRF_WITH_TOKEN is on). -//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on) -//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK', '1'); // Do not check style html tag into posted data -//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); // If there is no need to load and show top and left menu -//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); // If we don't need to load the html.form.class.php -//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); // Do not load ajax.lib.php library -//if (! defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session). This include the NOIPCHECK too. -//if (! defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip -//if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT', 'auto'); // Force lang to a particular value -//if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler -//if (! defined("NOREDIRECTBYMAINTOLOGIN")) define('NOREDIRECTBYMAINTOLOGIN', 1); // The main.inc.php does not make a redirect if not logged, instead show simple error message -//if (! defined("FORCECSP")) define('FORCECSP', 'none'); // Disable all Content Security Policies -//if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET -//if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification - // Load Dolibarr environment -$res = 0; -// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) -if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { - $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; -} -// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME -$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1; -while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { - $i--; $j--; -} -if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { - $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; -} -if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { - $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; -} -// Try main.inc.php using relative path -if (!$res && file_exists("../main.inc.php")) { - $res = @include "../main.inc.php"; -} -if (!$res && file_exists("../../main.inc.php")) { - $res = @include "../../main.inc.php"; -} -if (!$res && file_exists("../../../main.inc.php")) { - $res = @include "../../../main.inc.php"; -} -if (!$res) { - die("Include of main fails"); -} +require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; -dol_include_once('/bookcal/class/booking.class.php'); -dol_include_once('/bookcal/lib/bookcal_booking.lib.php'); +require_once DOL_DOCUMENT_ROOT.'/bookcal/class/booking.class.php'; +require_once DOL_DOCUMENT_ROOT.'/bookcal/lib/bookcal_booking.lib.php'; // Load translation files required by the page $langs->loadLangs(array("bookcal@bookcal", "companies", "other", "mails")); diff --git a/htdocs/bookcal/booking_list.php b/htdocs/bookcal/booking_list.php index f4aac1e5ed8..c7ebdd6f378 100644 --- a/htdocs/bookcal/booking_list.php +++ b/htdocs/bookcal/booking_list.php @@ -22,58 +22,8 @@ * \brief List page for booking */ -//if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); // Do not create database handler $db -//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); // Do not load object $user -//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); // Do not load object $mysoc -//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1'); // Do not load object $langs -//if (! defined('NOSCANGETFORINJECTION')) define('NOSCANGETFORINJECTION', '1'); // Do not check injection attack on GET parameters -//if (! defined('NOSCANPOSTFORINJECTION')) define('NOSCANPOSTFORINJECTION', '1'); // Do not check injection attack on POST parameters -//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK', '1'); // Do not check CSRF attack (test on referer + on token if option MAIN_SECURITY_CSRF_WITH_TOKEN is on). -//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on) -//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK', '1'); // Do not check style html tag into posted data -//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); // If there is no need to load and show top and left menu -//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); // If we don't need to load the html.form.class.php -//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); // Do not load ajax.lib.php library -//if (! defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session). This include the NOIPCHECK too. -//if (! defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip -//if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT', 'auto'); // Force lang to a particular value -//if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler -//if (! defined("NOREDIRECTBYMAINTOLOGIN")) define('NOREDIRECTBYMAINTOLOGIN', 1); // The main.inc.php does not make a redirect if not logged, instead show simple error message -//if (! defined("FORCECSP")) define('FORCECSP', 'none'); // Disable all Content Security Policies -//if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET -//if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification -//if (! defined('NOSESSION')) define('NOSESSION', '1'); // On CLI mode, no need to use web sessions - // Load Dolibarr environment -$res = 0; -// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) -if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { - $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; -} -// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME -$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1; -while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { - $i--; $j--; -} -if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { - $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; -} -if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { - $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; -} -// Try main.inc.php using relative path -if (!$res && file_exists("../main.inc.php")) { - $res = @include "../main.inc.php"; -} -if (!$res && file_exists("../../main.inc.php")) { - $res = @include "../../main.inc.php"; -} -if (!$res && file_exists("../../../main.inc.php")) { - $res = @include "../../../main.inc.php"; -} -if (!$res) { - die("Include of main fails"); -} +require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; diff --git a/htdocs/bookcal/booking_note.php b/htdocs/bookcal/booking_note.php index f68ffcbd72b..c8b2de4e6ff 100644 --- a/htdocs/bookcal/booking_note.php +++ b/htdocs/bookcal/booking_note.php @@ -22,60 +22,11 @@ * \brief Tab for notes on Booking */ -//if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); // Do not create database handler $db -//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); // Do not load object $user -//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); // Do not load object $mysoc -//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1'); // Do not load object $langs -//if (! defined('NOSCANGETFORINJECTION')) define('NOSCANGETFORINJECTION', '1'); // Do not check injection attack on GET parameters -//if (! defined('NOSCANPOSTFORINJECTION')) define('NOSCANPOSTFORINJECTION', '1'); // Do not check injection attack on POST parameters -//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK', '1'); // Do not check CSRF attack (test on referer + on token if option MAIN_SECURITY_CSRF_WITH_TOKEN is on). -//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on) -//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK', '1'); // Do not check style html tag into posted data -//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); // If there is no need to load and show top and left menu -//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); // If we don't need to load the html.form.class.php -//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); // Do not load ajax.lib.php library -//if (! defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session). This include the NOIPCHECK too. -//if (! defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip -//if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT', 'auto'); // Force lang to a particular value -//if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler -//if (! defined("NOREDIRECTBYMAINTOLOGIN")) define('NOREDIRECTBYMAINTOLOGIN', 1); // The main.inc.php does not make a redirect if not logged, instead show simple error message -//if (! defined("FORCECSP")) define('FORCECSP', 'none'); // Disable all Content Security Policies -//if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET -//if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification - // Load Dolibarr environment -$res = 0; -// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) -if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { - $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; -} -// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME -$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1; -while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { - $i--; $j--; -} -if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { - $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; -} -if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { - $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; -} -// Try main.inc.php using relative path -if (!$res && file_exists("../main.inc.php")) { - $res = @include "../main.inc.php"; -} -if (!$res && file_exists("../../main.inc.php")) { - $res = @include "../../main.inc.php"; -} -if (!$res && file_exists("../../../main.inc.php")) { - $res = @include "../../../main.inc.php"; -} -if (!$res) { - die("Include of main fails"); -} +require '../main.inc.php'; -dol_include_once('/bookcal/class/booking.class.php'); -dol_include_once('/bookcal/lib/bookcal_booking.lib.php'); +require_once DOL_DOCUMENT_ROOT.'/bookcal/class/booking.class.php'; +require_once DOL_DOCUMENT_ROOT.'/bookcal/lib/bookcal_booking.lib.php'; // Load translation files required by the page $langs->loadLangs(array("bookcal@bookcal", "companies")); diff --git a/htdocs/core/modules/modBookCal.class.php b/htdocs/core/modules/modBookCal.class.php index 2703099cf77..c3066dbd2e0 100644 --- a/htdocs/core/modules/modBookCal.class.php +++ b/htdocs/core/modules/modBookCal.class.php @@ -1,7 +1,7 @@ * Copyright (C) 2018-2019 Nicolas ZABOURI - * Copyright (C) 2019-2020 Frédéric France + * Copyright (C) 2019-2022 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 @@ -51,7 +51,7 @@ class modBookCal extends DolibarrModules // Family can be 'base' (core modules),'crm','financial','hr','projects','products','ecm','technic' (transverse modules),'interface' (link with external tools),'other','...' // It is used to group modules by family in module setup page - $this->family = "other"; + $this->family = "projects"; // Module position in the family on 2 digits ('01', '10', '20', ...) $this->module_position = '50'; @@ -68,8 +68,6 @@ class modBookCal extends DolibarrModules // Possible values for version are: 'development', 'experimental', 'dolibarr', 'dolibarr_deprecated' or a version string like 'x.y.z' $this->version = 'development'; - // Url to the file with your last numberversion of this module - //$this->url_last_version = 'http://www.example.com/versionmodule.txt'; // Key used in llx_const table to save module status enabled/disabled (where BOOKCAL is value of property name of module in uppercase) $this->const_name = 'MAIN_MODULE_'.strtoupper($this->name); @@ -140,7 +138,6 @@ class modBookCal extends DolibarrModules // Prerequisites $this->phpmin = array(7, 0); // Minimum version of PHP required by module - $this->need_dolibarr_version = array(17, -3); // Minimum version of Dolibarr required by module // Messages at activation $this->warnings_activation = array(); // Warning to show when we activate module. array('always'='text') or array('FR'='textfr','MX'='textmx'...) From 637fc95265a5dd034b68f15f33bb9df4f7d0283a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20France?= Date: Thu, 22 Dec 2022 22:29:24 +0100 Subject: [PATCH 0276/1128] clean code --- htdocs/adherents/agenda.php | 2 +- htdocs/asset/agenda.php | 2 +- htdocs/asset/model/agenda.php | 2 +- htdocs/bom/bom_agenda.php | 2 +- htdocs/bookcal/availabilities_agenda.php | 2 +- htdocs/bookcal/booking_agenda.php | 2 +- htdocs/contact/agenda.php | 2 +- htdocs/contrat/agenda.php | 2 +- htdocs/hrm/establishment/info.php | 2 +- htdocs/hrm/evaluation_agenda.php | 2 +- htdocs/hrm/job_agenda.php | 2 +- htdocs/hrm/position_agenda.php | 2 +- htdocs/hrm/skill_agenda.php | 2 +- htdocs/knowledgemanagement/knowledgerecord_agenda.php | 2 +- htdocs/modulebuilder/template/myobject_agenda.php | 2 +- htdocs/mrp/mo_agenda.php | 2 +- htdocs/partnership/partnership_agenda.php | 2 +- htdocs/product/agenda.php | 2 +- htdocs/product/stock/stocktransfer/stocktransfer_agenda.php | 2 +- htdocs/projet/agenda.php | 2 +- htdocs/projet/messaging.php | 2 +- htdocs/recruitment/recruitmentcandidature_agenda.php | 2 +- htdocs/recruitment/recruitmentjobposition_agenda.php | 2 +- htdocs/resource/agenda.php | 2 +- htdocs/societe/agenda.php | 2 +- htdocs/societe/messaging.php | 2 +- htdocs/ticket/agenda.php | 2 +- htdocs/ticket/card.php | 2 +- htdocs/ticket/messaging.php | 2 +- htdocs/webhook/target_agenda.php | 2 +- 30 files changed, 30 insertions(+), 30 deletions(-) diff --git a/htdocs/adherents/agenda.php b/htdocs/adherents/agenda.php index e13211fb239..918eaa5d27e 100644 --- a/htdocs/adherents/agenda.php +++ b/htdocs/adherents/agenda.php @@ -64,7 +64,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/asset/agenda.php b/htdocs/asset/agenda.php index b40ed122ec6..f18b29089d5 100644 --- a/htdocs/asset/agenda.php +++ b/htdocs/asset/agenda.php @@ -46,7 +46,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ? GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ? GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/asset/model/agenda.php b/htdocs/asset/model/agenda.php index 17fb19fe565..42706752427 100644 --- a/htdocs/asset/model/agenda.php +++ b/htdocs/asset/model/agenda.php @@ -46,7 +46,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ? GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ? GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/bom/bom_agenda.php b/htdocs/bom/bom_agenda.php index f133d1bbd4b..82f32e61783 100644 --- a/htdocs/bom/bom_agenda.php +++ b/htdocs/bom/bom_agenda.php @@ -49,7 +49,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/bookcal/availabilities_agenda.php b/htdocs/bookcal/availabilities_agenda.php index c3e66a17257..f6d7d6551dd 100644 --- a/htdocs/bookcal/availabilities_agenda.php +++ b/htdocs/bookcal/availabilities_agenda.php @@ -48,7 +48,7 @@ $res = 0; // Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; -} +}getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT') // Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME $tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1; while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { diff --git a/htdocs/bookcal/booking_agenda.php b/htdocs/bookcal/booking_agenda.php index dec1ebee921..5706849ecc9 100644 --- a/htdocs/bookcal/booking_agenda.php +++ b/htdocs/bookcal/booking_agenda.php @@ -48,7 +48,7 @@ $res = 0; // Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; -} +}getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT') // Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME $tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1; while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { diff --git a/htdocs/contact/agenda.php b/htdocs/contact/agenda.php index 29706f48b49..1445a9aa8fe 100644 --- a/htdocs/contact/agenda.php +++ b/htdocs/contact/agenda.php @@ -81,7 +81,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/contrat/agenda.php b/htdocs/contrat/agenda.php index 3a3c5440b30..b05f68d7680 100644 --- a/htdocs/contrat/agenda.php +++ b/htdocs/contrat/agenda.php @@ -41,7 +41,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/hrm/establishment/info.php b/htdocs/hrm/establishment/info.php index 641c53e0f70..3bfbe912279 100644 --- a/htdocs/hrm/establishment/info.php +++ b/htdocs/hrm/establishment/info.php @@ -42,7 +42,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/hrm/evaluation_agenda.php b/htdocs/hrm/evaluation_agenda.php index cc314bd9bce..97f4c5453dc 100644 --- a/htdocs/hrm/evaluation_agenda.php +++ b/htdocs/hrm/evaluation_agenda.php @@ -53,7 +53,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ? GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ? GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/hrm/job_agenda.php b/htdocs/hrm/job_agenda.php index 1da6b4948b1..6aee4d6ed21 100644 --- a/htdocs/hrm/job_agenda.php +++ b/htdocs/hrm/job_agenda.php @@ -52,7 +52,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ? GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ? GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/hrm/position_agenda.php b/htdocs/hrm/position_agenda.php index 846202e26a0..5e52e6a9f81 100644 --- a/htdocs/hrm/position_agenda.php +++ b/htdocs/hrm/position_agenda.php @@ -53,7 +53,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ? GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ? GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/hrm/skill_agenda.php b/htdocs/hrm/skill_agenda.php index a24f3a4caa2..52b56b1507a 100644 --- a/htdocs/hrm/skill_agenda.php +++ b/htdocs/hrm/skill_agenda.php @@ -52,7 +52,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ? GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ? GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/knowledgemanagement/knowledgerecord_agenda.php b/htdocs/knowledgemanagement/knowledgerecord_agenda.php index b293a2dbdd7..48f080b633e 100644 --- a/htdocs/knowledgemanagement/knowledgerecord_agenda.php +++ b/htdocs/knowledgemanagement/knowledgerecord_agenda.php @@ -49,7 +49,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ? GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ? GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/modulebuilder/template/myobject_agenda.php b/htdocs/modulebuilder/template/myobject_agenda.php index d7b84707b95..b7e88450f82 100644 --- a/htdocs/modulebuilder/template/myobject_agenda.php +++ b/htdocs/modulebuilder/template/myobject_agenda.php @@ -95,7 +95,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ? GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ? GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/mrp/mo_agenda.php b/htdocs/mrp/mo_agenda.php index ac944acc066..4203c0f2a19 100644 --- a/htdocs/mrp/mo_agenda.php +++ b/htdocs/mrp/mo_agenda.php @@ -50,7 +50,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/partnership/partnership_agenda.php b/htdocs/partnership/partnership_agenda.php index dd886fc70d7..6f25e5fd921 100644 --- a/htdocs/partnership/partnership_agenda.php +++ b/htdocs/partnership/partnership_agenda.php @@ -49,7 +49,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ? GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ? GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/product/agenda.php b/htdocs/product/agenda.php index c0ecdb2ad0f..3588fd38acc 100644 --- a/htdocs/product/agenda.php +++ b/htdocs/product/agenda.php @@ -43,7 +43,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/product/stock/stocktransfer/stocktransfer_agenda.php b/htdocs/product/stock/stocktransfer/stocktransfer_agenda.php index b62dfa5b00d..0497520a099 100644 --- a/htdocs/product/stock/stocktransfer/stocktransfer_agenda.php +++ b/htdocs/product/stock/stocktransfer/stocktransfer_agenda.php @@ -45,7 +45,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = GETPOST('actioncode', 'array', 3); if (!count($actioncode)) $actioncode = '0'; } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/projet/agenda.php b/htdocs/projet/agenda.php index a3c120d0a23..a7cb672c0ab 100644 --- a/htdocs/projet/agenda.php +++ b/htdocs/projet/agenda.php @@ -59,7 +59,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/projet/messaging.php b/htdocs/projet/messaging.php index 7fe5b4a0b9d..d965d5e30a0 100644 --- a/htdocs/projet/messaging.php +++ b/htdocs/projet/messaging.php @@ -59,7 +59,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/recruitment/recruitmentcandidature_agenda.php b/htdocs/recruitment/recruitmentcandidature_agenda.php index 04118f55572..c99bd98afe0 100644 --- a/htdocs/recruitment/recruitmentcandidature_agenda.php +++ b/htdocs/recruitment/recruitmentcandidature_agenda.php @@ -48,7 +48,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/recruitment/recruitmentjobposition_agenda.php b/htdocs/recruitment/recruitmentjobposition_agenda.php index f2f4d37484b..abfad7bd7e6 100644 --- a/htdocs/recruitment/recruitmentjobposition_agenda.php +++ b/htdocs/recruitment/recruitmentjobposition_agenda.php @@ -47,7 +47,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/resource/agenda.php b/htdocs/resource/agenda.php index 8fddadcce11..a9378cefe1d 100644 --- a/htdocs/resource/agenda.php +++ b/htdocs/resource/agenda.php @@ -51,7 +51,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/societe/agenda.php b/htdocs/societe/agenda.php index 9e6c10a0ccd..fde1ab154a3 100644 --- a/htdocs/societe/agenda.php +++ b/htdocs/societe/agenda.php @@ -43,7 +43,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/societe/messaging.php b/htdocs/societe/messaging.php index c73d6ffe0b1..3f9011cce3f 100644 --- a/htdocs/societe/messaging.php +++ b/htdocs/societe/messaging.php @@ -43,7 +43,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/ticket/agenda.php b/htdocs/ticket/agenda.php index 9111faedcb7..fb92fd44f33 100644 --- a/htdocs/ticket/agenda.php +++ b/htdocs/ticket/agenda.php @@ -68,7 +68,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/ticket/card.php b/htdocs/ticket/card.php index f00d4223878..47f793f71ae 100755 --- a/htdocs/ticket/card.php +++ b/htdocs/ticket/card.php @@ -71,7 +71,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/ticket/messaging.php b/htdocs/ticket/messaging.php index bd06bd32e94..ee919d99314 100644 --- a/htdocs/ticket/messaging.php +++ b/htdocs/ticket/messaging.php @@ -68,7 +68,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); diff --git a/htdocs/webhook/target_agenda.php b/htdocs/webhook/target_agenda.php index 17b9842c238..74c895a813a 100644 --- a/htdocs/webhook/target_agenda.php +++ b/htdocs/webhook/target_agenda.php @@ -46,7 +46,7 @@ if (GETPOST('actioncode', 'array')) { $actioncode = '0'; } } else { - $actioncode = GETPOST("actioncode", "alpha", 3) ? GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); + $actioncode = GETPOST("actioncode", "alpha", 3) ? GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT')); } $search_agenda_label = GETPOST('search_agenda_label'); From 328b62eeb4dc4e35aa50209a2a3b4a6c0139c792 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20France?= Date: Thu, 22 Dec 2022 22:31:03 +0100 Subject: [PATCH 0277/1128] clean code --- htdocs/bookcal/availabilities_agenda.php | 2 +- htdocs/bookcal/booking_agenda.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/bookcal/availabilities_agenda.php b/htdocs/bookcal/availabilities_agenda.php index f6d7d6551dd..c3e66a17257 100644 --- a/htdocs/bookcal/availabilities_agenda.php +++ b/htdocs/bookcal/availabilities_agenda.php @@ -48,7 +48,7 @@ $res = 0; // Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; -}getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT') +} // Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME $tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1; while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { diff --git a/htdocs/bookcal/booking_agenda.php b/htdocs/bookcal/booking_agenda.php index 5706849ecc9..dec1ebee921 100644 --- a/htdocs/bookcal/booking_agenda.php +++ b/htdocs/bookcal/booking_agenda.php @@ -48,7 +48,7 @@ $res = 0; // Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; -}getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT') +} // Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME $tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1; while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { From ddc7e769618da9189f590472531fa87e26b2c66f Mon Sep 17 00:00:00 2001 From: Randall Mora <50120822+randallmoraes@users.noreply.github.com> Date: Thu, 22 Dec 2022 17:45:13 -0600 Subject: [PATCH 0278/1128] Update assets.lang additional translations --- htdocs/langs/es_ES/assets.lang | 183 +++++++++++++++++++++++++++------ 1 file changed, 151 insertions(+), 32 deletions(-) diff --git a/htdocs/langs/es_ES/assets.lang b/htdocs/langs/es_ES/assets.lang index 99b1a479095..a3eb7fd150d 100644 --- a/htdocs/langs/es_ES/assets.lang +++ b/htdocs/langs/es_ES/assets.lang @@ -1,4 +1,4 @@ -# Copyright (C) 2018 Alexandre Spangaro +# Copyright (C) 2018-2022 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 @@ -16,52 +16,171 @@ # # Generic # -Assets = Activos -NewAsset = Nuevo activo -AccountancyCodeAsset = Código contable (activo) -AccountancyCodeDepreciationAsset = Código contable (cuenta depreciación activo) -AccountancyCodeDepreciationExpense = Código contable (cuenta depreciación gastos) -NewAssetType=Nuevo tipo de activo -AssetsTypeSetup=Configuración tipos de activos -AssetTypeModified=Tipo de activo modificado -AssetType=Tipo de activo +NewAsset=Nuevo activo +AccountancyCodeAsset=Código contable (activo) +AccountancyCodeDepreciationAsset=Código de contabilidad (cuenta de activo de depreciación) +AccountancyCodeDepreciationExpense=Código contable (cuenta de gastos de depreciación) AssetsLines=Activos DeleteType=Eliminar -DeleteAnAssetType=Eliminar un tipo de activo -ConfirmDeleteAssetType=¿Está seguro de querer eliminar este tipo de activo? -ShowTypeCard=Ver tipo '%s' +DeleteAnAssetType=Eliminar un modelo de activo +ConfirmDeleteAssetType=¿Está seguro de que desea eliminar este modelo de activos? +ShowTypeCard=Mostrar modelo '%s' # Module label 'ModuleAssetsName' -ModuleAssetsName = Activos +ModuleAssetsName=Activos # Module description 'ModuleAssetsDesc' -ModuleAssetsDesc = Descripción bien +ModuleAssetsDesc=Descripción de los activos # # Admin page # -AssetsSetup = Configuración activos -Settings = Configuraciones -AssetsSetupPage = Configuración activos -ExtraFieldsAssetsType = Campos adicionales (tipos de activos) -AssetsType=Tipo de activo -AssetsTypeId=Id tipo de activo -AssetsTypeLabel=Etiqueta tipo de activo -AssetsTypes=Tipos de activos +AssetSetup=Configuración de activos +AssetSetupPage=Página de configuración de activos +ExtraFieldsAssetModel=Atributos complementarios (Modelo de activos) + +AssetsType=Modelo de activos +AssetsTypeId=Id. de modelo de activo +AssetsTypeLabel=Etiqueta del modelo de activos +AssetsTypes=Modelos de activos +ASSET_ACCOUNTANCY_CATEGORY=Grupo de contabilidad de activos fijos # # Menu # -MenuAssets = Activos -MenuNewAsset = Nuevo bien -MenuTypeAssets = Tipo de activos -MenuListAssets = Listado -MenuNewTypeAssets = Nuevo -MenuListTypeAssets = Listado +MenuAssets=Activos +MenuNewAsset=Nuevo activo +MenuAssetModels=Activos del modelo +MenuListAssets=Lista +MenuNewAssetModel=Modelo del nuevo activo +MenuListAssetModels=Lista # # Module # +ConfirmDeleteAsset=¿Realmente desea eliminar este recurso? + +# +# Tab +# +AssetDepreciationOptions=Opciones de depreciación +AssetAccountancyCodes=Cuentas contables +AssetDepreciation=Depreciación + +# +# Asset +# Asset=Activo -NewAssetType=Nuevo tipo de activo -NewAsset=Nuevo activo -ConfirmDeleteAsset=¿Está seguro de que desea eliminar este activo? +Assets=Activos +AssetReversalAmountHT=Cantidad de inversión (sin impuestos) +AssetAcquisitionValueHT=Importe de la adquisición (sin impuestos) +AssetRecoveredVAT=IVA recuperado +AssetReversalDate=Fecha de reversión +AssetDateAcquisition=Fecha de adquisición +AssetDateStart=Fecha de puesta en marcha +AssetAcquisitionType=Tipo de adquisición +AssetAcquisitionTypeNew=Nuevo +AssetAcquisitionTypeOccasion=Usado +AssetType=Tipo de activo +AssetTypeIntangible=Intangible +AssetTypeTangible=Tangible +AssetTypeInProgress=En progreso +AssetTypeFinancial=Financiero +AssetNotDepreciated=No depreciado +AssetDisposal=Disposición +AssetConfirmDisposalAsk=¿Está seguro de que desea deshacerse del activo %s? +AssetConfirmReOpenAsk=¿Está seguro de que desea reabrir el recurso %s? + +# +# Asset status +# +AssetInProgress=En progreso +AssetDisposed=Disposed +AssetRecorded=Contabilizado + +# +# Asset disposal +# +AssetDisposalDate=Fecha de eliminación +AssetDisposalAmount=Valor de enajenación +AssetDisposalType=Tipo de eliminación +AssetDisposalDepreciated=Depreciar el año de la transferencia +AssetDisposalSubjectToVat=Enajenación sujeta a IVA + +# +# Asset model +# +AssetModel=Modelo del activo +AssetModels=Modelos de activos + +# +# Asset depreciation options +# +AssetDepreciationOptionEconomic=Depreciación económica +AssetDepreciationOptionAcceleratedDepreciation=Depreciación acelerada (impuestos) +AssetDepreciationOptionDepreciationType=Tipo de depreciación +AssetDepreciationOptionDepreciationTypeLinear=Lineal +AssetDepreciationOptionDepreciationTypeDegressive=Degresivo +AssetDepreciationOptionDepreciationTypeExceptional=Excepcional +AssetDepreciationOptionDegressiveRate=Tasa decreciente +AssetDepreciationOptionAcceleratedDepreciation=Acelerado (impuesto) +AssetDepreciationOptionDuration=Duración +AssetDepreciationOptionDurationType=Tipo de duración +AssetDepreciationOptionDurationTypeAnnual=Anual +AssetDepreciationOptionDurationTypeMonthly=Mensual +AssetDepreciationOptionDurationTypeDaily=Diario +AssetDepreciationOptionRate=Tasa (%%) +AssetDepreciationOptionAmountBaseDepreciationHT=Base de amortización (sin IVA) +AssetDepreciationOptionAmountBaseDeductibleHT=Base deducible (sin IVA) +AssetDepreciationOptionTotalAmountLastDepreciationHT=Cantidad total de la última depreciación (sin IVA) + +# +# Asset accountancy codes +# +AssetAccountancyCodeDepreciationEconomic=Depreciación económica +AssetAccountancyCodeAsset=Activo +AssetAccountancyCodeDepreciationAsset=Depreciación +AssetAccountancyCodeDepreciationExpense=Gastos de depreciación +AssetAccountancyCodeValueAssetSold=Valor del activo enajenado +AssetAccountancyCodeReceivableOnAssignment=Cuenta por cobrar por enajenación +AssetAccountancyCodeProceedsFromSales=Productos de la eliminación +AssetAccountancyCodeVatCollected=IVA cobrado +AssetAccountancyCodeVatDeductible=IVA recuperado en activos +AssetAccountancyCodeDepreciationAcceleratedDepreciation=Depreciación acelerada (impuestos) +AssetAccountancyCodeAcceleratedDepreciation=Cuenta +AssetAccountancyCodeEndowmentAcceleratedDepreciation=Gastos de depreciación +AssetAccountancyCodeProvisionAcceleratedDepreciation=Reposesión/Provisión + +# +# Asset depreciation +# +AssetBaseDepreciationHT=Deprbase de liquidación (excl. IVA) +AssetDepreciationBeginDate=Inicio de depreciación el +AssetDepreciationDuration=Duración +AssetDepreciationRate=Tasa (%%) +AssetDepreciationDate=Fecha de depreciación +AssetDepreciationHT=Depreciación (sin IVA) +AssetCumulativeDepreciationHT=Depreciación acumulada (sin IVA) +AssetResidualHT=Valor residual (sin IVA) +AssetDispatchedInBookkeeping=Depreciación registrada +AssetFutureDepreciationLine=Depreciación futura +AssetDepreciationReversal=Reversión + +# +# Errors +# +AssetErrorAssetOrAssetModelIDNotProvide=No se proporcionó la identificación del recurso o el sonido del modelo +AssetErrorFetchAccountancyCodesForMode=Error al recuperar las cuentas contables para el modo de depreciación '%s' +AssetErrorDeleteAccountancyCodesForMode=Error al eliminar cuentas contables del modo de depreciación '%s' +AssetErrorInsertAccountancyCodesForMode=Error al insertar las cuentas contables del modo de depreciación '%s' +AssetErrorFetchDepreciationOptionsForMode=Error al recuperar opciones para el modo de depreciación '%s' +AssetErrorDeleteDepreciationOptionsForMode=Error al eliminar las opciones del modo de depreciación '%s' +AssetErrorInsertDepreciationOptionsForMode=Error al insertar las opciones del modo de depreciación '%s' +AssetErrorFetchDepreciationLines=Error al recuperar líneas de depreciación registradas +AssetErrorClearDepreciationLines=Error al purgar líneas de depreciación registradas (reversión y futuro) +AssetErrorAddDepreciationLine=Error al agregar una línea de depreciación +AssetErrorCalculationDepreciationLines=Error al calcular las líneas de depreciación (recuperación y futuro) +AssetErrorReversalDateNotProvidedForMode=No se proporciona la fecha de reversión para el método de depreciación '%s' +AssetErrorReversalDateNotGreaterThanCurrentBeginFiscalDateForMode=La fecha de reversión debe ser mayor o igual que el comienzo del año fiscal actual para el método de depreciación '%s' +AssetErrorReversalAmountNotProvidedForMode=No se proporciona el importe de reversión para el modo de depreciación '%s'. +AssetErrorFetchCumulativeDepreciation=Error al recuperar la cantidad de depreciación acumulada de la línea de depreciación +AssetErrorSetLastCumulativeDepreciation=Error al registrar el último monto de depreciación acumulada From 6edea2fe434a15194bec70d9d95739ddf9bceec5 Mon Sep 17 00:00:00 2001 From: Eric Seigne Date: Fri, 23 Dec 2022 07:58:25 +0100 Subject: [PATCH 0279/1128] remove amount from llx_facture (sql migration) --- htdocs/install/mysql/migration/17.0.0-18.0.0.sql | 3 +++ 1 file changed, 3 insertions(+) diff --git a/htdocs/install/mysql/migration/17.0.0-18.0.0.sql b/htdocs/install/mysql/migration/17.0.0-18.0.0.sql index 6bded10bec6..946dfe91b20 100644 --- a/htdocs/install/mysql/migration/17.0.0-18.0.0.sql +++ b/htdocs/install/mysql/migration/17.0.0-18.0.0.sql @@ -34,3 +34,6 @@ -- v18 insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROJECT_CLOSE','Project closed','Executed when a project is closed','project',145); + +-- amount was removed in v12 +ALTER TABLE llx_facture DROP COLUMN amount; From 298c97d5a65a0c1512d1b5ab44cbea3320db2c90 Mon Sep 17 00:00:00 2001 From: VESSILLER Date: Fri, 23 Dec 2022 12:43:26 +0100 Subject: [PATCH 0280/1128] NEW copyrights --- htdocs/accountancy/bookkeeping/list.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php index 781b20edc2e..bdd0fefe191 100644 --- a/htdocs/accountancy/bookkeeping/list.php +++ b/htdocs/accountancy/bookkeeping/list.php @@ -1,7 +1,8 @@ * Copyright (C) 2013-2016 Florian Henry - * Copyright (C) 2013-2022 Open-DSI + * Copyright (C) 2013-2022 Alexandre Spangaro + * Copyright (C) 2022 Lionel Vessiller * Copyright (C) 2016-2017 Laurent Destailleur * Copyright (C) 2018-2021 Frédéric France * Copyright (C) 2022 Progiseize From 0d56ef8c1d330569d7814419374552352dab2329 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Fri, 23 Dec 2022 14:02:23 +0100 Subject: [PATCH 0281/1128] fix code --- htdocs/admin/stock.php | 2 +- htdocs/bookcal/class/availabilities.class.php | 2 +- htdocs/bookcal/class/booking.class.php | 2 +- htdocs/compta/facture/card.php | 2 +- htdocs/core/lib/propal.lib.php | 2 +- htdocs/delivery/card.php | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/admin/stock.php b/htdocs/admin/stock.php index 1d73f5238ad..7a7e49a3129 100644 --- a/htdocs/admin/stock.php +++ b/htdocs/admin/stock.php @@ -247,7 +247,7 @@ if (isModEnabled('commande')) { print "\n\n"; $found++; -//if (!empty($conf->expedition->enabled)) +//if (isModEnabled('expedition')) //{ print ''; diff --git a/htdocs/bookcal/class/availabilities.class.php b/htdocs/bookcal/class/availabilities.class.php index cfbfc8eed88..3ccc4542670 100644 --- a/htdocs/bookcal/class/availabilities.class.php +++ b/htdocs/bookcal/class/availabilities.class.php @@ -74,7 +74,7 @@ class Availabilities extends CommonObject * Note: Filter can be a string like "(t.ref:like:'SO-%') or (t.date_creation:<:'20160101') or (t.nature:is:NULL)" * 'label' the translation key. * 'picto' is code of a picto to show before value in forms - * 'enabled' is a condition when the field must be managed (Example: 1 or '$conf->global->MY_SETUP_PARAM' or '!empty($conf->multicurrency->enabled)' ...) + * 'enabled' is a condition when the field must be managed (Example: 1 or '$conf->global->MY_SETUP_PARAM' or 'isModEnabled('multicurrency')' ...) * 'position' is the sort order of field. * 'notnull' is set to 1 if not null in database. Set to -1 if we must set data to null if empty ('' or 0). * 'visible' says if field is visible in list (Examples: 0=Not visible, 1=Visible on list and create/update/view forms, 2=Visible on list only, 3=Visible on create/update/view form only (not list), 4=Visible on list and update/view form only (not create). 5=Visible on list and view only (not create/not update). Using a negative value means field is not shown by default on list but can be selected for viewing) diff --git a/htdocs/bookcal/class/booking.class.php b/htdocs/bookcal/class/booking.class.php index a74cb87a43d..98cb5077844 100644 --- a/htdocs/bookcal/class/booking.class.php +++ b/htdocs/bookcal/class/booking.class.php @@ -74,7 +74,7 @@ class Booking extends CommonObject * Note: Filter can be a string like "(t.ref:like:'SO-%') or (t.date_creation:<:'20160101') or (t.nature:is:NULL)" * 'label' the translation key. * 'picto' is code of a picto to show before value in forms - * 'enabled' is a condition when the field must be managed (Example: 1 or '$conf->global->MY_SETUP_PARAM' or '!empty($conf->multicurrency->enabled)' ...) + * 'enabled' is a condition when the field must be managed (Example: 1 or '$conf->global->MY_SETUP_PARAM' or 'isModEnabled('multicurrency')' ...) * 'position' is the sort order of field. * 'notnull' is set to 1 if not null in database. Set to -1 if we must set data to null if empty ('' or 0). * 'visible' says if field is visible in list (Examples: 0=Not visible, 1=Visible on list and create/update/view forms, 2=Visible on list only, 3=Visible on create/update/view form only (not list), 4=Visible on list and update/view form only (not create). 5=Visible on list and view only (not create/not update). Using a negative value means field is not shown by default on list but can be selected for viewing) diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index 36c98a495ec..9d221411d9c 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -3066,7 +3066,7 @@ if ($action == 'create') { $remise_percent = (!empty($expesrc->remise_percent) ? $expesrc->remise_percent : (!empty($soc->remise_percent) ? $soc->remise_percent : 0)); $remise_absolue = (!empty($expesrc->remise_absolue) ? $expesrc->remise_absolue : (!empty($soc->remise_absolue) ? $soc->remise_absolue : 0)); - if (!empty($conf->multicurrency->enabled)) { + if (isModEnabled('multicurrency')) { $currency_code = (!empty($expesrc->currency_code) ? $expesrc->currency_code : (!empty($soc->currency_code) ? $soc->currency_code : $objectsrc->multicurrency_code)); $currency_tx = (!empty($expesrc->currency_tx) ? $expesrc->currency_tx : (!empty($soc->currency_tx) ? $soc->currency_tx : $objectsrc->currency_tx)); } diff --git a/htdocs/core/lib/propal.lib.php b/htdocs/core/lib/propal.lib.php index 9d1401ea47a..3d380a3904a 100644 --- a/htdocs/core/lib/propal.lib.php +++ b/htdocs/core/lib/propal.lib.php @@ -42,7 +42,7 @@ function propal_prepare_head($object) $head[$h][2] = 'comm'; $h++; - if ((empty($conf->commande->enabled) && ((isModEnabled("expedition") && !empty($conf->expedition_bon->enabled) && $user->rights->expedition->lire) + if ((empty($conf->commande->enabled) && ((isModEnabled("expedition") && isModEnabled('expedition_bon') && $user->rights->expedition->lire) || (isModEnabled("expedition") && !empty($conf->delivery_note->enabled) && $user->rights->expedition->delivery->lire)))) { $langs->load("sendings"); $text = ''; diff --git a/htdocs/delivery/card.php b/htdocs/delivery/card.php index b98b75015ab..3a269cc89bb 100644 --- a/htdocs/delivery/card.php +++ b/htdocs/delivery/card.php @@ -38,7 +38,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; if (isModEnabled("product") || isModEnabled("service")) { require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; } -if (!empty($conf->expedition_bon->enabled)) { +if (isModEnabled('expedition_bon')) { require_once DOL_DOCUMENT_ROOT.'/expedition/class/expedition.class.php'; } if (isModEnabled('stock')) { From 669c8d10f43a7f5fb0482b109a7b2d0788a3a6d7 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Fri, 23 Dec 2022 14:10:39 +0100 Subject: [PATCH 0282/1128] fix path and traduction --- .../core/modules/supplier_proposal/doc/pdf_aurore.modules.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php b/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php index 9918616714d..693cf8eac67 100644 --- a/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php +++ b/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php @@ -22,9 +22,9 @@ */ /** - * \file htdocs/core/modules/propale/doc/pdf_azur.modules.php + * \file htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php * \ingroup propale - * \brief File of the class allowing to generate the supplier propals to the Aurore model + * \brief File of the class allowing to generate the supplier proposals to the Aurore model */ require_once DOL_DOCUMENT_ROOT.'/core/modules/supplier_proposal/modules_supplier_proposal.php'; require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; From a08d84b995fa0291f1f220bd14d213b7ea8cd550 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Fri, 23 Dec 2022 14:11:13 +0100 Subject: [PATCH 0283/1128] fix code --- htdocs/asset/agenda.php | 2 +- htdocs/asset/model/agenda.php | 2 +- htdocs/bom/bom_agenda.php | 2 +- htdocs/bookcal/availabilities_agenda.php | 2 +- htdocs/bookcal/booking_agenda.php | 2 +- htdocs/comm/action/card.php | 10 +++++----- htdocs/comm/action/class/api_agendaevents.class.php | 4 ++-- htdocs/comm/action/document.php | 4 ++-- htdocs/comm/action/index.php | 8 ++++---- htdocs/comm/action/info.php | 2 +- htdocs/comm/action/list.php | 2 +- htdocs/comm/action/pertype.php | 2 +- htdocs/comm/action/peruser.php | 2 +- htdocs/contact/agenda.php | 2 +- htdocs/contrat/agenda.php | 2 +- htdocs/core/lib/functions.lib.php | 2 +- htdocs/core/modules/modAgenda.class.php | 2 +- htdocs/fourn/commande/info.php | 2 +- htdocs/hrm/evaluation_agenda.php | 2 +- htdocs/hrm/job_agenda.php | 2 +- htdocs/hrm/position_agenda.php | 2 +- htdocs/hrm/skill_agenda.php | 2 +- htdocs/knowledgemanagement/knowledgerecord_agenda.php | 2 +- htdocs/modulebuilder/template/myobject_agenda.php | 2 +- htdocs/mrp/mo_agenda.php | 2 +- htdocs/partnership/partnership_agenda.php | 2 +- htdocs/product/agenda.php | 2 +- htdocs/product/list.php | 2 +- .../stock/stocktransfer/stocktransfer_agenda.php | 2 +- htdocs/projet/agenda.php | 2 +- htdocs/projet/messaging.php | 2 +- htdocs/recruitment/recruitmentcandidature_agenda.php | 2 +- htdocs/recruitment/recruitmentjobposition_agenda.php | 2 +- htdocs/societe/agenda.php | 2 +- htdocs/societe/messaging.php | 2 +- htdocs/webhook/target_agenda.php | 2 +- htdocs/workstation/workstation_agenda.php | 2 +- 37 files changed, 46 insertions(+), 46 deletions(-) diff --git a/htdocs/asset/agenda.php b/htdocs/asset/agenda.php index f18b29089d5..f955594a5b0 100644 --- a/htdocs/asset/agenda.php +++ b/htdocs/asset/agenda.php @@ -181,7 +181,7 @@ if ($object->id > 0) { print '
'; if (isModEnabled('agenda')) { - if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) { + if (!empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create')) { print '' . $langs->trans("AddAction") . ''; } else { print '' . $langs->trans("AddAction") . ''; diff --git a/htdocs/asset/model/agenda.php b/htdocs/asset/model/agenda.php index 42706752427..dfc69dc3fa5 100644 --- a/htdocs/asset/model/agenda.php +++ b/htdocs/asset/model/agenda.php @@ -183,7 +183,7 @@ if ($object->id > 0) { print '
'; // if (isModEnabled('agenda')) { - // if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) { + // if (!empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create')) { // print '' . $langs->trans("AddAction") . ''; // } else { // print '' . $langs->trans("AddAction") . ''; diff --git a/htdocs/bom/bom_agenda.php b/htdocs/bom/bom_agenda.php index 82f32e61783..3e06526f60f 100644 --- a/htdocs/bom/bom_agenda.php +++ b/htdocs/bom/bom_agenda.php @@ -225,7 +225,7 @@ if ($object->id > 0) { print '
'; if (isModEnabled('agenda')) { - if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) { + if (!empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create')) { print ''.$langs->trans("AddAction").''; } else { print ''.$langs->trans("AddAction").''; diff --git a/htdocs/bookcal/availabilities_agenda.php b/htdocs/bookcal/availabilities_agenda.php index c3e66a17257..4bea892ae7e 100644 --- a/htdocs/bookcal/availabilities_agenda.php +++ b/htdocs/bookcal/availabilities_agenda.php @@ -280,7 +280,7 @@ if ($object->id > 0) { print '
'; if (isModEnabled('agenda')) { - if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) { + if (!empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create')) { print ''.$langs->trans("AddAction").''; } else { print ''.$langs->trans("AddAction").''; diff --git a/htdocs/bookcal/booking_agenda.php b/htdocs/bookcal/booking_agenda.php index dec1ebee921..7b65b510103 100644 --- a/htdocs/bookcal/booking_agenda.php +++ b/htdocs/bookcal/booking_agenda.php @@ -280,7 +280,7 @@ if ($object->id > 0) { print '
'; if (isModEnabled('agenda')) { - if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) { + if (!empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create')) { print ''.$langs->trans("AddAction").''; } else { print ''.$langs->trans("AddAction").''; diff --git a/htdocs/comm/action/card.php b/htdocs/comm/action/card.php index 11b8330b64c..f0399fa6350 100644 --- a/htdocs/comm/action/card.php +++ b/htdocs/comm/action/card.php @@ -159,7 +159,7 @@ if ($user->socid && $socid) { $result = restrictedArea($user, 'societe', $socid); } -$usercancreate = $user->rights->agenda->allactions->create || (($object->authorid == $user->id || $object->userownerid == $user->id) && $user->rights->agenda->myactions->create); +$usercancreate = $user->hasRight('agenda', 'allactions', 'create') || (($object->authorid == $user->id || $object->userownerid == $user->id) && $user->rights->agenda->myactions->create); /* @@ -218,7 +218,7 @@ if (empty($reshook) && (GETPOST('addassignedtouser') || GETPOST('updateassignedt } // Link to a project -if (empty($reshook) && $action == 'classin' && ($user->rights->agenda->allactions->create || +if (empty($reshook) && $action == 'classin' && ($user->hasRight('agenda', 'allactions', 'create') || (($object->authorid == $user->id || $object->userownerid == $user->id) && $user->rights->agenda->myactions->create))) { //$object->fetch($id); $object->setProject(GETPOST('projectid', 'int')); @@ -1093,7 +1093,7 @@ if (empty($reshook) && GETPOST('actionmove', 'alpha') == 'mupdate') { // Actions to delete doc $upload_dir = $conf->agenda->dir_output.'/'.dol_sanitizeFileName($object->ref); -$permissiontoadd = ($user->rights->agenda->allactions->create || (($object->authorid == $user->id || $object->userownerid == $user->id) && $user->rights->agenda->myactions->read)); +$permissiontoadd = ($user->hasRight('agenda', 'allactions', 'create') || (($object->authorid == $user->id || $object->userownerid == $user->id) && $user->rights->agenda->myactions->read)); if (empty($reshook)) { include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php'; } @@ -2466,14 +2466,14 @@ if ($id > 0) { $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook if (empty($reshook)) { if ($action != 'edit') { - if ($user->rights->agenda->allactions->create || + if ($user->hasRight('agenda', 'allactions', 'create') || (($object->authorid == $user->id || $object->userownerid == $user->id) && $user->rights->agenda->myactions->create)) { print ''; } else { print ''; } - if ($user->rights->agenda->allactions->create || + if ($user->hasRight('agenda', 'allactions', 'create') || (($object->authorid == $user->id || $object->userownerid == $user->id) && $user->rights->agenda->myactions->create)) { print ''; } else { diff --git a/htdocs/comm/action/class/api_agendaevents.class.php b/htdocs/comm/action/class/api_agendaevents.class.php index 8c13709b250..c0accf82866 100644 --- a/htdocs/comm/action/class/api_agendaevents.class.php +++ b/htdocs/comm/action/class/api_agendaevents.class.php @@ -210,7 +210,7 @@ class AgendaEvents extends DolibarrApi if (!DolibarrApiAccess::$user->rights->agenda->myactions->create) { throw new RestException(401, "Insufficient rights to create your Agenda Event"); } - if (!DolibarrApiAccess::$user->rights->agenda->allactions->create && DolibarrApiAccess::$user->id != $request_data['userownerid']) { + if (!DolibarrApiAccess::$user->hasRight('agenda', 'allactions', 'create') && DolibarrApiAccess::$user->id != $request_data['userownerid']) { throw new RestException(401, "Insufficient rights to create an Agenda Event for owner id ".$request_data['userownerid'].' Your id is '.DolibarrApiAccess::$user->id); } @@ -249,7 +249,7 @@ class AgendaEvents extends DolibarrApi if (!DolibarrApiAccess::$user->rights->agenda->myactions->create) { throw new RestException(401, "Insufficient rights to create your Agenda Event"); } - if (!DolibarrApiAccess::$user->rights->agenda->allactions->create && DolibarrApiAccess::$user->id != $request_data['userownerid']) { + if (!DolibarrApiAccess::$user->hasRight('agenda', 'allactions', 'create') && DolibarrApiAccess::$user->id != $request_data['userownerid']) { throw new RestException(401, "Insufficient rights to create an Agenda Event for owner id ".$request_data['userownerid'].' Your id is '.DolibarrApiAccess::$user->id); } diff --git a/htdocs/comm/action/document.php b/htdocs/comm/action/document.php index 82cc7584c07..c37920f0d99 100644 --- a/htdocs/comm/action/document.php +++ b/htdocs/comm/action/document.php @@ -92,7 +92,7 @@ if ($user->socid && $socid) { $result = restrictedArea($user, 'societe', $socid); } -$usercancreate = $user->rights->agenda->allactions->create || (($object->authorid == $user->id || $object->userownerid == $user->id) && $user->rights->agenda->myactions->create); +$usercancreate = $user->hasRight('agenda', 'allactions', 'create') || (($object->authorid == $user->id || $object->userownerid == $user->id) && $user->rights->agenda->myactions->create); $permissiontoadd = $usercancreate; @@ -305,7 +305,7 @@ if ($object->id > 0) { $modulepart = 'actions'; - $permissiontoadd = $user->rights->agenda->myactions->create || $user->rights->agenda->allactions->create; + $permissiontoadd = $user->rights->agenda->myactions->create || $user->hasRight('agenda', 'allactions', 'create'); $param = '&id='.$object->id; include DOL_DOCUMENT_ROOT.'/core/tpl/document_actions_post_headers.tpl.php'; } else { diff --git a/htdocs/comm/action/index.php b/htdocs/comm/action/index.php index ab814957e5b..5b51d48392b 100644 --- a/htdocs/comm/action/index.php +++ b/htdocs/comm/action/index.php @@ -540,7 +540,7 @@ $viewmode .= ''; // To add a space before t $newcardbutton = ''; $newparam = ''; -if ($user->rights->agenda->myactions->create || $user->rights->agenda->allactions->create) { +if ($user->rights->agenda->myactions->create || $user->hasRight('agenda', 'allactions', 'create')) { $tmpforcreatebutton = dol_getdate(dol_now(), true); $newparam .= '&month='.((int) $month).'&year='.((int) $tmpforcreatebutton['year']).'&mode='.urlencode($mode); @@ -1703,7 +1703,7 @@ function show_day_events($db, $day, $month, $year, $monthshown, $style, &$eventa $curtime = dol_mktime(0, 0, 0, $month, $day, $year); $urltoshow = DOL_URL_ROOT.'/comm/action/index.php?mode=show_day&day='.str_pad($day, 2, "0", STR_PAD_LEFT).'&month='.str_pad($month, 2, "0", STR_PAD_LEFT).'&year='.$year.$newparam; $urltocreate = ''; - if ($user->rights->agenda->myactions->create || $user->rights->agenda->allactions->create) { + if ($user->rights->agenda->myactions->create || $user->hasRight('agenda', 'allactions', 'create')) { $newparam .= '&month='.str_pad($month, 2, "0", STR_PAD_LEFT).'&year='.$year; $hourminsec = '100000'; $urltocreate = DOL_URL_ROOT.'/comm/action/card.php?action=create&datep='.sprintf("%04d%02d%02d", $year, $month, $day).$hourminsec.'&backtopage='.urlencode($_SERVER["PHP_SELF"].($newparam ? '?'.$newparam : '')); @@ -1722,7 +1722,7 @@ function show_day_events($db, $day, $month, $year, $monthshown, $style, &$eventa } print ''; print '
'; - if ($user->rights->agenda->myactions->create || $user->rights->agenda->allactions->create) { + if ($user->rights->agenda->myactions->create || $user->hasRight('agenda', 'allactions', 'create')) { print ''; // Explicit link, usefull for nojs interfaces print img_picto($langs->trans("NewAction"), 'edit_add.png'); print ''; @@ -1849,7 +1849,7 @@ function show_day_events($db, $day, $month, $year, $monthshown, $style, &$eventa $cssclass .= ' movable cursormove'; } } else { - if ($user->rights->agenda->allactions->create || + if ($user->hasRight('agenda', 'allactions', 'create') || (($event->authorid == $user->id || $event->userownerid == $user->id) && $user->rights->agenda->myactions->create)) { $cssclass .= " movable cursormove"; } else { diff --git a/htdocs/comm/action/info.php b/htdocs/comm/action/info.php index d4588223b26..21651bb7446 100644 --- a/htdocs/comm/action/info.php +++ b/htdocs/comm/action/info.php @@ -53,7 +53,7 @@ if ($user->socid && $socid) { $result = restrictedArea($user, 'societe', $socid); } -$usercancreate = $user->rights->agenda->allactions->create || (($object->authorid == $user->id || $object->userownerid == $user->id) && $user->rights->agenda->myactions->create); +$usercancreate = $user->hasRight('agenda', 'allactions', 'create') || (($object->authorid == $user->id || $object->userownerid == $user->id) && $user->rights->agenda->myactions->create); /* diff --git a/htdocs/comm/action/list.php b/htdocs/comm/action/list.php index 5eb538d4e62..4be3195561e 100644 --- a/htdocs/comm/action/list.php +++ b/htdocs/comm/action/list.php @@ -700,7 +700,7 @@ $url = DOL_URL_ROOT.'/comm/action/card.php?action=create'; $url .= '&datep='.sprintf("%04d%02d%02d", $tmpforcreatebutton['year'], $tmpforcreatebutton['mon'], $tmpforcreatebutton['mday']).$hourminsec; $url .= '&backtopage='.urlencode($_SERVER["PHP_SELF"].($newparam ? '?'.$newparam : '')); -$newcardbutton = dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', $url, '', $user->rights->agenda->myactions->create || $user->rights->agenda->allactions->create); +$newcardbutton = dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', $url, '', $user->rights->agenda->myactions->create || $user->hasRight('agenda', 'allactions', 'create')); $param .= '&mode='.$mode; diff --git a/htdocs/comm/action/pertype.php b/htdocs/comm/action/pertype.php index 61092df5665..ce33d0f40b2 100644 --- a/htdocs/comm/action/pertype.php +++ b/htdocs/comm/action/pertype.php @@ -479,7 +479,7 @@ if (empty($reshook)) { $newcardbutton = ''; -if ($user->rights->agenda->myactions->create || $user->rights->agenda->allactions->create) { +if ($user->rights->agenda->myactions->create || $user->hasRight('agenda', 'allactions', 'create')) { $tmpforcreatebutton = dol_getdate(dol_now(), true); $newparam .= '&month='.str_pad($month, 2, "0", STR_PAD_LEFT).'&year='.$tmpforcreatebutton['year']; diff --git a/htdocs/comm/action/peruser.php b/htdocs/comm/action/peruser.php index 5c5ef948c30..bd35fc16e7d 100644 --- a/htdocs/comm/action/peruser.php +++ b/htdocs/comm/action/peruser.php @@ -475,7 +475,7 @@ if (empty($reshook)) { $newparam = ''; $newcardbutton = ''; -if ($user->rights->agenda->myactions->create || $user->rights->agenda->allactions->create) { +if ($user->rights->agenda->myactions->create || $user->hasRight('agenda', 'allactions', 'create')) { $tmpforcreatebutton = dol_getdate(dol_now(), true); $newparam .= '&month='.urlencode(str_pad($month, 2, "0", STR_PAD_LEFT)).'&year='.urlencode($tmpforcreatebutton['year']); diff --git a/htdocs/contact/agenda.php b/htdocs/contact/agenda.php index 1445a9aa8fe..2f5dea5535a 100644 --- a/htdocs/contact/agenda.php +++ b/htdocs/contact/agenda.php @@ -266,7 +266,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { $out .= '&datep='.urlencode(dol_print_date(dol_now(), 'dayhourlog')); } - if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) { + if (!empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create')) { $newcardbutton .= dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/comm/action/card.php?action=create'.$out); } } diff --git a/htdocs/contrat/agenda.php b/htdocs/contrat/agenda.php index b05f68d7680..c3fa3756655 100644 --- a/htdocs/contrat/agenda.php +++ b/htdocs/contrat/agenda.php @@ -234,7 +234,7 @@ if ($id > 0) { $newcardbutton = ''; if (isModEnabled('agenda')) { - if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) { + if (!empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create')) { $backtopage = $_SERVER['PHP_SELF'].'?id='.$object->id; $out = '&origin='.$object->element.'&originid='.$object->id.'&backtopage='.urlencode($backtopage); $newcardbutton .= dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/comm/action/card.php?action=create'.$out); diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 00defaf909c..d1d408656af 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -12061,7 +12061,7 @@ function show_actions_messaging($conf, $langs, $db, $filterobj, $objcon = '', $n $out .= $actionstatic->getNomUrl(1, -1, 'valignmiddle').' '; } - if (!empty($user->rights->agenda->allactions->create) || + if ($user->hasRight('agenda', 'allactions', 'create') || (($actionstatic->authorid == $user->id || $actionstatic->userownerid == $user->id) && !empty($user->rights->agenda->myactions->create))) { $out .= ''; } diff --git a/htdocs/core/modules/modAgenda.class.php b/htdocs/core/modules/modAgenda.class.php index d9858a017e0..a7b3e0b09b1 100644 --- a/htdocs/core/modules/modAgenda.class.php +++ b/htdocs/core/modules/modAgenda.class.php @@ -241,7 +241,7 @@ class modAgenda extends DolibarrModules 'url'=>'/comm/action/card.php?mainmenu=agenda&leftmenu=agenda&action=create', 'langs'=>'commercial', 'position'=>101, - 'perms'=>'($user->rights->agenda->myactions->create||$user->rights->agenda->allactions->create)', + 'perms'=>'($user->rights->agenda->myactions->create||$user->hasRight('agenda', 'allactions', 'create'))', 'enabled'=>'$conf->agenda->enabled', 'target'=>'', 'user'=>2 diff --git a/htdocs/fourn/commande/info.php b/htdocs/fourn/commande/info.php index fc3918a32f3..2ec9450bcfa 100644 --- a/htdocs/fourn/commande/info.php +++ b/htdocs/fourn/commande/info.php @@ -196,7 +196,7 @@ if ($permok) { print '
'; if (isModEnabled('agenda')) { - if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) { + if (!empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create')) { print ''.$langs->trans("AddAction").''; } else { print ''.$langs->trans("AddAction").''; diff --git a/htdocs/hrm/evaluation_agenda.php b/htdocs/hrm/evaluation_agenda.php index 97f4c5453dc..76d48597c00 100644 --- a/htdocs/hrm/evaluation_agenda.php +++ b/htdocs/hrm/evaluation_agenda.php @@ -200,7 +200,7 @@ if ($object->id > 0) { print '
'; if (isModEnabled('agenda')) { - if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) { + if (!empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create')) { print ''.$langs->trans("AddAction").''; } else { print ''.$langs->trans("AddAction").''; diff --git a/htdocs/hrm/job_agenda.php b/htdocs/hrm/job_agenda.php index 6aee4d6ed21..9809aea6ec1 100644 --- a/htdocs/hrm/job_agenda.php +++ b/htdocs/hrm/job_agenda.php @@ -191,7 +191,7 @@ if ($object->id > 0) { if (isModEnabled('agenda')) { - if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) { + if (!empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create')) { $newcardbutton = ''; $newcardbutton .= dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/comm/action/card.php?action=create'.$out); } diff --git a/htdocs/hrm/position_agenda.php b/htdocs/hrm/position_agenda.php index 5e52e6a9f81..12d10825fad 100644 --- a/htdocs/hrm/position_agenda.php +++ b/htdocs/hrm/position_agenda.php @@ -200,7 +200,7 @@ if ($object->id > 0) { print '
'; if (isModEnabled('agenda')) { - if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) { + if (!empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create')) { print ''.$langs->trans("AddAction").''; } else { print ''.$langs->trans("AddAction").''; diff --git a/htdocs/hrm/skill_agenda.php b/htdocs/hrm/skill_agenda.php index 52b56b1507a..73d3ad17610 100644 --- a/htdocs/hrm/skill_agenda.php +++ b/htdocs/hrm/skill_agenda.php @@ -194,7 +194,7 @@ if ($object->id > 0) { print '
'; if (isModEnabled('agenda')) { - if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) { + if (!empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create')) { print ''.$langs->trans("AddAction").''; } else { print ''.$langs->trans("AddAction").''; diff --git a/htdocs/knowledgemanagement/knowledgerecord_agenda.php b/htdocs/knowledgemanagement/knowledgerecord_agenda.php index 48f080b633e..f5a71f0ccc2 100644 --- a/htdocs/knowledgemanagement/knowledgerecord_agenda.php +++ b/htdocs/knowledgemanagement/knowledgerecord_agenda.php @@ -221,7 +221,7 @@ if ($object->id > 0) { print '
'; if (isModEnabled('agenda')) { - if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) { + if (!empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create')) { print ''.$langs->trans("AddAction").''; } else { print ''.$langs->trans("AddAction").''; diff --git a/htdocs/modulebuilder/template/myobject_agenda.php b/htdocs/modulebuilder/template/myobject_agenda.php index b7e88450f82..fab00847eab 100644 --- a/htdocs/modulebuilder/template/myobject_agenda.php +++ b/htdocs/modulebuilder/template/myobject_agenda.php @@ -280,7 +280,7 @@ if ($object->id > 0) { print '
'; if (isModEnabled('agenda')) { - if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) { + if (!empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create')) { print ''.$langs->trans("AddAction").''; } else { print ''.$langs->trans("AddAction").''; diff --git a/htdocs/mrp/mo_agenda.php b/htdocs/mrp/mo_agenda.php index 4203c0f2a19..75db1a21476 100644 --- a/htdocs/mrp/mo_agenda.php +++ b/htdocs/mrp/mo_agenda.php @@ -219,7 +219,7 @@ if ($object->id > 0) { print '
'; if (isModEnabled('agenda')) { - if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) { + if (!empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create')) { print ''.$langs->trans("AddAction").''; } else { print ''.$langs->trans("AddAction").''; diff --git a/htdocs/partnership/partnership_agenda.php b/htdocs/partnership/partnership_agenda.php index 6f25e5fd921..cfe8985349a 100644 --- a/htdocs/partnership/partnership_agenda.php +++ b/htdocs/partnership/partnership_agenda.php @@ -220,7 +220,7 @@ if ($object->id > 0) { print '
'; if (isModEnabled('agenda')) { - if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) { + if (!empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create')) { print ''.$langs->trans("AddAction").''; } else { print ''.$langs->trans("AddAction").''; diff --git a/htdocs/product/agenda.php b/htdocs/product/agenda.php index 3588fd38acc..e21089730b8 100644 --- a/htdocs/product/agenda.php +++ b/htdocs/product/agenda.php @@ -197,7 +197,7 @@ if ($id > 0 || $ref) { $out .= (!empty($objcon->id) ? '&contactid='.$objcon->id : '').'&backtopage='.$_SERVER["PHP_SELF"].'?id='.$object->id.'&percentage=-1'; } - $linktocreatetimeBtnStatus = !empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create); + $linktocreatetimeBtnStatus = !empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create'); $morehtmlcenter = dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/comm/action/card.php?action=create'.$out, '', $linktocreatetimeBtnStatus); } diff --git a/htdocs/product/list.php b/htdocs/product/list.php index 14d43e038f1..411ab569a0b 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -210,7 +210,7 @@ $alias_product_perentity = empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED) ? $arrayfields = array( 'p.rowid'=>array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>1, 'visible'=>-2, 'noteditable'=>1, 'notnull'=> 1, 'index'=>1, 'position'=>1, 'comment'=>'Id', 'css'=>'left'), 'p.ref'=>array('label'=>"Ref", 'checked'=>1, 'position'=>10), - //'pfp.ref_fourn'=>array('label'=>$langs->trans("RefSupplier"), 'checked'=>1, 'enabled'=>(!empty($conf->barcode->enabled))), + //'pfp.ref_fourn'=>array('label'=>$langs->trans("RefSupplier"), 'checked'=>1, 'enabled'=>(isModEnabled('barcode'))), 'thumbnail'=>array('label'=>'Photo', 'checked'=>0, 'position'=>10), 'p.label'=>array('label'=>"Label", 'checked'=>1, 'position'=>10), 'p.fk_product_type'=>array('label'=>"Type", 'checked'=>0, 'enabled'=>(isModEnabled("product") && isModEnabled("service")), 'position'=>11), diff --git a/htdocs/product/stock/stocktransfer/stocktransfer_agenda.php b/htdocs/product/stock/stocktransfer/stocktransfer_agenda.php index 0497520a099..2f06badf2cc 100644 --- a/htdocs/product/stock/stocktransfer/stocktransfer_agenda.php +++ b/htdocs/product/stock/stocktransfer/stocktransfer_agenda.php @@ -201,7 +201,7 @@ if ($object->id > 0) { print '
'; if (isModEnabled('agenda')) { - if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) { + if (!empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create')) { print ''.$langs->trans("AddAction").''; } else { print ''.$langs->trans("AddAction").''; diff --git a/htdocs/projet/agenda.php b/htdocs/projet/agenda.php index a7cb672c0ab..65d73751423 100644 --- a/htdocs/projet/agenda.php +++ b/htdocs/projet/agenda.php @@ -196,7 +196,7 @@ if (!empty($object->id)) { // Show link to add event if (isModEnabled('agenda')) { - $addActionBtnRight = !empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create); + $addActionBtnRight = !empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create'); $morehtmlcenter .= dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/comm/action/card.php?action=create'.$out.'&socid='.$object->socid.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?id='.$object->id), '', $addActionBtnRight); } diff --git a/htdocs/projet/messaging.php b/htdocs/projet/messaging.php index d965d5e30a0..b266b87700d 100644 --- a/htdocs/projet/messaging.php +++ b/htdocs/projet/messaging.php @@ -196,7 +196,7 @@ if (!empty($object->id)) { // Show link to add event if (isModEnabled('agenda')) { - $addActionBtnRight = !empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create); + $addActionBtnRight = !empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create'); $morehtmlcenter .= dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/comm/action/card.php?action=create'.$out.'&socid='.$object->socid.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?id='.$object->id), '', $addActionBtnRight); } diff --git a/htdocs/recruitment/recruitmentcandidature_agenda.php b/htdocs/recruitment/recruitmentcandidature_agenda.php index c99bd98afe0..0cb1e3a4f1f 100644 --- a/htdocs/recruitment/recruitmentcandidature_agenda.php +++ b/htdocs/recruitment/recruitmentcandidature_agenda.php @@ -221,7 +221,7 @@ if ($object->id > 0) { print '
'; if (isModEnabled('agenda')) { - if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) { + if (!empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create')) { print ''.$langs->trans("AddAction").''; } else { print ''.$langs->trans("AddAction").''; diff --git a/htdocs/recruitment/recruitmentjobposition_agenda.php b/htdocs/recruitment/recruitmentjobposition_agenda.php index abfad7bd7e6..9a3a0e2fe7d 100644 --- a/htdocs/recruitment/recruitmentjobposition_agenda.php +++ b/htdocs/recruitment/recruitmentjobposition_agenda.php @@ -218,7 +218,7 @@ if ($object->id > 0) { print '
'; if (isModEnabled('agenda')) { - if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) { + if (!empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create')) { print ''.$langs->trans("AddAction").''; } else { print ''.$langs->trans("AddAction").''; diff --git a/htdocs/societe/agenda.php b/htdocs/societe/agenda.php index fde1ab154a3..9df581a6999 100644 --- a/htdocs/societe/agenda.php +++ b/htdocs/societe/agenda.php @@ -178,7 +178,7 @@ if ($socid > 0) { // $morehtmlright .= dolGetButtonTitle($langs->trans('TicketAddMessage'), '', 'fa fa-comment-dots', $url, 'add-new-ticket-title-button', $btnstatus); if (isModEnabled('agenda')) { - if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) { + if (!empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create')) { $morehtmlright .= dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/comm/action/card.php?action=create'.$out); } } diff --git a/htdocs/societe/messaging.php b/htdocs/societe/messaging.php index 3f9011cce3f..10a34c48dec 100644 --- a/htdocs/societe/messaging.php +++ b/htdocs/societe/messaging.php @@ -178,7 +178,7 @@ if ($socid > 0) { // $morehtmlright .= dolGetButtonTitle($langs->trans('TicketAddMessage'), '', 'fa fa-comment-dots', $url, 'add-new-ticket-title-button', $btnstatus); if (isModEnabled('agenda')) { - if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) { + if (!empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create')) { $morehtmlright .= dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/comm/action/card.php?action=create'.$out); } } diff --git a/htdocs/webhook/target_agenda.php b/htdocs/webhook/target_agenda.php index 74c895a813a..bf9cee2ec72 100644 --- a/htdocs/webhook/target_agenda.php +++ b/htdocs/webhook/target_agenda.php @@ -233,7 +233,7 @@ if ($object->id > 0) { print '
'; if (isModEnabled('agenda')) { - if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) { + if (!empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create')) { print ''.$langs->trans("AddAction").''; } else { print ''.$langs->trans("AddAction").''; diff --git a/htdocs/workstation/workstation_agenda.php b/htdocs/workstation/workstation_agenda.php index 777da58f92c..7739cec620e 100644 --- a/htdocs/workstation/workstation_agenda.php +++ b/htdocs/workstation/workstation_agenda.php @@ -223,7 +223,7 @@ if ($object->id > 0) { print '
'; if (!empty($conf->agenda->enabled)) { - if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) { + if (!empty($user->rights->agenda->myactions->create) || $user->hasRight('agenda', 'allactions', 'create')) { print ''.$langs->trans("AddAction").''; } else { print ''.$langs->trans("AddAction").''; From 1e9ab45947222a1f3941f8ba0aac66228e4bf941 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Fri, 23 Dec 2022 14:24:28 +0100 Subject: [PATCH 0284/1128] fix code --- htdocs/core/modules/modAgenda.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/modAgenda.class.php b/htdocs/core/modules/modAgenda.class.php index a7b3e0b09b1..38debb8633a 100644 --- a/htdocs/core/modules/modAgenda.class.php +++ b/htdocs/core/modules/modAgenda.class.php @@ -241,7 +241,7 @@ class modAgenda extends DolibarrModules 'url'=>'/comm/action/card.php?mainmenu=agenda&leftmenu=agenda&action=create', 'langs'=>'commercial', 'position'=>101, - 'perms'=>'($user->rights->agenda->myactions->create||$user->hasRight('agenda', 'allactions', 'create'))', + 'perms'=>'($user->hasRight("agenda", "myactions", "create")||$user->hasRight("agenda", "allactions", "create"))', 'enabled'=>'$conf->agenda->enabled', 'target'=>'', 'user'=>2 From 3f30c7eb80469f655fd9f89c5704a76ae7883746 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 23 Dec 2022 14:35:08 +0100 Subject: [PATCH 0285/1128] Fix selection of vat rate in combo --- htdocs/core/tpl/objectline_create.tpl.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/tpl/objectline_create.tpl.php b/htdocs/core/tpl/objectline_create.tpl.php index c3b94332909..110b379c22f 100644 --- a/htdocs/core/tpl/objectline_create.tpl.php +++ b/htdocs/core/tpl/objectline_create.tpl.php @@ -774,7 +774,7 @@ if (!empty($usemargins) && $user->rights->margins->creer) { // Now set the VAT var stringforvatrateselection = tva_tx; - if (typeof default_vat_code != 'undefined' && default_vat_code != null) { + if (typeof default_vat_code != 'undefined' && default_vat_code != null && default_vat_code != '') { stringforvatrateselection = stringforvatrateselection+' ('+default_vat_code+')'; } // Set vat rate if field is an input box @@ -996,7 +996,7 @@ if (!empty($usemargins) && $user->rights->margins->creer) { if (typeof default_vat_code === 'undefined') { default_vat_code = jQuery('#idprodfournprice').attr('data-default-vat-code');} // When select is done from HTML input with ajax autocomplete var stringforvatrateselection = tva_tx; - if (typeof default_vat_code != 'undefined' && default_vat_code != null) { + if (typeof default_vat_code != 'undefined' && default_vat_code != null && default_vat_code != '') { stringforvatrateselection = stringforvatrateselection+' ('+default_vat_code+')'; } @@ -1058,7 +1058,7 @@ if (!empty($usemargins) && $user->rights->margins->creer) { if (typeof default_vat_code === 'undefined') { default_vat_code = jQuery('#idprodfournprice').attr('data-default-vat-code');} // When select is done from HTML input with ajax autocomplete var stringforvatrateselection = tva_tx; - if (typeof default_vat_code != 'undefined' && default_vat_code != null) { + if (typeof default_vat_code != 'undefined' && default_vat_code != null && default_vat_code != '') { stringforvatrateselection = stringforvatrateselection+' ('+default_vat_code+')'; } From 50d5ee5e21c5470abacceccfd663a8993acec225 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 23 Dec 2022 15:52:48 +0100 Subject: [PATCH 0286/1128] Fix deletion of one page --- htdocs/website/class/websitepage.class.php | 4 ++-- htdocs/website/index.php | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/htdocs/website/class/websitepage.class.php b/htdocs/website/class/websitepage.class.php index d04608387cb..8660ca0b0c1 100644 --- a/htdocs/website/class/websitepage.class.php +++ b/htdocs/website/class/websitepage.class.php @@ -116,8 +116,8 @@ class WebsitePage extends CommonObject */ public $fk_object; - const STATUS_DRAFT = 0; - const STATUS_VALIDATED = 1; + const STATUS_DRAFT = 0; // offline + const STATUS_VALIDATED = 1; // online /** diff --git a/htdocs/website/index.php b/htdocs/website/index.php index 6e4d96880fb..3b270576f03 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -3336,8 +3336,7 @@ if (!GETPOST('hide_websitemenu')) { print ''; // Delete - //print ''; - if ($websitepage->status == $websitepage::STATUS_DRAFT || !$atleastonepage) { + if ($websitepage->status != $websitepage::STATUS_DRAFT) { $disabled = ' disabled="disabled"'; $title = $langs->trans("WebpageMustBeDisabled", $langs->transnoentitiesnoconv($websitepage->LibStatut(0, 0))); $url = '#'; From b80413db2b65e753e20fa42a59ad51b463f47573 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 23 Dec 2022 16:00:27 +0100 Subject: [PATCH 0287/1128] Fix deletion of page --- htdocs/website/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/website/index.php b/htdocs/website/index.php index 3b270576f03..d7e01018550 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -3343,7 +3343,7 @@ if (!GETPOST('hide_websitemenu')) { } else { $disabled = ''; $title = ''; - $url = $_SERVER["PHP_SELF"].'?action=delete&token='.newToken().'&website='.urlencode($website->ref); + $url = $_SERVER["PHP_SELF"].'?action=delete&token='.newToken().'&pageid='.((int) $websitepage->id).'&website='.urlencode($website->ref); // action=delete for webpage, deletesite for website } print ''.img_picto('', 'delete', 'class=""').''.$langs->trans("Delete").''; } From 92d9d31b8ce8dc956b30658d459a295366c4f70e Mon Sep 17 00:00:00 2001 From: Randall Mora <50120822+randallmoraes@users.noreply.github.com> Date: Fri, 23 Dec 2022 13:18:04 -0600 Subject: [PATCH 0288/1128] Update functions.lib.php Agrega el tipo de moneda CRC (colones Costa Rica) para que se muestre al incio como simbolo de moneda. Adds the CRC currency (Costa Rican colones) so that it is displayed at the beginning as a currency symbol. --- htdocs/core/lib/functions.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 00defaf909c..cf5b77ff63e 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -5762,7 +5762,7 @@ function price($amount, $form = 0, $outlangs = '', $trunc = 1, $rounding = -1, $ $currency_code = $conf->currency; } - $listofcurrenciesbefore = array('AUD', 'CAD', 'CNY', 'COP', 'CLP', 'GBP', 'HKD', 'MXN', 'PEN', 'USD'); + $listofcurrenciesbefore = array('AUD', 'CAD', 'CNY', 'COP', 'CLP', 'GBP', 'HKD', 'MXN', 'PEN', 'USD', 'CRC); $listoflanguagesbefore = array('nl_NL'); if (in_array($currency_code, $listofcurrenciesbefore) || in_array($outlangs->defaultlang, $listoflanguagesbefore)) { $cursymbolbefore .= $outlangs->getCurrencySymbol($currency_code); From 40f55e8f8e0c71ee87abf1a49d9bd21a61038761 Mon Sep 17 00:00:00 2001 From: Mo Date: Sat, 24 Dec 2022 03:19:12 +0100 Subject: [PATCH 0289/1128] correct to the right apostrophe in tow occurrences MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit no more message after this correction in Luxembourg plan comptable normalisé 2020 (PCN 2020) "Erreur lors du chargement du tableau de compte. Si certains comptes n’ont pas été chargés, vous pouvez toujours les entrer manuellement." --- htdocs/install/mysql/data/llx_accounting_account_lu.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/install/mysql/data/llx_accounting_account_lu.sql b/htdocs/install/mysql/data/llx_accounting_account_lu.sql index 831ac6b8f08..06d4def6b51 100644 --- a/htdocs/install/mysql/data/llx_accounting_account_lu.sql +++ b/htdocs/install/mysql/data/llx_accounting_account_lu.sql @@ -207,7 +207,7 @@ INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, acc INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 17201, 'PCN2020-LUXEMBURG', 'ASSETS', '41229', 0, 'Corrections de valeur', '1'); INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 17202, 'PCN2020-LUXEMBURG', 'ASSETS', '42111', 0, 'Avances et acomptes', '1'); INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 17203, 'PCN2020-LUXEMBURG', 'ASSETS', '42119', 0, 'Corrections de valeur', '1'); -INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 17204, 'PCN2020-LUXEMBURG', 'ASSETS', '4212', 0, 'Cr./assoc. ou act.(aut. qu'ent. liées)', '1'); +INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 17204, 'PCN2020-LUXEMBURG', 'ASSETS', '4212', 0, 'Cr./assoc. ou act.(aut. qu’ent. liées)', '1'); INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 17205, 'PCN2020-LUXEMBURG', 'ASSETS', '42121', 0, 'De Franco Vincent', '1'); INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 17206, 'PCN2020-LUXEMBURG', 'ASSETS', '42131', 0, 'Subventions d’investissement', '1'); INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 17207, 'PCN2020-LUXEMBURG', 'ASSETS', '42132', 0, 'Subventions d’exploitation', '1'); @@ -237,7 +237,7 @@ INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, acc INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 17231, 'PCN2020-LUXEMBURG', 'ASSETS', '42188', 0, 'Autres créances diverses', '1'); INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 17232, 'PCN2020-LUXEMBURG', 'ASSETS', '42189', 0, 'Corrections de valeur', '1'); INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 17233, 'PCN2020-LUXEMBURG', 'ASSETS', '4221', 0, 'Personnel - Avances et acomptes', '1'); -INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 17234, 'PCN2020-LUXEMBURG', 'ASSETS', '4222', 0, 'Cr./assoc. ou act.(aut. qu'ent. liées)', '1'); +INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 17234, 'PCN2020-LUXEMBURG', 'ASSETS', '4222', 0, 'Cr./assoc. ou act.(aut. qu’ent. liées)', '1'); INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 17235, 'PCN2020-LUXEMBURG', 'ASSETS', '42231', 0, 'Subventions d’investissement', '1'); INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 17236, 'PCN2020-LUXEMBURG', 'ASSETS', '42232', 0, 'Subventions d’exploitation', '1'); INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 17237, 'PCN2020-LUXEMBURG', 'ASSETS', '42238', 0, 'Autres subventions', '1'); From 99d5c4ebf334bba94714fbcd88374e6cf2db06ec Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 24 Dec 2022 14:18:58 +0100 Subject: [PATCH 0290/1128] FIX #yogosha13939 --- htdocs/partnership/admin/setup.php | 11 +++++------ htdocs/partnership/admin/website.php | 4 ++-- htdocs/partnership/partnership_agenda.php | 9 ++++++++- htdocs/partnership/partnership_card.php | 4 ++++ htdocs/partnership/partnership_contact.php | 12 +++++++++-- htdocs/partnership/partnership_document.php | 10 ++++++++-- htdocs/partnership/partnership_list.php | 22 ++++++++++----------- htdocs/partnership/partnership_note.php | 11 +++++++++++ 8 files changed, 58 insertions(+), 25 deletions(-) diff --git a/htdocs/partnership/admin/setup.php b/htdocs/partnership/admin/setup.php index a398a6860b1..3f8ac2adaae 100644 --- a/htdocs/partnership/admin/setup.php +++ b/htdocs/partnership/admin/setup.php @@ -31,17 +31,16 @@ require_once '../lib/partnership.lib.php'; // Translations $langs->loadLangs(array("admin", "partnership")); +$action = GETPOST('action', 'aZ09'); +$value = GETPOST('value', 'alpha'); + +$error = 0; + // Security check if (!$user->admin) { accessforbidden(); } -$action = GETPOST('action', 'aZ09'); -$value = GETPOST('value', 'alpha'); - - -$error = 0; - /* * Actions diff --git a/htdocs/partnership/admin/website.php b/htdocs/partnership/admin/website.php index 717783f68d9..498c7e245aa 100644 --- a/htdocs/partnership/admin/website.php +++ b/htdocs/partnership/admin/website.php @@ -37,12 +37,12 @@ $langs->loadLangs(array("admin", "partnership")); $action = GETPOST('action', 'aZ09'); +$error = 0; + if (!$user->admin) { accessforbidden(); } -$error = 0; - /* * Actions diff --git a/htdocs/partnership/partnership_agenda.php b/htdocs/partnership/partnership_agenda.php index dd886fc70d7..20b3d5a8a2c 100644 --- a/htdocs/partnership/partnership_agenda.php +++ b/htdocs/partnership/partnership_agenda.php @@ -84,12 +84,19 @@ if ($id > 0 || !empty($ref)) { $upload_dir = $conf->partnership->multidir_output[$object->entity]."/".$object->id; } +$permissiontoread = $user->rights->partnership->read; +$permissiontoadd = $user->rights->partnership->write; // Used by the include of actions_addupdatedelete.inc.php +$managedfor = getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR', 'thirdparty'); + // Security check - Protection if external user //if ($user->socid > 0) accessforbidden(); //if ($user->socid > 0) $socid = $user->socid; //$result = restrictedArea($user, 'partnership', $object->id); +if (empty($conf->partnership->enabled)) accessforbidden(); +if (empty($permissiontoread)) accessforbidden(); +if ($object->id > 0 && !($object->fk_member > 0) && $managedfor == 'member') accessforbidden(); +if ($object->id > 0 && !($object->fk_soc > 0) && $managedfor == 'thirdparty') accessforbidden(); -$permissiontoadd = $user->rights->partnership->write; // Used by the include of actions_addupdatedelete.inc.php /* diff --git a/htdocs/partnership/partnership_card.php b/htdocs/partnership/partnership_card.php index de5449b7e80..ae4f44b968c 100644 --- a/htdocs/partnership/partnership_card.php +++ b/htdocs/partnership/partnership_card.php @@ -81,6 +81,10 @@ $permissiondellink = $user->rights->partnership->write; // Used by the include $upload_dir = $conf->partnership->multidir_output[isset($object->entity) ? $object->entity : 1]; $managedfor = getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR', 'thirdparty'); +// Security check - Protection if external user +//if ($user->socid > 0) accessforbidden(); +//if ($user->socid > 0) $socid = $user->socid; +//$result = restrictedArea($user, 'partnership', $object->id); if (empty($conf->partnership->enabled)) accessforbidden(); if (empty($permissiontoread)) accessforbidden(); if ($object->id > 0 && !($object->fk_member > 0) && $managedfor == 'member') accessforbidden(); diff --git a/htdocs/partnership/partnership_contact.php b/htdocs/partnership/partnership_contact.php index 75d315ae396..270645c0d52 100644 --- a/htdocs/partnership/partnership_contact.php +++ b/htdocs/partnership/partnership_contact.php @@ -51,15 +51,23 @@ $extrafields->fetch_name_optionals_label($object->table_element); // Load object include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals +$permissiontoread = $user->rights->partnership->read; +$permission = $user->rights->partnership->write; +$managedfor = getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR', 'thirdparty'); + // Security check - Protection if external user //if ($user->socid > 0) accessforbidden(); //if ($user->socid > 0) $socid = $user->socid; //$result = restrictedArea($user, 'partnership', $object->id); +if (empty($conf->partnership->enabled)) accessforbidden(); +if (empty($permissiontoread)) accessforbidden(); +if ($object->id > 0 && !($object->fk_member > 0) && $managedfor == 'member') accessforbidden(); +if ($object->id > 0 && !($object->fk_soc > 0) && $managedfor == 'thirdparty') accessforbidden(); + -$permission = $user->rights->partnership->write; /* - * Add a new contact + * Actions */ if ($action == 'addcontact' && $permission) { diff --git a/htdocs/partnership/partnership_document.php b/htdocs/partnership/partnership_document.php index 0b6d0e6bd07..8651590e37a 100644 --- a/htdocs/partnership/partnership_document.php +++ b/htdocs/partnership/partnership_document.php @@ -75,12 +75,18 @@ if ($id > 0 || !empty($ref)) { $upload_dir = $conf->partnership->multidir_output[$object->entity ? $object->entity : $conf->entity]."/partnership/".get_exdir(0, 0, 0, 1, $object); } +$permissiontoread = $user->rights->partnership->read; +$permissiontoadd = $user->rights->partnership->write; // Used by the include of actions_addupdatedelete.inc.php +$managedfor = getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR', 'thirdparty'); + // Security check - Protection if external user //if ($user->socid > 0) accessforbidden(); //if ($user->socid > 0) $socid = $user->socid; //$result = restrictedArea($user, 'partnership', $object->id); - -$permissiontoadd = $user->rights->partnership->write; // Used by the include of actions_addupdatedelete.inc.php +if (empty($conf->partnership->enabled)) accessforbidden(); +if (empty($permissiontoread)) accessforbidden(); +if ($object->id > 0 && !($object->fk_member > 0) && $managedfor == 'member') accessforbidden(); +if ($object->id > 0 && !($object->fk_soc > 0) && $managedfor == 'thirdparty') accessforbidden(); diff --git a/htdocs/partnership/partnership_list.php b/htdocs/partnership/partnership_list.php index 36a0fd39218..a795d8d33f4 100644 --- a/htdocs/partnership/partnership_list.php +++ b/htdocs/partnership/partnership_list.php @@ -85,6 +85,8 @@ $extrafields->fetch_name_optionals_label($object->table_element); $search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_'); +$error = 0; + $managedfor = getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR', 'thirdparty'); if ($managedfor != 'member' && $sortfield == 'd.datefin') $sortfield = ''; @@ -149,18 +151,14 @@ $permissiontoread = $user->rights->partnership->read; $permissiontoadd = $user->rights->partnership->write; $permissiontodelete = $user->rights->partnership->delete; -// Security check -if (empty($conf->partnership->enabled)) { - accessforbidden('Module not enabled'); -} -if ($user->socid > 0) { // Protection if external user - //$socid = $user->socid; - accessforbidden(); -} -//$result = restrictedArea($user, 'partnership'); -//if (!$permissiontoread) accessforbidden(); - -$error = 0; +// Security check - Protection if external user +//if ($user->socid > 0) accessforbidden(); +//if ($user->socid > 0) $socid = $user->socid; +//$result = restrictedArea($user, 'partnership', $object->id); +if (empty($conf->partnership->enabled)) accessforbidden(); +if (empty($permissiontoread)) accessforbidden(); +if ($object->id > 0 && !($object->fk_member > 0) && $managedfor == 'member') accessforbidden(); +if ($object->id > 0 && !($object->fk_soc > 0) && $managedfor == 'thirdparty') accessforbidden(); /* diff --git a/htdocs/partnership/partnership_note.php b/htdocs/partnership/partnership_note.php index a38fdc65ade..b0e16f7f3a5 100644 --- a/htdocs/partnership/partnership_note.php +++ b/htdocs/partnership/partnership_note.php @@ -57,14 +57,25 @@ if ($id > 0 || !empty($ref)) { $upload_dir = $conf->partnership->multidir_output[$object->entity]."/".$object->id; } +$permissiontoread = $user->rights->partnership->read; $permissionnote = $user->rights->partnership->write; // Used by the include of actions_setnotes.inc.php $permissiontoadd = $user->rights->partnership->write; // Used by the include of actions_addupdatedelete.inc.php +$managedfor = getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR', 'thirdparty'); +// Security check - Protection if external user +//if ($user->socid > 0) accessforbidden(); +//if ($user->socid > 0) $socid = $user->socid; +//$result = restrictedArea($user, 'partnership', $object->id); +if (empty($conf->partnership->enabled)) accessforbidden(); +if (empty($permissiontoread)) accessforbidden(); +if ($object->id > 0 && !($object->fk_member > 0) && $managedfor == 'member') accessforbidden(); +if ($object->id > 0 && !($object->fk_soc > 0) && $managedfor == 'thirdparty') accessforbidden(); /* * Actions */ + $reshook = $hookmanager->executeHooks('doActions', array(), $object, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); From 685a7dbd595e5086d6acff88104cfb13baf2400f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 24 Dec 2022 15:06:32 +0100 Subject: [PATCH 0291/1128] Clean code. Add a phpunit test to avoid duplicate jquery. --- htdocs/admin/modules.php | 10 +- htdocs/debugbar/class/DebugBar.php | 6 +- .../font-awesome/css/font-awesome.min.css | 4 - .../vendor/font-awesome/fonts/FontAwesome.otf | Bin 134808 -> 0 bytes .../fonts/fontawesome-webfont.eot | Bin 165742 -> 0 bytes .../fonts/fontawesome-webfont.svg | 2671 ----------------- .../fonts/fontawesome-webfont.ttf | Bin 165548 -> 0 bytes .../fonts/fontawesome-webfont.woff | Bin 98024 -> 0 bytes .../fonts/fontawesome-webfont.woff2 | Bin 77160 -> 0 bytes .../vendor/highlightjs/highlight.pack.js | 1 - .../vendor/highlightjs/styles/github.css | 125 - .../vendor/jquery/dist/jquery.min.js | 2 - test/phpunit/AllTests.php | 2 + test/phpunit/CodingPhpTest.php | 5 +- test/phpunit/FilesLibTest.php | 19 - test/phpunit/RepositoryTest.php | 214 ++ 16 files changed, 226 insertions(+), 2833 deletions(-) delete mode 100644 htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/css/font-awesome.min.css delete mode 100644 htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/FontAwesome.otf delete mode 100644 htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.eot delete mode 100644 htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.svg delete mode 100644 htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.ttf delete mode 100644 htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.woff delete mode 100644 htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.woff2 delete mode 100644 htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/highlightjs/highlight.pack.js delete mode 100644 htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/highlightjs/styles/github.css delete mode 100644 htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/jquery/dist/jquery.min.js create mode 100644 test/phpunit/RepositoryTest.php diff --git a/htdocs/admin/modules.php b/htdocs/admin/modules.php index bd6a238c0f0..93eb5524a1d 100644 --- a/htdocs/admin/modules.php +++ b/htdocs/admin/modules.php @@ -641,11 +641,11 @@ if ($mode == 'common' || $mode == 'commonkanban') { // We discard showing according to filters if ($search_keyword) { $qualified = 0; - if (preg_match('/'.preg_quote($search_keyword).'/i', $modulename) - || preg_match('/'.preg_quote($search_keyword).'/i', $moduletechnicalname) - || preg_match('/'.preg_quote($search_keyword).'/i', $moduledesc) - || preg_match('/'.preg_quote($search_keyword).'/i', $moduledesclong) - || preg_match('/'.preg_quote($search_keyword).'/i', $moduleauthor) + if (preg_match('/'.preg_quote($search_keyword, '/').'/i', $modulename) + || preg_match('/'.preg_quote($search_keyword, '/').'/i', $moduletechnicalname) + || ($moduledesc && preg_match('/'.preg_quote($search_keyword, '/').'/i', $moduledesc)) + || ($moduledesclong && preg_match('/'.preg_quote($search_keyword, '/').'/i', $moduledesclong)) + || ($moduleauthor && preg_match('/'.preg_quote($search_keyword, '/').'/i', $moduleauthor)) ) { $qualified = 1; } diff --git a/htdocs/debugbar/class/DebugBar.php b/htdocs/debugbar/class/DebugBar.php index b2ec0f17bf0..5c2f8a8c3d3 100644 --- a/htdocs/debugbar/class/DebugBar.php +++ b/htdocs/debugbar/class/DebugBar.php @@ -55,9 +55,9 @@ class DolibarrDebugBar extends DebugBar public function getRenderer() { $renderer = parent::getJavascriptRenderer(DOL_URL_ROOT.'/includes/maximebf/debugbar/src/DebugBar/Resources'); - //$renderer->disableVendor('jquery'); - $renderer->disableVendor('fontawesome'); - $renderer->disableVendor('highlightjs'); + $renderer->disableVendor('jquery'); // We already have jquery loaded globally by the main.inc.php + $renderer->disableVendor('fontawesome'); // We already have fontawesome loaded globally by the main.inc.php + $renderer->disableVendor('highlightjs'); // We don't need this return $renderer; } } diff --git a/htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/css/font-awesome.min.css b/htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/css/font-awesome.min.css deleted file mode 100644 index 3559d52d8c2..00000000000 --- a/htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/css/font-awesome.min.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'PhpDebugbarFontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.phpdebugbar-fa{display:inline-block;font:normal normal normal 14px/1 PhpDebugbarFontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.phpdebugbar-fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.phpdebugbar-fa-2x{font-size:2em}.phpdebugbar-fa-3x{font-size:3em}.phpdebugbar-fa-4x{font-size:4em}.phpdebugbar-fa-5x{font-size:5em}.phpdebugbar-fa-fw{width:1.28571429em;text-align:center}.phpdebugbar-fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.phpdebugbar-fa-ul>li{position:relative}.phpdebugbar-fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.phpdebugbar-fa-li.phpdebugbar-fa-lg{left:-1.85714286em}.phpdebugbar-fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.phpdebugbar-fa-pull-left{float:left}.phpdebugbar-fa-pull-right{float:right}.phpdebugbar-fa.phpdebugbar-fa-pull-left{margin-right:.3em}.phpdebugbar-fa.phpdebugbar-fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.phpdebugbar-fa.pull-left{margin-right:.3em}.phpdebugbar-fa.pull-right{margin-left:.3em}.phpdebugbar-fa-spin{-webkit-animation:phpdebugbar-fa-spin 2s infinite linear;animation:phpdebugbar-fa-spin 2s infinite linear}.phpdebugbar-fa-pulse{-webkit-animation:phpdebugbar-fa-spin 1s infinite steps(8);animation:phpdebugbar-fa-spin 1s infinite steps(8)}@-webkit-keyframes phpdebugbar-fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes phpdebugbar-fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.phpdebugbar-fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.phpdebugbar-fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.phpdebugbar-fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.phpdebugbar-fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.phpdebugbar-fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .phpdebugbar-fa-rotate-90,:root .phpdebugbar-fa-rotate-180,:root .phpdebugbar-fa-rotate-270,:root .phpdebugbar-fa-flip-horizontal,:root .phpdebugbar-fa-flip-vertical{filter:none}.phpdebugbar-fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.phpdebugbar-fa-stack-1x,.phpdebugbar-fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.phpdebugbar-fa-stack-1x{line-height:inherit}.phpdebugbar-fa-stack-2x{font-size:2em}.phpdebugbar-fa-inverse{color:#fff}.phpdebugbar-fa-glass:before{content:"\f000"}.phpdebugbar-fa-music:before{content:"\f001"}.phpdebugbar-fa-search:before{content:"\f002"}.phpdebugbar-fa-envelope-o:before{content:"\f003"}.phpdebugbar-fa-heart:before{content:"\f004"}.phpdebugbar-fa-star:before{content:"\f005"}.phpdebugbar-fa-star-o:before{content:"\f006"}.phpdebugbar-fa-user:before{content:"\f007"}.phpdebugbar-fa-film:before{content:"\f008"}.phpdebugbar-fa-th-large:before{content:"\f009"}.phpdebugbar-fa-th:before{content:"\f00a"}.phpdebugbar-fa-th-list:before{content:"\f00b"}.phpdebugbar-fa-check:before{content:"\f00c"}.phpdebugbar-fa-remove:before,.phpdebugbar-fa-close:before,.phpdebugbar-fa-times:before{content:"\f00d"}.phpdebugbar-fa-search-plus:before{content:"\f00e"}.phpdebugbar-fa-search-minus:before{content:"\f010"}.phpdebugbar-fa-power-off:before{content:"\f011"}.phpdebugbar-fa-signal:before{content:"\f012"}.phpdebugbar-fa-gear:before,.phpdebugbar-fa-cog:before{content:"\f013"}.phpdebugbar-fa-trash-o:before{content:"\f014"}.phpdebugbar-fa-home:before{content:"\f015"}.phpdebugbar-fa-file-o:before{content:"\f016"}.phpdebugbar-fa-clock-o:before{content:"\f017"}.phpdebugbar-fa-road:before{content:"\f018"}.phpdebugbar-fa-download:before{content:"\f019"}.phpdebugbar-fa-arrow-circle-o-down:before{content:"\f01a"}.phpdebugbar-fa-arrow-circle-o-up:before{content:"\f01b"}.phpdebugbar-fa-inbox:before{content:"\f01c"}.phpdebugbar-fa-play-circle-o:before{content:"\f01d"}.phpdebugbar-fa-rotate-right:before,.phpdebugbar-fa-repeat:before{content:"\f01e"}.phpdebugbar-fa-refresh:before{content:"\f021"}.phpdebugbar-fa-list-alt:before{content:"\f022"}.phpdebugbar-fa-lock:before{content:"\f023"}.phpdebugbar-fa-flag:before{content:"\f024"}.phpdebugbar-fa-headphones:before{content:"\f025"}.phpdebugbar-fa-volume-off:before{content:"\f026"}.phpdebugbar-fa-volume-down:before{content:"\f027"}.phpdebugbar-fa-volume-up:before{content:"\f028"}.phpdebugbar-fa-qrcode:before{content:"\f029"}.phpdebugbar-fa-barcode:before{content:"\f02a"}.phpdebugbar-fa-tag:before{content:"\f02b"}.phpdebugbar-fa-tags:before{content:"\f02c"}.phpdebugbar-fa-book:before{content:"\f02d"}.phpdebugbar-fa-bookmark:before{content:"\f02e"}.phpdebugbar-fa-print:before{content:"\f02f"}.phpdebugbar-fa-camera:before{content:"\f030"}.phpdebugbar-fa-font:before{content:"\f031"}.phpdebugbar-fa-bold:before{content:"\f032"}.phpdebugbar-fa-italic:before{content:"\f033"}.phpdebugbar-fa-text-height:before{content:"\f034"}.phpdebugbar-fa-text-width:before{content:"\f035"}.phpdebugbar-fa-align-left:before{content:"\f036"}.phpdebugbar-fa-align-center:before{content:"\f037"}.phpdebugbar-fa-align-right:before{content:"\f038"}.phpdebugbar-fa-align-justify:before{content:"\f039"}.phpdebugbar-fa-list:before{content:"\f03a"}.phpdebugbar-fa-dedent:before,.phpdebugbar-fa-outdent:before{content:"\f03b"}.phpdebugbar-fa-indent:before{content:"\f03c"}.phpdebugbar-fa-video-camera:before{content:"\f03d"}.phpdebugbar-fa-photo:before,.phpdebugbar-fa-image:before,.phpdebugbar-fa-picture-o:before{content:"\f03e"}.phpdebugbar-fa-pencil:before{content:"\f040"}.phpdebugbar-fa-map-marker:before{content:"\f041"}.phpdebugbar-fa-adjust:before{content:"\f042"}.phpdebugbar-fa-tint:before{content:"\f043"}.phpdebugbar-fa-edit:before,.phpdebugbar-fa-pencil-square-o:before{content:"\f044"}.phpdebugbar-fa-share-square-o:before{content:"\f045"}.phpdebugbar-fa-check-square-o:before{content:"\f046"}.phpdebugbar-fa-arrows:before{content:"\f047"}.phpdebugbar-fa-step-backward:before{content:"\f048"}.phpdebugbar-fa-fast-backward:before{content:"\f049"}.phpdebugbar-fa-backward:before{content:"\f04a"}.phpdebugbar-fa-play:before{content:"\f04b"}.phpdebugbar-fa-pause:before{content:"\f04c"}.phpdebugbar-fa-stop:before{content:"\f04d"}.phpdebugbar-fa-forward:before{content:"\f04e"}.phpdebugbar-fa-fast-forward:before{content:"\f050"}.phpdebugbar-fa-step-forward:before{content:"\f051"}.phpdebugbar-fa-eject:before{content:"\f052"}.phpdebugbar-fa-chevron-left:before{content:"\f053"}.phpdebugbar-fa-chevron-right:before{content:"\f054"}.phpdebugbar-fa-plus-circle:before{content:"\f055"}.phpdebugbar-fa-minus-circle:before{content:"\f056"}.phpdebugbar-fa-times-circle:before{content:"\f057"}.phpdebugbar-fa-check-circle:before{content:"\f058"}.phpdebugbar-fa-question-circle:before{content:"\f059"}.phpdebugbar-fa-info-circle:before{content:"\f05a"}.phpdebugbar-fa-crosshairs:before{content:"\f05b"}.phpdebugbar-fa-times-circle-o:before{content:"\f05c"}.phpdebugbar-fa-check-circle-o:before{content:"\f05d"}.phpdebugbar-fa-ban:before{content:"\f05e"}.phpdebugbar-fa-arrow-left:before{content:"\f060"}.phpdebugbar-fa-arrow-right:before{content:"\f061"}.phpdebugbar-fa-arrow-up:before{content:"\f062"}.phpdebugbar-fa-arrow-down:before{content:"\f063"}.phpdebugbar-fa-mail-forward:before,.phpdebugbar-fa-share:before{content:"\f064"}.phpdebugbar-fa-expand:before{content:"\f065"}.phpdebugbar-fa-compress:before{content:"\f066"}.phpdebugbar-fa-plus:before{content:"\f067"}.phpdebugbar-fa-minus:before{content:"\f068"}.phpdebugbar-fa-asterisk:before{content:"\f069"}.phpdebugbar-fa-exclamation-circle:before{content:"\f06a"}.phpdebugbar-fa-gift:before{content:"\f06b"}.phpdebugbar-fa-leaf:before{content:"\f06c"}.phpdebugbar-fa-fire:before{content:"\f06d"}.phpdebugbar-fa-eye:before{content:"\f06e"}.phpdebugbar-fa-eye-slash:before{content:"\f070"}.phpdebugbar-fa-warning:before,.phpdebugbar-fa-exclamation-triangle:before{content:"\f071"}.phpdebugbar-fa-plane:before{content:"\f072"}.phpdebugbar-fa-calendar:before{content:"\f073"}.phpdebugbar-fa-random:before{content:"\f074"}.phpdebugbar-fa-comment:before{content:"\f075"}.phpdebugbar-fa-magnet:before{content:"\f076"}.phpdebugbar-fa-chevron-up:before{content:"\f077"}.phpdebugbar-fa-chevron-down:before{content:"\f078"}.phpdebugbar-fa-retweet:before{content:"\f079"}.phpdebugbar-fa-shopping-cart:before{content:"\f07a"}.phpdebugbar-fa-folder:before{content:"\f07b"}.phpdebugbar-fa-folder-open:before{content:"\f07c"}.phpdebugbar-fa-arrows-v:before{content:"\f07d"}.phpdebugbar-fa-arrows-h:before{content:"\f07e"}.phpdebugbar-fa-bar-chart-o:before,.phpdebugbar-fa-bar-chart:before{content:"\f080"}.phpdebugbar-fa-twitter-square:before{content:"\f081"}.phpdebugbar-fa-facebook-square:before{content:"\f082"}.phpdebugbar-fa-camera-retro:before{content:"\f083"}.phpdebugbar-fa-key:before{content:"\f084"}.phpdebugbar-fa-gears:before,.phpdebugbar-fa-cogs:before{content:"\f085"}.phpdebugbar-fa-comments:before{content:"\f086"}.phpdebugbar-fa-thumbs-o-up:before{content:"\f087"}.phpdebugbar-fa-thumbs-o-down:before{content:"\f088"}.phpdebugbar-fa-star-half:before{content:"\f089"}.phpdebugbar-fa-heart-o:before{content:"\f08a"}.phpdebugbar-fa-sign-out:before{content:"\f08b"}.phpdebugbar-fa-linkedin-square:before{content:"\f08c"}.phpdebugbar-fa-thumb-tack:before{content:"\f08d"}.phpdebugbar-fa-external-link:before{content:"\f08e"}.phpdebugbar-fa-sign-in:before{content:"\f090"}.phpdebugbar-fa-trophy:before{content:"\f091"}.phpdebugbar-fa-github-square:before{content:"\f092"}.phpdebugbar-fa-upload:before{content:"\f093"}.phpdebugbar-fa-lemon-o:before{content:"\f094"}.phpdebugbar-fa-phone:before{content:"\f095"}.phpdebugbar-fa-square-o:before{content:"\f096"}.phpdebugbar-fa-bookmark-o:before{content:"\f097"}.phpdebugbar-fa-phone-square:before{content:"\f098"}.phpdebugbar-fa-twitter:before{content:"\f099"}.phpdebugbar-fa-facebook-f:before,.phpdebugbar-fa-facebook:before{content:"\f09a"}.phpdebugbar-fa-github:before{content:"\f09b"}.phpdebugbar-fa-unlock:before{content:"\f09c"}.phpdebugbar-fa-credit-card:before{content:"\f09d"}.phpdebugbar-fa-feed:before,.phpdebugbar-fa-rss:before{content:"\f09e"}.phpdebugbar-fa-hdd-o:before{content:"\f0a0"}.phpdebugbar-fa-bullhorn:before{content:"\f0a1"}.phpdebugbar-fa-bell:before{content:"\f0f3"}.phpdebugbar-fa-certificate:before{content:"\f0a3"}.phpdebugbar-fa-hand-o-right:before{content:"\f0a4"}.phpdebugbar-fa-hand-o-left:before{content:"\f0a5"}.phpdebugbar-fa-hand-o-up:before{content:"\f0a6"}.phpdebugbar-fa-hand-o-down:before{content:"\f0a7"}.phpdebugbar-fa-arrow-circle-left:before{content:"\f0a8"}.phpdebugbar-fa-arrow-circle-right:before{content:"\f0a9"}.phpdebugbar-fa-arrow-circle-up:before{content:"\f0aa"}.phpdebugbar-fa-arrow-circle-down:before{content:"\f0ab"}.phpdebugbar-fa-globe:before{content:"\f0ac"}.phpdebugbar-fa-wrench:before{content:"\f0ad"}.phpdebugbar-fa-tasks:before{content:"\f0ae"}.phpdebugbar-fa-filter:before{content:"\f0b0"}.phpdebugbar-fa-briefcase:before{content:"\f0b1"}.phpdebugbar-fa-arrows-alt:before{content:"\f0b2"}.phpdebugbar-fa-group:before,.phpdebugbar-fa-users:before{content:"\f0c0"}.phpdebugbar-fa-chain:before,.phpdebugbar-fa-link:before{content:"\f0c1"}.phpdebugbar-fa-cloud:before{content:"\f0c2"}.phpdebugbar-fa-flask:before{content:"\f0c3"}.phpdebugbar-fa-cut:before,.phpdebugbar-fa-scissors:before{content:"\f0c4"}.phpdebugbar-fa-copy:before,.phpdebugbar-fa-files-o:before{content:"\f0c5"}.phpdebugbar-fa-paperclip:before{content:"\f0c6"}.phpdebugbar-fa-save:before,.phpdebugbar-fa-floppy-o:before{content:"\f0c7"}.phpdebugbar-fa-square:before{content:"\f0c8"}.phpdebugbar-fa-navicon:before,.phpdebugbar-fa-reorder:before,.phpdebugbar-fa-bars:before{content:"\f0c9"}.phpdebugbar-fa-list-ul:before{content:"\f0ca"}.phpdebugbar-fa-list-ol:before{content:"\f0cb"}.phpdebugbar-fa-strikethrough:before{content:"\f0cc"}.phpdebugbar-fa-underline:before{content:"\f0cd"}.phpdebugbar-fa-table:before{content:"\f0ce"}.phpdebugbar-fa-magic:before{content:"\f0d0"}.phpdebugbar-fa-truck:before{content:"\f0d1"}.phpdebugbar-fa-pinterest:before{content:"\f0d2"}.phpdebugbar-fa-pinterest-square:before{content:"\f0d3"}.phpdebugbar-fa-google-plus-square:before{content:"\f0d4"}.phpdebugbar-fa-google-plus:before{content:"\f0d5"}.phpdebugbar-fa-money:before{content:"\f0d6"}.phpdebugbar-fa-caret-down:before{content:"\f0d7"}.phpdebugbar-fa-caret-up:before{content:"\f0d8"}.phpdebugbar-fa-caret-left:before{content:"\f0d9"}.phpdebugbar-fa-caret-right:before{content:"\f0da"}.phpdebugbar-fa-columns:before{content:"\f0db"}.phpdebugbar-fa-unsorted:before,.phpdebugbar-fa-sort:before{content:"\f0dc"}.phpdebugbar-fa-sort-down:before,.phpdebugbar-fa-sort-desc:before{content:"\f0dd"}.phpdebugbar-fa-sort-up:before,.phpdebugbar-fa-sort-asc:before{content:"\f0de"}.phpdebugbar-fa-envelope:before{content:"\f0e0"}.phpdebugbar-fa-linkedin:before{content:"\f0e1"}.phpdebugbar-fa-rotate-left:before,.phpdebugbar-fa-undo:before{content:"\f0e2"}.phpdebugbar-fa-legal:before,.phpdebugbar-fa-gavel:before{content:"\f0e3"}.phpdebugbar-fa-dashboard:before,.phpdebugbar-fa-tachometer:before{content:"\f0e4"}.phpdebugbar-fa-comment-o:before{content:"\f0e5"}.phpdebugbar-fa-comments-o:before{content:"\f0e6"}.phpdebugbar-fa-flash:before,.phpdebugbar-fa-bolt:before{content:"\f0e7"}.phpdebugbar-fa-sitemap:before{content:"\f0e8"}.phpdebugbar-fa-umbrella:before{content:"\f0e9"}.phpdebugbar-fa-paste:before,.phpdebugbar-fa-clipboard:before{content:"\f0ea"}.phpdebugbar-fa-lightbulb-o:before{content:"\f0eb"}.phpdebugbar-fa-exchange:before{content:"\f0ec"}.phpdebugbar-fa-cloud-download:before{content:"\f0ed"}.phpdebugbar-fa-cloud-upload:before{content:"\f0ee"}.phpdebugbar-fa-user-md:before{content:"\f0f0"}.phpdebugbar-fa-stethoscope:before{content:"\f0f1"}.phpdebugbar-fa-suitcase:before{content:"\f0f2"}.phpdebugbar-fa-bell-o:before{content:"\f0a2"}.phpdebugbar-fa-coffee:before{content:"\f0f4"}.phpdebugbar-fa-cutlery:before{content:"\f0f5"}.phpdebugbar-fa-file-text-o:before{content:"\f0f6"}.phpdebugbar-fa-building-o:before{content:"\f0f7"}.phpdebugbar-fa-hospital-o:before{content:"\f0f8"}.phpdebugbar-fa-ambulance:before{content:"\f0f9"}.phpdebugbar-fa-medkit:before{content:"\f0fa"}.phpdebugbar-fa-fighter-jet:before{content:"\f0fb"}.phpdebugbar-fa-beer:before{content:"\f0fc"}.phpdebugbar-fa-h-square:before{content:"\f0fd"}.phpdebugbar-fa-plus-square:before{content:"\f0fe"}.phpdebugbar-fa-angle-double-left:before{content:"\f100"}.phpdebugbar-fa-angle-double-right:before{content:"\f101"}.phpdebugbar-fa-angle-double-up:before{content:"\f102"}.phpdebugbar-fa-angle-double-down:before{content:"\f103"}.phpdebugbar-fa-angle-left:before{content:"\f104"}.phpdebugbar-fa-angle-right:before{content:"\f105"}.phpdebugbar-fa-angle-up:before{content:"\f106"}.phpdebugbar-fa-angle-down:before{content:"\f107"}.phpdebugbar-fa-desktop:before{content:"\f108"}.phpdebugbar-fa-laptop:before{content:"\f109"}.phpdebugbar-fa-tablet:before{content:"\f10a"}.phpdebugbar-fa-mobile-phone:before,.phpdebugbar-fa-mobile:before{content:"\f10b"}.phpdebugbar-fa-circle-o:before{content:"\f10c"}.phpdebugbar-fa-quote-left:before{content:"\f10d"}.phpdebugbar-fa-quote-right:before{content:"\f10e"}.phpdebugbar-fa-spinner:before{content:"\f110"}.phpdebugbar-fa-circle:before{content:"\f111"}.phpdebugbar-fa-mail-reply:before,.phpdebugbar-fa-reply:before{content:"\f112"}.phpdebugbar-fa-github-alt:before{content:"\f113"}.phpdebugbar-fa-folder-o:before{content:"\f114"}.phpdebugbar-fa-folder-open-o:before{content:"\f115"}.phpdebugbar-fa-smile-o:before{content:"\f118"}.phpdebugbar-fa-frown-o:before{content:"\f119"}.phpdebugbar-fa-meh-o:before{content:"\f11a"}.phpdebugbar-fa-gamepad:before{content:"\f11b"}.phpdebugbar-fa-keyboard-o:before{content:"\f11c"}.phpdebugbar-fa-flag-o:before{content:"\f11d"}.phpdebugbar-fa-flag-checkered:before{content:"\f11e"}.phpdebugbar-fa-terminal:before{content:"\f120"}.phpdebugbar-fa-code:before{content:"\f121"}.phpdebugbar-fa-mail-reply-all:before,.phpdebugbar-fa-reply-all:before{content:"\f122"}.phpdebugbar-fa-star-half-empty:before,.phpdebugbar-fa-star-half-full:before,.phpdebugbar-fa-star-half-o:before{content:"\f123"}.phpdebugbar-fa-location-arrow:before{content:"\f124"}.phpdebugbar-fa-crop:before{content:"\f125"}.phpdebugbar-fa-code-fork:before{content:"\f126"}.phpdebugbar-fa-unlink:before,.phpdebugbar-fa-chain-broken:before{content:"\f127"}.phpdebugbar-fa-question:before{content:"\f128"}.phpdebugbar-fa-info:before{content:"\f129"}.phpdebugbar-fa-exclamation:before{content:"\f12a"}.phpdebugbar-fa-superscript:before{content:"\f12b"}.phpdebugbar-fa-subscript:before{content:"\f12c"}.phpdebugbar-fa-eraser:before{content:"\f12d"}.phpdebugbar-fa-puzzle-piece:before{content:"\f12e"}.phpdebugbar-fa-microphone:before{content:"\f130"}.phpdebugbar-fa-microphone-slash:before{content:"\f131"}.phpdebugbar-fa-shield:before{content:"\f132"}.phpdebugbar-fa-calendar-o:before{content:"\f133"}.phpdebugbar-fa-fire-extinguisher:before{content:"\f134"}.phpdebugbar-fa-rocket:before{content:"\f135"}.phpdebugbar-fa-maxcdn:before{content:"\f136"}.phpdebugbar-fa-chevron-circle-left:before{content:"\f137"}.phpdebugbar-fa-chevron-circle-right:before{content:"\f138"}.phpdebugbar-fa-chevron-circle-up:before{content:"\f139"}.phpdebugbar-fa-chevron-circle-down:before{content:"\f13a"}.phpdebugbar-fa-html5:before{content:"\f13b"}.phpdebugbar-fa-css3:before{content:"\f13c"}.phpdebugbar-fa-anchor:before{content:"\f13d"}.phpdebugbar-fa-unlock-alt:before{content:"\f13e"}.phpdebugbar-fa-bullseye:before{content:"\f140"}.phpdebugbar-fa-ellipsis-h:before{content:"\f141"}.phpdebugbar-fa-ellipsis-v:before{content:"\f142"}.phpdebugbar-fa-rss-square:before{content:"\f143"}.phpdebugbar-fa-play-circle:before{content:"\f144"}.phpdebugbar-fa-ticket:before{content:"\f145"}.phpdebugbar-fa-minus-square:before{content:"\f146"}.phpdebugbar-fa-minus-square-o:before{content:"\f147"}.phpdebugbar-fa-level-up:before{content:"\f148"}.phpdebugbar-fa-level-down:before{content:"\f149"}.phpdebugbar-fa-check-square:before{content:"\f14a"}.phpdebugbar-fa-pencil-square:before{content:"\f14b"}.phpdebugbar-fa-external-link-square:before{content:"\f14c"}.phpdebugbar-fa-share-square:before{content:"\f14d"}.phpdebugbar-fa-compass:before{content:"\f14e"}.phpdebugbar-fa-toggle-down:before,.phpdebugbar-fa-caret-square-o-down:before{content:"\f150"}.phpdebugbar-fa-toggle-up:before,.phpdebugbar-fa-caret-square-o-up:before{content:"\f151"}.phpdebugbar-fa-toggle-right:before,.phpdebugbar-fa-caret-square-o-right:before{content:"\f152"}.phpdebugbar-fa-euro:before,.phpdebugbar-fa-eur:before{content:"\f153"}.phpdebugbar-fa-gbp:before{content:"\f154"}.phpdebugbar-fa-dollar:before,.phpdebugbar-fa-usd:before{content:"\f155"}.phpdebugbar-fa-rupee:before,.phpdebugbar-fa-inr:before{content:"\f156"}.phpdebugbar-fa-cny:before,.phpdebugbar-fa-rmb:before,.phpdebugbar-fa-yen:before,.phpdebugbar-fa-jpy:before{content:"\f157"}.phpdebugbar-fa-ruble:before,.phpdebugbar-fa-rouble:before,.phpdebugbar-fa-rub:before{content:"\f158"}.phpdebugbar-fa-won:before,.phpdebugbar-fa-krw:before{content:"\f159"}.phpdebugbar-fa-bitcoin:before,.phpdebugbar-fa-btc:before{content:"\f15a"}.phpdebugbar-fa-file:before{content:"\f15b"}.phpdebugbar-fa-file-text:before{content:"\f15c"}.phpdebugbar-fa-sort-alpha-asc:before{content:"\f15d"}.phpdebugbar-fa-sort-alpha-desc:before{content:"\f15e"}.phpdebugbar-fa-sort-amount-asc:before{content:"\f160"}.phpdebugbar-fa-sort-amount-desc:before{content:"\f161"}.phpdebugbar-fa-sort-numeric-asc:before{content:"\f162"}.phpdebugbar-fa-sort-numeric-desc:before{content:"\f163"}.phpdebugbar-fa-thumbs-up:before{content:"\f164"}.phpdebugbar-fa-thumbs-down:before{content:"\f165"}.phpdebugbar-fa-youtube-square:before{content:"\f166"}.phpdebugbar-fa-youtube:before{content:"\f167"}.phpdebugbar-fa-xing:before{content:"\f168"}.phpdebugbar-fa-xing-square:before{content:"\f169"}.phpdebugbar-fa-youtube-play:before{content:"\f16a"}.phpdebugbar-fa-dropbox:before{content:"\f16b"}.phpdebugbar-fa-stack-overflow:before{content:"\f16c"}.phpdebugbar-fa-instagram:before{content:"\f16d"}.phpdebugbar-fa-flickr:before{content:"\f16e"}.phpdebugbar-fa-adn:before{content:"\f170"}.phpdebugbar-fa-bitbucket:before{content:"\f171"}.phpdebugbar-fa-bitbucket-square:before{content:"\f172"}.phpdebugbar-fa-tumblr:before{content:"\f173"}.phpdebugbar-fa-tumblr-square:before{content:"\f174"}.phpdebugbar-fa-long-arrow-down:before{content:"\f175"}.phpdebugbar-fa-long-arrow-up:before{content:"\f176"}.phpdebugbar-fa-long-arrow-left:before{content:"\f177"}.phpdebugbar-fa-long-arrow-right:before{content:"\f178"}.phpdebugbar-fa-apple:before{content:"\f179"}.phpdebugbar-fa-windows:before{content:"\f17a"}.phpdebugbar-fa-android:before{content:"\f17b"}.phpdebugbar-fa-linux:before{content:"\f17c"}.phpdebugbar-fa-dribbble:before{content:"\f17d"}.phpdebugbar-fa-skype:before{content:"\f17e"}.phpdebugbar-fa-foursquare:before{content:"\f180"}.phpdebugbar-fa-trello:before{content:"\f181"}.phpdebugbar-fa-female:before{content:"\f182"}.phpdebugbar-fa-male:before{content:"\f183"}.phpdebugbar-fa-gittip:before,.phpdebugbar-fa-gratipay:before{content:"\f184"}.phpdebugbar-fa-sun-o:before{content:"\f185"}.phpdebugbar-fa-moon-o:before{content:"\f186"}.phpdebugbar-fa-archive:before{content:"\f187"}.phpdebugbar-fa-bug:before{content:"\f188"}.phpdebugbar-fa-vk:before{content:"\f189"}.phpdebugbar-fa-weibo:before{content:"\f18a"}.phpdebugbar-fa-renren:before{content:"\f18b"}.phpdebugbar-fa-pagelines:before{content:"\f18c"}.phpdebugbar-fa-stack-exchange:before{content:"\f18d"}.phpdebugbar-fa-arrow-circle-o-right:before{content:"\f18e"}.phpdebugbar-fa-arrow-circle-o-left:before{content:"\f190"}.phpdebugbar-fa-toggle-left:before,.phpdebugbar-fa-caret-square-o-left:before{content:"\f191"}.phpdebugbar-fa-dot-circle-o:before{content:"\f192"}.phpdebugbar-fa-wheelchair:before{content:"\f193"}.phpdebugbar-fa-vimeo-square:before{content:"\f194"}.phpdebugbar-fa-turkish-lira:before,.phpdebugbar-fa-try:before{content:"\f195"}.phpdebugbar-fa-plus-square-o:before{content:"\f196"}.phpdebugbar-fa-space-shuttle:before{content:"\f197"}.phpdebugbar-fa-slack:before{content:"\f198"}.phpdebugbar-fa-envelope-square:before{content:"\f199"}.phpdebugbar-fa-wordpress:before{content:"\f19a"}.phpdebugbar-fa-openid:before{content:"\f19b"}.phpdebugbar-fa-institution:before,.phpdebugbar-fa-bank:before,.phpdebugbar-fa-university:before{content:"\f19c"}.phpdebugbar-fa-mortar-board:before,.phpdebugbar-fa-graduation-cap:before{content:"\f19d"}.phpdebugbar-fa-yahoo:before{content:"\f19e"}.phpdebugbar-fa-google:before{content:"\f1a0"}.phpdebugbar-fa-reddit:before{content:"\f1a1"}.phpdebugbar-fa-reddit-square:before{content:"\f1a2"}.phpdebugbar-fa-stumbleupon-circle:before{content:"\f1a3"}.phpdebugbar-fa-stumbleupon:before{content:"\f1a4"}.phpdebugbar-fa-delicious:before{content:"\f1a5"}.phpdebugbar-fa-digg:before{content:"\f1a6"}.phpdebugbar-fa-pied-piper-pp:before{content:"\f1a7"}.phpdebugbar-fa-pied-piper-alt:before{content:"\f1a8"}.phpdebugbar-fa-drupal:before{content:"\f1a9"}.phpdebugbar-fa-joomla:before{content:"\f1aa"}.phpdebugbar-fa-language:before{content:"\f1ab"}.phpdebugbar-fa-fax:before{content:"\f1ac"}.phpdebugbar-fa-building:before{content:"\f1ad"}.phpdebugbar-fa-child:before{content:"\f1ae"}.phpdebugbar-fa-paw:before{content:"\f1b0"}.phpdebugbar-fa-spoon:before{content:"\f1b1"}.phpdebugbar-fa-cube:before{content:"\f1b2"}.phpdebugbar-fa-cubes:before{content:"\f1b3"}.phpdebugbar-fa-behance:before{content:"\f1b4"}.phpdebugbar-fa-behance-square:before{content:"\f1b5"}.phpdebugbar-fa-steam:before{content:"\f1b6"}.phpdebugbar-fa-steam-square:before{content:"\f1b7"}.phpdebugbar-fa-recycle:before{content:"\f1b8"}.phpdebugbar-fa-automobile:before,.phpdebugbar-fa-car:before{content:"\f1b9"}.phpdebugbar-fa-cab:before,.phpdebugbar-fa-taxi:before{content:"\f1ba"}.phpdebugbar-fa-tree:before{content:"\f1bb"}.phpdebugbar-fa-spotify:before{content:"\f1bc"}.phpdebugbar-fa-deviantart:before{content:"\f1bd"}.phpdebugbar-fa-soundcloud:before{content:"\f1be"}.phpdebugbar-fa-database:before{content:"\f1c0"}.phpdebugbar-fa-file-pdf-o:before{content:"\f1c1"}.phpdebugbar-fa-file-word-o:before{content:"\f1c2"}.phpdebugbar-fa-file-excel-o:before{content:"\f1c3"}.phpdebugbar-fa-file-powerpoint-o:before{content:"\f1c4"}.phpdebugbar-fa-file-photo-o:before,.phpdebugbar-fa-file-picture-o:before,.phpdebugbar-fa-file-image-o:before{content:"\f1c5"}.phpdebugbar-fa-file-zip-o:before,.phpdebugbar-fa-file-archive-o:before{content:"\f1c6"}.phpdebugbar-fa-file-sound-o:before,.phpdebugbar-fa-file-audio-o:before{content:"\f1c7"}.phpdebugbar-fa-file-movie-o:before,.phpdebugbar-fa-file-video-o:before{content:"\f1c8"}.phpdebugbar-fa-file-code-o:before{content:"\f1c9"}.phpdebugbar-fa-vine:before{content:"\f1ca"}.phpdebugbar-fa-codepen:before{content:"\f1cb"}.phpdebugbar-fa-jsfiddle:before{content:"\f1cc"}.phpdebugbar-fa-life-bouy:before,.phpdebugbar-fa-life-buoy:before,.phpdebugbar-fa-life-saver:before,.phpdebugbar-fa-support:before,.phpdebugbar-fa-life-ring:before{content:"\f1cd"}.phpdebugbar-fa-circle-o-notch:before{content:"\f1ce"}.phpdebugbar-fa-ra:before,.phpdebugbar-fa-resistance:before,.phpdebugbar-fa-rebel:before{content:"\f1d0"}.phpdebugbar-fa-ge:before,.phpdebugbar-fa-empire:before{content:"\f1d1"}.phpdebugbar-fa-git-square:before{content:"\f1d2"}.phpdebugbar-fa-git:before{content:"\f1d3"}.phpdebugbar-fa-y-combinator-square:before,.phpdebugbar-fa-yc-square:before,.phpdebugbar-fa-hacker-news:before{content:"\f1d4"}.phpdebugbar-fa-tencent-weibo:before{content:"\f1d5"}.phpdebugbar-fa-qq:before{content:"\f1d6"}.phpdebugbar-fa-wechat:before,.phpdebugbar-fa-weixin:before{content:"\f1d7"}.phpdebugbar-fa-send:before,.phpdebugbar-fa-paper-plane:before{content:"\f1d8"}.phpdebugbar-fa-send-o:before,.phpdebugbar-fa-paper-plane-o:before{content:"\f1d9"}.phpdebugbar-fa-history:before{content:"\f1da"}.phpdebugbar-fa-circle-thin:before{content:"\f1db"}.phpdebugbar-fa-header:before{content:"\f1dc"}.phpdebugbar-fa-paragraph:before{content:"\f1dd"}.phpdebugbar-fa-sliders:before{content:"\f1de"}.phpdebugbar-fa-share-alt:before{content:"\f1e0"}.phpdebugbar-fa-share-alt-square:before{content:"\f1e1"}.phpdebugbar-fa-bomb:before{content:"\f1e2"}.phpdebugbar-fa-soccer-ball-o:before,.phpdebugbar-fa-futbol-o:before{content:"\f1e3"}.phpdebugbar-fa-tty:before{content:"\f1e4"}.phpdebugbar-fa-binoculars:before{content:"\f1e5"}.phpdebugbar-fa-plug:before{content:"\f1e6"}.phpdebugbar-fa-slideshare:before{content:"\f1e7"}.phpdebugbar-fa-twitch:before{content:"\f1e8"}.phpdebugbar-fa-yelp:before{content:"\f1e9"}.phpdebugbar-fa-newspaper-o:before{content:"\f1ea"}.phpdebugbar-fa-wifi:before{content:"\f1eb"}.phpdebugbar-fa-calculator:before{content:"\f1ec"}.phpdebugbar-fa-paypal:before{content:"\f1ed"}.phpdebugbar-fa-google-wallet:before{content:"\f1ee"}.phpdebugbar-fa-cc-visa:before{content:"\f1f0"}.phpdebugbar-fa-cc-mastercard:before{content:"\f1f1"}.phpdebugbar-fa-cc-discover:before{content:"\f1f2"}.phpdebugbar-fa-cc-amex:before{content:"\f1f3"}.phpdebugbar-fa-cc-paypal:before{content:"\f1f4"}.phpdebugbar-fa-cc-stripe:before{content:"\f1f5"}.phpdebugbar-fa-bell-slash:before{content:"\f1f6"}.phpdebugbar-fa-bell-slash-o:before{content:"\f1f7"}.phpdebugbar-fa-trash:before{content:"\f1f8"}.phpdebugbar-fa-copyright:before{content:"\f1f9"}.phpdebugbar-fa-at:before{content:"\f1fa"}.phpdebugbar-fa-eyedropper:before{content:"\f1fb"}.phpdebugbar-fa-paint-brush:before{content:"\f1fc"}.phpdebugbar-fa-birthday-cake:before{content:"\f1fd"}.phpdebugbar-fa-area-chart:before{content:"\f1fe"}.phpdebugbar-fa-pie-chart:before{content:"\f200"}.phpdebugbar-fa-line-chart:before{content:"\f201"}.phpdebugbar-fa-lastfm:before{content:"\f202"}.phpdebugbar-fa-lastfm-square:before{content:"\f203"}.phpdebugbar-fa-toggle-off:before{content:"\f204"}.phpdebugbar-fa-toggle-on:before{content:"\f205"}.phpdebugbar-fa-bicycle:before{content:"\f206"}.phpdebugbar-fa-bus:before{content:"\f207"}.phpdebugbar-fa-ioxhost:before{content:"\f208"}.phpdebugbar-fa-angellist:before{content:"\f209"}.phpdebugbar-fa-cc:before{content:"\f20a"}.phpdebugbar-fa-shekel:before,.phpdebugbar-fa-sheqel:before,.phpdebugbar-fa-ils:before{content:"\f20b"}.phpdebugbar-fa-meanpath:before{content:"\f20c"}.phpdebugbar-fa-buysellads:before{content:"\f20d"}.phpdebugbar-fa-connectdevelop:before{content:"\f20e"}.phpdebugbar-fa-dashcube:before{content:"\f210"}.phpdebugbar-fa-forumbee:before{content:"\f211"}.phpdebugbar-fa-leanpub:before{content:"\f212"}.phpdebugbar-fa-sellsy:before{content:"\f213"}.phpdebugbar-fa-shirtsinbulk:before{content:"\f214"}.phpdebugbar-fa-simplybuilt:before{content:"\f215"}.phpdebugbar-fa-skyatlas:before{content:"\f216"}.phpdebugbar-fa-cart-plus:before{content:"\f217"}.phpdebugbar-fa-cart-arrow-down:before{content:"\f218"}.phpdebugbar-fa-diamond:before{content:"\f219"}.phpdebugbar-fa-ship:before{content:"\f21a"}.phpdebugbar-fa-user-secret:before{content:"\f21b"}.phpdebugbar-fa-motorcycle:before{content:"\f21c"}.phpdebugbar-fa-street-view:before{content:"\f21d"}.phpdebugbar-fa-heartbeat:before{content:"\f21e"}.phpdebugbar-fa-venus:before{content:"\f221"}.phpdebugbar-fa-mars:before{content:"\f222"}.phpdebugbar-fa-mercury:before{content:"\f223"}.phpdebugbar-fa-intersex:before,.phpdebugbar-fa-transgender:before{content:"\f224"}.phpdebugbar-fa-transgender-alt:before{content:"\f225"}.phpdebugbar-fa-venus-double:before{content:"\f226"}.phpdebugbar-fa-mars-double:before{content:"\f227"}.phpdebugbar-fa-venus-mars:before{content:"\f228"}.phpdebugbar-fa-mars-stroke:before{content:"\f229"}.phpdebugbar-fa-mars-stroke-v:before{content:"\f22a"}.phpdebugbar-fa-mars-stroke-h:before{content:"\f22b"}.phpdebugbar-fa-neuter:before{content:"\f22c"}.phpdebugbar-fa-genderless:before{content:"\f22d"}.phpdebugbar-fa-facebook-official:before{content:"\f230"}.phpdebugbar-fa-pinterest-p:before{content:"\f231"}.phpdebugbar-fa-whatsapp:before{content:"\f232"}.phpdebugbar-fa-server:before{content:"\f233"}.phpdebugbar-fa-user-plus:before{content:"\f234"}.phpdebugbar-fa-user-times:before{content:"\f235"}.phpdebugbar-fa-hotel:before,.phpdebugbar-fa-bed:before{content:"\f236"}.phpdebugbar-fa-viacoin:before{content:"\f237"}.phpdebugbar-fa-train:before{content:"\f238"}.phpdebugbar-fa-subway:before{content:"\f239"}.phpdebugbar-fa-medium:before{content:"\f23a"}.phpdebugbar-fa-yc:before,.phpdebugbar-fa-y-combinator:before{content:"\f23b"}.phpdebugbar-fa-optin-monster:before{content:"\f23c"}.phpdebugbar-fa-opencart:before{content:"\f23d"}.phpdebugbar-fa-expeditedssl:before{content:"\f23e"}.phpdebugbar-fa-battery-4:before,.phpdebugbar-fa-battery:before,.phpdebugbar-fa-battery-full:before{content:"\f240"}.phpdebugbar-fa-battery-3:before,.phpdebugbar-fa-battery-three-quarters:before{content:"\f241"}.phpdebugbar-fa-battery-2:before,.phpdebugbar-fa-battery-half:before{content:"\f242"}.phpdebugbar-fa-battery-1:before,.phpdebugbar-fa-battery-quarter:before{content:"\f243"}.phpdebugbar-fa-battery-0:before,.phpdebugbar-fa-battery-empty:before{content:"\f244"}.phpdebugbar-fa-mouse-pointer:before{content:"\f245"}.phpdebugbar-fa-i-cursor:before{content:"\f246"}.phpdebugbar-fa-object-group:before{content:"\f247"}.phpdebugbar-fa-object-ungroup:before{content:"\f248"}.phpdebugbar-fa-sticky-note:before{content:"\f249"}.phpdebugbar-fa-sticky-note-o:before{content:"\f24a"}.phpdebugbar-fa-cc-jcb:before{content:"\f24b"}.phpdebugbar-fa-cc-diners-club:before{content:"\f24c"}.phpdebugbar-fa-clone:before{content:"\f24d"}.phpdebugbar-fa-balance-scale:before{content:"\f24e"}.phpdebugbar-fa-hourglass-o:before{content:"\f250"}.phpdebugbar-fa-hourglass-1:before,.phpdebugbar-fa-hourglass-start:before{content:"\f251"}.phpdebugbar-fa-hourglass-2:before,.phpdebugbar-fa-hourglass-half:before{content:"\f252"}.phpdebugbar-fa-hourglass-3:before,.phpdebugbar-fa-hourglass-end:before{content:"\f253"}.phpdebugbar-fa-hourglass:before{content:"\f254"}.phpdebugbar-fa-hand-grab-o:before,.phpdebugbar-fa-hand-rock-o:before{content:"\f255"}.phpdebugbar-fa-hand-stop-o:before,.phpdebugbar-fa-hand-paper-o:before{content:"\f256"}.phpdebugbar-fa-hand-scissors-o:before{content:"\f257"}.phpdebugbar-fa-hand-lizard-o:before{content:"\f258"}.phpdebugbar-fa-hand-spock-o:before{content:"\f259"}.phpdebugbar-fa-hand-pointer-o:before{content:"\f25a"}.phpdebugbar-fa-hand-peace-o:before{content:"\f25b"}.phpdebugbar-fa-trademark:before{content:"\f25c"}.phpdebugbar-fa-registered:before{content:"\f25d"}.phpdebugbar-fa-creative-commons:before{content:"\f25e"}.phpdebugbar-fa-gg:before{content:"\f260"}.phpdebugbar-fa-gg-circle:before{content:"\f261"}.phpdebugbar-fa-tripadvisor:before{content:"\f262"}.phpdebugbar-fa-odnoklassniki:before{content:"\f263"}.phpdebugbar-fa-odnoklassniki-square:before{content:"\f264"}.phpdebugbar-fa-get-pocket:before{content:"\f265"}.phpdebugbar-fa-wikipedia-w:before{content:"\f266"}.phpdebugbar-fa-safari:before{content:"\f267"}.phpdebugbar-fa-chrome:before{content:"\f268"}.phpdebugbar-fa-firefox:before{content:"\f269"}.phpdebugbar-fa-opera:before{content:"\f26a"}.phpdebugbar-fa-internet-explorer:before{content:"\f26b"}.phpdebugbar-fa-tv:before,.phpdebugbar-fa-television:before{content:"\f26c"}.phpdebugbar-fa-contao:before{content:"\f26d"}.phpdebugbar-fa-500px:before{content:"\f26e"}.phpdebugbar-fa-amazon:before{content:"\f270"}.phpdebugbar-fa-calendar-plus-o:before{content:"\f271"}.phpdebugbar-fa-calendar-minus-o:before{content:"\f272"}.phpdebugbar-fa-calendar-times-o:before{content:"\f273"}.phpdebugbar-fa-calendar-check-o:before{content:"\f274"}.phpdebugbar-fa-industry:before{content:"\f275"}.phpdebugbar-fa-map-pin:before{content:"\f276"}.phpdebugbar-fa-map-signs:before{content:"\f277"}.phpdebugbar-fa-map-o:before{content:"\f278"}.phpdebugbar-fa-map:before{content:"\f279"}.phpdebugbar-fa-commenting:before{content:"\f27a"}.phpdebugbar-fa-commenting-o:before{content:"\f27b"}.phpdebugbar-fa-houzz:before{content:"\f27c"}.phpdebugbar-fa-vimeo:before{content:"\f27d"}.phpdebugbar-fa-black-tie:before{content:"\f27e"}.phpdebugbar-fa-fonticons:before{content:"\f280"}.phpdebugbar-fa-reddit-alien:before{content:"\f281"}.phpdebugbar-fa-edge:before{content:"\f282"}.phpdebugbar-fa-credit-card-alt:before{content:"\f283"}.phpdebugbar-fa-codiepie:before{content:"\f284"}.phpdebugbar-fa-modx:before{content:"\f285"}.phpdebugbar-fa-fort-awesome:before{content:"\f286"}.phpdebugbar-fa-usb:before{content:"\f287"}.phpdebugbar-fa-product-hunt:before{content:"\f288"}.phpdebugbar-fa-mixcloud:before{content:"\f289"}.phpdebugbar-fa-scribd:before{content:"\f28a"}.phpdebugbar-fa-pause-circle:before{content:"\f28b"}.phpdebugbar-fa-pause-circle-o:before{content:"\f28c"}.phpdebugbar-fa-stop-circle:before{content:"\f28d"}.phpdebugbar-fa-stop-circle-o:before{content:"\f28e"}.phpdebugbar-fa-shopping-bag:before{content:"\f290"}.phpdebugbar-fa-shopping-basket:before{content:"\f291"}.phpdebugbar-fa-hashtag:before{content:"\f292"}.phpdebugbar-fa-bluetooth:before{content:"\f293"}.phpdebugbar-fa-bluetooth-b:before{content:"\f294"}.phpdebugbar-fa-percent:before{content:"\f295"}.phpdebugbar-fa-gitlab:before{content:"\f296"}.phpdebugbar-fa-wpbeginner:before{content:"\f297"}.phpdebugbar-fa-wpforms:before{content:"\f298"}.phpdebugbar-fa-envira:before{content:"\f299"}.phpdebugbar-fa-universal-access:before{content:"\f29a"}.phpdebugbar-fa-wheelchair-alt:before{content:"\f29b"}.phpdebugbar-fa-question-circle-o:before{content:"\f29c"}.phpdebugbar-fa-blind:before{content:"\f29d"}.phpdebugbar-fa-audio-description:before{content:"\f29e"}.phpdebugbar-fa-volume-control-phone:before{content:"\f2a0"}.phpdebugbar-fa-braille:before{content:"\f2a1"}.phpdebugbar-fa-assistive-listening-systems:before{content:"\f2a2"}.phpdebugbar-fa-asl-interpreting:before,.phpdebugbar-fa-american-sign-language-interpreting:before{content:"\f2a3"}.phpdebugbar-fa-deafness:before,.phpdebugbar-fa-hard-of-hearing:before,.phpdebugbar-fa-deaf:before{content:"\f2a4"}.phpdebugbar-fa-glide:before{content:"\f2a5"}.phpdebugbar-fa-glide-g:before{content:"\f2a6"}.phpdebugbar-fa-signing:before,.phpdebugbar-fa-sign-language:before{content:"\f2a7"}.phpdebugbar-fa-low-vision:before{content:"\f2a8"}.phpdebugbar-fa-viadeo:before{content:"\f2a9"}.phpdebugbar-fa-viadeo-square:before{content:"\f2aa"}.phpdebugbar-fa-snapchat:before{content:"\f2ab"}.phpdebugbar-fa-snapchat-ghost:before{content:"\f2ac"}.phpdebugbar-fa-snapchat-square:before{content:"\f2ad"}.phpdebugbar-fa-pied-piper:before{content:"\f2ae"}.phpdebugbar-fa-first-order:before{content:"\f2b0"}.phpdebugbar-fa-yoast:before{content:"\f2b1"}.phpdebugbar-fa-themeisle:before{content:"\f2b2"}.phpdebugbar-fa-google-plus-circle:before,.phpdebugbar-fa-google-plus-official:before{content:"\f2b3"}.phpdebugbar-fa-fa:before,.phpdebugbar-fa-font-awesome:before{content:"\f2b4"}.phpdebugbar-fa-handshake-o:before{content:"\f2b5"}.phpdebugbar-fa-envelope-open:before{content:"\f2b6"}.phpdebugbar-fa-envelope-open-o:before{content:"\f2b7"}.phpdebugbar-fa-linode:before{content:"\f2b8"}.phpdebugbar-fa-address-book:before{content:"\f2b9"}.phpdebugbar-fa-address-book-o:before{content:"\f2ba"}.phpdebugbar-fa-vcard:before,.phpdebugbar-fa-address-card:before{content:"\f2bb"}.phpdebugbar-fa-vcard-o:before,.phpdebugbar-fa-address-card-o:before{content:"\f2bc"}.phpdebugbar-fa-user-circle:before{content:"\f2bd"}.phpdebugbar-fa-user-circle-o:before{content:"\f2be"}.phpdebugbar-fa-user-o:before{content:"\f2c0"}.phpdebugbar-fa-id-badge:before{content:"\f2c1"}.phpdebugbar-fa-drivers-license:before,.phpdebugbar-fa-id-card:before{content:"\f2c2"}.phpdebugbar-fa-drivers-license-o:before,.phpdebugbar-fa-id-card-o:before{content:"\f2c3"}.phpdebugbar-fa-quora:before{content:"\f2c4"}.phpdebugbar-fa-free-code-camp:before{content:"\f2c5"}.phpdebugbar-fa-telegram:before{content:"\f2c6"}.phpdebugbar-fa-thermometer-4:before,.phpdebugbar-fa-thermometer:before,.phpdebugbar-fa-thermometer-full:before{content:"\f2c7"}.phpdebugbar-fa-thermometer-3:before,.phpdebugbar-fa-thermometer-three-quarters:before{content:"\f2c8"}.phpdebugbar-fa-thermometer-2:before,.phpdebugbar-fa-thermometer-half:before{content:"\f2c9"}.phpdebugbar-fa-thermometer-1:before,.phpdebugbar-fa-thermometer-quarter:before{content:"\f2ca"}.phpdebugbar-fa-thermometer-0:before,.phpdebugbar-fa-thermometer-empty:before{content:"\f2cb"}.phpdebugbar-fa-shower:before{content:"\f2cc"}.phpdebugbar-fa-bathtub:before,.phpdebugbar-fa-s15:before,.phpdebugbar-fa-bath:before{content:"\f2cd"}.phpdebugbar-fa-podcast:before{content:"\f2ce"}.phpdebugbar-fa-window-maximize:before{content:"\f2d0"}.phpdebugbar-fa-window-minimize:before{content:"\f2d1"}.phpdebugbar-fa-window-restore:before{content:"\f2d2"}.phpdebugbar-fa-times-rectangle:before,.phpdebugbar-fa-window-close:before{content:"\f2d3"}.phpdebugbar-fa-times-rectangle-o:before,.phpdebugbar-fa-window-close-o:before{content:"\f2d4"}.phpdebugbar-fa-bandcamp:before{content:"\f2d5"}.phpdebugbar-fa-grav:before{content:"\f2d6"}.phpdebugbar-fa-etsy:before{content:"\f2d7"}.phpdebugbar-fa-imdb:before{content:"\f2d8"}.phpdebugbar-fa-ravelry:before{content:"\f2d9"}.phpdebugbar-fa-eercast:before{content:"\f2da"}.phpdebugbar-fa-microchip:before{content:"\f2db"}.phpdebugbar-fa-snowflake-o:before{content:"\f2dc"}.phpdebugbar-fa-superpowers:before{content:"\f2dd"}.phpdebugbar-fa-wpexplorer:before{content:"\f2de"}.phpdebugbar-fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/FontAwesome.otf b/htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/FontAwesome.otf deleted file mode 100644 index 401ec0f36e4f73b8efa40bd6f604fe80d286db70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134808 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 diff --git a/htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.eot b/htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.eot deleted file mode 100644 index e9f60ca953f93e35eab4108bd414bc02ddcf3928..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165742 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 G*yFsbY~cLNXLP73aA74Mq6M9f^&YV`isWW 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

5q!RY z*BeMp5!YRitn`g&nth8{m6Dd0QYAj0ZxqJ;!r>+5bAHQflhf0aYx(Url?1GY6U}5F zylvy$dA2fK(`58 z4KJ8nnOPF^3Rx@@8g_Vg6GI*_Bng?U4A#>qx-1Jv@{q$QbMPz!SyL+_iFRlz_(NHK z0V0O}tchz`Cb(6e7?+~x9pfb%8)c-+N~ShwBa6&z&P!?UfKd=_feP)X9~S=&MC3F( z*fN(l@lMz-Sg_16J{@jx<&VV<$8Y)g2W-?OuM)0zALCcypa7@C54l}4jp82+hE{_p zzbA6zM`9T_Oj{2RAI9}Nc{4Y$2PA<_)4TPX&X=UEl76Wmy`q=?CUS>c{DGdm^`|%G z(s%#%Hrw?koB7l6V{b8-VY{XAvxUrI5`qnSe&|K^v-^%e^oLtN=Nq48kKc0Q$&at- zZW5)*hobU>eO7s-$XtWXd)6mnm%lcTUi zK&*foQA{K#vaRajK9rcS7^w0jBmjFlBtBqCDQ+x!lKgTGJR=daf)T>G+sSz z>3!F|bshfrxlql3dksJ;yki`JCk>MLXg+mixfSh^nFV61GuCX5b*731Gb8O4vs+sD z4ZYW1+uL*PwerFv_UNOOT|#!KNGU?!W7<_aPf)(m1c|p*IQ7F$KslqsvIdML5`{$z z0qCeH@IM!*f^8%E$}_%2`zkHzlwXZbDe}9@bPMTFJd+e=i*a)@X7LHY13w}nwL}8*;!Y- zX2blTm}2po@Xu>WVIroz;-*=>PVN;djL-t96631*$$`%G82II>ph;?=TR4h2OMLSQ z2;d3;a80}nlz<;SHDQ`N9Q8jut4l5tVPQt5)YGAfWfy`Xy6Bw73Vm@xer|4VenPRn zqA@3W4m762OLl&L=g#koX_H0iV;tizI$~lRyxb8pIi6uPkq;}DBs2pY@?nAnJs^TD z8|!JS5EC74lgaH!6f4?##+LEvRQOK$x77r0bYambGsZy|W;q?ZfFQGZ5=^R43MD)+ z6i<$Qt^anS2UQ>elc`i$>dK&I$F<#sLe2x&ChT#9G~oMJ&o1ngsLNFmOi*H=P&BPU zE%f!18&NkWEbGE^zTUBW{);XJ1bwMMA8S@RNVDicF2Bdt*M5m!(Yp7|v1MQDVfLib zz2nWNI`Y#~z5BOQaVG)<*(#Jz?qZkt@@afP>W-7vV$y2Q#<~IOO|h;-EJ;N!4Tpo^ zU@8)hpk4hC!wy5Z)+7DJvtx7JcFpS9~Tv{OBpIM#U2D zk8XI`IcLd|InI}FIB@^{{6VN6P;wTAVBz=ve3qTy(=>t;n$`JeDcSLbsnk>E0m)Rm zW;_r~w&+rLE)V!M3z+;R)%Nb?WP5k7{P1TeUF_R`TC8z@?dLmK?~c#!(i*JSku2pS z--8$Fh@<%s*^)j0|Hg>bt>QjBE@Ipwk1==?343tLN;5Apv7hZkM!Shz~&+WynJAc08`uE`A{YtbCi2_ziC%N89v&j=UV=9qCt+GB%BC8;6h8AOLkTMEk zmx-ycsJ!u=#_~lu7w>+0_wJ|J&2VsFBTHw1WwLR$zLvoJ2*eqifiaekEnhy?+g>qu zZUvMf6i_~XSZe<2FrZa>nW!ptu~C5*5DIxY4HuAXNgnh}=7P5nA$+QwLt^``9#_+H z`mfOG+2|DlO&aD@zvygqs~}VbIiMpZi`#jGF-KZ`QT1chMfGWp>G|yL{OMzgD2xcf z&2eS^aeS+cMN(CcBrQxb--Af)ayk_`(~P!%i4=x2Cw_f+-HJeUbzsH1aM}F%>=s2% zM?Q*#8b&>34M=@f(d_9+*56D?Cr|Z%*N>-GXSyHS;W-Dk(&ZigO8Ro{e)| z{{oOe9gI!SmzU>HpVXWG_x(8bB|uKEg4`tZS&zOeJJplyEu|O751;DAFHVI{_uT2Y z6Ay~b#|bRYM44Q%QFaXTC?4xNd0&1-8@TY3-3 zAO33h?)O>J{;hv};kxBFUs|-Ta#}6_1WHvE^7Ha@@(<-7N99dz$V+mztm%#Hmv<&K z_OGe&&wu#3!(#WjKp8E2Vr{y2@G|Zkmfe#|!58R;hVaITt?gwBL01ilO z3ZFxoXLNL_9Mm{*e31+Tuo^8#Vy7NKITuBG1;>E_=_lK;$bl%VrP|4lA`n66UO>>; zpAzE?H7L6DBr}1{9C5%&p}?Iip-(U^m1ib7u@_Ve$B7W}G$G9eeN%KUjA3F2^CMpj zvrcdO;LWT-zsonhwPf=-f#p2T?lwu&)02+B5bsY<5-Z~UZ`Z}G%5qu^PJba{q69~t zw^lIQDm{`Y`26svo|_baJZrQ*Ve_>mGaE|ck`i1wfvGuDvl5*~yP@+UWrg#?xstWW=82!@sC2}|#8tq6 z1uss{tST(5%51I5b4wBzoR++2wv}z|>)jj-0_YgN!Z4Eqh( z#6fa_%rF{Q1v5Y;0ydA&QhX3^yT+8|J8?KE#u@u7&SESEi`)VT={;J_d%r;+;Wzwy z`F^YXkR>tBFoVH5i)5BB`N-3CTL!=3n-mH#v0$Eu)+w8El3a>)m8>vm`-(DXhJ*72 zfB;Ys@uq;74|>^vV{n17eegk})k9i06F*LvrJ-`HvSF-#DuPq%pM?4DF;&QKObL%2 zQT~zg`_%RrVb6)tnD(jjcNGXaiW=7y?3%yx$tQO{E`P}kk3X`5zd%pp6+76as&b8@ zU_*`m|Ge#d&-nju+s^jL|4-T;DkW>X|8HSt&z}Dqh|&C2D)4Sn=$j%~7X&3a0qO9yeGA>hr{%c;twgFkKCw@86vM zU*w<2r`PgL+@u=xvT6$`$KR7uhb^|n?gu0S&eo_F*ooTumu!(V= zZl~^Y-G1Fc-EF%2bl=lGMHYOq$2OcI`G_3II`xEo_ry70SQ(#iz^~oa@jCrH5kGmy zJ_W2ETHF<&An7^cLxTBu8f*fdiSj4%Pu%}i`De#ZJnPAUJ!rq_HRHOP=`LF}_A0y@ zcK)Ih7c197<+^uLSd9@EtJFHUXa_d*&MWN7@mMUd&Llst+&mekM4U0rm5xH)b?j@o zU;no;YHjSuk-J8pCE9(H$I~C>^+r80de;&59co*2;iRil))_J5r?v-tY{P*CF1zo{ z#ubhP(#hu%%uP%xM=f*lzl~ArQudG}>!_1ttj*QX_1g%DP)J0dO3L||o7^TqmPPqb z=F2lc$0-yW(U8RE2lYqdqG7P}v7et1?FU;>Igx^jJ4xB%bOYQ6I?|w14k+s==dU<; z5{^Zs#Cqfto>+)aAK}UJU*9nzr65A9=B8&Jkzf4YxyNp9V(f=EL6S{iM$R0@eaE&M z4V!+zgez}lMepqxKepqE9Xp<2xAd$tg0}G*%$2pH&u`p$#AdFmF&knf?ld;_aN(l& zFTCoXSF@GN2i|U7y}I@7{uOsJ-RJVT%LS{cINAqZ@*);^>|s`Lr`gbZ-|xqJBoD(z|^>f}mZ^yAq^oCu3R%L4-r#J=<4Ooig-dkn*oo4Vcpo!xc5B0c5-8YXx z9<_P$zK>ykW1Gpy#<}k7{oBM*k(&4D5!!vz1!Jx7UlbpNg3bzDughUkIULxV_62H7 z&e$4jd|Sm4Jm@!a1&{r{fX0m#A)izODZ;2mMy?5QEHV=2Dxs#qx*uFl*>@IxD zH>5q4SAJR4odE;XpDK=5V2K=Ie~qj!WP$M^`4y@88)$ge!Gkz5eC?a)b>h|P3>@nR zOyQ$H3SmF`hq^b=Cw`dw@Icyv>?c9K4I4K%+6W6p%q!19G?!yjT2)z|)GK&;jrWc$9ufXrw99RU~#s+9!Ivp!ekG66gjP#Z3p< zWrf^OC6;;=IT?@oUh;VTS#}W!29oPYf&h@xSz8^+;>fmI>_Mlz+UPYHjRvpLa46lH zZu48M>TN4U8H^q$+mm)p*k35lnP2Va9)nA77bL;(oZ$7P>9bePaOGO99DY~?A+KC- z-mr9PZ(_0`qco*pxjk{J(-z2b720ezb3uuX;|we_InI+FNlRV*h?Bv*SWI4S4un}v zz9?^bY)Xs`PKC2KNG#E26O$p??%<|$?upBF*=??Z=O0a3zA2%or)zrF-!YI6VZy1aKN#^Q>N zho*lbG9`&ZV$+_G-Q(;lDolHHrqg1Lj;r)Uxuzv^y@^Q<39iR-GD983og+!Pdc7f# zGkr>3ZE`q1HaYCi_gUf|WTxie_VRVhmI$0}{U#995sm{M1Psmu+(nVTFiG8&3NFY6 z0#d-lBW`Auh&UWFA}T#q3emX3@)?>wGE8 z8^(W`=#XZQZ^VJCzzb$w0n2^QY_AV6c`iuJ$LIU2sGt9MDY(51x|P|XznE%2NWz97{`x-sjWl?W*k(jiGvfG zDiDdSL_&N6#`n?<{w!D}jB=H_Aa-0RrKP7q%Q#T#ff)y|RTQm_5E7I@=;Q19D%Uf{ zC8OPB!tNcuieO*U0@L@RAnGN(5ofW--`}>4J-FefM7Q-&Prr^L!vqVlSbzYxi?9i!!v#fD(@+Ji>SV#- zhrj^|6jX77FNHXf^jV~GO~?b8NYf39?)r3}PJo~<{Mq1@w@`q%2GVhCca;BtyKn|< zXhe&f^^&dd{GQR2s6(}EvApiiIG-Rc&6Kv~rR66}htK`F{QgbX$ba3C?3jA{w|3`b zr)HZ(;ryT6vaLaMl&78Z<-=EJW_r@$Of2-8JihypoJ%i0FDvWHEzf;A#~$DC>sO1@ zX06G{ByTx$pz^MdO3wuHD4f|7ND{bIkzEVtS4P+LTdKKbNzU%XkR#1^2o^jl4*c@i zkC29{1%^*IPcMLXz>*_ytsO4p+`P+Gs}46yzb`8j?$VKy(qAx%uKT- zrgr|+jE#S()aTUJ$Hh8LuDF)imQ1(UeDk^*i`DCIW9Kr{?)k6De;iJ=#KUOuYS`xs zoY%c3KHl2kzvRjtxw$;X5g(h7U^S;qHTw2n{?aYOZHZ})IaB=$hUEr~U*<`x{vGMB zIH@WI1-e49IE7__@IRvQ?2sb|1@$Qf8OgCH^+F}um0fT-Y0Kv<)7!@Q<0VAPVkx~L3EgHnVH!c zsj)UT{*&!bw8WO~IKsTQ=B&usVtY;ACCk@aZ@x7F?j%!Qdzub`o>p)AYhG(JE_&ea z@~to2%nJVc`nMuE-etEA2dX6dX$S z?24eHO)}jB(9OOQdfE5G_7CJv$wDR0Q^|5=>Hqebte64SYEojbq#NTV`3J?vEy+FL zEa89kd}PpB?8F}|a{k-9_}%jC6GzBqs!*L>4#Mbv&Y~0vmY>t<^x^lPh7Ny)3d*x3 zs_eLta-xLK|A#w`4bv52eOrX}?JA-*0j;27Ag1Gi5TB44g=ctmEu!r-9mU|CVqzsq zf(9D4&=aD5m?c%PVO#);3D-sq!N=zI}Liha5PM|k0Bvc zhE$6D5LJg|Cey|;!$_e|zT*k6&1MgHpD42hX4*RBKfmVWv8g%EL9iPJojIwo-1(aP z=MLMENC zlPJHW__Pcs<(lHzEvY@WQZE{{;jq8doXPTUlwbHXIyc2-j2?T7WC7nAi#EDaa-%A-cnmns=lx&RbO@RAPk%5=Soykq1~<)B)@SZtN7-EqHFDoCGNR7m4^nhuYq9Tg)YmlhQ)6kbmT-1T^(v4)5SiTP=d47`;gJ!5Fx``YNp zd$)BP5c=8Z4a|KnnPL8=7_8`9Y zuK~nM0Zg)GW#R`jNPe9CPd0sY>O7ug0)&TeDZT%ml7|+=d>$juV8s{8ud#PO@BEBy z|H0y?`7~P46`W&C*()jdimRIQ))>^fOn&m3paOu*0Flg z(~H(Cxsd;KNqqA+P=(mDo@9pA&{4OJcXS`=KE*de6w41m zS8OY=Wq>RtCWKzuVnB~s-D?OjdSwft>=M9@P`DCd5(W=@1Il_&s}49BSbvbCiZKu7 zoMHu5XIJ?an5Gno35N*;4|X6BD2bW@l8)grnwKcjbN>ei^sP>^eOfPJ#S_D(gwGYI!YV=NrJx&muiF}3C zkd|Y$;4&VQF&&F|bTqD#=(3jA_^krX3jt|*QZdZv-x!x;ArzOHEl`|?)ybUsBt~6te+nqYz>vSY0 zOmjLN;VS->=yW)!8EDM+9dKG2PB!OHMvL9x@JIi};?MN@jd$K;N@9Me{AFUOJ=SCs zQtnJvD~s35??&as8l&hUgu_->bai}!HQF`K66^fd@>;jc%BwfZU(TB@G_IH6;do|2 z*X%X+jaS}WIrZY9C8lNPS9r@}3^h%=XFC@+ck)4Zi5*|9T+zTJxCh5)i>?z>+-ag1 zlbt4sUSUJRbbNL~VpW=Re5oT&6r${oczpaZPuS@&=ZAf;`mc*+e%c8s|B7_YS{Ob! zba!fDj-A90wXgur@8?=r)LB@(7M66d{iB8Th~KP*4Z1}<2P!?d3I5?tC^r0IDlxvsr=9`9!^0Xn{M8i6eL(Qq?p=at& zDr*RJv?G0=(rrD6Ye6iQ2LwP662wfN&*9^dj_}`n@e@lv${JnXYSOWDt5i)VvlImI}KE{+kkt zFj8u-^edxPgv{SmW>GIbvVS;&_X>?ew}17IKZiFAl#qZ^!acf6amI9&?rPWy+N-;g z5xR!ERY;K=m=WGt&CG&bnhoTpgE^rB7|mSF&0?_Vd08y{wZyXoNLwUtLO%i*>UNtOv}uKIl^putByFHc*Dy2u#9mVw>TOd@I|=&cVj` zJcv(jXJhOFb|KrrE`r;^U2HcbNiKov>K=9(yPRFYu4GrStJz+54co`|vjgl~Fv@lv zyPn+uA3+CUq5CFwnBC02&2C}0vfJ40><)Okx{KY-?qT<```CBb{p`E!0rnt!h&{}{ z#~xvivd7?V^$GSQ`#yV$JX+Fo>{S@i z{TX|m{hYnQ-ehmFx7j=F7wld39{VNx6?>oknjK{yuw(2)_7VFHtf~GEo{K(ae_(%P ze`24oPuXYebM|NU1^Wy8EBhP!JNpOwC;O6p#g4NRY@EsLB-e4qITyIdB@S*1H|o;3 ziJQ3v-hpf!h6A~iNAYOx;%*+pJ>1J;0=5xpT%eM zIeadk$LI3}d?9b-i}+%`ME5#h%9ruwd<9?0SMk++4PVRG@%6lkH}e+W%G-E5kMIsC zJ#_JIzJd4fUf#$1`2Zi}8~G3)<|BNRZ{nNz7QU5l=cIDdja$-mE^ z;!pD*@FV;g{w#lv|B(NPKhIy_FY+Jrm-tWkPx;II75*xJjsJ|l&VSC|;BWG`_}ly) z{tNyte~Tgu$p6GY;h*x)_~-o3{0sgU z{#X7t{&)Tl{!jiT|B4^yCpdIt`AIE`oLaLA^qzf5Brr;N{glr*4$QAO0e4#)9FHR^H zN`!z=DgxA_}lh7=*2(3b!&@M!T4xv-%61s&A zLXXfZ^a=gKfG{X*6o!OhVMG`eHVK=BEy7k|n{bYBu5ccdNVW@O!Ue*G!VcjgVW+T5 z*ezTvTq0a5>=7;#E*Gv4t`x2kt`_zR*9iNB{lWp^Tf()%b;9++4Z@AWLE(^alWwe&M^q1G;@uXK%~!u+%p?+})-hjslmcibZtxav+Lv6hg)HxVw88Kj~ z236H%q^2kZ_71f5h#kExoo0MY`(W2Ve`MIaX`pwsFVckeShOHjVA8^)gZhm_Z3FEQ zLo2!icVVQZQ^aprY#kWrG17%rcxiB`yMILA*3uUlY7uF9#rxiNefLNU7DCHNWXniX zSA?iQvl8Ci-9FM~#=Fk`rrt=$h*b?@$sCCcS=0xGGPJ4T4Wq*&-5py+`W8!fe>>8t z`LwW-*51+57NK5i+SJ`1888fXw~dSrMf8J_{lgD8Hz}4T@myU4VZ0sBr@34+S1muxn-!`*3p74oOm)$1Vrj|X|M%A0Kga+G=Tb{ z(zfKalco=rmo>X+Ll9+Xco4fc)>HxXc%`?~wJphX2DCE761qugy9 zM1=@NCh9g$=SATbZr_y!_{n;Newzc#|`rBKE^h4Mx4D=b=2KxFi-uk|l z&i=@Vd7{5Y2T%1QwGZGvvN;kNvEkDP2dT(5Ojv6NpfEC|R%X#2s0j|O;hQ2uAV*tz zqqOI)fuZhgL>=~;0P#(2fQu39$mZ@5z@^&p1Y`vE%9B-v_$E|7G$8auwu+d|!$z&i z!?uyG(Z1Ha4sG(Jb0~I?^HBv8dP`{+icZ&kzYDM;m$*Vq^ zl>|y=gZ9D3iEq`bCF@6lhT3{805MD&>fm-^Xn0uYYHv5T0vgbH{bFmRx7X4}-P(bU z9f_E`FpNzqbSpuc?*=6_I%rbv)FDwSa5kNW$mla-lmZ-QM2!xfnTd)44j*WZ=r<2x z&UZ;8EyF#-dSF!anW=TCJJQjHO^lf!SDhzP=g`3DAka#Gj|6}mZP&L(T7V&hw$Tv` z<=|HHV9THaKiz}kF!rxz8l9$A0BR2)ZeR$&#YcPjKrb-HPX@;`+GER!N6jA3M}8GRlZX`(O1 zJfR>asT!bewWvX*uP|?b+53mZ;ejE58ZJsUgA&5znONBfM6gDvuqLA20|1y#z<)cI zq}Bn9u|)%CN@<+{ZF(RaKLU6i!7gvm2uL5o*tY;90_T~5+q-}?M|)e1zzZ1X&WK&< zVx<|hbXnC$6;chfls5IXTab68YhW0iA2AM(c8}1A840MUMtvI=sz?MY%mA=5t(3}g zLZ8q&+TDxU(rHBIL0WfAEq$oHrN1qr?~AnebdOj%s7a`0Lj+BaU>)dE`d#cO?ubOS z4~$}lfxL!=I@5dA`5q|4BW)qSv~-3T(N#XWN0tGc7k%CGBuR1L>hY|AZH0@r~w6H(Zn`&H8Uw_or*%qB>}U#whBE%n}ybqHX@TFrc-m)soc#gzu>60&Z^YC75)QI|ID zLEM62Hqk|iK9z<#)6fpM0Z|Q<4gzojd4a~lbLUV?pS}Y$ZO@R<(%vt2l$4d&Tf0YE zf!KkK)nNc8>>aXOP7_nMNzbE$liw0tIVZhUr}$=&xdWSr4Vb1w1KsTs zCdTL%G_$*v)|TO(t%F$921bX5H;!Ua0673q8PInCE%!!5y3hhX(mf~)kJ8YF!v@;i zbZ?3Xt)rcMQ;)Pc(%m|MjYB{Fkf1DJSH2z7LB-q@7mQIqU}6pKRY`Dq6}GnzfF4k` zA6n;^m0LG~6bDtRv;@aqncoGP%W(%1qF+dDOik5 z!D3_z7E`8@V!F`V63SFUnMzPiumsfvODIPPqGQmzuQ!q?9!juDcjB%kH zVXdhR$~(#wF2j&?DDNm!8NDc@Ol6d*j9!#cHDy!{B%P7CjY3pS8RaOa9OaaQ;37zH z5hS<>5?llcE`kIXL4u25IpwIJ92Jyz$GYl1e9R}P#~ndpd17gApiv~$Ppr- z2oX?(icv?X7ZaA%cidafP%g0$hq9fkcSP3K2+z2qZ!T5+MSK5P?L9Kq6E^ zl?14g0OcTH2oW%Z2pB>H3?TxB5CKDofFVS{5F%g*5io=Z7(xULAwpjvn6|=&a+Fez zQp!q^DF+4}7s?T?KyM=lE|dd@ekAZhiUx7H2z^4|8PK^ zmVp|rg*ED&57Y$Ime-VOcXh%AYP6=-s53uMQ>MKy*X|SL)o9PP+PzM@*K79~>b+L0 zw^pmSR;#yGtG8CGw^pmSR;#yGtG8CGw^pmSR;#yGtG8CGw^pmSR;yP-nt?j4-a4(` zI<4M1t=>AV-a4(`I<4M1t=>AV-a4(`I<4M1t=>AV-a4&b4Yvj~+#0CY>aEx6t=H<+ zFl<1>uz`B5-g>Rxdad4it=@XA-g>Rxdad4it=<`0KhO9-gZkGMYOgEQURS8Su2BEF zLjCIsN-365OI@Lsx - - - -Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 - By ,,, -Copyright Dave Gandy 2016. All rights reserved. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.ttf b/htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.ttf deleted file mode 100644 index 35acda2fa1196aad98c2adf4378a7611dd713aa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165548 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 z zq1_(l4SX+ekaM;bY|YgEqv2RAEE}e-Im8<@oEZ?Z81Y?3(z-@nRbq?!xD9Hyn|7Gx z-NUw`yOor_DJLC1aqkf2(!i=2$ULNfg|s8bV^xB!_rY+bHA;KsWR@aB=!7n&LJq(} z!pqD3Wkvo-Goy zx1edGgnc}u5V8cw&nvWyWU+wXqwinB#x7(uc>H44lXZQkk*w_q#i2O!s_A?a*?`Rx zoZW6Qtj)L1T^4kDeD7;%G5dS816OPqAqPx~(_-jZ`bo-MR_kd&sJv{A^ zs@18qv!kD;U z5Evv$C*bD~m z+x@>Oo>;7%QCxfp-rOkNgx4j-(o*e5`6lW^X^{qpQo~SMWD`Gxyv6)+k)c@o6j`Yd z8c&XSiYbcmoCKe+82}>^CPM+?p@o&i(J*j0zsk}!P?!W%T5`ppk%)?&GxA`%4>0VX zKu?YB6Z)hFtj@u-icb&t5A1}BX!;~SqG5ARpVB>FEWPLW+C+QOf~G-Jj0r`0D6|0w zQUs5sE6PYc)!HWi))NeRvSZB3kWIW|R^A%RfamB2jCbVX(Fn>y%#b1W%}W%qc)XVrwuvM!>Qur!Ooy2`n@?qMe3$`F2vx z9<=L}wP7@diWhCYTD?x)LZ>F6F?z8naL18P%1T9&P_d4p;u=(XW1LO3-< z`{|5@&Y=}7sx3t1Zs zr9ZBmp}YpHLq7lwu?CXL8$Q65$Q29AlDCBJSxu5;p0({^4skD z+4se#9)xg8qnEh|WnPdgQ&+te7@`9WlzAwMit$Julp+d80n+VM1JxwqS5H6*MPKA` zlJ*Z77B;K~;4JkO5eq(@D}tezez*w6g3ZSn?J1d9Z~&MKbf=b6F9;8H22TxRl%y1r z<-6(lJiLAw>r^-=F-AIEd1y|Aq2MggNo&>7Ln)S~iAF1;-4`A*9KlL*vleLO3vhEd(@RsIWp~O@>N4p91SI zb~+*jP?8B~MwmI0W$>ksF8DC*2y8K0o#te?D$z8nrfK{|B1L^TR5hlugr|o=-;>Yn zmL6Yt=NZ2%cAsysPA)D^gkz2Vvh|Z9RJdoH$L$+6a^|>UO=3fBBH0UidA&_JQz9K~ zuo1Z_(cB7CiQ}4loOL3DsdC<+wYysw@&UMl21+LY-(z=6j8fu5%ZQg-z6Bor^M}LX z9hxH}aVC%rodtoGcTh)zEd=yDfCu5mE)qIjw~K+zwn&5c!L-N+E=kwxVEewN#vvx2WGCf^;C9^mmTlYc*kz$NUdQ=gDzLmf z!LXG7{N$Mi3n}?5L&f9TlCzzrgGR*6>MhWBR=lS)qP$&OMAQ2 z`$23{zM%a@9EPdjV|Y1zVVGf?mINO)i-q6;_Ev|n_JQ^Zy&BnUgV>NbY9xba1DlY@ zrg$_Kn?+^_+4V4^xS94tX2oLKAEiuU0<2S#v$WSDt0P^A+d-+M?XlR**u_Xdre&aY zNi~zJk9aLQUqaFZxCNRmu*wnxB_u*M6V0xVCtBhtpGUK)#Dob6DWm-n^~Vy)m~?Yg zO0^+v~`x6Vqtjl4I5;=^o2jyOb~m+ER;lNwO$iN ziH4vk>E`OTRx~v#B|ifef|ceH)%hgqOy|#f=Q|VlN6i{!0CRndN~x8wS6Ppqq7NSH zO5hX{k5T{4ib@&8t)u=V9nY+2RC^75jU%TRix}FDTB%>t;5jpNRv;(KB|%{AI7Jc= zd%t9-AjNUAs?8m40SLOhrjbC_yZoznU$(rnT2);Rr`2e6$k!zwlz!d|sZ3%x@$Nw? zVn?i%t!J+9SF@^ zO&TGun2&?VIygfH5ePk|!e&G3Zm-GUP(imiWzZu$9JU)Wot`}*RHV<-)vUhc6J6{w&PQIaSZ_N<(d>`C$yo#Ly&0Sr5gCkDY(4f@fY5!fLe57sH54#FF4 zg&hda`KjtJ8cTzz;DwFa#{$!}j~g$9zqFBC@To^}i#`b~xhU;p{x{^f1krbEFNqV^ zEq5c!C5XT0o_q{%p&0F@!I;9ejbs#P4q?R!i$?vl3~|GSyq4@q#3=wgsz+zkrIB<< z=HMWEBz?z??GvvT54YsDSnRLcEf!n>^0eKf4(CIT{qs4y$7_4e=JoIkq%~H9$z-r* zZ?`xgwL+DNAJE`VB;S+w#NvBT{3;}{CD&@Ig*Ka2Acx)2Qx zL)V#$n@%vf1Zzms4Th~fS|(DKDT`?BKfX3tkCBvKZLg^hUh|_Gz8?%#d(ANnY`5U1 zo;qjq=5tn!OQ*-JqA&iG-Tg#6Ka|O64eceRrSgggD%%QBX$t=6?hPEK2|lL1{?|>I^Toc>rQU7a_`RSM^EPVl{_&OG-P;|z0?v{3o#pkl zC6Y;&J7;#5N#+H2J-4RqiSK^rj<_Z6t%?`N$A_FUESt{TcayIew5oWi=jxT*aPIP6 z?MG`?k5p%-x>D73irru{R?lu7<54DCT9Q}%=4%@wZij4+M=fzzz`SJ3I%*#AikLUh zn>k=5%IKUP4TrvZ!A{&Oh;BR}6r3t3cpzS(&|cEe&e{MQby|1#X`?17e9?|=i`sPG zL|OOsh`j@PD4sc6&Y3rT`r?-EH0QPR*IobE@_fkB8*(886ZkjkcO{K8Sz$H`^D-8P zjKG9G9A`O!>|!ivAeteRVIcyIGa#O<6I$^O7}9&*8mHd@Gw!WDU*@;*L;SYvlV#p( zzFSsPw&^UdyxO}%i)W8$@f}|84*mz&i2q@SlzMOd%B!BHOJ<(FYUTR(Ui$DuX>?85 zcdzl5m3hzFr2S@c_20C2x&N)|$<=RhzxI!}NN+yS16X^(_mtqY)g*Q%Fux5}bP3q$ zxQD|TB{+4C1gL>zI>g~-ajKMb{2s_cFhN2(I(q^X!$H(GFxpc6oCV9#maj|OhFZaI z;umX6E*fQVTQ@lyZauuv>%E)5z-?zQZne18V5A}}JEQmCz>7^h0r)!zhinBG6 zMQghGt!Do5h%HmAQl~%m+!pr-&wlrcwW;qw)S$6*f}ZvXd;cHw=xm|y~mHbT3yX>?hoYKfy--h+6w9%@_4ukf0Et^zr-DbPwFdyj0VJHi}4bqRetSNR`DoWd( z(%n5>8MQl+>3SeL-DB@IaM{NDwd{{v_HMIO)PKO}v{{##c@ihB0w$aaPTSP4^>n3Z zC8Il%(3dCLLX$-|SwWx1u7KVztXpzNhrOZQ78c$jd{B9lqsNHLr*9h;N9$i+vsrM1 zKzLB_gVdMCfxceejpIZat!MbR)GNZ%^n|fEQo?Xtq#Qa_gEWKTFxSL4b{g}kJNd{QcoQ}HUP-A)Rq;U(***IA*V_0B5mr}Xp$q{YSYs-b2q~DHh z?+muRGn~std!VXuT>P9TL_8Km9G{doqRb-W0B&%d> z^3@hs6y5jaEq%P}dmr(8=f}x~^ z*{I{tkBgYk@Td|Z{csd23pziZlPYt2RJW7D_C#&)OONEWyN`I19_cM;`Aa=y_)ldH z^co(O-xWIN0{y|@?wx@Y!MeVg3Ln%4ORu5~Dl6$h>AGSXrK3!pH%cpM?D|6#*6+A# zlsj;J0_~^?DHIceRC~0iMq)SJ&?R&if{fsdIb>y;H@M4AE`z8~dvz)(e}BqUWK^U~ zFy`PX+z*Bmv9VxAN;%CvMk(#kGBEMP;a-GgGZf~r$(ei(%yGqHa2dS3hxdTT!r>La zUrW2dCTZ!SjD_D(?9$SK02e_#ZOxdAhO%hgVhq54U=2$Hm+1^O^nH<>wS|&<)2TtD zN_MN@O>?A@_&l;U)*GY*5F_a~cgQb_3p`#77ax1iRxIx!r0HkDnA2G*{l|*}g_yI% zZdHt2`Hx^MA#VH7@BEN68Y_;sAcCNgCY7S&dcQsp*$+uW7Dm@$Vl7!YA^51bi} z*Vy8uTj{neIhIL|PhditfC1Jeub(uy}w|wV5 zsQz)04y;BY2$7U4$~P{k)b`hZb>gv1RkD)L#g~$*N^1N1GfNMS)4r|pT*V<&KE1M9 zTh}rzSW#Kcci_#(^qf0gTW3&QN&zsW%VAQ+AZ%-3?E)kMdgL)kY~@mC>l?RH28u;Y zt-@_u^5(W>mDdtqoe){#t;3NA7c@{WoY9bYFNoq+sj&ru;Z`x>4ddY0y*`HRtHFEN% z@mFkp=x0C6zDGgA0s|mP^WNEwE4O}S?%DOtce3At%?ThxRp@`zCH6MyzM)dA9C7IP zI}t;YUV(Jcnw$4LoD4H(EM#!{L-Z|&fhNYnBlKcQ$UScR#HH>scYBTf2u|7Fd8q$R zy5Cbt=Pvf^e}m4?VVL@#Pi3z*q-Q0MG8pGTcbS|eeW%R5bRzKsHSH#G(#$9hj9}0O7lXsC zbZ7#UjJM^FcvdKK3MOEl+Pb-93Px}F$ID&jcvZdJ{d(D)x|*`=vi%1hdg(dd-1E>& zoB4U&a${9!xyxoT%$7gFp{M<_q z9oVnk*Dcp$k#jA#7-pZbXd=L8nDhe<*t_*%gj^Vx>(~KyEY~i&(?@R~L_e^txnUyh z64-dU=Lc;eQ}vPX;g{GitTVZben7||wttapene^dB|oSGB~tmAGqE^`1Jxt$4uXUL zz5?7GEqvmLa{#mgN6la^gYO#}`eXyUJ)lFyTO8*iL~P z$A`A_X^V#!SJyU8Dl%J*6&s9;Jl54CiyfA`ExxmjrZ1P8E%rJ7hFCFo6%{5mRa|LY zk^x76W8M0tQBa1Q(&L`|!e zrczv>+#&b2bt zuD1Bfoe>oW0&!ju$-LI)$URptI!inJ^Dz|<@S1hk+!(n2PWfi-AMb5*F03&_^29MB zgJP7yn#Fw4n&Rod*>LlF+qPx5ZT$80;+m*0X5ffa3d-;F72#5un;L$}RfmR5&xbOf(KNeD|gT1x6bw5t;~j}(oMHcSzkCgcpbd>5UN z7e8CV*di9kpyJAo1YyE9XtfV1Q8^?ViwrKgtK$H60 z%~xgAifVV#>j>4SN10>bP9OV9m`EA-H{bzMimEQ_3@VZH%@KZzjDu` zRCG*Ax6B^%%dyLs2Cw{bePFWM9750@SIoZoff4mJvyxIeIjeZ{tYpbmTk4_{wy!_uygk4J;wwSiK&OpZWguG$O082g z^a3rw)F1Q!*)rNy!Sqz9bk0u-kftk^q{FPl4N+eS@0p1= zhaBFdyShSMz97B%x3GE|Sst~8Le6+?q@g6HwE1hJ#X)o^?{1!x-m`LlQ+4%?^IPIo zHATgqrm-s`+6SW3LjHB>=Pp{i<6FE#j+sX(Vl-kJt6sug<4UG9SH_|( zOb(+Vn|4R4lc8pHa-japR|c0ZAN$KOvzss6bKW^uPM$I$8eTr{EMN2N%{Yrl{Z`Y^ zaQ`-S_6omm((Fih26~Bjf^W$wm1J`8N+(=0ET@KFDy;S%{mF@!2&1UMxk>jTk49;@ z*g#0?*iga;P7abx1bh^d3MoAy*XQp{Hl*t(buU@DamDmvcc;5}`ihM!mvm36|GqRu zn*3}UmnOSUai6mM*y&f#XmqyBo>b=dmra`8;%uC8_33-RpM6;x`Rrc0RM~y9>y~ry zVnGanZLDD_lC%6!F%Jzk##j%?nW>JEaJ#U89t`?mGJS_kO5+5U1Gh;Lb3`{w<-DW; z;USPAm%*aQJ)UeYnLVb2V3MJ2vrxAZ@&#?W$vW)7$+L7~7HSzuF&0V95FC4H6Dy<( z!#o7mJKLMHTNn5)Lyn5l4oh2$s~VI~tlIjn09jE~8C#Ooei=J?K;D+-<8Cb>8RPx8 z-~O0ST{mOeXg+qjG~?}E8@JAo-j?OJjgF3nb^K5v>$yq#-Ybd8lM^jdru2WE-*V6W z>sL(7?%-Qu?&?wZNmmqdn?$FXlE!>2BAa^bWfD69lP0?L3kopYkc4>{m#H6t2dLIEE47|jcI$tEuWzwjmRgqBPkzk zM+(?6)=);W6q<2z95fHMDFKxbhPD-r0IjdX_3EH*BFL|t3))c7d~8v;{wU5p8nHUz9I?>l zVfn$bENo_I3JOh1^^ z+un~MSwCyixbj%C?y{G@G7mSZg_cf~&@djVX_vn8;IF&q?ESd=*AJHOJ(!-hbKPlb zYi-r+me!ezr_eCiQ&SetY;BocRokkbwr=ONGzW2U@X=AUvS^E9eM^w~aztd4h$Q&kF;6EJ1O*M7tJfFi}R1 z6X@asDjL5w+#QEKQE5V48#ASm?H7u5j%nDqi)iO@a1@F z*^R+bGpEOs#pRx9CBZQ}#uQa|dCH5EW%a3Xv1;ye-}5|Yh4g~YH5gI1(b#B|6_ZI; zMkxwTjmkKoZIp~AqhXp+k&SSQ)9C=jCWTKCM?(&MUHex;c3Knl(A%3UgJT_BEixIE zQh!;Q(J<0)C`q0-^|UdaGYzFqr^{vZR~Tk?jyY}gf@H+0RHkZ{OID|x;6>6+g)|BK zs6zLY0U>bcbRd6kU;cgkomCZdBSC8$a1H`pcu;XqH=5 z+$oO3i&T_WpcYnVu*lchi>wxt#iE!!bG#kzjIFqb)`s?|OclRAnzUyW5*Py!P@srDXI}&s2lVYf2ZCG`F`H-9;60 zb<=6weckNk=DC&Q6QxU*uJ9FkaT>}qb##eRS8n%qG`G9WrS>Xm+w)!AXSASfd%5fg z#fqxk(5L9@fM};~Gk^Sgb;7|krF-an$kIROPt4HLqq6+EL+62d@~4Hsy9nIU?=Ue4 zJ69;q+5+73nU|TQu}$>#v(M&Vx1RD=6Lu`d?>zHN?P7J&XWwsvwJt|rr?CZu+l>m4 zTi^VLh6Uu2s392u(5DLaM%)Dr$%h3hRB>V7a9XG`B{ZsWgh4IyTO9R~TAR^h^~>ko z(k|Hy#@bP}7OyN92TKE%qNZfyWL32p-BJf1{jj0QU0V`yj=tRospvSewxGxoC=C|N zve$zAMuSaiyY)QTk9!VmwUK&<#b2fxMl_DX|5x$dKH3>6sdYCQ9@c)^A-Rn9vG?s)0)lCR76kgoR>S;B=kl(v zzM}o+G41dh)%9=ezv$7*a9Mrb+S@13nK-B6D!%vy(}5dzbg$`-UUZJKa`_Z{*$rCu zga2G}o3dTHW|>+P_>c8UOm4Vk-ojaTeAg0-+<4#u-{>pGTYz(%ojZ`0e*nHo=)XZS zpp=$zi4|RBMGJDX{Db?>>fq71rX3t$122E;cJ(9elj+kBXs>3?(tq=s*PeL^<(M$8 zUl;u9e6|EP5Us-A>Lzvr+ln|?*}wt;+gUmd>%?@Wl@m%Qm{>Q0JqTcxtB`ROhd6TB z$VY<7t$^N6IC(s*Z@x2?Gi%eB8%(hYaC zKfY5M-9MeR-@5h zZ?V`qr%%FlPQlW5v_Bp^Q?^)S*%Y#Z$|{!Lpju=$s702T z(P}foXu(uuHN!cJRK*W-8=F*QlYB*zT#WI-SmQ_VYEgKw+>wHhm`ECQS`r3VKw`wi zxlcnn26L*U;F-BC9u{Csy#e%+2uD$He5?mc55)ot>1w`?lr$J zsrI^qGB@!5dglADaHlvWto@|S>kF5>#i#hCNXbp*ZkO$*%P-Sjf3Vc+tuFaJ-^|Ou zW8=}1TOlafUitnrTA2D0<3}&zZz^%y5+t2`Tk`vBI93FqU`W!zY;M%AUoN1V1-I2I zPTVFqaw3Pr-`5HcEFWuD?!8Ybw)Y>g7c0tt=soTHiEBxlY;RlQ`iYY-qdd94zWjyD zFcskM^S{_!E?f3mEh9waR7tb6G&yl%GW%e&Sc5i;y@N)U5ZFLcAsma^K?Cg^%d{PO z=SHQq4a|l`AakzEY;A{n6Rn1u`7v~#ufV*6GZ$`Ef)d2%6apsU6^>QJl0@U& zq|wIBlBAgf0j!YaozAgmhAy0uy;AjRA2%(!`#&e>`V` zg`MfSf5gWvJY#?8%&|`Aj0<@aZ;-q#tCx=-zkGE|_C4)TqKjr-SE6po?cX?Z^B%62 zdA!75;$my<*q)n@eB<^dfFGwRaWB25UL#~PNEV>F^c+e2Be*Df(-rIVBJo2o*an$1*1 zD$bsUC-BvObdmkKlhW<59G9{d=@bAu8a05VWCO=@_~oP=G3SmO91AK_F`#5 zwXLRVay<~JYok|rdQM-~C?dcq?Yfz_*)fIte zkE_g4CeLj1oza=9zH!s!4k%H@-n{6aB&Z;Cs8MK?#Jxl`?wD>^{fTL&eQHAQFtJ_% zNEfs|gGYh+39S{-@#MrPA!XpgWD;NLlne0-Vey1n0?=ww18{L)7G|$1kjI(sjs z@|alUMcx*04*>=BWHv_W-t=rCAy0q6&*;kW&ImkwWTe$lzHJRZJ{-{ zl-mK6+j}V`wobm^^B&2Tl?1r=yWbz;v-F<#y!(CT?-4K(($wWtmD631MN9?trDG zMI7;9U7|UsC;urLP%eH1h%U`LJxT3oM4=gpi%X@lpVR9N6Q(uhJ00RWXeL-Z*V(O8 zsIyyVUvf=RXLBKX`!peifjIMvMs1YT0n$0*B;K^yZf&HN8$N%e=EgOejqihLPBT|< zs)z`nNU}BOdT7wYLy}R10eXUksn9o)jG)&=qteGc|XNI~h5R6UBfaPeIHbA32@*>orZsCB4`Q79}A=z@najfekt-_eTg7a}Mcas^D1ELlN6(y28c{ur|tmueFvIDOQxXs1)_lKrA`L2-^^VNC#miFvO%l6w5uK2bFyu?hyNLCjTCNRRVW^i+GX``giwc&TpV~OHu(yN&o)r2$K$1kjh@>iP z^&`?sCk#?xdFX+ilAb(;I7<$BQ#6j*jKsu%LEhQKe=>ki^ZICepr3#_2#pE`32i4Z zu%eXsgL)3x3Q-^OPPRhm<^!TEPoek6?O^j+qLQ*~#TBw4Aq~M2>U{>{jfojVPADAi zurKpW{7Ii5yqy6_1iXw3$aa!GLn|$~cnvQnv7{LMIFn!&d6K=3kH8+e90Zq5K%6YfdLv}ZdQmTk7SZ7}>rJ9TW)6>NY{uEZ zY^9PI1UqUFm|h0Vqe60Ny=wCFBtKb zXtqOa3M?2OEN=zDX7z}2$Y{2@WJjr?N`auMDVG9kSH~FjfJRNfsR@yJQp4cQ8zaFkT4>5XQqSVt5c}`-A#Z=3-_mGZ^)Hqayei zhJ}wgZ5UDln%)!;Wz@u=m(6C_P@r9*IMPe7Db`CSqad3ky-5-EcG=*v8J&{RtLJ(E zw2h-ghGYcDtqj4Z^nU7ChgEXO0kox=oGaY;0EPqeW89T6htbZg4z!uU1hi;omVj+3 z0B%$+k$`oH5*SeoG`Ay&BAA%nAUjQxsMlNdq8%;SbEAPVC#qm!r7j75W=A)&a6)3% zdQq$fCN;@RqI!KPfl9l=vmBFSFpD1cAxb@~K-$ZIlIL3W}?#3+|2p{|vZVq`YA zMbx|Xl57kJVwoetAo+opiewCkCIO=uBLEaG+!0U$MRdReNsx>+PIJWN6dW)pfeZ(u zQ8ei-Ht69)ZV`qv=vmorhOkF)Squ;)8AUfh<7A_xI8FGHMRW>~%o`1Wt3|8IMrM%& z8)|@=#ssro9=f9HtN0F#O085{Bf6PJnurfzS_yg?qqszmnQIYDP{N=xqPfvl;VNsK^qpoy2&App~Fe(MB7KCI)$p1!&YEB&%$9gTk zmvlt?t7!>_paNt_fYJvw^~LCqX{4opLy!n)md7}<_s?`gytfSAdoScQWTy&Tbr&~( zg9myGVv)l|4-umFBL0)Y(d}Rvt11)(O4ij#zeao~K$vh~JDn0_@3RjP2M0|79T&9+ z?>Vx&M30Sb15&<{RtpeYUf|n7n5GHyc+-FtA=7H$p6Mh=&M0O!so)tze7#WT>pp|x zfWae>0++DfscU2%>|@oiCQj+6O827)1}KsN^a>NSI*4?#ylfG-{q?3MMXX$dUH^S6Ni=Ve1d0(janpz@WqGJ?cG&sewpq294Qa zL{huwuoARdt5F4Dbh#?<2ruzSS{VeDAOtY+52t^xJW=!(0f3P&G3Cs^%~Q~~Wq{YA z!QrEk#>oXK{sc&Z7VB1_>fA1^#YyU1Ff<^9G(!V0!JW`n@EDdj$$2SVK6*7$!BvXP zmAC;h-W75(Nnzpro3CE9eV=~Lp7yS(vXnk@$g3{R`!(UG013==W*Hj{-*F!ujl+np%IX?E0*I&-K^u zY1z1I!`iOu+Ll`UtL|F6Vb?~vk=x9w6}eE^*<)O?pZQ#8YKE#b($x>w$3E*F0Kfk zfnyCo#zOpX1(P2yeHG@fP7}}~GB|&S27%6=@G^V=rmeTB$(w9rC6J@uQmcAMq zQ=Ce?Z0RkF_gu30<;5#jEW32il2?}$-6PZ?au16Y)?kUFy3L?ia1A@%S3G-M`{qn8 ze+|6jh0vqfkhdSb0MvIr!;;*AL}QX^gkc+q0RJ4i9IyOo+qAyHblI+$VuZ3UT7&iIG7640a)fe&>NOVU@xZ*YE`oy!JGMY%j}bGq!= z`R5xY(8TK&AH4b6WoKCo>lPh6vbfu1yYy02g^t9bDbexN!A`*$M5`u&}WqF?+*m?ZoW85&MFmXqQ1J{i;_Oz>3*#0?lWa zf?{tv`_JzP7D3x2gX&ICRn(aR$#>;ciH#pO?<*}!<}cYh_r{hb6*kkXSteV>l9n6i zwx63=u%!9MdE>@2X)3$YXh=DuRh~mN2bQFEH&_nHWfU{q+4=t07pt+Jfj90Or;6JX{BCQrE8bZe&wi3fwEXHRp zz8{VAmxsWU)3nT;;77X7@GCm7_fL1p_xKEG&6G~luO;Bc3ZIa?2b(*uH7qJ!es71c z{Buj4(;Jds$o78u<3df_2~DLq`e9*$SGmrR9p2OoVB5Q(KL3M{1>eq+;+lHK9N?xvyBPHni<#j$sZK{QrKEcdR9+eQD0V? zGPaq!#<-c#a>t4bt+R#Hu_|}dlIGeve@SR!d((u)Ga45+BuhHfA88G0cPrw>>(`ID zZ;aIyn|qmhuDXBthoW{J(WN+`Yud=y(wvd0rm&1*4>6?#8&)Fz z&@V=a0w4)F{^!&W_l6<5xg|-0F!~>aCALbeVsZTd*)M*^tr*!)O8w)mzKThWyQW@X zw%BFs5_@CIic5EPcTJu8=CmynV;``)3}gJ`Vl#VY_3Yib@P-KvBk_%!9OVu#8tG|Nc4I~A>8ch-~X%M@!>yk~ERI|QEcwzgI66IaaY>gx0~lm<@f z5-k^OY#SGC80Yr-tDRP(-FEJ{@_4LHsGJ=)PKZ@`eW75-r0ylN%0Q>&*M;@uZLdJ$ z)rw7Dt5ajr;P;~1P>jID!><(7R;w|Yf}qI&8klT?1dTfc@us5mKEe;qw;YKR(cp-D z6NmUMP8x7cM%~ytE@l*Mp^oN*mCF`gRNhw3gpO1PVi_^JzCJo>#mX(q+iJ(Ts$5=! z13b45gILEULS!=)SmZ{qsC1)$8-4eADGR?v z>~4k_SvdvPHAC}=4(!I^OLgQ@9EMDE7d$PvJbi+K%-HTh`P0#Ea|Jm6zj> z?R)(YWtZoIRx>AqzlG1UjT@6ba>yE z{Wf<5moh^-hu;ptAtPG}`h$4PWcOn>vy`#bH#Ss>OoAEE1gIbQwH#eG8+RHG0~TJ$ z>`C`c7KyM^gqsVNDXxT|1s;nTR&cCg6kd<-msrdE5Ofk=1BGDMlP2!93%0c@rg~4` zq)UFVW%s|`xb>;aR@L^*D>nkSLGNmM?cv)WzHZy3*>+*xAJSX;>))*XRT0r9<#zIpug(}{rSC9T$42@gb zy8eb6)~}wl<=or)2L}4T{vum>-g)QaKjtnp5fyd^;|BxHtx~2W^YbKq1HfB7@>Hw@U5)?b^H=uNOpli?w6O#~V`eG;`irLcC(&Uxz`L_Cl zS8r24e*U71o@dV6Soupo-}Ttu*Dk&EwY`h4KdY-k55DSqR&o7nufO)%>%s-Es^5Q_ z60#cReEy=$4|nW)bLh=|4bxW4j}A?qOle+wjn88oAeYb~!eA+EQ;8Ggp-UldAt$3M z7*E590amz>YB9L(z?Xx&?I37XYw?Os-t+05x6Z4vkzBE6-hrbB=GAB?p{DQXV4CKg zls@_wh*&XC<3R(CEZxg8*Y(6a>cIOq9Nss7{=UQ7Nv%O_WxSyBqnH{@(<>A&2on@z zn57W4Dh*E)o#rJ2#tyxV2;C5#rl8%%As$4qB=IbMt-z|jnWi>>7Ymq37;AW!6Y4nx z1Ogx#!WVdA92mEipgUxzy_?ddg|x)KOCyK)P5v@usc;0sN3{=0slt4CuwaxK@20eO zhdp~Z8iJ7GWrkq_-X`~(eBpthn9|`tZEUCIGiFpJjjxPVE9I)#z3Q$3tw`a69qxjuf+~ z*?v>d5~pcH-AQ~0)8PyIjumD^?SM8!Wb>KZoD7hOlc2nA0_(eG!in>}Ru}>6)>5 z@*}T`Hw{I^-?PS9>(#UFBQpW72* zsfj(2+_9@5x+57aN!`e`f(Mp_I(D>}p8)@&g^g+X1%d{ z%X5boE?hEoj0CiwTh9)#8^?~;|wgor_=Z1BI9_dI{ z&t*f95n?ZgZ5CnQa!v(p|JT?y0%KKgi`Smi9k5r!+!Mkz=&Z$%CFl;?AOzV`YBKrY z0#Y6~J6&dA=m>T@TYb8ukaV4z^Z?VX*MCKcp13-ye1*`gAj_Tm@r{fpm?K!U@Xg2AfndEo6jZN} z=XK0GRNXVLW2c?}B)rH^yR>u}b?|p(W$!TkQTAgu1AIG>MFfNchMQB_^-AQxRE$Th5-E_tBP@v(Cy|ojjP5LEU|JrM8 zVF5;$>Hl^jlHWDPChrTH(vh%bARyj5#TPb>omAs-)4zN z9?9(wybd0$Z5s+}Fiytv}-8U`IC<{6U2_NqEAkv;7lys5Qcq3EKt z0-!^Xy3idllgZ~qX^QTe=i*oGUCJNk>Y26?+9U(Ks|C81S{-v+6ebc`c(yibQbuB% zxM7mk>}dI-TfUi5Jqdu6b`4SqF)y5humuCaHhssdcR(jKf5ZGprx;Oe7VG#G6TA1+ z8oZLl<+ey(L+$Qsck^4fi{I|)p15MX73gHFUU!l${lN{)Ht_Wb%j#UE6cZ9}Wq^>+1wz z9TBA@%f~tby^0YWafmn&8Ppjn1Ng{d;S01WImtMzV<`!zU7;+8e-Xko>qM^OfOZ`Y zEZG#vcm>EGF??&G6+v(3l`X(xMn8ESv=@LdMfdcxFi%g1?0HDPG>blldR`OLlWN80 zz<$t+MM9%1K~JT@#aBZjOu9*G{W$u7cqTM|&a1)0wR8R^*r$<&AhuCq1Z{-aUhc5P zdyaaK{$P=Y6R{40FrWmLbDOCijqB(1PrKlnL)Tm|t=l}toVLAZOXJ*~-dx|_A&o65 zskcpT@bs+d@ia`f)t8ivl{(t%H?O?;=^s3O^GXqopx7E3kz06f^UQq<>gyNmo4Ij; zrOxuzn{WOqP75~PwPXC;3mZ#YW1xy&DEXsl~)u4`-v_{*B%R6xNH3* zJElz8@d#i4`#JV(ko%x;u{LMqLEEDmwD*(ccB9Wp;u*9I?=sC7g>%L{%$4m#zhbjm z)gK{LWQvE1>_yl|4T$nYKNVZ<)vza7FKU5*W~4)KNgN@;SA<9&ERxIfA&UZnB=r%N z5YD4fY$9Mkzy}!G+`KUy>3l(FSi1 zw)t)*w$E4#ZSxfm3cZLC(o3aQQ7uHk>_@fMTHoM0=quh%mfN6%{`O($pyzg0kPf=2 zjA%M7bRl4BhV5{{d4HbnTh`HM&YKw@N~47e7NFGr*9Yzi(7XQl-FJb4hPEKOC!K2x$nWy>8=PJYE)T$=Cqe(n*ChZE zklF{Ms}h0Jd|@o;Gz(~b;9d&c#0O^j{1?tF5dtMj9dG`|j0qZi^aF1r{<7KC5hZ`E zNX2nxJYEr@>u86|tPjTDet;fLn1R+IOm6&3b*}TOyNpIaid@W9c9!jIfiJOgK-aw=xb5Kpb)`E9x%CU82 zEQg_v`e+tWYClJHl=_EsSW?LZO3)o#ox(#2UW9|V7I8fYnz5fRtph`u)dywWL9}UV z*hdU9-BBK5G&}j~O6&dSdWDIpFX;&Or5wNbm^Y+A-x6(K$$Of6JTVl9n0gFY&=T5p zZX?pCxA&w{J)eDSfb?Zh*LT#AdiPlB;A%p|-`Aw6RP2mYTh zLmL~zM^VS0V@*4LkOEG~nQR)HyRB+;*KWli%QqKt&%16HWyMXRhtwdCgyoTm*5#itgp(Wap66 zyr-dgKgjl&t?JLMuw}!Boz)TOa2|37p^FAcPmxX0apWmfp$B1WF_@-dsK+?1F6~yY zEwi!-))Q_CbOP%?p%bx|=d^nLBig-_$e!nh19^Ps`s{SNq{nnW)V-qnz3y+Ipd7HS zsb}z%!+}y8izoy>Nyyj4m_br&8TGFcze#gP4?v*NEdl zzGBLM4qpvdu;5vCFi9^zXU;sW`>pPi|NFD# ze=$xI@7q9B4WPsw4CAO~UJ(S)s@u41E>#9D>!?=*N5m$%^0E` z<0RjkAj02TN9RLX3Js+GArg=Nu>E5z zPa!vMuMV06#7$1dLbwv+VGT(5V_&A~Uy3T^+|y~Q2>lA|=hZZ)ex%G`rhkN54C5gq z>w?qN=A+LgB0-@s{OJs7Da|z%dK)uDH4?m5Y=K(N5KWL)uqDxwBt>QmOk(h~1u6_s z>9x>G_+@bJhBQ;(Rr?20>Tjn}^Y`|rQvI3Ua5$aGq{HFf4BhwAFVk2oHNbk)hmAri zjQ_!g*-c^AKM>A@je&H)i1PsJ5929F<8bLXvONK4;-n6d;Zm7Q=G|k6Fp*AY!b1a`eoS*c zF413z6`x;!NZV1k5)sv;-Dqjt?t&|JLNGSA2yWhU-RYC^oiWI1+idw;6*>m1&Io`^iPgF6c$sN zw9j3KFYs@%*HNz1Jr?F^RiLV%@DyQ^Dnc1h&59pWKhD#AMQV~3k7}>c@gdw=dyRf5 zHGNU7bA_hHWUnI-9SXtjM~LT>U5!uS#{ zKSOhB>l^nUa&S8kEFoAUIDG}(Lr#|uJCGb%29Xr>1S4yk0d)9hoJ7#4xNbi?5Dt?N zBp45evje1L)A;&Smy9J8MJe@1#HwBFoYPv$=k%GOaq!kd58)tzBI~EkGG3Rqy>GOTce-p>jH0rb~c(K z1|9q=$3)Vdgcwyvy&>S3p(f~O;~?XK{)Kch&2!gs=%kNH#-Ee-i}S+a@DNWR(Xnv< zv7kIUUD(c?RS|JmPeXBC6cbxUl6qRxl;fFAiK%!>EzFa zJ$-mz?G%WqC+P-l!DLX&nfxzGAnLaFsOg^Vq~gaW2QQ<(qixj#J=;Y{m`?kHkfO)i zdxQ*`2Jr3iXdj4QE%|AlQ;|Wx~pKrr7xuNnTe=t-AO)iha6xDYpH}>yZ z+FD^H2VS0x4us;Wo_95^kElZ$>j2HW@wyeLi3i%Q28NXxQT7V1{iHY}Llc~!Dkv8* zM><6X$}-pv0N#?+N%W`5%}K0Is%8kCOC~LuR6+;gtHYPi9=dqUoin~Q^MhE;TSIe$6dEI=Xs(`oTlj_C-3c4KT+wJvpu4Kkn_RZVg5jE+RF`XNx?0xmaV~bW?v}wVTXn4{5 zO&2X+*pF%!%qu@3SLRk-npU5?`f_cV9;|pa#ktlD9VuvRx;TK+fWUv_$vC8-@TcO4 zN_-D6?7|-4!VWMEgQ}TUe(c3w4{eyxe8C5t7pS0MFe;X@U&B?sVDIGR;u>?mPyb2F zV5WLiQ2mX&1v=E#B`oe9yk4Y2^CFRk8*rV6k1!uW{m47&7E!m%(ANz&+ixrB^ng(;#RLHnX%tfsjJWM- zyBo5Of=eNl8*;gm`ozE0weGdP7~Iz5$$pI`$C5 z`U46T|8cnpt;J+VO?%~H_`Ph??bcn%Jzu`2`z~tc^PoA?r znJlfFuxIeRC?a>J?C!EC2Bn;dnhn3XeZ}sbjb-10*a7A?aS00$P{m0wm zO_v_`nJOwO*k6S$tHR@xmt`N`;fR%l>^^ZvbfRm}PUBtryK5pTwRdIZgj<#_irORP zr7I?yj7m&+KkD(;PKtLXmF-s9=>`j_AFjI$YN7_w1g7hD(md1~ysZj9;u_Y4i3Ssz zgRH~g_UH9AHR4A!67Z@2zch=Odh*4WzWc2=ekK0-ueW&=xy{z7Gz9CSbv}Pk+4ST# z#ZxnW&!Z1tS0A}`@LT_*wh{sv=f-Dy+2cPoUi{nzYTGjx)eit9s#G5^D0+(|iNBlJ zV$vUX35MrZ8K19VAN|i75_}Z#DO`R~MZQy~2$6gqOvN0Js%d70SzJm|ER&Jy5k>-I z!fh9^fC*zr22w0EG6&Uqo`eqC7_L8gi(#?!A>;y86ak0F7|oHQIhmW!15hHkZ(*|o zF+vd5r!A(imA-b0}qc4-&FS58}j>!?PW$SEg*;W8H~a^e%b?2`O8 z*`i%!x17FmIo=X;^83K2Y3Hja(b_rMns6%ts^>=(bA-9V<9O1I>564?R3a}v1yYtH z*l6T7AY0T66-95WtZgaP8(}|MBGlfNdh@=~Y1m!IA7($BPUtE`qT@h@;M3Hd z;_dtQw^?1x7-WaPK4XDxuqd5+qVz|PQlALGw|x}&MFa4RtVSK`(e|RtFN=u%s&M?) z7+HD3$diG_iYZuX{0ijc(*2C7cTX)p*3LRRtn3r@wq>%<@A9jY)yX*dv zSq7pIH0)jCA$)wa^7RfPVlWXzzoH}vzHmu4?W&f|zEC#fi<;dYS!Z*G+=!O(wLx7} zkfS~!6{@R-(Uw86L(mJl7`6&&tfKDx<)c+WIlqL)3pSX=7*`N5ysyr`8ap$bd^E3w89)ZgPiCBi|f{Ji^U)|AMCk%95n_gVk3|_XmE_Z6(keo8NCgI|@0sfZs3_s1} z$KK|ZCF;AE#cQiOrv*z^HWTBHM`H8Hwdx20FDq8lu^{(Q!@5s%Urrmi_ZX=7)j%7* z2x#|wO+pMI^e#2DpLkU+erWUorFxiNlu1s>XIg^5wIEm|joek2Rd2IsPtNkBRLQTFsnoh4v_<(`f@uV0I_G*I9RD+?L~j{1bx`#0ta zEeZiTNBzhh^|GEN+1vl7{w)Wm!`yhLKAuC&Ve`GhjRo0c|E^`tZXfkQW;&_kBLS|M z7!XYb?!E&&=u`h5Ld{_dyivFMQHW{aI!yVS7oS=ttZ_4U4sb{P=wmO6wCrO3g8Cir zRxN0ht{}^=kNOy`2fdgiLzr_8?$^fWMSdbcHb<)&+4+$`i%$>mB*aF7fv0tiFWhcK zRThLy0Mtx?A6Q34Vn$tJOcHkv?-ldg8_%9Jr8YX#=C;}%u*pWq^?L5VVi61EUkC^@ zTi3LAgna%bC9aB?Qos0?XlUZtnp9cISx)1AbGeO~JGb1<*DpHId@iRrT4e7+!$h07 zWDZ4FAXQ;*hdB%9)8U`#Aq1XW1`G)sm$Ol@ZCv2#2r5~I^BXuYJm%NgOkCQOAufat z)Mo2&C`TDc7EDz1sE;V{`=Bx<#5gYrDb+@@FE3>Yx=pZB79-7UjD-g%Z#qc&td6cl zI`S1u2Q2b!m^1LOg{LEV_eV*@cFW|i{!+a94itA#8 z2;?I%3?C8LQn5B+Ac|?$1Ejde^`AH_B}3`>#H=np*@XDR^y^=fZDd~Fz;wS>e@!M7JaPvv zPU?=U|2$6iw_+;&j{0oiARgl1!2p}_PMTg!Yxs?H%{HmJgU62_ghA}_;}{7x*brZc z@>!rSz|M}1YPdKizI;?B3~2O%LY`8A1SF;-m z+Oxu{+PYOU-V9O}bVd$T!;AU2M<2*KtciMEC29!H9V-u9ZUJ$M-4#Nb$5QVy@LP8HyfiyK->WR(e1g77J;isq@ zxu$>@C(@*mf}RY@L8hJXBrWMOEKDqt3i8iwFSwpR$W>G_j=iMN>(!1>S7GdmXt%UH zpfdn%XxP3S<>d1=1{yBn9c@?(YZkyNN1 zQx^M4-32#mo8SKR;r8t_CV3=RwbSNzS!Jbd%GS0L=qT*0!ERw05x~DzSsUKHYQ||Y zuwKD!+2nux!l3~g>0-F=;qnW{w$F|jqXuhZz#N`4WtzLDj_MYvu(*X@fb3G;s!oPE z?QMW|e7J7#=?C#3QWQRp-~(1;_=?J(Y^}oNmHRoN$^y4Pv2Z8cL)EmwWVNJh@>2ER z)el6y-IQ`!2h2{kx3}jwTf$_!N75)(mi|n=?Ylj_>QzqjfMiO67Wc4{rOcF4JS+{j z&z%duf1`r(U@ZlI{F=sZFnCGJv}cN<(cA|5AP8m+HUK z@vG9%#_zOu)ChxFSxmKsBSSO9XX%g4SU79e4=G!|Cgo(;VeA8dsRxIZ$Eqhj(brh0 z>Jh)P2`<<#u_i^?L>%2jxXAxZX%?<7l073C+~1p!t{Dj_9ZxL$sz|_G{C#{Hv@t=B zP}EsMr62u$;U#=d%MRJHCiNv=5OI3(_o-A=G_9B~AsrRui@pzUDE@tHg#6PmWEuT^ ziPt|@8=kjTNmkqdOlyJS!m{E9I87hqn;%9rT0<0-L99QeURoyK-&OxH^mcao3^t~WeS^K zH`XC|VCLo6*duA78O!ugN@5Elxkhd!CmdSX&*f=utfmDFD9PkBHMk3&aFB&)R8NL4 zD&i)OQLO z(Z_o2Zs~o#^$zu`{XU~$I{T&vAH3;ofJ*ZpJ&JR~s{J0}8cw}`t#a3NvWA?#tMY67 zLG}{Q{#6^CipQ$*V2|W$g2v->Y9+4=(K+K`;I4$BFUb9!Nrk0B*fL+v z_lcdO1uEs@|8I@xoKCB{68@q=)}90JCVF33Lb?M@bC5mog<2~vPXXzk7B$|75Lya& zL)t=%E&Pk`S-PznN<)4iAI;NU!@f0_V&wOND{4!~b@1&pAN$Goqzvq>;o=lr=43Xx{tUtEaN3B>CWZ)Uac%%Y9--wFCA~Ek7aAC_APm}b zpXAnlNOIF+;t%pPlAxIkvv1neXa8*XxNLX6ZDDR(+U5bi-=^>US$+3TyUFaf{gSPI z&A@*!TUbRQ-p-3$KUDc=Hp9j|c+t%)Z{KNid2DyGia&p6lgtpOkDeM{Qy=)H&22V` zFBRKM=Etf98a&;o2pD`R2ctkyWxz`aTDZXBjY52aOspy*2=?xDIZi>&&))8y?Pe*( zt;DkFm|`@cFI!Kx=wFn7fh&cqy-f1RZb2KRCK7JNBsApYHWk=M5J&|wBQOdb+2_^g z*;b(s3o^wX$sWZHhUhNh^+UU2+hPaWw)eN~kHy66akHOp4#cDm_4zDetK1Mqx+sR1`nMz9wwQP*hL>=&Kei3+FtV>|yg%{T(6f`N5BR!MdXj8xHG^3) zqCJiEswQF>ZLP}3Hs3ciKciD63}0Z^MFL6+`V473sGm^=U1^Mx3`Y|Mrl>H0pEcT6 zg^H5MH*WeRUNMs9VN5fcZQ=>}GHBs};LS}+P-y~P#IlYJ0P8ym@R(0L;jYe*1D4ll zwDy~vES0HtyCCI2411OeiC>SA#1wX;8DRXzVihdy^T9BjrZUmN_=b)~n*!R4%Wps~ zkbFH!%W;I*pJZ#8%)c_#RUtKlOksrV!Y3i%vh>?b076sjL-)-NtH_t7E8;OBZOPa@ zAofQ3jdT&<%k!kzaG)7qW3j4HcvQe1&&jd+f8}J3!f+>UDx7H_B8^6hA&r*!PDQ-B za5jys`+BVIUd>7lmgi)Y&fyh!`yosPQAwyIh?7D-h2#b7);pTpdfDrCm->#&W_JPe zRvi?=>OgitOs_62y`!|JbhXf5STOdjJDPjj*#EK7D|Q>bl1&L=hPkN@2)(QE#vP@l zt9uJeTG&n{WG78N)aYu19%#`y%8i44oVsSwNLRxgR6hF`tsw;8VRy)COB4`B4i4SsLAa4`Y(WRazi3X`Vv!fMiDilJX?r1a{9%U3-*f6J-iKJh{i^La~ z$yJ?ASG(MP>=IKImh$g9bD7xJqR}YghlfIHszUwEmoF2yQ`Xet0HgZCGNmYge2TvH z+d^IF=q3{GD`-m8K+R-7AdPA64e{l|c4AofbmD)4hUvwM1bw^%@mXLok{H%R#q;qz z+gU3h@JZH-G^8$-2?T_&a!E51(fhSa5Q$w^j>=mA9b7)O1^G1VKyM1v8fOAgDLfFwlSN7aDkBbh=1Vofi; z{_|sQ`!zOY>fWC264~Y0Y;ZbE!j3Cqv4wlfV?E8SiTe3tr;ceTaXo*JV!Oufp0KT} z!>xB&7aARQo9It=F0Wa;$5j)X(=fKBtv5LhYKFC6eJA)BwZ>zny85O7zI6@a-&ln8 zLF2LorHz$i{9dO!8mb#Jp?&t4L$8*9&!)KTkLxQVHBP8FA!bZwX zC$1xtlqa{pU|8*e#v_V+#E4OT zjwi(7(vGZ$V!mG>tD`=FtRvSqWZ9$*B?GPmVd1ek!0@{$s=gg&_gx>I&W_E$e<7Y+ z5K(_sDS$qH^8rKPSita&*B->#;u88_rMf;Axsguitwh`|=XF8(EVlU^L*PKbu#TN~ zwj8|9X*SENE}$egSAG|3#!^5By}_`$$?RM3+{=QMMid7b`V01GIvvI+&E63R2wQNp zn}sc$*2c&2oUL%!tO4~7wk4n)tpFT)D3<_3R0r=|=}&0KCf!VqIpm|jC(z<~qb-#Q zZxk@2wJZtt%hiN1;J9w_Hzt9B+S-HzVkb8@NIl-+0XLm`=_dDWyDqXB zn&w}0*`hmpYVLH;R9>jKpbgr%Tssmku7 zB4?i;DJ=yE$6)n>a-tiWd=_(RksK=Y6Abz5;b5mLI|>)(FA9o zGzACes-Q@1Vend}5C)iY7*G)}1M%Udge?eW(1HnSXri;yq(~2bXQq`x;Yrz#0k&ke zS%JGlk~lDWC_ny*-Pvc@4#dzy&@`+2PkV%% zOIv<3)+u>drFF184*~^AoZL$_J<;#J>d$8hF1HEz)8d7HT$%mI=(a%Fw_CitukY~T zzCPh-wvU#V(e-YoddEiUO$O~Gr_8a91@$Jc+rpZOpW6;!qTct6s-1GiRv51Kzn!ku z>d;8_q{~ie0yF5Z-59^#vLXATUx*cq!zD=G$XZeu&u5Te*HqWE4IIDJ=3 z;X=s*MnE=AeJ9|E8#P5YEW>Y3>i7+gy{D`72zWgEJ6_;p$$k1u>hqEMJ4WhXT+1`J z2UoHdw1-mEKE?MEYBN#+HGKNk5c-SiJgPNDBrxIO3hq2zQ?Q-Gzn`%I_?VYp&dv2M zvIvf0jiNBnpf1lm=3_A6ApuPS)>4!*8O26GMgpxwaM6T-up7}x$fShgk;qe5v^RIo z>TaB#z4r{2{wUbivuj#sL%^MIIAif88=Zo8VO`(VhtJ#lK)G7`AVbhecjuza-rrB| zo4s>x>$20;IoY}UyhY=kM#Bz+WZSjeUwYHVtw){{#_rt79ybJJr`6`3xa`^N&f)n! zT=yimh90T==dW``)l)vNIle^QUoEWPPd=w1q+I0(zj?aa4;5EaZaQsy5FJ4LeF}5{ z$zg##sP#GwKG2!Ph}IYe2=jqBViZeEZy;=DiXR5O3_2O25Y~Q9y=cg)D}9l1=&&Xw&3l?g{8))$`(k@{a1p3a{ens7utuI^2=vshxrlD-kY-br`D+hAM=))3(PZ zpyB3*357l{^D%K-(OTUkjEoJ4X>x<^UfmPAA7hlXG?QgK21ybCZk1lxS0Sifv<291 zEjcA#Q%-#E!a(4PJtQIWk)#atL{s*GU*JZt07Zc#S!1%fwV7fXkwZu$LI=?Jii9b& z9N7&))d3Vh8fPHy4GD@Ijl7yD&?%NGuJ_OccYXkIaDN7{Ux?ntALbeUyb?sbz03s# zLfJD@r)GcJGkZS!PFErpG3low5RJ#jCL63{qLHqyaMc*AVNejQp_b+{ucvHN$a_^~ zK+n|6Qz^l#n5WiWi;#UEURyWC?C}74{5m0i9bm^jS=(82np)-?!p5j&Hj8-6#y5q$ z-cZx{GVhaJT^!E3OK(B$?9)Oq;h*nmgonr@l}$~5ny#*74^BUz-dtT@>WZ;S_3r_} zQNaQi9BKB}jHzND-dA1Yeacj3_qnU%q4vw$L-Baogt=3ig3Ri*h;4T_HQn8u6~D8% zu3dIGR>z7KUO$}07IDA zm>ULZ#zLtQpB=zl`Xly=k@2w#_&57?*Xi!kJ;wQT>Y(diU_s7c9> zJt9NLo6(QTdY?<&%(7s~gGuhxX6Ia@TxNd)1c%NSn z1vg!?!9F%t+BbteRT}T^ikFtgySn40Y{9CQ#s-^l6%*Z|a#r=PT|QRt>uzZ1KDuU2 z_UG&)_39e07-r|Hmy8d@CawADtYBN~ud`dnC6l4WwkC7cwB?%@#G0C73m(O(B@{A= zKYo4MwAZI+m;dFW_8z_0tM6&w{t;apJRSqCB|8-3|G^xy4{cteem4EFg?KyO^H>jM zvPiWhJ7a++c1XQBBKT_Aev;X1adZCx?O6i7i}=MPVM!{DFhM1no>Vgi=FJObSSzE4 z!cz06q4?jt9&?tl`>Ym||8Lbn@fQ|L_G8v#F`IpVs|l!&x&>B}_z$1B(XGyIsHAWY znA8qOJ=@^)4xPoaU-h^g^}_jK@kTQ7$?aFf|5I6D)sIC2%qiC(coF8shYu$ie*)ue ze%G2{U`NRIn<&=&^cNmI;H`MZjd~?#3I1s@KF{obqiu%g9@l{o^DS=Z{*u!j)-EktzHk%L~ zUeueNeuutfbuxAHnCfe9zB#!P8?xVF){CM-QK}``94{Bxq4Q=lI*@*(t$ z0*llTSuC3*FY_i0Esz=DU(#!`f?@wi{if=Z>r@~3asMrB8H6RvvkTcW)vbP8ZeWX4 zzxps+&i<@^TXl<*)K}C$u*vFs=c>O<uva_OepgZ3^mp(p%~u)K{5Z{k!@f>W^5N zctHJ;`gb-C%!>u<(kED#4A{XPx$+SHa}?%+(O6P8P)JhxL-2PKS-#1p!TbB=d;5nL zMMOs=yP`{Yvn%^wn}ki9e$C!VtI_NeVz`$Lz%L_RchA@F7J^6AM{gFM+M7MOSKOPu ztXH`F#C^w(VO);r;56Hd1-i|6n#b*T>ceqoYd9adu&Oc+x`?PF5k{oi7$_HEV@K2z zymA4)N+`DI{|3bN<-4D@&N)YxIVoqR5q@8N=Kc5COtz?XZfomYb%y==nU^drYn>b!5Ctr?PZ$sZJGC4(Lx<*GmYK3@9};69v2?xCz*86!x1fq z9-^Oe{|eU+0lSwM-%%oRlZiDYBcsgabpN8BFSM>vThx{{TLd#395z2-=dkJ; zUPumj_0A`QOXa%S$dG#HKaV)PHrXJUqTZlMEURp*D&K#c?PX)`>TojQ>yzh(U5ggE z+}3v2ww-mQmrPrgHX82`E)7LZ#9*S)OrYMVHZ2*%Ix2 z-f6n^R()lg_{@W9puD-%bs!$vZY>)VYBn{#u=iUtgZ1U*4oibOw!C4kr;~&cIo+d? zul5rmlh}%uY=)i|^mJ>IyR&mweFZIu_7x~{W-C@zr5Q1cK^!y+OU~frPEZqXZ04#L0$|tY}D-NPT^J>z!>2 zLk;VdDSg7vTYSmLjc%I1lCVSm>+G7BEY6w@(XH|*G{ zSt~)o`-!M-5J4aV2N@%gOd!0FRFIBn|vW}Drt z-eWVGJOi3H9hf$!nudR8+Nmhg011-@!@NC3DA2QVhVsnWtq@_vVUsn7Lgo{)!})lf zHnxUxXX|Z}q6~&9Cutz=WXN1iJCP;&D8)pBPR#N=xfBTp2pd7-lFF5XXBc!;f}%nR z1Ca6zjC^CAo!5Zpsbiu(lgpE2dZaZQmR3Pl1Nu#$p&}HOO1KhD0hr0cDxiUoC%PDR zz2y;b(?1FUenyXAUfrc`fgeIi%?Q>s#3O>1`S`d7)!ab-ztxcdp zi(oNgfzqrSy+Qa-h~$kCFl>tV#u zT0yo>Sj8|%X=Z5eLYl_j3H$wFA3GlQ`NIC8!J3ZtWgQ*Tf>iySj%6K(I%;b=*zAUs z@a=8sq4nu=XBezD!_2jBtet7FSqQn zIF@m`p^X#2_+Y@)f(;Nc7NdxOl%T-$NRFKpzZ*Diiyv-9$byI~Y_VA7@fF$z4H|Dx5g*3@-my-zW{NS^+s=4LU=S;5ULvFYRU7E$thNp8*A(h3CX5s zqQ~5@=c+ot#VX*Ndavjg1ef4*RI#r4+51F`-Xy>#L9~eMYl6w8mrb%>5bZT?ljVD6 ztEdNv0*uOqR@o*xU>7I~%q&O{-x-#ny*Sp3}O21M?Rd(O98C84<|F{P!iYQi+&Y*nsLu5^Ihu$V)k)=GECZL$l#xZCMb z%xz~?w@;eYGR~3+M_}0ce(?P zl902^TxqD4$DQx-Ouql3YC)>Mv?0+^0b7X9MdejK@03cTh{%+U%}ktHqQF-^C6`xw zO``FD0}P~L0z_&PDjancf@m?ZGR0TUYN{lM-RfudpltLzU;yJ{R+GzQ*P|q&zCuzY zP@pguLKr`*Q*oFilK?v&y$CF+j-b`jSz!_lC6mW>m+2px;ND~mcq=BCmMTz-PuXY< zOa5z2j)rQ{(LTN*&~0=Yh5whf_W+NhI=_eaPTAgjUu|FYx>|LuiX}^yT;wh{;oiU% z_p&Z@Y`}m`FN5C~v?rUXJU2@qOB4H#QH{+~N5*}@@#Jm2%V%+B2D zcW!yhdC$u$WMz8Y@Q7Sm;An!nZCaUSSuojY3}>m>9D|bq{)XtxPsx!lnpMKJ$>l0=VE#0Q${LhbVQ?(avB~M5H(A<6VIs~Hmen|XCr57cj;wDg~y7PjIZR* zau8CZLCaPfRJMsKeNi~1P;*LSAkgMF^Q=afBekooDqXYIppZJ`(kv}2%`0n&8lEg` z4=C(+1ET{^|A%kM#z zXK7m|9Wcfc3=~;>1jcJfX#rU|Ppz!j;7pMyJxd%-z##=(QTY&BIZl!@lVSAb*KE2t zsC)F&?X{LH;g7;@GHGHi9oIy36f@s3g3 zRt#I$TBG}b-9;4UrV$&5Ij9vP)Y;Np6VLT3k-c!=P<<;z&y-p^C+_T2?PjhnuA3&) zZg_w4iMx50MTey|GHd-~Qvv|JOonzEpncEx-PZbcYu(#|MF)Yep>~>mY?NK)j*MDlofYp2?IA zdWFjqQYB^@4u{F4kONMK_E=?Xxs$LThk3UpU19S{Nzmr?e_{2qb`9sV2yanqH0d@5 zKGJp8aZ;((RpJ-E(g5Ey-P)#3bab(6W+bgQb9J5E$fs<9fcfNuxIvFo=h1Dgwcy+w zPuTU(HesXi2ZPm;XEiGog3BROSUdQwi5UwQ_J3+1m1G-UYluB@01JOMr|AGf`7CDG z0ig`8Ee4)kL6qbPGy~CNdwL7bt`jNhr{b~f<0Mqx@25+$lS$DH(Vxp|&m0t?&qQTw z7?k*9V*W>p{DU=}4O&dJVTtJY(^>`^lPL~F6O|IFf&j!DWck6E9}tqnNz(gl(B;1+U04#Mx7H@PM!jr;8}`p8X5AFzRgZ z`H&lBbVagpDgs^cAL}3%1zD$XOne$PNmH;OFF;TKQt?TS2u1Xly;A5E%X>i&LS8)c z94WDnS|omqYiN=XeK3B}x+|c@HmfZ(WQ<~YG9AvJ!q|jbd#I*5WUrl&T>ys=H|eYa z=2P;fwY|sZguD`qxdX)M>uI;{{E0Cl55B`!K{}wLHeN|4VH*YnBfJf$tm5E77<2U`gq>@HG1qNC7Hcyb!M;d687pf$B(PUZ=T|xM7)L(EmRVw z;~E{-q~ZvOOr2pdE3KGuy*wmJ%9P@R0*A2yuAhIFS3E2{e{lXEPa&La>y?-W>-8zjMwKGjQ$BzcAdCp)p^-It?U!LP5Hxpchm^Keq$?$57$5a!Z+()BJRD{ z6WgCQN}23z-^iC&TytVqsnMs6p-*RQ(ixw2F8vzfP=&GB|8F?{vwhrLatNCSGk0hY z#-0-r+MT6XGIxqGf<)4vq(!0^mfU%UhXXyCkz}3fmG;0s&`8l>X!W^JfDuz9HUo@{ zuuFqpp>Uv)!psk76{RqQDF$&!v^n_ECT`}V@{zZoqC)oA7_w~`M~N|5Q|_k zJ;Up>vyh*=Kjn%>HQJW}(v6${w!9Z%lq8ZlF>@K=Ek<&|IT4DB~B~Y_O;v9%9bdID;FI$4}a;O}@l!+Yy zZ67)fU;`NEa8WOT7DH7N_&*q17&?q>qwQXMcFgOOnF<0N*-^sEWbzzvC)kr_vv+i5 zgPm2{O*$B>IAd@{>+WUK><(pc@%$Y%QkK)@5Tn}4^Ln|tOsDsh=f>O`Mru?jc?N+S zjv9?oZ;e0J6*s%IG6n*@)S#6c137i!nnDgDIU_YINmjH(${tUCloc<{sdVK)q-C~s z^SX%F!SQCb+A?8SAq-ab;ILesL&}?2F1w-0Zdb;3_7dq1y_J`mAZv20%2Kk(?Wvhm z?BgJojYahs`X@A7)HA9Qm5P}EkW30FIDr{C1ON{u z1g5dIMr=}b5GjQLE~kiOEsekhAqGW;iWew{c8QDP()f-j!!>b}0<_?aiq6~yI>*3B zi`CdXW~Cg76+JS8SL=N!|F26HjVUaAW#N(;&=GruQ@h?1{-Ra%60++(*a{-;SN={& z3m*yJzP9zU)P6F#y&<2IYIRcSWv>_H=QF%ksji&bymFkwB+s?s!OWBD?KvFpwAYaF z6HB9tl5(fq9jdFlXQI1E?Q^gHxncuVOg#lH7*|HYd$Tnnm)HD6gV_v+Ekb4 zp_-m+TC}!*?8^M?Y`$XK{JN&qk1Sq6xYYg&+mlym)o2Awb#46$jTWSN#;OI(jOptu zaCbaIeUAorw`cR3Q9bDuE~l}?)pf9WSllS}RTN5{AmKP8TP%l##64O+ z<9w~)>KD$L^#-v&PKLdn&JjL-V;0%hPd@a%E}(nDen@49b&%5#O-QsX6;-7Ym_{)3 zVl37&u%3X?ma&!7b)K&CFgV2vcWds-QvlU}1h5qyxV^(mlpUfHjzhVqKa?A?iY8<~>_=ad! zk8dO`rvOwQj>Y9oP2*Ot9wKK_hBC~WVtf!r`yU%(p%oD8e+cg4QUi%h2a{}O5}EG* zZ-HLS&Y#FkWd<|*0G}o#4taLmE^k0-iGxUlg8Xl6I@jpH*%~?tx@JuRJn#pu1 z@%_I=rNM%Y&`YFTCG|8jY9=GAaO%H4EqhwG9gJlaZKg1oi{db>rau>VdE^b)^5%>b8}?cL9itw!Y(Bor%WpI?%Pj4J{j!bwjl?n=A z?##%PqWmuA8zS)5vCxk(#bC(9jFU0xQk5C=7R7TRzMFn&JpLe}gI6mL{C!MbWW0*I zJeV8RWO=t%FK{h(m362pOLR55=AN7W`u2&T{v&qlpQUo)8&gl^+xyG^_=H+E&E8{g zDtj>Tm&AiGOuNYD{?mSBc+fDm!jX{TQ=#IZQaQll|>^G`1^D^SV zM+ZBRqk?)b(96%pKAv6kG#;Gx_9RUJOrL=Ch#REmXQRXa?RfD@|1DZPOH<>K-+Z~L-ZeSdCe_=8y zv$DFgjbD+f$Xn5p?QtF#T$_pgT|@$@QGPJGo8D>TeAt8fg6onA*w0M>p@iDdM_^a=-IIAa==ijmLcDs$P+!j}iuEj;;q_SK-hF(6t&u*(3 zU!LE)pqCz!$h##W9aWv*rYjeIUm+JxEFjgC8ezyBN-_G-vS}?09R$E(jR6BMU5U^@ z(V0P0B}3^eADjeW+@$S6T2jX+!gXXQh=c{DMBthD%*Muwk`k2(;0!J{>|O2$aekt_pC0cNlWBQj*NqU$H3%h)ui z?qoV$6o>@NL$D;;M02ATJ{}%ng;dfcXd{fw1p6fDH854f8 zL_5c+rAD;odO-?4m`z)jE@0QsIP#m%s{3yxi%G|qJ9mC592Bk*4$?J5vvrf&4==v> zL*Z%RPT^^~#-wiB-EW#fR>F=Qt#Nm25b;_CbGzR|l<+O7jV3LT3y%tNHaS?@`}o41 zF$uNZFw7Y~77Aa>jb2bAph2cqyb2hF{`0@kc^4I@JroH*5@Ck{3%HA7J ze{=QfTZrXPG(~C3e0zG=<=@}#yeD$(it9e|@}t3Eyl(l}7SBEY4FhdhBIcb^!*gCl znFlPvfq4vU4akQLkM!yPH0F@Xp4CK5WGsrIY#-Z~%66Yny0cS6LL^vZ{#CoPf547v zDOQeSMJf?e5Ldtea!LXg_#yu@^rU^*gZ%^VuaIC)(1`K^c$#TLNtk$0pons6AR0!$ zLUWQKxeJ{spst%xMbvmTKy*u_|1@&<2(Jsb3$Ne98JRk3nUx!DJ=x2tx%A513Tb^+ z6{A$>`g952ZR_y#^#BMQ;Q?NEWr8Kwqc!wGt6zh&EFKrvp{{ zN~{S=Y!iu^0Jos91XK~^De&WAO?3BQ!NF<=uyq~mg=ar(~#oOa0#k@s$PSzc6DGpZY zT%MiJKfg1}p{soS^vIIw;22}*cuMOjV++=yo`T|dD%z@Ov!(S!t0^oRsA=_x^+YR- zRun2H5=~%|fM4gQs|vMD>7n5f8#?tsN@5RaH1W^l8V#@Kb6(2f^@31PSCF5~CtaD} zHvqx#ExV!o0Lk}Jze|zj2?JMi!xC>^ZcUbx|8oD`UrHT5QaV&bC3|pDTvIB|$&v2% z6%>eP4*a&})c8hn-$b+WaF^U1-Y9%4?aZpl@s?;DwsrU3yUt6`1&HKhr(r4L3qt&ZY~Ue$d;q9YOJv}hM+5p1Omb%T%HEakh-=S^t}!cIW|NCt zvYY;N*Q~sC1sQXeEuA^!svEU*$tdANv&&^(v#x9Tve5*SsoPZk-nva@m)o@7>0Un? z!Atj^ZD6Nk^lh>fKMh(sMon0&1|FKqIv6qslh=z6Ed%72Dy!IIOJsI&k(zNe{r5j` zk_^X6`ZxFWKTWP6!%seNfB&|pQNmWNqVSmX-rpQQ`2bN0Cje~8WfmX!`rCUhuDV6| z?tzm(+(*>4Rl?Uf)zvuzW2UIDP+k<|WI}{Ib%x>RC*r31(n%p}+BT+-9GkW+IrRJX zl4DHYwrN6EI=PMW4E<6fuero2mvA4UMJq5i)7)epXyn;=e>z3@9f-LGcf5hMl*Uci zj^i)l8w{96&a4mrQ~GllC9!c~%TH#{M$B;EW?N3ttH6-F_R*bkE z%xs+9eK>1JJlEyUi3|T4SYbBZx6y2}B_?h-TH3hruKPE(H$8SVQM-|~4Xr_@In|BW zVgnhInnHim#YFuiJF;qqG`&6hB@?p%o1y+ku}Y5rxPFzA>{ANaiBNe-q$cmhZ(g6f}5CD+Sf>5JC1{YNhE(3F0!pqbX3(RwM@_N|c zFzw=ol!l+B7sM0Mdy|AsMx{HQl(76 z$#hO*p?1?0eXP0O(<)bIWm(nM?>D&fvK;|!P?al}G1;T~4{9s&3~cWA(L?15m&fK{ z)~>Hj3O^K`+eU6-gO#NfAS4*o;1-7UNR|0&(@~!?n_WwQKqAZxwyrJL|JM&?c06U%ORPS!-dO@oAf`H*?OVR=v)~F4S5z zN+5)YCd&}E8gy1RrguKlTO10oX1m^K%4>6G=~)DM_>yi%EXJsGuk#kUP6`2@0mFH& z*Y7NFja4Y}-Gp?I88a-Qs4d@6Y3k4^;uG$8HkVZ>6{d2Ts(+j_*H>Op!RM>kkox{2 z;Rsw5Iu&f8xr|1}tTY4tlHM>@EiDGFo?bbl;~Fu({1Z6Pa>+DgRgwURk+FuLorv&p zv=R76sC6XM%S1>W=qad%1G_wM3Sh6nDM0zsc0|E!6pSFE;zY!kd0?&wr8l1tn`~l0 zKjN<7P2T10Tav&7>10G6STwUFdt$Ckoo6!J;)Qlku~Vxs*jOESa`jr1$`w?}mAukM zx|OzkuRpal^rsm`;TczAm!Ag(3+p`9y^Z2s;Xjy+&E`xnc2|LnIxpPt&XsPg6uUf-7ft7w~JT& zfw+4o-?d@ch@?j;51V6l_vA4*Mm!^38vC%}t2Q0LXa*LS0U5%JS+ZNQ2IGMa4z4Ku z1XMXlM4({XWT3mXmejMX4KfvQpFUQG=p6zh1P(#hx0TaeK{z8y&FKjo3kEhe;iDcE zfcF9NrmRd+z#75I#zyOzI${$C4z8egkGJ98@%p80)mt99&dA=tEGF*_>L9oaR=CWYsR-P*G_o6S+z$z#(P~a{(6#ymX0~h z+zw|!lNvkPaUB%ja-FB?(Fv**Bgd~HFZW*OO%_;My4Q{$zEnTq*A43HRN?uNFg=hl z(mS>Jp)!boM~Ci|rMz6Z8QFl};xW z+VC;%K?kAOOY{Zm7ozQ4hK7!RFs`B9d6c9mQ-&9ZPv@IOdauhoi;5;SiiX_ zWHK;M)?aq=IP-A2oqKccL$m)pH~*+mz|;ySZZ3~)-BsluH|nc;xl+!#{ao9QcRBNG&Y@@wdtJbh8!GYyZ)Aw zzW!rQ{z;Ot{z+k{O^#r%wLyJLxwd z^XJOJx5eNf7|~5`*>4^z8HR_EXsbFq6_{Qh=&*U_cl%k zwM=iU2Q-PXbe70@^dA>Q@*j7JJAQ6|4-hly6bGu#Guf4I3#=NJmMq+jRMnDLMGTM8 z6FZqoQTr`j5OI0-s_>JgLyrB~1ISJSSW>S5iIM8Fd`kT8G)kmiG74kB5_qw%knBSo z@oyzBOWuPdb_$`9K7a)3Pq%~9W`D>*IUiM@0O!f@)4ww;cr6QD5gESP1B%!6;MicH!*-Y@P77+wB?U{(vm~ z0JN-bp*I7tds}$B|2Yv_ml9GUw621L=mG8zKA?tYOyL8Y$OA*gF20al| zE!BG;U}OpgXwsPQkfX7WgsEmUAWlI(Q%5G%c5JA@ zvU7cnaQC>*j%_XCf?T?a7#|JPH|92fQQw$ue`M)hN67HnNs*fMopiZ@%w_PtA1jc&hb32b{w#B}vxOro)&kk4QYrL#`LlzCOWDbu%nMm`flvZfG|KV$j$ z-FNRE&whE;GvWRhXt!eH;b*Q&eRI=I-{8}UJ`2g|xFh(1d6<`@`9woMA|kP%%i+S5 zK1F0WhSZW`Qt4EZc`V(MZsAXaeCedS(Vb5ELclEaS@QrmjTB5H)0hpPEE5EQNlSt? z21ITlh|EwEWF@giEs@COAQx(+_op}^iJXqHgKDa5asPlpLpVlbgj@6s?#6S zYL9`li=n^zx)AA&B=wJxE3xcTD*N=wh_LiAeKO-y5#$mc`A=Xw@xj(!AZfrCg?F2! z%%%|*5?(3e55O%Be>hdJWqz|Y>@NYc35+My#uxNsQ%rG0cZ281FRKs`l-S?BR7$Qh z-dVrO@Xl=E(CcZ!zjWz~bC~pbD^8Y^*o%J<{*O3DPI*%37d~UUCSH7g{XNT97LQ$? zYDwS3-Mc~fzXjb-ryofsKuafo;|MWb{O%5q#oGdD3s3+{Gu!C$mzxRqo(e`nj_uaPooI_7+V3f_n$&KXNEvegYzVOAmOI2;f z%Txl_vJgS~zx%NlOt`B5A1jvKoKv>6a#W5%cB9YQE}Ng#F-&RRe*ZmNFS`A= zffzY&T}2~NcH;d+T}$M2l)?WJg&c4iEkTi+0V>Z^9RNlas=*@uckms`6J|+}MwkVl zE*N-dTsD!&Rw6C9;`uACcs{*j*L;_2erJQvcU_02%bc~Ubv}FK!A+YVd~oxo2X_nq zIxLJ(Kec`BV~&r=1*4{GtdwIw_4r|;;(YY{D^5OnWS2C@x2K~s>682AHEryBn;yjZ z4?M8>3E?~8cUvB~Zsk;R?@dJv+4DFYRsX`H578avc%LRj22up7SnVaEaV$dP+@Mb2 zq4CIrhOkSI?M#gOW_%ee~$=YyOXUUtta- z@3Q5iMlTbdyK_ZVk=cxE)U2`ldFI@H5%zHXu&HYiR*LHY$S&l*@|^Pwk?pbS!QI|E{fuLT9l>Vn41g5I@&W>ri?f&GFo z2Mvui(Ha1iNH}VO&gaA?EjuED!@2g}wMSvNZckt@^ zbBcT{_aqY7%7ddWm!=M@i%rJXYvdmtmEHZ<%5=2wE#Ya?`{vOxdvUPHUc~Hq)u^&+ zVxd}piz@JUQn_L0+rqRxfv#aS1_Qa)SFTn?$r9m8tB0)&yDHj4Q)OzVO1NO^@T(S# zL(0QB&KiTUe&dAnr^5A~AR?Oh+sP8L@Ls*u%05spT>iM4%=WoC#%#@Vlnc)Y*M>(1 z%>k=bX=I0!#ZUiZtZ{s3P3^i(18oF$Y@`P&pb7q@ zvO&%Rinll&IO>Nvk;2BP83HY%nxOt@^RQ6}1388?OVhV+Wsgs0?25ERVP|+&EE0^` z9;D*zmtfJOHEx^cUSPX*CM%hFt8IaM+BUL@o;Mw^gE?}ONuG9OHsL}9goCExOl6k9 zcBF9hZPPbzo-Rz=Cbo417-4=XMb6q`w5^}k)dn8)rye-Nvy7(}Gh*3HgK@Lu%)3+n z3oI%!*v)_P(IJ#lCcqSZfges}9(VST_vZX!8Iyu_9WRljFOkeF&%DGjD#;zAuOeiL z)kL;tDxm*yaTD@D7Ic(j;`>P;SyBFLyqBneU^?`pM<(c}IK9OD2nZ!U*T9lL1{g;P zQHC5spChCsLWwhCBD+2mm(S2;iqgWTOcCcZWEYknl3hS(8+Jq-!Js3u!vGXFx%%`X z1GZyXL7}pT{gaax|rmpxnPf6C{R0 zTib|2S=j5#k%yaW)!9?dat0A=*X;8^v`SQ&KeDAp3DgrAcLuh@xA;PZBR zg`=d<4p03_tdo51mGomi;T*5W zBR30JjLniAk}JV|c8{b_@+!PN3ED$3pu<0a5gVJRMq0Nr)(md5j3YKqt%Cs={mM&V zt(QUujwTQ>MqnxgM4FbD0^omUM`j%X;ov|kMM@GAVteUvCTv*~XK!V8i8e-rGO=_w zoddypK}UkYEyU(oO|oKfA7hGR%Au_RIi%5mMX8P!NNn^DF#hO?MyUXe5YZ^CBuAyz zAaoLmQ4tEOMf%#4pPP{;jWHM)?Ifp@kt=LAg`7AKI~*z{W3ezw)pVPUQEMy~jk*Wh zTB*WpR!FsEi}0SsqLk?wqmj|el+#Tnl^ko>maAr>%xuC2=oZxEl4o@~9aI9XR%h1D z(rWcqJyENP-l}^|YjhfkRH_Dq0Csag*5}@Ne*Zr;M)&xhr-|1PuRQ|g&-ss8aV zHQ)cOM)PgI#`o!W$Vm6yr&5JrWzH40eATw{n%~Tk@(&l_f~OwphL< zCqVa}HZY$G%oj?XR`mrDRG?uJ%%7|Dde!ITbG2SC$p5Y}8a2z$XEq>ISjNkZ>1)ov zgE4B@ZHNjMe(1B_iMB^&AdI3IXEcx*Chj7 zB70ZAgoM~V!p$$OCVPKo`w;0RGhZ4!{v}p2VcgvrJjUJQ`tKgHL2`y{a5*?8l{pSS zVw`E_9ZV7@{DRZbcUGeBT!b+Rqb4RXao8LXXKXTqpXO606l_ghxNxwE%@d7RW#3 z3UEXjf7lI6*9ic+0Pae`^tPR>QL2SMsL3oEYnGOP$E&ou>S`~7xQVo(=)(GU4qQK3 zr?C@W$tk9f*D9E@M03cl(WrbDVpAIxG#Fl;5L{*BOWVj61YAL>qYM>lvf-j@87tpW z>ZJvtU!o^7M2?;aC>6H~*pz?_@A_f43oiSGu}SQ@oNif|jUiqc=UP!8 z=>_F32*pk3PFPZ*vcpA%CN-p;Wxmn4U-oTG7E0BO+K-oF$b+b15-I&yI4^>TevPA| z*`O%f1ySQ{Y5ZqvdO^$W`%*F%#Lt9hQ~Pdj5nk<{#WM`}1&EZna`}}EkJxL5;b(RK zf@)(^i_(k8hi0cS63J zs|Oki5QJx-ntFo~>>H%pY^E}xqM$b5MkoYvA@~kW?9WyLsNftU=J84%FU=uI1-qz& z1e^PwZW2CepU0^YenL2@YGH@)Zu1jQ{eo)vbm78VWF|Q$<=}w5W#K|%AkIaL_Q^~f zi|eTOp-#ROKBVnH#1e_)P3HY8s08{;dZ}0gP%Po!hLQr;BV~334uMWAl-Bd--#Lr4 zPP?Qdr)gAseNmTiQDw`*c6`PC1Bk z|3&YFAt(-S5J%N3gxme>D{!fPNgp+SjP6|uarzfLH$e)iK6*+D$1m-L*m8QjAGFH^ z!4#H29_}tYGe9>0-gpLnEkFNVf|O((Fhz0>mN{pkLJV{|+nAL!+nm@Nc5q(1;$0 zM^XlI4futW(0Z&+Dmx`;z%>=+F$`--08{c%b07caoO2rfcx&P4E_cI%*(-V`x`@j; zY3;gE`&aF}^~k{oo~)8NnyMR&zN(UV^8aqFW1e}|cCqmFEzbNRLwxxa?}InfKOla<+Aw3N@!C?SkfJo8^8o_ zI-fw6;_#rs8M>Q+4?{*lf6ip$gGD1_2)F*3nIb$OJoLNYv87o1MtGo;=rMVHc^Mg* zzJq)5cfvzNlfHv34fMZg$+Pso7znVXSU~|SIp>ji?}fH(>3^H-I{4m&4?q0ywD-t7 z&`*A`g)pImWS4M#Zu;G9Tl!s%h6&iR8RREo0+8h2rQ~oF4^Cf%UjrF-Vx~<}RSZ*I zE(2MIVn4)+wu!iV_&KCBJ7WozHtAvFJ})oAL?hICnfWHzmC33lUvkOkcX2xQWGg~> z@BaL}sp{L$pV2vjL?679*l!~z{`9L2m(0`GtD8C#ot^Q#F%1oEW0p0nz3W%&ub4Tl zv7>Bsdu8sZhQ_w8CH3p>X8H^MuC2*;raREK{(9zN$DD5BT3H_a=?1Nud0!pn*^pUZupA z00^Tj5tSm3ES7<&%$QX!=9c9_0)sU3X6E^ShyF8t!uA7Cb=}?d)XA@&a=V}EW*W(c zOu_RclPZ>-{Zx1NQ$Vf%1X5Uw9d3Fmy}|)ud-_SSfJENUoGgFpK<0AjCt1h|evE%Z z;>VXe18_1@Fu#N{v}Dy$lYcahh+FBgOa3nO3B5w!-!FNJjDG1I;T;eXh*@fdciwr4 zjDCtq-A8v`@^_NF?=`aGOWz0iLhnbEgMcy@d_;QkKk$7ipcWA}i23ZFsLEMr>E*^m zNiljMCxS`D0CtQRk`;cwZFtH2PC&AwZk-Esg4y{wTFw0ENVACmqI*lPKgx2}QEvCVye^Z; z7cdw4Cy!~hT58(tTvkqTwpOE+DP#Ggikowbz?sCpE1Y-gkZ|y`3z*$+64-JWdFkBM z*Ij#OYe`h^Gw4gVEuZc6IEwvFsdR;*#pxI9Sj47n+C_64wj)Xcy{3t;pT-^ zp1g)@-ZnI(|2o#{s+>8q(rfAp^75*M!p%o28Vqk=(~!6B6Rq}RU(=z=?xM1(WkubU zhnjpJYqg*F8xK`aD#}}&S2U^mP@|C3P(crm1S=Pk9!@{A(q$bR3U-;imDb8&gx;j0 z;T429XfFCd_&s7}e*eKm7kxl#5W7Zh_&9LS%OJK_PssaKWeGE7bk2mF(NjBbZ8CnPRDNY_y0vqvSTwEU)@I|E zO68Zv=36_MNF$?~kh8xcr^0{F%jpBc+=KqI8uz?&m(F%qRQMx)?AV_(LB-(KX^Hq` zc*ZkN%k29pbUyV*rbJ(s3^CW0uoy3ptf1(|FpOf9QHdS+wI<@yAcjwBu(VmQ6c=8m z6b?EH45R20DOnSoM;S*<`PnH@ znU-mbX3h<@cXoy%caE$qshO~gkdgW$q6rpc|}mM zfW4fn2@zHg?ak<`h$MyQiiQ`Lv=lS5hhmgJXsl0?YsZi4E)8$=c$QBnnXh9F&2c*$ zo}1qk)E{n2YI&bMPp&&}lpO)v=eQDNTY=41B&;b>thIE#&z#?7w)+at2l>OB;qvN; zop}qqD&bJPd~C*5L)|+2Gh=x(#-YO)hiLs$8|GplsgTtp7@+wT*fLZpU7J+vUEW}w38eItqmZNf`rIh|C45G*4gvtuv2ThuDXc4 z_`F(~o4xr#n>-TrA-kYAe{7|2#8J7Z{f-(gd;Ga>&c1)lWrqs;pUj`koHIS(pOU_D z^8LS$#%g*dRg)QD^LVnOJea-VNlv(W8>d}4abi{VBvc^g{(<%>=A~8;kSobx+W^dd z&`(FbE}}m!n<$swWH;yBxQ58)FmSG&`4)_se1oQtH6u;oagR#y4*UV% z$RlzEQQ?Bxx~KCmCdnIwnIbM2*apCK_K0`0o;qZC^gB zrnD~peLitnc+7HIOQfYaR@=5i$KjSiQ`sTL}ZLR4Z5zHCAtN>{bMsjN!6PEI-ku9@ESMg(;v}J0-^JMuS7w0b5 znX@cD7-?=8W)2tRaCYfAMyrX35sT!5f6!STjzv9;6_lBvK768%HD@<*NHttQXnIdk z?y7^F`IN{L?uU%rCUVHqK1zo@akLs-EoXkZnBZUz#7i_Tpn#3a5+TYeLYd_#dc{U1 z(h#`k#S*5uBs;gUF*loal*U~7`L0;$=f#;4=AN=BEs2&1-}$2Zg%57C1^v#VI#-t> zJzRMAY0~-3eWdazv*eQV6Mxve+y^*iS4kA#R|fn- zu&3e;qG3vLMn`=l-=NG{P!dW@q#yXDaL&2329-vr{@Uo%C`>lC=j2i0{4mP|q$wR{ zgn!v%CnO%Y0uBjp+Bjf5$TTk4KkHU)cFe@~QB_pz^SCGfJ*?JQKf0@!=#AcW;GQ7N zoi;maX8SBB zw0v&=GnX)%`~NoZ44HYcOdJ!a{DCi*(Pc}iWH`|I(H=k{g-Q{v<}ma?m=r%QWf!J} z8H0%E83q-u1cZqn?7c^L{#>B=FH!3BvbI-O&wt|5F=H-$V*bp7Etk-A)B;d}v8Z?J zB4WCFFCq`qCkDZL$3!R|>lU7)++0^}S32aEDj4OA`8fRuuF~3gDH32)EFsOzy=Bgl zbuV3)$8@b(Z6hmq6?u zdXVtQzxf91Fn&M9rzk%aFfXVsQ6;NGq(q#$=}<**)WJ{ZWib+A-;a)nqTVnf6_5cn z4t)>}4PzEXog;w~#$Z1ki{Lk<(qh}xw}&MofCb9!BjRB5?P=tIsR5L1!lWmvIA=!w|rhUdd}Y5$nj z@Zd2XuQLzdk4WtBzY3^hY>D1*R4J-QL@7{T4h1Gs&|F;1!b2qrcn-4Ri{yl`y@Yd0 z*^pzgBXmX3x!4)Jdgi9aQKc`rW~P=gL~>^9sMO=stc>u zp1E|DPH z1|+>G%%}<4&@;lb7~m`>2842kdFnKRX;3oaB^xJ=tNn^$zN#HJY2(KGHZfn-jm65O zv2|Y|sE=$MDk`P#+f=niuhp-qLb%_?NizMK%8mDJtX!j)P1?vF8!9)6SVmEIG{8bp z2aE9}WF=dHrxwk=qJ>vZKCOv%Yh zo)At7f2FjnBAx2PwiC{psVaa#f^a&N&m&A4FlmWM^^S9%ZFIKlfmIcYLA zle~cwab?#R3c6H?C69~O?j5+5(Ku}I{&=DcPF1X14!C@Ld06RKKXaA|hyZ9WLm+u1 zYU9HRsSL0LRFN&gn`8*8j+(;EIWTVc&J}Lr|J??}oqO%vFY7Pd{Y6}OUwA+M#qNvh zzMOllm$Y2A^8D}4UwIj6VU8R*BHYKNenP=LIsAo_?BrvlN&QmChJE`sbiAY%o;Ws{ zJ^8}+nDF|rXml9KiJ>Kc>Yu7U7@IPDQ1zHiY1R;GVYn5!>kiY=A@hYZ6D5!jXKm9F zjgDUbX@8jR^5dZ3&mH;m`~C4Uo)bA9>NwaLyc_};espuXotf1sT)&St6D)?TGRdDT zPCw<2Figb7ochV#|KTi>N(;hPVQX42l#brCNgD1 zvWp5s5{;f&-4$_d+2V?%|A$k^r5fdYhRjiF3}qc7I;+Crs?HH`C`>$a*KxQcE=)hS z=pzx^E@g3}=pCRZL~ZT#1ON~Xut5lx&eUcc*{uON08|U3d`6q&Pp<)B?F42E1NRRy zJM%GAHH^}96C?Sr?6UqhDb*1YaDnW1aE>TLszQtvMYxNSj>v)_3QAO@Im7ql1+=foE6>vkVT=e zML-E2DW}+g0qxjgNR(UI1)Cq(jDO_2P2H0>Z=T$}>HXxWlfN2Uojavei`8=j+%dd!-BCV*E({dFq=jrOQYQES*I7_41O!tkCj<#5M2QaG8ryvdqK7=gu9TZr8csspKTHAy4i_ol!q6 z<&!|m64QwpObHr;Z$XeC@yn?D)x@T*VtiL!l|DIvw7dzSd8F_dSYno+%Z(I9k_YJj zv|M0aC;$HDo7~;~Dq$pkFC_j<8=icM@OSfRWQ@v%95YffhmKT`I%QJSENWZSf?);l z!poo|oEX;_!8Rr%>f(a^n0^QrUm-z17`_DZ-=T;mxdE-G&1&Sa35xRsy&xnq5mJN0 zK!wb!qvfZ98jkQ>%^p&%D|XmjyV>G3!aoc_lNykvoS^23*1T~x2U{uIUmA95?=I9L z*Jlw~^}!~T5!peeSTkrd+Vf# zRppW?oSGxi$X>^L&`5?#8hsNQ=(QGe0tSE&-C`W$&(dQ$TdnBh+>We?VZv27Gv#S`x zZY2OyBt_P2SMC;6st1M5LWQvTL6yp|2gJf0<7BwUm3uT-o3rxrvdkMw@MpJCqwJhC zsZ*&j?k0Nqf?0WWb$PpuYUTD_yS6LUDAXx#+PCi}1wHVwKmF-3dLTu?Q9A&nV6oSo z@k-UhPdpYrmPL~F=$s-#*jh4}6K)VM{Y!r-HzX`A;+Gyg=WM=6{lGoW=DZ`R5fm3e zUJ!qT%nyqa{2SQ%$wGES$NUcb69&&849DX!S%_!9&{1|m^t$s{#zpXjSU!ThAZ`em zpMkBPEKH+)mURqx;F(k6X~?W8PDi4?A>1LBv62%KdYqIl(To)^r+k4rkHRibtuKrp z+A+}kFuI9BP}DF9=o3}v!~q124L~~#QGm2Yp#;K80}BN8x{HW(2&G>btrLYno+H9@ z35Jh4PFn1&B4`XL_{g>k=KW^r+_+su5K}zr`hwB#F1xI|d$y4oOH{&}z~X<*=X;n5 zfz3sWma*%`tr432PLpt_&gu7BDvm9EuOiIYq6=p1X{ncj7rFYuMO!}UiUBs)BTs*) z1o`Z5JrSoV`*u2pM+f-Tl<-D7;B|slWs{gddl4xwg@uU$RM2QL(h>#HgZf$A;YVLG zl0$wIQT7Opo4-^W&Ft;P9i#4#aYx_(jN}G|+H66>&7adGyzLmnne=3yCCIN}dz^55 z%q53NnLa4o_=l&E4%Pk62f{t%3gK|tBrIdDXQSypVUnQ#)ZYSK&Dbq7n*`JDF?m)27D?iLX(kMOA%T@ zfiG0Ffqf_p6^<=Uz=~9Qb}N=Wa;dfq39?xAiLF(tr0^|+?3lV+4bD}=FZvDP!*|ZV zleuo#==FO+)Lay)iB4#-+S-?Fy@|QJIIp+>9J{11)nNVZ*TGkL-3_oO9~YaG97`l8 z*{J|YePRu82%1q-h4#rUt33k4Y)Nlow(4E0rq3O23t7Bbe$|x$vS#+eW=Ftc^%IBu z#`5&R9&0=M)JgGTyx2DFr|X7BOXMQjAPG%>5=Me~z-OXC8J2#zo#gSvuEokmLq13>Ks;moLJ;z3yyYjIm? zg0+BGvYJ>*qa~#P6T$wBIE>PGX-G8vh!q|}3>8NeL~*NpU@c$^L@~tDK^DVraY>x& z?bc$O#cGkc2@KvrDU$WVlNFHR@nrPQ)cb{S2>N5OmC_7h^vhB+a6Q4DaVe_5(lU!# zw4+1&r_Wz*i%LbWS3HQz&{u#fCNW?^PSAZ(dZ*GecfnPx^t#xIhor9}Uia*q{^*2( zor4b~3k1>VM86!(%Z+PMc6V6DU}B5XdIGL@P}a@}*xZcN_4A&%c+8lK56{0owQc&0 z+cr&|vU&5AsnfR3n7%D_{rtmp-xKq$XXeNZGSNw8Bf?kHe2W-ikXB#O|-cKR7uZ5(TT(GVQ1;IKD*BA^?N;j z@0}ix!ATR1xOEQ{YHbdiSq;J%Z=uHSbC@*_zsJ8-uF;r^io9-jp=FLI67~A6TB9W( zn-kh*Q+vJO4pAtKQNPEeH5!aIo6)4#n%(}Fki*jDi6SSb_5z#QlcAS z@#%&1i23tyME{#Ci!?+UvreNCDv`Mgsb5hG8a^*#cNk6fiCMnPiX-Hp+aBztPl4Oh zyHn6D*0IHn$3DB=tiNbPC^UlpZ*J0?V|6jJJs@Q`rA}qn+Rc8tYS7vYi29IOYhBsd zuG*5FF<(~HWYziASy7zd5#-z)PSo2q#2&G$?fT0GFSTxP_hrrNTFu!t*=E!SBi0Cg z2=SRH$2YzncHm7u96A(;d=Z&(Qi-??nsK-hIGvf`4q1jA~oib#XKO7tb8)6w1$r@c;e$bb_`&F~Ni2jzvZn2Fw$ zz~B)d_)khjggJGS~kwcJ`S$EEhn$FG)b)C?Be?Rg4{?f);@1;dk*(~!#;TB_6ue~koujG{(Beh zUbt{KVXkcLp4__g$fK)QtXTahxoGr)j=G9-8WhCenK&*7rYIphp6F!0FZDa$cKI}A zbC$PH6CR9|P9~in$MVcdqgHQm<%JWmV76W(Ra?!jyjZd}yEEKSQq&abG|$;JC;bSc zi%r_Ko|C*fHU5MMZZ-d!_K;<@%9@Wx|6OFrky`ijgBLxNotf;yC;P z19KdM9L-wjp>Ck8BG5)h!T0r&0%+sf$hTN2Lv zkjxKXirD2~To#O4g3+K1RK6xdDPT%wEeGp9$`BglwrgN{jB|EL-iaRh)`YmW(^uJ7uLBa*m(&$7XGI-Ke zN;nA09{>_C7UNiom=;}hVi~*+tXPQjh2p-!$Alh2G7T7~LDWZk#B@Y`_||eS0j5c8 z+}MXS8)x<*jNC9-9f5cm&Im-bpfa@rDJ#}aeD&mfrlGy%ww*gk?W`wa$f&eubjT!agn2CWzTsF$9FQLv-MyCyzdwe%0(XgSv}M>Fy@F$&>plh^`XnrC<3lF=|wT zxwE#mprEjD7ST?yA%cmit*xpe>+d> ze4^cc(iT%F0-o}GzhxHDd0~0Nw%;391a(%WY$gC>p7cuGwE}l#_6uJTU3%q&Du-Sv z1BNQ6(xHc+GOV2wta51Ju2zM;w9pK?-$vo<7hb5Tx!}@jjIK(9#}tXZhOa3(4AZCt zeR8mWs=yNvM86y>IS;5hz*qP;0}qHi0D~PqBaSeil!iUQlCV3>8lbEi7?siLw38X7Ay0^wp7>Q~U9X90Kmz9u zGh;-Yf!@kam`UQaU~ zKC^g{E;aY>7jX`w7r}f$FY=D2T_qmcXkvb7<8v^QFe+0lBwIdIEMQiJi?iI}QvaG9 zFIlAGEc-(x;`Yw!xJj5VRhrI|!-jRvUkNW&`eTdRs$1-4wL%XTJcV-aZoPtMmT%{l z$~8)|v|`{C&B}j2h3Jt^>K>w12|Y-kXd!bQUbiuM2zE$ z5%+bOo?z+mdio*1I#~xKh1Nl9@bD{9rvijuq<*AxPY@W|#D%3Lf z|LDW95-oJ%uc7PzKjz*$Fsdr;AD?r})J$)wlbIwl6Vlsc5+KPWKp=z?2qjWO?+|(s zVdyBJ6hQ>RtcW5iifb1!x@%WfU2)a5#9eiDS6yFsbs@=IzMtn#5`yBo@BZFDewoaj z+wVE&p7WfiejXa4W`Z0o=tf#%Y#8W@tEJz+IKR>U~HRPH7}){FA_g z2@RTRpp84qzJ|6Tbl~m%2s1O8`iyqZ5(?E!d*MNCf_fBIp0pN>Y$)^p^{g6c-qdT) z2G|`q!rdp`_EOQ1xd-;oeZW1skI7UsOBvE8XfB>qbJ|9n@GEyp#)N$*zuR$;iHTMl zMb6o*mJJixJe)xE3Q6_4>)`+&0VYGZT=+r_+-_y*&qQ=9TDu^?KY|vD9{9zI3DK(5 zME=Du$arMS#9PPZ2`ya}-Oqi0SJ|R6){pAu>P}GuxC!H>S(E&)JRvc zK(%pLIt!%_Ggh;J!P3mN(C&zQ%b!{2zgdp>O3i+p(=nue_40cDaryCg10&jdx17tO z(^oG`_H-m)1cDqwb`64b;Smyx)_@t0hzGhdMCC4<9`|!TD8jm$rK?L{m%e7ES5xX| zjVv*(Fl`#N^Ymjk_TQ;du2gC}db*#$3;ZWOD(u{Xf?=5$H@|z8nKTK#24ycWnW{7M zAKQD&^LZK7DvgHE{3S1zo_>f1NH&P+M;%Csfl8EPu7x`aIkw>Sb*g?XAd3zsX^HUS z;UC1y6~<^aDLl9k{x&4~;8i-HtfOnX;mQ^KYx5>mteILiZ%SkHXs&4RwL5E-R@LO( zM6u}hNxwS1`A=KMZudb^r4d&kLjbo*jB_XUZm7xw()$Npp75WZModdD;0bDHwr`R1 z_{sVCpn^HUU7WwBZ2nzSn$~Q2(Y)xssf8Q^yiQfaGpCL)?csqTYl$*OC+Z@HVq^XB zOye(GF$~=Qgsvvqt>JX}F)?~g{W!WMD}jH~8i`yrp|6CFShk_1l1@(nOjnF*SpCVK zPZ>c(Klp(l_zKcZz|T@YCZ0yA0EZ^D{lW`$b84Z^U^;j-tpQBvB00=t(w>;jRGNw zHbmPcyBkeUMyN*Dp&<=!4Z*9_kr2sB-A2w*DIcMAtDSr>qu8;Cw5OT*sv9K9fcGOK zSm!4y(a2K=dfsK5;!ihJii?WuI$xqIGc`8d;YdoW%gL@wbJ?B#*wjo{qOWdT^k9m- zk==Ptc1~SdlEaZs=lt{%`6zA(m=DT}5dFZ2(yka(5~#H%rX*T@>g=_aAidv5RVz4Y)D3sGFSTS2r^}yJIAKH`4lg%ntx|R z@g|#cj@ugfX#OhfWp`jJqBtUbHkZ4DSHKDHin0O4ELt|2GH9gHaP!L}3}X%RMu9^v zuS(%Jt&VKN;Q3N&Y~gBXg}t%bWVW+k1Gq)5L#s5@ZkEsLIw^XNABqBodZ8Z+V-=0W zNfK@`WLS{B9Hl>p2R#J6Cms(mA4-IIVD5qlOg);Cpn%vztqY4NIw=`LQ{iB&^7#Wa z7a&uV)>V||WdnY{zt5auLkdb=`8s!>hE*dQPt81kI ziO)fk1BII*_SGJx{lTuOLY^sHz={3|Pb?n%Yie4$M&R<(ilKI}PV{R%0}AWba;7QM zlhO+kSbd)<)y`7?fZ^f#8IR88g^8yYJUP*(>zlFUnxzNtoZYl6N1f{El@=@+k}>b# z?4Dj;?9= zS6nw@ob*rWHR+$@M%;ibXjl5MM&Dm&83`?45etEsp3Zfah6&wn{SbZWiSl#g2s8QF z!b4X)kx8BIv0a|9d#)&qO#jKn1JeLSU&g}PO{iQL9$?_n`%N@9{Doli;kV#$3Nk1^ z#U4_1qX>;tNcxH3ovQtK_!)Q;noSJxssaap?qI9Elad>s5bi2j#ytCs3 za>OCS+>#mBw~`ecHs)WC{zzU^cx+5Je#R3lToHj6;g(tCOO%@6wkpq&GX4R1 zbtJ>0R7-sa=3topyX?tUg83mJE@(3F#$*?KY=Y=`;PXg{F}hsA=r60uXOmHR?c0m~v#F!u!V#*&AI! zFCAz1AzPG%yv`L)O!?wt1!(?ra)UJ3BIHo!{9Yy?_5{>Guyf`FChX$Fc_I zzkl<0r)IOI1!D?xv z|1Xy@#d)U%ppGeWtaJ{l2B)wBCoHNdN?uM*O~xylSFjm1X(4SGMWdi;NKxSuf(5t$ z(yq)xWA3qIH}GW;dPcJn8YKu5f;{oiO;wizg-JCFwS~i3j<8^y&6ATjN8`%xe@W3ZTPIsDF&xo?<=iJvK1bU>vQqQpAR2|98e;? zywn>Lli7c4!^k9)D%NBa68o3AL)UnD;d+hQ!;L5&d5@<^J+vey>4Buo;w7UeC9Ww; z>UC`7uuab)c08w7zw+VUfg^7(8}2hqI@xh>QPckSg{{)#cJ`ZoB^^z5>Wnx}rQ)|t zm9Bv?Y4QiD9p9(jwKLujJIq}-HB>Ae=~c1k&Xe~rE;Db4B|o4OT`5J0Rv@-mt!atz zj@X>-1Cp1zVgT55j#C)|HMfmO@q}V#n`2Twx+XYdZTw(Y`5GfTH>Yk!#zc-pZW=AdnU&ctSGLmPRA#Yl%*st2 zE5@3|99PQ)1!p??$QLg?_qS8cq3YGk^9J=x+wtQaLmvIzOJ(X93s+Gg81?GDFTVN4 zi)CtqLG-vQfkdF``vU)J8+thXfiD0dYXo1A1iUiY;}P;M1b7IG9)w;9FLlWY2N_j$6R}D_C#tuFLyR zQg?8Y>?h+f4n;=rDT>*O1&SreUa?-W86MDk6bIlb(X6-=xcVo7u>QE>DaBdEvx-;o zHejCOiI7E?piCY_R(m?>8YV(eH+fkc1o9v@DE}J~P!EEwJy^lDDl0jm&=M6(WjI1} zhsug1OnxZaJWem}2`>S^DmBPMa~QOGSg}|L3CHQ+J#ajM_k+p-7#qsBCaS65;S<0J2iW7)(J59wVcB6%k{?6%EJ!OsS@Utz_$(y8; zY_=t%V?5*DFrIlzZ{ki!YtM2>w{6Pe9$-Sq>~eHS?^dvtrb=lv8>;ST64@AOhk#MC zHzd7!sHq55P!v@j9C-9X0WZ0+LTk2bC|f@z1F_*7DLz zruI=vvH$QnNO|>oNZOsqiluu5BhEgp6xpgOR(aQlPoGxv0hs4a`qNCWlU_c;dVlqi zTDma!WiF=mlT6^9KFbP?yQEJ)%wpTyIW&YF?FBzULCQyRsUJR;KJU0*`iv#~`OnpC z4l-gG(E_)Pgd|FRRmT4(%sYi_RPEM6;$3%-Z%5%{n>c_iJhrLhpPL>N-gq#SBPHg9 zDzo{9P0z5IZB?7kp52`GFuR8^%q3e+zbL)g1bTBFEEJU4yBB)6py1I-C^!=N&1nNd zCbKBK(G8K1;))gUZ+7rVPAR3Vw7t$6-x$fJPaG&+8+m@w#PTMtSUR>8IWwlE8>A1U z(8^i-@18xi?eGFN_%(Z7r8sxBlq5ZS&Db~Cl-F;l9Je^~taR<5acm>kyS*=)&e>K> zn6*kON8)>1LFFjt>#TO+!OahJ(gx)D`j_ncOO%}4G{JPx7gXF@3{UmqLN~)yN9>Bc zpC>`rSsX-oGVPMHLph6`su_njt$XR&Kiz!upPqdwyjDEi%D68N9r}`S(*JBYcVz9o z&$k{p(E9wnYv-(faNH~R-S=Ja_ctH>=)vYCYu{Y{=JESp5mvRUOUK`Q^Y~KX!uq*$ z+wUr^XJ)0&pP$0-5Nl^v=I{ zJj$bjzVt*|k!cGIjUTvd6KyVeA${ty&7gHGB<#Q1y14zTyV}$4`fA-A?XMQk9G1;8 zp5EWF&#>*jJebfrN6kWh2{r0A9OgK6uv*5?N2oX#x;mx`pR@Uo*GrC8yA6OX273VP`NcBT5$Qr0j?G(M{{P7piqRt*) zN=el73s(VL`SV{oUT6>g%o)xA9Yvu3PritOk*PmT7!2X&#aO|Vk=pG~2a{1WGXR_p zgE>l4UMm$H7b0r$wzikJ{oJv(mqs9+QS`6EILDZbuS@=&Z5%$wIA;~Ut2=)?DwiM7V8y|a2de7gte_wyolz2Y5-{hoV zNoufec(7NxJ*CD7ZahunGQ>M#l7ayb)Ka^pQ*2}^2^dYOPAi<uj~;F1rK7F4-`>hvE3z-Vn_W?n%^t`Kao>fq*aO)WY&#u0N+&ig zJ}Q*7oyn@G$P)Y0@>jpY5>F&PG#&KoJ^YRX^+K*%Ss=<$$y_-}L{UXErgc(E5-&jp znr?_BbPwuI#L%IiL?tQGQxhLhEFNIO&2PPbbo8M$OJ>hnvg%;{q2Ii5`}B85i|$0V z!QOX<^!@rRpKN0Z=T@CRx@XJQI$o|_piwYoJ1MS+k z4@{;Nph^J0Rz&vw*R{6pWnO9y>5qG@xbr22mF}0)L#gr~)}4H_qp>6$<~$925GmFS z&0^K?9>3KCfKji9ml=9*)MPGa_6R~d<|%laTO_^BzGM?4)z`l!wMngf1bd$Dc#b>y zn)D5~h>eq4r8agA3&T>^5wi5Qbc9S$4}>iqA?)E5ky+fW9UZ(72IOS8<1gH;@(K&j zloXa+bBDra6BOoL3kUoHL_@>&^ECv-8f4FE#sp1A{n>?AMziib z$qd)|3UYAtV1Drc0u&k(6_1!N+06DIJd)YHfVjlPDl1-ccwBwGrPxwmkM*Bj&`JO9 zczs)T=dI|h&|7Ak>vWhY=o3EevYFqaC&{Tq z)3qak!8J0(ysUS8nYK5}M38q_I^SDc7B9UZ{n3JhIN{&iL_m^m`s*5hGQUi*X#Er` z6bg?OrWdP`5fltDi&4H2EUat@&_IR9LpUa5W4Rg%4tUpe(;Ger9WZ1j`qB}QTf#b^ z3yJPJRD~)R&xINrsUgCROu=#5G1XI4iK;2pV}O@}KOO%07*Vf-`?EeR$EwxqVsv_~ zH78B)v;dStjN$1NIP~7JcXh{s)q6EbIU@q&-f?ixy=5Md=FW1>?>pa>4E#k(Gs<^oc+1PZ8N16fN=wp54FANlzWFAaH=&b{ zfQAnN$J&Hh3yED}MWOIH7)ogV@}!cEsZ;SyN(m5WYD~`QDI`rOS`C|IRmP8uznuy3 z6YU4j3nT_Wj2)#Thq^tT0U!@=r>Blx9f|3`@u^wA`q~sTeE7h|h2DfqiUHkf@F7ED zuYDvW)BRyvr)4E^ilw7Jav_Gs7aQ@|s+U+3X3)W3FWt2JrdKY!z4Sq+^g^o5V&0dV z1qHkqhFbheojd#ItY@|lQRzNyUi9L?d3B#|Oz?MU#uKs^g5D++Bss#_E~hJT&JrXc zz?^emMMC_0k@h`{lHJLW=t%Jn&Ha_?_9*|MfFDXLc--MM6MEpA;3i*GXw={t1haxc zP`O~@;Da)-23idkDiZUq^f)0+6fq@S=PW6PuYLV{sqOpMudQ0PYG8bpASTE6ZY)hl zG*aHwjnBOO%*LsCJTs=3HujEB7KN<%fvc8PNnxb6k3uS-^=bnQO7TWH*Hy)gvgG8l z85Q}%i&JB8E8I|<5bHDvy5v-s&E`r=ju8y8&IB#)g!{#$77yo#OK1lAl0AaH(6h4> z(VSQ$yN2aB^90#@%0m!-u!JJq(ht2_FagGX;(L(h1it7V^eiZib?`=sRIu_INiKC4V|*i)2yOAx9uOS);1I@Ox3+wfauYF3K4 zOuA;4)LOn_QC(VE-J%WUtrDkDYIq@X0)YDCI7@<^#YJY=;(>PkSyL*zZ_nWm%{ET# zC5_}x+2RxIQr_V`A6&?+38kflYBDbn563}g9u_;~*cxbq6e@C1CRBO&B}a9MFmZHg z>&!U}3RApc!IDO{B7B9g^xk`|r1yg^5$eF`>Vbc3h|%r%WXnmGaS946*%m{#AHL;7 z=?R!_dYl?{EfP$pnC0-+&-WUwd!@fx$VwEwO6D^=?VyBEslcEkgpa6}lN3z`4yHZX z0PJK?bdvJ0Fj_W+No&{9n%>9*>{puinPiN$s+-au%71qGl-(Z(C}l zy-X=>xb4;D(X;8Ib!?q{o3`-fx)3Rmbs0h!^KMx*b`G$h3KiVGf3^t&K3Le`N(YJq z`T??m-Xc>Hm9neQeEFW!XjHi*jq+ootM5tgo!)c20)egr?CPwRuUfLyNo8iMvLbTl z7wD>#prGjauD7x7YW3UykBu=V=6-d>2Mvl# zTMd@Tw#(HL(Xa4!u(TMqUOM{n)hmcjWIp^F%XAv5s*(Aoy|L%plHZjaTRM->L;jn( z(Yu2hvm0`_bA)sevFNaIg4T5+6&Jg&Yy|O_8v!qQUC|6pyf#nEG;`oi7ov(2?tsOx zW$u{H1LI1Mvb{(D%T}Up@bb~XA}v#AsS~tIo6y!hUe3Hpod>3stXub!RwUgIXogZk z%z6oQ`n9kwl4ZuhA>I2=`@QF9hzRu%%$g3QTQ>nzmM@SQ5=@t%DGc~QxEVaeP4Jqc zE{Alb9FSjsl+J($zLMM^QvCIE_uhN%b>{Eb2iB!!>8wMCW-XNs%-qH6SFXIC z3q3(Y{R#O1|M$bvH>XTjkfI*9XHkN54q(mprAzIAYmU6KiOt`%2|=Delpg<6>)oYM zq5=0I!8m-lQR)EeDAT#pyIcQs9D(S9f?ZOoh&EIM?{pHpqp#BEz&v%nL&nrW6Gbh|z9nE=Zz&d4Rf@@`|1|q{5LbefQW~ z(y@Na-`H2D*4*%?Z7cqGjog2Fym_fl%A@S)Jyb3{)5Cj6+>5ufz_Gs;=VK3ci$ultSBF&OH3*5JvSrRY&ov&|RRcDKAZ z(cw&Ty~QfLtM*D4J5(^?V^3o8Thg=GgEmxl+BF8F4JW{^@$+qnKJ#x0Zx>;LPPL%3 zDdoN=vwA^5&Z75q_c;@~T)1b`pb6d5zaIJc$>lpxad^4*pst56UgwNs`X^hT+WSqu4jr1Y{0Y7^+WF+oE2$aU?qR7TA!Y3_<4M?r;FMCY> z>^ypYr$&JXSqv) zJkOTO`5Ya&wv_O*k&sroHp^$Wtud4XmQ7u&@r=;Yy;MG736DQB|-Wj=&+b6p7iRe>0zW&L)D!&`j4@G&%F8+)rOvC}XxURy=?4n#mJfM>!i*&PxL}F-W zkK9IO;HJ||)yaiLUj5NCL14o|7!omTpTvmD-|p^AUS5hQg_f_|cA5JFKL-naH`m7n zI=RB=4=O-BzC3o)xxBqV0Xqb!Tu66N_d)rAQ6f+M;=QQ_1*y{N7hRv__Fq%6 zbo;TFUW#~VpBOGkZ9AD-z}0_ob4dyNou+y3yBady!b zsk!m-lN*MHO8omWr)7?;DG;?sk|%t|#pff(gj0?OGPsDT8jDC;_neTvuR;&>6WRxhYVu;z}Q4(tjcOss|yB*Dg8?( z$7qdB>%TlPefo(nCH$-!{@qcKb>@6!)v8ydFK_+LNon%-`Kw;x3K}$`)|2TElxOd4 znm1NGzMq5F+ilxb_8P59T@woAsifhZH^I;PSC4-=bhbE?ZX%tNzIxlhm1xPGGD9ey)#?$3zhFH_?bxWu38Tp`)Pc?nRWaOu>(v7H@ zlDf9o9vj%k|G|rRTJ#G<8O$^XX>W<(?povI(@G+4a&HDuP4}|f?kLjO$)v~`g&X*S zz!hZRIEaPq;YHFl4|uw~M=0fi$Bt7-bx&?hoe~UINb3*u)8{@Rbbc6V9X8E&&~9{n*uB*L8l|I+P0y*hf| zNK4U>ZwhW$9hk9v`s9A;<}&=58;4Mm8R~;!)xYHW6)Fhbu&aL56A>mLqh-iT)S*Hi zVh9wVw0xuvlQ9-lBDsDgKH@D7cZu={LF`@K&_guDLmGUhP(n_=q-cY(TUG*b23?^S5*O33rKQWp`|kc5{)N;`2O~X&znq+_Ev|3VnupxP#M8lT)F{tXa(Ls#n=<(4Vni86uEij zxr*|XIyD@2Vjt;y08EWu4f$gMAVxChP$i+o2Wl3vT ze{-rKhD#EJ@$K`FxbsVGu2WcMOEg|m@UuFOGA&o#{-?NP{RjMKe8)2bxiy?IQ7L@~ zEfdOxcE*?_JT62j^u$+(_uY>$)saQ&N+fmRWYqgDRx#?5Qhg_K4@cvaa~1tzS?^#< zW`Xyt7j(Wa8^}hmNx-38$$rhAWADKLBXMvj6bUJf)Gkm>Ad7i46SLo^49e>yI{B2* zb1>K990uf+PH-K6bk+q9Dnu<+IR{;@1H7{%dPl))ptQ$`M*zGUTr;9ez`u}u>kM>G zdt?g*8%I+e)b4ngzX&&rURUgJB1?hOLAO9)H9pXprr|v~f`#QgMR(BzNda6c;P(@r z03L%p=H<{f(h)kKOoh=j`b@ino(y9E)c&-jn&BEcOpjEmQv41l;wO9}o`;I#a@++C zlTUGFbVU%HM*z_j)J`r69t!#tAQWWU3>5J`RR9)gdB0CAhvqY&gwCAycq!YK3^4~= zgvuc}i__2?MdiRTvCB_ZqTYCjI#r4M&?vJKP&BlM1bzo!Ovr*hl!mHR9HfHCSApxH z_%)>}6=iY?K;_1Ud`+soz)RIq6(jc}KB$j;D-mGp)GFlBi{i77)ILjGfMX*QP^lu7 z&l(5Uruqbjqf|dOC42C;y!70*CHgVZ)g10+)+;q3rPx=LC^ij82I1Ce|5%%_=(-gn zxbM_f6&oKe&TDW)Mnrz=9GeeJT~4&Bm2rjyl}4ACISiqiVXrP|R(u;|{6mGadqmF3^XjRN+iBC;*8a(j{I;}cU z@07mRjC2VJi8lAJ)Hr=VmtN#c3XOwZh76tEVRBtO>l&%?SQ8V{lltr9QoY8)prCou z(8rpVof99&zo$0yyxyFi#bTw_FYdbQi@S>F%w;NV(uQP>AWGk<0n_p}Cn%M=l&#W1 zQ?F8^1u*a8faiGcX6C%>K4w4c0nm)O${1f#2u;08%PBRg8040<3Uf<^7?%ksjlYiN zigUAK)MicZBsK!MG5oz&H;Abliwno-ox*RPpL%?X(#a)jVzRVWpmSMAb2e^;|)N>Gz+l?B(pIZGYpz!&J^?7uV3IA#fDWGz5!-lJEpLB;|`NorHQjTszjmC z-ebKXp;DtqKHLSOI69@rx=>|QXD6fq?ta z-5z8G>m>ry0eLfV$5^$`?5;@f6{yy5`LRZHqQn?YqRFDyXcJv_HU9u$kEVOCO|l9r zGPd;AyA6iW43kmImagUdZ_S_Xj!Uu#)}(89BpZ5f$xs?i(<{xDYZnP<%WLNGe%~&u zMWwcF>dSGPjxSq&{P^-^k`Em*VFd=2jvv(TNui+u&2AetQZ#Ze^;sFGR$5FqCvh8{ z`du#s^Pjs_ZwGu6VGOC*xC{(QwLV`|1K0^SVH%s+ssr4bxwJx~&e7|W($FlC%?8uJ z6}p(fyy8F|$MyZ7qGWMd(e^1woB-f1t5c`f)%Qzz-EQBPpX%Uwdt%=(%Pp?*dDze) z=s&SGi-0^1XD9X9Sv)Tgqgz>RGUTK9NQ_N9Lq83GlELp9$zvM%ysz-gU@o*P>@ot8 zBvrYXgP*h~k1U+C^6S?vCHzG9{bO7&w3J&?jaj zO`h0T?TZV?l6?;3_||BI3Sl44qHHcOwkQ$U=jhB-M2LSD|0j}cLI< z(l?ECuyNw1O%tPQd(WNgxDj3x#L3bUEsH+V89N2YUfIe7UX1~7qNg`14158Zng(zOWHZZB`0%GAORjEQ%lLEDZf_T|T3sl8!I;#U` zLC?`F!N%B3r}6U1%@mY$MVS)1%M?`#QxHb|q%`cV#bNea923nMVrzz3v?}Ns3Lcz1d|VaGZ6{zYv(1C0 z+pqM%ZPX1Mi9n&bNM3gq;|L#;TA-r{g+kJ|O$amzg;)r_FfI5sH8n9)NDQ}1jp0aZ zYk2S8a4Y8yvu1fU+MIZv9M{m5?SZ7OAgFjHo=>Bx?N1NlS0B$s*YYK&MZ+^&$qq(y;2J`Akhi`c2ew>|nRVJ|Sf!+aP6 z1uA_3C6dCF3pjd}fa9HiZMXut9k>Xpb%|a}7jksHyp5k|E3{*c{y2Oi_|PAG zh`OFh4RBc&G$TqC@@WrJis+;irPD*bRt2ROlCzhji^!QyY1+f=I%C1(1tSq(+8Eti zlHSo+GH4`rLZ(DJcgdJa%=4rhKoU48cD#7g_!Jcr?WTl_Jqf3{>OxY?6EV_v%-xQT zUBX^UPkbEd+B+0ok7kMsTAXo&M~7hU^b)=q#~N`GGPzUHO7LiUnVon@I@HOJ-Z=_6 zDirXC>;@!6f{D&`N1+2C+EK9_`LL3i+Z(_!_!&XEfd~XsfPsT%7pdMLl?I|2w}EMg zTKqJ4TXlP~Q?0%AR;}8pcRBf(9XpU=*4aMi(;@xluMTYQmB9vauS}aUf6bctGp6Ou zPE1_?*wn17sgJFn!PktbDh-XS0y`;{vcC6PhqjmsMA(v`xE#REiM-7hCt#Y66{;ft@pA0iz} zSjM^~tb=&Orj}C=FhH${=v%+Jm=XiYNEry&a0^Th zBfXyf>(lt}6&c)%y(v8>eTO@|xAJyoIC4Z9vg7-^8t;(adGcQAk0)o`^A)eWqB?S) zQ*`rc;4Q@;&B8y9Oe4?x%k#91=@+#jfR9jyt@?H-ORah#q_>7ARkh39fB@D3W3KC1 zv&<;a&PF<|bGI<`^2w7}d9$oZp~+O} zUY+{il&BYt2mU@3DjYROmt#gF2W44BEOhDDq81nEf`JhYWw1aXHH381y+hdo+Nrn* zGQlg@BZi7}u929YwicQ7X-uy$NOoFff3r_rJJrtqMjMfes@&YFTw(Xb8~1JAcjLtB zCDUgMmLV2l_Vgvy?TV}I6+)DKArj)lxMkb-GKVQIL>(R~uayoQSSqiWaPQozjwvmWi`5;Z$A2@%HvTz`RJQFbywZnQ^%PNos)tAUBF@Ka(SRW84X)B!CJ#z22<*6 zFILV6JQ&l^M}Q6(c)JH(8`__uVljNax%qswO+r-n#_nxVZllNzLw7H&?od=O-96Om zbXsXk=-Lv)$T_oU?p$e+)PA|jkP`P`MC@VW<$aO9N$Vf_Zu92v9$KHI@}zrIS8hh> zCproGM>Y@@;Nkzjs$nMc*boqi&}q(}iu(OxwOTtA8vYwi|HV6pd_H97;{N}6O{&Vv z+WKw$`|0(`$?H%5eIwCdqWzc4PO((~o43=5~p6-pOh*OVS)S?o$2~{+?jdTqg(ywmH0_V zD%`WDkb2Y=@4*P`b`9v^k4Q=o4#_!czsI0fAd?iXC@_o9#e0#hy+pL-V29`mXdqPPkfAXtkqjNQ(vnVrWf-TBTXy%VpThV+J86Ln zRRp#Xoy1s_v=%@m47R+Ohj8Q$<>ge#i&R$ZM_w6-#oGB=d2fN=puxe)0#QAxvb3tt z?34ue^qu+z%BH$Vc+`C9wIREv=|ts@$wfJXgfPG%Cg$}+WMsYTKKgCVO_kpDSCH5n z*DH-ZoYw0H+U>qBy;99p<%HK14i#CrAf-58b<^}83QMISvAK0k%SW;FnwhQBcCpDD z?E`46QTr&Aji3|xKw?*rVpx`w@f!#AEj1H04z&!L1u};mB|_q9*O}dIf%q}x+2Err znV;|_NIW5zU}}w{6RO-*6RHmRLV;Rx#SL)}rWC7&h}cK_-4AbHnrwAW+coDF^$^2# zBO-Nu7op@XQJ@X$hVgiuNT$^GE*c)VO9#;?@nOf$#J9K zcAdcO&UtQNnXqe`S-EqLWJu4H<`178%;gmQ$ILyD!XBEoODLoI%RG#1>xFj%ydpNI*<~C9GFl(tM$4k0N>uX1e^R$82$DfY?lLM-#^|M8<&5`68_?lI zW}+zONRW(_aFD}MYD}OJQ}BB<$_SQq*+!ufh5XaUDxBptqSQY3z=64ovj&epFgGWg zTZWn7!2B`N{S$6Fe9V^`4k@*!YL~GJViIz;0siMG!tc|X;FCr^q9f8_xFK39z z5-I2WGH22Jku|J7vluFZ*S4ooyO$OX$ni<9gm>i!MAz~GJ}qp4=EO~Pa}SvReqe57 zdczL;XeamLz`=%~C#On#NLyEMNr9EkdUd?r>nI3mnhinTd_i3sNUt)y6hfHK+!rb` zXLcy8qjdwaxZ47?>pc0=yE*06Id8mCouwWT$QWb>#q8{RvOJh3vil}EG_c8|{0VqtyR!Zfb$ zil#aV30s_eQu;?G-UNINjDl>lDw0u-0?ouQGHIr^Rfa<9+R@KVF55$ zL9={*3VN0oWRD^8lK`fee&v8#z7vuJ@%hSBp1jjjG5tlyuC>Q18Vqs$7|RH0l1ZNm zcn$F|c17tRF2fKn^08NkuC~t5i_27NCz>~nt>0*?pJm%vf6W%dgjK3*wLwQ-N`Bm& z1EmF$*nf1suS|32`aPO5UtWmc96wD{?#r#>m#GBxbaj!3do&}3wU^WuVW_?y8pI2s zTz{EnS^NRM;*w%=E!$ICnC)O6Cb%YU*N&b)YlL(syKls-rDL@>OpHyH6sk;-CEeXEy{d`^M~UA#LiWpps$zpKvy!{UCw86PWiw7no zP1=|^!8E%nQV=DC`{xYobKtLT=B9rU^MRz0!mkt$p_Ww?B37WOaq4@$`j(`Z(L4|u z7aU$2XykeahldZ(`+yr@AFJ9n>AhtOq}`zrQ8GB^mQ*fv?g2RGft&C8cD51mja~(1 zv7Mp-OGapv@?00KVgP|-Q5U9UB8o&0sS$u?X_TP|8;v#u+1bLLF4)iOV(`qOG z_+Z!c5$&Z+J^^45xIOwhq5%T9hKM7@C1MbZ>b|+VoTKeK8Y0u@9{9WYz}&h`iDnS0 z1p9#HPkMre!2^Q@b)ZdE4>-K`c(s1Bwkij^n>C^KO7(@AnH4X9D%FNwGE}8QZ=0Ak zKsVaD%RDF}FhZSG{l*(P)#W+TyZN4VwE=#$v*Ot4NfV^|$IL$frkh)qoiq2q_`z9= zi4aTeVofm3b?k6OJ{xI^&#BsGGG$s4rH^Pm&BYomHehAXa>Pbf3|N%&CFdmlC=^Bp zZ+30l--!od%UJJtpe*)(UenI&eMUaJ{~-y3b3542idFMO!6?b2KL*5!Ij$J_G7Sr+|rgT<=t zsL<=Q<``~>G#0^__eLIyF>AF3{@EC_HF6;~L6xdO(3hF2gbH=ySZWa2+&dbFKp^3e zwTe+xxh{U56e!Uk5YTuaB}C^z2aFt77)hW|=r)j$!9=k1^^Cgqj;cXLuOmT+^`K4t z++l9Xd(sZG!DMC& zq&w(71cMWseA~_!yk3%~qR#;naQ4Kj;5Z<%w`pUifwy#_ugmdESS=N;VdElD$UO9S3EG< z^u$wyF14y!M7QiyqR!sd&7JEVJjVu68>}5{r%k;7QkgHVkQADXZ z8=k=_bYU2mRIwLu>Hpw%&){~rumKQyKkbyHtNsA`x-_(n6?TPamdyb`avHBdMaWsO zt54Qu4p-qWPhP7B zf;c!c(gu=82Sjrs^=VKnkxz(6PJYhqfFn&1ZtFo|V{lk7IIP3JxOp-Dg$;}AhA&y% z+%e$T(q+f){QQ`(@z}DZ$FR}yvGhOBT=(|cwQpbd41cdAAGJjgY=W z7F48EVCw|7KC4`_@Q`%j@Rl#?a!2Y$yX(H(a#*@>XrZP&i!IpCZu?U!yMarHK0e6N z(~Bq3GZ!yrav56W2OndfA3OH>F)5v`W5%`T+s>~Qbc+^_KlJwUrEeab1kY#e#%sW1 z1)*?#;Vn+n&4y`=>8%LZ6ul2fRa=XEk^i@E2CN;a!ad zLb7BsK+ZYv2%?eA~Kv}WS~~$IVP{89HcxWKO`4m{y;*=fr#%bZI^yvS|Imm zr2~&|+VuD)mZcZ;>Dm6JFV!%e%N3J6Cb{2B()Y<@u$s(tgI-N9 zYAPLnm)GYB<)v}Ukzx7_?)1Z%r`X|56DMriG+|=o?u6{LUY@ub`ylx)dY7v|{EuBO zy=x5J&t4Pf>6Mn9U~?HP@q!^W-hrIw@fL$io(saV-c6`NQhcNa(eFK6<(5t8fviTe2ViJK=*+{_BKX?>ElzO@@yBqSvF zNz*#g`_dQso>?*!OO31{6cAu<(q3FiE&KoQp620ZwB10gn54_f5&eGl37agIM_uR9RZ^068 zmiYOw@^LW?KR)u|lLbf_jS&FekOCpqT;|9%GQOuQbSsl8$8G;idiH?_rDs3iJ|VBZkLUMlL=mwS2y9+vhCwAg2mVXn)s30E_tpJkl$y z*fSu%FhyERIvs|x90U!RMSV_0WD!gih+;(WMJf=%Jaz-H^c2Xf2DK-8TR^l&9k}3@ za?<-kgq;!0Yef+X4#trn3C^E&f>#~#I zcUa#^@*U$?-+p$_eD}hN*#47Q==?rw`4Z20{bwrngkfNxc=j4&JIW*9d1i5sSO+*FW&%vPA*H>)gG#i^0hLJ*21Q<1YGUj9u$uxPlPzLa=~j;p(&6w0j|L+ zS^q(P!zq4BFh?|wXqPN68A-trBv@WZOt~0*LGpUX%neqUQlCHr0C5Y_z0Fa9fobB% z!=ooNa|I*AKjMjt_oWnoH<+YZzIDfBUOJ{)wRz_x?uOZXVw|AwGx)7Q(WgKmaY(sufE+i9hOTeI~Wzvk|}?8NQ&OYpx(+-~s6w>BC6< z76Z3v6RTLE#1*I8Xj~zV5_+VUWov?40ZdQ`)3ig zD>3e{*bD1=6;7)0mX&HCJ~?{D_r2%3!Ka(|&r8Tu_sbqTJ;Au=dIpjraHH>dSNigj zf@NRW#740JEOVmt7Xxn|v4qS1U0*eLL?(_%RXOvtPxs3lS_1FKLO&<;PUBP-y_%mq zLRXfVTr)E;{?$`HU;V(7Y}}%u(md(;^_LVM+&8V0#-aY0&r)I0R}c{s$Y&EKQGjz| zFc4@EU|0#>8?duTKq@c*n$yrK2BItHr(uKi#^;YecUbyrX6-eCa82z@W;^`c@zv7n z_aqq}kbe8=R^qWALW^|ox{6UHZ0e_fW>ZV+E3cF8L%B&lG2y*^3onlV>?GAh z6;vKl>Hz=(uK@)_A<5SwXz?m}ivrRK(C1|69|uod5tMf1oQo@D2Uq6FA=L|rV*7?a z-aPI80(N)FXVSS7Pu=tBU0-LLC%njPkN=|rsYT;lM#ZIvLbFHb)y}A%J8J&k)vpdH zy!gVDF-vb*^H|PQc7c0WeD|i^f8fTJra!*Haxu&~K& zd3Uj4$PD=Lq^=Jk;J18h({2%8Y6Ds~_sB6=z^7_BUrp?G6 zT%8{iUzO1R?6G4n4fFL1>0@-x+sQbsIx~uaN~w| zd9+gKA|&h41|$UX>Y>0*d5PJCqE~_#2Nb#j&t^)>Yal@%pFk=(qQm9f+!=92Mh841 zSWLm`=&O{olfYx_X7odvtfHF`HL0~aU!x5w1^AiMGf)EHb%IKE6_qZg`_Vx>e6@1% z-b2TZAG~?d;_{3bp{P(~mc)XYQ^T8g-?Sw>MX5E$*wZ9?RfRp#Y}9JXt3<8Q#97o; zRVJ53uT)i5T3iY2#hmOBb?B0DEpqtnIf zHLAHY!Z&Z(kYEAn({H@z&V$$Ml#9zlp^B!ay|cz7s?~{%A2(p_%&EmCB|(%};H_S6 zq+DWcS(Rwwj0TmqvdWZX5vwZAu7trW7S0(_H(^5E$k`rMg4vWftv{>hwl~f?w|Czg zCS5_Hn&*`_&6-g?ux?O;G_7CF)(0oQuxsbeKnjQS=W5Yucy7%YzsSdmLWT!Ev3+G(b#j%Fj>TBSu>f^ zpw__F0smj++=867(&hxO&!GQv`Y@|iXYj4uzI)T`@{)$@R_&ZtU{4vVwD&FQYmwg1 z8n^EB%;|Sbsf>#>R#(-GavA!}UQpRrsZ6q(f+PCnmycgQv6sdOggjw+{)1!E-!je1 zukU5hTC;C;s5Cr)iK5A3InI=)RK>7+lB)_bbh=jWP@7HX=rcB5nOA?)_)$A2*7Qo$ zaO*4G0nXta8BFNAV*bedf|`lLQzA#lGi!P#y-z zl9w(wls=@q58ZI?bE1^#wBlgX7XKVt@AV>*=n26tghev}h|K z49Acbsu>qTZYYI_ssb#nyBT=J<#h&UrmM7CxM&D##>LSSBX0?cmY>wwAlHA`)f=OXtB?`4oRisQZ4=|BwuRxG^w2{Z{!MGYh`{_h${bV>?josn9j zE%O13HdTA$f7dKrUr7PbWp}i_aX0z4k>3ABV~{Kz<$04j=?Dpb;8r?+FhzHU z-72GEc6M{Q9QHYionTo|*EUFRa|#+Hd(T-CE%&e%V`MQsn!8EJj~<3v{KOC(JGYlk zTS+PlJll(L@ke=%@=}~dR0Y*tAx}4P1V41{3Y zb3@UnR7HAX#~FtDqpEy}jiG8i15RE?NGR0)(x9MQ3GA`4H;@>?i%F*Q6un*M8VW`$=60JJjrr3({3V6f+6E?_ zXIK%zv(tMgdB_cUh$2^v;LFJ&wo?b(l~JYZ7aDC@IueOP0qa<er^N)+%bc*@!y_d=@)A1hV&Y`*M#|WlEr?!!7C(z4)c>-EE zpq9Zhrvcs%0%=!;NKYN`75gBWmy6Ja!2^<^UM_akntdtFmX5r6)5ft0u{j5?%`6>I z_8Ob^=9_E;Rk*tL1*t8+QZ&X2yojLM7*3UE?-lFP9eL!k$%uQTM~$PkXW<=RUElQT z;DW~SBP!~LDB9cdLiEuuqtzg9Xc{ra;Tr)D(_ z8f{rHH1A@gRZ519o0R9v4Ahw=+5h5r*Q^hr$K^pAYa45O%)_JW!dBpq#2?hMh1s_ zNS)-d1Kf}l;-q2RVAu!lE@1XRlIuK=%E9l9sZEZXH!m)^HfD0b9gq&V#`}VRPuER2}!z+-;9AM#K$N(^$dr~Cf#Vz za2h}+P~E4?x|v+~@r{7BhipAjgAC%wWFrj7Ir%bpVMBI`Q1V6Rmv&2a(w_6W!t!PHqx-(kdM)E)4Q#Px zP-b~U!`iXZL$g`dAA66kU)FZV*tHD}#*n6!@*Q>d?xtGqR)#);Cnba`p7RTDL z4Q1sG+(W%5$K@2jXmcy{0MJ0?lQJ~u#~R3rEIzM7x^I# zQlrkL(`qx)(=)VMZL%)2K%*(RKo1+c7JY+ElPhpPBBke;u550~+o(>)t6n8i#jmf8nW1XBHhB>5lJLC~XT4=89`r<8QxX zqo(%VG->F%p(XKvpA?60yrrwZ%D(kcH2MUE0zD1Ak!E1(kZ^knV785N)rA@bqOc%O zP!I=&sVE@{{0sZsTw|meq5(^x*bM>FMr&&o+{dHyl3e#>)E@J@7ph2zpCI6rl)!;} zbZJoGMHSW{k6`f>o*oHDoqQ^Sg`fw6_kl9+{lVYw+IM01=shnk-1Oy;KP;4Pf8|%w z`){vX_crtW>O5O4g}6tS!BGCqqg|HrN0IE}_;t7Y8@Ic&W3<^nELwHL?hAVtzPM-f z>iO5*)3WYu>3vWS+~OUsT566+u-JE**QM{jl$JF!1d)`aqi?&xr?lc75>`tm9zoE< z{APq=n1Sfb#C?%N6Zo-hk325iZrd06icOGWI__c90jj(4mX42>@#7+Kjgvd>V#B%h z9UpOM3VF^}hM^NAd+v4UC~`(}NOzE4kg^8SU36W<8;LqX;upt~5M_!Mid`J8y?hPsg=j2!n+uy7P56f~wevR;29`yHc6Wcp z7?p{+Jy{-iw$DD)WbUgnRVP?#tmy^Jq>2%{&!hX8T1}V#BPJFihc&5%`_^P?;+n9K zze*Ja{BAR*{=e$p13ZrE>KosCXJ&hocD1XnRa^D8+FcdfvYO>?%e`AxSrw~V#f@Tt zu?;rW*bdEw&|3&4)Iba*Ku9Pdv_L|PA%!HAkP5cO-|x(fY}t^!$@f0r^MC%fcIM8V z+veVL&pr3tQ@lQ(H{B5hU3cf}4x7V@V;L~v)I?6_*wq6t@dtRqF(&Zxdh`_-87jFo zg{9(bQc^a6km*oxBtb82j0+|3Gt$9d#X?J%2b?W%t;(wOlfeAIqtZ25;A4nbqKVe@ z8qq%asL^OLI8WZ5S?G*P@uv8q)`9n^>;UDX_ULuK%KXB_tZ0`vF~1;IzRt6IISK77 z-|gv)Eyz#wx}viZ3-c>|-7zgy^wCu`W4o?X0{{rKZ1(}3OoJ%xgbRfJ&Tt)B>$;bt~Ya)oH02^A> z?zHL{FI=YWUC4L_u%Zs96<+WowQSBTzrv!*aGs7Lwv$2y=zHr!2B#q>)@n^jG<&zc ze%{XG;hsiMezkXY7Y&E#ncsi?kFPxOhr2$1aeo!7dhU;Gm3R31ubRC%u~1x$o<2R= z8k`#4%yc`wIbK)1ExM;C+7=&Q70n)*)D%-t6q_iRE0U+rIPYg$_ijm?=dI57%-;XT z{{DGazWCW)*MH=B>?8TP-^D$-<^HQvZBbL>I~nhcugb8+Us*55zK~{%u8P0)+2_6; zKQ$`angE(21O97%3H)Kw^?{5e3Q?J>K!-R4#1|JrMzTtP{cS}&H-*?hL0I&l<9B)i z6o@xu<10Ov6^e?+7tRS`%uDbl8>L@f`0%!E4`2B4(2c2kKkj|(ycU=)HYFA;TE8$q z!RSrw$;uu&5M2;nyJlvhWBAIBoSaoVU)Z|&#fw(@lk>v)QC#ne4`vi5x*f|iGwWM( z&Hnlem(96g&CKF7mzmpEY}>YC<+g1 z-E18(f+jMBv@km*uT?$Ws`}>>XgO8h2Io!Cra!F>uk%$gXCXL2%;_N?C)hp_*NI3p zLO*9c^P;nL+SwtN{ng&RU&-&_%08v`D05%sR4GB}+=id{&fc$1=bESTv%dZrXyY0B zl{^}LttWv8RCRvzoLD`v1a|b__0`w<=ggRC@<{)xcgob>IE|eDZEy5ZXQ)H;UvvRJ zdjbx$K;{Ty_n9R3hq1t>(ZxW(1Ldb;KSs(Ir|$s|xUMuAwG~zi!?c^=p=Xxp=9N5eEhR^|KX^olF;(A#aC4bl_-Q$^6);{6eB9CdQM8S1*_Np2I_X^o_%P!ZYABl3X2mGHCDR>zQW zM&Suv;SA%DgXBtCBtD({cutV6nQ`n0z7>Datx)gle30qL!MpT$DK7KGg=;Q}xGrCL zhbpgr$I8oHkxSNCrWGK9?4#dNFioHy99v&Fd2%5?fZ)kv93s_6;?u<(n9`0*t40`| zB(GDt>P$EW@i}5Ty~yEd;=6Jidwh96CF)-;PiHsfms7YL@Sh4?@@vou0_@DgLsq&# zhhK2HffFY(<(4WC=bWG-{d9<+MByX3&V*<_x!eGAnboY! zVK$59QoQ{50z>REr`aUTlM(s=hgAsum~KePrdLx~Ny(-!FvJ~G-=7XqIVNI9;pqII z$6`h} zUU)nZq6Cr^WSIYowj~UDC{{Lwnfvzd-?yE;CcnZ0a`CA(tXe+0Mt6$8THSy5Gk<^P z?*8iW0Q+#?e&O={`%X5q*H{4mUmH89JGBO)3O_&wHUI?r!jI1{DLMbgtO5wHLJg~P zGaEJlV5LoKmoBp`3*P!%#3>-bN!W00}QqoFh(U5 z_I3)fCvSpLkO+H)?~@-H`}}!1@Vqe~6-Nv>$hb*}RUVB()kzcIXv>RX!ILKas?#Y8)jb>rWA^~=6v($U zWv7;bzCwQyw=J5D9yuaR>)f;J%XMt|KlfcEXDhZ1Mq5|NV~=fprP4LWRr$)+$KUT=ltlgu{Ty{aMm#cPR0)3*R$@YWTsR5O zIA6&3uq7mxJGM^9vKoEz&eva;clwN0t5JN%h%MXW@_N4KSGXKsT6H43YU$D{@tvxr ze8cFd?$owzGFd;+so|5iQjSx)d+x!UG@i&t8RFUl2M)N;WFt$Gv>s#A2-r`dRf$Bi z>AxOF>X6ofSS6jCQVeH>63_Bk5f4s)J_ddop~SgAl^4$0uxL_c;p{9-qi0y?N@4$dG>VPyZ;IP+7B1L zH0+AXb|$CfMJ`#pILf$q_uUtd_-ge+T1HGIX8whfFFttPFP~?DOJ@u`aOZFC{&3Uc z#a=jNOyaR{(}54sc%S$VvZg_HCpz$Th0GxOa8#?DCEGdhE2#WZ5~D0D1?v+*oGL@y z5~4St@wFK#p0gJL8!tbqFgW?1{-==hxP0QN{{E++Ft;7OwL)25*Re+~}0H_}6{CX*0oRXs#@+*Y&tIGCWw(8|;cD7%( z`BrA!|Gm`Zm6GqX`1)k_`wVMT-pgz#XJ2RMzOIw+u3x!l?^F9u>>b`S`DOn1hN7`w zU@^4~_>H@!av%5N}n6I9m zvS)bjSNp!dZ_o1HYhK1z(VlUf-X{s&m6#W&542T6n!zXlB-zx%Zsmv@<^mME79>ML zJ3cXrLWL~$buQ;TKC1C5o*G0`w)>7%&%^hp`% zPFq|?O75ft_f)HXp&{OU^dVM<;wBa=KYGqq1O1V8N|07y+)a?xn6F!hKB9F>;pTuu zgG6>AWXypxT=3$F|H{5PfuwtsIfqT6p!g_fblgBT7%}xo@&{5J>HaLZjs@h9%YqV%e4vbA=;aBYfUvbgnw@=pZFuUNz%ud1nDwW_*iEIp78 zsneHMX_ zOssGM6bn=xAm$numq;aA5H6YM&=B$gPUVSqYj_0A35IkspBaRNOlh)^@*l)_*+1`L z!t%(vaBx-6*t5)Kf5+~Ue^q9Vmj4#xvhjRVG@E003zJT~Ab(+ZyY0;SBD;<`5~t*q z`YYmL8HL&7%l&ydRY_6&al}`hiH{qPhcZr+qvu&HZRLV_`A)#~k&iZ*wwh>!m-}4xID_ zG^|!*hXR=*3CtZ5mh)o)CdLgc0m4fdEPG&&LCBw^P{FgO_mH~-?9zsr#KP#mvO2hc zvxrHAjG%kK*wcGJjUx&SASDKl6_f~UxKWN0g>ATjcg2IUFv4DDhIegjnoVz(j4U&g z86~scmKM9#o8d5-jErZ*FY~#vuc(+mH7P|el=%H6I9dNlEq>- zCKQOK&1)^5DOO{2RMC>MI;)}kUHOZ5ySHYo%3v(oXq_V50rfescC*N3;p{hNyS_($ z<_6j1L5esaFF)`iMXdS*)BRx;MfGCI`>FhUYz4v5ql z6V~H?*!H|}6V`n|7DZcb6R+jmIa+B5D*-w%hIi}vUr*BND`6?@Q1GX~hzUw=5E#tG_8d-|q?Y7r{^tJ9yvIzVGg7UAc>DpVJI{$37J zKpTy)c84=_2JI+igw)j%EJDmdjF=*-sZBi{Y5Ne1L-ndKJ{HihqBxqi+G{X96iGlL z|G{@8Be)RJB-ucc0UeJ}_x-rqMQFffI}}py(;M-K+BG>`$TJwnFg_$_(V_dU zLeDGQZ8H51d)NtVcac%BMhudDsp>4h$Wvc*%4@ zB_<3{JjklBxfQ`oWI|$avv5WXcfRUy;5Gb@BO}I239C$V8ZsbNLdEKfQiTN%)(V`vnnc%4~>T=X>a7EQFGF(W|S5SHevO_?5Ko{=$M%3jD)D{ zgRAvU=plb*cVtH$vDiI7+ZVNeOUnF!A*G?{ysNXPic)d*;@O3vp^l7r;epdB;?oO~ z;?y*vF{5l^s_1`H6|*O@bgGM2bJ)b59V$;XrevjsF4pc`iDl90@lh#JtZh-o>?o5d zYIeq=HqH|^8`4>|x5T!IS#D%eZE=RGdGV8`EsjD9(N1%LIS@VjeEBG)kpFh0{8^hP zJw;8yiZf29$oLm!1Gf?ltM2PuuqZx{B-E7iYs@JhQQXAA2mQw3r&xPZW+JwBFm*)p zlny~C5zSLD`3o7iGvs22^zN_>I^cC4q*_4q(FB3rQ`|0j?2=CMIf5W2Km3toWM!vi zlzI=WCm25bfy1AalAaOtuDWsT+2dnRS<|d{TCMtOTt1GUUVG81S8Zwhs0QwPHSlL2 zl6yOPQ0GZmbFeV0cu8}`dWEfdIH$JCpPo~+ymb<0&)DTuEJ{tY>h-wVK8~Ayeb=g2 z!F@Wz4|c=GODFXP0G$2^7||CBNkB(Kevkr?=O9%lQ26Ma(f}5Hq)bnvvkt6}G@~@5 zCpaQkML$Sj9Q}2!bu^*H27(Y&q1#d!Y^YE4CPuN}&a=hXR_)?K$rrKtYxmE(`Pw)p zdhD|ca$}N`J%-q6Dd`n)9m^K(T@j;qNrGi#Z}EI4NT$cmQqCJos0+Lpu)rd9YxVMb z{q|J3!hW7)oXb7OYd+RTUGx2>y@&KXZBekLD7MHKhskO1B-JlWTi&yNZ=+|0$Eu$k z%}m^J@+>tyP^pl4lir0r`Z&<3I4dJT5Q855Kx$qdKm#EG;>&`pqBlw}67LtCL#LKr zP^n6%fyx4~<*FiG1V-UfAAC0&yp#+mgZ~~%Q{JqsuAZojX+>h9)otd^YNv~T;V|kw zjnyf4Jm%1wlZ@WA+aFxF>u}bxu>V$;T3G1A0dHd{&m$Qi&%i$XYT9{E^}!V4#yOG@ zxn-#*#kEy@H8v^5;jNVaaasPNc}0*Xu$t$x(A-sHcNlC;aGKT_T^V~)Ry}at+B+@{ zjds-~GH+I3hCelX>Y9z~a!p)de>>iD{Mjp9Ci%J+`P&&nMU~C)1Hcf&Ir}!q*G++s zxLxQS5{1Pd?SfIV21sPH1yE61Ks!KUYfG?yMm_;z`P__1pOuD?$VxJ=s`*pE`x!CslJ5wr>oJ+y}lyT%s!BB_805*;dH&79sLC)5WEie6Y2K2gqSDZl`=kM z0*kfyQf4Jw$@R<^E!^f19mUqN^*m>9sQUf1+|tZH#@W+S=f*-K_N$nf%=FprKVRyI zNz0rU^-RQ=91A7V@|>)4p(%P_cE#O=ljT-lo>=ZH&xX9AZ*opnkX1|7Iq3zH*P5qh zW)$#snXJ%ufpGPsoaB|xGLx<#c9?O}`6n}NPQ^}BrYr$x(!G2%> zr!KVMK$Rp|rN>f;J5Bo(?6!P5qU|vT%3c)Pch0badE&A0SC%xadgP)DLtKPqj?|r8 z?o4ln3%Y;A8_*G&Kvo5>0)u2`c_B+7F1@WH1_DY3yFQvf#;ko&!`5i?`K#NYoc!vw zZuhEF-$IndWj?=Jt~XTX2><-lWSdk0{(V+nEIZ#~zf4?zEI*C=4Br)kB`oTJhvkp! zW~`O_65UI;CT1r-cp*$5nG6r}itnyY&N8{3ZmY-W6;2F3Z*!TeoxgF(pZq>$PRf

|iJ)rNwdGr)EOmirSOj@aI>%6ZNkal&y#akd%Z!h9PH=pX zunSE4#rHx6xEAD*#{#Db`j(nTHb$rq( z`SIDCw`IE4UK1Cdl({%QKiRpYvTI-Ol)2E3n83%6*X4lQTMw!im@x|=F;1LfZo~Bi zz8NanVFA(DOnN3USPvw4gNFtrRu0qgkpyHaDRvGISd351$@kpw`x|c>3KfXn$u&2; z`YH>)`XD!_1eR6A#F*dni;b15*+r!}i>5Wk&f1YAUQr*cES(1_$e9xt2lm;#X>q1N z^~f!^j11l7%FB=Wh5XVRZ?du2qN$s&8EW$xAD=en{wJ`EcLpk)nsQzwbcYS z`Gd1Uxu1V+O&I5g%~#~+ly9P;rmZu+8N?k8GcAjx>r1RXidKDjVTGVLT0Jn;=%&b4 z;Rg2DM0S{X%2U^#WXLMY%5+<^EuvA1%GkN&g*j1>MX_d^W76@)P`%T0883Go2a({ALKF?KFD>=KXUSYGYYJ3Q7Tk1Ni}n_TnL=PkP}eZH%SJ7V22 zNmh?T@7kRtc?vyJuFI61o{T@EJ6rOw6X){5n9c#d;0Ek*S7H2tlnGpED3z&Cv;vSa zF%Afdu{fd=#`T$~KS;8SP>%}g=rPh(qP!r9DH^uY8h5@~kzlghqids+!c%8YwPtRg zpBPMh53UQm?!}(WIA2w`YGpXMVoJCwB|bBDQB<7UXm}4v=IzL^PMtF~nB=H+N83#a z)$d57Y|nX>TZ*nWBxEG|@?BYpj>LtRrdlofq=r;Wd8SR0(sQyC60&pBCCQOlX-REJ z(p#*)-3yQ~%bk~!kQr~dvUqFdWm_=^&YauN$6lVGU&EvSYZy4!f`Oz{;h+$3V9B;B zaIj;o02H~N=!ESD}J8h-5^cocoYSL{%o5NvbyP58+$p9d*FRvk~X$=Ub z2Ipk}2>f&XbGS231p}FPi6cOn+?AjyX?&<~CXM`ez-!(c^n%-K7h6Hs)HHe)q>mS?`Y}S4F6yJZNv{ z{?h5q!P@gT)#`PHs~cwK7U`ouDNLH`&)28CXumgfp)=WFNSN)*w59lQ;%<@eNHWB( z;4HB)EeiZSeHrV6mm!lQtzc&11LE9u=UrX1aMP?*^-M*vpV|PLc`fWelWZH9{J`%M zerZ`{23RdQ^CPZ4aQlQG&?DU6o%IWH$X3#vA(W62?Na2jp^HF=uF6HqmHu?hmG#yG z`BM*eOqoC5?w{kg&zn`-ad1+}gKuTIj(s9YpMF3I3a1?EsGAAop5<3l9GX)2z?+#d zNRfO{{>!0F?;Kpc`rtd84l&!onPdH9{rnpK!?DR@lcgVy>BxTpA1z3+&zo7_acD}> zgKuYgKKfj*|Ma*k`|StwY7TWyn=#*>3&|$?{F!x~hbaXr|C3(-$p^0Nw;n8-a=5c< z{yck1;SuJ5q2+fsZ+e$3HamFo7?&?%+qlfOefbl1lTgOs9qiBK}bP zSV!N%Eo;293od`*1>x8KkdwXXWuZBXda7=zaJ%IXKYCJFdh$1!Mt*y1V_f6{$v@*z z-^sD2{Vr+7ijV`Y20{@JRSICq&Z6Yl^wHK%S;Vm{VXvZ4>(mBX$~nkA!t_dmJi_9%^0c(_i*qJt=OiWP z+?zc)Cnq^6=Q}yLPaeN9>tgwx`_Fsx>V+|#7jI6UQl9K9!>`YmT%K5B8@Tw&8Bxhi z;p54R9^BjCYLgqPTdJqFP30rAztuAL>ayZh?V%MJ5PlVBFJa!g$(8b_tHeopS^;G! zq^Nvl&&D<3;D%|wtQE757RN>x)b!L&^0>U*EtunDoy)$wG(BO`vPBh=)dq0!I}c{Z zr5BW~6n|e?R8(2?)#AbAyu9SWkZxNYBoUo{l-2Ltox2TJG9myfNxy{BQ);oi>mE`510-d+FPV88sw+UkSx zY%s4{&0kks-^g4k>kNfQ2g^GvF1zW%#X%hGK+&Mk@9w`utges@Qk28R^sz9avHSDn zlE#U9_&CUpkd#0$3$77pXRdG+A+HS>aAHI;VM6I}830cLF{KlU3}L@sKJW|c1&ytj zU*5WAa%a!}Bgc*%x$P%xMQ?8({;}wDNC>_uHRX~yE3SI}s!5SHlCOAu6Q%288_%T< z&>TfyjLy=t@Bnotz!;F60oD&mrd&BL(<{=?pc4Rg1Y{n)uH-wn&Xhk~a_cKcrp_6C zWOUBdr>}2qwLce}yWFzd9q)&}>f^=s;G|;tJJRyFf%;XWqpRu%;_CAqJSUoyvllx1 zUH}AA53Fm5s9PM$y8v{hG1t?dc1>}O1U%O@ z`h1N(y~$h=A4o6sT(IawV+E^xz*Cty$FjQi(2bJMnqZGHvYerTc|{fdQL{pBABPLm z`V_+@>((5s?YLt_#m^EG@^ayI-(yx(4*81yDu%FC@$8S$Z%8YhNJ zp`~;R4$V~dPG`0O5dH>X04mvw4)m}Lj1BP$Kwj7dAV=`I{a_A|5QCH~2C4)D)EmBn z%7evN71PkL^|n5#skpJSF|bBy8&r!3Er2im7X|g ziAS7ZSqK+sje&V{XU$zuyigcCSx8FM!s`x`p)9I0v}Q}AI3qPPGp#{t+_ENA8C7O5 zjotZ!DaJTU5QW~gK%lp&GlZSPC@W}*Gfw$|adKLL$5Z5+O6vvj-PCU_fxmO?zyV75 z8XTSrd1O{!wPc}r1WXntL63%)Wq{-1io(Zc7E&ro4K!}h1ZXDk*sy~@e<2g~7_2r) z&t@3~bKV^nidnhyXJs;$Icr|NU)p>}78;vrOt7qdLz;_UBRLp!(2j`r}o`(yqxwEOv*>ejs@{S*0p2Pb~@x^Hu zH48pp!0Qd9rig1UN>=(tG|jw4tV&5sOQ{l{&o>HVe&NWX@>##-waMw}$+i6U!zBT$ z;p9594|3nhbxNlnDfbVuW+^$nBsR7rJvrmvM-~#e;M_O{Jh?vtuZ+tb#p{w`2gr}T zXh63STn#UnT$x!C^9ork6B>4Sb`wJ$FeC|?tPIxED7q{QNAi%vD0A>E16flmB8hfr zD)>WLegPte{;ct9Sthtuo*0*+=pExF8yjV$%Sxs;Xd{cvY}QL@?|@MdZGj5yrymyo z4MgM=JJ>Q;H1Q7DE||B(Fg6u#apjN2cE@k|*avLHC9e=}a3AMa0Ho1%B?H(n@7TO|ErL3%|m{Y~T!xA+4+ zd+Sec%BAoA?QOR6O*Z|fW5?fOFvE6B<7e}k!z2V7^!(6^>}U6#c<2wee$F>M%O1bw zGKiT=^{mMt6|@=I>tls>ga$z-7bssm@rlIo6pf7EF({ zRm^N|<~R0ScU@2Sb=S%BkJ_V;QFaO0p(3RSeUEBa?L0yGMiV67R^ZeRI|1d44$B%a zmPiy9Ed-#WCc*z)pbEB)=qu0q7VWFFq!Yh9=3JS2QB*&zxNv5X&uN%nJ9e~oKC}iF zgd{^CrXVTDpOaJ&6W|ZIZ0l$ijbG2|1)J*>^ng!P(|ZxKSvVh`+Ko?^A4{7ubH$vT zx{i*z;#KSC2E`PM*MxswO9~S)?G-o8>UCnTP+^1?NR=2@%})+=u1CQyPX$d<1Kq+A z%vs`_k3#@g0Dx=aWuOH7=&5nj+~KJI;aOdBkq8SjGNqmgjW4?p6wyWJG*;+~6Y_I& zbMq65^%add(X*g29bUBK`#W}gUrd`QN+07Gd(jaSu_U1x;E<0H zEa(9dY{_VMYlWETaGOkSN1|BK+C932Po=_l$iJ;7aH9*0Mwu}Vx-iR`*m(q*>n6aY z3Z+oO14HrD=-2vh2YOHi5-^!cm8Gr>YIa=PT`1%{fNk6!M@R#{fA#FbPKml)6~P20 z1`0*f8q`8xKe-Wgv%<12JnQQnyXU{?Qb5p`3iPpcN(X5cJ;>$v=-S#Z(JNZ_zB#(& zYdy@KRJwO;-RX|}^mOn3?R4D907142$qzqz zTB}j9g!`i#Uv|z~v}l&|IamZg&|n@y+5C0C-@AF;Dly%K3Yn4d|@i} zw0S@>)vg&21d}bg6rRfie$4_Ve@V5ydj;9v-77!*8A=y>_n#4K++X|ocGk1~^SiVL z>vbec`N;R6hI!SMe`d3l>?fwb{MAjWtflFCm> zqdjdEvu9U88A1W&6Gxw%8{gnN#=VHsa?*bB4?V>_AimbaQ4Kn53gAksICqyTN5su zJD1&}$mz((kWj;@r>z00&nlWd6UqA4QPPQ1{onQD=~bGSDuBTM6;91O2d7F3(W2s9 zLYn8|T-Uz|(uGlC$j(HT1b)7sgrKj;IXEZj>WT+fM&LD1J_OR4Ls*l*q z(0*St?x?Cn66Xlq2=RBXfAIcmuf0F3!jl#b&CDrGE$O=Fk~`|^*v=7bS7u(Zditi- zwW-ZL2jmZbwQJY=ENTCiKfZAN(wlb|t*M++%RhlqRfYV#{G9wl`NvUtlN<7qoXx9x zBKzeX35|WLYW%Zc^=lYDzVEu5<-IgK1gx>U`KST(A29 z7zKa>5}U&3kmea3T`C7PP8?q(!vL&C%aPcrM^Mg1kzT=ZU_koGHY{==3Tvr$@}meu z(76{7H1?;&I71DJEHUJbY5U7kF&c?($w^%6EDR3)04!Cc>mjVaVxT%7K77Y zh?pqBk>{-y%(hC8Bnm!1{Hf0!vV!feb#LkwVyxaMx5<@y*LL}%dvho98^~G} zG!Mgm12%DxTp%-y23ElgP>F!e<8u@r#M`blW%*7XNs4jC{))30i@_o{144R^Rr8*2 z&`0p*=TzY~ufG2^DI z;q(2Q)BlV7uRm}~M}+kHr>C!dWnn&ErK*Cu zE0x>r%5_Y=!9E*3GS~n^U_5eSLiybZxnwPulF6?oQ?HO%i>G#=8S&=)RljeYeqj9x z@a&1IUpOl(sV3iSmhVvVt^C?Gs8pfKH-G)@yI)IBZS@Byro?W5#*eMGzbgOS`0-~wIj{%qH??L=S2NXR ztHxf1SHsRpw0yA>v zFz!3P#c0_0114N`D=T_$``GdAPi)`*1iPhsjS;ks*I=%!9eIAkj-xhnU5(igD{-f> zshbOzynpf4|Gb7RU)uk6%gU84Z}%;`lj%N}&tEE7O~uhZ@RAp>z+(@yf;-KIp8I}x z!DI5P^955(tf|OqvWk_zW+iuA#iVDpn#>zsli$mvI=7$FZGCgP-e?YHo6X_93;UmF zwmN>eWA&Yr&E}k-$*7<8?giVAU#2(g{Ie=s13AS}aA?3%B=_Db)9(y}j{!}bz<8*~ zJ?g%B6!NI+Chq$f<~O#PjBK3i&fUL_9~G&2j~%7mH(fB+3jam%K`7{~!1cNu7L~(+ zy=h;dw&bj>vBtMm9KnNrBUkX)?+a+$*pYEY0AHsXIp-+-6y9(hF$h$CqJVmdLqK&a zaz)CwldWB7-owEOwgIH1fMZBlS);Sa6aa|k1qDt}&g~oVTYJssk3Tk>_X4fr9*@9T z&wOZNx4r$Zl4;pQ*Tg=hzCoX2Y{;`c@qPYdySUmWO6x80W2*PAyVU04t~7VT^GVy+ zhnU@kPx*$lr}N4$i@LL5fcjI#@d_-FBkZq{^@S`jHYmR$t@{QVp0)EJjtpP>CVHKC zwK@aG`T{8vN%%r}=W%B$ z(_Hb|gBcG?AUFkN5Y~VkE(GrtKO*q7;wN+fJOUo29}*gAigXo;osss59xv!U`MCtT z0Y-7tL3UXoH<G9z{;ZqrR6sUVoNd1cHI&I+7p&q;$?!N3uAwtrmOGDX%no4MwBE zYcw26x2D_tR;zm3LQw{z$I14jT^sfninHcc`?<&9(%S_|Fgz!CeQEma<*PGWbp4^j|Y{)20DOhSxob0p(vRs8Wo6THMV&gai%S?{*q({Z?zGt@82bgi}jd`<0OI%h}?mLwImJ5vIN5RxqA_FrH zs@2572~8G=#8x69z5(NV=>~rmtP)1KN?i~;E|k*J)1YM>DD}XM1K28x)-O3(Ze>l-?J=9$=Cy(7F3C?I= zOiomcQC#KDxT_pC^QMT7w4}n6kv>CmQNZ``#3MQW;Ul8Q=rkAw7UD+1DS2AAFt5=8 zA(0!o*B50lJByg6e69S~^~sLO zw|{F_PIhXxNfa*p$t_zOL`Qkrd0#$!O=hMi9nQo;ugPP(9?98#=>=I?S8aao(^>ZT zhF`y0oHk=sMkaa7nFW=1eN=iTkVoP4?m&{jrHbrYIKMKwrruJ`EsJt?C59YnzC*C! zQE}jx$A82GV{%*XJUltl`DgiwiySp_^I88y9q~t86c=iP4J! zOUleNTViVGPR`iymr8w3ZGBv<)8vY4j&06#i|cM)Q)97u{jKbLX4*CPHTjQ2sg`&c zEnW%xe1QwPR>j9#8~m4DwLLeN$2j6+6B4ZEl*vZl{wrR(WvDeV%`t1Tf8LPXfbq*b zW!1kU{S_xw#h^f!DHf-&ED-(&wMYUV2B-?j z6~eSPWM;Y7&#Oer#)Pmg3sa{oS+olnaA``?^re-%BGFb@dQ7QI$e5a!8S92~PqrcW z%%9*w@2k%r?vR+n>=#QrVX2g@V=IT<{4WbG{r+p;zjT3mV*@q6gZa~+$nVMWBaO)= z(wr-w`rxy_AAe~0qngDl_DX%?Ehd@uOH~qD* zwHg;Z@OSyv7j9++e|`O1ksR-mTZaNy$`}2WEw7hQ^6Gt0{p{86?_I%@+xEVSsR4Ns z&@>7TC3|*7(9tHD?tbWIUj@DF`(gVBa;IdW66dL8xw72&(=`%gnh zzCs1%*%DQD!bmw$!sq|PoyLagim<*d!1{JI(VBo(P%#kG@j!@A$c(}>yt)?AcAAc2 z@J=zY5+y+c4O{4OQ9sO*D%dbC07Zs_2{OW>#H3(>#ID;VMJbP904q|7Nu-?yyrbMn~K9OnSo4Fk@c z)L8C(P5yJcZF;~~_JlV8LqFap?nsI^<-%FC;u!KJ(Ug!T#wSog@j;JP4s(1%Im~fR zISKJ%T7pTGUs8NphLdtl@$8n=Zd<7rjaq-iUuw=|`8UZgd>Wmb;xa~$zD2TtZ;eJ9 zT`9TIpR$UZaXdqZN7Igq5s^!a3Kj~lCj;(!JkeM~M1#cqv_}Ts%8;Hh zH12(EWcaYY~)7fzL!mxZ`r)XYE+ zt0PLtbgAx?I7Pm7M1JY^N97k^h`WTX8fIm;KgP;mi1REbqDk8un00no0QaC}BysLa zx3F|qR+-lT;-vs4*|IY6gBc`0&i*HwK019KPci|*!?%>)e^1Fn^I|@ak*BfZi{;nY zyPtP_#j9P|C%d zIzDS(x!~yqYn5Ecf2Jh9=^Lm*>{(AS!%FC^F4wi_dSGSZB6y*CRQIgzW!*cvk942n z8zGA2hoCFA71%OBmJ$;}uWT`($E@x(gc!ZDg-~`0;6^B1i7*L+hrI!1y{AYTqa2d@@6zTCo1Q!H`o@u428IC!p?{x+;^E?Y0l5?UBS4;X7dxD;~Fnwu*TU^wrhboN7w;8N~lBoLGfs-|Qr^6m6 z2+l;l%xXx>v088$i^-UZMLaqhS4nhP%WM4Bgv6RlriFS|_PQ@RG{wp~{yIG%EZUUo zugVZZ>+5|x4?i${#-&@97wLlyF}@Rnc9YvxVpFd7iqUC_a7yKjN)&H{44Es<7~^)Q zj`cVli3wAjPDi+ket?a>MUOv_72z=D&!M?0i14E< znc=Akr;1+YFkp|BV2duyO}yg#tJ$WZ$8Pq0S2##myV-&$Vlc3FA#2Kmc5Q-#L0 z5dz+Ga;S1VUEFbVF#@!6v5 zh!ce$wCeIJWPazJe&>?M~T7=80Km%%z<$p*1`g0SAVL7MV*HckBHJs zx(s}m8rCDeNedfv-)7sjuu&Jww`gIL&drZ#VT&%8Kcj{1y2*k7-b6p-jkmzhX%}o^ zbi&7&51O0JIJbx(G##NnXf$m>H~1emZ8;TqtN9^B958d9Djx*_BnRC2c=rLL}j zV9Q`vN9VAwzIkKBH@&&9ZHq5ZToNwy)%5iElvhK(!N^c#aATwm85+=@KD43+_=!sE z2Spn}bbsG)&8Emue=i;uBBlfKE3@Y{^Evd%Nyq}q^SR(#-++v4WW;ybv|7X-&TfSF~Z~hqFWjn z9O~-t^92jb3X7GG{Lcz+#D_%iDb#h;r4bw)Q78J)4gJcsQ+e}ELq&O7k#4+U?Z~0# zRP)d?btjcIh&tMkzE|nCZp1Ysmg2jxAdDb1UP>Qw(Nil@5796-_C%V8A{eLk$e?ey z-#6SD@tqmkp-Ag6eRz96UgAwV2Fo`**xVNBZ656QH4hIDcD0NsN&5PSyILbd+CUGY z76PVohI(+=cY3V92^Mu{U`eNd>@YyM5+r&NdQSb`=CjHyRK85tIXpZ7y&h^_vkFUv zUH$(}2}KwwwO9I-(JDgbZz{8>2Orrt6v2Ci#-ZE4`p2Kc8wN^9z$xJ#-EN#QU9GzY zwu1KRu406);cgXD1+m@36aLx@U1YH&13UfBU`{0vPIbGEn!R9GPWFkVOFwLY&BcM z*0Lt-|C(6~@Y!cN8*624EW+AZ2kT^AY(47+^Q{;9l>KagZGa7wAvO$?up8MXcq8A! zwzBiEF}?ueliS!RyNF%PwzEs%c5o-#1xb?2pt`z;UCypxSF)?v)$AI!mtD*DvHk1- z`xcC{UC(Y{H^N8IL0ITM%#N^|*|*s(>{fOgyPe$uPgi%byV*VLUUnb*4!fUymp#B9 zWDl{2+4tBZ>{0d@+^s&ro@C!=PqC-j57<#y<9wDq$9~9u#GYp_uou~n*-Pvv@Id`C zdxgCUBf39hud|=CH`tr(E%r8hhy8-R%id$ZWWQqXvtP4g>;rb3eaJpyzkxN?-@$Xy z$LtU6kL*wE6ZR?ljD61j%)VfMVSix4=7)jl*ytck(D6&0XBhW4MQVc`T3P@jQVi@+1y^3#>Y)@-&{#GdL_q z@GPFqb9gS#c`5L~KH}Q46nYZv( z-o_)m9ZCR% zG2hNF;XC+FzKdVVFXOxU9)3B$f?vt6;#WgcbuYh`@8kRV0sbw19lsuQ|Bd`6evlvH zhxrkHGygWfh2P3=F#jHZgg?q3=tm{3-r4{{cVBpW)B)=lBo#kNETa1^y!cF@K5wg#VPk%wOTJ^4Iv!`0M=V{0;sl ze~Z7(-{HUD@ACKfFZr+d`~27Z82^AD=O6Nq_;2`c`S1Ae`N#YZ{Ez%k{1g5u|BQdm z|IEMOf8l@Sf8&4W|KR`RU-GZ`34W48H>a)ewVPskSv z1n}a7VxdF`2&F<07AV6)nNTiN2$jMlVX`nqs1l|M)k2L>E7S?~!Ze{lm@do^W(u=} z*}@!Qt}suSFEk1ZgoVN)VX?48SSlMn~gl3^dXcgLoh|n%{ z2%SQguwLjEdW2q~Pv{p0gbl)=FeD5MBf>^uldxIXB5W1T6V4YdfD*|zVN|$CxLDXO zTq5icb_%a^VW$O5rNuYT+7TuW+rfPuMRU5WXc`CtNSwAlxY2BpehD z35SIv!p*|Bg2=@!$6&}#-lRA2uhlZryk)f_u z{ZOQNu(i_|>Dw6T=^uzlop>G=hlZO6&2(vs^bQPf5l29^i0xfHy~g3rCQu+95kA~$ zpm5jFFz@fy4@P?XH%1Iw`}=#Fy84XDy?8^<5?BLfsCb@jFMZ?+8dG;e8Y?HX+DiJ;Db zNb|4(OEsvfP9rr%DX^!%wOefOY3?xNW7-Bf`}-n8=8gS5BfXI(w8x?asREN09vRSY z7;Notix^ta9k>g_%^f0sLt;yRf47k?w8BdRgI#^Y`qt*&$Y8Tb%PZdZwCTHso3RjD zh9jGYn>r&z1)7!crmnW(PBY$h^fmQF+J~)b5KHE8WYD5MD3qa14X+;=8t!V}BGR{5 zy87CXPR*xW!>{q|sHvXV|f@z>l%BMx zL8TQ&H9Rt4Rs#w|C|yKwgysx&ZH+XwkM#6dweV1Hb5D;mvbnXVxwrXrv&4?B_F)l( zV>{-^V8j^N0zkuPm?+TN(?1lkqQCmO`Z|=hOX$zOh_SV~C(_r}Jg6VUR-wPw(AwYI zi}BX?Hh1(zhRx&sH8OCzAE|u+_u);E$gmBcJ}^Ku?5h8&g&CfB0W8p zR_fMvbnI}%+=*dqQlVQ3(tI~4p^*WTa;FZ7Qh~GS3`9ns6{8g3I4f#o;OtCP3~+dV zOGLkE5Ocm$8g3ry9?}D&qR&h%gI$sKR%~L-1i9)wkvazZM+Sga`nn|mS5 z$Z!*VDdq_UF-g?`b*n`UDt(1{1I*qxBo6ft0@QF(vKf>RCeQfFMj(PULWMOE?d}J_ zbO8R_uq3tgV~i~tI8#dNIB3%Y;rL;|>o9hC14cmlAjZBK7!f$n4BXxcq&d>lVgz2m zICn(sN*625pry;IKB|yvpry2_x6OjQ!=3#@==_LrXrybHM$AY+MK$VMu~0=KSYi5s zm1(6^mJ|AfmXWR=%$5!#G7r$YV`}b2?ah6y5q)o@t-EX3(oRi6E$bs_dIal0r_%3Y zdvSXts;z$n1J#6f;!2$veO8PLe`iGj{?2-)Q8Ay%Z&8CvMxz=gjH;ARNeyk0p>8Z2 z`kv+ix+#D%Z0+rDq3=>=qg8`<1>VdXM*4@ z*#IiVra)PRWx~p085+Ti#PsbN09cQ-s39aPFSQPgY~4zI*A;1vU;(89iOR8`2@;{B zAL{Ii^t9Q>7aFxSQM5!g0lfl-M!JSN(W8Svb`e^5Hn+9`L20YDf&ml&IV(m5kh7u) zK~2o0AgIpa-ky-yIy6+O2W$dmnpLby9jRc^A*_xrzrj<OOZWXSXNDEchhc(j6pqt1Gw_b9G3NSBax3s%#S zmWaBvX%FIN46}(YO7!V8)R~4hzzv9MpmY#`n|t-`plQ1Yh32+CvAv|M z#NN_1+ycZ7Y^)9gFk#Q2Wmvf>QI4K|RCI=zvQ2m%8JPH%;L17Stvbawfz0jSG-SXu z9qjLFlQ1zxHlvwcEwr`_b#EEKqSik$IJ98|ivq|2fJ(o<9cZ~HBGQEx@ZqijVQ7Sg zHXJt4=B8_7L}(f5;2XQ8O_8paerz22@P`Ct0lV_;m<}rDrnq2?`T^r>aF0rY)2pz( ztsnG&vi;CHzpUK45u`Y%Ql(8uRbFgUS2iW0sh^?(bSb3^ja7MwE@8Tq(WRU&6^4<% zu7;ADV)S)$31TWJQ$;B~Ql<*ZR6&_4C{qPxs;Cf~g2hUX778Ipuo%?@i-T%uwJ0c9 zj7-5|WC|7|Q?Qsal@!y3-j-0N63SG9YJw%GCRjo_N+?GOI4p?)>g>sZ?&8yc6tS?auu2)h})>5rX_)S#0r9Q0P zsqi3`5u{p!RBMoG4Jt1vYf#HNjVcaN#UUy-M43XADMXnfL=X`ohzJoxgo-PqjS=8d1PLTUR91*UB19k&B9I6XNQ4L^ zLIe__5~?IXl>{gU0Yiv@Aw<9sB47v+FoXygLIeyU0)`L)Lx_MOM8FUtU#BTP9k=(tdha0PlBIdGvI7<7av2Mv0N z20es9$AxmxpoeJCLp10i8uSnidWZ%+M1vlpK@ZWOhiK44H0U83^biethz31GgC3$m z4`I-8p&Wz>LWBuIzy$4qvWPN20_EzA3Q$d98u~B|eOSW>fpT>^1*pC-0YI1lAWSGB zOt2KD@ekAZhiUx7H2z^4|1gbzn8rU$;~%E+57YREY5c=9{$U#bFpYnh#y?EsAExmS z)A)x2>a+~hXf3Q!=X{_hptiiGRJ*GaE>NR2wML!!ftoVyeYtiYFRw;>uGQ{!+Pz-8 zPgC!;TD`Sey|r4swOYNkTD`Sey|r4swOYNkTD`Sey|r4swOYNkTD`Sey|r4s8qy5Z zY4z4=_10?v$(?k d0mRO}xo^G_%I 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 SdSQM28?+M|D(2r_;{O0|uQ74} diff --git a/htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.woff2 b/htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.woff2 deleted file mode 100644 index 4d13fc60404b91e398a37200c4a77b645cfd9586..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77160 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 diff --git a/htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/highlightjs/highlight.pack.js b/htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/highlightjs/highlight.pack.js deleted file mode 100644 index cf7215a66e1..00000000000 --- a/htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/highlightjs/highlight.pack.js +++ /dev/null @@ -1 +0,0 @@ -var hljs=new function(){function k(v){return v.replace(/&/gm,"&").replace(//gm,">")}function t(v){return v.nodeName.toLowerCase()}function i(w,x){var v=w&&w.exec(x);return v&&v.index==0}function d(v){return Array.prototype.map.call(v.childNodes,function(w){if(w.nodeType==3){return b.useBR?w.nodeValue.replace(/\n/g,""):w.nodeValue}if(t(w)=="br"){return"\n"}return d(w)}).join("")}function r(w){var v=(w.className+" "+(w.parentNode?w.parentNode.className:"")).split(/\s+/);v=v.map(function(x){return x.replace(/^language-/,"")});return v.filter(function(x){return j(x)||x=="no-highlight"})[0]}function o(x,y){var v={};for(var w in x){v[w]=x[w]}if(y){for(var w in y){v[w]=y[w]}}return v}function u(x){var v=[];(function w(y,z){for(var A=y.firstChild;A;A=A.nextSibling){if(A.nodeType==3){z+=A.nodeValue.length}else{if(t(A)=="br"){z+=1}else{if(A.nodeType==1){v.push({event:"start",offset:z,node:A});z=w(A,z);v.push({event:"stop",offset:z,node:A})}}}}return z})(x,0);return v}function q(w,y,C){var x=0;var F="";var z=[];function B(){if(!w.length||!y.length){return w.length?w:y}if(w[0].offset!=y[0].offset){return(w[0].offset"}function E(G){F+=""}function v(G){(G.event=="start"?A:E)(G.node)}while(w.length||y.length){var D=B();F+=k(C.substr(x,D[0].offset-x));x=D[0].offset;if(D==w){z.reverse().forEach(E);do{v(D.splice(0,1)[0]);D=B()}while(D==w&&D.length&&D[0].offset==x);z.reverse().forEach(A)}else{if(D[0].event=="start"){z.push(D[0].node)}else{z.pop()}v(D.splice(0,1)[0])}}return F+k(C.substr(x))}function m(y){function v(z){return(z&&z.source)||z}function w(A,z){return RegExp(v(A),"m"+(y.cI?"i":"")+(z?"g":""))}function x(D,C){if(D.compiled){return}D.compiled=true;D.k=D.k||D.bK;if(D.k){var z={};function E(G,F){if(y.cI){F=F.toLowerCase()}F.split(" ").forEach(function(H){var I=H.split("|");z[I[0]]=[G,I[1]?Number(I[1]):1]})}if(typeof D.k=="string"){E("keyword",D.k)}else{Object.keys(D.k).forEach(function(F){E(F,D.k[F])})}D.k=z}D.lR=w(D.l||/\b[A-Za-z0-9_]+\b/,true);if(C){if(D.bK){D.b=D.bK.split(" ").join("|")}if(!D.b){D.b=/\B|\b/}D.bR=w(D.b);if(!D.e&&!D.eW){D.e=/\B|\b/}if(D.e){D.eR=w(D.e)}D.tE=v(D.e)||"";if(D.eW&&C.tE){D.tE+=(D.e?"|":"")+C.tE}}if(D.i){D.iR=w(D.i)}if(D.r===undefined){D.r=1}if(!D.c){D.c=[]}var B=[];D.c.forEach(function(F){if(F.v){F.v.forEach(function(G){B.push(o(F,G))})}else{B.push(F=="self"?D:F)}});D.c=B;D.c.forEach(function(F){x(F,D)});if(D.starts){x(D.starts,C)}var A=D.c.map(function(F){return F.bK?"\\.?\\b("+F.b+")\\b\\.?":F.b}).concat([D.tE]).concat([D.i]).map(v).filter(Boolean);D.t=A.length?w(A.join("|"),true):{exec:function(F){return null}};D.continuation={}}x(y)}function c(S,L,J,R){function v(U,V){for(var T=0;T";U+=Z+'">';return U+X+Y}function N(){var U=k(C);if(!I.k){return U}var T="";var X=0;I.lR.lastIndex=0;var V=I.lR.exec(U);while(V){T+=U.substr(X,V.index-X);var W=E(I,V);if(W){H+=W[1];T+=w(W[0],V[0])}else{T+=V[0]}X=I.lR.lastIndex;V=I.lR.exec(U)}return T+U.substr(X)}function F(){if(I.sL&&!f[I.sL]){return k(C)}var T=I.sL?c(I.sL,C,true,I.continuation.top):g(C);if(I.r>0){H+=T.r}if(I.subLanguageMode=="continuous"){I.continuation.top=T.top}return w(T.language,T.value,false,true)}function Q(){return I.sL!==undefined?F():N()}function P(V,U){var T=V.cN?w(V.cN,"",true):"";if(V.rB){D+=T;C=""}else{if(V.eB){D+=k(U)+T;C=""}else{D+=T;C=U}}I=Object.create(V,{parent:{value:I}})}function G(T,X){C+=T;if(X===undefined){D+=Q();return 0}var V=v(X,I);if(V){D+=Q();P(V,X);return V.rB?0:X.length}var W=z(I,X);if(W){var U=I;if(!(U.rE||U.eE)){C+=X}D+=Q();do{if(I.cN){D+=""}H+=I.r;I=I.parent}while(I!=W.parent);if(U.eE){D+=k(X)}C="";if(W.starts){P(W.starts,"")}return U.rE?0:X.length}if(A(X,I)){throw new Error('Illegal lexeme "'+X+'" for mode "'+(I.cN||"")+'"')}C+=X;return X.length||1}var M=j(S);if(!M){throw new Error('Unknown language: "'+S+'"')}m(M);var I=R||M;var D="";for(var K=I;K!=M;K=K.parent){if(K.cN){D=w(K.cN,D,true)}}var C="";var H=0;try{var B,y,x=0;while(true){I.t.lastIndex=x;B=I.t.exec(L);if(!B){break}y=G(L.substr(x,B.index-x),B[0]);x=B.index+y}G(L.substr(x));for(var K=I;K.parent;K=K.parent){if(K.cN){D+=""}}return{r:H,value:D,language:S,top:I}}catch(O){if(O.message.indexOf("Illegal")!=-1){return{r:0,value:k(L)}}else{throw O}}}function g(y,x){x=x||b.languages||Object.keys(f);var v={r:0,value:k(y)};var w=v;x.forEach(function(z){if(!j(z)){return}var A=c(z,y,false);A.language=z;if(A.r>w.r){w=A}if(A.r>v.r){w=v;v=A}});if(w.language){v.second_best=w}return v}function h(v){if(b.tabReplace){v=v.replace(/^((<[^>]+>|\t)+)/gm,function(w,z,y,x){return z.replace(/\t/g,b.tabReplace)})}if(b.useBR){v=v.replace(/\n/g,"
")}return v}function p(z){var y=d(z);var A=r(z);if(A=="no-highlight"){return}var v=A?c(A,y,true):g(y);var w=u(z);if(w.length){var x=document.createElementNS("http://www.w3.org/1999/xhtml","pre");x.innerHTML=v.value;v.value=q(w,u(x),y)}v.value=h(v.value);z.innerHTML=v.value;z.className+=" hljs "+(!A&&v.language||"");z.result={language:v.language,re:v.r};if(v.second_best){z.second_best={language:v.second_best.language,re:v.second_best.r}}}var b={classPrefix:"hljs-",tabReplace:null,useBR:false,languages:undefined};function s(v){b=o(b,v)}function l(){if(l.called){return}l.called=true;var v=document.querySelectorAll("pre code");Array.prototype.forEach.call(v,p)}function a(){addEventListener("DOMContentLoaded",l,false);addEventListener("load",l,false)}var f={};var n={};function e(v,x){var w=f[v]=x(this);if(w.aliases){w.aliases.forEach(function(y){n[y]=v})}}function j(v){return f[v]||f[n[v]]}this.highlight=c;this.highlightAuto=g;this.fixMarkup=h;this.highlightBlock=p;this.configure=s;this.initHighlighting=l;this.initHighlightingOnLoad=a;this.registerLanguage=e;this.getLanguage=j;this.inherit=o;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE]};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE]};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gim]*/,i:/\n/,c:[this.BE,{b:/\[/,e:/\]/,r:0,c:[this.BE]}]};this.TM={cN:"title",b:this.IR,r:0};this.UTM={cN:"title",b:this.UIR,r:0}}();hljs.registerLanguage("scilab",function(a){var b=[a.CNM,{cN:"string",b:"'|\"",e:"'|\"",c:[a.BE,{b:"''"}]}];return{k:{keyword:"abort break case clear catch continue do elseif else endfunction end for functionglobal if pause return resume select try then while%f %F %t %T %pi %eps %inf %nan %e %i %z %s",built_in:"abs and acos asin atan ceil cd chdir clearglobal cosh cos cumprod deff disp errorexec execstr exists exp eye gettext floor fprintf fread fsolve imag isdef isemptyisinfisnan isvector lasterror length load linspace list listfiles log10 log2 logmax min msprintf mclose mopen ones or pathconvert poly printf prod pwd rand realround sinh sin size gsort sprintf sqrt strcat strcmps tring sum system tanh tantype typename warning zeros matrix"},i:'("|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bK:"function endfunction",e:"$",k:"function endfunction|10",c:[a.UTM,{cN:"params",b:"\\(",e:"\\)"},],},{cN:"transposed_variable",b:"[a-zA-Z_][a-zA-Z_0-9]*('+[\\.']*|[\\.']+)",e:"",r:0},{cN:"matrix",b:"\\[",e:"\\]'*[\\.']*",r:0,c:b},{cN:"comment",b:"//",e:"$"}].concat(b)}});hljs.registerLanguage("xml",function(a){var c="[A-Za-z0-9\\._:-]+";var d={b:/<\?(php)?(?!\w)/,e:/\?>/,sL:"php",subLanguageMode:"continuous"};var b={eW:true,i:/]+/}]}]}]};return{aliases:["html"],cI:true,c:[{cN:"doctype",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"|$)",e:">",k:{title:"style"},c:[b],starts:{e:"",rE:true,sL:"css"}},{cN:"tag",b:"|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},d,{cN:"pi",b:/<\?\w+/,e:/\?>/,r:10},{cN:"tag",b:"",c:[{cN:"title",b:"[^ /><]+",r:0},b]}]}});hljs.registerLanguage("asciidoc",function(a){return{c:[{cN:"comment",b:"^/{4,}\\n",e:"\\n/{4,}$",r:10},{cN:"comment",b:"^//",e:"$",r:0},{cN:"title",b:"^\\.\\w.*$"},{b:"^[=\\*]{4,}\\n",e:"\\n^[=\\*]{4,}$",r:10},{cN:"header",b:"^(={1,5}) .+?( \\1)?$",r:10},{cN:"header",b:"^[^\\[\\]\\n]+?\\n[=\\-~\\^\\+]{2,}$",r:10},{cN:"attribute",b:"^:.+?:",e:"\\s",eE:true,r:10},{cN:"attribute",b:"^\\[.+?\\]$",r:0},{cN:"blockquote",b:"^_{4,}\\n",e:"\\n_{4,}$",r:10},{cN:"code",b:"^[\\-\\.]{4,}\\n",e:"\\n[\\-\\.]{4,}$",r:10},{b:"^\\+{4,}\\n",e:"\\n\\+{4,}$",c:[{b:"<",e:">",sL:"xml",r:0}],r:10},{cN:"bullet",b:"^(\\*+|\\-+|\\.+|[^\\n]+?::)\\s+"},{cN:"label",b:"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+",r:10},{cN:"strong",b:"\\B\\*(?![\\*\\s])",e:"(\\n{2}|\\*)",c:[{b:"\\\\*\\w",r:0}]},{cN:"emphasis",b:"\\B'(?!['\\s])",e:"(\\n{2}|')",c:[{b:"\\\\'\\w",r:0}],r:0},{cN:"emphasis",b:"_(?![_\\s])",e:"(\\n{2}|_)",r:0},{cN:"smartquote",b:"``.+?''",r:10},{cN:"smartquote",b:"`.+?'",r:10},{cN:"code",b:"(`.+?`|\\+.+?\\+)",r:0},{cN:"code",b:"^[ \\t]",e:"$",r:0},{cN:"horizontal_rule",b:"^'{3,}[ \\t]*$",r:10},{b:"(link:)?(http|https|ftp|file|irc|image:?):\\S+\\[.*?\\]",rB:true,c:[{b:"(link|image:?):",r:0},{cN:"link_url",b:"\\w",e:"[^\\[]+",r:0},{cN:"link_label",b:"\\[",e:"\\]",eB:true,eE:true,r:0}],r:10}]}});hljs.registerLanguage("coffeescript",function(c){var b={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",reserved:"case default function var void with const let enum export import native __hasProp __extends __slice __bind __indexOf",built_in:"npm require console print module exports global window document"};var a="[A-Za-z$_][0-9A-Za-z$_]*";var f=c.inherit(c.TM,{b:a});var e={cN:"subst",b:/#\{/,e:/}/,k:b};var d=[c.BNM,c.inherit(c.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",v:[{b:/'''/,e:/'''/,c:[c.BE]},{b:/'/,e:/'/,c:[c.BE]},{b:/"""/,e:/"""/,c:[c.BE,e]},{b:/"/,e:/"/,c:[c.BE,e]}]},{cN:"regexp",v:[{b:"///",e:"///",c:[e,c.HCM]},{b:"//[gim]*",r:0},{b:"/\\S(\\\\.|[^\\n])*?/[gim]*(?=\\s|\\W|$)"}]},{cN:"property",b:"@"+a},{b:"`",e:"`",eB:true,eE:true,sL:"javascript"}];e.c=d;return{k:b,c:d.concat([{cN:"comment",b:"###",e:"###"},c.HCM,{cN:"function",b:"("+a+"\\s*=\\s*)?(\\(.*\\))?\\s*\\B[-=]>",e:"[-=]>",rB:true,c:[f,{cN:"params",b:"\\(",rB:true,c:[{b:/\(/,e:/\)/,k:b,c:["self"].concat(d)}]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:true,i:/[:="\[\]]/,c:[f]},f]},{cN:"attribute",b:a+":",e:":",rB:true,eE:true,r:0}])}});hljs.registerLanguage("fix",function(a){return{c:[{b:/[^\u2401\u0001]+/,e:/[\u2401\u0001]/,eE:true,rB:true,rE:false,c:[{b:/([^\u2401\u0001=]+)/,e:/=([^\u2401\u0001=]+)/,rE:true,rB:false,cN:"attribute"},{b:/=/,e:/([\u2401\u0001])/,eE:true,eB:true,cN:"string"}]}],cI:true}});hljs.registerLanguage("mel",function(a){return{k:"int float string vector matrix if else switch case default while do for in break continue global proc return about abs addAttr addAttributeEditorNodeHelp addDynamic addNewShelfTab addPP addPanelCategory addPrefixToName advanceToNextDrivenKey affectedNet affects aimConstraint air alias aliasAttr align alignCtx alignCurve alignSurface allViewFit ambientLight angle angleBetween animCone animCurveEditor animDisplay animView annotate appendStringArray applicationName applyAttrPreset applyTake arcLenDimContext arcLengthDimension arclen arrayMapper art3dPaintCtx artAttrCtx artAttrPaintVertexCtx artAttrSkinPaintCtx artAttrTool artBuildPaintMenu artFluidAttrCtx artPuttyCtx artSelectCtx artSetPaintCtx artUserPaintCtx assignCommand assignInputDevice assignViewportFactories attachCurve attachDeviceAttr attachSurface attrColorSliderGrp attrCompatibility attrControlGrp attrEnumOptionMenu attrEnumOptionMenuGrp attrFieldGrp attrFieldSliderGrp attrNavigationControlGrp attrPresetEditWin attributeExists attributeInfo attributeMenu attributeQuery autoKeyframe autoPlace bakeClip bakeFluidShading bakePartialHistory bakeResults bakeSimulation basename basenameEx batchRender bessel bevel bevelPlus binMembership bindSkin blend2 blendShape blendShapeEditor blendShapePanel blendTwoAttr blindDataType boneLattice boundary boxDollyCtx boxZoomCtx bufferCurve buildBookmarkMenu buildKeyframeMenu button buttonManip CBG cacheFile cacheFileCombine cacheFileMerge cacheFileTrack camera cameraView canCreateManip canvas capitalizeString catch catchQuiet ceil changeSubdivComponentDisplayLevel changeSubdivRegion channelBox character characterMap characterOutlineEditor characterize chdir checkBox checkBoxGrp checkDefaultRenderGlobals choice circle circularFillet clamp clear clearCache clip clipEditor clipEditorCurrentTimeCtx clipSchedule clipSchedulerOutliner clipTrimBefore closeCurve closeSurface cluster cmdFileOutput cmdScrollFieldExecuter cmdScrollFieldReporter cmdShell coarsenSubdivSelectionList collision color colorAtPoint colorEditor colorIndex colorIndexSliderGrp colorSliderButtonGrp colorSliderGrp columnLayout commandEcho commandLine commandPort compactHairSystem componentEditor compositingInterop computePolysetVolume condition cone confirmDialog connectAttr connectControl connectDynamic connectJoint connectionInfo constrain constrainValue constructionHistory container containsMultibyte contextInfo control convertFromOldLayers convertIffToPsd convertLightmap convertSolidTx convertTessellation convertUnit copyArray copyFlexor copyKey copySkinWeights cos cpButton cpCache cpClothSet cpCollision cpConstraint cpConvClothToMesh cpForces cpGetSolverAttr cpPanel cpProperty cpRigidCollisionFilter cpSeam cpSetEdit cpSetSolverAttr cpSolver cpSolverTypes cpTool cpUpdateClothUVs createDisplayLayer createDrawCtx createEditor createLayeredPsdFile createMotionField createNewShelf createNode createRenderLayer createSubdivRegion cross crossProduct ctxAbort ctxCompletion ctxEditMode ctxTraverse currentCtx currentTime currentTimeCtx currentUnit curve curveAddPtCtx curveCVCtx curveEPCtx curveEditorCtx curveIntersect curveMoveEPCtx curveOnSurface curveSketchCtx cutKey cycleCheck cylinder dagPose date defaultLightListCheckBox defaultNavigation defineDataServer defineVirtualDevice deformer deg_to_rad delete deleteAttr deleteShadingGroupsAndMaterials deleteShelfTab deleteUI deleteUnusedBrushes delrandstr detachCurve detachDeviceAttr detachSurface deviceEditor devicePanel dgInfo dgdirty dgeval dgtimer dimWhen directKeyCtx directionalLight dirmap dirname disable disconnectAttr disconnectJoint diskCache displacementToPoly displayAffected displayColor displayCull displayLevelOfDetail displayPref displayRGBColor displaySmoothness displayStats displayString displaySurface distanceDimContext distanceDimension doBlur dolly dollyCtx dopeSheetEditor dot dotProduct doubleProfileBirailSurface drag dragAttrContext draggerContext dropoffLocator duplicate duplicateCurve duplicateSurface dynCache dynControl dynExport dynExpression dynGlobals dynPaintEditor dynParticleCtx dynPref dynRelEdPanel dynRelEditor dynamicLoad editAttrLimits editDisplayLayerGlobals editDisplayLayerMembers editRenderLayerAdjustment editRenderLayerGlobals editRenderLayerMembers editor editorTemplate effector emit emitter enableDevice encodeString endString endsWith env equivalent equivalentTol erf error eval evalDeferred evalEcho event exactWorldBoundingBox exclusiveLightCheckBox exec executeForEachObject exists exp expression expressionEditorListen extendCurve extendSurface extrude fcheck fclose feof fflush fgetline fgetword file fileBrowserDialog fileDialog fileExtension fileInfo filetest filletCurve filter filterCurve filterExpand filterStudioImport findAllIntersections findAnimCurves findKeyframe findMenuItem findRelatedSkinCluster finder firstParentOf fitBspline flexor floatEq floatField floatFieldGrp floatScrollBar floatSlider floatSlider2 floatSliderButtonGrp floatSliderGrp floor flow fluidCacheInfo fluidEmitter fluidVoxelInfo flushUndo fmod fontDialog fopen formLayout format fprint frameLayout fread freeFormFillet frewind fromNativePath fwrite gamma gauss geometryConstraint getApplicationVersionAsFloat getAttr getClassification getDefaultBrush getFileList getFluidAttr getInputDeviceRange getMayaPanelTypes getModifiers getPanel getParticleAttr getPluginResource getenv getpid glRender glRenderEditor globalStitch gmatch goal gotoBindPose grabColor gradientControl gradientControlNoAttr graphDollyCtx graphSelectContext graphTrackCtx gravity grid gridLayout group groupObjectsByName HfAddAttractorToAS HfAssignAS HfBuildEqualMap HfBuildFurFiles HfBuildFurImages HfCancelAFR HfConnectASToHF HfCreateAttractor HfDeleteAS HfEditAS HfPerformCreateAS HfRemoveAttractorFromAS HfSelectAttached HfSelectAttractors HfUnAssignAS hardenPointCurve hardware hardwareRenderPanel headsUpDisplay headsUpMessage help helpLine hermite hide hilite hitTest hotBox hotkey hotkeyCheck hsv_to_rgb hudButton hudSlider hudSliderButton hwReflectionMap hwRender hwRenderLoad hyperGraph hyperPanel hyperShade hypot iconTextButton iconTextCheckBox iconTextRadioButton iconTextRadioCollection iconTextScrollList iconTextStaticLabel ikHandle ikHandleCtx ikHandleDisplayScale ikSolver ikSplineHandleCtx ikSystem ikSystemInfo ikfkDisplayMethod illustratorCurves image imfPlugins inheritTransform insertJoint insertJointCtx insertKeyCtx insertKnotCurve insertKnotSurface instance instanceable instancer intField intFieldGrp intScrollBar intSlider intSliderGrp interToUI internalVar intersect iprEngine isAnimCurve isConnected isDirty isParentOf isSameObject isTrue isValidObjectName isValidString isValidUiName isolateSelect itemFilter itemFilterAttr itemFilterRender itemFilterType joint jointCluster jointCtx jointDisplayScale jointLattice keyTangent keyframe keyframeOutliner keyframeRegionCurrentTimeCtx keyframeRegionDirectKeyCtx keyframeRegionDollyCtx keyframeRegionInsertKeyCtx keyframeRegionMoveKeyCtx keyframeRegionScaleKeyCtx keyframeRegionSelectKeyCtx keyframeRegionSetKeyCtx keyframeRegionTrackCtx keyframeStats lassoContext lattice latticeDeformKeyCtx launch launchImageEditor layerButton layeredShaderPort layeredTexturePort layout layoutDialog lightList lightListEditor lightListPanel lightlink lineIntersection linearPrecision linstep listAnimatable listAttr listCameras listConnections listDeviceAttachments listHistory listInputDeviceAxes listInputDeviceButtons listInputDevices listMenuAnnotation listNodeTypes listPanelCategories listRelatives listSets listTransforms listUnselected listerEditor loadFluid loadNewShelf loadPlugin loadPluginLanguageResources loadPrefObjects localizedPanelLabel lockNode loft log longNameOf lookThru ls lsThroughFilter lsType lsUI Mayatomr mag makeIdentity makeLive makePaintable makeRoll makeSingleSurface makeTubeOn makebot manipMoveContext manipMoveLimitsCtx manipOptions manipRotateContext manipRotateLimitsCtx manipScaleContext manipScaleLimitsCtx marker match max memory menu menuBarLayout menuEditor menuItem menuItemToShelf menuSet menuSetPref messageLine min minimizeApp mirrorJoint modelCurrentTimeCtx modelEditor modelPanel mouse movIn movOut move moveIKtoFK moveKeyCtx moveVertexAlongDirection multiProfileBirailSurface mute nParticle nameCommand nameField namespace namespaceInfo newPanelItems newton nodeCast nodeIconButton nodeOutliner nodePreset nodeType noise nonLinear normalConstraint normalize nurbsBoolean nurbsCopyUVSet nurbsCube nurbsEditUV nurbsPlane nurbsSelect nurbsSquare nurbsToPoly nurbsToPolygonsPref nurbsToSubdiv nurbsToSubdivPref nurbsUVSet nurbsViewDirectionVector objExists objectCenter objectLayer objectType objectTypeUI obsoleteProc oceanNurbsPreviewPlane offsetCurve offsetCurveOnSurface offsetSurface openGLExtension openMayaPref optionMenu optionMenuGrp optionVar orbit orbitCtx orientConstraint outlinerEditor outlinerPanel overrideModifier paintEffectsDisplay pairBlend palettePort paneLayout panel panelConfiguration panelHistory paramDimContext paramDimension paramLocator parent parentConstraint particle particleExists particleInstancer particleRenderInfo partition pasteKey pathAnimation pause pclose percent performanceOptions pfxstrokes pickWalk picture pixelMove planarSrf plane play playbackOptions playblast plugAttr plugNode pluginInfo pluginResourceUtil pointConstraint pointCurveConstraint pointLight pointMatrixMult pointOnCurve pointOnSurface pointPosition poleVectorConstraint polyAppend polyAppendFacetCtx polyAppendVertex polyAutoProjection polyAverageNormal polyAverageVertex polyBevel polyBlendColor polyBlindData polyBoolOp polyBridgeEdge polyCacheMonitor polyCheck polyChipOff polyClipboard polyCloseBorder polyCollapseEdge polyCollapseFacet polyColorBlindData polyColorDel polyColorPerVertex polyColorSet polyCompare polyCone polyCopyUV polyCrease polyCreaseCtx polyCreateFacet polyCreateFacetCtx polyCube polyCut polyCutCtx polyCylinder polyCylindricalProjection polyDelEdge polyDelFacet polyDelVertex polyDuplicateAndConnect polyDuplicateEdge polyEditUV polyEditUVShell polyEvaluate polyExtrudeEdge polyExtrudeFacet polyExtrudeVertex polyFlipEdge polyFlipUV polyForceUV polyGeoSampler polyHelix polyInfo polyInstallAction polyLayoutUV polyListComponentConversion polyMapCut polyMapDel polyMapSew polyMapSewMove polyMergeEdge polyMergeEdgeCtx polyMergeFacet polyMergeFacetCtx polyMergeUV polyMergeVertex polyMirrorFace polyMoveEdge polyMoveFacet polyMoveFacetUV polyMoveUV polyMoveVertex polyNormal polyNormalPerVertex polyNormalizeUV polyOptUvs polyOptions polyOutput polyPipe polyPlanarProjection polyPlane polyPlatonicSolid polyPoke polyPrimitive polyPrism polyProjection polyPyramid polyQuad polyQueryBlindData polyReduce polySelect polySelectConstraint polySelectConstraintMonitor polySelectCtx polySelectEditCtx polySeparate polySetToFaceNormal polySewEdge polyShortestPathCtx polySmooth polySoftEdge polySphere polySphericalProjection polySplit polySplitCtx polySplitEdge polySplitRing polySplitVertex polyStraightenUVBorder polySubdivideEdge polySubdivideFacet polyToSubdiv polyTorus polyTransfer polyTriangulate polyUVSet polyUnite polyWedgeFace popen popupMenu pose pow preloadRefEd print progressBar progressWindow projFileViewer projectCurve projectTangent projectionContext projectionManip promptDialog propModCtx propMove psdChannelOutliner psdEditTextureFile psdExport psdTextureFile putenv pwd python querySubdiv quit rad_to_deg radial radioButton radioButtonGrp radioCollection radioMenuItemCollection rampColorPort rand randomizeFollicles randstate rangeControl readTake rebuildCurve rebuildSurface recordAttr recordDevice redo reference referenceEdit referenceQuery refineSubdivSelectionList refresh refreshAE registerPluginResource rehash reloadImage removeJoint removeMultiInstance removePanelCategory rename renameAttr renameSelectionList renameUI render renderGlobalsNode renderInfo renderLayerButton renderLayerParent renderLayerPostProcess renderLayerUnparent renderManip renderPartition renderQualityNode renderSettings renderThumbnailUpdate renderWindowEditor renderWindowSelectContext renderer reorder reorderDeformers requires reroot resampleFluid resetAE resetPfxToPolyCamera resetTool resolutionNode retarget reverseCurve reverseSurface revolve rgb_to_hsv rigidBody rigidSolver roll rollCtx rootOf rot rotate rotationInterpolation roundConstantRadius rowColumnLayout rowLayout runTimeCommand runup sampleImage saveAllShelves saveAttrPreset saveFluid saveImage saveInitialState saveMenu savePrefObjects savePrefs saveShelf saveToolSettings scale scaleBrushBrightness scaleComponents scaleConstraint scaleKey scaleKeyCtx sceneEditor sceneUIReplacement scmh scriptCtx scriptEditorInfo scriptJob scriptNode scriptTable scriptToShelf scriptedPanel scriptedPanelType scrollField scrollLayout sculpt searchPathArray seed selLoadSettings select selectContext selectCurveCV selectKey selectKeyCtx selectKeyframeRegionCtx selectMode selectPref selectPriority selectType selectedNodes selectionConnection separator setAttr setAttrEnumResource setAttrMapping setAttrNiceNameResource setConstraintRestPosition setDefaultShadingGroup setDrivenKeyframe setDynamic setEditCtx setEditor setFluidAttr setFocus setInfinity setInputDeviceMapping setKeyCtx setKeyPath setKeyframe setKeyframeBlendshapeTargetWts setMenuMode setNodeNiceNameResource setNodeTypeFlag setParent setParticleAttr setPfxToPolyCamera setPluginResource setProject setStampDensity setStartupMessage setState setToolTo setUITemplate setXformManip sets shadingConnection shadingGeometryRelCtx shadingLightRelCtx shadingNetworkCompare shadingNode shapeCompare shelfButton shelfLayout shelfTabLayout shellField shortNameOf showHelp showHidden showManipCtx showSelectionInTitle showShadingGroupAttrEditor showWindow sign simplify sin singleProfileBirailSurface size sizeBytes skinCluster skinPercent smoothCurve smoothTangentSurface smoothstep snap2to2 snapKey snapMode snapTogetherCtx snapshot soft softMod softModCtx sort sound soundControl source spaceLocator sphere sphrand spotLight spotLightPreviewPort spreadSheetEditor spring sqrt squareSurface srtContext stackTrace startString startsWith stitchAndExplodeShell stitchSurface stitchSurfacePoints strcmp stringArrayCatenate stringArrayContains stringArrayCount stringArrayInsertAtIndex stringArrayIntersector stringArrayRemove stringArrayRemoveAtIndex stringArrayRemoveDuplicates stringArrayRemoveExact stringArrayToString stringToStringArray strip stripPrefixFromName stroke subdAutoProjection subdCleanTopology subdCollapse subdDuplicateAndConnect subdEditUV subdListComponentConversion subdMapCut subdMapSewMove subdMatchTopology subdMirror subdToBlind subdToPoly subdTransferUVsToCache subdiv subdivCrease subdivDisplaySmoothness substitute substituteAllString substituteGeometry substring surface surfaceSampler surfaceShaderList swatchDisplayPort switchTable symbolButton symbolCheckBox sysFile system tabLayout tan tangentConstraint texLatticeDeformContext texManipContext texMoveContext texMoveUVShellContext texRotateContext texScaleContext texSelectContext texSelectShortestPathCtx texSmudgeUVContext texWinToolCtx text textCurves textField textFieldButtonGrp textFieldGrp textManip textScrollList textToShelf textureDisplacePlane textureHairColor texturePlacementContext textureWindow threadCount threePointArcCtx timeControl timePort timerX toNativePath toggle toggleAxis toggleWindowVisibility tokenize tokenizeList tolerance tolower toolButton toolCollection toolDropped toolHasOptions toolPropertyWindow torus toupper trace track trackCtx transferAttributes transformCompare transformLimits translator trim trunc truncateFluidCache truncateHairCache tumble tumbleCtx turbulence twoPointArcCtx uiRes uiTemplate unassignInputDevice undo undoInfo ungroup uniform unit unloadPlugin untangleUV untitledFileName untrim upAxis updateAE userCtx uvLink uvSnapshot validateShelfName vectorize view2dToolCtx viewCamera viewClipPlane viewFit viewHeadOn viewLookAt viewManip viewPlace viewSet visor volumeAxis vortex waitCursor warning webBrowser webBrowserPrefs whatIs window windowPref wire wireContext workspace wrinkle wrinkleContext writeTake xbmLangPathList xform",i:""}]},{cN:"preprocessor",b:"#",e:"$"},{cN:"class",b:"("+b.split(" ").join("|")+")\\b",e:"({|$)",k:b,l:c,c:[a.UTM]},{cN:"variable",b:"\\."+a.UIR,r:0}]}});hljs.registerLanguage("apache",function(a){var b={cN:"number",b:"[\\$%]\\d+"};return{cI:true,c:[a.HCM,{cN:"tag",b:""},{cN:"keyword",b:/\w+/,r:0,k:{common:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"sqbracket",b:"\\s\\[",e:"\\]$"},{cN:"cbracket",b:"[\\$%]\\{",e:"\\}",c:["self",b]},b,a.QSM]}}],i:/\S/}});hljs.registerLanguage("livecodeserver",function(a){var e={cN:"variable",b:"\\b[gtps][A-Z]+[A-Za-z0-9_\\-]*\\b|\\$_[A-Z]+",r:0};var b={cN:"comment",e:"$",v:[a.CBLCLM,a.HCM,{b:"--",},{b:"[^:]//",}]};var d=a.inherit(a.TM,{v:[{b:"\\b_*rig[A-Z]+[A-Za-z0-9_\\-]*"},{b:"\\b_[a-z0-9\\-]+"}]});var c=a.inherit(a.TM,{b:"\\b([A-Za-z0-9_\\-]+)\\b"});return{cI:false,k:{keyword:"after byte bytes english the until http forever descending using line real8 with seventh for stdout finally element word fourth before black ninth sixth characters chars stderr uInt1 uInt1s uInt2 uInt2s stdin string lines relative rel any fifth items from middle mid at else of catch then third it file milliseconds seconds second secs sec int1 int1s int4 int4s internet int2 int2s normal text item last long detailed effective uInt4 uInt4s repeat end repeat URL in try into switch to words https token binfile each tenth as ticks tick system real4 by dateItems without char character ascending eighth whole dateTime numeric short first ftp integer abbreviated abbr abbrev private case while if",constant:"SIX TEN FORMFEED NINE ZERO NONE SPACE FOUR FALSE COLON CRLF PI COMMA ENDOFFILE EOF EIGHT FIVE QUOTE EMPTY ONE TRUE RETURN CR LINEFEED RIGHT BACKSLASH NULL SEVEN TAB THREE TWO six ten formfeed nine zero none space four false colon crlf pi comma endoffile eof eight five quote empty one true return cr linefeed right backslash null seven tab three two RIVERSION RISTATE FILE_READ_MODE FILE_WRITE_MODE FILE_WRITE_MODE DIR_WRITE_MODE FILE_READ_UMASK FILE_WRITE_UMASK DIR_READ_UMASK DIR_WRITE_UMASK",operator:"div mod wrap and or bitAnd bitNot bitOr bitXor among not in a an within contains ends with begins the keys of keys",built_in:"put abs acos aliasReference annuity arrayDecode arrayEncode asin atan atan2 average avg base64Decode base64Encode baseConvert binaryDecode binaryEncode byteToNum cachedURL cachedURLs charToNum cipherNames commandNames compound compress constantNames cos date dateFormat decompress directories diskSpace DNSServers exp exp1 exp2 exp10 extents files flushEvents folders format functionNames global globals hasMemory hostAddress hostAddressToName hostName hostNameToAddress isNumber ISOToMac itemOffset keys len length libURLErrorData libUrlFormData libURLftpCommand libURLLastHTTPHeaders libURLLastRHHeaders libUrlMultipartFormAddPart libUrlMultipartFormData libURLVersion lineOffset ln ln1 localNames log log2 log10 longFilePath lower macToISO matchChunk matchText matrixMultiply max md5Digest median merge millisec millisecs millisecond milliseconds min monthNames num number numToByte numToChar offset open openfiles openProcesses openProcessIDs openSockets paramCount param params peerAddress pendingMessages platform processID random randomBytes replaceText result revCreateXMLTree revCreateXMLTreeFromFile revCurrentRecord revCurrentRecordIsFirst revCurrentRecordIsLast revDatabaseColumnCount revDatabaseColumnIsNull revDatabaseColumnLengths revDatabaseColumnNames revDatabaseColumnNamed revDatabaseColumnNumbered revDatabaseColumnTypes revDatabaseConnectResult revDatabaseCursors revDatabaseID revDatabaseTableNames revDatabaseType revDataFromQuery revdb_closeCursor revdb_columnbynumber revdb_columncount revdb_columnisnull revdb_columnlengths revdb_columnnames revdb_columntypes revdb_commit revdb_connect revdb_connections revdb_connectionerr revdb_currentrecord revdb_cursorconnection revdb_cursorerr revdb_cursors revdb_dbtype revdb_disconnect revdb_execute revdb_iseof revdb_isbof revdb_movefirst revdb_movelast revdb_movenext revdb_moveprev revdb_query revdb_querylist revdb_recordcount revdb_rollback revdb_tablenames revGetDatabaseDriverPath revNumberOfRecords revOpenDatabase revOpenDatabases revQueryDatabase revQueryDatabaseBlob revQueryResult revQueryIsAtStart revQueryIsAtEnd revUnixFromMacPath revXMLAttribute revXMLAttributes revXMLAttributeValues revXMLChildContents revXMLChildNames revXMLFirstChild revXMLMatchingNode revXMLNextSibling revXMLNodeContents revXMLNumberOfChildren revXMLParent revXMLPreviousSibling revXMLRootNode revXMLRPC_CreateRequest revXMLRPC_Documents revXMLRPC_Error revXMLRPC_Execute revXMLRPC_GetHost revXMLRPC_GetMethod revXMLRPC_GetParam revXMLText revXMLRPC_GetParamCount revXMLRPC_GetParamNode revXMLRPC_GetParamType revXMLRPC_GetPath revXMLRPC_GetPort revXMLRPC_GetProtocol revXMLRPC_GetRequest revXMLRPC_GetResponse revXMLRPC_GetSocket revXMLTree revXMLTrees revXMLValidateDTD revZipDescribeItem revZipEnumerateItems revZipOpenArchives round sec secs seconds sha1Digest shell shortFilePath sin specialFolderPath sqrt standardDeviation statRound stdDev sum sysError systemVersion tan tempName tick ticks time to toLower toUpper transpose trunc uniDecode uniEncode upper URLDecode URLEncode URLStatus value variableNames version waitDepth weekdayNames wordOffset add breakpoint cancel clear local variable file word line folder directory URL close socket process combine constant convert create new alias folder directory decrypt delete variable word line folder directory URL dispatch divide do encrypt filter get include intersect kill libURLDownloadToFile libURLFollowHttpRedirects libURLftpUpload libURLftpUploadFile libURLresetAll libUrlSetAuthCallback libURLSetCustomHTTPHeaders libUrlSetExpect100 libURLSetFTPListCommand libURLSetFTPMode libURLSetFTPStopTime libURLSetStatusCallback load multiply socket process post seek rel relative read from process rename replace require resetAll revAddXMLNode revAppendXML revCloseCursor revCloseDatabase revCommitDatabase revCopyFile revCopyFolder revCopyXMLNode revDeleteFolder revDeleteXMLNode revDeleteAllXMLTrees revDeleteXMLTree revExecuteSQL revGoURL revInsertXMLNode revMoveFolder revMoveToFirstRecord revMoveToLastRecord revMoveToNextRecord revMoveToPreviousRecord revMoveToRecord revMoveXMLNode revPutIntoXMLNode revRollBackDatabase revSetDatabaseDriverPath revSetXMLAttribute revXMLRPC_AddParam revXMLRPC_DeleteAllDocuments revXMLAddDTD revXMLRPC_Free revXMLRPC_FreeAll revXMLRPC_DeleteDocument revXMLRPC_DeleteParam revXMLRPC_SetHost revXMLRPC_SetMethod revXMLRPC_SetPort revXMLRPC_SetProtocol revXMLRPC_SetSocket revZipAddItemWithData revZipAddItemWithFile revZipAddUncompressedItemWithData revZipAddUncompressedItemWithFile revZipCancel revZipCloseArchive revZipDeleteItem revZipExtractItemToFile revZipExtractItemToVariable revZipSetProgressCallback revZipRenameItem revZipReplaceItemWithData revZipReplaceItemWithFile revZipOpenArchive send set sort split subtract union unload wait write"},c:[e,{cN:"keyword",b:"\\bend\\sif\\b"},{cN:"function",bK:"function",e:"$",c:[e,c,a.ASM,a.QSM,a.BNM,a.CNM,d]},{cN:"function",bK:"end",e:"$",c:[c,d]},{cN:"command",bK:"command on",e:"$",c:[e,c,a.ASM,a.QSM,a.BNM,a.CNM,d]},{cN:"command",bK:"end",e:"$",c:[c,d]},{cN:"preprocessor",b:"<\\?rev|<\\?lc|<\\?livecode",r:10},{cN:"preprocessor",b:"<\\?"},{cN:"preprocessor",b:"\\?>"},b,a.ASM,a.QSM,a.BNM,a.CNM,d],i:";$|^\\[|^="}});hljs.registerLanguage("glsl",function(a){return{k:{keyword:"atomic_uint attribute bool break bvec2 bvec3 bvec4 case centroid coherent const continue default discard dmat2 dmat2x2 dmat2x3 dmat2x4 dmat3 dmat3x2 dmat3x3 dmat3x4 dmat4 dmat4x2 dmat4x3 dmat4x4 do double dvec2 dvec3 dvec4 else flat float for highp if iimage1D iimage1DArray iimage2D iimage2DArray iimage2DMS iimage2DMSArray iimage2DRect iimage3D iimageBuffer iimageCube iimageCubeArray image1D image1DArray image2D image2DArray image2DMS image2DMSArray image2DRect image3D imageBuffer imageCube imageCubeArray in inout int invariant isampler1D isampler1DArray isampler2D isampler2DArray isampler2DMS isampler2DMSArray isampler2DRect isampler3D isamplerBuffer isamplerCube isamplerCubeArray ivec2 ivec3 ivec4 layout lowp mat2 mat2x2 mat2x3 mat2x4 mat3 mat3x2 mat3x3 mat3x4 mat4 mat4x2 mat4x3 mat4x4 mediump noperspective out patch precision readonly restrict return sample sampler1D sampler1DArray sampler1DArrayShadow sampler1DShadow sampler2D sampler2DArray sampler2DArrayShadow sampler2DMS sampler2DMSArray sampler2DRect sampler2DRectShadow sampler2DShadow sampler3D samplerBuffer samplerCube samplerCubeArray samplerCubeArrayShadow samplerCubeShadow smooth struct subroutine switch uimage1D uimage1DArray uimage2D uimage2DArray uimage2DMS uimage2DMSArray uimage2DRect uimage3D uimageBuffer uimageCube uimageCubeArray uint uniform usampler1D usampler1DArray usampler2D usampler2DArray usampler2DMS usampler2DMSArray usampler2DRect usampler3D usamplerBuffer usamplerCube usamplerCubeArray uvec2 uvec3 uvec4 varying vec2 vec3 vec4 void volatile while writeonly",built_in:"gl_BackColor gl_BackLightModelProduct gl_BackLightProduct gl_BackMaterial gl_BackSecondaryColor gl_ClipDistance gl_ClipPlane gl_ClipVertex gl_Color gl_DepthRange gl_EyePlaneQ gl_EyePlaneR gl_EyePlaneS gl_EyePlaneT gl_Fog gl_FogCoord gl_FogFragCoord gl_FragColor gl_FragCoord gl_FragData gl_FragDepth gl_FrontColor gl_FrontFacing gl_FrontLightModelProduct gl_FrontLightProduct gl_FrontMaterial gl_FrontSecondaryColor gl_InstanceID gl_InvocationID gl_Layer gl_LightModel gl_LightSource gl_MaxAtomicCounterBindings gl_MaxAtomicCounterBufferSize gl_MaxClipDistances gl_MaxClipPlanes gl_MaxCombinedAtomicCounterBuffers gl_MaxCombinedAtomicCounters gl_MaxCombinedImageUniforms gl_MaxCombinedImageUnitsAndFragmentOutputs gl_MaxCombinedTextureImageUnits gl_MaxDrawBuffers gl_MaxFragmentAtomicCounterBuffers gl_MaxFragmentAtomicCounters gl_MaxFragmentImageUniforms gl_MaxFragmentInputComponents gl_MaxFragmentUniformComponents gl_MaxFragmentUniformVectors gl_MaxGeometryAtomicCounterBuffers gl_MaxGeometryAtomicCounters gl_MaxGeometryImageUniforms gl_MaxGeometryInputComponents gl_MaxGeometryOutputComponents gl_MaxGeometryOutputVertices gl_MaxGeometryTextureImageUnits gl_MaxGeometryTotalOutputComponents gl_MaxGeometryUniformComponents gl_MaxGeometryVaryingComponents gl_MaxImageSamples gl_MaxImageUnits gl_MaxLights gl_MaxPatchVertices gl_MaxProgramTexelOffset gl_MaxTessControlAtomicCounterBuffers gl_MaxTessControlAtomicCounters gl_MaxTessControlImageUniforms gl_MaxTessControlInputComponents gl_MaxTessControlOutputComponents gl_MaxTessControlTextureImageUnits gl_MaxTessControlTotalOutputComponents gl_MaxTessControlUniformComponents gl_MaxTessEvaluationAtomicCounterBuffers gl_MaxTessEvaluationAtomicCounters gl_MaxTessEvaluationImageUniforms gl_MaxTessEvaluationInputComponents gl_MaxTessEvaluationOutputComponents gl_MaxTessEvaluationTextureImageUnits gl_MaxTessEvaluationUniformComponents gl_MaxTessGenLevel gl_MaxTessPatchComponents gl_MaxTextureCoords gl_MaxTextureImageUnits gl_MaxTextureUnits gl_MaxVaryingComponents gl_MaxVaryingFloats gl_MaxVaryingVectors gl_MaxVertexAtomicCounterBuffers gl_MaxVertexAtomicCounters gl_MaxVertexAttribs gl_MaxVertexImageUniforms gl_MaxVertexOutputComponents gl_MaxVertexTextureImageUnits gl_MaxVertexUniformComponents gl_MaxVertexUniformVectors gl_MaxViewports gl_MinProgramTexelOffsetgl_ModelViewMatrix gl_ModelViewMatrixInverse gl_ModelViewMatrixInverseTranspose gl_ModelViewMatrixTranspose gl_ModelViewProjectionMatrix gl_ModelViewProjectionMatrixInverse gl_ModelViewProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixTranspose gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_Normal gl_NormalMatrix gl_NormalScale gl_ObjectPlaneQ gl_ObjectPlaneR gl_ObjectPlaneS gl_ObjectPlaneT gl_PatchVerticesIn gl_PerVertex gl_Point gl_PointCoord gl_PointSize gl_Position gl_PrimitiveID gl_PrimitiveIDIn gl_ProjectionMatrix gl_ProjectionMatrixInverse gl_ProjectionMatrixInverseTranspose gl_ProjectionMatrixTranspose gl_SampleID gl_SampleMask gl_SampleMaskIn gl_SamplePosition gl_SecondaryColor gl_TessCoord gl_TessLevelInner gl_TessLevelOuter gl_TexCoord gl_TextureEnvColor gl_TextureMatrixInverseTranspose gl_TextureMatrixTranspose gl_Vertex gl_VertexID gl_ViewportIndex gl_in gl_out EmitStreamVertex EmitVertex EndPrimitive EndStreamPrimitive abs acos acosh all any asin asinh atan atanh atomicCounter atomicCounterDecrement atomicCounterIncrement barrier bitCount bitfieldExtract bitfieldInsert bitfieldReverse ceil clamp cos cosh cross dFdx dFdy degrees determinant distance dot equal exp exp2 faceforward findLSB findMSB floatBitsToInt floatBitsToUint floor fma fract frexp ftransform fwidth greaterThan greaterThanEqual imageAtomicAdd imageAtomicAnd imageAtomicCompSwap imageAtomicExchange imageAtomicMax imageAtomicMin imageAtomicOr imageAtomicXor imageLoad imageStore imulExtended intBitsToFloat interpolateAtCentroid interpolateAtOffset interpolateAtSample inverse inversesqrt isinf isnan ldexp length lessThan lessThanEqual log log2 matrixCompMult max memoryBarrier min mix mod modf noise1 noise2 noise3 noise4 normalize not notEqual outerProduct packDouble2x32 packHalf2x16 packSnorm2x16 packSnorm4x8 packUnorm2x16 packUnorm4x8 pow radians reflect refract round roundEven shadow1D shadow1DLod shadow1DProj shadow1DProjLod shadow2D shadow2DLod shadow2DProj shadow2DProjLod sign sin sinh smoothstep sqrt step tan tanh texelFetch texelFetchOffset texture texture1D texture1DLod texture1DProj texture1DProjLod texture2D texture2DLod texture2DProj texture2DProjLod texture3D texture3DLod texture3DProj texture3DProjLod textureCube textureCubeLod textureGather textureGatherOffset textureGatherOffsets textureGrad textureGradOffset textureLod textureLodOffset textureOffset textureProj textureProjGrad textureProjGradOffset textureProjLod textureProjLodOffset textureProjOffset textureQueryLod textureSize transpose trunc uaddCarry uintBitsToFloat umulExtended unpackDouble2x32 unpackHalf2x16 unpackSnorm2x16 unpackSnorm4x8 unpackUnorm2x16 unpackUnorm4x8 usubBorrow gl_TextureMatrix gl_TextureMatrixInverse",literal:"true false"},i:'"',c:[a.CLCM,a.CBLCLM,a.CNM,{cN:"preprocessor",b:"#",e:"$"}]}});hljs.registerLanguage("lasso",function(d){var b="[a-zA-Z_][a-zA-Z0-9_.]*";var i="<\\?(lasso(script)?|=)";var c="\\]|\\?>";var g={literal:"true false none minimal full all void and or not bw nbw ew new cn ncn lt lte gt gte eq neq rx nrx ft",built_in:"array date decimal duration integer map pair string tag xml null bytes list queue set stack staticarray tie local var variable global data self inherited",keyword:"error_code error_msg error_pop error_push error_reset cache database_names database_schemanames database_tablenames define_tag define_type email_batch encode_set html_comment handle handle_error header if inline iterate ljax_target link link_currentaction link_currentgroup link_currentrecord link_detail link_firstgroup link_firstrecord link_lastgroup link_lastrecord link_nextgroup link_nextrecord link_prevgroup link_prevrecord log loop namespace_using output_none portal private protect records referer referrer repeating resultset rows search_args search_arguments select sort_args sort_arguments thread_atomic value_list while abort case else if_empty if_false if_null if_true loop_abort loop_continue loop_count params params_up return return_value run_children soap_definetag soap_lastrequest soap_lastresponse tag_name ascending average by define descending do equals frozen group handle_failure import in into join let match max min on order parent protected provide public require returnhome skip split_thread sum take thread to trait type where with yield yieldhome"};var a={cN:"comment",b:"",r:0};var j={cN:"preprocessor",b:"\\[noprocess\\]",starts:{cN:"markup",e:"\\[/noprocess\\]",rE:true,c:[a]}};var e={cN:"preprocessor",b:"\\[/noprocess|"+i};var h={cN:"variable",b:"'"+b+"'"};var f=[d.CLCM,{cN:"javadoc",b:"/\\*\\*!",e:"\\*/"},d.CBLCLM,d.inherit(d.CNM,{b:d.CNR+"|-?(infinity|nan)\\b"}),d.inherit(d.ASM,{i:null}),d.inherit(d.QSM,{i:null}),{cN:"string",b:"`",e:"`"},{cN:"variable",v:[{b:"[#$]"+b},{b:"#",e:"\\d+",i:"\\W"}]},{cN:"tag",b:"::\\s*",e:b,i:"\\W"},{cN:"attribute",b:"\\.\\.\\.|-"+d.UIR},{cN:"subst",v:[{b:"->\\s*",c:[h]},{b:":=|/(?!\\w)=?|[-+*%=<>&|!?\\\\]+",r:0}]},{cN:"built_in",b:"\\.\\.?",r:0,c:[h]},{cN:"class",bK:"define",rE:true,e:"\\(|=>",c:[d.inherit(d.TM,{b:d.UIR+"(=(?!>))?"})]}];return{aliases:["ls","lassoscript"],cI:true,l:b+"|&[lg]t;",k:g,c:[{cN:"preprocessor",b:c,r:0,starts:{cN:"markup",e:"\\[|"+i,rE:true,r:0,c:[a]}},j,e,{cN:"preprocessor",b:"\\[no_square_brackets",starts:{e:"\\[/no_square_brackets\\]",l:b+"|&[lg]t;",k:g,c:[{cN:"preprocessor",b:c,r:0,starts:{cN:"markup",e:i,rE:true,c:[a]}},j,e].concat(f)}},{cN:"preprocessor",b:"\\[",r:0},{cN:"shebang",b:"^#!.+lasso9\\b",r:10}].concat(f)}});hljs.registerLanguage("mathematica",function(a){return{aliases:["mma"],l:"(\\$|\\b)"+a.IR+"\\b",k:"AbelianGroup Abort AbortKernels AbortProtect Above Abs Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Active ActiveItem ActiveStyle AcyclicGraphQ AddOnHelpPath AddTo AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AffineTransform After AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowedDimensions AllowGroupClose AllowInlineCells AllowKernelInitialization AllowReverseGroupClose AllowScriptLevelChange AlphaChannel AlternatingGroup AlternativeHypothesis Alternatives AmbientLight Analytic AnchoredSearch And AndersonDarlingTest AngerJ AngleBracket AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotation Annuity AnnuityDue Antialiasing Antisymmetric Apart ApartSquareFree Appearance AppearanceElements AppellF1 Append AppendTo Apply ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess ARProcess Array ArrayComponents ArrayDepth ArrayFlatten ArrayPad ArrayPlot ArrayQ ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads AspectRatio AspectRatioFixed Assert Assuming Assumptions AstronomicalData Asynchronous AsynchronousTaskObject AsynchronousTasks AtomQ Attributes AugmentedSymmetricPolynomial AutoAction AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords Axes AxesEdge AxesLabel AxesOrigin AxesStyle Axis BabyMonsterGroupB Back Background BackgroundTasksSettings Backslash Backsubstitution Backward Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseForm Baseline BaselinePosition BaseStyle BatesDistribution BattleLemarieWavelet Because BeckmannDistribution Beep Before Begin BeginDialogPacket BeginFrontEndInteractionPacket BeginPackage BellB BellY Below BenfordDistribution BeniniDistribution BenktanderGibratDistribution BenktanderWeibullDistribution BernoulliB BernoulliDistribution BernoulliGraphDistribution BernoulliProcess BernsteinBasis BesselFilterModel BesselI BesselJ BesselJZero BesselK BesselY BesselYZero Beta BetaBinomialDistribution BetaDistribution BetaNegativeBinomialDistribution BetaPrimeDistribution BetaRegularized BetweennessCentrality BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms Booleans BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryStyle Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BubbleChart BubbleChart3D BubbleScale BubbleSizes BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteCount ByteOrdering C CachedValue CacheGraphics CalendarData CalendarType CallPacket CanberraDistance Cancel CancelButton CandlestickChart Cap CapForm CapitalDifferentialD CardinalBSplineBasis CarmichaelLambda Cases Cashflow Casoratian Catalan CatalanNumber Catch CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterDot CentralMoment CentralMomentGeneratingFunction CForm ChampernowneNumber ChanVeseBinarize Character CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterRange Characters ChartBaseStyle ChartElementData ChartElementDataFunction ChartElementFunction ChartElements ChartLabels ChartLayout ChartLegends ChartStyle Chebyshev1FilterModel Chebyshev2FilterModel ChebyshevDistance ChebyshevT ChebyshevU Check CheckAbort CheckAll Checkbox CheckboxBar CheckboxBox CheckboxBoxOptions ChemicalData ChessboardDistance ChiDistribution ChineseRemainder ChiSquareDistribution ChoiceButtons ChoiceDialog CholeskyDecomposition Chop Circle CircleBox CircleDot CircleMinus CirclePlus CircleTimes CirculantGraph CityData Clear ClearAll ClearAttributes ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent ClusteringComponents CMYKColor Coarse Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorCombine ColorConvert ColorData ColorDataFunction ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorSpace Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CommonDefaultFormatTypes Commonest CommonestFilter CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledFunction Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComponentMeasurements ComponentwiseContextMenu Compose ComposeList ComposeSeries Composition CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath Congruent Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphQ ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray Constants ConstrainedMax ConstrainedMin ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFilename ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean Control ControlActive ControlAlignment ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateDialog CreateDirectory CreateDocument CreateIntermediateDirectories CreatePalette CreatePalettePacket CreateScheduledTask CreateTemporary CreateWindow CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossingDetect CrossMatrix Csc Csch CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrentImage CurrentlySpeakingPacket CurrentValue CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecomposition D DagumDistribution DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DataCompression DataDistribution DataRange DataReversed Date DateDelimiters DateDifference DateFunction DateList DateListLogPlot DateListPlot DatePattern DatePlus DateRange DateString DateTicksFormat DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayMatchQ DayName DayPlus DayRange DayRound DeBruijnGraph Debug DebugTag Decimal DeclareKnownSymbols DeclarePackage Decompose Decrement DedekindEta Default DefaultAxesStyle DefaultBaseStyle DefaultBoxStyle DefaultButton DefaultColor DefaultControlPlacement DefaultDuplicateCellStyle DefaultDuration DefaultElement DefaultFaceGridsStyle DefaultFieldHintStyle DefaultFont DefaultFontProperties DefaultFormatType DefaultFormatTypeForStyle DefaultFrameStyle DefaultFrameTicksStyle DefaultGridLinesStyle DefaultInlineFormatType DefaultInputFormatType DefaultLabelStyle DefaultMenuStyle DefaultNaturalLanguage DefaultNewCellStyle DefaultNewInlineCellStyle DefaultNotebook DefaultOptions DefaultOutputFormatType DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic Deinitialization Del Deletable Delete DeleteBorderComponents DeleteCases DeleteContents DeleteDirectory DeleteDuplicates DeleteFile DeleteSmallComponents DeleteWithContents DeletionWarning Delimiter DelimiterFlashTime DelimiterMatching Delimiters Denominator DensityGraphics DensityHistogram DensityPlot DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DescriptorStateSpace DesignMatrix Det DGaussianWavelet DiacriticalPositioning Diagonal DiagonalMatrix Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DifferenceDelta DifferenceOrder DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralGroup Dilation Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletCharacter DirichletConvolve DirichletDistribution DirichletL DirichletTransform DirichletWindow DisableConsolePrintPacket DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform DiscreteWaveletTransform Discriminant Disjunction Disk DiskBox DiskMatrix Dispatch DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentNotebook DominantColors DOSTextFormat Dot DotDashed DotEqual Dotted DoubleBracketingBar DoubleContourIntegral DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DoublyInfinite Down DownArrow DownArrowBar DownArrowUpArrow DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar Downsample DownTee DownTeeArrow DownValues DragAndDrop DrawEdges DrawFrontFaces DrawHighlighted Drop DSolve Dt DualLinearProgramming DualSystemsModel DumpGet DumpSave DuplicateFreeQ Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptions E EccentricityCentrality EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeCost EdgeCount EdgeCoverQ EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData Eliminate EliminationOrder EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EnableConsolePrintPacket Enabled Encode End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfFile EndOfLine EndOfString EndPackage EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entropy EntropyFilter Environment Epilog Equal EqualColumns EqualRows EqualTilde EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerE EulerGamma EulerianGraphQ EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluationCell EvaluationCompletionAction EvaluationElements EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpToTrig ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalCall ExternalDataCharacterEncoding Extract ExtractArchive ExtremeValueDistribution FaceForm FaceGrids FaceGridsStyle Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail FailureDistribution False FARIMAProcess FEDisableConsolePrintPacket FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket Fibonacci FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileDate FileExistsQ FileExtension FileFormat FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileType FilledCurve FilledCurveBox Filling FillingStyle FillingTransform FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindArgMax FindArgMin FindClique FindClusters FindCurvePath FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEulerianCycle FindFaces FindFile FindFit FindGeneratingFunction FindGeoLocation FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMaximum FindMaximumFlow FindMaxValue FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindPermutation FindPostmanTour FindProcessParameters FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindThreshold FindVertexCover FindVertexCut Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstPassageTimeDistribution FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FittedModel FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlatTopWindow FlipView Floor FlushPrintOutputPacket Fold FoldList Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrequencySamplingFilterKernel FresnelC FresnelS Friday FrobeniusNumber FrobeniusSolve FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullOptions FullSimplify Function FunctionExpand FunctionInterpolation FunctionSpace FussellVeselyImportance GaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins Gamma GammaDistribution GammaRegularized GapPenalty Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateConditions GeneratedCell GeneratedParameters GeneratingFunction Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDistance GeoGridPosition GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoPosition GeoPositionENU GeoPositionXYZ GeoProjectionData GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter Graph GraphAssortativity GraphCenter GraphComplement GraphData GraphDensity GraphDiameter GraphDifference GraphDisjointUnion GraphDistance GraphDistanceMatrix GraphElementData GraphEmbedding GraphHighlight GraphHighlightStyle GraphHub Graphics Graphics3D Graphics3DBox Graphics3DBoxOptions GraphicsArray GraphicsBaseline GraphicsBox GraphicsBoxOptions GraphicsColor GraphicsColumn GraphicsComplex GraphicsComplex3DBox GraphicsComplex3DBoxOptions GraphicsComplexBox GraphicsComplexBoxOptions GraphicsContents GraphicsData GraphicsGrid GraphicsGridBox GraphicsGroup GraphicsGroup3DBox GraphicsGroup3DBoxOptions GraphicsGroupBox GraphicsGroupBoxOptions GraphicsGrouping GraphicsHighlightColor GraphicsRow GraphicsSpacing GraphicsStyle GraphIntersection GraphLayout GraphLinkEfficiency GraphPeriphery GraphPlot GraphPlot3D GraphPower GraphPropertyDistribution GraphQ GraphRadius GraphReciprocity GraphRoot GraphStyle GraphUnion Gray GrayLevel GreatCircleDistance Greater GreaterEqual GreaterEqualLess GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterTilde Green Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain Gudermannian GumbelDistribution HaarWavelet HadamardMatrix HalfNormalDistribution HamiltonianGraphQ HammingDistance HammingWindow HankelH1 HankelH2 HankelMatrix HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash HashTable Haversine HazardFunction Head HeadCompose Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenSurface HighlightGraph HighlightImage HighpassFilter HigmanSimsGroupHS HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HitMissTransform HITSCentrality HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HotellingTSquareDistribution HoytDistribution HTMLSave Hue HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestData I Identity IdentityMatrix If IgnoreCase Im Image Image3D Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageAspectRatio ImageAssemble ImageCache ImageCacheValid ImageCapture ImageChannels ImageClip ImageColorSpace ImageCompose ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDataPacket ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDistance ImageEffect ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageForestingComponents ImageForwardTransformation ImageHistogram ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarkers ImageMeasurements ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImageQ ImageRangeCache ImageReflect ImageRegion ImageResize ImageResolution ImageRotate ImageRotated ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions Implies Import ImportAutoReplacements ImportString ImprovementImportance In IncidenceGraph IncidenceList IncidenceMatrix IncludeConstantBasis IncludeFileExtension IncludePods IncludeSingularTerm Increment Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentUnit IndependentVertexSetQ Indeterminate IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers Infinity Infix Information Inherited InheritScope Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InlineCounterAssignments InlineCounterIncrements InlineRules Inner Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionPointObject InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Install InstallService InString Integer IntegerDigits IntegerExponent IntegerLength IntegerPart IntegerPartitions IntegerQ Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction InterpretTemplate InterquartileRange Interrupt InterruptSettings Intersection Interval IntervalIntersection IntervalMemberQ IntervalUnion Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHaversine InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InversePermutation InverseRadon InverseSeries InverseSurvivalFunction InverseWaveletTransform InverseWeierstrassP InverseZTransform Invisible InvisibleApplication InvisibleTimes IrreduciblePolynomialQ IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcess JaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join Joined JoinedCurve JoinedCurveBox JoinForm JordanDecomposition JordanModelDecomposition K KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelMixtureDistribution KernelObject Kernels Ket Khinchin KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnightTourGraph KnotData KnownUnitQ KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter Label Labeled LabeledSlider LabelingFunction LabelStyle LaguerreL LambdaComponents LambertW LanczosWindow LandauDistribution Language LanguageCategory LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCM LeafCount LeapYearQ LeastSquares LeastSquaresFilterKernel Left LeftArrow LeftArrowBar LeftArrowRightArrow LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar LegendAppearance Legended LegendFunction LegendLabel LegendLayout LegendMargins LegendMarkers LegendMarkerSize LegendreP LegendreQ LegendreType Length LengthWhile LerchPhi Less LessEqual LessEqualGreater LessFullEqual LessGreater LessLess LessSlantEqual LessTilde LetterCharacter LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryFunction LibraryFunctionError LibraryFunctionInformation LibraryFunctionLoad LibraryFunctionUnload LibraryLoad LibraryUnload LicenseID LiftingFilterData LiftingWaveletTransform LightBlue LightBrown LightCyan Lighter LightGray LightGreen Lighting LightingAngle LightMagenta LightOrange LightPink LightPurple LightRed LightSources LightYellow Likelihood Limit LimitsPositioning LimitsPositioningTokens LindleyDistribution Line Line3DBox LinearFilter LinearFractionalTransform LinearModelFit LinearOffsetFunction LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBreak LinebreakAdjustments LineBreakChart LineBreakWithin LineColor LineForm LineGraph LineIndent LineIndentMaxFraction LineIntegralConvolutionPlot LineIntegralConvolutionScale LineLegend LineOpacity LineSpacing LineWrapParts LinkActivate LinkClose LinkConnect LinkConnectedQ LinkCreate LinkError LinkFlush LinkFunction LinkHost LinkInterrupt LinkLaunch LinkMode LinkObject LinkOpen LinkOptions LinkPatterns LinkProtocol LinkRead LinkReadHeld LinkReadyQ Links LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot Listen ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalClusteringCoefficient LocalizeVariables LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestAscendingSequence LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow Loopback LoopFreeGraphQ LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LyapunovSolve LyonsGroupLy MachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules MangoldtLambda ManhattanDistance Manipulate Manipulator MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixPlot MatrixPower MatrixQ MatrixRank Max MaxBend MaxDetect MaxExtraBandwidths MaxExtraConditions MaxFeatures MaxFilter Maximize MaxIterations MaxMemoryUsed MaxMixtureKernels MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxValue MaxwellDistribution McLaughlinGroupMcL Mean MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter Median MedianDeviation MedianFilter Medium MeijerG MeixnerDistribution MemberQ MemoryConstrained MemoryInUse Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuPacket MenuSortingValue MenuStyle MenuView MergeDifferences Mesh MeshFunctions MeshRange MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation Method MethodOptions MexicanHatWavelet MeyerWavelet Min MinDetect MinFilter MinimalPolynomial MinimalStateSpaceModel Minimize Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingDataMethod MittagLefflerE MixedRadix MixedRadixQuantity MixtureDistribution Mod Modal Mode Modular ModularLambda Module Modulus MoebiusMu Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction Monday Monitor MonomialList MonomialOrder MonsterGroupM MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform Most MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovingAverage MovingMedian MoyalDistribution MultiedgeStyle MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistribution N NakagamiDistribution NameQ Names NamespaceBox Nand NArgMax NArgMin NBernoulliB NCache NDSolve NDSolveValue Nearest NearestFunction NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeMultinomialDistribution NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestList NestWhile NestWhileList NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextPrime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants None NonlinearModelFit NonlocalMeansFilter NonNegative NonPositive Nor NorlundB Norm Normal NormalDistribution NormalGrouping Normalize NormalizedSquaredEuclideanDistance NormalsFunction NormFunction Not NotCongruent NotCupCap NotDoubleVerticalBar Notebook NotebookApply NotebookAutoSave NotebookClose NotebookConvertSettings NotebookCreate NotebookCreateReturnObject NotebookDefault NotebookDelete NotebookDirectory NotebookDynamicExpression NotebookEvaluate NotebookEventActions NotebookFileName NotebookFind NotebookFindReturnObject NotebookGet NotebookGetLayoutInformationPacket NotebookGetMisspellingsPacket NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde NotHumpDownHump NotHumpEqual NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessFullEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotPrecedesTilde NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms Null NullRecords NullSpace NullWords Number NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator NumberSigns NumberString Numerator NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlot O ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OddQ Off Offset OLEData On ONanGroupON OneIdentity Opacity Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering Orderless OrnsteinUhlenbeckProcess Orthogonalize Out Outer OutputAutoOverwrite OutputControllabilityMatrix OutputControllableModelQ OutputForm OutputFormData OutputGrouping OutputMathEditExpression OutputNamePacket OutputResponse OutputSizeLimit OutputStream Over OverBar OverDot Overflow OverHat Overlaps Overlay OverlayBox OverlayBoxOptions Overscript OverscriptBox OverscriptBoxOptions OverTilde OverVector OwenT OwnValues PackingMethod PaddedForm Padding PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageWidth PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParetoDistribution Part PartialCorrelationFunction PartialD ParticleData Partition PartitionsP PartitionsQ ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PerformanceGoal PeriodicInterpolation Periodogram PeriodogramArray PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PERTDistribution PetersenGraph PhaseMargins Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest Pink Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarGraphQ Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangePadding PlotRegion PlotStyle Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox PointBox PointFigureChart PointForm PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonBox PolygonBoxOptions PolygonHoleScale PolygonIntersections PolygonScale PolyhedronData PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position Positive PositiveDefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement PredictionRoot PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependTo PreserveImageOptions Previous PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitiveRoot PrincipalComponents PrincipalValue Print PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessEstimator ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptions QBinomial QFactorial QGamma QHypergeometricPFQ QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ Quantile QuantilePlot Quantity QuantityForm QuantityMagnitude QuantityQ QuantityUnit Quartics QuartileDeviation Quartiles QuartileSkewness QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainder RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Random RandomChoice RandomComplex RandomFunction RandomGraph RandomImage RandomInteger RandomPermutation RandomPrime RandomReal RandomSample RandomSeed RandomVariate RandomWalkProcess Range RangeFilter RangeSpecification RankedMax RankedMin Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios Raw RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadList ReadProtected Real RealBlockDiagonalForm RealDigits RealExponent Reals Reap Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate RegionBinarize RegionFunction RegionPlot RegionPlot3D RegularExpression Regularization Reinstall Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot Remove RemoveAlphaChannel RemoveAsynchronousTask Removed RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart Repeated RepeatedNull RepeatedString Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated Resampling Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask Residue Resolve Rest Resultant ResumePacket Return ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity Root RootApproximant RootIntervals RootLocusPlot RootMeanSquare RootOfUnityQ RootReduce Roots RootSum Rotate RotateLabel RotateLeft RotateRight RotationAction RotationBox RotationBoxOptions RotationMatrix RotationTransform Round RoundImplies RoundingRadius Row RowAlignments RowBackgrounds RowBox RowHeights RowLines RowMinHeight RowReduce RowsEqual RowSpacings RSolve RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulerUnits Run RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilarity SameQ SameTest SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveDefinitions SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTaskActiveQ ScheduledTaskData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition Sec Sech SechDistribution SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemialgebraicComponentInstances SendMail Sequence SequenceAlignment SequenceForm SequenceHold SequenceLimit Series SeriesCoefficient SeriesData SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPrecision SetProperty SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share Sharpen ShearingMatrix ShearingTransform ShenCastanMatrix Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortUpArrow Show ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiegelTheta SiegelTukeyTest Sign Signature SignedRankTest SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution Skip SliceDistribution Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDelayCompensator SmithWatermanSimilarity SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SocialMediaData Socket SokalSneathDissimilarity Solve SolveAlways SolveDelayed Sort SortBy Sound SoundAndGraphics SoundNote SoundVolume Sow Space SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution Speak SpeakTextPacket SpearmanRankTest SpearmanRho Spectrogram SpectrogramArray Specularity SpellingCorrection SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SpheroidalEigenvalue SpheroidalJoiningFactor SpheroidalPS SpheroidalPSPrime SpheroidalQS SpheroidalQSPrime SpheroidalRadialFactor SpheroidalS1 SpheroidalS1Prime SpheroidalS2 SpheroidalS2Prime Splice SplicedDistribution SplineClosed SplineDegree SplineKnots SplineWeights Split SplitBy SpokenString Sqrt SqrtBox SqrtBoxOptions Square SquaredEuclideanDistance SquareFreeQ SquareIntersection SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackInhibit StandardDeviation StandardDeviationFilter StandardForm Standardize StandbyDistribution Star StarGraph StartAsynchronousTask StartingStepSize StartOfLine StartOfString StartScheduledTask StartupSound StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringCount StringDrop StringExpression StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPosition StringQ StringReplace StringReplaceList StringReplacePart StringReverse StringRotateLeft StringRotateRight StringSkeleton StringSplit StringTake StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleBoxOptions StyleData StyleDefinitions StyleForm StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subset SubsetEqual Subsets SubStar Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde SuchThat Sum SumConvergence Sunday SuperDagger SuperMinus SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceColor SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SystemDialogInput SystemException SystemHelpPath SystemInformation SystemInformationData SystemOpen SystemOptions SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemStub Tab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeWhile Tally Tan Tanh TargetFunctions TargetUnits TautologyQ TelegraphProcess TemplateBox TemplateBoxOptions TemplateSlotSequence TemporalData Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCell TextClipboardType TextData TextForm TextJustification TextLine TextPacket TextParagraph TextRecognize TextRendering TextStyle Texture TextureCoordinateFunction TextureCoordinateScaling Therefore ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreeJSymbol Threshold Through Throw Thumbnail Thursday Ticks TicksStyle Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint Times TimesBy TimeSeriesForecast TimeSeriesInvertibility TimeUsed TimeValue TimeZone Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate ToDiscreteTimeModel ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform TopologicalSort ToRadicals ToRules ToString Total TotalHeight TotalVariationFilter TotalWidth TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField Translate TranslationTransform TransparentColor Transpose TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle TriangleWave TriangularDistribution Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean True TrueQ TruncatedDistribution TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow Tuples TuranGraph TuringMachine Transparent UnateQ Uncompress Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UndirectedEdge UndirectedGraph UndirectedGraphQ UndocumentedTestFEParserPacket UndocumentedTestGetSelectionPacket Unequal Unevaluated UniformDistribution UniformGraphDistribution UniformSumDistribution Uninstall Union UnionPlus Unique UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitTriangle UnitVector Unprotect UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpValues URL URLFetch URLFetchAsynchronous URLSave URLSaveAsynchronous UseGraphicsRange Using UsingFrontEnd V2Get ValidationLength Value ValueBox ValueBoxOptions ValueForm ValueQ ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerifyConvergence VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexCoordinateRules VertexCoordinates VertexCorrelationSimilarity VertexCosineSimilarity VertexCount VertexCoverQ VertexDataCoordinates VertexDegree VertexDelete VertexDiceSimilarity VertexEccentricity VertexInComponent VertexInDegree VertexIndex VertexJaccardSimilarity VertexLabeling VertexLabels VertexLabelStyle VertexList VertexNormals VertexOutComponent VertexOutDegree VertexQ VertexRenderingFunction VertexReplace VertexShape VertexShapeFunction VertexSize VertexStyle VertexTextureCoordinates VertexWeight Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoigtDistribution VonMisesDistribution WaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeberE Wedge Wednesday WeibullDistribution WeierstrassHalfPeriods WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WilksW WilksWTest WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult Word WordBoundary WordCharacter WordData WordSearch WordSeparators WorkingPrecision Write WriteString Wronskian XMLElement XMLObject Xnor Xor Yellow YuleDissimilarity ZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZipfDistribution ZTest ZTransform $Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AssertFunction $Assumptions $AsynchronousTask $BaseDirectory $BatchInput $BatchOutput $BoxForms $ByteOrdering $Canceled $CharacterEncoding $CharacterEncodings $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $CreationDate $CurrentLink $DateStringFormat $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $Epilog $ExportFormats $Failed $FinancialDataSource $FormatType $FrontEnd $FrontEndSession $GeoLocation $HistoryLength $HomeDirectory $HTTPCookies $IgnoreEOF $ImagingDevices $ImportFormats $InitialDirectory $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $ModuleNumber $NetworkLicense $NewMessage $NewSymbol $Notebooks $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $PipeSupported $Post $Pre $PreferencesDirectory $PrePrint $PreRead $PrintForms $PrintLiteral $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $RandomState $RecursionLimit $ReleaseNumber $RootDirectory $ScheduledTask $ScriptCommandLine $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemWordLength $TemporaryDirectory $TemporaryPrefix $TextStyle $TimedOut $TimeUnit $TimeZone $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $Urgent $UserAddOnsDirectory $UserBaseDirectory $UserDocumentsDirectory $UserName $Version $VersionNumber",c:[{cN:"comment",b:/\(\*/,e:/\*\)/},a.ASM,a.QSM,a.CNM,{cN:"list",b:/\{/,e:/\}/,i:/:/}]}});hljs.registerLanguage("tex",function(a){var d={cN:"command",b:"\\\\[a-zA-Zа-яА-я]+[\\*]?"};var c={cN:"command",b:"\\\\[^a-zA-Zа-яА-я0-9]"};var b={cN:"special",b:"[{}\\[\\]\\&#~]",r:0};return{c:[{b:"\\\\[a-zA-Zа-яА-я]+[\\*]? *= *-?\\d*\\.?\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?",rB:true,c:[d,c,{cN:"number",b:" *=",e:"-?\\d*\\.?\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?",eB:true}],r:10},d,c,b,{cN:"formula",b:"\\$\\$",e:"\\$\\$",c:[d,c,b],r:0},{cN:"formula",b:"\\$",e:"\\$",c:[d,c,b],r:0},{cN:"comment",b:"%",e:"$",r:0}]}});hljs.registerLanguage("cs",function(b){var a="abstract as base bool break byte case catch char checked const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async await ascending descending from get group into join let orderby partial select set value var where yield";return{k:a,c:[{cN:"comment",b:"///",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"///|"},{cN:"xmlDocTag",b:""}]},b.CLCM,b.CBLCLM,{cN:"preprocessor",b:"#",e:"$",k:"if else elif endif define undef warning error line region endregion pragma checksum"},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},b.ASM,b.QSM,b.CNM,{bK:"protected public private internal",e:/[{;=]/,k:a,c:[{bK:"class namespace interface",starts:{c:[b.TM]}},{b:b.IR+"\\s*\\(",rB:true,c:[b.TM]}]}]}});hljs.registerLanguage("css",function(a){var b="[a-zA-Z-][a-zA-Z0-9_-]*";var c={cN:"function",b:b+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]};return{cI:true,i:"[=/|']",c:[a.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{cN:"at_rule",b:"@",e:"[{;]",c:[{cN:"keyword",b:/\S+/},{b:/\s/,eW:true,eE:true,r:0,c:[c,a.ASM,a.QSM,a.NM]}]},{cN:"tag",b:b,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[a.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[c,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:"hexcolor",b:"#[0-9A-Fa-f]+"},{cN:"important",b:"!important"}]}}]}]}]}});hljs.registerLanguage("python",function(a){var f={cN:"prompt",b:/^(>>>|\.\.\.) /};var b={cN:"string",c:[a.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[f],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[f],r:10},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/,},{b:/(b|br)"/,e:/"/,},a.ASM,a.QSM]};var d={cN:"number",r:0,v:[{b:a.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:a.CNR+"[lLjJ]?"}]};var e={cN:"params",b:/\(/,e:/\)/,c:["self",f,d,b]};var c={e:/:/,i:/[${=;\n]/,c:[a.UTM,e]};return{k:{keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda nonlocal|10 None True False",built_in:"Ellipsis NotImplemented"},i:/(<\/|->|\?)/,c:[f,d,b,a.HCM,a.inherit(c,{cN:"function",bK:"def",r:10}),a.inherit(c,{cN:"class",bK:"class"}),{cN:"decorator",b:/@/,e:/$/},{b:/\b(print|exec)\(/}]}});hljs.registerLanguage("profile",function(a){return{c:[a.CNM,{cN:"built_in",b:"{",e:"}$",eB:true,eE:true,c:[a.ASM,a.QSM],r:0},{cN:"filename",b:"[a-zA-Z_][\\da-zA-Z_]+\\.[\\da-zA-Z_]{1,3}",e:":",eE:true},{cN:"header",b:"(ncalls|tottime|cumtime)",e:"$",k:"ncalls tottime|10 cumtime|10 filename",r:10},{cN:"summary",b:"function calls",e:"$",c:[a.CNM],r:10},a.ASM,a.QSM,{cN:"function",b:"\\(",e:"\\)$",c:[a.UTM],r:0}]}});hljs.registerLanguage("django",function(a){var b={cN:"filter",b:/\|[A-Za-z]+\:?/,k:"truncatewords removetags linebreaksbr yesno get_digit timesince random striptags filesizeformat escape linebreaks length_is ljust rjust cut urlize fix_ampersands title floatformat capfirst pprint divisibleby add make_list unordered_list urlencode timeuntil urlizetrunc wordcount stringformat linenumbers slice date dictsort dictsortreversed default_if_none pluralize lower join center default truncatewords_html upper length phone2numeric wordwrap time addslashes slugify first escapejs force_escape iriencode last safe safeseq truncatechars localize unlocalize localtime utc timezone",c:[{cN:"argument",b:/"/,e:/"/},{cN:"argument",b:/'/,e:/'/}]};return{cI:true,sL:"xml",subLanguageMode:"continuous",c:[{cN:"template_comment",b:/\{%\s*comment\s*%}/,e:/\{%\s*endcomment\s*%}/},{cN:"template_comment",b:/\{#/,e:/#}/},{cN:"template_tag",b:/\{%/,e:/%}/,k:"comment endcomment load templatetag ifchanged endifchanged if endif firstof for endfor in ifnotequal endifnotequal widthratio extends include spaceless endspaceless regroup by as ifequal endifequal ssi now with cycle url filter endfilter debug block endblock else autoescape endautoescape csrf_token empty elif endwith static trans blocktrans endblocktrans get_static_prefix get_media_prefix plural get_current_language language get_available_languages get_current_language_bidi get_language_info get_language_info_list localize endlocalize localtime endlocaltime timezone endtimezone get_current_timezone verbatim",c:[b]},{cN:"variable",b:/\{\{/,e:/}}/,c:[b]}]}});hljs.registerLanguage("nginx",function(c){var b={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+c.UIR}]};var a={eW:true,l:"[a-z/_]+",k:{built_in:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[c.HCM,{cN:"string",c:[c.BE,b],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{cN:"url",b:"([a-z]+):/",e:"\\s",eW:true,eE:true},{cN:"regexp",c:[c.BE,b],v:[{b:"\\s\\^",e:"\\s|{|;",rE:true},{b:"~\\*?\\s+",e:"\\s|{|;",rE:true},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},b]};return{c:[c.HCM,{b:c.UIR+"\\s",e:";|{",rB:true,c:[c.inherit(c.UTM,{starts:a})],r:0}],i:"[^\\s\\}]"}});hljs.registerLanguage("smalltalk",function(a){var b="[a-z][a-zA-Z0-9_]*";var d={cN:"char",b:"\\$.{1}"};var c={cN:"symbol",b:"#"+a.UIR};return{k:"self super nil true false thisContext",c:[{cN:"comment",b:'"',e:'"'},a.ASM,{cN:"class",b:"\\b[A-Z][A-Za-z0-9_]*",r:0},{cN:"method",b:b+":",r:0},a.CNM,c,d,{cN:"localvars",b:"\\|[ ]*"+b+"([ ]+"+b+")*[ ]*\\|",rB:true,e:/\|/,i:/\S/,c:[{b:"(\\|[ ]*)?"+b}]},{cN:"array",b:"\\#\\(",e:"\\)",c:[a.ASM,d,a.CNM,c]}]}});hljs.registerLanguage("sql",function(a){return{cI:true,i:/[<>]/,c:[{cN:"operator",b:"\\b(begin|end|start|commit|rollback|savepoint|lock|alter|create|drop|rename|call|delete|do|handler|insert|load|replace|select|truncate|update|set|show|pragma|grant|merge)\\b(?!:)",e:";",eW:true,k:{keyword:"all partial global month current_timestamp using go revoke smallint indicator end-exec disconnect zone with character assertion to add current_user usage input local alter match collate real then rollback get read timestamp session_user not integer bit unique day minute desc insert execute like ilike|2 level decimal drop continue isolation found where constraints domain right national some module transaction relative second connect escape close system_user for deferred section cast current sqlstate allocate intersect deallocate numeric public preserve full goto initially asc no key output collation group by union session both last language constraint column of space foreign deferrable prior connection unknown action commit view or first into float year primary cascaded except restrict set references names table outer open select size are rows from prepare distinct leading create only next inner authorization schema corresponding option declare precision immediate else timezone_minute external varying translation true case exception join hour default double scroll value cursor descriptor values dec fetch procedure delete and false int is describe char as at in varchar null trailing any absolute current_time end grant privileges when cross check write current_date pad begin temporary exec time update catalog user sql date on identity timezone_hour natural whenever interval work order cascade diagnostics nchar having left call do handler load replace truncate start lock show pragma exists number trigger if before after each row merge matched database",aggregate:"count sum min max avg"},c:[{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[a.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[a.BE]},a.CNM]},a.CBLCLM,{cN:"comment",b:"--",e:"$"}]}});hljs.registerLanguage("oxygene",function(b){var g="abstract add and array as asc aspect assembly async begin break block by case class concat const copy constructor continue create default delegate desc distinct div do downto dynamic each else empty end ensure enum equals event except exit extension external false final finalize finalizer finally flags for forward from function future global group has if implementation implements implies in index inherited inline interface into invariants is iterator join locked locking loop matching method mod module namespace nested new nil not notify nullable of old on operator or order out override parallel params partial pinned private procedure property protected public queryable raise read readonly record reintroduce remove repeat require result reverse sealed select self sequence set shl shr skip static step soft take then to true try tuple type union unit unsafe until uses using var virtual raises volatile where while with write xor yield await mapped deprecated stdcall cdecl pascal register safecall overload library platform reference packed strict published autoreleasepool selector strong weak unretained";var a={cN:"comment",b:"{",e:"}",r:0};var e={cN:"comment",b:"\\(\\*",e:"\\*\\)",r:10};var c={cN:"string",b:"'",e:"'",c:[{b:"''"}]};var d={cN:"string",b:"(#\\d+)+"};var f={cN:"function",bK:"function constructor destructor procedure method",e:"[:;]",k:"function constructor|10 destructor|10 procedure|10 method|10",c:[b.TM,{cN:"params",b:"\\(",e:"\\)",k:g,c:[c,d]},a,e]};return{cI:true,k:g,i:'("|\\$[G-Zg-z]|\\/\\*|{",e:"}"};var a={cN:"variable",v:[{b:/\$\d/},{b:/[\$\%\@\*](\^\w\b|#\w+(\:\:\w+)*|{\w+}|\w+(\:\:\w*)*)/},{b:/[\$\%\@\*][^\s\w{]/,r:0}]};var e={cN:"comment",b:"^(__END__|__DATA__)",e:"\\n$",r:5};var h=[c.BE,f,a];var b=[a,c.HCM,e,{cN:"comment",b:"^\\=\\w",e:"\\=cut",eW:true},g,{cN:"string",c:h,v:[{b:"q[qwxr]?\\s*\\(",e:"\\)",r:5},{b:"q[qwxr]?\\s*\\[",e:"\\]",r:5},{b:"q[qwxr]?\\s*\\{",e:"\\}",r:5},{b:"q[qwxr]?\\s*\\|",e:"\\|",r:5},{b:"q[qwxr]?\\s*\\<",e:"\\>",r:5},{b:"qw\\s+q",e:"q",r:5},{b:"'",e:"'",c:[c.BE]},{b:'"',e:'"'},{b:"`",e:"`",c:[c.BE]},{b:"{\\w+}",c:[],r:0},{b:"-?\\w+\\s*\\=\\>",c:[],r:0}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\/\\/|"+c.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[c.HCM,e,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[c.BE],r:0}]},{cN:"sub",bK:"sub",e:"(\\s*\\(.*?\\))?[;{]",r:5},{cN:"operator",b:"-\\w\\b",r:0}];f.c=b;g.c=b;return{k:d,c:b}});hljs.registerLanguage("ini",function(a){return{cI:true,i:/\S/,c:[{cN:"comment",b:";",e:"$"},{cN:"title",b:"^\\[",e:"\\]"},{cN:"setting",b:"^[a-z0-9\\[\\]_-]+[ \\t]*=[ \\t]*",e:"$",c:[{cN:"value",eW:true,k:"on off true false yes no",c:[a.QSM,a.NM],r:0}]}]}});hljs.registerLanguage("erlang",function(i){var c="[a-z'][a-zA-Z0-9_']*";var o="("+c+":"+c+"|"+c+")";var f={keyword:"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun let not of orelse|10 query receive rem try when xor",literal:"false true"};var l={cN:"comment",b:"%",e:"$",r:0};var e={cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0};var g={b:"fun\\s+"+c+"/\\d+"};var n={b:o+"\\(",e:"\\)",rB:true,r:0,c:[{cN:"function_name",b:o,r:0},{b:"\\(",e:"\\)",eW:true,rE:true,r:0}]};var h={cN:"tuple",b:"{",e:"}",r:0};var a={cN:"variable",b:"\\b_([A-Z][A-Za-z0-9_]*)?",r:0};var m={cN:"variable",b:"[A-Z][a-zA-Z0-9_]*",r:0};var b={b:"#"+i.UIR,r:0,rB:true,c:[{cN:"record_name",b:"#"+i.UIR,r:0},{b:"{",e:"}",r:0}]};var k={bK:"fun receive if try case",e:"end",k:f};k.c=[l,g,i.inherit(i.ASM,{cN:""}),k,n,i.QSM,e,h,a,m,b];var j=[l,g,k,n,i.QSM,e,h,a,m,b];n.c[1].c=j;h.c=j;b.c[1].c=j;var d={cN:"params",b:"\\(",e:"\\)",c:j};return{k:f,i:"(",rB:true,i:"\\(|#|//|/\\*|\\\\|:|;",c:[d,i.inherit(i.TM,{b:c})],starts:{e:";|\\.",k:f,c:j}},l,{cN:"pp",b:"^-",e:"\\.",r:0,eE:true,rB:true,l:"-"+i.IR,k:"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior",c:[d]},e,i.QSM,b,a,m,h]}});hljs.registerLanguage("1c",function(b){var f="[a-zA-Zа-яА-Я][a-zA-Z0-9_а-яА-Я]*";var c="возврат дата для если и или иначе иначеесли исключение конецесли конецпопытки конецпроцедуры конецфункции конеццикла константа не перейти перем перечисление по пока попытка прервать продолжить процедура строка тогда фс функция цикл число экспорт";var e="ansitooem oemtoansi ввестивидсубконто ввестидату ввестизначение ввестиперечисление ввестипериод ввестиплансчетов ввестистроку ввестичисло вопрос восстановитьзначение врег выбранныйплансчетов вызватьисключение датагод датамесяц датачисло добавитьмесяц завершитьработусистемы заголовоксистемы записьжурналарегистрации запуститьприложение зафиксироватьтранзакцию значениевстроку значениевстрокувнутр значениевфайл значениеизстроки значениеизстрокивнутр значениеизфайла имякомпьютера имяпользователя каталогвременныхфайлов каталогиб каталогпользователя каталогпрограммы кодсимв командасистемы конгода конецпериодаби конецрассчитанногопериодаби конецстандартногоинтервала конквартала конмесяца коннедели лев лог лог10 макс максимальноеколичествосубконто мин монопольныйрежим названиеинтерфейса названиенабораправ назначитьвид назначитьсчет найти найтипомеченныенаудаление найтиссылки началопериодаби началостандартногоинтервала начатьтранзакцию начгода начквартала начмесяца начнедели номерднягода номерднянедели номернеделигода нрег обработкаожидания окр описаниеошибки основнойжурналрасчетов основнойплансчетов основнойязык открытьформу открытьформумодально отменитьтранзакцию очиститьокносообщений периодстр полноеимяпользователя получитьвремята получитьдатута получитьдокументта получитьзначенияотбора получитьпозициюта получитьпустоезначение получитьта прав праводоступа предупреждение префиксавтонумерации пустаястрока пустоезначение рабочаядаттьпустоезначение рабочаядата разделительстраниц разделительстрок разм разобратьпозициюдокумента рассчитатьрегистрына рассчитатьрегистрыпо сигнал симв символтабуляции создатьобъект сокрл сокрлп сокрп сообщить состояние сохранитьзначение сред статусвозврата стрдлина стрзаменить стрколичествострок стрполучитьстроку стрчисловхождений сформироватьпозициюдокумента счетпокоду текущаядата текущеевремя типзначения типзначениястр удалитьобъекты установитьтана установитьтапо фиксшаблон формат цел шаблон";var a={cN:"dquote",b:'""'};var d={cN:"string",b:'"',e:'"|$',c:[a]};var g={cN:"string",b:"\\|",e:'"|$',c:[a]};return{cI:true,l:f,k:{keyword:c,built_in:e},c:[b.CLCM,b.NM,d,g,{cN:"function",b:"(процедура|функция)",e:"$",l:f,k:"процедура функция",c:[b.inherit(b.TM,{b:f}),{cN:"tail",eW:true,c:[{cN:"params",b:"\\(",e:"\\)",l:f,k:"знач",c:[d,g]},{cN:"export",b:"экспорт",eW:true,l:f,k:"экспорт",c:[b.CLCM]}]},b.CLCM]},{cN:"preprocessor",b:"#",e:"$"},{cN:"date",b:"'\\d{2}\\.\\d{2}\\.(\\d{2}|\\d{4})'"}]}});hljs.registerLanguage("haskell",function(f){var g={cN:"comment",v:[{b:"--",e:"$"},{b:"{-",e:"-}",c:["self"]}]};var e={cN:"pragma",b:"{-#",e:"#-}"};var b={cN:"preprocessor",b:"^#",e:"$"};var d={cN:"type",b:"\\b[A-Z][\\w']*",r:0};var c={cN:"container",b:"\\(",e:"\\)",i:'"',c:[e,g,b,{cN:"type",b:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},f.inherit(f.TM,{b:"[_a-z][\\w']*"})]};var a={cN:"container",b:"{",e:"}",c:c.c};return{k:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",c:[{cN:"module",b:"\\bmodule\\b",e:"where",k:"module where",c:[c,g],i:"\\W\\.|;"},{cN:"import",b:"\\bimport\\b",e:"$",k:"import|0 qualified as hiding",c:[c,g],i:"\\W\\.|;"},{cN:"class",b:"^(\\s*)?(class|instance)\\b",e:"where",k:"class family instance where",c:[d,c,g]},{cN:"typedef",b:"\\b(data|(new)?type)\\b",e:"$",k:"data family type newtype deriving",c:[e,g,d,c,a]},{cN:"default",bK:"default",e:"$",c:[d,c,g]},{cN:"infix",bK:"infix infixl infixr",e:"$",c:[f.CNM,g]},{cN:"foreign",b:"\\bforeign\\b",e:"$",k:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",c:[d,f.QSM,g]},{cN:"shebang",b:"#!\\/usr\\/bin\\/env runhaskell",e:"$"},e,g,b,f.QSM,f.CNM,d,f.inherit(f.TM,{b:"^[_a-z][\\w']*"}),{b:"->|<-"}]}});hljs.registerLanguage("delphi",function(b){var a="exports register file shl array record property for mod while set ally label uses raise not stored class safecall var interface or private static exit index inherited to else stdcall override shr asm far resourcestring finalization packed virtual out and protected library do xorwrite goto near function end div overload object unit begin string on inline repeat until destructor write message program with read initialization except default nil if case cdecl in downto threadvar of try pascal const external constructor type public then implementation finally published procedure";var e={cN:"comment",v:[{b:/\{/,e:/\}/,r:0},{b:/\(\*/,e:/\*\)/,r:10}]};var c={cN:"string",b:/'/,e:/'/,c:[{b:/''/}]};var d={cN:"string",b:/(#\d+)+/};var f={b:b.IR+"\\s*=\\s*class\\s*\\(",rB:true,c:[b.TM]};var g={cN:"function",bK:"function constructor destructor procedure",e:/[:;]/,k:"function constructor|10 destructor|10 procedure|10",c:[b.TM,{cN:"params",b:/\(/,e:/\)/,k:a,c:[c,d]},e]};return{cI:true,k:a,i:/("|\$[G-Zg-z]|\/\*|<\/)/,c:[e,b.CLCM,c,d,b.NM,f,g]}});hljs.registerLanguage("markdown",function(a){return{c:[{cN:"header",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"blockquote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"`.+?`"},{b:"^( {4}|\t)",e:"$",r:0}]},{cN:"horizontal_rule",b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].+?[\\)\\]]",rB:true,c:[{cN:"link_label",b:"\\[",e:"\\]",eB:true,rE:true,r:0},{cN:"link_url",b:"\\]\\(",e:"\\)",eB:true,eE:true},{cN:"link_reference",b:"\\]\\[",e:"\\]",eB:true,eE:true,}],r:10},{b:"^\\[.+\\]:",e:"$",rB:true,c:[{cN:"link_reference",b:"\\[",e:"\\]",eB:true,eE:true},{cN:"link_url",b:"\\s",e:"$"}]}]}});hljs.registerLanguage("avrasm",function(a){return{cI:true,k:{keyword:"adc add adiw and andi asr bclr bld brbc brbs brcc brcs break breq brge brhc brhs brid brie brlo brlt brmi brne brpl brsh brtc brts brvc brvs bset bst call cbi cbr clc clh cli cln clr cls clt clv clz com cp cpc cpi cpse dec eicall eijmp elpm eor fmul fmuls fmulsu icall ijmp in inc jmp ld ldd ldi lds lpm lsl lsr mov movw mul muls mulsu neg nop or ori out pop push rcall ret reti rjmp rol ror sbc sbr sbrc sbrs sec seh sbi sbci sbic sbis sbiw sei sen ser ses set sev sez sleep spm st std sts sub subi swap tst wdr",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r30 r31 x|0 xh xl y|0 yh yl z|0 zh zl ucsr1c udr1 ucsr1a ucsr1b ubrr1l ubrr1h ucsr0c ubrr0h tccr3c tccr3a tccr3b tcnt3h tcnt3l ocr3ah ocr3al ocr3bh ocr3bl ocr3ch ocr3cl icr3h icr3l etimsk etifr tccr1c ocr1ch ocr1cl twcr twdr twar twsr twbr osccal xmcra xmcrb eicra spmcsr spmcr portg ddrg ping portf ddrf sreg sph spl xdiv rampz eicrb eimsk gimsk gicr eifr gifr timsk tifr mcucr mcucsr tccr0 tcnt0 ocr0 assr tccr1a tccr1b tcnt1h tcnt1l ocr1ah ocr1al ocr1bh ocr1bl icr1h icr1l tccr2 tcnt2 ocr2 ocdr wdtcr sfior eearh eearl eedr eecr porta ddra pina portb ddrb pinb portc ddrc pinc portd ddrd pind spdr spsr spcr udr0 ucsr0a ucsr0b ubrr0l acsr admux adcsr adch adcl porte ddre pine pinf"},c:[a.CBLCLM,{cN:"comment",b:";",e:"$",r:0},a.CNM,a.BNM,{cN:"number",b:"\\b(\\$[a-zA-Z0-9]+|0o[0-7]+)"},a.QSM,{cN:"string",b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"},{cN:"label",b:"^[A-Za-z0-9_.$]+:"},{cN:"preprocessor",b:"#",e:"$"},{cN:"preprocessor",b:"\\.[a-zA-Z]+"},{cN:"localvars",b:"@[0-9]+"}]}});hljs.registerLanguage("lisp",function(h){var k="[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*";var l="(\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s)(\\+|\\-)?\\d+)?";var j={cN:"shebang",b:"^#!",e:"$"};var b={cN:"literal",b:"\\b(t{1}|nil)\\b"};var d={cN:"number",v:[{b:l,r:0},{b:"#b[0-1]+(/[0-1]+)?"},{b:"#o[0-7]+(/[0-7]+)?"},{b:"#x[0-9a-f]+(/[0-9a-f]+)?"},{b:"#c\\("+l+" +"+l,e:"\\)"}]};var g=h.inherit(h.QSM,{i:null});var m={cN:"comment",b:";",e:"$"};var f={cN:"variable",b:"\\*",e:"\\*"};var n={cN:"keyword",b:"[:&]"+k};var c={b:"\\(",e:"\\)",c:["self",b,g,d]};var a={cN:"quoted",c:[d,g,f,n,c],v:[{b:"['`]\\(",e:"\\)",},{b:"\\(quote ",e:"\\)",k:{title:"quote"},}]};var i={cN:"list",b:"\\(",e:"\\)"};var e={eW:true,r:0};i.c=[{cN:"title",b:k},e];e.c=[a,i,b,d,g,m,f,n];return{i:/\S/,c:[d,j,b,g,m,a,i]}});hljs.registerLanguage("vbnet",function(a){return{cI:true,k:{keyword:"addhandler addressof alias and andalso aggregate ansi as assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into is isfalse isnot istrue join key let lib like loop me mid mod module mustinherit mustoverride mybase myclass namespace narrowing new next not notinheritable notoverridable of off on operator option optional or order orelse overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim rem removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly xor",built_in:"boolean byte cbool cbyte cchar cdate cdec cdbl char cint clng cobj csbyte cshort csng cstr ctype date decimal directcast double gettype getxmlnamespace iif integer long object sbyte short single string trycast typeof uinteger ulong ushort",literal:"true false nothing"},i:"//|{|}|endif|gosub|variant|wend",c:[a.inherit(a.QSM,{c:[{b:'""'}]}),{cN:"comment",b:"'",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"'''|"},{cN:"xmlDocTag",b:""},]},a.CNM,{cN:"preprocessor",b:"#",e:"$",k:"if else elseif end region externalsource"},]}});hljs.registerLanguage("axapta",function(a){return{k:"false int abstract private char boolean static null if for true while long throw finally protected final return void enum else break new catch byte super case short default double public try this switch continue reverse firstfast firstonly forupdate nofetch sum avg minof maxof count order group by asc desc index hint like dispaly edit client server ttsbegin ttscommit str real date container anytype common div mod",c:[a.CLCM,a.CBLCLM,a.ASM,a.QSM,a.CNM,{cN:"preprocessor",b:"#",e:"$"},{cN:"class",bK:"class interface",e:"{",i:":",c:[{cN:"inheritance",bK:"extends implements",r:10},a.UTM]}]}});hljs.registerLanguage("ocaml",function(a){return{k:{keyword:"and as assert asr begin class constraint do done downto else end exception external false for fun function functor if in include inherit initializer land lazy let lor lsl lsr lxor match method mod module mutable new object of open or private rec ref sig struct then to true try type val virtual when while with parser value",built_in:"bool char float int list unit array exn option int32 int64 nativeint format4 format6 lazy_t in_channel out_channel string",},i:/\/\//,c:[{cN:"string",b:'"""',e:'"""'},{cN:"comment",b:"\\(\\*",e:"\\*\\)",c:["self"]},{cN:"class",bK:"type",e:"\\(|=|$",c:[a.UTM]},{cN:"annotation",b:"\\[<",e:">\\]"},a.CBLCLM,a.inherit(a.ASM,{i:null}),a.inherit(a.QSM,{i:null}),a.CNM]}});hljs.registerLanguage("erlang-repl",function(a){return{k:{special_functions:"spawn spawn_link self",reserved:"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor"},c:[{cN:"prompt",b:"^[0-9]+> ",r:10},{cN:"comment",b:"%",e:"$"},{cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0},a.ASM,a.QSM,{cN:"constant",b:"\\?(::)?([A-Z]\\w*(::)?)+"},{cN:"arrow",b:"->"},{cN:"ok",b:"ok"},{cN:"exclamation_mark",b:"!"},{cN:"function_or_atom",b:"(\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\b[a-z'][a-zA-Z0-9_']*)",r:0},{cN:"variable",b:"[A-Z][a-zA-Z0-9_']*",r:0}]}});hljs.registerLanguage("vala",function(a){return{k:{keyword:"char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 uint16 uint32 uint64 float double bool struct enum string void weak unowned owned async signal static abstract interface override while do for foreach else switch case break default return try catch public private protected internal using new this get set const stdout stdin stderr var",built_in:"DBus GLib CCode Gee Object",literal:"false true null"},c:[{cN:"class",bK:"class interface delegate namespace",e:"{",i:"[^,:\\n\\s\\.]",c:[a.UTM]},a.CLCM,a.CBLCLM,{cN:"string",b:'"""',e:'"""',r:5},a.ASM,a.QSM,a.CNM,{cN:"preprocessor",b:"^#",e:"$",r:2},{cN:"constant",b:" [A-Z_]+ ",r:0}]}});hljs.registerLanguage("dos",function(a){return{cI:true,k:{flow:"if else goto for in do call exit not exist errorlevel defined equ neq lss leq gtr geq",keyword:"shift cd dir echo setlocal endlocal set pause copy",stream:"prn nul lpt3 lpt2 lpt1 con com4 com3 com2 com1 aux",winutils:"ping net ipconfig taskkill xcopy ren del"},c:[{cN:"envvar",b:"%%[^ ]"},{cN:"envvar",b:"%[^ ]+?%"},{cN:"envvar",b:"![^ ]+?!"},{cN:"number",b:"\\b\\d+",r:0},{cN:"comment",b:"@?rem",e:"$"}]}});hljs.registerLanguage("clojure",function(l){var e={built_in:"def cond apply if-not if-let if not not= = < < > <= <= >= == + / * - rem quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last drop-while while intern condp case reduced cycle split-at split-with repeat replicate iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter monitor-exit defmacro defn defn- macroexpand macroexpand-1 for dosync and or when when-not when-let comp juxt partial sequence memoize constantly complement identity assert peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! assoc! dissoc! pop! disj! use class type num float double short byte boolean bigint biginteger bigdec print-method print-dup throw-if printf format load compile get-in update-in pr pr-on newline flush read slurp read-line subvec with-open memfn time re-find re-groups rand-int rand mod locking assert-valid-fdecl alias resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! new next conj set! to-array future future-call into-array aset gen-class reduce map filter find empty hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize"};var f="[a-zA-Z_0-9\\!\\.\\?\\-\\+\\*\\/\\<\\=\\>\\&\\#\\$';]+";var a="[\\s:\\(\\{]+\\d+(\\.\\d+)?";var d={cN:"number",b:a,r:0};var j=l.inherit(l.QSM,{i:null});var o={cN:"comment",b:";",e:"$",r:0};var n={cN:"collection",b:"[\\[\\{]",e:"[\\]\\}]"};var c={cN:"comment",b:"\\^"+f};var b={cN:"comment",b:"\\^\\{",e:"\\}"};var h={cN:"attribute",b:"[:]"+f};var m={cN:"list",b:"\\(",e:"\\)"};var g={eW:true,k:{literal:"true false nil"},r:0};var i={k:e,l:f,cN:"title",b:f,starts:g};m.c=[{cN:"comment",b:"comment"},i,g];g.c=[m,j,c,b,o,h,n,d];n.c=[m,j,c,o,h,n,d];return{i:/\S/,c:[o,m,{cN:"prompt",b:/^=> /,starts:{e:/\n\n|\Z/}}]}});hljs.registerLanguage("go",function(a){var b={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer",constant:"true false iota nil",typename:"bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{aliases:["golang"],k:b,i:"]/,c:[{bK:"extends implements",r:10},b.UTM]},{b:b.UIR+"\\s*\\(",rB:true,c:[b.UTM]}]},b.CNM,{cN:"annotation",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("lua",function(b){var a="\\[=*\\[";var e="\\]=*\\]";var c={b:a,e:e,c:["self"]};var d=[{cN:"comment",b:"--(?!"+a+")",e:"$"},{cN:"comment",b:"--"+a,e:e,c:[c],r:10}];return{l:b.UIR,k:{keyword:"and break do else elseif end false for if in local nil not or repeat return then true until while",built_in:"_G _VERSION assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall coroutine debug io math os package string table"},c:d.concat([{cN:"function",bK:"function",e:"\\)",c:[b.inherit(b.TM,{b:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{cN:"params",b:"\\(",eW:true,c:d}].concat(d)},b.CNM,b.ASM,b.QSM,{cN:"string",b:a,e:e,c:[c],r:10}])}});hljs.registerLanguage("rsl",function(a){return{k:{keyword:"float color point normal vector matrix while for if do return else break extern continue",built_in:"abs acos ambient area asin atan atmosphere attribute calculatenormal ceil cellnoise clamp comp concat cos degrees depth Deriv diffuse distance Du Dv environment exp faceforward filterstep floor format fresnel incident length lightsource log match max min mod noise normalize ntransform opposite option phong pnoise pow printf ptlined radians random reflect refract renderinfo round setcomp setxcomp setycomp setzcomp shadow sign sin smoothstep specular specularbrdf spline sqrt step tan texture textureinfo trace transform vtransform xcomp ycomp zcomp"},i:";/,r:0,sL:"xml"}],r:0},{cN:"function",bK:"function",e:/\{/,c:[a.inherit(a.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,c:[a.CLCM,a.CBLCLM],i:/["'\(]/}],i:/\[|%/},{b:/\$[(.]/},{b:"\\."+a.IR,r:0}]}});hljs.registerLanguage("r",function(a){var b="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{c:[a.HCM,{b:b,l:b,k:{keyword:"function if in break next repeat else for return switch while try tryCatch|10 stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...|10",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},r:0},{cN:"number",b:"0[xX][0-9a-fA-F]+[Li]?\\b",r:0},{cN:"number",b:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",r:0},{cN:"number",b:"\\d+\\.(?!\\d)(?:i\\b)?",r:0},{cN:"number",b:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{cN:"number",b:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{b:"`",e:"`",r:0},{cN:"string",c:[a.BE],v:[{b:'"',e:'"'},{b:"'",e:"'"}]}]}});hljs.registerLanguage("ruby",function(e){var h="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var g="and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor";var a={cN:"yardoctag",b:"@[A-Za-z]+"};var i={cN:"comment",v:[{b:"#",e:"$",c:[a]},{b:"^\\=begin",e:"^\\=end",c:[a],r:10},{b:"^__END__",e:"\\n$"}]};var c={cN:"subst",b:"#\\{",e:"}",k:g};var d={cN:"string",c:[e.BE,c],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:"%[qw]?\\(",e:"\\)"},{b:"%[qw]?\\[",e:"\\]"},{b:"%[qw]?{",e:"}"},{b:"%[qw]?<",e:">",r:10},{b:"%[qw]?/",e:"/",r:10},{b:"%[qw]?%",e:"%",r:10},{b:"%[qw]?-",e:"-",r:10},{b:"%[qw]?\\|",e:"\\|",r:10},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/}]};var b={cN:"params",b:"\\(",e:"\\)",k:g};var f=[d,i,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+e.IR+"::)?"+e.IR}]},i]},{cN:"function",bK:"def",e:" |$|;",r:0,c:[e.inherit(e.TM,{b:h}),b,i]},{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:[d,{b:h}],r:0},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+e.RSR+")\\s*",c:[i,{cN:"regexp",c:[e.BE,c],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}],r:0}];c.c=f;b.c=f;return{k:g,c:f}});hljs.registerLanguage("haml",function(a){return{cI:true,c:[{cN:"doctype",b:"^!!!( (5|1\\.1|Strict|Frameset|Basic|Mobile|RDFa|XML\\b.*))?$",r:10},{cN:"comment",b:"^\\s*(!=#|=#|-#|/).*$",r:0},{b:"^\\s*(-|=|!=)(?!#)",starts:{e:"\\n",sL:"ruby"}},{cN:"tag",b:"^\\s*%",c:[{cN:"title",b:"\\w+"},{cN:"value",b:"[#\\.]\\w+"},{b:"{\\s*",e:"\\s*}",eE:true,c:[{b:":\\w+\\s*=>",e:",\\s+",rB:true,eW:true,c:[{cN:"symbol",b:":\\w+"},{cN:"string",b:'"',e:'"'},{cN:"string",b:"'",e:"'"},{b:"\\w+",r:0}]}]},{b:"\\(\\s*",e:"\\s*\\)",eE:true,c:[{b:"\\w+\\s*=",e:"\\s+",rB:true,eW:true,c:[{cN:"attribute",b:"\\w+",r:0},{cN:"string",b:'"',e:'"'},{cN:"string",b:"'",e:"'"},{b:"\\w+",r:0}]},]}]},{cN:"bullet",b:"^\\s*[=~]\\s*",r:0},{b:"#{",starts:{e:"}",sL:"ruby"}}]}});hljs.registerLanguage("brainfuck",function(b){var a={cN:"literal",b:"[\\+\\-]",r:0};return{c:[{cN:"comment",b:"[^\\[\\]\\.,\\+\\-<> \r\n]",rE:true,e:"[\\[\\]\\.,\\+\\-<> \r\n]",r:0},{cN:"title",b:"[\\[\\]]",r:0},{cN:"string",b:"[\\.,]",r:0},{b:/\+\+|\-\-/,rB:true,c:[a]},a]}});hljs.registerLanguage("matlab",function(a){var b=[a.CNM,{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}]}];return{k:{keyword:"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while",built_in:"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson"},i:'(//|"|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bK:"function",e:"$",c:[a.UTM,{cN:"params",b:"\\(",e:"\\)"},{cN:"params",b:"\\[",e:"\\]"}]},{cN:"transposed_variable",b:"[a-zA-Z_][a-zA-Z_0-9]*('+[\\.']*|[\\.']+)",e:"",r:0},{cN:"matrix",b:"\\[",e:"\\]'*[\\.']*",c:b,r:0},{cN:"cell",b:"\\{",e:"\\}'*[\\.']*",c:b,i:/:/},{cN:"comment",b:"\\%",e:"$"}].concat(b)}});hljs.registerLanguage("vbscript",function(a){return{cI:true,k:{keyword:"call class const dim do loop erase execute executeglobal exit for each next function if then else on error option explicit new private property let get public randomize redim rem select case set stop sub while wend with end to elseif is or xor and not class_initialize class_terminate default preserve in me byval byref step resume goto",built_in:"lcase month vartype instrrev ubound setlocale getobject rgb getref string weekdayname rnd dateadd monthname now day minute isarray cbool round formatcurrency conversions csng timevalue second year space abs clng timeserial fixs len asc isempty maths dateserial atn timer isobject filter weekday datevalue ccur isdate instr datediff formatdatetime replace isnull right sgn array snumeric log cdbl hex chr lbound msgbox ucase getlocale cos cdate cbyte rtrim join hour oct typename trim strcomp int createobject loadpicture tan formatnumber mid scriptenginebuildversion scriptengine split scriptengineminorversion cint sin datepart ltrim sqr scriptenginemajorversion time derived eval date formatpercent exp inputbox left ascw chrw regexp server response request cstr err",literal:"true false null nothing empty"},i:"//",c:[a.inherit(a.QSM,{c:[{b:'""'}]}),{cN:"comment",b:/'/,e:/$/,r:0},a.CNM]}});hljs.registerLanguage("fsharp",function(a){return{k:"abstract and as assert base begin class default delegate do done downcast downto elif else end exception extern false finally for fun function global if in inherit inline interface internal lazy let match member module mutable namespace new null of open or override private public rec return sig static struct then to true try type upcast use val void when while with yield",c:[{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},{cN:"string",b:'"""',e:'"""'},{cN:"comment",b:"\\(\\*",e:"\\*\\)"},{cN:"class",bK:"type",e:"\\(|=|$",c:[a.UTM]},{cN:"annotation",b:"\\[<",e:">\\]"},{cN:"attribute",b:"\\B('[A-Za-z])\\b",c:[a.BE]},a.CLCM,a.inherit(a.QSM,{i:null}),a.CNM]}});hljs.registerLanguage("makefile",function(a){var b={cN:"variable",b:/\$\(/,e:/\)/,c:[a.BE]};return{c:[a.HCM,{b:/^\w+\s*\W*=/,rB:true,r:0,starts:{cN:"constant",e:/\s*\W*=/,eE:true,starts:{e:/$/,r:0,c:[b],}}},{cN:"title",b:/^[\w]+:\s*$/},{cN:"phony",b:/^\.PHONY:/,e:/$/,k:".PHONY",l:/[\.\w]+/},{b:/^\t+/,e:/$/,c:[a.QSM,b]}]}});hljs.registerLanguage("diff",function(a){return{c:[{cN:"chunk",r:10,v:[{b:/^\@\@ +\-\d+,\d+ +\+\d+,\d+ +\@\@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"header",v:[{b:/Index: /,e:/$/},{b:/=====/,e:/=====$/},{b:/^\-\-\-/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+\+\+/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"change",b:"^\\!",e:"$"}]}});hljs.registerLanguage("rib",function(a){return{k:"ArchiveRecord AreaLightSource Atmosphere Attribute AttributeBegin AttributeEnd Basis Begin Blobby Bound Clipping ClippingPlane Color ColorSamples ConcatTransform Cone CoordinateSystem CoordSysTransform CropWindow Curves Cylinder DepthOfField Detail DetailRange Disk Displacement Display End ErrorHandler Exposure Exterior Format FrameAspectRatio FrameBegin FrameEnd GeneralPolygon GeometricApproximation Geometry Hider Hyperboloid Identity Illuminate Imager Interior LightSource MakeCubeFaceEnvironment MakeLatLongEnvironment MakeShadow MakeTexture Matte MotionBegin MotionEnd NuPatch ObjectBegin ObjectEnd ObjectInstance Opacity Option Orientation Paraboloid Patch PatchMesh Perspective PixelFilter PixelSamples PixelVariance Points PointsGeneralPolygons PointsPolygons Polygon Procedural Projection Quantize ReadArchive RelativeDetail ReverseOrientation Rotate Scale ScreenWindow ShadingInterpolation ShadingRate Shutter Sides Skew SolidBegin SolidEnd Sphere SubdivisionMesh Surface TextureCoordinates Torus Transform TransformBegin TransformEnd TransformPoints Translate TrimCurve WorldBegin WorldEnd",i:"/};var c={cN:"string",c:[b.BE,a],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},b.inherit(b.ASM,{i:null}),b.inherit(b.QSM,{i:null})]};var d={v:[b.BNM,b.CNM]};return{cI:true,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[b.CLCM,b.HCM,{cN:"comment",b:"/\\*",e:"\\*/",c:[{cN:"phpdoc",b:"\\s@[A-Za-z]+"},a]},{cN:"comment",b:"__halt_compiler.+?;",eW:true,k:"__halt_compiler",l:b.UIR},{cN:"string",b:"<<<['\"]?\\w+['\"]?$",e:"^\\w+;",c:[b.BE]},a,e,{cN:"function",bK:"function",e:/[;{]/,i:"\\$|\\[|%",c:[b.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",e,b.CBLCLM,c,d]}]},{cN:"class",bK:"class interface",e:"{",i:/[:\(\$"]/,c:[{bK:"extends implements",r:10},b.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[b.UTM]},{bK:"use",e:";",c:[b.UTM]},{b:"=>"},c,d]}});hljs.registerLanguage("cmake",function(a){return{cI:true,k:{keyword:"add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_subdirectory add_test aux_source_directory break build_command cmake_minimum_required cmake_policy configure_file create_test_sourcelist define_property else elseif enable_language enable_testing endforeach endfunction endif endmacro endwhile execute_process export find_file find_library find_package find_path find_program fltk_wrap_ui foreach function get_cmake_property get_directory_property get_filename_component get_property get_source_file_property get_target_property get_test_property if include include_directories include_external_msproject include_regular_expression install link_directories load_cache load_command macro mark_as_advanced message option output_required_files project qt_wrap_cpp qt_wrap_ui remove_definitions return separate_arguments set set_directory_properties set_property set_source_files_properties set_target_properties set_tests_properties site_name source_group string target_link_libraries try_compile try_run unset variable_watch while build_name exec_program export_library_dependencies install_files install_programs install_targets link_libraries make_directory remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or",operator:"equal less greater strless strgreater strequal matches"},c:[{cN:"envvar",b:"\\${",e:"}"},a.HCM,a.QSM,a.NM]}});hljs.registerLanguage("bash",function(b){var a={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)\}/}]};var d={cN:"string",b:/"/,e:/"/,c:[b.BE,a,{cN:"variable",b:/\$\(/,e:/\)/,c:[b.BE]}]};var c={cN:"string",b:/'/,e:/'/};return{l:/-?[a-z\.]+/,k:{keyword:"if then else elif fi for break continue while in do done exit return set declare case esac export exec",literal:"true false",built_in:"printf echo read cd pwd pushd popd dirs let eval unset typeset readonly getopts source shopt caller type hash bind help sudo",operator:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"shebang",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:true,c:[b.inherit(b.TM,{b:/\w[\w\d_]*/})],r:0},b.HCM,b.NM,d,c,a]}});hljs.registerLanguage("applescript",function(a){var b=a.inherit(a.QSM,{i:""});var d={cN:"params",b:"\\(",e:"\\)",c:["self",a.CNM,b]};var c=[{cN:"comment",b:"--",e:"$",},{cN:"comment",b:"\\(\\*",e:"\\*\\)",c:["self",{b:"--",e:"$"}]},a.HCM];return{k:{keyword:"about above after against and around as at back before beginning behind below beneath beside between but by considering contain contains continue copy div does eighth else end equal equals error every exit fifth first for fourth from front get given global if ignoring in into is it its last local me middle mod my ninth not of on onto or over prop property put ref reference repeat returning script second set seventh since sixth some tell tenth that the then third through thru timeout times to transaction try until where while whose with without",constant:"AppleScript false linefeed return pi quote result space tab true",type:"alias application boolean class constant date file integer list number real record string text",command:"activate beep count delay launch log offset read round run say summarize write",property:"character characters contents day frontmost id item length month name paragraph paragraphs rest reverse running time version weekday word words year"},c:[b,a.CNM,{cN:"type",b:"\\bPOSIX file\\b"},{cN:"command",b:"\\b(clipboard info|the clipboard|info for|list (disks|folder)|mount volume|path to|(close|open for) access|(get|set) eof|current date|do shell script|get volume settings|random number|set volume|system attribute|system info|time to GMT|(load|run|store) script|scripting components|ASCII (character|number)|localized string|choose (application|color|file|file name|folder|from list|remote application|URL)|display (alert|dialog))\\b|^\\s*return\\b"},{cN:"constant",b:"\\b(text item delimiters|current application|missing value)\\b"},{cN:"keyword",b:"\\b(apart from|aside from|instead of|out of|greater than|isn't|(doesn't|does not) (equal|come before|come after|contain)|(greater|less) than( or equal)?|(starts?|ends|begins?) with|contained by|comes (before|after)|a (ref|reference))\\b"},{cN:"property",b:"\\b(POSIX path|(date|time) string|quoted form)\\b"},{cN:"function_start",bK:"on",i:"[${=;\\n]",c:[a.UTM,d]}].concat(c),i:"//"}});hljs.registerLanguage("vhdl",function(a){return{cI:true,k:{keyword:"abs access after alias all and architecture array assert attribute begin block body buffer bus case component configuration constant context cover disconnect downto default else elsif end entity exit fairness file for force function generate generic group guarded if impure in inertial inout is label library linkage literal loop map mod nand new next nor not null of on open or others out package port postponed procedure process property protected pure range record register reject release rem report restrict restrict_guarantee return rol ror select sequence severity shared signal sla sll sra srl strong subtype then to transport type unaffected units until use variable vmode vprop vunit wait when while with xnor xor",typename:"boolean bit character severity_level integer time delay_length natural positive string bit_vector file_open_kind file_open_status std_ulogic std_ulogic_vector std_logic std_logic_vector unsigned signed boolean_vector integer_vector real_vector time_vector"},i:"{",c:[a.CBLCLM,{cN:"comment",b:"--",e:"$"},a.QSM,a.CNM,{cN:"literal",b:"'(U|X|0|1|Z|W|L|H|-)'",c:[a.BE]},{cN:"attribute",b:"'[A-Za-z](_?[A-Za-z0-9])*",c:[a.BE]}]}});hljs.registerLanguage("parser3",function(a){return{sL:"xml",r:0,c:[{cN:"comment",b:"^#",e:"$"},{cN:"comment",b:"\\^rem{",e:"}",r:10,c:[{b:"{",e:"}",c:["self"]}]},{cN:"preprocessor",b:"^@(?:BASE|USE|CLASS|OPTIONS)$",r:10},{cN:"title",b:"@[\\w\\-]+\\[[\\w^;\\-]*\\](?:\\[[\\w^;\\-]*\\])?(?:.*)$"},{cN:"variable",b:"\\$\\{?[\\w\\-\\.\\:]+\\}?"},{cN:"keyword",b:"\\^[\\w\\-\\.\\:]+"},{cN:"number",b:"\\^#[0-9a-fA-F]+"},a.CNM]}});hljs.registerLanguage("scala",function(a){var c={cN:"annotation",b:"@[A-Za-z]+"};var b={cN:"string",b:'u?r?"""',e:'"""',r:10};return{k:"type yield lazy override def with val var false true sealed abstract private trait object null if for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws",c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"@[A-Za-z]+"}],r:10},a.CLCM,a.CBLCLM,b,a.ASM,a.QSM,{cN:"class",b:"((case )?class |object |trait )",e:"({|$)",i:":",k:"case class trait object",c:[{bK:"extends with",r:10},a.UTM,{cN:"params",b:"\\(",e:"\\)",c:[a.ASM,a.QSM,b,c]}]},a.CNM,c]}});hljs.registerLanguage("cpp",function(a){var b={keyword:"false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long throw volatile static protected bool template mutable if public friend do return goto auto void enum else break new extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex _Complex _Imaginary",built_in:"std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf"};return{aliases:["c"],k:b,i:"",i:"\\n"},a.CLCM]},{cN:"stl_container",b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:b,r:10,c:["self"]}]}}); \ No newline at end of file diff --git a/htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/highlightjs/styles/github.css b/htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/highlightjs/styles/github.css deleted file mode 100644 index b1efcdb2480..00000000000 --- a/htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/highlightjs/styles/github.css +++ /dev/null @@ -1,125 +0,0 @@ -/* - -github.com style (c) Vasily Polovnyov - -*/ - -div.phpdebugbar .hljs { - display: block; padding: 0.5em; - color: #333; - background: #f8f8f8 -} - -div.phpdebugbar .hljs-comment, -div.phpdebugbar .hljs-template_comment, -div.phpdebugbar .diff .hljs-header, -div.phpdebugbar .hljs-javadoc { - color: #998; - font-style: italic -} - -div.phpdebugbar .hljs-keyword, -div.phpdebugbar .css .rule .hljs-keyword, -div.phpdebugbar .hljs-winutils, -div.phpdebugbar .javascript .hljs-title, -div.phpdebugbar .nginx .hljs-title, -div.phpdebugbar .hljs-subst, -div.phpdebugbar .hljs-request, -div.phpdebugbar .hljs-status { - color: #333; - font-weight: bold -} - -div.phpdebugbar .hljs-number, -div.phpdebugbar .hljs-hexcolor, -div.phpdebugbar .ruby .hljs-constant { - color: #099; -} - -div.phpdebugbar .hljs-string, -div.phpdebugbar .hljs-tag .hljs-value, -div.phpdebugbar .hljs-phpdoc, -div.phpdebugbar .tex .hljs-formula { - color: #d14 -} - -div.phpdebugbar .hljs-title, -div.phpdebugbar .hljs-id, -div.phpdebugbar .coffeescript .hljs-params, -div.phpdebugbar .scss .hljs-preprocessor { - color: #900; - font-weight: bold -} - -div.phpdebugbar .javascript .hljs-title, -div.phpdebugbar .lisp .hljs-title, -div.phpdebugbar .clojure .hljs-title, -div.phpdebugbar .hljs-subst { - font-weight: normal -} - -div.phpdebugbar .hljs-class .hljs-title, -div.phpdebugbar .haskell .hljs-type, -div.phpdebugbar .vhdl .hljs-literal, -div.phpdebugbar .tex .hljs-command { - color: #458; - font-weight: bold -} - -div.phpdebugbar .hljs-tag, -div.phpdebugbar .hljs-tag .hljs-title, -div.phpdebugbar .hljs-rules .hljs-property, -div.phpdebugbar .django .hljs-tag .hljs-keyword { - color: #000080; - font-weight: normal -} - -div.phpdebugbar .hljs-attribute, -div.phpdebugbar .hljs-variable, -div.phpdebugbar .lisp .hljs-body { - color: #008080 -} - -div.phpdebugbar .hljs-regexp { - color: #009926 -} - -div.phpdebugbar .hljs-symbol, -div.phpdebugbar .ruby .hljs-symbol .hljs-string, -div.phpdebugbar .lisp .hljs-keyword, -div.phpdebugbar .tex .hljs-special, -div.phpdebugbar .hljs-prompt { - color: #990073 -} - -div.phpdebugbar .hljs-built_in, -div.phpdebugbar .lisp .hljs-title, -div.phpdebugbar .clojure .hljs-built_in { - color: #0086b3 -} - -div.phpdebugbar .hljs-preprocessor, -div.phpdebugbar .hljs-pragma, -div.phpdebugbar .hljs-pi, -div.phpdebugbar .hljs-doctype, -div.phpdebugbar .hljs-shebang, -div.phpdebugbar .hljs-cdata { - color: #999; - font-weight: bold -} - -div.phpdebugbar .hljs-deletion { - background: #fdd -} - -div.phpdebugbar .hljs-addition { - background: #dfd -} - -div.phpdebugbar .diff .hljs-change { - background: #0086b3 -} - -div.phpdebugbar .hljs-chunk { - color: #aaa -} diff --git a/htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/jquery/dist/jquery.min.js b/htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/jquery/dist/jquery.min.js deleted file mode 100644 index 4d9b3a25875..00000000000 --- a/htdocs/includes/maximebf/debugbar/src/DebugBar/Resources/vendor/jquery/dist/jquery.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b="3.3.1",w=function(e,t){return new w.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:"3.3.1",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="
",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w("'."\n"; diff --git a/htdocs/admin/system/database.php b/htdocs/admin/system/database.php index 8cd1ad3d597..fd983a10924 100644 --- a/htdocs/admin/system/database.php +++ b/htdocs/admin/system/database.php @@ -113,7 +113,8 @@ if (!count($listofvars) && !count($listofstatus)) { if ($key != $param) { continue; } - $val2 = ${$val['var']}; + $tmpvar = $val['var']; + $val2 = ${$tmpvar}; $text = 'Should be in line with value of param '.$val['var'].' thas is '.($val2 ? $val2 : "'' (=".$val['valifempty'].")").''; $show = 1; } diff --git a/htdocs/admin/webhook.php b/htdocs/admin/webhook.php index b589eac4079..6ba932c007b 100644 --- a/htdocs/admin/webhook.php +++ b/htdocs/admin/webhook.php @@ -293,14 +293,14 @@ if ($action == 'edit') { if ($val['type'] == 'textarea') { print '\n"; } elseif ($val['type']== 'html') { require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php'; - $doleditor = new DolEditor($constname, $conf->global->{$constname}, '', 160, 'dolibarr_notes', '', false, false, $conf->fckeditor->enabled, ROWS_5, '90%'); + $doleditor = new DolEditor($constname, getDolGlobalString($constname), '', 160, 'dolibarr_notes', '', false, false, $conf->fckeditor->enabled, ROWS_5, '90%'); $doleditor->Create(); } elseif ($val['type'] == 'yesno') { - print $form->selectyesno($constname, $conf->global->{$constname}, 1); + print $form->selectyesno($constname, getDolGlobalString($constname), 1); } elseif (preg_match('/emailtemplate:/', $val['type'])) { include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php'; $formmail = new FormMail($db); @@ -382,9 +382,9 @@ if ($action == 'edit') { print ''; if ($val['type'] == 'textarea') { - print dol_nl2br($conf->global->{$constname}); + print dol_nl2br(getDolGlobalString($constname)); } elseif ($val['type']== 'html') { - print $conf->global->{$constname}; + print getDolGlobalString($constname); } elseif ($val['type'] == 'yesno') { print ajax_constantonoff($constname); } elseif (preg_match('/emailtemplate:/', $val['type'])) { @@ -393,14 +393,14 @@ if ($action == 'edit') { $tmp = explode(':', $val['type']); - $template = $formmail->getEMailTemplate($db, $tmp[1], $user, $langs, $conf->global->{$constname}); + $template = $formmail->getEMailTemplate($db, $tmp[1], $user, $langs, getDolGlobalString($constname)); if ($template<0) { setEventMessages(null, $formmail->errors, 'errors'); } print $langs->trans($template->label); } elseif (preg_match('/category:/', $val['type'])) { $c = new Categorie($db); - $result = $c->fetch($conf->global->{$constname}); + $result = $c->fetch(getDolGlobalString($constname)); if ($result < 0) { setEventMessages(null, $c->errors, 'errors'); } elseif ($result > 0 ) { @@ -412,25 +412,25 @@ if ($action == 'edit') { print '

    ' . implode(' ', $toprint) . '
'; } } elseif (preg_match('/thirdparty_type/', $val['type'])) { - if ($conf->global->{$constname}==2) { + if (getDolGlobalInt($constname)==2) { print $langs->trans("Prospect"); - } elseif ($conf->global->{$constname}==3) { + } elseif (getDolGlobalInt($constname)==3) { print $langs->trans("ProspectCustomer"); - } elseif ($conf->global->{$constname}==1) { + } elseif (getDolGlobalInt($constname)==1) { print $langs->trans("Customer"); - } elseif ($conf->global->{$constname}==0) { + } elseif (getDolGlobalInt($constname)==0) { print $langs->trans("NorProspectNorCustomer"); } } elseif ($val['type'] == 'product') { $product = new Product($db); - $resprod = $product->fetch($conf->global->{$constname}); + $resprod = $product->fetch(getDolGlobalInt($constname)); if ($resprod > 0) { print $product->ref; } elseif ($resprod < 0) { setEventMessages(null, $object->errors, "errors"); } } else { - print $conf->global->{$constname}; + print getDolGlobalString($constname); } print ''; } diff --git a/htdocs/asset/admin/setup.php b/htdocs/asset/admin/setup.php index 965566c3a74..deb4b0da346 100644 --- a/htdocs/asset/admin/setup.php +++ b/htdocs/asset/admin/setup.php @@ -473,14 +473,14 @@ if ($action == 'edit') { if ($val['type'] == 'textarea') { print '\n"; } elseif ($val['type']== 'html') { require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php'; - $doleditor = new DolEditor($constname, $conf->global->{$constname}, '', 160, 'dolibarr_notes', '', false, false, $conf->fckeditor->enabled, ROWS_5, '90%'); + $doleditor = new DolEditor($constname, getDolGlobalString($constname), '', 160, 'dolibarr_notes', '', false, false, $conf->fckeditor->enabled, ROWS_5, '90%'); $doleditor->Create(); } elseif ($val['type'] == 'yesno') { - print $form->selectyesno($constname, $conf->global->{$constname}, 1); + print $form->selectyesno($constname, getDolGlobalString($constname), 1); } elseif (preg_match('/emailtemplate:/', $val['type'])) { include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php'; $formmail = new FormMail($db); @@ -500,7 +500,7 @@ if ($action == 'edit') { $arrayofmessagename[$modelmail->id] = $langs->trans(preg_replace('/\(|\)/', '', $modelmail->label)) . $moreonlabel; } } - print $form->selectarray($constname, $arrayofmessagename, $conf->global->{$constname}, 'None', 0, 0, '', 0, 0, 0, '', '', 1); + print $form->selectarray($constname, $arrayofmessagename, getDolGlobalString($constname), 'None', 0, 0, '', 0, 0, 0, '', '', 1); } elseif (preg_match('/category:/', $val['type'])) { require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; @@ -508,11 +508,11 @@ if ($action == 'edit') { $tmp = explode(':', $val['type']); print img_picto('', 'category', 'class="pictofixedwidth"'); - print $formother->select_categories($tmp[1], $conf->global->{$constname}, $constname, 0, $langs->trans('CustomersProspectsCategoriesShort')); + print $formother->select_categories($tmp[1], getDolGlobalString($constname), $constname, 0, $langs->trans('CustomersProspectsCategoriesShort')); } elseif (preg_match('/thirdparty_type/', $val['type'])) { require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; $formcompany = new FormCompany($db); - print $formcompany->selectProspectCustomerType($conf->global->{$constname}, $constname); + print $formcompany->selectProspectCustomerType(getDolGlobalString($constname), $constname); } elseif ($val['type'] == 'securekey') { print ''; if (!empty($conf->use_javascript_ajax)) { @@ -524,11 +524,11 @@ if ($action == 'edit') { print dolJSToSetRandomPassword($constname, 'generate_token'.$constname); } elseif ($val['type'] == 'product') { if (isModEnabled("product") || isModEnabled("service")) { - $selected = (empty($conf->global->$constname) ? '' : $conf->global->$constname); + $selected = getDolGlobalString($constname); $form->select_produits($selected, $constname, '', 0); } } elseif ($val['type'] == 'accountancy_code') { - $selected = (empty($conf->global->$constname) ? '' : $conf->global->$constname); + $selected = getDolGlobalString($constname); if (isModEnabled('accounting')) { require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; $formaccounting = new FormAccounting($db); @@ -537,7 +537,7 @@ if ($action == 'edit') { print ''; } } elseif ($val['type'] == 'accountancy_category') { - $selected = (empty($conf->global->$constname) ? '' : $conf->global->$constname); + $selected = getDolGlobalString($constname); if (isModEnabled('accounting')) { print ''; // autosuggest from existing account types if found @@ -587,9 +587,9 @@ if ($action == 'edit') { print ''; if ($val['type'] == 'textarea') { - print dol_nl2br($conf->global->{$constname}); + print dol_nl2br(getDolGlobalString($constname)); } elseif ($val['type']== 'html') { - print $conf->global->{$constname}; + print getDolGlobalString($constname); } elseif ($val['type'] == 'yesno') { print ajax_constantonoff($constname); } elseif (preg_match('/emailtemplate:/', $val['type'])) { @@ -598,14 +598,14 @@ if ($action == 'edit') { $tmp = explode(':', $val['type']); - $template = $formmail->getEMailTemplate($db, $tmp[1], $user, $langs, $conf->global->{$constname}); + $template = $formmail->getEMailTemplate($db, $tmp[1], $user, $langs, getDolGlobalString($constname)); if ($template<0) { setEventMessages(null, $formmail->errors, 'errors'); } print $langs->trans($template->label); } elseif (preg_match('/category:/', $val['type'])) { $c = new Categorie($db); - $result = $c->fetch($conf->global->{$constname}); + $result = $c->fetch(getDolGlobalInt($constname)); if ($result < 0) { setEventMessages(null, $c->errors, 'errors'); } elseif ($result > 0 ) { @@ -617,18 +617,18 @@ if ($action == 'edit') { print '
    ' . implode(' ', $toprint) . '
'; } } elseif (preg_match('/thirdparty_type/', $val['type'])) { - if ($conf->global->{$constname}==2) { + if (getDolGlobalInt($constname)==2) { print $langs->trans("Prospect"); - } elseif ($conf->global->{$constname}==3) { + } elseif (getDolGlobalInt($constname)==3) { print $langs->trans("ProspectCustomer"); - } elseif ($conf->global->{$constname}==1) { + } elseif (getDolGlobalInt($constname)==1) { print $langs->trans("Customer"); - } elseif ($conf->global->{$constname}==0) { + } elseif (getDolGlobalInt($constname)==0) { print $langs->trans("NorProspectNorCustomer"); } } elseif ($val['type'] == 'product') { $product = new Product($db); - $resprod = $product->fetch($conf->global->{$constname}); + $resprod = $product->fetch(getDolGlobalInt($constname)); if ($resprod > 0) { print $product->ref; } elseif ($resprod < 0) { @@ -638,11 +638,11 @@ if ($action == 'edit') { if (isModEnabled('accounting')) { require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingaccount.class.php'; $accountingaccount = new AccountingAccount($db); - $accountingaccount->fetch('', $conf->global->{$constname}, 1); + $accountingaccount->fetch('', getDolGlobalString($constname), 1); print $accountingaccount->getNomUrl(0, 1, 1, '', 1); } else { - print $conf->global->{$constname}; + print getDolGlobalString($constname); } } else { print $conf->global->{$constname}; diff --git a/htdocs/comm/action/card.php b/htdocs/comm/action/card.php index f0399fa6350..d1329e40454 100644 --- a/htdocs/comm/action/card.php +++ b/htdocs/comm/action/card.php @@ -1602,7 +1602,7 @@ if ($action == 'create') { $("#select_actioncommsendmodel_mail").closest("tr").show(); } else { $("#select_actioncommsendmodel_mail").closest("tr").hide(); - }; + } }); })'; print ''."\n"; @@ -2104,7 +2104,7 @@ if ($id > 0) { $("#select_actioncommsendmodel_mail").closest("tr").show(); } else { $("#select_actioncommsendmodel_mail").closest("tr").hide(); - }; + } }); })'; diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index 383cf7581e9..a644880282b 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -1898,7 +1898,7 @@ if ($action == 'create' && $usercancreate) { if ($soc->fetch_optionals() > 0) { $object->array_options = array_merge($object->array_options, $soc->array_options); } - }; + } print $object->showOptionals($extrafields, 'create', $parameters); } diff --git a/htdocs/compta/bank/treso.php b/htdocs/compta/bank/treso.php index d3e573f21bf..e75402ba429 100644 --- a/htdocs/compta/bank/treso.php +++ b/htdocs/compta/bank/treso.php @@ -353,10 +353,10 @@ if (GETPOST("account") || GETPOST("ref")) { print "".$refcomp.""; if ($tmpobj->total_ttc < 0) { print ''.price(abs($total_ttc))." "; - }; + } if ($tmpobj->total_ttc >= 0) { print ' '.price($total_ttc).""; - }; + } print ''.price($solde).''; print ""; } diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index e28e5427c0b..14f82abe1a4 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -3357,7 +3357,7 @@ if ($action == 'create') { jQuery(".checkforselect").prop("disabled", false); jQuery(".checkforselect").prop("checked", true); } - }; + } }); '; @@ -3780,7 +3780,7 @@ if ($action == 'create') { if ($soc->fetch_optionals() > 0) { $object->array_options = array_merge($object->array_options, $soc->array_options); } - }; + } print $object->showOptionals($extrafields, 'create', $parameters); } diff --git a/htdocs/compta/tva/card.php b/htdocs/compta/tva/card.php index e7c7678b818..1cd655603bc 100644 --- a/htdocs/compta/tva/card.php +++ b/htdocs/compta/tva/card.php @@ -405,7 +405,7 @@ if ($action == 'create') { $("#label_type_payment").removeClass("fieldrequired"); $(".hide_if_no_auto_create_payment").hide(); } - }; + } $("#radiopayment").click(function() { $("#label").val($(this).data("label")); }); diff --git a/htdocs/core/class/commondocgenerator.class.php b/htdocs/core/class/commondocgenerator.class.php index 82012400f68..88ee43fd713 100644 --- a/htdocs/core/class/commondocgenerator.class.php +++ b/htdocs/core/class/commondocgenerator.class.php @@ -687,7 +687,7 @@ abstract class CommonDocGenerator $resql = $this->db->fetch_object($resql); foreach ($extralabels as $key => $label) { - $resarray['line_product_supplier_'.$key] = $resql->{$key}; + $resarray['line_product_supplier_'.$key] = $resql->$key; } } } diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 686d500875a..a6eac03cadc 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -8228,7 +8228,7 @@ class Form return { q: params.term, // search term page: params.page - }; + } }, processResults: function (data) { // parse the results into the format expected by Select2. @@ -8480,14 +8480,14 @@ class Form $out .= 'function formatResult(record, container) {'."\n"; $out .= ' if ($(record.element).attr("data-html") != undefined) return htmlEntityDecodeJs($(record.element).attr("data-html")); // If property html set, we decode html entities and use this'."\n"; $out .= ' return record.text;'; - $out .= '};'."\n"; + $out .= '}'."\n"; $out .= 'function formatSelection(record) {'."\n"; if ($elemtype == 'category') { $out .= 'return \' \'+record.text+\'\';'; } else { $out .= 'return record.text;'; } - $out .= '};'."\n"; + $out .= '}'."\n"; $out .= '$(document).ready(function () { $(\'#'.$htmlname.'\').'.$tmpplugin.'({'; if ($placeholder) { diff --git a/htdocs/core/class/html.formactions.class.php b/htdocs/core/class/html.formactions.class.php index 364a638e13f..90c9857992a 100644 --- a/htdocs/core/class/html.formactions.class.php +++ b/htdocs/core/class/html.formactions.class.php @@ -115,7 +115,7 @@ class FormActions $('.hideifna').show(); } else { - if (defaultvalue == 50 && (percentage.val() == 0 || percentage.val() == 100)) { percentage.val(50) }; + if (defaultvalue == 50 && (percentage.val() == 0 || percentage.val() == 100)) { percentage.val(50); } percentage.removeAttr('disabled'); $('.hideifna').show(); } diff --git a/htdocs/core/class/html.formcompany.class.php b/htdocs/core/class/html.formcompany.class.php index 5f27cbf3477..82ab8031155 100644 --- a/htdocs/core/class/html.formcompany.class.php +++ b/htdocs/core/class/html.formcompany.class.php @@ -690,7 +690,7 @@ class FormCompany extends Form } } ); - }; + } }); '; } diff --git a/htdocs/core/class/html.formsetup.class.php b/htdocs/core/class/html.formsetup.class.php index c57ee0c5106..eb389454f82 100644 --- a/htdocs/core/class/html.formsetup.class.php +++ b/htdocs/core/class/html.formsetup.class.php @@ -662,7 +662,7 @@ class FormSetupItem { global $conf; if (isset($conf->global->{$this->confKey})) { - $this->fieldValue = $conf->global->{$this->confKey}; + $this->fieldValue = getDolGlobalString($this->confKey); return true; } else { $this->fieldValue = null; diff --git a/htdocs/core/class/html.formticket.class.php b/htdocs/core/class/html.formticket.class.php index eb0c7668d8c..0aa2c39de91 100644 --- a/htdocs/core/class/html.formticket.class.php +++ b/htdocs/core/class/html.formticket.class.php @@ -362,7 +362,7 @@ class FormTicket print ' '; } diff --git a/htdocs/core/modules/import/import_csv.modules.php b/htdocs/core/modules/import/import_csv.modules.php index e1699660acc..f204acd4747 100644 --- a/htdocs/core/modules/import/import_csv.modules.php +++ b/htdocs/core/modules/import/import_csv.modules.php @@ -1039,4 +1039,4 @@ class ImportCsv extends ModeleImports function cleansep($value) { return str_replace(array(',', ';'), '/', $value); -}; +} diff --git a/htdocs/core/tpl/objectline_create.tpl.php b/htdocs/core/tpl/objectline_create.tpl.php index f008aacc10e..69e5795a881 100644 --- a/htdocs/core/tpl/objectline_create.tpl.php +++ b/htdocs/core/tpl/objectline_create.tpl.php @@ -511,7 +511,7 @@ if ((isModEnabled("service") || ($object->element == 'contrat')) && $dateSelecto print $form->selectDate($date_start, 'date_start', empty($conf->global->MAIN_USE_HOURMIN_IN_DATE_RANGE) ? 0 : 1, empty($conf->global->MAIN_USE_HOURMIN_IN_DATE_RANGE) ? 0 : 1, 1, "addproduct", 1, 0); print ' '.$langs->trans('to').' '; print $form->selectDate($date_end, 'date_end', empty($conf->global->MAIN_USE_HOURMIN_IN_DATE_RANGE) ? 0 : 1, empty($conf->global->MAIN_USE_HOURMIN_IN_DATE_RANGE) ? 0 : 1, 1, "addproduct", 1, 0); - }; + } if ($prefillDates) { echo ' '.$langs->trans('FillWithLastServiceDates').''; diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index b193048047a..43262e4f3e3 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -2212,7 +2212,7 @@ if ($action == 'create') { jQuery(".checkforselect").prop("disabled", false); jQuery(".checkforselect").prop("checked", true); } - }; + } }); '; diff --git a/htdocs/hrm/compare.php b/htdocs/hrm/compare.php index 686d5820695..d1dde23a63c 100644 --- a/htdocs/hrm/compare.php +++ b/htdocs/hrm/compare.php @@ -319,11 +319,11 @@ function rate(&$TMergedSkills, $field) foreach ($TMergedSkills as $id => &$sk) { $class = "note"; $how_many = 0; - if (empty($sk->{$field})) { + if (empty($sk->$field)) { $note = 'x'; $class .= ' none'; } else { - $note = $sk->{$field}; + $note = $sk->$field; $how_many = ($field === 'rate1') ? $sk->how_many_max1 : $sk->how_many_max2; } diff --git a/htdocs/imports/import.php b/htdocs/imports/import.php index 9a33bd25c05..579fdb74c4a 100644 --- a/htdocs/imports/import.php +++ b/htdocs/imports/import.php @@ -1354,7 +1354,7 @@ if ($step == 4 && $datatoimport) { print ' $("select.targetselectchange").find(\'option[value="\'+value+\'"]:not(:selected)\').prop("disabled", true);'."\n"; // Set to disabled except if currently selected print ' }'."\n"; print ' });'."\n"; - print '};'."\n"; + print '}'."\n"; // Function to save the selection in database print 'function saveSelection() {'."\n"; @@ -1402,7 +1402,7 @@ if ($step == 4 && $datatoimport) { } "; - print '};'."\n"; + print '}'."\n"; // If we make a change on a selectbox print '$(".targetselectchange").change(function(){'."\n"; diff --git a/htdocs/index.php b/htdocs/index.php index 06a829ea4b5..e0001adba5e 100644 --- a/htdocs/index.php +++ b/htdocs/index.php @@ -806,23 +806,15 @@ function getWeatherStatus($totallate) $used_conf = empty($conf->global->MAIN_USE_METEO_WITH_PERCENTAGE) ? 'MAIN_METEO_LEVEL' : 'MAIN_METEO_PERCENTAGE_LEVEL'; - $level0 = $offset; $weather->level = 0; - if (!empty($conf->global->{$used_conf.'0'})) { - $level0 = $conf->global->{$used_conf.'0'}; - } + $level0 = $offset; + $level0 = getDolGlobalString($used_conf.'0', $level0); $level1 = $offset + 1 * $factor; - if (!empty($conf->global->{$used_conf.'1'})) { - $level1 = $conf->global->{$used_conf.'1'}; - } + $level1 = getDolGlobalString($used_conf.'1', $level1); $level2 = $offset + 2 * $factor; - if (!empty($conf->global->{$used_conf.'2'})) { - $level2 = $conf->global->{$used_conf.'2'}; - } + $level2 = getDolGlobalString($used_conf.'2', $level2); $level3 = $offset + 3 * $factor; - if (!empty($conf->global->{$used_conf.'3'})) { - $level3 = $conf->global->{$used_conf.'3'}; - } + $level3 = getDolGlobalString($used_conf.'3', $level3); if ($totallate <= $level0) { $weather->picto = 'weather-clear.png'; diff --git a/htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_MyModuleTriggers.class.php b/htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_MyModuleTriggers.class.php index 8f7764ad100..c51bc01376c 100644 --- a/htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_MyModuleTriggers.class.php +++ b/htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_MyModuleTriggers.class.php @@ -107,7 +107,7 @@ class InterfaceMyModuleTriggers extends DolibarrTriggers ); return call_user_func($callback, $action, $object, $user, $langs, $conf); - }; + } // Or you can execute some code here switch ($action) { diff --git a/htdocs/multicurrency/class/multicurrency.class.php b/htdocs/multicurrency/class/multicurrency.class.php index 8b42f7cb25b..4305aed6f3b 100644 --- a/htdocs/multicurrency/class/multicurrency.class.php +++ b/htdocs/multicurrency/class/multicurrency.class.php @@ -615,8 +615,8 @@ class MultiCurrency extends CommonObject if ($conf->currency != $conf->global->MULTICURRENCY_APP_SOURCE) { $alternate_source = 'USD'.$conf->currency; - if (!empty($TRate->{$alternate_source})) { - $coef = $TRate->USDUSD / $TRate->{$alternate_source}; + if (!empty($TRate->$alternate_source)) { + $coef = $TRate->USDUSD / $TRate->$alternate_source; foreach ($TRate as $attr => &$rate) { $rate *= $coef; } diff --git a/htdocs/product/price.php b/htdocs/product/price.php index 0424ddaf830..788857dfd47 100644 --- a/htdocs/product/price.php +++ b/htdocs/product/price.php @@ -1529,7 +1529,7 @@ if ($action == 'edit_price' && $object->getRights()->creer) { otherPrices.show(); minPrice1.show(); } - }; + } jQuery(document).ready(function () { showHidePriceRules(); diff --git a/htdocs/product/stock/replenish.php b/htdocs/product/stock/replenish.php index d1644623ce1..2520eb8f559 100644 --- a/htdocs/product/stock/replenish.php +++ b/htdocs/product/stock/replenish.php @@ -78,12 +78,12 @@ while ($tmpobj = $db->fetch_object($resWar)) { $listofqualifiedwarehousesid .= $tmpobj->rowid; $lastWarehouseID = $tmpobj->rowid; $count++; -}; +} //MultiCompany : If only 1 Warehouse is visible, filter will automatically be set to it. if ($count == 1 && (empty($fk_entrepot) || $fk_entrepot <= 0) && !empty($conf->global->MULTICOMPANY_PRODUCT_SHARING_ENABLED)) { $fk_entrepot = $lastWarehouseID; -}; +} $texte = ''; diff --git a/htdocs/projet/card.php b/htdocs/projet/card.php index e7467176c10..96b4aa0b03b 100644 --- a/htdocs/projet/card.php +++ b/htdocs/projet/card.php @@ -968,7 +968,7 @@ if ($action == 'create' && $user->rights->projet->creer) { console.log("Hide opportunities fields "+jQuery("#usage_opportunity").prop("checked")); jQuery(".classuseopportunity").hide(); } - }; + } });'; print ''; print '
'; @@ -994,7 +994,7 @@ if ($action == 'create' && $user->rights->projet->creer) { console.log("Hide task fields "+jQuery("#usage_task").prop("checked")); jQuery(".classusetask").hide(); } - }; + } });'; print ''; print '
'; @@ -1020,7 +1020,7 @@ if ($action == 'create' && $user->rights->projet->creer) { console.log("Hide bill time fields "+jQuery("#usage_bill_time").prop("checked")); jQuery(".classusebilltime").hide(); } - }; + } });'; print ''; print '
'; @@ -1046,7 +1046,7 @@ if ($action == 'create' && $user->rights->projet->creer) { console.log("Hide organize event fields "+jQuery("#usage_organize_event").prop("checked")); jQuery(".classuseorganizeevent").hide(); } - }; + } });'; print ''; } diff --git a/htdocs/projet/class/task.class.php b/htdocs/projet/class/task.class.php index 91333c153f8..458921adfc6 100644 --- a/htdocs/projet/class/task.class.php +++ b/htdocs/projet/class/task.class.php @@ -1025,7 +1025,8 @@ class Task extends CommonObjectLine if (!empty($extrafields->attributes['projet']['label'])) { foreach ($extrafields->attributes['projet']['label'] as $key => $val) { if ($extrafields->attributes['projet']['type'][$key] != 'separate') { - $tasks[$i]->{'options_'.$key} = $obj->{'options_'.$key}; + $tmpvar = 'options_'.$key; + $tasks[$i]->{'options_'.$key} = $obj->$tmpvar; } } } @@ -1033,7 +1034,8 @@ class Task extends CommonObjectLine if (!empty($extrafields->attributes['projet_task']['label'])) { foreach ($extrafields->attributes['projet_task']['label'] as $key => $val) { if ($extrafields->attributes['projet_task']['type'][$key] != 'separate') { - $tasks[$i]->{'options_'.$key} = $obj->{'options_'.$key}; + $tmpvar = 'options_'.$key; + $tasks[$i]->{'options_'.$key} = $obj->$tmpvar; } } } diff --git a/htdocs/projet/jsgantt_language.js.php b/htdocs/projet/jsgantt_language.js.php index 35ab1132ae7..93b9ee5505f 100644 --- a/htdocs/projet/jsgantt_language.js.php +++ b/htdocs/projet/jsgantt_language.js.php @@ -67,7 +67,7 @@ var vLangs={'getDefaultLang(1); ?>': 'sunday':'transnoentities('Sunday'); ?>','monday':'transnoentities('Monday'); ?>','tuesday':'transnoentities('Tuesday'); ?>','wednesday':'transnoentities('Wednesday'); ?>','thursday':'transnoentities('Thursday'); ?>','friday':'transnoentities('Friday'); ?>','saturday':'transnoentities('Saturday'); ?>', 'sun':'transnoentities('SundayMin'); ?>','mon':'transnoentities('MondayMin'); ?>','tue':'transnoentities('TuesdayMin'); ?>','wed':'transnoentities('WednesdayMin'); ?>','thu':'transnoentities('ThursdayMin'); ?>','fri':'transnoentities('FridayMin'); ?>','sat':'transnoentities('SaturdayMin'); ?>' } -}; +} var vLang='getDefaultLang(1); ?>'; global->MEMBER_SKIP_TABLE) || !empty($conf->global->MEMBER_NEW if (jQuery("#morphy").val() == \'mor\') { jQuery("#trcompany").show(); } - }; + } initmorphy(); jQuery("#morphy").change(function() { initmorphy(); diff --git a/htdocs/public/payment/newpayment.php b/htdocs/public/payment/newpayment.php index 79104817e77..e9823f2d0f7 100644 --- a/htdocs/public/payment/newpayment.php +++ b/htdocs/public/payment/newpayment.php @@ -2395,7 +2395,7 @@ if (preg_match('/^dopayment/', $action)) { // If we choosed/click on the payme color: '#fa755a', iconColor: '#fa755a' } - }; + } var cardElement = elements.create('card', {style: style}); @@ -2435,7 +2435,7 @@ if (preg_match('/^dopayment/', $action)) { // If we choosed/click on the payme ?> var cardButton = document.getElementById('buttontopay'); var clientSecret = cardButton.dataset.secret; - var options = { clientSecret: clientSecret,}; + var options = { clientSecret: clientSecret }; // Create an instance of Elements var elements = stripe.elements(options); @@ -2465,7 +2465,7 @@ if (preg_match('/^dopayment/', $action)) { // If we choosed/click on the payme color: '#fa755a', iconColor: '#fa755a' } - }; + } displayCanvasExists($action)) { data: function (params) { return { newcompany: params.term // search term - }; + } }, processResults: function (data, params) { return { results: data - }; + } }, cache: true }, @@ -2150,7 +2150,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { { jQuery(".visibleifsupplier").show(); } - }; + } $("#selectcountry_id").change(function() { document.formsoc.action.value="edit"; diff --git a/htdocs/takepos/admin/terminal.php b/htdocs/takepos/admin/terminal.php index fe03139c8a3..f93608d20b8 100644 --- a/htdocs/takepos/admin/terminal.php +++ b/htdocs/takepos/admin/terminal.php @@ -268,7 +268,7 @@ if (isModEnabled('stock')) { } print ''; - $disabled = $conf->global->{'CASHDESK_NO_DECREASE_STOCK'.$terminal}; + $disabled = getDolGlobalString('CASHDESK_NO_DECREASE_STOCK'.$terminal); print ''.$langs->trans("CashDeskIdWareHouse").''; // Force warehouse (this is not a default value) diff --git a/htdocs/takepos/index.php b/htdocs/takepos/index.php index dc2bd8b684a..fb3049715cf 100644 --- a/htdocs/takepos/index.php +++ b/htdocs/takepos/index.php @@ -956,7 +956,7 @@ $( document ).ready(function() { return { vertical:container.scrollHeight > container.clientHeight, horizontal:container.scrollWidth > container.clientWidth - }; + } } $(window).resize(function(){ diff --git a/htdocs/takepos/invoice.php b/htdocs/takepos/invoice.php index ccc1fde97eb..ea262a1562f 100644 --- a/htdocs/takepos/invoice.php +++ b/htdocs/takepos/invoice.php @@ -174,12 +174,12 @@ if (empty($reshook)) { $bankaccount = GETPOST('accountid', 'int'); } else { if ($pay == 'LIQ') { - $bankaccount = $conf->global->{'CASHDESK_ID_BANKACCOUNT_CASH'.$_SESSION["takeposterminal"]}; // For backward compatibility + $bankaccount = getDolGlobalString('CASHDESK_ID_BANKACCOUNT_CASH'.$_SESSION["takeposterminal"]); // For backward compatibility } elseif ($pay == "CHQ") { - $bankaccount = $conf->global->{'CASHDESK_ID_BANKACCOUNT_CHEQUE'.$_SESSION["takeposterminal"]}; // For backward compatibility + $bankaccount = getDolGlobalString('CASHDESK_ID_BANKACCOUNT_CHEQUE'.$_SESSION["takeposterminal"]); // For backward compatibility } else { $accountname = "CASHDESK_ID_BANKACCOUNT_".$pay.$_SESSION["takeposterminal"]; - $bankaccount = $conf->global->$accountname; + $bankaccount = getDolGlobalString($accountname); } } @@ -217,13 +217,6 @@ if (empty($reshook)) { $invoice->update($user); } - //$sav_FACTURE_ADDON = ''; - //if (!empty($conf->global->TAKEPOS_ADDON)) { - // $sav_FACTURE_ADDON = $conf->global->FACTURE_ADDON; - // if ($conf->global->TAKEPOS_ADDON == "terminal") $conf->global->FACTURE_ADDON = $conf->global->{'TAKEPOS_ADDON'.$_SESSION["takeposterminal"]}; - // else $conf->global->FACTURE_ADDON = $conf->global->TAKEPOS_ADDON; - //} - $constantforkey = 'CASHDESK_NO_DECREASE_STOCK'.$_SESSION["takeposterminal"]; if ($error) { dol_htmloutput_errors($errormsg, null, 1); diff --git a/htdocs/takepos/smpcb.php b/htdocs/takepos/smpcb.php index 505ec27c1b0..6ce39d39bf0 100644 --- a/htdocs/takepos/smpcb.php +++ b/htdocs/takepos/smpcb.php @@ -71,7 +71,7 @@ if (GETPOST('smp-status')) { print ''; print "Transaction status registered, you can close this"; diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 52a9f941cfe..4e90bbb1bd9 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -3371,24 +3371,36 @@ class User extends CommonObject $socialnetworks = getArrayOfSocialNetworks(); - $this->firstname = $ldapuser->{$conf->global->LDAP_FIELD_FIRSTNAME}; - $this->lastname = $ldapuser->{$conf->global->LDAP_FIELD_NAME}; - $this->login = $ldapuser->{$conf->global->LDAP_FIELD_LOGIN}; - $this->pass = $ldapuser->{$conf->global->LDAP_FIELD_PASSWORD}; - $this->pass_indatabase_crypted = $ldapuser->{$conf->global->LDAP_FIELD_PASSWORD_CRYPTED}; + $tmpvar = getDolGlobalString('LDAP_FIELD_FIRSTNAME'); + $this->firstname = $ldapuser->$tmpvar; + $tmpvar = getDolGlobalString('LDAP_FIELD_NAME'); + $this->lastname = $ldapuser->$tmpvar; + $tmpvar = getDolGlobalString('LDAP_FIELD_LOGIN'); + $this->login = $ldapuser->$tmpvar; + $tmpvar = getDolGlobalString('LDAP_FIELD_PASSWORD'); + $this->pass = $ldapuser->$tmpvar; + $tmpvar = getDolGlobalString('LDAP_FIELD_PASSWORD_CRYPTED'); + $this->pass_indatabase_crypted = $ldapuser->$tmpvar; - $this->office_phone = $ldapuser->{$conf->global->LDAP_FIELD_PHONE}; - $this->user_mobile = $ldapuser->{$conf->global->LDAP_FIELD_MOBILE}; - $this->office_fax = $ldapuser->{$conf->global->LDAP_FIELD_FAX}; - $this->email = $ldapuser->{$conf->global->LDAP_FIELD_MAIL}; + $tmpvar = getDolGlobalString('LDAP_FIELD_PHONE'); + $this->office_phone = $ldapuser->$tmpvar; + $tmpvar = getDolGlobalString('LDAP_FIELD_MOBILE'); + $this->user_mobile = $ldapuser->$tmpvar; + $tmpvar = getDolGlobalString('LDAP_FIELD_FAX'); + $this->office_fax = $ldapuser->$tmpvar; + $tmpvar = getDolGlobalString('LDAP_FIELD_MAIL'); + $this->email = $ldapuser->$tmpvar; foreach ($socialnetworks as $key => $value) { - $tmpkey = 'LDAP_FIELD_'.strtoupper($value['label']); - $this->socialnetworks[$value['label']] = $ldapuser->{$conf->global->$tmpkey}; + $tmpvar = getDolGlobalString('LDAP_FIELD_'.strtoupper($value['label'])); + $this->socialnetworks[$value['label']] = $ldapuser->$tmpvar; } - $this->ldap_sid = $ldapuser->{$conf->global->LDAP_FIELD_SID}; + $tmpvar = getDolGlobalString('LDAP_FIELD_SID'); + $this->ldap_sid = $ldapuser->$tmpvar; - $this->job = $ldapuser->{$conf->global->LDAP_FIELD_TITLE}; - $this->note_public = $ldapuser->{$conf->global->LDAP_FIELD_DESCRIPTION}; + $tmpvar = getDolGlobalString('LDAP_FIELD_TITLE'); + $this->job = $ldapuser->$tmpvar; + $tmpvar = getDolGlobalString('LDAP_FIELD_DESCRIPTION'); + $this->note_public = $ldapuser->$tmpvar; $result = $this->update($user); diff --git a/htdocs/webservices/server_thirdparty.php b/htdocs/webservices/server_thirdparty.php index 800c2e0e2a2..1fe15576860 100644 --- a/htdocs/webservices/server_thirdparty.php +++ b/htdocs/webservices/server_thirdparty.php @@ -736,7 +736,7 @@ function getListOfThirdParties($authentication, $filterthirdparty) if (isset($extrafields->attributes[$elementtype]['label']) && is_array($extrafields->attributes[$elementtype]['label']) && count($extrafields->attributes[$elementtype]['label'])) { foreach ($extrafields->attributes[$elementtype]['label'] as $key => $label) { if (isset($obj->{$key})) { - $extrafieldsOptions['options_'.$key] = $obj->{$key}; + $extrafieldsOptions['options_'.$key] = $obj->$key; } } } diff --git a/htdocs/website/index.php b/htdocs/website/index.php index ae3362ab9d6..2cb775019e6 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -3294,7 +3294,7 @@ if (!GETPOST('hide_websitemenu')) { } isEditingEnabled = false; } - }; + } }); '; print $langs->trans("EditInLine"); From 0db5c98941af8e63aa64b2fb67d952f16a8222bf Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 30 Dec 2022 18:46:36 +0100 Subject: [PATCH 0462/1128] Clean code --- htdocs/societe/card.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php index a5b6f21b31b..bb9d2376a47 100644 --- a/htdocs/societe/card.php +++ b/htdocs/societe/card.php @@ -3313,11 +3313,6 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { if (empty($conf->global->SOCIETE_DISABLE_CONTACTS)) { $result = show_contacts($conf, $langs, $db, $object, $_SERVER["PHP_SELF"].'?socid='.$object->id); } - - // Addresses list - if (!empty($conf->global->SOCIETE_ADDRESSES_MANAGEMENT)) { - $result = show_addresses($conf, $langs, $db, $object, $_SERVER["PHP_SELF"].'?socid='.$object->id); - } } } From 67fea77e07023e9c9e3d7c368d3891d536193783 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 30 Dec 2022 18:48:45 +0100 Subject: [PATCH 0463/1128] Fix warning --- htdocs/takepos/invoice.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/takepos/invoice.php b/htdocs/takepos/invoice.php index ccc1fde97eb..4dcd9645350 100644 --- a/htdocs/takepos/invoice.php +++ b/htdocs/takepos/invoice.php @@ -174,12 +174,12 @@ if (empty($reshook)) { $bankaccount = GETPOST('accountid', 'int'); } else { if ($pay == 'LIQ') { - $bankaccount = $conf->global->{'CASHDESK_ID_BANKACCOUNT_CASH'.$_SESSION["takeposterminal"]}; // For backward compatibility + $bankaccount = getDolGlobalString('CASHDESK_ID_BANKACCOUNT_CASH'.$_SESSION["takeposterminal"]); // For backward compatibility } elseif ($pay == "CHQ") { - $bankaccount = $conf->global->{'CASHDESK_ID_BANKACCOUNT_CHEQUE'.$_SESSION["takeposterminal"]}; // For backward compatibility + $bankaccount = getDolGlobalString('CASHDESK_ID_BANKACCOUNT_CHEQUE'.$_SESSION["takeposterminal"]); // For backward compatibility } else { $accountname = "CASHDESK_ID_BANKACCOUNT_".$pay.$_SESSION["takeposterminal"]; - $bankaccount = $conf->global->$accountname; + $bankaccount = getDolGlobalString($accountname); } } From c593d990e458305ca1efc967effa7356befe5d60 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 30 Dec 2022 18:52:19 +0100 Subject: [PATCH 0464/1128] Clean deprecated code for adodbtime --- htdocs/core/lib/functions.lib.php | 102 +++++++----------- .../class/partnershiputils.class.php | 2 +- 2 files changed, 42 insertions(+), 62 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 9f67a0e3909..de329ee515f 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -2647,12 +2647,6 @@ function dol_print_date($time, $format = '', $tzoutput = 'auto', $outputlangs = $format = str_replace('%A', '__A__', $format); } - $useadodb = getDolGlobalInt('MAIN_USE_LEGACY_ADODB_FOR_DATE', 0); - //$useadodb = 1; // To switch to adodb - if (!empty($useadodb)) { - include_once DOL_DOCUMENT_ROOT.'/includes/adodbtime/adodb-time.inc.php'; - } - // Analyze date $reg = array(); if (preg_match('/^([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])$/i', $time, $reg)) { // Deprecated. Ex: 1970-01-01, 1970-01-01 01:00:00, 19700101010000 @@ -2671,14 +2665,37 @@ function dol_print_date($time, $format = '', $tzoutput = 'auto', $outputlangs = $ssec = (!empty($reg[6]) ? $reg[6] : ''); $time = dol_mktime($shour, $smin, $ssec, $smonth, $sday, $syear, true); - if (empty($useadodb)) { + + if ($to_gmt) { + $tzo = new DateTimeZone('UTC'); // when to_gmt is true, base for offsettz and offsetdst (so timetouse) is UTC + } else { + $tzo = new DateTimeZone(date_default_timezone_get()); // when to_gmt is false, base for offsettz and offsetdst (so timetouse) is PHP server + } + $dtts = new DateTime(); + $dtts->setTimestamp($time); + $dtts->setTimezone($tzo); + $newformat = str_replace( + array('%Y', '%y', '%m', '%d', '%H', '%I', '%M', '%S', '%p', 'T', 'Z', '__a__', '__A__', '__b__', '__B__'), + array('Y', 'y', 'm', 'd', 'H', 'h', 'i', 's', 'A', '__£__', '__$__', '__{__', '__}__', '__[__', '__]__'), + $format); + $ret = $dtts->format($newformat); + $ret = str_replace( + array('__£__', '__$__', '__{__', '__}__', '__[__', '__]__'), + array('T', 'Z', '__a__', '__A__', '__b__', '__B__'), + $ret + ); + } else { + // Date is a timestamps + if ($time < 100000000000) { // Protection against bad date values + $timetouse = $time + $offsettz + $offsetdst; // TODO We could be able to disable use of offsettz and offsetdst to use only offsettzstring. + if ($to_gmt) { $tzo = new DateTimeZone('UTC'); // when to_gmt is true, base for offsettz and offsetdst (so timetouse) is UTC } else { $tzo = new DateTimeZone(date_default_timezone_get()); // when to_gmt is false, base for offsettz and offsetdst (so timetouse) is PHP server } $dtts = new DateTime(); - $dtts->setTimestamp($time); + $dtts->setTimestamp($timetouse); $dtts->setTimezone($tzo); $newformat = str_replace( array('%Y', '%y', '%m', '%d', '%H', '%I', '%M', '%S', '%p', 'T', 'Z', '__a__', '__A__', '__b__', '__B__'), @@ -2688,36 +2705,8 @@ function dol_print_date($time, $format = '', $tzoutput = 'auto', $outputlangs = $ret = str_replace( array('__£__', '__$__', '__{__', '__}__', '__[__', '__]__'), array('T', 'Z', '__a__', '__A__', '__b__', '__B__'), - $ret); - } else { - $ret = adodb_strftime($format, $time + $offsettz + $offsetdst, $to_gmt); - } - } else { - // Date is a timestamps - if ($time < 100000000000) { // Protection against bad date values - $timetouse = $time + $offsettz + $offsetdst; // TODO We could be able to disable use of offsettz and offsetdst to use only offsettzstring. - - if (empty($useadodb)) { - if ($to_gmt) { - $tzo = new DateTimeZone('UTC'); // when to_gmt is true, base for offsettz and offsetdst (so timetouse) is UTC - } else { - $tzo = new DateTimeZone(date_default_timezone_get()); // when to_gmt is false, base for offsettz and offsetdst (so timetouse) is PHP server - } - $dtts = new DateTime(); - $dtts->setTimestamp($timetouse); - $dtts->setTimezone($tzo); - $newformat = str_replace( - array('%Y', '%y', '%m', '%d', '%H', '%I', '%M', '%S', '%p', 'T', 'Z', '__a__', '__A__', '__b__', '__B__'), - array('Y', 'y', 'm', 'd', 'H', 'h', 'i', 's', 'A', '__£__', '__$__', '__{__', '__}__', '__[__', '__]__'), - $format); - $ret = $dtts->format($newformat); - $ret = str_replace( - array('__£__', '__$__', '__{__', '__}__', '__[__', '__]__'), - array('T', 'Z', '__a__', '__A__', '__b__', '__B__'), - $ret); - } else { - $ret = adodb_strftime($format, $timetouse, $to_gmt); // If to_gmt = false then adodb_strftime use TZ of server - } + $ret + ); //var_dump($ret);exit; } else { $ret = 'Bad value '.$time.' for date'; @@ -2727,20 +2716,15 @@ function dol_print_date($time, $format = '', $tzoutput = 'auto', $outputlangs = if (preg_match('/__b__/i', $format)) { $timetouse = $time + $offsettz + $offsetdst; // TODO We could be able to disable use of offsettz and offsetdst to use only offsettzstring. - if (empty($useadodb)) { - if ($to_gmt) { - $tzo = new DateTimeZone('UTC'); // when to_gmt is true, base for offsettz and offsetdst (so timetouse) is UTC - } else { - $tzo = new DateTimeZone(date_default_timezone_get()); // when to_gmt is false, base for offsettz and offsetdst (so timetouse) is PHP server - } - $dtts = new DateTime(); - $dtts->setTimestamp($timetouse); - $dtts->setTimezone($tzo); - $month = $dtts->format("m"); + if ($to_gmt) { + $tzo = new DateTimeZone('UTC'); // when to_gmt is true, base for offsettz and offsetdst (so timetouse) is UTC } else { - // After this ret is string in PHP setup language (strftime was used). Now we convert to $outputlangs. - $month = adodb_strftime('%m', $timetouse, $to_gmt); // If to_gmt = false then adodb_strftime use TZ of server + $tzo = new DateTimeZone(date_default_timezone_get()); // when to_gmt is false, base for offsettz and offsetdst (so timetouse) is PHP server } + $dtts = new DateTime(); + $dtts->setTimestamp($timetouse); + $dtts->setTimezone($tzo); + $month = $dtts->format("m"); $month = sprintf("%02d", $month); // $month may be return with format '06' on some installation and '6' on other, so we force it to '06'. if ($encodetooutput) { $monthtext = $outputlangs->transnoentities('Month'.$month); @@ -2759,19 +2743,15 @@ function dol_print_date($time, $format = '', $tzoutput = 'auto', $outputlangs = //print "time=$time offsettz=$offsettz offsetdst=$offsetdst offsettzstring=$offsettzstring"; $timetouse = $time + $offsettz + $offsetdst; // TODO Replace this with function Date PHP. We also should not use anymore offsettz and offsetdst but only offsettzstring. - if (empty($useadodb)) { - if ($to_gmt) { - $tzo = new DateTimeZone('UTC'); - } else { - $tzo = new DateTimeZone(date_default_timezone_get()); - } - $dtts = new DateTime(); - $dtts->setTimestamp($timetouse); - $dtts->setTimezone($tzo); - $w = $dtts->format("w"); + if ($to_gmt) { + $tzo = new DateTimeZone('UTC'); } else { - $w = adodb_strftime('%w', $timetouse, $to_gmt); // If to_gmt = false then adodb_strftime use TZ of server + $tzo = new DateTimeZone(date_default_timezone_get()); } + $dtts = new DateTime(); + $dtts->setTimestamp($timetouse); + $dtts->setTimezone($tzo); + $w = $dtts->format("w"); $dayweek = $outputlangs->transnoentitiesnoconv('Day'.$w); $ret = str_replace('__A__', $dayweek, $ret); diff --git a/htdocs/partnership/class/partnershiputils.class.php b/htdocs/partnership/class/partnershiputils.class.php index 647d1492ced..86722ed1da2 100644 --- a/htdocs/partnership/class/partnershiputils.class.php +++ b/htdocs/partnership/class/partnershiputils.class.php @@ -395,7 +395,7 @@ class PartnershipUtils /** * Action to check if Dolibarr backlink not found on partner website * - * @param $website Website Partner's website + * @param string $website Partner's website URL * @return int 0 if KO, 1 if OK */ private function checkDolibarrBacklink($website = null) From 9e235f916f98f1e5ebdad7323e8425c7709bde26 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 30 Dec 2022 19:06:04 +0100 Subject: [PATCH 0465/1128] Fix var --- htdocs/core/modules/modWorkflow.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/modWorkflow.class.php b/htdocs/core/modules/modWorkflow.class.php index 58da4876d32..1fd6a89e66a 100644 --- a/htdocs/core/modules/modWorkflow.class.php +++ b/htdocs/core/modules/modWorkflow.class.php @@ -95,7 +95,7 @@ class modWorkflow extends DolibarrModules 8=>array('WORKFLOW_INVOICE_AMOUNT_CLASSIFY_BILLED_SUPPLIER_ORDER', 'chaine', '1', 'WORKFLOW_INVOICE_AMOUNT_CLASSIFY_BILLED_SUPPLIER_ORDER', 0, 'current', 0), 10=>array('WORKFLOW_TICKET_LINK_CONTRACT', 'chaine', '0', 'Automatically link a ticket to available contracts', 0, 'current', 0), 11=>array('WORKFLOW_TICKET_USE_PARENT_COMPANY_CONTRACTS', 'chaine', '0', 'Search among parent companies contracts when automatically linking a ticket to available contracts', 0, 'current', 0), - 11=>array('WORKFLOW_TICKET_CREATE_INTERVENTION', 'chaine', '1', 'WORKFLOW_TICKET_CREATE_INTERVENTION', 0, 'current', 0) + 12=>array('WORKFLOW_TICKET_CREATE_INTERVENTION', 'chaine', '0', 'WORKFLOW_TICKET_CREATE_INTERVENTION', 0, 'current', 0) ); // Boxes From c5ca50b5db78fa3298420fefcfac7f7ad9f3d7b9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 30 Dec 2022 19:27:13 +0100 Subject: [PATCH 0466/1128] Fix warning --- htdocs/compta/facture/class/facture-rec.class.php | 3 +-- htdocs/ticket/class/ticket.class.php | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/htdocs/compta/facture/class/facture-rec.class.php b/htdocs/compta/facture/class/facture-rec.class.php index 3a586dfc3e5..f02850492b5 100644 --- a/htdocs/compta/facture/class/facture-rec.class.php +++ b/htdocs/compta/facture/class/facture-rec.class.php @@ -188,13 +188,12 @@ class FactureRec extends CommonInvoice 'note_private' =>array('type'=>'text', 'label'=>'NotePrivate', 'enabled'=>1, 'visible'=>0, 'position'=>105), 'note_public' =>array('type'=>'text', 'label'=>'NotePublic', 'enabled'=>1, 'visible'=>0, 'position'=>110), 'modelpdf' =>array('type'=>'varchar(255)', 'label'=>'Modelpdf', 'enabled'=>1, 'visible'=>-1, 'position'=>115), - 'date_last_gen' =>array('type'=>'varchar(7)', 'label'=>'Last gen', 'enabled'=>1, 'visible'=>-1, 'position'=>120), - 'unit_frequency' =>array('type'=>'varchar(2)', 'label'=>'Unit frequency', 'enabled'=>1, 'visible'=>-1, 'position'=>125), 'date_when' =>array('type'=>'datetime', 'label'=>'Date when', 'enabled'=>1, 'visible'=>-1, 'position'=>130), 'date_last_gen' =>array('type'=>'datetime', 'label'=>'Date last gen', 'enabled'=>1, 'visible'=>-1, 'position'=>135), 'nb_gen_done' =>array('type'=>'integer', 'label'=>'Nb gen done', 'enabled'=>1, 'visible'=>-1, 'position'=>140), 'nb_gen_max' =>array('type'=>'integer', 'label'=>'Nb gen max', 'enabled'=>1, 'visible'=>-1, 'position'=>145), 'frequency' =>array('type'=>'integer', 'label'=>'Frequency', 'enabled'=>1, 'visible'=>-1, 'position'=>150), + 'unit_frequency' =>array('type'=>'varchar(2)', 'label'=>'UnitFrequency', 'enabled'=>1, 'visible'=>-1, 'position'=>152), 'usenewprice' =>array('type'=>'integer', 'label'=>'UseNewPrice', 'enabled'=>1, 'visible'=>0, 'position'=>155), 'revenuestamp' =>array('type'=>'double(24,8)', 'label'=>'RevenueStamp', 'enabled'=>1, 'visible'=>-1, 'position'=>160, 'isameasure'=>1), 'auto_validate' =>array('type'=>'integer', 'label'=>'Auto validate', 'enabled'=>1, 'visible'=>-1, 'position'=>165), diff --git a/htdocs/ticket/class/ticket.class.php b/htdocs/ticket/class/ticket.class.php index 6763ce02e84..d077ed3e777 100644 --- a/htdocs/ticket/class/ticket.class.php +++ b/htdocs/ticket/class/ticket.class.php @@ -270,7 +270,7 @@ class Ticket extends CommonObject // BEGIN MODULEBUILDER PROPERTIES public $fields = array( - 'rowid' => array('type'=>'integer', 'label'=>'TechnicalID', 'position'=>1, 'visible'=>-2, 'enabled'=>1, 'position'=>1, 'notnull'=>1, 'index'=>1, 'comment'=>"Id"), + 'rowid' => array('type'=>'integer', 'label'=>'TechnicalID', 'visible'=>-2, 'enabled'=>1, 'position'=>1, 'notnull'=>1, 'index'=>1, 'comment'=>"Id"), 'entity' => array('type'=>'integer', 'label'=>'Entity', 'visible'=>0, 'enabled'=>1, 'position'=>5, 'notnull'=>1, 'index'=>1), 'ref' => array('type'=>'varchar(128)', 'label'=>'Ref', 'visible'=>1, 'enabled'=>1, 'position'=>10, 'notnull'=>1, 'index'=>1, 'searchall'=>1, 'comment'=>"Reference of object", 'css'=>'', 'showoncombobox'=>1), 'track_id' => array('type'=>'varchar(255)', 'label'=>'TicketTrackId', 'visible'=>-2, 'enabled'=>1, 'position'=>11, 'notnull'=>-1, 'searchall'=>1, 'help'=>"Help text"), From f816587cfb235040c1c24c3c1489e7271aa73fa4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 30 Dec 2022 19:28:05 +0100 Subject: [PATCH 0467/1128] Fix warning --- htdocs/adherents/list.php | 1 - htdocs/core/modules/modCommande.class.php | 4 ++-- htdocs/core/modules/modSociete.class.php | 1 - htdocs/projet/list.php | 2 +- htdocs/user/class/user.class.php | 1 - 5 files changed, 3 insertions(+), 6 deletions(-) diff --git a/htdocs/adherents/list.php b/htdocs/adherents/list.php index a1d929ec3e9..0c61f94a93d 100644 --- a/htdocs/adherents/list.php +++ b/htdocs/adherents/list.php @@ -126,7 +126,6 @@ $fieldstosearchall = array( 'd.login'=>'Login', 'd.lastname'=>'Lastname', 'd.firstname'=>'Firstname', - 'd.login'=>'Login', 'd.societe'=>"Company", 'd.email'=>'EMail', 'd.address'=>'Address', diff --git a/htdocs/core/modules/modCommande.class.php b/htdocs/core/modules/modCommande.class.php index f0486b5cb58..38b81cdb4fb 100644 --- a/htdocs/core/modules/modCommande.class.php +++ b/htdocs/core/modules/modCommande.class.php @@ -204,7 +204,7 @@ class modCommande extends DolibarrModules 'co.code'=>"CountryCode", 's.phone'=>'Phone', 's.siren'=>'ProfId1', 's.siret'=>'ProfId2', 's.ape'=>'ProfId3', 's.idprof4'=>'ProfId4', 'c.rowid'=>"Id", 'c.ref'=>"Ref", 'c.ref_client'=>"RefCustomer", 'c.fk_soc'=>"IdCompany", 'c.date_creation'=>"DateCreation", 'c.date_commande'=>"OrderDate", 'c.date_livraison'=>"DateDeliveryPlanned", 'c.amount_ht'=>"Amount", 'c.total_ht'=>"TotalHT", - 'c.total_ttc'=>"TotalTTC", 'c.facture'=>"Billed", 'c.fk_statut'=>'Status', 'c.note_public'=>"Note", 'c.date_livraison'=>'DeliveryDate', + 'c.total_ttc'=>"TotalTTC", 'c.facture'=>"Billed", 'c.fk_statut'=>'Status', 'c.note_public'=>"Note", 'c.fk_user_author'=>'CreatedById', 'uc.login'=>'CreatedByLogin', 'c.fk_user_valid'=>'ValidatedById', 'uv.login'=>'ValidatedByLogin', 'pj.ref'=>'ProjectRef', 'cd.rowid'=>'LineId', 'cd.description'=>"LineDescription", 'cd.product_type'=>'TypeOfLineServiceOrProduct', 'cd.tva_tx'=>"LineVATRate", 'cd.qty'=>"LineQty", 'cd.total_ht'=>"LineTotalHT", 'cd.total_tva'=>"LineTotalVAT", 'cd.total_ttc'=>"LineTotalTTC", @@ -236,7 +236,7 @@ class modCommande extends DolibarrModules 's.nom'=>'Text', 'ps.nom'=>'Text', 's.address'=>'Text', 's.zip'=>'Text', 's.town'=>'Text', 'co.label'=>'List:c_country:label:label', 'co.code'=>'Text', 's.phone'=>'Text', 's.siren'=>'Text', 's.siret'=>'Text', 's.ape'=>'Text', 's.idprof4'=>'Text', 'c.ref'=>"Text", 'c.ref_client'=>"Text", 'c.date_creation'=>"Date", 'c.date_commande'=>"Date", 'c.date_livraison'=>"Date", 'c.amount_ht'=>"Numeric", 'c.total_ht'=>"Numeric", - 'c.total_ttc'=>"Numeric", 'c.facture'=>"Boolean", 'c.fk_statut'=>'Status', 'c.note_public'=>"Text", 'c.date_livraison'=>'Date', 'pj.ref'=>'Text', + 'c.total_ttc'=>"Numeric", 'c.facture'=>"Boolean", 'c.fk_statut'=>'Status', 'c.note_public'=>"Text", 'pj.ref'=>'Text', 'cd.description'=>"Text", 'cd.product_type'=>'Boolean', 'cd.tva_tx'=>"Numeric", 'cd.qty'=>"Numeric", 'cd.total_ht'=>"Numeric", 'cd.total_tva'=>"Numeric", 'cd.total_ttc'=>"Numeric", 'p.rowid'=>'List:product:ref::product', 'p.ref'=>'Text', 'p.label'=>'Text', 'd.nom'=>'Text', 'c.entity'=>'List:entity:label:rowid', diff --git a/htdocs/core/modules/modSociete.class.php b/htdocs/core/modules/modSociete.class.php index 70729f5c9dc..d63084ac5b5 100644 --- a/htdocs/core/modules/modSociete.class.php +++ b/htdocs/core/modules/modSociete.class.php @@ -571,7 +571,6 @@ class modSociete extends DolibarrModules 'dict' => 'DictionaryCompanyType' ), 's.capital' => array('rule' => 'numeric'), - 's.fk_stcomm' => array('rule' => 'zeroifnull'), 's.parent' => array( 'rule' => 'fetchidfromref', 'file' => '/societe/class/societe.class.php', diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index 23ff9be793f..411e6d5fcd8 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -210,7 +210,7 @@ $arrayfields['s.nom'] = array('label'=>$langs->trans("ThirdParty"), 'checked'=>1 $arrayfields['s.name_alias'] = array('label'=>"AliasNameShort", 'checked'=>0, 'position'=>22); $arrayfields['commercial'] = array('label'=>$langs->trans("SaleRepresentativesOfThirdParty"), 'checked'=>0, 'position'=>23); $arrayfields['c.assigned'] = array('label'=>$langs->trans("AssignedTo"), 'checked'=>-1, 'position'=>120); -$arrayfields['opp_weighted_amount'] = array('label'=>$langs->trans('OpportunityWeightedAmountShort'), 'checked'=>0, 'position'=> 116, 'enabled'=>(empty($conf->global->PROJECT_USE_OPPORTUNITIES) ? 0 : 1), 'position'=>106); +$arrayfields['opp_weighted_amount'] = array('label'=>$langs->trans('OpportunityWeightedAmountShort'), 'checked'=>0, 'enabled'=>(empty($conf->global->PROJECT_USE_OPPORTUNITIES) ? 0 : 1), 'position'=>106); $arrayfields['u.login'] = array('label'=>"Author", 'checked'=>1, 'position'=>165); // Force some fields according to search_usage filter... if (GETPOST('search_usage_opportunity')) { diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 4e90bbb1bd9..81739943ae2 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -717,7 +717,6 @@ class User extends CommonObject 'shipping' => 'expedition', 'task' => 'task@projet', 'fichinter' => 'ficheinter', - 'propale' => 'propal', 'inventory' => 'stock', 'invoice' => 'facture', 'invoice_supplier' => 'fournisseur', From 73e776a44167ce0b94c98adc67e3d50dae94ec7a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 30 Dec 2022 19:29:19 +0100 Subject: [PATCH 0468/1128] Add option to start manually --- .github/workflows/stale-issues-safe.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/stale-issues-safe.yml b/.github/workflows/stale-issues-safe.yml index 4ac9fa8f5b9..af04675d48d 100644 --- a/.github/workflows/stale-issues-safe.yml +++ b/.github/workflows/stale-issues-safe.yml @@ -6,7 +6,8 @@ on: - cron: "0 21 * * *" issue_comment: types: [created] - + workflow_dispatch: + permissions: {} # none jobs: From 1fde0a70f5bbb0492f79b0421ce808094f19228e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 30 Dec 2022 19:39:08 +0100 Subject: [PATCH 0469/1128] Fix cast bad type --- htdocs/societe/class/companybankaccount.class.php | 2 +- htdocs/user/class/userbankaccount.class.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/societe/class/companybankaccount.class.php b/htdocs/societe/class/companybankaccount.class.php index d81a360e7d2..26305bb0013 100644 --- a/htdocs/societe/class/companybankaccount.class.php +++ b/htdocs/societe/class/companybankaccount.class.php @@ -349,7 +349,7 @@ class CompanyBankAccount extends Account $rib = $this->label." : "; } - $rib .= (string) $this; + $rib .= $this->iban; } return $rib; diff --git a/htdocs/user/class/userbankaccount.class.php b/htdocs/user/class/userbankaccount.class.php index 271609139b1..6e9cc8e52af 100644 --- a/htdocs/user/class/userbankaccount.class.php +++ b/htdocs/user/class/userbankaccount.class.php @@ -241,7 +241,7 @@ class UserBankAccount extends Account $rib = $this->label." : "; } - $rib .= (string) $this; + $rib .= $this->iban; } return $rib; From 41c3d9da05225e6709362efb8e76a09d06fa8bfa Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 30 Dec 2022 19:40:16 +0100 Subject: [PATCH 0470/1128] Fix warning --- htdocs/core/lib/security.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/security.lib.php b/htdocs/core/lib/security.lib.php index deff1af567c..88fc7d27eaa 100644 --- a/htdocs/core/lib/security.lib.php +++ b/htdocs/core/lib/security.lib.php @@ -367,7 +367,7 @@ function restrictedArea(User $user, $features, $object = 0, $tableandshare = '', if ($features == 'subscription') { $features = 'adherent'; $feature2 = 'cotisation'; - }; + } if ($features == 'websitepage') { $features = 'website'; $tableandshare = 'website_page'; From 8dc89e9a9a57ce678367765b7c8f1049796eb7f4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 30 Dec 2022 19:51:07 +0100 Subject: [PATCH 0471/1128] Fix warning --- htdocs/admin/system/dolibarr.php | 2 +- htdocs/blockedlog/class/authority.class.php | 2 +- htdocs/compta/facture/class/facture.class.php | 2 +- htdocs/core/filemanagerdol/connectors/php/connector.lib.php | 5 +++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/htdocs/admin/system/dolibarr.php b/htdocs/admin/system/dolibarr.php index 4a55c1a1160..afe5d4d3520 100644 --- a/htdocs/admin/system/dolibarr.php +++ b/htdocs/admin/system/dolibarr.php @@ -264,7 +264,7 @@ $daylight = round($c - $b); $val = ($a >= 0 ? '+' : '').$a; $val .= ' ('.($a == 'unknown' ? 'unknown' : ($a >= 0 ? '+' : '').($a * 3600)).')'; $val .= '       '.getServerTimeZoneString(); -$val .= '       '.$langs->trans("DaylingSavingTime").': '.($daylight === 'unknown' ? 'unknown' : ($a == $c ?yn($daylight) : yn(0).($daylight ? '     ('.$langs->trans('YesInSummer').')' : ''))); +$val .= '       '.$langs->trans("DaylingSavingTime").': '.(is_null($daylight) ? 'unknown' : ($a == $c ?yn($daylight) : yn(0).($daylight ? '     ('.$langs->trans('YesInSummer').')' : ''))); print $form->textwithtooltip($val, $txt, 2, 1, img_info('')); print ''."\n"; // value defined in http://fr3.php.net/manual/en/timezones.europe.php print '  => '.$langs->trans("CurrentHour").''.dol_print_date(dol_now('gmt'), 'dayhour', 'tzserver').''."\n"; diff --git a/htdocs/blockedlog/class/authority.class.php b/htdocs/blockedlog/class/authority.class.php index 0b665fedc3e..b3dd9b45f47 100644 --- a/htdocs/blockedlog/class/authority.class.php +++ b/htdocs/blockedlog/class/authority.class.php @@ -305,7 +305,7 @@ class BlockedLogAuthority $res = getURLContent($url); echo $block->signature.' '.$url.' '.$res['content'].'
'; - if ($res === 'blockalreadyadded' || $res === 'blockadded') { + if ($res['content'] === 'blockalreadyadded' || $res['content'] === 'blockadded') { $block->setCertified(); } else { $this->error = $langs->trans('ImpossibleToContactAuthority ', $url); diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 87d28de8756..0a3c1445745 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -6264,7 +6264,7 @@ class FactureLigne extends CommonInvoiceLine $sql .= ", total_localtax2=".price2num($this->total_localtax2); } $sql .= ", fk_product_fournisseur_price=".(!empty($this->fk_fournprice) ? "'".$this->db->escape($this->fk_fournprice)."'" : "null"); - $sql .= ", buy_price_ht=".(($this->pa_ht || $this->pa_ht === 0 || $this->pa_ht === '0') ? price2num($this->pa_ht) : "null"); // $this->pa_ht should always be defined (set to 0 or to sell price depending on option) + $sql .= ", buy_price_ht=".(($this->pa_ht || (string) $this->pa_ht === '0') ? price2num($this->pa_ht) : "null"); // $this->pa_ht should always be defined (set to 0 or to sell price depending on option) $sql .= ", fk_parent_line=".($this->fk_parent_line > 0 ? $this->fk_parent_line : "null"); if (!empty($this->rang)) { $sql .= ", rang=".((int) $this->rang); diff --git a/htdocs/core/filemanagerdol/connectors/php/connector.lib.php b/htdocs/core/filemanagerdol/connectors/php/connector.lib.php index 608c2ba4cd6..75c4d1e3e08 100644 --- a/htdocs/core/filemanagerdol/connectors/php/connector.lib.php +++ b/htdocs/core/filemanagerdol/connectors/php/connector.lib.php @@ -343,7 +343,8 @@ function FileUpload($resourceType, $currentFolder, $sCommand, $CKEcallback = '') include_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php'; //var_dump($sFileName); var_dump(image_format_supported($sFileName));exit; - $isImageValid = (image_format_supported($sFileName) >= 0 ? true : false); + $imgsupported = image_format_supported($sFileName); + $isImageValid = ($imgsupported >= 0 ? true : false); if (!$isImageValid) { $sErrorNumber = '202'; } @@ -387,7 +388,7 @@ function FileUpload($resourceType, $currentFolder, $sCommand, $CKEcallback = '') if (file_exists($sFilePath)) { //previous checks failed, try once again - if (isset($isImageValid) && $isImageValid === -1 && IsImageValid($sFilePath, $sExtension) === false) { + if (isset($isImageValid) && $imgsupported === -1 && IsImageValid($sFilePath, $sExtension) === false) { dol_syslog("connector.lib.php IsImageValid is ko"); @unlink($sFilePath); $sErrorNumber = '202'; From 15c05d9b7d5c6d953b1d3395fc17130b7e4c29a7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 31 Dec 2022 12:39:42 +0100 Subject: [PATCH 0472/1128] Fix warnings --- htdocs/comm/action/class/actioncomm.class.php | 10 ++++----- htdocs/core/class/extrafields.class.php | 18 ++++++++-------- htdocs/modulebuilder/index.php | 12 +++++------ htdocs/mrp/mo_card.php | 10 ++++----- htdocs/printing/admin/printing.php | 8 +++---- htdocs/product/admin/product.php | 11 +++++----- htdocs/projet/activity/permonth.php | 20 ++++++++++-------- htdocs/projet/activity/perweek.php | 21 ++++++++++--------- qodana.yaml | 1 + 9 files changed, 57 insertions(+), 54 deletions(-) diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index 244b3df9405..e77052e0690 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -225,22 +225,22 @@ class ActionComm extends CommonObject public $transparency; /** - * @var int (0 By default) + * @var int (0 By default) */ public $priority; /** - * @var int[] Array of user ids + * @var int[] Array of user ids */ public $userassigned = array(); /** - * @var int Id of user owner = fk_user_action into table + * @var int Id of user owner = fk_user_action into table */ public $userownerid; /** - * @var int Id of user that has done the event. Used only if AGENDA_ENABLE_DONEBY is set. + * @var int Id of user that has done the event. Used only if AGENDA_ENABLE_DONEBY is set. */ public $userdoneid; @@ -429,7 +429,7 @@ class ActionComm extends CommonObject $now = dol_now(); // Check parameters - if (!isset($this->userownerid) || $this->userownerid === '') { // $this->userownerid may be 0 (anonymous event) of > 0 + if (!isset($this->userownerid) || (string) $this->userownerid === '') { // $this->userownerid may be 0 (anonymous event) or > 0 dol_syslog("You tried to create an event but mandatory property ownerid was not defined", LOG_WARNING); $this->errors[] = 'ErrorActionCommPropertyUserowneridNotDefined'; return -1; diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php index b0bc0e55c06..e9817a36d6a 100644 --- a/htdocs/core/class/extrafields.class.php +++ b/htdocs/core/class/extrafields.class.php @@ -1141,24 +1141,24 @@ class ExtraFields $out .= ''; } else { - print ''.img_edit().''; + print ''.img_edit().''; print '   '; print ''.img_delete().''; } diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index a6eac03cadc..a8a96fb7c07 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -751,7 +751,7 @@ class Form // If info or help with smartphone, show only text (tooltip on click does not works with dialog on smaprtphone) //if (!empty($conf->dol_no_mouse_hover) && !empty($tooltiptrigger)) //{ - //if ($type == 'info' || $type == 'help') return ''.$text.'''; + //if ($type == 'info' || $type == 'help') return ''.$text.''; //} $img = ''; @@ -3041,7 +3041,7 @@ class Form $sql .= " ORDER BY date_price DESC, rowid DESC"; // Warning DESC must be both on date_price and rowid. $sql .= " LIMIT 1"; - dol_syslog(get_class($this).'::constructProductListOption search price for product '.$objp->rowid.' AND level '.$price_level.'', LOG_DEBUG); + dol_syslog(get_class($this).'::constructProductListOption search price for product '.$objp->rowid.' AND level '.$price_level, LOG_DEBUG); $result2 = $this->db->query($sql); if ($result2) { $objp2 = $this->db->fetch_object($result2); diff --git a/htdocs/core/lib/company.lib.php b/htdocs/core/lib/company.lib.php index 25393c6ee56..47525ab5328 100644 --- a/htdocs/core/lib/company.lib.php +++ b/htdocs/core/lib/company.lib.php @@ -1988,7 +1988,7 @@ function show_actions_done($conf, $langs, $db, $filterobj, $objcon = '', $noprin if (isset($histo[$key]['socpeopleassigned']) && is_array($histo[$key]['socpeopleassigned']) && count($histo[$key]['socpeopleassigned']) > 0) { $out .= ''; $contact = new Contact($db); - foreach ($histo[$key]['socpeopleassigned'] as $cid => $value) { + foreach ($histo[$key]['socpeopleassigned'] as $cid => $cvalue) { $result = $contact->fetch($cid); if ($result < 0) { diff --git a/htdocs/core/lib/cron.lib.php b/htdocs/core/lib/cron.lib.php index 7078d7488ad..ccce2ec7f94 100644 --- a/htdocs/core/lib/cron.lib.php +++ b/htdocs/core/lib/cron.lib.php @@ -128,7 +128,7 @@ function dol_print_cron_urls() $pathtoscript = $conf->global->MAIN_DOL_SCRIPTS_ROOT; } - $file = $pathtoscript.'/scripts/cron/cron_run_jobs.php '.(empty($conf->global->CRON_KEY) ? 'securitykey' : ''.$conf->global->CRON_KEY.'').' '.$logintouse.' [cronjobid]'; + $file = $pathtoscript.'/scripts/cron/cron_run_jobs.php '.(empty($conf->global->CRON_KEY) ? 'securitykey' : ''.$conf->global->CRON_KEY).' '.$logintouse.' [cronjobid]'; print '
\n"; print '
'; @@ -145,7 +145,7 @@ function dol_print_cron_urls() if ($linuxlike) { print $langs->trans("CronExplainHowToRunUnix"); print '
'; - print '
'; + print '
'; } else { print $langs->trans("CronExplainHowToRunWin"); } diff --git a/htdocs/eventorganization/conferenceorbooth_card.php b/htdocs/eventorganization/conferenceorbooth_card.php index b6932c2cf09..9928b8af33b 100644 --- a/htdocs/eventorganization/conferenceorbooth_card.php +++ b/htdocs/eventorganization/conferenceorbooth_card.php @@ -568,13 +568,13 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea print dolGetButtonAction('', $langs->trans('SendMail'), 'default', $_SERVER["PHP_SELF"].'?id='.$object->id.$withProjectUrl.'&action=presend&token='.newToken().'&mode=init#formmailbeforetitle'); } - print dolGetButtonAction('', $langs->trans('Modify'), 'default', $_SERVER["PHP_SELF"].'?id='.$object->id.$withProjectUrl.'&action=edit&token='.newToken().'', '', $permissiontoadd); + print dolGetButtonAction('', $langs->trans('Modify'), 'default', $_SERVER["PHP_SELF"].'?id='.$object->id.$withProjectUrl.'&action=edit&token='.newToken(), '', $permissiontoadd); // Clone print dolGetButtonAction('', $langs->trans('ToClone'), 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.$withProjectUrl.'&socid='.$object->socid.'&action=clone&token='.newToken().'&object=scrumsprint', '', $permissiontoadd); // Delete (need delete permission, or if draft, just need create/modify permission) - print dolGetButtonAction($langs->trans('Delete'), '', 'delete', $_SERVER['PHP_SELF'].'?id='.$object->id.$withProjectUrl.'&action=delete&token='.newToken().'', '', $permissiontodelete || ($object->status == $object::STATUS_DRAFT && $permissiontoadd)); + print dolGetButtonAction($langs->trans('Delete'), '', 'delete', $_SERVER['PHP_SELF'].'?id='.$object->id.$withProjectUrl.'&action=delete&token='.newToken(), '', $permissiontodelete || ($object->status == $object::STATUS_DRAFT && $permissiontoadd)); } print '
'."\n"; } diff --git a/htdocs/holiday/class/holiday.class.php b/htdocs/holiday/class/holiday.class.php index 0125becd21c..81da058b919 100644 --- a/htdocs/holiday/class/holiday.class.php +++ b/htdocs/holiday/class/holiday.class.php @@ -1470,7 +1470,7 @@ class Holiday extends CommonObject $sql .= " value = '".$this->db->escape($value)."'"; $sql .= " WHERE name = '".$this->db->escape($name)."'"; - dol_syslog(get_class($this).'::updateConfCP name='.$name.'', LOG_DEBUG); + dol_syslog(get_class($this).'::updateConfCP name='.$name, LOG_DEBUG); $result = $this->db->query($sql); if ($result) { return true; diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index a14467c0184..b804f3d9c8f 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -281,7 +281,7 @@ if ($dirins && $action == 'initmodule' && $modulename) { // Delete dir and files that can be generated in sub tabs later if we need them (we want a minimal module first) dol_delete_dir_recursive($destdir.'/build/doxygen'); dol_delete_dir_recursive($destdir.'/core/modules/mailings'); - dol_delete_dir_recursive($destdir.'/core/modules/'.strtolower($modulename).''); + dol_delete_dir_recursive($destdir.'/core/modules/'.strtolower($modulename)); dol_delete_dir_recursive($destdir.'/core/tpl'); dol_delete_dir_recursive($destdir.'/core/triggers'); dol_delete_dir_recursive($destdir.'/doc'); diff --git a/htdocs/product/stock/class/mouvementstock.class.php b/htdocs/product/stock/class/mouvementstock.class.php index ac5d612394b..43760d808b2 100644 --- a/htdocs/product/stock/class/mouvementstock.class.php +++ b/htdocs/product/stock/class/mouvementstock.class.php @@ -834,7 +834,7 @@ class MouvementStock extends CommonObject $sql .= " WHERE fk_product = ".((int) $productidselected); $sql .= " AND datem < '".$this->db->idate($datebefore)."'"; - dol_syslog(get_class($this).__METHOD__.'', LOG_DEBUG); + dol_syslog(get_class($this).__METHOD__, LOG_DEBUG); $resql = $this->db->query($sql); if ($resql) { $obj = $this->db->fetch_object($resql); diff --git a/htdocs/stripe/class/stripe.class.php b/htdocs/stripe/class/stripe.class.php index ffe59b01d61..1f9ad46cdb0 100644 --- a/htdocs/stripe/class/stripe.class.php +++ b/htdocs/stripe/class/stripe.class.php @@ -279,9 +279,9 @@ class Stripe extends CommonObject global $stripearrayofkeysbyenv; \Stripe\Stripe::setApiKey($stripearrayofkeysbyenv[$status]['secret_key']); if (empty($key)) { // If the Stripe connect account not set, we use common API usage - $stripepaymentmethod = \Stripe\PaymentMethod::retrieve(''.$paymentmethod->id.''); + $stripepaymentmethod = \Stripe\PaymentMethod::retrieve((string) $paymentmethod->id); } else { - $stripepaymentmethod = \Stripe\PaymentMethod::retrieve(''.$paymentmethod->id.'', array("stripe_account" => $key)); + $stripepaymentmethod = \Stripe\PaymentMethod::retrieve((string) $paymentmethod->id, array("stripe_account" => $key)); } } catch (Exception $e) { $this->error = $e->getMessage(); @@ -307,9 +307,9 @@ class Stripe extends CommonObject global $stripearrayofkeysbyenv; \Stripe\Stripe::setApiKey($stripearrayofkeysbyenv[$status]['secret_key']); if (empty($key)) { // If the Stripe connect account not set, we use common API usage - $selectedreader = \Stripe\Terminal\Reader::retrieve(''.$reader.''); + $selectedreader = \Stripe\Terminal\Reader::retrieve((string) $reader); } else { - $stripepaymentmethod = \Stripe\Terminal\Reader::retrieve(''.$reader.'', array("stripe_account" => $key)); + $stripepaymentmethod = \Stripe\Terminal\Reader::retrieve((string) $reader, array("stripe_account" => $key)); } } catch (Exception $e) { $this->error = $e->getMessage(); diff --git a/htdocs/takepos/invoice.php b/htdocs/takepos/invoice.php index ea262a1562f..27b340249c3 100644 --- a/htdocs/takepos/invoice.php +++ b/htdocs/takepos/invoice.php @@ -1424,7 +1424,7 @@ if (!empty($_SESSION["basiclayout"]) && $_SESSION["basiclayout"] == 1) { $htmlforlines .= '" onclick="AddProduct(\''.$place.'\', '.$row->id.')">'; if (defined('INCLUDE_PHONEPAGE_FROM_PUBLIC_PAGE')) { $htmlforlines .= '
'; - $htmlforlines .= $row->label.''.price($row->price_ttc, 1, $langs, 1, -1, -1, $conf->currency); + $htmlforlines .= $row->label.' '.price($row->price_ttc, 1, $langs, 1, -1, -1, $conf->currency); $htmlforlines .= '
'."\n"; } else { $htmlforlines .= ''; diff --git a/htdocs/ticket/list.php b/htdocs/ticket/list.php index 4c4dce5a428..79db9e0e73e 100644 --- a/htdocs/ticket/list.php +++ b/htdocs/ticket/list.php @@ -836,15 +836,15 @@ foreach ($object->fields as $key => $val) { print ''; } elseif ($key == 'type_code') { print ''; - $formTicket->selectTypesTickets(dol_escape_htmltag(empty($search[$key]) ? '' : $search[$key]), 'search_'.$key.'', '', 2, 1, 1, 0, (!empty($val['css']) ? $val['css'] : 'maxwidth150'), 1); + $formTicket->selectTypesTickets(dol_escape_htmltag(empty($search[$key]) ? '' : $search[$key]), 'search_'.$key, '', 2, 1, 1, 0, (!empty($val['css']) ? $val['css'] : 'maxwidth150'), 1); print ''; } elseif ($key == 'category_code') { print ''; - $formTicket->selectGroupTickets(dol_escape_htmltag(empty($search[$key]) ? '' : $search[$key]), 'search_'.$key.'', '', 2, 1, 1, 0, (!empty($val['css']) ? $val['css'] : 'maxwidth150')); + $formTicket->selectGroupTickets(dol_escape_htmltag(empty($search[$key]) ? '' : $search[$key]), 'search_'.$key, '', 2, 1, 1, 0, (!empty($val['css']) ? $val['css'] : 'maxwidth150')); print ''; } elseif ($key == 'severity_code') { print ''; - $formTicket->selectSeveritiesTickets(dol_escape_htmltag(empty($search[$key]) ? '' : $search[$key]), 'search_'.$key.'', '', 2, 1, 1, 0, (!empty($val['css']) ? $val['css'] : 'maxwidth150')); + $formTicket->selectSeveritiesTickets(dol_escape_htmltag(empty($search[$key]) ? '' : $search[$key]), 'search_'.$key, '', 2, 1, 1, 0, (!empty($val['css']) ? $val['css'] : 'maxwidth150')); print ''; } elseif ($key == 'fk_user_assign' || $key == 'fk_user_create') { print ''; diff --git a/htdocs/webservices/server_order.php b/htdocs/webservices/server_order.php index 65357174019..0f0eb79d10e 100644 --- a/htdocs/webservices/server_order.php +++ b/htdocs/webservices/server_order.php @@ -741,9 +741,9 @@ function createOrder($authentication, $order) $extrafields = new ExtraFields($db); $extrafields->fetch_name_optionals_label($elementtype, true); if (isset($extrafields->attributes[$elementtype]['label']) && is_array($extrafields->attributes[$elementtype]['label']) && count($extrafields->attributes[$elementtype]['label'])) { - foreach ($extrafields->attributes[$elementtype]['label'] as $key => $label) { - $key = 'options_'.$key; - $newline->array_options[$key] = $line[$key]; + foreach ($extrafields->attributes[$elementtype]['label'] as $tmpkey => $tmplabel) { + $tmpkey = 'options_'.$tmpkey; + $newline->array_options[$tmpkey] = $line[$tmpkey]; } } diff --git a/qodana.yaml b/qodana.yaml index 5ed80e029f3..853ee69fab5 100644 --- a/qodana.yaml +++ b/qodana.yaml @@ -64,4 +64,6 @@ exclude: - name: PhpArrayWriteIsNotUsedInspection - name: PhpUndefinedNamespaceInspection - name: PhpArraySearchInBooleanContextInspection - - name: PhpPropertyOnlyWrittenInspection \ No newline at end of file + - name: PhpLoopCanBeReplacedWithStrRepeatInspection + - name: PhpPropertyOnlyWrittenInspection + - name: PhpCoveredCharacterInClassInspection \ No newline at end of file diff --git a/scripts/user/sync_groups_ldap2dolibarr.php b/scripts/user/sync_groups_ldap2dolibarr.php index 67c14a4ee5d..2fe89b92ccb 100755 --- a/scripts/user/sync_groups_ldap2dolibarr.php +++ b/scripts/user/sync_groups_ldap2dolibarr.php @@ -176,17 +176,17 @@ if ($result >= 0) { // 1 - Association des utilisateurs du groupe LDAP au groupe Dolibarr $userList = array(); $userIdList = array(); - foreach ($ldapgroup[$conf->global->LDAP_GROUP_FIELD_GROUPMEMBERS] as $key => $userdn) { - if ($key === 'count') { + foreach ($ldapgroup[getDolGlobalString('LDAP_GROUP_FIELD_GROUPMEMBERS')] as $tmpkey => $userdn) { + if ($tmpkey === 'count') { continue; } if (empty($userList[$userdn])) { // Récupération de l'utilisateur // Schéma rfc2307: les membres sont listés dans l'attribut memberUid sous form de login uniquement - if ($conf->global->LDAP_GROUP_FIELD_GROUPMEMBERS === 'memberUid') { + if (getDolGlobalString('LDAP_GROUP_FIELD_GROUPMEMBERS') === 'memberUid') { $userKey = array($userdn); } else { // Pour les autres schémas, les membres sont listés sous forme de DN complets $userFilter = explode(',', $userdn); - $userKey = $ldap->getAttributeValues('('.$userFilter[0].')', $conf->global->LDAP_KEY_USERS); + $userKey = $ldap->getAttributeValues('('.$userFilter[0].')', getDolGlobalString('LDAP_KEY_USERS')); } if (!is_array($userKey)) { continue; @@ -194,9 +194,9 @@ if ($result >= 0) { $fuser = new User($db); - if ($conf->global->LDAP_KEY_USERS == $conf->global->LDAP_FIELD_SID) { + if (getDolGlobalString('LDAP_KEY_USERS') == getDolGlobalString('LDAP_FIELD_SID')) { $fuser->fetch('', '', $userKey[0]); // Chargement du user concerné par le SID - } elseif ($conf->global->LDAP_KEY_USERS == $conf->global->LDAP_FIELD_LOGIN) { + } elseif (getDolGlobalString('LDAP_KEY_USERS') == getDolGlobalString('LDAP_FIELD_LOGIN')) { $fuser->fetch('', $userKey[0]); // Chargement du user concerné par le login } From cef9a8e8d48e525ab63e561ceace90ca24b2ab7d Mon Sep 17 00:00:00 2001 From: Francis Appels Date: Sat, 31 Dec 2022 13:36:31 +0100 Subject: [PATCH 0474/1128] Fix Price by qty for multiprices --- htdocs/core/lib/ajax.lib.php | 2 +- htdocs/core/tpl/objectline_create.tpl.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/lib/ajax.lib.php b/htdocs/core/lib/ajax.lib.php index a6d269a6bb2..63d4605b8fb 100644 --- a/htdocs/core/lib/ajax.lib.php +++ b/htdocs/core/lib/ajax.lib.php @@ -187,7 +187,7 @@ function ajax_autocompleter($selected, $htmlname, $url, $urloption = '', $minLen $("#'.$htmlnamejquery.'").attr("data-ref-customer", ui.item.ref_customer); $("#'.$htmlnamejquery.'").attr("data-tvatx", ui.item.tva_tx); '; - if (!empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY)) { + if (!empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY) || !empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES)) { $script .= ' // For customer price when PRODUIT_CUSTOMER_PRICES_BY_QTY is on $("#'.$htmlnamejquery.'").attr("data-pbq", ui.item.pbq); diff --git a/htdocs/core/tpl/objectline_create.tpl.php b/htdocs/core/tpl/objectline_create.tpl.php index 5ce4ab76448..f4e83192ac4 100644 --- a/htdocs/core/tpl/objectline_create.tpl.php +++ b/htdocs/core/tpl/objectline_create.tpl.php @@ -911,7 +911,7 @@ if (!empty($usemargins) && $user->rights->margins->creer) { ?> global->PRODUIT_CUSTOMER_PRICES_BY_QTY)) {?> + if (!empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY) || !empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES)) {?> /* To process customer price per quantity (PRODUIT_CUSTOMER_PRICES_BY_QTY works only if combo product is not an ajax after x key pressed) */ var pbq = parseInt($('option:selected', this).attr('data-pbq')); // When select is done from HTML select if (isNaN(pbq)) { pbq = jQuery('#idprod').attr('data-pbq'); } // When select is done from HTML input with autocomplete From 8774f4f092021d4cd548bec6cc683e9dad199dc8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 31 Dec 2022 13:44:11 +0100 Subject: [PATCH 0475/1128] Fix warning qodana --- htdocs/core/lib/functions.lib.php | 14 +++++++------- htdocs/core/lib/project.lib.php | 6 ++++-- .../asset/doc/doc_generic_asset_odt.modules.php | 2 +- .../bom/doc/doc_generic_bom_odt.modules.php | 2 +- .../commande/doc/doc_generic_order_odt.modules.php | 2 +- .../doc/doc_generic_contract_odt.modules.php | 2 +- .../doc/doc_generic_shipment_odt.modules.php | 2 +- .../doc/doc_generic_invoice_odt.modules.php | 2 +- .../member/doc/doc_generic_member_odt.class.php | 2 +- .../modules/mrp/doc/doc_generic_mo_odt.modules.php | 2 +- .../doc/doc_generic_product_odt.modules.php | 2 +- .../doc/doc_generic_project_odt.modules.php | 2 +- .../doc/doc_generic_proposal_odt.modules.php | 2 +- .../doc/doc_generic_reception_odt.modules.php | 2 +- .../stock/doc/doc_generic_stock_odt.modules.php | 2 +- .../doc_generic_supplier_invoice_odt.modules.php | 2 +- .../doc/doc_generic_supplier_order_odt.modules.php | 2 +- .../doc_generic_supplier_proposal_odt.modules.php | 2 +- .../ticket/doc/doc_generic_ticket_odt.modules.php | 2 +- .../user/doc/doc_generic_user_odt.modules.php | 2 +- .../doc/doc_generic_usergroup_odt.modules.php | 2 +- .../doc/doc_generic_myobject_odt.modules.php | 2 +- ..._generic_recruitmentjobposition_odt.modules.php | 2 +- qodana.yaml | 6 +++++- test/phpunit/FunctionsLibTest.php | 7 +++++++ 25 files changed, 44 insertions(+), 31 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index de329ee515f..6241eaaa8b1 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -368,7 +368,7 @@ function getBrowserInfo($user_agent) // MS products at end $name = 'ie'; $version = end($reg); - } elseif (preg_match('/l(i|y)n(x|ks)(\(|\/|\s)*([\d\.]+)/i', $user_agent, $reg)) { + } elseif (preg_match('/l[iy]n(x|ks)(\(|\/|\s)*([\d\.]+)/i', $user_agent, $reg)) { // MS products at end $name = 'lynxlinks'; $version = $reg[4]; @@ -3804,7 +3804,7 @@ function isValidMXRecord($domain) } } - // function idn_to_ascii or checkdnsrr does not exists + // function idn_to_ascii or checkdnsrr or getmxrr does not exists return -1; } @@ -10208,12 +10208,12 @@ function dol_mimetype($file, $default = 'application/octet-stream', $mode = 0) $imgmime = 'mdb.png'; $famime = 'file-o'; } - if (preg_match('/\.doc(x|m)?$/i', $tmpfile)) { + if (preg_match('/\.doc[xm]?$/i', $tmpfile)) { $mime = 'application/msword'; $imgmime = 'doc.png'; $famime = 'file-word-o'; } - if (preg_match('/\.dot(x|m)?$/i', $tmpfile)) { + if (preg_match('/\.dot[xm]?$/i', $tmpfile)) { $mime = 'application/msword'; $imgmime = 'doc.png'; $famime = 'file-word-o'; @@ -10233,17 +10233,17 @@ function dol_mimetype($file, $default = 'application/octet-stream', $mode = 0) $imgmime = 'xls.png'; $famime = 'file-excel-o'; } - if (preg_match('/\.xls(b|m|x)$/i', $tmpfile)) { + if (preg_match('/\.xls[bmx]$/i', $tmpfile)) { $mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; $imgmime = 'xls.png'; $famime = 'file-excel-o'; } - if (preg_match('/\.pps(m|x)?$/i', $tmpfile)) { + if (preg_match('/\.pps[mx]?$/i', $tmpfile)) { $mime = 'application/vnd.ms-powerpoint'; $imgmime = 'ppt.png'; $famime = 'file-powerpoint-o'; } - if (preg_match('/\.ppt(m|x)?$/i', $tmpfile)) { + if (preg_match('/\.ppt[mx]?$/i', $tmpfile)) { $mime = 'application/x-mspowerpoint'; $imgmime = 'ppt.png'; $famime = 'file-powerpoint-o'; diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index 7fdb3aecda1..a59ebe658b0 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -1624,8 +1624,10 @@ function projectLinesPerDay(&$inc, $parent, $fuser, $lines, &$level, &$projectsr // Duration print ''; - $dayWorkLoad = !empty($projectstatic->weekWorkLoadPerTask[$preselectedday][$lines[$i]->id]) ? $projectstatic->weekWorkLoadPerTask[$preselectedday][$lines[$i]->id] : 0; - if (!isset($totalforeachday[$preselectedday])) $totalforeachday[$preselectedday] = 0; + $dayWorkLoad = empty($projectstatic->weekWorkLoadPerTask[$preselectedday][$lines[$i]->id]) ? 0 : $projectstatic->weekWorkLoadPerTask[$preselectedday][$lines[$i]->id]; + if (!isset($totalforeachday[$preselectedday])) { + $totalforeachday[$preselectedday] = 0; + } $totalforeachday[$preselectedday] += $dayWorkLoad; $alreadyspent = ''; diff --git a/htdocs/core/modules/asset/doc/doc_generic_asset_odt.modules.php b/htdocs/core/modules/asset/doc/doc_generic_asset_odt.modules.php index 8be86dda944..ba4f39919bf 100644 --- a/htdocs/core/modules/asset/doc/doc_generic_asset_odt.modules.php +++ b/htdocs/core/modules/asset/doc/doc_generic_asset_odt.modules.php @@ -262,7 +262,7 @@ class doc_generic_asset_odt extends ModelePDFAsset if (file_exists($dir)) { //print "srctemplatepath=".$srctemplatepath; // Src filename $newfile = basename($srctemplatepath); - $newfiletmp = preg_replace('/\.od(t|s)/i', '', $newfile); + $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile); $newfiletmp = preg_replace('/template_/i', '', $newfiletmp); $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp); $newfiletmp = $objectref.'_'.$newfiletmp; diff --git a/htdocs/core/modules/bom/doc/doc_generic_bom_odt.modules.php b/htdocs/core/modules/bom/doc/doc_generic_bom_odt.modules.php index bec28b941aa..ea877432c17 100644 --- a/htdocs/core/modules/bom/doc/doc_generic_bom_odt.modules.php +++ b/htdocs/core/modules/bom/doc/doc_generic_bom_odt.modules.php @@ -273,7 +273,7 @@ class doc_generic_bom_odt extends ModelePDFBom if (file_exists($dir)) { //print "srctemplatepath=".$srctemplatepath; // Src filename $newfile = basename($srctemplatepath); - $newfiletmp = preg_replace('/\.od(t|s)/i', '', $newfile); + $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile); $newfiletmp = preg_replace('/template_/i', '', $newfiletmp); $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp); $newfiletmp = $objectref . '_' . $newfiletmp; diff --git a/htdocs/core/modules/commande/doc/doc_generic_order_odt.modules.php b/htdocs/core/modules/commande/doc/doc_generic_order_odt.modules.php index 5e94397bc91..bbace838183 100644 --- a/htdocs/core/modules/commande/doc/doc_generic_order_odt.modules.php +++ b/htdocs/core/modules/commande/doc/doc_generic_order_odt.modules.php @@ -279,7 +279,7 @@ class doc_generic_order_odt extends ModelePDFCommandes if (file_exists($dir)) { //print "srctemplatepath=".$srctemplatepath; // Src filename $newfile = basename($srctemplatepath); - $newfiletmp = preg_replace('/\.od(t|s)/i', '', $newfile); + $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile); $newfiletmp = preg_replace('/template_/i', '', $newfiletmp); $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp); $newfiletmp = $objectref . '_' . $newfiletmp; diff --git a/htdocs/core/modules/contract/doc/doc_generic_contract_odt.modules.php b/htdocs/core/modules/contract/doc/doc_generic_contract_odt.modules.php index dad1ebc9122..83e8f2551f7 100644 --- a/htdocs/core/modules/contract/doc/doc_generic_contract_odt.modules.php +++ b/htdocs/core/modules/contract/doc/doc_generic_contract_odt.modules.php @@ -276,7 +276,7 @@ class doc_generic_contract_odt extends ModelePDFContract if (file_exists($dir)) { //print "srctemplatepath=".$srctemplatepath; // Src filename $newfile = basename($srctemplatepath); - $newfiletmp = preg_replace('/\.od(t|s)/i', '', $newfile); + $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile); $newfiletmp = preg_replace('/template_/i', '', $newfiletmp); $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp); diff --git a/htdocs/core/modules/expedition/doc/doc_generic_shipment_odt.modules.php b/htdocs/core/modules/expedition/doc/doc_generic_shipment_odt.modules.php index 73793c5a757..f8280aab301 100644 --- a/htdocs/core/modules/expedition/doc/doc_generic_shipment_odt.modules.php +++ b/htdocs/core/modules/expedition/doc/doc_generic_shipment_odt.modules.php @@ -277,7 +277,7 @@ class doc_generic_shipment_odt extends ModelePdfExpedition if (file_exists($dir)) { //print "srctemplatepath=".$srctemplatepath; // Src filename $newfile = basename($srctemplatepath); - $newfiletmp = preg_replace('/\.od(t|s)/i', '', $newfile); + $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile); $newfiletmp = preg_replace('/template_/i', '', $newfiletmp); $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp); $newfiletmp = $objectref . '_' . $newfiletmp; diff --git a/htdocs/core/modules/facture/doc/doc_generic_invoice_odt.modules.php b/htdocs/core/modules/facture/doc/doc_generic_invoice_odt.modules.php index 0b8fa2d4621..f5dcfb86936 100644 --- a/htdocs/core/modules/facture/doc/doc_generic_invoice_odt.modules.php +++ b/htdocs/core/modules/facture/doc/doc_generic_invoice_odt.modules.php @@ -276,7 +276,7 @@ class doc_generic_invoice_odt extends ModelePDFFactures if (file_exists($dir)) { //print "srctemplatepath=".$srctemplatepath; // Src filename $newfile = basename($srctemplatepath); - $newfiletmp = preg_replace('/\.od(t|s)/i', '', $newfile); + $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile); $newfiletmp = preg_replace('/template_/i', '', $newfiletmp); $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp); diff --git a/htdocs/core/modules/member/doc/doc_generic_member_odt.class.php b/htdocs/core/modules/member/doc/doc_generic_member_odt.class.php index ed48c93c4de..2d125d2743a 100644 --- a/htdocs/core/modules/member/doc/doc_generic_member_odt.class.php +++ b/htdocs/core/modules/member/doc/doc_generic_member_odt.class.php @@ -266,7 +266,7 @@ class doc_generic_member_odt extends ModelePDFMember if (file_exists($dir)) { //print "srctemplatepath=".$srctemplatepath; // Src filename $newfile = basename($srctemplatepath); - $newfiletmp = preg_replace('/\.od(t|s)/i', '', $newfile); + $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile); $newfiletmp = preg_replace('/template_/i', '', $newfiletmp); $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp); diff --git a/htdocs/core/modules/mrp/doc/doc_generic_mo_odt.modules.php b/htdocs/core/modules/mrp/doc/doc_generic_mo_odt.modules.php index b89c4eab2cd..90d1f2f8d6b 100644 --- a/htdocs/core/modules/mrp/doc/doc_generic_mo_odt.modules.php +++ b/htdocs/core/modules/mrp/doc/doc_generic_mo_odt.modules.php @@ -266,7 +266,7 @@ class doc_generic_mo_odt extends ModelePDFMo if (file_exists($dir)) { //print "srctemplatepath=".$srctemplatepath; // Src filename $newfile = basename($srctemplatepath); - $newfiletmp = preg_replace('/\.od(t|s)/i', '', $newfile); + $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile); $newfiletmp = preg_replace('/template_/i', '', $newfiletmp); $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp); $newfiletmp = $objectref . '_' . $newfiletmp; diff --git a/htdocs/core/modules/product/doc/doc_generic_product_odt.modules.php b/htdocs/core/modules/product/doc/doc_generic_product_odt.modules.php index d5321b92ceb..6fde0ce16c4 100644 --- a/htdocs/core/modules/product/doc/doc_generic_product_odt.modules.php +++ b/htdocs/core/modules/product/doc/doc_generic_product_odt.modules.php @@ -274,7 +274,7 @@ class doc_generic_product_odt extends ModelePDFProduct if (file_exists($dir)) { //print "srctemplatepath=".$srctemplatepath; // Src filename $newfile = basename($srctemplatepath); - $newfiletmp = preg_replace('/\.od(t|s)/i', '', $newfile); + $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile); $newfiletmp = preg_replace('/template_/i', '', $newfiletmp); $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp); diff --git a/htdocs/core/modules/project/doc/doc_generic_project_odt.modules.php b/htdocs/core/modules/project/doc/doc_generic_project_odt.modules.php index 2015da21f61..f08a93b4339 100644 --- a/htdocs/core/modules/project/doc/doc_generic_project_odt.modules.php +++ b/htdocs/core/modules/project/doc/doc_generic_project_odt.modules.php @@ -557,7 +557,7 @@ class doc_generic_project_odt extends ModelePDFProjects if (file_exists($dir)) { //print "srctemplatepath=".$srctemplatepath; // Src filename $newfile = basename($srctemplatepath); - $newfiletmp = preg_replace('/\.od(t|s)/i', '', $newfile); + $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile); $newfiletmp = preg_replace('/template_/i', '', $newfiletmp); $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp); $newfiletmp = $objectref . '_' . $newfiletmp; diff --git a/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php b/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php index 6715b2e39a5..de6554137df 100644 --- a/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php +++ b/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php @@ -307,7 +307,7 @@ class doc_generic_proposal_odt extends ModelePDFPropales if (file_exists($dir)) { //print "srctemplatepath=".$srctemplatepath; // Src filename $newfile = basename($srctemplatepath); - $newfiletmp = preg_replace('/\.od(t|s)/i', '', $newfile); + $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile); $newfiletmp = preg_replace('/template_/i', '', $newfiletmp); $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp); diff --git a/htdocs/core/modules/reception/doc/doc_generic_reception_odt.modules.php b/htdocs/core/modules/reception/doc/doc_generic_reception_odt.modules.php index 4ebc742b4bb..84d95a5036c 100644 --- a/htdocs/core/modules/reception/doc/doc_generic_reception_odt.modules.php +++ b/htdocs/core/modules/reception/doc/doc_generic_reception_odt.modules.php @@ -270,7 +270,7 @@ class doc_generic_reception_odt extends ModelePdfReception if (file_exists($dir)) { //print "srctemplatepath=".$srctemplatepath; // Src filename $newfile = basename($srctemplatepath); - $newfiletmp = preg_replace('/\.od(t|s)/i', '', $newfile); + $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile); $newfiletmp = preg_replace('/template_/i', '', $newfiletmp); $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp); $newfiletmp = $objectref . '_' . $newfiletmp; diff --git a/htdocs/core/modules/stock/doc/doc_generic_stock_odt.modules.php b/htdocs/core/modules/stock/doc/doc_generic_stock_odt.modules.php index eb6ba838d7a..358369d1f43 100644 --- a/htdocs/core/modules/stock/doc/doc_generic_stock_odt.modules.php +++ b/htdocs/core/modules/stock/doc/doc_generic_stock_odt.modules.php @@ -277,7 +277,7 @@ class doc_generic_stock_odt extends ModelePDFStock if (file_exists($dir)) { //print "srctemplatepath=".$srctemplatepath; // Src filename $newfile = basename($srctemplatepath); - $newfiletmp = preg_replace('/\.od(t|s)/i', '', $newfile); + $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile); $newfiletmp = preg_replace('/template_/i', '', $newfiletmp); $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp); diff --git a/htdocs/core/modules/supplier_invoice/doc/doc_generic_supplier_invoice_odt.modules.php b/htdocs/core/modules/supplier_invoice/doc/doc_generic_supplier_invoice_odt.modules.php index 8d1f9713c00..c9e18e7c4ab 100644 --- a/htdocs/core/modules/supplier_invoice/doc/doc_generic_supplier_invoice_odt.modules.php +++ b/htdocs/core/modules/supplier_invoice/doc/doc_generic_supplier_invoice_odt.modules.php @@ -266,7 +266,7 @@ class doc_generic_supplier_invoice_odt extends ModelePDFSuppliersInvoices if (file_exists($dir)) { //print "srctemplatepath=".$srctemplatepath; // Src filename $newfile = basename($srctemplatepath); - $newfiletmp = preg_replace('/\.od(t|s)/i', '', $newfile); + $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile); $newfiletmp = preg_replace('/template_/i', '', $newfiletmp); $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp); $newfiletmp = $objectref.'_'.$newfiletmp; diff --git a/htdocs/core/modules/supplier_order/doc/doc_generic_supplier_order_odt.modules.php b/htdocs/core/modules/supplier_order/doc/doc_generic_supplier_order_odt.modules.php index 12bbcc12edc..ca7d1b3d61b 100644 --- a/htdocs/core/modules/supplier_order/doc/doc_generic_supplier_order_odt.modules.php +++ b/htdocs/core/modules/supplier_order/doc/doc_generic_supplier_order_odt.modules.php @@ -261,7 +261,7 @@ class doc_generic_supplier_order_odt extends ModelePDFSuppliersOrders if (file_exists($dir)) { //print "srctemplatepath=".$srctemplatepath; // Src filename $newfile = basename($srctemplatepath); - $newfiletmp = preg_replace('/\.od(t|s)/i', '', $newfile); + $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile); $newfiletmp = preg_replace('/template_/i', '', $newfiletmp); $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp); $newfiletmp = $objectref . '_' . $newfiletmp; diff --git a/htdocs/core/modules/supplier_proposal/doc/doc_generic_supplier_proposal_odt.modules.php b/htdocs/core/modules/supplier_proposal/doc/doc_generic_supplier_proposal_odt.modules.php index 55a7710c5a4..8fca5110896 100644 --- a/htdocs/core/modules/supplier_proposal/doc/doc_generic_supplier_proposal_odt.modules.php +++ b/htdocs/core/modules/supplier_proposal/doc/doc_generic_supplier_proposal_odt.modules.php @@ -295,7 +295,7 @@ class doc_generic_supplier_proposal_odt extends ModelePDFSupplierProposal if (file_exists($dir)) { //print "srctemplatepath=".$srctemplatepath; // Src filename $newfile = basename($srctemplatepath); - $newfiletmp = preg_replace('/\.od(t|s)/i', '', $newfile); + $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile); $newfiletmp = preg_replace('/template_/i', '', $newfiletmp); $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp); diff --git a/htdocs/core/modules/ticket/doc/doc_generic_ticket_odt.modules.php b/htdocs/core/modules/ticket/doc/doc_generic_ticket_odt.modules.php index 1a2d1e537cc..3ae972fef49 100644 --- a/htdocs/core/modules/ticket/doc/doc_generic_ticket_odt.modules.php +++ b/htdocs/core/modules/ticket/doc/doc_generic_ticket_odt.modules.php @@ -264,7 +264,7 @@ class doc_generic_ticket_odt extends ModelePDFTicket if (file_exists($dir)) { //print "srctemplatepath=".$srctemplatepath; // Src filename $newfile = basename($srctemplatepath); - $newfiletmp = preg_replace('/\.od(t|s)/i', '', $newfile); + $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile); $newfiletmp = preg_replace('/template_/i', '', $newfiletmp); $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp); diff --git a/htdocs/core/modules/user/doc/doc_generic_user_odt.modules.php b/htdocs/core/modules/user/doc/doc_generic_user_odt.modules.php index 1c3e346203b..00edf04fac0 100644 --- a/htdocs/core/modules/user/doc/doc_generic_user_odt.modules.php +++ b/htdocs/core/modules/user/doc/doc_generic_user_odt.modules.php @@ -295,7 +295,7 @@ class doc_generic_user_odt extends ModelePDFUser if (file_exists($dir)) { //print "srctemplatepath=".$srctemplatepath; // Src filename $newfile = basename($srctemplatepath); - $newfiletmp = preg_replace('/\.od(t|s)/i', '', $newfile); + $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile); $newfiletmp = preg_replace('/template_/i', '', $newfiletmp); $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp); diff --git a/htdocs/core/modules/usergroup/doc/doc_generic_usergroup_odt.modules.php b/htdocs/core/modules/usergroup/doc/doc_generic_usergroup_odt.modules.php index 4bbb39c0086..a5447260a2f 100644 --- a/htdocs/core/modules/usergroup/doc/doc_generic_usergroup_odt.modules.php +++ b/htdocs/core/modules/usergroup/doc/doc_generic_usergroup_odt.modules.php @@ -277,7 +277,7 @@ class doc_generic_usergroup_odt extends ModelePDFUserGroup if (file_exists($dir)) { //print "srctemplatepath=".$srctemplatepath; // Src filename $newfile = basename($srctemplatepath); - $newfiletmp = preg_replace('/\.od(t|s)/i', '', $newfile); + $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile); $newfiletmp = preg_replace('/template_/i', '', $newfiletmp); $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp); diff --git a/htdocs/modulebuilder/template/core/modules/mymodule/doc/doc_generic_myobject_odt.modules.php b/htdocs/modulebuilder/template/core/modules/mymodule/doc/doc_generic_myobject_odt.modules.php index b7dfc374a52..f89360e8774 100644 --- a/htdocs/modulebuilder/template/core/modules/mymodule/doc/doc_generic_myobject_odt.modules.php +++ b/htdocs/modulebuilder/template/core/modules/mymodule/doc/doc_generic_myobject_odt.modules.php @@ -278,7 +278,7 @@ class doc_generic_myobject_odt extends ModelePDFMyObject if (file_exists($dir)) { //print "srctemplatepath=".$srctemplatepath; // Src filename $newfile = basename($srctemplatepath); - $newfiletmp = preg_replace('/\.od(t|s)/i', '', $newfile); + $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile); $newfiletmp = preg_replace('/template_/i', '', $newfiletmp); $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp); diff --git a/htdocs/recruitment/core/modules/recruitment/doc/doc_generic_recruitmentjobposition_odt.modules.php b/htdocs/recruitment/core/modules/recruitment/doc/doc_generic_recruitmentjobposition_odt.modules.php index cfbf91463e8..147e8ec3519 100644 --- a/htdocs/recruitment/core/modules/recruitment/doc/doc_generic_recruitmentjobposition_odt.modules.php +++ b/htdocs/recruitment/core/modules/recruitment/doc/doc_generic_recruitmentjobposition_odt.modules.php @@ -264,7 +264,7 @@ class doc_generic_recruitmentjobposition_odt extends ModelePDFRecruitmentJobPosi if (file_exists($dir)) { //print "srctemplatepath=".$srctemplatepath; // Src filename $newfile = basename($srctemplatepath); - $newfiletmp = preg_replace('/\.od(t|s)/i', '', $newfile); + $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile); $newfiletmp = preg_replace('/template_/i', '', $newfiletmp); $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp); $newfiletmp = $objectref.'_'.$newfiletmp; diff --git a/qodana.yaml b/qodana.yaml index 853ee69fab5..53cf1a04586 100644 --- a/qodana.yaml +++ b/qodana.yaml @@ -66,4 +66,8 @@ exclude: - name: PhpArraySearchInBooleanContextInspection - name: PhpLoopCanBeReplacedWithStrRepeatInspection - name: PhpPropertyOnlyWrittenInspection - - name: PhpCoveredCharacterInClassInspection \ No newline at end of file + - name: PhpCoveredCharacterInClassInspection + - name: PhpSameParameterValueInspection + - name: PhpConditionCheckedByNextConditionInspection + - name: PhpSuspiciousNameCombinationInspection + \ No newline at end of file diff --git a/test/phpunit/FunctionsLibTest.php b/test/phpunit/FunctionsLibTest.php index 12c8683bb8f..ef5507d8601 100644 --- a/test/phpunit/FunctionsLibTest.php +++ b/test/phpunit/FunctionsLibTest.php @@ -442,6 +442,13 @@ class FunctionsLibTest extends PHPUnit\Framework\TestCase $this->assertEquals('ios', $tmp['browseros']); $this->assertEquals('tablet', $tmp['layout']); $this->assertEquals('iphone', $tmp['phone']); + + //iPad + $user_agent = 'Lynx/2.8.8dev.3 libwww‑FM/2.14 SSL‑MM/1.4.1'; + $tmp=getBrowserInfo($user_agent); + $this->assertEquals('lynxlinks', $tmp['browsername']); + $this->assertEquals('unknown', $tmp['browseros']); + $this->assertEquals('classic', $tmp['layout']); } From 3ca8e8c4935251250c39e01ff4d7b50d103753ed Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 31 Dec 2022 13:47:09 +0100 Subject: [PATCH 0476/1128] Fix warning --- htdocs/comm/propal/card.php | 2 +- htdocs/commande/card.php | 3 ++- qodana.yaml | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index a21e227d822..a3896f7de3c 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -1830,7 +1830,7 @@ if ($action == 'create') { } print ''.$langs->trans('SendingMethod').''; print img_picto('', 'object_dollyrevert', 'class="pictofixedwidth"'); - print $form->selectShippingMethod($shipping_method_id, 'shipping_method_id', '', 1, '', 0, 'maxwidth200 widthcentpercentminusx'); + $form->selectShippingMethod($shipping_method_id, 'shipping_method_id', '', 1, '', 0, 'maxwidth200 widthcentpercentminusx'); print ''; } diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index a644880282b..96c8740a006 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -1833,7 +1833,8 @@ if ($action == 'create' && $usercancreate) { // Shipping Method if (isModEnabled('expedition')) { print ''.$langs->trans('SendingMethod').''; - print img_picto('', 'object_dolly', 'class="pictofixedwidth"').$form->selectShippingMethod($shipping_method_id, 'shipping_method_id', '', 1, '', 0, 'maxwidth200 widthcentpercentminusx'); + print img_picto('', 'object_dolly', 'class="pictofixedwidth"'); + $form->selectShippingMethod($shipping_method_id, 'shipping_method_id', '', 1, '', 0, 'maxwidth200 widthcentpercentminusx'); print ''; } diff --git a/qodana.yaml b/qodana.yaml index 53cf1a04586..361afb8967f 100644 --- a/qodana.yaml +++ b/qodana.yaml @@ -69,5 +69,6 @@ exclude: - name: PhpCoveredCharacterInClassInspection - name: PhpSameParameterValueInspection - name: PhpConditionCheckedByNextConditionInspection + - name: RegExpSingleCharAlternation - name: PhpSuspiciousNameCombinationInspection \ No newline at end of file From 751f79b672a75fa5b99cb1e17f21a50aed3fba10 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 31 Dec 2022 14:01:03 +0100 Subject: [PATCH 0477/1128] Debug v17 --- htdocs/adherents/class/adherent.class.php | 4 +- htdocs/admin/chequereceipts.php | 2 +- htdocs/comm/action/class/actioncomm.class.php | 6 +- htdocs/comm/propal/card.php | 4 +- htdocs/commande/card.php | 5 +- htdocs/compta/bank/class/account.class.php | 4 +- htdocs/compta/facture/card-rec.php | 2 +- htdocs/compta/facture/card.php | 2 +- htdocs/contact/class/contact.class.php | 4 +- htdocs/contrat/card.php | 2 +- htdocs/core/class/commonobject.class.php | 2 +- htdocs/core/class/html.form.class.php | 12 +- .../browser/default/frmfolders.php | 2 +- htdocs/core/lib/security.lib.php | 6 +- htdocs/core/tpl/login.tpl.php | 2 +- htdocs/core/tpl/objectline_create.tpl.php | 2 +- htdocs/core/tpl/objectline_edit.tpl.php | 2 +- htdocs/core/tpl/passwordforgotten.tpl.php | 4 +- htdocs/core/tpl/passwordreset.tpl.php | 4 +- htdocs/expedition/card.php | 1474 ++++++++--------- htdocs/expedition/shipment.php | 12 +- htdocs/fourn/commande/card.php | 2 +- htdocs/fourn/facture/card.php | 2 +- .../class/knowledgerecord.class.php | 4 +- htdocs/product/class/product.class.php | 4 +- htdocs/product/stock/class/entrepot.class.php | 4 +- htdocs/projet/class/project.class.php | 4 +- htdocs/societe/class/societe.class.php | 2 +- htdocs/supplier_proposal/card.php | 5 +- htdocs/ticket/class/ticket.class.php | 4 +- htdocs/user/class/user.class.php | 4 +- 31 files changed, 798 insertions(+), 794 deletions(-) diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php index 4c68b3e91ec..c17a8c1207b 100644 --- a/htdocs/adherents/class/adherent.class.php +++ b/htdocs/adherents/class/adherent.class.php @@ -2871,8 +2871,8 @@ class Adherent extends CommonObject * Adds it to non existing supplied categories. * Existing categories are left untouch. * - * @param int[]|int $categories Category or categories IDs - * @return void + * @param int[]|int $categories Category or categories IDs + * @return int <0 if KO, >0 if OK */ public function setCategories($categories) { diff --git a/htdocs/admin/chequereceipts.php b/htdocs/admin/chequereceipts.php index cf93155b814..ed05180ef24 100644 --- a/htdocs/admin/chequereceipts.php +++ b/htdocs/admin/chequereceipts.php @@ -211,7 +211,7 @@ foreach ($dirmodels as $reldir) { print ''; print $form->textwithpicto('', $htmltooltip, 1, 0); - if ($conf->global->CHEQUERECEIPTS_ADDON.'.php' == $file) { // If module is the one used, we show existing errors + if (getDolGlobalString('CHEQUERECEIPTS_ADDON').'.php' == $file) { // If module is the one used, we show existing errors if (!empty($module->error)) { dol_htmloutput_mesg($module->error, '', 'error', 1); } diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index 64d01817c85..cc43d0fb818 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -1800,8 +1800,8 @@ class ActionComm extends CommonObject * Adds it to non existing supplied categories. * Existing categories are left untouch. * - * @param int[]|int $categories Category or categories IDs - * @return void + * @param int[]|int $categories Category or categories IDs + * @return int <0 if KO, >0 if OK */ public function setCategories($categories) { @@ -1835,7 +1835,7 @@ class ActionComm extends CommonObject $c->add_type($this, Categorie::TYPE_ACTIONCOMM); } } - return; + return 1; } // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index 07729fd55de..e4cd4f9491f 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -1830,7 +1830,7 @@ if ($action == 'create') { } print ''.$langs->trans('SendingMethod').''; print img_picto('', 'object_dollyrevert', 'class="pictofixedwidth"'); - print $form->selectShippingMethod($shipping_method_id, 'shipping_method_id', '', 1, '', 0, 'maxwidth200 widthcentpercentminusx'); + $form->selectShippingMethod($shipping_method_id, 'shipping_method_id', '', 1, '', 0, 'maxwidth200 widthcentpercentminusx'); print ''; } @@ -2776,7 +2776,7 @@ if ($action == 'create') { } if (!empty($object->lines)) { - $ret = $object->printObjectLines($action, $mysoc, $soc, $lineid, 1); + $object->printObjectLines($action, $mysoc, $soc, $lineid, 1); } // Form to add new line diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index 383cf7581e9..66e673abf2d 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -1833,7 +1833,8 @@ if ($action == 'create' && $usercancreate) { // Shipping Method if (isModEnabled('expedition')) { print ''.$langs->trans('SendingMethod').''; - print img_picto('', 'object_dolly', 'class="pictofixedwidth"').$form->selectShippingMethod($shipping_method_id, 'shipping_method_id', '', 1, '', 0, 'maxwidth200 widthcentpercentminusx'); + print img_picto('', 'object_dolly', 'class="pictofixedwidth"'); + $form->selectShippingMethod($shipping_method_id, 'shipping_method_id', '', 1, '', 0, 'maxwidth200 widthcentpercentminusx'); print ''; } @@ -2736,7 +2737,7 @@ if ($action == 'create' && $usercancreate) { // Show object lines if (!empty($object->lines)) { - $ret = $object->printObjectLines($action, $mysoc, $soc, $lineid, 1); + $object->printObjectLines($action, $mysoc, $soc, $lineid, 1); } $numlines = count($object->lines); diff --git a/htdocs/compta/bank/class/account.class.php b/htdocs/compta/bank/class/account.class.php index a73fd2b5f2c..4aea92a510e 100644 --- a/htdocs/compta/bank/class/account.class.php +++ b/htdocs/compta/bank/class/account.class.php @@ -1060,8 +1060,8 @@ class Account extends CommonObject * Adds it to non existing supplied categories. * Existing categories are left untouch. * - * @param int[]|int $categories Category or categories IDs - * @return void + * @param int[]|int $categories Category or categories IDs + * @return int <0 if KO, >0 if OK */ public function setCategories($categories) { diff --git a/htdocs/compta/facture/card-rec.php b/htdocs/compta/facture/card-rec.php index 64a37dcbed4..26fb26d4cdb 100644 --- a/htdocs/compta/facture/card-rec.php +++ b/htdocs/compta/facture/card-rec.php @@ -1635,7 +1635,7 @@ if ($action == 'create') { // Show object lines if (!empty($object->lines)) { $canchangeproduct = 1; - $ret = $object->printObjectLines($action, $mysoc, $object->thirdparty, $lineid, 0); // No date selector for template invoice + $object->printObjectLines($action, $mysoc, $object->thirdparty, $lineid, 0); // No date selector for template invoice } // Form to add new line diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index 36c98a495ec..0589ad18c05 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -5423,7 +5423,7 @@ if ($action == 'create') { // Show object lines if (!empty($object->lines)) { - $ret = $object->printObjectLines($action, $mysoc, $soc, $lineid, 1); + $object->printObjectLines($action, $mysoc, $soc, $lineid, 1); } // Form to add new line diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php index d535da76199..caea7e0c8d5 100644 --- a/htdocs/contact/class/contact.class.php +++ b/htdocs/contact/class/contact.class.php @@ -1700,8 +1700,8 @@ class Contact extends CommonObject * Adds it to non existing supplied categories. * Existing categories are left untouch. * - * @param int[]|int $categories Category or categories IDs - * @return void + * @param int[]|int $categories Category or categories IDs + * @return int <0 if KO, >0 if OK */ public function setCategories($categories) { diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index 7aad6ca9c54..38efdb3cca9 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -1701,7 +1701,7 @@ if ($action == 'create') { if (empty($senderissupplier)) { print $form->select_produits((!empty($object->lines[$cursorline - 1]->fk_product) ? $object->lines[$cursorline - 1]->fk_product : 0), 'idprod'); } else { - print $form->select_produits_fournisseurs((!empty($object->lines[$cursorline - 1]->fk_product) ? $object->lines[$cursorline - 1]->fk_product : 0), 'idprod'); + $form->select_produits_fournisseurs((!empty($object->lines[$cursorline - 1]->fk_product) ? $object->lines[$cursorline - 1]->fk_product : 0), 'idprod'); } } print '
'; diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 599a7866da4..f1920c74931 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -9957,7 +9957,7 @@ abstract class CommonObject * @param int[]|int $categories Category ID or array of Categories IDs * @param string $type_categ Category type ('customer', 'supplier', 'website_page', ...) definied into const class Categorie type * @param boolean $remove_existing True: Remove existings categories from Object if not supplies by $categories, False: let them - * @return int <0 if KO, >0 if OK + * @return int <0 if KO, >0 if OK */ public function setCategoriesCommon($categories, $type_categ = '', $remove_existing = true) { diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 3f4579340d0..c33ffe28551 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -3256,7 +3256,7 @@ class Form * @param string $morecss Add more CSS * @param int $showstockinlist Show stock information (slower). * @param string $placeholder Placeholder - * @return array Array of keys for json + * @return array|string Array of keys for json or HTML component */ public function select_produits_fournisseurs_list($socid, $selected = '', $htmlname = 'productid', $filtertype = '', $filtre = '', $filterkey = '', $statut = -1, $outputmode = 0, $limit = 100, $alsoproductwithnosupplierprice = 0, $morecss = '', $showstockinlist = 0, $placeholder = '') { @@ -3658,14 +3658,14 @@ class Form include_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php'; $out .= ajax_combobox($htmlname); - - if (empty($outputmode)) { - return $out; - } - return $outarray; } else { dol_print_error($this->db); } + + if (empty($outputmode)) { + return $out; + } + return $outarray; } // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps diff --git a/htdocs/core/filemanagerdol/browser/default/frmfolders.php b/htdocs/core/filemanagerdol/browser/default/frmfolders.php index d8d1fae179a..a1b03693324 100644 --- a/htdocs/core/filemanagerdol/browser/default/frmfolders.php +++ b/htdocs/core/filemanagerdol/browser/default/frmfolders.php @@ -53,7 +53,7 @@ top_httphead(); --> diff --git a/htdocs/core/lib/security.lib.php b/htdocs/core/lib/security.lib.php index deff1af567c..0a7e9615a70 100644 --- a/htdocs/core/lib/security.lib.php +++ b/htdocs/core/lib/security.lib.php @@ -723,7 +723,11 @@ function restrictedArea(User $user, $features, $object = 0, $tableandshare = '', if ($mode) { return $ok ? 1 : 0; } else { - return $ok ? 1 : accessforbidden('', 1, 1, 0, $params); + if ($ok) { + return 1; + } else { + accessforbidden('', 1, 1, 0, $params); + } } } diff --git a/htdocs/core/tpl/login.tpl.php b/htdocs/core/tpl/login.tpl.php index eaf2d602571..7f97e751ded 100644 --- a/htdocs/core/tpl/login.tpl.php +++ b/htdocs/core/tpl/login.tpl.php @@ -98,7 +98,7 @@ if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) { $disablenofollow = 0; } -print top_htmlhead('', $titleofloginpage, 0, 0, $arrayofjs, array(), 1, $disablenofollow); +top_htmlhead('', $titleofloginpage, 0, 0, $arrayofjs, array(), 1, $disablenofollow); $colorbackhmenu1 = '60,70,100'; // topmenu diff --git a/htdocs/core/tpl/objectline_create.tpl.php b/htdocs/core/tpl/objectline_create.tpl.php index c3b94332909..ef6987e0e6c 100644 --- a/htdocs/core/tpl/objectline_create.tpl.php +++ b/htdocs/core/tpl/objectline_create.tpl.php @@ -214,7 +214,7 @@ if ($nolinesbefore) { echo ' '; } } - echo $form->select_type_of_lines(GETPOSTISSET("type") ? GETPOST("type", 'alpha', 2) : -1, 'type', 1, 1, $forceall); + $form->select_type_of_lines(GETPOSTISSET("type") ? GETPOST("type", 'alpha', 2) : -1, 'type', 1, 1, $forceall); echo ''; } // Predefined product/service diff --git a/htdocs/core/tpl/objectline_edit.tpl.php b/htdocs/core/tpl/objectline_edit.tpl.php index 5520215d89a..dbc8b407fa5 100644 --- a/htdocs/core/tpl/objectline_edit.tpl.php +++ b/htdocs/core/tpl/objectline_edit.tpl.php @@ -120,7 +120,7 @@ $coldisplay++; print ''; } else { if ($senderissupplier) { - print $form->select_produits_fournisseurs(!empty($line->fk_product) ? $line->fk_product : 0, 'productid'); + $form->select_produits_fournisseurs(!empty($line->fk_product) ? $line->fk_product : 0, 'productid'); } else { print $form->select_produits(!empty($line->fk_product) ? $line->fk_product : 0, 'productid'); } diff --git a/htdocs/core/tpl/passwordforgotten.tpl.php b/htdocs/core/tpl/passwordforgotten.tpl.php index 3fdbcd14ef3..e9d7de9a1bf 100644 --- a/htdocs/core/tpl/passwordforgotten.tpl.php +++ b/htdocs/core/tpl/passwordforgotten.tpl.php @@ -76,7 +76,7 @@ if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) { $disablenofollow = 0; } -print top_htmlhead('', $titleofpage, 0, 0, $arrayofjs, array(), 1, $disablenofollow); +top_htmlhead('', $titleofpage, 0, 0, $arrayofjs, array(), 1, $disablenofollow); $colorbackhmenu1 = '60,70,100'; // topmenu @@ -253,7 +253,7 @@ if ($mode == 'dolibarr' || !$disabled) { diff --git a/htdocs/core/tpl/passwordreset.tpl.php b/htdocs/core/tpl/passwordreset.tpl.php index 1f35b1a251a..e9d518dba64 100644 --- a/htdocs/core/tpl/passwordreset.tpl.php +++ b/htdocs/core/tpl/passwordreset.tpl.php @@ -77,7 +77,7 @@ if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) { $disablenofollow = 0; } -print top_htmlhead('', $titleofpage, 0, 0, $arrayofjs, array(), 1, $disablenofollow); +top_htmlhead('', $titleofpage, 0, 0, $arrayofjs, array(), 1, $disablenofollow); $colorbackhmenu1 = '60,70,100'; // topmenu @@ -292,7 +292,7 @@ if ($mode == 'dolibarr' || !$disabled) { diff --git a/htdocs/expedition/card.php b/htdocs/expedition/card.php index ab8c4a28cbc..3e096bcc55d 100644 --- a/htdocs/expedition/card.php +++ b/htdocs/expedition/card.php @@ -1647,7 +1647,7 @@ if ($action == 'create') { dol_print_error($db); } } -} elseif ($id || $ref) { +} elseif ($object->id > 0) { /* *************************************************************************** */ /* */ /* Edit and view mode */ @@ -1657,828 +1657,826 @@ if ($action == 'create') { $num_prod = count($lines); - if ($object->id > 0) { - if (!empty($object->origin) && $object->origin_id > 0) { - $typeobject = $object->origin; - $origin = $object->origin; - $origin_id = $object->origin_id; - $object->fetch_origin(); // Load property $object->commande, $object->propal, ... + if (!empty($object->origin) && $object->origin_id > 0) { + $typeobject = $object->origin; + $origin = $object->origin; + $origin_id = $object->origin_id; + $object->fetch_origin(); // Load property $object->commande, $object->propal, ... + } + + $soc = new Societe($db); + $soc->fetch($object->socid); + + $res = $object->fetch_optionals(); + + $head = shipping_prepare_head($object); + print dol_get_fiche_head($head, 'shipping', $langs->trans("Shipment"), -1, $object->picto); + + $formconfirm = ''; + + // Confirm deleteion + if ($action == 'delete') { + $formquestion = array(); + if ($object->statut == Expedition::STATUS_CLOSED && !empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT_CLOSE)) { + $formquestion = array( + array( + 'label' => $langs->trans('ShipmentIncrementStockOnDelete'), + 'name' => 'alsoUpdateStock', + 'type' => 'checkbox', + 'value' => 0 + ), + ); + } + $formconfirm = $form->formconfirm( + $_SERVER['PHP_SELF'].'?id='.$object->id, + $langs->trans('DeleteSending'), + $langs->trans("ConfirmDeleteSending", $object->ref), + 'confirm_delete', + $formquestion, + 0, + 1 + ); + } + + // Confirmation validation + if ($action == 'valid') { + $objectref = substr($object->ref, 1, 4); + if ($objectref == 'PROV') { + $numref = $object->getNextNumRef($soc); + } else { + $numref = $object->ref; } - $soc = new Societe($db); - $soc->fetch($object->socid); + $text = $langs->trans("ConfirmValidateSending", $numref); - $res = $object->fetch_optionals(); + if (isModEnabled('notification')) { + require_once DOL_DOCUMENT_ROOT.'/core/class/notify.class.php'; + $notify = new Notify($db); + $text .= '
'; + $text .= $notify->confirmMessage('SHIPPING_VALIDATE', $object->socid, $object); + } - $head = shipping_prepare_head($object); - print dol_get_fiche_head($head, 'shipping', $langs->trans("Shipment"), -1, $object->picto); + $formconfirm = $form->formconfirm($_SERVER['PHP_SELF'].'?id='.$object->id, $langs->trans('ValidateSending'), $text, 'confirm_valid', '', 0, 1); + } + // Confirm cancelation + if ($action == 'cancel') { + $formconfirm = $form->formconfirm($_SERVER['PHP_SELF'].'?id='.$object->id, $langs->trans('CancelSending'), $langs->trans("ConfirmCancelSending", $object->ref), 'confirm_cancel', '', 0, 1); + } - $formconfirm = ''; + // Call Hook formConfirm + $parameters = array('formConfirm' => $formconfirm); + $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + if (empty($reshook)) { + $formconfirm .= $hookmanager->resPrint; + } elseif ($reshook > 0) { + $formconfirm = $hookmanager->resPrint; + } - // Confirm deleteion - if ($action == 'delete') { - $formquestion = array(); - if ($object->statut == Expedition::STATUS_CLOSED && !empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT_CLOSE)) { - $formquestion = array( - array( - 'label' => $langs->trans('ShipmentIncrementStockOnDelete'), - 'name' => 'alsoUpdateStock', - 'type' => 'checkbox', - 'value' => 0 - ), - ); + // Print form confirm + print $formconfirm; + + // Calculate totalWeight and totalVolume for all products + // by adding weight and volume of each product line. + $tmparray = $object->getTotalWeightVolume(); + $totalWeight = $tmparray['weight']; + $totalVolume = $tmparray['volume']; + + + if ($typeobject == 'commande' && $object->$typeobject->id && isModEnabled('commande')) { + $objectsrc = new Commande($db); + $objectsrc->fetch($object->$typeobject->id); + } + if ($typeobject == 'propal' && $object->$typeobject->id && isModEnabled("propal")) { + $objectsrc = new Propal($db); + $objectsrc->fetch($object->$typeobject->id); + } + + // Shipment card + $linkback = ''.$langs->trans("BackToList").''; + $morehtmlref = '
'; + // Ref customer shipment + $morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_customer', $object->ref_customer, $object, $user->rights->expedition->creer, 'string', '', 0, 1); + $morehtmlref .= $form->editfieldval("RefCustomer", 'ref_customer', $object->ref_customer, $object, $user->rights->expedition->creer, 'string'.(isset($conf->global->THIRDPARTY_REF_INPUT_SIZE) ? ':'.$conf->global->THIRDPARTY_REF_INPUT_SIZE : ''), '', null, null, '', 1); + // Thirdparty + $morehtmlref .= '
'.$object->thirdparty->getNomUrl(1); + // Project + if (isModEnabled('project')) { + $langs->load("projects"); + $morehtmlref .= '
'; + if (0) { // Do not change on shipment + $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"'); + if ($action != 'classify') { + $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' '; } - $formconfirm = $form->formconfirm( - $_SERVER['PHP_SELF'].'?id='.$object->id, - $langs->trans('DeleteSending'), - $langs->trans("ConfirmDeleteSending", $object->ref), - 'confirm_delete', - $formquestion, - 0, - 1 - ); - } - - // Confirmation validation - if ($action == 'valid') { - $objectref = substr($object->ref, 1, 4); - if ($objectref == 'PROV') { - $numref = $object->getNextNumRef($soc); - } else { - $numref = $object->ref; - } - - $text = $langs->trans("ConfirmValidateSending", $numref); - - if (isModEnabled('notification')) { - require_once DOL_DOCUMENT_ROOT.'/core/class/notify.class.php'; - $notify = new Notify($db); - $text .= '
'; - $text .= $notify->confirmMessage('SHIPPING_VALIDATE', $object->socid, $object); - } - - $formconfirm = $form->formconfirm($_SERVER['PHP_SELF'].'?id='.$object->id, $langs->trans('ValidateSending'), $text, 'confirm_valid', '', 0, 1); - } - // Confirm cancelation - if ($action == 'cancel') { - $formconfirm = $form->formconfirm($_SERVER['PHP_SELF'].'?id='.$object->id, $langs->trans('CancelSending'), $langs->trans("ConfirmCancelSending", $object->ref), 'confirm_cancel', '', 0, 1); - } - - // Call Hook formConfirm - $parameters = array('formConfirm' => $formconfirm); - $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook - if (empty($reshook)) { - $formconfirm .= $hookmanager->resPrint; - } elseif ($reshook > 0) { - $formconfirm = $hookmanager->resPrint; - } - - // Print form confirm - print $formconfirm; - - // Calculate totalWeight and totalVolume for all products - // by adding weight and volume of each product line. - $tmparray = $object->getTotalWeightVolume(); - $totalWeight = $tmparray['weight']; - $totalVolume = $tmparray['volume']; - - - if ($typeobject == 'commande' && $object->$typeobject->id && isModEnabled('commande')) { - $objectsrc = new Commande($db); - $objectsrc->fetch($object->$typeobject->id); - } - if ($typeobject == 'propal' && $object->$typeobject->id && isModEnabled("propal")) { - $objectsrc = new Propal($db); - $objectsrc->fetch($object->$typeobject->id); - } - - // Shipment card - $linkback = ''.$langs->trans("BackToList").''; - $morehtmlref = '
'; - // Ref customer shipment - $morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_customer', $object->ref_customer, $object, $user->rights->expedition->creer, 'string', '', 0, 1); - $morehtmlref .= $form->editfieldval("RefCustomer", 'ref_customer', $object->ref_customer, $object, $user->rights->expedition->creer, 'string'.(isset($conf->global->THIRDPARTY_REF_INPUT_SIZE) ? ':'.$conf->global->THIRDPARTY_REF_INPUT_SIZE : ''), '', null, null, '', 1); - // Thirdparty - $morehtmlref .= '
'.$object->thirdparty->getNomUrl(1); - // Project - if (isModEnabled('project')) { - $langs->load("projects"); - $morehtmlref .= '
'; - if (0) { // Do not change on shipment - $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"'); - if ($action != 'classify') { - $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' '; - } - $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $objectsrc->socid, $objectsrc->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, ''); - } else { - if (!empty($objectsrc) && !empty($objectsrc->fk_project)) { - $proj = new Project($db); - $proj->fetch($objectsrc->fk_project); - $morehtmlref .= $proj->getNomUrl(1); - if ($proj->title) { - $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).''; - } + $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $objectsrc->socid, $objectsrc->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, ''); + } else { + if (!empty($objectsrc) && !empty($objectsrc->fk_project)) { + $proj = new Project($db); + $proj->fetch($objectsrc->fk_project); + $morehtmlref .= $proj->getNomUrl(1); + if ($proj->title) { + $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).''; } } } - $morehtmlref .= '
'; + } + $morehtmlref .= '
'; - dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref); + dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref); - print '
'; - print '
'; - print '
'; + print '
'; + print '
'; + print '
'; - print ''; + print '
'; - // Linked documents - if ($typeobject == 'commande' && $object->$typeobject->id && isModEnabled('commande')) { - print ''; - print '\n"; - print ''; - } - if ($typeobject == 'propal' && $object->$typeobject->id && isModEnabled("propal")) { - print ''; - print '\n"; - print ''; - } - - // Date creation - print ''; - print '\n"; - print ''; - - // Delivery date planned - print ''; - print ''; - - // Weight + // Linked documents + if ($typeobject == 'commande' && $object->$typeobject->id && isModEnabled('commande')) { print ''; - - // Width - print ''; - - // Height - print ''; - - // Depth - print ''; - - // Volume - print ''; + print $langs->trans("RefOrder").''; print '\n"; print ''; - - // Other attributes - $cols = 2; - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php'; - - print '
'; - print $langs->trans("RefOrder").''; - print $objectsrc->getNomUrl(1, 'commande'); - print "
'; - print $langs->trans("RefProposal").''; - print $objectsrc->getNomUrl(1, 'expedition'); - print "
'.$langs->trans("DateCreation").''.dol_print_date($object->date_creation, "dayhour")."
'; - print ''; - - if ($action != 'editdate_livraison') { - print ''; - } - print '
'; - print $langs->trans('DateDeliveryPlanned'); - print 'id.'">'.img_edit($langs->trans('SetDeliveryDate'), 1).'
'; - print '
'; - if ($action == 'editdate_livraison') { - print ''; - print ''; - print ''; - print $form->selectDate($object->date_delivery ? $object->date_delivery : -1, 'liv_', 1, 1, '', "setdate_livraison", 1, 0); - print ''; - print ''; - } else { - print $object->date_delivery ? dol_print_date($object->date_delivery, 'dayhour') : ' '; - } - print '
'; - print $form->editfieldkey("Weight", 'trueWeight', $object->trueWeight, $object, $user->rights->expedition->creer); - print ''; - - if ($action == 'edittrueWeight') { - print '
'; - print ''; - print ''; - print ''; - print ''; - print $formproduct->selectMeasuringUnits("weight_units", "weight", $object->weight_units, 0, 2); - print ' '; - print ' '; - print '
'; - } else { - print $object->trueWeight; - print ($object->trueWeight && $object->weight_units != '') ? ' '.measuringUnitString(0, "weight", $object->weight_units) : ''; - } - - // Calculated - if ($totalWeight > 0) { - if (!empty($object->trueWeight)) { - print ' ('.$langs->trans("SumOfProductWeights").': '; - } - print showDimensionInBestUnit($totalWeight, 0, "weight", $langs, isset($conf->global->MAIN_WEIGHT_DEFAULT_ROUND) ? $conf->global->MAIN_WEIGHT_DEFAULT_ROUND : -1, isset($conf->global->MAIN_WEIGHT_DEFAULT_UNIT) ? $conf->global->MAIN_WEIGHT_DEFAULT_UNIT : 'no'); - if (!empty($object->trueWeight)) { - print ')'; - } - } - print '
'.$form->editfieldkey("Width", 'trueWidth', $object->trueWidth, $object, $user->rights->expedition->creer).''; - print $form->editfieldval("Width", 'trueWidth', $object->trueWidth, $object, $user->rights->expedition->creer); - print ($object->trueWidth && $object->width_units != '') ? ' '.measuringUnitString(0, "size", $object->width_units) : ''; - print '
'.$form->editfieldkey("Height", 'trueHeight', $object->trueHeight, $object, $user->rights->expedition->creer).''; - if ($action == 'edittrueHeight') { - print '
'; - print ''; - print ''; - print ''; - print ''; - print $formproduct->selectMeasuringUnits("size_units", "size", $object->size_units, 0, 2); - print ' '; - print ' '; - print '
'; - } else { - print $object->trueHeight; - print ($object->trueHeight && $object->height_units != '') ? ' '.measuringUnitString(0, "size", $object->height_units) : ''; - } - - print '
'.$form->editfieldkey("Depth", 'trueDepth', $object->trueDepth, $object, $user->rights->expedition->creer).''; - print $form->editfieldval("Depth", 'trueDepth', $object->trueDepth, $object, $user->rights->expedition->creer); - print ($object->trueDepth && $object->depth_units != '') ? ' '.measuringUnitString(0, "size", $object->depth_units) : ''; - print '
'; - print $langs->trans("Volume"); - print ''; - $calculatedVolume = 0; - $volumeUnit = 0; - if ($object->trueWidth && $object->trueHeight && $object->trueDepth) { - $calculatedVolume = ($object->trueWidth * $object->trueHeight * $object->trueDepth); - $volumeUnit = $object->size_units * 3; - } - // If sending volume not defined we use sum of products - if ($calculatedVolume > 0) { - if ($volumeUnit < 50) { - print showDimensionInBestUnit($calculatedVolume, $volumeUnit, "volume", $langs, isset($conf->global->MAIN_VOLUME_DEFAULT_ROUND) ? $conf->global->MAIN_VOLUME_DEFAULT_ROUND : -1, isset($conf->global->MAIN_VOLUME_DEFAULT_UNIT) ? $conf->global->MAIN_VOLUME_DEFAULT_UNIT : 'no'); - } else { - print $calculatedVolume.' '.measuringUnitString(0, "volume", $volumeUnit); - } - } - if ($totalVolume > 0) { - if ($calculatedVolume) { - print ' ('.$langs->trans("SumOfProductVolumes").': '; - } - print showDimensionInBestUnit($totalVolume, 0, "volume", $langs, isset($conf->global->MAIN_VOLUME_DEFAULT_ROUND) ? $conf->global->MAIN_VOLUME_DEFAULT_ROUND : -1, isset($conf->global->MAIN_VOLUME_DEFAULT_UNIT) ? $conf->global->MAIN_VOLUME_DEFAULT_UNIT : 'no'); - //if (empty($calculatedVolume)) print ' ('.$langs->trans("Calculated").')'; - if ($calculatedVolume) { - print ')'; - } - } + print $objectsrc->getNomUrl(1, 'commande'); print "
'; - - print '
'; - print '
'; - print '
'; - - print ''; - - // Sending method - print ''; + } + if ($typeobject == 'propal' && $object->$typeobject->id && isModEnabled("propal")) { + print ''; + print '\n"; print ''; + } - // Tracking Number - print ''; + // Date creation + print ''; + print '\n"; + print ''; - // Incoterms - if (isModEnabled('incoterm')) { - print ''; - print ''; + // Delivery date planned + print ''; + print ''; + + // Weight + print '
'; - print ''; - - if ($action != 'editshipping_method_id') { - print ''; - } - print '
'; - print $langs->trans('SendingMethod'); - print 'id.'">'.img_edit($langs->trans('SetSendingMethod'), 1).'
'; - print '
'; - if ($action == 'editshipping_method_id') { - print '
'; - print ''; - print ''; - $object->fetch_delivery_methods(); - print $form->selectarray("shipping_method_id", $object->meths, $object->shipping_method_id, 1, 0, 0, "", 1); - if ($user->admin) { - print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1); - } - print ''; - print '
'; - } else { - if ($object->shipping_method_id > 0) { - // Get code using getLabelFromKey - $code = $langs->getLabelFromKey($db, $object->shipping_method_id, 'c_shipment_mode', 'rowid', 'code'); - print $langs->trans("SendingMethod".strtoupper($code)); - } - } - print '
'; + print $langs->trans("RefProposal").''; + print $objectsrc->getNomUrl(1, 'expedition'); + print "
'.$form->editfieldkey("TrackingNumber", 'tracking_number', $object->tracking_number, $object, $user->rights->expedition->creer).''; - print $form->editfieldval("TrackingNumber", 'tracking_number', $object->tracking_url, $object, $user->rights->expedition->creer, 'safehtmlstring', $object->tracking_number); - print '
'.$langs->trans("DateCreation").''.dol_print_date($object->date_creation, "dayhour")."
'; - print '
'; - print $langs->trans('IncotermLabel'); - print ''; - if ($user->rights->expedition->creer) { - print ''.img_edit().''; - } else { - print ' '; - } - print '
'; - print '
'; - if ($action != 'editincoterm') { - print $form->textwithpicto($object->display_incoterms(), $object->label_incoterms, 1); - } else { - print $form->select_incoterms((!empty($object->fk_incoterms) ? $object->fk_incoterms : ''), (!empty($object->location_incoterms) ? $object->location_incoterms : ''), $_SERVER['PHP_SELF'].'?id='.$object->id); - } - print '
'; + print ''; + + if ($action != 'editdate_livraison') { + print ''; + } + print '
'; + print $langs->trans('DateDeliveryPlanned'); + print 'id.'">'.img_edit($langs->trans('SetDeliveryDate'), 1).'
'; + print '
'; + if ($action == 'editdate_livraison') { + print '
'; + print ''; + print ''; + print $form->selectDate($object->date_delivery ? $object->date_delivery : -1, 'liv_', 1, 1, '', "setdate_livraison", 1, 0); + print ''; + print '
'; + } else { + print $object->date_delivery ? dol_print_date($object->date_delivery, 'dayhour') : ' '; + } + print '
'; + print $form->editfieldkey("Weight", 'trueWeight', $object->trueWeight, $object, $user->rights->expedition->creer); + print ''; + + if ($action == 'edittrueWeight') { + print '
'; + print ''; + print ''; + print ''; + print ''; + print $formproduct->selectMeasuringUnits("weight_units", "weight", $object->weight_units, 0, 2); + print ' '; + print ' '; + print '
'; + } else { + print $object->trueWeight; + print ($object->trueWeight && $object->weight_units != '') ? ' '.measuringUnitString(0, "weight", $object->weight_units) : ''; + } + + // Calculated + if ($totalWeight > 0) { + if (!empty($object->trueWeight)) { + print ' ('.$langs->trans("SumOfProductWeights").': '; } - - // Other attributes - $parameters = array('colspan' => ' colspan="3"', 'cols' => '3'); - $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - - print "
"; - - print '
'; - print '
'; - - print '
'; - - - // Lines of products - - if ($action == 'editline') { - print '
- - - - - '; + print showDimensionInBestUnit($totalWeight, 0, "weight", $langs, isset($conf->global->MAIN_WEIGHT_DEFAULT_ROUND) ? $conf->global->MAIN_WEIGHT_DEFAULT_ROUND : -1, isset($conf->global->MAIN_WEIGHT_DEFAULT_UNIT) ? $conf->global->MAIN_WEIGHT_DEFAULT_UNIT : 'no'); + if (!empty($object->trueWeight)) { + print ')'; } - print '
'; + } + print ''; - print '
'; - print ''; - print ''; - print ''; - // Adds a line numbering column - if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER)) { - print ''; - } - // Product/Service - print ''; - // Qty - print ''; - if ($origin && $origin_id > 0) { - print ''; - } - if ($action == 'editline') { - $editColspan = 3; - if (!isModEnabled('stock')) { - $editColspan--; - } - if (empty($conf->productbatch->enabled)) { - $editColspan--; - } - print ''; + // Width + print ''; + + // Height + print ''; + + // Depth + print ''; + + // Volume + print ''; + print ''; - } else { - print ''; - } - if (isModEnabled('stock')) { - print ''; - } - - if (isModEnabled('productbatch')) { - print ''; - } + print $calculatedVolume.' '.measuringUnitString(0, "volume", $volumeUnit); } - print ''; - print ''; - //print ''; - if ($object->statut == 0) { - print ''; - print ''; + } + if ($totalVolume > 0) { + if ($calculatedVolume) { + print ' ('.$langs->trans("SumOfProductVolumes").': '; } - print "\n"; - print ''; + print showDimensionInBestUnit($totalVolume, 0, "volume", $langs, isset($conf->global->MAIN_VOLUME_DEFAULT_ROUND) ? $conf->global->MAIN_VOLUME_DEFAULT_ROUND : -1, isset($conf->global->MAIN_VOLUME_DEFAULT_UNIT) ? $conf->global->MAIN_VOLUME_DEFAULT_UNIT : 'no'); + //if (empty($calculatedVolume)) print ' ('.$langs->trans("Calculated").')'; + if ($calculatedVolume) { + print ')'; + } + } + print "\n"; + print ''; - $outputlangs = $langs; + // Other attributes + $cols = 2; + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php'; - if (getDolGlobalInt('MAIN_MULTILANGS') && !empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) { - $object->fetch_thirdparty(); - $newlang = ''; - if (empty($newlang) && GETPOST('lang_id', 'aZ09')) { - $newlang = GETPOST('lang_id', 'aZ09'); - } - if (empty($newlang)) { - $newlang = $object->thirdparty->default_lang; - } - if (!empty($newlang)) { - $outputlangs = new Translate("", $conf); - $outputlangs->setDefaultLang($newlang); - } + print '
 '.$langs->trans("Products").''.$langs->trans("QtyOrdered").''.$langs->trans("QtyInOtherShipments").''; - if ($object->statut <= 1) { - print $langs->trans("QtyToShip").' - '; - } else { - print $langs->trans("QtyShipped").' - '; - } - if (isModEnabled('stock')) { - print $langs->trans("WarehouseSource").' - '; - } - if (isModEnabled('productbatch')) { - print $langs->trans("Batch"); - } - print '
'.$form->editfieldkey("Width", 'trueWidth', $object->trueWidth, $object, $user->rights->expedition->creer).''; + print $form->editfieldval("Width", 'trueWidth', $object->trueWidth, $object, $user->rights->expedition->creer); + print ($object->trueWidth && $object->width_units != '') ? ' '.measuringUnitString(0, "size", $object->width_units) : ''; + print '
'.$form->editfieldkey("Height", 'trueHeight', $object->trueHeight, $object, $user->rights->expedition->creer).''; + if ($action == 'edittrueHeight') { + print ''; + print ''; + print ''; + print ''; + print ''; + print $formproduct->selectMeasuringUnits("size_units", "size", $object->size_units, 0, 2); + print ' '; + print ' '; + print ''; + } else { + print $object->trueHeight; + print ($object->trueHeight && $object->height_units != '') ? ' '.measuringUnitString(0, "size", $object->height_units) : ''; + } + + print '
'.$form->editfieldkey("Depth", 'trueDepth', $object->trueDepth, $object, $user->rights->expedition->creer).''; + print $form->editfieldval("Depth", 'trueDepth', $object->trueDepth, $object, $user->rights->expedition->creer); + print ($object->trueDepth && $object->depth_units != '') ? ' '.measuringUnitString(0, "size", $object->depth_units) : ''; + print '
'; + print $langs->trans("Volume"); + print ''; + $calculatedVolume = 0; + $volumeUnit = 0; + if ($object->trueWidth && $object->trueHeight && $object->trueDepth) { + $calculatedVolume = ($object->trueWidth * $object->trueHeight * $object->trueDepth); + $volumeUnit = $object->size_units * 3; + } + // If sending volume not defined we use sum of products + if ($calculatedVolume > 0) { + if ($volumeUnit < 50) { + print showDimensionInBestUnit($calculatedVolume, $volumeUnit, "volume", $langs, isset($conf->global->MAIN_VOLUME_DEFAULT_ROUND) ? $conf->global->MAIN_VOLUME_DEFAULT_ROUND : -1, isset($conf->global->MAIN_VOLUME_DEFAULT_UNIT) ? $conf->global->MAIN_VOLUME_DEFAULT_UNIT : 'no'); } else { - if ($object->statut <= 1) { - print ''.$langs->trans("QtyToShip").''.$langs->trans("QtyShipped").''.$langs->trans("WarehouseSource").''.$langs->trans("Batch").''.$langs->trans("CalculatedWeight").''.$langs->trans("CalculatedVolume").''.$langs->trans("Size").'
'; + + print '
'; + print '
'; + print '
'; + + print ''; + + // Sending method + print ''; + print ''; + + // Tracking Number + print ''; + + // Incoterms + if (isModEnabled('incoterm')) { + print ''; + print ''; + } + + // Other attributes + $parameters = array('colspan' => ' colspan="3"', 'cols' => '3'); + $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + + print "
'; + print ''; + + if ($action != 'editshipping_method_id') { + print ''; + } + print '
'; + print $langs->trans('SendingMethod'); + print 'id.'">'.img_edit($langs->trans('SetSendingMethod'), 1).'
'; + print '
'; + if ($action == 'editshipping_method_id') { + print '
'; + print ''; + print ''; + $object->fetch_delivery_methods(); + print $form->selectarray("shipping_method_id", $object->meths, $object->shipping_method_id, 1, 0, 0, "", 1); + if ($user->admin) { + print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1); + } + print ''; + print '
'; + } else { + if ($object->shipping_method_id > 0) { + // Get code using getLabelFromKey + $code = $langs->getLabelFromKey($db, $object->shipping_method_id, 'c_shipment_mode', 'rowid', 'code'); + print $langs->trans("SendingMethod".strtoupper($code)); + } + } + print '
'.$form->editfieldkey("TrackingNumber", 'tracking_number', $object->tracking_number, $object, $user->rights->expedition->creer).''; + print $form->editfieldval("TrackingNumber", 'tracking_number', $object->tracking_url, $object, $user->rights->expedition->creer, 'safehtmlstring', $object->tracking_number); + print '
'; + print '
'; + print $langs->trans('IncotermLabel'); + print ''; + if ($user->rights->expedition->creer) { + print ''.img_edit().''; + } else { + print ' '; + } + print '
'; + print '
'; + if ($action != 'editincoterm') { + print $form->textwithpicto($object->display_incoterms(), $object->label_incoterms, 1); + } else { + print $form->select_incoterms((!empty($object->fk_incoterms) ? $object->fk_incoterms : ''), (!empty($object->location_incoterms) ? $object->location_incoterms : ''), $_SERVER['PHP_SELF'].'?id='.$object->id); + } + print '
"; + + print '
'; + print '
'; + + print '
'; + + + // Lines of products + + if ($action == 'editline') { + print '
+ + + + + '; + } + print '
'; + + print '
'; + print ''; + print ''; + print ''; + // Adds a line numbering column + if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER)) { + print ''; + } + // Product/Service + print ''; + // Qty + print ''; + if ($origin && $origin_id > 0) { + print ''; + } + if ($action == 'editline') { + $editColspan = 3; + if (!isModEnabled('stock')) { + $editColspan--; + } + if (empty($conf->productbatch->enabled)) { + $editColspan--; + } + print ''; + } else { + if ($object->statut <= 1) { + print ''; + } else { + print ''; + } + if (isModEnabled('stock')) { + print ''; } - // 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 .= ", ed.rowid as shipmentline_id, ed.qty as qty_shipped, ed.fk_expedition as expedition_id, ed.fk_origin_line, 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 ($conf->delivery_note->enabled) $sql .= ", l.rowid as livraison_id, l.ref as livraison_ref, l.date_delivery, ld.qty as qty_received"; - $sql .= ', p.label as product_label, p.ref, p.fk_product_type, p.rowid as prodid, p.tosell as product_tosell, p.tobuy as product_tobuy, p.tobatch as product_tobatch'; - $sql .= ', p.description as product_desc'; - $sql .= " FROM ".MAIN_DB_PREFIX."expeditiondet as ed"; - $sql .= ", ".MAIN_DB_PREFIX."expedition as e"; - $sql .= ", ".MAIN_DB_PREFIX.$origin."det as obj"; - //if ($conf->delivery_note->enabled) $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."delivery as l ON l.fk_expedition = e.rowid LEFT JOIN ".MAIN_DB_PREFIX."deliverydet as ld ON ld.fk_delivery = l.rowid AND obj.rowid = ld.fk_origin_line"; - $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON obj.fk_product = p.rowid"; - $sql .= " WHERE e.entity IN (".getEntity('expedition').")"; - $sql .= " AND obj.fk_".$origin." = ".((int) $origin_id); - $sql .= " AND obj.rowid = ed.fk_origin_line"; - $sql .= " AND ed.fk_expedition = e.rowid"; - //if ($filter) $sql.= $filter; - $sql .= " ORDER BY obj.fk_product"; + if (isModEnabled('productbatch')) { + print ''; + } + } + print ''; + print ''; + //print ''; + if ($object->statut == 0) { + print ''; + print ''; + } + print "\n"; + print ''; - dol_syslog("expedition/card.php get list of shipment lines", LOG_DEBUG); - $resql = $db->query($sql); - if ($resql) { - $num = $db->num_rows($resql); - $i = 0; + $outputlangs = $langs; - while ($i < $num) { - $obj = $db->fetch_object($resql); - if ($obj) { - // $obj->rowid is rowid in $origin."det" table - $alreadysent[$obj->rowid][$obj->shipmentline_id] = array( - 'shipment_ref'=>$obj->shipment_ref, 'shipment_id'=>$obj->shipment_id, 'warehouse'=>$obj->fk_entrepot, 'qty_shipped'=>$obj->qty_shipped, - 'product_tosell'=>$obj->product_tosell, 'product_tobuy'=>$obj->product_tobuy, 'product_tobatch'=>$obj->product_tobatch, - 'date_valid'=>$db->jdate($obj->date_valid), 'date_delivery'=>$db->jdate($obj->date_delivery)); - } - $i++; + if (getDolGlobalInt('MAIN_MULTILANGS') && !empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) { + $object->fetch_thirdparty(); + $newlang = ''; + if (empty($newlang) && GETPOST('lang_id', 'aZ09')) { + $newlang = GETPOST('lang_id', 'aZ09'); + } + if (empty($newlang)) { + $newlang = $object->thirdparty->default_lang; + } + if (!empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + } + + // 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 .= ", ed.rowid as shipmentline_id, ed.qty as qty_shipped, ed.fk_expedition as expedition_id, ed.fk_origin_line, 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 ($conf->delivery_note->enabled) $sql .= ", l.rowid as livraison_id, l.ref as livraison_ref, l.date_delivery, ld.qty as qty_received"; + $sql .= ', p.label as product_label, p.ref, p.fk_product_type, p.rowid as prodid, p.tosell as product_tosell, p.tobuy as product_tobuy, p.tobatch as product_tobatch'; + $sql .= ', p.description as product_desc'; + $sql .= " FROM ".MAIN_DB_PREFIX."expeditiondet as ed"; + $sql .= ", ".MAIN_DB_PREFIX."expedition as e"; + $sql .= ", ".MAIN_DB_PREFIX.$origin."det as obj"; + //if ($conf->delivery_note->enabled) $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."delivery as l ON l.fk_expedition = e.rowid LEFT JOIN ".MAIN_DB_PREFIX."deliverydet as ld ON ld.fk_delivery = l.rowid AND obj.rowid = ld.fk_origin_line"; + $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON obj.fk_product = p.rowid"; + $sql .= " WHERE e.entity IN (".getEntity('expedition').")"; + $sql .= " AND obj.fk_".$origin." = ".((int) $origin_id); + $sql .= " AND obj.rowid = ed.fk_origin_line"; + $sql .= " AND ed.fk_expedition = e.rowid"; + //if ($filter) $sql.= $filter; + $sql .= " ORDER BY obj.fk_product"; + + dol_syslog("expedition/card.php get list of shipment lines", LOG_DEBUG); + $resql = $db->query($sql); + if ($resql) { + $num = $db->num_rows($resql); + $i = 0; + + while ($i < $num) { + $obj = $db->fetch_object($resql); + if ($obj) { + // $obj->rowid is rowid in $origin."det" table + $alreadysent[$obj->rowid][$obj->shipmentline_id] = array( + 'shipment_ref'=>$obj->shipment_ref, 'shipment_id'=>$obj->shipment_id, 'warehouse'=>$obj->fk_entrepot, 'qty_shipped'=>$obj->qty_shipped, + 'product_tosell'=>$obj->product_tosell, 'product_tobuy'=>$obj->product_tobuy, 'product_tobatch'=>$obj->product_tobatch, + 'date_valid'=>$db->jdate($obj->date_valid), 'date_delivery'=>$db->jdate($obj->date_delivery)); } + $i++; } - //var_dump($alreadysent); + } + //var_dump($alreadysent); + } + + print ''; + + // Loop on each product to send/sent + for ($i = 0; $i < $num_prod; $i++) { + $parameters = array('i' => $i, 'line' => $lines[$i], 'line_id' => $line_id, 'num' => $num_prod, 'alreadysent' => $alreadysent, 'editColspan' => !empty($editColspan) ? $editColspan : 0, 'outputlangs' => $outputlangs); + $reshook = $hookmanager->executeHooks('printObjectLine', $parameters, $object, $action); + if ($reshook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); } - print ''; + if (empty($reshook)) { + print ''; // id of order line + print ''; - // Loop on each product to send/sent - for ($i = 0; $i < $num_prod; $i++) { - $parameters = array('i' => $i, 'line' => $lines[$i], 'line_id' => $line_id, 'num' => $num_prod, 'alreadysent' => $alreadysent, 'editColspan' => !empty($editColspan) ? $editColspan : 0, 'outputlangs' => $outputlangs); - $reshook = $hookmanager->executeHooks('printObjectLine', $parameters, $object, $action); - if ($reshook < 0) { - setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + // # + if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER)) { + print ''; } - if (empty($reshook)) { - print ''; // id of order line - print ''; - - // # - if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER)) { - print ''; - } - - // Predefined product or service - if ($lines[$i]->fk_product > 0) { - // Define output language - if (getDolGlobalInt('MAIN_MULTILANGS') && !empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) { - $prod = new Product($db); - $prod->fetch($lines[$i]->fk_product); - $label = (!empty($prod->multilangs[$outputlangs->defaultlang]["label"])) ? $prod->multilangs[$outputlangs->defaultlang]["label"] : $lines[$i]->product_label; - } else { - $label = (!empty($lines[$i]->label) ? $lines[$i]->label : $lines[$i]->product_label); - } - - print '\n"; + // Predefined product or service + if ($lines[$i]->fk_product > 0) { + // Define output language + if (getDolGlobalInt('MAIN_MULTILANGS') && !empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) { + $prod = new Product($db); + $prod->fetch($lines[$i]->fk_product); + $label = (!empty($prod->multilangs[$outputlangs->defaultlang]["label"])) ? $prod->multilangs[$outputlangs->defaultlang]["label"] : $lines[$i]->product_label; } else { - print '\n"; + $label = (!empty($lines[$i]->label) ? $lines[$i]->label : $lines[$i]->product_label); } - $unit_order = ''; - if (!empty($conf->global->PRODUCT_USE_UNITS)) { - $unit_order = measuringUnitString($lines[$i]->fk_unit); + print '\n"; + } else { + print ''; + if (!empty($lines[$i]->label)) { + $text .= ' '.$lines[$i]->label.''; + print $form->textwithtooltip($text, $lines[$i]->description, 3, '', '', $i); + } else { + print $text.' '.nl2br($lines[$i]->description); + } - // Qty in other shipments (with shipment and warehouse used) - if ($origin && $origin_id > 0) { - print '\n"; + } - $j++; - if ($j > 1) { - print '
'; - } - $shipment_static->fetch($shipmentline_var['shipment_id']); - print $shipment_static->getNomUrl(1); - print ' - '.$shipmentline_var['qty_shipped']; - $htmltext = $langs->trans("DateValidation").' : '.(empty($shipmentline_var['date_valid']) ? $langs->trans("Draft") : dol_print_date($shipmentline_var['date_valid'], 'dayhour')); - if (isModEnabled('stock') && $shipmentline_var['warehouse'] > 0) { - $warehousestatic->fetch($shipmentline_var['warehouse']); - $htmltext .= '
'.$langs->trans("FromLocation").' : '.$warehousestatic->getNomUrl(1, '', 0, 1); - } - print ' '.$form->textwithpicto('', $htmltext, 1); + $unit_order = ''; + if (!empty($conf->global->PRODUCT_USE_UNITS)) { + $unit_order = measuringUnitString($lines[$i]->fk_unit); + } + + // Qty ordered + print ''; + + // Qty in other shipments (with shipment and warehouse used) + if ($origin && $origin_id > 0) { + print ''; } + print ''; + } - if ($action == 'editline' && $lines[$i]->id == $line_id) { - // edit mode - print ''; + } else { + // Qty to ship or shipped + print ''; + + // Warehouse source + if (isModEnabled('stock')) { + print ''; + } + + // Batch number managment + if (isModEnabled('productbatch')) { + if (isset($lines[$i]->detail_batch)) { + print ''; + print ''; - } - - // Batch number managment - if (isModEnabled('productbatch')) { - if (isset($lines[$i]->detail_batch)) { - print ''; - print ''; - } else { - print ''; - } - } - } - - // Weight - print ''; - - // Volume - print ''; - - // Size - //print ''; - - if ($action == 'editline' && $lines[$i]->id == $line_id) { - print ''; - } elseif ($object->statut == Expedition::STATUS_DRAFT) { - // edit-delete buttons - print ''; - print ''; - - // Display lines extrafields - if (!empty($rowExtrafieldsStart)) { - print $rowExtrafieldsStart; - print $rowExtrafieldsView; - print $rowEnd; - } - } - print ""; - - // Display lines extrafields. - // $line is a line of shipment - if (!empty($extrafields)) { - $colspan = 6; - if ($origin && $origin_id > 0) { - $colspan++; - } - if (isModEnabled('productbatch')) { - $colspan++; - } - if (isModEnabled('stock')) { - $colspan++; - } - - $line = $lines[$i]; - $line->fetch_optionals(); - - // TODO Show all in same line by setting $display_type = 'line' - if ($action == 'editline' && $line->id == $line_id) { - print $lines[$i]->showOptionals($extrafields, 'edit', array('colspan'=>$colspan), !empty($indiceAsked) ? $indiceAsked : '', '', 0, 'card'); } else { - print $lines[$i]->showOptionals($extrafields, 'view', array('colspan'=>$colspan), !empty($indiceAsked) ? $indiceAsked : '', '', 0, 'card'); + print ''; } } } + + // Weight + print ''; + + // Volume + print ''; + + // Size + //print ''; + + if ($action == 'editline' && $lines[$i]->id == $line_id) { + print ''; + } elseif ($object->statut == Expedition::STATUS_DRAFT) { + // edit-delete buttons + print ''; + print ''; + + // Display lines extrafields + if (!empty($rowExtrafieldsStart)) { + print $rowExtrafieldsStart; + print $rowExtrafieldsView; + print $rowEnd; + } + } + print ""; + + // Display lines extrafields. + // $line is a line of shipment + if (!empty($extrafields)) { + $colspan = 6; + if ($origin && $origin_id > 0) { + $colspan++; + } + if (isModEnabled('productbatch')) { + $colspan++; + } + if (isModEnabled('stock')) { + $colspan++; + } + + $line = $lines[$i]; + $line->fetch_optionals(); + + // TODO Show all in same line by setting $display_type = 'line' + if ($action == 'editline' && $line->id == $line_id) { + print $lines[$i]->showOptionals($extrafields, 'edit', array('colspan'=>$colspan), !empty($indiceAsked) ? $indiceAsked : '', '', 0, 'card'); + } else { + print $lines[$i]->showOptionals($extrafields, 'view', array('colspan'=>$colspan), !empty($indiceAsked) ? $indiceAsked : '', '', 0, 'card'); + } + } } - - // TODO Show also lines ordered but not delivered - - print "
 '.$langs->trans("Products").''.$langs->trans("QtyOrdered").''.$langs->trans("QtyInOtherShipments").''; + if ($object->statut <= 1) { + print $langs->trans("QtyToShip").' - '; + } else { + print $langs->trans("QtyShipped").' - '; + } + if (isModEnabled('stock')) { + print $langs->trans("WarehouseSource").' - '; + } + if (isModEnabled('productbatch')) { + print $langs->trans("Batch"); + } + print ''.$langs->trans("QtyToShip").''.$langs->trans("QtyShipped").''.$langs->trans("WarehouseSource").''.$langs->trans("Batch").''.$langs->trans("CalculatedWeight").''.$langs->trans("CalculatedVolume").''.$langs->trans("Size").'
'.($i + 1).'
'.($i + 1).''; - - // Show product and description - $product_static->type = $lines[$i]->fk_product_type; - $product_static->id = $lines[$i]->fk_product; - $product_static->ref = $lines[$i]->ref; - $product_static->status = $lines[$i]->product_tosell; - $product_static->status_buy = $lines[$i]->product_tobuy; - $product_static->status_batch = $lines[$i]->product_tobatch; - - $product_static->weight = $lines[$i]->weight; - $product_static->weight_units = $lines[$i]->weight_units; - $product_static->length = $lines[$i]->length; - $product_static->length_units = $lines[$i]->length_units; - $product_static->width = !empty($lines[$i]->width) ? $lines[$i]->width : 0; - $product_static->width_units = !empty($lines[$i]->width_units) ? $lines[$i]->width_units : 0; - $product_static->height = !empty($lines[$i]->height) ? $lines[$i]->height : 0; - $product_static->height_units = !empty($lines[$i]->height_units) ? $lines[$i]->height_units : 0; - $product_static->surface = $lines[$i]->surface; - $product_static->surface_units = $lines[$i]->surface_units; - $product_static->volume = $lines[$i]->volume; - $product_static->volume_units = $lines[$i]->volume_units; - - $text = $product_static->getNomUrl(1); - $text .= ' - '.$label; - $description = (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE') ? '' : dol_htmlentitiesbr($lines[$i]->description)); - print $form->textwithtooltip($text, $description, 3, '', '', $i); - print_date_range(!empty($lines[$i]->date_start) ? $lines[$i]->date_start : '', !empty($lines[$i]->date_end) ? $lines[$i]->date_end : ''); - if (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE')) { - print (!empty($lines[$i]->description) && $lines[$i]->description != $lines[$i]->product) ? '
'.dol_htmlentitiesbr($lines[$i]->description) : ''; - } - print "
'; - if ($lines[$i]->product_type == Product::TYPE_SERVICE) { - $text = img_object($langs->trans('Service'), 'service'); - } else { - $text = img_object($langs->trans('Product'), 'product'); - } - - if (!empty($lines[$i]->label)) { - $text .= ' '.$lines[$i]->label.''; - print $form->textwithtooltip($text, $lines[$i]->description, 3, '', '', $i); - } else { - print $text.' '.nl2br($lines[$i]->description); - } - - print_date_range($lines[$i]->date_start, $lines[$i]->date_end); - print "'; + + // Show product and description + $product_static->type = $lines[$i]->fk_product_type; + $product_static->id = $lines[$i]->fk_product; + $product_static->ref = $lines[$i]->ref; + $product_static->status = $lines[$i]->product_tosell; + $product_static->status_buy = $lines[$i]->product_tobuy; + $product_static->status_batch = $lines[$i]->product_tobatch; + + $product_static->weight = $lines[$i]->weight; + $product_static->weight_units = $lines[$i]->weight_units; + $product_static->length = $lines[$i]->length; + $product_static->length_units = $lines[$i]->length_units; + $product_static->width = !empty($lines[$i]->width) ? $lines[$i]->width : 0; + $product_static->width_units = !empty($lines[$i]->width_units) ? $lines[$i]->width_units : 0; + $product_static->height = !empty($lines[$i]->height) ? $lines[$i]->height : 0; + $product_static->height_units = !empty($lines[$i]->height_units) ? $lines[$i]->height_units : 0; + $product_static->surface = $lines[$i]->surface; + $product_static->surface_units = $lines[$i]->surface_units; + $product_static->volume = $lines[$i]->volume; + $product_static->volume_units = $lines[$i]->volume_units; + + $text = $product_static->getNomUrl(1); + $text .= ' - '.$label; + $description = (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE') ? '' : dol_htmlentitiesbr($lines[$i]->description)); + print $form->textwithtooltip($text, $description, 3, '', '', $i); + print_date_range(!empty($lines[$i]->date_start) ? $lines[$i]->date_start : '', !empty($lines[$i]->date_end) ? $lines[$i]->date_end : ''); + if (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE')) { + print (!empty($lines[$i]->description) && $lines[$i]->description != $lines[$i]->product) ? '
'.dol_htmlentitiesbr($lines[$i]->description) : ''; + } + print "
'; + if ($lines[$i]->product_type == Product::TYPE_SERVICE) { + $text = img_object($langs->trans('Service'), 'service'); + } else { + $text = img_object($langs->trans('Product'), 'product'); } - // Qty ordered - print ''.$lines[$i]->qty_asked.' '.$unit_order.''; - foreach ($alreadysent as $key => $val) { - if ($lines[$i]->fk_origin_line == $key) { - $j = 0; - foreach ($val as $shipmentline_id => $shipmentline_var) { - if ($shipmentline_var['shipment_id'] == $lines[$i]->fk_expedition) { - continue; // We want to show only "other shipments" - } + print_date_range($lines[$i]->date_start, $lines[$i]->date_end); + print "'.$lines[$i]->qty_asked.' '.$unit_order.''; + foreach ($alreadysent as $key => $val) { + if ($lines[$i]->fk_origin_line == $key) { + $j = 0; + foreach ($val as $shipmentline_id => $shipmentline_var) { + if ($shipmentline_var['shipment_id'] == $lines[$i]->fk_expedition) { + continue; // We want to show only "other shipments" } + + $j++; + if ($j > 1) { + print '
'; + } + $shipment_static->fetch($shipmentline_var['shipment_id']); + print $shipment_static->getNomUrl(1); + print ' - '.$shipmentline_var['qty_shipped']; + $htmltext = $langs->trans("DateValidation").' : '.(empty($shipmentline_var['date_valid']) ? $langs->trans("Draft") : dol_print_date($shipmentline_var['date_valid'], 'dayhour')); + if (isModEnabled('stock') && $shipmentline_var['warehouse'] > 0) { + $warehousestatic->fetch($shipmentline_var['warehouse']); + $htmltext .= '
'.$langs->trans("FromLocation").' : '.$warehousestatic->getNomUrl(1, '', 0, 1); + } + print ' '.$form->textwithpicto('', $htmltext, 1); } } - print '
'; - if (is_array($lines[$i]->detail_batch) && count($lines[$i]->detail_batch) > 0) { - print ''; - $line = new ExpeditionLigne($db); - foreach ($lines[$i]->detail_batch as $detail_batch) { - print ''; - // Qty to ship or shipped - print ''; - // Batch number managment - if ($lines[$i]->entrepot_id == 0) { - // only show lot numbers from src warehouse when shipping from multiple warehouses - $line->fetch($detail_batch->fk_expeditiondet); - } - $entrepot_id = !empty($detail_batch->entrepot_id)?$detail_batch->entrepot_id:$lines[$i]->entrepot_id; - print ''; - print ''; - } - // add a 0 qty lot row to be able to add a lot + if ($action == 'editline' && $lines[$i]->id == $line_id) { + // edit mode + print ''; - } else { + } elseif (!isModEnabled('stock') && empty($conf->productbatch->enabled)) { // both product batch and stock are not activated. + print ''; + print ''; // Qty to ship or shipped - print ''; - + print ''; // Warehouse source - if (isModEnabled('stock')) { - print ''; + // Batch number managment + print ''; + print ''; + } + + print '
'.$formproduct->selectLotStock($detail_batch->fk_origin_stock, 'batchl'.$detail_batch->fk_expeditiondet.'_'.$detail_batch->fk_origin_stock, '', 1, 0, $lines[$i]->fk_product, $entrepot_id).'
'; + if (is_array($lines[$i]->detail_batch) && count($lines[$i]->detail_batch) > 0) { + print ''; + $line = new ExpeditionLigne($db); + foreach ($lines[$i]->detail_batch as $detail_batch) { print ''; // Qty to ship or shipped - print ''; + print ''; // Batch number managment - print ''; + if ($lines[$i]->entrepot_id == 0) { + // only show lot numbers from src warehouse when shipping from multiple warehouses + $line->fetch($detail_batch->fk_expeditiondet); + } + $entrepot_id = !empty($detail_batch->entrepot_id)?$detail_batch->entrepot_id:$lines[$i]->entrepot_id; + print ''; print ''; - } elseif (isModEnabled('stock')) { - if ($lines[$i]->fk_product > 0) { - if ($lines[$i]->entrepot_id > 0) { - print ''; - print ''; - // Qty to ship or shipped - print ''; - // Warehouse source - print ''; - // Batch number managment - print ''; - print ''; - } elseif (count($lines[$i]->details_entrepot) > 1) { - print ''; - foreach ($lines[$i]->details_entrepot as $detail_entrepot) { - print ''; - // Qty to ship or shipped - print ''; - // Warehouse source - print ''; - // Batch number managment - print ''; - print ''; - } - } else { - print ''; - print ''; - } - } else { - print ''; + } + // add a 0 qty lot row to be able to add a lot + print ''; + // Qty to ship or shipped + print ''; + // Batch number managment + print ''; + print ''; + } elseif (isModEnabled('stock')) { + if ($lines[$i]->fk_product > 0) { + if ($lines[$i]->entrepot_id > 0) { + print ''; print ''; // Qty to ship or shipped print ''; // Warehouse source - print ''; + print ''; // Batch number managment - print ''; + print ''; print ''; + } elseif (count($lines[$i]->details_entrepot) > 1) { + print ''; + foreach ($lines[$i]->details_entrepot as $detail_entrepot) { + print ''; + // Qty to ship or shipped + print ''; + // Warehouse source + print ''; + // Batch number managment + print ''; + print ''; + } + } else { + print ''; + print ''; } - } elseif (!isModEnabled('stock') && empty($conf->productbatch->enabled)) { // both product batch and stock are not activated. - print ''; + } else { + print ''; print ''; // Qty to ship or shipped - print ''; + print ''; // Warehouse source print ''; // Batch number managment print ''; print ''; } - - print '
'.$formproduct->selectLotStock('', 'batchl'.$line_id.'_0', '', 1, 0, $lines[$i]->fk_product).''.$formproduct->selectLotStock($detail_batch->fk_origin_stock, 'batchl'.$detail_batch->fk_expeditiondet.'_'.$detail_batch->fk_origin_stock, '', 1, 0, $lines[$i]->fk_product, $entrepot_id).'
'.$unit_order.''.$formproduct->selectWarehouses($lines[$i]->entrepot_id, 'entl'.$line_id, '', 1, 0, $lines[$i]->fk_product, '', 1).' - '.$langs->trans("NA").'
'.$unit_order.''.$formproduct->selectWarehouses($detail_entrepot->entrepot_id, 'entl'.$detail_entrepot->line_id, '', 1, 0, $lines[$i]->fk_product, '', 1).' - '.$langs->trans("NA").'
'.$langs->trans("NotEnoughStock").'
'.$formproduct->selectLotStock('', 'batchl'.$line_id.'_0', '', 1, 0, $lines[$i]->fk_product).'
'.$unit_order.''.$formproduct->selectWarehouses($lines[$i]->entrepot_id, 'entl'.$line_id, '', 1, 0, $lines[$i]->fk_product, '', 1).' - '.$langs->trans("NA").'
'.$unit_order.''.$formproduct->selectWarehouses($detail_entrepot->entrepot_id, 'entl'.$detail_entrepot->line_id, '', 1, 0, $lines[$i]->fk_product, '', 1).' - '.$langs->trans("NA").'
'.$langs->trans("NotEnoughStock").'
'.$unit_order.'
'.$lines[$i]->qty_shipped.' '.$unit_order.''; - if ($lines[$i]->entrepot_id > 0) { - $entrepot = new Entrepot($db); - $entrepot->fetch($lines[$i]->entrepot_id); - print $entrepot->getNomUrl(1); - } elseif (count($lines[$i]->details_entrepot) > 1) { - $detail = ''; - foreach ($lines[$i]->details_entrepot as $detail_entrepot) { - if ($detail_entrepot->entrepot_id > 0) { - $entrepot = new Entrepot($db); - $entrepot->fetch($detail_entrepot->entrepot_id); - $detail .= $langs->trans("DetailWarehouseFormat", $entrepot->libelle, $detail_entrepot->qty_shipped).'
'; - } + print '
'.$lines[$i]->qty_shipped.' '.$unit_order.''; + if ($lines[$i]->entrepot_id > 0) { + $entrepot = new Entrepot($db); + $entrepot->fetch($lines[$i]->entrepot_id); + print $entrepot->getNomUrl(1); + } elseif (count($lines[$i]->details_entrepot) > 1) { + $detail = ''; + foreach ($lines[$i]->details_entrepot as $detail_entrepot) { + if ($detail_entrepot->entrepot_id > 0) { + $entrepot = new Entrepot($db); + $entrepot->fetch($detail_entrepot->entrepot_id); + $detail .= $langs->trans("DetailWarehouseFormat", $entrepot->libelle, $detail_entrepot->qty_shipped).'
'; } - print $form->textwithtooltip(img_picto('', 'object_stock').' '.$langs->trans("DetailWarehouseNumber"), $detail); + } + print $form->textwithtooltip(img_picto('', 'object_stock').' '.$langs->trans("DetailWarehouseNumber"), $detail); + } + print '
'; + if ($lines[$i]->product_tobatch) { + $detail = ''; + foreach ($lines[$i]->detail_batch as $dbatch) { // $dbatch is instance of ExpeditionLineBatch + $detail .= $langs->trans("Batch").': '.$dbatch->batch; + if (empty($conf->global->PRODUCT_DISABLE_SELLBY)) { + $detail .= ' - '.$langs->trans("SellByDate").': '.dol_print_date($dbatch->sellby, "day"); + } + if (empty($conf->global->PRODUCT_DISABLE_EATBY)) { + $detail .= ' - '.$langs->trans("EatByDate").': '.dol_print_date($dbatch->eatby, "day"); + } + $detail .= ' - '.$langs->trans("Qty").': '.$dbatch->qty; + $detail .= '
'; + } + print $form->textwithtooltip(img_picto('', 'object_barcode').' '.$langs->trans("DetailBatchNumber"), $detail); + } else { + print $langs->trans("NA"); } print '
'; - if ($lines[$i]->product_tobatch) { - $detail = ''; - foreach ($lines[$i]->detail_batch as $dbatch) { // $dbatch is instance of ExpeditionLineBatch - $detail .= $langs->trans("Batch").': '.$dbatch->batch; - if (empty($conf->global->PRODUCT_DISABLE_SELLBY)) { - $detail .= ' - '.$langs->trans("SellByDate").': '.dol_print_date($dbatch->sellby, "day"); - } - if (empty($conf->global->PRODUCT_DISABLE_EATBY)) { - $detail .= ' - '.$langs->trans("EatByDate").': '.dol_print_date($dbatch->eatby, "day"); - } - $detail .= ' - '.$langs->trans("Qty").': '.$dbatch->qty; - $detail .= '
'; - } - print $form->textwithtooltip(img_picto('', 'object_barcode').' '.$langs->trans("DetailBatchNumber"), $detail); - } else { - print $langs->trans("NA"); - } - print '
'; - if ($lines[$i]->fk_product_type == Product::TYPE_PRODUCT) { - print $lines[$i]->weight * $lines[$i]->qty_shipped.' '.measuringUnitString(0, "weight", $lines[$i]->weight_units); - } else { - print ' '; - } - print ''; - if ($lines[$i]->fk_product_type == Product::TYPE_PRODUCT) { - print $lines[$i]->volume * $lines[$i]->qty_shipped.' '.measuringUnitString(0, "volume", $lines[$i]->volume_units); - } else { - print ' '; - } - print ''.$lines[$i]->volume*$lines[$i]->qty_shipped.' '.measuringUnitString(0, "volume", $lines[$i]->volume_units).''; - print '
'; - print '
'; - print '
'; - print 'id.'">'.img_edit().''; - print ''; - print 'id.'">'.img_delete().''; - print '
'; + if ($lines[$i]->fk_product_type == Product::TYPE_PRODUCT) { + print $lines[$i]->weight * $lines[$i]->qty_shipped.' '.measuringUnitString(0, "weight", $lines[$i]->weight_units); + } else { + print ' '; + } + print ''; + if ($lines[$i]->fk_product_type == Product::TYPE_PRODUCT) { + print $lines[$i]->volume * $lines[$i]->qty_shipped.' '.measuringUnitString(0, "volume", $lines[$i]->volume_units); + } else { + print ' '; + } + print ''.$lines[$i]->volume*$lines[$i]->qty_shipped.' '.measuringUnitString(0, "volume", $lines[$i]->volume_units).''; + print '
'; + print '
'; + print '
'; + print 'id.'">'.img_edit().''; + print ''; + print 'id.'">'.img_delete().''; + print '
\n"; - print ''; - print '
'; } + // TODO Show also lines ordered but not delivered + + print "\n"; + print ''; + print '
'; + print dol_get_fiche_end(); diff --git a/htdocs/expedition/shipment.php b/htdocs/expedition/shipment.php index 9394269a03a..2adf16e4c35 100644 --- a/htdocs/expedition/shipment.php +++ b/htdocs/expedition/shipment.php @@ -329,7 +329,7 @@ if ($id > 0 || !empty($ref)) { $filtercreditnote = "fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')"; } - print ''.$langs->trans('Discounts').''; + print ''.$langs->trans('Discounts').''; $absolute_discount = $soc->getAvailableDiscounts('', $filterabsolutediscount); $absolute_creditnote = $soc->getAvailableDiscounts('', $filtercreditnote); @@ -393,7 +393,7 @@ if ($id > 0 || !empty($ref)) { print 'id.'">'.img_edit($langs->trans('SetAvailability'), 1).''; } print ''; - print ''; + print ''; if ($action == 'editavailability') { $form->form_availability($_SERVER['PHP_SELF'].'?id='.$object->id, $object->availability_id, 'availability_id', 1); } else { @@ -450,7 +450,7 @@ if ($id > 0 || !empty($ref)) { print 'id.'">'.img_edit($langs->trans('SetDemandReason'), 1).''; } print ''; - print ''; + print ''; if ($action == 'editdemandreason') { $form->formInputReason($_SERVER['PHP_SELF'].'?id='.$object->id, $object->demand_reason_id, 'demand_reason_id', 1); } else { @@ -500,11 +500,11 @@ if ($id > 0 || !empty($ref)) { $totalVolume = $tmparray['volume']; if ($totalWeight || $totalVolume) { print ''.$langs->trans("CalculatedWeight").''; - print ''; + print ''; print showDimensionInBestUnit($totalWeight, 0, "weight", $langs, isset($conf->global->MAIN_WEIGHT_DEFAULT_ROUND) ? $conf->global->MAIN_WEIGHT_DEFAULT_ROUND : -1, isset($conf->global->MAIN_WEIGHT_DEFAULT_UNIT) ? $conf->global->MAIN_WEIGHT_DEFAULT_UNIT : 'no'); print ''; print ''.$langs->trans("CalculatedVolume").''; - print ''; + print ''; print showDimensionInBestUnit($totalVolume, 0, "volume", $langs, isset($conf->global->MAIN_VOLUME_DEFAULT_ROUND) ? $conf->global->MAIN_VOLUME_DEFAULT_ROUND : -1, isset($conf->global->MAIN_VOLUME_DEFAULT_UNIT) ? $conf->global->MAIN_VOLUME_DEFAULT_UNIT : 'no'); print ''; } @@ -524,7 +524,7 @@ if ($id > 0 || !empty($ref)) { } print ''; print ''; - print ''; + print ''; if ($action != 'editincoterm') { print $form->textwithpicto($object->display_incoterms(), $object->label_incoterms, 1); } else { diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index f559c31a89f..3e61571dea5 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -2415,7 +2415,7 @@ if ($action == 'create') { // Show object lines if (!empty($object->lines)) { - $ret = $object->printObjectLines($action, $societe, $mysoc, $lineid, 1); + $object->printObjectLines($action, $societe, $mysoc, $lineid, 1); } $num = count($object->lines); diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index 6bc9ae679bb..50e450be105 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -3628,7 +3628,7 @@ if ($action == 'create') { // Show object lines if (!empty($object->lines)) { - $ret = $object->printObjectLines($action, $societe, $mysoc, $lineid, 1); + $object->printObjectLines($action, $societe, $mysoc, $lineid, 1); } $num = count($object->lines); diff --git a/htdocs/knowledgemanagement/class/knowledgerecord.class.php b/htdocs/knowledgemanagement/class/knowledgerecord.class.php index 69e7e40c16b..1d8075c21ea 100644 --- a/htdocs/knowledgemanagement/class/knowledgerecord.class.php +++ b/htdocs/knowledgemanagement/class/knowledgerecord.class.php @@ -1058,8 +1058,8 @@ class KnowledgeRecord extends CommonObject * Adds it to non existing supplied categories. * Existing categories are left untouch. * - * @param int[]|int $categories Category or categories IDs - * @return void + * @param int[]|int $categories Category or categories IDs + * @return int <0 if KO, >0 if OK */ public function setCategories($categories) { diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index f17a128544a..887ef6e1a44 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -6111,8 +6111,8 @@ class Product extends CommonObject * Adds it to non existing supplied categories. * Existing categories are left untouch. * - * @param int[]|int $categories Category or categories IDs - * @return void + * @param int[]|int $categories Category or categories IDs + * @return int <0 if KO, >0 if OK */ public function setCategories($categories) { diff --git a/htdocs/product/stock/class/entrepot.class.php b/htdocs/product/stock/class/entrepot.class.php index b47430bffc2..e70c67412ee 100644 --- a/htdocs/product/stock/class/entrepot.class.php +++ b/htdocs/product/stock/class/entrepot.class.php @@ -895,8 +895,8 @@ class Entrepot extends CommonObject * Adds it to non existing supplied categories. * Existing categories are left untouch. * - * @param int[]|int $categories Category or categories IDs - * @return void + * @param int[]|int $categories Category or categories IDs + * @return int <0 if KO, >0 if OK */ public function setCategories($categories) { diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index ccefdb4c600..c8d3be0163d 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -2289,8 +2289,8 @@ class Project extends CommonObject * Adds it to non existing supplied categories. * Existing categories are left untouch. * - * @param int[]|int $categories Category or categories IDs - * @return void + * @param int[]|int $categories Category or categories IDs + * @return int <0 if KO, >0 if OK */ public function setCategories($categories) { diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 3643a404863..dd5ccd7ef0b 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -4886,7 +4886,7 @@ class Societe extends CommonObject * Existing categories are left untouch. * * @param int[]|int $categories Category ID or array of Categories IDs - * @param string $type_categ Category type ('customer' or 'supplier') + * @param string $type_categ Category type ('customer' or 'supplier') * @return int <0 if KO, >0 if OK */ public function setCategories($categories, $type_categ) diff --git a/htdocs/supplier_proposal/card.php b/htdocs/supplier_proposal/card.php index 71d9668dc92..4b898a75645 100644 --- a/htdocs/supplier_proposal/card.php +++ b/htdocs/supplier_proposal/card.php @@ -1322,7 +1322,8 @@ if ($action == 'create') { // Shipping Method if (isModEnabled("expedition")) { print ''.$langs->trans('SendingMethod').''; - print $form->selectShippingMethod(GETPOST('shipping_method_id') > 0 ? GETPOST('shipping_method_id', 'int') : "", 'shipping_method_id', '', 1); + print img_picto('', 'object_dollyrevert', 'class="pictofixedwidth"'); + $form->selectShippingMethod(GETPOST('shipping_method_id') > 0 ? GETPOST('shipping_method_id', 'int') : "", 'shipping_method_id', '', 1); print ''; } @@ -1902,7 +1903,7 @@ if ($action == 'create') { } if (!empty($object->lines)) { - $ret = $object->printObjectLines($action, $soc, $mysoc, $lineid, $dateSelector); + $object->printObjectLines($action, $soc, $mysoc, $lineid, $dateSelector); } // Form to add new line diff --git a/htdocs/ticket/class/ticket.class.php b/htdocs/ticket/class/ticket.class.php index d077ed3e777..27cdf8d164b 100644 --- a/htdocs/ticket/class/ticket.class.php +++ b/htdocs/ticket/class/ticket.class.php @@ -2318,8 +2318,8 @@ class Ticket extends CommonObject * Adds it to non existing supplied categories. * Existing categories are left untouch. * - * @param int[]|int $categories Category or categories IDs - * @return void + * @param int[]|int $categories Category or categories IDs + * @return int <0 if KO, >0 if OK */ public function setCategories($categories) { diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 75c9f1b2bae..dddcaa0ca6a 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -1390,8 +1390,8 @@ class User extends CommonObject * Adds it to non existing supplied categories. * Existing categories are left untouch. * - * @param int[]|int $categories Category or categories IDs - * @return void + * @param int[]|int $categories Category or categories IDs + * @return int <0 if KO, >0 if OK */ public function setCategories($categories) { From 1934db2dd103da100c3104d9bba4722d56f11a7a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 31 Dec 2022 14:37:33 +0100 Subject: [PATCH 0478/1128] Debug v17 --- htdocs/core/modules/import/import_csv.modules.php | 2 +- htdocs/core/modules/import/import_xlsx.modules.php | 2 +- htdocs/core/modules/movement/doc/pdf_standard.modules.php | 8 +++++++- htdocs/debugbar/class/TraceableDB.php | 2 +- htdocs/install/upgrade2.php | 4 +++- htdocs/projet/tasks/task.php | 2 +- 6 files changed, 14 insertions(+), 6 deletions(-) diff --git a/htdocs/core/modules/import/import_csv.modules.php b/htdocs/core/modules/import/import_csv.modules.php index e1699660acc..075de9f0d2a 100644 --- a/htdocs/core/modules/import/import_csv.modules.php +++ b/htdocs/core/modules/import/import_csv.modules.php @@ -579,7 +579,7 @@ class ImportCsv extends ModeleImports } } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'getsuppliercodeifauto') { if (strtolower($newval) == 'auto') { - $newval = $this->thirdpartyobject->get_codefournisseur(0, 1); + $this->thirdpartyobject->get_codefournisseur(0, 1); $newval = $this->thirdpartyobject->code_fournisseur; //print 'code_fournisseur='.$newval; } diff --git a/htdocs/core/modules/import/import_xlsx.modules.php b/htdocs/core/modules/import/import_xlsx.modules.php index 0e63ea77075..0854a0f56c5 100644 --- a/htdocs/core/modules/import/import_xlsx.modules.php +++ b/htdocs/core/modules/import/import_xlsx.modules.php @@ -624,7 +624,7 @@ class ImportXlsx extends ModeleImports } } elseif ($objimport->array_import_convertvalue[0][$val]['rule'] == 'getsuppliercodeifauto') { if (strtolower($newval) == 'auto') { - $newval = $this->thirdpartyobject->get_codefournisseur(0, 1); + $this->thirdpartyobject->get_codefournisseur(0, 1); $newval = $this->thirdpartyobject->code_fournisseur; //print 'code_fournisseur='.$newval; } diff --git a/htdocs/core/modules/movement/doc/pdf_standard.modules.php b/htdocs/core/modules/movement/doc/pdf_standard.modules.php index 094e19a280a..a823eadbc05 100644 --- a/htdocs/core/modules/movement/doc/pdf_standard.modules.php +++ b/htdocs/core/modules/movement/doc/pdf_standard.modules.php @@ -941,7 +941,7 @@ class pdf_standard extends ModelePDFMovement * @param int $showaddress 0=no, 1=yes * @param Translate $outputlangs Object lang for output * @param string $titlekey Translation key to show as title of document - * @return void + * @return int Return topshift value */ protected function _pagehead(&$pdf, $object, $showaddress, $outputlangs, $titlekey = "") { @@ -1108,8 +1108,13 @@ class pdf_standard extends ModelePDFMovement $posy += 2; + $top_shift = 0; // Show list of linked objects + $current_y = $pdf->getY(); //$posy = pdf_writeLinkedObjects($pdf, $object, $outputlangs, $posx, $posy, 100, 3, 'R', $default_font_size); + //if ($current_y < $pdf->getY()) { + // $top_shift = $pdf->getY() - $current_y; + //} if ($showaddress) { /* @@ -1146,6 +1151,7 @@ class pdf_standard extends ModelePDFMovement } $pdf->SetTextColor(0, 0, 0); + return $top_shift; } // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore diff --git a/htdocs/debugbar/class/TraceableDB.php b/htdocs/debugbar/class/TraceableDB.php index 0b862f4df70..5863f1d902e 100644 --- a/htdocs/debugbar/class/TraceableDB.php +++ b/htdocs/debugbar/class/TraceableDB.php @@ -661,7 +661,7 @@ class TraceableDB extends DoliDB */ public function free($resultset = null) { - return $this->db->free($resultset); + $this->db->free($resultset); } /** diff --git a/htdocs/install/upgrade2.php b/htdocs/install/upgrade2.php index bbb12e8693e..51334eaae21 100644 --- a/htdocs/install/upgrade2.php +++ b/htdocs/install/upgrade2.php @@ -4485,7 +4485,7 @@ function migrate_reload_modules($db, $langs, $conf, $listofmodule = array(), $fo * @param DoliDB $db Database handler * @param Translate $langs Object langs * @param Conf $conf Object conf - * @return void + * @return int <0 if KO, >0 if OK */ function migrate_reload_menu($db, $langs, $conf) { @@ -4515,6 +4515,8 @@ function migrate_reload_menu($db, $langs, $conf) print ''; } + + return 1; } /** diff --git a/htdocs/projet/tasks/task.php b/htdocs/projet/tasks/task.php index 8b19c8c0519..fccf9d2ffe1 100644 --- a/htdocs/projet/tasks/task.php +++ b/htdocs/projet/tasks/task.php @@ -467,7 +467,7 @@ if ($id > 0 || !empty($ref)) { // Task parent print ''.$langs->trans("ChildOfProjectTask").''; - print $formother->selectProjectTasks($object->fk_task_parent, $projectstatic->id, 'task_parent', ($user->admin ? 0 : 1), 0, 0, 0, $object->id); + $formother->selectProjectTasks($object->fk_task_parent, $projectstatic->id, 'task_parent', ($user->admin ? 0 : 1), 0, 0, 0, $object->id); print ''; // Date start From 26ef1cb27088c78402779c8fa3b195348079c447 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 31 Dec 2022 14:43:31 +0100 Subject: [PATCH 0479/1128] Debug v17 --- .../modules/expedition/doc/pdf_espadon.modules.php | 11 ++++++++++- .../modules/expedition/doc/pdf_merou.modules.php | 14 +++++++++++++- .../modules/expedition/doc/pdf_rouget.modules.php | 13 ++++++++++++- .../class/conferenceorbooth.class.php | 5 ++--- htdocs/hrm/class/evaluation.class.php | 4 ++-- htdocs/hrm/class/evaluationdet.class.php | 7 ++++--- htdocs/hrm/class/job.class.php | 4 ++-- htdocs/hrm/class/position.class.php | 4 ++-- htdocs/hrm/class/skill.class.php | 4 ++-- htdocs/hrm/class/skillrank.class.php | 4 ++-- .../class/knowledgerecord.class.php | 4 ++-- htdocs/mrp/class/mo.class.php | 4 ++-- htdocs/partnership/class/partnership.class.php | 4 ++-- .../stocktransfer/class/stocktransfer.class.php | 4 ++-- .../class/stocktransferline.class.php | 4 ++-- .../class/recruitmentcandidature.class.php | 4 ++-- htdocs/webhook/class/target.class.php | 4 ++-- htdocs/workstation/class/workstation.class.php | 4 ++-- 18 files changed, 67 insertions(+), 35 deletions(-) diff --git a/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php b/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php index b87298d3dd8..d486a56bb08 100644 --- a/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php +++ b/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php @@ -945,7 +945,7 @@ class pdf_espadon extends ModelePdfExpedition * @param Expedition $object Object to show * @param int $showaddress 0=no, 1=yes * @param Translate $outputlangs Object lang for output - * @return void + * @return int <0 if KO, > if OK */ protected function _pagehead(&$pdf, $object, $showaddress, $outputlangs) { @@ -1078,6 +1078,14 @@ class pdf_espadon extends ModelePdfExpedition } } + $top_shift = 0; + // Show list of linked objects + /*$current_y = $pdf->getY(); + $posy = pdf_writeLinkedObjects($pdf, $object, $outputlangs, $posx, $posy, $w, 3, 'R', $default_font_size); + if ($current_y < $pdf->getY()) { + $top_shift = $pdf->getY() - $current_y; + }*/ + if ($showaddress) { // Sender properties $carac_emetteur = ''; @@ -1183,6 +1191,7 @@ class pdf_espadon extends ModelePdfExpedition } $pdf->SetTextColor(0, 0, 0); + return $top_shift; } // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore diff --git a/htdocs/core/modules/expedition/doc/pdf_merou.modules.php b/htdocs/core/modules/expedition/doc/pdf_merou.modules.php index e847dc26fec..2bf6e583826 100644 --- a/htdocs/core/modules/expedition/doc/pdf_merou.modules.php +++ b/htdocs/core/modules/expedition/doc/pdf_merou.modules.php @@ -520,7 +520,7 @@ class pdf_merou extends ModelePdfExpedition * @param Expedition $object Object to show * @param int $showaddress 0=no, 1=yes * @param Translate $outputlangs Object lang for output - * @return void + * @return int <0 if KO, > if OK */ protected function _pagehead(&$pdf, $object, $showaddress, $outputlangs) { @@ -700,6 +700,16 @@ class pdf_merou extends ModelePdfExpedition $widthrecbox = $blW; + $top_shift = 0; + // Show list of linked objects + /* + $current_y = $pdf->getY(); + $posy = pdf_writeLinkedObjects($pdf, $object, $outputlangs, $posx, $posy, $w, 3, 'R', $default_font_size); + if ($current_y < $pdf->getY()) { + $top_shift = $pdf->getY() - $current_y; + } + */ + // Show Recipient frame $pdf->SetFont('', 'B', $default_font_size - 3); $pdf->SetXY($blDestX, $Yoff - 4); @@ -717,5 +727,7 @@ class pdf_merou extends ModelePdfExpedition $pdf->SetFont('', '', $default_font_size - 3); $pdf->SetXY($blDestX, $posy); $pdf->MultiCell($widthrecbox, 4, $carac_client, 0, 'L'); + + return $top_shift; } } diff --git a/htdocs/core/modules/expedition/doc/pdf_rouget.modules.php b/htdocs/core/modules/expedition/doc/pdf_rouget.modules.php index 71fb4c4c194..2c7af07b32f 100644 --- a/htdocs/core/modules/expedition/doc/pdf_rouget.modules.php +++ b/htdocs/core/modules/expedition/doc/pdf_rouget.modules.php @@ -890,7 +890,7 @@ class pdf_rouget extends ModelePdfExpedition * @param Expedition $object Object to show * @param int $showaddress 0=no, 1=yes * @param Translate $outputlangs Object lang for output - * @return void + * @return int <0 if KO, > if OK */ protected function _pagehead(&$pdf, $object, $showaddress, $outputlangs) { @@ -1023,6 +1023,16 @@ class pdf_rouget extends ModelePdfExpedition } } + $top_shift = 0; + // Show list of linked objects + /* + $current_y = $pdf->getY(); + $posy = pdf_writeLinkedObjects($pdf, $object, $outputlangs, $posx, $posy, $w, 3, 'R', $default_font_size); + if ($current_y < $pdf->getY()) { + $top_shift = $pdf->getY() - $current_y; + } + */ + if ($showaddress) { // Sender properties $carac_emetteur = ''; @@ -1128,6 +1138,7 @@ class pdf_rouget extends ModelePdfExpedition } $pdf->SetTextColor(0, 0, 0); + return $top_shift; } // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore diff --git a/htdocs/eventorganization/class/conferenceorbooth.class.php b/htdocs/eventorganization/class/conferenceorbooth.class.php index cdb67a2c37b..556443a25e8 100644 --- a/htdocs/eventorganization/class/conferenceorbooth.class.php +++ b/htdocs/eventorganization/class/conferenceorbooth.class.php @@ -217,7 +217,6 @@ class ConferenceOrBooth extends ActionComm $this->socid = $this->fk_soc; $this->datef = $this->datep2; $this->note_private = $this->note; - $this->fk_user_author = $this->fk_user_author; } /** @@ -716,8 +715,8 @@ class ConferenceOrBooth extends ActionComm $result = $objectline->fetchAll('ASC', 'position', 0, 0, array('customsql'=>'fk_conferenceorbooth = '.((int) $this->id))); if (is_numeric($result)) { - $this->error = $this->error; - $this->errors = $this->errors; + $this->error = $objectline->error; + $this->errors = $objectline->errors; return $result; } else { $this->lines = $result; diff --git a/htdocs/hrm/class/evaluation.class.php b/htdocs/hrm/class/evaluation.class.php index 0125e7f882c..23ccc6c9fd2 100644 --- a/htdocs/hrm/class/evaluation.class.php +++ b/htdocs/hrm/class/evaluation.class.php @@ -923,8 +923,8 @@ class Evaluation extends CommonObject $result = $objectline->fetchAll('ASC', '', 0, 0, array('customsql'=>'fk_evaluation = '.$this->id)); if (is_numeric($result)) { - $this->error = $this->error; - $this->errors = $this->errors; + $this->error = $objectline->error; + $this->errors = $objectline->errors; return $result; } else { $this->lines = $result; diff --git a/htdocs/hrm/class/evaluationdet.class.php b/htdocs/hrm/class/evaluationdet.class.php index f9bbde51912..5489065e52d 100644 --- a/htdocs/hrm/class/evaluationdet.class.php +++ b/htdocs/hrm/class/evaluationdet.class.php @@ -561,7 +561,8 @@ class Evaluationline extends CommonObject $sql .= " WHERE filename LIKE '".$this->db->escape($this->ref)."%' AND filepath = 'evaluationline/".$this->db->escape($this->ref)."' and entity = ".$conf->entity; $resql = $this->db->query($sql); if (!$resql) { - $error++; $this->error = $this->db->lasterror(); + $error++; + $this->error = $this->db->lasterror(); } // We rename directory ($this->ref = old ref, $num = new ref) in order not to lose the attachments @@ -891,8 +892,8 @@ class Evaluationline extends CommonObject $result = $objectline->fetchAll('ASC', 'position', 0, 0, array('customsql'=>'fk_evaluationdet = '.$this->id)); if (is_numeric($result)) { - $this->error = $this->error; - $this->errors = $this->errors; + $this->error = $objectline->error; + $this->errors = $objectline->errors; return $result; } else { $this->lines = $result; diff --git a/htdocs/hrm/class/job.class.php b/htdocs/hrm/class/job.class.php index 117878c10c9..a08e8c713ae 100644 --- a/htdocs/hrm/class/job.class.php +++ b/htdocs/hrm/class/job.class.php @@ -925,8 +925,8 @@ class Job extends CommonObject $result = $objectline->fetchAll('ASC', 'position', 0, 0, array('customsql'=>'fk_job = '.$this->id)); if (is_numeric($result)) { - $this->error = $this->error; - $this->errors = $this->errors; + $this->error = $objectline->error; + $this->errors = $objectline->errors; return $result; } else { $this->lines = $result; diff --git a/htdocs/hrm/class/position.class.php b/htdocs/hrm/class/position.class.php index 5d0c04a4f47..b72c11b36f6 100644 --- a/htdocs/hrm/class/position.class.php +++ b/htdocs/hrm/class/position.class.php @@ -971,8 +971,8 @@ class Position extends CommonObject $result = $objectline->fetchAll('ASC', 'position', 0, 0, array('customsql' => 'fk_position = ' . $this->id)); if (is_numeric($result)) { - $this->error = $this->error; - $this->errors = $this->errors; + $this->error = $objectline->error; + $this->errors = $objectline->errors; return $result; } else { $this->lines = $result; diff --git a/htdocs/hrm/class/skill.class.php b/htdocs/hrm/class/skill.class.php index 0cdc63ec24e..3f56294a7b2 100644 --- a/htdocs/hrm/class/skill.class.php +++ b/htdocs/hrm/class/skill.class.php @@ -965,8 +965,8 @@ class Skill extends CommonObject $result = $objectline->fetchAll('ASC', 'rankorder', 0, 0, array('customsql'=>'fk_skill = '.$this->id)); if (is_numeric($result)) { - $this->error = $this->error; - $this->errors = $this->errors; + $this->error = $objectline->error; + $this->errors = $objectline->errors; return $result; } else { $this->lines = $result; diff --git a/htdocs/hrm/class/skillrank.class.php b/htdocs/hrm/class/skillrank.class.php index 6db80642bab..2d75425823e 100644 --- a/htdocs/hrm/class/skillrank.class.php +++ b/htdocs/hrm/class/skillrank.class.php @@ -919,8 +919,8 @@ class SkillRank extends CommonObject $result = $objectline->fetchAll('ASC', 'position', 0, 0, array('customsql'=>'fk_skillrank = '.((int) $this->id))); if (is_numeric($result)) { - $this->error = $this->error; - $this->errors = $this->errors; + $this->error = $objectline->error; + $this->errors = $objectline->errors; return $result; } else { $this->lines = $result; diff --git a/htdocs/knowledgemanagement/class/knowledgerecord.class.php b/htdocs/knowledgemanagement/class/knowledgerecord.class.php index 1d8075c21ea..bf2bf38bbef 100644 --- a/htdocs/knowledgemanagement/class/knowledgerecord.class.php +++ b/htdocs/knowledgemanagement/class/knowledgerecord.class.php @@ -918,8 +918,8 @@ class KnowledgeRecord extends CommonObject $result = $objectline->fetchAll('ASC', 'position', 0, 0, array('customsql'=>'fk_knowledgerecord = '.((int) $this->id))); if (is_numeric($result)) { - $this->error = $this->error; - $this->errors = $this->errors; + $this->error = $objectline->error; + $this->errors = $objectline->errors; return $result; } else { $this->lines = $result; diff --git a/htdocs/mrp/class/mo.class.php b/htdocs/mrp/class/mo.class.php index 13f7cc5ae7b..30d6a3660a3 100644 --- a/htdocs/mrp/class/mo.class.php +++ b/htdocs/mrp/class/mo.class.php @@ -1275,8 +1275,8 @@ class Mo extends CommonObject $result = $objectline->fetchAll('ASC', 'position', 0, 0, $TFilters); if (is_numeric($result)) { - $this->error = $this->error; - $this->errors = $this->errors; + $this->error = $objectline->error; + $this->errors = $objectline->errors; return $result; } else { $this->lines = $result; diff --git a/htdocs/partnership/class/partnership.class.php b/htdocs/partnership/class/partnership.class.php index 5908b964f2c..d7242f4e16c 100644 --- a/htdocs/partnership/class/partnership.class.php +++ b/htdocs/partnership/class/partnership.class.php @@ -1158,8 +1158,8 @@ class Partnership extends CommonObject $result = $objectline->fetchAll('ASC', 'position', 0, 0, array('customsql'=>'fk_partnership = '.((int) $this->id))); if (is_numeric($result)) { - $this->error = $this->error; - $this->errors = $this->errors; + $this->error = $objectline->error; + $this->errors = $objectline->errors; return $result; } else { $this->lines = $result; diff --git a/htdocs/product/stock/stocktransfer/class/stocktransfer.class.php b/htdocs/product/stock/stocktransfer/class/stocktransfer.class.php index 5ffb56ced44..60f13396b80 100644 --- a/htdocs/product/stock/stocktransfer/class/stocktransfer.class.php +++ b/htdocs/product/stock/stocktransfer/class/stocktransfer.class.php @@ -911,8 +911,8 @@ class StockTransfer extends CommonObject $result = $objectline->fetchAll('ASC', 'rang', 0, 0, array('customsql'=>'fk_stocktransfer = '.$this->id)); if (is_numeric($result)) { - $this->error = $this->error; - $this->errors = $this->errors; + $this->error = $objectline->error; + $this->errors = $objectline->errors; return $result; } else { $this->lines = $result; diff --git a/htdocs/product/stock/stocktransfer/class/stocktransferline.class.php b/htdocs/product/stock/stocktransfer/class/stocktransferline.class.php index 14febad09d4..4ee2f1db631 100644 --- a/htdocs/product/stock/stocktransfer/class/stocktransferline.class.php +++ b/htdocs/product/stock/stocktransfer/class/stocktransferline.class.php @@ -915,8 +915,8 @@ class StockTransferLine extends CommonObjectLine $result = $objectline->fetchAll('ASC', 'position', 0, 0, array('customsql'=>'fk_stocktransferline = '.((int) $this->id))); if (is_numeric($result)) { - $this->error = $this->error; - $this->errors = $this->errors; + $this->error = $objectline->error; + $this->errors = $objectline->errors; return $result; } else { $this->lines = $result; diff --git a/htdocs/recruitment/class/recruitmentcandidature.class.php b/htdocs/recruitment/class/recruitmentcandidature.class.php index 2ece5dbe217..1690f13da56 100644 --- a/htdocs/recruitment/class/recruitmentcandidature.class.php +++ b/htdocs/recruitment/class/recruitmentcandidature.class.php @@ -894,8 +894,8 @@ class RecruitmentCandidature extends CommonObject $result = $objectline->fetchAll('ASC', 'position', 0, 0, array('customsql'=>'fk_recruitmentcandidature = '.((int) $this->id))); if (is_numeric($result)) { - $this->error = $this->error; - $this->errors = $this->errors; + $this->error = $objectline->error; + $this->errors = $objectline->errors; return $result; } else { $this->lines = $result; diff --git a/htdocs/webhook/class/target.class.php b/htdocs/webhook/class/target.class.php index ba33f2b8995..51a2a1beffa 100644 --- a/htdocs/webhook/class/target.class.php +++ b/htdocs/webhook/class/target.class.php @@ -911,8 +911,8 @@ class Target extends CommonObject $result = $objectline->fetchAll('ASC', 'position', 0, 0, array('customsql'=>'fk_target = '.((int) $this->id))); if (is_numeric($result)) { - $this->error = $this->error; - $this->errors = $this->errors; + $this->error = $objectline->error; + $this->errors = $objectline->errors; return $result; } else { $this->lines = $result; diff --git a/htdocs/workstation/class/workstation.class.php b/htdocs/workstation/class/workstation.class.php index 1213929fed9..d3b098784da 100644 --- a/htdocs/workstation/class/workstation.class.php +++ b/htdocs/workstation/class/workstation.class.php @@ -919,8 +919,8 @@ class Workstation extends CommonObject $result = $objectline->fetchAll('ASC', 'position', 0, 0, array('customsql'=>'fk_workstation = '.((int) $this->id))); if (is_numeric($result)) { - $this->error = $this->error; - $this->errors = $this->errors; + $this->error = $objectline->error; + $this->errors = $objectline->errors; return $result; } From 169dcba95904584411bc86706c4da4b5241af091 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 31 Dec 2022 14:54:06 +0100 Subject: [PATCH 0480/1128] Fix qodana --- htdocs/fourn/commande/list.php | 2 +- qodana.yaml | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/htdocs/fourn/commande/list.php b/htdocs/fourn/commande/list.php index 3080a184abb..f02d2df24ca 100644 --- a/htdocs/fourn/commande/list.php +++ b/htdocs/fourn/commande/list.php @@ -1203,7 +1203,7 @@ if ($resql) { $topicmail = "SendOrderRef"; $modelmail = "order_supplier_send"; - $objecttmp = new CommandeFournisseur($db); + $objecttmp = new CommandeFournisseur($db); // in case $object is not the good object $trackid = 'sord'.$object->id; include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php'; diff --git a/qodana.yaml b/qodana.yaml index 361afb8967f..36c35ece4c6 100644 --- a/qodana.yaml +++ b/qodana.yaml @@ -68,7 +68,10 @@ exclude: - name: PhpPropertyOnlyWrittenInspection - name: PhpCoveredCharacterInClassInspection - name: PhpSameParameterValueInspection + - name: PhpSillyAssignmentInspection - name: PhpConditionCheckedByNextConditionInspection - - name: RegExpSingleCharAlternation + - name: RegExpSingleCharAlternation - name: PhpSuspiciousNameCombinationInspection + - name: PhpWriteAccessToReferencedArrayValueWithoutUnsetInspection + \ No newline at end of file From cbda0e6197d1005ab02dc5506bb745507b830f0b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 31 Dec 2022 15:17:37 +0100 Subject: [PATCH 0481/1128] Fix warnings --- htdocs/comm/action/card.php | 2 +- htdocs/core/boxes/box_activity.php | 32 ++++++++++++++----- htdocs/core/class/commonobject.class.php | 4 +-- .../modules/mrp/doc/pdf_vinci.modules.php | 8 ++--- htdocs/hrm/class/evaluation.class.php | 2 +- 5 files changed, 30 insertions(+), 18 deletions(-) diff --git a/htdocs/comm/action/card.php b/htdocs/comm/action/card.php index d1329e40454..91eb9f49516 100644 --- a/htdocs/comm/action/card.php +++ b/htdocs/comm/action/card.php @@ -1353,7 +1353,7 @@ if ($action == 'create') { if (empty($donotclearsession)) { $assignedtouser = GETPOST("assignedtouser") ?GETPOST("assignedtouser") : (!empty($object->userownerid) && $object->userownerid > 0 ? $object->userownerid : $user->id); if ($assignedtouser) { - $listofuserid[$assignedtouser] = array('id'=>$assignedtouser, 'mandatory'=>0, 'transparency'=>$object->transparency); // Owner first + $listofuserid[$assignedtouser] = array('id'=>$assignedtouser, 'mandatory'=>0); // Owner first } //$listofuserid[$user->id] = array('id'=>$user->id, 'mandatory'=>0, 'transparency'=>(GETPOSTISSET('transparency') ? GETPOST('transparency', 'alpha') : 1)); // 1 by default at first init $listofuserid[$assignedtouser]['transparency'] = (GETPOSTISSET('transparency') ? GETPOST('transparency', 'alpha') : 1); // 1 by default at first init diff --git a/htdocs/core/boxes/box_activity.php b/htdocs/core/boxes/box_activity.php index 4829b32a72a..ea45580e163 100644 --- a/htdocs/core/boxes/box_activity.php +++ b/htdocs/core/boxes/box_activity.php @@ -155,7 +155,7 @@ class box_activity extends ModeleBoxes while ($j < count($data)) { $this->info_box_contents[$line][0] = array( 'td' => 'class="left" width="16"', - 'url' => DOL_URL_ROOT."/comm/propal/list.php?mainmenu=commercial&leftmenu=propals&search_status=".$data[$j]->fk_statut, + 'url' => DOL_URL_ROOT."/comm/propal/list.php?mainmenu=commercial&leftmenu=propals&search_status=".((int) $data[$j]->fk_statut), 'tooltip' => $langs->trans("Proposals")." ".$propalstatic->LibStatut($data[$j]->fk_statut, 0), 'logo' => 'object_propal' ); @@ -169,7 +169,7 @@ class box_activity extends ModeleBoxes 'td' => 'class="right"', 'text' => $data[$j]->nb, 'tooltip' => $langs->trans("Proposals")." ".$propalstatic->LibStatut($data[$j]->fk_statut, 0), - 'url' => DOL_URL_ROOT."/comm/propal/list.php?mainmenu=commercial&leftmenu=propals&search_status=".$data[$j]->fk_statut, + 'url' => DOL_URL_ROOT."/comm/propal/list.php?mainmenu=commercial&leftmenu=propals&search_status=".((int) $data[$j]->fk_statut), ); $totalnb += $data[$j]->nb; @@ -185,6 +185,13 @@ class box_activity extends ModeleBoxes $line++; $j++; } + if (count($data) == 0) { + $this->info_box_contents[$line][0] = array( + 'td' => 'class="center"', + 'text'=>$langs->trans("NoRecordedProposals"), + ); + $line++; + } } } @@ -273,6 +280,13 @@ class box_activity extends ModeleBoxes $line++; $j++; } + if (count($data) == 0) { + $this->info_box_contents[$line][0] = array( + 'td' => 'class="center"', + 'text'=>$langs->trans("NoRecordedOrders"), + ); + $line++; + } } } @@ -329,11 +343,11 @@ class box_activity extends ModeleBoxes if (!empty($data)) { $j = 0; while ($j < count($data)) { - $billurl = "search_status=2&paye=1"; + $billurl = "search_status=2&paye=1"; $this->info_box_contents[$line][0] = array( 'td' => 'class="left" width="16"', 'tooltip' => $langs->trans('Bills').' '.$facturestatic->LibStatut(1, $data[$j]->fk_statut, 0), - 'url' => DOL_URL_ROOT."/compta/facture/list.php?".$billurl."&mainmenu=accountancy&leftmenu=customers_bills", + 'url' => DOL_URL_ROOT."/compta/facture/list.php?".$billurl."&mainmenu=accountancy&leftmenu=customers_bills", 'logo' => 'bill', ); @@ -346,7 +360,7 @@ class box_activity extends ModeleBoxes 'td' => 'class="right"', 'tooltip' => $langs->trans('Bills').' '.$facturestatic->LibStatut(1, $data[$j]->fk_statut, 0), 'text' => $data[$j]->nb, - 'url' => DOL_URL_ROOT."/compta/facture/list.php?".$billurl."&mainmenu=accountancy&leftmenu=customers_bills", + 'url' => DOL_URL_ROOT."/compta/facture/list.php?".$billurl."&mainmenu=accountancy&leftmenu=customers_bills", ); $this->info_box_contents[$line][3] = array( @@ -369,6 +383,7 @@ class box_activity extends ModeleBoxes 'td' => 'class="center"', 'text'=>$langs->trans("NoRecordedInvoices"), ); + $line++; } } @@ -412,11 +427,11 @@ class box_activity extends ModeleBoxes $j = 0; while ($j < count($data)) { - $billurl = "search_status=".$data[$j]->fk_statut."&paye=0"; + $billurl = "search_status=".$data[$j]->fk_statut."&paye=0"; $this->info_box_contents[$line][0] = array( 'td' => 'class="left" width="16"', 'tooltip' => $langs->trans('Bills').' '.$facturestatic->LibStatut(0, $data[$j]->fk_statut, 0), - 'url' => DOL_URL_ROOT."/compta/facture/list.php?".$billurl."&mainmenu=accountancy&leftmenu=customers_bills", + 'url' => DOL_URL_ROOT."/compta/facture/list.php?".$billurl."&mainmenu=accountancy&leftmenu=customers_bills", 'logo' => 'bill', ); @@ -446,8 +461,9 @@ class box_activity extends ModeleBoxes if (count($data) == 0) { $this->info_box_contents[$line][0] = array( 'td' => 'class="center"', - 'text'=>$langs->trans("NoRecordedInvoices"), + 'text'=>$langs->trans("NoRecordedUnpaidInvoices"), ); + $line++; } } } diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index f8a48f49d40..aafed5900d8 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -6457,9 +6457,9 @@ abstract class CommonObject return -1; } elseif ($value == '') { $new_array_languages[$key] = null; + } else { + $new_array_languages[$key] = $value; } - //dol_syslog("double value"." sur ".$attributeLabel."(".$value." is '".$attributeType."')", LOG_DEBUG); - $new_array_languages[$key] = $value; break; /*case 'select': // Not required, we chosed value='0' for undefined values if ($value=='-1') diff --git a/htdocs/core/modules/mrp/doc/pdf_vinci.modules.php b/htdocs/core/modules/mrp/doc/pdf_vinci.modules.php index 1416992e3c5..8e3eeeafa33 100644 --- a/htdocs/core/modules/mrp/doc/pdf_vinci.modules.php +++ b/htdocs/core/modules/mrp/doc/pdf_vinci.modules.php @@ -1405,14 +1405,13 @@ class pdf_vinci extends ModelePDFMo $rank = 0; $this->cols['code'] = array( 'rank' => $rank, - 'status' => false, + 'status' => true, 'width' => 35, // in mm 'title' => array( 'textkey' => 'Ref' ), 'border-left' => true, // add left line separator ); - $this->cols['code']['status'] = true; $rank = 1; // do not use negative rank $this->cols['desc'] = array( @@ -1455,14 +1454,13 @@ class pdf_vinci extends ModelePDFMo $rank = $rank + 10; $this->cols['dim'] = array( 'rank' => $rank, - 'status' => false, + 'status' => true, 'width' => 25, // in mm 'title' => array( 'textkey' => 'Size' ), 'border-left' => true, // add left line separator ); - $this->cols['dim']['status'] = true; $rank = $rank + 10; $this->cols['qty'] = array( @@ -1474,7 +1472,6 @@ class pdf_vinci extends ModelePDFMo ), 'border-left' => true, // add left line separator ); - $this->cols['qty']['status'] = true; $rank = $rank + 10; $this->cols['qtytot'] = array( @@ -1486,7 +1483,6 @@ class pdf_vinci extends ModelePDFMo ), 'border-left' => true, // add left line separator ); - $this->cols['qtytot']['status'] = true; // Add extrafields cols if (!empty($object->lines)) { diff --git a/htdocs/hrm/class/evaluation.class.php b/htdocs/hrm/class/evaluation.class.php index 23ccc6c9fd2..4a41f1c8e0e 100644 --- a/htdocs/hrm/class/evaluation.class.php +++ b/htdocs/hrm/class/evaluation.class.php @@ -853,7 +853,7 @@ class Evaluation extends CommonObject $this->labelStatus[self::STATUS_CLOSED] = $langs->transnoentitiesnoconv('Closed'); $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft'); $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Validated'); - $this->labelStatus[self::STATUS_CLOSED] = $langs->transnoentitiesnoconv('Closed'); + $this->labelStatusShort[self::STATUS_CLOSED] = $langs->transnoentitiesnoconv('Closed'); } $statusType = 'status'.$status; From f8451ffc568a7b7666658eb0e06e63c2c46b3857 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 31 Dec 2022 15:52:03 +0100 Subject: [PATCH 0482/1128] Debug v17 --- htdocs/admin/multicurrency.php | 3 ++- htdocs/hrm/class/job.class.php | 21 ++++++++----------- htdocs/hrm/class/position.class.php | 4 +++- .../class/multicurrency.class.php | 18 ++++++++-------- htdocs/multicurrency/multicurrency_rate.php | 2 +- 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/htdocs/admin/multicurrency.php b/htdocs/admin/multicurrency.php index 1cf838c08cb..5945ebfb5d5 100644 --- a/htdocs/admin/multicurrency.php +++ b/htdocs/admin/multicurrency.php @@ -134,7 +134,8 @@ if ($action == 'add_currency') { dolibarr_set_const($db, 'MULTICURRENCY_APP_SOURCE', GETPOST('MULTICURRENCY_APP_SOURCE', 'alpha')); //dolibarr_set_const($db, 'MULTICURRENCY_ALTERNATE_SOURCE', GETPOST('MULTICURRENCY_ALTERNATE_SOURCE', 'alpha')); } else { - $result = MultiCurrency::syncRates($conf->global->MULTICURRENCY_APP_ID); + $multiurrency = new MultiCurrency($db); + $result = $multiurrency->syncRates(getDolGlobalString('MULTICURRENCY_APP_ID')); if ($result > 0) { setEventMessages($langs->trans("CurrencyRateSyncSucceed"), null, "mesgs"); } diff --git a/htdocs/hrm/class/job.class.php b/htdocs/hrm/class/job.class.php index a08e8c713ae..93950979a1a 100644 --- a/htdocs/hrm/class/job.class.php +++ b/htdocs/hrm/class/job.class.php @@ -600,30 +600,27 @@ class Job extends CommonObject } /** - * Get last job for user + * Get the last occupied position for a user * - * @param int $fk_user id of user we need to get last job - * @return mixed|string|null + * @param int $fk_user Id of user we need to get last job + * @return Position|string Last occupied position */ public function getLastJobForUser($fk_user) { - global $db; - - $j = new Job($db); - $Tab = $j->getForUser($fk_user); + $Tab = $this->getForUser($fk_user); if (empty($Tab)) return ''; - $job = array_shift($Tab); + $lastpos = array_shift($Tab); - return $job; + return $lastpos; } /** - * Get jobs for user + * Get array of occupied positions for a user * - * @param int $userid id of user we need to get job list - * @return array of jobs + * @param int $userid Id of user we need to get job list + * @return Position[] Array of occupied positions */ public function getForUser($userid) { diff --git a/htdocs/hrm/class/position.class.php b/htdocs/hrm/class/position.class.php index b72c11b36f6..98b5fd89be9 100644 --- a/htdocs/hrm/class/position.class.php +++ b/htdocs/hrm/class/position.class.php @@ -1036,6 +1036,8 @@ class Position extends CommonObject } /** + * getForUser + * * @param int $userid id of user we need to get position list * @return array|int of positions of user with for each of them the job fetched into that array */ @@ -1049,7 +1051,7 @@ class Position extends CommonObject } /** - * Create a document onto disk according to template module. + * Create a document onto disk according to template module. * * @param string $modele Force template to use ('' to not force) * @param Translate $outputlangs objet lang a utiliser pour traduction diff --git a/htdocs/multicurrency/class/multicurrency.class.php b/htdocs/multicurrency/class/multicurrency.class.php index 8b42f7cb25b..da1b9f653b3 100644 --- a/htdocs/multicurrency/class/multicurrency.class.php +++ b/htdocs/multicurrency/class/multicurrency.class.php @@ -428,7 +428,7 @@ class MultiCurrency extends CommonObject * * @param string $code currency code * @param double $rate new rate - * @return int -1 if KO, 1 if OK, 2 if label found and OK + * @return int -1 if KO, 1 if OK, 2 if label found and OK */ public function addRateFromDolibarr($code, $rate) { @@ -609,14 +609,14 @@ class MultiCurrency extends CommonObject * @param stdClass $TRate Object containing all currencies rates * @return int -1 if KO, 0 if nothing, 1 if OK */ - public static function recalculRates(&$TRate) + public function recalculRates(&$TRate) { global $conf; - if ($conf->currency != $conf->global->MULTICURRENCY_APP_SOURCE) { + if ($conf->currency != getDolGlobalString('MULTICURRENCY_APP_SOURCE')) { $alternate_source = 'USD'.$conf->currency; - if (!empty($TRate->{$alternate_source})) { - $coef = $TRate->USDUSD / $TRate->{$alternate_source}; + if (!empty($TRate->$alternate_source)) { + $coef = $TRate->USDUSD / $TRate->$alternate_source; foreach ($TRate as $attr => &$rate) { $rate *= $coef; } @@ -637,7 +637,7 @@ class MultiCurrency extends CommonObject * @param int $addifnotfound Add if not found * @return int <0 if KO, >0 if OK */ - public static function syncRates($key, $addifnotfound = 0) + public function syncRates($key, $addifnotfound = 0) { global $conf, $db, $langs; @@ -656,16 +656,16 @@ class MultiCurrency extends CommonObject if ($response->success) { $TRate = $response->quotes; - $timestamp = $response->timestamp; + //$timestamp = $response->timestamp; - if (self::recalculRates($TRate) >= 0) { + if ($this->recalculRates($TRate) >= 0) { foreach ($TRate as $currency_code => $rate) { $code = substr($currency_code, 3, 3); $obj = new MultiCurrency($db); if ($obj->fetch(null, $code) > 0) { $obj->updateRate($rate); } elseif ($addifnotfound) { - self::addRateFromDolibarr($code, $rate); + $this->addRateFromDolibarr($code, $rate); } } } diff --git a/htdocs/multicurrency/multicurrency_rate.php b/htdocs/multicurrency/multicurrency_rate.php index 03e5e09334a..8b9bbf4eef6 100644 --- a/htdocs/multicurrency/multicurrency_rate.php +++ b/htdocs/multicurrency/multicurrency_rate.php @@ -271,7 +271,7 @@ if (!in_array($action, array("updateRate", "deleteRate"))) { print ' '.$langs->trans('Date').''; print ' '; - print $form->selectDate($dateinput, 'dateinput', 0, 0, 1); + print $form->selectDate($dateinput, 'dateinput', 0, 0, 1, '', 1, 1); print ''; print ' '.$langs->trans('Currency').''; From 7d433e43fac407083b508e98b77ec6e7feaacb16 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 31 Dec 2022 16:24:32 +0100 Subject: [PATCH 0483/1128] Add hooks on payment pages --- htdocs/core/class/hookmanager.class.php | 1 + htdocs/core/lib/payments.lib.php | 11 +++++++++-- htdocs/public/payment/newpayment.php | 8 +------- htdocs/public/payment/paymentok.php | 23 ++++++++++++++++++++--- 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/htdocs/core/class/hookmanager.class.php b/htdocs/core/class/hookmanager.class.php index 191887e1725..71a92ebb6b1 100644 --- a/htdocs/core/class/hookmanager.class.php +++ b/htdocs/core/class/hookmanager.class.php @@ -197,6 +197,7 @@ class HookManager 'getFormatedSupplierRef', 'getIdProfUrl', 'getInputIdProf', + 'isPaymentOK', 'menuDropdownQuickaddItems', 'menuLeftMenuItems', 'moveUploadedFile', diff --git a/htdocs/core/lib/payments.lib.php b/htdocs/core/lib/payments.lib.php index 44691f7c2c4..d5ddb158d6d 100644 --- a/htdocs/core/lib/payments.lib.php +++ b/htdocs/core/lib/payments.lib.php @@ -146,7 +146,7 @@ function payment_supplier_prepare_head(Paiement $object) */ function getValidOnlinePaymentMethods($paymentmethod = '') { - global $conf, $langs; + global $conf, $langs, $hookmanager, $action; $validpaymentmethod = array(); @@ -162,8 +162,15 @@ function getValidOnlinePaymentMethods($paymentmethod = '') $langs->load("stripe"); $validpaymentmethod['stripe'] = 'valid'; } - // TODO Add trigger + // This hook is used to complete the $validpaymentmethod array so an external payment modules + // can add its own key (ie 'payzen' for Payzen, ...) + $parameters = [ + 'paymentmethod' => $paymentmethod, + 'validpaymentmethod' => &$validpaymentmethod + ]; + $tmpobject = new stdClass(); + $hookmanager->executeHooks('doValidatePayment', $parameters, $tmpobject, $action); return $validpaymentmethod; } diff --git a/htdocs/public/payment/newpayment.php b/htdocs/public/payment/newpayment.php index e9823f2d0f7..c4b2d502d3d 100644 --- a/htdocs/public/payment/newpayment.php +++ b/htdocs/public/payment/newpayment.php @@ -281,15 +281,9 @@ if ((empty($paymentmethod) || $paymentmethod == 'stripe') && isModEnabled('strip } // Initialize $validpaymentmethod +// The list can be complete by the hook 'doValidatePayment' executed inside getValidOnlinePaymentMethods() $validpaymentmethod = getValidOnlinePaymentMethods($paymentmethod); -// This hook is used to push to $validpaymentmethod by external payment modules (ie Payzen, ...) -$parameters = [ - 'paymentmethod' => $paymentmethod, - 'validpaymentmethod' => &$validpaymentmethod -]; -$reshook = $hookmanager->executeHooks('doValidatePayment', $parameters, $object, $action); - // Check security token $tmpsource = $source; if ($tmpsource == 'membersubscription') { diff --git a/htdocs/public/payment/paymentok.php b/htdocs/public/payment/paymentok.php index 6d50d1c8c76..3bfdfc5f089 100644 --- a/htdocs/public/payment/paymentok.php +++ b/htdocs/public/payment/paymentok.php @@ -54,13 +54,14 @@ if (is_numeric($entity)) { require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/eventorganization/class/conferenceorboothattendee.class.php'; -require_once DOL_DOCUMENT_ROOT.'/eventorganization/class/conferenceorbooth.class.php'; - if (isModEnabled('paypal')) { require_once DOL_DOCUMENT_ROOT.'/paypal/lib/paypal.lib.php'; require_once DOL_DOCUMENT_ROOT.'/paypal/lib/paypalfunctions.lib.php'; } +// Hook to be used by external payment modules (ie Payzen, ...) +include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php'; +$hookmanager = new HookManager($db); +$hookmanager->initHooks(array('newpayment')); $langs->loadLangs(array("main", "other", "dict", "bills", "companies", "paybox", "paypal")); @@ -337,6 +338,16 @@ if (isModEnabled('stripe')) { } } +// Check status of the object to verify if it is paid by external payment modules +$action = ''; +$parameters = [ + 'paymentmethod' => $paymentmethod, +]; +$reshook = $hookmanager->executeHooks('isPaymentOK', $parameters, $object, $action); +if ($reshook >= 0) { + $ispaymentok = $hookmanager->resArray['ispaymentok']; +} + // If data not provided from back url, search them into the session env if (empty($ipaddress)) { @@ -1142,6 +1153,8 @@ if ($ispaymentok) { // (we need first that the donation module is able to generate a pdf document for the cerfa with pre filled content) } elseif (array_key_exists('ATT', $tmptag) && $tmptag['ATT'] > 0) { // Record payment for registration to an event for an attendee + require_once DOL_DOCUMENT_ROOT.'/eventorganization/class/conferenceorboothattendee.class.php'; + require_once DOL_DOCUMENT_ROOT.'/eventorganization/class/conferenceorbooth.class.php'; include_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; $object = new Facture($db); $result = $object->fetch($ref); @@ -1355,6 +1368,8 @@ if ($ispaymentok) { } } elseif (array_key_exists('BOO', $tmptag) && $tmptag['BOO'] > 0) { // Record payment for booth or conference + require_once DOL_DOCUMENT_ROOT.'/eventorganization/class/conferenceorboothattendee.class.php'; + require_once DOL_DOCUMENT_ROOT.'/eventorganization/class/conferenceorbooth.class.php'; include_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; $object = new Facture($db); $result = $object->fetch($ref); @@ -1461,6 +1476,8 @@ if ($ispaymentok) { if (!$error) { // Putting the booth to "suggested" state + require_once DOL_DOCUMENT_ROOT.'/eventorganization/class/conferenceorboothattendee.class.php'; + require_once DOL_DOCUMENT_ROOT.'/eventorganization/class/conferenceorbooth.class.php'; $booth = new ConferenceOrBooth($db); $resultbooth = $booth->fetch((int) $tmptag['BOO']); if ($resultbooth < 0) { From 65a2093cd13c945efe82ecd46df178bb1e998214 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 31 Dec 2022 16:48:40 +0100 Subject: [PATCH 0484/1128] Fix regression --- htdocs/core/lib/functions.lib.php | 12 ++++++------ test/phpunit/FunctionsLibTest.php | 3 ++- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 6241eaaa8b1..977342b1457 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -340,13 +340,13 @@ function getBrowserInfo($user_agent) $reg = array(); if (preg_match('/firefox(\/|\s)([\d\.]*)/i', $user_agent, $reg)) { $name = 'firefox'; - $version = $reg[2]; + $version = empty($reg[2]) ? '' : $reg[2]; } elseif (preg_match('/edge(\/|\s)([\d\.]*)/i', $user_agent, $reg)) { $name = 'edge'; - $version = $reg[2]; + $version = empty($reg[2]) ? '' : $reg[2]; } elseif (preg_match('/chrome(\/|\s)([\d\.]+)/i', $user_agent, $reg)) { $name = 'chrome'; - $version = $reg[2]; + $version = empty($reg[2]) ? '' : $reg[2]; } elseif (preg_match('/chrome/i', $user_agent, $reg)) { // we can have 'chrome (Mozilla...) chrome x.y' in one string $name = 'chrome'; @@ -356,11 +356,11 @@ function getBrowserInfo($user_agent) $name = 'epiphany'; } elseif (preg_match('/safari(\/|\s)([\d\.]*)/i', $user_agent, $reg)) { $name = 'safari'; - $version = $reg[2]; + $version = empty($reg[2]) ? '' : $reg[2]; } elseif (preg_match('/opera(\/|\s)([\d\.]*)/i', $user_agent, $reg)) { // Safari is often present in string for mobile but its not. $name = 'opera'; - $version = $reg[2]; + $version = empty($reg[2]) ? '' : $reg[2]; } elseif (preg_match('/(MSIE\s([0-9]+\.[0-9]))|.*(Trident\/[0-9]+.[0-9];.*rv:([0-9]+\.[0-9]+))/i', $user_agent, $reg)) { $name = 'ie'; $version = end($reg); @@ -371,7 +371,7 @@ function getBrowserInfo($user_agent) } elseif (preg_match('/l[iy]n(x|ks)(\(|\/|\s)*([\d\.]+)/i', $user_agent, $reg)) { // MS products at end $name = 'lynxlinks'; - $version = $reg[4]; + $version = empty($reg[3]) ? '' : $reg[3]; } if ($tablet) { diff --git a/test/phpunit/FunctionsLibTest.php b/test/phpunit/FunctionsLibTest.php index ef5507d8601..370a498ad3a 100644 --- a/test/phpunit/FunctionsLibTest.php +++ b/test/phpunit/FunctionsLibTest.php @@ -443,10 +443,11 @@ class FunctionsLibTest extends PHPUnit\Framework\TestCase $this->assertEquals('tablet', $tmp['layout']); $this->assertEquals('iphone', $tmp['phone']); - //iPad + //Lynx $user_agent = 'Lynx/2.8.8dev.3 libwww‑FM/2.14 SSL‑MM/1.4.1'; $tmp=getBrowserInfo($user_agent); $this->assertEquals('lynxlinks', $tmp['browsername']); + $this->assertEquals('2.8.8', $tmp['browserversion']); $this->assertEquals('unknown', $tmp['browseros']); $this->assertEquals('classic', $tmp['layout']); } From 2970f039dd966b2c7d5e5105fd3ec3b38a1edec8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 31 Dec 2022 16:52:23 +0100 Subject: [PATCH 0485/1128] Fix warning --- htdocs/core/lib/functions.lib.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 5b791594fea..4724bf85d50 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -340,13 +340,13 @@ function getBrowserInfo($user_agent) $reg = array(); if (preg_match('/firefox(\/|\s)([\d\.]*)/i', $user_agent, $reg)) { $name = 'firefox'; - $version = $reg[2]; + $version = empty($reg[2]) ? '' : $reg[2]; } elseif (preg_match('/edge(\/|\s)([\d\.]*)/i', $user_agent, $reg)) { $name = 'edge'; - $version = $reg[2]; + $version = empty($reg[2]) ? '' : $reg[2]; } elseif (preg_match('/chrome(\/|\s)([\d\.]+)/i', $user_agent, $reg)) { $name = 'chrome'; - $version = $reg[2]; + $version = empty($reg[2]) ? '' : $reg[2]; } elseif (preg_match('/chrome/i', $user_agent, $reg)) { // we can have 'chrome (Mozilla...) chrome x.y' in one string $name = 'chrome'; @@ -356,11 +356,11 @@ function getBrowserInfo($user_agent) $name = 'epiphany'; } elseif (preg_match('/safari(\/|\s)([\d\.]*)/i', $user_agent, $reg)) { $name = 'safari'; - $version = $reg[2]; + $version = empty($reg[2]) ? '' : $reg[2]; } elseif (preg_match('/opera(\/|\s)([\d\.]*)/i', $user_agent, $reg)) { // Safari is often present in string for mobile but its not. $name = 'opera'; - $version = $reg[2]; + $version = empty($reg[2]) ? '' : $reg[2]; } elseif (preg_match('/(MSIE\s([0-9]+\.[0-9]))|.*(Trident\/[0-9]+.[0-9];.*rv:([0-9]+\.[0-9]+))/i', $user_agent, $reg)) { $name = 'ie'; $version = end($reg); @@ -368,10 +368,10 @@ function getBrowserInfo($user_agent) // MS products at end $name = 'ie'; $version = end($reg); - } elseif (preg_match('/l(i|y)n(x|ks)(\(|\/|\s)*([\d\.]+)/i', $user_agent, $reg)) { + } elseif (preg_match('/l[iy]n(x|ks)(\(|\/|\s)*([\d\.]+)/i', $user_agent, $reg)) { // MS products at end $name = 'lynxlinks'; - $version = $reg[4]; + $version = empty($reg[3]) ? '' : $reg[3]; } if ($tablet) { From 57358b618b8f46535ed7e434cfd9e105207434e8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 31 Dec 2022 17:08:10 +0100 Subject: [PATCH 0486/1128] Clean code --- htdocs/core/modules/action/modules_action.php | 2 -- htdocs/core/modules/asset/modules_asset.php | 2 -- htdocs/core/modules/bank/modules_bank.php | 2 -- htdocs/core/modules/bom/modules_bom.php | 2 -- htdocs/core/modules/cheque/modules_chequereceipts.php | 2 -- htdocs/core/modules/commande/modules_commande.php | 2 -- htdocs/core/modules/contract/modules_contract.php | 2 -- htdocs/core/modules/delivery/modules_delivery.php | 2 -- htdocs/core/modules/dons/modules_don.php | 2 -- htdocs/core/modules/expedition/modules_expedition.php | 2 -- .../modules/expensereport/modules_expensereport.php | 2 -- htdocs/core/modules/export/modules_export.php | 8 +++----- htdocs/core/modules/facture/modules_facture.php | 2 -- htdocs/core/modules/fichinter/modules_fichinter.php | 2 -- htdocs/core/modules/holiday/modules_holiday.php | 2 -- htdocs/core/modules/hrm/modules_evaluation.php | 2 -- htdocs/core/modules/import/modules_import.php | 8 +++----- htdocs/core/modules/member/modules_cards.php | 2 -- htdocs/core/modules/member/modules_member.class.php | 1 - htdocs/core/modules/movement/modules_movement.php | 2 -- htdocs/core/modules/mrp/modules_mo.php | 2 -- htdocs/core/modules/printsheet/modules_labels.php | 2 -- .../product_batch/modules_product_batch.class.php | 2 -- htdocs/core/modules/project/modules_project.php | 2 -- htdocs/core/modules/project/task/modules_task.php | 2 -- .../propale/doc/doc_generic_proposal_odt.modules.php | 8 ++++---- htdocs/core/modules/propale/modules_propale.php | 2 -- htdocs/core/modules/reception/modules_reception.php | 2 -- htdocs/core/modules/societe/modules_societe.class.php | 1 - htdocs/core/modules/stock/doc/pdf_standard.modules.php | 2 +- htdocs/core/modules/stock/modules_stock.php | 2 -- .../modules/stocktransfer/modules_stocktransfer.php | 2 -- .../supplier_invoice/modules_facturefournisseur.php | 2 -- .../supplier_order/modules_commandefournisseur.php | 2 -- .../supplier_payment/modules_supplier_payment.php | 2 -- .../supplier_proposal/modules_supplier_proposal.php | 2 -- htdocs/core/modules/ticket/modules_ticket.php | 2 -- htdocs/core/modules/user/modules_user.class.php | 2 -- .../core/modules/usergroup/modules_usergroup.class.php | 2 -- .../core/modules/workstation/modules_workstation.php | 2 -- htdocs/exports/export.php | 2 +- htdocs/exports/index.php | 2 +- htdocs/imports/import.php | 10 +++++----- htdocs/imports/index.php | 2 +- qodana.yaml | 1 + 45 files changed, 20 insertions(+), 93 deletions(-) diff --git a/htdocs/core/modules/action/modules_action.php b/htdocs/core/modules/action/modules_action.php index b496e32f5e1..1681d1f5100 100644 --- a/htdocs/core/modules/action/modules_action.php +++ b/htdocs/core/modules/action/modules_action.php @@ -44,8 +44,6 @@ abstract class ModeleAction extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'action'; $list = array(); diff --git a/htdocs/core/modules/asset/modules_asset.php b/htdocs/core/modules/asset/modules_asset.php index 0b90eab00e3..c9b64e0180f 100644 --- a/htdocs/core/modules/asset/modules_asset.php +++ b/htdocs/core/modules/asset/modules_asset.php @@ -84,8 +84,6 @@ abstract class ModelePDFAsset extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'asset'; $list = array(); diff --git a/htdocs/core/modules/bank/modules_bank.php b/htdocs/core/modules/bank/modules_bank.php index 70f6717d0c7..cfe7d406248 100644 --- a/htdocs/core/modules/bank/modules_bank.php +++ b/htdocs/core/modules/bank/modules_bank.php @@ -48,8 +48,6 @@ abstract class ModeleBankAccountDoc extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'bankaccount'; $list = array(); diff --git a/htdocs/core/modules/bom/modules_bom.php b/htdocs/core/modules/bom/modules_bom.php index 4c58e57c546..64fc9502d26 100644 --- a/htdocs/core/modules/bom/modules_bom.php +++ b/htdocs/core/modules/bom/modules_bom.php @@ -50,8 +50,6 @@ abstract class ModelePDFBom extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'bom'; $list = array(); diff --git a/htdocs/core/modules/cheque/modules_chequereceipts.php b/htdocs/core/modules/cheque/modules_chequereceipts.php index 519b13db443..45e18a12734 100644 --- a/htdocs/core/modules/cheque/modules_chequereceipts.php +++ b/htdocs/core/modules/cheque/modules_chequereceipts.php @@ -146,8 +146,6 @@ abstract class ModeleChequeReceipts extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'chequereceipt'; $list = array(); diff --git a/htdocs/core/modules/commande/modules_commande.php b/htdocs/core/modules/commande/modules_commande.php index 055286ddf37..d6ecda2b2e7 100644 --- a/htdocs/core/modules/commande/modules_commande.php +++ b/htdocs/core/modules/commande/modules_commande.php @@ -51,8 +51,6 @@ abstract class ModelePDFCommandes extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'order'; $list = array(); diff --git a/htdocs/core/modules/contract/modules_contract.php b/htdocs/core/modules/contract/modules_contract.php index 8e296f626fb..577ec4be5d9 100644 --- a/htdocs/core/modules/contract/modules_contract.php +++ b/htdocs/core/modules/contract/modules_contract.php @@ -54,8 +54,6 @@ abstract class ModelePDFContract extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'contract'; $list = array(); diff --git a/htdocs/core/modules/delivery/modules_delivery.php b/htdocs/core/modules/delivery/modules_delivery.php index 66e9727bc7b..9f7b6805f73 100644 --- a/htdocs/core/modules/delivery/modules_delivery.php +++ b/htdocs/core/modules/delivery/modules_delivery.php @@ -52,8 +52,6 @@ abstract class ModelePDFDeliveryOrder extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'delivery'; $list = array(); diff --git a/htdocs/core/modules/dons/modules_don.php b/htdocs/core/modules/dons/modules_don.php index 6bb78ab98ac..ca982c61a53 100644 --- a/htdocs/core/modules/dons/modules_don.php +++ b/htdocs/core/modules/dons/modules_don.php @@ -50,8 +50,6 @@ abstract class ModeleDon extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'donation'; $list = array(); diff --git a/htdocs/core/modules/expedition/modules_expedition.php b/htdocs/core/modules/expedition/modules_expedition.php index ce210d6a958..2ca5613af48 100644 --- a/htdocs/core/modules/expedition/modules_expedition.php +++ b/htdocs/core/modules/expedition/modules_expedition.php @@ -53,8 +53,6 @@ abstract class ModelePdfExpedition extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'shipping'; $list = array(); diff --git a/htdocs/core/modules/expensereport/modules_expensereport.php b/htdocs/core/modules/expensereport/modules_expensereport.php index eee2190033e..8e7718ee0d5 100644 --- a/htdocs/core/modules/expensereport/modules_expensereport.php +++ b/htdocs/core/modules/expensereport/modules_expensereport.php @@ -75,8 +75,6 @@ abstract class ModeleExpenseReport extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'expensereport'; $list = array(); diff --git a/htdocs/core/modules/export/modules_export.php b/htdocs/core/modules/export/modules_export.php index 685a4bda430..31b137f6465 100644 --- a/htdocs/core/modules/export/modules_export.php +++ b/htdocs/core/modules/export/modules_export.php @@ -28,7 +28,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/commondocgenerator.class.php'; /** * Parent class for export modules */ -class ModeleExports extends CommonDocGenerator // This class can't be abstract as there is instance propreties loaded by liste_modeles +class ModeleExports extends CommonDocGenerator // This class can't be abstract as there is instance propreties loaded by listOfAvailableExportFormat { /** * @var string Error code (or message) @@ -44,7 +44,6 @@ class ModeleExports extends CommonDocGenerator // This class can't be abstrac public $libversion = array(); - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps /** * Load into memory list of available export format * @@ -52,10 +51,9 @@ class ModeleExports extends CommonDocGenerator // This class can't be abstrac * @param integer $maxfilenamelength Max length of value to show * @return array List of templates (same content than array this->driverlabel) */ - public function liste_modeles($db, $maxfilenamelength = 0) + public function listOfAvailableExportFormat($db, $maxfilenamelength = 0) { - // phpcs:enable - dol_syslog(get_class($this)."::liste_modeles"); + dol_syslog(get_class($this)."::listOfAvailableExportFormat"); $dir = DOL_DOCUMENT_ROOT."/core/modules/export/"; $handle = opendir($dir); diff --git a/htdocs/core/modules/facture/modules_facture.php b/htdocs/core/modules/facture/modules_facture.php index b0d3c4682ba..ff541550d4e 100644 --- a/htdocs/core/modules/facture/modules_facture.php +++ b/htdocs/core/modules/facture/modules_facture.php @@ -61,8 +61,6 @@ abstract class ModelePDFFactures extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'invoice'; $list = array(); diff --git a/htdocs/core/modules/fichinter/modules_fichinter.php b/htdocs/core/modules/fichinter/modules_fichinter.php index 185ef4cf73b..28b3fd265ce 100644 --- a/htdocs/core/modules/fichinter/modules_fichinter.php +++ b/htdocs/core/modules/fichinter/modules_fichinter.php @@ -51,8 +51,6 @@ abstract class ModelePDFFicheinter extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'ficheinter'; $list = array(); diff --git a/htdocs/core/modules/holiday/modules_holiday.php b/htdocs/core/modules/holiday/modules_holiday.php index 7b6e13ea992..e38801a052e 100644 --- a/htdocs/core/modules/holiday/modules_holiday.php +++ b/htdocs/core/modules/holiday/modules_holiday.php @@ -55,8 +55,6 @@ abstract class ModelePDFHoliday extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'holiday'; $list = array(); diff --git a/htdocs/core/modules/hrm/modules_evaluation.php b/htdocs/core/modules/hrm/modules_evaluation.php index a28d3f2ef9d..06276ca8474 100644 --- a/htdocs/core/modules/hrm/modules_evaluation.php +++ b/htdocs/core/modules/hrm/modules_evaluation.php @@ -49,8 +49,6 @@ abstract class ModelePDFEvaluation extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'evaluation'; $list = array(); diff --git a/htdocs/core/modules/import/modules_import.php b/htdocs/core/modules/import/modules_import.php index d875afc5c4f..fa4a5ad3692 100644 --- a/htdocs/core/modules/import/modules_import.php +++ b/htdocs/core/modules/import/modules_import.php @@ -155,18 +155,16 @@ class ModeleImports } - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps /** - * Charge en memoire et renvoie la liste des modeles actifs + * Load into memory list of available import format * * @param DoliDB $db Database handler * @param integer $maxfilenamelength Max length of value to show * @return array List of templates */ - public function liste_modeles($db, $maxfilenamelength = 0) + public function listOfAvailableImportFormat($db, $maxfilenamelength = 0) { - // phpcs:enable - dol_syslog(get_class($this)."::liste_modeles"); + dol_syslog(get_class($this)."::listOfAvailableImportFormat"); $dir = DOL_DOCUMENT_ROOT."/core/modules/import/"; $handle = opendir($dir); diff --git a/htdocs/core/modules/member/modules_cards.php b/htdocs/core/modules/member/modules_cards.php index b37b9144d3e..0147f42f6c7 100644 --- a/htdocs/core/modules/member/modules_cards.php +++ b/htdocs/core/modules/member/modules_cards.php @@ -51,8 +51,6 @@ class ModelePDFCards public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'member'; $list = array(); diff --git a/htdocs/core/modules/member/modules_member.class.php b/htdocs/core/modules/member/modules_member.class.php index a356c76ee7c..77ab5621915 100644 --- a/htdocs/core/modules/member/modules_member.class.php +++ b/htdocs/core/modules/member/modules_member.class.php @@ -51,7 +51,6 @@ abstract class ModelePDFMember extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - $type = 'member'; $list = array(); diff --git a/htdocs/core/modules/movement/modules_movement.php b/htdocs/core/modules/movement/modules_movement.php index 1af966faf22..a058d685114 100644 --- a/htdocs/core/modules/movement/modules_movement.php +++ b/htdocs/core/modules/movement/modules_movement.php @@ -85,8 +85,6 @@ abstract class ModelePDFMovement extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'movement'; $list = array(); diff --git a/htdocs/core/modules/mrp/modules_mo.php b/htdocs/core/modules/mrp/modules_mo.php index 1b3af7f6b8c..c178a5d3eaf 100644 --- a/htdocs/core/modules/mrp/modules_mo.php +++ b/htdocs/core/modules/mrp/modules_mo.php @@ -50,8 +50,6 @@ abstract class ModelePDFMo extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'mrp'; $list = array(); diff --git a/htdocs/core/modules/printsheet/modules_labels.php b/htdocs/core/modules/printsheet/modules_labels.php index ae4c6888a6c..b80710dc1f6 100644 --- a/htdocs/core/modules/printsheet/modules_labels.php +++ b/htdocs/core/modules/printsheet/modules_labels.php @@ -51,8 +51,6 @@ class ModelePDFLabels public function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'members_labels'; $list = array(); diff --git a/htdocs/core/modules/product_batch/modules_product_batch.class.php b/htdocs/core/modules/product_batch/modules_product_batch.class.php index 1446d20aeda..d596ffeb111 100644 --- a/htdocs/core/modules/product_batch/modules_product_batch.class.php +++ b/htdocs/core/modules/product_batch/modules_product_batch.class.php @@ -55,8 +55,6 @@ abstract class ModelePDFProductBatch extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'product_batch'; $list = array(); diff --git a/htdocs/core/modules/project/modules_project.php b/htdocs/core/modules/project/modules_project.php index 6f55426e65f..9f8e0e977c7 100644 --- a/htdocs/core/modules/project/modules_project.php +++ b/htdocs/core/modules/project/modules_project.php @@ -103,8 +103,6 @@ abstract class ModelePDFProjects extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'project'; $list = array(); diff --git a/htdocs/core/modules/project/task/modules_task.php b/htdocs/core/modules/project/task/modules_task.php index 6614369aa43..97e31d5d24c 100644 --- a/htdocs/core/modules/project/task/modules_task.php +++ b/htdocs/core/modules/project/task/modules_task.php @@ -49,8 +49,6 @@ abstract class ModelePDFTask extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'project_task'; $list = array(); diff --git a/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php b/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php index de6554137df..ac95786cdd2 100644 --- a/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php +++ b/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php @@ -190,21 +190,21 @@ class doc_generic_proposal_odt extends ModelePDFPropales if (getDolGlobalInt("MAIN_PROPAL_CHOOSE_ODT_DOCUMENT") > 0) { // Model for creation $list = ModelePDFPropales::liste_modeles($this->db); - $texte .= ''; + $texte .= '
'; $texte .= ''; - $texte .= ''; + $texte .= ''; $texte .= '"; $texte .= ''; - $texte .= ''; + $texte .= ''; $texte .= '"; $texte .= ''; - $texte .= ''; + $texte .= ''; $texte .= '"; diff --git a/htdocs/core/modules/propale/modules_propale.php b/htdocs/core/modules/propale/modules_propale.php index b58ae681ef2..f69fd5e763e 100644 --- a/htdocs/core/modules/propale/modules_propale.php +++ b/htdocs/core/modules/propale/modules_propale.php @@ -53,8 +53,6 @@ abstract class ModelePDFPropales extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'propal'; $list = array(); diff --git a/htdocs/core/modules/reception/modules_reception.php b/htdocs/core/modules/reception/modules_reception.php index f519974382b..0dba62ee646 100644 --- a/htdocs/core/modules/reception/modules_reception.php +++ b/htdocs/core/modules/reception/modules_reception.php @@ -43,8 +43,6 @@ abstract class ModelePdfReception extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'reception'; $list = array(); diff --git a/htdocs/core/modules/societe/modules_societe.class.php b/htdocs/core/modules/societe/modules_societe.class.php index a1067c14d30..105333d815b 100644 --- a/htdocs/core/modules/societe/modules_societe.class.php +++ b/htdocs/core/modules/societe/modules_societe.class.php @@ -48,7 +48,6 @@ abstract class ModeleThirdPartyDoc extends CommonDocGenerator public static function liste_modeles($dbs, $maxfilenamelength = 0) { // phpcs:enable - $type = 'company'; $list = array(); diff --git a/htdocs/core/modules/stock/doc/pdf_standard.modules.php b/htdocs/core/modules/stock/doc/pdf_standard.modules.php index ed1877ec8f7..ac0bf98b0f3 100644 --- a/htdocs/core/modules/stock/doc/pdf_standard.modules.php +++ b/htdocs/core/modules/stock/doc/pdf_standard.modules.php @@ -402,7 +402,7 @@ class pdf_standard extends ModelePDFStock // Label $pdf->SetXY($this->posxlabel + 0.8, $curY); - $pdf->MultiCell($this->posxqty - $this->posxlabel - 0.8, 3, dol_trunc($objp->produit, 24), 0, 'L'); + $pdf->MultiCell($this->posxqty - $this->posxlabel - 0.8, 3, dol_trunc($productstatic->label, 24), 0, 'L'); // Quantity $valtoshow = price2num($objp->value, 'MS'); diff --git a/htdocs/core/modules/stock/modules_stock.php b/htdocs/core/modules/stock/modules_stock.php index 73092bb0bf6..d1dc684d1d2 100644 --- a/htdocs/core/modules/stock/modules_stock.php +++ b/htdocs/core/modules/stock/modules_stock.php @@ -75,8 +75,6 @@ abstract class ModelePDFStock extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'stock'; $list = array(); diff --git a/htdocs/core/modules/stocktransfer/modules_stocktransfer.php b/htdocs/core/modules/stocktransfer/modules_stocktransfer.php index 6c0213afb0c..2a7218543e7 100644 --- a/htdocs/core/modules/stocktransfer/modules_stocktransfer.php +++ b/htdocs/core/modules/stocktransfer/modules_stocktransfer.php @@ -50,8 +50,6 @@ abstract class ModelePDFStockTransfer extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'stocktransfer'; $list = array(); diff --git a/htdocs/core/modules/supplier_invoice/modules_facturefournisseur.php b/htdocs/core/modules/supplier_invoice/modules_facturefournisseur.php index 546596ab640..de56773eae2 100644 --- a/htdocs/core/modules/supplier_invoice/modules_facturefournisseur.php +++ b/htdocs/core/modules/supplier_invoice/modules_facturefournisseur.php @@ -51,8 +51,6 @@ abstract class ModelePDFSuppliersInvoices extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'invoice_supplier'; $list = array(); diff --git a/htdocs/core/modules/supplier_order/modules_commandefournisseur.php b/htdocs/core/modules/supplier_order/modules_commandefournisseur.php index 51c4e5f07d3..e8b66bb84cf 100644 --- a/htdocs/core/modules/supplier_order/modules_commandefournisseur.php +++ b/htdocs/core/modules/supplier_order/modules_commandefournisseur.php @@ -54,8 +54,6 @@ abstract class ModelePDFSuppliersOrders extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'order_supplier'; $list = array(); diff --git a/htdocs/core/modules/supplier_payment/modules_supplier_payment.php b/htdocs/core/modules/supplier_payment/modules_supplier_payment.php index 9409c4c688b..881d123772c 100644 --- a/htdocs/core/modules/supplier_payment/modules_supplier_payment.php +++ b/htdocs/core/modules/supplier_payment/modules_supplier_payment.php @@ -74,8 +74,6 @@ abstract class ModelePDFSuppliersPayments extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'supplier_payment'; $list = array(); diff --git a/htdocs/core/modules/supplier_proposal/modules_supplier_proposal.php b/htdocs/core/modules/supplier_proposal/modules_supplier_proposal.php index 42c935ca13c..f1fbf2f9890 100644 --- a/htdocs/core/modules/supplier_proposal/modules_supplier_proposal.php +++ b/htdocs/core/modules/supplier_proposal/modules_supplier_proposal.php @@ -53,8 +53,6 @@ abstract class ModelePDFSupplierProposal extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'supplier_proposal'; $list = array(); diff --git a/htdocs/core/modules/ticket/modules_ticket.php b/htdocs/core/modules/ticket/modules_ticket.php index 263803162fd..aaf9fb2e11b 100644 --- a/htdocs/core/modules/ticket/modules_ticket.php +++ b/htdocs/core/modules/ticket/modules_ticket.php @@ -44,8 +44,6 @@ abstract class ModelePDFTicket extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'ticket'; $list = array(); diff --git a/htdocs/core/modules/user/modules_user.class.php b/htdocs/core/modules/user/modules_user.class.php index b0142687ce5..d20e5e95eb8 100644 --- a/htdocs/core/modules/user/modules_user.class.php +++ b/htdocs/core/modules/user/modules_user.class.php @@ -55,8 +55,6 @@ abstract class ModelePDFUser extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'user'; $list = array(); diff --git a/htdocs/core/modules/usergroup/modules_usergroup.class.php b/htdocs/core/modules/usergroup/modules_usergroup.class.php index 99ee232fdf2..2c4aebe1e6f 100644 --- a/htdocs/core/modules/usergroup/modules_usergroup.class.php +++ b/htdocs/core/modules/usergroup/modules_usergroup.class.php @@ -55,8 +55,6 @@ abstract class ModelePDFUserGroup extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'group'; $list = array(); diff --git a/htdocs/core/modules/workstation/modules_workstation.php b/htdocs/core/modules/workstation/modules_workstation.php index a99dab9b17a..b72d34f5812 100644 --- a/htdocs/core/modules/workstation/modules_workstation.php +++ b/htdocs/core/modules/workstation/modules_workstation.php @@ -50,8 +50,6 @@ abstract class ModelePDFWorkstation extends CommonDocGenerator public static function liste_modeles($db, $maxfilenamelength = 0) { // phpcs:enable - global $conf; - $type = 'workstation'; $list = array(); diff --git a/htdocs/exports/export.php b/htdocs/exports/export.php index 4591ccd0bf3..f35ae3a3121 100644 --- a/htdocs/exports/export.php +++ b/htdocs/exports/export.php @@ -1187,7 +1187,7 @@ if ($step == 5 && $datatoexport) { $htmltabloflibs .= ''; $htmltabloflibs .= ''."\n"; - $liste = $objmodelexport->liste_modeles($db); + $liste = $objmodelexport->listOfAvailableExportFormat($db); $listeall = $liste; foreach ($listeall as $key => $val) { if (preg_match('/__\(Disabled\)__/', $listeall[$key])) { diff --git a/htdocs/exports/index.php b/htdocs/exports/index.php index 41d6cd18ed0..6039a9c447a 100644 --- a/htdocs/exports/index.php +++ b/htdocs/exports/index.php @@ -72,7 +72,7 @@ print ''; include_once DOL_DOCUMENT_ROOT.'/core/modules/export/modules_export.php'; $model = new ModeleExports($db); -$liste = $model->liste_modeles($db); // This is not a static method for exports because method load non static properties +$liste = $model->listOfAvailableExportFormat($db); // This is not a static method for exports because method load non static properties foreach ($liste as $key => $val) { if (preg_match('/__\(Disabled\)__/', $liste[$key])) { diff --git a/htdocs/imports/import.php b/htdocs/imports/import.php index 579fdb74c4a..d326470aa04 100644 --- a/htdocs/imports/import.php +++ b/htdocs/imports/import.php @@ -485,7 +485,7 @@ if ($step == 2 && $datatoimport) { print ''; - $list = $objmodelimport->liste_modeles($db); + $list = $objmodelimport->listOfAvailableImportFormat($db); foreach ($list as $key) { print ''; print ''; @@ -529,7 +529,7 @@ if ($step == 3 && $datatoimport) { $param .= '&enclosure='.urlencode($enclosure); } - $list = $objmodelimport->liste_modeles($db); + $list = $objmodelimport->listOfAvailableImportFormat($db); llxHeader('', $langs->trans("NewImport"), $help_url); @@ -763,7 +763,7 @@ if ($step == 4 && $datatoimport) { //var_dump($array_match_file_to_database); $model = $format; - $list = $objmodelimport->liste_modeles($db); + $list = $objmodelimport->listOfAvailableImportFormat($db); if (empty($separator)) { $separator = (empty($conf->global->IMPORT_CSV_SEPARATOR_TO_USE) ? ',' : $conf->global->IMPORT_CSV_SEPARATOR_TO_USE); @@ -1547,7 +1547,7 @@ if ($step == 5 && $datatoimport) { } $model = $format; - $list = $objmodelimport->liste_modeles($db); + $list = $objmodelimport->listOfAvailableImportFormat($db); // Create classe to use for import $dir = DOL_DOCUMENT_ROOT."/core/modules/import/"; @@ -2010,7 +2010,7 @@ if ($step == 6 && $datatoimport) { } $model = $format; - $list = $objmodelimport->liste_modeles($db); + $list = $objmodelimport->listOfAvailableImportFormat($db); $importid = GETPOST("importid", 'alphanohtml'); diff --git a/htdocs/imports/index.php b/htdocs/imports/index.php index ac3d2b23f69..e90f58aa8e1 100644 --- a/htdocs/imports/index.php +++ b/htdocs/imports/index.php @@ -68,7 +68,7 @@ print ''; include_once DOL_DOCUMENT_ROOT.'/core/modules/import/modules_import.php'; $model = new ModeleImports(); -$list = $model->liste_modeles($db); +$list = $model->listOfAvailableImportFormat($db); foreach ($list as $key) { print ''; diff --git a/qodana.yaml b/qodana.yaml index 36c35ece4c6..49fd189e734 100644 --- a/qodana.yaml +++ b/qodana.yaml @@ -72,6 +72,7 @@ exclude: - name: PhpConditionCheckedByNextConditionInspection - name: RegExpSingleCharAlternation - name: PhpSuspiciousNameCombinationInspection + - name: PhpObjectFieldsAreOnlyWrittenInspection - name: PhpWriteAccessToReferencedArrayValueWithoutUnsetInspection \ No newline at end of file From 97222603c10c97396c450a6cb933c081d5c8dc3e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 31 Dec 2022 17:14:58 +0100 Subject: [PATCH 0487/1128] Debug v17 --- htdocs/modulebuilder/index.php | 6 +++--- htdocs/stripe/admin/stripe.php | 4 ++-- htdocs/takepos/admin/terminal.php | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index 8b87d84c10e..a6f3431bd2e 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -1731,9 +1731,9 @@ if ($dirins && $action == 'confirm_deleteobject' && $objectname) { ); $resultko = 0; - foreach ($filetodelete as $filetodelete) { - $resulttmp = dol_delete_file($dir.'/'.$filetodelete, 0, 0, 1); - $resulttmp = dol_delete_file($dir.'/'.$filetodelete.'.back', 0, 0, 1); + foreach ($filetodelete as $tmpfiletodelete) { + $resulttmp = dol_delete_file($dir.'/'.$tmpfiletodelete, 0, 0, 1); + $resulttmp = dol_delete_file($dir.'/'.$tmpfiletodelete.'.back', 0, 0, 1); if (!$resulttmp) { $resultko++; } diff --git a/htdocs/stripe/admin/stripe.php b/htdocs/stripe/admin/stripe.php index 6cbefc14185..1c5a507b619 100644 --- a/htdocs/stripe/admin/stripe.php +++ b/htdocs/stripe/admin/stripe.php @@ -420,8 +420,8 @@ if ($conf->global->MAIN_FEATURES_LEVEL >= 2) { // TODO Not used by current code $location = array(); $location[""] = $langs->trans("NotDefined"); - foreach ($locations as $locations) { - $location[$locations->id] = $locations->display_name; + foreach ($locations as $tmplocation) { + $location[$tmplocation->id] = $tmplocation->display_name; } print $form->selectarray("STRIPE_LOCATION", $location, getDolGlobalString('STRIPE_LOCATION')); print ''; diff --git a/htdocs/takepos/admin/terminal.php b/htdocs/takepos/admin/terminal.php index fe03139c8a3..7fc2d60544a 100644 --- a/htdocs/takepos/admin/terminal.php +++ b/htdocs/takepos/admin/terminal.php @@ -219,8 +219,8 @@ if (isModEnabled("banque")) { $reader = array(); $reader[""] = $langs->trans("NoReader"); - foreach ($readers as $readers) { - $reader[$reader->id] = $readers->label.' ('.$readers->status.')'; + foreach ($readers as $tmpreader) { + $reader[$tmpreader->id] = $tmpreader->label.' ('.$tmpreader->status.')'; } print $form->selectarray('CASHDESK_ID_BANKACCOUNT_STRIPETERMINAL'.$terminaltouse, $reader, $conf->global->{'CASHDESK_ID_BANKACCOUNT_STRIPETERMINAL'.$terminaltouse}); print ''; From 1b1e4e188e439ba2a6b417264182bcf379e03769 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 31 Dec 2022 17:17:21 +0100 Subject: [PATCH 0488/1128] Debug v17 --- htdocs/core/class/fileupload.class.php | 2 +- qodana.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/fileupload.class.php b/htdocs/core/class/fileupload.class.php index b1e085fbff7..a3fb3505fba 100644 --- a/htdocs/core/class/fileupload.class.php +++ b/htdocs/core/class/fileupload.class.php @@ -259,7 +259,7 @@ class FileUpload /** * getFileObjects * - * @return void + * @return array Array of objects */ protected function getFileObjects() { diff --git a/qodana.yaml b/qodana.yaml index 49fd189e734..5b835ab446d 100644 --- a/qodana.yaml +++ b/qodana.yaml @@ -72,7 +72,7 @@ exclude: - name: PhpConditionCheckedByNextConditionInspection - name: RegExpSingleCharAlternation - name: PhpSuspiciousNameCombinationInspection - - name: PhpObjectFieldsAreOnlyWrittenInspection + - name: PhpObjectFieldsAreOnlyWrittenInspection - name: PhpWriteAccessToReferencedArrayValueWithoutUnsetInspection \ No newline at end of file From b70c6faef299c1418b984497ae2272d471131644 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 31 Dec 2022 17:19:05 +0100 Subject: [PATCH 0489/1128] Clean code --- .../modules/supplier_payment/modules_supplier_payment.php | 7 +++++-- htdocs/ftp/index.php | 8 ++++---- htdocs/index.php | 2 +- qodana.yaml | 3 ++- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/htdocs/core/modules/supplier_payment/modules_supplier_payment.php b/htdocs/core/modules/supplier_payment/modules_supplier_payment.php index 881d123772c..93195edec24 100644 --- a/htdocs/core/modules/supplier_payment/modules_supplier_payment.php +++ b/htdocs/core/modules/supplier_payment/modules_supplier_payment.php @@ -17,6 +17,8 @@ */ require_once DOL_DOCUMENT_ROOT.'/core/class/commondocgenerator.class.php'; + + /** * Parent class for supplier invoices models */ @@ -85,8 +87,9 @@ abstract class ModelePDFSuppliersPayments extends CommonDocGenerator } /** - * \class ModeleNumRefSupplierPayments - * \brief Payment numbering references mother class + * ModeleNumRefSupplierPayments + * + * Payment numbering references mother class */ abstract class ModeleNumRefSupplierPayments diff --git a/htdocs/ftp/index.php b/htdocs/ftp/index.php index af48f0f8348..633cb6fa5ce 100644 --- a/htdocs/ftp/index.php +++ b/htdocs/ftp/index.php @@ -282,7 +282,7 @@ if ($action == 'download') { $newsection = $section; - $result = dol_ftp_get($connect_id, $localfile, $file, $newsection); + $result = dol_ftp_get($conn_id, $localfile, $file, $newsection); if ($result) { @@ -306,9 +306,9 @@ if ($action == 'download') { header('Content-Type: '.$type); } if ($attachment) { - header('Content-Disposition: attachment; filename="'.$filename.'"'); + header('Content-Disposition: attachment; filename="'.$file.'"'); } else { - header('Content-Disposition: inline; filename="'.$filename.'"'); + header('Content-Disposition: inline; filename="'.$file.'"'); } // Ajout directives pour resoudre bug IE @@ -319,7 +319,7 @@ if ($action == 'download') { exit; } else { - setEventMessages($langs->transnoentitiesnoconv('FailedToGetFile', $remotefile), null, 'errors'); + setEventMessages($langs->transnoentitiesnoconv('FailedToGetFile', $file), null, 'errors'); } } else { dol_print_error('', $mesg); diff --git a/htdocs/index.php b/htdocs/index.php index e0001adba5e..15c41e7ff50 100644 --- a/htdocs/index.php +++ b/htdocs/index.php @@ -119,7 +119,7 @@ if (empty($conf->global->MAIN_REMOVE_INSTALL_WARNING)) { } // Conf files must be in read only mode - if (is_writable($conffile)) { + if (is_writable($conffile)) { // $conffile is defined into filefunc.inc.php $langs->load("errors"); //$langs->load("other"); //if (!empty($message)) $message.='
'; diff --git a/qodana.yaml b/qodana.yaml index 5b835ab446d..75ab2315e9a 100644 --- a/qodana.yaml +++ b/qodana.yaml @@ -73,6 +73,7 @@ exclude: - name: RegExpSingleCharAlternation - name: PhpSuspiciousNameCombinationInspection - name: PhpObjectFieldsAreOnlyWrittenInspection + - name: PhpMissingParentConstructorInspection - name: PhpWriteAccessToReferencedArrayValueWithoutUnsetInspection - + \ No newline at end of file From d1934bfded6f1ef8ff7c75487746c72f19e86dc6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 31 Dec 2022 17:29:57 +0100 Subject: [PATCH 0490/1128] Debug v17 --- htdocs/compta/localtax/index.php | 12 ++---------- htdocs/compta/tva/index.php | 10 ---------- 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/htdocs/compta/localtax/index.php b/htdocs/compta/localtax/index.php index ad0b86a161d..fb96e766945 100644 --- a/htdocs/compta/localtax/index.php +++ b/htdocs/compta/localtax/index.php @@ -18,11 +18,13 @@ * along with this program. If not, see . */ + /** * \file htdocs/compta/localtax/index.php * \ingroup tax * \brief Index page of IRPF reports */ + require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/report.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/tax.lib.php'; @@ -441,16 +443,6 @@ while ((($y < $yend) || ($y == $yend && $m <= $mend)) && $mcursor < 1000) { // $ $hookmanager->initHooks(array('externalbalance')); $reshook = $hookmanager->executeHooks('addVatLine', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks - if (!is_array($x_coll) && $coll_listbuy == -1) { - $langs->load("errors"); - print '
'; - break; - } - if (!is_array($x_paye) && $coll_listbuy == -2) { - print ''; - break; - } - print ''; print ''; diff --git a/htdocs/compta/tva/index.php b/htdocs/compta/tva/index.php index f0efe305d8c..5c0d6930475 100644 --- a/htdocs/compta/tva/index.php +++ b/htdocs/compta/tva/index.php @@ -389,16 +389,6 @@ if ($refresh === true) { $hookmanager->initHooks(array('externalbalance')); $reshook = $hookmanager->executeHooks('addVatLine', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks - if (!is_array($x_coll) && $coll_listbuy == -1) { - $langs->load("errors"); - print ''; - break; - } - if (!is_array($x_paye) && $coll_listbuy == -2) { - print ''; - break; - } - print ''; print ''; From da4567c87524c96337cfa89588dfe3a689ac7c2a Mon Sep 17 00:00:00 2001 From: Christian Humpel Date: Sun, 1 Jan 2023 15:05:04 +0100 Subject: [PATCH 0491/1128] Set $remise_percent to 0, if GETPOST is empty. --- htdocs/commande/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index 77a59c159ff..996beecab61 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -1106,7 +1106,7 @@ if (empty($reshook)) { $special_code = 3; } - $remise_percent = price2num(GETPOST('remise_percent'), '', 2); + $remise_percent = GETPOST('remise_percent') != '' ? price2num(GETPOST('remise_percent'), '', 2) : 0; // Check minimum price $productid = GETPOST('productid', 'int'); From 0915374fa126efda9260bf898e714eb7f65bda22 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Sun, 1 Jan 2023 16:54:36 +0100 Subject: [PATCH 0492/1128] Fix php 8 errors --- htdocs/stripe/class/stripe.class.php | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/htdocs/stripe/class/stripe.class.php b/htdocs/stripe/class/stripe.class.php index 43f940acdee..53adfdbe85b 100644 --- a/htdocs/stripe/class/stripe.class.php +++ b/htdocs/stripe/class/stripe.class.php @@ -378,7 +378,7 @@ class Stripe extends CommonObject $paymentintent = null; - if (is_object($object) && !empty($conf->global->STRIPE_REUSE_EXISTING_INTENT_IF_FOUND) && empty($conf->global->STRIPE_CARD_PRESENT)) { + if (is_object($object) && getDolGlobalInt('STRIPE_REUSE_EXISTING_INTENT_IF_FOUND') && !getDolGlobalInt('STRIPE_CARD_PRESENT')) { // Warning. If a payment was tried and failed, a payment intent was created. // But if we change something on object to pay (amount or other that does not change the idempotency key), reusing same payment intent is not allowed by Stripe. // Recommended solution is to recreate a new payment intent each time we need one (old one will be automatically closed by Stripe after a delay), Stripe will @@ -435,26 +435,26 @@ class Stripe extends CommonObject // list of payment method types $paymentmethodtypes = array("card"); $descriptor = dol_trunc($tag, 10, 'right', 'UTF-8', 1); - if (!empty($conf->global->STRIPE_SEPA_DIRECT_DEBIT)) { + if (getDolGlobalInt('STRIPE_SEPA_DIRECT_DEBIT')) { $paymentmethodtypes[] = "sepa_debit"; //&& ($object->thirdparty->isInEEC()) //$descriptor = preg_replace('/ref=[^:=]+/', '', $descriptor); // Clean ref } - if (!empty($conf->global->STRIPE_KLARNA)) { + if (getDolGlobalInt('STRIPE_KLARNA')) { $paymentmethodtypes[] = "klarna"; } - if (!empty($conf->global->STRIPE_BANCONTACT)) { + if (getDolGlobalInt('STRIPE_BANCONTACT')) { $paymentmethodtypes[] = "bancontact"; } - if (!empty($conf->global->STRIPE_IDEAL)) { + if (getDolGlobalInt('STRIPE_IDEAL')) { $paymentmethodtypes[] = "ideal"; } - if (!empty($conf->global->STRIPE_GIROPAY)) { + if (getDolGlobalInt('STRIPE_GIROPAY')) { $paymentmethodtypes[] = "giropay"; } - if (!empty($conf->global->STRIPE_SOFORT)) { + if (getDolGlobalInt('STRIPE_SOFORT')) { $paymentmethodtypes[] = "sofort"; } - if (!empty($conf->global->STRIPE_CARD_PRESENT) && $mode == 'terminal') { + if (getDolGlobalInt('STRIPE_CARD_PRESENT') && $mode == 'terminal') { $paymentmethodtypes = array("card_present"); } @@ -484,13 +484,13 @@ class Stripe extends CommonObject //$dataforintent["setup_future_usage"] = "off_session"; $dataforintent["off_session"] = true; } - if (!empty($conf->global->STRIPE_GIROPAY)) { + if (getDolGlobalInt('STRIPE_GIROPAY')) { unset($dataforintent['setup_future_usage']); } - if (!empty($conf->global->STRIPE_KLARNA)) { + if (getDolGlobalInt('STRIPE_KLARNA')) { unset($dataforintent['setup_future_usage']); } - if (!empty($conf->global->STRIPE_CARD_PRESENT) && $mode == 'terminal') { + if (getDolGlobalInt('STRIPE_CARD_PRESENT') && $mode == 'terminal') { unset($dataforintent['setup_future_usage']); $dataforintent["capture_method"] = "manual"; $dataforintent["confirmation_method"] = "manual"; @@ -500,7 +500,7 @@ class Stripe extends CommonObject $description .= ' - '.$payment_method; } - if ($conf->entity != $conf->global->STRIPECONNECT_PRINCIPAL && $stripefee > 0) { + if ($conf->entity != getDolGlobalInt('STRIPECONNECT_PRINCIPAL') && $stripefee > 0) { $dataforintent["application_fee_amount"] = $stripefee; } if ($usethirdpartyemailforreceiptemail && is_object($object) && $object->thirdparty->email) { From 5c8dc4ed58e1a3231dc1572b24e188ef234485e5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 1 Jan 2023 23:50:37 +0100 Subject: [PATCH 0493/1128] Fix warning --- .../core/boxes/box_graph_invoices_peryear.php | 4 ++-- htdocs/core/modules/modLoan.class.php | 2 +- htdocs/don/class/don.class.php | 8 ++++---- htdocs/expedition/class/expedition.class.php | 19 +------------------ htdocs/reception/class/reception.class.php | 19 ------------------- qodana.yaml | 2 +- 6 files changed, 9 insertions(+), 45 deletions(-) diff --git a/htdocs/core/boxes/box_graph_invoices_peryear.php b/htdocs/core/boxes/box_graph_invoices_peryear.php index 5a9b84829f2..9ea2fe5a130 100644 --- a/htdocs/core/boxes/box_graph_invoices_peryear.php +++ b/htdocs/core/boxes/box_graph_invoices_peryear.php @@ -142,7 +142,7 @@ class box_graph_invoices_peryear extends ModeleBoxes $px2->SetData($data2); unset($data2); $i = $startyear; - $legend = array(); + /*$legend = array(); while ($i <= $endyear) { if ($startmonth != 1) { $legend[] = sprintf("%d/%d", $i - 2001, $i - 2000); @@ -150,7 +150,7 @@ class box_graph_invoices_peryear extends ModeleBoxes $legend[] = $i; } $i++; - } + }*/ $px2->SetLegend([$langs->trans("AmountOfBillsHT")]); $px2->SetMaxValue($px2->GetCeilMaxValue()); $px2->SetWidth($WIDTH); diff --git a/htdocs/core/modules/modLoan.class.php b/htdocs/core/modules/modLoan.class.php index 7f2850b075a..36919bc38af 100644 --- a/htdocs/core/modules/modLoan.class.php +++ b/htdocs/core/modules/modLoan.class.php @@ -82,7 +82,7 @@ class modLoan extends DolibarrModules "chaine", "6611" ); - $this->const[1] = array( + $this->const[2] = array( "LOAN_ACCOUNTING_ACCOUNT_INSURANCE", "chaine", "6162" diff --git a/htdocs/don/class/don.class.php b/htdocs/don/class/don.class.php index 333f9673175..158c96cb441 100644 --- a/htdocs/don/class/don.class.php +++ b/htdocs/don/class/don.class.php @@ -206,7 +206,7 @@ class Don extends CommonObject */ public function initAsSpecimen() { - global $conf, $user, $langs; + global $conf; $now = dol_now(); @@ -224,10 +224,10 @@ class Don extends CommonObject $num_socs = $this->db->num_rows($resql); $i = 0; while ($i < $num_socs) { - $i++; - $row = $this->db->fetch_row($resql); $socids[$i] = $row[0]; + + $i++; } } @@ -237,7 +237,7 @@ class Don extends CommonObject $this->specimen = 1; $this->lastname = 'Doe'; $this->firstname = 'John'; - $this->socid = 1; + $this->socid = empty($socids[0]) ? 0 : $socids[0]; $this->date = $now; $this->date_valid = $now; $this->amount = 100.90; diff --git a/htdocs/expedition/class/expedition.class.php b/htdocs/expedition/class/expedition.class.php index bb2954daa60..dd6dfee55b1 100644 --- a/htdocs/expedition/class/expedition.class.php +++ b/htdocs/expedition/class/expedition.class.php @@ -1911,23 +1911,6 @@ class Expedition extends CommonObject dol_syslog(get_class($this)."::initAsSpecimen"); - // Load array of products prodids - $num_prods = 0; - $prodids = array(); - $sql = "SELECT rowid"; - $sql .= " FROM ".MAIN_DB_PREFIX."product"; - $sql .= " WHERE entity IN (".getEntity('product').")"; - $resql = $this->db->query($sql); - if ($resql) { - $num_prods = $this->db->num_rows($resql); - $i = 0; - while ($i < $num_prods) { - $i++; - $row = $this->db->fetch_row($resql); - $prodids[$i] = $row[0]; - } - } - $order = new Commande($this->db); $order->initAsSpecimen(); @@ -1940,7 +1923,7 @@ class Expedition extends CommonObject $this->date = $now; $this->date_creation = $now; $this->date_valid = $now; - $this->date_delivery = $now; + $this->date_delivery = $now + 24 * 3600; $this->date_expedition = $now + 24 * 3600; $this->entrepot_id = 0; diff --git a/htdocs/reception/class/reception.class.php b/htdocs/reception/class/reception.class.php index 96b275bfb26..03ed28a2200 100644 --- a/htdocs/reception/class/reception.class.php +++ b/htdocs/reception/class/reception.class.php @@ -1348,25 +1348,6 @@ class Reception extends CommonObject dol_syslog(get_class($this)."::initAsSpecimen"); - // Load array of products prodids - $num_prods = 0; - $prodids = array(); - $sql = "SELECT rowid"; - $sql .= " FROM ".MAIN_DB_PREFIX."product"; - $sql .= " WHERE entity IN (".getEntity('product').")"; - $sql .= $this->db->plimit(100); - - $resql = $this->db->query($sql); - if ($resql) { - $num_prods = $this->db->num_rows($resql); - $i = 0; - while ($i < $num_prods) { - $i++; - $row = $this->db->fetch_row($resql); - $prodids[$i] = $row[0]; - } - } - $order = new CommandeFournisseur($this->db); $order->initAsSpecimen(); diff --git a/qodana.yaml b/qodana.yaml index 75ab2315e9a..7347f4dd50b 100644 --- a/qodana.yaml +++ b/qodana.yaml @@ -75,5 +75,5 @@ exclude: - name: PhpObjectFieldsAreOnlyWrittenInspection - name: PhpMissingParentConstructorInspection - name: PhpWriteAccessToReferencedArrayValueWithoutUnsetInspection - + - name: PhpArrayUsedOnlyForWriteInspection \ No newline at end of file From ac75406e357ce5b4cddf590a26dd0936898d4faa Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 1 Jan 2023 23:55:59 +0100 Subject: [PATCH 0494/1128] Clean code --- htdocs/fichinter/card-rec.php | 2 +- htdocs/fichinter/class/fichinterrec.class.php | 11 ++++------- qodana.yaml | 3 +++ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/htdocs/fichinter/card-rec.php b/htdocs/fichinter/card-rec.php index f2bd0bac8a3..22f77546090 100644 --- a/htdocs/fichinter/card-rec.php +++ b/htdocs/fichinter/card-rec.php @@ -234,7 +234,7 @@ if ($action == 'add') { } elseif ($action == 'delete' && $user->rights->ficheinter->supprimer) { // delete modele $object->fetch($id); - $object->delete(); + $object->delete($user); $id = 0; header('Location: '.$_SERVER["PHP_SELF"]); exit; diff --git a/htdocs/fichinter/class/fichinterrec.class.php b/htdocs/fichinter/class/fichinterrec.class.php index fa3b700b1fd..2f4ca02d3c7 100644 --- a/htdocs/fichinter/class/fichinterrec.class.php +++ b/htdocs/fichinter/class/fichinterrec.class.php @@ -411,16 +411,13 @@ class FichinterRec extends Fichinter /** * Delete template fichinter rec * - * @param int $rowid Id of fichinter rec to delete. If empty, we delete current instance of fichinter rec - * @param int $notrigger 1=Does not execute triggers, 0= execute triggers - * @param int $idwarehouse Id warehouse to use for stock change. + * @param User $user Object user who delete + * @param int $notrigger Disable trigger * @return int <0 if KO, >0 if OK */ - public function delete($rowid = 0, $notrigger = 0, $idwarehouse = -1) + public function delete(User $user, $notrigger = 0) { - if (empty($rowid)) { - $rowid = $this->id; - } + $rowid = $this->id; dol_syslog(get_class($this)."::delete rowid=".$rowid, LOG_DEBUG); diff --git a/qodana.yaml b/qodana.yaml index 7347f4dd50b..872b043013b 100644 --- a/qodana.yaml +++ b/qodana.yaml @@ -76,4 +76,7 @@ exclude: - name: PhpMissingParentConstructorInspection - name: PhpWriteAccessToReferencedArrayValueWithoutUnsetInspection - name: PhpArrayUsedOnlyForWriteInspection + - name: PhpArrayIndexImmediatelyRewrittenInspection + - name: PhpParameterNameChangedDuringInheritanceInspection + - name: PhpDuplicateSwitchCaseBodyInspection \ No newline at end of file From 7e22e1e7b490f7c3862602b2afa2870359497206 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 2 Jan 2023 00:02:34 +0100 Subject: [PATCH 0495/1128] Clean php --- .github/workflows/code_quality.yml | 1 + htdocs/mailmanspip/class/mailmanspip.class.php | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/code_quality.yml b/.github/workflows/code_quality.yml index 2b8ea0b3551..700d9fe64bf 100644 --- a/.github/workflows/code_quality.yml +++ b/.github/workflows/code_quality.yml @@ -16,6 +16,7 @@ jobs: - uses: actions/checkout@v3 with: fetch-depth: 0 + php-version: '7.1' - name: 'Qodana Scan' uses: JetBrains/qodana-action@v2022.3.0 env: diff --git a/htdocs/mailmanspip/class/mailmanspip.class.php b/htdocs/mailmanspip/class/mailmanspip.class.php index 46701a459a6..6bc34977e4e 100644 --- a/htdocs/mailmanspip/class/mailmanspip.class.php +++ b/htdocs/mailmanspip/class/mailmanspip.class.php @@ -105,13 +105,13 @@ class MailmanSpip */ public function connectSpip() { - $resource = getDoliDBInstance('mysql', ADHERENT_SPIP_SERVEUR, ADHERENT_SPIP_USER, ADHERENT_SPIP_PASS, ADHERENT_SPIP_DB, ADHERENT_SPIP_PORT); + $resource = getDoliDBInstance('mysql', getDolGlobalString('ADHERENT_SPIP_SERVEUR'), getDolGlobalString('ADHERENT_SPIP_USER'), getDolGlobalString('ADHERENT_SPIP_PASS'), getDolGlobalString('ADHERENT_SPIP_DB'), getDolGlobalString('ADHERENT_SPIP_PORT')); if ($resource->ok) { return $resource; } - dol_syslog('Error when connecting to SPIP '.ADHERENT_SPIP_SERVEUR.' '.ADHERENT_SPIP_USER.' '.ADHERENT_SPIP_PASS.' '.ADHERENT_SPIP_DB, LOG_ERR); + dol_syslog('Error when connecting to SPIP '.getDolGlobalString('ADHERENT_SPIP_SERVEUR').' '.getDolGlobalString('ADHERENT_SPIP_USER').' '.getDolGlobalString('ADHERENT_SPIP_PASS').' '.getDolGlobalString('ADHERENT_SPIP_DB'), LOG_ERR); return false; } From a6847e9edc81976fb98324ae04f586a21e8b3fbc Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 2 Jan 2023 00:06:15 +0100 Subject: [PATCH 0496/1128] doxygen --- htdocs/ticket/class/actions_ticket.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/ticket/class/actions_ticket.class.php b/htdocs/ticket/class/actions_ticket.class.php index 6ad204965bc..29a013f1eb9 100644 --- a/htdocs/ticket/class/actions_ticket.class.php +++ b/htdocs/ticket/class/actions_ticket.class.php @@ -111,7 +111,7 @@ class ActionsTicket * @param int $id ID of ticket * @param string $ref Reference of ticket * @param string $track_id Track ID of ticket (for public area) - * @return void + * @return int <0 if KO, >0 if OK */ public function fetch($id = 0, $ref = '', $track_id = '') { From cf1ff1e1f69688a7656c08051dc01fb3f6fb0ec7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 2 Jan 2023 00:07:03 +0100 Subject: [PATCH 0497/1128] Fix warning --- htdocs/resource/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/resource/card.php b/htdocs/resource/card.php index 5c588b59c6b..3ee118d06c7 100644 --- a/htdocs/resource/card.php +++ b/htdocs/resource/card.php @@ -225,7 +225,7 @@ if ($action == 'create' || $object->fetch($id, $ref) > 0) { // Type print ''; print ''; // Description From 2aef5e94df346965073f9feddca8342037afc913 Mon Sep 17 00:00:00 2001 From: Christian Humpel Date: Sun, 1 Jan 2023 15:05:04 +0100 Subject: [PATCH 0498/1128] Set $remise_percent to 0, if GETPOST is empty. --- htdocs/commande/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index 66e673abf2d..e467a398dc7 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -1106,7 +1106,7 @@ if (empty($reshook)) { $special_code = 3; } - $remise_percent = price2num(GETPOST('remise_percent'), '', 2); + $remise_percent = GETPOST('remise_percent') != '' ? price2num(GETPOST('remise_percent'), '', 2) : 0; // Check minimum price $productid = GETPOST('productid', 'int'); From b96c58ea6796232bd35562c2f711358b8812b054 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 2 Jan 2023 00:07:03 +0100 Subject: [PATCH 0499/1128] Fix warning --- htdocs/resource/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/resource/card.php b/htdocs/resource/card.php index 5c588b59c6b..3ee118d06c7 100644 --- a/htdocs/resource/card.php +++ b/htdocs/resource/card.php @@ -225,7 +225,7 @@ if ($action == 'create' || $object->fetch($id, $ref) > 0) { // Type print ''; print ''; // Description From edfa7dddfcc4c78faa6f6130f418be6818488205 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 2 Jan 2023 01:50:25 +0100 Subject: [PATCH 0500/1128] Update html.formpropal.class.php --- htdocs/core/class/html.formpropal.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/html.formpropal.class.php b/htdocs/core/class/html.formpropal.class.php index fbbf2c97fb7..7cce3c839c5 100644 --- a/htdocs/core/class/html.formpropal.class.php +++ b/htdocs/core/class/html.formpropal.class.php @@ -139,7 +139,7 @@ class FormPropal } else { print ''; print ''; From 9aecf48ce33880623e3f5f0330cbbba76710bd7d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 2 Jan 2023 01:53:05 +0100 Subject: [PATCH 0501/1128] Update main.inc.php --- htdocs/main.inc.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index e0ea7b1dbfc..dbb18aa61d3 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -3211,7 +3211,7 @@ if (!function_exists("llxFooter")) { global $contextpage, $page, $limit, $mode; global $dolibarr_distrib; - $ext = 'layout='.$conf->browser->layout.'&version='.urlencode(DOL_VERSION); + $ext = 'layout='.urlencode($conf->browser->layout).'&version='.urlencode(DOL_VERSION); // Hook to add more things on all pages within fiche DIV $llxfooter = ''; @@ -3222,7 +3222,9 @@ if (!function_exists("llxFooter")) { } elseif ($reshook > 0) { $llxfooter = $hookmanager->resPrint; } - print $llxfooter; + if ($llxfooter) { + print $llxfooter; + } // Global html output events ($mesgs, $errors, $warnings) dol_htmloutput_events($disabledoutputofmessages); From 73e5d6d2d2a7b86eee434a0db4fe100c195a4b31 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 2 Jan 2023 02:08:20 +0100 Subject: [PATCH 0502/1128] Clean code --- htdocs/core/class/conf.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/conf.class.php b/htdocs/core/class/conf.class.php index 56e9e88b1dc..74d8b089223 100644 --- a/htdocs/core/class/conf.class.php +++ b/htdocs/core/class/conf.class.php @@ -499,9 +499,9 @@ class Conf // Exception: Some dir are not the name of module. So we keep exception here for backward compatibility. // Sous module bons d'expedition - $this->expedition_bon->enabled = (!empty($this->global->MAIN_SUBMODULE_EXPEDITION) ? $this->global->MAIN_SUBMODULE_EXPEDITION : 0); + $this->expedition_bon->enabled = (empty($this->global->MAIN_SUBMODULE_EXPEDITION) ? 0 : $this->global->MAIN_SUBMODULE_EXPEDITION); // Sub module delivery note Sous module bons de livraison - $this->delivery_note->enabled = (!empty($this->global->MAIN_SUBMODULE_DELIVERY) ? $this->global->MAIN_SUBMODULE_DELIVERY : 0); + $this->delivery_note->enabled = (empty($this->global->MAIN_SUBMODULE_DELIVERY) ? 0 : $this->global->MAIN_SUBMODULE_DELIVERY); // Module fournisseur if (!empty($this->fournisseur)) { From f3bdecd111e8d30f92536be289f407271600bcf7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 2 Jan 2023 02:23:28 +0100 Subject: [PATCH 0503/1128] Revert option ECM_AUTO_TREE_ENABLED into ECM_AUTO_TREE_HIDEN --- htdocs/admin/ecm.php | 24 ++++++++++++------------ htdocs/core/lib/ecm.lib.php | 2 +- htdocs/core/modules/modECM.class.php | 8 +------- htdocs/ecm/index_auto.php | 2 +- htdocs/install/upgrade2.php | 7 +++++++ 5 files changed, 22 insertions(+), 21 deletions(-) diff --git a/htdocs/admin/ecm.php b/htdocs/admin/ecm.php index 3e0c2378742..4b5ccbb133e 100644 --- a/htdocs/admin/ecm.php +++ b/htdocs/admin/ecm.php @@ -31,6 +31,8 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; // Load translation files required by the page $langs->load("admin"); +$action = GETPOST('action', 'aZ09'); + if (!$user->admin) { accessforbidden(); } @@ -41,6 +43,7 @@ if (!$user->admin) { */ // set +$reg = array(); if (preg_match('/set_([a-z0-9_\-]+)/i', $action, $reg)) { $code = $reg[1]; if (dolibarr_set_const($db, $code, 1, 'chaine', 0, '', $conf->entity) > 0) { @@ -67,6 +70,8 @@ if (preg_match('/del_([a-z0-9_\-]+)/i', $action, $reg)) { * View */ +$form = new Form($db); + $help_url = ''; llxHeader('', $langs->trans("ECMSetup"), $help_url); @@ -81,26 +86,21 @@ print dol_get_fiche_head($head, 'ecm', '', -1, ''); print '
'.$langs->trans("DefaultModelPropalCreate").''.$langs->trans("DefaultModelPropalCreate").''; $texte .= $form->selectarray('value2', $list, $conf->global->PROPALE_ADDON_PDF_ODT_DEFAULT); $texte .= "
'.$langs->trans("DefaultModelPropalToBill").''.$langs->trans("DefaultModelPropalToBill").''; $texte .= $form->selectarray('value3', $list, $conf->global->PROPALE_ADDON_PDF_ODT_TOBILL); $texte .= "
'.$langs->trans("DefaultModelPropalClosed").''.$langs->trans("DefaultModelPropalClosed").''; $texte .= $form->selectarray('value4', $list, $conf->global->PROPALE_ADDON_PDF_ODT_CLOSED); $texte .= "
'.$langs->trans("LibraryVersion").'
'; print $langs->trans("FileMustHaveOneOfFollowingFormat"); print '
'.img_picto_common($key, $objmodelimport->getPictoForKey($key)).'
'.$langs->trans("ErrorNoAccountancyModuleLoaded").'
'.$langs->trans("FeatureNotYetAvailable").'
'.dol_print_date(dol_mktime(0, 0, 0, $m, 1, $y), "%b %Y").'
' . $langs->trans("ErrorNoAccountancyModuleLoaded") . '
' . $langs->trans("FeatureNotYetAvailable") . '
' . dol_print_date(dol_mktime(0, 0, 0, $m, 1, $y), "%b %Y") . '
'.$langs->trans("ResourceType").''; - $ret = $formresource->select_types_resource($object->fk_code_type_resource, 'fk_code_type_resource', '', 2); + $formresource->select_types_resource($object->fk_code_type_resource, 'fk_code_type_resource', '', 2); print '
'.$langs->trans("ResourceType").''; - $ret = $formresource->select_types_resource($object->fk_code_type_resource, 'fk_code_type_resource', '', 2); + $formresource->select_types_resource($object->fk_code_type_resource, 'fk_code_type_resource', '', 2); print '
'; print ''; print ''; -print ''; -print ''."\n"; +print ''."\n"; print ''; -$form = new Form($db); - // Mail required for members print ''; print ''; -print ''; - -print ''; diff --git a/htdocs/core/lib/ecm.lib.php b/htdocs/core/lib/ecm.lib.php index e7840505e8f..2a9b9a766a3 100644 --- a/htdocs/core/lib/ecm.lib.php +++ b/htdocs/core/lib/ecm.lib.php @@ -54,7 +54,7 @@ function ecm_prepare_dasboard_head($object) $head[$h][2] = 'index'; $h++; - if (!empty($conf->global->ECM_AUTO_TREE_ENABLED)) { + if (empty($conf->global->ECM_AUTO_TREE_HIDEN)) { $head[$h][0] = DOL_URL_ROOT.'/ecm/index_auto.php'; $head[$h][1] = $langs->trans("ECMSectionsAuto").$form->textwithpicto('', $helptext, 1, 'info', '', 0, 3); $head[$h][2] = 'index_auto'; diff --git a/htdocs/core/modules/modECM.class.php b/htdocs/core/modules/modECM.class.php index 1ea7530be53..09556b43cd8 100644 --- a/htdocs/core/modules/modECM.class.php +++ b/htdocs/core/modules/modECM.class.php @@ -74,12 +74,6 @@ class modECM extends DolibarrModules $this->const = array(); // List of parameters $r = 0; - $this->const[$r][0] = "ECM_AUTO_TREE_ENABLED"; - $this->const[$r][1] = "chaine"; - $this->const[$r][2] = "1"; - $this->const[$r][3] = 'Auto tree is enabled by default'; - $this->const[$r][4] = 0; - // Boxes $this->boxes = array(); // List of boxes $r = 0; @@ -182,7 +176,7 @@ class modECM extends DolibarrModules 'langs'=>'ecm', 'position'=>103, 'perms'=>'$user->rights->ecm->read || $user->rights->ecm->upload', - 'enabled'=>'($user->rights->ecm->read || $user->rights->ecm->upload) && getDolGlobalInt("ECM_AUTO_TREE_ENABLED")', + 'enabled'=>'($user->rights->ecm->read || $user->rights->ecm->upload) && !getDolGlobalInt("ECM_AUTO_TREE_HIDEN")', 'target'=>'', 'user'=>2, // 0=Menu for internal users, 1=external users, 2=both ); diff --git a/htdocs/ecm/index_auto.php b/htdocs/ecm/index_auto.php index 342d7d74129..9d9d30e8188 100644 --- a/htdocs/ecm/index_auto.php +++ b/htdocs/ecm/index_auto.php @@ -309,7 +309,7 @@ llxHeader($moreheadcss.$moreheadjs, $langs->trans("ECMArea"), '', '', '', '', $m // Add sections to manage $rowspan = 0; $sectionauto = array(); -if (!empty($conf->global->ECM_AUTO_TREE_ENABLED)) { +if (empty($conf->global->ECM_AUTO_TREE_HIDEN)) { if (isModEnabled("product") || isModEnabled("service")) { $langs->load("products"); $rowspan++; $sectionauto[] = array('position'=>10, 'level'=>1, 'module'=>'product', 'test'=>(isModEnabled("product") || isModEnabled("service")), 'label'=>$langs->trans("ProductsAndServices"), 'desc'=>$langs->trans("ECMDocsByProducts")); diff --git a/htdocs/install/upgrade2.php b/htdocs/install/upgrade2.php index 51334eaae21..89e190f92c1 100644 --- a/htdocs/install/upgrade2.php +++ b/htdocs/install/upgrade2.php @@ -490,6 +490,13 @@ if (!GETPOST('action', 'aZ09') || preg_match('/upgrade/i', GETPOST('action', 'aZ if (versioncompare($versiontoarray, $afterversionarray) >= 0 && versioncompare($versiontoarray, $beforeversionarray) <= 0) { migrate_contractdet_rank(); } + + // Scripts for 18.0 + $afterversionarray = explode('.', '170.9'); + $beforeversionarray = explode('.', '18.0.9'); + if (versioncompare($versiontoarray, $afterversionarray) >= 0 && versioncompare($versiontoarray, $beforeversionarray) <= 0) { + migrate_contractdet_rank(); + } } From 5148e6a1a2601e298188a87312ce22853fa74a9e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 2 Jan 2023 03:08:57 +0100 Subject: [PATCH 0504/1128] Enhance doxygen conf --- .github/workflows/doxygen-action.yml.disabled | 17 +++++++ build/doxygen/dolibarr-doxygen.doxyfile | 50 ++++++++++++------- 2 files changed, 50 insertions(+), 17 deletions(-) create mode 100644 .github/workflows/doxygen-action.yml.disabled diff --git a/.github/workflows/doxygen-action.yml.disabled b/.github/workflows/doxygen-action.yml.disabled new file mode 100644 index 00000000000..bd923e6394f --- /dev/null +++ b/.github/workflows/doxygen-action.yml.disabled @@ -0,0 +1,17 @@ +# See syntax file on https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions +name: Doxygen +on: + schedule: + - cron: "0 15 * * *" + workflow_dispatch: + branches: + - develop + +jobs: + doxygen: + runs-on: ubuntu-latest + steps: + - name: 'Doxygen' + uses: mattnotmitt/doxygen-action@1.9.5 + with: + doxyfile-path: build/doxygen diff --git a/build/doxygen/dolibarr-doxygen.doxyfile b/build/doxygen/dolibarr-doxygen.doxyfile index 31400661ecc..b7ca04898e5 100644 --- a/build/doxygen/dolibarr-doxygen.doxyfile +++ b/build/doxygen/dolibarr-doxygen.doxyfile @@ -1,14 +1,17 @@ -# Doxyfile 1.7.3 +# Doxyfile 1.8.16 # This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project +# doxygen (www.doxygen.org) for a project. # -# All text after a hash (#) is considered a comment and will be ignored +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. # The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). #--------------------------------------------------------------------------- # Project related configuration options @@ -448,7 +451,7 @@ GENERATE_TODOLIST = NO # disable (NO) the test list. This list is created by putting \test # commands in the documentation. -GENERATE_TESTLIST = YES +GENERATE_TESTLIST = NO # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug @@ -625,7 +628,7 @@ EXCLUDE_SYMLINKS = YES # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* -EXCLUDE_PATTERNS = */CVS/* *google* *pibarcode* +EXCLUDE_PATTERNS = */CVS/* # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the @@ -775,14 +778,16 @@ IGNORE_PREFIX = # configuration options related to the HTML output #--------------------------------------------------------------------------- -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. GENERATE_HTML = YES -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_OUTPUT = html @@ -852,13 +857,24 @@ HTML_TIMESTAMP = YES HTML_ALIGN_MEMBERS = YES +# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML +# documentation will contain a main index with vertical navigation menus that +# are dynamically created via Javascript. If disabled, the navigation index will +# consists of multiple levels of tabs that are statically embedded in every HTML +# page. Disable this option to support browsers that do not have Javascript, +# like the Qt help browser. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_MENUS = NO + # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). -HTML_DYNAMIC_SECTIONS = YES +HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 @@ -1003,7 +1019,7 @@ QHG_LOCATION = # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before # the help appears. -GENERATE_ECLIPSEHELP = YES +GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have @@ -1072,7 +1088,7 @@ FORMULA_TRANSPARENT = YES # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. -SEARCHENGINE = NO +SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a PHP enabled web server instead of at the web client From f8f2e8ea9ea988c075153037feb58853506704d7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 2 Jan 2023 03:52:29 +0100 Subject: [PATCH 0505/1128] Enhancement with doxygen --- .github/workflows/doxygen-action.yml.disabled | 17 --------- .github/workflows/doxygen-gh-pages.yml | 38 +++++++++++++++++++ build/doxygen/dolibarr-doxygen-build.pl | 10 ++--- build/doxygen/dolibarr-doxygen.doxyfile | 38 +++++++++---------- 4 files changed, 62 insertions(+), 41 deletions(-) delete mode 100644 .github/workflows/doxygen-action.yml.disabled create mode 100644 .github/workflows/doxygen-gh-pages.yml diff --git a/.github/workflows/doxygen-action.yml.disabled b/.github/workflows/doxygen-action.yml.disabled deleted file mode 100644 index bd923e6394f..00000000000 --- a/.github/workflows/doxygen-action.yml.disabled +++ /dev/null @@ -1,17 +0,0 @@ -# See syntax file on https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions -name: Doxygen -on: - schedule: - - cron: "0 15 * * *" - workflow_dispatch: - branches: - - develop - -jobs: - doxygen: - runs-on: ubuntu-latest - steps: - - name: 'Doxygen' - uses: mattnotmitt/doxygen-action@1.9.5 - with: - doxyfile-path: build/doxygen diff --git a/.github/workflows/doxygen-gh-pages.yml b/.github/workflows/doxygen-gh-pages.yml new file mode 100644 index 00000000000..066ede4dea3 --- /dev/null +++ b/.github/workflows/doxygen-gh-pages.yml @@ -0,0 +1,38 @@ +# See syntax file on https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions +name: Doxygen +on: + schedule: + - cron: "0 15 * * *" + workflow_dispatch: + branches: + - develop +permissions: + contents: write + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Build + uses: DenverCoder1/doxygen-github-pages-action@v1.2.0 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + branch: gh-pages + folder: docs/html + config_file: build/doxygen/dolibarr-doxygen.doxyfile + + - name: Deploy + uses: JamesIves/github-pages-deploy-action@v4 + with: + branch: gh-pages + folder: docs/html # The folder the action should deploy. + target-folder: docs/html2 + +#jobs: +# doxygen: +# runs-on: ubuntu-latest +# steps: +# - name: 'Doxygen' +# uses: mattnotmitt/doxygen-action@1.9.5 +# with: +# doxyfile-path: build/doxygen diff --git a/build/doxygen/dolibarr-doxygen-build.pl b/build/doxygen/dolibarr-doxygen-build.pl index 75a5cceddbe..5a4849a3a5b 100755 --- a/build/doxygen/dolibarr-doxygen-build.pl +++ b/build/doxygen/dolibarr-doxygen-build.pl @@ -17,9 +17,9 @@ use Cwd; my $dir = getcwd; print "Current dir is: $dir\n"; -print "Running dir for doxygen must be: $DIR\n"; +#print "Running dir for doxygen must be: $DIR\n"; -if (! -s $CONFFILE) +if (! -s "build/doxygen/$CONFFILE") { print "Error: current directory for building Dolibarr doxygen documentation is not correct.\n"; print "\n"; @@ -30,7 +30,7 @@ if (! -s $CONFFILE) exit 1; } -$SOURCE="../.."; +$SOURCE="."; # Get version $MAJOR, $MINOR and $BUILD $result = open( IN, "< " . $SOURCE . "/htdocs/filefunc.inc.php" ); @@ -47,8 +47,8 @@ $version=$MAJOR.".".$MINOR.".".$BUILD; print "Running doxygen for version ".$version.", please wait...\n"; -print "cat $CONFFILE | sed -e 's/x\.y\.z/".$version."/' | doxygen $OPTIONS - 2>&1\n"; -$result=`cat $CONFFILE | sed -e 's/x\.y\.z/$version/' | doxygen $OPTIONS - 2>&1`; +print "cat build/doxygen/$CONFFILE | sed -e 's/x\.y\.z/".$version."/' | doxygen $OPTIONS - 2>&1\n"; +$result=`cat build/doxygen/$CONFFILE | sed -e 's/x\.y\.z/$version/' | doxygen $OPTIONS - 2>&1`; print $result; diff --git a/build/doxygen/dolibarr-doxygen.doxyfile b/build/doxygen/dolibarr-doxygen.doxyfile index b7ca04898e5..216ba517dc5 100644 --- a/build/doxygen/dolibarr-doxygen.doxyfile +++ b/build/doxygen/dolibarr-doxygen.doxyfile @@ -41,7 +41,7 @@ PROJECT_NUMBER = x.y.z # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. -OUTPUT_DIRECTORY = ../../build +OUTPUT_DIRECTORY = build # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output @@ -117,7 +117,7 @@ FULL_PATH_NAMES = YES # If left blank the directory from which doxygen is run is used as the # path to strip. -STRIP_FROM_PATH = "../.." +STRIP_FROM_PATH = "" # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells @@ -290,7 +290,7 @@ TYPEDEF_HIDES_STRUCT = NO # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols -SYMBOL_CACHE_SIZE = 0 +#SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options @@ -490,7 +490,7 @@ SHOW_USED_FILES = YES # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. -SHOW_DIRECTORIES = YES +#SHOW_DIRECTORIES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the @@ -574,7 +574,7 @@ WARN_FORMAT = "$file:$line: $text" # and error messages should be written. If left blank the output is written # to stderr. -WARN_LOGFILE = doxygen_warnings.log +WARN_LOGFILE = build/html/doxygen_warnings.log #--------------------------------------------------------------------------- # configuration options related to the input files @@ -585,7 +585,7 @@ WARN_LOGFILE = doxygen_warnings.log # directories like "/usr/src/myproject". Separate the files or directories # with spaces. -INPUT = ../../htdocs ../../scripts +INPUT = htdocs scripts # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is @@ -614,7 +614,7 @@ RECURSIVE = YES # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. -EXCLUDE = ../../build ../../dev ../../doc ../../document ../../documents ../../htdocs/conf/conf.php ../../htdocs/custom ../../htdocs/document ../../htdocs/documents ../../htdocs/includes +EXCLUDE = build dev doc document documents htdocs/conf/conf.php htdocs/custom htdocs/document htdocs/documents htdocs/includes # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded @@ -642,7 +642,7 @@ EXCLUDE_SYMBOLS = # directories that contain example code fragments that are included (see # the \include command). -EXAMPLE_PATH = ../../htdocs/modulebuilder/template +EXAMPLE_PATH = htdocs/modulebuilder/template # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp @@ -662,7 +662,7 @@ EXAMPLE_RECURSIVE = NO # directories that contain image that are included in the documentation (see # the \image command). -IMAGE_PATH = ../../doc/images +IMAGE_PATH = doc/images # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program @@ -765,7 +765,7 @@ ALPHABETICAL_INDEX = YES # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) -COLS_IN_ALPHA_INDEX = 5 +#COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. @@ -802,14 +802,14 @@ HTML_FILE_EXTENSION = .html # standard header. # Does not work with 1.7.3 -#HTML_HEADER = doxygen_header.html +#HTML_HEADER = build/doxygen/doxygen_header.html # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. # Does not work with 1.7.3 -HTML_FOOTER = doxygen_footer.html +HTML_FOOTER = build/doxygen/doxygen_footer.html # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to @@ -855,7 +855,7 @@ HTML_TIMESTAMP = YES # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. -HTML_ALIGN_MEMBERS = YES +#HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML # documentation will contain a main index with vertical navigation menus that @@ -1051,7 +1051,7 @@ GENERATE_TREEVIEW = NO # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. -USE_INLINE_TREES = NO +#USE_INLINE_TREES = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree @@ -1098,7 +1098,7 @@ SEARCHENGINE = YES # full text search. The disadvances is that it is more difficult to setup # and does not have live searching capabilities. -SERVER_BASED_SEARCH = NO +SERVER_BASED_SEARCH = YES #--------------------------------------------------------------------------- # configuration options related to the LaTeX output @@ -1276,13 +1276,13 @@ XML_OUTPUT = xml # which can be used by a validating XML parser to check the # syntax of the XML files. -XML_SCHEMA = +#XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. -XML_DTD = +#XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting @@ -1447,7 +1447,7 @@ EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). -PERL_PATH = /usr/bin/perl +#PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool @@ -1469,7 +1469,7 @@ CLASS_DIAGRAMS = NO # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. -MSCGEN_PATH = +#MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented From 466239c256e1cf6371a29a4644cb600c45eb5db4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 2 Jan 2023 04:08:09 +0100 Subject: [PATCH 0506/1128] Fix font --- build/doxygen/dolibarr-doxygen.doxyfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/doxygen/dolibarr-doxygen.doxyfile b/build/doxygen/dolibarr-doxygen.doxyfile index 216ba517dc5..b1302c7853d 100644 --- a/build/doxygen/dolibarr-doxygen.doxyfile +++ b/build/doxygen/dolibarr-doxygen.doxyfile @@ -1501,7 +1501,7 @@ DOT_NUM_THREADS = 0 # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. -DOT_FONTNAME = FreeSans.ttf +#DOT_FONTNAME = FreeSans.ttf # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. From 7dd39092279fe9bfe35623e4414a81e8b4991331 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 2 Jan 2023 04:16:06 +0100 Subject: [PATCH 0507/1128] Fix doxygen --- .github/workflows/doxygen-gh-pages.yml | 4 ++-- build/doxygen/dolibarr-doxygen.doxyfile | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/doxygen-gh-pages.yml b/.github/workflows/doxygen-gh-pages.yml index 066ede4dea3..dbeebfeb8d9 100644 --- a/.github/workflows/doxygen-gh-pages.yml +++ b/.github/workflows/doxygen-gh-pages.yml @@ -18,14 +18,14 @@ jobs: with: github_token: ${{ secrets.GITHUB_TOKEN }} branch: gh-pages - folder: docs/html + folder: build/html config_file: build/doxygen/dolibarr-doxygen.doxyfile - name: Deploy uses: JamesIves/github-pages-deploy-action@v4 with: branch: gh-pages - folder: docs/html # The folder the action should deploy. + folder: build/html # The folder the action should deploy. target-folder: docs/html2 #jobs: diff --git a/build/doxygen/dolibarr-doxygen.doxyfile b/build/doxygen/dolibarr-doxygen.doxyfile index b1302c7853d..2ba292f21ad 100644 --- a/build/doxygen/dolibarr-doxygen.doxyfile +++ b/build/doxygen/dolibarr-doxygen.doxyfile @@ -614,7 +614,7 @@ RECURSIVE = YES # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. -EXCLUDE = build dev doc document documents htdocs/conf/conf.php htdocs/custom htdocs/document htdocs/documents htdocs/includes +EXCLUDE = build dev doc document documents htdocs/conf/conf.php htdocs/custom htdocs/document htdocs/documents htdocs/includes htdocs/install/doctemplates # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded From 47d26974e6a4d2ece4a59b0c14c106c251b6dbdd Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 2 Jan 2023 04:31:27 +0100 Subject: [PATCH 0508/1128] Fix doxygen --- build/doxygen/dolibarr-doxygen.doxyfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build/doxygen/dolibarr-doxygen.doxyfile b/build/doxygen/dolibarr-doxygen.doxyfile index 2ba292f21ad..51f697e1945 100644 --- a/build/doxygen/dolibarr-doxygen.doxyfile +++ b/build/doxygen/dolibarr-doxygen.doxyfile @@ -642,21 +642,21 @@ EXCLUDE_SYMBOLS = # directories that contain example code fragments that are included (see # the \include command). -EXAMPLE_PATH = htdocs/modulebuilder/template +#EXAMPLE_PATH = htdocs/modulebuilder/template # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. -EXAMPLE_PATTERNS = *.php +#EXAMPLE_PATTERNS = *.php # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. -EXAMPLE_RECURSIVE = NO +#EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see From c973b7d59c0b20c3b4625b63eccead5bd2d743cb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 2 Jan 2023 04:33:42 +0100 Subject: [PATCH 0509/1128] Try removing the copy --- .github/workflows/doxygen-gh-pages.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/doxygen-gh-pages.yml b/.github/workflows/doxygen-gh-pages.yml index dbeebfeb8d9..33dd47aa6e6 100644 --- a/.github/workflows/doxygen-gh-pages.yml +++ b/.github/workflows/doxygen-gh-pages.yml @@ -21,12 +21,12 @@ jobs: folder: build/html config_file: build/doxygen/dolibarr-doxygen.doxyfile - - name: Deploy - uses: JamesIves/github-pages-deploy-action@v4 - with: - branch: gh-pages - folder: build/html # The folder the action should deploy. - target-folder: docs/html2 +# - name: Deploy +# uses: JamesIves/github-pages-deploy-action@v4 +# with: +# branch: gh-pages +# folder: build/html # The folder the action should deploy. +# target-folder: docs/html2 #jobs: # doxygen: From 6dbffb53989f8f75f7d5b1d863c7c72328f1a3b6 Mon Sep 17 00:00:00 2001 From: atm-lena Date: Mon, 2 Jan 2023 09:48:34 +0100 Subject: [PATCH 0510/1128] Add price() to pricetonum() on bomline view --- htdocs/bom/tpl/objectline_view.tpl.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/bom/tpl/objectline_view.tpl.php b/htdocs/bom/tpl/objectline_view.tpl.php index 85bd4d6b02a..fc6b7709d14 100644 --- a/htdocs/bom/tpl/objectline_view.tpl.php +++ b/htdocs/bom/tpl/objectline_view.tpl.php @@ -247,13 +247,13 @@ if ($resql) { // Cost if (!empty($sub_bom->id)) { $sub_bom->calculateCosts(); - print ''; + print ''; $total_cost+= $sub_bom->total_cost * $sub_bom_line->qty * $line->qty; } elseif ($sub_bom_product->cost_price > 0) { - print ''; + print ''; $total_cost+= $sub_bom_product->cost_price * $sub_bom_line->qty * $line->qty; } elseif ($sub_bom_product->pmp > 0) { // PMP if cost price isn't defined - print ''; + print ''; $total_cost.= $sub_bom_product->pmp * $sub_bom_line->qty * $line->qty; } else { // Minimum purchase price if cost price and PMP aren't defined $sql_supplier_price = 'SELECT MIN(price) AS min_price, quantity AS qty FROM '.MAIN_DB_PREFIX.'product_fournisseur_price'; From 70e1e8cbb9d52c814c54cc3943853e89fa62c0cf Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 2 Jan 2023 12:48:17 +0100 Subject: [PATCH 0511/1128] Clean code for doxygen --- build/doxygen/dolibarr-doxygen.doxyfile | 6 +- build/doxygen/doxygen-awesome.css | 2413 +++++++++++++++++ .../stock/class/api_stockmovements.class.php | 4 +- 3 files changed, 2420 insertions(+), 3 deletions(-) create mode 100644 build/doxygen/doxygen-awesome.css diff --git a/build/doxygen/dolibarr-doxygen.doxyfile b/build/doxygen/dolibarr-doxygen.doxyfile index 51f697e1945..20ff102f0a2 100644 --- a/build/doxygen/dolibarr-doxygen.doxyfile +++ b/build/doxygen/dolibarr-doxygen.doxyfile @@ -1098,7 +1098,7 @@ SEARCHENGINE = YES # full text search. The disadvances is that it is more difficult to setup # and does not have live searching capabilities. -SERVER_BASED_SEARCH = YES +SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output @@ -1650,3 +1650,7 @@ GENERATE_LEGEND = YES # the various graphs. DOT_CLEANUP = YES + + +FULL_SIDEBAR = NO +HTML_EXTRA_STYLESHEET = build/doxygen/doxygen-awesome.css diff --git a/build/doxygen/doxygen-awesome.css b/build/doxygen/doxygen-awesome.css new file mode 100644 index 00000000000..0b1c8c20892 --- /dev/null +++ b/build/doxygen/doxygen-awesome.css @@ -0,0 +1,2413 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2022 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +html { + /* primary theme color. This will affect the entire websites color scheme: links, arrows, labels, ... */ + --primary-color: #1779c4; + --primary-dark-color: #335c80; + --primary-light-color: #70b1e9; + + /* page base colors */ + --page-background-color: #ffffff; + --page-foreground-color: #2f4153; + --page-secondary-foreground-color: #6f7e8e; + + /* color for all separators on the website: hr, borders, ... */ + --separator-color: #dedede; + + /* border radius for all rounded components. Will affect many components, like dropdowns, memitems, codeblocks, ... */ + --border-radius-large: 8px; + --border-radius-small: 4px; + --border-radius-medium: 6px; + + /* default spacings. Most components reference these values for spacing, to provide uniform spacing on the page. */ + --spacing-small: 5px; + --spacing-medium: 10px; + --spacing-large: 16px; + + /* default box shadow used for raising an element above the normal content. Used in dropdowns, search result, ... */ + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); + + --odd-color: rgba(0,0,0,.028); + + /* font-families. will affect all text on the website + * font-family: the normal font for text, headlines, menus + * font-family-monospace: used for preformatted text in memtitle, code, fragments + */ + --font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif; + --font-family-monospace: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace; + + /* font sizes */ + --page-font-size: 15.6px; + --navigation-font-size: 14.4px; + --toc-font-size: 13.4px; + --code-font-size: 14px; /* affects code, fragment */ + --title-font-size: 22px; + + /* content text properties. These only affect the page content, not the navigation or any other ui elements */ + --content-line-height: 27px; + /* The content is centered and constraint in it's width. To make the content fill the whole page, set the variable to auto.*/ + --content-maxwidth: 1050px; + --table-line-height: 24px; + --toc-sticky-top: var(--spacing-medium); + --toc-width: 200px; + --toc-max-height: calc(100vh - 2 * var(--spacing-medium) - 85px); + + /* colors for various content boxes: @warning, @note, @deprecated @bug */ + --warning-color: #f8d1cc; + --warning-color-dark: #b61825; + --warning-color-darker: #75070f; + --note-color: #faf3d8; + --note-color-dark: #f3a600; + --note-color-darker: #5f4204; + --todo-color: #e4f3ff; + --todo-color-dark: #1879C4; + --todo-color-darker: #274a5c; + --deprecated-color: #ecf0f3; + --deprecated-color-dark: #5b6269; + --deprecated-color-darker: #43454a; + --bug-color: #e4dafd; + --bug-color-dark: #5b2bdd; + --bug-color-darker: #2a0d72; + --invariant-color: #d8f1e3; + --invariant-color-dark: #44b86f; + --invariant-color-darker: #265532; + + /* blockquote colors */ + --blockquote-background: #f8f9fa; + --blockquote-foreground: #636568; + + /* table colors */ + --tablehead-background: #f1f1f1; + --tablehead-foreground: var(--page-foreground-color); + + /* menu-display: block | none + * Visibility of the top navigation on screens >= 768px. On smaller screen the menu is always visible. + * `GENERATE_TREEVIEW` MUST be enabled! + */ + --menu-display: block; + + --menu-focus-foreground: var(--page-background-color); + --menu-focus-background: var(--primary-color); + --menu-selected-background: rgba(0,0,0,.05); + + + --header-background: var(--page-background-color); + --header-foreground: var(--page-foreground-color); + + /* searchbar colors */ + --searchbar-background: var(--side-nav-background); + --searchbar-foreground: var(--page-foreground-color); + + /* searchbar size + * (`searchbar-width` is only applied on screens >= 768px. + * on smaller screens the searchbar will always fill the entire screen width) */ + --searchbar-height: 33px; + --searchbar-width: 210px; + --searchbar-border-radius: var(--searchbar-height); + + /* code block colors */ + --code-background: #f5f5f5; + --code-foreground: var(--page-foreground-color); + + /* fragment colors */ + --fragment-background: #F8F9FA; + --fragment-foreground: #37474F; + --fragment-keyword: #bb6bb2; + --fragment-keywordtype: #8258b3; + --fragment-keywordflow: #d67c3b; + --fragment-token: #438a59; + --fragment-comment: #969696; + --fragment-link: #5383d6; + --fragment-preprocessor: #46aaa5; + --fragment-linenumber-color: #797979; + --fragment-linenumber-background: #f4f4f5; + --fragment-linenumber-border: #e3e5e7; + --fragment-lineheight: 20px; + + /* sidebar navigation (treeview) colors */ + --side-nav-background: #fbfbfb; + --side-nav-foreground: var(--page-foreground-color); + --side-nav-arrow-opacity: 0; + --side-nav-arrow-hover-opacity: 0.9; + + --toc-background: var(--side-nav-background); + --toc-foreground: var(--side-nav-foreground); + + /* height of an item in any tree / collapsable table */ + --tree-item-height: 30px; + + --memname-font-size: var(--code-font-size); + --memtitle-font-size: 18px; + + --webkit-scrollbar-size: 7px; + --webkit-scrollbar-padding: 4px; + --webkit-scrollbar-color: var(--separator-color); +} + +@media screen and (max-width: 767px) { + html { + --page-font-size: 16px; + --navigation-font-size: 16px; + --toc-font-size: 15px; + --code-font-size: 15px; /* affects code, fragment */ + --title-font-size: 22px; + } +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) { + color-scheme: dark; + + --primary-color: #1982d2; + --primary-dark-color: #86a9c4; + --primary-light-color: #4779ac; + + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.35); + + --odd-color: rgba(100,100,100,.06); + + --menu-selected-background: rgba(0,0,0,.4); + + --page-background-color: #1C1D1F; + --page-foreground-color: #d2dbde; + --page-secondary-foreground-color: #859399; + --separator-color: #38393b; + --side-nav-background: #252628; + + --code-background: #2a2c2f; + + --tablehead-background: #2a2c2f; + + --blockquote-background: #222325; + --blockquote-foreground: #7e8c92; + + --warning-color: #2e1917; + --warning-color-dark: #ad2617; + --warning-color-darker: #f5b1aa; + --note-color: #3b2e04; + --note-color-dark: #f1b602; + --note-color-darker: #ceb670; + --todo-color: #163750; + --todo-color-dark: #1982D2; + --todo-color-darker: #dcf0fa; + --deprecated-color: #2e323b; + --deprecated-color-dark: #738396; + --deprecated-color-darker: #abb0bd; + --bug-color: #2a2536; + --bug-color-dark: #7661b3; + --bug-color-darker: #ae9ed6; + --invariant-color: #303a35; + --invariant-color-dark: #76ce96; + --invariant-color-darker: #cceed5; + + --fragment-background: #282c34; + --fragment-foreground: #dbe4eb; + --fragment-keyword: #cc99cd; + --fragment-keywordtype: #ab99cd; + --fragment-keywordflow: #e08000; + --fragment-token: #7ec699; + --fragment-comment: #999999; + --fragment-link: #98c0e3; + --fragment-preprocessor: #65cabe; + --fragment-linenumber-color: #cccccc; + --fragment-linenumber-background: #35393c; + --fragment-linenumber-border: #1f1f1f; + } +} + +/* dark mode variables are defined twice, to support both the dark-mode without and with doxygen-awesome-darkmode-toggle.js */ +html.dark-mode { + color-scheme: dark; + + --primary-color: #1982d2; + --primary-dark-color: #86a9c4; + --primary-light-color: #4779ac; + + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.30); + + --odd-color: rgba(100,100,100,.06); + + --menu-selected-background: rgba(0,0,0,.4); + + --page-background-color: #1C1D1F; + --page-foreground-color: #d2dbde; + --page-secondary-foreground-color: #859399; + --separator-color: #38393b; + --side-nav-background: #252628; + + --code-background: #2a2c2f; + + --tablehead-background: #2a2c2f; + + --blockquote-background: #222325; + --blockquote-foreground: #7e8c92; + + --warning-color: #2e1917; + --warning-color-dark: #ad2617; + --warning-color-darker: #f5b1aa; + --note-color: #3b2e04; + --note-color-dark: #f1b602; + --note-color-darker: #ceb670; + --todo-color: #163750; + --todo-color-dark: #1982D2; + --todo-color-darker: #dcf0fa; + --deprecated-color: #2e323b; + --deprecated-color-dark: #738396; + --deprecated-color-darker: #abb0bd; + --bug-color: #2a2536; + --bug-color-dark: #7661b3; + --bug-color-darker: #ae9ed6; + --invariant-color: #303a35; + --invariant-color-dark: #76ce96; + --invariant-color-darker: #cceed5; + + --fragment-background: #282c34; + --fragment-foreground: #dbe4eb; + --fragment-keyword: #cc99cd; + --fragment-keywordtype: #ab99cd; + --fragment-keywordflow: #e08000; + --fragment-token: #7ec699; + --fragment-comment: #999999; + --fragment-link: #98c0e3; + --fragment-preprocessor: #65cabe; + --fragment-linenumber-color: #cccccc; + --fragment-linenumber-background: #35393c; + --fragment-linenumber-border: #1f1f1f; +} + +body { + color: var(--page-foreground-color); + background-color: var(--page-background-color); + font-size: var(--page-font-size); +} + +body, table, div, p, dl, #nav-tree .label, .title, +.sm-dox a, .sm-dox a:hover, .sm-dox a:focus, #projectname, +.SelectItem, #MSearchField, .navpath li.navelem a, +.navpath li.navelem a:hover, p.reference, p.definition { + font-family: var(--font-family); +} + +h1, h2, h3, h4, h5 { + margin-top: .9em; + font-weight: 600; + line-height: initial; +} + +p, div, table, dl, p.reference, p.definition { + font-size: var(--page-font-size); +} + +p.reference, p.definition { + color: var(--page-secondary-foreground-color); +} + +a:link, a:visited, a:hover, a:focus, a:active { + color: var(--primary-color) !important; + font-weight: 500; +} + +a.anchor { + scroll-margin-top: var(--spacing-large); + display: block; +} + +/* + Title and top navigation + */ + +#top { + background: var(--header-background); + border-bottom: 1px solid var(--separator-color); +} + +@media screen and (min-width: 768px) { + #top { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + } +} + +#main-nav { + flex-grow: 5; + padding: var(--spacing-small) var(--spacing-medium); +} + +#titlearea { + width: auto; + padding: var(--spacing-medium) var(--spacing-large); + background: none; + color: var(--header-foreground); + border-bottom: none; +} + +@media screen and (max-width: 767px) { + #titlearea { + padding-bottom: var(--spacing-small); + } +} + +#titlearea table tbody tr { + height: auto !important; +} + +#projectname { + font-size: var(--title-font-size); + font-weight: 600; +} + +#projectnumber { + font-family: inherit; + font-size: 60%; +} + +#projectbrief { + font-family: inherit; + font-size: 80%; +} + +#projectlogo { + vertical-align: middle; +} + +#projectlogo img { + max-height: calc(var(--title-font-size) * 2); + margin-right: var(--spacing-small); +} + +.sm-dox, .tabs, .tabs2, .tabs3 { + background: none; + padding: 0; +} + +.tabs, .tabs2, .tabs3 { + border-bottom: 1px solid var(--separator-color); + margin-bottom: -1px; +} + +.main-menu-btn-icon, .main-menu-btn-icon:before, .main-menu-btn-icon:after { + background: var(--page-secondary-foreground-color); +} + +@media screen and (max-width: 767px) { + .sm-dox a span.sub-arrow { + background: var(--code-background); + } + + #main-menu a.has-submenu span.sub-arrow { + color: var(--page-secondary-foreground-color); + border-radius: var(--border-radius-medium); + } + + #main-menu a.has-submenu:hover span.sub-arrow { + color: var(--page-foreground-color); + } +} + +@media screen and (min-width: 768px) { + .sm-dox li, .tablist li { + display: var(--menu-display); + } + + .sm-dox a span.sub-arrow { + border-color: var(--header-foreground) transparent transparent transparent; + } + + .sm-dox a:hover span.sub-arrow { + border-color: var(--menu-focus-foreground) transparent transparent transparent; + } + + .sm-dox ul a span.sub-arrow { + border-color: transparent transparent transparent var(--page-foreground-color); + } + + .sm-dox ul a:hover span.sub-arrow { + border-color: transparent transparent transparent var(--menu-focus-foreground); + } +} + +.sm-dox ul { + background: var(--page-background-color); + box-shadow: var(--box-shadow); + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium) !important; + padding: var(--spacing-small); + animation: ease-out 150ms slideInMenu; +} + +@keyframes slideInMenu { + from { + opacity: 0; + transform: translate(0px, -2px); + } + + to { + opacity: 1; + transform: translate(0px, 0px); + } +} + +.sm-dox ul a { + color: var(--page-foreground-color) !important; + background: var(--page-background-color); + font-size: var(--navigation-font-size); +} + +.sm-dox>li>ul:after { + border-bottom-color: var(--page-background-color) !important; +} + +.sm-dox>li>ul:before { + border-bottom-color: var(--separator-color) !important; +} + +.sm-dox ul a:hover, .sm-dox ul a:active, .sm-dox ul a:focus { + font-size: var(--navigation-font-size) !important; + color: var(--menu-focus-foreground) !important; + text-shadow: none; + background-color: var(--menu-focus-background); + border-radius: var(--border-radius-small) !important; +} + +.sm-dox a, .sm-dox a:focus, .tablist li, .tablist li a, .tablist li.current a { + text-shadow: none; + background: transparent; + background-image: none !important; + color: var(--header-foreground) !important; + font-weight: normal; + font-size: var(--navigation-font-size); + border-radius: var(--border-radius-small) !important; +} + +.sm-dox a:focus { + outline: auto; +} + +.sm-dox a:hover, .sm-dox a:active, .tablist li a:hover { + text-shadow: none; + font-weight: normal; + background: var(--menu-focus-background); + color: var(--menu-focus-foreground) !important; + border-radius: var(--border-radius-small) !important; + font-size: var(--navigation-font-size); +} + +.tablist li.current { + border-radius: var(--border-radius-small); + background: var(--menu-selected-background); +} + +.tablist li { + margin: var(--spacing-small) 0 var(--spacing-small) var(--spacing-small); +} + +.tablist a { + padding: 0 var(--spacing-large); +} + + +/* + Search box + */ + +#MSearchBox { + height: var(--searchbar-height); + background: var(--searchbar-background); + border-radius: var(--searchbar-border-radius); + border: 1px solid var(--separator-color); + overflow: hidden; + width: var(--searchbar-width); + position: relative; + box-shadow: none; + display: block; + margin-top: 0; +} + +/* until Doxygen 1.9.4 */ +.left img#MSearchSelect { + left: 0; + user-select: none; + padding-left: 8px; +} + +/* Doxygen 1.9.5 */ +.left span#MSearchSelect { + left: 0; + user-select: none; + margin-left: 8px; + padding: 0; +} + +.left #MSearchSelect[src$=".png"] { + padding-left: 0 +} + +.SelectionMark { + user-select: none; +} + +.tabs .left #MSearchSelect { + padding-left: 0; +} + +.tabs #MSearchBox { + position: absolute; + right: var(--spacing-medium); +} + +@media screen and (max-width: 767px) { + .tabs #MSearchBox { + position: relative; + right: 0; + margin-left: var(--spacing-medium); + margin-top: 0; + } +} + +#MSearchSelectWindow, #MSearchResultsWindow { + z-index: 9999; +} + +#MSearchBox.MSearchBoxActive { + border-color: var(--primary-color); + box-shadow: inset 0 0 0 1px var(--primary-color); +} + +#main-menu > li:last-child { + margin-right: 0; +} + +@media screen and (max-width: 767px) { + #main-menu > li:last-child { + height: 50px; + } +} + +#MSearchField { + font-size: var(--navigation-font-size); + height: calc(var(--searchbar-height) - 2px); + background: transparent; + width: calc(var(--searchbar-width) - 64px); +} + +.MSearchBoxActive #MSearchField { + color: var(--searchbar-foreground); +} + +#MSearchSelect { + top: calc(calc(var(--searchbar-height) / 2) - 11px); +} + +#MSearchBox span.left, #MSearchBox span.right { + background: none; + background-image: none; +} + +#MSearchBox span.right { + padding-top: calc(calc(var(--searchbar-height) / 2) - 12px); + position: absolute; + right: var(--spacing-small); +} + +.tabs #MSearchBox span.right { + top: calc(calc(var(--searchbar-height) / 2) - 12px); +} + +@keyframes slideInSearchResults { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } +} + +#MSearchResultsWindow { + left: auto !important; + right: var(--spacing-medium); + border-radius: var(--border-radius-large); + border: 1px solid var(--separator-color); + transform: translate(0, 20px); + box-shadow: var(--box-shadow); + animation: ease-out 280ms slideInSearchResults; + background: var(--page-background-color); +} + +iframe#MSearchResults { + margin: 4px; +} + +iframe { + color-scheme: normal; +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) iframe#MSearchResults { + filter: invert() hue-rotate(180deg); + } +} + +html.dark-mode iframe#MSearchResults { + filter: invert() hue-rotate(180deg); +} + +#MSearchResults .SRPage { + background-color: transparent; +} + +#MSearchResults .SRPage .SREntry { + font-size: 10pt; + padding: var(--spacing-small) var(--spacing-medium); +} + +#MSearchSelectWindow { + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + box-shadow: var(--box-shadow); + background: var(--page-background-color); + padding-top: var(--spacing-small); + padding-bottom: var(--spacing-small); +} + +#MSearchSelectWindow a.SelectItem { + font-size: var(--navigation-font-size); + line-height: var(--content-line-height); + margin: 0 var(--spacing-small); + border-radius: var(--border-radius-small); + color: var(--page-foreground-color) !important; + font-weight: normal; +} + +#MSearchSelectWindow a.SelectItem:hover { + background: var(--menu-focus-background); + color: var(--menu-focus-foreground) !important; +} + +@media screen and (max-width: 767px) { + #MSearchBox { + margin-top: var(--spacing-medium); + margin-bottom: var(--spacing-medium); + width: calc(100vw - 30px); + } + + #main-menu > li:last-child { + float: none !important; + } + + #MSearchField { + width: calc(100vw - 110px); + } + + @keyframes slideInSearchResultsMobile { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } + } + + #MSearchResultsWindow { + left: var(--spacing-medium) !important; + right: var(--spacing-medium); + overflow: auto; + transform: translate(0, 20px); + animation: ease-out 280ms slideInSearchResultsMobile; + width: auto !important; + } + + /* + * Overwrites for fixing the searchbox on mobile in doxygen 1.9.2 + */ + label.main-menu-btn ~ #searchBoxPos1 { + top: 3px !important; + right: 6px !important; + left: 45px; + display: flex; + } + + label.main-menu-btn ~ #searchBoxPos1 > #MSearchBox { + margin-top: 0; + margin-bottom: 0; + flex-grow: 2; + float: left; + } +} + +/* + Tree view + */ + +#side-nav { + padding: 0 !important; + background: var(--side-nav-background); +} + +@media screen and (max-width: 767px) { + #side-nav { + display: none; + } + + #doc-content { + margin-left: 0 !important; + } +} + +#nav-tree { + background: transparent; +} + +#nav-tree .label { + font-size: var(--navigation-font-size); +} + +#nav-tree .item { + height: var(--tree-item-height); + line-height: var(--tree-item-height); +} + +#nav-sync { + bottom: 12px; + right: 12px; + top: auto !important; + user-select: none; +} + +#nav-tree .selected { + text-shadow: none; + background-image: none; + background-color: transparent; + position: relative; +} + +#nav-tree .selected::after { + content: ""; + position: absolute; + top: 1px; + bottom: 1px; + left: 0; + width: 4px; + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; + background: var(--primary-color); +} + + +#nav-tree a { + color: var(--side-nav-foreground) !important; + font-weight: normal; +} + +#nav-tree a:focus { + outline-style: auto; +} + +#nav-tree .arrow { + opacity: var(--side-nav-arrow-opacity); +} + +.arrow { + color: inherit; + cursor: pointer; + font-size: 45%; + vertical-align: middle; + margin-right: 2px; + font-family: serif; + height: auto; + text-align: right; +} + +#nav-tree div.item:hover .arrow, #nav-tree a:focus .arrow { + opacity: var(--side-nav-arrow-hover-opacity); +} + +#nav-tree .selected a { + color: var(--primary-color) !important; + font-weight: bolder; + font-weight: 600; +} + +.ui-resizable-e { + background: var(--separator-color); + width: 1px; +} + +/* + Contents + */ + +div.header { + border-bottom: 1px solid var(--separator-color); + background-color: var(--page-background-color); + background-image: none; +} + +@media screen and (min-width: 1000px) { + #doc-content > div > div.contents, + .PageDoc > div.contents { + display: flex; + flex-direction: row-reverse; + flex-wrap: nowrap; + align-items: flex-start; + } + + div.contents .textblock { + min-width: 200px; + flex-grow: 1; + } +} + +div.contents, div.header .title, div.header .summary { + max-width: var(--content-maxwidth); +} + +div.contents, div.header .title { + line-height: initial; + margin: calc(var(--spacing-medium) + .2em) auto var(--spacing-medium) auto; +} + +div.header .summary { + margin: var(--spacing-medium) auto 0 auto; +} + +div.headertitle { + padding: 0; +} + +div.header .title { + font-weight: 600; + font-size: 225%; + padding: var(--spacing-medium) var(--spacing-large); + word-break: break-word; +} + +div.header .summary { + width: auto; + display: block; + float: none; + padding: 0 var(--spacing-large); +} + +td.memSeparator { + border-color: var(--separator-color); +} + +span.mlabel { + background: var(--primary-color); + border: none; + padding: 4px 9px; + border-radius: 12px; + margin-right: var(--spacing-medium); +} + +span.mlabel:last-of-type { + margin-right: 2px; +} + +div.contents { + padding: 0 var(--spacing-large); +} + +div.contents p, div.contents li { + line-height: var(--content-line-height); +} + +div.contents div.dyncontent { + margin: var(--spacing-medium) 0; +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) div.contents div.dyncontent img, + html:not(.light-mode) div.contents center img, + html:not(.light-mode) div.contents > table img, + html:not(.light-mode) div.contents div.dyncontent iframe, + html:not(.light-mode) div.contents center iframe, + html:not(.light-mode) div.contents table iframe { + filter: hue-rotate(180deg) invert(); + } +} + +html.dark-mode div.contents div.dyncontent img, +html.dark-mode div.contents center img, +html.dark-mode div.contents > table img, +html.dark-mode div.contents div.dyncontent iframe, +html.dark-mode div.contents center iframe, +html.dark-mode div.contents table iframe { + filter: hue-rotate(180deg) invert(); +} + +h2.groupheader { + border-bottom: 0px; + color: var(--page-foreground-color); + box-shadow: + 100px 0 var(--page-background-color), + -100px 0 var(--page-background-color), + 100px 0.75px var(--separator-color), + -100px 0.75px var(--separator-color), + 500px 0 var(--page-background-color), + -500px 0 var(--page-background-color), + 500px 0.75px var(--separator-color), + -500px 0.75px var(--separator-color), + 900px 0 var(--page-background-color), + -900px 0 var(--page-background-color), + 900px 0.75px var(--separator-color), + -900px 0.75px var(--separator-color), + 1400px 0 var(--page-background-color), + -1400px 0 var(--page-background-color), + 1400px 0.75px var(--separator-color), + -1400px 0.75px var(--separator-color), + 1900px 0 var(--page-background-color), + -1900px 0 var(--page-background-color), + 1900px 0.75px var(--separator-color), + -1900px 0.75px var(--separator-color); +} + +blockquote { + margin: 0 var(--spacing-medium) 0 var(--spacing-medium); + padding: var(--spacing-small) var(--spacing-large); + background: var(--blockquote-background); + color: var(--blockquote-foreground); + border-left: 0; + overflow: visible; + border-radius: var(--border-radius-medium); + overflow: visible; + position: relative; +} + +blockquote::before, blockquote::after { + font-weight: bold; + font-family: serif; + font-size: 360%; + opacity: .15; + position: absolute; +} + +blockquote::before { + content: "“"; + left: -10px; + top: 4px; +} + +blockquote::after { + content: "”"; + right: -8px; + bottom: -25px; +} + +blockquote p { + margin: var(--spacing-small) 0 var(--spacing-medium) 0; +} +.paramname { + font-weight: 600; + color: var(--primary-dark-color); +} + +.paramname > code { + border: 0; +} + +table.params .paramname { + font-weight: 600; + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); + padding-right: var(--spacing-small); + line-height: var(--table-line-height); +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--primary-light-color); +} + +.alphachar a { + color: var(--page-foreground-color); +} + +/* + Table of Contents + */ + +div.contents .toc { + max-height: var(--toc-max-height); + min-width: var(--toc-width); + border: 0; + border-left: 1px solid var(--separator-color); + border-radius: 0; + background-color: transparent; + box-shadow: none; + position: sticky; + top: var(--toc-sticky-top); + padding: 0 var(--spacing-large); + margin: var(--spacing-small) 0 var(--spacing-large) var(--spacing-large); +} + +div.toc h3 { + color: var(--toc-foreground); + font-size: var(--navigation-font-size); + margin: var(--spacing-large) 0 var(--spacing-medium) 0; +} + +div.toc li { + padding: 0; + background: none; + line-height: var(--toc-font-size); + margin: var(--toc-font-size) 0 0 0; +} + +div.toc li::before { + display: none; +} + +div.toc ul { + margin-top: 0 +} + +div.toc li a { + font-size: var(--toc-font-size); + color: var(--page-foreground-color) !important; + text-decoration: none; +} + +div.toc li a:hover, div.toc li a.active { + color: var(--primary-color) !important; +} + +div.toc li a.aboveActive { + color: var(--page-secondary-foreground-color) !important; +} + + +@media screen and (max-width: 999px) { + div.contents .toc { + max-height: 45vh; + float: none; + width: auto; + margin: 0 0 var(--spacing-medium) 0; + position: relative; + top: 0; + position: relative; + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + background-color: var(--toc-background); + box-shadow: var(--box-shadow); + } + + div.contents .toc.interactive { + max-height: calc(var(--navigation-font-size) + 2 * var(--spacing-large)); + overflow: hidden; + } + + div.contents .toc > h3 { + -webkit-tap-highlight-color: transparent; + cursor: pointer; + position: sticky; + top: 0; + background-color: var(--toc-background); + margin: 0; + padding: var(--spacing-large) 0; + display: block; + } + + div.contents .toc.interactive > h3::before { + content: ""; + width: 0; + height: 0; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 5px solid var(--primary-color); + display: inline-block; + margin-right: var(--spacing-small); + margin-bottom: calc(var(--navigation-font-size) / 4); + transform: rotate(-90deg); + transition: transform 0.25s ease-out; + } + + div.contents .toc.interactive.open > h3::before { + transform: rotate(0deg); + } + + div.contents .toc.interactive.open { + max-height: 45vh; + overflow: auto; + transition: max-height 0.2s ease-in-out; + } + + div.contents .toc a, div.contents .toc a.active { + color: var(--primary-color) !important; + } + + div.contents .toc a:hover { + text-decoration: underline; + } +} + +/* + Code & Fragments + */ + +code, div.fragment, pre.fragment { + border-radius: var(--border-radius-small); + border: 1px solid var(--separator-color); + overflow: hidden; +} + +code { + display: inline; + background: var(--code-background); + color: var(--code-foreground); + padding: 2px 6px; +} + +div.fragment, pre.fragment { + margin: var(--spacing-medium) 0; + padding: calc(var(--spacing-large) - (var(--spacing-large) / 6)) var(--spacing-large); + background: var(--fragment-background); + color: var(--fragment-foreground); + overflow-x: auto; +} + +@media screen and (max-width: 767px) { + div.fragment, pre.fragment { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-right: 0; + } + + .contents > div.fragment, + .textblock > div.fragment, + .textblock > pre.fragment, + .contents > .doxygen-awesome-fragment-wrapper > div.fragment, + .textblock > .doxygen-awesome-fragment-wrapper > div.fragment, + .textblock > .doxygen-awesome-fragment-wrapper > pre.fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-large)); + border-radius: 0; + border-left: 0; + } + + .textblock li > .fragment, + .textblock li > .doxygen-awesome-fragment-wrapper > .fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-large)); + } + + .memdoc li > .fragment, + .memdoc li > .doxygen-awesome-fragment-wrapper > .fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); + } + + .textblock ul, .memdoc ul { + overflow: initial; + } + + .memdoc > div.fragment, + .memdoc > pre.fragment, + dl dd > div.fragment, + dl dd pre.fragment, + .memdoc > .doxygen-awesome-fragment-wrapper > div.fragment, + .memdoc > .doxygen-awesome-fragment-wrapper > pre.fragment, + dl dd > .doxygen-awesome-fragment-wrapper > div.fragment, + dl dd .doxygen-awesome-fragment-wrapper > pre.fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); + border-radius: 0; + border-left: 0; + } +} + +code, code a, pre.fragment, div.fragment, div.fragment .line, div.fragment span, div.fragment .line a, div.fragment .line span { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size) !important; +} + +div.line:after { + margin-right: var(--spacing-medium); +} + +div.fragment .line, pre.fragment { + white-space: pre; + word-wrap: initial; + line-height: var(--fragment-lineheight); +} + +div.fragment span.keyword { + color: var(--fragment-keyword); +} + +div.fragment span.keywordtype { + color: var(--fragment-keywordtype); +} + +div.fragment span.keywordflow { + color: var(--fragment-keywordflow); +} + +div.fragment span.stringliteral { + color: var(--fragment-token) +} + +div.fragment span.comment { + color: var(--fragment-comment); +} + +div.fragment a.code { + color: var(--fragment-link) !important; +} + +div.fragment span.preprocessor { + color: var(--fragment-preprocessor); +} + +div.fragment span.lineno { + display: inline-block; + width: 27px; + border-right: none; + background: var(--fragment-linenumber-background); + color: var(--fragment-linenumber-color); +} + +div.fragment span.lineno a { + background: none; + color: var(--fragment-link) !important; +} + +div.fragment .line:first-child .lineno { + box-shadow: -999999px 0px 0 999999px var(--fragment-linenumber-background), -999998px 0px 0 999999px var(--fragment-linenumber-border); +} + +div.line { + border-radius: var(--border-radius-small); +} + +div.line.glow { + background-color: var(--primary-light-color); + box-shadow: none; +} + +/* + dl warning, attention, note, deprecated, bug, ... + */ + +dl.bug dt a, dl.deprecated dt a, dl.todo dt a { + font-weight: bold !important; +} + +dl.warning, dl.attention, dl.note, dl.deprecated, dl.bug, dl.invariant, dl.pre, dl.todo, dl.remark { + padding: var(--spacing-medium); + margin: var(--spacing-medium) 0; + color: var(--page-background-color); + overflow: hidden; + margin-left: 0; + border-radius: var(--border-radius-small); +} + +dl.section dd { + margin-bottom: 2px; +} + +dl.warning, dl.attention { + background: var(--warning-color); + border-left: 8px solid var(--warning-color-dark); + color: var(--warning-color-darker); +} + +dl.warning dt, dl.attention dt { + color: var(--warning-color-dark); +} + +dl.note, dl.remark { + background: var(--note-color); + border-left: 8px solid var(--note-color-dark); + color: var(--note-color-darker); +} + +dl.note dt, dl.remark dt { + color: var(--note-color-dark); +} + +dl.todo { + background: var(--todo-color); + border-left: 8px solid var(--todo-color-dark); + color: var(--todo-color-darker); +} + +dl.todo dt { + color: var(--todo-color-dark); +} + +dl.bug dt a { + color: var(--todo-color-dark) !important; +} + +dl.bug { + background: var(--bug-color); + border-left: 8px solid var(--bug-color-dark); + color: var(--bug-color-darker); +} + +dl.bug dt a { + color: var(--bug-color-dark) !important; +} + +dl.deprecated { + background: var(--deprecated-color); + border-left: 8px solid var(--deprecated-color-dark); + color: var(--deprecated-color-darker); +} + +dl.deprecated dt a { + color: var(--deprecated-color-dark) !important; +} + +dl.section dd, dl.bug dd, dl.deprecated dd, dl.todo dd { + margin-inline-start: 0px; +} + +dl.invariant, dl.pre { + background: var(--invariant-color); + border-left: 8px solid var(--invariant-color-dark); + color: var(--invariant-color-darker); +} + +dl.invariant dt, dl.pre dt { + color: var(--invariant-color-dark); +} + +/* + memitem + */ + +div.memdoc, div.memproto, h2.memtitle { + box-shadow: none; + background-image: none; + border: none; +} + +div.memdoc { + padding: 0 var(--spacing-medium); + background: var(--page-background-color); +} + +h2.memtitle, div.memitem { + border: 1px solid var(--separator-color); + box-shadow: var(--box-shadow); +} + +h2.memtitle { + box-shadow: 0px var(--spacing-medium) 0 -1px var(--fragment-background), var(--box-shadow); +} + +div.memitem { + transition: none; +} + +div.memproto, h2.memtitle { + background: var(--fragment-background); +} + +h2.memtitle { + font-weight: 500; + font-size: var(--memtitle-font-size); + font-family: var(--font-family-monospace); + border-bottom: none; + border-top-left-radius: var(--border-radius-medium); + border-top-right-radius: var(--border-radius-medium); + word-break: break-all; + position: relative; +} + +h2.memtitle:after { + content: ""; + display: block; + background: var(--fragment-background); + height: var(--spacing-medium); + bottom: calc(0px - var(--spacing-medium)); + left: 0; + right: -14px; + position: absolute; + border-top-right-radius: var(--border-radius-medium); +} + +h2.memtitle > span.permalink { + font-size: inherit; +} + +h2.memtitle > span.permalink > a { + text-decoration: none; + padding-left: 3px; + margin-right: -4px; + user-select: none; + display: inline-block; + margin-top: -6px; +} + +h2.memtitle > span.permalink > a:hover { + color: var(--primary-dark-color) !important; +} + +a:target + h2.memtitle, a:target + h2.memtitle + div.memitem { + border-color: var(--primary-light-color); +} + +div.memitem { + border-top-right-radius: var(--border-radius-medium); + border-bottom-right-radius: var(--border-radius-medium); + border-bottom-left-radius: var(--border-radius-medium); + overflow: hidden; + display: block !important; +} + +div.memdoc { + border-radius: 0; +} + +div.memproto { + border-radius: 0 var(--border-radius-small) 0 0; + overflow: auto; + border-bottom: 1px solid var(--separator-color); + padding: var(--spacing-medium); + margin-bottom: -1px; +} + +div.memtitle { + border-top-right-radius: var(--border-radius-medium); + border-top-left-radius: var(--border-radius-medium); +} + +div.memproto table.memname { + font-family: var(--font-family-monospace); + color: var(--page-foreground-color); + font-size: var(--memname-font-size); + text-shadow: none; +} + +div.memproto div.memtemplate { + font-family: var(--font-family-monospace); + color: var(--primary-dark-color); + font-size: var(--memname-font-size); + margin-left: 2px; + text-shadow: none; +} + +table.mlabels, table.mlabels > tbody { + display: block; +} + +td.mlabels-left { + width: auto; +} + +td.mlabels-right { + margin-top: 3px; + position: sticky; + left: 0; +} + +table.mlabels > tbody > tr:first-child { + display: flex; + justify-content: space-between; + flex-wrap: wrap; +} + +.memname, .memitem span.mlabels { + margin: 0 +} + +/* + reflist + */ + +dl.reflist { + box-shadow: var(--box-shadow); + border-radius: var(--border-radius-medium); + border: 1px solid var(--separator-color); + overflow: hidden; + padding: 0; +} + + +dl.reflist dt, dl.reflist dd { + box-shadow: none; + text-shadow: none; + background-image: none; + border: none; + padding: 12px; +} + + +dl.reflist dt { + font-weight: 500; + border-radius: 0; + background: var(--code-background); + border-bottom: 1px solid var(--separator-color); + color: var(--page-foreground-color) +} + + +dl.reflist dd { + background: none; +} + +/* + Table + */ + +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname), +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody { + display: inline-block; + max-width: 100%; +} + +.contents > table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname):not(.classindex) { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + max-width: calc(100% + 2 * var(--spacing-large)); +} + +table.fieldtable, +table.markdownTable tbody, +table.doxtable tbody { + border: none; + margin: var(--spacing-medium) 0; + box-shadow: 0 0 0 1px var(--separator-color); + border-radius: var(--border-radius-small); +} + +table.doxtable caption { + display: block; +} + +table.fieldtable { + border-collapse: collapse; + width: 100%; +} + +th.markdownTableHeadLeft, +th.markdownTableHeadRight, +th.markdownTableHeadCenter, +th.markdownTableHeadNone, +table.doxtable th { + background: var(--tablehead-background); + color: var(--tablehead-foreground); + font-weight: 600; + font-size: var(--page-font-size); +} + +th.markdownTableHeadLeft:first-child, +th.markdownTableHeadRight:first-child, +th.markdownTableHeadCenter:first-child, +th.markdownTableHeadNone:first-child, +table.doxtable tr th:first-child { + border-top-left-radius: var(--border-radius-small); +} + +th.markdownTableHeadLeft:last-child, +th.markdownTableHeadRight:last-child, +th.markdownTableHeadCenter:last-child, +th.markdownTableHeadNone:last-child, +table.doxtable tr th:last-child { + border-top-right-radius: var(--border-radius-small); +} + +table.markdownTable td, +table.markdownTable th, +table.fieldtable td, +table.fieldtable th, +table.doxtable td, +table.doxtable th { + border: 1px solid var(--separator-color); + padding: var(--spacing-small) var(--spacing-medium); +} + +table.markdownTable td:last-child, +table.markdownTable th:last-child, +table.fieldtable td:last-child, +table.fieldtable th:last-child, +table.doxtable td:last-child, +table.doxtable th:last-child { + border-right: none; +} + +table.markdownTable td:first-child, +table.markdownTable th:first-child, +table.fieldtable td:first-child, +table.fieldtable th:first-child, +table.doxtable td:first-child, +table.doxtable th:first-child { + border-left: none; +} + +table.markdownTable tr:first-child td, +table.markdownTable tr:first-child th, +table.fieldtable tr:first-child td, +table.fieldtable tr:first-child th, +table.doxtable tr:first-child td, +table.doxtable tr:first-child th { + border-top: none; +} + +table.markdownTable tr:last-child td, +table.markdownTable tr:last-child th, +table.fieldtable tr:last-child td, +table.fieldtable tr:last-child th, +table.doxtable tr:last-child td, +table.doxtable tr:last-child th { + border-bottom: none; +} + +table.markdownTable tr, table.doxtable tr { + border-bottom: 1px solid var(--separator-color); +} + +table.markdownTable tr:last-child, table.doxtable tr:last-child { + border-bottom: none; +} + +table.fieldtable th { + font-size: var(--page-font-size); + font-weight: 600; + background-image: none; + background-color: var(--tablehead-background); + color: var(--tablehead-foreground); +} + +table.fieldtable td.fieldtype, .fieldtable td.fieldname, .fieldtable td.fielddoc, .fieldtable th { + border-bottom: 1px solid var(--separator-color); + border-right: 1px solid var(--separator-color); +} + +table.fieldtable tr:last-child td:first-child { + border-bottom-left-radius: var(--border-radius-small); +} + +table.fieldtable tr:last-child td:last-child { + border-bottom-right-radius: var(--border-radius-small); +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--primary-light-color); + box-shadow: none; +} + +table.memberdecls { + display: block; + -webkit-tap-highlight-color: transparent; +} + +table.memberdecls tr[class^='memitem'] { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); +} + +table.memberdecls tr[class^='memitem'] .memTemplParams { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); + color: var(--primary-dark-color); + white-space: normal; +} + +table.memberdecls .memItemLeft, +table.memberdecls .memItemRight, +table.memberdecls .memTemplItemLeft, +table.memberdecls .memTemplItemRight, +table.memberdecls .memTemplParams { + transition: none; + padding-top: var(--spacing-small); + padding-bottom: var(--spacing-small); + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + background-color: var(--fragment-background); +} + +table.memberdecls .memTemplItemLeft, +table.memberdecls .memTemplItemRight { + padding-top: 2px; +} + +table.memberdecls .memTemplParams { + border-bottom: 0; + border-left: 1px solid var(--separator-color); + border-right: 1px solid var(--separator-color); + border-radius: var(--border-radius-small) var(--border-radius-small) 0 0; + padding-bottom: var(--spacing-small); +} + +table.memberdecls .memTemplItemLeft { + border-radius: 0 0 0 var(--border-radius-small); + border-left: 1px solid var(--separator-color); + border-top: 0; +} + +table.memberdecls .memTemplItemRight { + border-radius: 0 0 var(--border-radius-small) 0; + border-right: 1px solid var(--separator-color); + padding-left: 0; + border-top: 0; +} + +table.memberdecls .memItemLeft { + border-radius: var(--border-radius-small) 0 0 var(--border-radius-small); + border-left: 1px solid var(--separator-color); + padding-left: var(--spacing-medium); + padding-right: 0; +} + +table.memberdecls .memItemRight { + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; + border-right: 1px solid var(--separator-color); + padding-right: var(--spacing-medium); + padding-left: 0; + +} + +table.memberdecls .mdescLeft, table.memberdecls .mdescRight { + background: none; + color: var(--page-foreground-color); + padding: var(--spacing-small) 0; +} + +table.memberdecls .memItemLeft, +table.memberdecls .memTemplItemLeft { + padding-right: var(--spacing-medium); +} + +table.memberdecls .memSeparator { + background: var(--page-background-color); + height: var(--spacing-large); + border: 0; + transition: none; +} + +table.memberdecls .groupheader { + margin-bottom: var(--spacing-large); +} + +table.memberdecls .inherit_header td { + padding: 0 0 var(--spacing-medium) 0; + text-indent: -12px; + color: var(--page-secondary-foreground-color); +} + +table.memberdecls img[src="closed.png"], +table.memberdecls img[src="open.png"], +div.dynheader img[src="open.png"], +div.dynheader img[src="closed.png"] { + width: 0; + height: 0; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 5px solid var(--primary-color); + margin-top: 8px; + display: block; + float: left; + margin-left: -10px; + transition: transform 0.25s ease-out; +} + +table.memberdecls img { + margin-right: 10px; +} + +table.memberdecls img[src="closed.png"], +div.dynheader img[src="closed.png"] { + transform: rotate(-90deg); + +} + +.compoundTemplParams { + font-family: var(--font-family-monospace); + color: var(--primary-dark-color); + font-size: var(--code-font-size); +} + +@media screen and (max-width: 767px) { + + table.memberdecls .memItemLeft, + table.memberdecls .memItemRight, + table.memberdecls .mdescLeft, + table.memberdecls .mdescRight, + table.memberdecls .memTemplItemLeft, + table.memberdecls .memTemplItemRight, + table.memberdecls .memTemplParams { + display: block; + text-align: left; + padding-left: var(--spacing-large); + margin: 0 calc(0px - var(--spacing-large)) 0 calc(0px - var(--spacing-large)); + border-right: none; + border-left: none; + border-radius: 0; + white-space: normal; + } + + table.memberdecls .memItemLeft, + table.memberdecls .mdescLeft, + table.memberdecls .memTemplItemLeft { + border-bottom: 0; + padding-bottom: 0; + } + + table.memberdecls .memTemplItemLeft { + padding-top: 0; + } + + table.memberdecls .mdescLeft { + margin-bottom: calc(0px - var(--page-font-size)); + } + + table.memberdecls .memItemRight, + table.memberdecls .mdescRight, + table.memberdecls .memTemplItemRight { + border-top: 0; + padding-top: 0; + padding-right: var(--spacing-large); + overflow-x: auto; + } + + table.memberdecls tr[class^='memitem']:not(.inherit) { + display: block; + width: calc(100vw - 2 * var(--spacing-large)); + } + + table.memberdecls .mdescRight { + color: var(--page-foreground-color); + } + + table.memberdecls tr.inherit { + visibility: hidden; + } + + table.memberdecls tr[style="display: table-row;"] { + display: block !important; + visibility: visible; + width: calc(100vw - 2 * var(--spacing-large)); + animation: fade .5s; + } + + @keyframes fade { + 0% { + opacity: 0; + max-height: 0; + } + + 100% { + opacity: 1; + max-height: 200px; + } + } +} + + +/* + Horizontal Rule + */ + +hr { + margin-top: var(--spacing-large); + margin-bottom: var(--spacing-large); + height: 1px; + background-color: var(--separator-color); + border: 0; +} + +.contents hr { + box-shadow: 100px 0 0 var(--separator-color), + -100px 0 0 var(--separator-color), + 500px 0 0 var(--separator-color), + -500px 0 0 var(--separator-color), + 1500px 0 0 var(--separator-color), + -1500px 0 0 var(--separator-color), + 2000px 0 0 var(--separator-color), + -2000px 0 0 var(--separator-color); +} + +.contents img, .contents .center, .contents center, .contents div.image object { + max-width: 100%; + overflow: auto; +} + +@media screen and (max-width: 767px) { + .contents .dyncontent > .center, .contents > center { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + max-width: calc(100% + 2 * var(--spacing-large)); + } +} + +/* + Directories + */ +div.directory { + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + width: auto; +} + +table.directory { + font-family: var(--font-family); + font-size: var(--page-font-size); + font-weight: normal; + width: 100%; +} + +table.directory td.entry, table.directory td.desc { + padding: calc(var(--spacing-small) / 2) var(--spacing-small); + line-height: var(--table-line-height); +} + +table.directory tr.even td:last-child { + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; +} + +table.directory tr.even td:first-child { + border-radius: var(--border-radius-small) 0 0 var(--border-radius-small); +} + +table.directory tr.even:last-child td:last-child { + border-radius: 0 var(--border-radius-small) 0 0; +} + +table.directory tr.even:last-child td:first-child { + border-radius: var(--border-radius-small) 0 0 0; +} + +table.directory td.desc { + min-width: 250px; +} + +table.directory tr.even { + background-color: var(--odd-color); +} + +table.directory tr.odd { + background-color: transparent; +} + +.icona { + width: auto; + height: auto; + margin: 0 var(--spacing-small); +} + +.icon { + background: var(--primary-color); + border-radius: var(--border-radius-small); + font-size: var(--page-font-size); + padding: calc(var(--page-font-size) / 5); + line-height: var(--page-font-size); + transform: scale(0.8); + height: auto; + width: var(--page-font-size); + user-select: none; +} + +.iconfopen, .icondoc, .iconfclosed { + background-position: center; + margin-bottom: 0; + height: var(--table-line-height); +} + +.icondoc { + filter: saturate(0.2); +} + +@media screen and (max-width: 767px) { + div.directory { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + } +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) .iconfopen, html:not(.light-mode) .iconfclosed { + filter: hue-rotate(180deg) invert(); + } +} + +html.dark-mode .iconfopen, html.dark-mode .iconfclosed { + filter: hue-rotate(180deg) invert(); +} + +/* + Class list + */ + +.classindex dl.odd { + background: var(--odd-color); + border-radius: var(--border-radius-small); +} + +.classindex dl.even { + background-color: transparent; +} + +/* + Class Index Doxygen 1.8 +*/ + +table.classindex { + margin-left: 0; + margin-right: 0; + width: 100%; +} + +table.classindex table div.ah { + background-image: none; + background-color: initial; + border-color: var(--separator-color); + color: var(--page-foreground-color); + box-shadow: var(--box-shadow); + border-radius: var(--border-radius-large); + padding: var(--spacing-small); +} + +div.qindex { + background-color: var(--odd-color); + border-radius: var(--border-radius-small); + border: 1px solid var(--separator-color); + padding: var(--spacing-small) 0; +} + +/* + Footer and nav-path + */ + +#nav-path { + width: 100%; +} + +#nav-path ul { + background-image: none; + background: var(--page-background-color); + border: none; + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + border-bottom: 0; + box-shadow: 0 0.75px 0 var(--separator-color); + font-size: var(--navigation-font-size); +} + +img.footer { + width: 60px; +} + +.navpath li.footer { + color: var(--page-secondary-foreground-color); +} + +address.footer { + color: var(--page-secondary-foreground-color); + margin-bottom: var(--spacing-large); +} + +#nav-path li.navelem { + background-image: none; + display: flex; + align-items: center; +} + +.navpath li.navelem a { + text-shadow: none; + display: inline-block; + color: var(--primary-color) !important; +} + +.navpath li.navelem b { + color: var(--primary-dark-color); + font-weight: 500; +} + +li.navelem { + padding: 0; + margin-left: -8px; +} + +li.navelem:first-child { + margin-left: var(--spacing-large); +} + +li.navelem:first-child:before { + display: none; +} + +#nav-path li.navelem:after { + content: ''; + border: 5px solid var(--page-background-color); + border-bottom-color: transparent; + border-right-color: transparent; + border-top-color: transparent; + transform: translateY(-1px) scaleY(4.2); + z-index: 10; + margin-left: 6px; +} + +#nav-path li.navelem:before { + content: ''; + border: 5px solid var(--separator-color); + border-bottom-color: transparent; + border-right-color: transparent; + border-top-color: transparent; + transform: translateY(-1px) scaleY(3.2); + margin-right: var(--spacing-small); +} + +.navpath li.navelem a:hover { + color: var(--primary-color); +} + +/* + Scrollbars for Webkit +*/ + +#nav-tree::-webkit-scrollbar, +div.fragment::-webkit-scrollbar, +pre.fragment::-webkit-scrollbar, +div.memproto::-webkit-scrollbar, +.contents center::-webkit-scrollbar, +.contents .center::-webkit-scrollbar, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar, +div.contents .toc::-webkit-scrollbar { + background: transparent; + width: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); + height: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); +} + +#nav-tree::-webkit-scrollbar-thumb, +div.fragment::-webkit-scrollbar-thumb, +pre.fragment::-webkit-scrollbar-thumb, +div.memproto::-webkit-scrollbar-thumb, +.contents center::-webkit-scrollbar-thumb, +.contents .center::-webkit-scrollbar-thumb, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar-thumb, +div.contents .toc::-webkit-scrollbar-thumb { + background-color: transparent; + border: var(--webkit-scrollbar-padding) solid transparent; + border-radius: calc(var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); + background-clip: padding-box; +} + +#nav-tree:hover::-webkit-scrollbar-thumb, +div.fragment:hover::-webkit-scrollbar-thumb, +pre.fragment:hover::-webkit-scrollbar-thumb, +div.memproto:hover::-webkit-scrollbar-thumb, +.contents center:hover::-webkit-scrollbar-thumb, +.contents .center:hover::-webkit-scrollbar-thumb, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody:hover::-webkit-scrollbar-thumb, +div.contents .toc:hover::-webkit-scrollbar-thumb { + background-color: var(--webkit-scrollbar-color); +} + +#nav-tree::-webkit-scrollbar-track, +div.fragment::-webkit-scrollbar-track, +pre.fragment::-webkit-scrollbar-track, +div.memproto::-webkit-scrollbar-track, +.contents center::-webkit-scrollbar-track, +.contents .center::-webkit-scrollbar-track, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar-track, +div.contents .toc::-webkit-scrollbar-track { + background: transparent; +} + +#nav-tree::-webkit-scrollbar-corner { + background-color: var(--side-nav-background); +} + +#nav-tree, +div.fragment, +pre.fragment, +div.memproto, +.contents center, +.contents .center, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody, +div.contents .toc { + overflow-x: auto; + overflow-x: overlay; +} + +#nav-tree { + overflow-x: auto; + overflow-y: auto; + overflow-y: overlay; +} + +/* + Scrollbars for Firefox +*/ + +#nav-tree, +div.fragment, +pre.fragment, +div.memproto, +.contents center, +.contents .center, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody, +div.contents .toc { + scrollbar-width: thin; +} + +/* + Optional Dark mode toggle button +*/ + +doxygen-awesome-dark-mode-toggle { + display: inline-block; + margin: 0 0 0 var(--spacing-small); + padding: 0; + width: var(--searchbar-height); + height: var(--searchbar-height); + background: none; + border: none; + border-radius: var(--searchbar-height); + vertical-align: middle; + text-align: center; + line-height: var(--searchbar-height); + font-size: 22px; + display: flex; + align-items: center; + justify-content: center; + user-select: none; + cursor: pointer; +} + +doxygen-awesome-dark-mode-toggle > svg { + transition: transform .1s ease-in-out; +} + +doxygen-awesome-dark-mode-toggle:active > svg { + transform: scale(.5); +} + +doxygen-awesome-dark-mode-toggle:hover { + background-color: rgba(0,0,0,.03); +} + +html.dark-mode doxygen-awesome-dark-mode-toggle:hover { + background-color: rgba(0,0,0,.18); +} + +/* + Optional fragment copy button +*/ +.doxygen-awesome-fragment-wrapper { + position: relative; +} + +doxygen-awesome-fragment-copy-button { + opacity: 0; + background: var(--fragment-background); + width: 28px; + height: 28px; + position: absolute; + right: calc(var(--spacing-large) - (var(--spacing-large) / 2.5)); + top: calc(var(--spacing-large) - (var(--spacing-large) / 2.5)); + border: 1px solid var(--fragment-foreground); + cursor: pointer; + border-radius: var(--border-radius-small); + display: flex; + justify-content: center; + align-items: center; +} + +.doxygen-awesome-fragment-wrapper:hover doxygen-awesome-fragment-copy-button, doxygen-awesome-fragment-copy-button.success { + opacity: .28; +} + +doxygen-awesome-fragment-copy-button:hover, doxygen-awesome-fragment-copy-button.success { + opacity: 1 !important; +} + +doxygen-awesome-fragment-copy-button:active:not([class~=success]) svg { + transform: scale(.91); +} + +doxygen-awesome-fragment-copy-button svg { + fill: var(--fragment-foreground); + width: 18px; + height: 18px; +} + +doxygen-awesome-fragment-copy-button.success svg { + fill: rgb(14, 168, 14); +} + +doxygen-awesome-fragment-copy-button.success { + border-color: rgb(14, 168, 14); +} + +@media screen and (max-width: 767px) { + .textblock > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .textblock li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .memdoc li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .memdoc > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + dl dd > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button { + right: 0; + } +} + +/* + Optional paragraph link button +*/ + +a.anchorlink { + font-size: 90%; + margin-left: var(--spacing-small); + color: var(--page-foreground-color) !important; + text-decoration: none; + opacity: .15; + display: none; + transition: opacity .1s ease-in-out, color .1s ease-in-out; +} + +a.anchorlink svg { + fill: var(--page-foreground-color); +} + +h3 a.anchorlink svg, h4 a.anchorlink svg { + margin-bottom: -3px; + margin-top: -4px; +} + +a.anchorlink:hover { + opacity: .45; +} + +h2:hover a.anchorlink, h1:hover a.anchorlink, h3:hover a.anchorlink, h4:hover a.anchorlink { + display: inline-block; +} + + +#MSearchBox .left { + background: none !important; +} +#MSearchBox .right { + background: none !important; +} diff --git a/htdocs/product/stock/class/api_stockmovements.class.php b/htdocs/product/stock/class/api_stockmovements.class.php index 544485060af..472d38ea245 100644 --- a/htdocs/product/stock/class/api_stockmovements.class.php +++ b/htdocs/product/stock/class/api_stockmovements.class.php @@ -162,8 +162,8 @@ class StockMovements extends DolibarrApi * @param float $qty Qty to add (Use negative value for a stock decrease) {@from body} {@required true} * @param int $type Optionally specify the type of movement. 0=input (stock increase by a stock transfer), 1=output (stock decrease by a stock transfer), 2=output (stock decrease), 3=input (stock increase). {@from body} {@type int} * @param string $lot Lot {@from body} - * @param string $movementcode Movement code {@example INV123} {@from body} - * @param string $movementlabel Movement label {@example Inventory number 123} {@from body} + * @param string $movementcode Movement code {@from body} + * @param string $movementlabel Movement label {@from body} * @param string $price To update AWP (Average Weighted Price) when you make a stock increase (qty must be higher then 0). {@from body} * @param string $datem Date of movement {@from body} {@type date} * @param string $dlc Eat-by date. {@from body} {@type date} From 59ed7b9f96f8b6ad5bf42ac4fc04e56f587ec9c1 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Mon, 2 Jan 2023 11:52:34 +0000 Subject: [PATCH 0512/1128] Fixing style errors. --- htdocs/comm/propal/card.php | 26 ++++++++++----------- htdocs/commande/card.php | 45 ++++++++++++++++++------------------- 2 files changed, 35 insertions(+), 36 deletions(-) diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index 73a94a2a503..7953691f11b 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -1235,7 +1235,7 @@ if (empty($reshook)) { // Prepare a price equivalent for minimum price check $pu_equivalent = $pu_ht; - $pu_equivalent_ttc = $pu_ttc; + $pu_equivalent_ttc = $pu_ttc; $currency_tx = $object->multicurrency_tx; // Check if we have a foreing currency @@ -1243,7 +1243,7 @@ if (empty($reshook)) { if ($pu_ht == '' && $pu_ht_devise != '' && $currency_tx != '') { $pu_equivalent = $pu_ht_devise * $currency_tx; } - if ($pu_ttc == '' && $pu_ttc_devise != '' && $currency_tx != '') { + if ($pu_ttc == '' && $pu_ttc_devise != '' && $currency_tx != '') { $pu_equivalent_ttc = $pu_ttc_devise * $currency_tx; } @@ -1364,18 +1364,18 @@ if (empty($reshook)) { $remise_percent = price2num(GETPOST('remise_percent'), '', 2); // Prepare a price equivalent for minimum price check - $pu_equivalent = $pu_ht; - $pu_equivalent_ttc = $pu_ttc; - $currency_tx = $object->multicurrency_tx; + $pu_equivalent = $pu_ht; + $pu_equivalent_ttc = $pu_ttc; + $currency_tx = $object->multicurrency_tx; - // Check if we have a foreing currency - // If so, we update the pu_equiv as the equivalent price in base currency - if ($pu_ht == '' && $pu_ht_devise != '' && $currency_tx != '') { - $pu_equivalent = $pu_ht_devise * $currency_tx; - } - if ($pu_ttc == '' && $pu_ttc_devise != '' && $currency_tx != '') { - $pu_equivalent_ttc = $pu_ttc_devise * $currency_tx; - } + // Check if we have a foreing currency + // If so, we update the pu_equiv as the equivalent price in base currency + if ($pu_ht == '' && $pu_ht_devise != '' && $currency_tx != '') { + $pu_equivalent = $pu_ht_devise * $currency_tx; + } + if ($pu_ttc == '' && $pu_ttc_devise != '' && $currency_tx != '') { + $pu_equivalent_ttc = $pu_ttc_devise * $currency_tx; + } // Extrafields $extralabelsline = $extrafields->fetch_name_optionals_label($object->table_element_line); diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index f5b204c6889..135c6fc9ab9 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -684,18 +684,18 @@ if (empty($reshook)) { // Prepare a price equivalent for minimum price check - $pu_equivalent = $pu_ht; - $pu_equivalent_ttc = $pu_ttc; - $currency_tx = $object->multicurrency_tx; + $pu_equivalent = $pu_ht; + $pu_equivalent_ttc = $pu_ttc; + $currency_tx = $object->multicurrency_tx; - // Check if we have a foreing currency - // If so, we update the pu_equiv as the equivalent price in base currency - if ($pu_ht == '' && $pu_ht_devise != '' && $currency_tx != '') { - $pu_equivalent = $pu_ht_devise * $currency_tx; - } - if ($pu_ttc == '' && $pu_ttc_devise != '' && $currency_tx != '') { - $pu_equivalent_ttc = $pu_ttc_devise * $currency_tx; - } + // Check if we have a foreing currency + // If so, we update the pu_equiv as the equivalent price in base currency + if ($pu_ht == '' && $pu_ht_devise != '' && $currency_tx != '') { + $pu_equivalent = $pu_ht_devise * $currency_tx; + } + if ($pu_ttc == '' && $pu_ttc_devise != '' && $currency_tx != '') { + $pu_equivalent_ttc = $pu_ttc_devise * $currency_tx; + } $qty = price2num(GETPOST('qty'.$predef, 'alpha'), 'MS', 2); @@ -1013,7 +1013,6 @@ if (empty($reshook)) { } if (!$error) { - // Insert line $result = $object->addline($desc, $pu_ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, $idprod, $remise_percent, $info_bits, 0, $price_base_type, $pu_ttc, $date_start, $date_end, $type, min($rank, count($object->lines) + 1), 0, GETPOST('fk_parent_line'), $fournprice, $buyingprice, $label, $array_options, $fk_unit, '', 0, $pu_ht_devise); @@ -1093,18 +1092,18 @@ if (empty($reshook)) { $qty = price2num(GETPOST('qty', 'alpha'), 'MS'); // Prepare a price equivalent for minimum price check - $pu_equivalent = $pu_ht; - $pu_equivalent_ttc = $pu_ttc; - $currency_tx = $object->multicurrency_tx; + $pu_equivalent = $pu_ht; + $pu_equivalent_ttc = $pu_ttc; + $currency_tx = $object->multicurrency_tx; - // Check if we have a foreing currency - // If so, we update the pu_equiv as the equivalent price in base currency - if ($pu_ht == '' && $pu_ht_devise != '' && $currency_tx != '') { - $pu_equivalent = $pu_ht_devise * $currency_tx; - } - if ($pu_ttc == '' && $pu_ttc_devise != '' && $currency_tx != '') { - $pu_equivalent_ttc = $pu_ttc_devise * $currency_tx; - } + // Check if we have a foreing currency + // If so, we update the pu_equiv as the equivalent price in base currency + if ($pu_ht == '' && $pu_ht_devise != '' && $currency_tx != '') { + $pu_equivalent = $pu_ht_devise * $currency_tx; + } + if ($pu_ttc == '' && $pu_ttc_devise != '' && $currency_tx != '') { + $pu_equivalent_ttc = $pu_ttc_devise * $currency_tx; + } // Define info_bits $info_bits = 0; From 66ee541f771664fa3437d96748528ae914452809 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 2 Jan 2023 15:18:25 +0100 Subject: [PATCH 0513/1128] Fix class name collision --- htdocs/includes/OAuth/Common/Storage/DoliStorage.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/includes/OAuth/Common/Storage/DoliStorage.php b/htdocs/includes/OAuth/Common/Storage/DoliStorage.php index a769efdf8b9..0ca8dee700b 100644 --- a/htdocs/includes/OAuth/Common/Storage/DoliStorage.php +++ b/htdocs/includes/OAuth/Common/Storage/DoliStorage.php @@ -67,10 +67,10 @@ class DoliStorage implements TokenStorageInterface /** * @param DoliDB $db Database handler - * @param Conf $conf Conf object + * @param \Conf $conf Conf object * @param string $keyforprovider Key to manage several providers of the same type. For example 'abc' will be added to 'Google' to defined storage key. */ - public function __construct(DoliDB $db, Conf $conf, $keyforprovider = '') + public function __construct(DoliDB $db, \Conf $conf, $keyforprovider = '') { $this->db = $db; $this->conf = $conf; From 5dcee6b7d76548ae404be0861746e3226c0c460b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 2 Jan 2023 15:24:20 +0100 Subject: [PATCH 0514/1128] Fix doxygen --- htdocs/core/boxes/box_dolibarr_state_board.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/boxes/box_dolibarr_state_board.php b/htdocs/core/boxes/box_dolibarr_state_board.php index 9a2e94b8a1d..6152b167863 100644 --- a/htdocs/core/boxes/box_dolibarr_state_board.php +++ b/htdocs/core/boxes/box_dolibarr_state_board.php @@ -20,7 +20,7 @@ /** * \file htdocs/core/boxes/box_dolibarr_state_board.php - * \ingroup + * \ingroup core * \brief Module Dolibarr state base */ From 1484237c1e7588ebe5ac9f0d5654c95b634a198c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 2 Jan 2023 16:13:35 +0100 Subject: [PATCH 0515/1128] Doc --- ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 3d9b0b04e5a..bbb01cfd3cf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -21,7 +21,7 @@ For users: NEW: Minimal PHP version is now PHP 7.0 instead of PHP 5.6 NEW: #21780 Add pid field to Cronjob class and store PID on job execution NEW: #19680 Add option PRODUCT_ALLOW_EXTERNAL_DOWNLOAD to automatically have uploaded files shared publicly by a link -NEW: #20650 can move the checkbox column on left (experimental option) +NEW: #20650 can move the checkbox column on left (experimental option MAIN_CHECKBOX_LEFT_COLUMN) NEW: #21000 Added columns 'alias_name' on project, supplier invoice, supplier order, supplier proposals and task list NEW: #21395 Added option for dark theme mode in display - color and theme NEW: #21397 added option to auto define barcode numbers for third-parties in barcode module setup From 3ed5edc0032ff0f1ace6958e11e628cf52eeecb0 Mon Sep 17 00:00:00 2001 From: Gauthier PC portable 024 Date: Mon, 2 Jan 2023 16:21:14 +0100 Subject: [PATCH 0516/1128] NEW : search on time spent duration range --- htdocs/projet/tasks/time.php | 53 +++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index 94ed0edaffd..8c98e6387b1 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -88,6 +88,10 @@ $search_company = GETPOST('$search_company', 'alpha'); $search_company_alias = GETPOST('$search_company_alias', 'alpha'); $search_project_ref = GETPOST('$search_project_ref', 'alpha'); $search_project_label = GETPOST('$search_project_label', 'alpha'); +$search_timespent_starthour = GETPOSTINT("search_timespent_duration_starthour"); +$search_timespent_startmin = GETPOSTINT("search_timespent_duration_startmin"); +$search_timespent_endhour = GETPOSTINT("search_timespent_duration_endhour"); +$search_timespent_endmin = GETPOSTINT("search_timespent_duration_endmin"); $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit; $sortfield = GETPOST('sortfield', 'aZ09comma'); @@ -196,6 +200,10 @@ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x' $search_product_ref = ''; $toselect = array(); $search_array_options = array(); + $search_timespent_starthour = ''; + $search_timespent_startmin = ''; + $search_timespent_endhour = ''; + $search_timespent_endmin = ''; $action = ''; } @@ -1337,6 +1345,18 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser if ($search_date_endyear) { $param .= '&search_date_endyear='.urlencode($search_date_endyear); } + if ($search_timespent_starthour) { + $param .= '&search_timespent_duration_starthour='.urlencode($search_timespent_starthour); + } + if ($search_timespent_startmin) { + $param .= '&search_timespent_duration_startmin='.urlencode($search_timespent_startmin); + } + if ($search_timespent_endhour) { + $param .= '&search_timespent_duration_endhour='.urlencode($search_timespent_endhour); + } + if ($search_timespent_endmin) { + $param .= '&search_timespent_duration_endmin='.urlencode($search_timespent_endmin); + } /* // Add $param from extra fields @@ -1609,6 +1629,18 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser $sql .= " AND t.task_date <= '".$db->idate($search_date_end)."'"; } + if($search_timespent_starthour || $search_timespent_startmin) { + $timespent_duration_start = $search_timespent_starthour * 60 * 60; // We store duration in seconds + $timespent_duration_start += ($search_timespent_startmin ? $search_timespent_startmin : 0) * 60; // We store duration in seconds + $sql .= " AND t.task_duration >= ".$timespent_duration_start; + } + + if($search_timespent_endhour || $search_timespent_endmin) { + $timespent_duration_end = $search_timespent_endhour * 60 * 60; // We store duration in seconds + $timespent_duration_end += ($search_timespent_endmin ? $search_timespent_endmin : 0) * 60; // We store duration in seconds + $sql .= " AND t.task_duration <= ".$timespent_duration_end; + } + $sql .= dolSqlDateFilter('t.task_datehour', $search_day, $search_month, $search_year); // Add where from hooks @@ -1877,7 +1909,26 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser } // Duration if (!empty($arrayfields['t.task_duration']['checked'])) { - print ''; + // Duration - Time spent + print ''; } // Product if (!empty($arrayfields['t.fk_product']['checked'])) { From 1bd0099d9f1e3c85ecdf3aefefe4830212a3bbcd Mon Sep 17 00:00:00 2001 From: atm-lena Date: Mon, 2 Jan 2023 16:29:16 +0100 Subject: [PATCH 0517/1128] Add column "Alias Name" in contact list --- htdocs/contact/list.php | 44 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/htdocs/contact/list.php b/htdocs/contact/list.php index e8c4174af71..3e5103d319a 100644 --- a/htdocs/contact/list.php +++ b/htdocs/contact/list.php @@ -72,6 +72,7 @@ $search_firstlast_only = GETPOST("search_firstlast_only", 'alpha'); $search_lastname = GETPOST("search_lastname", 'alpha'); $search_firstname = GETPOST("search_firstname", 'alpha'); $search_societe = GETPOST("search_societe", 'alpha'); +$search_societe_alias = GETPOST("search_societe_alias", 'alpha'); $search_poste = GETPOST("search_poste", 'alpha'); $search_phone_perso = GETPOST("search_phone_perso", 'alpha'); $search_phone_pro = GETPOST("search_phone_pro", 'alpha'); @@ -192,6 +193,7 @@ foreach ($object->fields as $key => $val) { // Add none object fields for "search in all" if (empty($conf->global->SOCIETE_DISABLE_CONTACTS)) { $fieldstosearchall['s.nom'] = "ThirdParty"; + $fieldstosearchall['s.name_alias'] = "AliasNames"; } // Definition of fields for list @@ -213,6 +215,7 @@ foreach ($object->fields as $key => $val) { $arrayfields['country.code_iso'] = array('label'=>"Country", 'position'=>66, 'checked'=>0); if (empty($conf->global->SOCIETE_DISABLE_CONTACTS)) { $arrayfields['s.nom'] = array('label'=>"ThirdParty", 'position'=>113, 'checked'=> 1); + $arrayfields['s.name_alias'] = array('label'=>"AliasNameShort", 'position'=>114, 'checked'=> 1); } $arrayfields['unsubscribed'] = array( @@ -277,6 +280,7 @@ if (empty($reshook)) { $search_lastname = ""; $search_firstname = ""; $search_societe = ""; + $search_societe_alias = ""; $search_town = ""; $search_address = ""; $search_zip = ""; @@ -372,7 +376,7 @@ if ($resql) { dol_print_error($db); } -$sql = "SELECT s.rowid as socid, s.nom as name,"; +$sql = "SELECT s.rowid as socid, s.nom as name, s.name_alias as alias,"; $sql .= " p.rowid, p.lastname as lastname, p.statut, p.firstname, p.address, p.zip, p.town, p.poste, p.email,"; $sql .= " p.socialnetworks, p.photo,"; $sql .= " p.phone as phone_pro, p.phone_mobile, p.phone_perso, p.fax, p.fk_pays, p.priv, p.datec as date_creation, p.tms as date_update,"; @@ -544,8 +548,15 @@ if ($search_lastname) { if ($search_firstname) { $sql .= natural_search('p.firstname', $search_firstname); } -if ($search_societe) { - $sql .= natural_search(empty($conf->global->SOCIETE_DISABLE_CONTACTS) ? 's.nom' : 'p.fk_soc', $search_societe); +if (empty($arrayfields['s.name_alias']['checked']) && $search_societe) { + $sql .= natural_search(array("s.nom", "s.name_alias"), $search_societe); +} else { + if ($search_societe) { + $sql .= natural_search('s.nom', $search_societe); + } + if ($search_societe_alias) { + $sql .= natural_search('s.name_alias', $search_societe_alias); + } } if ($search_country) { $sql .= " AND p.fk_pays IN (".$db->sanitize($search_country).')'; @@ -676,6 +687,9 @@ if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && ( exit; } +$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage; +$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields + $help_url = 'EN:Module_Third_Parties|FR:Module_Tiers|ES:Módulo_Empresas'; llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', 'bodyforlist'); @@ -712,6 +726,9 @@ if ($search_firstname != '') { if ($search_societe != '') { $param .= '&search_societe='.urlencode($search_societe); } +if ($search_societe_alias != '') { + $param .= '&search_societe_alias='.urlencode($search_societe_alias); +} if ($search_address != '') { $param .= '&search_address='.urlencode($search_address); } @@ -984,6 +1001,12 @@ if (!empty($arrayfields['p.fk_soc']['checked']) || !empty($arrayfields['s.nom'][ print ''; print ''; } +// Alias +if (!empty($arrayfields['s.name_alias']['checked'])) { + print ''; +} if (!empty($arrayfields['p.priv']['checked'])) { print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Private/Public if (!empty($arrayfields['p.priv']['checked'])) { print ''; From 07ba47dff8a89f9e37d2cbdda66ce67838f8ed82 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 2 Jan 2023 16:31:38 +0100 Subject: [PATCH 0518/1128] css --- htdocs/theme/eldy/global.inc.php | 5 +++++ htdocs/theme/md/style.css.php | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index daeb574a9dd..fe18193910d 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -171,6 +171,11 @@ table.liste th.wrapcolumntitle.liste_titre_sel:not(.maxwidthsearch), table.liste max-width: 100px; text-overflow: ellipsis; } +th.wrapcolumntitle dl dt a span.fas.fa-list { + padding-bottom: 0; + vertical-align: bottom; +} + /*.liste_titre input[name=month_date_when], .liste_titre input[name=monthvalid], .liste_titre input[name=search_ordermonth], .liste_titre input[name=search_deliverymonth], .liste_titre input[name=search_smonth], .liste_titre input[name=search_month], .liste_titre input[name=search_emonth], .liste_titre input[name=smonth], .liste_titre input[name=month], .liste_titre select[name=month], .liste_titre select[name=year], diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index b4ff8bb18b6..b59eb7ebd10 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -485,6 +485,11 @@ th.wrapcolumntitle.liste_titre_sel:not(.maxwidthsearch), td.wrapcolumntitle.list max-width: 120px; text-overflow: ellipsis; } +th.wrapcolumntitle dl dt a span.fas.fa-list { + padding-bottom: 0; + vertical-align: bottom; +} + .liste_titre input[name=month_date_when], .liste_titre input[name=monthvalid], .liste_titre input[name=search_ordermonth], .liste_titre input[name=search_deliverymonth], .liste_titre input[name=search_smonth], .liste_titre input[name=search_month], .liste_titre input[name=search_emonth], .liste_titre input[name=smonth], .liste_titre input[name=month], .liste_titre input[name=month_lim], .liste_titre input[name=month_start], .liste_titre input[name=month_end], .liste_titre input[name=month_create], From c84d17eced5d2a922b89b85a30ba61f6b680dbcf Mon Sep 17 00:00:00 2001 From: Gauthier PC portable 024 Date: Mon, 2 Jan 2023 16:58:33 +0100 Subject: [PATCH 0519/1128] FIX : filter only if t.task_duration checked --- htdocs/projet/tasks/time.php | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index 8c98e6387b1..6652b57304a 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -1629,16 +1629,20 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser $sql .= " AND t.task_date <= '".$db->idate($search_date_end)."'"; } - if($search_timespent_starthour || $search_timespent_startmin) { - $timespent_duration_start = $search_timespent_starthour * 60 * 60; // We store duration in seconds - $timespent_duration_start += ($search_timespent_startmin ? $search_timespent_startmin : 0) * 60; // We store duration in seconds - $sql .= " AND t.task_duration >= ".$timespent_duration_start; - } + if (!empty($arrayfields['t.task_duration']['checked'])) { - if($search_timespent_endhour || $search_timespent_endmin) { - $timespent_duration_end = $search_timespent_endhour * 60 * 60; // We store duration in seconds - $timespent_duration_end += ($search_timespent_endmin ? $search_timespent_endmin : 0) * 60; // We store duration in seconds - $sql .= " AND t.task_duration <= ".$timespent_duration_end; + if ($search_timespent_starthour || $search_timespent_startmin) { + $timespent_duration_start = $search_timespent_starthour * 60 * 60; // We store duration in seconds + $timespent_duration_start += ($search_timespent_startmin ? $search_timespent_startmin : 0) * 60; // We store duration in seconds + $sql .= " AND t.task_duration >= " . $timespent_duration_start; + } + + if ($search_timespent_endhour || $search_timespent_endmin) { + $timespent_duration_end = $search_timespent_endhour * 60 * 60; // We store duration in seconds + $timespent_duration_end += ($search_timespent_endmin ? $search_timespent_endmin : 0) * 60; // We store duration in seconds + $sql .= " AND t.task_duration <= " . $timespent_duration_end; + } + } $sql .= dolSqlDateFilter('t.task_datehour', $search_day, $search_month, $search_year); From c3f44859ae61968e1db1d6846f53777201eed225 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 2 Jan 2023 17:33:11 +0100 Subject: [PATCH 0520/1128] Debug v17 --- htdocs/admin/oauth.php | 7 ++++--- htdocs/admin/oauthlogintokens.php | 8 +++++++- htdocs/core/modules/oauth/google_oauthcallback.php | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/htdocs/admin/oauth.php b/htdocs/admin/oauth.php index 64968b1a516..217dfd63cc9 100644 --- a/htdocs/admin/oauth.php +++ b/htdocs/admin/oauth.php @@ -285,7 +285,7 @@ if (count($listinsetup) > 0) { // Delete print ''; print ''; - print ''; print ''; print ''; @@ -306,7 +307,7 @@ if (count($listinsetup) > 0) { if ($keyforsupportedoauth2array == 'OAUTH_OTHER_NAME') { print ''; print ''; - print ''; print ''; print ''; diff --git a/htdocs/admin/oauthlogintokens.php b/htdocs/admin/oauthlogintokens.php index f798995d525..9a0532880cd 100644 --- a/htdocs/admin/oauthlogintokens.php +++ b/htdocs/admin/oauthlogintokens.php @@ -213,7 +213,13 @@ if ($mode == 'setup' && $user->admin) { $urltocheckperms = ''; } - $urltorenew .= '&keyforprovider='.urlencode($keyforprovider); + if ($urltorenew) { + $urltorenew .= '&keyforprovider='.urlencode($keyforprovider); + } + if ($urltodelete) { + $urltodelete .= '&keyforprovider='.urlencode($keyforprovider); + } + // Show value of token $tokenobj = null; diff --git a/htdocs/core/modules/oauth/google_oauthcallback.php b/htdocs/core/modules/oauth/google_oauthcallback.php index b993cbdd81e..80c39d85158 100644 --- a/htdocs/core/modules/oauth/google_oauthcallback.php +++ b/htdocs/core/modules/oauth/google_oauthcallback.php @@ -42,7 +42,7 @@ $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; // This is to use external domai $action = GETPOST('action', 'aZ09'); $backtourl = GETPOST('backtourl', 'alpha'); $keyforprovider = GETPOST('keyforprovider', 'aZ09'); -if (empty($keyforprovider) && !empty($_SESSION["oauthkeyforproviderbeforeoauthjump"]) && (GETPOST('code') || $action == 'delete')) { +if (!GETPOSTISSET('keyforprovider', 'aZ09') && !empty($_SESSION["oauthkeyforproviderbeforeoauthjump"]) && (GETPOST('code') || $action == 'delete')) { // If we are coming from the Oauth page $keyforprovider = $_SESSION["oauthkeyforproviderbeforeoauthjump"]; } From 4ddf0b27dc10268344c35e5db9c998af794270d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20N=C3=BA=C3=B1ez?= Date: Mon, 2 Jan 2023 18:15:33 +0100 Subject: [PATCH 0521/1128] NEW create email substitution variable for intervention signature URL --- htdocs/core/lib/functions.lib.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 977342b1457..d5c3652ebdb 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -7659,6 +7659,9 @@ function getCommonSubstitutionArray($outputlangs, $onlykey = 0, $exclude = null, if (isModEnabled("propal") && (!is_object($object) || $object->element == 'propal')) { $substitutionarray['__ONLINE_SIGN_URL__'] = 'ToOfferALinkForOnlineSignature'; } + if (isModEnabled("ficheinter") && (!is_object($object) || $object->element == 'fichinter')) { + $substitutionarray['__ONLINE_SIGN_FICHINTER_URL__'] = 'ToOfferALinkForOnlineSignature'; + } $substitutionarray['__ONLINE_PAYMENT_URL__'] = 'UrlToPayOnlineIfApplicable'; $substitutionarray['__ONLINE_PAYMENT_TEXT_AND_URL__'] = 'TextAndUrlToPayOnlineIfApplicable'; $substitutionarray['__SECUREKEYPAYMENT__'] = 'Security key (if key is not unique per record)'; @@ -7929,6 +7932,10 @@ function getCommonSubstitutionArray($outputlangs, $onlykey = 0, $exclude = null, require_once DOL_DOCUMENT_ROOT.'/core/lib/signature.lib.php'; $substitutionarray['__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0, 'proposal', $object->ref); } + if (is_object($object) && $object->element == 'fichinter') { + require_once DOL_DOCUMENT_ROOT.'/core/lib/signature.lib.php'; + $substitutionarray['__ONLINE_SIGN_FICHINTER_URL__'] = getOnlineSignatureUrl(0, 'fichinter', $object->ref); + } if (!empty($conf->global->PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD) && is_object($object) && $object->element == 'propal') { $substitutionarray['__DIRECTDOWNLOAD_URL_PROPOSAL__'] = $object->getLastMainDocLink($object->element); } else { From 6a085ad60246dd4d73b8943959ef61d2bd2d3127 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 2 Jan 2023 19:01:15 +0100 Subject: [PATCH 0522/1128] css --- htdocs/theme/eldy/global.inc.php | 2 +- htdocs/theme/md/style.css.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index b4ff1774054..46e34549731 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -172,7 +172,7 @@ table.liste th.wrapcolumntitle.liste_titre_sel:not(.maxwidthsearch), table.liste text-overflow: ellipsis; } th.wrapcolumntitle dl dt a span.fas.fa-list { - padding-bottom: 0; + padding-bottom: 1px; vertical-align: bottom; } diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 59cadcb3763..9a341e56b3b 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -486,7 +486,7 @@ th.wrapcolumntitle.liste_titre_sel:not(.maxwidthsearch), td.wrapcolumntitle.list text-overflow: ellipsis; } th.wrapcolumntitle dl dt a span.fas.fa-list { - padding-bottom: 0; + padding-bottom: 1px; vertical-align: bottom; } From 9478cd6ad320a43c67006c9d354f84c2fbae1359 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 2 Jan 2023 19:09:27 +0100 Subject: [PATCH 0523/1128] Doc --- ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index bbb01cfd3cf..68b22cc4f8d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -166,7 +166,7 @@ NEW: show product label on inventory NEW: show sell-by and eat-by dates only if not empty NEW: show SellBy/EatBy dates for each batch product in shipment card NEW: skip accept/refuse process for proposals (option PROPAL_SKIP_ACCEPT_REFUSE) -NEW: SMTP using oauth2 authentication +NEW: experimental SMTP using PhpImap allowing OAuth2 authentication (need to add option MAIN_IMAP_USE_PHPIMAP) NEW: can substitue project title in mail template NEW: Supplier order list - Add column private and public note NEW: Support IP type in extrafields From 3147c3a8d2548060db1fed4d4700b11ac0ecf845 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 2 Jan 2023 19:01:15 +0100 Subject: [PATCH 0524/1128] css --- htdocs/theme/eldy/global.inc.php | 2 +- htdocs/theme/md/style.css.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index fe18193910d..de4b84b5975 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -172,7 +172,7 @@ table.liste th.wrapcolumntitle.liste_titre_sel:not(.maxwidthsearch), table.liste text-overflow: ellipsis; } th.wrapcolumntitle dl dt a span.fas.fa-list { - padding-bottom: 0; + padding-bottom: 1px; vertical-align: bottom; } diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index b59eb7ebd10..78b962aa87d 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -486,7 +486,7 @@ th.wrapcolumntitle.liste_titre_sel:not(.maxwidthsearch), td.wrapcolumntitle.list text-overflow: ellipsis; } th.wrapcolumntitle dl dt a span.fas.fa-list { - padding-bottom: 0; + padding-bottom: 1px; vertical-align: bottom; } From d62fb2af64eea3dab5bd1c20826f43f4f4f9edfe Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 2 Jan 2023 20:15:34 +0100 Subject: [PATCH 0525/1128] css --- htdocs/core/lib/functions.lib.php | 2 +- htdocs/societe/list.php | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 4724bf85d50..a600761d9b9 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -2198,7 +2198,7 @@ function dol_banner_tab($object, $paramid, $morehtml = '', $shownav = 1, $fieldi // If the preview file is found if (file_exists($fileimage)) { $phototoshow = '
'; - $phototoshow .= ''; + $phototoshow .= ''; $phototoshow .= '
'; } } diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php index 84a8d355c1a..f0ef18e4dfd 100644 --- a/htdocs/societe/list.php +++ b/htdocs/societe/list.php @@ -113,6 +113,7 @@ $place = GETPOST('place', 'aZ09') ? GETPOST('place', 'aZ09') : '0'; // $place is $diroutputmassaction = $conf->societe->dir_output.'/temp/massgeneration/'.$user->id; +// Load variable for pagination $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit; $sortfield = GETPOST('sortfield', 'aZ09comma'); $sortorder = GETPOST('sortorder', 'aZ09comma'); @@ -770,6 +771,7 @@ $num = $db->num_rows($resql); $arrayofselected = is_array($toselect) ? $toselect : array(); +// Direct jump if only one record found if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && ($search_all != '' || $search_cti != '') && $action != 'list') { $obj = $db->fetch_object($resql); $id = $obj->rowid; @@ -1011,6 +1013,7 @@ foreach (array(1, 2, 3, 4, 5, 6) as $key) { } } +// Add code for pre mass action (confirmation or email presend form) $topicmail = "Information"; $modelmail = "thirdparty"; $objecttmp = new Societe($db); From 2dfb8c049683153e257610600d730801e053ef59 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 2 Jan 2023 20:26:46 +0100 Subject: [PATCH 0526/1128] Clean code --- htdocs/core/lib/files.lib.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index 82831424ccd..47b3955e617 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -1991,7 +1991,6 @@ function deleteFilesIntoDatabaseIndex($dir, $file, $mode = 'uploaded') */ function dol_convert_file($fileinput, $ext = 'png', $fileoutput = '', $page = '') { - global $langs; if (class_exists('Imagick')) { $image = new Imagick(); try { From 94fb344bd67c5910b8e681d74e7677e864270ea7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 3 Jan 2023 02:02:34 +0100 Subject: [PATCH 0527/1128] FIX #22271 --- htdocs/imports/import.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/htdocs/imports/import.php b/htdocs/imports/import.php index dfe2d0b9d49..a6982bd0a4e 100644 --- a/htdocs/imports/import.php +++ b/htdocs/imports/import.php @@ -815,18 +815,22 @@ if ($step == 4 && $datatoimport) { $array_match_file_to_database = array(); } - // Load source fields in input file + // Load the source fields from input file into variable $arrayrecord $fieldssource = array(); $result = $obj->import_open_file($conf->import->dir_temp.'/'.$filetoimport, $langs); if ($result >= 0) { // Read first line $arrayrecord = $obj->import_read_record(); - // Put into array fieldssource starting with 1. + + // Create array $fieldssource starting with 1 with values found of first line. $i = 1; foreach ($arrayrecord as $key => $val) { if ($val["type"] != -1) { $fieldssource[$i]['example1'] = dol_trunc($val['val'], 128); $i++; + } else { + $fieldssource[$i]['example1'] = $langs->trans('Empty'); + $i++; } } $obj->import_close_file(); From 496cff016713848127b458ef027d9dc64ea05eb0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 3 Jan 2023 02:29:49 +0100 Subject: [PATCH 0528/1128] Debug v17 --- htdocs/accountancy/admin/account.php | 77 ++++++++++++++----- htdocs/accountancy/bookkeeping/list.php | 10 +++ .../accountancy/bookkeeping/listbyaccount.php | 10 +++ htdocs/langs/en_US/accountancy.lang | 2 + 4 files changed, 80 insertions(+), 19 deletions(-) diff --git a/htdocs/accountancy/admin/account.php b/htdocs/accountancy/admin/account.php index 21d60103135..91b7673ab81 100644 --- a/htdocs/accountancy/admin/account.php +++ b/htdocs/accountancy/admin/account.php @@ -47,6 +47,7 @@ $search_label = GETPOST('search_label', 'alpha'); $search_labelshort = GETPOST('search_labelshort', 'alpha'); $search_accountparent = GETPOST('search_accountparent', 'alpha'); $search_pcgtype = GETPOST('search_pcgtype', 'alpha'); +$search_import_key = GETPOST('search_import_key', 'alpha'); $toselect = GETPOST('toselect', 'array'); $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit; $confirm = GETPOST('confirm', 'alpha'); @@ -83,16 +84,19 @@ if (!$sortorder) { } $arrayfields = array( - 'aa.account_number'=>array('label'=>$langs->trans("AccountNumber"), 'checked'=>1), - 'aa.label'=>array('label'=>$langs->trans("Label"), 'checked'=>1), - 'aa.labelshort'=>array('label'=>$langs->trans("LabelToShow"), 'checked'=>1), - 'aa.account_parent'=>array('label'=>$langs->trans("Accountparent"), 'checked'=>1), - 'aa.pcg_type'=>array('label'=>$langs->trans("Pcgtype"), 'checked'=>1, 'help'=>'PcgtypeDesc'), - 'aa.reconcilable'=>array('label'=>$langs->trans("Reconcilable"), 'checked'=>1), - 'aa.active'=>array('label'=>$langs->trans("Activated"), 'checked'=>1) + 'aa.account_number'=>array('label'=>"AccountNumber", 'checked'=>1), + 'aa.label'=>array('label'=>"Label", 'checked'=>1), + 'aa.labelshort'=>array('label'=>"LabelToShow", 'checked'=>1), + 'aa.account_parent'=>array('label'=>"Accountparent", 'checked'=>1), + 'aa.pcg_type'=>array('label'=>"Pcgtype", 'checked'=>1, 'help'=>'PcgtypeDesc'), + 'categories'=>array('label'=>"AccountingCategories", 'checked'=>-1, 'help'=>'AccountingCategoriesDesc'), + 'aa.reconcilable'=>array('label'=>"Reconcilable", 'checked'=>1), + 'aa.active'=>array('label'=>"Activated", 'checked'=>1), + 'aa.import_key'=>array('label'=>"ImportId", 'checked'=>-1) ); if ($conf->global->MAIN_FEATURES_LEVEL < 2) { + unset($arrayfields['categories']); unset($arrayfields['aa.reconcilable']); } @@ -226,15 +230,12 @@ if ($action == 'delete') { $pcgver = $conf->global->CHARTOFACCOUNTS; -$sql = "SELECT aa.rowid, aa.fk_pcg_version, aa.pcg_type, aa.account_number, aa.account_parent , aa.label, aa.labelshort, aa.reconcilable, aa.active, "; +$sql = "SELECT aa.rowid, aa.fk_pcg_version, aa.pcg_type, aa.account_number, aa.account_parent, aa.label, aa.labelshort, aa.fk_accounting_category,"; +$sql .= " aa.reconcilable, aa.active, aa.import_key,"; $sql .= " a2.rowid as rowid2, a2.label as label2, a2.account_number as account_number2"; $sql .= " FROM ".MAIN_DB_PREFIX."accounting_account as aa"; -$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."accounting_system as asy ON aa.fk_pcg_version = asy.pcg_version AND aa.entity = ".$conf->entity; -if ($db->type == 'pgsql') { - $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."accounting_account as a2 ON a2.rowid = aa.account_parent AND a2.entity = ".$conf->entity; -} else { - $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."accounting_account as a2 ON a2.rowid = aa.account_parent AND a2.entity = ".$conf->entity; -} +$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."accounting_system as asy ON aa.fk_pcg_version = asy.pcg_version AND aa.entity = ".((int) $conf->entity); +$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."accounting_account as a2 ON a2.rowid = aa.account_parent AND a2.entity = ".((int) $conf->entity); $sql .= " WHERE asy.rowid = ".((int) $pcgver); //print $sql; if (strlen(trim($search_account))) { @@ -337,6 +338,9 @@ if ($resql) { if ($search_pcgtype) { $param .= '&search_pcgtype='.urlencode($search_pcgtype); } + if ($optioncss != '') { + $param .= '&search_import_key='.urlencode($search_import_key); + } if ($optioncss != '') { $param .= '&optioncss='.urlencode($optioncss); } @@ -439,8 +443,17 @@ if ($resql) { print $formaccounting->select_account($search_accountparent, 'search_accountparent', 2, array(), 0, 0, 'maxwidth150'); print ''; } + // Predefined group if (!empty($arrayfields['aa.pcg_type']['checked'])) { - print '
'; + print ''; + } + // Custom groups + if (!empty($arrayfields['categories']['checked'])) { + print ''; + } + // Import key + if (!empty($arrayfields['aa.import_key']['checked'])) { + print ''; } if ($conf->global->MAIN_FEATURES_LEVEL >= 2) { if (!empty($arrayfields['aa.reconcilable']['checked'])) { @@ -471,6 +484,12 @@ if ($resql) { if (!empty($arrayfields['aa.pcg_type']['checked'])) { print_liste_field_titre($arrayfields['aa.pcg_type']['label'], $_SERVER["PHP_SELF"], 'aa.pcg_type,aa.account_number', '', $param, '', $sortfield, $sortorder, '', $arrayfields['aa.pcg_type']['help'], 1); } + if (!empty($arrayfields['categories']['checked'])) { + print_liste_field_titre($arrayfields['categories']['label'], $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, '', $arrayfields['categories']['help'], 1); + } + if (!empty($arrayfields['aa.import_key']['checked'])) { + print_liste_field_titre($arrayfields['aa.import_key']['label'], $_SERVER["PHP_SELF"], 'aa.import_key', '', $param, '', $sortfield, $sortorder, '', $arrayfields['aa.import_key']['help'], 1); + } if ($conf->global->MAIN_FEATURES_LEVEL >= 2) { if (!empty($arrayfields['aa.reconcilable']['checked'])) { print_liste_field_titre($arrayfields['aa.reconcilable']['label'], $_SERVER["PHP_SELF"], 'aa.reconcilable', '', $param, '', $sortfield, $sortorder); @@ -505,7 +524,7 @@ if ($resql) { // Account label if (!empty($arrayfields['aa.label']['checked'])) { print "\n"; if (!$i) { $totalarray['nbfield']++; @@ -515,7 +534,7 @@ if ($resql) { // Account label to show (label short) if (!empty($arrayfields['aa.labelshort']['checked'])) { print "\n"; if (!$i) { $totalarray['nbfield']++; @@ -549,10 +568,30 @@ if ($resql) { } } - // Chart of accounts type + // Predefined group (deprecated) if (!empty($arrayfields['aa.pcg_type']['checked'])) { print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Custom accounts + if (!empty($arrayfields['categories']['checked'])) { + print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Import id + if (!empty($arrayfields['aa.import_key']['checked'])) { + print "\n"; if (!$i) { $totalarray['nbfield']++; diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php index 2b2df70d647..fa42b5bd6fd 100644 --- a/htdocs/accountancy/bookkeeping/list.php +++ b/htdocs/accountancy/bookkeeping/list.php @@ -1511,6 +1511,16 @@ while ($i < min($num, $limit)) { // Show total line include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php'; +// If no record found +if ($num == 0) { + $colspan = 1; + foreach ($arrayfields as $key => $val) { + if (!empty($val['checked'])) { + $colspan++; + } + } + print ''; +} $parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql); $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook diff --git a/htdocs/accountancy/bookkeeping/listbyaccount.php b/htdocs/accountancy/bookkeeping/listbyaccount.php index 4a6e37ceb29..29596f0a124 100644 --- a/htdocs/accountancy/bookkeeping/listbyaccount.php +++ b/htdocs/accountancy/bookkeeping/listbyaccount.php @@ -1232,6 +1232,16 @@ if ($num > 0 && $colspan > 0) { // Show total line include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php'; +// If no record found +if ($num == 0) { + $colspan = 1; + foreach ($arrayfields as $key => $val) { + if (!empty($val['checked'])) { + $colspan++; + } + } + print ''; +} $parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql); $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang index b6bf1b90aef..9822a52e8f0 100644 --- a/htdocs/langs/en_US/accountancy.lang +++ b/htdocs/langs/en_US/accountancy.lang @@ -218,6 +218,7 @@ JournalLabel=Journal label NumPiece=Piece number TransactionNumShort=Num. transaction AccountingCategory=Custom group +AccountingCategories=Custom groups GroupByAccountAccounting=Group by general ledger account GroupBySubAccountAccounting=Group by subledger account AccountingAccountGroupsDesc=You can define here some groups of accounting account. They will be used for personalized accounting reports. @@ -265,6 +266,7 @@ ShowSubtotalByGroup=Show subtotal by level Pcgtype=Group of account PcgtypeDesc=Group of account are used as predefined 'filter' and 'grouping' criteria for some accounting reports. For example, 'INCOME' or 'EXPENSE' are used as groups for accounting accounts of products to build the expense/income report. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Reconcilable From 61ec6f5226f0d7d1d0c92e8e0cceb4452cd3a004 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 3 Jan 2023 02:44:38 +0100 Subject: [PATCH 0529/1128] Doc --- htdocs/core/doxygen.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/doxygen.php b/htdocs/core/doxygen.php index ac66362a89f..06a2510dfef 100644 --- a/htdocs/core/doxygen.php +++ b/htdocs/core/doxygen.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2008-2022 Laurent Destailleur * Copyright (C) 2009 Regis Houssin * * This program is free software; you can redistribute it and/or modify @@ -23,7 +23,7 @@ * \mainpage Dolibarr project * * This is source documentation for Dolibarr ERP/CRM.
- * This documentation can be built or updated running the script dolibarr-doxygen-build.pl or from Eclipse with Doxygen plugin.
+ * This documentation can be built or updated running the script build/doxygen/dolibarr-doxygen-build.pl or from Eclipse with Doxygen plugin.
*
* Dolibarr official web site: www.dolibarr.org
*
From a0a6ab72415e85431b51d982e6f16b2afad84d2d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 3 Jan 2023 02:46:05 +0100 Subject: [PATCH 0530/1128] Doc --- htdocs/core/doxygen.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/doxygen.php b/htdocs/core/doxygen.php index 06a2510dfef..1e66b348ef8 100644 --- a/htdocs/core/doxygen.php +++ b/htdocs/core/doxygen.php @@ -20,7 +20,7 @@ /** * \file htdocs/core/doxygen.php * \ingroup core - * \mainpage Dolibarr project + * \mainpage Dolibarr documentation of source code * * This is source documentation for Dolibarr ERP/CRM.
* This documentation can be built or updated running the script build/doxygen/dolibarr-doxygen-build.pl or from Eclipse with Doxygen plugin.
From 5978f404614fc31fe35f9d904152636fcd2d1fde Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 3 Jan 2023 10:27:54 +0100 Subject: [PATCH 0531/1128] Fix user status --- htdocs/societe/list.php | 2 +- htdocs/user/class/user.class.php | 12 +++++++++--- htdocs/user/list.php | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php index 129e6ed63d4..3e69b1ff76e 100644 --- a/htdocs/societe/list.php +++ b/htdocs/societe/list.php @@ -1314,7 +1314,7 @@ if (!empty($arrayfields['s.tms']['checked'])) { // Status if (!empty($arrayfields['s.status']['checked'])) { print '
'; } if (!empty($arrayfields['s.import_key']['checked'])) { diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index ebc49db57d3..a3445e3939f 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -436,7 +436,7 @@ class User extends CommonObject $sql .= " u.admin, u.login, u.note_private, u.note_public,"; $sql .= " u.pass, u.pass_crypted, u.pass_temp, u.api_key,"; $sql .= " u.fk_soc, u.fk_socpeople, u.fk_member, u.fk_user, u.ldap_sid, u.fk_user_expense_validator, u.fk_user_holiday_validator,"; - $sql .= " u.statut, u.lang, u.entity,"; + $sql .= " u.statut as status, u.lang, u.entity,"; $sql .= " u.datec as datec,"; $sql .= " u.tms as datem,"; $sql .= " u.datelastlogin as datel,"; @@ -553,7 +553,10 @@ class User extends CommonObject $this->note_public = $obj->note_public; $this->note_private = $obj->note_private; $this->note = $obj->note_private; // deprecated - $this->statut = $obj->statut; + + $this->statut = $obj->status; // deprecated + $this->status = $obj->status; + $this->photo = $obj->photo; $this->openid = $obj->openid; $this->lang = $obj->lang; @@ -1349,7 +1352,10 @@ class User extends CommonObject $error = 0; // Check parameters - if ($this->statut == $status) { + if (isset($this->statut) && $this->statut == $status) { + return 0; + } + if (isset($this->status) && $this->status == $status) { return 0; } diff --git a/htdocs/user/list.php b/htdocs/user/list.php index 8610113f0da..d3139b438e2 100644 --- a/htdocs/user/list.php +++ b/htdocs/user/list.php @@ -800,7 +800,7 @@ if (!empty($arrayfields['u.tms']['checked'])) { if (!empty($arrayfields['u.statut']['checked'])) { // Status print ''; } // Action column From 37ce175d538a2382334b914dbf071976a41a7896 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 3 Jan 2023 10:27:54 +0100 Subject: [PATCH 0532/1128] Fix user status --- htdocs/societe/list.php | 2 +- htdocs/user/class/user.class.php | 12 +++++++++--- htdocs/user/list.php | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php index f0ef18e4dfd..96666b28d8c 100644 --- a/htdocs/societe/list.php +++ b/htdocs/societe/list.php @@ -1311,7 +1311,7 @@ if (!empty($arrayfields['s.tms']['checked'])) { // Status if (!empty($arrayfields['s.status']['checked'])) { print ''; } if (!empty($arrayfields['s.import_key']['checked'])) { diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index dddcaa0ca6a..744e24fe15a 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -436,7 +436,7 @@ class User extends CommonObject $sql .= " u.admin, u.login, u.note_private, u.note_public,"; $sql .= " u.pass, u.pass_crypted, u.pass_temp, u.api_key,"; $sql .= " u.fk_soc, u.fk_socpeople, u.fk_member, u.fk_user, u.ldap_sid, u.fk_user_expense_validator, u.fk_user_holiday_validator,"; - $sql .= " u.statut, u.lang, u.entity,"; + $sql .= " u.statut as status, u.lang, u.entity,"; $sql .= " u.datec as datec,"; $sql .= " u.tms as datem,"; $sql .= " u.datelastlogin as datel,"; @@ -553,7 +553,10 @@ class User extends CommonObject $this->note_public = $obj->note_public; $this->note_private = $obj->note_private; $this->note = $obj->note_private; // deprecated - $this->statut = $obj->statut; + + $this->statut = $obj->status; // deprecated + $this->status = $obj->status; + $this->photo = $obj->photo; $this->openid = $obj->openid; $this->lang = $obj->lang; @@ -1350,7 +1353,10 @@ class User extends CommonObject $error = 0; // Check parameters - if ($this->statut == $status) { + if (isset($this->statut) && $this->statut == $status) { + return 0; + } + if (isset($this->status) && $this->status == $status) { return 0; } diff --git a/htdocs/user/list.php b/htdocs/user/list.php index 8610113f0da..d3139b438e2 100644 --- a/htdocs/user/list.php +++ b/htdocs/user/list.php @@ -800,7 +800,7 @@ if (!empty($arrayfields['u.tms']['checked'])) { if (!empty($arrayfields['u.statut']['checked'])) { // Status print ''; } // Action column From 9f02bd2350ed9b256c7f2d978cb9514e521df3e7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 3 Jan 2023 11:32:33 +0100 Subject: [PATCH 0533/1128] Debug v17 --- htdocs/user/class/user.class.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 744e24fe15a..e90252877d1 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -1353,10 +1353,11 @@ class User extends CommonObject $error = 0; // Check parameters - if (isset($this->statut) && $this->statut == $status) { - return 0; - } - if (isset($this->status) && $this->status == $status) { + if (isset($this->statut)) { + if ($this->statut == $status) { + return 0; + } + } elseif (isset($this->status) && $this->status == $status) { return 0; } @@ -3259,7 +3260,8 @@ class User extends CommonObject $this->iplastlogin = '127.0.0.1'; $this->datepreviouslogin = $now; $this->ippreviouslogin = '127.0.0.1'; - $this->statut = 1; + $this->statut = 1; // deprecated + $this->status = 1; $this->entity = 1; return 1; From 797b9c90548f27755cb5c68c9acb7cd9f780eeb8 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Tue, 3 Jan 2023 11:42:39 +0100 Subject: [PATCH 0534/1128] dfelete cem data on product deletion --- htdocs/product/class/product.class.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 0900f11ed29..e133e1a42f4 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -1408,6 +1408,14 @@ class Product extends CommonObject } } + // Delete record into ECM index and physically + if (!$error) { + $res = $this->deleteEcmFiles(0); // Deleting files physically is done later with the dol_delete_dir_recursive + if (!$res) { + $error++; + } + } + if (!$error) { // We remove directory $ref = dol_sanitizeFileName($this->ref); From ea1ad5243f7b3e4f96b99c6a6edcc1c3072a04f7 Mon Sep 17 00:00:00 2001 From: Florent Poinsaut Date: Thu, 22 Dec 2022 16:31:55 +0000 Subject: [PATCH 0535/1128] fix supplier invoice import --- htdocs/core/modules/modFournisseur.class.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/htdocs/core/modules/modFournisseur.class.php b/htdocs/core/modules/modFournisseur.class.php index 7bd10fcaf9b..b6286c35162 100644 --- a/htdocs/core/modules/modFournisseur.class.php +++ b/htdocs/core/modules/modFournisseur.class.php @@ -587,6 +587,9 @@ class modFournisseur extends DolibarrModules } // End add extra fields $this->import_fieldshidden_array[$r] = array('extra.fk_object' => 'lastrowid-'.MAIN_DB_PREFIX.'facture_fourn'); + if (empty($conf->multicurrency->enabled)) { + $this->import_fieldshidden_array[$r]['f.multicurrency_code'] = 'const-'.$conf->currency; + } $this->import_regex_array[$r] = array('f.ref' => '(SI\d{4}-\d{4}|PROV.{1,32}$)', 'f.multicurrency_code' => 'code@'.MAIN_DB_PREFIX.'multicurrency'); $import_sample = array( 'f.ref' => '(PROV001)', From 7fd82ccc45d59409c40bc3c29feb4b13b4553fd1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 3 Jan 2023 12:08:04 +0100 Subject: [PATCH 0536/1128] NEW formconfirm can support field with format datetime --- htdocs/core/class/html.form.class.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 6655215a4f7..71df1296fc7 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -5010,7 +5010,7 @@ class Form * @param string $question Question * @param string $action Action * @param array|string $formquestion An array with complementary inputs to add into forms: array(array('label'=> ,'type'=> , 'size'=>, 'morecss'=>, 'moreattr'=>'autofocus' or 'style=...')) - * 'type' can be 'text', 'password', 'checkbox', 'radio', 'date', 'select', 'multiselect', 'morecss', + * 'type' can be 'text', 'password', 'checkbox', 'radio', 'date', 'datetime', 'select', 'multiselect', 'morecss', * 'other', 'onecolumn' or 'hidden'... * @param int|string $selectedchoice '' or 'no', or 'yes' or '1', 1, '0' or 0 * @param int|string $useajax 0=No, 1=Yes use Ajax to show the popup, 2=Yes and also submit page with &confirm=no if choice is No, 'xxx'=Yes and preoutput confirm box with div id=dialog-confirm-xxx @@ -5141,11 +5141,11 @@ class Form $more .= ''."\n"; $i++; } - } elseif ($input['type'] == 'date') { + } elseif ($input['type'] == 'date' || $input['type'] == 'datetime') { $more .= '
'.$input['label'].'
'; $more .= '
'; $addnowlink = (empty($input['datenow']) ? 0 : 1); - $more .= $this->selectDate($input['value'], $input['name'], 0, 0, 0, '', 1, $addnowlink); + $more .= $this->selectDate($input['value'], $input['name'], ($input['type'] == 'datetime' ? 1 : 0), ($input['type'] == 'datetime' ? 1 : 0), 0, '', 1, $addnowlink); $more .= '
'."\n"; $formquestion[] = array('name'=>$input['name'].'day'); $formquestion[] = array('name'=>$input['name'].'month'); From b8b1eb603559cb33e8df617e2b0dae9204c36a73 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 3 Jan 2023 12:08:04 +0100 Subject: [PATCH 0537/1128] NEW formconfirm can support field with format datetime --- htdocs/core/class/html.form.class.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index c33ffe28551..5a2efa07f40 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -5001,7 +5001,7 @@ class Form * @param string $question Question * @param string $action Action * @param array|string $formquestion An array with complementary inputs to add into forms: array(array('label'=> ,'type'=> , 'size'=>, 'morecss'=>, 'moreattr'=>'autofocus' or 'style=...')) - * 'type' can be 'text', 'password', 'checkbox', 'radio', 'date', 'select', 'multiselect', 'morecss', + * 'type' can be 'text', 'password', 'checkbox', 'radio', 'date', 'datetime', 'select', 'multiselect', 'morecss', * 'other', 'onecolumn' or 'hidden'... * @param int|string $selectedchoice '' or 'no', or 'yes' or '1', 1, '0' or 0 * @param int|string $useajax 0=No, 1=Yes use Ajax to show the popup, 2=Yes and also submit page with &confirm=no if choice is No, 'xxx'=Yes and preoutput confirm box with div id=dialog-confirm-xxx @@ -5132,11 +5132,11 @@ class Form $more .= ''."\n"; $i++; } - } elseif ($input['type'] == 'date') { + } elseif ($input['type'] == 'date' || $input['type'] == 'datetime') { $more .= '
'.$input['label'].'
'; $more .= '
'; $addnowlink = (empty($input['datenow']) ? 0 : 1); - $more .= $this->selectDate($input['value'], $input['name'], 0, 0, 0, '', 1, $addnowlink); + $more .= $this->selectDate($input['value'], $input['name'], ($input['type'] == 'datetime' ? 1 : 0), ($input['type'] == 'datetime' ? 1 : 0), 0, '', 1, $addnowlink); $more .= '
'."\n"; $formquestion[] = array('name'=>$input['name'].'day'); $formquestion[] = array('name'=>$input['name'].'month'); From 3e36e9831e137d427777055829f18e4ed1032ea9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 3 Jan 2023 13:03:27 +0100 Subject: [PATCH 0538/1128] Fix warnings --- htdocs/admin/syslog.php | 3 -- htdocs/core/class/ctyperesource.class.php | 4 -- .../class/stocktransfer.class.php | 52 +++++-------------- .../class/stocktransferline.class.php | 36 ------------- .../class/companypaymentmode.class.php | 26 ---------- htdocs/website/class/websitepage.class.php | 39 ++++---------- .../workstation/class/workstation.class.php | 36 ------------- 7 files changed, 22 insertions(+), 174 deletions(-) diff --git a/htdocs/admin/syslog.php b/htdocs/admin/syslog.php index 71f7fd7f875..cf07dd49539 100644 --- a/htdocs/admin/syslog.php +++ b/htdocs/admin/syslog.php @@ -115,9 +115,6 @@ if ($action == 'set') { // Check configuration foreach ($activeModules as $modulename) { - /** - * @var LogHandler - */ $module = new $modulename; $error = $module->checkConfiguration(); } diff --git a/htdocs/core/class/ctyperesource.class.php b/htdocs/core/class/ctyperesource.class.php index be83877098c..88f6960a9f9 100644 --- a/htdocs/core/class/ctyperesource.class.php +++ b/htdocs/core/class/ctyperesource.class.php @@ -468,8 +468,4 @@ class CtyperesourceLine public $label; public $active; - - /** - * @var mixed Sample line property 2 - */ } diff --git a/htdocs/product/stock/stocktransfer/class/stocktransfer.class.php b/htdocs/product/stock/stocktransfer/class/stocktransfer.class.php index 60f13396b80..84182736a0a 100644 --- a/htdocs/product/stock/stocktransfer/class/stocktransfer.class.php +++ b/htdocs/product/stock/stocktransfer/class/stocktransfer.class.php @@ -57,11 +57,19 @@ class StockTransfer extends CommonObject */ public $isextrafieldmanaged = 1; + /** - * @var string Customer ref - * @deprecated - * @see $ref_customer - */ + * @var array List of child tables. To know object to delete on cascade. + * If name matches '@ClassNAme:FilePathClass;ParentFkFieldName' it will + * call method deleteByParentField(parentId, ParentFkFieldName) to fetch and delete child object + */ + protected $childtablesoncascade = array('stocktransfer_stocktransferline'); + + /** + * @var string Customer ref + * @deprecated + * @see $ref_customer + */ public $ref_client; /** @@ -162,42 +170,6 @@ class StockTransfer extends CommonObject // END MODULEBUILDER PROPERTIES - // If this object has a subtable with lines - - /** - * @var int Name of subtable line - */ - public $table_element_line = 'stocktransfer_stocktransferline'; - - /** - * @var int Field with ID of parent key if this object has a parent - */ - public $fk_element = 'fk_stocktransfer'; - - /** - * @var int Name of subtable class that manage subtable lines - */ - //public $class_element_line = 'StockTransferline'; - - /** - * @var array List of child tables. To test if we can delete object. - */ - //protected $childtables = array(); - - /** - * @var array List of child tables. To know object to delete on cascade. - * If name matches '@ClassNAme:FilePathClass;ParentFkFieldName' it will - * call method deleteByParentField(parentId, ParentFkFieldName) to fetch and delete child object - */ - protected $childtablesoncascade = array('stocktransfer_stocktransferline'); - - /** - * @var StockTransferLine[] Array of subtable lines - */ - //public $lines = array(); - - - /** * Constructor * diff --git a/htdocs/product/stock/stocktransfer/class/stocktransferline.class.php b/htdocs/product/stock/stocktransfer/class/stocktransferline.class.php index 4ee2f1db631..65252efa106 100644 --- a/htdocs/product/stock/stocktransfer/class/stocktransferline.class.php +++ b/htdocs/product/stock/stocktransfer/class/stocktransferline.class.php @@ -117,42 +117,6 @@ class StockTransferLine extends CommonObjectLine // END MODULEBUILDER PROPERTIES - // If this object has a subtable with lines - - /** - * @var int Name of subtable line - */ - //public $table_element_line = 'stocktransfer_stocktransferlineline'; - - /** - * @var int Field with ID of parent key if this object has a parent - */ - //public $fk_element = 'fk_stocktransferline'; - - /** - * @var int Name of subtable class that manage subtable lines - */ - //public $class_element_line = 'StockTransferLineline'; - - /** - * @var array List of child tables. To test if we can delete object. - */ - //protected $childtables = array(); - - /** - * @var array List of child tables. To know object to delete on cascade. - * If name matches '@ClassNAme:FilePathClass;ParentFkFieldName' it will - * call method deleteByParentField(parentId, ParentFkFieldName) to fetch and delete child object - */ - //protected $childtablesoncascade = array('stocktransfer_stocktransferlinedet'); - - /** - * @var StockTransferLineLine[] Array of subtable lines - */ - //public $lines = array(); - - - /** * Constructor * diff --git a/htdocs/societe/class/companypaymentmode.class.php b/htdocs/societe/class/companypaymentmode.class.php index 17889026e89..eb77a928f14 100644 --- a/htdocs/societe/class/companypaymentmode.class.php +++ b/htdocs/societe/class/companypaymentmode.class.php @@ -195,32 +195,6 @@ class CompanyPaymentMode extends CommonObject // END MODULEBUILDER PROPERTIES - - // If this object has a subtable with lines - - /** - * @var string Name of subtable line - */ - //public $table_element_line = 'companypaymentmodedet'; - /** - * @var string Field with ID of parent key if this field has a parent - */ - //public $fk_element = 'fk_companypaymentmode'; - /** - * @var string Name of subtable class that manage subtable lines - */ - //public $class_element_line = 'CompanyPaymentModeline'; - /** - * @var array List of child tables. To test if we can delete object. - */ - //protected $childtables=array(); - /** - * @var CompanyPaymentModeLine[] Array of subtable lines - */ - //public $lines = array(); - - - /** * Constructor * diff --git a/htdocs/website/class/websitepage.class.php b/htdocs/website/class/websitepage.class.php index 55916fc4fe2..c4efd987d0b 100644 --- a/htdocs/website/class/websitepage.class.php +++ b/htdocs/website/class/websitepage.class.php @@ -50,6 +50,16 @@ class WebsitePage extends CommonObject */ public $picto = 'file-code'; + /** + * @var string Field with ID of parent key if this field has a parent or for child tables + */ + public $fk_element = 'fk_website_page'; + + /** + * @var array List of child tables. To know object to delete on cascade. + */ + protected $childtablesoncascade = array('categorie_website_page'); + /** * @var int ID @@ -181,35 +191,6 @@ class WebsitePage extends CommonObject // END MODULEBUILDER PROPERTIES - // If this object has a subtable with lines - - // /** - // * @var string Name of subtable line - // */ - //public $table_element_line = 'mymodule_myobjectline'; - - /** - * @var string Field with ID of parent key if this field has a parent or for child tables - */ - public $fk_element = 'fk_website_page'; - - // /** - // * @var string Name of subtable class that manage subtable lines - // */ - //public $class_element_line = 'MyObjectline'; - - /** - * @var array List of child tables. To test if we can delete object. - */ - //protected $childtables=array(); - - /** - * @var array List of child tables. To know object to delete on cascade. - */ - protected $childtablesoncascade = array('categorie_website_page'); - - - /** * Constructor * diff --git a/htdocs/workstation/class/workstation.class.php b/htdocs/workstation/class/workstation.class.php index d3b098784da..6f81c4a28eb 100644 --- a/htdocs/workstation/class/workstation.class.php +++ b/htdocs/workstation/class/workstation.class.php @@ -132,42 +132,6 @@ class Workstation extends CommonObject // END MODULEBUILDER PROPERTIES - // If this object has a subtable with lines - - /** - * @var int Name of subtable line - */ - //public $table_element_line = 'workstation_workstationline'; - - /** - * @var int Field with ID of parent key if this object has a parent - */ - //public $fk_element = 'fk_workstation'; - - /** - * @var int Name of subtable class that manage subtable lines - */ - //public $class_element_line = 'Workstationline'; - - /** - * @var array List of child tables. To test if we can delete object. - */ - //protected $childtables = array(); - - /** - * @var array List of child tables. To know object to delete on cascade. - * If name matches '@ClassNAme:FilePathClass;ParentFkFieldName' it will - * call method deleteByParentField(parentId, ParentFkFieldName) to fetch and delete child object - */ - //protected $childtablesoncascade = array('workstation_workstationdet'); - - /** - * @var WorkstationLine[] Array of subtable lines - */ - //public $lines = array(); - - - /** * Constructor * From f5792d692af4199d4d28fe637ad3d1a4013518dc Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 3 Jan 2023 13:32:43 +0100 Subject: [PATCH 0539/1128] Fix migration --- htdocs/install/mysql/migration/16.0.0-17.0.0.sql | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/install/mysql/migration/16.0.0-17.0.0.sql b/htdocs/install/mysql/migration/16.0.0-17.0.0.sql index 228fde598bb..31cbebab726 100644 --- a/htdocs/install/mysql/migration/16.0.0-17.0.0.sql +++ b/htdocs/install/mysql/migration/16.0.0-17.0.0.sql @@ -207,6 +207,8 @@ ALTER TABLE llx_societe_remise_except ADD COLUMN multicurrency_tx double(24,8) N -- VMYSQL4.3 ALTER TABLE llx_hrm_evaluationdet CHANGE COLUMN `rank` rankorder integer; -- VPGSQL8.2 ALTER TABLE llx_hrm_evaluationdet CHANGE COLUMN rank rankorder integer; +-- VMYSQL4.3 ALTER TABLE llx_hrm_skillrank CHANGE COLUMN `rank` rankorder integer; +-- VPGSQL8.2 ALTER TABLE llx_hrm_skillrank CHANGE COLUMN rank rankorder integer; -- Rename const to hide public and private notes (fix allow notes const was used to hide) @@ -388,4 +390,3 @@ ALTER TABLE llx_opensurvey_user_studs ADD COLUMN date_creation datetime NULL; ALTER TABLE llx_opensurvey_comments ADD COLUMN date_creation datetime NULL; ALTER TABLE llx_c_tva ADD COLUMN use_default tinyint DEFAULT 0; - From ed11164b74e92fbd7214cbbbfbee3b71635902ad Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 3 Jan 2023 13:33:04 +0100 Subject: [PATCH 0540/1128] Debug --- htdocs/hrm/compare.php | 66 +++++++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/htdocs/hrm/compare.php b/htdocs/hrm/compare.php index d1dde23a63c..6365dd51d25 100644 --- a/htdocs/hrm/compare.php +++ b/htdocs/hrm/compare.php @@ -28,9 +28,6 @@ * 2- the central part displays the skills. display of the maximum score for this group and the number of occurrences. * * 3- the right part displays the members of group 2 or the job to be compared - * - * - * */ @@ -48,6 +45,7 @@ require_once DOL_DOCUMENT_ROOT . '/hrm/lib/hrm.lib.php'; // Load translation files required by the page $langs->load('hrm'); +$job = new Job($db); // Permissions $permissiontoread = $user->rights->hrm->evaluation->read || $user->rights->hrm->compare_advance->read; @@ -61,8 +59,8 @@ if (!$permissiontoread || ($action === 'create' && !$permissiontoadd)) accessfor * View */ -$css = array(); -$css[] = '/hrm/css/style.css'; +$css = array('/hrm/css/style.css'); + llxHeader('', $langs->trans('SkillComparison'), '', '', 0, 0, '', $css); $head = array(); @@ -74,8 +72,6 @@ $head[$h][2] = 'compare'; print dol_get_fiche_head($head, 'compare', '', 1); -//$PDOdb = new TPDOdb; -$form = new Form($db); ?> '."\n"; llxHeader($moreheadcss.$moreheadjs, $langs->trans("ECMArea"), '', '', '', '', $morejs, '', 0, 0); -$head = ecm_prepare_dasboard_head(''); +$head = ecm_prepare_dasboard_head(null); print dol_get_fiche_head($head, 'index', '', -1, ''); diff --git a/htdocs/ecm/index_auto.php b/htdocs/ecm/index_auto.php index 9d9d30e8188..3944e869da0 100644 --- a/htdocs/ecm/index_auto.php +++ b/htdocs/ecm/index_auto.php @@ -387,7 +387,7 @@ if (empty($conf->global->ECM_AUTO_TREE_HIDEN)) { } } -$head = ecm_prepare_dasboard_head(''); +$head = ecm_prepare_dasboard_head(null); print dol_get_fiche_head($head, 'index_auto', '', -1, ''); diff --git a/htdocs/ecm/index_medias.php b/htdocs/ecm/index_medias.php index 2e1edcdc269..39118774430 100644 --- a/htdocs/ecm/index_medias.php +++ b/htdocs/ecm/index_medias.php @@ -295,7 +295,7 @@ $moreheadjs .= ''."\n"; llxHeader($moreheadcss.$moreheadjs, $langs->trans("ECMArea"), '', '', '', '', $morejs, '', 0, 0); -$head = ecm_prepare_dasboard_head(''); +$head = ecm_prepare_dasboard_head(null); print dol_get_fiche_head($head, 'index_medias', '', -1, ''); diff --git a/htdocs/ftp/index.php b/htdocs/ftp/index.php index 633cb6fa5ce..e6c1aac1372 100644 --- a/htdocs/ftp/index.php +++ b/htdocs/ftp/index.php @@ -154,6 +154,7 @@ if ($action == 'addfolder') { // Action ajout d'un rep if ($action == 'add' && $user->rights->ftp->setup) { + $ecmdir = new EcmDirectory($db); $ecmdir->ref = GETPOST("ref"); $ecmdir->label = GETPOST("label"); $ecmdir->description = GETPOST("desc"); diff --git a/htdocs/index.php b/htdocs/index.php index 7cfd12d4bac..f1ce8248921 100644 --- a/htdocs/index.php +++ b/htdocs/index.php @@ -490,7 +490,7 @@ if (empty($conf->global->MAIN_DISABLE_GLOBAL_WORKBOARD)) { foreach ($dashboardgroup as $groupKey => $groupElement) { $boards = array(); - // Scan $groupElement and save the one with 'stats' that lust be used for Open object dashboard + // Scan $groupElement and save the one with 'stats' that must be used for the open objects dashboard if (empty($conf->global->MAIN_DISABLE_NEW_OPENED_DASH_BOARD)) { foreach ($groupElement['stats'] as $infoKey) { if (!empty($valid_dashboardlines[$infoKey])) { @@ -519,10 +519,10 @@ if (empty($conf->global->MAIN_DISABLE_GLOBAL_WORKBOARD)) { $openedDashBoard .= ' '."\n"; $openedDashBoard .= ' '."\n"; - // Show the span for the total of record + // Show the span for the total of record. TODO This seems not used. if (!empty($groupElement['globalStats'])) { $globalStatInTopOpenedDashBoard[] = $globalStatsKey; - $openedDashBoard .= ''.$nbTotal.''; + $openedDashBoard .= ''.$groupElement['globalStats']['nbTotal'].''; } $openedDashBoard .= ''."\n"; diff --git a/htdocs/install/index.php b/htdocs/install/index.php index a7ce50c819f..6810e3c509f 100644 --- a/htdocs/install/index.php +++ b/htdocs/install/index.php @@ -44,7 +44,7 @@ $langs->load("admin"); * View */ -$formadmin = new FormAdmin(''); // Note: $db does not exist yet but we don't need it, so we put ''. +$formadmin = new FormAdmin(null); // Note: $db does not exist yet but we don't need it, so we put ''. pHeader("", "check"); // Next step = check diff --git a/htdocs/install/lib/repair.lib.php b/htdocs/install/lib/repair.lib.php index aea82107d29..c7c45dff053 100644 --- a/htdocs/install/lib/repair.lib.php +++ b/htdocs/install/lib/repair.lib.php @@ -125,7 +125,7 @@ function checkLinkedElements($sourcetype, $targettype) /** * Clean data into ecm_directories table * - * @return void + * @return int <0 if KO, >0 if OK */ function clean_data_ecm_directories() { @@ -145,12 +145,14 @@ function clean_data_ecm_directories() $resqlupdate = $db->query($sqlupdate); if (!$resqlupdate) { dol_print_error($db, 'Failed to update'); + return -1; } } } } else { dol_print_error($db, 'Failed to run request'); + return -1; } - return; + return 1; } diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index d8eb602f624..17912f81101 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1413,7 +1413,7 @@ if (!function_exists("llxHeader")) { } if (empty($conf->dol_hide_leftmenu) && !GETPOST('dol_openinpopup', 'aZ09')) { - left_menu('', $help_url, '', '', 1, $title, 1); // $menumanager is retrieved with a global $menumanager inside this function + left_menu(array(), $help_url, '', '', 1, $title, 1); // $menumanager is retrieved with a global $menumanager inside this function } // main area @@ -2885,7 +2885,7 @@ function left_menu($menu_array_before, $helppagename = '', $notused = '', $menu_ $selected = -1; if (empty($conf->global->MAIN_USE_TOP_MENU_SEARCH_DROPDOWN)) { $usedbyinclude = 1; - $arrayresult = null; + $arrayresult = array(); include DOL_DOCUMENT_ROOT.'/core/ajax/selectsearchbox.php'; // This set $arrayresult if ($conf->use_javascript_ajax && empty($conf->global->MAIN_USE_OLD_SEARCH_FORM)) { diff --git a/htdocs/paybox/lib/paybox.lib.php b/htdocs/paybox/lib/paybox.lib.php index 7f41d45d374..567a4b91669 100644 --- a/htdocs/paybox/lib/paybox.lib.php +++ b/htdocs/paybox/lib/paybox.lib.php @@ -225,5 +225,5 @@ function print_paybox_redirect($PRICE, $CURRENCY, $EMAIL, $urlok, $urlko, $TAG) print ''."\n"; print "\n"; - return; + return 1; } diff --git a/htdocs/public/recruitment/index.php b/htdocs/public/recruitment/index.php index 23a180b9a7b..8724e65ca4f 100644 --- a/htdocs/public/recruitment/index.php +++ b/htdocs/public/recruitment/index.php @@ -252,7 +252,7 @@ if (is_array($results)) { } } print ''; - print $tmpuser->getFullName(-1); + print $tmpuser->getFullName(); print '   '.dol_print_email($emailforcontact, 0, 0, 1, 0, 0, 'envelope'); print ''; print '
'; diff --git a/htdocs/takepos/ajax/ajax.php b/htdocs/takepos/ajax/ajax.php index db6b224466c..87357d10091 100644 --- a/htdocs/takepos/ajax/ajax.php +++ b/htdocs/takepos/ajax/ajax.php @@ -370,6 +370,9 @@ if ($action == 'getProducts') { $place = GETPOST('place', 'alpha'); require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/dolreceiptprinter.class.php'; + + $object = new Facture($db); + $printer = new dolReceiptPrinter($db); $printer->sendToPrinter($object, getDolGlobalString('TAKEPOS_TEMPLATE_TO_USE_FOR_INVOICES'.$term), getDolGlobalString('TAKEPOS_PRINTER_TO_USE'.$term)); } From d3c35651906ba23ca9eaf5563149cc8ec37cfcf2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 6 Jan 2023 20:53:09 +0100 Subject: [PATCH 0622/1128] css --- htdocs/compta/bank/bankentries_list.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/bank/bankentries_list.php b/htdocs/compta/bank/bankentries_list.php index b0514c71ee6..6c961e85af9 100644 --- a/htdocs/compta/bank/bankentries_list.php +++ b/htdocs/compta/bank/bankentries_list.php @@ -1134,8 +1134,8 @@ if ($resql) { } // Conciliated if (!empty($arrayfields['b.conciliated']['checked'])) { - print '
'; } // Bordereau From 44423bea30c4f1340a34fa6a82be8a666bb5cb39 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 6 Jan 2023 20:53:09 +0100 Subject: [PATCH 0623/1128] css --- htdocs/compta/bank/bankentries_list.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/bank/bankentries_list.php b/htdocs/compta/bank/bankentries_list.php index b0514c71ee6..6c961e85af9 100644 --- a/htdocs/compta/bank/bankentries_list.php +++ b/htdocs/compta/bank/bankentries_list.php @@ -1134,8 +1134,8 @@ if ($resql) { } // Conciliated if (!empty($arrayfields['b.conciliated']['checked'])) { - print ''; } // Bordereau From 8d922d89345c4f947e1b47e7d442ce07f8751c67 Mon Sep 17 00:00:00 2001 From: daraelmin Date: Sat, 7 Jan 2023 00:24:57 +0100 Subject: [PATCH 0624/1128] New Accountancy - 2 line for 1 mvmt in create mode --- htdocs/accountancy/bookkeeping/card.php | 787 +++++++++++------------- 1 file changed, 367 insertions(+), 420 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/card.php b/htdocs/accountancy/bookkeeping/card.php index 4620bf37e4e..e1916310b34 100644 --- a/htdocs/accountancy/bookkeeping/card.php +++ b/htdocs/accountancy/bookkeeping/card.php @@ -4,6 +4,7 @@ * Copyright (C) 2013-2022 Alexandre Spangaro * Copyright (C) 2017 Laurent Destailleur * Copyright (C) 2018-2020 Frédéric France + * Copyright (C) 2022 Waël Almoman * * 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 @@ -44,7 +45,7 @@ $cancel = GETPOST('cancel', 'aZ09'); $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print') $id = GETPOST('id', 'int'); // id of record -$mode = GETPOST('mode', 'aZ09'); // '' or '_tmp' +$mode = $mode = $action == 'create' ? "_tmp" : GETPOST('mode', 'aZ09'); // '' or '_tmp' $piece_num = GETPOST("piece_num", 'int'); // id of transaction (several lines share the same transaction id) $accountingaccount = new AccountingAccount($db); @@ -54,10 +55,15 @@ $accountingaccount_number = GETPOST('accountingaccount_number', 'alphanohtml'); $accountingaccount->fetch(null, $accountingaccount_number, true); $accountingaccount_label = $accountingaccount->label; -$journal_code = GETPOST('code_journal', 'alpha'); +$journal_code = GETPOST('code_journal', 'alpha') ? GETPOST('code_journal', 'alpha') : "NULL"; $accountingjournal->fetch(null, $journal_code); $journal_label = $accountingjournal->label; +$next_num_mvt = (int) GETPOST('next_num_mvt', 'alpha'); +$doc_ref = (string) GETPOST('doc_ref', 'alpha'); +$doc_date = (string) GETPOST('doc_date', 'alpha'); +$doc_date = $doc_date = dol_mktime(0, 0, 0, GETPOST('doc_datemonth', 'int'), GETPOST('doc_dateday', 'int'), GETPOST('doc_dateyear', 'int')); + $subledger_account = GETPOST('subledger_account', 'alphanohtml'); if ($subledger_account == -1) { $subledger_account = null; @@ -72,6 +78,10 @@ $save = GETPOST('save', 'alpha'); if (!empty($save)) { $action = 'add'; } +$valid = GETPOST('validate', 'alpha'); +if (!empty($valid)) { + $action = 'valid'; +} $update = GETPOST('update', 'alpha'); if (!empty($update)) { $action = 'confirm_update'; @@ -156,64 +166,79 @@ if ($action == "confirm_update") { } } } -} elseif ($action == "add") { +} elseif ($action == 'add' || $action == 'valid') { $error = 0; - if ((floatval($debit) != 0.0) && (floatval($credit) != 0.0)) { - $error++; - setEventMessages($langs->trans('ErrorDebitCredit'), null, 'errors'); - $action = ''; - } - if (empty($accountingaccount_number) || $accountingaccount_number == '-1') { - $error++; - setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("AccountAccountingShort")), null, 'errors'); - $action = ''; + if (array_sum($debit) != array_sum($credit)) { + $action = 'add'; } - if (!$error) { - $object = new BookKeeping($db); + foreach ($accountingaccount_number as $key => $value) { + $accountingaccount->fetch(null, $accountingaccount_number[$key], true); + $accountingaccount_label[$key] = $accountingaccount->label[$key]; - $object->numero_compte = $accountingaccount_number; - $object->subledger_account = $subledger_account; - $object->subledger_label = $subledger_label; - $object->label_compte = $accountingaccount_label; - $object->label_operation = $label_operation; - $object->debit = $debit; - $object->credit = $credit; - $object->doc_date = (string) GETPOST('doc_date', 'alpha'); - $object->doc_type = (string) GETPOST('doc_type', 'alpha'); - $object->piece_num = $piece_num; - $object->doc_ref = (string) GETPOST('doc_ref', 'alpha'); - $object->code_journal = $journal_code; - $object->journal_label = $journal_label; - $object->fk_doc = GETPOSTINT('fk_doc'); - $object->fk_docdet = GETPOSTINT('fk_docdet'); - - if (floatval($debit) != 0.0) { - $object->montant = $debit; // deprecated - $object->amount = $debit; - $object->sens = 'D'; + // if one added row is empty remove it before continue + if ($key < 1 && (empty($accountingaccount_number[$key]) || $accountingaccount_number[$key] == '-1') || (floatval($debit[$key]) == 0.0) && (floatval($credit[$key]) == 0.0)) { + continue; } - if (floatval($credit) != 0.0) { - $object->montant = $credit; // deprecated - $object->amount = $credit; - $object->sens = 'C'; - } - - $result = $object->createStd($user, false, $mode); - if ($result < 0) { - setEventMessages($object->error, $object->errors, 'errors'); - } else { - if ($mode != '_tmp') { - setEventMessages($langs->trans('RecordSaved'), null, 'mesgs'); - } - - $debit = 0; - $credit = 0; - + if ((floatval($debit[$key]) != 0.0) && (floatval($credit[$key]) != 0.0)) { + $error++; + setEventMessages($langs->trans('ErrorDebitCredit'), null, 'errors'); $action = ''; } + + if (empty($accountingaccount_number[$key]) || $accountingaccount_number[$key] == '-1') { + $error++; + setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("AccountAccountingShort")), null, 'errors'); + $action = ''; + } + + if (!$error) { + $object = new BookKeeping($db); + $object->numero_compte = $accountingaccount_number[$key]; + $object->subledger_account = $subledger_account[$key]; + $object->subledger_label = $subledger_label[$key]; + $object->label_compte = $accountingaccount_label[$key]; + $object->label_operation = $label_operation[$key]; + $object->debit = price2num($debit[$key]); + $object->credit = price2num($credit[$key]); + $object->doc_date = $doc_date; + $object->doc_type = (string) GETPOST('doc_type', 'alpha'); + $object->piece_num = $piece_num; + $object->doc_ref = $doc_ref; + $object->code_journal = $journal_code; + $object->journal_label = $journal_label; + $object->fk_doc = GETPOSTINT('fk_doc'); + $object->fk_docdet = GETPOSTINT('fk_docdet'); + + if (floatval($debit[$key]) != 0.0) { + $object->montant = $object->debit; // deprecated + $object->amount = $object->debit; + $object->sens = 'D'; + } + + if (floatval($credit[$key]) != 0.0) { + $object->montant = $object->credit; // deprecated + $object->amount = $object->credit; + $object->sens = 'C'; + } + + $result = $object->createStd($user, false, $mode); + if ($result < 0) { + $error++; + setEventMessages($object->error, $object->errors, 'errors'); + } + } + } + if (empty($error)) { + if ($mode != '_tmp') { + setEventMessages($langs->trans('RecordSaved'), null, 'mesgs'); + } + $debit = 0; + $credit = 0; + + $action = $action == 'add' ? '' : $action ; // stay in valid mode when not adding line } } elseif ($action == "confirm_delete") { $object = new BookKeeping($db); @@ -230,17 +255,28 @@ if ($action == "confirm_update") { } } $action = ''; -} elseif ($action == "confirm_create") { +} elseif ($action == 'create') { $error = 0; $object = new BookKeeping($db); + $next_num_mvt = !empty($next_num_mvt) ? $next_num_mvt : $object->getNextNumMvt('_tmp'); + $doc_ref = !empty($doc_ref) ? $doc_ref : $next_num_mvt; + + if (empty($doc_date)) { + $tmp_date = dol_getdate(dol_now()); + $_POST['doc_dateday'] = $tmp_date['mday']; + $_POST['doc_datemonth'] = $tmp_date['mon']; + $_POST['doc_dateyear'] = $tmp_date['year']; + unset($tmp_date); + } + if (!$journal_code || $journal_code == '-1') { setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("Journal")), null, 'errors'); $action = 'create'; $error++; } - if (!GETPOST('doc_ref', 'alpha')) { + if (empty($doc_ref)) { setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Piece")), null, 'errors'); $action = 'create'; $error++; @@ -252,8 +288,8 @@ if ($action == "confirm_update") { $object->credit = 0; $object->doc_date = $date_start = dol_mktime(0, 0, 0, GETPOST('doc_datemonth', 'int'), GETPOST('doc_dateday', 'int'), GETPOST('doc_dateyear', 'int')); $object->doc_type = GETPOST('doc_type', 'alpha'); - $object->piece_num = GETPOST('next_num_mvt', 'alpha'); - $object->doc_ref = GETPOST('doc_ref', 'alpha'); + $object->piece_num = $next_num_mvt; + $object->doc_ref = $doc_ref; $object->code_journal = $journal_code; $object->journal_label = $journal_label; $object->fk_doc = 0; @@ -302,7 +338,7 @@ if ($action == 'setjournal') { } if ($action == 'setdocref') { - $refdoc = GETPOST('doc_ref', 'alpha'); + $refdoc = $doc_ref; $result = $object->updateByMvt($piece_num, 'doc_ref', $refdoc, $mode); if ($result < 0) { setEventMessages($object->error, $object->errors, 'errors'); @@ -333,7 +369,7 @@ if ($action == 'valid') { $html = new Form($db); $formaccounting = new FormAccounting($db); -$title = $langs->trans("CreateMvts"); +$title = $langs->trans($mode =="_tmp" ? "CreateMvts": "UpdateMvts"); llxHeader('', $title); @@ -343,28 +379,37 @@ if ($action == 'delete') { print $formconfirm; } -if ($action == 'create') { - print load_fiche_titre($title); - $object = new BookKeeping($db); - $next_num_mvt = $object->getNextNumMvt('_tmp'); +$object = new BookKeeping($db); +$result = $object->fetchPerMvt($piece_num, $mode); +if ($result < 0) { + setEventMessages($object->error, $object->errors, 'errors'); +} - if (empty($next_num_mvt)) { - dol_print_error('', 'Failed to get next piece number'); +if (!empty($object->piece_num)) { + $backlink = ''.$langs->trans('BackToList').''; + + print load_fiche_titre($langs->trans($mode =="_tmp" ? "CreateMvts": "UpdateMvts"), $backlink); + + print ''; if ($optioncss != '') { + print ''; } + $head = array(); + $h = 0; + $head[$h][0] = $_SERVER['PHP_SELF'].'?piece_num='.$object->piece_num.($mode ? '&mode='.$mode : ''); + $head[$h][1] = $langs->trans("Transaction"); + $head[$h][2] = 'transaction'; + $h++; - print ''; - if ($optioncss != '') { - print ''; - } - print ''; - print ''."\n"; - print ''."\n"; - print ''."\n"; + print dol_get_fiche_head($head, 'transaction', '', -1); - print dol_get_fiche_head(); + //dol_banner_tab($object, '', $backlink); - print '
'.$langs->trans("Description").' '.$langs->trans("Value").''.$langs->trans("Value").'
'.$langs->trans("ECMAutoTree").' '; +print ''; if ($conf->use_javascript_ajax) { - print ajax_constantonoff('ECM_AUTO_TREE_ENABLED'); + print ajax_constantonoff('ECM_AUTO_TREE_HIDEN', null, null, 1); } else { - if (empty($conf->global->ECM_AUTO_TREE_ENABLED)) { - print ''.img_picto($langs->trans("Disabled"), 'off').''; - } elseif (!empty($conf->global->USER_MAIL_REQUIRED)) { - print ''.img_picto($langs->trans("Enabled"), 'on').''; + if (empty($conf->global->ECM_AUTO_TREE_HIDEN)) { + print ''.img_picto($langs->trans("Enabled"), 'on').''; + } else { + print ''.img_picto($langs->trans("Disabled"), 'off').''; } } print '
'.price2num($sub_bom->total_cost * $sub_bom_line->qty * $line->qty, 'MT').''.price(price2num($sub_bom->total_cost * $sub_bom_line->qty * $line->qty, 'MT')).''.price2num($sub_bom_product->cost_price * $sub_bom_line->qty * $line->qty, 'MT').''.price(price2num($sub_bom_product->cost_price * $sub_bom_line->qty * $line->qty, 'MT')).''.price2num($sub_bom_product->pmp * $sub_bom_line->qty * $line->qty, 'MT').''.price(price2num($sub_bom_product->pmp * $sub_bom_line->qty * $line->qty, 'MT')).''; + + $durationtouse_start = 0; + if ($search_timespent_starthour || $search_timespent_startmin) { + $durationtouse_start = ($search_timespent_starthour * 3600 + $search_timespent_startmin * 60); + } + print '
'.$langs->trans('from').' '; + $form->select_duration('search_timespent_duration_start', $durationtouse_start, 0, 'text'); + print '
'; + + $durationtouse_end = 0; + if ($search_timespent_endhour || $search_timespent_endmin) { + $durationtouse_end = ($search_timespent_endhour * 3600 + $search_timespent_endmin * 60); + } + print '
'.$langs->trans('at').' '; + $form->select_duration('search_timespent_duration_end', $durationtouse_end, 0, 'text'); + print '
'; + + print '
'; + print ''; + print ''; $selectarray = array('0'=>$langs->trans("ContactPublic"), '1'=>$langs->trans("ContactPrivate")); @@ -1105,6 +1128,9 @@ if (!empty($arrayfields['p.fk_soc']['checked'])) { if (!empty($arrayfields['s.nom']['checked'])) { print_liste_field_titre($arrayfields['s.nom']['label'], $_SERVER["PHP_SELF"], "s.nom", $begin, $param, '', $sortfield, $sortorder); } +if (!empty($arrayfields['s.name_alias']['checked'])) { + print_liste_field_titre($arrayfields['s.name_alias']['label'], $_SERVER["PHP_SELF"], "s.name_alias", $begin, $param, '', $sortfield, $sortorder); +} if (!empty($arrayfields['p.priv']['checked'])) { print_liste_field_titre($arrayfields['p.priv']['label'], $_SERVER["PHP_SELF"], "p.priv", $begin, $param, '', $sortfield, $sortorder, 'center '); } @@ -1323,7 +1349,7 @@ while ($i < min($num, $limit)) { if ($obj->socid) { $objsoc = new Societe($db); $objsoc->fetch($obj->socid); - print $objsoc->getNomUrl(1); + print $objsoc->getNomUrl(1, 'customer', 100, 0, 1, empty($arrayfields['s.name_alias']['checked']) ? 0 : 1); } else { print ' '; } @@ -1333,6 +1359,16 @@ while ($i < min($num, $limit)) { } } + // Alias name + if (!empty($arrayfields['s.name_alias']['checked'])) { + print ''; + print $obj->alias; + print ''.$contactstatic->LibPubPriv($obj->priv).''; $label = preg_replace('/_NAME$/', '', $keyforsupportedoauth2array); - print ''; + print ''; print img_picto('', 'delete'); print ''; @@ -298,7 +298,8 @@ if (count($listinsetup) > 0) { $redirect_uri = $urlwithroot.'/core/modules/oauth/'.$supportedoauth2array[$keyforsupportedoauth2array]['callbackfile'].'_oauthcallback.php'; print '
'.$langs->trans("UseTheFollowingUrlAsRedirectURI").''; + print ''; + print ajax_autoselect('uri'.$keyforsupportedoauth2array.$keyforprovider); print '
'.$langs->trans("URLOfServiceForAuthorization").''; + print ''; print '
"; - print $obj->label; + print dol_escape_htmltag($obj->label); print ""; - print $obj->labelshort; + print dol_escape_htmltag($obj->labelshort); print ""; - print $obj->pcg_type; + print dol_escape_htmltag($obj->pcg_type); + print ""; + // TODO Get all custom groups labels the account is in + print dol_escape_htmltag($obj->fk_accounting_category); + print ""; + print dol_escape_htmltag($obj->import_key); print "
'.$langs->trans("NoRecordFound").'
'.$langs->trans("NoRecordFound").'
'; - print $form->selectarray('search_status', array('0'=>$langs->trans('ActivityCeased'), '1'=>$langs->trans('InActivity')), $search_status, 1, 0, 0, '', 0, 0, 0, '', 'search_status minwidth75 maxwidth125 onrightofpage', 1); + print $form->selectarray('search_status', array('0'=>$langs->trans('ActivityCeased'), '1'=>$langs->trans('InActivity')), $search_status, 1, 0, 0, '', 0, 0, 0, '', 'search_status minwidth75imp maxwidth125 onrightofpage', 1); print ''; - print $form->selectarray('search_statut', array('-1'=>'', '0'=>$langs->trans('Disabled'), '1'=>$langs->trans('Enabled')), $search_statut, 0, 0, 0, '', 0, 0, 0, '', 'minwidth75imp'); + print $form->selectarray('search_statut', array('-1'=>'', '0'=>$langs->trans('Disabled'), '1'=>$langs->trans('Enabled')), $search_statut, 0, 0, 0, '', 0, 0, 0, '', 'search_status minwidth75imp maxwidth125 onrightofpage'); print ''; - print $form->selectarray('search_status', array('0'=>$langs->trans('ActivityCeased'), '1'=>$langs->trans('InActivity')), $search_status, 1, 0, 0, '', 0, 0, 0, '', 'search_status minwidth75 maxwidth125 onrightofpage', 1); + print $form->selectarray('search_status', array('0'=>$langs->trans('ActivityCeased'), '1'=>$langs->trans('InActivity')), $search_status, 1, 0, 0, '', 0, 0, 0, '', 'search_status minwidth75imp maxwidth125 onrightofpage', 1); print ''; - print $form->selectarray('search_statut', array('-1'=>'', '0'=>$langs->trans('Disabled'), '1'=>$langs->trans('Enabled')), $search_statut, 0, 0, 0, '', 0, 0, 0, '', 'minwidth75imp'); + print $form->selectarray('search_statut', array('-1'=>'', '0'=>$langs->trans('Disabled'), '1'=>$langs->trans('Enabled')), $search_statut, 0, 0, 0, '', 0, 0, 0, '', 'search_status minwidth75imp maxwidth125 onrightofpage'); print ''; - print $form->selectyesno('search_conciliated', $search_conciliated, 1, false, 1, 1); + print ''; + print $form->selectyesno('search_conciliated', $search_conciliated, 1, false, 1, 1, 'search_status onrightofpage maxwidth75'); print ''; - print $form->selectyesno('search_conciliated', $search_conciliated, 1, false, 1, 1); + print ''; + print $form->selectyesno('search_conciliated', $search_conciliated, 1, false, 1, 1, 'search_status onrightofpage maxwidth75'); print '
'; + print '
'; + print '
'; + + print '
'; + print '
'; /*print ''; print ''; @@ -374,7 +419,7 @@ if ($action == 'create') { print ''; print ''; print ''; print ''; @@ -385,262 +430,151 @@ if ($action == 'create') { print ''; print ''; - print ''; + print ''; print ''; /* print ''; print ''; - print ''; + print ''; print ''; */ print '
' . $langs->trans("NumPiece") . '
'.$langs->trans("Docdate").''; - print $html->selectDate('', 'doc_date', '', '', '', "create_mvt", 1, 1); + print $html->selectDate($doc_date, 'doc_date', '', '', '', "create_mvt", 1, 1); print '
'.$langs->trans("Piece").'
' . $langs->trans("Doctype") . '
'; - print dol_get_fiche_end(); + print '
'; - print $form->buttonsSaveCancel("Create"); + print '
'; - print ''; -} else { - $object = new BookKeeping($db); - $result = $object->fetchPerMvt($piece_num, $mode); - if ($result < 0) { - setEventMessages($object->error, $object->errors, 'errors'); + print '
'; + print ''; + + // Doc type + if (!empty($object->doc_type)) { + print ''; + print ''; + print ''; + print ''; } - if (!empty($object->piece_num)) { - $backlink = ''.$langs->trans('BackToList').''; + // Date document creation + print ''; + print ''; + print ''; + print ''; - print load_fiche_titre($langs->trans("UpdateMvts"), $backlink); - - $head = array(); - $h = 0; - $head[$h][0] = $_SERVER['PHP_SELF'].'?piece_num='.$object->piece_num.($mode ? '&mode='.$mode : ''); - $head[$h][1] = $langs->trans("Transaction"); - $head[$h][2] = 'transaction'; - $h++; - - print dol_get_fiche_head($head, 'transaction', '', -1); - - //dol_banner_tab($object, '', $backlink); - - print '
'; - print '
'; - - print '
'; - print '
'.$langs->trans("Doctype").''.$object->doc_type.'
'.$langs->trans("DateCreation").''; + print $object->date_creation ? dol_print_date($object->date_creation, 'day') : ' '; + print '
'; - - // Account movement + // Don't show in tmp mode, inevitably empty + if ($mode != "_tmp") { + // Date document export print ''; - print ''; - print ''; - print ''; - - // Date - print ''; - print ''; - - // Journal - print ''; - print ''; - - // Ref document - print ''; - print ''; - - print '
'.$langs->trans("NumMvts").''.($mode == '_tmp' ? ''.$langs->trans("Draft").'' : $object->piece_num).'
'; - print ''; - if ($action != 'editdate') { - print ''; - } - print '
'; - print $langs->trans('Docdate'); - print 'piece_num).'&mode='.urlencode($mode).'">'.img_edit($langs->transnoentitiesnoconv('SetDate'), 1).'
'; - print '
'; - if ($action == 'editdate') { - print '
'; - if ($optioncss != '') { - print ''; - } - print ''; - print ''; - print ''; - print $form->selectDate($object->doc_date ? $object->doc_date : - 1, 'doc_date', '', '', '', "setdate"); - print ''; - print '
'; - } else { - print $object->doc_date ? dol_print_date($object->doc_date, 'day') : ' '; - } - print '
'; - print ''; - if ($action != 'editjournal') { - print ''; - } - print '
'; - print $langs->trans('Codejournal'); - print 'piece_num).'&mode='.urlencode($mode).'">'.img_edit($langs->transnoentitiesnoconv('Edit'), 1).'
'; - print '
'; - if ($action == 'editjournal') { - print '
'; - if ($optioncss != '') { - print ''; - } - print ''; - print ''; - print ''; - print $formaccounting->select_journal($object->code_journal, 'code_journal', 0, 0, array(), 1, 1); - print ''; - print '
'; - } else { - print $object->code_journal; - } - print '
'; - print ''; - if ($action != 'editdocref') { - print ''; - } - print '
'; - print $langs->trans('Piece'); - print 'piece_num).'&mode='.urlencode($mode).'">'.img_edit($langs->transnoentitiesnoconv('Edit'), 1).'
'; - print '
'; - if ($action == 'editdocref') { - print '
'; - if ($optioncss != '') { - print ''; - } - print ''; - print ''; - print ''; - print ''; - print ''; - print '
'; - } else { - print $object->doc_ref; - } - print '
'; - - print '
'; - - print '
'; - - print '
'; - print ''; - - // Doc type - if (!empty($object->doc_type)) { - print ''; - print ''; - print ''; - print ''; - } - - // Date document creation - print ''; - print ''; + print ''; print ''; print ''; - // Don't show in tmp mode, inevitably empty - if ($mode != "_tmp") { - // Date document export - print ''; - print ''; - print ''; - print ''; - - // Date document validation - print ''; - print ''; - print ''; - print ''; - } - - // Validate - /* + // Date document validation print ''; - print ''; + print ''; print ''; + print $object->date_validation ? dol_print_date($object->date_validation, 'dayhour') : ' '; + print ''; print ''; - */ + } + // Validate + /* + print ''; + print ''; + print ''; + print ''; + */ // check data - /* - print ''; - print ''; - if ($object->doc_type == 'customer_invoice') - { - $sqlmid = 'SELECT rowid as ref'; - $sqlmid .= " FROM ".MAIN_DB_PREFIX."facture as fac"; - $sqlmid .= " WHERE fac.rowid=" . ((int) $object->fk_doc); - dol_syslog("accountancy/bookkeeping/card.php::sqlmid=" . $sqlmid, LOG_DEBUG); - $resultmid = $db->query($sqlmid); - if ($resultmid) { - $objmid = $db->fetch_object($resultmid); - $invoicestatic = new Facture($db); - $invoicestatic->fetch($objmid->ref); - $ref=$langs->trans("Invoice").' '.$invoicestatic->getNomUrl(1); - } - else dol_print_error($db); - } - print ''; - print ''; - */ - print "
'.$langs->trans("Doctype").''.$object->doc_type.'
'.$langs->trans("DateCreation").''.$langs->trans("DateExport").''; - print $object->date_creation ? dol_print_date($object->date_creation, 'day') : ' '; + print $object->date_export ? dol_print_date($object->date_export, 'dayhour') : ' '; print '
' . $langs->trans("DateExport") . ''; - print $object->date_export ? dol_print_date($object->date_export, 'dayhour') : ' '; - print '
' . $langs->trans("DateValidation") . ''; - print $object->date_validation ? dol_print_date($object->date_validation, 'dayhour') : ' '; - print '
' . $langs->trans("Status") . ''.$langs->trans("DateValidation").''; - if (empty($object->validated)) { - print ''; - print img_picto($langs->trans("Disabled"), 'switch_off'); - print ''; - } else { - print ''; - print img_picto($langs->trans("Activated"), 'switch_on'); - print ''; - } - print '
' . $langs->trans("Status") . ''; + if (empty($object->validated)) { + print ''; + print img_picto($langs->trans("Disabled"), 'switch_off'); + print ''; + } else { + print ''; + print img_picto($langs->trans("Activated"), 'switch_on'); + print ''; + } + print '
' . $langs->trans("Control") . '' . $ref .'
\n"; - - print '
'; - - print dol_get_fiche_end(); - - print '
'; - - print '
'; - - $result = $object->fetchAllPerMvt($piece_num, $mode); // This load $object->linesmvt - - if ($result < 0) { - setEventMessages($object->error, $object->errors, 'errors'); + /* + print ''; + print '' . $langs->trans("Control") . ''; + if ($object->doc_type == 'customer_invoice') { + $sqlmid = 'SELECT rowid as ref'; + $sqlmid .= " FROM ".MAIN_DB_PREFIX."facture as fac"; + $sqlmid .= " WHERE fac.rowid=" . ((int) $object->fk_doc); + dol_syslog("accountancy/bookkeeping/card.php::sqlmid=" . $sqlmid, LOG_DEBUG); + $resultmid = $db->query($sqlmid); + if ($resultmid) { + $objmid = $db->fetch_object($resultmid); + $invoicestatic = new Facture($db); + $invoicestatic->fetch($objmid->ref); + $ref=$langs->trans("Invoice").' '.$invoicestatic->getNomUrl(1); } else { - // List of movements - print load_fiche_titre($langs->trans("ListeMvts"), '', ''); + dol_print_error($db); + } + } + print '' . $ref .''; + print ''; + */ + print "\n"; - print '
'; - if ($optioncss != '') { - print ''; + print dol_get_fiche_end(); + + print '
'; + + print '
'; + + $result = $object->fetchAllPerMvt($piece_num, $mode); // This load $object->linesmvt + if ($result < 0) { + setEventMessages($object->error, $object->errors, 'errors'); + } else { + // List of movements + print load_fiche_titre($langs->trans("ListeMvts"), '', ''); + + if ($optioncss != '') { + print ''; + } + + print ''; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + + if (count($object->linesmvt) > 0) { + print '
'; + print ''; + + $total_debit = 0; + $total_credit = 0; + + // Don't show in tmp mode, inevitably empty + if ($mode != "_tmp") { + // Date document export + print ''; + print ''; + print ''; + print ''; + + // Date document validation + print ''; + print ''; + print ''; + print ''; } - print ''; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - if (count($object->linesmvt) > 0) { - print '
'; - print '
' . $langs->trans("DateExport") . ''; + print $object->date_export ? dol_print_date($object->date_export, 'dayhour') : ' '; + print '
' . $langs->trans("DateValidation") . ''; + print $object->date_validation ? dol_print_date($object->date_validation, 'dayhour') : ' '; + print '
'; - - $total_debit = 0; - $total_credit = 0; - - print ''; + print ''; print_liste_field_titre("AccountAccountingShort"); print_liste_field_titre("SubledgerAccount"); @@ -655,24 +589,59 @@ if ($action == 'create') { print "\n"; - // Add an empty line if there is not yet - if (!empty($object->linesmvt[0])) { - $tmpline = $object->linesmvt[0]; - if (!empty($tmpline->numero_compte)) { - $line = new BookKeepingLine(); - $object->linesmvt[] = $line; + // In _tmp mode the first line is empty so we remove it + if ($mode == "_tmp") { + array_shift($object->linesmvt); + } + + // Add an empty line at the end to be able to add transaction + $line = new BookKeepingLine(); + $object->linesmvt[] = $line; + + // Add a second line empty line if there is not yet + if (empty($object->linesmvt[1])) { + $line = new BookKeepingLine(); + $object->linesmvt[] = $line; + } + + $count_line = count($object->linesmvt); + $num_line = 0; + foreach ($object->linesmvt as $key => $line) { + $num_line++; + print ''; + $total_debit += $line->debit; + $total_credit += $line->credit; + + if ($action == 'update' && $line->id == $id) { + print ''; + print ''; + print ''; - $total_debit += $line->debit; - $total_credit += $line->credit; - - if ($action == 'update' && $line->id == $id) { - print ''; + // Add also input for subledger label + print '
subledger_label).'" placeholder="'.dol_escape_htmltag($langs->trans("SubledgerAccountLabel")).'" />'; + print ''; + print ''; + print ''; + print ''; + print ''; + } elseif (empty($line->numero_compte) || (empty($line->debit) && empty($line->credit))) { + if ($action == "" || $action == 'add') { + print ''; print ''; print ''; - print ''; - print ''; - print ''; - print ''; - } elseif (empty($line->numero_compte) || (empty($line->debit) && empty($line->credit))) { - if ($action == "" || $action == 'add') { - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - } - } else { - print ''; - $resultfetch = $accountingaccount->fetch(null, $line->numero_compte, true); - print ''; + print ''; + print ''; + // Add button should not appear twice + if ($num_line === $count_line) { + print ''; } else { - print $line->numero_compte.' ('.$langs->trans("AccountRemovedFromCurrentChartOfAccount").')'; + print ''; } - print ''; - print ''; - print ''; - print ''; - print ''; - - print ''; } - print "\n"; - } - - $total_debit = price2num($total_debit, 'MT'); - $total_credit = price2num($total_credit, 'MT'); - - if ($total_debit != $total_credit) { - setEventMessages(null, array($langs->trans('MvtNotCorrectlyBalanced', $total_debit, $total_credit)), 'warnings'); - } - - print '
'; + print $formaccounting->select_account((GETPOSTISSET("accountingaccount_number") ? GETPOST("accountingaccount_number", "alpha") : $line->numero_compte), 'accountingaccount_number', 1, array(), 1, 1, ''); + print ''; + // TODO For the moment we keep a free input text instead of a combo. The select_auxaccount has problem because: + // It does not use the setup of "key pressed" to select a thirdparty and this hang browser on large databases. + // Also, it is not possible to use a value that is not in the list. + // Also, the label is not automatically filled when a value is selected. + if (!empty($conf->global->ACCOUNTANCY_COMBO_FOR_AUX)) { + print $formaccounting->select_auxaccount((GETPOSTISSET("subledger_account") ? GETPOST("subledger_account", "alpha") : $line->subledger_account), 'subledger_account', 1, 'maxwidth250', '', 'subledger_label'); + } else { + print 'subledger_account).'" placeholder="'.dol_escape_htmltag($langs->trans("SubledgerAccount")).'" />'; } - } - - foreach ($object->linesmvt as $line) { - print '
label_operation).'" />debit)).'" />credit)).'" />'; + print ''."\n"; + print ''; + print ''; - print $formaccounting->select_account((GETPOSTISSET("accountingaccount_number") ? GETPOST("accountingaccount_number", "alpha") : $line->numero_compte), 'accountingaccount_number', 1, array(), 1, 1, 'minwidth200 maxwidth500'); + print $formaccounting->select_account((is_array($accountingaccount_number) ? $accountingaccount_number[$key] : $accountingaccount_number ), 'accountingaccount_number['.$key.']', 1, array(), 1, 1, ''); print ''; // TODO For the moment we keep a free input text instead of a combo. The select_auxaccount has problem because: @@ -680,124 +649,102 @@ if ($action == 'create') { // Also, it is not possible to use a value that is not in the list. // Also, the label is not automatically filled when a value is selected. if (!empty($conf->global->ACCOUNTANCY_COMBO_FOR_AUX)) { - print $formaccounting->select_auxaccount((GETPOSTISSET("subledger_account") ? GETPOST("subledger_account", "alpha") : $line->subledger_account), 'subledger_account', 1, 'maxwidth250', '', 'subledger_label'); + print $formaccounting->select_auxaccount((is_array($subledger_account) ? $subledger_account[$key] : $subledger_account ), 'subledger_account['.$key.']', 1, 'maxwidth250', '', 'subledger_label'); } else { - print 'subledger_account).'" placeholder="'.dol_escape_htmltag($langs->trans("SubledgerAccount")).'">'; + print ''; } - // Add also input for subledger label - print '
subledger_label).'" placeholder="'.dol_escape_htmltag($langs->trans("SubledgerAccountLabel")).'">'; + print '
'; print '
label_operation).'">debit)).'">credit)).'">'; - print ''."\n"; - print ''; - print ''; - print $formaccounting->select_account('', 'accountingaccount_number', 1, array(), 1, 1, 'minwidth200 maxwidth500'); - print ''; - // TODO For the moment we keep a free input text instead of a combo. The select_auxaccount has problem because: - // It does not use the setup of "key pressed" to select a thirdparty and this hang browser on large databases. - // Also, it is not possible to use a value that is not in the list. - // Also, the label is not automatically filled when a value is selected. - if (!empty($conf->global->ACCOUNTANCY_COMBO_FOR_AUX)) { - print $formaccounting->select_auxaccount('', 'subledger_account', 1, 'maxwidth250', '', 'subledger_label'); - } else { - print ''; - } - print '
'; - print '
'; - if ($resultfetch > 0) { - print $accountingaccount->getNomUrl(0, 1, 1, '', 0); + print ''.length_accounta($line->subledger_account); - if ($line->subledger_label) { - print ' - '.$line->subledger_label.''; - } - print ''.$line->label_operation.''.($line->debit != 0 ? price($line->debit) : '').''.($line->credit != 0 ? price($line->credit) : '').''; - if (empty($line->date_export) && empty($line->date_validation)) { - print 'id . '&piece_num=' . urlencode($line->piece_num) . '&mode=' . urlencode($mode) . '&token=' . urlencode(newToken()) . '">'; - print img_edit('', 0, 'class="marginrightonly"'); - print '  '; - } else { - print ''; - print img_edit($langs->trans("ForbiddenTransactionAlreadyExported"), 0, 'class="marginrightonly"'); - print '  '; - } - - if (empty($line->date_validation)) { - $actiontodelete = 'delete'; - if ($mode == '_tmp' || $action != 'delmouv') { - $actiontodelete = 'confirm_delete'; - } - - print ''; - print img_delete(); - print ''; - } else { - print ''; - print img_delete($langs->trans("ForbiddenTransactionAlreadyValidated")); - print ''; - } - - print '
'; - print '
'; - - if ($mode == '_tmp' && $action == '') { - print '
'; - print '
'; - if ($total_debit == $total_credit) { - print ''.$langs->trans("ValidTransaction").''; + } else { + print ''; + $resultfetch = $accountingaccount->fetch(null, $line->numero_compte, true); + print ''; + if ($resultfetch > 0) { + print $accountingaccount->getNomUrl(0, 1, 1, '', 0); } else { - print ''; + print $line->numero_compte.' ('.$langs->trans("AccountRemovedFromCurrentChartOfAccount").')'; + } + print ''; + print ''.length_accounta($line->subledger_account); + if ($line->subledger_label) { + print ' - '.$line->subledger_label.''; + } + print ''; + print ''.$line->label_operation.''; + print ''.($line->debit != 0 ? price($line->debit) : '').''; + print ''.($line->credit != 0 ? price($line->credit) : '').''; + + print ''; + if (empty($line->date_export) && empty($line->date_validation)) { + print 'id . '&piece_num=' . urlencode($line->piece_num) . '&mode=' . urlencode($mode) . '&token=' . urlencode(newToken()) . '">'; + print img_edit('', 0, 'class="marginrightonly"'); + print '  '; + } else { + print ''; + print img_edit($langs->trans("ForbiddenTransactionAlreadyExported"), 0, 'class="marginrightonly"'); + print '  '; } - print '   '; - print ''.$langs->trans("Cancel").''; + if (empty($line->date_validation)) { + $actiontodelete = 'delete'; + if ($mode == '_tmp' || $action != 'delmouv') { + $actiontodelete = 'confirm_delete'; + } - print "
"; + print ''; + print img_delete(); + print ''; + } else { + print ''; + print img_delete($langs->trans("ForbiddenTransactionAlreadyValidated")); + print ''; + } + + print ''; } + print "\n"; } - print '
'; + $total_debit = price2num($total_debit, 'MT'); + $total_credit = price2num($total_credit, 'MT'); + + if ($total_debit != $total_credit) { + setEventMessages(null, array($langs->trans('MvtNotCorrectlyBalanced', $total_debit, $total_credit)), 'warnings'); + } + + print ''; + print '
'; + + if ($mode == '_tmp' && $action == '') { + print '
'; + print '
'; + if ($total_debit == $total_credit) { + print ''; + } else { + print ''; + } + + print '   '; + print ''.$langs->trans("Cancel").''; + + print "
"; + } } - } else { - print load_fiche_titre($langs->trans("NoRecords")); + + print ''; } +} else { + print load_fiche_titre($langs->trans("NoRecords")); } print dol_get_fiche_end(); From 35256d4ecb7213f09ec41ce5ab82fc0f1da652cf Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 7 Jan 2023 02:36:05 +0100 Subject: [PATCH 0625/1128] Fix css --- htdocs/theme/eldy/global.inc.php | 2 +- htdocs/theme/md/style.css.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 4a148611a76..4f44ab20bad 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -634,7 +634,7 @@ table.tableforfield .buttonDelete:not(.bordertransp):not(.buttonpayment) { -webkit-box-shadow: 0px 0px 5px 1px rgba(0, 0, 60, 0.2), 0px 0px 0px rgba(60,60,60,0.1); box-shadow: 0px 0px 5px 1px rgba(0, 0, 60, 0.2), 0px 0px 0px rgba(60,60,60,0.1); } -.button:hover, .buttonDelete:hover { +.button:hover:not(.nohover), .buttonDelete:hover:not(.nohover) { /* warning: having a larger shadow has side effect when button is completely on left of a table */ -webkit-box-shadow: 0px 0px 1px 1px rgba(0, 0, 0, 0.2), 0px 0px 0px rgba(60,60,60,0.1); box-shadow: 0px 0px 1px 1px rgba(0, 0, 0, 0.2), 0px 0px 0px rgba(60,60,60,0.1); diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 6fd33800eb0..41c20074d6a 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -879,7 +879,7 @@ table.tableforfield .buttonDelete:not(.bordertransp):not(.buttonpayment) { -webkit-box-shadow: 0px 0px 6px 1px rgba(0, 0, 60, 0.2), 0px 0px 0px rgba(60,60,60,0.1); box-shadow: 0px 0px 6px 1px rgba(0, 0, 60, 0.2), 0px 0px 0px rgba(60,60,60,0.1); } -.button:hover, .buttonDelete:hover { +.button:hover:not(.nohover), .buttonDelete:hover:not(.nohover) { -webkit-box-shadow: 0px 0px 6px 1px rgba(0, 0, 0, 0.2), 0px 0px 0px rgba(60,60,60,0.1); box-shadow: 0px 0px 6px 1px rgba(0, 0, 0, 0.2), 0px 0px 0px rgba(60,60,60,0.1); } From e228536329e7dcfaa7d19aee48d3b744d8c24220 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 7 Jan 2023 03:11:33 +0100 Subject: [PATCH 0626/1128] Fix date now --- htdocs/public/recruitment/view.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/htdocs/public/recruitment/view.php b/htdocs/public/recruitment/view.php index 57cb82d9b08..0d856539902 100644 --- a/htdocs/public/recruitment/view.php +++ b/htdocs/public/recruitment/view.php @@ -159,6 +159,8 @@ include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php'; * View */ +$now = dol_now(); + $head = ''; if (!empty($conf->global->MAIN_RECRUITMENT_CSS_URL)) { $head = ''."\n"; From 880be173fa4289cf479fcce1caceb26898b33118 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 7 Jan 2023 03:28:21 +0100 Subject: [PATCH 0627/1128] Fix typo --- htdocs/public/recruitment/view.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/public/recruitment/view.php b/htdocs/public/recruitment/view.php index 0d856539902..de8297d3ef0 100644 --- a/htdocs/public/recruitment/view.php +++ b/htdocs/public/recruitment/view.php @@ -203,7 +203,7 @@ $paramlogo = 'ONLINE_RECRUITMENT_LOGO_'.$suffix; if (!empty($conf->global->$paramlogo)) { $logosmall = $conf->global->$paramlogo; } elseif (!empty($conf->global->ONLINE_RECRUITMENT_LOGO)) { - $logosmall = $conf->global->ONLINE_RECRUITMENT_LOGO_; + $logosmall = $conf->global->ONLINE_RECRUITMENT_LOGO; } //print ''."\n"; // Define urllogo @@ -236,7 +236,7 @@ if ($urllogo) { if (!empty($conf->global->RECRUITMENT_IMAGE_PUBLIC_INTERFACE)) { print '
'; - print ''; + print ''; print '
'; } From 00740ca267563eee40691aa8ab94294b2f363ad6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 7 Jan 2023 04:05:59 +0100 Subject: [PATCH 0628/1128] WIP Work on public virtual card --- htdocs/adherents/admin/website.php | 2 +- htdocs/core/class/vcard.class.php | 87 +++++++ htdocs/core/lib/functions.lib.php | 47 ++-- htdocs/core/lib/functions2.lib.php | 2 +- htdocs/langs/en_US/users.lang | 3 + htdocs/public/users/view.php | 381 +++++++++++++++++++++++++++++ htdocs/theme/eldy/global.inc.php | 4 +- htdocs/theme/md/style.css.php | 3 + htdocs/user/card.php | 10 +- htdocs/user/class/user.class.php | 24 ++ htdocs/user/info.php | 2 +- htdocs/user/vcard.php | 105 ++------ htdocs/user/virtualcard.php | 248 +++++++++++++++++++ 13 files changed, 810 insertions(+), 108 deletions(-) create mode 100644 htdocs/public/users/view.php create mode 100644 htdocs/user/virtualcard.php diff --git a/htdocs/adherents/admin/website.php b/htdocs/adherents/admin/website.php index 08e9f617750..14379166247 100644 --- a/htdocs/adherents/admin/website.php +++ b/htdocs/adherents/admin/website.php @@ -178,7 +178,7 @@ if (!empty($conf->global->MEMBER_ENABLE_PUBLIC)) { //print $langs->trans('FollowingLinksArePublic').'
'; print img_picto('', 'globe').' '.$langs->trans('BlankSubscriptionForm').'
'; if (isModEnabled('multicompany')) { - $entity_qr = '?entity='.$conf->entity; + $entity_qr = '?entity='.((int) $conf->entity); } else { $entity_qr = ''; } diff --git a/htdocs/core/class/vcard.class.php b/htdocs/core/class/vcard.class.php index dbe505a894b..91e3a5565e1 100644 --- a/htdocs/core/class/vcard.class.php +++ b/htdocs/core/class/vcard.class.php @@ -1,4 +1,7 @@ * Copyright (C) 2005-2017 Laurent Destailleur * Copyright (C) 2020 Tobias Sekan @@ -367,6 +370,90 @@ class vCard return $this->filename; } + /** + * Return a VCARD string + * + * @param Object $object Object + * @param Societe $company Company + * @param Translate $langs Lang object + * @return string String + */ + public function buildVCardString($object, $company, $langs) + { + $this->setProdId('Dolibarr '.DOL_VERSION); + + $this->setUid('DOLIBARR-USERID-'.$object->id); + $this->setName($object->lastname, $object->firstname, "", $object->civility_code, ""); + $this->setFormattedName($object->getFullName($langs, 1)); + + $this->setPhoneNumber($object->office_phone, "TYPE=WORK;VOICE"); + $this->setPhoneNumber($object->personal_mobile, "TYPE=HOME;VOICE"); + $this->setPhoneNumber($object->user_mobile, "TYPE=CELL;VOICE"); + $this->setPhoneNumber($object->office_fax, "TYPE=WORK;FAX"); + + $country = $object->country_code ? $object->country : ''; + + $this->setAddress("", "", $object->address, $object->town, $object->state, $object->zip, $country, "TYPE=WORK;POSTAL"); + $this->setLabel("", "", $object->address, $object->town, $object->state, $object->zip, $country, "TYPE=WORK"); + + $this->setEmail($object->email, "TYPE=WORK"); + $this->setNote($object->note_public); + $this->setTitle($object->job); + + if ($company->id > 0) { + $this->setURL($company->url, "TYPE=WORK"); + if (!$object->office_phone) { + $this->setPhoneNumber($company->phone, "TYPE=WORK;VOICE"); + } + if (!$object->office_fax) { + $this->setPhoneNumber($company->fax, "TYPE=WORK;FAX"); + } + if (!$object->zip) { + $this->setAddress("", "", $company->address, $company->town, $company->state, $company->zip, $company->country, "TYPE=WORK;POSTAL"); + } + + // when company e-mail is empty, use only user e-mail + if (empty(trim($company->email))) { + // was set before, don't set twice + } elseif (empty(trim($object->email))) { + // when user e-mail is empty, use only company e-mail + $this->setEmail($company->email, "TYPE=WORK"); + } else { + $tmpuser2 = explode("@", trim($object->email)); + $tmpcompany = explode("@", trim($company->email)); + + if (strtolower(end($tmpuser2)) == strtolower(end($tmpcompany))) { + // when e-mail domain of user and company are the same, use user e-mail at first (and company e-mail at second) + $this->setEmail($object->email, "TYPE=WORK"); + + // support by Microsoft Outlook (2019 and possible earlier) + $this->setEmail($company->email, 'INTERNET'); + } else { + // when e-mail of user and company complete different use company e-mail at first (and user e-mail at second) + $this->setEmail($company->email, "TYPE=WORK"); + + // support by Microsoft Outlook (2019 and possible earlier) + $this->setEmail($object->email, 'INTERNET'); + } + } + + // Si user lie a un tiers non de type "particulier" + if ($company->typent_code != 'TE_PRIVATE') { + $this->setOrg($company->name); + } + } + + // Personal informations + $this->setPhoneNumber($object->personal_mobile, "TYPE=HOME;VOICE"); + if ($object->birth) { + $this->setBirthday($object->birth); + } + + // Return VCard string + return $this->getVCard(); + } + + /* Example from Microsoft Outlook 2019 BEGIN:VCARD diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 7ac6150c5ac..ac774209d30 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -101,31 +101,41 @@ function getDolGlobalInt($key, $default = 0) } /** - * Return dolibarr user constant string value + * Return Dolibarr user constant string value * * @param string $key key to return value, return '' if not set * @param string $default value to return + * @param User $tmpuser To get another user than current user * @return string */ -function getDolUserString($key, $default = '') +function getDolUserString($key, $default = '', $tmpuser = null) { - global $user; + if (empty($tmpuser)) { + global $user; + $tmpuser = $user; + } + // return $conf->global->$key ?? $default; - return (string) (empty($user->conf->$key) ? $default : $user->conf->$key); + return (string) (empty($tmpuser->conf->$key) ? $default : $$tmpuser->conf->$key); } /** - * Return dolibarr user constant int value + * Return Dolibarr user constant int value * * @param string $key key to return value, return 0 if not set * @param int $default value to return + * @param User $tmpuser To get another user than current user * @return int */ -function getDolUserInt($key, $default = 0) +function getDolUserInt($key, $default = 0, $tmpuser = null) { - global $user; + if (empty($tmpuser)) { + global $user; + $tmpuser = $user; + } + // return $conf->global->$key ?? $default; - return (int) (empty($user->conf->$key) ? $default : $user->conf->$key); + return (int) (empty($tmpuser->conf->$key) ? $default : $tmpuser->conf->$key); } /** @@ -1717,7 +1727,7 @@ function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename = * * @param string $name A name for the html component * @param string $label Label shown in Popup title top bar - * @param string $buttonstring button string + * @param string $buttonstring button string (HTML text we can click on) * @param string $url Relative Url to open. For example '/project/card.php' * @param string $disabled Disabled text * @param string $morecss More CSS @@ -1725,7 +1735,7 @@ function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename = * Value is 'keyforpopupid:Name_of_html_component_to_set_with id,Name_of_html_component_to_set_with_label' * @return string HTML component with button */ -function dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled = '', $morecss = 'button bordertransp', $backtopagejsfields = '') +function dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled = '', $morecss = 'classlink button bordertransp', $backtopagejsfields = '') { global $conf; @@ -1753,7 +1763,7 @@ function dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $di //print ''; $out .= ''; - $out .= 'use_javascript_ajax)) { $out .= ' href="'.DOL_URL_ROOT.$url.'" target="_blank"'; } @@ -2239,6 +2249,7 @@ function dol_banner_tab($object, $paramid, $morehtml = '', $shownav = 1, $fieldi } } + // Show barcode if ($showbarcode) { $morehtmlleft .= '
'.$form->showbarcode($object, 100, 'photoref valignmiddle').'
'; } @@ -2988,9 +2999,10 @@ function dol_print_size($size, $shortvalue = 0, $shortunit = 0) * @param string $target Target for link * @param int $max Max number of characters to show * @param int $withpicto With picto + * @param string $morecss More CSS * @return string HTML Link */ -function dol_print_url($url, $target = '_blank', $max = 32, $withpicto = 0) +function dol_print_url($url, $target = '_blank', $max = 32, $withpicto = 0, $morecss = 'float') { global $langs; @@ -3013,7 +3025,12 @@ function dol_print_url($url, $target = '_blank', $max = 32, $withpicto = 0) } $link .= dol_trunc($url, $max); $link .= '
'; - return '
'.($withpicto ?img_picto($langs->trans("Url"), 'globe').' ' : '').$link.'
'; + + if ($morecss == 'float') { + return '
'.($withpicto ?img_picto($langs->trans("Url"), 'globe').' ' : '').$link.'
'; + } else { + return ''.($withpicto ?img_picto($langs->trans("Url"), 'globe').' ' : '').$link.''; + } } /** @@ -4067,7 +4084,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $ 'filter', 'file-code', 'file-export', 'file-import', 'file-upload', 'autofill', 'folder', 'folder-open', 'folder-plus', 'generate', 'globe', 'globe-americas', 'graph', 'grip', 'grip_title', 'group', 'help', 'holiday', - 'images', 'incoterm', 'info', 'intervention', 'inventory', 'intracommreport', 'knowledgemanagement', + 'id-card', 'images', 'incoterm', 'info', 'intervention', 'inventory', 'intracommreport', 'knowledgemanagement', 'label', 'language', 'line', 'link', 'list', 'list-alt', 'listlight', 'loan', 'lock', 'lot', 'long-arrow-alt-right', 'margin', 'map-marker-alt', 'member', 'meeting', 'money-bill-alt', 'movement', 'mrp', 'note', 'next', 'off', 'on', 'order', @@ -4134,7 +4151,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $ 'supplier'=>'building', 'technic'=>'cogs', 'timespent'=>'clock', 'title_setup'=>'tools', 'title_accountancy'=>'money-check-alt', 'title_bank'=>'university', 'title_hrm'=>'umbrella-beach', 'title_agenda'=>'calendar-alt', - 'uncheck'=>'times', 'uparrow'=>'share', 'url'=>'external-link-alt', 'vat'=>'money-check-alt', 'vcard'=>'address-card', + 'uncheck'=>'times', 'uparrow'=>'share', 'url'=>'external-link-alt', 'vat'=>'money-check-alt', 'vcard'=>'arrow-alt-circle-down', 'jabber'=>'comment-o', 'website'=>'globe-americas', 'workstation'=>'pallet', 'webhook'=>'bullseye', 'world'=>'globe', 'private'=>'user-lock', 'conferenceorbooth'=>'chalkboard-teacher', 'eventorganization'=>'project-diagram' diff --git a/htdocs/core/lib/functions2.lib.php b/htdocs/core/lib/functions2.lib.php index 692d01f9ef0..6b51cf76150 100644 --- a/htdocs/core/lib/functions2.lib.php +++ b/htdocs/core/lib/functions2.lib.php @@ -1784,7 +1784,7 @@ function weight_convert($weight, &$from_unit, $to_unit) * @param DoliDB $db Handler database * @param Conf $conf Object conf * @param User $user Object user - * @param array $tab Array (key=>value) with all parameters to save + * @param array $tab Array (key=>value) with all parameters to save/update * @return int <0 if KO, >0 if OK * * @see dolibarr_get_const(), dolibarr_set_const(), dolibarr_del_const() diff --git a/htdocs/langs/en_US/users.lang b/htdocs/langs/en_US/users.lang index 757e9f1dedf..2f691153292 100644 --- a/htdocs/langs/en_US/users.lang +++ b/htdocs/langs/en_US/users.lang @@ -129,3 +129,6 @@ IPLastLogin=IP last login IPPreviousLogin=IP previous login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card \ No newline at end of file diff --git a/htdocs/public/users/view.php b/htdocs/public/users/view.php new file mode 100644 index 00000000000..2bc5e8e9245 --- /dev/null +++ b/htdocs/public/users/view.php @@ -0,0 +1,381 @@ + + * + * 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/public/users/view.php + * \ingroup user + * \brief Public file to user profile + */ + +if (!defined('NOLOGIN')) { + define("NOLOGIN", 1); // This means this output page does not require to be logged. +} +if (!defined('NOCSRFCHECK')) { + define("NOCSRFCHECK", 1); // We accept to go on this page from external web site. +} +if (!defined('NOIPCHECK')) { + define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip +} +if (!defined('NOBROWSERNOTIF')) { + define('NOBROWSERNOTIF', '1'); +} + +// Load Dolibarr environment +require '../../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/security.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/vcard.class.php'; + +// Load translation files required by the page +$langs->loadLangs(array("companies", "other", "recruitment")); + +// Get parameters +$action = GETPOST('action', 'aZ09'); +$cancel = GETPOST('cancel', 'alpha'); +$backtopage = ''; + +$id = GETPOST('id', 'int'); +$securekey = GETPOST('securekey', 'alpha'); +$suffix = GETPOST('suffix'); + +$object = new User($db); +$object->fetch($id, '', '', 1); + +// Define $urlwithroot +//$urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root)); +//$urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file +$urlwithroot = DOL_MAIN_URL_ROOT; // This is to use same domain name than current. For Paypal payment, we can use internal URL like localhost. + +// Security check +global $dolibarr_main_instance_unique_id; +$encodedsecurekey = dol_hash($dolibarr_main_instance_unique_id.'uservirtualcard'.$object->id.'-'.$object->login, 'md5'); +if ($encodedsecurekey != $securekey) { + httponly_accessforbidden('User profile page not found or not allowed'); +} + + +/* + * Actions + */ + +if ($cancel) { + if (!empty($backtopage)) { + header("Location: ".$backtopage); + exit; + } + $action = 'view'; +} + +/* +if ($action == "view" || $action == "presend" || $action == "dosubmit") { + $error = 0; + $display_ticket = false; + if (!strlen($ref)) { + $error++; + array_push($object->errors, $langs->trans("ErrorFieldRequired", $langs->transnoentities("Ref"))); + $action = ''; + } + if (!strlen($email)) { + $error++; + array_push($object->errors, $langs->trans("ErrorFieldRequired", $langs->transnoentities("Email"))); + $action = ''; + } else { + if (!isValidEmail($email)) { + $error++; + array_push($object->errors, $langs->trans("ErrorEmailInvalid")); + $action = ''; + } + } + + if (!$error) { + $ret = $object->fetch('', $ref); + } + + if ($error || $errors) { + setEventMessages($object->error, $object->errors, 'errors'); + if ($action == "dosubmit") { + $action = 'presend'; + } else { + $action = ''; + } + } +} +*/ +//var_dump($action); +//$object->doActions($action); + +// Actions to send emails (for ticket, we need to manage the addfile and removefile only) +/*$triggersendname = 'USER_SENTBYMAIL'; +$paramname = 'id'; +$autocopy = 'MAIN_MAIL_AUTOCOPY_USER_TO'; // used to know the automatic BCC to add +$trackid = 'use'.$object->id; +include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php'; +*/ + + +/* + * View + */ + +$form = new Form($db); +$company = $mysoc; + +if ($action == 'vcard') { + // We create VCard + $v = new vCard(); + $output = $v->buildVCardString($object, $company, $langs); + + $filename = trim(urldecode($v->getFileName())); // "Nom prenom.vcf" + $filenameurlencoded = dol_sanitizeFileName(urlencode($filename)); + //$filename = dol_sanitizeFileName($filename); + + top_httphead('text/x-vcard; name="'.$filename.'"'); + + header("Content-Disposition: attachment; filename=\"".$filename."\""); + header("Content-Length: ".dol_strlen($output)); + header("Connection: close"); + + print $output; + + $db->close(); + + exit; +} + +$head = ''; +if (!empty($conf->global->MAIN_USER_PROFILE_CSS_URL)) { + $head = ''."\n"; +} + +$conf->dol_hide_topmenu = 1; +$conf->dol_hide_leftmenu = 1; + +if (!getDolUserInt('USER_ENABLE_PUBLIC', 0, $object)) { + $langs->load("errors"); + print '
'.$langs->trans('ErrorPublicInterfaceNotEnabled').'
'; + $db->close(); + exit(); +} + +$arrayofjs = array(); +$arrayofcss = array(); + +$replacemainarea = (empty($conf->dol_hide_leftmenu) ? '
' : '').'
'; +llxHeader($head, $langs->trans("UserProfile").' '.$object->getFullName($langs), '', '', 0, 0, '', '', '', 'onlinepaymentbody', $replacemainarea, 1, 1); + +print ''."\n"; +print '
'."\n"; +print '
'."\n"; +print ''."\n"; +print ''."\n"; +print ''."\n"; +print ''; +print "\n"; +print ''."\n"; + +$modulepart = 'user'; +$imagesize = 'small'; +$dir = $conf->user->dir_output; +$email = $object->email; + +// Show logo (search order: logo defined by ONLINE_SIGN_LOGO_suffix, then ONLINE_SIGN_LOGO_, then small company logo, large company logo, theme logo, common logo) +// Define logo and logosmall +$logo = ''; +$logosmall = ''; +if (!empty($object->photo)) { + if (dolIsAllowedForPreview($object->photo)) { + $logosmall = get_exdir(0, 0, 0, 0, $object, 'user').'photos/'.getImageFileNameForSize($object->photo, '_small'); + $logo = get_exdir(0, 0, 0, 0, $object, 'user').'photos/'.$object->photo; + //$originalfile = get_exdir(0, 0, 0, 0, $object, 'user').'photos/'.$object->photo; + } +} +//print ''."\n"; +// Define urllogo +$urllogo = ''; +$urllogofull = ''; +if (!empty($logosmall) && is_readable($conf->user->dir_output.'/'.$logosmall)) { + $urllogo = DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$conf->entity.'&file='.urlencode($logosmall); + $urllogofull = $dolibarr_main_url_root.'/viewimage.php?modulepart='.$modulepart.'&entity='.$conf->entity.'&file='.urlencode($logosmall); +} elseif (!empty($logo) && is_readable($conf->user->dir_output.'/'.$logo)) { + $urllogo = DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$conf->entity.'&file='.urlencode($logo); + $urllogofull = $dolibarr_main_url_root.'/viewimage.php?modulepart='.$modulepart.'&entity='.$conf->entity.'&file='.urlencode($logo); +} + +// Output html code for logo +print '
'; +print '
'; + +// Show photo +if ($urllogo) { + /*if (!empty($mysoc->url)) { + print ''; + }*/ + print ''; + /*if (!empty($mysoc->url)) { + print ''; + }*/ +} +print '
'; +/*if (empty($conf->global->MAIN_HIDE_POWERED_BY)) { + print ''; +}*/ +print '
'; + + +if (!empty($conf->global->USER_IMAGE_PUBLIC_INTERFACE)) { + print '
'; + print ''; + print '
'; +} + +$urlforqrcode = $_SERVER["PHP_SELF"].'?action=vcard&id='.((int) $object->id).'&securekey='.urlencode($securekey); + +// Show barcode +$showbarcode = GETPOST('nobarcode') ? 0 : 1; +if ($showbarcode) { + print '
'; + print '
'; + print 'QRCODE...
'; + print $urlforqrcode; + print '
'; + print '
'; + print '
'; +} + + +print '
'.$langs->trans("Me").'
'."\n"; +print ''."\n"; + +// Output payment summary form +print ''."\n"; + +print '
'; + +print '
'; + +print '
'; + +// Add contact info +print '...'; + +print '
'; + + +print '
'."\n"; +print "\n"; + +print '
'."\n"; + + + + +print '
'.$langs->trans("MyCompany").'
'."\n"; +print ''."\n"; + +// Output payment summary form +print ''."\n"; + +print '
'; + +print '
'; + +// Add company info + + +// Show logo (search order: logo defined by ONLINE_SIGN_LOGO_suffix, then ONLINE_SIGN_LOGO_, then small company logo, large company logo, theme logo, common logo) +// Define logo and logosmall +$logosmall = $mysoc->logo_small; +$logo = $mysoc->logo; +$paramlogo = 'ONLINE_USER_LOGO_'.$suffix; +if (!empty($conf->global->$paramlogo)) { + $logosmall = $conf->global->$paramlogo; +} elseif (!empty($conf->global->ONLINE_USER_LOGO)) { + $logosmall = $conf->global->ONLINE_USER_LOGO; +} +//print ''."\n"; +// Define urllogo +$urllogo = ''; +$urllogofull = ''; +if (!empty($logosmall) && is_readable($conf->mycompany->dir_output.'/logos/thumbs/'.$logosmall)) { + $urllogo = DOL_URL_ROOT.'/viewimage.php?modulepart=mycompany&entity='.$conf->entity.'&file='.urlencode('logos/thumbs/'.$logosmall); + $urllogofull = $dolibarr_main_url_root.'/viewimage.php?modulepart=mycompany&entity='.$conf->entity.'&file='.urlencode('logos/thumbs/'.$logosmall); +} elseif (!empty($logo) && is_readable($conf->mycompany->dir_output.'/logos/'.$logo)) { + $urllogo = DOL_URL_ROOT.'/viewimage.php?modulepart=mycompany&entity='.$conf->entity.'&file='.urlencode('logos/'.$logo); + $urllogofull = $dolibarr_main_url_root.'/viewimage.php?modulepart=mycompany&entity='.$conf->entity.'&file='.urlencode('logos/'.$logo); +} +// Output html code for logo +if ($urllogo) { + print '
'; + if (!empty($mysoc->url)) { + print ''; + } + print ''; + if (!empty($mysoc->url)) { + print ''; + } + print '
'; +} + + +if ($mysoc->email) { + print '
'; + print img_picto('', 'email', 'class="pictofixedwidth"').dol_print_email($mysoc->email, 0, 0, 1); + print '
'; +} + +if ($mysoc->url) { + print '
'; + print img_picto('', 'globe', 'class="pictofixedwidth"'); + //print 'rr'; + print dol_print_url($mysoc->url, '_blank', 0, 0, ''); + print '
'; +} + + +print '
'."\n"; +print "\n"; + +print '
'."\n"; + + + +// Description +$text = getDolUserString('USER_PUBLIC_MORE', '', $object); +print $text; + + +print '
'."\n"; +print '
'."\n"; +print '
'; + + +//htmlPrintOnlinePaymentFooter($mysoc, $langs); + +print ''; + +llxFooter('', 'public'); + +$db->close(); diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 4f44ab20bad..983e571e399 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -910,7 +910,9 @@ textarea.centpercent { .nomarginright { margin-: unset; } - +.nowidthimp { + width: unset !important; +} .cursordefault { cursor: default; } diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 41c20074d6a..89358053ef3 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -1147,6 +1147,9 @@ textarea.centpercent { .nomarginright { margin-: unset; } +.nowidthimp { + width: unset !important; +} .cursordefault { cursor: default; diff --git a/htdocs/user/card.php b/htdocs/user/card.php index f26d61da521..8fceddf313b 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -1432,10 +1432,18 @@ if ($action == 'create' || $action == 'adduserldap') { if ($action != 'edit') { print dol_get_fiche_head($head, 'user', $title, -1, 'user'); - $morehtmlref = ''; + $morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; + //$urltovirtualcard = $object->getOnlineVirtualCardUrl(); + $urltovirtualcard = '/user/virtualcard.php?id='.((int) $object->id); + + $morehtmlref .= dolButtonToOpenUrlInDialogPopup('publicvirtualcard', $langs->trans("PublicVirtualCardUrl"), img_picto($langs->trans("PublicVirtualCardUrl"), 'card', 'class="valignmiddle marginleftonly paddingrightonly"'), $urltovirtualcard, '', 'nohover'); + /*$morehtmlref .= ''; + $morehtmlref .= img_picto($langs->trans("PublicVirtualCardUrl"), 'id-card', 'class="valignmiddle marginleftonly paddingrightonly"'); + $morehtmlref .= '';*/ + dol_banner_tab($object, 'id', $linkback, $user->hasRight("user", "user", "read") || $user->admin, 'rowid', 'ref', $morehtmlref); print '
'; diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index a4d4c7acfe6..9104dd5cfd4 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -3786,6 +3786,30 @@ class User extends CommonObject } } + /** + * Return string with full Url to virtual card + * + * @return string Url string + */ + public function getOnlineVirtualCardUrl() + { + global $dolibarr_main_instance_unique_id, $dolibarr_main_url_root; + global $conf; + + $encodedsecurekey = dol_hash($dolibarr_main_instance_unique_id.'uservirtualcard'.$this->id.'-'.$this->login, 'md5'); + if (isModEnabled('multicompany')) { + $entity_qr = '&entity='.((int) $conf->entity); + } else { + $entity_qr = ''; + } + // Define $urlwithroot + $urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root)); + $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file + //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current + + return $urlwithroot.'/public/users/view.php?id='.$this->id.'&securekey='.$encodedsecurekey.$entity_qr; + } + /** * Load all objects into $this->users * diff --git a/htdocs/user/info.php b/htdocs/user/info.php index dfb1fe23d0b..3f5d1aea604 100644 --- a/htdocs/user/info.php +++ b/htdocs/user/info.php @@ -51,7 +51,7 @@ $feature2 = (($socid && $user->rights->user->self->creer) ? '' : 'user'); $result = restrictedArea($user, 'user', $id, 'user&user', $feature2); // If user is not user that read and no permission to read other users, we stop -if (($object->id != $user->id) && (!$user->rights->user->user->lire)) { +if (($object->id != $user->id) && empty($user->rights->user->user->lire)) { accessforbidden(); } diff --git a/htdocs/user/vcard.php b/htdocs/user/vcard.php index 6e7035d99ec..576d2b90a5b 100644 --- a/htdocs/user/vcard.php +++ b/htdocs/user/vcard.php @@ -21,8 +21,8 @@ /** * \file htdocs/user/vcard.php - * \ingroup societe - * \brief Onglet vcard d'un user + * \ingroup user + * \brief Page to return a user vcard */ // Load Dolibarr environment @@ -31,9 +31,6 @@ require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php'; require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/vcard.class.php'; -$user2 = new User($db); - - $id = GETPOST('id', 'int'); // Security check @@ -44,106 +41,38 @@ if ($user->socid > 0) { $feature2 = 'user'; $result = restrictedArea($user, 'user', $id, 'user', $feature2); - -$result = $user2->fetch($id); +$object = new User($db); +$result = $object->fetch($id); if ($result <= 0) { - dol_print_error($user2->error); + dol_print_error($object->error); exit; } -$physicalperson = 1; - +// Data from linked company $company = new Societe($db); -if ($user2->socid) { - $result = $company->fetch($user2->socid); +if ($object->socid > 0) { + $result = $company->fetch($object->socid); } + +/* + * View + */ + // We create VCard $v = new vCard(); -$v->setProdId('Dolibarr '.DOL_VERSION); - -$v->setUid('DOLIBARR-USERID-'.$user2->id); -$v->setName($user2->lastname, $user2->firstname, "", $user2->civility_code, ""); -$v->setFormattedName($user2->getFullName($langs, 1)); - -$v->setPhoneNumber($user2->office_phone, "TYPE=WORK;VOICE"); -$v->setPhoneNumber($user2->personal_mobile, "TYPE=HOME;VOICE"); -$v->setPhoneNumber($user2->user_mobile, "TYPE=CELL;VOICE"); -$v->setPhoneNumber($user2->office_fax, "TYPE=WORK;FAX"); - -$country = $user2->country_code ? $user2->country : ''; - -$v->setAddress("", "", $user2->address, $user2->town, $user2->state, $user2->zip, $country, "TYPE=WORK;POSTAL"); -$v->setLabel("", "", $user2->address, $user2->town, $user2->state, $user2->zip, $country, "TYPE=WORK"); - -$v->setEmail($user2->email, "TYPE=WORK"); -$v->setNote($user2->note_public); -$v->setTitle($user2->job); - -// Data from linked company -if ($company->id) { - $v->setURL($company->url, "TYPE=WORK"); - if (!$user2->office_phone) { - $v->setPhoneNumber($company->phone, "TYPE=WORK;VOICE"); - } - if (!$user2->office_fax) { - $v->setPhoneNumber($company->fax, "TYPE=WORK;FAX"); - } - if (!$user2->zip) { - $v->setAddress("", "", $company->address, $company->town, $company->state, $company->zip, $company->country, "TYPE=WORK;POSTAL"); - } - - // when company e-mail is empty, use only user e-mail - if (empty(trim($company->email))) { - // was set before, don't set twice - } elseif (empty(trim($user2->email))) { - // when user e-mail is empty, use only company e-mail - $v->setEmail($company->email, "TYPE=WORK"); - } else { - $tmpuser2 = explode("@", trim($user2->email)); - $tmpcompany = explode("@", trim($company->email)); - - if (strtolower(end($tmpuser2)) == strtolower(end($tmpcompany))) { - // when e-mail domain of user and company are the same, use user e-mail at first (and company e-mail at second) - $v->setEmail($user2->email, "TYPE=WORK"); - - // support by Microsoft Outlook (2019 and possible earlier) - $v->setEmail($company->email, 'INTERNET'); - } else { - // when e-mail of user and company complete different use company e-mail at first (and user e-mail at second) - $v->setEmail($company->email, "TYPE=WORK"); - - // support by Microsoft Outlook (2019 and possible earlier) - $v->setEmail($user2->email, 'INTERNET'); - } - } - - // Si user lie a un tiers non de type "particulier" - if ($company->typent_code != 'TE_PRIVATE') { - $v->setOrg($company->name); - } -} - -// Personal informations -$v->setPhoneNumber($user2->personal_mobile, "TYPE=HOME;VOICE"); -if ($user2->birth) { - $v->setBirthday($user2->birth); -} - -$db->close(); - -// Renvoi la VCard au navigateur - -$output = $v->getVCard(); +$output = $v->buildVCardString($object, $company, $langs); $filename = trim(urldecode($v->getFileName())); // "Nom prenom.vcf" $filenameurlencoded = dol_sanitizeFileName(urlencode($filename)); //$filename = dol_sanitizeFileName($filename); +top_httphead('text/x-vcard; name="'.$filename.'"'); header("Content-Disposition: attachment; filename=\"".$filename."\""); header("Content-Length: ".dol_strlen($output)); header("Connection: close"); -header("Content-Type: text/x-vcard; name=\"".$filename."\""); print $output; + +$db->close(); diff --git a/htdocs/user/virtualcard.php b/htdocs/user/virtualcard.php new file mode 100644 index 00000000000..30dc32ad01c --- /dev/null +++ b/htdocs/user/virtualcard.php @@ -0,0 +1,248 @@ + + * Copyright (C) 2005-2015 Regis Houssin + * + * 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/user/virtualcard.php + * \ingroup core + * \brief Page to setup a virtual card + */ + +// Load Dolibarr environment +require '../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/usergroups.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php'; + +// Load translation files required by page +$langs->load("users"); + +// Security check +$id = GETPOST('id', 'int'); +$ref = GETPOST('ref', 'alpha'); +$action = GETPOST('action', 'aZ09'); + +$object = new User($db); +if ($id > 0 || !empty($ref)) { + $result = $object->fetch($id, $ref, '', 1); + $object->getrights(); +} + +// Security check +$socid = 0; +if ($user->socid > 0) { + $socid = $user->socid; +} +$feature2 = (($socid && $user->rights->user->self->creer) ? '' : 'user'); + +$result = restrictedArea($user, 'user', $id, 'user&user', $feature2); + +// If user is not the user that read and has no permission to read other users, we stop +if (($object->id != $user->id) && empty($user->rights->user->user->lire)) { + accessforbidden(); +} + +/* + * Actions + */ + +if ($action == 'update') { + $tmparray = array(); + $tmparray['USER_PUBLIC_COMPANY_NAME'] = (GETPOST('USER_PUBLIC_COMPANY_NAME') ? 1 : 0); + $tmparray['USER_PUBLIC_JOBPOSITION'] = (GETPOST('USER_PUBLIC_JOBPOSITION') ? 1 : 0); + $tmparray['USER_PUBLIC_EMAIL'] = (GETPOST('USER_PUBLIC_EMAIL') ? 1 : 0); + $tmparray['USER_PUBLIC_PHONE'] = (GETPOST('USER_PUBLIC_PHONE') ? 1 : 0); + $tmparray['USER_PUBLIC_SOCIALNETWORKS'] = (GETPOST('USER_PUBLIC_SOCIALNETWORKS') ? 1 : 0); + $tmparray['USER_PUBLIC_MORE'] = (GETPOST('USER_PUBLIC_MORE') ? GETPOST('USER_PUBLIC_MORE') : ''); + + dol_set_user_param($db, $conf, $object, $tmparray); +} + +if ($action == 'setUSER_ENABLE_PUBLIC') { + if (GETPOST('value')) { + $tmparray = array('USER_ENABLE_PUBLIC' => 1); + } else { + $tmparray = array('USER_ENABLE_PUBLIC' => 0); + } + dol_set_user_param($db, $conf, $object, $tmparray); +} + + +/* + * View + */ + +$form = new Form($db); + +$person_name = !empty($object->firstname) ? $object->lastname.", ".$object->firstname : $object->lastname; +$title = $person_name." - ".$langs->trans('Info'); +$help_url = ''; +llxHeader('', $title, $help_url); + +$head = user_prepare_head($object); + +$title = $langs->trans("User"); +//print dol_get_fiche_head($head, 'info', $title, -1, 'user'); + + +$linkback = ''; + +if ($user->rights->user->user->lire || $user->admin) { + $linkback = ''.$langs->trans("BackToList").''; +} + +$morehtmlref = ''; +$morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); +$morehtmlref .= ''; + +//dol_banner_tab($object, 'id', $linkback, $user->rights->user->user->lire || $user->admin, 'rowid', 'ref', $morehtmlref); + + +print '
'; + +print '
'; + +/* + print ''.$langs->trans("VCard").'
'; + +print ''; +print img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); +print ''; + + +print '
'; +//print '
'; + +print '
'; +*/ + +print ''.$langs->trans("UserPublicPageDesc").'

'; + +$param = '&id='.((int) $object->id); + +$enabledisablehtml = $langs->trans("EnablePublicVirtualCard").' '; +if (!getDolUserInt('USER_ENABLE_PUBLIC', 0, $object)) { + // Button off, click to enable + $enabledisablehtml .= ''; + $enabledisablehtml .= img_picto($langs->trans("Disabled"), 'switch_off'); + $enabledisablehtml .= ''; +} else { + // Button on, click to disable + $enabledisablehtml .= ''; + $enabledisablehtml .= img_picto($langs->trans("Activated"), 'switch_on'); + $enabledisablehtml .= ''; +} +print $enabledisablehtml; +print ''; + +print '

'; + +print '
'; +print ''; +print ''; +print ''; + +if (getDolUserInt('USER_ENABLE_PUBLIC', 0, $object)) { + print '
'; + //print $langs->trans('FollowingLinksArePublic').'
'; + print img_picto('', 'globe').' '.$langs->trans('PublicVirtualCardUrl').'
'; + + $fullexternaleurltovirtualcard = $object->getOnlineVirtualCardUrl(); + + print ''; + print ajax_autoselect('publicurluser'); + + print '
'; + + print '
'; + print ''; + + print ''; + print ''; + print ''; + print "\n"; + + // Company name + print '\n"; + + // Job position + print '\n"; + + // Email + print '\n"; + + // Phone + print '\n"; + + // Social networks + print '\n"; + + // More + print '\n"; + + print '
'.$langs->trans("Parameter").''.$langs->trans("Value").'
'; + print $langs->trans("Company"); + print ''; + //print ''; + print $form->selectyesno("USER_PUBLIC_COMPANY_NAME", (getDolUserInt('USER_PUBLIC_COMPANY_NAME', 0, $object) ? getDolUserInt('USER_PUBLIC_COMPANY_NAME', 0, $object) : 0), 1); + print "
'; + print $langs->trans("PostOrFunction"); + print ''; + print $form->selectyesno("USER_PUBLIC_JOBPOSITION", (getDolUserInt('USER_PUBLIC_JOBPOSITION', 0, $object) ? getDolUserInt('USER_PUBLIC_JOBPOSITION', 0, $object) : 0), 1); + print "
'; + print $langs->trans("Email"); + print ''; + print $form->selectyesno("USER_PUBLIC_EMAIL", (getDolUserInt('USER_PUBLIC_EMAIL', 0, $object) ? getDolUserInt('USER_PUBLIC_EMAIL', 0, $object) : 0), 1); + print "
'; + print $langs->trans("Phone"); + print ''; + print $form->selectyesno("USER_PUBLIC_PHONE", (getDolUserInt('USER_PUBLIC_PHONE', 0, $object) ? getDolUserInt('USER_PUBLIC_PHONE', 0, $object) : 0), 1); + print "
'; + print $langs->trans("SocialNetworks"); + print ''; + print $form->selectyesno("USER_PUBLIC_SOCIALNETWORKS", (getDolUserInt('USER_PUBLIC_SOCIALNETWORKS', 0, $object) ? getDolUserInt('USER_PUBLIC_SOCIALNETWORKS', 0, $object) : 0), 1); + print "
'; + print $langs->trans("More"); + print ''; + require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; + $doleditor = new DolEditor('USER_PUBLIC_MORE', getDolUserString('USER_PUBLIC_MORE', '', $object), '', 160, 'dolibarr_notes', '', false, false, isModEnabled('fckeditor'), ROWS_5, '90%'); + $doleditor->Create(); + print "
'; + print '
'; + + print '
'; + print ''; + print '
'; +} + + +print dol_get_fiche_end(); + +print '
'; + + +print '
'; + + +print dol_get_fiche_end(); + +// End of page +llxFooter(); +$db->close(); From 2c9e4495dbd4afca5765e08d36a61fcbb8072ca7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 7 Jan 2023 04:43:09 +0100 Subject: [PATCH 0629/1128] Fix url --- htdocs/public/recruitment/view.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/public/recruitment/view.php b/htdocs/public/recruitment/view.php index de8297d3ef0..3626693ce89 100644 --- a/htdocs/public/recruitment/view.php +++ b/htdocs/public/recruitment/view.php @@ -223,7 +223,7 @@ if ($urllogo) { if (!empty($mysoc->url)) { print ''; } - print ''; + print ''; if (!empty($mysoc->url)) { print ''; } From 183552461c796b326264820aebc21ee6b3ced1e2 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sat, 7 Jan 2023 08:20:48 +0100 Subject: [PATCH 0630/1128] NEW Accountancy - Add an option to disable autolettering when transferring to accounting --- htdocs/accountancy/admin/index.php | 28 +++++++++++++++++++ htdocs/accountancy/journal/bankjournal.php | 2 +- .../accountancy/journal/purchasesjournal.php | 2 +- htdocs/accountancy/journal/sellsjournal.php | 2 +- htdocs/langs/en_US/accountancy.lang | 1 + 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/htdocs/accountancy/admin/index.php b/htdocs/accountancy/admin/index.php index 244b6f72330..5caa92ec9ee 100644 --- a/htdocs/accountancy/admin/index.php +++ b/htdocs/accountancy/admin/index.php @@ -261,6 +261,20 @@ if ($action == 'setenablelettering') { } } +if ($action == 'setenableautolettering') { + $setenableautolettering = GETPOST('value', 'int'); + $res = dolibarr_set_const($db, "ACCOUNTING_ENABLE_AUTOLETTERING", $setenableautolettering, 'yesno', 0, '', $conf->entity); + if (!($res > 0)) { + $error++; + } + + if (!$error) { + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); + } else { + setEventMessages($langs->trans("Error"), null, 'mesgs'); + } +} + /* * View @@ -479,6 +493,7 @@ if (!empty($conf->global->ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS)) { print ''; print ''; +print '
'; // Lettering params print ''; @@ -499,6 +514,19 @@ if (!empty($conf->global->ACCOUNTING_ENABLE_LETTERING)) { } print ''; +print ''; +print ''; +if (!empty($conf->global->ACCOUNTING_ENABLE_AUTOLETTERING)) { + print ''; +} else { + print ''; +} +print ''; + print '
'.$langs->trans("ACCOUNTING_ENABLE_AUTOLETTERING").''; + print img_picto($langs->trans("Activated"), 'switch_on'); + print ''; + print img_picto($langs->trans("Disabled"), 'switch_off'); + print '
'; print '
'; diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php index 4aba6bfeda4..699002395ab 100644 --- a/htdocs/accountancy/journal/bankjournal.php +++ b/htdocs/accountancy/journal/bankjournal.php @@ -793,7 +793,7 @@ if (!$error && $action == 'writebookkeeping') { setEventMessages($bookkeeping->error, $bookkeeping->errors, 'errors'); } } else { - if ($lettering && getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING')) { + if ($lettering && getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING') && getDolGlobalInt('ACCOUNTING_ENABLE_AUTOLETTERING')) { require_once DOL_DOCUMENT_ROOT . '/accountancy/class/lettering.class.php'; $lettering_static = new Lettering($db); $nb_lettering = $lettering_static->bookkeepingLetteringAll(array($bookkeeping->id)); diff --git a/htdocs/accountancy/journal/purchasesjournal.php b/htdocs/accountancy/journal/purchasesjournal.php index a5b82e7b2d0..746383fef0b 100644 --- a/htdocs/accountancy/journal/purchasesjournal.php +++ b/htdocs/accountancy/journal/purchasesjournal.php @@ -376,7 +376,7 @@ if ($action == 'writebookkeeping') { setEventMessages($bookkeeping->error, $bookkeeping->errors, 'errors'); } } else { - if (getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING')) { + if (getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING') && getDolGlobalInt('ACCOUNTING_ENABLE_AUTOLETTERING')) { require_once DOL_DOCUMENT_ROOT . '/accountancy/class/lettering.class.php'; $lettering_static = new Lettering($db); $nb_lettering = $lettering_static->bookkeepingLettering(array($bookkeeping->id)); diff --git a/htdocs/accountancy/journal/sellsjournal.php b/htdocs/accountancy/journal/sellsjournal.php index 0519762baef..f67fd76b3f1 100644 --- a/htdocs/accountancy/journal/sellsjournal.php +++ b/htdocs/accountancy/journal/sellsjournal.php @@ -390,7 +390,7 @@ if ($action == 'writebookkeeping') { setEventMessages($bookkeeping->error, $bookkeeping->errors, 'errors'); } } else { - if (getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING')) { + if (getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING') && getDolGlobalInt('ACCOUNTING_ENABLE_AUTOLETTERING')) { require_once DOL_DOCUMENT_ROOT . '/accountancy/class/lettering.class.php'; $lettering_static = new Lettering($db); $nb_lettering = $lettering_static->bookkeepingLettering(array($bookkeeping->id)); diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang index 9822a52e8f0..5a1e51a2269 100644 --- a/htdocs/langs/en_US/accountancy.lang +++ b/htdocs/langs/en_US/accountancy.lang @@ -339,6 +339,7 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Disable binding & transfer in accountancy on ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Disable binding & transfer in accountancy on purchases (vendor invoices will not be taken into account in accounting) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Disable binding & transfer in accountancy on expense reports (expense reports will not be taken into account in accounting) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file From 192d641b26e997b8a540eb3cd455b5704186cb7d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 7 Jan 2023 11:29:43 +0100 Subject: [PATCH 0631/1128] Update for doxygen generation from command line --- build/doxygen/dolibarr-doxygen-build.pl | 10 +- build/doxygen/dolibarr-doxygen.doxyfile | 98 +- build/doxygen/doxygen-awesome.css | 2413 +++++++++++++++++++++++ 3 files changed, 2477 insertions(+), 44 deletions(-) create mode 100644 build/doxygen/doxygen-awesome.css diff --git a/build/doxygen/dolibarr-doxygen-build.pl b/build/doxygen/dolibarr-doxygen-build.pl index 75a5cceddbe..5a4849a3a5b 100755 --- a/build/doxygen/dolibarr-doxygen-build.pl +++ b/build/doxygen/dolibarr-doxygen-build.pl @@ -17,9 +17,9 @@ use Cwd; my $dir = getcwd; print "Current dir is: $dir\n"; -print "Running dir for doxygen must be: $DIR\n"; +#print "Running dir for doxygen must be: $DIR\n"; -if (! -s $CONFFILE) +if (! -s "build/doxygen/$CONFFILE") { print "Error: current directory for building Dolibarr doxygen documentation is not correct.\n"; print "\n"; @@ -30,7 +30,7 @@ if (! -s $CONFFILE) exit 1; } -$SOURCE="../.."; +$SOURCE="."; # Get version $MAJOR, $MINOR and $BUILD $result = open( IN, "< " . $SOURCE . "/htdocs/filefunc.inc.php" ); @@ -47,8 +47,8 @@ $version=$MAJOR.".".$MINOR.".".$BUILD; print "Running doxygen for version ".$version.", please wait...\n"; -print "cat $CONFFILE | sed -e 's/x\.y\.z/".$version."/' | doxygen $OPTIONS - 2>&1\n"; -$result=`cat $CONFFILE | sed -e 's/x\.y\.z/$version/' | doxygen $OPTIONS - 2>&1`; +print "cat build/doxygen/$CONFFILE | sed -e 's/x\.y\.z/".$version."/' | doxygen $OPTIONS - 2>&1\n"; +$result=`cat build/doxygen/$CONFFILE | sed -e 's/x\.y\.z/$version/' | doxygen $OPTIONS - 2>&1`; print $result; diff --git a/build/doxygen/dolibarr-doxygen.doxyfile b/build/doxygen/dolibarr-doxygen.doxyfile index 31400661ecc..6f668ebad7e 100644 --- a/build/doxygen/dolibarr-doxygen.doxyfile +++ b/build/doxygen/dolibarr-doxygen.doxyfile @@ -1,14 +1,17 @@ -# Doxyfile 1.7.3 +# Doxyfile 1.8.16 # This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project +# doxygen (www.doxygen.org) for a project. # -# All text after a hash (#) is considered a comment and will be ignored +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. # The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). #--------------------------------------------------------------------------- # Project related configuration options @@ -38,7 +41,7 @@ PROJECT_NUMBER = x.y.z # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. -OUTPUT_DIRECTORY = ../../build +OUTPUT_DIRECTORY = build # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output @@ -114,7 +117,7 @@ FULL_PATH_NAMES = YES # If left blank the directory from which doxygen is run is used as the # path to strip. -STRIP_FROM_PATH = "../.." +STRIP_FROM_PATH = "/home/dolibarr/doxygen.dolibarr.org/" # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells @@ -287,7 +290,7 @@ TYPEDEF_HIDES_STRUCT = NO # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols -SYMBOL_CACHE_SIZE = 0 +#SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options @@ -448,7 +451,7 @@ GENERATE_TODOLIST = NO # disable (NO) the test list. This list is created by putting \test # commands in the documentation. -GENERATE_TESTLIST = YES +GENERATE_TESTLIST = NO # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug @@ -487,7 +490,7 @@ SHOW_USED_FILES = YES # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. -SHOW_DIRECTORIES = YES +#SHOW_DIRECTORIES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the @@ -571,7 +574,7 @@ WARN_FORMAT = "$file:$line: $text" # and error messages should be written. If left blank the output is written # to stderr. -WARN_LOGFILE = doxygen_warnings.log +WARN_LOGFILE = build/html/doxygen_warnings.log #--------------------------------------------------------------------------- # configuration options related to the input files @@ -582,7 +585,7 @@ WARN_LOGFILE = doxygen_warnings.log # directories like "/usr/src/myproject". Separate the files or directories # with spaces. -INPUT = ../../htdocs ../../scripts +INPUT = htdocs scripts # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is @@ -611,7 +614,7 @@ RECURSIVE = YES # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. -EXCLUDE = ../../build ../../dev ../../doc ../../document ../../documents ../../htdocs/conf/conf.php ../../htdocs/custom ../../htdocs/document ../../htdocs/documents ../../htdocs/includes +EXCLUDE = build dev doc document documents htdocs/conf/conf.php htdocs/custom htdocs/document htdocs/documents htdocs/includes htdocs/install/doctemplates # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded @@ -625,7 +628,7 @@ EXCLUDE_SYMLINKS = YES # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* -EXCLUDE_PATTERNS = */CVS/* *google* *pibarcode* +EXCLUDE_PATTERNS = */CVS/* # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the @@ -639,27 +642,27 @@ EXCLUDE_SYMBOLS = # directories that contain example code fragments that are included (see # the \include command). -EXAMPLE_PATH = ../../htdocs/modulebuilder/template +#EXAMPLE_PATH = htdocs/modulebuilder/template # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. -EXAMPLE_PATTERNS = *.php +#EXAMPLE_PATTERNS = *.php # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. -EXAMPLE_RECURSIVE = NO +#EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). -IMAGE_PATH = ../../doc/images +IMAGE_PATH = doc/images # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program @@ -762,7 +765,7 @@ ALPHABETICAL_INDEX = YES # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) -COLS_IN_ALPHA_INDEX = 5 +#COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. @@ -775,14 +778,16 @@ IGNORE_PREFIX = # configuration options related to the HTML output #--------------------------------------------------------------------------- -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. GENERATE_HTML = YES -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_OUTPUT = html @@ -797,14 +802,14 @@ HTML_FILE_EXTENSION = .html # standard header. # Does not work with 1.7.3 -#HTML_HEADER = doxygen_header.html +#HTML_HEADER = build/doxygen/doxygen_header.html # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. # Does not work with 1.7.3 -HTML_FOOTER = doxygen_footer.html +HTML_FOOTER = build/doxygen/doxygen_footer.html # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to @@ -850,7 +855,18 @@ HTML_TIMESTAMP = YES # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. -HTML_ALIGN_MEMBERS = YES +#HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML +# documentation will contain a main index with vertical navigation menus that +# are dynamically created via Javascript. If disabled, the navigation index will +# consists of multiple levels of tabs that are statically embedded in every HTML +# page. Disable this option to support browsers that do not have Javascript, +# like the Qt help browser. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_MENUS = NO # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the @@ -858,7 +874,7 @@ HTML_ALIGN_MEMBERS = YES # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). -HTML_DYNAMIC_SECTIONS = YES +HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 @@ -1003,7 +1019,7 @@ QHG_LOCATION = # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before # the help appears. -GENERATE_ECLIPSEHELP = YES +GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have @@ -1035,7 +1051,7 @@ GENERATE_TREEVIEW = NO # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. -USE_INLINE_TREES = NO +#USE_INLINE_TREES = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree @@ -1072,7 +1088,7 @@ FORMULA_TRANSPARENT = YES # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. -SEARCHENGINE = NO +SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a PHP enabled web server instead of at the web client @@ -1082,7 +1098,7 @@ SEARCHENGINE = NO # full text search. The disadvances is that it is more difficult to setup # and does not have live searching capabilities. -SERVER_BASED_SEARCH = NO +SERVER_BASED_SEARCH = YES #--------------------------------------------------------------------------- # configuration options related to the LaTeX output @@ -1260,13 +1276,13 @@ XML_OUTPUT = xml # which can be used by a validating XML parser to check the # syntax of the XML files. -XML_SCHEMA = +#XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. -XML_DTD = +#XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting @@ -1431,7 +1447,7 @@ EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). -PERL_PATH = /usr/bin/perl +#PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool @@ -1453,7 +1469,7 @@ CLASS_DIAGRAMS = NO # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. -MSCGEN_PATH = +#MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented @@ -1485,7 +1501,7 @@ DOT_NUM_THREADS = 0 # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. -DOT_FONTNAME = FreeSans.ttf +#DOT_FONTNAME = FreeSans.ttf # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. @@ -1634,3 +1650,7 @@ GENERATE_LEGEND = YES # the various graphs. DOT_CLEANUP = YES + + +FULL_SIDEBAR = NO +HTML_EXTRA_STYLESHEET = build/doxygen/doxygen-awesome.css diff --git a/build/doxygen/doxygen-awesome.css b/build/doxygen/doxygen-awesome.css new file mode 100644 index 00000000000..0b1c8c20892 --- /dev/null +++ b/build/doxygen/doxygen-awesome.css @@ -0,0 +1,2413 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2022 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +html { + /* primary theme color. This will affect the entire websites color scheme: links, arrows, labels, ... */ + --primary-color: #1779c4; + --primary-dark-color: #335c80; + --primary-light-color: #70b1e9; + + /* page base colors */ + --page-background-color: #ffffff; + --page-foreground-color: #2f4153; + --page-secondary-foreground-color: #6f7e8e; + + /* color for all separators on the website: hr, borders, ... */ + --separator-color: #dedede; + + /* border radius for all rounded components. Will affect many components, like dropdowns, memitems, codeblocks, ... */ + --border-radius-large: 8px; + --border-radius-small: 4px; + --border-radius-medium: 6px; + + /* default spacings. Most components reference these values for spacing, to provide uniform spacing on the page. */ + --spacing-small: 5px; + --spacing-medium: 10px; + --spacing-large: 16px; + + /* default box shadow used for raising an element above the normal content. Used in dropdowns, search result, ... */ + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); + + --odd-color: rgba(0,0,0,.028); + + /* font-families. will affect all text on the website + * font-family: the normal font for text, headlines, menus + * font-family-monospace: used for preformatted text in memtitle, code, fragments + */ + --font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif; + --font-family-monospace: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace; + + /* font sizes */ + --page-font-size: 15.6px; + --navigation-font-size: 14.4px; + --toc-font-size: 13.4px; + --code-font-size: 14px; /* affects code, fragment */ + --title-font-size: 22px; + + /* content text properties. These only affect the page content, not the navigation or any other ui elements */ + --content-line-height: 27px; + /* The content is centered and constraint in it's width. To make the content fill the whole page, set the variable to auto.*/ + --content-maxwidth: 1050px; + --table-line-height: 24px; + --toc-sticky-top: var(--spacing-medium); + --toc-width: 200px; + --toc-max-height: calc(100vh - 2 * var(--spacing-medium) - 85px); + + /* colors for various content boxes: @warning, @note, @deprecated @bug */ + --warning-color: #f8d1cc; + --warning-color-dark: #b61825; + --warning-color-darker: #75070f; + --note-color: #faf3d8; + --note-color-dark: #f3a600; + --note-color-darker: #5f4204; + --todo-color: #e4f3ff; + --todo-color-dark: #1879C4; + --todo-color-darker: #274a5c; + --deprecated-color: #ecf0f3; + --deprecated-color-dark: #5b6269; + --deprecated-color-darker: #43454a; + --bug-color: #e4dafd; + --bug-color-dark: #5b2bdd; + --bug-color-darker: #2a0d72; + --invariant-color: #d8f1e3; + --invariant-color-dark: #44b86f; + --invariant-color-darker: #265532; + + /* blockquote colors */ + --blockquote-background: #f8f9fa; + --blockquote-foreground: #636568; + + /* table colors */ + --tablehead-background: #f1f1f1; + --tablehead-foreground: var(--page-foreground-color); + + /* menu-display: block | none + * Visibility of the top navigation on screens >= 768px. On smaller screen the menu is always visible. + * `GENERATE_TREEVIEW` MUST be enabled! + */ + --menu-display: block; + + --menu-focus-foreground: var(--page-background-color); + --menu-focus-background: var(--primary-color); + --menu-selected-background: rgba(0,0,0,.05); + + + --header-background: var(--page-background-color); + --header-foreground: var(--page-foreground-color); + + /* searchbar colors */ + --searchbar-background: var(--side-nav-background); + --searchbar-foreground: var(--page-foreground-color); + + /* searchbar size + * (`searchbar-width` is only applied on screens >= 768px. + * on smaller screens the searchbar will always fill the entire screen width) */ + --searchbar-height: 33px; + --searchbar-width: 210px; + --searchbar-border-radius: var(--searchbar-height); + + /* code block colors */ + --code-background: #f5f5f5; + --code-foreground: var(--page-foreground-color); + + /* fragment colors */ + --fragment-background: #F8F9FA; + --fragment-foreground: #37474F; + --fragment-keyword: #bb6bb2; + --fragment-keywordtype: #8258b3; + --fragment-keywordflow: #d67c3b; + --fragment-token: #438a59; + --fragment-comment: #969696; + --fragment-link: #5383d6; + --fragment-preprocessor: #46aaa5; + --fragment-linenumber-color: #797979; + --fragment-linenumber-background: #f4f4f5; + --fragment-linenumber-border: #e3e5e7; + --fragment-lineheight: 20px; + + /* sidebar navigation (treeview) colors */ + --side-nav-background: #fbfbfb; + --side-nav-foreground: var(--page-foreground-color); + --side-nav-arrow-opacity: 0; + --side-nav-arrow-hover-opacity: 0.9; + + --toc-background: var(--side-nav-background); + --toc-foreground: var(--side-nav-foreground); + + /* height of an item in any tree / collapsable table */ + --tree-item-height: 30px; + + --memname-font-size: var(--code-font-size); + --memtitle-font-size: 18px; + + --webkit-scrollbar-size: 7px; + --webkit-scrollbar-padding: 4px; + --webkit-scrollbar-color: var(--separator-color); +} + +@media screen and (max-width: 767px) { + html { + --page-font-size: 16px; + --navigation-font-size: 16px; + --toc-font-size: 15px; + --code-font-size: 15px; /* affects code, fragment */ + --title-font-size: 22px; + } +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) { + color-scheme: dark; + + --primary-color: #1982d2; + --primary-dark-color: #86a9c4; + --primary-light-color: #4779ac; + + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.35); + + --odd-color: rgba(100,100,100,.06); + + --menu-selected-background: rgba(0,0,0,.4); + + --page-background-color: #1C1D1F; + --page-foreground-color: #d2dbde; + --page-secondary-foreground-color: #859399; + --separator-color: #38393b; + --side-nav-background: #252628; + + --code-background: #2a2c2f; + + --tablehead-background: #2a2c2f; + + --blockquote-background: #222325; + --blockquote-foreground: #7e8c92; + + --warning-color: #2e1917; + --warning-color-dark: #ad2617; + --warning-color-darker: #f5b1aa; + --note-color: #3b2e04; + --note-color-dark: #f1b602; + --note-color-darker: #ceb670; + --todo-color: #163750; + --todo-color-dark: #1982D2; + --todo-color-darker: #dcf0fa; + --deprecated-color: #2e323b; + --deprecated-color-dark: #738396; + --deprecated-color-darker: #abb0bd; + --bug-color: #2a2536; + --bug-color-dark: #7661b3; + --bug-color-darker: #ae9ed6; + --invariant-color: #303a35; + --invariant-color-dark: #76ce96; + --invariant-color-darker: #cceed5; + + --fragment-background: #282c34; + --fragment-foreground: #dbe4eb; + --fragment-keyword: #cc99cd; + --fragment-keywordtype: #ab99cd; + --fragment-keywordflow: #e08000; + --fragment-token: #7ec699; + --fragment-comment: #999999; + --fragment-link: #98c0e3; + --fragment-preprocessor: #65cabe; + --fragment-linenumber-color: #cccccc; + --fragment-linenumber-background: #35393c; + --fragment-linenumber-border: #1f1f1f; + } +} + +/* dark mode variables are defined twice, to support both the dark-mode without and with doxygen-awesome-darkmode-toggle.js */ +html.dark-mode { + color-scheme: dark; + + --primary-color: #1982d2; + --primary-dark-color: #86a9c4; + --primary-light-color: #4779ac; + + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.30); + + --odd-color: rgba(100,100,100,.06); + + --menu-selected-background: rgba(0,0,0,.4); + + --page-background-color: #1C1D1F; + --page-foreground-color: #d2dbde; + --page-secondary-foreground-color: #859399; + --separator-color: #38393b; + --side-nav-background: #252628; + + --code-background: #2a2c2f; + + --tablehead-background: #2a2c2f; + + --blockquote-background: #222325; + --blockquote-foreground: #7e8c92; + + --warning-color: #2e1917; + --warning-color-dark: #ad2617; + --warning-color-darker: #f5b1aa; + --note-color: #3b2e04; + --note-color-dark: #f1b602; + --note-color-darker: #ceb670; + --todo-color: #163750; + --todo-color-dark: #1982D2; + --todo-color-darker: #dcf0fa; + --deprecated-color: #2e323b; + --deprecated-color-dark: #738396; + --deprecated-color-darker: #abb0bd; + --bug-color: #2a2536; + --bug-color-dark: #7661b3; + --bug-color-darker: #ae9ed6; + --invariant-color: #303a35; + --invariant-color-dark: #76ce96; + --invariant-color-darker: #cceed5; + + --fragment-background: #282c34; + --fragment-foreground: #dbe4eb; + --fragment-keyword: #cc99cd; + --fragment-keywordtype: #ab99cd; + --fragment-keywordflow: #e08000; + --fragment-token: #7ec699; + --fragment-comment: #999999; + --fragment-link: #98c0e3; + --fragment-preprocessor: #65cabe; + --fragment-linenumber-color: #cccccc; + --fragment-linenumber-background: #35393c; + --fragment-linenumber-border: #1f1f1f; +} + +body { + color: var(--page-foreground-color); + background-color: var(--page-background-color); + font-size: var(--page-font-size); +} + +body, table, div, p, dl, #nav-tree .label, .title, +.sm-dox a, .sm-dox a:hover, .sm-dox a:focus, #projectname, +.SelectItem, #MSearchField, .navpath li.navelem a, +.navpath li.navelem a:hover, p.reference, p.definition { + font-family: var(--font-family); +} + +h1, h2, h3, h4, h5 { + margin-top: .9em; + font-weight: 600; + line-height: initial; +} + +p, div, table, dl, p.reference, p.definition { + font-size: var(--page-font-size); +} + +p.reference, p.definition { + color: var(--page-secondary-foreground-color); +} + +a:link, a:visited, a:hover, a:focus, a:active { + color: var(--primary-color) !important; + font-weight: 500; +} + +a.anchor { + scroll-margin-top: var(--spacing-large); + display: block; +} + +/* + Title and top navigation + */ + +#top { + background: var(--header-background); + border-bottom: 1px solid var(--separator-color); +} + +@media screen and (min-width: 768px) { + #top { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + } +} + +#main-nav { + flex-grow: 5; + padding: var(--spacing-small) var(--spacing-medium); +} + +#titlearea { + width: auto; + padding: var(--spacing-medium) var(--spacing-large); + background: none; + color: var(--header-foreground); + border-bottom: none; +} + +@media screen and (max-width: 767px) { + #titlearea { + padding-bottom: var(--spacing-small); + } +} + +#titlearea table tbody tr { + height: auto !important; +} + +#projectname { + font-size: var(--title-font-size); + font-weight: 600; +} + +#projectnumber { + font-family: inherit; + font-size: 60%; +} + +#projectbrief { + font-family: inherit; + font-size: 80%; +} + +#projectlogo { + vertical-align: middle; +} + +#projectlogo img { + max-height: calc(var(--title-font-size) * 2); + margin-right: var(--spacing-small); +} + +.sm-dox, .tabs, .tabs2, .tabs3 { + background: none; + padding: 0; +} + +.tabs, .tabs2, .tabs3 { + border-bottom: 1px solid var(--separator-color); + margin-bottom: -1px; +} + +.main-menu-btn-icon, .main-menu-btn-icon:before, .main-menu-btn-icon:after { + background: var(--page-secondary-foreground-color); +} + +@media screen and (max-width: 767px) { + .sm-dox a span.sub-arrow { + background: var(--code-background); + } + + #main-menu a.has-submenu span.sub-arrow { + color: var(--page-secondary-foreground-color); + border-radius: var(--border-radius-medium); + } + + #main-menu a.has-submenu:hover span.sub-arrow { + color: var(--page-foreground-color); + } +} + +@media screen and (min-width: 768px) { + .sm-dox li, .tablist li { + display: var(--menu-display); + } + + .sm-dox a span.sub-arrow { + border-color: var(--header-foreground) transparent transparent transparent; + } + + .sm-dox a:hover span.sub-arrow { + border-color: var(--menu-focus-foreground) transparent transparent transparent; + } + + .sm-dox ul a span.sub-arrow { + border-color: transparent transparent transparent var(--page-foreground-color); + } + + .sm-dox ul a:hover span.sub-arrow { + border-color: transparent transparent transparent var(--menu-focus-foreground); + } +} + +.sm-dox ul { + background: var(--page-background-color); + box-shadow: var(--box-shadow); + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium) !important; + padding: var(--spacing-small); + animation: ease-out 150ms slideInMenu; +} + +@keyframes slideInMenu { + from { + opacity: 0; + transform: translate(0px, -2px); + } + + to { + opacity: 1; + transform: translate(0px, 0px); + } +} + +.sm-dox ul a { + color: var(--page-foreground-color) !important; + background: var(--page-background-color); + font-size: var(--navigation-font-size); +} + +.sm-dox>li>ul:after { + border-bottom-color: var(--page-background-color) !important; +} + +.sm-dox>li>ul:before { + border-bottom-color: var(--separator-color) !important; +} + +.sm-dox ul a:hover, .sm-dox ul a:active, .sm-dox ul a:focus { + font-size: var(--navigation-font-size) !important; + color: var(--menu-focus-foreground) !important; + text-shadow: none; + background-color: var(--menu-focus-background); + border-radius: var(--border-radius-small) !important; +} + +.sm-dox a, .sm-dox a:focus, .tablist li, .tablist li a, .tablist li.current a { + text-shadow: none; + background: transparent; + background-image: none !important; + color: var(--header-foreground) !important; + font-weight: normal; + font-size: var(--navigation-font-size); + border-radius: var(--border-radius-small) !important; +} + +.sm-dox a:focus { + outline: auto; +} + +.sm-dox a:hover, .sm-dox a:active, .tablist li a:hover { + text-shadow: none; + font-weight: normal; + background: var(--menu-focus-background); + color: var(--menu-focus-foreground) !important; + border-radius: var(--border-radius-small) !important; + font-size: var(--navigation-font-size); +} + +.tablist li.current { + border-radius: var(--border-radius-small); + background: var(--menu-selected-background); +} + +.tablist li { + margin: var(--spacing-small) 0 var(--spacing-small) var(--spacing-small); +} + +.tablist a { + padding: 0 var(--spacing-large); +} + + +/* + Search box + */ + +#MSearchBox { + height: var(--searchbar-height); + background: var(--searchbar-background); + border-radius: var(--searchbar-border-radius); + border: 1px solid var(--separator-color); + overflow: hidden; + width: var(--searchbar-width); + position: relative; + box-shadow: none; + display: block; + margin-top: 0; +} + +/* until Doxygen 1.9.4 */ +.left img#MSearchSelect { + left: 0; + user-select: none; + padding-left: 8px; +} + +/* Doxygen 1.9.5 */ +.left span#MSearchSelect { + left: 0; + user-select: none; + margin-left: 8px; + padding: 0; +} + +.left #MSearchSelect[src$=".png"] { + padding-left: 0 +} + +.SelectionMark { + user-select: none; +} + +.tabs .left #MSearchSelect { + padding-left: 0; +} + +.tabs #MSearchBox { + position: absolute; + right: var(--spacing-medium); +} + +@media screen and (max-width: 767px) { + .tabs #MSearchBox { + position: relative; + right: 0; + margin-left: var(--spacing-medium); + margin-top: 0; + } +} + +#MSearchSelectWindow, #MSearchResultsWindow { + z-index: 9999; +} + +#MSearchBox.MSearchBoxActive { + border-color: var(--primary-color); + box-shadow: inset 0 0 0 1px var(--primary-color); +} + +#main-menu > li:last-child { + margin-right: 0; +} + +@media screen and (max-width: 767px) { + #main-menu > li:last-child { + height: 50px; + } +} + +#MSearchField { + font-size: var(--navigation-font-size); + height: calc(var(--searchbar-height) - 2px); + background: transparent; + width: calc(var(--searchbar-width) - 64px); +} + +.MSearchBoxActive #MSearchField { + color: var(--searchbar-foreground); +} + +#MSearchSelect { + top: calc(calc(var(--searchbar-height) / 2) - 11px); +} + +#MSearchBox span.left, #MSearchBox span.right { + background: none; + background-image: none; +} + +#MSearchBox span.right { + padding-top: calc(calc(var(--searchbar-height) / 2) - 12px); + position: absolute; + right: var(--spacing-small); +} + +.tabs #MSearchBox span.right { + top: calc(calc(var(--searchbar-height) / 2) - 12px); +} + +@keyframes slideInSearchResults { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } +} + +#MSearchResultsWindow { + left: auto !important; + right: var(--spacing-medium); + border-radius: var(--border-radius-large); + border: 1px solid var(--separator-color); + transform: translate(0, 20px); + box-shadow: var(--box-shadow); + animation: ease-out 280ms slideInSearchResults; + background: var(--page-background-color); +} + +iframe#MSearchResults { + margin: 4px; +} + +iframe { + color-scheme: normal; +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) iframe#MSearchResults { + filter: invert() hue-rotate(180deg); + } +} + +html.dark-mode iframe#MSearchResults { + filter: invert() hue-rotate(180deg); +} + +#MSearchResults .SRPage { + background-color: transparent; +} + +#MSearchResults .SRPage .SREntry { + font-size: 10pt; + padding: var(--spacing-small) var(--spacing-medium); +} + +#MSearchSelectWindow { + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + box-shadow: var(--box-shadow); + background: var(--page-background-color); + padding-top: var(--spacing-small); + padding-bottom: var(--spacing-small); +} + +#MSearchSelectWindow a.SelectItem { + font-size: var(--navigation-font-size); + line-height: var(--content-line-height); + margin: 0 var(--spacing-small); + border-radius: var(--border-radius-small); + color: var(--page-foreground-color) !important; + font-weight: normal; +} + +#MSearchSelectWindow a.SelectItem:hover { + background: var(--menu-focus-background); + color: var(--menu-focus-foreground) !important; +} + +@media screen and (max-width: 767px) { + #MSearchBox { + margin-top: var(--spacing-medium); + margin-bottom: var(--spacing-medium); + width: calc(100vw - 30px); + } + + #main-menu > li:last-child { + float: none !important; + } + + #MSearchField { + width: calc(100vw - 110px); + } + + @keyframes slideInSearchResultsMobile { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } + } + + #MSearchResultsWindow { + left: var(--spacing-medium) !important; + right: var(--spacing-medium); + overflow: auto; + transform: translate(0, 20px); + animation: ease-out 280ms slideInSearchResultsMobile; + width: auto !important; + } + + /* + * Overwrites for fixing the searchbox on mobile in doxygen 1.9.2 + */ + label.main-menu-btn ~ #searchBoxPos1 { + top: 3px !important; + right: 6px !important; + left: 45px; + display: flex; + } + + label.main-menu-btn ~ #searchBoxPos1 > #MSearchBox { + margin-top: 0; + margin-bottom: 0; + flex-grow: 2; + float: left; + } +} + +/* + Tree view + */ + +#side-nav { + padding: 0 !important; + background: var(--side-nav-background); +} + +@media screen and (max-width: 767px) { + #side-nav { + display: none; + } + + #doc-content { + margin-left: 0 !important; + } +} + +#nav-tree { + background: transparent; +} + +#nav-tree .label { + font-size: var(--navigation-font-size); +} + +#nav-tree .item { + height: var(--tree-item-height); + line-height: var(--tree-item-height); +} + +#nav-sync { + bottom: 12px; + right: 12px; + top: auto !important; + user-select: none; +} + +#nav-tree .selected { + text-shadow: none; + background-image: none; + background-color: transparent; + position: relative; +} + +#nav-tree .selected::after { + content: ""; + position: absolute; + top: 1px; + bottom: 1px; + left: 0; + width: 4px; + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; + background: var(--primary-color); +} + + +#nav-tree a { + color: var(--side-nav-foreground) !important; + font-weight: normal; +} + +#nav-tree a:focus { + outline-style: auto; +} + +#nav-tree .arrow { + opacity: var(--side-nav-arrow-opacity); +} + +.arrow { + color: inherit; + cursor: pointer; + font-size: 45%; + vertical-align: middle; + margin-right: 2px; + font-family: serif; + height: auto; + text-align: right; +} + +#nav-tree div.item:hover .arrow, #nav-tree a:focus .arrow { + opacity: var(--side-nav-arrow-hover-opacity); +} + +#nav-tree .selected a { + color: var(--primary-color) !important; + font-weight: bolder; + font-weight: 600; +} + +.ui-resizable-e { + background: var(--separator-color); + width: 1px; +} + +/* + Contents + */ + +div.header { + border-bottom: 1px solid var(--separator-color); + background-color: var(--page-background-color); + background-image: none; +} + +@media screen and (min-width: 1000px) { + #doc-content > div > div.contents, + .PageDoc > div.contents { + display: flex; + flex-direction: row-reverse; + flex-wrap: nowrap; + align-items: flex-start; + } + + div.contents .textblock { + min-width: 200px; + flex-grow: 1; + } +} + +div.contents, div.header .title, div.header .summary { + max-width: var(--content-maxwidth); +} + +div.contents, div.header .title { + line-height: initial; + margin: calc(var(--spacing-medium) + .2em) auto var(--spacing-medium) auto; +} + +div.header .summary { + margin: var(--spacing-medium) auto 0 auto; +} + +div.headertitle { + padding: 0; +} + +div.header .title { + font-weight: 600; + font-size: 225%; + padding: var(--spacing-medium) var(--spacing-large); + word-break: break-word; +} + +div.header .summary { + width: auto; + display: block; + float: none; + padding: 0 var(--spacing-large); +} + +td.memSeparator { + border-color: var(--separator-color); +} + +span.mlabel { + background: var(--primary-color); + border: none; + padding: 4px 9px; + border-radius: 12px; + margin-right: var(--spacing-medium); +} + +span.mlabel:last-of-type { + margin-right: 2px; +} + +div.contents { + padding: 0 var(--spacing-large); +} + +div.contents p, div.contents li { + line-height: var(--content-line-height); +} + +div.contents div.dyncontent { + margin: var(--spacing-medium) 0; +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) div.contents div.dyncontent img, + html:not(.light-mode) div.contents center img, + html:not(.light-mode) div.contents > table img, + html:not(.light-mode) div.contents div.dyncontent iframe, + html:not(.light-mode) div.contents center iframe, + html:not(.light-mode) div.contents table iframe { + filter: hue-rotate(180deg) invert(); + } +} + +html.dark-mode div.contents div.dyncontent img, +html.dark-mode div.contents center img, +html.dark-mode div.contents > table img, +html.dark-mode div.contents div.dyncontent iframe, +html.dark-mode div.contents center iframe, +html.dark-mode div.contents table iframe { + filter: hue-rotate(180deg) invert(); +} + +h2.groupheader { + border-bottom: 0px; + color: var(--page-foreground-color); + box-shadow: + 100px 0 var(--page-background-color), + -100px 0 var(--page-background-color), + 100px 0.75px var(--separator-color), + -100px 0.75px var(--separator-color), + 500px 0 var(--page-background-color), + -500px 0 var(--page-background-color), + 500px 0.75px var(--separator-color), + -500px 0.75px var(--separator-color), + 900px 0 var(--page-background-color), + -900px 0 var(--page-background-color), + 900px 0.75px var(--separator-color), + -900px 0.75px var(--separator-color), + 1400px 0 var(--page-background-color), + -1400px 0 var(--page-background-color), + 1400px 0.75px var(--separator-color), + -1400px 0.75px var(--separator-color), + 1900px 0 var(--page-background-color), + -1900px 0 var(--page-background-color), + 1900px 0.75px var(--separator-color), + -1900px 0.75px var(--separator-color); +} + +blockquote { + margin: 0 var(--spacing-medium) 0 var(--spacing-medium); + padding: var(--spacing-small) var(--spacing-large); + background: var(--blockquote-background); + color: var(--blockquote-foreground); + border-left: 0; + overflow: visible; + border-radius: var(--border-radius-medium); + overflow: visible; + position: relative; +} + +blockquote::before, blockquote::after { + font-weight: bold; + font-family: serif; + font-size: 360%; + opacity: .15; + position: absolute; +} + +blockquote::before { + content: "“"; + left: -10px; + top: 4px; +} + +blockquote::after { + content: "”"; + right: -8px; + bottom: -25px; +} + +blockquote p { + margin: var(--spacing-small) 0 var(--spacing-medium) 0; +} +.paramname { + font-weight: 600; + color: var(--primary-dark-color); +} + +.paramname > code { + border: 0; +} + +table.params .paramname { + font-weight: 600; + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); + padding-right: var(--spacing-small); + line-height: var(--table-line-height); +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--primary-light-color); +} + +.alphachar a { + color: var(--page-foreground-color); +} + +/* + Table of Contents + */ + +div.contents .toc { + max-height: var(--toc-max-height); + min-width: var(--toc-width); + border: 0; + border-left: 1px solid var(--separator-color); + border-radius: 0; + background-color: transparent; + box-shadow: none; + position: sticky; + top: var(--toc-sticky-top); + padding: 0 var(--spacing-large); + margin: var(--spacing-small) 0 var(--spacing-large) var(--spacing-large); +} + +div.toc h3 { + color: var(--toc-foreground); + font-size: var(--navigation-font-size); + margin: var(--spacing-large) 0 var(--spacing-medium) 0; +} + +div.toc li { + padding: 0; + background: none; + line-height: var(--toc-font-size); + margin: var(--toc-font-size) 0 0 0; +} + +div.toc li::before { + display: none; +} + +div.toc ul { + margin-top: 0 +} + +div.toc li a { + font-size: var(--toc-font-size); + color: var(--page-foreground-color) !important; + text-decoration: none; +} + +div.toc li a:hover, div.toc li a.active { + color: var(--primary-color) !important; +} + +div.toc li a.aboveActive { + color: var(--page-secondary-foreground-color) !important; +} + + +@media screen and (max-width: 999px) { + div.contents .toc { + max-height: 45vh; + float: none; + width: auto; + margin: 0 0 var(--spacing-medium) 0; + position: relative; + top: 0; + position: relative; + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + background-color: var(--toc-background); + box-shadow: var(--box-shadow); + } + + div.contents .toc.interactive { + max-height: calc(var(--navigation-font-size) + 2 * var(--spacing-large)); + overflow: hidden; + } + + div.contents .toc > h3 { + -webkit-tap-highlight-color: transparent; + cursor: pointer; + position: sticky; + top: 0; + background-color: var(--toc-background); + margin: 0; + padding: var(--spacing-large) 0; + display: block; + } + + div.contents .toc.interactive > h3::before { + content: ""; + width: 0; + height: 0; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 5px solid var(--primary-color); + display: inline-block; + margin-right: var(--spacing-small); + margin-bottom: calc(var(--navigation-font-size) / 4); + transform: rotate(-90deg); + transition: transform 0.25s ease-out; + } + + div.contents .toc.interactive.open > h3::before { + transform: rotate(0deg); + } + + div.contents .toc.interactive.open { + max-height: 45vh; + overflow: auto; + transition: max-height 0.2s ease-in-out; + } + + div.contents .toc a, div.contents .toc a.active { + color: var(--primary-color) !important; + } + + div.contents .toc a:hover { + text-decoration: underline; + } +} + +/* + Code & Fragments + */ + +code, div.fragment, pre.fragment { + border-radius: var(--border-radius-small); + border: 1px solid var(--separator-color); + overflow: hidden; +} + +code { + display: inline; + background: var(--code-background); + color: var(--code-foreground); + padding: 2px 6px; +} + +div.fragment, pre.fragment { + margin: var(--spacing-medium) 0; + padding: calc(var(--spacing-large) - (var(--spacing-large) / 6)) var(--spacing-large); + background: var(--fragment-background); + color: var(--fragment-foreground); + overflow-x: auto; +} + +@media screen and (max-width: 767px) { + div.fragment, pre.fragment { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-right: 0; + } + + .contents > div.fragment, + .textblock > div.fragment, + .textblock > pre.fragment, + .contents > .doxygen-awesome-fragment-wrapper > div.fragment, + .textblock > .doxygen-awesome-fragment-wrapper > div.fragment, + .textblock > .doxygen-awesome-fragment-wrapper > pre.fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-large)); + border-radius: 0; + border-left: 0; + } + + .textblock li > .fragment, + .textblock li > .doxygen-awesome-fragment-wrapper > .fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-large)); + } + + .memdoc li > .fragment, + .memdoc li > .doxygen-awesome-fragment-wrapper > .fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); + } + + .textblock ul, .memdoc ul { + overflow: initial; + } + + .memdoc > div.fragment, + .memdoc > pre.fragment, + dl dd > div.fragment, + dl dd pre.fragment, + .memdoc > .doxygen-awesome-fragment-wrapper > div.fragment, + .memdoc > .doxygen-awesome-fragment-wrapper > pre.fragment, + dl dd > .doxygen-awesome-fragment-wrapper > div.fragment, + dl dd .doxygen-awesome-fragment-wrapper > pre.fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); + border-radius: 0; + border-left: 0; + } +} + +code, code a, pre.fragment, div.fragment, div.fragment .line, div.fragment span, div.fragment .line a, div.fragment .line span { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size) !important; +} + +div.line:after { + margin-right: var(--spacing-medium); +} + +div.fragment .line, pre.fragment { + white-space: pre; + word-wrap: initial; + line-height: var(--fragment-lineheight); +} + +div.fragment span.keyword { + color: var(--fragment-keyword); +} + +div.fragment span.keywordtype { + color: var(--fragment-keywordtype); +} + +div.fragment span.keywordflow { + color: var(--fragment-keywordflow); +} + +div.fragment span.stringliteral { + color: var(--fragment-token) +} + +div.fragment span.comment { + color: var(--fragment-comment); +} + +div.fragment a.code { + color: var(--fragment-link) !important; +} + +div.fragment span.preprocessor { + color: var(--fragment-preprocessor); +} + +div.fragment span.lineno { + display: inline-block; + width: 27px; + border-right: none; + background: var(--fragment-linenumber-background); + color: var(--fragment-linenumber-color); +} + +div.fragment span.lineno a { + background: none; + color: var(--fragment-link) !important; +} + +div.fragment .line:first-child .lineno { + box-shadow: -999999px 0px 0 999999px var(--fragment-linenumber-background), -999998px 0px 0 999999px var(--fragment-linenumber-border); +} + +div.line { + border-radius: var(--border-radius-small); +} + +div.line.glow { + background-color: var(--primary-light-color); + box-shadow: none; +} + +/* + dl warning, attention, note, deprecated, bug, ... + */ + +dl.bug dt a, dl.deprecated dt a, dl.todo dt a { + font-weight: bold !important; +} + +dl.warning, dl.attention, dl.note, dl.deprecated, dl.bug, dl.invariant, dl.pre, dl.todo, dl.remark { + padding: var(--spacing-medium); + margin: var(--spacing-medium) 0; + color: var(--page-background-color); + overflow: hidden; + margin-left: 0; + border-radius: var(--border-radius-small); +} + +dl.section dd { + margin-bottom: 2px; +} + +dl.warning, dl.attention { + background: var(--warning-color); + border-left: 8px solid var(--warning-color-dark); + color: var(--warning-color-darker); +} + +dl.warning dt, dl.attention dt { + color: var(--warning-color-dark); +} + +dl.note, dl.remark { + background: var(--note-color); + border-left: 8px solid var(--note-color-dark); + color: var(--note-color-darker); +} + +dl.note dt, dl.remark dt { + color: var(--note-color-dark); +} + +dl.todo { + background: var(--todo-color); + border-left: 8px solid var(--todo-color-dark); + color: var(--todo-color-darker); +} + +dl.todo dt { + color: var(--todo-color-dark); +} + +dl.bug dt a { + color: var(--todo-color-dark) !important; +} + +dl.bug { + background: var(--bug-color); + border-left: 8px solid var(--bug-color-dark); + color: var(--bug-color-darker); +} + +dl.bug dt a { + color: var(--bug-color-dark) !important; +} + +dl.deprecated { + background: var(--deprecated-color); + border-left: 8px solid var(--deprecated-color-dark); + color: var(--deprecated-color-darker); +} + +dl.deprecated dt a { + color: var(--deprecated-color-dark) !important; +} + +dl.section dd, dl.bug dd, dl.deprecated dd, dl.todo dd { + margin-inline-start: 0px; +} + +dl.invariant, dl.pre { + background: var(--invariant-color); + border-left: 8px solid var(--invariant-color-dark); + color: var(--invariant-color-darker); +} + +dl.invariant dt, dl.pre dt { + color: var(--invariant-color-dark); +} + +/* + memitem + */ + +div.memdoc, div.memproto, h2.memtitle { + box-shadow: none; + background-image: none; + border: none; +} + +div.memdoc { + padding: 0 var(--spacing-medium); + background: var(--page-background-color); +} + +h2.memtitle, div.memitem { + border: 1px solid var(--separator-color); + box-shadow: var(--box-shadow); +} + +h2.memtitle { + box-shadow: 0px var(--spacing-medium) 0 -1px var(--fragment-background), var(--box-shadow); +} + +div.memitem { + transition: none; +} + +div.memproto, h2.memtitle { + background: var(--fragment-background); +} + +h2.memtitle { + font-weight: 500; + font-size: var(--memtitle-font-size); + font-family: var(--font-family-monospace); + border-bottom: none; + border-top-left-radius: var(--border-radius-medium); + border-top-right-radius: var(--border-radius-medium); + word-break: break-all; + position: relative; +} + +h2.memtitle:after { + content: ""; + display: block; + background: var(--fragment-background); + height: var(--spacing-medium); + bottom: calc(0px - var(--spacing-medium)); + left: 0; + right: -14px; + position: absolute; + border-top-right-radius: var(--border-radius-medium); +} + +h2.memtitle > span.permalink { + font-size: inherit; +} + +h2.memtitle > span.permalink > a { + text-decoration: none; + padding-left: 3px; + margin-right: -4px; + user-select: none; + display: inline-block; + margin-top: -6px; +} + +h2.memtitle > span.permalink > a:hover { + color: var(--primary-dark-color) !important; +} + +a:target + h2.memtitle, a:target + h2.memtitle + div.memitem { + border-color: var(--primary-light-color); +} + +div.memitem { + border-top-right-radius: var(--border-radius-medium); + border-bottom-right-radius: var(--border-radius-medium); + border-bottom-left-radius: var(--border-radius-medium); + overflow: hidden; + display: block !important; +} + +div.memdoc { + border-radius: 0; +} + +div.memproto { + border-radius: 0 var(--border-radius-small) 0 0; + overflow: auto; + border-bottom: 1px solid var(--separator-color); + padding: var(--spacing-medium); + margin-bottom: -1px; +} + +div.memtitle { + border-top-right-radius: var(--border-radius-medium); + border-top-left-radius: var(--border-radius-medium); +} + +div.memproto table.memname { + font-family: var(--font-family-monospace); + color: var(--page-foreground-color); + font-size: var(--memname-font-size); + text-shadow: none; +} + +div.memproto div.memtemplate { + font-family: var(--font-family-monospace); + color: var(--primary-dark-color); + font-size: var(--memname-font-size); + margin-left: 2px; + text-shadow: none; +} + +table.mlabels, table.mlabels > tbody { + display: block; +} + +td.mlabels-left { + width: auto; +} + +td.mlabels-right { + margin-top: 3px; + position: sticky; + left: 0; +} + +table.mlabels > tbody > tr:first-child { + display: flex; + justify-content: space-between; + flex-wrap: wrap; +} + +.memname, .memitem span.mlabels { + margin: 0 +} + +/* + reflist + */ + +dl.reflist { + box-shadow: var(--box-shadow); + border-radius: var(--border-radius-medium); + border: 1px solid var(--separator-color); + overflow: hidden; + padding: 0; +} + + +dl.reflist dt, dl.reflist dd { + box-shadow: none; + text-shadow: none; + background-image: none; + border: none; + padding: 12px; +} + + +dl.reflist dt { + font-weight: 500; + border-radius: 0; + background: var(--code-background); + border-bottom: 1px solid var(--separator-color); + color: var(--page-foreground-color) +} + + +dl.reflist dd { + background: none; +} + +/* + Table + */ + +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname), +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody { + display: inline-block; + max-width: 100%; +} + +.contents > table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname):not(.classindex) { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + max-width: calc(100% + 2 * var(--spacing-large)); +} + +table.fieldtable, +table.markdownTable tbody, +table.doxtable tbody { + border: none; + margin: var(--spacing-medium) 0; + box-shadow: 0 0 0 1px var(--separator-color); + border-radius: var(--border-radius-small); +} + +table.doxtable caption { + display: block; +} + +table.fieldtable { + border-collapse: collapse; + width: 100%; +} + +th.markdownTableHeadLeft, +th.markdownTableHeadRight, +th.markdownTableHeadCenter, +th.markdownTableHeadNone, +table.doxtable th { + background: var(--tablehead-background); + color: var(--tablehead-foreground); + font-weight: 600; + font-size: var(--page-font-size); +} + +th.markdownTableHeadLeft:first-child, +th.markdownTableHeadRight:first-child, +th.markdownTableHeadCenter:first-child, +th.markdownTableHeadNone:first-child, +table.doxtable tr th:first-child { + border-top-left-radius: var(--border-radius-small); +} + +th.markdownTableHeadLeft:last-child, +th.markdownTableHeadRight:last-child, +th.markdownTableHeadCenter:last-child, +th.markdownTableHeadNone:last-child, +table.doxtable tr th:last-child { + border-top-right-radius: var(--border-radius-small); +} + +table.markdownTable td, +table.markdownTable th, +table.fieldtable td, +table.fieldtable th, +table.doxtable td, +table.doxtable th { + border: 1px solid var(--separator-color); + padding: var(--spacing-small) var(--spacing-medium); +} + +table.markdownTable td:last-child, +table.markdownTable th:last-child, +table.fieldtable td:last-child, +table.fieldtable th:last-child, +table.doxtable td:last-child, +table.doxtable th:last-child { + border-right: none; +} + +table.markdownTable td:first-child, +table.markdownTable th:first-child, +table.fieldtable td:first-child, +table.fieldtable th:first-child, +table.doxtable td:first-child, +table.doxtable th:first-child { + border-left: none; +} + +table.markdownTable tr:first-child td, +table.markdownTable tr:first-child th, +table.fieldtable tr:first-child td, +table.fieldtable tr:first-child th, +table.doxtable tr:first-child td, +table.doxtable tr:first-child th { + border-top: none; +} + +table.markdownTable tr:last-child td, +table.markdownTable tr:last-child th, +table.fieldtable tr:last-child td, +table.fieldtable tr:last-child th, +table.doxtable tr:last-child td, +table.doxtable tr:last-child th { + border-bottom: none; +} + +table.markdownTable tr, table.doxtable tr { + border-bottom: 1px solid var(--separator-color); +} + +table.markdownTable tr:last-child, table.doxtable tr:last-child { + border-bottom: none; +} + +table.fieldtable th { + font-size: var(--page-font-size); + font-weight: 600; + background-image: none; + background-color: var(--tablehead-background); + color: var(--tablehead-foreground); +} + +table.fieldtable td.fieldtype, .fieldtable td.fieldname, .fieldtable td.fielddoc, .fieldtable th { + border-bottom: 1px solid var(--separator-color); + border-right: 1px solid var(--separator-color); +} + +table.fieldtable tr:last-child td:first-child { + border-bottom-left-radius: var(--border-radius-small); +} + +table.fieldtable tr:last-child td:last-child { + border-bottom-right-radius: var(--border-radius-small); +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--primary-light-color); + box-shadow: none; +} + +table.memberdecls { + display: block; + -webkit-tap-highlight-color: transparent; +} + +table.memberdecls tr[class^='memitem'] { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); +} + +table.memberdecls tr[class^='memitem'] .memTemplParams { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); + color: var(--primary-dark-color); + white-space: normal; +} + +table.memberdecls .memItemLeft, +table.memberdecls .memItemRight, +table.memberdecls .memTemplItemLeft, +table.memberdecls .memTemplItemRight, +table.memberdecls .memTemplParams { + transition: none; + padding-top: var(--spacing-small); + padding-bottom: var(--spacing-small); + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + background-color: var(--fragment-background); +} + +table.memberdecls .memTemplItemLeft, +table.memberdecls .memTemplItemRight { + padding-top: 2px; +} + +table.memberdecls .memTemplParams { + border-bottom: 0; + border-left: 1px solid var(--separator-color); + border-right: 1px solid var(--separator-color); + border-radius: var(--border-radius-small) var(--border-radius-small) 0 0; + padding-bottom: var(--spacing-small); +} + +table.memberdecls .memTemplItemLeft { + border-radius: 0 0 0 var(--border-radius-small); + border-left: 1px solid var(--separator-color); + border-top: 0; +} + +table.memberdecls .memTemplItemRight { + border-radius: 0 0 var(--border-radius-small) 0; + border-right: 1px solid var(--separator-color); + padding-left: 0; + border-top: 0; +} + +table.memberdecls .memItemLeft { + border-radius: var(--border-radius-small) 0 0 var(--border-radius-small); + border-left: 1px solid var(--separator-color); + padding-left: var(--spacing-medium); + padding-right: 0; +} + +table.memberdecls .memItemRight { + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; + border-right: 1px solid var(--separator-color); + padding-right: var(--spacing-medium); + padding-left: 0; + +} + +table.memberdecls .mdescLeft, table.memberdecls .mdescRight { + background: none; + color: var(--page-foreground-color); + padding: var(--spacing-small) 0; +} + +table.memberdecls .memItemLeft, +table.memberdecls .memTemplItemLeft { + padding-right: var(--spacing-medium); +} + +table.memberdecls .memSeparator { + background: var(--page-background-color); + height: var(--spacing-large); + border: 0; + transition: none; +} + +table.memberdecls .groupheader { + margin-bottom: var(--spacing-large); +} + +table.memberdecls .inherit_header td { + padding: 0 0 var(--spacing-medium) 0; + text-indent: -12px; + color: var(--page-secondary-foreground-color); +} + +table.memberdecls img[src="closed.png"], +table.memberdecls img[src="open.png"], +div.dynheader img[src="open.png"], +div.dynheader img[src="closed.png"] { + width: 0; + height: 0; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 5px solid var(--primary-color); + margin-top: 8px; + display: block; + float: left; + margin-left: -10px; + transition: transform 0.25s ease-out; +} + +table.memberdecls img { + margin-right: 10px; +} + +table.memberdecls img[src="closed.png"], +div.dynheader img[src="closed.png"] { + transform: rotate(-90deg); + +} + +.compoundTemplParams { + font-family: var(--font-family-monospace); + color: var(--primary-dark-color); + font-size: var(--code-font-size); +} + +@media screen and (max-width: 767px) { + + table.memberdecls .memItemLeft, + table.memberdecls .memItemRight, + table.memberdecls .mdescLeft, + table.memberdecls .mdescRight, + table.memberdecls .memTemplItemLeft, + table.memberdecls .memTemplItemRight, + table.memberdecls .memTemplParams { + display: block; + text-align: left; + padding-left: var(--spacing-large); + margin: 0 calc(0px - var(--spacing-large)) 0 calc(0px - var(--spacing-large)); + border-right: none; + border-left: none; + border-radius: 0; + white-space: normal; + } + + table.memberdecls .memItemLeft, + table.memberdecls .mdescLeft, + table.memberdecls .memTemplItemLeft { + border-bottom: 0; + padding-bottom: 0; + } + + table.memberdecls .memTemplItemLeft { + padding-top: 0; + } + + table.memberdecls .mdescLeft { + margin-bottom: calc(0px - var(--page-font-size)); + } + + table.memberdecls .memItemRight, + table.memberdecls .mdescRight, + table.memberdecls .memTemplItemRight { + border-top: 0; + padding-top: 0; + padding-right: var(--spacing-large); + overflow-x: auto; + } + + table.memberdecls tr[class^='memitem']:not(.inherit) { + display: block; + width: calc(100vw - 2 * var(--spacing-large)); + } + + table.memberdecls .mdescRight { + color: var(--page-foreground-color); + } + + table.memberdecls tr.inherit { + visibility: hidden; + } + + table.memberdecls tr[style="display: table-row;"] { + display: block !important; + visibility: visible; + width: calc(100vw - 2 * var(--spacing-large)); + animation: fade .5s; + } + + @keyframes fade { + 0% { + opacity: 0; + max-height: 0; + } + + 100% { + opacity: 1; + max-height: 200px; + } + } +} + + +/* + Horizontal Rule + */ + +hr { + margin-top: var(--spacing-large); + margin-bottom: var(--spacing-large); + height: 1px; + background-color: var(--separator-color); + border: 0; +} + +.contents hr { + box-shadow: 100px 0 0 var(--separator-color), + -100px 0 0 var(--separator-color), + 500px 0 0 var(--separator-color), + -500px 0 0 var(--separator-color), + 1500px 0 0 var(--separator-color), + -1500px 0 0 var(--separator-color), + 2000px 0 0 var(--separator-color), + -2000px 0 0 var(--separator-color); +} + +.contents img, .contents .center, .contents center, .contents div.image object { + max-width: 100%; + overflow: auto; +} + +@media screen and (max-width: 767px) { + .contents .dyncontent > .center, .contents > center { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + max-width: calc(100% + 2 * var(--spacing-large)); + } +} + +/* + Directories + */ +div.directory { + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + width: auto; +} + +table.directory { + font-family: var(--font-family); + font-size: var(--page-font-size); + font-weight: normal; + width: 100%; +} + +table.directory td.entry, table.directory td.desc { + padding: calc(var(--spacing-small) / 2) var(--spacing-small); + line-height: var(--table-line-height); +} + +table.directory tr.even td:last-child { + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; +} + +table.directory tr.even td:first-child { + border-radius: var(--border-radius-small) 0 0 var(--border-radius-small); +} + +table.directory tr.even:last-child td:last-child { + border-radius: 0 var(--border-radius-small) 0 0; +} + +table.directory tr.even:last-child td:first-child { + border-radius: var(--border-radius-small) 0 0 0; +} + +table.directory td.desc { + min-width: 250px; +} + +table.directory tr.even { + background-color: var(--odd-color); +} + +table.directory tr.odd { + background-color: transparent; +} + +.icona { + width: auto; + height: auto; + margin: 0 var(--spacing-small); +} + +.icon { + background: var(--primary-color); + border-radius: var(--border-radius-small); + font-size: var(--page-font-size); + padding: calc(var(--page-font-size) / 5); + line-height: var(--page-font-size); + transform: scale(0.8); + height: auto; + width: var(--page-font-size); + user-select: none; +} + +.iconfopen, .icondoc, .iconfclosed { + background-position: center; + margin-bottom: 0; + height: var(--table-line-height); +} + +.icondoc { + filter: saturate(0.2); +} + +@media screen and (max-width: 767px) { + div.directory { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + } +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) .iconfopen, html:not(.light-mode) .iconfclosed { + filter: hue-rotate(180deg) invert(); + } +} + +html.dark-mode .iconfopen, html.dark-mode .iconfclosed { + filter: hue-rotate(180deg) invert(); +} + +/* + Class list + */ + +.classindex dl.odd { + background: var(--odd-color); + border-radius: var(--border-radius-small); +} + +.classindex dl.even { + background-color: transparent; +} + +/* + Class Index Doxygen 1.8 +*/ + +table.classindex { + margin-left: 0; + margin-right: 0; + width: 100%; +} + +table.classindex table div.ah { + background-image: none; + background-color: initial; + border-color: var(--separator-color); + color: var(--page-foreground-color); + box-shadow: var(--box-shadow); + border-radius: var(--border-radius-large); + padding: var(--spacing-small); +} + +div.qindex { + background-color: var(--odd-color); + border-radius: var(--border-radius-small); + border: 1px solid var(--separator-color); + padding: var(--spacing-small) 0; +} + +/* + Footer and nav-path + */ + +#nav-path { + width: 100%; +} + +#nav-path ul { + background-image: none; + background: var(--page-background-color); + border: none; + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + border-bottom: 0; + box-shadow: 0 0.75px 0 var(--separator-color); + font-size: var(--navigation-font-size); +} + +img.footer { + width: 60px; +} + +.navpath li.footer { + color: var(--page-secondary-foreground-color); +} + +address.footer { + color: var(--page-secondary-foreground-color); + margin-bottom: var(--spacing-large); +} + +#nav-path li.navelem { + background-image: none; + display: flex; + align-items: center; +} + +.navpath li.navelem a { + text-shadow: none; + display: inline-block; + color: var(--primary-color) !important; +} + +.navpath li.navelem b { + color: var(--primary-dark-color); + font-weight: 500; +} + +li.navelem { + padding: 0; + margin-left: -8px; +} + +li.navelem:first-child { + margin-left: var(--spacing-large); +} + +li.navelem:first-child:before { + display: none; +} + +#nav-path li.navelem:after { + content: ''; + border: 5px solid var(--page-background-color); + border-bottom-color: transparent; + border-right-color: transparent; + border-top-color: transparent; + transform: translateY(-1px) scaleY(4.2); + z-index: 10; + margin-left: 6px; +} + +#nav-path li.navelem:before { + content: ''; + border: 5px solid var(--separator-color); + border-bottom-color: transparent; + border-right-color: transparent; + border-top-color: transparent; + transform: translateY(-1px) scaleY(3.2); + margin-right: var(--spacing-small); +} + +.navpath li.navelem a:hover { + color: var(--primary-color); +} + +/* + Scrollbars for Webkit +*/ + +#nav-tree::-webkit-scrollbar, +div.fragment::-webkit-scrollbar, +pre.fragment::-webkit-scrollbar, +div.memproto::-webkit-scrollbar, +.contents center::-webkit-scrollbar, +.contents .center::-webkit-scrollbar, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar, +div.contents .toc::-webkit-scrollbar { + background: transparent; + width: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); + height: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); +} + +#nav-tree::-webkit-scrollbar-thumb, +div.fragment::-webkit-scrollbar-thumb, +pre.fragment::-webkit-scrollbar-thumb, +div.memproto::-webkit-scrollbar-thumb, +.contents center::-webkit-scrollbar-thumb, +.contents .center::-webkit-scrollbar-thumb, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar-thumb, +div.contents .toc::-webkit-scrollbar-thumb { + background-color: transparent; + border: var(--webkit-scrollbar-padding) solid transparent; + border-radius: calc(var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); + background-clip: padding-box; +} + +#nav-tree:hover::-webkit-scrollbar-thumb, +div.fragment:hover::-webkit-scrollbar-thumb, +pre.fragment:hover::-webkit-scrollbar-thumb, +div.memproto:hover::-webkit-scrollbar-thumb, +.contents center:hover::-webkit-scrollbar-thumb, +.contents .center:hover::-webkit-scrollbar-thumb, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody:hover::-webkit-scrollbar-thumb, +div.contents .toc:hover::-webkit-scrollbar-thumb { + background-color: var(--webkit-scrollbar-color); +} + +#nav-tree::-webkit-scrollbar-track, +div.fragment::-webkit-scrollbar-track, +pre.fragment::-webkit-scrollbar-track, +div.memproto::-webkit-scrollbar-track, +.contents center::-webkit-scrollbar-track, +.contents .center::-webkit-scrollbar-track, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar-track, +div.contents .toc::-webkit-scrollbar-track { + background: transparent; +} + +#nav-tree::-webkit-scrollbar-corner { + background-color: var(--side-nav-background); +} + +#nav-tree, +div.fragment, +pre.fragment, +div.memproto, +.contents center, +.contents .center, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody, +div.contents .toc { + overflow-x: auto; + overflow-x: overlay; +} + +#nav-tree { + overflow-x: auto; + overflow-y: auto; + overflow-y: overlay; +} + +/* + Scrollbars for Firefox +*/ + +#nav-tree, +div.fragment, +pre.fragment, +div.memproto, +.contents center, +.contents .center, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody, +div.contents .toc { + scrollbar-width: thin; +} + +/* + Optional Dark mode toggle button +*/ + +doxygen-awesome-dark-mode-toggle { + display: inline-block; + margin: 0 0 0 var(--spacing-small); + padding: 0; + width: var(--searchbar-height); + height: var(--searchbar-height); + background: none; + border: none; + border-radius: var(--searchbar-height); + vertical-align: middle; + text-align: center; + line-height: var(--searchbar-height); + font-size: 22px; + display: flex; + align-items: center; + justify-content: center; + user-select: none; + cursor: pointer; +} + +doxygen-awesome-dark-mode-toggle > svg { + transition: transform .1s ease-in-out; +} + +doxygen-awesome-dark-mode-toggle:active > svg { + transform: scale(.5); +} + +doxygen-awesome-dark-mode-toggle:hover { + background-color: rgba(0,0,0,.03); +} + +html.dark-mode doxygen-awesome-dark-mode-toggle:hover { + background-color: rgba(0,0,0,.18); +} + +/* + Optional fragment copy button +*/ +.doxygen-awesome-fragment-wrapper { + position: relative; +} + +doxygen-awesome-fragment-copy-button { + opacity: 0; + background: var(--fragment-background); + width: 28px; + height: 28px; + position: absolute; + right: calc(var(--spacing-large) - (var(--spacing-large) / 2.5)); + top: calc(var(--spacing-large) - (var(--spacing-large) / 2.5)); + border: 1px solid var(--fragment-foreground); + cursor: pointer; + border-radius: var(--border-radius-small); + display: flex; + justify-content: center; + align-items: center; +} + +.doxygen-awesome-fragment-wrapper:hover doxygen-awesome-fragment-copy-button, doxygen-awesome-fragment-copy-button.success { + opacity: .28; +} + +doxygen-awesome-fragment-copy-button:hover, doxygen-awesome-fragment-copy-button.success { + opacity: 1 !important; +} + +doxygen-awesome-fragment-copy-button:active:not([class~=success]) svg { + transform: scale(.91); +} + +doxygen-awesome-fragment-copy-button svg { + fill: var(--fragment-foreground); + width: 18px; + height: 18px; +} + +doxygen-awesome-fragment-copy-button.success svg { + fill: rgb(14, 168, 14); +} + +doxygen-awesome-fragment-copy-button.success { + border-color: rgb(14, 168, 14); +} + +@media screen and (max-width: 767px) { + .textblock > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .textblock li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .memdoc li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .memdoc > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + dl dd > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button { + right: 0; + } +} + +/* + Optional paragraph link button +*/ + +a.anchorlink { + font-size: 90%; + margin-left: var(--spacing-small); + color: var(--page-foreground-color) !important; + text-decoration: none; + opacity: .15; + display: none; + transition: opacity .1s ease-in-out, color .1s ease-in-out; +} + +a.anchorlink svg { + fill: var(--page-foreground-color); +} + +h3 a.anchorlink svg, h4 a.anchorlink svg { + margin-bottom: -3px; + margin-top: -4px; +} + +a.anchorlink:hover { + opacity: .45; +} + +h2:hover a.anchorlink, h1:hover a.anchorlink, h3:hover a.anchorlink, h4:hover a.anchorlink { + display: inline-block; +} + + +#MSearchBox .left { + background: none !important; +} +#MSearchBox .right { + background: none !important; +} From a89995b63f7598820e47c781f17541ab193a14f7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 7 Jan 2023 12:36:53 +0100 Subject: [PATCH 0632/1128] WIP Public virtual card --- htdocs/core/lib/functions.lib.php | 12 ++++++++---- htdocs/langs/en_US/main.lang | 3 ++- htdocs/main.inc.php | 20 ++++++++++++++------ htdocs/projet/card.php | 2 +- htdocs/public/users/view.php | 6 +++--- htdocs/user/card.php | 4 +--- htdocs/user/virtualcard.php | 1 + 7 files changed, 30 insertions(+), 18 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index ac774209d30..e32cbc3ca9d 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -1731,11 +1731,13 @@ function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename = * @param string $url Relative Url to open. For example '/project/card.php' * @param string $disabled Disabled text * @param string $morecss More CSS + * @param string $jsonopen Some JS code to execute on click/open of popup * @param string $backtopagejsfields The back to page must be managed using javascript instead of a redirect. * Value is 'keyforpopupid:Name_of_html_component_to_set_with id,Name_of_html_component_to_set_with_label' + * @param string $accesskey A key to use shortcut * @return string HTML component with button */ -function dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled = '', $morecss = 'classlink button bordertransp', $backtopagejsfields = '') +function dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled = '', $morecss = 'classlink button bordertransp', $jsonopen = '', $backtopagejsfields = '', $accesskey = '') { global $conf; @@ -1763,9 +1765,11 @@ function dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $di //print ''; $out .= ''; - $out .= 'use_javascript_ajax)) { $out .= ' href="'.DOL_URL_ROOT.$url.'" target="_blank"'; + } elseif ($jsonopen) { + $out .= ' onclick="javascript:'.$jsonopen.'"'; } $out .= '>'.$buttonstring.''; @@ -2324,7 +2328,7 @@ function dol_banner_tab($object, $paramid, $morehtml = '', $shownav = 1, $fieldi // Add alias for thirdparty if (!empty($object->name_alias)) { - $morehtmlref .= '
'.$object->name_alias.'
'; + $morehtmlref .= '
'.dol_escape_htmltag($object->name_alias).'
'; } // Add label @@ -2346,7 +2350,7 @@ function dol_banner_tab($object, $paramid, $morehtml = '', $shownav = 1, $fieldi if (!empty($conf->global->MAIN_SHOW_TECHNICAL_ID) && ($conf->global->MAIN_SHOW_TECHNICAL_ID == '1' || preg_match('/'.preg_quote($object->element, '/').'/i', $conf->global->MAIN_SHOW_TECHNICAL_ID)) && !empty($object->id)) { $morehtmlref .= '
'; $morehtmlref .= '
'; - $morehtmlref .= $langs->trans("TechnicalID").': '.$object->id; + $morehtmlref .= $langs->trans("TechnicalID").': '.((int) $object->id); $morehtmlref .= '
'; } diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index e747f004c87..daa01cfcfa4 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=No user group defined Password=Password PasswordRetype=Repeat your password NoteSomeFeaturesAreDisabled=Note that a lot of features/modules are disabled in this demonstration. +YourUserFile=Your user file Name=Name NameSlashCompany=Name / Company Person=Person @@ -1213,4 +1214,4 @@ InternalUser=Internal user ExternalUser=External user NoSpecificContactAddress=No specific contact or address NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. - +AddToContacts=Add address to my contacts diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 17912f81101..a21082a8bc6 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -2280,12 +2280,14 @@ function top_menu_user($hideloginname = 0, $urllogout = '') if (empty($urllogout)) { $urllogout = DOL_URL_ROOT.'/user/logout.php?token='.newToken(); } - $logoutLink = ' '.$langs->trans("Logout").''; - $profilLink = ' '.$langs->trans("Card").''; + // Defined the links for bottom of card + $profilLink = ' '.$langs->trans("Card").''; + $urltovirtualcard = '/user/virtualcard.php?id='.((int) $user->id); + $virtuelcardLink = dolButtonToOpenUrlInDialogPopup('publicvirtualcardmenu', $langs->trans("PublicVirtualCardUrl"), img_picto($langs->trans("PublicVirtualCardUrl"), 'card', ''), $urltovirtualcard, '', 'button-top-menu-dropdown marginleftonly nohover', "closeTopMenuLoginDropdown()", '', 'v'); + $logoutLink = ' '.$langs->trans("Logout").''; $profilName = $user->getFullName($langs).' ('.$user->login.')'; - if (!empty($user->admin)) { $profilName = ' '.$profilName; } @@ -2341,6 +2343,9 @@ function top_menu_user($hideloginname = 0, $urllogout = '')
'.$profilLink.'
+
+ '.$virtuelcardLink.' +
'.$logoutLink.'
@@ -2363,12 +2368,15 @@ function top_menu_user($hideloginname = 0, $urllogout = '') $btnUser .= ' '; + + if ($type == 'sub') { + $newcardbutton .= dolGetButtonTitle($langs->trans('AccountBalance')." - ".$langs->trans('GroupByAccountAccounting'), '', 'fa fa-stream paddingleft imgforviewmode', DOL_URL_ROOT . '/accountancy/bookkeeping/balance.php?' . $url_param, '', 1, array('morecss' => 'marginleftonly')); + $newcardbutton .= dolGetButtonTitle($langs->trans('AccountBalance')." - ".$langs->trans('GroupBySubAccountAccounting'), '', 'fa fa-align-left vmirror paddingleft imgforviewmode', DOL_URL_ROOT . '/accountancy/bookkeeping/balance.php?type=sub&' . $url_param, '', 1, array('morecss' => 'marginleftonly btnTitleSelected')); + } else { + $newcardbutton .= dolGetButtonTitle($langs->trans('AccountBalance')." - ".$langs->trans('GroupByAccountAccounting'), '', 'fa fa-stream paddingleft imgforviewmode', DOL_URL_ROOT . '/accountancy/bookkeeping/balance.php?' . $url_param, '', 1, array('morecss' => 'marginleftonly btnTitleSelected')); + $newcardbutton .= dolGetButtonTitle($langs->trans('AccountBalance')." - ".$langs->trans('GroupBySubAccountAccounting'), '', 'fa fa-align-left vmirror paddingleft imgforviewmode', DOL_URL_ROOT . '/accountancy/bookkeeping/balance.php?type=sub&' . $url_param, '', 1, array('morecss' => 'marginleftonly')); + } + $newcardbutton .= dolGetButtonTitle($langs->trans('NewAccountingMvt'), '', 'fa fa-plus-circle paddingleft', DOL_URL_ROOT.'/accountancy/bookkeeping/card.php?action=create'); + } + if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { + $param .= '&contextpage='.urlencode($contextpage); + } + if ($limit > 0 && $limit != $conf->liste_limit) { + $param .= '&limit='.urlencode($limit); } - print_barre_liste($title_page, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $button, $result, $nbtotalofrecords, 'title_accountancy', 0, '', '', $limit); + print_barre_liste($title_page, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $result, $nbtotalofrecords, 'title_accountancy', 0, $newcardbutton, '', $limit, 0, 0, 1); $selectedfields = ''; @@ -275,18 +341,38 @@ if ($action != 'export_csv') { $moreforfilter .= $form->selectDate($search_date_start ? $search_date_start : -1, 'date_start', 0, 0, 1, '', 1, 0); $moreforfilter .= $langs->trans('DateEnd').': '; $moreforfilter .= $form->selectDate($search_date_end ? $search_date_end : -1, 'date_end', 0, 0, 1, '', 1, 0); - - $moreforfilter .= ' - '; - $moreforfilter .= ': '; - $moreforfilter .= ''; - $moreforfilter .= '
'; $moreforfilter .= '
'; + $moreforfilter .= ': '; + $moreforfilter .= ''; + $moreforfilter .= '
'; - $moreforfilter .= $langs->trans("Journal"); + $moreforfilter .= '
'; + $moreforfilter .= $langs->trans("Journals").': '; $moreforfilter .= $formaccounting->multi_select_journal($search_ledger_code, 'search_ledger_code', 0, 1, 1, 1); + $moreforfilter .= '
'; + $moreforfilter .= '
'; + $moreforfilter .= '
'; + // Accountancy account + $moreforfilter .= $langs->trans('AccountAccounting').': '; + if ($type == 'sub') { + $moreforfilter .= $formaccounting->select_auxaccount($search_accountancy_code_start, 'search_accountancy_code_start', $langs->trans('From'), 'maxwidth200'); + } else { + $moreforfilter .= $formaccounting->select_account($search_accountancy_code_start, 'search_accountancy_code_start', $langs->trans('From'), array(), 1, 1, 'maxwidth200', 'accounts'); + } + $moreforfilter .= ' '; + if ($type == 'sub') { + $moreforfilter .= $formaccounting->select_auxaccount($search_accountancy_code_end, 'search_accountancy_code_end', $langs->trans('to'), 'maxwidth200'); + } else { + $moreforfilter .= $formaccounting->select_account($search_accountancy_code_end, 'search_accountancy_code_end', $langs->trans('to'), array(), 1, 1, 'maxwidth200', 'accounts'); + } + $moreforfilter .= '
'; + + $moreforfilter .= '
'; + $moreforfilter .= ': '; + $moreforfilter .= ''; $moreforfilter .= '
'; if (!empty($moreforfilter)) { @@ -305,9 +391,6 @@ if ($action != 'export_csv') { print ''; print ''; - print $formaccounting->select_account($search_accountancy_code_start, 'search_accountancy_code_start', $langs->trans('From'), array(), 1, 1, '', 'accounts'); - print ' '; - print $formaccounting->select_account($search_accountancy_code_end, 'search_accountancy_code_end', $langs->trans('to'), array(), 1, 1, '', 'accounts'); print ''; // Fields from hook @@ -324,6 +407,10 @@ if ($action != 'export_csv') { print ''; print_liste_field_titre("AccountAccounting", $_SERVER['PHP_SELF'], "t.numero_compte", "", $param, "", $sortfield, $sortorder); + // TODO : Retrieve the type of third party: Customer / Supplier / Employee + //if ($type == 'sub') { + // print_liste_field_titre("Type", $_SERVER['PHP_SELF'], "t.type", "", $param, "", $sortfield, $sortorder); + //} if (!empty($conf->global->ACCOUNTANCY_SHOW_OPENING_BALANCE)) { print_liste_field_titre("OpeningBalance", $_SERVER['PHP_SELF'], "", $param, "", 'class="right"', $sortfield, $sortorder); } @@ -359,7 +446,7 @@ if ($action != 'export_csv') { $sql .= " GROUP BY t.numero_compte"; $resql = $db->query($sql); - $nrows = $db->num_rows($resql); + $nrows = $resql->num_rows; $opening_balances = array(); for ($i = 0; $i < $nrows; $i++) { $arr = $resql->fetch_array(); @@ -372,11 +459,13 @@ if ($action != 'export_csv') { $accountingaccountstatic->id = 0; $accountingaccountstatic->account_number = ''; - $accountingaccountstatic->fetch(null, $line->numero_compte, true); - if (!empty($accountingaccountstatic->account_number)) { - $accounting_account = $accountingaccountstatic->getNomUrl(0, 1, 0, '', 0, -1, 0, 'accountcard'); - } else { - $accounting_account = length_accountg($line->numero_compte); + if ($type != 'sub') { + $accountingaccountstatic->fetch(null, $line->numero_compte, true); + if (!empty($accountingaccountstatic->account_number)) { + $accounting_account = $accountingaccountstatic->getNomUrl(0, 1, 0, '', 0, -1, 0, 'ledger'); + } else { + $accounting_account = length_accountg($line->numero_compte); + } } $link = ''; @@ -427,7 +516,7 @@ if ($action != 'export_csv') { // Show first line of a break print ''; - print ''.$line->numero_compte.($root_account_description ? ' - '.$root_account_description : '').''; + print ''.$line->numero_compte.($root_account_description ? ' - '.$root_account_description : '').''; print ''; $displayed_account = $root_account_number; @@ -438,19 +527,43 @@ if ($action != 'export_csv') { } print ''; - print ''.$accounting_account.''; + // Accounting account + if ($type == 'sub') { + print ''.$line->subledger_account.' ('.$line->subledger_label.')'; + } else { + print ''.$accounting_account.''; + } + + // Type + // TODO Retrieve the type of third party: Customer / Supplier / Employee + //if ($type == 'sub') { + // print ''; + //} + if (!empty($conf->global->ACCOUNTANCY_SHOW_OPENING_BALANCE)) { print ''.price(price2num($opening_balance, 'MT')).''; } $urlzoom = ''; - if ($line->numero_compte) { - $urlzoom = DOL_URL_ROOT.'/accountancy/bookkeeping/listbyaccount.php?search_accountancy_code_start='.urlencode($line->numero_compte).'&search_accountancy_code_end='.urlencode($line->numero_compte); - if (GETPOSTISSET('date_startmonth')) { - $urlzoom .= '&search_date_startmonth='.GETPOST('date_startmonth', 'int').'&search_date_startday='.GETPOST('date_startday', 'int').'&search_date_startyear='.GETPOST('date_startyear', 'int'); + if ($type == 'sub') { + if ($line->subledger_account) { + $urlzoom = DOL_URL_ROOT . '/accountancy/bookkeeping/listbyaccount.php?type=sub&search_accountancy_code_start=' . urlencode($line->subledger_account) . '&search_accountancy_code_end=' . urlencode($line->subledger_account); + if (GETPOSTISSET('date_startmonth')) { + $urlzoom .= '&search_date_startmonth=' . GETPOST('date_startmonth', 'int') . '&search_date_startday=' . GETPOST('date_startday', 'int') . '&search_date_startyear=' . GETPOST('date_startyear', 'int'); + } + if (GETPOSTISSET('date_endmonth')) { + $urlzoom .= '&search_date_endmonth=' . GETPOST('date_endmonth', 'int') . '&search_date_endday=' . GETPOST('date_endday', 'int') . '&search_date_endyear=' . GETPOST('date_endyear', 'int'); + } } - if (GETPOSTISSET('date_endmonth')) { - $urlzoom .= '&search_date_endmonth='.GETPOST('date_endmonth', 'int').'&search_date_endday='.GETPOST('date_endday', 'int').'&search_date_endyear='.GETPOST('date_endyear', 'int'); + } else { + if ($line->numero_compte) { + $urlzoom = DOL_URL_ROOT . '/accountancy/bookkeeping/listbyaccount.php?search_accountancy_code_start=' . urlencode($line->numero_compte) . '&search_accountancy_code_end=' . urlencode($line->numero_compte); + if (GETPOSTISSET('date_startmonth')) { + $urlzoom .= '&search_date_startmonth=' . GETPOST('date_startmonth', 'int') . '&search_date_startday=' . GETPOST('date_startday', 'int') . '&search_date_startyear=' . GETPOST('date_startyear', 'int'); + } + if (GETPOSTISSET('date_endmonth')) { + $urlzoom .= '&search_date_endmonth=' . GETPOST('date_endmonth', 'int') . '&search_date_endday=' . GETPOST('date_endday', 'int') . '&search_date_endyear=' . GETPOST('date_endyear', 'int'); + } } } // Debit diff --git a/htdocs/accountancy/class/bookkeeping.class.php b/htdocs/accountancy/class/bookkeeping.class.php index 95ba38d20bb..803e2feb619 100644 --- a/htdocs/accountancy/class/bookkeeping.class.php +++ b/htdocs/accountancy/class/bookkeeping.class.php @@ -1139,9 +1139,10 @@ class BookKeeping extends CommonObject * @param int $offset offset limit * @param array $filter filter array * @param string $filtermode filter mode (AND or OR) + * @param int $option option (0: general account or 1: subaccount) * @return int <0 if KO, >0 if OK */ - public function fetchAllBalance($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, array $filter = array(), $filtermode = 'AND') + public function fetchAllBalance($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, array $filter = array(), $filtermode = 'AND', $option = 0) { global $conf; @@ -1151,6 +1152,9 @@ class BookKeeping extends CommonObject $sql = 'SELECT'; $sql .= " t.numero_compte,"; + $sql .= " t.label_compte,"; + $sql .= " t.subledger_account,"; + $sql .= " t.subledger_label,"; $sql .= " SUM(t.debit) as debit,"; $sql .= " SUM(t.credit) as credit"; $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; @@ -1176,6 +1180,8 @@ class BookKeeping extends CommonObject } else { $sqlwhere[] = natural_search("t.code_journal", $value, 3, 1); } + } elseif ($key == 't.reconciled_option') { + $sqlwhere[] = 't.lettering_code IS NULL'; } else { $sqlwhere[] = $key." LIKE '%".$this->db->escape($value)."%'"; } @@ -1186,7 +1192,17 @@ class BookKeeping extends CommonObject $sql .= " AND ".implode(" ".$filtermode." ", $sqlwhere); } - $sql .= ' GROUP BY t.numero_compte'; + if (!empty($option)) { + $sql .= ' AND t.subledger_account IS NOT NULL'; + $sql .= ' AND t.subledger_account != ""'; + $sql .= ' GROUP BY t.subledger_account'; + $sortfield = 't.subledger_account'.($sortfield ? ','.$sortfield : ''); + $sortorder = 'ASC'.($sortfield ? ','.$sortfield : ''); + } else { + $sql .= ' GROUP BY t.numero_compte'; + $sortfield = 't.numero_compte'.($sortfield ? ','.$sortfield : ''); + $sortorder = 'ASC'.($sortorder ? ','.$sortorder : ''); + } if (!empty($sortfield)) { $sql .= $this->db->order($sortfield, $sortorder); @@ -1204,6 +1220,9 @@ class BookKeeping extends CommonObject $line = new BookKeepingLine(); $line->numero_compte = $obj->numero_compte; + $line->label_compte = $obj->label_compte; + $line->subledger_account = $obj->subledger_account; + $line->subledger_label = $obj->subledger_label; $line->debit = $obj->debit; $line->credit = $obj->credit; diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang index e988764d8ba..19abe47fd0b 100644 --- a/htdocs/langs/en_US/accountancy.lang +++ b/htdocs/langs/en_US/accountancy.lang @@ -126,6 +126,7 @@ WriteBookKeeping=Record transactions in accounting Bookkeeping=Ledger BookkeepingSubAccount=Subledger AccountBalance=Account balance +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Source object ref CAHTF=Total purchase vendor before tax TotalExpenseReport=Total expense report From a85e1c46946325bfbd57a564cb75a463515fa081 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Tue, 10 Jan 2023 08:49:09 +0100 Subject: [PATCH 0681/1128] Remove link --- htdocs/accountancy/bookkeeping/balance.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/accountancy/bookkeeping/balance.php b/htdocs/accountancy/bookkeeping/balance.php index 0d26213e52f..1b3973ae0cd 100644 --- a/htdocs/accountancy/bookkeeping/balance.php +++ b/htdocs/accountancy/bookkeeping/balance.php @@ -462,7 +462,7 @@ if ($action != 'export_csv') { if ($type != 'sub') { $accountingaccountstatic->fetch(null, $line->numero_compte, true); if (!empty($accountingaccountstatic->account_number)) { - $accounting_account = $accountingaccountstatic->getNomUrl(0, 1, 0, '', 0, -1, 0, 'ledger'); + $accounting_account = $accountingaccountstatic->getNomUrl(0, 1, 1); } else { $accounting_account = length_accountg($line->numero_compte); } From 1c3d4f9301b29a107fae617fd279a711fbb4cfad Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Tue, 10 Jan 2023 09:09:39 +0100 Subject: [PATCH 0682/1128] Add warning --- htdocs/accountancy/bookkeeping/balance.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/htdocs/accountancy/bookkeeping/balance.php b/htdocs/accountancy/bookkeeping/balance.php index 1b3973ae0cd..fd8cd8ad688 100644 --- a/htdocs/accountancy/bookkeeping/balance.php +++ b/htdocs/accountancy/bookkeeping/balance.php @@ -334,6 +334,11 @@ if ($action != 'export_csv') { $selectedfields = ''; + // Warning to explain why list of record is not consistent with the other list view (missing a lot of lines) + if ($type == 'sub') { + print info_admin($langs->trans("WarningRecordWithoutSubledgerAreExcluded")); + } + $moreforfilter = ''; $moreforfilter .= '
'; From 81d2c7fa0ee8d1775c2f84960b313b8f343d31fa Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Jan 2023 10:21:36 +0100 Subject: [PATCH 0683/1128] NEW Can bin accounting line for a given month --- htdocs/accountancy/customer/index.php | 15 ++++++++++++--- htdocs/accountancy/expensereport/index.php | 22 +++++++++++++++++++--- htdocs/accountancy/supplier/index.php | 22 +++++++++++++++++++--- htdocs/langs/en_US/accountancy.lang | 1 + 4 files changed, 51 insertions(+), 9 deletions(-) diff --git a/htdocs/accountancy/customer/index.php b/htdocs/accountancy/customer/index.php index 393629ae505..46e6832dba2 100644 --- a/htdocs/accountancy/customer/index.php +++ b/htdocs/accountancy/customer/index.php @@ -300,7 +300,10 @@ if ($action == 'validatehistory') { $db->rollback(); } else { $db->commit(); - setEventMessages($langs->trans('AutomaticBindingDone', $nbbinddone, $notpossible), null, 'mesgs'); + setEventMessages($langs->trans('AutomaticBindingDone', $nbbinddone, $notpossible), null, ($notpossible ? 'warnings' : 'mesgs')); + if ($notpossible) { + setEventMessages($langs->trans('DoManualBindingForFailedRecord', $notpossible), null, 'warnings'); + } } } @@ -324,7 +327,7 @@ print '
'; $y = $year_current; -$buttonbind = ''.$langs->trans("ValidateHistory").''; +$buttonbind = ''.img_picto($langs->trans("ValidateHistory"), 'link', 'class="pictofixedwidth fa-color-unset"').$langs->trans("ValidateHistory").''; print_barre_liste(img_picto('', 'unlink', 'class="paddingright fa-color-unset"').$langs->trans("OverviewOfAmountOfLinesNotBound"), '', '', '', '', '', '', -1, '', '', 0, $buttonbind, '', 0, 1, 1); //print load_fiche_titre($langs->trans("OverviewOfAmountOfLinesNotBound"), $buttonbind, ''); @@ -420,6 +423,12 @@ if ($resql) { print ''; print price($row[$i]); + // Add link to make binding + if (!empty(price2num($row[$i]))) { + print ''; + print img_picto($langs->trans("ValidateHistory").' ('.$langs->trans('Month'.str_pad($cursormonth, 2, '0', STR_PAD_LEFT)).' '.$cursoryear.')', 'link', 'class="marginleft2"'); + print ''; + } print ''; } print ''.price($row[14]).''; @@ -558,7 +567,7 @@ print "\n"; print '
'; -if ($conf->global->MAIN_FEATURES_LEVEL > 0) { // This part of code looks strange. Why showing a report that should rely on result of this step ? +if (getDolGlobalString('SHOW_TOTAL_OF_PREVIOUS_LISTS_IN_LIN_PAGE')) { // This part of code looks strange. Why showing a report that should rely on result of this step ? print '
'; print '
'; diff --git a/htdocs/accountancy/expensereport/index.php b/htdocs/accountancy/expensereport/index.php index 5064003c7ff..df226ce115d 100644 --- a/htdocs/accountancy/expensereport/index.php +++ b/htdocs/accountancy/expensereport/index.php @@ -162,7 +162,10 @@ if ($action == 'validatehistory') { $db->rollback(); } else { $db->commit(); - setEventMessages($langs->trans('AutomaticBindingDone', $nbbinddone, $notpossible), null, 'mesgs'); + setEventMessages($langs->trans('AutomaticBindingDone', $nbbinddone, $notpossible), null, ($notpossible ? 'warnings' : 'mesgs')); + if ($notpossible) { + setEventMessages($langs->trans('DoManualBindingForFailedRecord', $notpossible), null, 'warnings'); + } } } @@ -185,7 +188,7 @@ print '
'; $y = $year_current; -$buttonbind = ''.$langs->trans("ValidateHistory").''; +$buttonbind = ''.img_picto('', 'link', 'class="paddingright fa-color-unset"').$langs->trans("ValidateHistory").''; print_barre_liste(img_picto('', 'unlink', 'class="paddingright fa-color-unset"').$langs->trans("OverviewOfAmountOfLinesNotBound"), '', '', '', '', '', '', -1, '', '', 0, $buttonbind, '', 0, 1, 1); @@ -269,8 +272,21 @@ if ($resql) { } print ''; for ($i = 2; $i <= 13; $i++) { + $cursormonth = (($conf->global->SOCIETE_FISCAL_MONTH_START ? $conf->global->SOCIETE_FISCAL_MONTH_START : 1) + $i - 2); + if ($cursormonth > 12) { + $cursormonth -= 12; + } + $cursoryear = ($cursormonth < ($conf->global->SOCIETE_FISCAL_MONTH_START ? $conf->global->SOCIETE_FISCAL_MONTH_START : 1)) ? $y + 1 : $y; + $tmp = dol_getdate(dol_get_last_day($cursoryear, $cursormonth, 'gmt'), false, 'gmt'); + print ''; print price($row[$i]); + // Add link to make binding + if (!empty(price2num($row[$i]))) { + print ''; + print img_picto($langs->trans("ValidateHistory").' ('.$langs->trans('Month'.str_pad($cursormonth, 2, '0', STR_PAD_LEFT)).' '.$cursoryear.')', 'link', 'class="marginleft2"'); + print ''; + } print ''; } print ''.price($row[14]).''; @@ -367,7 +383,7 @@ print '
'; -if ($conf->global->MAIN_FEATURES_LEVEL > 0) { // This part of code looks strange. Why showing a report where results depends on next step (so not yet available) ? +if (getDolGlobalString('SHOW_TOTAL_OF_PREVIOUS_LISTS_IN_LIN_PAGE')) { // This part of code looks strange. Why showing a report that should rely on result of this step ? print '
'; print '
'; diff --git a/htdocs/accountancy/supplier/index.php b/htdocs/accountancy/supplier/index.php index b214b89734c..b66b791f7b1 100644 --- a/htdocs/accountancy/supplier/index.php +++ b/htdocs/accountancy/supplier/index.php @@ -298,7 +298,10 @@ if ($action == 'validatehistory') { $db->rollback(); } else { $db->commit(); - setEventMessages($langs->trans('AutomaticBindingDone', $nbbinddone, $notpossible), null, 'mesgs'); + setEventMessages($langs->trans('AutomaticBindingDone', $nbbinddone, $notpossible), null, ($notpossible ? 'warnings' : 'mesgs')); + if ($notpossible) { + setEventMessages($langs->trans('DoManualBindingForFailedRecord', $notpossible), null, 'warnings'); + } } } @@ -320,7 +323,7 @@ print '
'; $y = $year_current; -$buttonbind = ''.$langs->trans("ValidateHistory").''; +$buttonbind = ''.img_picto('', 'link', 'class="paddingright fa-color-unset"').$langs->trans("ValidateHistory").''; print_barre_liste(img_picto('', 'unlink', 'class="paddingright fa-color-unset"').$langs->trans("OverviewOfAmountOfLinesNotBound"), '', '', '', '', '', '', -1, '', '', 0, $buttonbind, '', 0, 1, 1); @@ -408,8 +411,21 @@ if ($resql) { } print ''; for ($i = 2; $i <= 13; $i++) { + $cursormonth = (($conf->global->SOCIETE_FISCAL_MONTH_START ? $conf->global->SOCIETE_FISCAL_MONTH_START : 1) + $i - 2); + if ($cursormonth > 12) { + $cursormonth -= 12; + } + $cursoryear = ($cursormonth < ($conf->global->SOCIETE_FISCAL_MONTH_START ? $conf->global->SOCIETE_FISCAL_MONTH_START : 1)) ? $y + 1 : $y; + $tmp = dol_getdate(dol_get_last_day($cursoryear, $cursormonth, 'gmt'), false, 'gmt'); + print ''; print price($row[$i]); + // Add link to make binding + if (!empty(price2num($row[$i]))) { + print ''; + print img_picto($langs->trans("ValidateHistory").' ('.$langs->trans('Month'.str_pad($cursormonth, 2, '0', STR_PAD_LEFT)).' '.$cursoryear.')', 'link', 'class="marginleft2"'); + print ''; + } print ''; } print ''.price($row[14]).''; @@ -541,7 +557,7 @@ print "\n"; print '
'; -if ($conf->global->MAIN_FEATURES_LEVEL > 0) { // This part of code looks strange. Why showing a report that should rely on result of this step ? +if (getDolGlobalString('SHOW_TOTAL_OF_PREVIOUS_LISTS_IN_LIN_PAGE')) { // This part of code looks strange. Why showing a report that should rely on result of this step ? print '
'; print '
'; diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang index 419b69a3f90..554087ad5c4 100644 --- a/htdocs/langs/en_US/accountancy.lang +++ b/htdocs/langs/en_US/accountancy.lang @@ -297,6 +297,7 @@ DescValidateMovements=Any modification or deletion of writing, lettering and del ValidateHistory=Bind Automatically AutomaticBindingDone=Automatic bindings done (%s) - Automatic binding not possible for some record (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the rows not linked %s automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s From 765a542e1265493a21996da33021354e665ecbf3 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Tue, 10 Jan 2023 10:32:35 +0100 Subject: [PATCH 0684/1128] kanban mode for list of fournisseur commande --- .../class/fournisseur.commande.class.php | 32 + htdocs/fourn/commande/list.php | 672 +++++++++--------- 2 files changed, 384 insertions(+), 320 deletions(-) diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index 00ed65e7616..9482ff7f500 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -3544,6 +3544,38 @@ class CommandeFournisseur extends CommonOrder return -1; } } + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $langs; + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + //$return .= ''; // Can be image + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).''; + if (property_exists($this, 'socid') || property_exists($this, 'total_tva')) { + $return .='
'.$this->socid.''; + } + if (property_exists($this, 'billed')) { + $return .= '
'.$langs->trans("Billed").' : '.yn($this->billed).''; + } + if (method_exists($this, 'getLibStatut')) { + $return .= '
'.$this->getLibStatut(5).'
'; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } diff --git a/htdocs/fourn/commande/list.php b/htdocs/fourn/commande/list.php index 3d458247bcf..96c2f7d6cbf 100644 --- a/htdocs/fourn/commande/list.php +++ b/htdocs/fourn/commande/list.php @@ -56,6 +56,7 @@ $show_files = GETPOST('show_files', 'int'); $confirm = GETPOST('confirm', 'alpha'); $toselect = GETPOST('toselect', 'array'); $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'supplierorderlist'; +$mode = GETPOST('mode', 'alpha'); // Search Criteria $search_date_order_startday = GETPOST('search_date_order_startday', 'int'); @@ -576,6 +577,9 @@ if (empty($reshook)) { // Make a redirect to avoid to bill twice if we make a refresh or back $param = ''; + if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); + } if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -998,6 +1002,9 @@ if ($resql) { llxHeader('', $title, $help_url); $param = ''; + if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); + } if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -1184,7 +1191,10 @@ if ($resql) { $url .= '&socid='.((int) $socid); $url .= '&backtopage='.urlencode(DOL_URL_ROOT.'/fourn/commande/list.php?socid='.((int) $socid)); } - $newcardbutton = dolGetButtonTitle($langs->trans('NewSupplierOrderShort'), '', 'fa fa-plus-circle', $url, '', $permissiontoadd); + $newcardbutton = ''; + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); + $newcardbutton .= dolGetButtonTitle($langs->trans('NewSupplierOrderShort'), '', 'fa fa-plus-circle', $url, '', $permissiontoadd); // Lines of title fields print '
'; @@ -1198,6 +1208,7 @@ if ($resql) { print ''; print ''; print ''; + print ''; print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'supplier_order', 0, $newcardbutton, '', $limit, 0, 0, 1); @@ -1660,344 +1671,365 @@ if ($resql) { $objectstatic->note_private = $obj->note_private; $objectstatic->statut = $obj->fk_statut; - print ''; - // Action column - if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->rowid, $arrayofselected)) { - $selected = 1; - } - print ''; + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + print '
'; } - print ''; - } - // Ref - if (!empty($arrayfields['cf.ref']['checked'])) { - print ''; - // Picto + Ref - print $objectstatic->getNomUrl(1, '', 0, -1, 1); - // Other picto tool - $filename = dol_sanitizeFileName($obj->ref); - $filedir = $conf->fournisseur->commande->dir_output.'/'.dol_sanitizeFileName($obj->ref); - print $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir); - - print ''."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Ref Supplier - if (!empty($arrayfields['cf.ref_supplier']['checked'])) { - print ''.dol_escape_htmltag($obj->ref_supplier).''."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Project - if (!empty($arrayfields['cf.fk_projet']['checked'])) { - $projectstatic->id = $obj->project_id; - $projectstatic->ref = $obj->project_ref; - $projectstatic->title = $obj->project_title; - print ''; - if ($obj->project_id > 0) { - print $projectstatic->getNomUrl(1); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Author - $userstatic->id = $obj->fk_user_author; - $userstatic->lastname = $obj->lastname; - $userstatic->firstname = $obj->firstname; - $userstatic->login = $obj->login; - $userstatic->photo = $obj->photo; - $userstatic->email = $obj->user_email; - $userstatic->statut = $obj->user_status; - if (!empty($arrayfields['u.login']['checked'])) { - print ''; - if ($userstatic->id) { - print $userstatic->getNomUrl(1); - } - print ""; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Thirdparty - if (!empty($arrayfields['cf.fk_soc']['checked'])) { - print ''; $thirdpartytmp->id = $obj->socid; $thirdpartytmp->name = $obj->name; $thirdpartytmp->email = $obj->email; $thirdpartytmp->name_alias = $obj->alias; $thirdpartytmp->client = $obj->client; $thirdpartytmp->fournisseur = $obj->fournisseur; - print $thirdpartytmp->getNomUrl(1, 'supplier', 0, 0, -1, empty($arrayfields['s.name_alias']['checked']) ? 0 : 1); - print ''."\n"; - if (!$i) { - $totalarray['nbfield']++; + $objectstatic->socid = $thirdpartytmp->getNomUrl('supplier', 0, 0, -1); + // Output Kanban + print $objectstatic->getKanbanView(''); + if ($i == (min($num, $limit) - 1)) { + print '
'; + print ''; } - } - //alias - if (!empty($arrayfields['s.name_alias']['checked'])) { - print ''; - print $obj->alias; - print ''."\n"; - if (!$i) { - $totalarray['nbfield']++; + } else { + print ''; + // Action column + if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->rowid, $arrayofselected)) { + $selected = 1; + } + print ''; + } + print ''; } - } - // Town - if (!empty($arrayfields['s.town']['checked'])) { - print ''; - print $obj->town; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Zip - if (!empty($arrayfields['s.zip']['checked'])) { - print ''; - print $obj->zip; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // State - if (!empty($arrayfields['state.nom']['checked'])) { - print "".$obj->state_name."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Country - if (!empty($arrayfields['country.code_iso']['checked'])) { - print ''; - $tmparray = getCountry($obj->fk_pays, 'all'); - print $tmparray['label']; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Type ent - if (!empty($arrayfields['typent.code']['checked'])) { - print ''; - if (empty($typenArray)) { - $typenArray = $formcompany->typent_array(1); - } - print $typenArray[$obj->typent_code]; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } + // Ref + if (!empty($arrayfields['cf.ref']['checked'])) { + print ''; - // Order date - if (!empty($arrayfields['cf.date_commande']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_commande), 'day'); - if ($objectstatic->statut != $objectstatic::STATUS_ORDERSENT && $objectstatic->statut != $objectstatic::STATUS_RECEIVED_PARTIALLY) { - if ($objectstatic->hasDelay()) { - print ' '.img_picto($langs->trans("Late").' : '.$objectstatic->showDelay(), "warning"); + // Picto + Ref + print $objectstatic->getNomUrl(1, '', 0, -1, 1); + // Other picto tool + $filename = dol_sanitizeFileName($obj->ref); + $filedir = $conf->fournisseur->commande->dir_output.'/'.dol_sanitizeFileName($obj->ref); + print $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir); + + print ''."\n"; + if (!$i) { + $totalarray['nbfield']++; } } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Plannned date of delivery - if (!empty($arrayfields['cf.date_livraison']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_livraison), 'day'); - if ($objectstatic->statut == $objectstatic::STATUS_ORDERSENT || $objectstatic->statut == $objectstatic::STATUS_RECEIVED_PARTIALLY) { - if ($objectstatic->hasDelay()) { - print ' '.img_picto($langs->trans("Late").' : '.$objectstatic->showDelay(), "warning"); + // Ref Supplier + if (!empty($arrayfields['cf.ref_supplier']['checked'])) { + print ''.dol_escape_htmltag($obj->ref_supplier).''."\n"; + if (!$i) { + $totalarray['nbfield']++; } } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Amount HT - if (!empty($arrayfields['cf.total_ht']['checked'])) { - print ''.price($obj->total_ht)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'cf.total_ht'; - } - $totalarray['val']['cf.total_ht'] += $obj->total_ht; - } - // Amount VAT - if (!empty($arrayfields['cf.total_tva']['checked'])) { - print ''.price($obj->total_tva)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'cf.total_tva'; - } - $totalarray['val']['cf.total_tva'] += $obj->total_tva; - } - // Amount TTC - if (!empty($arrayfields['cf.total_ttc']['checked'])) { - print ''.price($obj->total_ttc)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'cf.total_ttc'; - } - $totalarray['val']['cf.total_ttc'] += $obj->total_ttc; - } - - // Currency - if (!empty($arrayfields['cf.multicurrency_code']['checked'])) { - print ''.$obj->multicurrency_code.' - '.$langs->trans('Currency'.$obj->multicurrency_code)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Currency rate - if (!empty($arrayfields['cf.multicurrency_tx']['checked'])) { - print ''; - $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$obj->rowid, $obj->multicurrency_tx, 'none', $obj->multicurrency_code); - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Amount HT - if (!empty($arrayfields['cf.multicurrency_total_ht']['checked'])) { - print ''.price($obj->multicurrency_total_ht)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Amount VAT - if (!empty($arrayfields['cf.multicurrency_total_tva']['checked'])) { - print ''.price($obj->multicurrency_total_tva)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Amount TTC - if (!empty($arrayfields['cf.multicurrency_total_ttc']['checked'])) { - print ''.price($obj->multicurrency_total_ttc)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Extra fields - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - // Date creation - if (!empty($arrayfields['cf.date_creation']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Date modification - if (!empty($arrayfields['cf.tms']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Status - if (!empty($arrayfields['cf.fk_statut']['checked'])) { - print ''.$objectstatic->LibStatut($obj->fk_statut, 5, $obj->billed).''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Billed - if (!empty($arrayfields['cf.billed']['checked'])) { - print ''.yn($obj->billed).''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // valid date - if (!empty($arrayfields['cf.date_valid']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_valid), 'day'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // approve date - if (!empty($arrayfields['cf.date_approve']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_approve), 'day'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Note public - if (!empty($arrayfields['cf.note_public']['checked'])) { - print ''; - print dol_string_nohtmltag($obj->note_public); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Note private - if (!empty($arrayfields['cf.note_private']['checked'])) { - print ''; - print dol_string_nohtmltag($obj->note_private); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Action column - if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->rowid, $arrayofselected)) { - $selected = 1; + // Project + if (!empty($arrayfields['cf.fk_projet']['checked'])) { + $projectstatic->id = $obj->project_id; + $projectstatic->ref = $obj->project_ref; + $projectstatic->title = $obj->project_title; + print ''; + if ($obj->project_id > 0) { + print $projectstatic->getNomUrl(1); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Author + $userstatic->id = $obj->fk_user_author; + $userstatic->lastname = $obj->lastname; + $userstatic->firstname = $obj->firstname; + $userstatic->login = $obj->login; + $userstatic->photo = $obj->photo; + $userstatic->email = $obj->user_email; + $userstatic->statut = $obj->user_status; + if (!empty($arrayfields['u.login']['checked'])) { + print ''; + if ($userstatic->id) { + print $userstatic->getNomUrl(1); + } + print ""; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Thirdparty + if (!empty($arrayfields['cf.fk_soc']['checked'])) { + print ''; + $thirdpartytmp->id = $obj->socid; + $thirdpartytmp->name = $obj->name; + $thirdpartytmp->email = $obj->email; + $thirdpartytmp->name_alias = $obj->alias; + $thirdpartytmp->client = $obj->client; + $thirdpartytmp->fournisseur = $obj->fournisseur; + print $thirdpartytmp->getNomUrl(1, 'supplier', 0, 0, -1, empty($arrayfields['s.name_alias']['checked']) ? 0 : 1); + print ''."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + //alias + if (!empty($arrayfields['s.name_alias']['checked'])) { + print ''; + print $obj->alias; + print ''."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Town + if (!empty($arrayfields['s.town']['checked'])) { + print ''; + print $obj->town; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Zip + if (!empty($arrayfields['s.zip']['checked'])) { + print ''; + print $obj->zip; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // State + if (!empty($arrayfields['state.nom']['checked'])) { + print "".$obj->state_name."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Country + if (!empty($arrayfields['country.code_iso']['checked'])) { + print ''; + $tmparray = getCountry($obj->fk_pays, 'all'); + print $tmparray['label']; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Type ent + if (!empty($arrayfields['typent.code']['checked'])) { + print ''; + if (empty($typenArray)) { + $typenArray = $formcompany->typent_array(1); + } + print $typenArray[$obj->typent_code]; + print ''; + if (!$i) { + $totalarray['nbfield']++; } - print ''; } - print ''; - } - if (!$i) { - $totalarray['nbfield']++; - } - print "\n"; + // Order date + if (!empty($arrayfields['cf.date_commande']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_commande), 'day'); + if ($objectstatic->statut != $objectstatic::STATUS_ORDERSENT && $objectstatic->statut != $objectstatic::STATUS_RECEIVED_PARTIALLY) { + if ($objectstatic->hasDelay()) { + print ' '.img_picto($langs->trans("Late").' : '.$objectstatic->showDelay(), "warning"); + } + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Plannned date of delivery + if (!empty($arrayfields['cf.date_livraison']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_livraison), 'day'); + if ($objectstatic->statut == $objectstatic::STATUS_ORDERSENT || $objectstatic->statut == $objectstatic::STATUS_RECEIVED_PARTIALLY) { + if ($objectstatic->hasDelay()) { + print ' '.img_picto($langs->trans("Late").' : '.$objectstatic->showDelay(), "warning"); + } + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount HT + if (!empty($arrayfields['cf.total_ht']['checked'])) { + print ''.price($obj->total_ht)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'cf.total_ht'; + } + $totalarray['val']['cf.total_ht'] += $obj->total_ht; + } + // Amount VAT + if (!empty($arrayfields['cf.total_tva']['checked'])) { + print ''.price($obj->total_tva)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'cf.total_tva'; + } + $totalarray['val']['cf.total_tva'] += $obj->total_tva; + } + // Amount TTC + if (!empty($arrayfields['cf.total_ttc']['checked'])) { + print ''.price($obj->total_ttc)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'cf.total_ttc'; + } + $totalarray['val']['cf.total_ttc'] += $obj->total_ttc; + } - $total += $obj->total_ht; - $subtotal += $obj->total_ht; + // Currency + if (!empty($arrayfields['cf.multicurrency_code']['checked'])) { + print ''.$obj->multicurrency_code.' - '.$langs->trans('Currency'.$obj->multicurrency_code)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Currency rate + if (!empty($arrayfields['cf.multicurrency_tx']['checked'])) { + print ''; + $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$obj->rowid, $obj->multicurrency_tx, 'none', $obj->multicurrency_code); + print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount HT + if (!empty($arrayfields['cf.multicurrency_total_ht']['checked'])) { + print ''.price($obj->multicurrency_total_ht)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount VAT + if (!empty($arrayfields['cf.multicurrency_total_tva']['checked'])) { + print ''.price($obj->multicurrency_total_tva)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount TTC + if (!empty($arrayfields['cf.multicurrency_total_ttc']['checked'])) { + print ''.price($obj->multicurrency_total_ttc)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Date creation + if (!empty($arrayfields['cf.date_creation']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Date modification + if (!empty($arrayfields['cf.tms']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Status + if (!empty($arrayfields['cf.fk_statut']['checked'])) { + print ''.$objectstatic->LibStatut($obj->fk_statut, 5, $obj->billed).''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Billed + if (!empty($arrayfields['cf.billed']['checked'])) { + print ''.yn($obj->billed).''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // valid date + if (!empty($arrayfields['cf.date_valid']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_valid), 'day'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // approve date + if (!empty($arrayfields['cf.date_approve']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_approve), 'day'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Note public + if (!empty($arrayfields['cf.note_public']['checked'])) { + print ''; + print dol_string_nohtmltag($obj->note_public); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Note private + if (!empty($arrayfields['cf.note_private']['checked'])) { + print ''; + print dol_string_nohtmltag($obj->note_private); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Action column + if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->rowid, $arrayofselected)) { + $selected = 1; + } + print ''; + } + print ''; + } + if (!$i) { + $totalarray['nbfield']++; + } + + print "\n"; + + $total += $obj->total_ht; + $subtotal += $obj->total_ht; + } $i++; } From 04a216bf62a7d4acb3bf1f408c4feb3a6af32071 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Jan 2023 10:26:36 +0100 Subject: [PATCH 0685/1128] Debug and clean link page --- htdocs/accountancy/customer/index.php | 27 +++++++++------------- htdocs/accountancy/expensereport/index.php | 24 ++++++++++++++++++- htdocs/accountancy/supplier/index.php | 27 +++++++++------------- htdocs/langs/en_US/accountancy.lang | 2 +- 4 files changed, 46 insertions(+), 34 deletions(-) diff --git a/htdocs/accountancy/customer/index.php b/htdocs/accountancy/customer/index.php index 46e6832dba2..1029934b8c6 100644 --- a/htdocs/accountancy/customer/index.php +++ b/htdocs/accountancy/customer/index.php @@ -126,21 +126,6 @@ if ($action == 'validatehistory') { $db->begin(); // Now make the binding. Bind automatically only for product with a dedicated account that exists into chart of account, others need a manual bind - /*if ($db->type == 'pgsql') { - $sql1 = "UPDATE " . MAIN_DB_PREFIX . "facturedet"; - $sql1 .= " SET fk_code_ventilation = accnt.rowid"; - $sql1 .= " FROM " . MAIN_DB_PREFIX . "product as p, " . MAIN_DB_PREFIX . "accounting_account as accnt , " . MAIN_DB_PREFIX . "accounting_system as syst"; - $sql1 .= " WHERE " . MAIN_DB_PREFIX . "facturedet.fk_product = p.rowid AND accnt.fk_pcg_version = syst.pcg_version AND syst.rowid=" . ((int) $conf->global->CHARTOFACCOUNTS).' AND accnt.entity = '.((int) $conf->entity); - $sql1 .= " AND accnt.active = 1 AND p.accountancy_code_sell=accnt.account_number"; - $sql1 .= " AND " . MAIN_DB_PREFIX . "facturedet.fk_code_ventilation = 0"; - } else { - $sql1 = "UPDATE " . MAIN_DB_PREFIX . "facturedet as fd, " . MAIN_DB_PREFIX . "product as p, " . MAIN_DB_PREFIX . "accounting_account as accnt , " . MAIN_DB_PREFIX . "accounting_system as syst"; - $sql1 .= " SET fk_code_ventilation = accnt.rowid"; - $sql1 .= " WHERE fd.fk_product = p.rowid AND accnt.fk_pcg_version = syst.pcg_version AND syst.rowid=" . ((int) $conf->global->CHARTOFACCOUNTS).' AND accnt.entity = '.((int) $conf->entity); - $sql1 .= " AND accnt.active = 1 AND p.accountancy_code_sell=accnt.account_number"; - $sql1 .= " AND fd.fk_code_ventilation = 0"; - }*/ - // Customer Invoice lines (must be same request than into page list.php for manual binding) $sql = "SELECT f.rowid as facid, f.ref as ref, f.datef, f.type as ftype, f.fk_facture_source,"; $sql .= " l.rowid, l.fk_product, l.description, l.total_ht, l.fk_code_ventilation, l.product_type as type_l, l.tva_tx as tva_tx_line, l.vat_src_code,"; @@ -408,7 +393,17 @@ if ($resql) { print ''; print ''; if ($row[0] == 'tobind') { - print $langs->trans("UseMenuToSetBindindManualy", DOL_URL_ROOT.'/accountancy/customer/list.php?search_year='.((int) $y), $langs->transnoentitiesnoconv("ToBind")); + $startmonth = ($conf->global->SOCIETE_FISCAL_MONTH_START ? $conf->global->SOCIETE_FISCAL_MONTH_START : 1); + if ($startmonth > 12) { + $startmonth -= 12; + } + $startyear = ($startmonth < ($conf->global->SOCIETE_FISCAL_MONTH_START ? $conf->global->SOCIETE_FISCAL_MONTH_START : 1)) ? $y + 1 : $y; + $endmonth = ($conf->global->SOCIETE_FISCAL_MONTH_START ? $conf->global->SOCIETE_FISCAL_MONTH_START : 1) + 11; + if ($endmonth > 12) { + $endmonth -= 12; + } + $endyear = ($endmonth < ($conf->global->SOCIETE_FISCAL_MONTH_START ? $conf->global->SOCIETE_FISCAL_MONTH_START : 1)) ? $y + 1 : $y; + print $langs->trans("UseMenuToSetBindindManualy", DOL_URL_ROOT.'/accountancy/customer/list.php?search_date_startday=1&search_date_startmonth='.((int) $startmonth).'&search_date_startyear='.((int) $startyear).'&search_date_endday=&search_date_endmonth='.((int) $endmonth).'&search_date_endyear='.((int) $endyear), $langs->transnoentitiesnoconv("ToBind")); } else { print $row[1]; } diff --git a/htdocs/accountancy/expensereport/index.php b/htdocs/accountancy/expensereport/index.php index df226ce115d..aefa03651cb 100644 --- a/htdocs/accountancy/expensereport/index.php +++ b/htdocs/accountancy/expensereport/index.php @@ -266,7 +266,17 @@ if ($resql) { print ''; print ''; if ($row[0] == 'tobind') { - print $langs->trans("UseMenuToSetBindindManualy", DOL_URL_ROOT.'/accountancy/expensereport/list.php?search_year='.((int) $y), $langs->transnoentitiesnoconv("ToBind")); + $startmonth = ($conf->global->SOCIETE_FISCAL_MONTH_START ? $conf->global->SOCIETE_FISCAL_MONTH_START : 1); + if ($startmonth > 12) { + $startmonth -= 12; + } + $startyear = ($startmonth < ($conf->global->SOCIETE_FISCAL_MONTH_START ? $conf->global->SOCIETE_FISCAL_MONTH_START : 1)) ? $y + 1 : $y; + $endmonth = ($conf->global->SOCIETE_FISCAL_MONTH_START ? $conf->global->SOCIETE_FISCAL_MONTH_START : 1) + 11; + if ($endmonth > 12) { + $endmonth -= 12; + } + $endyear = ($endmonth < ($conf->global->SOCIETE_FISCAL_MONTH_START ? $conf->global->SOCIETE_FISCAL_MONTH_START : 1)) ? $y + 1 : $y; + print $langs->trans("UseMenuToSetBindindManualy", DOL_URL_ROOT.'/accountancy/customer/list.php?search_date_startday=1&search_date_startmonth='.((int) $startmonth).'&search_date_startyear='.((int) $startyear).'&search_date_endday=&search_date_endmonth='.((int) $endmonth).'&search_date_endyear='.((int) $endyear), $langs->transnoentitiesnoconv("ToBind")); } else { print $row[1]; } @@ -293,6 +303,12 @@ if ($resql) { print ''; } $db->free($resql); + + if ($num == 0) { + print ''; + print ''.$langs->trans("NoRecordFound").''; + print ''; + } } else { print $db->lasterror(); // Show last sql error } @@ -375,6 +391,12 @@ if ($resql) { print ''; } $db->free($resql); + + if ($num == 0) { + print ''; + print ''.$langs->trans("NoRecordFound").''; + print ''; + } } else { print $db->lasterror(); // Show last sql error } diff --git a/htdocs/accountancy/supplier/index.php b/htdocs/accountancy/supplier/index.php index b66b791f7b1..1ffe913f9aa 100644 --- a/htdocs/accountancy/supplier/index.php +++ b/htdocs/accountancy/supplier/index.php @@ -124,21 +124,6 @@ if ($action == 'validatehistory') { $db->begin(); // Now make the binding. Bind automatically only for product with a dedicated account that exists into chart of account, others need a manual bind - /*if ($db->type == 'pgsql') { - $sql1 = "UPDATE " . MAIN_DB_PREFIX . "facture_fourn_det"; - $sql1 .= " SET fk_code_ventilation = accnt.rowid"; - $sql1 .= " FROM " . MAIN_DB_PREFIX . "product as p, " . MAIN_DB_PREFIX . "accounting_account as accnt , " . MAIN_DB_PREFIX . "accounting_system as syst"; - $sql1 .= " WHERE " . MAIN_DB_PREFIX . "facture_fourn_det.fk_product = p.rowid AND accnt.fk_pcg_version = syst.pcg_version AND syst.rowid=" . ((int) $conf->global->CHARTOFACCOUNTS).' AND accnt.entity = '.$conf->entity; - $sql1 .= " AND accnt.active = 1 AND p.accountancy_code_buy=accnt.account_number"; - $sql1 .= " AND " . MAIN_DB_PREFIX . "facture_fourn_det.fk_code_ventilation = 0"; - } else { - $sql1 = "UPDATE " . MAIN_DB_PREFIX . "facture_fourn_det as fd, " . MAIN_DB_PREFIX . "product as p, " . MAIN_DB_PREFIX . "accounting_account as accnt , " . MAIN_DB_PREFIX . "accounting_system as syst"; - $sql1 .= " SET fk_code_ventilation = accnt.rowid"; - $sql1 .= " WHERE fd.fk_product = p.rowid AND accnt.fk_pcg_version = syst.pcg_version AND syst.rowid=" . ((int) $conf->global->CHARTOFACCOUNTS).' AND accnt.entity = '.$conf->entity; - $sql1 .= " AND accnt.active = 1 AND p.accountancy_code_buy=accnt.account_number"; - $sql1 .= " AND fd.fk_code_ventilation = 0"; - }*/ - // Supplier Invoice Lines (must be same request than into page list.php for manual binding) $sql = "SELECT f.rowid as facid, f.ref, f.ref_supplier, f.libelle as invoice_label, f.datef, f.type as ftype, f.fk_facture_source,"; $sql .= " l.rowid, l.fk_product, l.description, l.total_ht, l.fk_code_ventilation, l.product_type as type_l, l.tva_tx as tva_tx_line, l.vat_src_code,"; @@ -405,7 +390,17 @@ if ($resql) { print ''; print ''; if ($row[0] == 'tobind') { - print $langs->trans("UseMenuToSetBindindManualy", DOL_URL_ROOT.'/accountancy/supplier/list.php?search_year='.((int) $y), $langs->transnoentitiesnoconv("ToBind")); + $startmonth = ($conf->global->SOCIETE_FISCAL_MONTH_START ? $conf->global->SOCIETE_FISCAL_MONTH_START : 1); + if ($startmonth > 12) { + $startmonth -= 12; + } + $startyear = ($startmonth < ($conf->global->SOCIETE_FISCAL_MONTH_START ? $conf->global->SOCIETE_FISCAL_MONTH_START : 1)) ? $y + 1 : $y; + $endmonth = ($conf->global->SOCIETE_FISCAL_MONTH_START ? $conf->global->SOCIETE_FISCAL_MONTH_START : 1) + 11; + if ($endmonth > 12) { + $endmonth -= 12; + } + $endyear = ($endmonth < ($conf->global->SOCIETE_FISCAL_MONTH_START ? $conf->global->SOCIETE_FISCAL_MONTH_START : 1)) ? $y + 1 : $y; + print $langs->trans("UseMenuToSetBindindManualy", DOL_URL_ROOT.'/accountancy/customer/list.php?search_date_startday=1&search_date_startmonth='.((int) $startmonth).'&search_date_startyear='.((int) $startyear).'&search_date_endday=&search_date_endmonth='.((int) $endmonth).'&search_date_endyear='.((int) $endyear), $langs->transnoentitiesnoconv("ToBind")); } else { print $row[1]; } diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang index 554087ad5c4..5fb63c1c2ae 100644 --- a/htdocs/langs/en_US/accountancy.lang +++ b/htdocs/langs/en_US/accountancy.lang @@ -297,7 +297,7 @@ DescValidateMovements=Any modification or deletion of writing, lettering and del ValidateHistory=Bind Automatically AutomaticBindingDone=Automatic bindings done (%s) - Automatic binding not possible for some record (%s) -DoManualBindingForFailedRecord=You have to do a manual link for the rows not linked %s automatically. +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s From 919849ab088a9c09a198a09c82bc2f8f637075cd Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Jan 2023 10:48:26 +0100 Subject: [PATCH 0686/1128] Fix link --- htdocs/accountancy/customer/index.php | 2 +- htdocs/accountancy/expensereport/index.php | 2 +- htdocs/accountancy/supplier/index.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/accountancy/customer/index.php b/htdocs/accountancy/customer/index.php index 1029934b8c6..69702d8b10e 100644 --- a/htdocs/accountancy/customer/index.php +++ b/htdocs/accountancy/customer/index.php @@ -420,7 +420,7 @@ if ($resql) { print price($row[$i]); // Add link to make binding if (!empty(price2num($row[$i]))) { - print ''; + print ''; print img_picto($langs->trans("ValidateHistory").' ('.$langs->trans('Month'.str_pad($cursormonth, 2, '0', STR_PAD_LEFT)).' '.$cursoryear.')', 'link', 'class="marginleft2"'); print ''; } diff --git a/htdocs/accountancy/expensereport/index.php b/htdocs/accountancy/expensereport/index.php index aefa03651cb..6bc3ff6a0e8 100644 --- a/htdocs/accountancy/expensereport/index.php +++ b/htdocs/accountancy/expensereport/index.php @@ -293,7 +293,7 @@ if ($resql) { print price($row[$i]); // Add link to make binding if (!empty(price2num($row[$i]))) { - print ''; + print ''; print img_picto($langs->trans("ValidateHistory").' ('.$langs->trans('Month'.str_pad($cursormonth, 2, '0', STR_PAD_LEFT)).' '.$cursoryear.')', 'link', 'class="marginleft2"'); print ''; } diff --git a/htdocs/accountancy/supplier/index.php b/htdocs/accountancy/supplier/index.php index 1ffe913f9aa..e67a75103ac 100644 --- a/htdocs/accountancy/supplier/index.php +++ b/htdocs/accountancy/supplier/index.php @@ -417,7 +417,7 @@ if ($resql) { print price($row[$i]); // Add link to make binding if (!empty(price2num($row[$i]))) { - print ''; + print ''; print img_picto($langs->trans("ValidateHistory").' ('.$langs->trans('Month'.str_pad($cursormonth, 2, '0', STR_PAD_LEFT)).' '.$cursoryear.')', 'link', 'class="marginleft2"'); print ''; } From 92a815644189c57f4c98ad39ad737461b1cb9d00 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Jan 2023 11:03:41 +0100 Subject: [PATCH 0687/1128] Fix link --- htdocs/accountancy/expensereport/index.php | 2 +- htdocs/accountancy/supplier/index.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/accountancy/expensereport/index.php b/htdocs/accountancy/expensereport/index.php index 6bc3ff6a0e8..d256d13252a 100644 --- a/htdocs/accountancy/expensereport/index.php +++ b/htdocs/accountancy/expensereport/index.php @@ -276,7 +276,7 @@ if ($resql) { $endmonth -= 12; } $endyear = ($endmonth < ($conf->global->SOCIETE_FISCAL_MONTH_START ? $conf->global->SOCIETE_FISCAL_MONTH_START : 1)) ? $y + 1 : $y; - print $langs->trans("UseMenuToSetBindindManualy", DOL_URL_ROOT.'/accountancy/customer/list.php?search_date_startday=1&search_date_startmonth='.((int) $startmonth).'&search_date_startyear='.((int) $startyear).'&search_date_endday=&search_date_endmonth='.((int) $endmonth).'&search_date_endyear='.((int) $endyear), $langs->transnoentitiesnoconv("ToBind")); + print $langs->trans("UseMenuToSetBindindManualy", DOL_URL_ROOT.'/accountancy/expensereport/list.php?search_date_startday=1&search_date_startmonth='.((int) $startmonth).'&search_date_startyear='.((int) $startyear).'&search_date_endday=&search_date_endmonth='.((int) $endmonth).'&search_date_endyear='.((int) $endyear), $langs->transnoentitiesnoconv("ToBind")); } else { print $row[1]; } diff --git a/htdocs/accountancy/supplier/index.php b/htdocs/accountancy/supplier/index.php index e67a75103ac..3e0f4fbd784 100644 --- a/htdocs/accountancy/supplier/index.php +++ b/htdocs/accountancy/supplier/index.php @@ -400,7 +400,7 @@ if ($resql) { $endmonth -= 12; } $endyear = ($endmonth < ($conf->global->SOCIETE_FISCAL_MONTH_START ? $conf->global->SOCIETE_FISCAL_MONTH_START : 1)) ? $y + 1 : $y; - print $langs->trans("UseMenuToSetBindindManualy", DOL_URL_ROOT.'/accountancy/customer/list.php?search_date_startday=1&search_date_startmonth='.((int) $startmonth).'&search_date_startyear='.((int) $startyear).'&search_date_endday=&search_date_endmonth='.((int) $endmonth).'&search_date_endyear='.((int) $endyear), $langs->transnoentitiesnoconv("ToBind")); + print $langs->trans("UseMenuToSetBindindManualy", DOL_URL_ROOT.'/accountancy/supplier/list.php?search_date_startday=1&search_date_startmonth='.((int) $startmonth).'&search_date_startyear='.((int) $startyear).'&search_date_endday=&search_date_endmonth='.((int) $endmonth).'&search_date_endyear='.((int) $endyear), $langs->transnoentitiesnoconv("ToBind")); } else { print $row[1]; } From 86ad9118f3dcc036e22a35ca96aedeb14ed42762 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Tue, 10 Jan 2023 11:14:14 +0100 Subject: [PATCH 0688/1128] kanban mode for list of proposal commande --- htdocs/comm/propal/class/propal.class.php | 35 + htdocs/comm/propal/list.php | 1128 +++++++++++---------- 2 files changed, 611 insertions(+), 552 deletions(-) diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index a5fd221de87..a363ff03bad 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -3890,6 +3890,41 @@ class Propal extends CommonObject return CommonObject::commonReplaceProduct($db, $origin_id, $dest_id, $tables); } + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $langs; + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + //$return .= ''; // Can be image + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).''; + if (property_exists($this, 'fk_project')) { + $return .= ' | '.$this->fk_project.''; + } + if (property_exists($this, 'author')) { + $return .= '
'.$this->author.''; + } + if (property_exists($this, 'total_ht')) { + $return .='
'.$langs->trans("AmountHT").' : '.price($this->total_ht).''; + } + if (method_exists($this, 'getLibStatut')) { + $return .= '
'.$this->getLibStatut(5).'
'; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } /** diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php index 2426abad9f4..3de7b0bf781 100644 --- a/htdocs/comm/propal/list.php +++ b/htdocs/comm/propal/list.php @@ -70,6 +70,7 @@ $show_files = GETPOST('show_files', 'int'); $confirm = GETPOST('confirm', 'alpha'); $toselect = GETPOST('toselect', 'array'); $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'proposallist'; +$mode = GETPOST('mode', 'alpha'); $search_user = GETPOST('search_user', 'int'); $search_sale = GETPOST('search_sale', 'int'); @@ -864,6 +865,9 @@ if ($resql) { } $param = '&search_status='.urlencode($search_status); + if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); + } if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -1072,6 +1076,9 @@ if ($resql) { if (!empty($socid)) { $url .= '&socid='.$socid; } + $newcardbutton = ''; + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); $newcardbutton = dolGetButtonTitle($langs->trans('NewPropal'), '', 'fa fa-plus-circle', $url, '', $user->rights->propal->creer); // Fields title search @@ -1085,6 +1092,7 @@ if ($resql) { print ''; print ''; print ''; + print ''; print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'propal', 0, $newcardbutton, '', $limit, 0, 0, 1); @@ -1702,574 +1710,590 @@ if ($resql) { $total_margin += $marginInfo['total_margin']; } - print ''; + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + print '
'; + } + // Output Kanban + $userstatic->fetch($obj->fk_user_author); + $objectstatic->author = $userstatic->getNomUrl(1); + $objectstatic->fk_project = $projectstatic->getNomUrl(1); + print $objectstatic->getKanbanView(''); + if ($i == (min($num, $limit) - 1)) { + print '
'; + print ''; + } + } else { + print ''; - // Action column - if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->rowid, $arrayofselected)) { - $selected = 1; + // Action column + if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->rowid, $arrayofselected)) { + $selected = 1; + } + print ''; } - print ''; - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - if (!empty($arrayfields['p.ref']['checked'])) { - print ''; - - print ''; - // Picto + Ref - print ''; - // Warning - $warnornote = ''; - if ($obj->status == Propal::STATUS_VALIDATED && $db->jdate($obj->dfv) < ($now - $conf->propal->cloture->warning_delay)) { - $warnornote .= img_warning($langs->trans("Late")); - } - if ($warnornote) { - print ''; - } - // Other picto tool - print '
'; - print $objectstatic->getNomUrl(1, '', '', 0, 1, (isset($conf->global->PROPAL_LIST_SHOW_NOTES) ? $conf->global->PROPAL_LIST_SHOW_NOTES : 1)); - print ''; - print $warnornote; print ''; - $filename = dol_sanitizeFileName($obj->ref); - $filedir = $conf->propal->multidir_output[$obj->propal_entity].'/'.dol_sanitizeFileName($obj->ref); - $urlsource = $_SERVER['PHP_SELF'].'?id='.$obj->rowid; - print $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir); - print '
'; - - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - if (!empty($arrayfields['p.ref_client']['checked'])) { - // Customer ref - print ''; - print dol_escape_htmltag($obj->ref_client); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - if (!empty($arrayfields['pr.ref']['checked'])) { - // Project ref - print ''; - if ($obj->project_id > 0) { - print $projectstatic->getNomUrl(1); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - if (!empty($arrayfields['pr.title']['checked'])) { - // Project label - print ''; - if ($obj->project_id > 0) { - print dol_escape_htmltag($projectstatic->title); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Thirdparty - if (!empty($arrayfields['s.nom']['checked'])) { - print ''; - print $companystatic->getNomUrl(1, 'customer', 0, 0, 1, empty($arrayfields['s.name_alias']['checked']) ? 0 : 1); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Alias - if (!empty($arrayfields['s.name_alias']['checked'])) { - print ''; - print $obj->alias; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Town - if (!empty($arrayfields['s.town']['checked'])) { - print ''; - print $obj->town; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Zip - if (!empty($arrayfields['s.zip']['checked'])) { - print ''; - print $obj->zip; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // State - if (!empty($arrayfields['state.nom']['checked'])) { - print "".$obj->state_name."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Country - if (!empty($arrayfields['country.code_iso']['checked'])) { - print ''; - $tmparray = getCountry($obj->fk_pays, 'all'); - print $tmparray['label']; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Type ent - if (!empty($arrayfields['typent.code']['checked'])) { - if (!is_array($typenArray) || empty($typenArray)) { - $typenArray = $formcompany->typent_array(1); - } - - print ''; - print $typenArray[$obj->typent_code]; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Date proposal - if (!empty($arrayfields['p.date']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->dp), 'day'); - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Date end validity - if (!empty($arrayfields['p.fin_validite']['checked'])) { - if ($obj->dfv) { - print ''.dol_print_date($db->jdate($obj->dfv), 'day'); - print ''; - } else { - print ' '; - } - if (!$i) { - $totalarray['nbfield']++; - } - } - // Date delivery - if (!empty($arrayfields['p.date_livraison']['checked'])) { - if ($obj->ddelivery) { - print ''.dol_print_date($db->jdate($obj->ddelivery), 'day'); - print ''; - } else { - print ' '; - } - if (!$i) { - $totalarray['nbfield']++; - } - } - // Date Signature - if (!empty($arrayfields['p.date_signature']['checked'])) { - if ($obj->dsignature) { - print ''.dol_print_date($db->jdate($obj->dsignature), 'day'); - print ''; - } else { - print ' '; - } - if (!$i) { - $totalarray['nbfield']++; - } - } - // Availability - if (!empty($arrayfields['ava.rowid']['checked'])) { - print ''; - $form->form_availability('', $obj->availability, 'none', 1); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Shipping Method - if (!empty($arrayfields['p.fk_shipping_method']['checked'])) { - print ''; - $form->formSelectShippingMethod('', $obj->fk_shipping_method, 'none', 1); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Source - input reason - if (!empty($arrayfields['p.fk_input_reason']['checked'])) { - print ''; - if ($obj->fk_input_reason > 0) { - print $form->cache_demand_reason[$obj->fk_input_reason]['label']; - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Payment terms - if (!empty($arrayfields['p.fk_cond_reglement']['checked'])) { - print ''; - $form->form_conditions_reglement($_SERVER['PHP_SELF'], $obj->fk_cond_reglement, 'none', 0, '', 1, $obj->deposit_percent); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Payment mode - if (!empty($arrayfields['p.fk_mode_reglement']['checked'])) { - print ''; - $form->form_modes_reglement($_SERVER['PHP_SELF'], $obj->fk_mode_reglement, 'none', '', -1); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Amount HT - if (!empty($arrayfields['p.total_ht']['checked'])) { - print ''.price($obj->total_ht)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'p.total_ht'; - } - if (empty($totalarray['val']['p.total_ht'])) { - $totalarray['val']['p.total_ht'] = $obj->total_ht; - } else { - $totalarray['val']['p.total_ht'] += $obj->total_ht; - } - } - // Amount VAT - if (!empty($arrayfields['p.total_tva']['checked'])) { - print ''.price($obj->total_tva)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'p.total_tva'; - } - if (empty($totalarray['val']['p.total_tva'])) { - $totalarray['val']['p.total_tva'] = $obj->total_tva; - } else { - $totalarray['val']['p.total_tva'] += $obj->total_tva; - } - } - // Amount TTC - if (!empty($arrayfields['p.total_ttc']['checked'])) { - print ''.price($obj->total_ttc)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'p.total_ttc'; - } - if (empty($totalarray['val']['p.total_ttc'])) { - $totalarray['val']['p.total_ttc'] = $obj->total_ttc; - } else { - $totalarray['val']['p.total_ttc'] += $obj->total_ttc; - } - } - // Amount invoiced HT - if (!empty($arrayfields['p.total_ht_invoiced']['checked'])) { - print ''.price($totalInvoicedHT)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'p.total_ht_invoiced'; - } - if (empty($totalarray['val']['p.total_ht_invoiced'])) { - $totalarray['val']['p.total_ht_invoiced'] = $totalInvoicedHT; - } else { - $totalarray['val']['p.total_ht_invoiced'] += $totalInvoicedHT; - } - } - // Amount invoiced TTC - if (!empty($arrayfields['p.total_invoiced']['checked'])) { - print ''.price($totalInvoicedTTC)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'p.total_invoiced'; - } - if (empty($totalarray['val']['p.total_invoiced'])) { - $totalarray['val']['p.total_invoiced'] = $totalInvoicedTTC; - } else { - $totalarray['val']['p.total_invoiced'] += $totalInvoicedTTC; - } - } - // Currency - if (!empty($arrayfields['p.multicurrency_code']['checked'])) { - print ''.$obj->multicurrency_code.' - '.$langs->trans('Currency'.$obj->multicurrency_code)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Currency rate - if (!empty($arrayfields['p.multicurrency_tx']['checked'])) { - print ''; - $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$obj->rowid, $obj->multicurrency_tx, 'none', $obj->multicurrency_code); - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Amount HT - if (!empty($arrayfields['p.multicurrency_total_ht']['checked'])) { - print ''.price($obj->multicurrency_total_ht)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Amount VAT - if (!empty($arrayfields['p.multicurrency_total_tva']['checked'])) { - print ''.price($obj->multicurrency_total_tva)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Amount TTC - if (!empty($arrayfields['p.multicurrency_total_ttc']['checked'])) { - print ''.price($obj->multicurrency_total_ttc)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Amount invoiced - if (!empty($arrayfields['p.multicurrency_total_ht_invoiced']['checked'])) { - print ''.price($multicurrency_totalInvoicedHT)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Amount invoiced - if (!empty($arrayfields['p.multicurrency_total_invoiced']['checked'])) { - print ''.price($multicurrency_totalInvoicedTTC)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - $userstatic->id = $obj->fk_user_author; - $userstatic->login = $obj->login; - $userstatic->lastname = $obj->lastname; - $userstatic->firstname = $obj->firstname; - $userstatic->email = $obj->user_email; - $userstatic->statut = $obj->user_statut; - $userstatic->entity = $obj->user_entity; - $userstatic->photo = $obj->photo; - $userstatic->office_phone = $obj->office_phone; - $userstatic->office_fax = $obj->office_fax; - $userstatic->user_mobile = $obj->user_mobile; - $userstatic->job = $obj->job; - $userstatic->gender = $obj->gender; - - // Author - if (!empty($arrayfields['u.login']['checked'])) { - print ''; - if ($userstatic->id) { - print $userstatic->getNomUrl(-1); - } - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - if (!empty($arrayfields['sale_representative']['checked'])) { - // Sales representatives - print ''; - if ($obj->socid > 0) { - $listsalesrepresentatives = $companystatic->getSalesRepresentatives($user); - if ($listsalesrepresentatives < 0) { - dol_print_error($db); + if (!$i) { + $totalarray['nbfield']++; } - $nbofsalesrepresentative = count($listsalesrepresentatives); - if ($nbofsalesrepresentative > 6) { - // We print only number - print $nbofsalesrepresentative; - } elseif ($nbofsalesrepresentative > 0) { - $userstatic = new User($db); - $j = 0; - foreach ($listsalesrepresentatives as $val) { - $userstatic->id = $val['id']; - $userstatic->lastname = $val['lastname']; - $userstatic->firstname = $val['firstname']; - $userstatic->email = $val['email']; - $userstatic->statut = $val['statut']; - $userstatic->entity = $val['entity']; - $userstatic->photo = $val['photo']; - $userstatic->login = $val['login']; - $userstatic->office_phone = $val['office_phone']; - $userstatic->office_fax = $val['office_fax']; - $userstatic->user_mobile = $val['user_mobile']; - $userstatic->job = $val['job']; - $userstatic->gender = $val['gender']; - //print '
': - print ($nbofsalesrepresentative < 2) ? $userstatic->getNomUrl(-1, '', 0, 0, 12) : $userstatic->getNomUrl(-2); - $j++; - if ($j < $nbofsalesrepresentative) { - print ' '; + } + + if (!empty($arrayfields['p.ref']['checked'])) { + print ''; + + print ''; + // Picto + Ref + print ''; + // Warning + $warnornote = ''; + if ($obj->status == Propal::STATUS_VALIDATED && $db->jdate($obj->dfv) < ($now - $conf->propal->cloture->warning_delay)) { + $warnornote .= img_warning($langs->trans("Late")); + } + if ($warnornote) { + print ''; + } + // Other picto tool + print '
'; + print $objectstatic->getNomUrl(1, '', '', 0, 1, (isset($conf->global->PROPAL_LIST_SHOW_NOTES) ? $conf->global->PROPAL_LIST_SHOW_NOTES : 1)); + print ''; + print $warnornote; + print ''; + $filename = dol_sanitizeFileName($obj->ref); + $filedir = $conf->propal->multidir_output[$obj->propal_entity].'/'.dol_sanitizeFileName($obj->ref); + $urlsource = $_SERVER['PHP_SELF'].'?id='.$obj->rowid; + print $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir); + print '
'; + + print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + if (!empty($arrayfields['p.ref_client']['checked'])) { + // Customer ref + print ''; + print dol_escape_htmltag($obj->ref_client); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + if (!empty($arrayfields['pr.ref']['checked'])) { + // Project ref + print ''; + if ($obj->project_id > 0) { + print $projectstatic->getNomUrl(1); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + if (!empty($arrayfields['pr.title']['checked'])) { + // Project label + print ''; + if ($obj->project_id > 0) { + print dol_escape_htmltag($projectstatic->title); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Thirdparty + if (!empty($arrayfields['s.nom']['checked'])) { + print ''; + print $companystatic->getNomUrl(1, 'customer', 0, 0, 1, empty($arrayfields['s.name_alias']['checked']) ? 0 : 1); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Alias + if (!empty($arrayfields['s.name_alias']['checked'])) { + print ''; + print $obj->alias; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Town + if (!empty($arrayfields['s.town']['checked'])) { + print ''; + print $obj->town; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Zip + if (!empty($arrayfields['s.zip']['checked'])) { + print ''; + print $obj->zip; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // State + if (!empty($arrayfields['state.nom']['checked'])) { + print "".$obj->state_name."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Country + if (!empty($arrayfields['country.code_iso']['checked'])) { + print ''; + $tmparray = getCountry($obj->fk_pays, 'all'); + print $tmparray['label']; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Type ent + if (!empty($arrayfields['typent.code']['checked'])) { + if (!is_array($typenArray) || empty($typenArray)) { + $typenArray = $formcompany->typent_array(1); + } + + print ''; + print $typenArray[$obj->typent_code]; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Date proposal + if (!empty($arrayfields['p.date']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->dp), 'day'); + print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Date end validity + if (!empty($arrayfields['p.fin_validite']['checked'])) { + if ($obj->dfv) { + print ''.dol_print_date($db->jdate($obj->dfv), 'day'); + print ''; + } else { + print ' '; + } + if (!$i) { + $totalarray['nbfield']++; + } + } + // Date delivery + if (!empty($arrayfields['p.date_livraison']['checked'])) { + if ($obj->ddelivery) { + print ''.dol_print_date($db->jdate($obj->ddelivery), 'day'); + print ''; + } else { + print ' '; + } + if (!$i) { + $totalarray['nbfield']++; + } + } + // Date Signature + if (!empty($arrayfields['p.date_signature']['checked'])) { + if ($obj->dsignature) { + print ''.dol_print_date($db->jdate($obj->dsignature), 'day'); + print ''; + } else { + print ' '; + } + if (!$i) { + $totalarray['nbfield']++; + } + } + // Availability + if (!empty($arrayfields['ava.rowid']['checked'])) { + print ''; + $form->form_availability('', $obj->availability, 'none', 1); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Shipping Method + if (!empty($arrayfields['p.fk_shipping_method']['checked'])) { + print ''; + $form->formSelectShippingMethod('', $obj->fk_shipping_method, 'none', 1); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Source - input reason + if (!empty($arrayfields['p.fk_input_reason']['checked'])) { + print ''; + if ($obj->fk_input_reason > 0) { + print $form->cache_demand_reason[$obj->fk_input_reason]['label']; + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Payment terms + if (!empty($arrayfields['p.fk_cond_reglement']['checked'])) { + print ''; + $form->form_conditions_reglement($_SERVER['PHP_SELF'], $obj->fk_cond_reglement, 'none', 0, '', 1, $obj->deposit_percent); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Payment mode + if (!empty($arrayfields['p.fk_mode_reglement']['checked'])) { + print ''; + $form->form_modes_reglement($_SERVER['PHP_SELF'], $obj->fk_mode_reglement, 'none', '', -1); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount HT + if (!empty($arrayfields['p.total_ht']['checked'])) { + print ''.price($obj->total_ht)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'p.total_ht'; + } + if (empty($totalarray['val']['p.total_ht'])) { + $totalarray['val']['p.total_ht'] = $obj->total_ht; + } else { + $totalarray['val']['p.total_ht'] += $obj->total_ht; + } + } + // Amount VAT + if (!empty($arrayfields['p.total_tva']['checked'])) { + print ''.price($obj->total_tva)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'p.total_tva'; + } + if (empty($totalarray['val']['p.total_tva'])) { + $totalarray['val']['p.total_tva'] = $obj->total_tva; + } else { + $totalarray['val']['p.total_tva'] += $obj->total_tva; + } + } + // Amount TTC + if (!empty($arrayfields['p.total_ttc']['checked'])) { + print ''.price($obj->total_ttc)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'p.total_ttc'; + } + if (empty($totalarray['val']['p.total_ttc'])) { + $totalarray['val']['p.total_ttc'] = $obj->total_ttc; + } else { + $totalarray['val']['p.total_ttc'] += $obj->total_ttc; + } + } + // Amount invoiced HT + if (!empty($arrayfields['p.total_ht_invoiced']['checked'])) { + print ''.price($totalInvoicedHT)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'p.total_ht_invoiced'; + } + if (empty($totalarray['val']['p.total_ht_invoiced'])) { + $totalarray['val']['p.total_ht_invoiced'] = $totalInvoicedHT; + } else { + $totalarray['val']['p.total_ht_invoiced'] += $totalInvoicedHT; + } + } + // Amount invoiced TTC + if (!empty($arrayfields['p.total_invoiced']['checked'])) { + print ''.price($totalInvoicedTTC)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'p.total_invoiced'; + } + if (empty($totalarray['val']['p.total_invoiced'])) { + $totalarray['val']['p.total_invoiced'] = $totalInvoicedTTC; + } else { + $totalarray['val']['p.total_invoiced'] += $totalInvoicedTTC; + } + } + // Currency + if (!empty($arrayfields['p.multicurrency_code']['checked'])) { + print ''.$obj->multicurrency_code.' - '.$langs->trans('Currency'.$obj->multicurrency_code)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Currency rate + if (!empty($arrayfields['p.multicurrency_tx']['checked'])) { + print ''; + $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$obj->rowid, $obj->multicurrency_tx, 'none', $obj->multicurrency_code); + print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount HT + if (!empty($arrayfields['p.multicurrency_total_ht']['checked'])) { + print ''.price($obj->multicurrency_total_ht)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount VAT + if (!empty($arrayfields['p.multicurrency_total_tva']['checked'])) { + print ''.price($obj->multicurrency_total_tva)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount TTC + if (!empty($arrayfields['p.multicurrency_total_ttc']['checked'])) { + print ''.price($obj->multicurrency_total_ttc)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount invoiced + if (!empty($arrayfields['p.multicurrency_total_ht_invoiced']['checked'])) { + print ''.price($multicurrency_totalInvoicedHT)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount invoiced + if (!empty($arrayfields['p.multicurrency_total_invoiced']['checked'])) { + print ''.price($multicurrency_totalInvoicedTTC)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + $userstatic->id = $obj->fk_user_author; + $userstatic->login = $obj->login; + $userstatic->lastname = $obj->lastname; + $userstatic->firstname = $obj->firstname; + $userstatic->email = $obj->user_email; + $userstatic->statut = $obj->user_statut; + $userstatic->entity = $obj->user_entity; + $userstatic->photo = $obj->photo; + $userstatic->office_phone = $obj->office_phone; + $userstatic->office_fax = $obj->office_fax; + $userstatic->user_mobile = $obj->user_mobile; + $userstatic->job = $obj->job; + $userstatic->gender = $obj->gender; + + // Author + if (!empty($arrayfields['u.login']['checked'])) { + print ''; + if ($userstatic->id) { + print $userstatic->getNomUrl(-1); + } + print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + if (!empty($arrayfields['sale_representative']['checked'])) { + // Sales representatives + print ''; + if ($obj->socid > 0) { + $listsalesrepresentatives = $companystatic->getSalesRepresentatives($user); + if ($listsalesrepresentatives < 0) { + dol_print_error($db); + } + $nbofsalesrepresentative = count($listsalesrepresentatives); + if ($nbofsalesrepresentative > 6) { + // We print only number + print $nbofsalesrepresentative; + } elseif ($nbofsalesrepresentative > 0) { + $userstatic = new User($db); + $j = 0; + foreach ($listsalesrepresentatives as $val) { + $userstatic->id = $val['id']; + $userstatic->lastname = $val['lastname']; + $userstatic->firstname = $val['firstname']; + $userstatic->email = $val['email']; + $userstatic->statut = $val['statut']; + $userstatic->entity = $val['entity']; + $userstatic->photo = $val['photo']; + $userstatic->login = $val['login']; + $userstatic->office_phone = $val['office_phone']; + $userstatic->office_fax = $val['office_fax']; + $userstatic->user_mobile = $val['user_mobile']; + $userstatic->job = $val['job']; + $userstatic->gender = $val['gender']; + //print '
': + print ($nbofsalesrepresentative < 2) ? $userstatic->getNomUrl(-1, '', 0, 0, 12) : $userstatic->getNomUrl(-2); + $j++; + if ($j < $nbofsalesrepresentative) { + print ' '; + } + //print '
'; } - //print '
'; + } + //else print $langs->trans("NoSalesRepresentativeAffected"); + } else { + print ' '; + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Total buying or cost price + if (!empty($arrayfields['total_pa']['checked'])) { + print ''.price($marginInfo['pa_total']).''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Total margin + if (!empty($arrayfields['total_margin']['checked'])) { + print ''.price($marginInfo['total_margin']).''; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'total_margin'; + } + $totalarray['val']['total_margin'] = $total_margin; + } + // Total margin rate + if (!empty($arrayfields['total_margin_rate']['checked'])) { + print ''.(($marginInfo['total_margin_rate'] == '') ? '' : price($marginInfo['total_margin_rate'], null, null, null, null, 2).'%').''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Total mark rate + if (!empty($arrayfields['total_mark_rate']['checked'])) { + print ''.(($marginInfo['total_mark_rate'] == '') ? '' : price($marginInfo['total_mark_rate'], null, null, null, null, 2).'%').''; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'total_mark_rate'; + } + if ($i >= $imaxinloop - 1) { + if (!empty($total_ht)) { + $totalarray['val']['total_mark_rate'] = price2num($total_margin * 100 / $total_ht, 'MT'); + } else { + $totalarray['val']['total_mark_rate'] = ''; } } - //else print $langs->trans("NoSalesRepresentativeAffected"); - } else { - print ' '; } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Total buying or cost price - if (!empty($arrayfields['total_pa']['checked'])) { - print ''.price($marginInfo['pa_total']).''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Total margin - if (!empty($arrayfields['total_margin']['checked'])) { - print ''.price($marginInfo['total_margin']).''; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'total_margin'; - } - $totalarray['val']['total_margin'] = $total_margin; - } - // Total margin rate - if (!empty($arrayfields['total_margin_rate']['checked'])) { - print ''.(($marginInfo['total_margin_rate'] == '') ? '' : price($marginInfo['total_margin_rate'], null, null, null, null, 2).'%').''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Total mark rate - if (!empty($arrayfields['total_mark_rate']['checked'])) { - print ''.(($marginInfo['total_mark_rate'] == '') ? '' : price($marginInfo['total_mark_rate'], null, null, null, null, 2).'%').''; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'total_mark_rate'; - } - if ($i >= $imaxinloop - 1) { - if (!empty($total_ht)) { - $totalarray['val']['total_mark_rate'] = price2num($total_margin * 100 / $total_ht, 'MT'); - } else { - $totalarray['val']['total_mark_rate'] = ''; + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Date creation + if (!empty($arrayfields['p.datec']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); + print ''; + if (!$i) { + $totalarray['nbfield']++; } } - } - - // Extra fields - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - // Date creation - if (!empty($arrayfields['p.datec']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Date modification - if (!empty($arrayfields['p.tms']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Date cloture - if (!empty($arrayfields['p.date_cloture']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_cloture), 'dayhour', 'tzuser'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Note public - if (!empty($arrayfields['p.note_public']['checked'])) { - print ''; - print dol_string_nohtmltag($obj->note_public); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Note private - if (!empty($arrayfields['p.note_private']['checked'])) { - print ''; - print dol_string_nohtmltag($obj->note_private); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Status - if (!empty($arrayfields['p.fk_statut']['checked'])) { - print ''.$objectstatic->getLibStatut(5).''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Action column - if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->rowid, $arrayofselected)) { - $selected = 1; + // Date modification + if (!empty($arrayfields['p.tms']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); + print ''; + if (!$i) { + $totalarray['nbfield']++; } - print ''; } - print ''; - if (!$i) { - $totalarray['nbfield']++; + // Date cloture + if (!empty($arrayfields['p.date_cloture']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_cloture), 'dayhour', 'tzuser'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } + // Note public + if (!empty($arrayfields['p.note_public']['checked'])) { + print ''; + print dol_string_nohtmltag($obj->note_public); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Note private + if (!empty($arrayfields['p.note_private']['checked'])) { + print ''; + print dol_string_nohtmltag($obj->note_private); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Status + if (!empty($arrayfields['p.fk_statut']['checked'])) { + print ''.$objectstatic->getLibStatut(5).''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Action column + if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->rowid, $arrayofselected)) { + $selected = 1; + } + print ''; + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + + print ''."\n"; } - - print ''."\n"; - $i++; } From ce556d56c02ebe7e2ea001cd3540e1965d222405 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Jan 2023 11:32:21 +0100 Subject: [PATCH 0689/1128] Fix rounding --- htdocs/core/lib/functions.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 391657135b8..475690e9dba 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -7723,7 +7723,7 @@ function getCommonSubstitutionArray($outputlangs, $onlykey = 0, $exclude = null, $substitutionarray['__AMOUNT_TEXT__'] = is_object($object) ? dol_convertToWord($object->total_ttc, $outputlangs, '', true) : ''; $substitutionarray['__AMOUNT_TEXTCURRENCY__'] = is_object($object) ? dol_convertToWord($object->total_ttc, $outputlangs, $conf->currency, true) : ''; - $substitutionarray['__AMOUNT_REMAIN__'] = is_object($object) ? $object->total_ttc - $already_payed_all : ''; + $substitutionarray['__AMOUNT_REMAIN__'] = is_object($object) ? price2num($object->total_ttc - $already_payed_all) : ''; $substitutionarray['__AMOUNT_VAT__'] = is_object($object) ? (isset($object->total_vat) ? $object->total_vat : $object->total_tva) : ''; $substitutionarray['__AMOUNT_VAT_TEXT__'] = is_object($object) ? (isset($object->total_vat) ? dol_convertToWord($object->total_vat, $outputlangs, '', true) : dol_convertToWord($object->total_tva, $outputlangs, '', true)) : ''; From 2da8c1d9bc2fc9d0e7205d87688eb6957fc56c6f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Jan 2023 11:32:21 +0100 Subject: [PATCH 0690/1128] Fix rounding --- htdocs/core/lib/functions.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 391657135b8..f9adc7bcf40 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -7723,7 +7723,7 @@ function getCommonSubstitutionArray($outputlangs, $onlykey = 0, $exclude = null, $substitutionarray['__AMOUNT_TEXT__'] = is_object($object) ? dol_convertToWord($object->total_ttc, $outputlangs, '', true) : ''; $substitutionarray['__AMOUNT_TEXTCURRENCY__'] = is_object($object) ? dol_convertToWord($object->total_ttc, $outputlangs, $conf->currency, true) : ''; - $substitutionarray['__AMOUNT_REMAIN__'] = is_object($object) ? $object->total_ttc - $already_payed_all : ''; + $substitutionarray['__AMOUNT_REMAIN__'] = is_object($object) ? price2num($object->total_ttc - $already_payed_all, 'MT') : ''; $substitutionarray['__AMOUNT_VAT__'] = is_object($object) ? (isset($object->total_vat) ? $object->total_vat : $object->total_tva) : ''; $substitutionarray['__AMOUNT_VAT_TEXT__'] = is_object($object) ? (isset($object->total_vat) ? dol_convertToWord($object->total_vat, $outputlangs, '', true) : dol_convertToWord($object->total_tva, $outputlangs, '', true)) : ''; From 9a249bcbb8b58f6576193604540ec2962543f895 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Tue, 10 Jan 2023 12:10:43 +0100 Subject: [PATCH 0691/1128] kanban mode for list of proposal supplier --- .../class/supplier_proposal.class.php | 36 ++ htdocs/supplier_proposal/list.php | 576 +++++++++--------- 2 files changed, 336 insertions(+), 276 deletions(-) diff --git a/htdocs/supplier_proposal/class/supplier_proposal.class.php b/htdocs/supplier_proposal/class/supplier_proposal.class.php index f283295aeb5..53e78b06f84 100644 --- a/htdocs/supplier_proposal/class/supplier_proposal.class.php +++ b/htdocs/supplier_proposal/class/supplier_proposal.class.php @@ -2723,6 +2723,42 @@ class SupplierProposal extends CommonObject return CommonObject::commonReplaceProduct($db, $origin_id, $dest_id, $tables); } + + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $langs; + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + //$return .= ''; // Can be image + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).''; + if (property_exists($this, 'socid')) { + $return .= ' | '.$this->socid.''; + } + if (property_exists($this, 'delivery_date')) { + $return .= '
'.$langs->trans("DateEnd").' : '.dol_print_date($this->delivery_date).''; + } + if (property_exists($this, 'total_ttc')) { + $return .='
'.$langs->trans("AmountHT").' : '.price($this->total_ttc).''; + } + if (method_exists($this, 'getLibStatut')) { + $return .= '
'.$this->getLibStatut(5).'
'; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } diff --git a/htdocs/supplier_proposal/list.php b/htdocs/supplier_proposal/list.php index add084e91ab..b4426ec84d8 100644 --- a/htdocs/supplier_proposal/list.php +++ b/htdocs/supplier_proposal/list.php @@ -57,6 +57,7 @@ $show_files = GETPOST('show_files', 'int'); $confirm = GETPOST('confirm', 'alpha'); $toselect = GETPOST('toselect', 'array'); $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'supplierproposallist'; +$mode = GETPOST('mode', 'alpha'); $search_user = GETPOST('search_user', 'int'); $search_sale = GETPOST('search_sale', 'int'); @@ -510,6 +511,9 @@ if ($resql) { } $param = ''; + if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); + } if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -630,7 +634,10 @@ if ($resql) { if (!empty($socid)) { $url .= '&socid='.$socid; } - $newcardbutton = dolGetButtonTitle($langs->trans('NewAskPrice'), '', 'fa fa-plus-circle', $url, '', $user->rights->supplier_proposal->creer); + $newcardbutton = ''; + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); + $newcardbutton .= dolGetButtonTitle($langs->trans('NewAskPrice'), '', 'fa fa-plus-circle', $url, '', $user->rights->supplier_proposal->creer); // Fields title search print ''; @@ -642,6 +649,7 @@ if ($resql) { print ''; print ''; print ''; + print ''; print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'supplier_proposal', 0, $newcardbutton, '', $limit, 0, 0, 1); @@ -973,288 +981,304 @@ if ($resql) { $companystatic->client = $obj->client; $companystatic->code_client = $obj->code_client; - print ''; - // Action column - if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->rowid, $arrayofselected)) { - $selected = 1; - } - print ''; + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + print '
'; } - print ''; - } - if (!empty($arrayfields['sp.ref']['checked'])) { - print ''; - - print ''; - // Picto + Ref - print ''; - // Warning - $warnornote = ''; - //if ($obj->fk_statut == 1 && $db->jdate($obj->date_valid) < ($now - $conf->supplier_proposal->warning_delay)) $warnornote .= img_warning($langs->trans("Late")); - if ($warnornote) { - print ''; + } + } else { + print ''; + // Action column + if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { + print ''; } - // Other picto tool - print '
'; - print $objectstatic->getNomUrl(1, '', '', 0, -1, 1); - print ''; - print $warnornote; + // Output Kanban + $userstatic->fetch($obj->fk_user_author); + $objectstatic->socid = $companystatic->getNomUrl(1); + $objectstatic->user_author_id = $userstatic->getNomUrl(1); + $objectstatic->delivery_date = $obj->dp; + print $objectstatic->getKanbanView(''); + if ($i == (min($num, $limit) - 1)) { + print ''; + print '
'; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->rowid, $arrayofselected)) { + $selected = 1; + } + print ''; + } print ''; - $filename = dol_sanitizeFileName($obj->ref); - $filedir = $conf->supplier_proposal->dir_output.'/'.dol_sanitizeFileName($obj->ref); - $urlsource = $_SERVER['PHP_SELF'].'?id='.$obj->rowid; - print $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir); - print '
'; + if (!empty($arrayfields['sp.ref']['checked'])) { + print ''; - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Thirdparty - if (!empty($arrayfields['s.nom']['checked'])) { - print ''; - print $companystatic->getNomUrl(1, 'supplier', 0, 0, -1, empty($arrayfields['s.name_alias']['checked']) ? 0 : 1); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Alias - if (!empty($arrayfields['s.name_alias']['checked'])) { - print ''; - print $companystatic->name_alias; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Town - if (!empty($arrayfields['s.town']['checked'])) { - print ''; - print $obj->town; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Zip - if (!empty($arrayfields['s.zip']['checked'])) { - print ''; - print $obj->zip; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // State - if (!empty($arrayfields['state.nom']['checked'])) { - print "".$obj->state_name."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Country - if (!empty($arrayfields['country.code_iso']['checked'])) { - print ''; - $tmparray = getCountry($obj->fk_pays, 'all'); - print $tmparray['label']; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Type ent - if (!empty($arrayfields['typent.code']['checked'])) { - print ''; - if (empty($typenArray) || !is_array($typenArray) || count($typenArray) == 0) { - $typenArray = $formcompany->typent_array(1); - } - print $typenArray[$obj->typent_code]; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Date proposal - if (!empty($arrayfields['sp.date_valid']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_valid), 'day'); - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Date delivery - if (!empty($arrayfields['sp.date_livraison']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->dp), 'day'); - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Amount HT - if (!empty($arrayfields['sp.total_ht']['checked'])) { - print ''.price($obj->total_ht)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'sp.total_ht'; - } - $totalarray['val']['sp.total_ht'] += $obj->total_ht; - } - // Amount VAT - if (!empty($arrayfields['sp.total_tva']['checked'])) { - print ''.price($obj->total_tva)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'sp.total_tva'; - } - $totalarray['val']['sp.total_tva'] += $obj->total_tva; - } - // Amount TTC - if (!empty($arrayfields['sp.total_ttc']['checked'])) { - print ''.price($obj->total_ttc)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'sp.total_ttc'; - } - $totalarray['val']['sp.total_ttc'] += $obj->total_ttc; - } - - // Currency - if (!empty($arrayfields['sp.multicurrency_code']['checked'])) { - print ''.$obj->multicurrency_code.' - '.$langs->trans('Currency'.$obj->multicurrency_code)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Currency rate - if (!empty($arrayfields['sp.multicurrency_tx']['checked'])) { - print ''; - $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$obj->rowid, $obj->multicurrency_tx, 'none', $obj->multicurrency_code); - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Amount HT - if (!empty($arrayfields['sp.multicurrency_total_ht']['checked'])) { - print ''.price($obj->multicurrency_total_ht)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Amount VAT - if (!empty($arrayfields['sp.multicurrency_total_vat']['checked'])) { - print ''.price($obj->multicurrency_total_vat)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Amount TTC - if (!empty($arrayfields['sp.multicurrency_total_ttc']['checked'])) { - print ''.price($obj->multicurrency_total_ttc)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - $userstatic->id = $obj->fk_user_author; - $userstatic->login = $obj->login; - $userstatic->status = $obj->ustatus; - $userstatic->lastname = $obj->name; - $userstatic->firstname = $obj->firstname; - $userstatic->photo = $obj->photo; - $userstatic->admin = $obj->admin; - $userstatic->ref = $obj->fk_user_author; - $userstatic->employee = $obj->employee; - $userstatic->email = $obj->uemail; - - // Author - if (!empty($arrayfields['u.login']['checked'])) { - print ''; - if ($userstatic->id > 0) { - print $userstatic->getNomUrl(-1, '', 0, 0, 24, 1, 'login', '', 1); - } else { - print ' '; - } - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Extra fields - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - // Date creation - if (!empty($arrayfields['sp.datec']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Date modification - if (!empty($arrayfields['sp.tms']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Status - if (!empty($arrayfields['sp.fk_statut']['checked'])) { - print ''.$objectstatic->getLibStatut(5)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Action column - if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->rowid, $arrayofselected)) { - $selected = 1; + print ''; + // Picto + Ref + print ''; + // Warning + $warnornote = ''; + //if ($obj->fk_statut == 1 && $db->jdate($obj->date_valid) < ($now - $conf->supplier_proposal->warning_delay)) $warnornote .= img_warning($langs->trans("Late")); + if ($warnornote) { + print ''; + } + // Other picto tool + print '
'; + print $objectstatic->getNomUrl(1, '', '', 0, -1, 1); + print ''; + print $warnornote; + print ''; + $filename = dol_sanitizeFileName($obj->ref); + $filedir = $conf->supplier_proposal->dir_output.'/'.dol_sanitizeFileName($obj->ref); + $urlsource = $_SERVER['PHP_SELF'].'?id='.$obj->rowid; + print $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir); + print '
'; + + print "\n"; + if (!$i) { + $totalarray['nbfield']++; } - print ''; } - print ''; + + // Thirdparty + if (!empty($arrayfields['s.nom']['checked'])) { + print ''; + print $companystatic->getNomUrl(1, 'supplier', 0, 0, -1, empty($arrayfields['s.name_alias']['checked']) ? 0 : 1); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Alias + if (!empty($arrayfields['s.name_alias']['checked'])) { + print ''; + print $companystatic->name_alias; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Town + if (!empty($arrayfields['s.town']['checked'])) { + print ''; + print $obj->town; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Zip + if (!empty($arrayfields['s.zip']['checked'])) { + print ''; + print $obj->zip; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // State + if (!empty($arrayfields['state.nom']['checked'])) { + print "".$obj->state_name."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Country + if (!empty($arrayfields['country.code_iso']['checked'])) { + print ''; + $tmparray = getCountry($obj->fk_pays, 'all'); + print $tmparray['label']; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Type ent + if (!empty($arrayfields['typent.code']['checked'])) { + print ''; + if (empty($typenArray) || !is_array($typenArray) || count($typenArray) == 0) { + $typenArray = $formcompany->typent_array(1); + } + print $typenArray[$obj->typent_code]; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Date proposal + if (!empty($arrayfields['sp.date_valid']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_valid), 'day'); + print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Date delivery + if (!empty($arrayfields['sp.date_livraison']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->dp), 'day'); + print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Amount HT + if (!empty($arrayfields['sp.total_ht']['checked'])) { + print ''.price($obj->total_ht)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'sp.total_ht'; + } + $totalarray['val']['sp.total_ht'] += $obj->total_ht; + } + // Amount VAT + if (!empty($arrayfields['sp.total_tva']['checked'])) { + print ''.price($obj->total_tva)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'sp.total_tva'; + } + $totalarray['val']['sp.total_tva'] += $obj->total_tva; + } + // Amount TTC + if (!empty($arrayfields['sp.total_ttc']['checked'])) { + print ''.price($obj->total_ttc)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'sp.total_ttc'; + } + $totalarray['val']['sp.total_ttc'] += $obj->total_ttc; + } + + // Currency + if (!empty($arrayfields['sp.multicurrency_code']['checked'])) { + print ''.$obj->multicurrency_code.' - '.$langs->trans('Currency'.$obj->multicurrency_code)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Currency rate + if (!empty($arrayfields['sp.multicurrency_tx']['checked'])) { + print ''; + $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$obj->rowid, $obj->multicurrency_tx, 'none', $obj->multicurrency_code); + print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount HT + if (!empty($arrayfields['sp.multicurrency_total_ht']['checked'])) { + print ''.price($obj->multicurrency_total_ht)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount VAT + if (!empty($arrayfields['sp.multicurrency_total_vat']['checked'])) { + print ''.price($obj->multicurrency_total_vat)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount TTC + if (!empty($arrayfields['sp.multicurrency_total_ttc']['checked'])) { + print ''.price($obj->multicurrency_total_ttc)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + $userstatic->id = $obj->fk_user_author; + $userstatic->login = $obj->login; + $userstatic->status = $obj->ustatus; + $userstatic->lastname = $obj->name; + $userstatic->firstname = $obj->firstname; + $userstatic->photo = $obj->photo; + $userstatic->admin = $obj->admin; + $userstatic->ref = $obj->fk_user_author; + $userstatic->employee = $obj->employee; + $userstatic->email = $obj->uemail; + + // Author + if (!empty($arrayfields['u.login']['checked'])) { + print ''; + if ($userstatic->id > 0) { + print $userstatic->getNomUrl(-1, '', 0, 0, 24, 1, 'login', '', 1); + } else { + print ' '; + } + print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Date creation + if (!empty($arrayfields['sp.datec']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Date modification + if (!empty($arrayfields['sp.tms']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Status + if (!empty($arrayfields['sp.fk_statut']['checked'])) { + print ''.$objectstatic->getLibStatut(5)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Action column + if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->rowid, $arrayofselected)) { + $selected = 1; + } + print ''; + } + print ''; + } + if (!$i) { + $totalarray['nbfield']++; + } + + print "\n"; + + $total += $obj->total_ht; + $subtotal += $obj->total_ht; } - if (!$i) { - $totalarray['nbfield']++; - } - - print "\n"; - - $total += $obj->total_ht; - $subtotal += $obj->total_ht; - $i++; } From c52247e6ac0212b906a3184372e4a05dfd7c57f3 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Tue, 10 Jan 2023 12:43:55 +0100 Subject: [PATCH 0692/1128] kanban mode for list of client invoice --- htdocs/compta/facture/class/facture.class.php | 31 + htdocs/compta/facture/list.php | 1225 +++++++++-------- 2 files changed, 655 insertions(+), 601 deletions(-) diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 87914eac38e..4905ec3d99a 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -5732,6 +5732,37 @@ class Facture extends CommonInvoice dol_print_error($this->db); } } + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + //$return .= ''; // Can be image + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(1) : $this->ref).''; + if (property_exists($this, 'socid')) { + $return .= '
'.$this->socid.''; + } + if (property_exists($this, 'fk_user_author')) { + $return .= '
'.$this->fk_user_author.''; + } + if (method_exists($this, 'getLibStatut')) { + $return .= '
'.$this->getLibStatut(5).'
'; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } /** diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index afc31d7efe3..a23b736b562 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -75,6 +75,7 @@ $confirm = GETPOST('confirm', 'alpha'); $toselect = GETPOST('toselect', 'array'); $optioncss = GETPOST('optioncss', 'alpha'); $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'invoicelist'; +$mode = GETPOST('mode', 'alpha'); if ($contextpage == 'poslist') { $optioncss = 'print'; @@ -974,6 +975,9 @@ if ($resql) { } $param = '&socid='.urlencode($socid); + if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); + } if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -1185,6 +1189,9 @@ if ($resql) { if (!empty($socid)) { $url .= '&socid='.$socid; } + $newcardbutton = ''; + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); $newcardbutton = dolGetButtonTitle($langs->trans('NewBill'), '', 'fa fa-plus-circle', $url, '', $user->hasRight("facture", "creer")); } @@ -1204,6 +1211,7 @@ if ($resql) { print ''; print ''; print ''; + print ''; print_barre_liste($langs->trans('BillsCustomers').' '.($socid > 0 ? ' '.$soc->name : ''), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'bill', 0, $newcardbutton, '', $limit, 0, 0, 1); @@ -1894,645 +1902,660 @@ if ($resql) { $total_margin += $marginInfo['total_margin']; } - print 'ref)); - print 'parent.place=\''.$place.'\''; + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + print '
'; } - print '});"'; - } - print '>'; - - - // Action column - if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { - print ''; - if (($massactionbutton || $massaction) && $contextpage != 'poslist') { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->id, $arrayofselected)) { - $selected = 1; + // Output Kanban + $facturestatic->socid = $companystatic->getNomUrl(1, 'company', 15); + $userstatic->fetch($obj->fk_user_author); + $facturestatic->fk_user_author = $userstatic->getNomUrl(1); + print $facturestatic->getKanbanView(''); + if ($i == (min($num, $limit) - 1)) { + print '
'; + print ''; + } + } else { + print 'ref)); + print 'parent.place=\''.$place.'\''; } - print ''; + print '});"'; } - print ''; - } + print '>'; - // No - if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER_IN_LIST)) { - print ''.(($offset * $limit) + $i).''; - } - // Ref - if (!empty($arrayfields['f.ref']['checked'])) { - print ''; - - print ''; - - print ''; - print ''; - print '
'; - if ($contextpage == 'poslist') { - print dol_escape_htmltag($obj->ref); - } else { - print $facturestatic->getNomUrl(1, '', 200, 0, '', 0, 1); - } - - $filename = dol_sanitizeFileName($obj->ref); - $filedir = $conf->facture->dir_output.'/'.dol_sanitizeFileName($obj->ref); - $urlsource = $_SERVER['PHP_SELF'].'?id='.$obj->id; - print $formfile->getDocumentsLink($facturestatic->element, $filename, $filedir); - print '
'; - - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Customer ref - if (!empty($arrayfields['f.ref_client']['checked'])) { - print ''; - print dol_escape_htmltag($obj->ref_client); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Type - if (!empty($arrayfields['f.type']['checked'])) { - print ''; - print $facturestatic->getLibType(2); - print ""; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Date - if (!empty($arrayfields['f.datef']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->datef), 'day'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Date - if (!empty($arrayfields['f.date_valid']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_valid), 'day'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Date limit - if (!empty($arrayfields['f.date_lim_reglement']['checked'])) { - print ''.dol_print_date($datelimit, 'day'); - if ($facturestatic->hasDelay()) { - print img_warning($langs->trans('Alert').' - '.$langs->trans('Late')); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Project ref - if (!empty($arrayfields['p.ref']['checked'])) { - print ''; - if ($obj->project_id > 0) { - print $projectstatic->getNomUrl(1); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Project title - if (!empty($arrayfields['p.title']['checked'])) { - print ''; - if ($obj->project_id > 0) { - print dol_escape_htmltag($projectstatic->title); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Third party - if (!empty($arrayfields['s.nom']['checked'])) { - print ''; - if ($contextpage == 'poslist') { - print dol_escape_htmltag($companystatic->name); - } else { - print $companystatic->getNomUrl(1, 'customer', 0, 0, -1, empty($arrayfields['s.name_alias']['checked']) ? 0 : 1); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Alias - if (!empty($arrayfields['s.name_alias']['checked'])) { - print ''; - print dol_escape_htmltag($companystatic->name_alias); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Parent company - if (!empty($arrayfields['s2.nom']['checked'])) { - print ''; - if ($obj->fk_parent > 0) { - if (!isset($company_url_list[$obj->fk_parent])) { - $companyparent = new Societe($db); - $res = $companyparent->fetch($obj->fk_parent); - if ($res > 0) { - $company_url_list[$obj->fk_parent] = $companyparent->getNomUrl(1); + // Action column + if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + if (($massactionbutton || $massaction) && $contextpage != 'poslist') { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->id, $arrayofselected)) { + $selected = 1; } + print ''; } - if (isset($company_url_list[$obj->fk_parent])) { - print $company_url_list[$obj->fk_parent]; + print ''; + } + + // No + if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER_IN_LIST)) { + print ''.(($offset * $limit) + $i).''; + } + + // Ref + if (!empty($arrayfields['f.ref']['checked'])) { + print ''; + + print ''; + + print ''; + print ''; + print '
'; + if ($contextpage == 'poslist') { + print dol_escape_htmltag($obj->ref); + } else { + print $facturestatic->getNomUrl(1, '', 200, 0, '', 0, 1); + } + + $filename = dol_sanitizeFileName($obj->ref); + $filedir = $conf->facture->dir_output.'/'.dol_sanitizeFileName($obj->ref); + $urlsource = $_SERVER['PHP_SELF'].'?id='.$obj->id; + print $formfile->getDocumentsLink($facturestatic->element, $filename, $filedir); + print '
'; + + print "\n"; + if (!$i) { + $totalarray['nbfield']++; } } - print ""; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Town - if (!empty($arrayfields['s.town']['checked'])) { - print ''; - print dol_escape_htmltag($obj->town); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Zip - if (!empty($arrayfields['s.zip']['checked'])) { - print ''; - print dol_escape_htmltag($obj->zip); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // State - if (!empty($arrayfields['state.nom']['checked'])) { - print "".dol_escape_htmltag($obj->state_name)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Country - if (!empty($arrayfields['country.code_iso']['checked'])) { - print ''; - $tmparray = getCountry($obj->fk_pays, 'all'); - print $tmparray['label']; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Type ent - if (!empty($arrayfields['typent.code']['checked'])) { - print ''; - if (!is_array($typenArray) || count($typenArray) == 0) { - $typenArray = $formcompany->typent_array(1); - } - print $typenArray[$obj->typent_code]; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Staff - if (!empty($arrayfields['staff.code']['checked'])) { - print ''; - if (!is_array($conf->cache['staff']) || count($conf->cache['staff']) == 0) { - $conf->cache['staff'] = $formcompany->effectif_array(1); - } - print $conf->cache['staff'][$obj->staff_code]; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Payment mode - if (!empty($arrayfields['f.fk_mode_reglement']['checked'])) { - $s = $form->form_modes_reglement($_SERVER['PHP_SELF'], $obj->fk_mode_reglement, 'none', '', -1, 0, '', 1); - print ''; - print $s; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Payment terms - if (!empty($arrayfields['f.fk_cond_reglement']['checked'])) { - $s = $form->form_conditions_reglement($_SERVER['PHP_SELF'], $obj->fk_cond_reglement, 'none', 0, '', -1, -1, 1); - print ''; - print $s; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Module Source - if (!empty($arrayfields['f.module_source']['checked'])) { - print ''; - print dol_escape_htmltag($obj->module_source); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // POS Terminal - if (!empty($arrayfields['f.pos_source']['checked'])) { - print ''; - print dol_escape_htmltag($obj->pos_source); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Amount HT - if (!empty($arrayfields['f.total_ht']['checked'])) { - print ''.price($obj->total_ht)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'f.total_ht'; - } - $totalarray['val']['f.total_ht'] += $obj->total_ht; - } - // Amount VAT - if (!empty($arrayfields['f.total_tva']['checked'])) { - print ''.price($obj->total_tva)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'f.total_tva'; - } - $totalarray['val']['f.total_tva'] += $obj->total_tva; - } - // Amount LocalTax1 - if (!empty($arrayfields['f.total_localtax1']['checked'])) { - print ''.price($obj->total_localtax1)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'f.total_localtax1'; - } - $totalarray['val']['f.total_localtax1'] += $obj->total_localtax1; - } - // Amount LocalTax2 - if (!empty($arrayfields['f.total_localtax2']['checked'])) { - print ''.price($obj->total_localtax2)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'f.total_localtax2'; - } - $totalarray['val']['f.total_localtax2'] += $obj->total_localtax2; - } - // Amount TTC - if (!empty($arrayfields['f.total_ttc']['checked'])) { - print ''.price($obj->total_ttc)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'f.total_ttc'; - } - $totalarray['val']['f.total_ttc'] += $obj->total_ttc; - } - - $userstatic->id = $obj->fk_user_author; - $userstatic->login = $obj->login; - $userstatic->lastname = $obj->lastname; - $userstatic->firstname = $obj->firstname; - $userstatic->email = $obj->user_email; - $userstatic->statut = $obj->user_statut; - $userstatic->entity = $obj->entity; - $userstatic->photo = $obj->photo; - $userstatic->office_phone = $obj->office_phone; - $userstatic->office_fax = $obj->office_fax; - $userstatic->user_mobile = $obj->user_mobile; - $userstatic->job = $obj->job; - $userstatic->gender = $obj->gender; - - // Author - if (!empty($arrayfields['u.login']['checked'])) { - print ''; - if ($userstatic->id) { - print $userstatic->getNomUrl(-1); - } else { - print ' '; - } - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - if (!empty($arrayfields['sale_representative']['checked'])) { - // Sales representatives - print ''; - if ($obj->socid > 0) { - $listsalesrepresentatives = $companystatic->getSalesRepresentatives($user); - if ($listsalesrepresentatives < 0) { - dol_print_error($db); + // Customer ref + if (!empty($arrayfields['f.ref_client']['checked'])) { + print ''; + print dol_escape_htmltag($obj->ref_client); + print ''; + if (!$i) { + $totalarray['nbfield']++; } - $nbofsalesrepresentative = count($listsalesrepresentatives); - if ($nbofsalesrepresentative > 6) { - // We print only number - print $nbofsalesrepresentative; - } elseif ($nbofsalesrepresentative > 0) { - $j = 0; - foreach ($listsalesrepresentatives as $val) { - $userstatic->id = $val['id']; - $userstatic->lastname = $val['lastname']; - $userstatic->firstname = $val['firstname']; - $userstatic->email = $val['email']; - $userstatic->statut = $val['statut']; - $userstatic->entity = $val['entity']; - $userstatic->photo = $val['photo']; - $userstatic->login = $val['login']; - $userstatic->office_phone = $val['office_phone']; - $userstatic->office_fax = $val['office_fax']; - $userstatic->user_mobile = $val['user_mobile']; - $userstatic->job = $val['job']; - $userstatic->gender = $val['gender']; - //print '
': - print ($nbofsalesrepresentative < 2) ? $userstatic->getNomUrl(-1, '', 0, 0, 12) : $userstatic->getNomUrl(-2); - $j++; - if ($j < $nbofsalesrepresentative) { - print ' '; + } + + // Type + if (!empty($arrayfields['f.type']['checked'])) { + print ''; + print $facturestatic->getLibType(2); + print ""; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Date + if (!empty($arrayfields['f.datef']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->datef), 'day'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Date + if (!empty($arrayfields['f.date_valid']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_valid), 'day'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Date limit + if (!empty($arrayfields['f.date_lim_reglement']['checked'])) { + print ''.dol_print_date($datelimit, 'day'); + if ($facturestatic->hasDelay()) { + print img_warning($langs->trans('Alert').' - '.$langs->trans('Late')); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Project ref + if (!empty($arrayfields['p.ref']['checked'])) { + print ''; + if ($obj->project_id > 0) { + print $projectstatic->getNomUrl(1); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Project title + if (!empty($arrayfields['p.title']['checked'])) { + print ''; + if ($obj->project_id > 0) { + print dol_escape_htmltag($projectstatic->title); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Third party + if (!empty($arrayfields['s.nom']['checked'])) { + print ''; + if ($contextpage == 'poslist') { + print dol_escape_htmltag($companystatic->name); + } else { + print $companystatic->getNomUrl(1, 'customer', 0, 0, -1, empty($arrayfields['s.name_alias']['checked']) ? 0 : 1); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Alias + if (!empty($arrayfields['s.name_alias']['checked'])) { + print ''; + print dol_escape_htmltag($companystatic->name_alias); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Parent company + if (!empty($arrayfields['s2.nom']['checked'])) { + print ''; + if ($obj->fk_parent > 0) { + if (!isset($company_url_list[$obj->fk_parent])) { + $companyparent = new Societe($db); + $res = $companyparent->fetch($obj->fk_parent); + if ($res > 0) { + $company_url_list[$obj->fk_parent] = $companyparent->getNomUrl(1); } - //print '
'; + } + if (isset($company_url_list[$obj->fk_parent])) { + print $company_url_list[$obj->fk_parent]; } } - //else print $langs->trans("NoSalesRepresentativeAffected"); - } else { - print ' '; + print ""; + if (!$i) { + $totalarray['nbfield']++; + } } - print ''; - if (!$i) { - $totalarray['nbfield']++; + // Town + if (!empty($arrayfields['s.town']['checked'])) { + print ''; + print dol_escape_htmltag($obj->town); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Zip + if (!empty($arrayfields['s.zip']['checked'])) { + print ''; + print dol_escape_htmltag($obj->zip); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // State + if (!empty($arrayfields['state.nom']['checked'])) { + print "".dol_escape_htmltag($obj->state_name)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Country + if (!empty($arrayfields['country.code_iso']['checked'])) { + print ''; + $tmparray = getCountry($obj->fk_pays, 'all'); + print $tmparray['label']; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Type ent + if (!empty($arrayfields['typent.code']['checked'])) { + print ''; + if (!is_array($typenArray) || count($typenArray) == 0) { + $typenArray = $formcompany->typent_array(1); + } + print $typenArray[$obj->typent_code]; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Staff + if (!empty($arrayfields['staff.code']['checked'])) { + print ''; + if (!is_array($conf->cache['staff']) || count($conf->cache['staff']) == 0) { + $conf->cache['staff'] = $formcompany->effectif_array(1); + } + print $conf->cache['staff'][$obj->staff_code]; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } - } - if (!empty($arrayfields['f.retained_warranty']['checked'])) { - print ''.(!empty($obj->retained_warranty) ? price($obj->retained_warranty).'%' : ' ').''; - } + // Payment mode + if (!empty($arrayfields['f.fk_mode_reglement']['checked'])) { + $s = $form->form_modes_reglement($_SERVER['PHP_SELF'], $obj->fk_mode_reglement, 'none', '', -1, 0, '', 1); + print ''; + print $s; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } - if (!empty($arrayfields['dynamount_payed']['checked'])) { - print ''.(!empty($totalpay) ? price($totalpay, 0, $langs) : ' ').''; // TODO Use a denormalized field - if (!$i) { - $totalarray['nbfield']++; + // Payment terms + if (!empty($arrayfields['f.fk_cond_reglement']['checked'])) { + $s = $form->form_conditions_reglement($_SERVER['PHP_SELF'], $obj->fk_cond_reglement, 'none', 0, '', -1, -1, 1); + print ''; + print $s; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'totalam'; - } - $totalarray['val']['totalam'] += $totalpay; - } - // Pending amount - if (!empty($arrayfields['rtp']['checked'])) { - print ''; - print (!empty($remaintopay) ? price($remaintopay, 0, $langs) : ' '); - print ''; // TODO Use a denormalized field - if (!$i) { - $totalarray['nbfield']++; + // Module Source + if (!empty($arrayfields['f.module_source']['checked'])) { + print ''; + print dol_escape_htmltag($obj->module_source); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'rtp'; - } - $totalarray['val']['rtp'] += $remaintopay; - } + // POS Terminal + if (!empty($arrayfields['f.pos_source']['checked'])) { + print ''; + print dol_escape_htmltag($obj->pos_source); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } - // Currency - if (!empty($arrayfields['f.multicurrency_code']['checked'])) { - print ''; - if (empty($conf->global->MAIN_SHOW_ONLY_CODE_MULTICURRENCY)) { - print $langs->transnoentitiesnoconv('Currency'.$obj->multicurrency_code); - } else { - print dol_escape_htmltag($obj->multicurrency_code); + // Amount HT + if (!empty($arrayfields['f.total_ht']['checked'])) { + print ''.price($obj->total_ht)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'f.total_ht'; + } + $totalarray['val']['f.total_ht'] += $obj->total_ht; } - print "\n"; - if (!$i) { - $totalarray['nbfield']++; + // Amount VAT + if (!empty($arrayfields['f.total_tva']['checked'])) { + print ''.price($obj->total_tva)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'f.total_tva'; + } + $totalarray['val']['f.total_tva'] += $obj->total_tva; + } + // Amount LocalTax1 + if (!empty($arrayfields['f.total_localtax1']['checked'])) { + print ''.price($obj->total_localtax1)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'f.total_localtax1'; + } + $totalarray['val']['f.total_localtax1'] += $obj->total_localtax1; + } + // Amount LocalTax2 + if (!empty($arrayfields['f.total_localtax2']['checked'])) { + print ''.price($obj->total_localtax2)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'f.total_localtax2'; + } + $totalarray['val']['f.total_localtax2'] += $obj->total_localtax2; + } + // Amount TTC + if (!empty($arrayfields['f.total_ttc']['checked'])) { + print ''.price($obj->total_ttc)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'f.total_ttc'; + } + $totalarray['val']['f.total_ttc'] += $obj->total_ttc; } - } - // Currency rate - if (!empty($arrayfields['f.multicurrency_tx']['checked'])) { - print ''; - $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$obj->rowid, $obj->multicurrency_tx, 'none', $obj->multicurrency_code); - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Amount HT - if (!empty($arrayfields['f.multicurrency_total_ht']['checked'])) { - print ''.price($obj->multicurrency_total_ht)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Amount VAT - if (!empty($arrayfields['f.multicurrency_total_vat']['checked'])) { - print ''.price($obj->multicurrency_total_vat)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Amount TTC - if (!empty($arrayfields['f.multicurrency_total_ttc']['checked'])) { - print ''.price($obj->multicurrency_total_ttc)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - if (!empty($arrayfields['multicurrency_dynamount_payed']['checked'])) { - print ''.(!empty($multicurrency_totalpay) ?price($multicurrency_totalpay, 0, $langs) : ' ').''; // TODO Use a denormalized field - if (!$i) { - $totalarray['nbfield']++; - } - } + $userstatic->id = $obj->fk_user_author; + $userstatic->login = $obj->login; + $userstatic->lastname = $obj->lastname; + $userstatic->firstname = $obj->firstname; + $userstatic->email = $obj->user_email; + $userstatic->statut = $obj->user_statut; + $userstatic->entity = $obj->entity; + $userstatic->photo = $obj->photo; + $userstatic->office_phone = $obj->office_phone; + $userstatic->office_fax = $obj->office_fax; + $userstatic->user_mobile = $obj->user_mobile; + $userstatic->job = $obj->job; + $userstatic->gender = $obj->gender; - // Pending amount - if (!empty($arrayfields['multicurrency_rtp']['checked'])) { - print ''; - print (!empty($multicurrency_remaintopay) ? price($multicurrency_remaintopay, 0, $langs) : ' '); - print ''; // TODO Use a denormalized field - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Total buying or cost price - if (!empty($arrayfields['total_pa']['checked'])) { - print ''.price($marginInfo['pa_total']).''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Total margin - if (!empty($arrayfields['total_margin']['checked'])) { - print ''.price($marginInfo['total_margin']).''; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'total_margin'; - } - $totalarray['val']['total_margin'] += $marginInfo['total_margin']; - } - // Total margin rate - if (!empty($arrayfields['total_margin_rate']['checked'])) { - print ''.(($marginInfo['total_margin_rate'] == '') ? '' : price($marginInfo['total_margin_rate'], null, null, null, null, 2).'%').''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Total mark rate - if (!empty($arrayfields['total_mark_rate']['checked'])) { - print ''.(($marginInfo['total_mark_rate'] == '') ? '' : price($marginInfo['total_mark_rate'], null, null, null, null, 2).'%').''; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'total_mark_rate'; - } - if ($i >= $imaxinloop - 1) { - if (!empty($total_ht)) { - $totalarray['val']['total_mark_rate'] = price2num($total_margin * 100 / $total_ht, 'MT'); + // Author + if (!empty($arrayfields['u.login']['checked'])) { + print ''; + if ($userstatic->id) { + print $userstatic->getNomUrl(-1); } else { - $totalarray['val']['total_mark_rate'] = ''; + print ' '; + } + print "\n"; + if (!$i) { + $totalarray['nbfield']++; } } - } - // Extra fields - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - // Date creation - if (!empty($arrayfields['f.datec']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Date modification - if (!empty($arrayfields['f.tms']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Date closing - if (!empty($arrayfields['f.date_closing']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_closing), 'dayhour', 'tzuser'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Note public - if (!empty($arrayfields['f.note_public']['checked'])) { - print ''; - print dol_string_nohtmltag($obj->note_public); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Note private - if (!empty($arrayfields['f.note_private']['checked'])) { - print ''; - print dol_string_nohtmltag($obj->note_private); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Template Invoice - if (!empty($arrayfields['f.fk_fac_rec_source']['checked'])) { - print ''; - if (!empty($obj->fk_fac_rec_source)) { - $facrec = new FactureRec($db); - $result = $facrec->fetch($obj->fk_fac_rec_source); - if ($result < 0) { - setEventMessages($facrec->error, $facrec->errors, 'errors'); + if (!empty($arrayfields['sale_representative']['checked'])) { + // Sales representatives + print ''; + if ($obj->socid > 0) { + $listsalesrepresentatives = $companystatic->getSalesRepresentatives($user); + if ($listsalesrepresentatives < 0) { + dol_print_error($db); + } + $nbofsalesrepresentative = count($listsalesrepresentatives); + if ($nbofsalesrepresentative > 6) { + // We print only number + print $nbofsalesrepresentative; + } elseif ($nbofsalesrepresentative > 0) { + $j = 0; + foreach ($listsalesrepresentatives as $val) { + $userstatic->id = $val['id']; + $userstatic->lastname = $val['lastname']; + $userstatic->firstname = $val['firstname']; + $userstatic->email = $val['email']; + $userstatic->statut = $val['statut']; + $userstatic->entity = $val['entity']; + $userstatic->photo = $val['photo']; + $userstatic->login = $val['login']; + $userstatic->office_phone = $val['office_phone']; + $userstatic->office_fax = $val['office_fax']; + $userstatic->user_mobile = $val['user_mobile']; + $userstatic->job = $val['job']; + $userstatic->gender = $val['gender']; + //print '
': + print ($nbofsalesrepresentative < 2) ? $userstatic->getNomUrl(-1, '', 0, 0, 12) : $userstatic->getNomUrl(-2); + $j++; + if ($j < $nbofsalesrepresentative) { + print ' '; + } + //print '
'; + } + } + //else print $langs->trans("NoSalesRepresentativeAffected"); } else { - print $facrec->getNomUrl(); + print ' '; + } + print ''; + if (!$i) { + $totalarray['nbfield']++; } } - print ''; + + if (!empty($arrayfields['f.retained_warranty']['checked'])) { + print ''.(!empty($obj->retained_warranty) ? price($obj->retained_warranty).'%' : ' ').''; + } + + if (!empty($arrayfields['dynamount_payed']['checked'])) { + print ''.(!empty($totalpay) ? price($totalpay, 0, $langs) : ' ').''; // TODO Use a denormalized field + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'totalam'; + } + $totalarray['val']['totalam'] += $totalpay; + } + + // Pending amount + if (!empty($arrayfields['rtp']['checked'])) { + print ''; + print (!empty($remaintopay) ? price($remaintopay, 0, $langs) : ' '); + print ''; // TODO Use a denormalized field + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'rtp'; + } + $totalarray['val']['rtp'] += $remaintopay; + } + + + // Currency + if (!empty($arrayfields['f.multicurrency_code']['checked'])) { + print ''; + if (empty($conf->global->MAIN_SHOW_ONLY_CODE_MULTICURRENCY)) { + print $langs->transnoentitiesnoconv('Currency'.$obj->multicurrency_code); + } else { + print dol_escape_htmltag($obj->multicurrency_code); + } + print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Currency rate + if (!empty($arrayfields['f.multicurrency_tx']['checked'])) { + print ''; + $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$obj->rowid, $obj->multicurrency_tx, 'none', $obj->multicurrency_code); + print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount HT + if (!empty($arrayfields['f.multicurrency_total_ht']['checked'])) { + print ''.price($obj->multicurrency_total_ht)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount VAT + if (!empty($arrayfields['f.multicurrency_total_vat']['checked'])) { + print ''.price($obj->multicurrency_total_vat)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount TTC + if (!empty($arrayfields['f.multicurrency_total_ttc']['checked'])) { + print ''.price($obj->multicurrency_total_ttc)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + if (!empty($arrayfields['multicurrency_dynamount_payed']['checked'])) { + print ''.(!empty($multicurrency_totalpay) ?price($multicurrency_totalpay, 0, $langs) : ' ').''; // TODO Use a denormalized field + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Pending amount + if (!empty($arrayfields['multicurrency_rtp']['checked'])) { + print ''; + print (!empty($multicurrency_remaintopay) ? price($multicurrency_remaintopay, 0, $langs) : ' '); + print ''; // TODO Use a denormalized field + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Total buying or cost price + if (!empty($arrayfields['total_pa']['checked'])) { + print ''.price($marginInfo['pa_total']).''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Total margin + if (!empty($arrayfields['total_margin']['checked'])) { + print ''.price($marginInfo['total_margin']).''; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'total_margin'; + } + $totalarray['val']['total_margin'] += $marginInfo['total_margin']; + } + // Total margin rate + if (!empty($arrayfields['total_margin_rate']['checked'])) { + print ''.(($marginInfo['total_margin_rate'] == '') ? '' : price($marginInfo['total_margin_rate'], null, null, null, null, 2).'%').''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Total mark rate + if (!empty($arrayfields['total_mark_rate']['checked'])) { + print ''.(($marginInfo['total_mark_rate'] == '') ? '' : price($marginInfo['total_mark_rate'], null, null, null, null, 2).'%').''; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'total_mark_rate'; + } + if ($i >= $imaxinloop - 1) { + if (!empty($total_ht)) { + $totalarray['val']['total_mark_rate'] = price2num($total_margin * 100 / $total_ht, 'MT'); + } else { + $totalarray['val']['total_mark_rate'] = ''; + } + } + } + + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Date creation + if (!empty($arrayfields['f.datec']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Date modification + if (!empty($arrayfields['f.tms']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Date closing + if (!empty($arrayfields['f.date_closing']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_closing), 'dayhour', 'tzuser'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Note public + if (!empty($arrayfields['f.note_public']['checked'])) { + print ''; + print dol_string_nohtmltag($obj->note_public); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Note private + if (!empty($arrayfields['f.note_private']['checked'])) { + print ''; + print dol_string_nohtmltag($obj->note_private); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Template Invoice + if (!empty($arrayfields['f.fk_fac_rec_source']['checked'])) { + print ''; + if (!empty($obj->fk_fac_rec_source)) { + $facrec = new FactureRec($db); + $result = $facrec->fetch($obj->fk_fac_rec_source); + if ($result < 0) { + setEventMessages($facrec->error, $facrec->errors, 'errors'); + } else { + print $facrec->getNomUrl(); + } + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Status + if (!empty($arrayfields['f.fk_statut']['checked'])) { + print ''; + print $facturestatic->getLibStatut(5, $paiement); + print ""; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Action column (Show the massaction button only when this page is not opend from the Extended POS) + + if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + if (($massactionbutton || $massaction) && $contextpage != 'poslist') { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->id, $arrayofselected)) { + $selected = 1; + } + print ''; + } + print ''; + } if (!$i) { $totalarray['nbfield']++; } + print "\n"; } - // Status - if (!empty($arrayfields['f.fk_statut']['checked'])) { - print ''; - print $facturestatic->getLibStatut(5, $paiement); - print ""; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Action column (Show the massaction button only when this page is not opend from the Extended POS) - - if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { - print ''; - if (($massactionbutton || $massaction) && $contextpage != 'poslist') { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->id, $arrayofselected)) { - $selected = 1; - } - print ''; - } - print ''; - } - if (!$i) { - $totalarray['nbfield']++; - } - print "\n"; - $i++; } From 130e9d8df2a931ae4da54e339699922f08e9201a Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Tue, 10 Jan 2023 13:29:46 +0100 Subject: [PATCH 0693/1128] kanban for list of suppliers invoices --- .../fourn/class/fournisseur.facture.class.php | 37 + htdocs/fourn/facture/list.php | 810 +++++++++--------- 2 files changed, 452 insertions(+), 395 deletions(-) diff --git a/htdocs/fourn/class/fournisseur.facture.class.php b/htdocs/fourn/class/fournisseur.facture.class.php index de012c86a58..93a8fc0d1ef 100644 --- a/htdocs/fourn/class/fournisseur.facture.class.php +++ b/htdocs/fourn/class/fournisseur.facture.class.php @@ -3225,6 +3225,43 @@ class FactureFournisseur extends CommonInvoice return $isUsed; } + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $langs; + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(1) : $this->ref).''; + if (property_exists($this, 'socid')) { + $return .= ' | '.$this->socid.''; + } + if (property_exists($this, 'date_echeance') && property_exists($this, 'date')) { + if (!empty($this->date_echeance)) { + $return .= '
'.dol_print_date($this->date_echeance).''; + } else { + $return .= '
'.dol_print_date($this->date).''; + } + } + if (property_exists($this, 'total_ht')) { + $return .= '
'.$langs->trans("AmountHT").' : '.price($this->total_ht).''; + } + if (method_exists($this, 'getLibStatut')) { + $return .= '
'.$this->getLibStatut(5).'
'; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } diff --git a/htdocs/fourn/facture/list.php b/htdocs/fourn/facture/list.php index be215e891eb..3c4dfb32b15 100644 --- a/htdocs/fourn/facture/list.php +++ b/htdocs/fourn/facture/list.php @@ -766,6 +766,9 @@ if ($socid) { } $param = '&socid='.$socid; +if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); +} if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -918,7 +921,10 @@ $url = DOL_URL_ROOT.'/fourn/facture/card.php?action=create'; if (!empty($socid)) { $url .= '&socid='.urlencode($socid); } -$newcardbutton = dolGetButtonTitle($langs->trans('NewBill'), '', 'fa fa-plus-circle', $url, '', ($user->rights->fournisseur->facture->creer || $user->rights->supplier_invoice->creer)); +$newcardbutton = ''; +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('NewBill'), '', 'fa fa-plus-circle', $url, '', ($user->rights->fournisseur->facture->creer || $user->rights->supplier_invoice->creer)); $i = 0; print ''."\n"; @@ -1430,409 +1436,423 @@ if ($num > 0) { $remaintopay = -$facturestatic->getSumFromThisCreditNotesNotUsed(); } } - - print ''; - // Action column - if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->facid, $arrayofselected)) { - $selected = 1; + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + print '
'; + } + // Output Kanban + $facturestatic->socid = $thirdparty->getNomUrl(1, 'supplier', 3); + $facturestatic->total_ht = $obj->total_ht; + $facturestatic->date = $obj->datef; + print $facturestatic->getKanbanView(''); + if ($i == (min($num, $limit) - 1)) { + print '
'; + print ''; + } + } else { + print ''; + // Action column + if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->facid, $arrayofselected)) { + $selected = 1; + } + print ''; } - print ''; + print ''; } - print ''; - } - if (!empty($arrayfields['f.ref']['checked'])) { - print ''; + if (!empty($arrayfields['f.ref']['checked'])) { + print ''; - print ''; - // Picto + Ref - print '
'; - print $facturestatic->getNomUrl(1, '', 0, 0, '', 0, -1, 1); + print ''; + // Picto + Ref + print '
'; + print $facturestatic->getNomUrl(1, '', 0, 0, '', 0, -1, 1); - $filename = dol_sanitizeFileName($obj->ref); - $filedir = $conf->fournisseur->facture->dir_output.'/'.get_exdir($obj->facid, 2, 0, 0, $facturestatic, 'invoice_supplier').dol_sanitizeFileName($obj->ref); - $subdir = get_exdir($obj->facid, 2, 0, 0, $facturestatic, 'invoice_supplier').dol_sanitizeFileName($obj->ref); - print $formfile->getDocumentsLink('facture_fournisseur', $subdir, $filedir); - print '
'; + $filename = dol_sanitizeFileName($obj->ref); + $filedir = $conf->fournisseur->facture->dir_output.'/'.get_exdir($obj->facid, 2, 0, 0, $facturestatic, 'invoice_supplier').dol_sanitizeFileName($obj->ref); + $subdir = get_exdir($obj->facid, 2, 0, 0, $facturestatic, 'invoice_supplier').dol_sanitizeFileName($obj->ref); + print $formfile->getDocumentsLink('facture_fournisseur', $subdir, $filedir); + print '
'; - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Supplier ref - if (!empty($arrayfields['f.ref_supplier']['checked'])) { - print ''; - print $obj->ref_supplier; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Type - if (!empty($arrayfields['f.type']['checked'])) { - print ''; - print $facturestatic->getLibType(); - print ""; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Label - if (!empty($arrayfields['f.label']['checked'])) { - print ''; - print $obj->label; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Date - if (!empty($arrayfields['f.datef']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->datef), 'day'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Date limit - if (!empty($arrayfields['f.date_lim_reglement']['checked'])) { - print ''.dol_print_date($datelimit, 'day'); - if ($facturestatic->hasDelay()) { - print img_warning($langs->trans('Alert').' - '.$langs->trans('Late')); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Project - if (!empty($arrayfields['p.ref']['checked'])) { - print ''; - if ($obj->project_id > 0) { - $projectstatic->id = $obj->project_id; - $projectstatic->ref = $obj->project_ref; - $projectstatic->title = $obj->project_label; - print $projectstatic->getNomUrl(1); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Third party - if (!empty($arrayfields['s.nom']['checked'])) { - print ''; - print $thirdparty->getNomUrl(1, 'supplier', 0, 0, -1, empty($arrayfields['s.name_alias']['checked']) ? 0 : 1); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Alias - if (!empty($arrayfields['s.name_alias']['checked'])) { - print ''; - print $thirdparty->name_alias; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Town - if (!empty($arrayfields['s.town']['checked'])) { - print ''; - print $obj->town; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Zip - if (!empty($arrayfields['s.zip']['checked'])) { - print ''; - print dol_escape_htmltag($obj->zip); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // State - if (!empty($arrayfields['state.nom']['checked'])) { - print "".$obj->state_name."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Country - if (!empty($arrayfields['country.code_iso']['checked'])) { - print ''; - $tmparray = getCountry($obj->fk_pays, 'all'); - print $tmparray['label']; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Type ent - if (!empty($arrayfields['typent.code']['checked'])) { - print ''; - if (empty($typenArray)) { - $typenArray = $formcompany->typent_array(1); - } - print $typenArray[$obj->typent_code]; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Payment condition - if (!empty($arrayfields['f.fk_cond_reglement']['checked'])) { - $s = $form->form_conditions_reglement($_SERVER['PHP_SELF'], $obj->fk_cond_reglement, 'none', 1, '', -1, -1, 1); - print ''; - print dol_escape_htmltag($s); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Payment mode - if (!empty($arrayfields['f.fk_mode_reglement']['checked'])) { - $s = $form->form_modes_reglement($_SERVER['PHP_SELF'], $obj->fk_mode_reglement, 'none', '', -1, 0, '', 1); - print ''; - print dol_escape_htmltag($s); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Amount HT - if (!empty($arrayfields['f.total_ht']['checked'])) { - print ''.price($obj->total_ht)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'f.total_ht'; - } - $totalarray['val']['f.total_ht'] += $obj->total_ht; - } - // Amount VAT - if (!empty($arrayfields['f.total_vat']['checked'])) { - print ''.price($obj->total_vat)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'f.total_vat'; - } - $totalarray['val']['f.total_vat'] += $obj->total_vat; - } - // Amount LocalTax1 - if (!empty($arrayfields['f.total_localtax1']['checked'])) { - print ''.price($obj->total_localtax1)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'f.total_localtax1'; - } - $totalarray['val']['f.total_localtax1'] += $obj->total_localtax1; - } - // Amount LocalTax2 - if (!empty($arrayfields['f.total_localtax2']['checked'])) { - print ''.price($obj->total_localtax2)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'f.total_localtax2'; - } - $totalarray['val']['f.total_localtax2'] += $obj->total_localtax2; - } - // Amount TTC - if (!empty($arrayfields['f.total_ttc']['checked'])) { - print ''.price($obj->total_ttc)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'f.total_ttc'; - } - $totalarray['val']['f.total_ttc'] += $obj->total_ttc; - } - - $userstatic->id = $obj->fk_user_author; - $userstatic->login = $obj->login; - $userstatic->lastname = $obj->lastname; - $userstatic->firstname = $obj->firstname; - $userstatic->email = $obj->user_email; - $userstatic->statut = $obj->user_statut; - $userstatic->entity = $obj->entity; - $userstatic->photo = $obj->photo; - $userstatic->office_phone = $obj->office_phone; - $userstatic->office_fax = $obj->office_fax; - $userstatic->user_mobile = $obj->user_mobile; - $userstatic->job = $obj->job; - $userstatic->gender = $obj->gender; - - // Author - if (!empty($arrayfields['u.login']['checked'])) { - print ''; - if ($userstatic->id) { - print $userstatic->getLoginUrl(-1); - } else { - print ' '; - } - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - if (!empty($arrayfields['dynamount_payed']['checked'])) { - print ''.(!empty($totalpay) ?price($totalpay, 0, $langs) : '').''; // TODO Use a denormalized field - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'totalam'; - } - $totalarray['val']['totalam'] += $totalpay; - } - - if (!empty($arrayfields['rtp']['checked'])) { - print ''.(!empty($remaintopay) ?price($remaintopay, 0, $langs) : ' ').''; // TODO Use a denormalized field - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'rtp'; - } - $totalarray['val']['rtp'] += $remaintopay; - } - - // Currency - if (!empty($arrayfields['f.multicurrency_code']['checked'])) { - print ''.$obj->multicurrency_code.' - '.$langs->trans('Currency'.$obj->multicurrency_code)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Currency rate - if (!empty($arrayfields['f.multicurrency_tx']['checked'])) { - print ''; - $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$obj->rowid, $obj->multicurrency_tx, 'none', $obj->multicurrency_code); - print "\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Amount HT - if (!empty($arrayfields['f.multicurrency_total_ht']['checked'])) { - print ''.price($obj->multicurrency_total_ht)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Amount VAT - if (!empty($arrayfields['f.multicurrency_total_vat']['checked'])) { - print ''.price($obj->multicurrency_total_vat)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Amount TTC - if (!empty($arrayfields['f.multicurrency_total_ttc']['checked'])) { - print ''.price($obj->multicurrency_total_ttc)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - if (!empty($arrayfields['multicurrency_dynamount_payed']['checked'])) { - print ''.(!empty($multicurrency_totalpay) ?price($multicurrency_totalpay, 0, $langs) : '').''; // TODO Use a denormalized field - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Pending amount - if (!empty($arrayfields['multicurrency_rtp']['checked'])) { - print ''; - print (!empty($multicurrency_remaintopay) ? price($multicurrency_remaintopay, 0, $langs) : ''); - print ''; // TODO Use a denormalized field - if (!$i) { - $totalarray['nbfield']++; - } - } - - - // Extra fields - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - - // Date creation - if (!empty($arrayfields['f.datec']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Date modification - if (!empty($arrayfields['f.tms']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Status - if (!empty($arrayfields['f.fk_statut']['checked'])) { - print ''; - print $facturestatic->LibStatut($obj->paye, $obj->fk_statut, 5, $paiement, $obj->type); - print ""; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Action column - if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->facid, $arrayofselected)) { - $selected = 1; + print "\n"; + if (!$i) { + $totalarray['nbfield']++; } - print ''; } - print ''; - } - if (!$i) { - $totalarray['nbfield']++; - } - print "\n"; + // Supplier ref + if (!empty($arrayfields['f.ref_supplier']['checked'])) { + print ''; + print $obj->ref_supplier; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Type + if (!empty($arrayfields['f.type']['checked'])) { + print ''; + print $facturestatic->getLibType(); + print ""; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Label + if (!empty($arrayfields['f.label']['checked'])) { + print ''; + print $obj->label; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Date + if (!empty($arrayfields['f.datef']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->datef), 'day'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Date limit + if (!empty($arrayfields['f.date_lim_reglement']['checked'])) { + print ''.dol_print_date($datelimit, 'day'); + if ($facturestatic->hasDelay()) { + print img_warning($langs->trans('Alert').' - '.$langs->trans('Late')); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Project + if (!empty($arrayfields['p.ref']['checked'])) { + print ''; + if ($obj->project_id > 0) { + $projectstatic->id = $obj->project_id; + $projectstatic->ref = $obj->project_ref; + $projectstatic->title = $obj->project_label; + print $projectstatic->getNomUrl(1); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Third party + if (!empty($arrayfields['s.nom']['checked'])) { + print ''; + print $thirdparty->getNomUrl(1, 'supplier', 0, 0, -1, empty($arrayfields['s.name_alias']['checked']) ? 0 : 1); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Alias + if (!empty($arrayfields['s.name_alias']['checked'])) { + print ''; + print $thirdparty->name_alias; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Town + if (!empty($arrayfields['s.town']['checked'])) { + print ''; + print $obj->town; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Zip + if (!empty($arrayfields['s.zip']['checked'])) { + print ''; + print dol_escape_htmltag($obj->zip); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // State + if (!empty($arrayfields['state.nom']['checked'])) { + print "".$obj->state_name."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Country + if (!empty($arrayfields['country.code_iso']['checked'])) { + print ''; + $tmparray = getCountry($obj->fk_pays, 'all'); + print $tmparray['label']; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Type ent + if (!empty($arrayfields['typent.code']['checked'])) { + print ''; + if (empty($typenArray)) { + $typenArray = $formcompany->typent_array(1); + } + print $typenArray[$obj->typent_code]; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Payment condition + if (!empty($arrayfields['f.fk_cond_reglement']['checked'])) { + $s = $form->form_conditions_reglement($_SERVER['PHP_SELF'], $obj->fk_cond_reglement, 'none', 1, '', -1, -1, 1); + print ''; + print dol_escape_htmltag($s); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Payment mode + if (!empty($arrayfields['f.fk_mode_reglement']['checked'])) { + $s = $form->form_modes_reglement($_SERVER['PHP_SELF'], $obj->fk_mode_reglement, 'none', '', -1, 0, '', 1); + print ''; + print dol_escape_htmltag($s); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Amount HT + if (!empty($arrayfields['f.total_ht']['checked'])) { + print ''.price($obj->total_ht)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'f.total_ht'; + } + $totalarray['val']['f.total_ht'] += $obj->total_ht; + } + // Amount VAT + if (!empty($arrayfields['f.total_vat']['checked'])) { + print ''.price($obj->total_vat)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'f.total_vat'; + } + $totalarray['val']['f.total_vat'] += $obj->total_vat; + } + // Amount LocalTax1 + if (!empty($arrayfields['f.total_localtax1']['checked'])) { + print ''.price($obj->total_localtax1)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'f.total_localtax1'; + } + $totalarray['val']['f.total_localtax1'] += $obj->total_localtax1; + } + // Amount LocalTax2 + if (!empty($arrayfields['f.total_localtax2']['checked'])) { + print ''.price($obj->total_localtax2)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'f.total_localtax2'; + } + $totalarray['val']['f.total_localtax2'] += $obj->total_localtax2; + } + // Amount TTC + if (!empty($arrayfields['f.total_ttc']['checked'])) { + print ''.price($obj->total_ttc)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'f.total_ttc'; + } + $totalarray['val']['f.total_ttc'] += $obj->total_ttc; + } + + $userstatic->id = $obj->fk_user_author; + $userstatic->login = $obj->login; + $userstatic->lastname = $obj->lastname; + $userstatic->firstname = $obj->firstname; + $userstatic->email = $obj->user_email; + $userstatic->statut = $obj->user_statut; + $userstatic->entity = $obj->entity; + $userstatic->photo = $obj->photo; + $userstatic->office_phone = $obj->office_phone; + $userstatic->office_fax = $obj->office_fax; + $userstatic->user_mobile = $obj->user_mobile; + $userstatic->job = $obj->job; + $userstatic->gender = $obj->gender; + + // Author + if (!empty($arrayfields['u.login']['checked'])) { + print ''; + if ($userstatic->id) { + print $userstatic->getLoginUrl(-1); + } else { + print ' '; + } + print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + if (!empty($arrayfields['dynamount_payed']['checked'])) { + print ''.(!empty($totalpay) ?price($totalpay, 0, $langs) : '').''; // TODO Use a denormalized field + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'totalam'; + } + $totalarray['val']['totalam'] += $totalpay; + } + + if (!empty($arrayfields['rtp']['checked'])) { + print ''.(!empty($remaintopay) ?price($remaintopay, 0, $langs) : ' ').''; // TODO Use a denormalized field + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'rtp'; + } + $totalarray['val']['rtp'] += $remaintopay; + } + + // Currency + if (!empty($arrayfields['f.multicurrency_code']['checked'])) { + print ''.$obj->multicurrency_code.' - '.$langs->trans('Currency'.$obj->multicurrency_code)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Currency rate + if (!empty($arrayfields['f.multicurrency_tx']['checked'])) { + print ''; + $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$obj->rowid, $obj->multicurrency_tx, 'none', $obj->multicurrency_code); + print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount HT + if (!empty($arrayfields['f.multicurrency_total_ht']['checked'])) { + print ''.price($obj->multicurrency_total_ht)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount VAT + if (!empty($arrayfields['f.multicurrency_total_vat']['checked'])) { + print ''.price($obj->multicurrency_total_vat)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount TTC + if (!empty($arrayfields['f.multicurrency_total_ttc']['checked'])) { + print ''.price($obj->multicurrency_total_ttc)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + if (!empty($arrayfields['multicurrency_dynamount_payed']['checked'])) { + print ''.(!empty($multicurrency_totalpay) ?price($multicurrency_totalpay, 0, $langs) : '').''; // TODO Use a denormalized field + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Pending amount + if (!empty($arrayfields['multicurrency_rtp']['checked'])) { + print ''; + print (!empty($multicurrency_remaintopay) ? price($multicurrency_remaintopay, 0, $langs) : ''); + print ''; // TODO Use a denormalized field + if (!$i) { + $totalarray['nbfield']++; + } + } + + + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + + // Date creation + if (!empty($arrayfields['f.datec']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Date modification + if (!empty($arrayfields['f.tms']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Status + if (!empty($arrayfields['f.fk_statut']['checked'])) { + print ''; + print $facturestatic->LibStatut($obj->paye, $obj->fk_statut, 5, $paiement, $obj->type); + print ""; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Action column + if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->facid, $arrayofselected)) { + $selected = 1; + } + print ''; + } + print ''; + } + if (!$i) { + $totalarray['nbfield']++; + } + + print "\n"; + } $i++; } From 7f96c642f1c610df3f7578bc60bc2da00e079ee8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Jan 2023 14:09:20 +0100 Subject: [PATCH 0694/1128] Doc --- .../mysql/tables/llx_societe_account.sql | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/htdocs/install/mysql/tables/llx_societe_account.sql b/htdocs/install/mysql/tables/llx_societe_account.sql index b200d4f3854..56eb4eb1985 100644 --- a/htdocs/install/mysql/tables/llx_societe_account.sql +++ b/htdocs/install/mysql/tables/llx_societe_account.sql @@ -1,4 +1,4 @@ --- Copyright (C) 2016 Laurent Destailleur +-- Copyright (C) 2016-2022 Laurent Destailleur -- -- 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 @@ -19,16 +19,17 @@ CREATE TABLE llx_societe_account( -- BEGIN MODULEBUILDER FIELDS rowid integer AUTO_INCREMENT PRIMARY KEY NOT NULL, - entity integer DEFAULT 1, - login varchar(128) NOT NULL, + entity integer DEFAULT 1, + + login varchar(128) NOT NULL, -- a login string into website or external system pass_encoding varchar(24), - pass_crypted varchar(128), + pass_crypted varchar(128), -- the hashed password pass_temp varchar(128), -- temporary password when asked for forget password - fk_soc integer, - fk_website integer, -- id of local web site - site varchar(128), -- name of external web site - site_account varchar(128), -- a key to identify the account on external web site - key_account varchar(128), -- the id of third party in external web site (for site_account if site_account defined) + fk_soc integer, -- if entry is linked to a thirdparty + fk_website integer, -- id of local web site (if dk_website is filled, site is empty) + site varchar(128), -- name of external web site (if site is filled, fk_website is empty) + site_account varchar(128), -- a key to identify the account on external web site (for example: 'stripe', 'paypal', 'myextapp') + key_account varchar(128), -- the id of an account in external web site (for site_account if site_account defined. some sites needs both an account name and a login that is different) note_private text, date_last_login datetime, date_previous_login datetime, From 0601db1c7a3d5973c8c84dfa17c270d1256c49ed Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Jan 2023 14:19:12 +0100 Subject: [PATCH 0695/1128] Doc --- htdocs/societe/societecontact.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/societe/societecontact.php b/htdocs/societe/societecontact.php index 1767973a001..f626139abcb 100644 --- a/htdocs/societe/societecontact.php +++ b/htdocs/societe/societecontact.php @@ -23,7 +23,7 @@ /** * \file htdocs/societe/societecontact.php * \ingroup societe - * \brief Onglet de gestion des contacts additionnel d'une société + * \brief Tab to manage differently contact. Used when unstable feature MAIN_SUPPORT_SHARED_CONTACT_BETWEEN_THIRDPARTIES is on. */ From 7dea3cca50681f5d96d9a942d96166c1a931487c Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Tue, 10 Jan 2023 14:40:06 +0100 Subject: [PATCH 0696/1128] kanban for list of Donnation --- htdocs/don/class/don.class.php | 35 ++++++++++++ htdocs/don/list.php | 97 +++++++++++++++++++++++----------- 2 files changed, 101 insertions(+), 31 deletions(-) diff --git a/htdocs/don/class/don.class.php b/htdocs/don/class/don.class.php index 333f9673175..9c80cb85dad 100644 --- a/htdocs/don/class/don.class.php +++ b/htdocs/don/class/don.class.php @@ -1141,4 +1141,39 @@ class Don extends CommonObject return (float) $this->amount - $sum_amount; } } + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $langs; + + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(1) : $this->ref).''; + if (property_exists($this, 'date')) { + $return .= ' | '.$langs->trans("Date").' : '.dol_print_date($this->date).''; + } + if (property_exists($this, 'societe') && !empty($this->societe)) { + $return .= '
'.$langs->trans("Company").' : '.$this->societe.''; + } + if (property_exists($this, 'amount')) { + $return .= '
'.$langs->trans("Amount").' : '.price($this->amount).''; + } + if (method_exists($this, 'LibStatut')) { + $return .= '
'.$this->LibStatut($this->labelStatus, 5).'
'; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } diff --git a/htdocs/don/list.php b/htdocs/don/list.php index ac704571daa..469ebbef6a9 100644 --- a/htdocs/don/list.php +++ b/htdocs/don/list.php @@ -42,6 +42,7 @@ $sortfield = GETPOST('sortfield', 'aZ09comma'); $sortorder = GETPOST('sortorder', 'aZ09comma'); $page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int'); $type = GETPOST('type', 'aZ'); +$mode = GETPOST('mode', 'alpha'); if (empty($page) || $page == -1) { $page = 0; } // If $page is not defined, or '' or -1 @@ -153,6 +154,9 @@ if ($resql) { $i = 0; $param = ''; + if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); + } if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -179,6 +183,8 @@ if ($resql) { } $newcardbutton = ''; + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); if ($user->rights->don->creer) { $newcardbutton .= dolGetButtonTitle($langs->trans('NewDonation'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/don/card.php?action=create'); } @@ -193,6 +199,9 @@ if ($resql) { print ''; print ''; print ''; + print ''; + + print_barre_liste($langs->trans("Donations"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'object_donation', 0, $newcardbutton, '', $limit, 0, 0, 1); @@ -267,44 +276,70 @@ if ($resql) { while ($i < min($num, $limit)) { $objp = $db->fetch_object($resql); + $donationstatic->setVarsFromFetchObj($objp); + $company = new Societe($db); + $result = $company->fetch($objp->socid); + + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + print '
'; + } + // Output Kanban + $donationstatic->amount = $objp->amount; + $donationstatic->date = $objp->datedon; + $donationstatic->labelStatus = $objp->status; + $donationstatic->id = $objp->rowid; + $donationstatic->ref = $objp->rowid; - print ''; - $donationstatic->id = $objp->rowid; - $donationstatic->ref = $objp->rowid; - $donationstatic->lastname = $objp->lastname; - $donationstatic->firstname = $objp->firstname; - print "".$donationstatic->getNomUrl(1).""; - if (!empty($conf->global->DONATION_USE_THIRDPARTIES)) { - $company = new Societe($db); - $result = $company->fetch($objp->socid); if (!empty($objp->socid) && $company->id > 0) { - print "".$company->getNomUrl(1).""; + $donationstatic->societe = $company->getNomUrl(1); + } else { + $donationstatic->societe = $objp->societe; + } + + print $donationstatic->getKanbanView(''); + if ($i == (min($num, $limit) - 1)) { + print '
'; + print ''; + } + } else { + print ''; + $donationstatic->id = $objp->rowid; + $donationstatic->ref = $objp->rowid; + $donationstatic->lastname = $objp->lastname; + $donationstatic->firstname = $objp->firstname; + print "".$donationstatic->getNomUrl(1).""; + if (!empty($conf->global->DONATION_USE_THIRDPARTIES)) { + if (!empty($objp->socid) && $company->id > 0) { + print "".$company->getNomUrl(1).""; + } else { + print "".$objp->societe.""; + } } else { print "".$objp->societe.""; } - } else { - print "".$objp->societe.""; - } - print "".$donationstatic->getFullName($langs).""; - print ''.dol_print_date($db->jdate($objp->datedon), 'day').''; - if (isModEnabled('project')) { - print ""; - if ($objp->pid) { - $projectstatic->id = $objp->pid; - $projectstatic->ref = $objp->ref; - $projectstatic->id = $objp->pid; - $projectstatic->public = $objp->public; - $projectstatic->title = $objp->title; - print $projectstatic->getNomUrl(1); - } else { - print ' '; + print "".$donationstatic->getFullName($langs).""; + print ''.dol_print_date($db->jdate($objp->datedon), 'day').''; + if (isModEnabled('project')) { + print ""; + if ($objp->pid) { + $projectstatic->id = $objp->pid; + $projectstatic->ref = $objp->ref; + $projectstatic->id = $objp->pid; + $projectstatic->public = $objp->public; + $projectstatic->title = $objp->title; + print $projectstatic->getNomUrl(1); + } else { + print ' '; + } + print "\n"; } - print "\n"; + print ''.price($objp->amount).''; + print ''.$donationstatic->LibStatut($objp->status, 5).''; + print ''; + print ""; } - print ''.price($objp->amount).''; - print ''.$donationstatic->LibStatut($objp->status, 5).''; - print ''; - print ""; $i++; } print ""; From 8e53013bd97062dbc334032402e563d36ccb6679 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Tue, 10 Jan 2023 15:36:14 +0100 Subject: [PATCH 0697/1128] kanban mode for list of TVA --- htdocs/compta/tva/class/tva.class.php | 35 +++++ htdocs/compta/tva/list.php | 209 ++++++++++++++------------ 2 files changed, 152 insertions(+), 92 deletions(-) diff --git a/htdocs/compta/tva/class/tva.class.php b/htdocs/compta/tva/class/tva.class.php index dffba34d59b..78fb178ff27 100644 --- a/htdocs/compta/tva/class/tva.class.php +++ b/htdocs/compta/tva/class/tva.class.php @@ -906,4 +906,39 @@ class Tva extends CommonObject return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statusType, $mode); } + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $langs; + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + //$return .= ''; // Can be image + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(1) : $this->ref).''; + if (property_exists($this, 'amount')) { + $return .= ' | '.$langs->trans("Amount").' : '.price($this->amount).''; + } + if (property_exists($this, 'type_payment')) { + $return .= '
'.$langs->trans("Payement").' : '.$this->type_payment.''; + } + if (property_exists($this, 'datev')) { + $return .= '
'.$langs->trans("DateEnd").' : '.dol_print_date($this->datev).''; + } + if (method_exists($this, 'LibStatut')) { + $return .= '
'.$this->LibStatut($this->paiementtype, 5, $this->alreadypaid).'
'; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } diff --git a/htdocs/compta/tva/list.php b/htdocs/compta/tva/list.php index 1c70cf93c22..e0d5e094c35 100644 --- a/htdocs/compta/tva/list.php +++ b/htdocs/compta/tva/list.php @@ -44,6 +44,7 @@ $massaction = GETPOST('massaction', 'alpha'); $confirm = GETPOST('confirm', 'alpha'); $optioncss = GETPOST('optioncss', 'alpha'); $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'salestaxeslist'; +$mode = GETPOST('mode', 'alpha'); $search_ref = GETPOST('search_ref', 'alpha'); $search_label = GETPOST('search_label', 'alpha'); @@ -230,6 +231,9 @@ if (!$resql) { $num = $db->num_rows($resql); $param = ''; +if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); +} if (!empty($contextpage) && $contextpage != $_SERVER['PHP_SELF']) { $param .= '&contextpage='.$contextpage; } @@ -317,7 +321,10 @@ $url = DOL_URL_ROOT.'/compta/tva/card.php?action=create'; if (!empty($socid)) { $url .= '&socid='.$socid; } -$newcardbutton = dolGetButtonTitle($langs->trans('NewVATPayment'), '', 'fa fa-plus-circle', $url, '', $user->rights->tax->charges->creer); +$newcardbutton = ''; +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('NewVATPayment'), '', 'fa fa-plus-circle', $url, '', $user->rights->tax->charges->creer); print_barre_liste($langs->trans("VATDeclarations"), $page, $_SERVER['PHP_SELF'], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_accountancy', 0, $newcardbutton, '', $limit, 0, 0, 1); $varpage = empty($contextpage) ? $_SERVER['PHP_SELF'] : $contextpage; @@ -461,116 +468,134 @@ while ($i < min($num, $limit)) { $tva_static->id = $obj->rowid; $tva_static->ref = $obj->rowid; $tva_static->label = $obj->label; + $tva_static->paiementtype = $obj->paye; + $tva_static->type_payment = $obj->payment_code; + $tva_static->datev = $obj->datev; + $tva_static->amount = $obj->amount; - print ''; - - // No - if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER_IN_LIST)) { - print ''.(($offset * $limit) + $i).''; - if (!$i) { - $totalarray['nbfield']++; + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + print '
'; } - } + // Output Kanban - // Ref - if (!empty($arrayfields['t.rowid']['checked'])) { - print ''; - print $tva_static->getNomUrl(1); - $filename = dol_sanitizeFileName($tva_static->ref); - $filedir = $conf->tax->dir_output.'/vat/'.dol_sanitizeFileName($tva_static->ref); - $urlsource = $_SERVER['PHP_SELF'].'?id='.$tva_static->id; - print $formfile->getDocumentsLink($tva_static->element, $filename, $filedir, '', 'valignmiddle paddingleft2imp'); - print ''; - if (!$i) { - $totalarray['nbfield']++; + print $tva_static->getKanbanView(''); + if ($i == (min($num, $limit) - 1)) { + print '
'; + print ''; } - } + } else { + print ''; - // Label - if (!empty($arrayfields['t.label']['checked'])) { - print ''.dol_trunc($obj->label, 40).''; - if (!$i) { - $totalarray['nbfield']++; + // No + if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER_IN_LIST)) { + print ''.(($offset * $limit) + $i).''; + if (!$i) { + $totalarray['nbfield']++; + } } - } - // Date end period - if (!empty($arrayfields['t.datev']['checked'])) { - print ''.dol_print_date($db->jdate($obj->datev), 'day').''; - if (!$i) { - $totalarray['nbfield']++; + // Ref + if (!empty($arrayfields['t.rowid']['checked'])) { + print ''; + print $tva_static->getNomUrl(1); + $filename = dol_sanitizeFileName($tva_static->ref); + $filedir = $conf->tax->dir_output.'/vat/'.dol_sanitizeFileName($tva_static->ref); + $urlsource = $_SERVER['PHP_SELF'].'?id='.$tva_static->id; + print $formfile->getDocumentsLink($tva_static->element, $filename, $filedir, '', 'valignmiddle paddingleft2imp'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } - } - // Date payment - /*if (!empty($arrayfields['t.datep']['checked'])) { - print ''.dol_print_date($db->jdate($obj->datep), 'day').''; - if (!$i) $totalarray['nbfield']++; - }*/ - - // Type - if (!empty($arrayfields['t.fk_typepayment']['checked'])) { - print ''; - if (!empty($obj->payment_code)) print $langs->trans("PaymentTypeShort".$obj->payment_code); - print ''; - if (!$i) { - $totalarray['nbfield']++; + // Label + if (!empty($arrayfields['t.label']['checked'])) { + print ''.dol_trunc($obj->label, 40).''; + if (!$i) { + $totalarray['nbfield']++; + } } - } - // Account - if (!empty($arrayfields['t.fk_account']['checked'])) { - print ''; - if ($obj->fk_account > 0) { - $bankstatic->id = $obj->fk_account; - $bankstatic->ref = $obj->bref; - $bankstatic->number = $obj->bnumber; - $bankstatic->iban = $obj->iban; - $bankstatic->bic = $obj->bic; - $bankstatic->currency_code = $langs->trans("Currency".$obj->currency_code); - $bankstatic->account_number = $obj->account_number; - $bankstatic->clos = $obj->clos; - - //$accountingjournal->fetch($obj->fk_accountancy_journal); - //$bankstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1, '', 1); - - $bankstatic->label = $obj->blabel; - print $bankstatic->getNomUrl(1); + // Date end period + if (!empty($arrayfields['t.datev']['checked'])) { + print ''.dol_print_date($db->jdate($obj->datev), 'day').''; + if (!$i) { + $totalarray['nbfield']++; + } } - print ''; - if (!$i) $totalarray['nbfield']++; - } - // Amount - if (!empty($arrayfields['t.amount']['checked'])) { - $total = $total + $obj->amount; - print '' . price($obj->amount) . ''; - if (!$i) { - $totalarray['nbfield']++; - } - $totalarray['pos'][$totalarray['nbfield']] = 'amount'; - if (empty($totalarray['val']['amount'])) { - $totalarray['val']['amount'] = $obj->amount; - } else { - $totalarray['val']['amount'] += $obj->amount; - } - } + // Date payment + /*if (!empty($arrayfields['t.datep']['checked'])) { + print ''.dol_print_date($db->jdate($obj->datep), 'day').''; + if (!$i) $totalarray['nbfield']++; + }*/ - if (!empty($arrayfields['t.status']['checked'])) { - print '' . $tva_static->LibStatut($obj->paye, 5, $obj->alreadypayed) . ''; - if (!$i) { - $totalarray['nbfield']++; + // Type + if (!empty($arrayfields['t.fk_typepayment']['checked'])) { + print ''; + if (!empty($obj->payment_code)) print $langs->trans("PaymentTypeShort".$obj->payment_code); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } } + + // Account + if (!empty($arrayfields['t.fk_account']['checked'])) { + print ''; + if ($obj->fk_account > 0) { + $bankstatic->id = $obj->fk_account; + $bankstatic->ref = $obj->bref; + $bankstatic->number = $obj->bnumber; + $bankstatic->iban = $obj->iban; + $bankstatic->bic = $obj->bic; + $bankstatic->currency_code = $langs->trans("Currency".$obj->currency_code); + $bankstatic->account_number = $obj->account_number; + $bankstatic->clos = $obj->clos; + + //$accountingjournal->fetch($obj->fk_accountancy_journal); + //$bankstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1, '', 1); + + $bankstatic->label = $obj->blabel; + print $bankstatic->getNomUrl(1); + } + print ''; + if (!$i) $totalarray['nbfield']++; + } + + // Amount if (!empty($arrayfields['t.amount']['checked'])) { - $totalarray['pos'][$totalarray['nbfield']] = ''; + $total = $total + $obj->amount; + print '' . price($obj->amount) . ''; + if (!$i) { + $totalarray['nbfield']++; + } + $totalarray['pos'][$totalarray['nbfield']] = 'amount'; + if (empty($totalarray['val']['amount'])) { + $totalarray['val']['amount'] = $obj->amount; + } else { + $totalarray['val']['amount'] += $obj->amount; + } } + + if (!empty($arrayfields['t.status']['checked'])) { + print '' . $tva_static->LibStatut($obj->paye, 5, $obj->alreadypayed) . ''; + if (!$i) { + $totalarray['nbfield']++; + } + if (!empty($arrayfields['t.amount']['checked'])) { + $totalarray['pos'][$totalarray['nbfield']] = ''; + } + } + + // Buttons + print ''; + + print ''; } - // Buttons - print ''; - - print ''; - $i++; } From 8238d1df97fa3ef054798f3e97baa3e6887b0697 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Tue, 10 Jan 2023 16:17:16 +0100 Subject: [PATCH 0698/1128] kanban mode for list charge social --- .../sociales/class/chargesociales.class.php | 34 ++ htdocs/compta/sociales/list.php | 306 ++++++++++-------- 2 files changed, 200 insertions(+), 140 deletions(-) diff --git a/htdocs/compta/sociales/class/chargesociales.class.php b/htdocs/compta/sociales/class/chargesociales.class.php index 37b3540a0f5..b5e98b3b62e 100644 --- a/htdocs/compta/sociales/class/chargesociales.class.php +++ b/htdocs/compta/sociales/class/chargesociales.class.php @@ -749,4 +749,38 @@ class ChargeSociales extends CommonObject $this->type = 1; $this->type_label = 'Type of social contribution'; } + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $langs; + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(1) : $this->ref).''; + if (property_exists($this, 'fk_project') && !empty($this->fk_project)) { + $return .= ' | '.$this->fk_project.''; + } + if (property_exists($this, 'date_ech')) { + $return .= '
'.$langs->trans("DateEnd").':'.dol_print_date($this->date_ech).''; + } + if (property_exists($this, 'amount')) { + $return .= '
'.$langs->trans("Amount").' : '.price($this->amount).''; + } + if (method_exists($this, 'LibStatut')) { + $return .= '
'.$this->LibStatut($this->paye, 5, $this->alreadypaid).'
'; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } diff --git a/htdocs/compta/sociales/list.php b/htdocs/compta/sociales/list.php index f70ed44de0c..18a67ff9e29 100644 --- a/htdocs/compta/sociales/list.php +++ b/htdocs/compta/sociales/list.php @@ -47,6 +47,8 @@ $massaction = GETPOST('massaction', 'alpha'); $confirm = GETPOST('confirm', 'alpha'); $optioncss = GETPOST('optioncss', 'alpha'); $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'sclist'; +$mode = GETPOST('mode', 'alpha'); + $search_ref = GETPOST('search_ref', 'int'); $search_label = GETPOST('search_label', 'alpha'); @@ -294,6 +296,9 @@ $num = $db->num_rows($resql); $i = 0; $param = ''; +if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); +} if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -367,6 +372,8 @@ if ($search_date_limit_endyear) { } $newcardbutton = ''; +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); if ($user->rights->tax->charges->creer) { $newcardbutton .= dolGetButtonTitle($langs->trans('MenuNewSocialContribution'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/compta/sociales/card.php?action=create'); } @@ -382,6 +389,8 @@ print ''; print ''; print ''; print ''; +print ''; + $center = ''; @@ -576,162 +585,179 @@ while ($i < min($num, $limit)) { $chargesociale_static->ref = $obj->rowid; $chargesociale_static->label = $obj->label; $chargesociale_static->type_label = $obj->type_label; + $chargesociale_static->amount = $obj->amount; + $chargesociale_static->paye = $obj->paye; + $chargesociale_static->date_ech = $obj->date_ech; + if (isModEnabled('project')) { $projectstatic->id = $obj->project_id; $projectstatic->ref = $obj->project_ref; $projectstatic->title = $obj->project_label; } - - print ''; - - // Line number - if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER_IN_LIST)) { - print ''.(($offset * $limit) + $i).''; - if (!$i) { - $totalarray['nbfield']++; + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + print '
'; } - } + // Output Kanban - // Ref - if (!empty($arrayfields['cs.rowid']['checked'])) { - print ''.$chargesociale_static->getNomUrl(1, '20').''; - if (!$i) { - $totalarray['nbfield']++; + $chargesociale_static->fk_project = $projectstatic->getNomUrl(); + print $chargesociale_static->getKanbanView(''); + if ($i == (min($num, $limit) - 1)) { + print '
'; + print ''; } - } + } else { + print ''; - // Label - if (!empty($arrayfields['cs.libelle']['checked'])) { - print ''.dol_escape_htmltag($obj->label).''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Type - if (!empty($arrayfields['cs.fk_type']['checked'])) { - $typelabeltoshow = $obj->type_label; - $typelabelpopup = $obj->type_label; - if (isModEnabled('accounting')) { - $typelabelpopup .= ' - '.$langs->trans("AccountancyCode").': '.$obj->type_accountancy_code; - } - print ''.dol_escape_htmltag($typelabeltoshow).''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Date - if (!empty($arrayfields['cs.date_ech']['checked'])) { - print ''.dol_print_date($db->jdate($obj->date_ech), 'day').''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Date end period - if (!empty($arrayfields['cs.periode']['checked'])) { - print ''.dol_print_date($db->jdate($obj->periode), 'day').''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Project ref - if (!empty($arrayfields['p.ref']['checked'])) { - print ''; - if ($obj->project_id > 0) { - print $projectstatic->getNomUrl(1); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - if (!empty($arrayfields['cs.fk_user']['checked'])) { - // Employee - print ''; - if (!empty($obj->fk_user)) { - if (!empty($TLoadedUsers[$obj->fk_user])) { - $ustatic = $TLoadedUsers[$obj->fk_user]; - } else { - $ustatic = new User($db); - $ustatic->fetch($obj->fk_user); - $TLoadedUsers[$obj->fk_user] = $ustatic; + // Line number + if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER_IN_LIST)) { + print ''.(($offset * $limit) + $i).''; + if (!$i) { + $totalarray['nbfield']++; } - print $ustatic->getNomUrl(-1); } - print "\n"; + + // Ref + if (!empty($arrayfields['cs.rowid']['checked'])) { + print ''.$chargesociale_static->getNomUrl(1, '20').''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Label + if (!empty($arrayfields['cs.libelle']['checked'])) { + print ''.dol_escape_htmltag($obj->label).''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Type + if (!empty($arrayfields['cs.fk_type']['checked'])) { + $typelabeltoshow = $obj->type_label; + $typelabelpopup = $obj->type_label; + if (isModEnabled('accounting')) { + $typelabelpopup .= ' - '.$langs->trans("AccountancyCode").': '.$obj->type_accountancy_code; + } + print ''.dol_escape_htmltag($typelabeltoshow).''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Date + if (!empty($arrayfields['cs.date_ech']['checked'])) { + print ''.dol_print_date($db->jdate($obj->date_ech), 'day').''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Date end period + if (!empty($arrayfields['cs.periode']['checked'])) { + print ''.dol_print_date($db->jdate($obj->periode), 'day').''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Project ref + if (!empty($arrayfields['p.ref']['checked'])) { + print ''; + if ($obj->project_id > 0) { + print $projectstatic->getNomUrl(1); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + if (!empty($arrayfields['cs.fk_user']['checked'])) { + // Employee + print ''; + if (!empty($obj->fk_user)) { + if (!empty($TLoadedUsers[$obj->fk_user])) { + $ustatic = $TLoadedUsers[$obj->fk_user]; + } else { + $ustatic = new User($db); + $ustatic->fetch($obj->fk_user); + $TLoadedUsers[$obj->fk_user] = $ustatic; + } + print $ustatic->getNomUrl(-1); + } + print "\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Type + if (!empty($arrayfields['cs.fk_mode_reglement']['checked'])) { + print 'payment_code)).'">'; + if (!empty($obj->payment_code)) { + print $langs->trans("PaymentTypeShort".$obj->payment_code); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Account + if (!empty($arrayfields['cs.fk_account']['checked'])) { + print ''; + if ($obj->fk_account > 0) { + $bankstatic->id = $obj->fk_account; + $bankstatic->ref = $obj->bref; + $bankstatic->number = $obj->bnumber; + $bankstatic->iban = $obj->iban; + $bankstatic->bic = $obj->bic; + $bankstatic->currency_code = $langs->trans("Currency".$obj->currency_code); + $bankstatic->account_number = $obj->account_number; + $bankstatic->clos = $obj->clos; + + //$accountingjournal->fetch($obj->fk_accountancy_journal); + //$bankstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1, '', 1); + + $bankstatic->label = $obj->blabel; + print $bankstatic->getNomUrl(1); + } + print ''; + if (!$i) $totalarray['nbfield']++; + } + + // Amount + if (!empty($arrayfields['cs.amount']['checked'])) { + print ''.price($obj->amount).''; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'totalttcfield'; + } + $totalarray['val']['totalttcfield'] += $obj->amount; + } + + // Status + if (!empty($arrayfields['cs.paye']['checked'])) { + print ''.$chargesociale_static->LibStatut($obj->paye, 5, $obj->alreadypayed).''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Buttons + print ''; if (!$i) { $totalarray['nbfield']++; } + + print ''."\n"; } - - // Type - if (!empty($arrayfields['cs.fk_mode_reglement']['checked'])) { - print 'payment_code)).'">'; - if (!empty($obj->payment_code)) { - print $langs->trans("PaymentTypeShort".$obj->payment_code); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Account - if (!empty($arrayfields['cs.fk_account']['checked'])) { - print ''; - if ($obj->fk_account > 0) { - $bankstatic->id = $obj->fk_account; - $bankstatic->ref = $obj->bref; - $bankstatic->number = $obj->bnumber; - $bankstatic->iban = $obj->iban; - $bankstatic->bic = $obj->bic; - $bankstatic->currency_code = $langs->trans("Currency".$obj->currency_code); - $bankstatic->account_number = $obj->account_number; - $bankstatic->clos = $obj->clos; - - //$accountingjournal->fetch($obj->fk_accountancy_journal); - //$bankstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1, '', 1); - - $bankstatic->label = $obj->blabel; - print $bankstatic->getNomUrl(1); - } - print ''; - if (!$i) $totalarray['nbfield']++; - } - - // Amount - if (!empty($arrayfields['cs.amount']['checked'])) { - print ''.price($obj->amount).''; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'totalttcfield'; - } - $totalarray['val']['totalttcfield'] += $obj->amount; - } - - // Status - if (!empty($arrayfields['cs.paye']['checked'])) { - print ''.$chargesociale_static->LibStatut($obj->paye, 5, $obj->alreadypayed).''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Buttons - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - - print ''."\n"; - $i++; } From d1e7e527ba63d2edea7b50689e5090dad2b8bfa4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Jan 2023 16:31:12 +0100 Subject: [PATCH 0699/1128] Debug virtual card --- htdocs/core/class/vcard.class.php | 226 ++++++++++++++++++++---------- htdocs/public/users/view.php | 106 +++++++++----- htdocs/user/virtualcard.php | 8 ++ 3 files changed, 230 insertions(+), 110 deletions(-) diff --git a/htdocs/core/class/vcard.class.php b/htdocs/core/class/vcard.class.php index 8a62c0aea5e..0e9372360e6 100644 --- a/htdocs/core/class/vcard.class.php +++ b/htdocs/core/class/vcard.class.php @@ -117,22 +117,25 @@ class vCard if ($type != "") { $key .= ";".$type; } - $key .= ";".$this->encoding; - $this->properties[$key] = 'VALUE=uri:tel:'.encode($number); + $key .= ";VALUE=uri"; + //$key .= ";".$this->encoding; + $this->properties[$key] = 'tel:'.$number; } /** * mise en forme de la photo * warning NON TESTE ! * - * @param string $type Type 'image/gif' + * @param string $type Type 'image/jpeg' or 'JPEG' * @param string $photo Photo * @return void */ public function setPhoto($type, $photo) { // $type = "GIF" | "JPEG" - $this->properties["PHOTO;MEDIATYPE=$type;ENCODING=BASE64"] = base64_encode($photo); + //$this->properties["PHOTO;MEDIATYPE=$type;ENCODING=BASE64"] = base64_encode($photo); + $this->properties["PHOTO;MEDIATYPE=$type"] = $photo; // must be url of photo + //$this->properties["PHOTO;TYPE=$type;ENCODING=BASE64"] = base64_encode($photo); // must be content of image } /** @@ -152,13 +155,14 @@ class vCard * @param string $family Family name * @param string $first First name * @param string $additional Additional (e.g. second name, nick name) - * @param string $prefix Prefix (e.g. "Mr.", "Ms.", "Prof.") + * @param string $prefix Title prefix (e.g. "Mr.", "Ms.", "Prof.") * @param string $suffix Suffix (e.g. "sen." for senior, "jun." for junior) * @return void */ public function setName($family = "", $first = "", $additional = "", $prefix = "", $suffix = "") { - $this->properties["N;".$this->encoding] = encode($family).";".encode($first).";".encode($additional).";".encode($prefix).";".encode($suffix); + //$this->properties["N;".$this->encoding] = encode($family).";".encode($first).";".encode($additional).";".encode($prefix).";".encode($suffix); + $this->properties["N"] = encode($family).";".encode($first).";".encode($additional).";".encode($prefix).";".encode($suffix); $this->filename = "$first%20$family.vcf"; if (empty($this->properties["FN"])) { $this->setFormattedName(trim("$prefix $first $additional $family $suffix")); @@ -173,8 +177,9 @@ class vCard */ public function setBirthday($date) { - // $date format is YYYY-MM-DD - RFC 2425 and RFC 2426 - $this->properties["BDAY"] = dol_print_date($date, 'dayrfc'); + // $date format is YYYY-MM-DD - RFC 2425 and RFC 2426 for vcard v3 + // $date format is YYYYMMDD or ISO8601 for vcard v4 + $this->properties["BDAY"] = dol_print_date($date, 'dayxcard'); } /** @@ -309,7 +314,7 @@ class vCard */ public function setProdId($prodid) { - $this->properties["PRODID;".$this->encoding] = encode($prodid); + $this->properties["PRODID"] = encode($prodid); } @@ -321,7 +326,7 @@ class vCard */ public function setUID($uid) { - $this->properties["UID;".$this->encoding] = encode($uid); + $this->properties["UID"] = encode($uid); } @@ -355,7 +360,7 @@ class vCard foreach ($this->properties as $key => $value) { $text .= $key.":".$value."\r\n"; } - $text .= "REV:".date("Y-m-d")."T".date("H:i:s")."Z\r\n"; + $text .= "REV:".date("Ymd")."T".date("His")."Z\r\n"; //$text .= "MAILER: Dolibarr\r\n"; $text .= "END:VCARD\r\n"; return $text; @@ -374,12 +379,13 @@ class vCard /** * Return a VCARD string * - * @param Object $object Object (User, Contact) - * @param Societe $company Company - * @param Translate $langs Lang object - * @return string String + * @param Object $object Object (User or Contact) + * @param Societe|null $company Company. May be null + * @param Translate $langs Lang object + * @param string $urlphoto Full public URL of photo + * @return string String */ - public function buildVCardString($object, $company, $langs) + public function buildVCardString($object, $company, $langs, $urlphoto = '') { global $dolibarr_main_instance_unique_id; @@ -389,70 +395,136 @@ class vCard $this->setName($object->lastname, $object->firstname, "", $object->civility_code, ""); $this->setFormattedName($object->getFullName($langs, 1)); - $this->setPhoneNumber($object->office_phone, "TYPE=WORK,VOICE"); - $this->setPhoneNumber($object->personal_mobile, "TYPE=HOME,VOICE"); - $this->setPhoneNumber($object->user_mobile, "TYPE=CELL,VOICE"); - $this->setPhoneNumber($object->office_fax, "TYPE=WORK,FAX"); - - $country = $object->country_code ? $object->country : ''; - - $this->setAddress("", "", $object->address, $object->town, $object->state, $object->zip, $country, "TYPE=WORK"); - //$this->setLabel("", "", $object->address, $object->town, $object->state, $object->zip, $country, "TYPE=WORK"); - - $this->setEmail($object->email, "TYPE=WORK"); - $this->setNote($object->note_public); - $this->setTitle($object->job); - - // For user, type=home - // For contact, this is not defined - $this->setURL($object->url, "TYPE=HOME"); - - if (is_object($company)) { - $this->setURL($company->url, "TYPE=WORK"); - - if (!$object->office_phone) { - $this->setPhoneNumber($company->phone, "TYPE=WORK,VOICE"); - } - if (!$object->office_fax) { - $this->setPhoneNumber($company->fax, "TYPE=WORK,FAX"); - } - if (!$object->zip) { - $this->setAddress("", "", $company->address, $company->town, $company->state, $company->zip, $company->country, "TYPE=WORK"); - } - - // when company e-mail is empty, use only user e-mail - if (empty(trim($company->email))) { - // was set before, don't set twice - } elseif (empty(trim($object->email))) { - // when user e-mail is empty, use only company e-mail - $this->setEmail($company->email, "TYPE=WORK"); - } else { - $tmpuser2 = explode("@", trim($object->email)); - $tmpcompany = explode("@", trim($company->email)); - - if (strtolower(end($tmpuser2)) == strtolower(end($tmpcompany))) { - // when e-mail domain of user and company are the same, use user e-mail at first (and company e-mail at second) - $this->setEmail($object->email, "TYPE=WORK"); - - // support by Microsoft Outlook (2019 and possible earlier) - $this->setEmail($company->email, ''); - } else { - // when e-mail of user and company complete different use company e-mail at first (and user e-mail at second) - $this->setEmail($company->email, "TYPE=WORK"); - - // support by Microsoft Outlook (2019 and possible earlier) - $this->setEmail($object->email, ''); - } - } - - // Si user lie a un tiers non de type "particulier" - if ($company->typent_code != 'TE_PRIVATE') { - $this->setOrg($company->name); + if ($urlphoto) { + $mimetype = dol_mimetype($urlphoto); + if ($mimetype) { + $this->setPhoto($mimetype, $urlphoto); } } - // Personal informations - $this->setPhoneNumber($object->personal_mobile, "TYPE=HOME,VOICE"); + if ($object->office_phone) { + $this->setPhoneNumber($object->office_phone, "TYPE=WORK,VOICE"); + } + /* disabled + if ($object->personal_mobile) { + $this->setPhoneNumber($object->personal_mobile, "TYPE=CELL,VOICE"); + }*/ + if ($object->user_mobile) { + $this->setPhoneNumber($object->user_mobile, "TYPE=CELL,VOICE"); + } + if ($object->office_fax) { + $this->setPhoneNumber($object->office_fax, "TYPE=WORK,FAX"); + } + + if (!empty($object->socialnetworks)) { + foreach ($object->socialnetworks as $key => $val) { + $urlsn = ''; + if ($key == 'linkedin') { + if (!preg_match('/^http/', $val)) { + $urlsn = 'https://www.'.$key.'.com/company/'.urlencode($val); + } else { + $urlsn = $val; + } + } elseif ($key == 'youtube') { + if (!preg_match('/^http/', $val)) { + $urlsn = 'https://www.'.$key.'.com/user/'.urlencode($val); + } else { + $urlsn = $val; + } + } else { + if (!preg_match('/^http/', $val)) { + $urlsn = 'https://www.'.$key.'.com/'.urlencode($val); + } else { + $urlsn = $val; + } + } + if ($urlsn) { + $this->properties["socialProfile;type=".$key] = $urlsn; + } + } + } + + $country = $object->country_code ? $object->country : ''; + + if ($object->address || $object->town || $object->state || $object->zip || $object->country) { + $this->setAddress("", "", $object->address, $object->town, $object->state, $object->zip, $country, "TYPE=WORK"); + //$this->setLabel("", "", $object->address, $object->town, $object->state, $object->zip, $country, "TYPE=HOME"); + } + + if ($object->email) { + $this->setEmail($object->email, "TYPE=WORK"); + } + /* disabled + if ($object->personal_email) { + $this->setEmail($object->personal_email, "TYPE=HOME"); + } */ + if ($object->note_public) { + $this->setNote($object->note_public); + } + if ($object->job) { + $this->setTitle($object->job); + } + + // For user, type=home + // For contact, $object->url is not defined + if ($object->url) { + $this->setURL($object->url, ""); + } + + if (is_object($company)) { + // Si user linked to a thirdparty and not a physical people + if ($company->typent_code != 'TE_PRIVATE') { + $this->setOrg($company->name); + } + + $this->setURL($company->url, ""); + + if ($company->phone && $company->phone != $object->office_phone) { + $this->setPhoneNumber($company->phone, "TYPE=WORK,VOICE"); + } + if ($company->fax && $company->fax != $object->office_fax) { + $this->setPhoneNumber($company->fax, "TYPE=WORK,FAX"); + } + if ($company->address || $company->town || $company->state || $company->zip || $company->country) { + $this->setAddress("", "", $company->address, $company->town, $company->state, $company->zip, $company->country, "TYPE=WORK"); + } + + if ($company->email && $company->email != $object->email) { + $this->setEmail($company->email, "TYPE=WORK"); + } + + /* + if (!empty($company->socialnetworks)) { + foreach ($company->socialnetworks as $key => $val) { + $urlsn = ''; + if ($key == 'linkedin') { + if (!preg_match('/^http/', $val)) { + $urlsn = 'https://www.'.$key.'.com/company/'.urlencode($val); + } else { + $urlsn = $val; + } + } elseif ($key == 'youtube') { + if (!preg_match('/^http/', $val)) { + $urlsn = 'https://www.'.$key.'.com/user/'.urlencode($val); + } else { + $urlsn = $val; + } + } else { + if (!preg_match('/^http/', $val)) { + $urlsn = 'https://www.'.$key.'.com/'.urlencode($val); + } else { + $urlsn = $val; + } + } + if ($urlsn) { + $this->properties["socialProfile;type=".$key] = $urlsn; + } + } + } + */ + } + + // Birthday if ($object->birth) { $this->setBirthday($object->birth); } diff --git a/htdocs/public/users/view.php b/htdocs/public/users/view.php index ba1a6dd0908..ec5f53377c2 100644 --- a/htdocs/public/users/view.php +++ b/htdocs/public/users/view.php @@ -91,13 +91,79 @@ if ($cancel) { */ $form = new Form($db); +$v = new vCard(); + $company = $mysoc; -if ($mode == 'vcard') { - // We create VCard - $v = new vCard(); +$modulepart = 'userphotopublic'; +$dir = $conf->user->dir_output; - $output = $v->buildVCardString($object, $company, $langs); +// Show logo (search order: logo defined by ONLINE_SIGN_LOGO_suffix, then ONLINE_SIGN_LOGO_, then small company logo, large company logo, theme logo, common logo) +// Define logo and logosmall +$logo = ''; +$logosmall = ''; +if (!empty($object->photo)) { + if (dolIsAllowedForPreview($object->photo)) { + $logosmall = get_exdir(0, 0, 0, 0, $object, 'user').'photos/'.getImageFileNameForSize($object->photo, '_small'); + $logo = get_exdir(0, 0, 0, 0, $object, 'user').'photos/'.$object->photo; + //$originalfile = get_exdir(0, 0, 0, 0, $object, 'user').'photos/'.$object->photo; + } +} +//print ''."\n"; +// Define urllogo +$urllogo = ''; +$urllogofull = ''; +if (!empty($logosmall) && is_readable($dir.'/'.$logosmall)) { + $urllogo = DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$conf->entity.'&securekey='.urlencode($securekey).'&file='.urlencode($logosmall); + $urllogofull = $dolibarr_main_url_root.'/viewimage.php?modulepart='.$modulepart.'&entity='.$conf->entity.'&securekey='.urlencode($securekey).'&file='.urlencode($logosmall); +} elseif (!empty($logo) && is_readable($dir.'/'.$logo)) { + $urllogo = DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$conf->entity.'&securekey='.urlencode($securekey).'&file='.urlencode($logo); + $urllogofull = $dolibarr_main_url_root.'/viewimage.php?modulepart='.$modulepart.'&entity='.$conf->entity.'&securekey='.urlencode($securekey).'&file='.urlencode($logo); +} + +// Clean data we don't want on public page +if (getDolUserInt('USER_PUBLIC_HIDE_PHOTO', 0, $object)) { + $logo = ''; + $logosmall = ''; + $urllogo = ''; + $urllogofull = ''; +} +if (getDolUserInt('USER_PUBLIC_HIDE_JOBPOSITION', 0, $object)) { + $object->job = ''; +} +if (getDolUserInt('USER_PUBLIC_HIDE_EMAIL', 0, $object)) { + $object->email = ''; +} +if (getDolUserInt('USER_PUBLIC_HIDE_EMAIL', 0, $object)) { + $object->job = ''; +} +if (getDolUserInt('USER_PUBLIC_HIDE_OFFICE_PHONE', 0, $object)) { + $object->office_phone = ''; +} +if (getDolUserInt('USER_PUBLIC_HIDE_OFFICE_FAX', 0, $object)) { + $object->office_fax = ''; +} +if (getDolUserInt('USER_PUBLIC_HIDE_USER_MOBILE', 0, $object)) { + $object->user_mobile = ''; +} +if (getDolUserInt('USER_PUBLIC_HIDE_BIRTH', 0, $object)) { + $object->birth = ''; +} +if (getDolUserInt('USER_PUBLIC_HIDE_SOCIALNETWORKS', 0, $object)) { + $object->socialnetworks = ''; +} +if (getDolUserInt('USER_PUBLIC_HIDE_COMPANY', 0, $object)) { + $company = null; +} + + +// Output vcard +if ($mode == 'vcard') { + // Reset data no selected for public VCard + + + // We create VCard + $output = $v->buildVCardString($object, $company, $langs, $urllogofull); $filename = trim(urldecode($v->getFileName())); // "Nom prenom.vcf" $filenameurlencoded = dol_sanitizeFileName(urlencode($filename)); @@ -147,34 +213,6 @@ print ''; print "\n"; print ''."\n"; -$modulepart = 'userphotopublic'; -$imagesize = 'small'; -$dir = $conf->user->dir_output; -$email = $object->email; - -// Show logo (search order: logo defined by ONLINE_SIGN_LOGO_suffix, then ONLINE_SIGN_LOGO_, then small company logo, large company logo, theme logo, common logo) -// Define logo and logosmall -$logo = ''; -$logosmall = ''; -if (!empty($object->photo)) { - if (dolIsAllowedForPreview($object->photo)) { - $logosmall = get_exdir(0, 0, 0, 0, $object, 'user').'photos/'.getImageFileNameForSize($object->photo, '_small'); - $logo = get_exdir(0, 0, 0, 0, $object, 'user').'photos/'.$object->photo; - //$originalfile = get_exdir(0, 0, 0, 0, $object, 'user').'photos/'.$object->photo; - } -} -//print ''."\n"; -// Define urllogo -$urllogo = ''; -$urllogofull = ''; -if (!empty($logosmall) && is_readable($conf->user->dir_output.'/'.$logosmall)) { - $urllogo = DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$conf->entity.'&securekey='.urlencode($securekey).'&file='.urlencode($logosmall); - $urllogofull = $dolibarr_main_url_root.'/viewimage.php?modulepart='.$modulepart.'&entity='.$conf->entity.'&securekey='.urlencode($securekey).'&file='.urlencode($logosmall); -} elseif (!empty($logo) && is_readable($conf->user->dir_output.'/'.$logo)) { - $urllogo = DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$conf->entity.'&securekey='.urlencode($securekey).'&file='.urlencode($logo); - $urllogofull = $dolibarr_main_url_root.'/viewimage.php?modulepart='.$modulepart.'&entity='.$conf->entity.'&securekey='.urlencode($securekey).'&file='.urlencode($logo); -} - // Output html code for logo print '
'; print '
'; @@ -211,9 +249,11 @@ $socialnetworksdict = getArrayOfSocialNetworks(); // Show barcode $showbarcode = GETPOST('nobarcode') ? 0 : 1; if ($showbarcode) { + $qrcodecontent = $output = $v->buildVCardString($object, $company, $langs); + print '
'; print '
'; - print ''; + print ''; print '
'; print '
'; } diff --git a/htdocs/user/virtualcard.php b/htdocs/user/virtualcard.php index 8d023c2c9a9..c2de7e17b06 100644 --- a/htdocs/user/virtualcard.php +++ b/htdocs/user/virtualcard.php @@ -73,6 +73,7 @@ if ($action == 'update') { $tmparray['USER_PUBLIC_HIDE_OFFICE_PHONE'] = (GETPOST('USER_PUBLIC_HIDE_OFFICE_PHONE') ? 1 : 0); $tmparray['USER_PUBLIC_HIDE_OFFICE_FAX'] = (GETPOST('USER_PUBLIC_HIDE_OFFICE_FAX') ? 1 : 0); $tmparray['USER_PUBLIC_HIDE_USER_MOBILE'] = (GETPOST('USER_PUBLIC_HIDE_USER_MOBILE') ? 1 : 0); + $tmparray['USER_PUBLIC_HIDE_BIRTH'] = (GETPOST('USER_PUBLIC_HIDE_BIRTH') ? 1 : 0); $tmparray['USER_PUBLIC_HIDE_SOCIALNETWORKS'] = (GETPOST('USER_PUBLIC_HIDE_SOCIALNETWORKS') ? 1 : 0); $tmparray['USER_PUBLIC_HIDE_COMPANY'] = (GETPOST('USER_PUBLIC_HIDE_COMPANY') ? 1 : 0); $tmparray['USER_PUBLIC_MORE'] = (GETPOST('USER_PUBLIC_MORE') ? GETPOST('USER_PUBLIC_MORE') : ''); @@ -230,6 +231,13 @@ if (getDolUserInt('USER_ENABLE_PUBLIC', 0, $object)) { print $form->selectyesno("USER_PUBLIC_HIDE_USER_MOBILE", (getDolUserInt('USER_PUBLIC_HIDE_USER_MOBILE', 0, $object) ? getDolUserInt('USER_PUBLIC_HIDE_USER_MOBILE', 0, $object) : 0), 1); print "\n"; + // User mobile + print ''; + print $langs->trans("HideOnVCard", $langs->transnoentitiesnoconv("Birthdate")); + print ''; + print $form->selectyesno("USER_PUBLIC_HIDE_BIRTH", (getDolUserInt('USER_PUBLIC_HIDE_BIRTH', 0, $object) ? getDolUserInt('USER_PUBLIC_HIDE_BIRTH', 0, $object) : 0), 1); + print "\n"; + // Social networks print ''; print $langs->trans("HideOnVCard", $langs->transnoentitiesnoconv("SocialNetworks")); From ac5a07fee803d9f9712f7c2f76c38a6e244f3ea8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Jan 2023 17:27:19 +0100 Subject: [PATCH 0700/1128] Debug v17 --- htdocs/comm/propal/card.php | 2 +- htdocs/commande/card.php | 2 +- htdocs/compta/facture/card.php | 2 +- htdocs/supplier_proposal/card.php | 2 -- .../supplier_proposal/class/supplier_proposal.class.php | 9 +++++++-- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index 7953691f11b..84e4e1bfb5e 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -938,7 +938,7 @@ if (empty($reshook)) { $prod_entry_mode = GETPOST('prod_entry_mode', 'aZ09'); if ($prod_entry_mode == 'free') { $idprod = 0; - $tva_tx = (GETPOST('tva_tx', 'alpha') ? price2num(preg_replace('/\s*\(.*\)/', '', GETPOST('tva_tx', 'alpha'))) : 0); + $tva_tx = (GETPOSTISSET('tva_tx') ? GETPOST('tva_tx', 'alpha') : 0); } else { $idprod = GETPOST('idprod', 'int'); $tva_tx = ''; diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index 135c6fc9ab9..0510f089045 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -676,7 +676,7 @@ if (empty($reshook)) { $prod_entry_mode = GETPOST('prod_entry_mode', 'aZ09'); if ($prod_entry_mode == 'free') { $idprod = 0; - $tva_tx = (GETPOST('tva_tx', 'alpha') ? price2num(preg_replace('/\s*\(.*\)/', '', GETPOST('tva_tx', 'alpha'))) : 0); + $tva_tx = (GETPOSTISSET('tva_tx') ? GETPOST('tva_tx', 'alpha') : 0); } else { $idprod = GETPOST('idprod', 'int'); $tva_tx = ''; diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index d8e235193b5..287d99fc1fb 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -2038,7 +2038,7 @@ if (empty($reshook)) { $prod_entry_mode = GETPOST('prod_entry_mode', 'aZ09'); if ($prod_entry_mode == 'free') { $idprod = 0; - $tva_tx = (GETPOST('tva_tx', 'alpha') ? price2num(preg_replace('/\s*\(.*\)/', '', GETPOST('tva_tx', 'alpha'))) : 0); + $tva_tx = (GETPOSTISSET('tva_tx') ? GETPOST('tva_tx', 'alpha') : 0); } else { $idprod = GETPOST('idprod', 'int'); $tva_tx = ''; diff --git a/htdocs/supplier_proposal/card.php b/htdocs/supplier_proposal/card.php index 4b898a75645..c9dc776c9c5 100644 --- a/htdocs/supplier_proposal/card.php +++ b/htdocs/supplier_proposal/card.php @@ -591,10 +591,8 @@ if (empty($reshook)) { $prod_entry_mode = GETPOST('prod_entry_mode', 'aZ09'); if ($prod_entry_mode == 'free') { $idprod = 0; - $tva_tx = (GETPOST('tva_tx', 'alpha') ? price2num(preg_replace('/\s*\(.*\)/', '', GETPOST('tva_tx', 'alpha'))) : 0); } else { $idprod = GETPOST('idprod', 'int'); - $tva_tx = ''; } $tva_tx = (GETPOST('tva_tx') ? GETPOST('tva_tx') : 0); // Can be '1.2' or '1.2 (CODE)' diff --git a/htdocs/supplier_proposal/class/supplier_proposal.class.php b/htdocs/supplier_proposal/class/supplier_proposal.class.php index 1f95e3de5fd..16211e7a027 100644 --- a/htdocs/supplier_proposal/class/supplier_proposal.class.php +++ b/htdocs/supplier_proposal/class/supplier_proposal.class.php @@ -2584,7 +2584,7 @@ class SupplierProposal extends CommonObject // For other object, here we call fetch_lines. But fetch_lines does not exists on supplier proposal $sql = 'SELECT pt.rowid, pt.label as custom_label, pt.description, pt.fk_product, pt.fk_remise_except,'; - $sql .= ' pt.qty, pt.tva_tx, pt.remise_percent, pt.subprice, pt.info_bits,'; + $sql .= ' pt.qty, pt.tva_tx, pt.vat_src_code, pt.remise_percent, pt.subprice, pt.info_bits,'; $sql .= ' pt.total_ht, pt.total_tva, pt.total_ttc, pt.fk_product_fournisseur_price as fk_fournprice, pt.buy_price_ht as pa_ht, pt.special_code, pt.localtax1_tx, pt.localtax2_tx,'; $sql .= ' pt.product_type, pt.rang, pt.fk_parent_line,'; $sql .= ' p.label as product_label, p.ref, p.fk_product_type, p.rowid as prodid,'; @@ -2620,6 +2620,7 @@ class SupplierProposal extends CommonObject $this->lines[$i]->fk_remise_except = $obj->fk_remise_except; $this->lines[$i]->remise_percent = $obj->remise_percent; $this->lines[$i]->tva_tx = $obj->tva_tx; + $this->lines[$i]->vat_src_code = $obj->vat_src_code; $this->lines[$i]->info_bits = $obj->info_bits; $this->lines[$i]->total_ht = $obj->total_ht; $this->lines[$i]->total_tva = $obj->total_tva; @@ -2988,6 +2989,9 @@ class SupplierProposalLine extends CommonObjectLine if (empty($this->tva_tx)) { $this->tva_tx = 0; } + if (empty($this->vat_src_code)) { + $this->vat_src_code = ''; + } if (empty($this->localtax1_tx)) { $this->localtax1_tx = 0; } @@ -3056,7 +3060,7 @@ class SupplierProposalLine extends CommonObjectLine $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'supplier_proposaldet'; $sql .= ' (fk_supplier_proposal, fk_parent_line, label, description, fk_product, product_type,'; $sql .= ' date_start, date_end,'; - $sql .= ' fk_remise_except, qty, tva_tx, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type,'; + $sql .= ' fk_remise_except, qty, tva_tx, vat_src_code, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type,'; $sql .= ' subprice, remise_percent, '; $sql .= ' info_bits, '; $sql .= ' total_ht, total_tva, total_localtax1, total_localtax2, total_ttc, fk_product_fournisseur_price, buy_price_ht, special_code, rang,'; @@ -3073,6 +3077,7 @@ class SupplierProposalLine extends CommonObjectLine $sql .= " ".($this->fk_remise_except ? ((int) $this->fk_remise_except) : "null").","; $sql .= " ".price2num($this->qty, 'MS').","; $sql .= " ".price2num($this->tva_tx).","; + $sql .= " '".$this->db->escape($this->vat_src_code)."',"; $sql .= " ".price2num($this->localtax1_tx).","; $sql .= " ".price2num($this->localtax2_tx).","; $sql .= " '".$this->db->escape($this->localtax1_type)."',"; From 83bb95f318c5039eaa584b76e2d853b76b7d617b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Jan 2023 18:50:01 +0100 Subject: [PATCH 0701/1128] Fix warning php8 --- htdocs/core/modules/propale/doc/pdf_azur.modules.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/propale/doc/pdf_azur.modules.php b/htdocs/core/modules/propale/doc/pdf_azur.modules.php index eac6e0261ee..5f637373507 100644 --- a/htdocs/core/modules/propale/doc/pdf_azur.modules.php +++ b/htdocs/core/modules/propale/doc/pdf_azur.modules.php @@ -675,10 +675,18 @@ class pdf_azur extends ModelePDFPropales // retrieve global local tax if ($localtax1_type && $localtax1ligne != 0) { - $this->localtax1[$localtax1_type][$localtax1_rate] += $localtax1ligne; + if (empty($this->localtax1[$localtax1_type][$localtax1_rate])) { + $this->localtax1[$localtax1_type][$localtax1_rate] = $localtax1ligne; + } else { + $this->localtax1[$localtax1_type][$localtax1_rate] += $localtax1ligne; + } } if ($localtax2_type && $localtax2ligne != 0) { - $this->localtax2[$localtax2_type][$localtax2_rate] += $localtax2ligne; + if (empty($this->localtax2[$localtax2_type][$localtax2_rate])) { + $this->localtax2[$localtax2_type][$localtax2_rate] = $localtax2ligne; + } else { + $this->localtax2[$localtax2_type][$localtax2_rate] += $localtax2ligne; + } } if (($object->lines[$i]->info_bits & 0x01) == 0x01) { From 153a91335e69ca058ff77bf2f3c9ab9074d28c26 Mon Sep 17 00:00:00 2001 From: UT from dolibit <45215329+dolibit-ut@users.noreply.github.com> Date: Tue, 10 Jan 2023 20:05:40 +0100 Subject: [PATCH 0702/1128] Update ChangeLog --- ChangeLog | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9ec9fb4525a..f752894b4d2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -96,18 +96,18 @@ NEW: can sort and preselected best supplier price NEW: Can use products categories to make inventory NEW: Change filter type on tickets list into a multiselect combo NEW: conf TIMESPENT_ALWAYS_UPDATE_THM, when it's on we always check current thm of user to update it in task time line -NEW: constant PROPAL_NEW_AS_SIGNED NEW: show date delivery planned on orders linked to company and product NEW: Default values in extrafields are not more limited to 255 char. NEW: display currency in takepos menu NEW: Enable online signature for interventions NEW: Encrypt all sensitive constants in llx_const -NEW: extrafield price with currency NEW: filter on reception dates (from / to) in cheque paiement card NEW: Contracts: Default template of contract is not mandatory NEW: Contracts: Manage Position (Rank) on Contract Lines NEW: EMail-Collector: add IMAP port setting NEW: EMail-Collector: add a button "Test collect" +NEW: Extrafields: field price with currency +NEW: Extrafields: support IP type in extrafields NEW: Members: default_lang for members NEW: Members: Table of membership types NEW: Members: add free membership amounts at the membership type level @@ -127,21 +127,17 @@ NEW: Website: can switch status of website and page from the website toolbar NEW: Website: Templates of websites are now directories and not zip into core repo NEW: Website: add 4 other templates in website module NEW: If we select another view list mode, we keep it -NEW: Init module bookcal NEW: Introduce dolEncrypt and dolDecrypt to be able to encrypt data in db NEW: Invoice - Add french mention on pdf when vat debit option is on NEW: invoice export : add accounting affectation NEW: label on products categories filter NEW: The link "add to bookmark" is always on top in the bookmark popup -NEW: MAIN_SEARCH_CATEGORY_PRODUCT_ON_LISTS const to show category customer filter NEW: Make module WebservicesClient deprecated. Use module WebHook instead. NEW: manage no email with thirdparties (better for GDPR) NEW: Manage VAT on all lines on purchases cycle NEW: manage virtual stock at a future date NEW: On a bank reconciled line, we can modify the bank receipt NEW: On a form to send an email, we show all emails of all contacts of object -NEW: Option PRODUCTBATCH_SHOW_WAREHOUSE_ON_SHIPMENT showing wh on PDF -NEW: Option PRODUIT_DESC_IN_FORM accept (desktop only or +smartphone) NEW: Page for mass stock transfer can be used with no source stock NEW: parent company column and filter in invoice and order list NEW: Add show "Sales rep" option for PDF @@ -168,19 +164,25 @@ NEW: skip accept/refuse process for proposals (option PROPAL_SKIP_ACCEPT_REFUSE) NEW: experimental SMTP using PhpImap allowing OAuth2 authentication (need to add option MAIN_IMAP_USE_PHPIMAP) NEW: can substitue project title in mail template NEW: Supplier order list - Add column private and public note -NEW: Support IP type in extrafields NEW: The purge of files can purge only if older than a number of seconds NEW: Update ActionComm type_code on email message ticket NEW: VAT - Admin - Add information on deadline day for submission of VAT declaration NEW: expand/collapse permissions on user permission page NEW: Add the target to select attendees of event for emailings + Option / Const for System: +NEW: Option PRODUCTBATCH_SHOW_WAREHOUSE_ON_SHIPMENT showing warehouse on PDF +NEW: Option PRODUIT_DESC_IN_FORM accept (desktop only or +smartphone) +NEW: MAIN_SEARCH_CATEGORY_PRODUCT_ON_LISTS const to show category customer filter +NEW: constant PROPAL_NEW_AS_SIGNED + Localisation: NEW: adding JAPAN Chart-of-Account and regions/departments NEW: adding NIF verification for Algeria Modules NEW: Experimental module Asset +NEW: Init module bookcal For developers or integrators: @@ -190,20 +192,26 @@ NEW: ModuleBuilder can generate code of class from an existing SQL table NEW: #20912 Add trigger to record the event of sending an email from a project NEW: #21750 Added "Get lines and Post lines from BOM" at the REST Service NEW: #22370 Modulebuilder supports 'alwayseditable' (like extrafields) -NEW: Removed completely the need for the library adodbtime -NEW: hook on agenda pages -NEW: hook to complete payment in TakePOS -NEW: hook "changeHelpURL" to modify target of the help button -NEW: hook formConfirm on action comm card -NEW: hook to modify supplier product html select -NEW: Add new hook for show virtual stock details on product stock card -NEW: Add new hooks for actioncomm NEW: conf->global->SYSLOG_FILE_ONEPERSESSION accept a string -NEW: translate for contact type API, setup/ticket API, shipping method API NEW: All ajax pages have now a top_httphead() -NEW: support multilang in Civilities API + + API: NEW: Add API for the partnership module NEW: Add "Get lines and Post lines from BOM" in the API +NEW: translate for contact type API, setup/ticket API, shipping method API +NEW: support multilang in Civilities API + + Hooks: +NEW: Actioncomm - add new hooks for actioncomm +NEW: Actioncomm - hook formConfirm on action comm card +NEW: Agenda - hook on agenda pages +NEW: Help - hook "changeHelpURL" to modify target of the help button +NEW: Product - add hook to show virtual stock details on product stock card +NEW: Product - add hook to modify supplier product html select +NEW: TakePOS - add hook to complete payment in TakePOS + + +NEW: Removed completely the need for the library adodbtime NEW: Replace fk_categories_product with categories_product in inventory NEW: Rewrite of SQL request. Removed the join on category (for filter on categ), replaced with a EXISTS/NOT From f52f18fb95da1558f516e72d0d035227418e18f2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Jan 2023 21:27:56 +0100 Subject: [PATCH 0703/1128] Fix picto edit must not be visilbe in edit mode --- htdocs/core/tpl/objectline_title.tpl.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/tpl/objectline_title.tpl.php b/htdocs/core/tpl/objectline_title.tpl.php index 7fe63613ea1..4640d710705 100644 --- a/htdocs/core/tpl/objectline_title.tpl.php +++ b/htdocs/core/tpl/objectline_title.tpl.php @@ -71,7 +71,7 @@ if (!empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) || !empty($conf->global->FA if (in_array($object->element, array('propal', 'commande', 'facture', 'supplier_proposal', 'order_supplier', 'invoice_supplier')) && $object->status == $object::STATUS_DRAFT) { global $mysoc; - if (empty($disableedit)) { + if (empty($disableedit) && GETPOST('mode', 'aZ09') != 'vatforalllines') { print 'id.'">'.img_edit($langs->trans("UpdateForAllLines"), 0, 'class="clickvatforalllines opacitymedium paddingleft cursorpointer"').''; } //print ''; @@ -111,7 +111,7 @@ print $langs->trans('ReductionShort'); if (in_array($object->element, array('propal', 'commande', 'facture')) && $object->status == $object::STATUS_DRAFT) { global $mysoc; - if (empty($disableedit)) { + if (empty($disableedit) && GETPOST('mode', 'aZ09') != 'remiseforalllines') { print 'id.'">'.img_edit($langs->trans("UpdateForAllLines"), 0, 'class="clickvatforalllines opacitymedium paddingleft cursorpointer"').''; } //print ''; From 2f2c710a33b116f7ef0b86a73d062fde8f468e02 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Jan 2023 21:34:59 +0100 Subject: [PATCH 0704/1128] Fix reposition when adding a contract line --- htdocs/contrat/card.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index 79897cdc16d..12f53b49390 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -2046,11 +2046,12 @@ if ($action == 'create') { $dateSelector = 1; print "\n"; - print ' + print ' + '; print '
'; From 3769861a8adb54fd99306bf3f55f0508a4e3a921 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Jan 2023 21:46:11 +0100 Subject: [PATCH 0705/1128] NEW VAT can be modified during add of line --- htdocs/comm/propal/card.php | 27 +++++++------ htdocs/commande/card.php | 8 ++-- htdocs/compta/facture/card.php | 9 ++--- htdocs/contrat/card.php | 11 +++--- htdocs/core/class/html.form.class.php | 7 +--- htdocs/core/tpl/objectline_create.tpl.php | 35 ++++++++++++++++- htdocs/product/ajax/products.php | 48 ++++++++++++++--------- 7 files changed, 91 insertions(+), 54 deletions(-) diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index 5fb464a6e8e..c2dcd19eb9b 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -938,12 +938,12 @@ if (empty($reshook)) { $prod_entry_mode = GETPOST('prod_entry_mode', 'aZ09'); if ($prod_entry_mode == 'free') { $idprod = 0; - $tva_tx = (GETPOST('tva_tx', 'alpha') ? price2num(preg_replace('/\s*\(.*\)/', '', GETPOST('tva_tx', 'alpha'))) : 0); } else { $idprod = GETPOST('idprod', 'int'); - $tva_tx = ''; } + $tva_tx = GETPOST('tva_tx', 'alpha'); + $qty = price2num(GETPOST('qty'.$predef, 'alpha'), 'MS', 2); $remise_percent = (GETPOSTISSET('remise_percent'.$predef) ? price2num(GETPOST('remise_percent'.$predef, 'alpha'), '', 2) : 0); if (empty($remise_percent)) { @@ -992,6 +992,8 @@ if (empty($reshook)) { if (!$error && ($qty >= 0) && (!empty($product_desc) || (!empty($idprod) && $idprod > 0))) { $pu_ht = 0; $pu_ttc = 0; + $pu_ht_devise = 0; + $pu_ttc_devise = 0; $price_min = 0; $price_min_ttc = 0; $price_base_type = (GETPOST('price_base_type', 'alpha') ? GETPOST('price_base_type', 'alpha') : 'HT'); @@ -1002,7 +1004,6 @@ if (empty($reshook)) { // Ecrase $pu par celui du produit // Ecrase $desc par celui du produit - // Ecrase $tva_tx par celui du produit // Replaces $fk_unit with the product unit if (!empty($idprod) && $idprod > 0) { $prod = new Product($db); @@ -1011,11 +1012,11 @@ if (empty($reshook)) { $label = ((GETPOST('product_label') && GETPOST('product_label') != $prod->label) ? GETPOST('product_label') : ''); // Update if prices fields are defined - $tva_tx = get_default_tva($mysoc, $object->thirdparty, $prod->id); + /*$tva_tx = get_default_tva($mysoc, $object->thirdparty, $prod->id); $tva_npr = get_default_npr($mysoc, $object->thirdparty, $prod->id); if (empty($tva_tx)) { $tva_npr = 0; - } + }*/ // Price unique per product $pu_ht = $prod->price; @@ -1056,14 +1057,14 @@ if (empty($reshook)) { $price_min = price($prodcustprice->lines[0]->price_min); $price_min_ttc = price($prodcustprice->lines[0]->price_min_ttc); $price_base_type = $prodcustprice->lines[0]->price_base_type; - $tva_tx = ($prodcustprice->lines[0]->default_vat_code ? $prodcustprice->lines[0]->tva_tx.' ('.$prodcustprice->lines[0]->default_vat_code.' )' : $prodcustprice->lines[0]->tva_tx); + /*$tva_tx = ($prodcustprice->lines[0]->default_vat_code ? $prodcustprice->lines[0]->tva_tx.' ('.$prodcustprice->lines[0]->default_vat_code.' )' : $prodcustprice->lines[0]->tva_tx); if ($prodcustprice->lines[0]->default_vat_code && !preg_match('/\(.*\)/', $tva_tx)) { $tva_tx .= ' ('.$prodcustprice->lines[0]->default_vat_code.')'; } $tva_npr = $prodcustprice->lines[0]->recuperableonly; if (empty($tva_tx)) { $tva_npr = 0; - } + }*/ } } } elseif (!empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY)) { @@ -1114,12 +1115,12 @@ if (empty($reshook)) { $tmpprodvat = price2num(preg_replace('/\s*\(.*\)/', '', $prod->tva_tx)); // Set unit price to use - if (!empty($price_ht) || $price_ht === '0') { + if (!empty($price_ht) || (string) $price_ht === '0') { $pu_ht = price2num($price_ht, 'MU'); - $pu_ttc = price2num($pu_ht * (1 + ($tmpvat / 100)), 'MU'); - } elseif (!empty($price_ttc) || $price_ttc === '0') { + $pu_ttc = price2num($pu_ht * (1 + ((float) $tmpvat / 100)), 'MU'); + } elseif (!empty($price_ttc) || (string) $price_ttc === '0') { $pu_ttc = price2num($price_ttc, 'MU'); - $pu_ht = price2num($pu_ttc / (1 + ($tmpvat / 100)), 'MU'); + $pu_ht = price2num($pu_ttc / (1 + ((float) $tmpvat / 100)), 'MU'); } elseif ($tmpvat != $tmpprodvat) { // Is this still used ? if ($price_base_type != 'HT') { @@ -1416,12 +1417,12 @@ if (empty($reshook)) { //var_dump(price2num($price_min_ttc)); var_dump(price2num($pu_ttc)); var_dump($remise_percent);exit; if ($usermustrespectpricemin) { - if ($pu_equivalent && $price_min && ((price2num($pu_equivalent) * (1 - $remise_percent / 100)) < price2num($price_min))) { + if ($pu_equivalent && $price_min && ((price2num($pu_equivalent) * (1 - (float) $remise_percent / 100)) < price2num($price_min))) { $mesg = $langs->trans("CantBeLessThanMinPrice", price(price2num($price_min, 'MU'), 0, $langs, 0, 0, -1, $conf->currency)); setEventMessages($mesg, null, 'errors'); $error++; $action = 'editline'; - } elseif ($pu_equivalent_ttc && $price_min_ttc && ((price2num($pu_equivalent_ttc) * (1 - $remise_percent / 100)) < price2num($price_min_ttc))) { + } elseif ($pu_equivalent_ttc && $price_min_ttc && ((price2num($pu_equivalent_ttc) * (1 - (float) $remise_percent / 100)) < price2num($price_min_ttc))) { $mesg = $langs->trans("CantBeLessThanMinPrice", price(price2num($price_min_ttc, 'MU'), 0, $langs, 0, 0, -1, $conf->currency)); setEventMessages($mesg, null, 'errors'); $error++; diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index ccf706c9ac7..c2ab4fcd3bc 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -676,12 +676,11 @@ if (empty($reshook)) { $prod_entry_mode = GETPOST('prod_entry_mode', 'aZ09'); if ($prod_entry_mode == 'free') { $idprod = 0; - $tva_tx = (GETPOST('tva_tx', 'alpha') ? price2num(preg_replace('/\s*\(.*\)/', '', GETPOST('tva_tx', 'alpha'))) : 0); } else { $idprod = GETPOST('idprod', 'int'); - $tva_tx = ''; } + $tva_tx = GETPOST('tva_tx', 'alpha'); // Prepare a price equivalent for minimum price check $pu_equivalent = $pu_ht; @@ -762,7 +761,6 @@ if (empty($reshook)) { // Ecrase $pu par celui du produit // Ecrase $desc par celui du produit - // Ecrase $tva_tx par celui du produit // Ecrase $base_price_type par celui du produit if (!empty($idprod) && $idprod > 0) { $prod = new Product($db); @@ -771,11 +769,11 @@ if (empty($reshook)) { $label = ((GETPOST('product_label') && GETPOST('product_label') != $prod->label) ? GETPOST('product_label') : ''); // Update if prices fields are defined - $tva_tx = get_default_tva($mysoc, $object->thirdparty, $prod->id); + /*$tva_tx = get_default_tva($mysoc, $object->thirdparty, $prod->id); $tva_npr = get_default_npr($mysoc, $object->thirdparty, $prod->id); if (empty($tva_tx)) { $tva_npr = 0; - } + }*/ $pu_ht = $prod->price; $pu_ttc = $prod->price_ttc; diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index cc6b92f72cb..5f24ca87830 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -2038,12 +2038,12 @@ if (empty($reshook)) { $prod_entry_mode = GETPOST('prod_entry_mode', 'aZ09'); if ($prod_entry_mode == 'free') { $idprod = 0; - $tva_tx = (GETPOST('tva_tx', 'alpha') ? price2num(preg_replace('/\s*\(.*\)/', '', GETPOST('tva_tx', 'alpha'))) : 0); } else { $idprod = GETPOST('idprod', 'int'); - $tva_tx = ''; } + $tva_tx = GETPOST('tva_tx', 'alpha'); + $qty = price2num(GETPOST('qty'.$predef, 'alpha'), 'MS', 2); $remise_percent = (GETPOSTISSET('remise_percent'.$predef) ? price2num(GETPOST('remise_percent'.$predef, 'alpha'), '', 2) : 0); if (empty($remise_percent)) { @@ -2137,7 +2137,6 @@ if (empty($reshook)) { // Ecrase $pu par celui du produit // Ecrase $desc par celui du produit - // Ecrase $tva_tx par celui du produit // Ecrase $base_price_type par celui du produit // Replaces $fk_unit with the product's if (!empty($idprod) && $idprod > 0) { @@ -2157,8 +2156,8 @@ if (empty($reshook)) { $price_min_ttc = $datapriceofproduct['price_min_ttc']; $price_base_type = $datapriceofproduct['price_base_type']; - $tva_tx = $datapriceofproduct['tva_tx']; - $tva_npr = $datapriceofproduct['tva_npr']; + //$tva_tx = $datapriceofproduct['tva_tx']; + //$tva_npr = $datapriceofproduct['tva_npr']; $tmpvat = price2num(preg_replace('/\s*\(.*\)/', '', $tva_tx)); $tmpprodvat = price2num(preg_replace('/\s*\(.*\)/', '', $prod->tva_tx)); diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index 12f53b49390..123366fd630 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -427,6 +427,7 @@ if (empty($reshook)) { } else { $idprod = GETPOST('idprod', 'int'); } + $tva_tx = GETPOST('tva_tx', 'alpha'); $qty = price2num(GETPOST('qty'.$predef, 'alpha'), 'MS'); @@ -474,11 +475,11 @@ if (empty($reshook)) { $prod->fetch($idprod); // Update if prices fields are defined - $tva_tx = get_default_tva($mysoc, $object->thirdparty, $prod->id); + /*$tva_tx = get_default_tva($mysoc, $object->thirdparty, $prod->id); $tva_npr = get_default_npr($mysoc, $object->thirdparty, $prod->id); if (empty($tva_tx)) { $tva_npr = 0; - } + }*/ $price_min = $prod->price_min; $price_min_ttc = $prod->price_min_ttc; @@ -500,14 +501,14 @@ if (empty($reshook)) { if (count($prodcustprice->lines) > 0) { $price_min = price($prodcustprice->lines[0]->price_min); $price_min_ttc = price($prodcustprice->lines[0]->price_min_ttc); - $tva_tx = $prodcustprice->lines[0]->tva_tx; + /*$tva_tx = $prodcustprice->lines[0]->tva_tx; if ($prodcustprice->lines[0]->default_vat_code && !preg_match('/\(.*\)/', $tva_tx)) { $tva_tx .= ' ('.$prodcustprice->lines[0]->default_vat_code.')'; } $tva_npr = $prodcustprice->lines[0]->recuperableonly; if (empty($tva_tx)) { $tva_npr = 0; - } + }*/ } } } @@ -699,7 +700,7 @@ if (empty($reshook)) { $date_end_real_update = $objectline->date_end_real; } - $vat_rate = GETPOST('eltva_tx'); + $vat_rate = GETPOST('eltva_tx', 'alpha'); // Define info_bits $info_bits = 0; if (preg_match('/\*/', $vat_rate)) { diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 1c54df24e06..369deba4455 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -2344,11 +2344,7 @@ class Form } } // mode=1 means customers products - $urloption = 'htmlname='.$htmlname.'&outjson=1&price_level='.$price_level.'&type='.$filtertype.'&mode=1&status='.$status.'&status_purchase='.$status_purchase.'&finished='.$finished.'&hidepriceinlabel='.$hidepriceinlabel.'&warehousestatus='.$warehouseStatus; - //Price by customer - if (!empty($conf->global->PRODUIT_CUSTOMER_PRICES) && !empty($socid)) { - $urloption .= '&socid='.$socid; - } + $urloption = ($socid > 0 ? 'socid='.$socid.'&' : '').'htmlname='.$htmlname.'&outjson=1&price_level='.$price_level.'&type='.$filtertype.'&mode=1&status='.$status.'&status_purchase='.$status_purchase.'&finished='.$finished.'&hidepriceinlabel='.$hidepriceinlabel.'&warehousestatus='.$warehouseStatus; $out .= ajax_autocompleter($selected, $htmlname, DOL_URL_ROOT.'/product/ajax/products.php', $urloption, $conf->global->PRODUIT_USE_SEARCH_TO_SELECT, 1, $ajaxoptions); if (isModEnabled('variants') && is_array($selected_combinations)) { @@ -3247,6 +3243,7 @@ class Form // mode=2 means suppliers products $urloption = ($socid > 0 ? 'socid='.$socid.'&' : '').'htmlname='.$htmlname.'&outjson=1&price_level='.$price_level.'&type='.$filtertype.'&mode=2&status='.$status.'&finished='.$finished.'&alsoproductwithnosupplierprice='.$alsoproductwithnosupplierprice; print ajax_autocompleter($selected, $htmlname, DOL_URL_ROOT.'/product/ajax/products.php', $urloption, $conf->global->PRODUIT_USE_SEARCH_TO_SELECT, 0, $ajaxoptions); + print ($hidelabel ? '' : $langs->trans("RefOrLabel").' : ').''; } else { print $this->select_produits_fournisseurs_list($socid, $selected, $htmlname, $filtertype, $filtre, '', $status, 0, 0, $alsoproductwithnosupplierprice, $morecss, 0, $placeholder); diff --git a/htdocs/core/tpl/objectline_create.tpl.php b/htdocs/core/tpl/objectline_create.tpl.php index 32a9f1cdaae..52761509890 100644 --- a/htdocs/core/tpl/objectline_create.tpl.php +++ b/htdocs/core/tpl/objectline_create.tpl.php @@ -40,6 +40,7 @@ if (empty($object) || !is_object($object)) { print "Error: this template page cannot be called directly as an URL"; exit; } + $usemargins = 0; if (isModEnabled('margin') && !empty($object->element) && in_array($object->element, array('facture', 'facturerec', 'propal', 'commande'))) { $usemargins = 1; @@ -48,6 +49,7 @@ if (!isset($dateSelector)) { global $dateSelector; // Take global var only if not already defined into function calling (for example formAddObjectLine) } global $forceall, $forcetoshowtitlelines, $senderissupplier, $inputalsopricewithtax; +global $mysoc; if (!isset($dateSelector)) { $dateSelector = 1; // For backward compatibility @@ -776,6 +778,35 @@ if (!empty($usemargins) && $user->rights->margins->creer) { var stringforvatrateselection = tva_tx; if (typeof default_vat_code != 'undefined' && default_vat_code != null && default_vat_code != '') { stringforvatrateselection = stringforvatrateselection+' ('+default_vat_code+')'; + + console.log("MAIN_SALETAX_AUTOSWITCH_I_CS_FOR_INDIA is on so we check if we need to autoswith the vat code"); + console.log("mysoc->country_code=country_code; ?> thirdparty->country_code=thirdparty->country_code; ?>"); + new_default_vat_code = default_vat_code; + country_code == 'IN' && !empty($object->thirdparty) && $object->thirdparty->country_code == 'IN' && $mysoc->state_code == $object->thirdparty->state_code) { + // We are in India and states are same, we revert the vat code "I-x" into "CS-x" + ?> + console.log("Countries are both IN and states are same, so we revert I into CS in default_vat_code="+default_vat_code); + new_default_vat_code = default_vat_code.replace(/^I\-/, 'C+S-'); + country_code == 'IN' && !empty($object->thirdparty) && $object->thirdparty->country_code == 'IN' && $mysoc->state_code != $object->thirdparty->state_code) { + // We are in India and states differs, we revert the vat code "CS-x" into "I-x" + ?> + console.log("Countries are both IN and states differs, so we revert CS into I in default_vat_code="+default_vat_code); + new_default_vat_code = default_vat_code.replace(/^C\+S\-/, 'I-'); + + if (new_default_vat_code != default_vat_code && jQuery('#tva_tx option:contains("'+new_default_vat_code+'")').val()) { + console.log("We found en entry into VAT with new default_vat_code, we will use it"); + stringforvatrateselection = jQuery('#tva_tx option:contains("'+new_default_vat_code+'")').val(); + } + } // Set vat rate if field is an input box $('#tva_tx').val(tva_tx); @@ -1113,7 +1144,7 @@ if (!empty($usemargins) && $user->rights->margins->creer) { }); - /* Function to set fields from choice */ + /* Function to set fields visibility after selecting a free product */ function setforfree() { console.log("objectline_create.tpl::setforfree. We show most fields"); jQuery("#idprodfournprice").val('0'); // Set cursor on not selected product @@ -1148,7 +1179,7 @@ if (!empty($usemargins) && $user->rights->margins->creer) { jQuery("#multicurrency_price_ttc").val('').hide(); jQuery("#title_up_ttc, #title_up_ttc_currency").hide(); - jQuery("#tva_tx, #title_vat").hide(); + /* jQuery("#tva_tx, #title_vat").hide(); */ /* jQuery("#title_fourn_ref").hide(); */ jQuery("#np_marginRate, #np_markRate, .np_marginRate, .np_markRate, #units, #title_units").hide(); jQuery("#buying_price").show(); diff --git a/htdocs/product/ajax/products.php b/htdocs/product/ajax/products.php index f61e92c56f3..e07aa4ab5c5 100644 --- a/htdocs/product/ajax/products.php +++ b/htdocs/product/ajax/products.php @@ -103,26 +103,36 @@ if ($action == 'fetch' && !empty($id)) { $price_level = 1; if ($socid > 0) { - $thirdpartytemp = new Societe($db); - $thirdpartytemp->fetch($socid); - - //Load translation description and label - if (getDolGlobalInt('MAIN_MULTILANGS') && !empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) { - $newlang = $thirdpartytemp->default_lang; - - if (!empty($newlang)) { - $outputlangs = new Translate("", $conf); - $outputlangs->setDefaultLang($newlang); - $outdesc_trans = (!empty($object->multilangs[$outputlangs->defaultlang]["description"])) ? $object->multilangs[$outputlangs->defaultlang]["description"] : $object->description; - $outlabel_trans = (!empty($object->multilangs[$outputlangs->defaultlang]["label"])) ? $object->multilangs[$outputlangs->defaultlang]["label"] : $object->label; - } else { - $outdesc_trans = $object->description; - $outlabel_trans = $object->label; - } + $needchangeaccordingtothirdparty = 0; + if (getDolGlobalInt('MAIN_MULTILANGS') && getDolGlobalString('PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE')) { + $needchangeaccordingtothirdparty = 1; } + if (getDolGlobalString('PRODUIT_MULTIPRICES') || getDolGlobalString('PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES')) { + $needchangeaccordingtothirdparty = 1; + } + if ($needchangeaccordingtothirdparty) { + $thirdpartytemp = new Societe($db); + $thirdpartytemp->fetch($socid); - if (!empty($conf->global->PRODUIT_MULTIPRICES) || !empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES)) { - $price_level = $thirdpartytemp->price_level; + //Load translation description and label according to thirdparty language + if (getDolGlobalInt('MAIN_MULTILANGS') && getDolGlobalString('PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE')) { + $newlang = $thirdpartytemp->default_lang; + + if (!empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + $outdesc_trans = (!empty($object->multilangs[$outputlangs->defaultlang]["description"])) ? $object->multilangs[$outputlangs->defaultlang]["description"] : $object->description; + $outlabel_trans = (!empty($object->multilangs[$outputlangs->defaultlang]["label"])) ? $object->multilangs[$outputlangs->defaultlang]["label"] : $object->label; + } else { + $outdesc_trans = $object->description; + $outlabel_trans = $object->label; + } + } + + //Set price level according to thirdparty + if (getDolGlobalString('PRODUIT_MULTIPRICES') || getDolGlobalString('PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES')) { + $price_level = $thirdpartytemp->price_level; + } } } @@ -185,7 +195,7 @@ if ($action == 'fetch' && !empty($id)) { } // Price by customer - if (!empty($conf->global->PRODUIT_CUSTOMER_PRICES) && !empty($socid)) { + if (getDolGlobalString('PRODUIT_CUSTOMER_PRICES') && !empty($socid)) { require_once DOL_DOCUMENT_ROOT.'/product/class/productcustomerprice.class.php'; $prodcustprice = new Productcustomerprice($db); From 098e6c40759172bbb7e0d51305f246ad901ff3fb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Jan 2023 21:49:51 +0100 Subject: [PATCH 0706/1128] Fix look and feel v17 --- htdocs/commande/list.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index 98d2b59d6a3..9ef9072d16a 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -1526,16 +1526,16 @@ if ($resql) { } // Town if (!empty($arrayfields['s.town']['checked'])) { - print ''; + print ''; } // Zip if (!empty($arrayfields['s.zip']['checked'])) { - print ''; + print ''; } // State if (!empty($arrayfields['state.nom']['checked'])) { print ''; - print ''; + print ''; print ''; } // Country @@ -1723,18 +1723,18 @@ if ($resql) { } // Status billed if (!empty($arrayfields['c.facture']['checked'])) { - print ''; + print ''; print $form->selectyesno('search_billed', $search_billed, 1, 0, 1, 1); print ''; } // Import key if (!empty($arrayfields['c.import_key']['checked'])) { - print ''; + print ''; print ''; } // Status if (!empty($arrayfields['c.fk_statut']['checked'])) { - print ''; + print ''; $liststatus = array( Commande::STATUS_DRAFT=>$langs->trans("StatusOrderDraftShort"), Commande::STATUS_VALIDATED=>$langs->trans("StatusOrderValidated"), @@ -1907,7 +1907,7 @@ if ($resql) { print_liste_field_titre($arrayfields['c.import_key']['label'], $_SERVER["PHP_SELF"], "c.import_key", "", $param, '', $sortfield, $sortorder, 'center '); } if (!empty($arrayfields['c.fk_statut']['checked'])) { - print_liste_field_titre($arrayfields['c.fk_statut']['label'], $_SERVER["PHP_SELF"], "c.fk_statut", "", $param, '', $sortfield, $sortorder, 'center '); + print_liste_field_titre($arrayfields['c.fk_statut']['label'], $_SERVER["PHP_SELF"], "c.fk_statut", "", $param, '', $sortfield, $sortorder, 'right '); } if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', $param, '', $sortfield, $sortorder, 'maxwidthsearch center '); @@ -2631,7 +2631,7 @@ if ($resql) { // Status if (!empty($arrayfields['c.fk_statut']['checked'])) { - print ''.$generic_commande->LibStatut($obj->fk_statut, $obj->billed, 5, 1).''; + print ''.$generic_commande->LibStatut($obj->fk_statut, $obj->billed, 5, 1).''; if (!$i) { $totalarray['nbfield']++; } From c78ad19186f8c410b01a85678dc74db776fb6366 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Jan 2023 18:50:01 +0100 Subject: [PATCH 0707/1128] Fix warning php8 --- htdocs/core/modules/propale/doc/pdf_azur.modules.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/propale/doc/pdf_azur.modules.php b/htdocs/core/modules/propale/doc/pdf_azur.modules.php index e1afcc0c7a0..db076cd97b9 100644 --- a/htdocs/core/modules/propale/doc/pdf_azur.modules.php +++ b/htdocs/core/modules/propale/doc/pdf_azur.modules.php @@ -675,10 +675,18 @@ class pdf_azur extends ModelePDFPropales // retrieve global local tax if ($localtax1_type && $localtax1ligne != 0) { - $this->localtax1[$localtax1_type][$localtax1_rate] += $localtax1ligne; + if (empty($this->localtax1[$localtax1_type][$localtax1_rate])) { + $this->localtax1[$localtax1_type][$localtax1_rate] = $localtax1ligne; + } else { + $this->localtax1[$localtax1_type][$localtax1_rate] += $localtax1ligne; + } } if ($localtax2_type && $localtax2ligne != 0) { - $this->localtax2[$localtax2_type][$localtax2_rate] += $localtax2ligne; + if (empty($this->localtax2[$localtax2_type][$localtax2_rate])) { + $this->localtax2[$localtax2_type][$localtax2_rate] = $localtax2ligne; + } else { + $this->localtax2[$localtax2_type][$localtax2_rate] += $localtax2ligne; + } } if (($object->lines[$i]->info_bits & 0x01) == 0x01) { From 09a2028522f069acc032f36ee80d93b9dad8dc9f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Jan 2023 21:27:56 +0100 Subject: [PATCH 0708/1128] Fix picto edit must not be visilbe in edit mode --- htdocs/core/tpl/objectline_title.tpl.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/tpl/objectline_title.tpl.php b/htdocs/core/tpl/objectline_title.tpl.php index 7fe63613ea1..4640d710705 100644 --- a/htdocs/core/tpl/objectline_title.tpl.php +++ b/htdocs/core/tpl/objectline_title.tpl.php @@ -71,7 +71,7 @@ if (!empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) || !empty($conf->global->FA if (in_array($object->element, array('propal', 'commande', 'facture', 'supplier_proposal', 'order_supplier', 'invoice_supplier')) && $object->status == $object::STATUS_DRAFT) { global $mysoc; - if (empty($disableedit)) { + if (empty($disableedit) && GETPOST('mode', 'aZ09') != 'vatforalllines') { print 'id.'">'.img_edit($langs->trans("UpdateForAllLines"), 0, 'class="clickvatforalllines opacitymedium paddingleft cursorpointer"').''; } //print ''; @@ -111,7 +111,7 @@ print $langs->trans('ReductionShort'); if (in_array($object->element, array('propal', 'commande', 'facture')) && $object->status == $object::STATUS_DRAFT) { global $mysoc; - if (empty($disableedit)) { + if (empty($disableedit) && GETPOST('mode', 'aZ09') != 'remiseforalllines') { print 'id.'">'.img_edit($langs->trans("UpdateForAllLines"), 0, 'class="clickvatforalllines opacitymedium paddingleft cursorpointer"').''; } //print ''; From 00fce7eccd17d09074d1a6abb306d914b2b6217c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Jan 2023 21:34:59 +0100 Subject: [PATCH 0709/1128] Fix reposition when adding a contract line --- htdocs/contrat/card.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index 38efdb3cca9..8af35072b93 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -2046,11 +2046,12 @@ if ($action == 'create') { $dateSelector = 1; print "\n"; - print ' + print ' + '; print '
'; From 3c169ae09a96653be9c5d9bbf5c45c36b30810d4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Jan 2023 21:49:51 +0100 Subject: [PATCH 0710/1128] Fix look and feel v17 --- htdocs/commande/list.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index 42b71b14c86..93a0d302fbf 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -1515,16 +1515,16 @@ if ($resql) { } // Town if (!empty($arrayfields['s.town']['checked'])) { - print ''; + print ''; } // Zip if (!empty($arrayfields['s.zip']['checked'])) { - print ''; + print ''; } // State if (!empty($arrayfields['state.nom']['checked'])) { print ''; - print ''; + print ''; print ''; } // Country @@ -1712,18 +1712,18 @@ if ($resql) { } // Status billed if (!empty($arrayfields['c.facture']['checked'])) { - print ''; + print ''; print $form->selectyesno('search_billed', $search_billed, 1, 0, 1, 1); print ''; } // Import key if (!empty($arrayfields['c.import_key']['checked'])) { - print ''; + print ''; print ''; } // Status if (!empty($arrayfields['c.fk_statut']['checked'])) { - print ''; + print ''; $liststatus = array( Commande::STATUS_DRAFT=>$langs->trans("StatusOrderDraftShort"), Commande::STATUS_VALIDATED=>$langs->trans("StatusOrderValidated"), @@ -1896,7 +1896,7 @@ if ($resql) { print_liste_field_titre($arrayfields['c.import_key']['label'], $_SERVER["PHP_SELF"], "c.import_key", "", $param, '', $sortfield, $sortorder, 'center '); } if (!empty($arrayfields['c.fk_statut']['checked'])) { - print_liste_field_titre($arrayfields['c.fk_statut']['label'], $_SERVER["PHP_SELF"], "c.fk_statut", "", $param, '', $sortfield, $sortorder, 'center '); + print_liste_field_titre($arrayfields['c.fk_statut']['label'], $_SERVER["PHP_SELF"], "c.fk_statut", "", $param, '', $sortfield, $sortorder, 'right '); } if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', $param, '', $sortfield, $sortorder, 'maxwidthsearch center '); @@ -2604,7 +2604,7 @@ if ($resql) { // Status if (!empty($arrayfields['c.fk_statut']['checked'])) { - print ''.$generic_commande->LibStatut($obj->fk_statut, $obj->billed, 5, 1).''; + print ''.$generic_commande->LibStatut($obj->fk_statut, $obj->billed, 5, 1).''; if (!$i) { $totalarray['nbfield']++; } From 313adba8f45382df6873c7749bb292192dd91d69 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Jan 2023 22:06:03 +0100 Subject: [PATCH 0711/1128] Fix set job recruitement back to draft --- htdocs/recruitment/recruitmentjobposition_card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/recruitment/recruitmentjobposition_card.php b/htdocs/recruitment/recruitmentjobposition_card.php index d1ca4ef2db1..34365e05792 100644 --- a/htdocs/recruitment/recruitmentjobposition_card.php +++ b/htdocs/recruitment/recruitmentjobposition_card.php @@ -401,7 +401,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea // Back to draft if ($object->status == $object::STATUS_VALIDATED) { if ($permissiontoadd) { - print ''.$langs->trans("SetToDraft").''; + print ''.$langs->trans("SetToDraft").''; } } From 3e4da8a1c587dea5feb861ea23dc2f7caa94f125 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Jan 2023 22:25:41 +0100 Subject: [PATCH 0712/1128] Fix standardize code --- .../recruitmentjobposition_card.php | 28 ++++++++----------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/htdocs/recruitment/recruitmentjobposition_card.php b/htdocs/recruitment/recruitmentjobposition_card.php index 34365e05792..b33ce55808e 100644 --- a/htdocs/recruitment/recruitmentjobposition_card.php +++ b/htdocs/recruitment/recruitmentjobposition_card.php @@ -108,7 +108,7 @@ if (empty($reshook)) { if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) { $backtopage = $backurlforlist; } else { - $backtopage = dol_buildpath('/recruitment/recruitmentjobposition_card.php', 1).'?id='.($id > 0 ? $id : '__ID__'); + $backtopage = dol_buildpath('/recruitment/recruitmentjobposition_card.php', 1).'?id='.((!empty($id) && $id > 0) ? $id : '__ID__'); } } } @@ -130,7 +130,7 @@ if (empty($reshook)) { include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php'; if ($action == 'set_thirdparty' && $permissiontoadd) { - $object->setValueFrom('fk_soc', GETPOST('fk_soc', 'int'), '', '', 'date', '', $user, 'RECRUITMENTJOBPOSITION_MODIFY'); + $object->setValueFrom('fk_soc', GETPOST('fk_soc', 'int'), '', '', 'date', '', $user, $triggermodname); } if ($action == 'classin' && $permissiontoadd) { $object->setProject(GETPOST('projectid', 'int')); @@ -257,8 +257,6 @@ if (($id || $ref) && $action == 'edit') { // Part to show record if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'create'))) { - $res = $object->fetch_optionals(); - $head = recruitmentjobpositionPrepareHead($object); print dol_get_fiche_head($head, 'card', $langs->trans("RecruitmentJobPosition"), -1, $object->picto); @@ -395,31 +393,27 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea if (empty($reshook)) { // Send if (empty($user->socid)) { - print ''.$langs->trans('SendMail').''."\n"; + print dolGetButtonAction('', $langs->trans('SendMail'), 'default', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=presend&mode=init&token='.newToken().'#formmailbeforetitle'); } // Back to draft if ($object->status == $object::STATUS_VALIDATED) { if ($permissiontoadd) { - print ''.$langs->trans("SetToDraft").''; + print dolGetButtonAction('', $langs->trans('SetToDraft'), 'default', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=confirm_setdraft&confirm=yes&token='.newToken(), '', $permissiontoadd); } } // Modify - if ($permissiontoadd) { - print ''.$langs->trans("Modify").''."\n"; - } else { - print ''.$langs->trans('Modify').''."\n"; - } + print dolGetButtonAction('', $langs->trans('Modify'), 'default', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=edit&token='.newToken(), '', $permissiontoadd); // Validate if ($object->status == $object::STATUS_DRAFT) { if ($permissiontoadd) { if (empty($object->table_element_line) || (is_array($object->lines) && count($object->lines) > 0)) { - print ''.$langs->trans("Validate").''; + print dolGetButtonAction('', $langs->trans('Validate'), 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=confirm_validate&confirm=yes&token='.newToken(), '', $permissiontoadd); } else { $langs->load("errors"); - print ''.$langs->trans("Validate").''; + print dolGetButtonAction($langs->trans("ErrorAddAtLeastOneLineFirst"), $langs->trans("Validate"), 'default', '#', '', 0); } } } @@ -442,9 +436,10 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea /* if ($permissiontoadd) { if ($object->status == $object::STATUS_ENABLED) { - print ''.$langs->trans("Disable").''."\n"; + print dolGetButtonAction('', $langs->trans('Disable'), 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=disable&token='.newToken(), '', $permissiontoadd); } else { - print ''.$langs->trans("Enable").''."\n"; + print dolGetButtonAction('', $langs->trans('Enable'), 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=enable&token='.newToken(), '', $permissiontoadd); + } } }*/ if ($permissiontoadd) { @@ -454,7 +449,8 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea } // Delete - print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $permissiontodelete); + $params = array(); + print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $permissiontodelete, $params); } print '
'."\n"; } From 76d729573291eea6a7bcd1b04e1a509d5ab046b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Tue, 10 Jan 2023 23:16:28 +0100 Subject: [PATCH 0713/1128] fix properties --- htdocs/core/class/html.formticket.class.php | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/html.formticket.class.php b/htdocs/core/class/html.formticket.class.php index a34861e17d6..a397433979b 100644 --- a/htdocs/core/class/html.formticket.class.php +++ b/htdocs/core/class/html.formticket.class.php @@ -1,7 +1,7 @@ * Copyright (C) 2016 Christophe Battarel - * Copyright (C) 2019 Frédéric France + * Copyright (C) 2019-2022 Frédéric France * Copyright (C) 2021 Juanjo Menent * Copyright (C) 2021 Alexandre Spangaro * @@ -50,9 +50,15 @@ class FormTicket /** * @var string The track_id of the ticket. Used also for the $keytoavoidconflict to name session vars to upload files. + * @deprecated */ public $track_id; + /** + * @var string trackid + */ + public $trackid; + /** * @var int ID */ @@ -89,8 +95,12 @@ class FormTicket public $withusercreate; // to show name of creating user in form public $withcreatereadonly; - public $withref; // to show ref field + /** + * @var int withextrafields + */ + public $withextrafields; + public $withref; // to show ref field public $withcancel; public $type_code; From c5a83972ca9e7c1234799c8a5005b30060e33c0d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Jan 2023 23:47:47 +0100 Subject: [PATCH 0714/1128] Fix return warnings --- htdocs/core/class/stats.class.php | 2 +- htdocs/projet/class/projectstats.class.php | 12 ++++++------ htdocs/projet/class/taskstats.class.php | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/htdocs/core/class/stats.class.php b/htdocs/core/class/stats.class.php index c8dbca747b9..60cdc5d5226 100644 --- a/htdocs/core/class/stats.class.php +++ b/htdocs/core/class/stats.class.php @@ -237,7 +237,7 @@ abstract class Stats /** * @param int $year year number - * @return int value + * @return array array of values */ protected abstract function getAverageByMonth($year); diff --git a/htdocs/projet/class/projectstats.class.php b/htdocs/projet/class/projectstats.class.php index 65d673a9ad2..e2b6c5129ff 100644 --- a/htdocs/projet/class/projectstats.class.php +++ b/htdocs/projet/class/projectstats.class.php @@ -298,7 +298,7 @@ class ProjectStats extends Stats * @param int $startyear End year * @param int $cachedelay Delay we accept for cache file (0=No read, no save of cache, -1=No read but save) * @param int $wonlostfilter Add a filter on status won/lost - * @return array Array of values + * @return array|int Array of values or <0 if error */ public function getWeightedAmountByMonthWithPrevYear($endyear, $startyear, $cachedelay = 0, $wonlostfilter = 1) { @@ -411,10 +411,10 @@ class ProjectStats extends Stats /** * Return amount of elements by month for several years * - * @param int $endyear End year - * @param int $startyear Start year - * @param int $cachedelay accept for cache file (0=No read, no save of cache, -1=No read but save) - * @return array of values + * @param int $endyear End year + * @param int $startyear Start year + * @param int $cachedelay accept for cache file (0=No read, no save of cache, -1=No read but save) + * @return array|int Array of values or <0 if error */ public function getTransformRateByMonthWithPrevYear($endyear, $startyear, $cachedelay = 0) { @@ -549,7 +549,7 @@ class ProjectStats extends Stats /** * Return average of entity by month * @param int $year year number - * @return int value + * @return array */ protected function getAverageByMonth($year) { diff --git a/htdocs/projet/class/taskstats.class.php b/htdocs/projet/class/taskstats.class.php index ce7c6c4f4c5..6ff56fd8132 100644 --- a/htdocs/projet/class/taskstats.class.php +++ b/htdocs/projet/class/taskstats.class.php @@ -212,7 +212,7 @@ class TaskStats extends Stats /** * Return average of entity by month * @param int $year year number - * @return int value + * @return array array of values */ protected function getAverageByMonth($year) { From e50a56290cd73811e10306ef6dadb876214252e9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Jan 2023 23:49:31 +0100 Subject: [PATCH 0715/1128] Fix warning --- htdocs/comm/propal/class/propal.class.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index 2b429d0e8d1..b0aa5dba54c 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -2903,7 +2903,7 @@ class Propal extends CommonObject * @param int $offset For pagination * @param string $sortfield Sort criteria * @param string $sortorder Sort order - * @return int -1 if KO, array with result if OK + * @return array|int -1 if KO, array with result if OK */ public function liste_array($shortlist = 0, $draft = 0, $notcurrentuser = 0, $socid = 0, $limit = 0, $offset = 0, $sortfield = 'p.datep', $sortorder = 'DESC') { @@ -2982,8 +2982,8 @@ class Propal extends CommonObject /** * Returns an array with id and ref of related invoices * - * @param int $id Id propal - * @return array Array of invoices id + * @param int $id Id propal + * @return array|int Array of invoices id */ public function InvoiceArrayList($id) { From 52f80737f593f7e199d106a4032adc2b0844e7ea Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 11 Jan 2023 00:37:00 +0100 Subject: [PATCH 0716/1128] css --- htdocs/theme/eldy/global.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 289f44333cc..b9e35e1e9ea 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -49,7 +49,7 @@ if (!defined('ISLOADEDBYSTEELSHEET')) { --colortextbacktab: #; --colorboxiconbg: #eee; --refidnocolor:#444; - --tableforfieldcolor:#666; + --tableforfieldcolor:#888; --amountremaintopaycolor:#880000; --amountpaymentcomplete:#008800; --amountremaintopaybackcolor:none; From 33917e97b6bf5093cdaf80390d4d2e2b26ee16ba Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 11 Jan 2023 01:12:08 +0100 Subject: [PATCH 0717/1128] NEW Increment website counter on each page access in website module --- htdocs/core/lib/website.lib.php | 27 +++++++++++++++++++++++++++ htdocs/core/lib/website2.lib.php | 2 +- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/htdocs/core/lib/website.lib.php b/htdocs/core/lib/website.lib.php index c258e3198ce..32a6d9d962a 100644 --- a/htdocs/core/lib/website.lib.php +++ b/htdocs/core/lib/website.lib.php @@ -423,6 +423,33 @@ function dolWebsiteOutput($content, $contenttype = 'html', $containerid = '') print $content; } +/** + * Increase the website counter of page access. + * + * @param int $websiteid ID of website + * @param string $websitepagetype Type of page ('blogpost', 'page', ...) + * @param int $websitepageid ID of page + * @return int <0 if KO, >0 if OK + */ +function dolWebsiteIncrementCounter($websiteid, $websitepagetype, $websitepageid) +{ + if (!getDolGlobalInt('WEBSITE_PERF_DISABLE_COUNTERS')) { + //dol_syslog("dolWebsiteIncrementCounter websiteid=".$websiteid." websitepagetype=".$websitepagetype." websitepageid=".$websitepageid); + if (in_array($websitepagetype, array('blogpost', 'page'))) { + global $db; + + $sql = "UPDATE ".$db->prefix()."website SET pageviews_total = pageviews_total + 1, lastaccess = '".$db->idate(dol_now())."'"; + $sql .= " WHERE rowid = ".((int) $websiteid); + $resql = $db->query($sql); + if (! $resql) { + return -1; + } + } + } + + return 1; +} + /** * Format img tags to introduce viewimage on img src. diff --git a/htdocs/core/lib/website2.lib.php b/htdocs/core/lib/website2.lib.php index 05727a1e539..c7099e8d2ed 100644 --- a/htdocs/core/lib/website2.lib.php +++ b/htdocs/core/lib/website2.lib.php @@ -271,7 +271,7 @@ function dolSavePageContent($filetpl, Website $object, WebsitePage $objectpage, $tplcontent .= ''."\n"; $tplcontent .= 'id.');'."\n"; + $tplcontent .= '$tmp = ob_get_contents(); ob_end_clean(); dolWebsiteOutput($tmp, "html", '.$objectpage->id.'); dolWebsiteIncrementCounter('.$object->id.', "'.$objectpage->type_container.'", '.$objectpage->id.');'."\n"; $tplcontent .= "// END PHP ?>\n"; //var_dump($filetpl);exit; From 8f5edcab02d45dcfaa84200013d36c9fad807be9 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Wed, 11 Jan 2023 06:11:41 +0100 Subject: [PATCH 0718/1128] Use isModEnabled() --- htdocs/bookcal/class/booking.class.php | 2 +- htdocs/comm/propal/class/propal.class.php | 2 +- htdocs/commande/class/commande.class.php | 2 +- .../facture/class/facture-rec.class.php | 2 +- htdocs/contrat/class/contrat.class.php | 2 +- htdocs/core/menus/init_menu_auguria.sql | 42 +++++++++---------- .../class/conferenceorbooth.class.php | 2 +- .../class/conferenceorboothattendee.class.php | 2 +- htdocs/fichinter/class/fichinter.class.php | 2 +- .../class/fournisseur.commande.class.php | 2 +- .../class/fournisseur.facture-rec.class.php | 2 +- .../fourn/class/fournisseur.facture.class.php | 2 +- .../template/class/myobject.class.php | 2 +- htdocs/mrp/class/mo.class.php | 2 +- .../class/recruitmentjobposition.class.php | 2 +- htdocs/ticket/class/ticket.class.php | 2 +- 16 files changed, 36 insertions(+), 36 deletions(-) diff --git a/htdocs/bookcal/class/booking.class.php b/htdocs/bookcal/class/booking.class.php index a74cb87a43d..51799fa09da 100644 --- a/htdocs/bookcal/class/booking.class.php +++ b/htdocs/bookcal/class/booking.class.php @@ -104,7 +104,7 @@ class Booking extends CommonObject public $fields=array( 'rowid' => array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>'1', 'position'=>1, 'notnull'=>1, 'visible'=>0, 'noteditable'=>'1', 'index'=>1, 'css'=>'left', 'comment'=>"Id"), 'ref' => array('type'=>'varchar(128)', 'label'=>'Ref', 'enabled'=>'1', 'position'=>1.2, 'notnull'=>1, 'visible'=>1, 'index'=>1, 'searchall'=>1, 'validate'=>'1', 'comment'=>"Reference of object"), - 'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php:1:status=1 AND entity IN (__SHARED_ENTITIES__)', 'label'=>'ThirdParty', 'picto'=>'company', 'enabled'=>'$conf->societe->enabled', 'position'=>50, 'notnull'=>-1, 'visible'=>1, 'index'=>1, 'css'=>'maxwidth500 widthcentpercentminusxx', 'help'=>"LinkToThirparty", 'validate'=>'1',), + 'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php:1:status=1 AND entity IN (__SHARED_ENTITIES__)', 'label'=>'ThirdParty', 'picto'=>'company', 'enabled'=>'isModEnabled("societe")', 'position'=>50, 'notnull'=>-1, 'visible'=>1, 'index'=>1, 'css'=>'maxwidth500 widthcentpercentminusxx', 'help'=>"LinkToThirparty", 'validate'=>'1',), 'fk_project' => array('type'=>'integer:Project:projet/class/project.class.php:1', 'label'=>'Project', 'picto'=>'project', 'enabled'=>'$conf->project->enabled', 'position'=>52, 'notnull'=>-1, 'visible'=>-1, 'index'=>1, 'css'=>'maxwidth500 widthcentpercentminusxx', 'validate'=>'1',), 'description' => array('type'=>'text', 'label'=>'Description', 'enabled'=>'1', 'position'=>60, 'notnull'=>0, 'visible'=>3, 'validate'=>'1',), 'note_public' => array('type'=>'html', 'label'=>'NotePublic', 'enabled'=>'1', 'position'=>61, 'notnull'=>0, 'visible'=>0, 'cssview'=>'wordbreak', 'validate'=>'1',), diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index 1b3df25c7d2..596e6e708aa 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -301,7 +301,7 @@ class Propal extends CommonObject 'ref' =>array('type'=>'varchar(30)', 'label'=>'Ref', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'showoncombobox'=>1, 'position'=>20), 'ref_client' =>array('type'=>'varchar(255)', 'label'=>'RefCustomer', 'enabled'=>1, 'visible'=>-1, 'position'=>22), 'ref_ext' =>array('type'=>'varchar(255)', 'label'=>'RefExt', 'enabled'=>1, 'visible'=>0, 'position'=>40), - 'fk_soc' =>array('type'=>'integer:Societe:societe/class/societe.class.php', 'label'=>'ThirdParty', 'enabled'=>'$conf->societe->enabled', 'visible'=>-1, 'position'=>23), + 'fk_soc' =>array('type'=>'integer:Societe:societe/class/societe.class.php', 'label'=>'ThirdParty', 'enabled'=>'isModEnabled("societe")', 'visible'=>-1, 'position'=>23), 'fk_projet' =>array('type'=>'integer:Project:projet/class/project.class.php:1:fk_statut=1', 'label'=>'Fk projet', 'enabled'=>"isModEnabled('project')", 'visible'=>-1, 'position'=>24), 'tms' =>array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>25), 'datec' =>array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>1, 'visible'=>-1, 'position'=>55), diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 73988594e6f..f6b304a7a52 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -306,7 +306,7 @@ class Commande extends CommonOrder 'ref' =>array('type'=>'varchar(30)', 'label'=>'Ref', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'showoncombobox'=>1, 'position'=>25), 'ref_ext' =>array('type'=>'varchar(255)', 'label'=>'RefExt', 'enabled'=>1, 'visible'=>0, 'position'=>26), 'ref_client' =>array('type'=>'varchar(255)', 'label'=>'RefCustomer', 'enabled'=>1, 'visible'=>-1, 'position'=>28), - 'fk_soc' =>array('type'=>'integer:Societe:societe/class/societe.class.php', 'label'=>'ThirdParty', 'enabled'=>'$conf->societe->enabled', 'visible'=>-1, 'notnull'=>1, 'position'=>20), + 'fk_soc' =>array('type'=>'integer:Societe:societe/class/societe.class.php', 'label'=>'ThirdParty', 'enabled'=>'isModEnabled("societe")', 'visible'=>-1, 'notnull'=>1, 'position'=>20), 'fk_projet' =>array('type'=>'integer:Project:projet/class/project.class.php:1:fk_statut=1', 'label'=>'Project', 'enabled'=>"isModEnabled('project')", 'visible'=>-1, 'position'=>25), 'date_commande' =>array('type'=>'date', 'label'=>'Date', 'enabled'=>1, 'visible'=>1, 'position'=>60), 'date_valid' =>array('type'=>'datetime', 'label'=>'DateValidation', 'enabled'=>1, 'visible'=>-1, 'position'=>62), diff --git a/htdocs/compta/facture/class/facture-rec.class.php b/htdocs/compta/facture/class/facture-rec.class.php index 3a586dfc3e5..6d7d2117147 100644 --- a/htdocs/compta/facture/class/facture-rec.class.php +++ b/htdocs/compta/facture/class/facture-rec.class.php @@ -169,7 +169,7 @@ class FactureRec extends CommonInvoice 'rowid' =>array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>10), 'titre' =>array('type'=>'varchar(100)', 'label'=>'Titre', 'enabled'=>1, 'showoncombobox' => 1, 'visible'=>-1, 'position'=>15), 'entity' =>array('type'=>'integer', 'label'=>'Entity', 'default'=>1, 'enabled'=>1, 'visible'=>-2, 'notnull'=>1, 'position'=>20, 'index'=>1), - 'fk_soc' =>array('type'=>'integer:Societe:societe/class/societe.class.php', 'label'=>'ThirdParty', 'enabled'=>'$conf->societe->enabled', 'visible'=>-1, 'notnull'=>1, 'position'=>25), + 'fk_soc' =>array('type'=>'integer:Societe:societe/class/societe.class.php', 'label'=>'ThirdParty', 'enabled'=>'isModEnabled("societe")', 'visible'=>-1, 'notnull'=>1, 'position'=>25), 'datec' =>array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>1, 'visible'=>-1, 'position'=>30), //'amount' =>array('type'=>'double(24,8)', 'label'=>'Amount', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>35), 'remise' =>array('type'=>'double', 'label'=>'Remise', 'enabled'=>1, 'visible'=>-1, 'position'=>40), diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index 4352364452b..cc9f3319a5d 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -232,7 +232,7 @@ class Contrat extends CommonObject 'tms' =>array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>35), 'datec' =>array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>1, 'visible'=>-1, 'position'=>40), 'date_contrat' =>array('type'=>'datetime', 'label'=>'Date contrat', 'enabled'=>1, 'visible'=>-1, 'position'=>45), - 'fk_soc' =>array('type'=>'integer:Societe:societe/class/societe.class.php', 'label'=>'ThirdParty', 'enabled'=>'$conf->societe->enabled', 'visible'=>-1, 'notnull'=>1, 'position'=>70), + 'fk_soc' =>array('type'=>'integer:Societe:societe/class/societe.class.php', 'label'=>'ThirdParty', 'enabled'=>'isModEnabled("societe")', 'visible'=>-1, 'notnull'=>1, 'position'=>70), 'fk_projet' =>array('type'=>'integer:Project:projet/class/project.class.php:1:fk_statut=1', 'label'=>'Project', 'enabled'=>"isModEnabled('project')", 'visible'=>-1, 'position'=>75), 'fk_commercial_signature' =>array('type'=>'integer:User:user/class/user.class.php', 'label'=>'SaleRepresentative Signature', 'enabled'=>1, 'visible'=>-1, 'position'=>80), 'fk_commercial_suivi' =>array('type'=>'integer:User:user/class/user.class.php', 'label'=>'SaleRepresentative follower', 'enabled'=>1, 'visible'=>-1, 'position'=>85), diff --git a/htdocs/core/menus/init_menu_auguria.sql b/htdocs/core/menus/init_menu_auguria.sql index e6fc16a62d6..0308d52f67d 100644 --- a/htdocs/core/menus/init_menu_auguria.sql +++ b/htdocs/core/menus/init_menu_auguria.sql @@ -12,7 +12,7 @@ delete from llx_menu where menu_handler=__HANDLER__ and entity=__ENTITY__; -- Top-Menu -- old: (module, enabled, rowid, ...) insert into llx_menu (rowid, module, enabled, menu_handler, type, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ( 1__+MAX_llx_menu__, '', '1', __HANDLER__, 'top', 'home', '', 0, '/index.php?mainmenu=home&leftmenu=', 'Home', -1, '', '', '', 2, 10, __ENTITY__); -insert into llx_menu (rowid, module, enabled, menu_handler, type, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ( 2__+MAX_llx_menu__, 'societe|fournisseur|supplier_order|supplier_invoice', '($conf->societe->enabled && (empty($conf->global->SOCIETE_DISABLE_PROSPECTS) || empty($conf->global->SOCIETE_DISABLE_CUSTOMERS) || isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) || $conf->supplier_order->enabled || $conf->supplier_invoice->enabled))', __HANDLER__, 'top', 'companies', '', 0, '/societe/index.php?mainmenu=companies&leftmenu=', 'ThirdParties', -1, 'companies', '$user->rights->societe->lire || $user->rights->societe->contact->lire', '', 2, 20, __ENTITY__); +insert into llx_menu (rowid, module, enabled, menu_handler, type, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ( 2__+MAX_llx_menu__, 'societe|fournisseur|supplier_order|supplier_invoice', '(isModEnabled("societe") && (empty($conf->global->SOCIETE_DISABLE_PROSPECTS) || empty($conf->global->SOCIETE_DISABLE_CUSTOMERS) || isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) || $conf->supplier_order->enabled || $conf->supplier_invoice->enabled))', __HANDLER__, 'top', 'companies', '', 0, '/societe/index.php?mainmenu=companies&leftmenu=', 'ThirdParties', -1, 'companies', '$user->rights->societe->lire || $user->rights->societe->contact->lire', '', 2, 20, __ENTITY__); insert into llx_menu (rowid, module, enabled, menu_handler, type, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ( 3__+MAX_llx_menu__, 'product|service', '$conf->product->enabled || $conf->service->enabled', __HANDLER__, 'top', 'products', '', 0, '/product/index.php?mainmenu=products&leftmenu=', 'ProductsPipeServices', -1, 'products', '$user->rights->produit->lire||$user->rights->service->lire', '', 0, 30, __ENTITY__); insert into llx_menu (rowid, module, enabled, menu_handler, type, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ( 16__+MAX_llx_menu__, 'bom|mrp', '$conf->bom->enabled || $conf->mrp->enabled', __HANDLER__, 'top', 'mrp', '', 0, '/mrp/index.php?mainmenu=mrp&leftmenu=', 'MRP', -1, 'mrp', '$user->rights->bom->read||$user->rights->mrp->read', '', 0, 31, __ENTITY__); insert into llx_menu (rowid, module, enabled, menu_handler, type, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ( 7__+MAX_llx_menu__, 'projet', '$conf->project->enabled', __HANDLER__, 'top', 'project', '', 0, '/projet/index.php?mainmenu=project&leftmenu=', 'Projects', -1, 'projects', '$user->rights->projet->lire', '', 2, 32, __ENTITY__); @@ -83,36 +83,36 @@ insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, left insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="users"', __HANDLER__, 'left', 408__+MAX_llx_menu__, 'home', '', 407__+MAX_llx_menu__, '/user/group/card.php?mainmenu=home&leftmenu=users&action=create', 'NewGroup', 2, 'users', '(($conf->global->MAIN_USE_ADVANCED_PERMS?$user->rights->user->group_advance->write:$user->rights->user->user->creer) || $user->admin) && !(! empty($conf->multicompany->enabled) && $conf->entity > 1 && $conf->global->MULTICOMPANY_TRANSVERSE_MODE)', '', 2, 0, __ENTITY__); -- Third parties -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->societe->enabled', __HANDLER__, 'left', 500__+MAX_llx_menu__, 'companies', 'thirdparties', 2__+MAX_llx_menu__, '/societe/index.php?mainmenu=companies&leftmenu=thirdparties', 'ThirdParty', 0, 'companies', '$user->rights->societe->lire', '', 2, 0, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->societe->enabled', __HANDLER__, 'left', 501__+MAX_llx_menu__, 'companies', '', 500__+MAX_llx_menu__, '/societe/card.php?mainmenu=companies&action=create', 'MenuNewThirdParty', 1, 'companies', '$user->rights->societe->creer', '', 2, 0, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->societe->enabled', __HANDLER__, 'left', 502__+MAX_llx_menu__, 'companies', '', 500__+MAX_llx_menu__, '/societe/list.php?mainmenu=companies&leftmenu=thirdparties', 'List', 1, 'companies', '$user->rights->societe->lire', '', 2, 0, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->societe->enabled && (isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice"))', __HANDLER__, 'left', 503__+MAX_llx_menu__, 'companies', '', 500__+MAX_llx_menu__, '/societe/list.php?mainmenu=companies&type=f&leftmenu=suppliers', 'ListSuppliersShort', 1, 'suppliers', '$user->rights->societe->lire && $user->rights->fournisseur->lire', '', 2, 5, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->societe->enabled && (isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice"))', __HANDLER__, 'left', 504__+MAX_llx_menu__, 'companies', '', 503__+MAX_llx_menu__, '/societe/card.php?mainmenu=companies&leftmenu=supplier&action=create&type=f', 'NewSupplier', 2, 'suppliers', '$user->rights->societe->creer', '', 2, 0, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->societe->enabled', __HANDLER__, 'left', 506__+MAX_llx_menu__, 'companies', '', 500__+MAX_llx_menu__, '/societe/list.php?mainmenu=companies&type=p&leftmenu=prospects', 'ListProspectsShort', 1, 'companies', '$user->rights->societe->lire', '', 2, 3, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->societe->enabled', __HANDLER__, 'left', 507__+MAX_llx_menu__, 'companies', '', 506__+MAX_llx_menu__, '/societe/card.php?mainmenu=companies&leftmenu=prospects&action=create&type=p', 'MenuNewProspect', 2, 'companies', '$user->rights->societe->creer', '', 2, 0, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->societe->enabled', __HANDLER__, 'left', 509__+MAX_llx_menu__, 'companies', '', 500__+MAX_llx_menu__, '/societe/list.php?mainmenu=companies&type=c&leftmenu=customers', 'ListCustomersShort', 1, 'companies', '$user->rights->societe->lire', '', 2, 4, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->societe->enabled', __HANDLER__, 'left', 510__+MAX_llx_menu__, 'companies', '', 509__+MAX_llx_menu__, '/societe/card.php?mainmenu=companies&leftmenu=customers&action=create&type=c', 'MenuNewCustomer', 2, 'companies', '$user->rights->societe->creer', '', 2, 0, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', 'isModEnabled("societe")', __HANDLER__, 'left', 500__+MAX_llx_menu__, 'companies', 'thirdparties', 2__+MAX_llx_menu__, '/societe/index.php?mainmenu=companies&leftmenu=thirdparties', 'ThirdParty', 0, 'companies', '$user->rights->societe->lire', '', 2, 0, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', 'isModEnabled("societe")', __HANDLER__, 'left', 501__+MAX_llx_menu__, 'companies', '', 500__+MAX_llx_menu__, '/societe/card.php?mainmenu=companies&action=create', 'MenuNewThirdParty', 1, 'companies', '$user->rights->societe->creer', '', 2, 0, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', 'isModEnabled("societe")', __HANDLER__, 'left', 502__+MAX_llx_menu__, 'companies', '', 500__+MAX_llx_menu__, '/societe/list.php?mainmenu=companies&leftmenu=thirdparties', 'List', 1, 'companies', '$user->rights->societe->lire', '', 2, 0, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', 'isModEnabled("societe") && (isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice"))', __HANDLER__, 'left', 503__+MAX_llx_menu__, 'companies', '', 500__+MAX_llx_menu__, '/societe/list.php?mainmenu=companies&type=f&leftmenu=suppliers', 'ListSuppliersShort', 1, 'suppliers', '$user->rights->societe->lire && $user->rights->fournisseur->lire', '', 2, 5, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', 'isModEnabled("societe") && (isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice"))', __HANDLER__, 'left', 504__+MAX_llx_menu__, 'companies', '', 503__+MAX_llx_menu__, '/societe/card.php?mainmenu=companies&leftmenu=supplier&action=create&type=f', 'NewSupplier', 2, 'suppliers', '$user->rights->societe->creer', '', 2, 0, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', 'isModEnabled("societe")', __HANDLER__, 'left', 506__+MAX_llx_menu__, 'companies', '', 500__+MAX_llx_menu__, '/societe/list.php?mainmenu=companies&type=p&leftmenu=prospects', 'ListProspectsShort', 1, 'companies', '$user->rights->societe->lire', '', 2, 3, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', 'isModEnabled("societe")', __HANDLER__, 'left', 507__+MAX_llx_menu__, 'companies', '', 506__+MAX_llx_menu__, '/societe/card.php?mainmenu=companies&leftmenu=prospects&action=create&type=p', 'MenuNewProspect', 2, 'companies', '$user->rights->societe->creer', '', 2, 0, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', 'isModEnabled("societe")', __HANDLER__, 'left', 509__+MAX_llx_menu__, 'companies', '', 500__+MAX_llx_menu__, '/societe/list.php?mainmenu=companies&type=c&leftmenu=customers', 'ListCustomersShort', 1, 'companies', '$user->rights->societe->lire', '', 2, 4, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', 'isModEnabled("societe")', __HANDLER__, 'left', 510__+MAX_llx_menu__, 'companies', '', 509__+MAX_llx_menu__, '/societe/card.php?mainmenu=companies&leftmenu=customers&action=create&type=c', 'MenuNewCustomer', 2, 'companies', '$user->rights->societe->creer', '', 2, 0, __ENTITY__); -- Third parties - Contacts -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->societe->enabled', __HANDLER__, 'left', 600__+MAX_llx_menu__, 'companies', 'contacts', 2__+MAX_llx_menu__, '/contact/list.php?mainmenu=companies&leftmenu=contacts', 'ContactsAddresses', 0, 'companies', '$user->rights->societe->lire', '', 2, 1, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->societe->enabled', __HANDLER__, 'left', 601__+MAX_llx_menu__, 'companies', '', 600__+MAX_llx_menu__, '/contact/card.php?mainmenu=companies&leftmenu=contacts&action=create', 'NewContactAddress', 1, 'companies', '$user->rights->societe->creer', '', 2, 0, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->societe->enabled', __HANDLER__, 'left', 602__+MAX_llx_menu__, 'companies', '', 600__+MAX_llx_menu__, '/contact/list.php?mainmenu=companies&leftmenu=contacts', 'List', 1, 'companies', '$user->rights->societe->lire', '', 2, 1, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->societe->enabled', __HANDLER__, 'left', 604__+MAX_llx_menu__, 'companies', '', 602__+MAX_llx_menu__, '/contact/list.php?mainmenu=companies&leftmenu=contacts&type=p', 'ThirdPartyProspects', 2, 'companies', '$user->rights->societe->contact->lire', '', 2, 1, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->societe->enabled', __HANDLER__, 'left', 605__+MAX_llx_menu__, 'companies', '', 602__+MAX_llx_menu__, '/contact/list.php?mainmenu=companies&leftmenu=contacts&type=c', 'ThirdPartyCustomers', 2, 'companies', '$user->rights->societe->contact->lire', '', 2, 2, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->societe->enabled && (isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice"))', __HANDLER__, 'left', 606__+MAX_llx_menu__, 'companies', '', 602__+MAX_llx_menu__, '/contact/list.php?mainmenu=companies&leftmenu=contacts&type=f', 'ThirdPartySuppliers', 2, 'companies', '$user->rights->societe->contact->lire', '', 2, 3, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->societe->enabled', __HANDLER__, 'left', 607__+MAX_llx_menu__, 'companies', '', 602__+MAX_llx_menu__, '/contact/list.php?mainmenu=companies&leftmenu=contacts&type=o', 'Others', 2, 'companies', '$user->rights->societe->contact->lire', '', 2, 4, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', 'isModEnabled("societe")', __HANDLER__, 'left', 600__+MAX_llx_menu__, 'companies', 'contacts', 2__+MAX_llx_menu__, '/contact/list.php?mainmenu=companies&leftmenu=contacts', 'ContactsAddresses', 0, 'companies', '$user->rights->societe->lire', '', 2, 1, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', 'isModEnabled("societe")', __HANDLER__, 'left', 601__+MAX_llx_menu__, 'companies', '', 600__+MAX_llx_menu__, '/contact/card.php?mainmenu=companies&leftmenu=contacts&action=create', 'NewContactAddress', 1, 'companies', '$user->rights->societe->creer', '', 2, 0, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', 'isModEnabled("societe")', __HANDLER__, 'left', 602__+MAX_llx_menu__, 'companies', '', 600__+MAX_llx_menu__, '/contact/list.php?mainmenu=companies&leftmenu=contacts', 'List', 1, 'companies', '$user->rights->societe->lire', '', 2, 1, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', 'isModEnabled("societe")', __HANDLER__, 'left', 604__+MAX_llx_menu__, 'companies', '', 602__+MAX_llx_menu__, '/contact/list.php?mainmenu=companies&leftmenu=contacts&type=p', 'ThirdPartyProspects', 2, 'companies', '$user->rights->societe->contact->lire', '', 2, 1, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', 'isModEnabled("societe")', __HANDLER__, 'left', 605__+MAX_llx_menu__, 'companies', '', 602__+MAX_llx_menu__, '/contact/list.php?mainmenu=companies&leftmenu=contacts&type=c', 'ThirdPartyCustomers', 2, 'companies', '$user->rights->societe->contact->lire', '', 2, 2, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', 'isModEnabled("societe") && (isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice"))', __HANDLER__, 'left', 606__+MAX_llx_menu__, 'companies', '', 602__+MAX_llx_menu__, '/contact/list.php?mainmenu=companies&leftmenu=contacts&type=f', 'ThirdPartySuppliers', 2, 'companies', '$user->rights->societe->contact->lire', '', 2, 3, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', 'isModEnabled("societe")', __HANDLER__, 'left', 607__+MAX_llx_menu__, 'companies', '', 602__+MAX_llx_menu__, '/contact/list.php?mainmenu=companies&leftmenu=contacts&type=o', 'Others', 2, 'companies', '$user->rights->societe->contact->lire', '', 2, 4, __ENTITY__); -- Third parties - Category customer -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->societe->enabled && $conf->categorie->enabled', __HANDLER__, 'left', 650__+MAX_llx_menu__, 'companies', 'cat', 2__+MAX_llx_menu__, '/categories/index.php?mainmenu=companies&leftmenu=cat&type=1', 'SuppliersCategoriesShort', 0, 'categories', '$user->rights->categorie->lire', '', 2, 3, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->societe->enabled && $conf->categorie->enabled', __HANDLER__, 'left', 651__+MAX_llx_menu__, 'companies', '', 650__+MAX_llx_menu__, '/categories/card.php?mainmenu=companies&action=create&type=1', 'NewCategory', 1, 'categories', '$user->rights->categorie->creer', '', 2, 0, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', 'isModEnabled("societe") && $conf->categorie->enabled', __HANDLER__, 'left', 650__+MAX_llx_menu__, 'companies', 'cat', 2__+MAX_llx_menu__, '/categories/index.php?mainmenu=companies&leftmenu=cat&type=1', 'SuppliersCategoriesShort', 0, 'categories', '$user->rights->categorie->lire', '', 2, 3, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', 'isModEnabled("societe") && $conf->categorie->enabled', __HANDLER__, 'left', 651__+MAX_llx_menu__, 'companies', '', 650__+MAX_llx_menu__, '/categories/card.php?mainmenu=companies&action=create&type=1', 'NewCategory', 1, 'categories', '$user->rights->categorie->creer', '', 2, 0, __ENTITY__); -- Third parties - Category supplier insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '(isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice")) && $conf->categorie->enabled', __HANDLER__, 'left', 660__+MAX_llx_menu__, 'companies', 'cat', 2__+MAX_llx_menu__, '/categories/index.php?mainmenu=companies&leftmenu=cat&type=2', 'CustomersProspectsCategoriesShort', 0, 'categories', '$user->rights->categorie->lire', '', 2, 4, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '(isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice")) && $conf->categorie->enabled', __HANDLER__, 'left', 661__+MAX_llx_menu__, 'companies', '', 660__+MAX_llx_menu__, '/categories/card.php?mainmenu=companies&action=create&type=2', 'NewCategory', 1, 'categories', '$user->rights->categorie->creer', '', 2, 0, __ENTITY__); -- Third parties - Category contact -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->societe->enabled && $conf->categorie->enabled', __HANDLER__, 'left', 670__+MAX_llx_menu__, 'companies', 'cat', 2__+MAX_llx_menu__, '/categories/index.php?mainmenu=companies&leftmenu=cat&type=4', 'ContactCategoriesShort', 0, 'categories', '$user->rights->categorie->lire', '', 2, 3, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->societe->enabled && $conf->categorie->enabled', __HANDLER__, 'left', 671__+MAX_llx_menu__, 'companies', '', 670__+MAX_llx_menu__, '/categories/card.php?mainmenu=companies&action=create&type=4', 'NewCategory', 1, 'categories', '$user->rights->categorie->creer', '', 2, 0, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', 'isModEnabled("societe") && $conf->categorie->enabled', __HANDLER__, 'left', 670__+MAX_llx_menu__, 'companies', 'cat', 2__+MAX_llx_menu__, '/categories/index.php?mainmenu=companies&leftmenu=cat&type=4', 'ContactCategoriesShort', 0, 'categories', '$user->rights->categorie->lire', '', 2, 3, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', 'isModEnabled("societe") && $conf->categorie->enabled', __HANDLER__, 'left', 671__+MAX_llx_menu__, 'companies', '', 670__+MAX_llx_menu__, '/categories/card.php?mainmenu=companies&action=create&type=4', 'NewCategory', 1, 'categories', '$user->rights->categorie->creer', '', 2, 0, __ENTITY__); -- Product - Product insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->product->enabled', __HANDLER__, 'left', 2800__+MAX_llx_menu__, 'products', 'product', 3__+MAX_llx_menu__, '/product/index.php?mainmenu=products&leftmenu=product&type=0', 'Products', 0, 'products', '$user->rights->produit->lire', '', 2, 0, __ENTITY__); diff --git a/htdocs/eventorganization/class/conferenceorbooth.class.php b/htdocs/eventorganization/class/conferenceorbooth.class.php index cdb67a2c37b..2d7d56ec65d 100644 --- a/htdocs/eventorganization/class/conferenceorbooth.class.php +++ b/htdocs/eventorganization/class/conferenceorbooth.class.php @@ -106,7 +106,7 @@ class ConferenceOrBooth extends ActionComm 'id' => array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>'1', 'position'=>1, 'notnull'=>1, 'visible'=>0, 'noteditable'=>'1', 'index'=>1, 'css'=>'left', 'comment'=>"Id"), 'ref' => array('type'=>'integer', 'label'=>'Ref', 'enabled'=>'1', 'position'=>1, 'notnull'=>1, 'visible'=>2, 'noteditable'=>'1', 'index'=>1, 'css'=>'left', 'comment'=>"Id"), 'label' => array('type'=>'varchar(255)', 'label'=>'Label', 'enabled'=>'1', 'position'=>30, 'notnull'=>0, 'visible'=>1, 'searchall'=>1, 'css'=>'minwidth300', 'csslist'=>'tdoverflowmax125', 'help'=>"OrganizationEvenLabelName", 'showoncombobox'=>'1',), - 'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php:1:status=1 AND entity IN (__SHARED_ENTITIES__)', 'label'=>'ThirdParty', 'enabled'=>'$conf->societe->enabled', 'position'=>50, 'notnull'=>-1, 'visible'=>1, 'index'=>1, 'help'=>"OrganizationEventLinkToThirdParty", 'picto'=>'company', 'css'=>'tdoverflowmax150 maxwidth500'), + 'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php:1:status=1 AND entity IN (__SHARED_ENTITIES__)', 'label'=>'ThirdParty', 'enabled'=>'isModEnabled("societe")', 'position'=>50, 'notnull'=>-1, 'visible'=>1, 'index'=>1, 'help'=>"OrganizationEventLinkToThirdParty", 'picto'=>'company', 'css'=>'tdoverflowmax150 maxwidth500'), 'fk_project' => array('type'=>'integer:Project:projet/class/project.class.php:1:t.usage_organize_event=1', 'label'=>'Project', 'enabled'=>"isModEnabled('project')", 'position'=>52, 'notnull'=>-1, 'visible'=>-1, 'index'=>1, 'picto'=>'project', 'css'=>'tdoverflowmax150 maxwidth500'), 'note' => array('type'=>'text', 'label'=>'Description', 'enabled'=>'1', 'position'=>60, 'notnull'=>0, 'visible'=>1), 'fk_action' => array('type'=>'sellist:c_actioncomm:libelle:id::module LIKE (\'%@eventorganization\')', 'label'=>'Format', 'enabled'=>'1', 'position'=>60, 'notnull'=>1, 'visible'=>1, 'css'=>'width300'), diff --git a/htdocs/eventorganization/class/conferenceorboothattendee.class.php b/htdocs/eventorganization/class/conferenceorboothattendee.class.php index 595eaf67eeb..f1e4fe2f3d5 100644 --- a/htdocs/eventorganization/class/conferenceorboothattendee.class.php +++ b/htdocs/eventorganization/class/conferenceorboothattendee.class.php @@ -108,7 +108,7 @@ class ConferenceOrBoothAttendee extends CommonObject 'email' => array('type'=>'mail', 'label'=>'EmailAttendee', 'enabled'=>'1', 'position'=>30, 'notnull'=>1, 'visible'=>1, 'index'=>1, 'autofocusoncreate'=>1, 'searchall'=>1), 'firstname' => array('type'=>'varchar(100)', 'label'=>'Firstname', 'enabled'=>'1', 'position'=>31, 'notnull'=>0, 'visible'=>1, 'index'=>1, 'searchall'=>1), 'lastname' => array('type'=>'varchar(100)', 'label'=>'Lastname', 'enabled'=>'1', 'position'=>32, 'notnull'=>0, 'visible'=>1, 'index'=>1, 'searchall'=>1), - 'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php:1:status = 1 AND entity IN (__SHARED_ENTITIES__)', 'label'=>'ThirdParty', 'enabled'=>'$conf->societe->enabled', 'position'=>40, 'notnull'=>-1, 'visible'=>1, 'index'=>1, 'help'=>"OrganizationEventLinkToThirdParty", 'picto'=>'company', 'css'=>'tdoverflowmax150 maxwidth500'), + 'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php:1:status = 1 AND entity IN (__SHARED_ENTITIES__)', 'label'=>'ThirdParty', 'enabled'=>'isModEnabled("societe")', 'position'=>40, 'notnull'=>-1, 'visible'=>1, 'index'=>1, 'help'=>"OrganizationEventLinkToThirdParty", 'picto'=>'company', 'css'=>'tdoverflowmax150 maxwidth500'), 'email_company' => array('type'=>'mail', 'label'=>'EmailCompany', 'enabled'=>'1', 'position'=>41, 'notnull'=>0, 'visible'=>-2, 'searchall'=>1), 'date_subscription' => array('type'=>'datetime', 'label'=>'DateOfRegistration', 'enabled'=>'1', 'position'=>56, 'notnull'=>1, 'visible'=>1, 'showoncombobox'=>'1',), 'fk_invoice' => array('type'=>'integer:Facture:compta/facture/class/facture.class.php', 'label'=>'Invoice', 'enabled'=>'$conf->facture->enabled', 'position'=>57, 'notnull'=>0, 'visible'=>-1, 'index'=>0, 'picto'=>'bill', 'css'=>'tdoverflowmax150 maxwidth500'), diff --git a/htdocs/fichinter/class/fichinter.class.php b/htdocs/fichinter/class/fichinter.class.php index e36598d04bc..a7c3e43f599 100644 --- a/htdocs/fichinter/class/fichinter.class.php +++ b/htdocs/fichinter/class/fichinter.class.php @@ -38,7 +38,7 @@ class Fichinter extends CommonObject { public $fields = array( 'rowid' =>array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>10), - 'fk_soc' =>array('type'=>'integer:Societe:societe/class/societe.class.php', 'label'=>'ThirdParty', 'enabled'=>'$conf->societe->enabled', 'visible'=>-1, 'notnull'=>1, 'position'=>15), + 'fk_soc' =>array('type'=>'integer:Societe:societe/class/societe.class.php', 'label'=>'ThirdParty', 'enabled'=>'isModEnabled("societe")', 'visible'=>-1, 'notnull'=>1, 'position'=>15), 'fk_projet' =>array('type'=>'integer:Project:projet/class/project.class.php:1:fk_statut=1', 'label'=>'Fk projet', 'enabled'=>'isModEnabled("project")', 'visible'=>-1, 'position'=>20), 'fk_contrat' =>array('type'=>'integer', 'label'=>'Fk contrat', 'enabled'=>'$conf->contrat->enabled', 'visible'=>-1, 'position'=>25), 'ref' =>array('type'=>'varchar(30)', 'label'=>'Ref', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'showoncombobox'=>1, 'position'=>30), diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index 4fc242bdbcc..0cfff5a8297 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -254,7 +254,7 @@ class CommandeFournisseur extends CommonOrder 'multicurrency_total_tva' =>array('type'=>'double(24,8)', 'label'=>'MulticurrencyAmountVAT', 'enabled'=>'isModEnabled("multicurrency")', 'visible'=>-1, 'position'=>235), 'multicurrency_total_ttc' =>array('type'=>'double(24,8)', 'label'=>'MulticurrencyAmountTTC', 'enabled'=>'isModEnabled("multicurrency")', 'visible'=>-1, 'position'=>240), 'date_creation' =>array('type'=>'datetime', 'label'=>'Date creation', 'enabled'=>1, 'visible'=>-1, 'position'=>500), - 'fk_soc' =>array('type'=>'integer:Societe:societe/class/societe.class.php', 'label'=>'ThirdParty', 'enabled'=>'$conf->societe->enabled', 'visible'=>1, 'notnull'=>1, 'position'=>46), + 'fk_soc' =>array('type'=>'integer:Societe:societe/class/societe.class.php', 'label'=>'ThirdParty', 'enabled'=>'isModEnabled("societe")', 'visible'=>1, 'notnull'=>1, 'position'=>46), 'entity' =>array('type'=>'integer', 'label'=>'Entity', 'default'=>1, 'enabled'=>1, 'visible'=>0, 'notnull'=>1, 'position'=>1000, 'index'=>1), 'tms'=>array('type'=>'datetime', 'label'=>"DateModificationShort", 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>501), 'last_main_doc' =>array('type'=>'varchar(255)', 'label'=>'LastMainDoc', 'enabled'=>1, 'visible'=>0, 'position'=>700), diff --git a/htdocs/fourn/class/fournisseur.facture-rec.class.php b/htdocs/fourn/class/fournisseur.facture-rec.class.php index 738e27a84e9..53066afc0b7 100644 --- a/htdocs/fourn/class/fournisseur.facture-rec.class.php +++ b/htdocs/fourn/class/fournisseur.facture-rec.class.php @@ -181,7 +181,7 @@ class FactureFournisseurRec extends CommonInvoice 'titre' =>array('type'=>'varchar(100)', 'label'=>'Titre', 'enabled'=>1, 'showoncombobox' => 1, 'visible'=>-1, 'position'=>15), 'ref_supplier' =>array('type'=>'varchar(180)', 'label'=>'RefSupplier', 'enabled'=>1, 'showoncombobox' => 1, 'visible'=>-1, 'position'=>20), 'entity' =>array('type'=>'integer', 'label'=>'Entity', 'default'=>1, 'enabled'=>1, 'visible'=>-2, 'notnull'=>1, 'position'=>25, 'index'=>1), - 'fk_soc' =>array('type'=>'integer:Societe:societe/class/societe.class.php', 'label'=>'ThirdParty', 'enabled'=>'$conf->societe->enabled', 'visible'=>-1, 'notnull'=>1, 'position'=>30), + 'fk_soc' =>array('type'=>'integer:Societe:societe/class/societe.class.php', 'label'=>'ThirdParty', 'enabled'=>'isModEnabled("societe")', 'visible'=>-1, 'notnull'=>1, 'position'=>30), 'datec' =>array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>1, 'visible'=>-1, 'position'=>35), 'tms' =>array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>40), 'suspended' =>array('type'=>'integer', 'label'=>'Suspended', 'enabled'=>1, 'visible'=>-1, 'position'=>225), diff --git a/htdocs/fourn/class/fournisseur.facture.class.php b/htdocs/fourn/class/fournisseur.facture.class.php index adf9fac3bde..524b50a5061 100644 --- a/htdocs/fourn/class/fournisseur.facture.class.php +++ b/htdocs/fourn/class/fournisseur.facture.class.php @@ -275,7 +275,7 @@ class FactureFournisseur extends CommonInvoice 'entity' =>array('type'=>'integer', 'label'=>'Entity', 'default'=>1, 'enabled'=>1, 'visible'=>-2, 'notnull'=>1, 'position'=>25, 'index'=>1), 'ref_ext' =>array('type'=>'varchar(255)', 'label'=>'RefExt', 'enabled'=>1, 'visible'=>0, 'position'=>30), 'type' =>array('type'=>'smallint(6)', 'label'=>'Type', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>35), - 'fk_soc' =>array('type'=>'integer:Societe:societe/class/societe.class.php', 'label'=>'ThirdParty', 'enabled'=>'$conf->societe->enabled', 'visible'=>-1, 'notnull'=>1, 'position'=>40), + 'fk_soc' =>array('type'=>'integer:Societe:societe/class/societe.class.php', 'label'=>'ThirdParty', 'enabled'=>'isModEnabled("societe")', 'visible'=>-1, 'notnull'=>1, 'position'=>40), 'datec' =>array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>1, 'visible'=>-1, 'position'=>45), 'datef' =>array('type'=>'date', 'label'=>'Date', 'enabled'=>1, 'visible'=>-1, 'position'=>50), 'tms' =>array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>55), diff --git a/htdocs/modulebuilder/template/class/myobject.class.php b/htdocs/modulebuilder/template/class/myobject.class.php index 2fe7d983513..086420ef653 100644 --- a/htdocs/modulebuilder/template/class/myobject.class.php +++ b/htdocs/modulebuilder/template/class/myobject.class.php @@ -119,7 +119,7 @@ class MyObject extends CommonObject 'label' => array('type'=>'varchar(255)', 'label'=>'Label', 'enabled'=>1, 'visible'=>1, 'position'=>30, 'searchall'=>1, 'css'=>'minwidth300', 'cssview'=>'wordbreak', 'help'=>'Help text', 'showoncombobox'=>2, 'validate'=>1, 'alwayseditable'=>1), 'amount' => array('type'=>'price', 'label'=>'Amount', 'enabled'=>1, 'visible'=>1, 'default'=>'null', 'position'=>40, 'searchall'=>0, 'isameasure'=>1, 'help'=>'Help text for amount', 'validate'=>1), 'qty' => array('type'=>'real', 'label'=>'Qty', 'enabled'=>1, 'visible'=>1, 'default'=>'0', 'position'=>45, 'searchall'=>0, 'isameasure'=>1, 'help'=>'Help text for quantity', 'css'=>'maxwidth75imp', 'validate'=>1), - 'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php:1:status=1 AND entity IN (__SHARED_ENTITIES__)', 'picto'=>'company', 'label'=>'ThirdParty', 'visible'=> 1, 'enabled'=>'$conf->societe->enabled', 'position'=>50, 'notnull'=>-1, 'index'=>1, 'help'=>'OrganizationEventLinkToThirdParty', 'validate'=>1, 'css'=>'maxwidth500 widthcentpercentminusxx', 'csslist'=>'tdoverflowmax150'), + 'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php:1:status=1 AND entity IN (__SHARED_ENTITIES__)', 'picto'=>'company', 'label'=>'ThirdParty', 'visible'=> 1, 'enabled'=>'isModEnabled("societe")', 'position'=>50, 'notnull'=>-1, 'index'=>1, 'help'=>'OrganizationEventLinkToThirdParty', 'validate'=>1, 'css'=>'maxwidth500 widthcentpercentminusxx', 'csslist'=>'tdoverflowmax150'), 'fk_project' => array('type'=>'integer:Project:projet/class/project.class.php:1', 'label'=>'Project', 'picto'=>'project', 'enabled'=>'$conf->project->enabled', 'visible'=>-1, 'position'=>52, 'notnull'=>-1, 'index'=>1, 'validate'=>1, 'css'=>'maxwidth500 widthcentpercentminusxx', 'csslist'=>'tdoverflowmax150'), 'description' => array('type'=>'text', 'label'=>'Description', 'enabled'=>1, 'visible'=>3, 'position'=>60, 'validate'=>1), 'note_public' => array('type'=>'html', 'label'=>'NotePublic', 'enabled'=>1, 'visible'=>0, 'position'=>61, 'validate'=>1, 'cssview'=>'wordbreak'), diff --git a/htdocs/mrp/class/mo.class.php b/htdocs/mrp/class/mo.class.php index 8624713c689..1aaf51808b8 100644 --- a/htdocs/mrp/class/mo.class.php +++ b/htdocs/mrp/class/mo.class.php @@ -106,7 +106,7 @@ class Mo extends CommonObject 'fk_product' => array('type'=>'integer:Product:product/class/product.class.php:0', 'label'=>'Product', 'enabled'=>'$conf->product->enabled', 'visible'=>1, 'position'=>35, 'notnull'=>1, 'index'=>1, 'comment'=>"Product to produce", 'css'=>'maxwidth300', 'csslist'=>'tdoverflowmax100', 'picto'=>'product'), 'qty' => array('type'=>'real', 'label'=>'QtyToProduce', 'enabled'=>1, 'visible'=>1, 'position'=>40, 'notnull'=>1, 'comment'=>"Qty to produce", 'css'=>'width75', 'default'=>1, 'isameasure'=>1), 'label' => array('type'=>'varchar(255)', 'label'=>'Label', 'enabled'=>1, 'visible'=>1, 'position'=>42, 'notnull'=>-1, 'searchall'=>1, 'showoncombobox'=>'2', 'css'=>'maxwidth300', 'csslist'=>'tdoverflowmax200', 'alwayseditable'=>1), - 'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php:1', 'label'=>'ThirdParty', 'picto'=>'company', 'enabled'=>'$conf->societe->enabled', 'visible'=>-1, 'position'=>50, 'notnull'=>-1, 'index'=>1, 'css'=>'maxwidth400', 'csslist'=>'tdoverflowmax150'), + 'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php:1', 'label'=>'ThirdParty', 'picto'=>'company', 'enabled'=>'isModEnabled("societe")', 'visible'=>-1, 'position'=>50, 'notnull'=>-1, 'index'=>1, 'css'=>'maxwidth400', 'csslist'=>'tdoverflowmax150'), 'fk_project' => array('type'=>'integer:Project:projet/class/project.class.php:1:fk_statut=1', 'label'=>'Project', 'picto'=>'project', 'enabled'=>'$conf->project->enabled', 'visible'=>-1, 'position'=>51, 'notnull'=>-1, 'index'=>1, 'css'=>'minwidth200 maxwidth400', 'csslist'=>'tdoverflowmax100'), 'fk_warehouse' => array('type'=>'integer:Entrepot:product/stock/class/entrepot.class.php:0', 'label'=>'WarehouseForProduction', 'picto'=>'stock', 'enabled'=>'$conf->stock->enabled', 'visible'=>1, 'position'=>52, 'css'=>'maxwidth400', 'csslist'=>'tdoverflowmax200'), 'note_public' => array('type'=>'html', 'label'=>'NotePublic', 'enabled'=>1, 'visible'=>0, 'position'=>61, 'notnull'=>-1,), diff --git a/htdocs/recruitment/class/recruitmentjobposition.class.php b/htdocs/recruitment/class/recruitmentjobposition.class.php index 7a9d077f910..fb34e33376e 100644 --- a/htdocs/recruitment/class/recruitmentjobposition.class.php +++ b/htdocs/recruitment/class/recruitmentjobposition.class.php @@ -124,7 +124,7 @@ class RecruitmentJobPosition extends CommonObject 'email_recruiter' => array('type'=>'varchar(255)', 'label'=>'EmailRecruiter', 'enabled'=>'1', 'position'=>54, 'notnull'=>0, 'visible'=>-1, 'help'=>'ToUseAGenericEmail', 'picto'=>'email'), 'fk_user_supervisor' => array('type'=>'integer:User:user/class/user.class.php:t.statut = 1', 'label'=>'FutureManager', 'enabled'=>'1', 'position'=>55, 'notnull'=>0, 'visible'=>-1, 'foreignkey'=>'user.rowid', 'css'=>'maxwidth500', 'csslist'=>'tdoverflowmax150', 'picto'=>'user'), 'fk_establishment' => array('type'=>'integer:Establishment:hrm/class/establishment.class.php', 'label'=>'Establishment', 'enabled'=>'$conf->hrm->enabled', 'position'=>56, 'notnull'=>0, 'visible'=>-1, 'foreignkey'=>'establishment.rowid',), - 'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php:1:status=1 AND entity IN (__SHARED_ENTITIES__)', 'label'=>'WorkPlace', 'enabled'=>'$conf->societe->enabled', 'position'=>57, 'notnull'=>-1, 'visible'=>-1, 'css'=>'maxwidth500', 'index'=>1, 'help'=>"IfJobIsLocatedAtAPartner", 'picto'=>'company'), + 'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php:1:status=1 AND entity IN (__SHARED_ENTITIES__)', 'label'=>'WorkPlace', 'enabled'=>'isModEnabled("societe")', 'position'=>57, 'notnull'=>-1, 'visible'=>-1, 'css'=>'maxwidth500', 'index'=>1, 'help'=>"IfJobIsLocatedAtAPartner", 'picto'=>'company'), 'date_planned' => array('type'=>'date', 'label'=>'DateExpected', 'enabled'=>'1', 'position'=>60, 'notnull'=>0, 'visible'=>1,), 'remuneration_suggested' => array('type'=>'varchar(255)', 'label'=>'Remuneration', 'enabled'=>'1', 'position'=>62, 'notnull'=>0, 'visible'=>1,), 'description' => array('type'=>'html', 'label'=>'Description', 'enabled'=>'1', 'position'=>65, 'notnull'=>0, 'visible'=>3,), diff --git a/htdocs/ticket/class/ticket.class.php b/htdocs/ticket/class/ticket.class.php index 2aacffefcd1..ac6abea95d3 100644 --- a/htdocs/ticket/class/ticket.class.php +++ b/htdocs/ticket/class/ticket.class.php @@ -280,7 +280,7 @@ class Ticket extends CommonObject 'type_code' => array('type'=>'varchar(32)', 'label'=>'Type', 'visible'=>1, 'enabled'=>1, 'position'=>20, 'notnull'=>-1, 'help'=>"", 'csslist'=>'maxwidth125 tdoverflowmax50'), 'category_code' => array('type'=>'varchar(32)', 'label'=>'TicketCategory', 'visible'=>-1, 'enabled'=>1, 'position'=>21, 'notnull'=>-1, 'help'=>"", 'css'=>'maxwidth100 tdoverflowmax200'), 'severity_code' => array('type'=>'varchar(32)', 'label'=>'Severity', 'visible'=>1, 'enabled'=>1, 'position'=>22, 'notnull'=>-1, 'help'=>"", 'css'=>'maxwidth100'), - 'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php', 'label'=>'ThirdParty', 'visible'=>1, 'enabled'=>'$conf->societe->enabled', 'position'=>50, 'notnull'=>-1, 'index'=>1, 'searchall'=>1, 'help'=>"OrganizationEventLinkToThirdParty", 'css'=>'tdoverflowmax150 maxwidth150onsmartphone'), + 'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php', 'label'=>'ThirdParty', 'visible'=>1, 'enabled'=>'isModEnabled("societe")', 'position'=>50, 'notnull'=>-1, 'index'=>1, 'searchall'=>1, 'help'=>"OrganizationEventLinkToThirdParty", 'css'=>'tdoverflowmax150 maxwidth150onsmartphone'), 'notify_tiers_at_create' => array('type'=>'integer', 'label'=>'NotifyThirdparty', 'visible'=>-1, 'enabled'=>0, 'position'=>51, 'notnull'=>1, 'index'=>1), 'fk_project' => array('type'=>'integer:Project:projet/class/project.class.php', 'label'=>'Project', 'visible'=>-1, 'enabled'=>'$conf->project->enabled', 'position'=>52, 'notnull'=>-1, 'index'=>1, 'help'=>"LinkToProject"), //'timing' => array('type'=>'varchar(20)', 'label'=>'Timing', 'visible'=>-1, 'enabled'=>1, 'position'=>42, 'notnull'=>-1, 'help'=>""), // what is this ? From f6cde9507ec3bccabb1dc07b0e94e0ccec2195b2 Mon Sep 17 00:00:00 2001 From: atm-lena Date: Wed, 11 Jan 2023 09:35:28 +0100 Subject: [PATCH 0719/1128] FIX : alias name in contact list --- htdocs/contact/list.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/contact/list.php b/htdocs/contact/list.php index da07a2b699b..a025ef81b97 100644 --- a/htdocs/contact/list.php +++ b/htdocs/contact/list.php @@ -357,6 +357,9 @@ if (!empty($conf->global->THIRDPARTY_ENABLE_PROSPECTION_ON_ALTERNATIVE_ADRESSES) $contactstatic->loadCacheOfProspStatus(); } +$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage; +$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields + // Select every potentiels, and note each potentiels which fit in search parameters $tab_level = array(); $sql = "SELECT code, label, sortorder"; @@ -692,9 +695,6 @@ if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && ( exit; } -$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage; -$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields - $help_url = 'EN:Module_Third_Parties|FR:Module_Tiers|ES:Módulo_Empresas'; llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', 'bodyforlist'); @@ -1377,7 +1377,7 @@ while ($i < min($num, $limit)) { if ($obj->socid) { $objsoc = new Societe($db); $objsoc->fetch($obj->socid); - print $objsoc->getNomUrl(1); + print $objsoc->getNomUrl(1, '', 100, 0, 1, empty($arrayfields['s.name_alias']['checked']) ? 0 : 1); } else { print ' '; } From c0a7bca04e173b6f4aa692f2dc2e0d2b6143bd7f Mon Sep 17 00:00:00 2001 From: Maxime Kohlhaas Date: Wed, 11 Jan 2023 10:50:58 +0100 Subject: [PATCH 0720/1128] Fix supplier reccurent invoice if no pdf model --- htdocs/fourn/class/fournisseur.facture-rec.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/fourn/class/fournisseur.facture-rec.class.php b/htdocs/fourn/class/fournisseur.facture-rec.class.php index 31bc37b6e1a..024f6bf3e6f 100644 --- a/htdocs/fourn/class/fournisseur.facture-rec.class.php +++ b/htdocs/fourn/class/fournisseur.facture-rec.class.php @@ -1331,7 +1331,7 @@ class FactureFournisseurRec extends CommonInvoice // We refresh the object in order to have all necessary data (like date_lim_reglement) $new_fac_fourn->fetch($new_fac_fourn->id); $result = $new_fac_fourn->generateDocument($facturerec->model_pdf, $langs); - if ($result <= 0) { + if ($result < 0) { $this->errors = $new_fac_fourn->errors; $this->error = $new_fac_fourn->error; $error++; From 7bcaae86f4b9656302a544805a316282e6591805 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Wed, 11 Jan 2023 13:33:29 +0100 Subject: [PATCH 0721/1128] Fix php 8 warning --- htdocs/admin/dict.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/admin/dict.php b/htdocs/admin/dict.php index d928931c9ab..e5c9dcb3127 100644 --- a/htdocs/admin/dict.php +++ b/htdocs/admin/dict.php @@ -2514,7 +2514,7 @@ function fieldList($fieldlist, $obj = '', $tabname = '', $context = '') print ''; } elseif ($value == 'type_duration') { print ''; - print $form->selectTypeDuration('', $obj->{$value}, array('i','h')); + print $form->selectTypeDuration('', (!empty($obj->{$value}) ? $obj->{$value}:''), array('i','h')); print ''; } else { $fieldValue = isset($obj->{$value}) ? $obj->{$value}: ''; From e820bb91c2662002e080c3e3796a8f6f1680e19d Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Wed, 11 Jan 2023 14:18:45 +0100 Subject: [PATCH 0722/1128] kanban view for localtax list --- .../compta/localtax/class/localtax.class.php | 34 ++++++++++++++ htdocs/compta/localtax/list.php | 44 ++++++++++++++----- 2 files changed, 68 insertions(+), 10 deletions(-) diff --git a/htdocs/compta/localtax/class/localtax.class.php b/htdocs/compta/localtax/class/localtax.class.php index ed467ec91f4..f5cb98c1199 100644 --- a/htdocs/compta/localtax/class/localtax.class.php +++ b/htdocs/compta/localtax/class/localtax.class.php @@ -629,4 +629,38 @@ class Localtax extends CommonObject return ''; } + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $langs, $db; + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).''; + if (property_exists($this, 'label')) { + $return .= ' | '.$this->label.''; + } + if (property_exists($this, 'datev')) { + $return .= '
'.$langs->trans("DateEnd").' : '.dol_print_date($db->jdate($this->datev), 'day').''; + } + if (property_exists($this, 'datep')) { + $return .= '
'.$langs->trans("DatePayment", '', '', '', '', 5).' : '.dol_print_date($db->jdate($this->datep), 'day').''; + } + if (property_exists($this, 'amount')) { + $return .= '
'.$langs->trans("Amount").' : '.price($this->amount).''; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } diff --git a/htdocs/compta/localtax/list.php b/htdocs/compta/localtax/list.php index ee2e13e1d57..42f4d326811 100644 --- a/htdocs/compta/localtax/list.php +++ b/htdocs/compta/localtax/list.php @@ -35,7 +35,7 @@ if ($user->socid) { } $result = restrictedArea($user, 'tax', '', '', 'charges'); $ltt = GETPOST("localTaxType", 'int'); - +$mode = GETPOST('mode', 'alpha'); /* * View @@ -49,7 +49,14 @@ $url = DOL_URL_ROOT.'/compta/localtax/card.php?action=create&localTaxType='.$ltt if (!empty($socid)) { $url .= '&socid='.$socid; } -$newcardbutton = dolGetButtonTitle($langs->trans('NewLocalTaxPayment', ($ltt + 1)), '', 'fa fa-plus-circle', $url, '', $user->rights->tax->charges->creer); +$param = ''; +if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); +} +$newcardbutton = ''; +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?localTaxType='.$ltt.'&mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?localTaxType='.$ltt.'&mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('NewLocalTaxPayment', ($ltt + 1)), '', 'fa fa-plus-circle', $url, '', $user->rights->tax->charges->creer); print load_fiche_titre($langs->transcountry($ltt == 2 ? "LT2Payments" : "LT1Payments", $mysoc->country_code), $newcardbutton, 'title_accountancy'); @@ -77,19 +84,36 @@ if ($result) { while ($i < $num) { $obj = $db->fetch_object($result); - print ''; - + $localtax_static->label = $obj->label; $localtax_static->id = $obj->rowid; $localtax_static->ref = $obj->rowid; - print "".$localtax_static->getNomUrl(1)."\n"; - print "".dol_trunc($obj->label, 40)."\n"; - print ''.dol_print_date($db->jdate($obj->datev), 'day')."\n"; - print ''.dol_print_date($db->jdate($obj->datep), 'day')."\n"; + $localtax_static->datev = $obj->datev; + $localtax_static->datep = $obj->datep; + $localtax_static->amount = $obj->amount; + $total = $total + $obj->amount; - print ''.price($obj->amount).''; - print "\n"; + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + print '
'; + } + // Output Kanban + print $localtax_static->getKanbanView(''); + if ($i == ($num - 1)) { + print '
'; + print ''; + } + } else { + print ''; + print "".$localtax_static->getNomUrl(1)."\n"; + print "".dol_trunc($obj->label, 40)."\n"; + print ''.dol_print_date($db->jdate($obj->datev), 'day')."\n"; + print ''.dol_print_date($db->jdate($obj->datep), 'day')."\n"; + print ''.price($obj->amount).''; + print "\n"; + } $i++; } print ''.$langs->trans("Total").''; From 91837dd2efc979721ed300807e827eb6d1c58da3 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Wed, 11 Jan 2023 15:03:55 +0100 Subject: [PATCH 0723/1128] kanban mode for list of salaries --- htdocs/salaries/class/salary.class.php | 34 ++++ htdocs/salaries/list.php | 217 ++++++++++++++----------- 2 files changed, 155 insertions(+), 96 deletions(-) diff --git a/htdocs/salaries/class/salary.class.php b/htdocs/salaries/class/salary.class.php index 25adb60382c..72a228658d8 100644 --- a/htdocs/salaries/class/salary.class.php +++ b/htdocs/salaries/class/salary.class.php @@ -707,4 +707,38 @@ class Salary extends CommonObject return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statusType, $mode); } + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $langs, $db; + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(1) : $this->ref).''; + if (property_exists($this, 'fk_user')) { + $return .= ' | '.$this->fk_user.''; + } + if (property_exists($this, 'type_payment')) { + $return .= '
'.$langs->trans("PaymentMode").' : '.$this->type_payment.''; + } + if (property_exists($this, 'amount')) { + $return .= '
'.$langs->trans("Amount").' : '.price($this->amount).''; + } + if (method_exists($this, 'LibStatut')) { + $return .= '
'.$this->LibStatut($this->paye, 5, $this->alreadypaid).'
'; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } diff --git a/htdocs/salaries/list.php b/htdocs/salaries/list.php index 361107005a6..edeafa94c6a 100644 --- a/htdocs/salaries/list.php +++ b/htdocs/salaries/list.php @@ -44,6 +44,8 @@ $toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : str_replace('_', '', basename(dirname(__FILE__)).basename(__FILE__, '.php')); // To manage different context of search $backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print') +$mode = GETPOST('mode', 'alpha'); //for mode view + // Load variable for pagination $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit; @@ -315,6 +317,9 @@ llxHeader('', $title, $help_url); $arrayofselected = is_array($toselect) ? $toselect : array(); $param = ''; +if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); +} if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -379,11 +384,16 @@ print ''; print ''; print ''; print ''; +print ''; + $url = DOL_URL_ROOT.'/salaries/card.php?action=create'; if (!empty($socid)) { $url .= '&socid='.$socid; } +$newcardbutton = ''; +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); $newcardbutton = dolGetButtonTitle($langs->trans('NewSalaryPayment'), '', 'fa fa-plus-circle', $url, '', $user->rights->salaries->write); print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'salary', 0, $newcardbutton, '', $limit, 0, 0, 1); @@ -534,121 +544,136 @@ while ($i < ($limit ? min($num, $limit) : $num)) { $salstatic->ref = $obj->rowid; $salstatic->label = $obj->label; $salstatic->paye = $obj->paye; - $salstatic->datesp = $db->jdate($obj->datesp); - $salstatic->dateep = $db->jdate($obj->dateep); + $salstatic->datesp = $obj->datesp; + $salstatic->dateep = $obj->dateep; + $salstatic->amount = $obj->amount; + $salstatic->fk_user = $userstatic->getNomUrl(1); + $salstatic->type_payment = $obj->payment_code; - // Show here line of result - print ''; + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + print '
'; + } + // Output Kanban + print $salstatic->getKanbanView(''); + if ($i == (min($num, $limit) - 1)) { + print '
'; + print ''; + } + } else { + // Show here line of result + print ''; - // Ref - print "".$salstatic->getNomUrl(1)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } + // Ref + print "".$salstatic->getNomUrl(1)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } - // Label payment - print ''.dol_escape_htmltag($obj->label)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } + // Label payment + print ''.dol_escape_htmltag($obj->label)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } - // Date Start - print ''.dol_print_date($db->jdate($obj->datesp), 'day')."\n"; - if (!$i) { - $totalarray['nbfield']++; - } + // Date Start + print ''.dol_print_date($db->jdate($obj->datesp), 'day')."\n"; + if (!$i) { + $totalarray['nbfield']++; + } - // Date End - print ''.dol_print_date($db->jdate($obj->dateep), 'day')."\n"; - if (!$i) { - $totalarray['nbfield']++; - } + // Date End + print ''.dol_print_date($db->jdate($obj->dateep), 'day')."\n"; + if (!$i) { + $totalarray['nbfield']++; + } - // Employee - print ''.$userstatic->getNomUrl(1)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } + // Employee + print ''.$userstatic->getNomUrl(1)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } - // Type - print ''; - if (!empty($obj->payment_code)) print $langs->trans("PaymentTypeShort".$obj->payment_code); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - - // Account - if (isModEnabled("banque")) { + // Type print ''; - if ($obj->fk_account > 0) { - //$accountstatic->fetch($obj->fk_bank); - $accountstatic->id = $obj->bid; - $accountstatic->ref = $obj->bref; - $accountstatic->label = $obj->blabel; - $accountstatic->number = $obj->bnumber; - $accountstatic->iban = $obj->iban; - $accountstatic->bic = $obj->bic; - $accountstatic->currency_code = $langs->trans("Currency".$obj->currency_code); - $accountstatic->account_number = $obj->account_number; - $accountstatic->clos = $obj->clos; + if (!empty($obj->payment_code)) print $langs->trans("PaymentTypeShort".$obj->payment_code); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } - if (isModEnabled('accounting')) { + // Account + if (isModEnabled("banque")) { + print ''; + if ($obj->fk_account > 0) { + //$accountstatic->fetch($obj->fk_bank); + $accountstatic->id = $obj->bid; + $accountstatic->ref = $obj->bref; + $accountstatic->label = $obj->blabel; + $accountstatic->number = $obj->bnumber; + $accountstatic->iban = $obj->iban; + $accountstatic->bic = $obj->bic; + $accountstatic->currency_code = $langs->trans("Currency".$obj->currency_code); $accountstatic->account_number = $obj->account_number; + $accountstatic->clos = $obj->clos; - $accountingjournal = new AccountingJournal($db); - $accountingjournal->fetch($obj->fk_accountancy_journal); + if (isModEnabled('accounting')) { + $accountstatic->account_number = $obj->account_number; - $accountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1, '', 1); + $accountingjournal = new AccountingJournal($db); + $accountingjournal->fetch($obj->fk_accountancy_journal); + + $accountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1, '', 1); + } + //$accountstatic->label = $obj->blabel; + print $accountstatic->getNomUrl(1); + } else { + print ' '; } - //$accountstatic->label = $obj->blabel; - print $accountstatic->getNomUrl(1); - } else { - print ' '; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // if (!$i) $totalarray['pos'][$totalarray['nbfield']] = 'totalttcfield'; + + // Amount + print ''.price($obj->amount).''; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'totalttcfield'; + } + $totalarray['val']['totalttcfield'] += $obj->amount; + + print ''.$salstatic->LibStatut($obj->paye, 5, $obj->alreadypayed).''; + if (!$i) $totalarray['nbfield']++; + + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Action column + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($object->id, $arrayofselected)) { + $selected = 1; + } + print ''; } print ''; if (!$i) { $totalarray['nbfield']++; } + + print ''."\n"; } - - // if (!$i) $totalarray['pos'][$totalarray['nbfield']] = 'totalttcfield'; - - // Amount - print ''.price($obj->amount).''; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'totalttcfield'; - } - $totalarray['val']['totalttcfield'] += $obj->amount; - - print ''.$salstatic->LibStatut($obj->paye, 5, $obj->alreadypayed).''; - if (!$i) $totalarray['nbfield']++; - - // Extra fields - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - // Action column - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($object->id, $arrayofselected)) { - $selected = 1; - } - print ''; - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - - print ''."\n"; - $i++; } From 7213595cef946f1c29b4516e2768586c710fe078 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Wed, 11 Jan 2023 15:19:21 +0100 Subject: [PATCH 0724/1128] modify kanban mode for list of salaries --- htdocs/salaries/class/salary.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/salaries/class/salary.class.php b/htdocs/salaries/class/salary.class.php index 72a228658d8..7f9ea31cdc9 100644 --- a/htdocs/salaries/class/salary.class.php +++ b/htdocs/salaries/class/salary.class.php @@ -716,7 +716,7 @@ class Salary extends CommonObject */ public function getKanbanView($option = '') { - global $langs, $db; + global $langs; $return = '
'; $return .= '
'; $return .= ''; From a410100496dc54a16b4c713fff44d2e098bdba9a Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Wed, 11 Jan 2023 15:23:12 +0100 Subject: [PATCH 0725/1128] modify variable in class localtax --- htdocs/compta/localtax/class/localtax.class.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/compta/localtax/class/localtax.class.php b/htdocs/compta/localtax/class/localtax.class.php index f5cb98c1199..d2300128550 100644 --- a/htdocs/compta/localtax/class/localtax.class.php +++ b/htdocs/compta/localtax/class/localtax.class.php @@ -638,7 +638,7 @@ class Localtax extends CommonObject */ public function getKanbanView($option = '') { - global $langs, $db; + global $langs; $return = '
'; $return .= '
'; $return .= ''; @@ -650,10 +650,10 @@ class Localtax extends CommonObject $return .= ' | '.$this->label.''; } if (property_exists($this, 'datev')) { - $return .= '
'.$langs->trans("DateEnd").' : '.dol_print_date($db->jdate($this->datev), 'day').''; + $return .= '
'.$langs->trans("DateEnd").' : '.dol_print_date($this->db->jdate($this->datev), 'day').''; } if (property_exists($this, 'datep')) { - $return .= '
'.$langs->trans("DatePayment", '', '', '', '', 5).' : '.dol_print_date($db->jdate($this->datep), 'day').''; + $return .= '
'.$langs->trans("DatePayment", '', '', '', '', 5).' : '.dol_print_date($this->db->jdate($this->datep), 'day').''; } if (property_exists($this, 'amount')) { $return .= '
'.$langs->trans("Amount").' : '.price($this->amount).''; From cfb16cc9cd296553c5acf9141941b1e25901ed46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9=20Courtier?= Date: Wed, 11 Jan 2023 16:49:59 +0100 Subject: [PATCH 0726/1128] FIX: ref not available after ecmFile create() --- htdocs/ecm/class/ecmfiles.class.php | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/htdocs/ecm/class/ecmfiles.class.php b/htdocs/ecm/class/ecmfiles.class.php index a451a462ea3..d6c906527f4 100644 --- a/htdocs/ecm/class/ecmfiles.class.php +++ b/htdocs/ecm/class/ecmfiles.class.php @@ -240,12 +240,9 @@ class EcmFiles extends CommonObject } // If ref not defined - $ref = ''; - if (!empty($this->ref)) { - $ref = $this->ref; - } else { + if (empty($this->ref)) { include_once DOL_DOCUMENT_ROOT.'/core/lib/security.lib.php'; - $ref = dol_hash($this->filepath.'/'.$this->filename, 3); + $this->ref = dol_hash($this->filepath.'/'.$this->filename, 3); } $maxposition = 0; @@ -300,7 +297,7 @@ class EcmFiles extends CommonObject $sql .= 'src_object_type,'; $sql .= 'src_object_id'; $sql .= ') VALUES ('; - $sql .= " '".$this->db->escape($ref)."', "; + $sql .= " '".$this->db->escape($this->ref)."', "; $sql .= ' '.(!isset($this->label) ? 'NULL' : "'".$this->db->escape($this->label)."'").','; $sql .= ' '.(!isset($this->share) ? 'NULL' : "'".$this->db->escape($this->share)."'").','; $sql .= ' '.$this->entity.','; From 62d33484715766b6c22ef3788327cc27d2d3052d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 11 Jan 2023 16:56:06 +0100 Subject: [PATCH 0727/1128] Make module Paybox deprecated --- htdocs/core/modules/modPaybox.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/modPaybox.class.php b/htdocs/core/modules/modPaybox.class.php index cf6ef512873..3df0b8f6a1d 100644 --- a/htdocs/core/modules/modPaybox.class.php +++ b/htdocs/core/modules/modPaybox.class.php @@ -54,7 +54,7 @@ class modPayBox extends DolibarrModules // Module description, used if translation string 'ModuleXXXDesc' not found (where XXX is value of numeric property 'numero' of module) $this->description = "Module to offer an online payment page by credit card with PayBox"; // Possible values for version are: 'development', 'experimental', 'dolibarr' or version - $this->version = 'dolibarr'; + $this->version = 'dolibarr_deprecated'; // 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. From 2eb054a170fcc4706ab42a94c0a0e569efde6d1a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 11 Jan 2023 17:06:23 +0100 Subject: [PATCH 0728/1128] Fix try fix function not found of qodana --- htdocs/api/index.php | 12 ++++++------ htdocs/core/class/dolgeoip.class.php | 6 ++++-- htdocs/core/class/translate.class.php | 6 ++++-- htdocs/core/lib/files.lib.php | 6 +++--- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/htdocs/api/index.php b/htdocs/api/index.php index ba195b82c08..4e4da2c94cc 100644 --- a/htdocs/api/index.php +++ b/htdocs/api/index.php @@ -389,13 +389,13 @@ if (!empty($reg[1]) && ($reg[1] != 'explorer' || ($reg[2] != '/swagger.json' && $usecompression = (empty($conf->global->API_DISABLE_COMPRESSION) && !empty($_SERVER['HTTP_ACCEPT_ENCODING'])); $foundonealgorithm = 0; if ($usecompression) { - if (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'br') !== false && is_callable('brotli_compress')) { + if (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'br') !== false && function_exists('brotli_compress')) { $foundonealgorithm++; } - if (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'bz') !== false && is_callable('bzcompress')) { + if (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'bz') !== false && function_exists('bzcompress')) { $foundonealgorithm++; } - if (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false && is_callable('gzencode')) { + if (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false && function_exists('gzencode')) { $foundonealgorithm++; } if (!$foundonealgorithm) { @@ -413,13 +413,13 @@ $result = $api->r->handle(); if (Luracast\Restler\Defaults::$returnResponse) { // We try to compress the data received data - if (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'br') !== false && is_callable('brotli_compress') && defined('BROTLI_TEXT')) { + if (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'br') !== false && function_exists('brotli_compress') && defined('BROTLI_TEXT')) { header('Content-Encoding: br'); $result = brotli_compress($result, 11, constant('BROTLI_TEXT')); - } elseif (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'bz') !== false && is_callable('bzcompress')) { + } elseif (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'bz') !== false && function_exists('bzcompress')) { header('Content-Encoding: bz'); $result = bzcompress($result, 9); - } elseif (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false && is_callable('gzencode')) { + } elseif (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false && function_exists('gzencode')) { header('Content-Encoding: gzip'); $result = gzencode($result, 9); } else { diff --git a/htdocs/core/class/dolgeoip.class.php b/htdocs/core/class/dolgeoip.class.php index a2eea7023d9..e5001270131 100644 --- a/htdocs/core/class/dolgeoip.class.php +++ b/htdocs/core/class/dolgeoip.class.php @@ -144,10 +144,12 @@ class DolGeoIP return ''; } } else { - if (!function_exists('geoip_country_code_by_addr_v6')) { + if (function_exists('geoip_country_code_by_addr_v6')) { + return strtolower(geoip_country_code_by_addr_v6($this->gi, $ip)); + } elseif (function_exists('geoip_country_code_by_name_v6')) { return strtolower(geoip_country_code_by_name_v6($this->gi, $ip)); } - return strtolower(geoip_country_code_by_addr_v6($this->gi, $ip)); + return ''; } } } diff --git a/htdocs/core/class/translate.class.php b/htdocs/core/class/translate.class.php index 3f2f756977d..2315428b37a 100644 --- a/htdocs/core/class/translate.class.php +++ b/htdocs/core/class/translate.class.php @@ -932,8 +932,10 @@ class Translate $fonc = 'numberwords'; if (file_exists($newdir.'/functions_'.$fonc.'.lib.php')) { include_once $newdir.'/functions_'.$fonc.'.lib.php'; - $newnumber = numberwords_getLabelFromNumber($this, $number, $isamount); - break; + if (function_exists('numberwords_getLabelFromNumber')) { + $newnumber = numberwords_getLabelFromNumber($this, $number, $isamount); + break; + } } } diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index ad7d7cecfa5..207f5bafeb7 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -2058,13 +2058,13 @@ function dol_compress_file($inputfile, $outputfile, $mode = "gz", &$errorstring dol_syslog("dol_compress_file mode=".$mode." inputfile=".$inputfile." outputfile=".$outputfile); $data = implode("", file(dol_osencode($inputfile))); - if ($mode == 'gz') { + if ($mode == 'gz' && function_exists('gzencode')) { $foundhandler = 1; $compressdata = gzencode($data, 9); - } elseif ($mode == 'bz') { + } elseif ($mode == 'bz' && function_exists('bzcompress')) { $foundhandler = 1; $compressdata = bzcompress($data, 9); - } elseif ($mode == 'zstd') { + } elseif ($mode == 'zstd' && function_exists('zstd_compress')) { $foundhandler = 1; $compressdata = zstd_compress($data, 9); } elseif ($mode == 'zip') { From 356923b3695bd1ef773dd7789da6c04c7ea71394 Mon Sep 17 00:00:00 2001 From: atm-florian Date: Wed, 11 Jan 2023 17:31:37 +0100 Subject: [PATCH 0729/1128] FIX 14.0: move splitting of module:submodule string out of the genallowed condition --- htdocs/core/class/html.formfile.class.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index 6fe10788c54..c1438209d5e 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -463,6 +463,15 @@ class FormFile $titletoshow = ($title == 'none' ? '' : $title); } + $submodulepart = $modulepart; + + // modulepart = 'nameofmodule' or 'nameofmodule:NameOfObject' + $tmp = explode(':', $modulepart); + if (!empty($tmp[1])) { + $modulepart = $tmp[0]; + $submodulepart = $tmp[1]; + } + // Show table if ($genallowed) { $modellist = array(); @@ -662,15 +671,6 @@ class FormFile $modellist = ModelePDFUserGroup::liste_modeles($this->db); } } else { - $submodulepart = $modulepart; - - // modulepart = 'nameofmodule' or 'nameofmodule:NameOfObject' - $tmp = explode(':', $modulepart); - if (!empty($tmp[1])) { - $modulepart = $tmp[0]; - $submodulepart = $tmp[1]; - } - // For normalized standard modules $file = dol_buildpath('/core/modules/'.$modulepart.'/modules_'.strtolower($submodulepart).'.php', 0); if (file_exists($file)) { From 87d2e86abac222b85298746eb33cb56f227c3c81 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Wed, 11 Jan 2023 17:39:46 +0100 Subject: [PATCH 0730/1128] kanban mode for pyment salaries list --- htdocs/salaries/class/paymentsalary.class.php | 35 +++ htdocs/salaries/payments.php | 247 ++++++++++-------- 2 files changed, 176 insertions(+), 106 deletions(-) diff --git a/htdocs/salaries/class/paymentsalary.class.php b/htdocs/salaries/class/paymentsalary.class.php index 029e5732f9b..b855462b527 100644 --- a/htdocs/salaries/class/paymentsalary.class.php +++ b/htdocs/salaries/class/paymentsalary.class.php @@ -707,4 +707,39 @@ class PaymentSalary extends CommonObject return $result; } + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $langs, $db; + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(1) : $this->ref).''; + if (property_exists($this, 'fk_bank')) { + $return .= ' | '.$this->fk_bank.''; + } + if (property_exists($this, 'fk_user_author')) { + $return .= '
'.$this->fk_user_author.''; + } + + if (property_exists($this, 'fk_typepayment')) { + $return .= '
'.$langs->trans("PaymentMode").' : '.$this->fk_typepayment.''; + } + if (property_exists($this, 'amount')) { + $return .= '
'.$langs->trans("Amount").' : '.price($this->amount).''; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } diff --git a/htdocs/salaries/payments.php b/htdocs/salaries/payments.php index 8fcc7183dae..6fb41b1b38a 100644 --- a/htdocs/salaries/payments.php +++ b/htdocs/salaries/payments.php @@ -45,6 +45,8 @@ $toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'bomlist'; // To manage different context of search $backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print') +$mode = GETPOST('mode', 'alpha'); // mode view for result + // Load variable for pagination $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit; @@ -316,6 +318,9 @@ llxHeader('', $title, $help_url); $arrayofselected = is_array($toselect) ? $toselect : array(); $param = ''; +if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); +} if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -385,11 +390,16 @@ print ''; print ''; print ''; print ''; +print ''; + $url = DOL_URL_ROOT.'/salaries/card.php?action=create'; if (!empty($socid)) { $url .= '&socid='.$socid; } +$newcardbutton = ''; +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); $newcardbutton = dolGetButtonTitle($langs->trans('NewSalaryPayment'), '', 'fa fa-plus-circle', $url, '', $user->rights->salaries->write); print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'object_payment', 0, $newcardbutton, '', $limit, 0, 0, 1); @@ -532,8 +542,7 @@ while ($i < ($limit ? min($num, $limit) : $num)) { // Store properties in $object $object->setVarsFromFetchObj($obj); - // Show here line of result - print ''; + $userstatic->id = $obj->uid; $userstatic->lastname = $obj->lastname; @@ -549,136 +558,162 @@ while ($i < ($limit ? min($num, $limit) : $num)) { $paymentsalstatic->id = $obj->rowid; $paymentsalstatic->ref = $obj->rowid; + $paymentsalstatic->amount = $obj->amount; + $paymentsalstatic->fk_typepayment = $obj->payment_code; + $paymentsalstatic->datec = $obj->dateep; + $paymentsalstatic->datep = $obj->datep; - // Ref - print "".$paymentsalstatic->getNomUrl(1)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } + $accountlinestatic->id = $obj->fk_bank; + $accountlinestatic->ref = $obj->fk_bank; + $paymentsalstatic->fk_bank = $accountlinestatic->getNomUrl(1); + $paymentsalstatic->fk_user_author = $userstatic->getNomUrl(1); - // Ref salary - print "".$salstatic->getNomUrl(1)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - // Label payment - print "".dol_trunc($obj->label, 40)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - // Date end period - print ''.dol_print_date($db->jdate($obj->dateep), 'day')."\n"; - if (!$i) { - $totalarray['nbfield']++; - } + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + print '
'; + } + // Output Kanban - // Date payment - print ''.dol_print_date($db->jdate($obj->datep), 'day')."\n"; - if (!$i) { - $totalarray['nbfield']++; - } + print $paymentsalstatic->getKanbanView(''); + if ($i == (min($num, $limit) - 1)) { + print '
'; + print ''; + } + } else { + // Show here line of result + print ''; + // Ref + print "".$paymentsalstatic->getNomUrl(1)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } - // Date value - /*print ''.dol_print_date($db->jdate($obj->datev), 'day')."\n"; - if (!$i) $totalarray['nbfield']++;*/ + // Ref salary + print "".$salstatic->getNomUrl(1)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } - // Employee - print "".$userstatic->getNomUrl(1)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } + // Label payment + print "".dol_trunc($obj->label, 40)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } - // Type - print ''; - print $langs->trans("PaymentTypeShort".$obj->payment_code); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } + // Date end period + print ''.dol_print_date($db->jdate($obj->dateep), 'day')."\n"; + if (!$i) { + $totalarray['nbfield']++; + } - // Chq number - print ''.$obj->num_payment.''; - if (!$i) { - $totalarray['nbfield']++; - } + // Date payment + print ''.dol_print_date($db->jdate($obj->datep), 'day')."\n"; + if (!$i) { + $totalarray['nbfield']++; + } - // Account - if (isModEnabled("banque")) { - // Bank transaction + // Date value + /*print ''.dol_print_date($db->jdate($obj->datev), 'day')."\n"; + if (!$i) $totalarray['nbfield']++;*/ + + // Employee + print "".$userstatic->getNomUrl(1)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + + // Type print ''; - $accountlinestatic->id = $obj->fk_bank; - print $accountlinestatic->getNomUrl(1); + print $langs->trans("PaymentTypeShort".$obj->payment_code); print ''; if (!$i) { $totalarray['nbfield']++; } - print ''; - if ($obj->fk_bank > 0) { - //$accountstatic->fetch($obj->fk_bank); - $accountstatic->id = $obj->bid; - $accountstatic->ref = $obj->bref; - $accountstatic->number = $obj->bnumber; - $accountstatic->iban = $obj->iban; - $accountstatic->bic = $obj->bic; - $accountstatic->currency_code = $langs->trans("Currency".$obj->currency_code); - $accountstatic->clos = $obj->clos; + // Chq number + print ''.$obj->num_payment.''; + if (!$i) { + $totalarray['nbfield']++; + } - if (isModEnabled('accounting')) { - $accountstatic->account_number = $obj->account_number; - - $accountingjournal = new AccountingJournal($db); - $accountingjournal->fetch($obj->fk_accountancy_journal); - - $accountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1, '', 1); + // Account + if (isModEnabled("banque")) { + // Bank transaction + print ''; + $accountlinestatic->id = $obj->fk_bank; + print $accountlinestatic->getNomUrl(1); + print ''; + if (!$i) { + $totalarray['nbfield']++; } - $accountstatic->label = $obj->blabel; - if ($accountstatic->id > 0) { - print $accountstatic->getNomUrl(1); + + print ''; + if ($obj->fk_bank > 0) { + //$accountstatic->fetch($obj->fk_bank); + $accountstatic->id = $obj->bid; + $accountstatic->ref = $obj->bref; + $accountstatic->number = $obj->bnumber; + $accountstatic->iban = $obj->iban; + $accountstatic->bic = $obj->bic; + $accountstatic->currency_code = $langs->trans("Currency".$obj->currency_code); + $accountstatic->clos = $obj->clos; + + if (isModEnabled('accounting')) { + $accountstatic->account_number = $obj->account_number; + + $accountingjournal = new AccountingJournal($db); + $accountingjournal->fetch($obj->fk_accountancy_journal); + + $accountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1, '', 1); + } + $accountstatic->label = $obj->blabel; + if ($accountstatic->id > 0) { + print $accountstatic->getNomUrl(1); + } + } else { + print ' '; } - } else { - print ' '; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Amount + print ''.price($obj->amount).''; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'totalttcfield'; + } + $totalarray['val']['totalttcfield'] += $obj->amount; + + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Action column + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($object->id, $arrayofselected)) { + $selected = 1; + } + print ''; } print ''; if (!$i) { $totalarray['nbfield']++; } - } - // Amount - print ''.price($obj->amount).''; - if (!$i) { - $totalarray['nbfield']++; + print ''."\n"; } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'totalttcfield'; - } - $totalarray['val']['totalttcfield'] += $obj->amount; - - // Extra fields - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - // Action column - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($object->id, $arrayofselected)) { - $selected = 1; - } - print ''; - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - - print ''."\n"; - $i++; } From 45725a1e9743d1840c9589982fce04be4bf3008c Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Wed, 11 Jan 2023 17:58:26 +0100 Subject: [PATCH 0731/1128] fix: display True volume in PDF --- htdocs/core/modules/expedition/doc/pdf_espadon.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php b/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php index 17999e59e4c..97be43da689 100644 --- a/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php +++ b/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php @@ -832,7 +832,7 @@ class pdf_espadon extends ModelePdfExpedition $totalToShip = $tmparray['toship']; // Set trueVolume and volume_units not currently stored into database if ($object->trueWidth && $object->trueHeight && $object->trueDepth) { - $object->trueVolume = price(($object->trueWidth * $object->trueHeight * $object->trueDepth), 0, $outputlangs, 0, 0); + $object->trueVolume = $object->trueWidth * $object->trueHeight * $object->trueDepth; $object->volume_units = $object->size_units * 3; } From 0935094385db55f242302918f0964c6b735b5a33 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Wed, 11 Jan 2023 18:22:46 +0100 Subject: [PATCH 0732/1128] kanban mode for list of loan --- htdocs/loan/class/loan.class.php | 35 ++++++++++++++++++ htdocs/loan/list.php | 62 +++++++++++++++++++++++--------- 2 files changed, 80 insertions(+), 17 deletions(-) diff --git a/htdocs/loan/class/loan.class.php b/htdocs/loan/class/loan.class.php index 1c6913035e8..6dd0f5fe92b 100644 --- a/htdocs/loan/class/loan.class.php +++ b/htdocs/loan/class/loan.class.php @@ -721,4 +721,39 @@ class Loan extends CommonObject return -1; } } + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $langs; + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(1) : $this->ref).''; + if (property_exists($this, 'capital')) { + $return .= ' | '.$langs->trans("Amount").' : '.price($this->capital).''; + } + if (property_exists($this, 'datestart')) { + $return .= '
'.$langs->trans("DateStart").' : '.dol_print_date($this->db->jdate($this->datestart), 'day').''; + } + if (property_exists($this, 'dateend')) { + $return .= '
'.$langs->trans("DateEnd").' : '.dol_print_date($this->db->jdate($this->dateend), 'day').''; + } + + if (method_exists($this, 'LibStatut')) { + $return .= '
'.$this->LibStatut($this->totalpaid, 5, $this->alreadypaid).'
'; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } diff --git a/htdocs/loan/list.php b/htdocs/loan/list.php index 1324876a98c..5acd2532bef 100644 --- a/htdocs/loan/list.php +++ b/htdocs/loan/list.php @@ -66,6 +66,8 @@ $search_amount = GETPOST('search_amount', 'alpha'); $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'loanlist'; // To manage different context of search $optioncss = GETPOST('optioncss', 'alpha'); +$mode = GETPOST('mode', 'alpha'); // mode view result + /* @@ -171,6 +173,9 @@ if ($resql) { $i = 0; $param = ''; + if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); + } if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -194,7 +199,10 @@ if ($resql) { if (!empty($socid)) { $url .= '&socid='.$socid; } - $newcardbutton = dolGetButtonTitle($langs->trans('NewLoan'), '', 'fa fa-plus-circle', $url, '', $user->rights->loan->write); + $newcardbutton = ''; + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); + $newcardbutton .= dolGetButtonTitle($langs->trans('NewLoan'), '', 'fa fa-plus-circle', $url, '', $user->rights->loan->write); print ''."\n"; if ($optioncss != '') { @@ -206,6 +214,8 @@ if ($resql) { print ''; print ''; print ''; + print ''; + print_barre_liste($langs->trans("Loans"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'money-bill-alt', 0, $newcardbutton, '', $limit, 0, 0, 1); @@ -256,31 +266,49 @@ if ($resql) { $loan_static->label = $obj->label; $loan_static->paid = $obj->paid; - print ''; - // Ref - print ''.$loan_static->getNomUrl(1).''; + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + print '
'; + } + // Output Kanban + $loan_static->datestart= $obj->datestart; + $loan_static->dateend = $obj->dateend; + $loan_static->capital = $obj->capital; + $loan_static->totalpaid = $obj->paid; - // Label - print ''.dol_trunc($obj->label, 42).''; + print $loan_static->getKanbanView(''); + if ($i == (min($num, $limit) - 1)) { + print '
'; + print ''; + } + } else { + print ''; - // Capital - print ''.price($obj->capital).''; + // Ref + print ''.$loan_static->getNomUrl(1).''; - // Date start - print ''.dol_print_date($db->jdate($obj->datestart), 'day').''; + // Label + print ''.dol_trunc($obj->label, 42).''; - // Date end - print ''.dol_print_date($db->jdate($obj->dateend), 'day').''; + // Capital + print ''.price($obj->capital).''; - print ''; - print $loan_static->LibStatut($obj->paid, 5, $obj->alreadypaid); - print ''; + // Date start + print ''.dol_print_date($db->jdate($obj->datestart), 'day').''; - print ''; + // Date end + print ''.dol_print_date($db->jdate($obj->dateend), 'day').''; - print "\n"; + print ''; + print $loan_static->LibStatut($obj->paid, 5, $obj->alreadypaid); + print ''; + print ''; + + print "\n"; + } $i++; } From 7cd1ea4962c46a65913c210d9952da1285de559d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 11 Jan 2023 20:37:29 +0100 Subject: [PATCH 0733/1128] Fix phpcs --- htdocs/salaries/payments.php | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/htdocs/salaries/payments.php b/htdocs/salaries/payments.php index 84e146c0bd2..5a5ccb08bf6 100644 --- a/htdocs/salaries/payments.php +++ b/htdocs/salaries/payments.php @@ -592,12 +592,11 @@ while ($i < ($limit ? min($num, $limit) : $num)) { $totalarray['nbfield']++; } - // Date payment - print ''.dol_print_date($db->jdate($obj->datep), 'dayhour', 'tzuserrel')."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - + // Date payment + print ''.dol_print_date($db->jdate($obj->datep), 'dayhour', 'tzuserrel')."\n"; + if (!$i) { + $totalarray['nbfield']++; + } // Ref salary print "".$salstatic->getNomUrl(1)."\n"; From 4afc21ecb3bad84f1cddafbda7cf9cb8277693f6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 11 Jan 2023 20:39:09 +0100 Subject: [PATCH 0734/1128] Update dict.php --- htdocs/admin/dict.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/admin/dict.php b/htdocs/admin/dict.php index e5c9dcb3127..1bf360dccf7 100644 --- a/htdocs/admin/dict.php +++ b/htdocs/admin/dict.php @@ -2510,11 +2510,11 @@ function fieldList($fieldlist, $obj = '', $tabname = '', $context = '') print ''; } elseif ($value == 'block_if_negative') { print ''; - print $form->selectyesno("block_if_negative", (!empty($obj->{$value}) ? $obj->{$value}:''), 1); + print $form->selectyesno("block_if_negative", (empty($obj->block_if_negative) ? '' : $obj->block_if_negative), 1); print ''; } elseif ($value == 'type_duration') { print ''; - print $form->selectTypeDuration('', (!empty($obj->{$value}) ? $obj->{$value}:''), array('i','h')); + print $form->selectTypeDuration('', empty($obj->type_duration) ? '' : $obj->type_duration), array('i','h')); print ''; } else { $fieldValue = isset($obj->{$value}) ? $obj->{$value}: ''; From 71ea83d19e1886f81836d2d79c71aadcf20e5cad Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 11 Jan 2023 20:40:15 +0100 Subject: [PATCH 0735/1128] Update dict.php --- htdocs/admin/dict.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/admin/dict.php b/htdocs/admin/dict.php index 1bf360dccf7..4919e377c9c 100644 --- a/htdocs/admin/dict.php +++ b/htdocs/admin/dict.php @@ -2514,7 +2514,7 @@ function fieldList($fieldlist, $obj = '', $tabname = '', $context = '') print ''; } elseif ($value == 'type_duration') { print ''; - print $form->selectTypeDuration('', empty($obj->type_duration) ? '' : $obj->type_duration), array('i','h')); + print $form->selectTypeDuration('', (empty($obj->type_duration) ? '' : $obj->type_duration), array('i','h')); print ''; } else { $fieldValue = isset($obj->{$value}) ? $obj->{$value}: ''; From 008c74a6bedadc91d0739816cef12dea3dba84a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Wed, 11 Jan 2023 20:51:33 +0100 Subject: [PATCH 0736/1128] Update html.formticket.class.php --- htdocs/core/class/html.formticket.class.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/core/class/html.formticket.class.php b/htdocs/core/class/html.formticket.class.php index a397433979b..be515a2abf3 100644 --- a/htdocs/core/class/html.formticket.class.php +++ b/htdocs/core/class/html.formticket.class.php @@ -50,7 +50,6 @@ class FormTicket /** * @var string The track_id of the ticket. Used also for the $keytoavoidconflict to name session vars to upload files. - * @deprecated */ public $track_id; From 0303dff199543c3a3b4d5083afc861213fc93a89 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 11 Jan 2023 20:51:55 +0100 Subject: [PATCH 0737/1128] Merge --- .../class/companybankaccount.class.php | 61 +++++++++++++------ htdocs/societe/paymentmodes.php | 4 +- 2 files changed, 47 insertions(+), 18 deletions(-) diff --git a/htdocs/societe/class/companybankaccount.class.php b/htdocs/societe/class/companybankaccount.class.php index 26305bb0013..26a6169dbe6 100644 --- a/htdocs/societe/class/companybankaccount.class.php +++ b/htdocs/societe/class/companybankaccount.class.php @@ -35,6 +35,17 @@ class CompanyBankAccount extends Account { public $socid; + /** + * @var string ID to identify managed object + */ + public $element = 'societe_rib'; + + /** + * @var string Name of table without prefix where object is stored + */ + public $table_element = 'societe_rib'; + + /** @var bool $default_rib 1 = this object is the third party's default bank information */ public $default_rib; /** @@ -64,6 +75,13 @@ class CompanyBankAccount extends Account */ public $datem; + /** + * @var string TRIGGER_PREFIX Dolibarr 16.0 and above use the prefix to prevent the creation of inconsistently + * named triggers + * @see CommonObject::call_trigger() + */ + const TRIGGER_PREFIX = 'COMPANY_RIB'; + /** * Constructor @@ -86,7 +104,7 @@ class CompanyBankAccount extends Account * * @param User $user User * @param int $notrigger 1=Disable triggers - * @return int <0 if KO, >= 0 if OK + * @return int <0 if KO, > 0 if OK (ID of newly created company bank account information) */ public function create(User $user = null, $notrigger = 0) { @@ -97,6 +115,7 @@ class CompanyBankAccount extends Account // Check paramaters if (empty($this->socid)) { $this->error = 'BadValueForParameter'; + $this->errors[] = $this->error; return -1; } @@ -114,6 +133,9 @@ class CompanyBankAccount extends Account } } + + $this->db->begin(); + $sql = "INSERT INTO ".MAIN_DB_PREFIX."societe_rib (fk_soc, type, datec)"; $sql .= " VALUES (".((int) $this->socid).", 'ban', '".$this->db->idate($now)."')"; $resql = $this->db->query($sql); @@ -128,19 +150,20 @@ class CompanyBankAccount extends Account $error++; } // End call triggers - - if (!$error) { - return $this->id; - } else { - return 0; - } - } else { - return 1; } } } else { + $error++; $this->error = $this->db->lasterror(); - return 0; + $this->errors[] = $this->error; + } + + if (!$error) { + $this->db->commit(); + return $this->id; + } else { + $this->db->rollback(); + return -1; } } @@ -168,6 +191,8 @@ class CompanyBankAccount extends Account $this->owner_address = dol_trunc($this->owner_address, 254, 'right', 'UTF-8', 1); } + $this->db->begin(); + $sql = "UPDATE ".MAIN_DB_PREFIX."societe_rib SET"; $sql .= " bank = '".$this->db->escape($this->bank)."'"; $sql .= ",code_banque='".$this->db->escape($this->code_banque)."'"; @@ -203,20 +228,22 @@ class CompanyBankAccount extends Account $error++; } // End call triggers - if (!$error) { - return 1; - } else { - return -1; - } - } else { - return 1; } } else { + $error++; if ($this->db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS') { $this->error = $langs->trans('ErrorDuplicateField'); } else { $this->error = $this->db->lasterror(); } + $this->errors[] = $this->error; + } + + if (!$error) { + $this->db->commit(); + return 1; + } else { + $this->db->rollback(); return -1; } } diff --git a/htdocs/societe/paymentmodes.php b/htdocs/societe/paymentmodes.php index 6869e80bd87..744d2763b71 100644 --- a/htdocs/societe/paymentmodes.php +++ b/htdocs/societe/paymentmodes.php @@ -183,8 +183,10 @@ if (empty($reshook)) { $companybankaccount->stripe_card_ref = GETPOST('stripe_card_ref', 'alpha'); $result = $companybankaccount->update($user); - if (!$result) { + if ($result <= 0) { + // Display error message and get back to edit mode setEventMessages($companybankaccount->error, $companybankaccount->errors, 'errors'); + $action = 'edit'; } else { // If this account is the default bank account, we disable others if ($companybankaccount->default_rib) { From e4c5fee8df10824a36e9fc71c7bfe7dfc4f41e9c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 11 Jan 2023 21:04:30 +0100 Subject: [PATCH 0738/1128] Fix hardcoded link. Fix from #23463 --- htdocs/fourn/commande/tpl/linkedobjectblock.tpl.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/fourn/commande/tpl/linkedobjectblock.tpl.php b/htdocs/fourn/commande/tpl/linkedobjectblock.tpl.php index 192a39c9b06..e2e9fb5f899 100644 --- a/htdocs/fourn/commande/tpl/linkedobjectblock.tpl.php +++ b/htdocs/fourn/commande/tpl/linkedobjectblock.tpl.php @@ -46,7 +46,7 @@ foreach ($linkedObjectBlock as $key => $objectlink) { ?> trans("SupplierOrder"); ?> - trans("ShowOrder"), "order").' '.$objectlink->ref; ?> + getNomUrl(1); ?> ref_supplier; ?> date, 'day'); ?> Date: Wed, 11 Jan 2023 21:06:55 +0100 Subject: [PATCH 0739/1128] correction bug selection contact dans emailing --- .../core/modules/mailings/contacts1.modules.php | 17 ++++++++++------- .../modules/mailings/thirdparties.modules.php | 13 +++++++------ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/htdocs/core/modules/mailings/contacts1.modules.php b/htdocs/core/modules/mailings/contacts1.modules.php index 38a82907124..09595b61376 100644 --- a/htdocs/core/modules/mailings/contacts1.modules.php +++ b/htdocs/core/modules/mailings/contacts1.modules.php @@ -122,7 +122,7 @@ class mailing_contacts1 extends MailingTargets */ public function formFilter() { - global $langs; + global $langs,$conf; // Load translation files required by the page $langs->loadLangs(array("commercial", "companies", "suppliers", "categories")); @@ -307,11 +307,14 @@ class mailing_contacts1 extends MailingTargets $s .= ajax_combobox("filter_category_supplier_contact"); - // Choose language - require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php'; - $formadmin = new FormAdmin($this->db); - $s .= ''.$langs->trans("DefaultLang").': '; - $s .= $formadmin->select_language($langs->getDefaultLang(1), 'filter_lang', 0, 0, 1, 0, 0, '', 0, 0, 0, null, 1); + // Choose language if multilangue active + + if (@$conf->global->MAIN_MULTILANGS==1) { + require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php'; + $formadmin = new FormAdmin($this->db); + $s .= ''.$langs->trans("DefaultLang").': '; + $s .= $formadmin->select_language($langs->getDefaultLang(1), 'filter_lang', 0, 0, 1, 0, 0, '', 0, 0, 0, null, 1); + } return $s; } @@ -409,7 +412,7 @@ class mailing_contacts1 extends MailingTargets // Filter on language if (!empty($filter_lang)) { - $sql .= " AND sp.default_lang = '".$this->db->escape($filter_lang)."'"; + $sql .= " AND sp.default_lang LIKE '".$this->db->escape($filter_lang)."%'"; } // Filter on nature diff --git a/htdocs/core/modules/mailings/thirdparties.modules.php b/htdocs/core/modules/mailings/thirdparties.modules.php index 89bc2cf2b5e..81a9bfaea51 100644 --- a/htdocs/core/modules/mailings/thirdparties.modules.php +++ b/htdocs/core/modules/mailings/thirdparties.modules.php @@ -316,12 +316,13 @@ class mailing_thirdparties extends MailingTargets $s .= ''; $s .= ajax_combobox("filter_status_thirdparties"); - // Choose language - require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php'; - $formadmin = new FormAdmin($this->db); - $s .= ''.$langs->trans("DefaultLang").': '; - $s .= $formadmin->select_language($langs->getDefaultLang(1), 'filter_lang_thirdparties', 0, null, 1, 0, 0, '', 0, 0, 0, null, 1); - + // Choose language if multilangue active + if (@$conf->global->MAIN_MULTILANGS==1) { + require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php'; + $formadmin = new FormAdmin($this->db); + $s .= ''.$langs->trans("DefaultLang").': '; + $s .= $formadmin->select_language($langs->getDefaultLang(1), 'filter_lang_thirdparties', 0, null, 1, 0, 0, '', 0, 0, 0, null, 1); + } return $s; } From b43f38c7ad67e64261acf6f8c3d77af228ba6cf0 Mon Sep 17 00:00:00 2001 From: Christian Humpel Date: Sun, 8 Jan 2023 21:43:12 +0100 Subject: [PATCH 0740/1128] Fix: REST MO API - It's able to have a wrong value on the 'ref' Field --- htdocs/mrp/class/api_mos.class.php | 28 ++++++++++++++++++++++++++++ htdocs/mrp/class/mo.class.php | 1 + 2 files changed, 29 insertions(+) diff --git a/htdocs/mrp/class/api_mos.class.php b/htdocs/mrp/class/api_mos.class.php index 48396025957..794ab3d5378 100644 --- a/htdocs/mrp/class/api_mos.class.php +++ b/htdocs/mrp/class/api_mos.class.php @@ -203,6 +203,9 @@ class Mos extends DolibarrApi foreach ($request_data as $field => $value) { $this->mo->$field = $value; } + + $this->checkRefNumbering(); + if (!$this->mo->create(DolibarrApiAccess::$user)) { throw new RestException(500, "Error creating MO", array_merge(array($this->mo->error), $this->mo->errors)); } @@ -239,6 +242,8 @@ class Mos extends DolibarrApi $this->mo->$field = $value; } + $this->checkRefNumbering(); + if ($this->mo->update(DolibarrApiAccess::$user) > 0) { return $this->get($id); } else { @@ -723,4 +728,27 @@ class Mos extends DolibarrApi } return $myobject; } + + /** + * Validate the ref field and get the next Number if it's necessary. + * + * @return void + */ + private function checkRefNumbering(): void + { + $ref = substr($this->mo->ref, 1, 4); + if ($this->mo->status > 0 && $ref == 'PROV') { + throw new RestException(400, "Wrong naming scheme '(PROV%)' is only allowed on 'DRAFT' status. For automatic increment use 'auto' on the 'ref' field."); + } + + if (strtolower($this->mo->ref) == 'auto') { + if (empty($this->mo->id) && $this->mo->status == 0) { + $this->mo->ref = ''; // 'ref' will auto incremented with '(PROV' + newID + ')' + } else { + $this->mo->fetch_product(); + $numref = $this->mo->getNextNumRef($this->mo->product); + $this->mo->ref = $numref; + } + } + } } diff --git a/htdocs/mrp/class/mo.class.php b/htdocs/mrp/class/mo.class.php index 30d6a3660a3..13d0f67316c 100644 --- a/htdocs/mrp/class/mo.class.php +++ b/htdocs/mrp/class/mo.class.php @@ -277,6 +277,7 @@ class Mo extends CommonObject if ($this->fk_bom > 0) { // If there is a nown BOM, we force the type of MO to the type of BOM + include_once DOL_DOCUMENT_ROOT.'/bom/class/bom.class.php'; $tmpbom = new BOM($this->db); $tmpbom->fetch($this->fk_bom); From 12885deb468598be223c441e3b14d4af4d5ec4f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20NASSIET?= Date: Wed, 11 Jan 2023 21:19:33 +0100 Subject: [PATCH 0741/1128] correction bug selection contact dans emailing --- htdocs/core/modules/mailings/contacts1.modules.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/htdocs/core/modules/mailings/contacts1.modules.php b/htdocs/core/modules/mailings/contacts1.modules.php index 7406779054b..be77cf155d2 100644 --- a/htdocs/core/modules/mailings/contacts1.modules.php +++ b/htdocs/core/modules/mailings/contacts1.modules.php @@ -122,7 +122,7 @@ class mailing_contacts1 extends MailingTargets */ public function formFilter() { - global $langs; + global $langs,$conf; // Load translation files required by the page $langs->loadLangs(array("commercial", "companies", "suppliers", "categories")); @@ -308,11 +308,12 @@ class mailing_contacts1 extends MailingTargets $s .= ajax_combobox("filter_category_supplier_contact"); // Choose language - require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php'; - $formadmin = new FormAdmin($this->db); - $s .= ''.$langs->trans("DefaultLang").': '; - $s .= $formadmin->select_language($langs->getDefaultLang(1), 'filter_lang', 0, 0, 1, 0, 0, '', 0, 0, 0, null, 1); - + if (getDolGlobalInt('MAIN_MULTILANGS')) { + require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php'; + $formadmin = new FormAdmin($this->db); + $s .= ''.$langs->trans("DefaultLang").': '; + $s .= $formadmin->select_language($langs->getDefaultLang(1), 'filter_lang', 0, 0, 1, 0, 0, '', 0, 0, 0, null, 1); + } return $s; } From db56ef90903460c254e9d0bb742de3c15f0adb9c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 11 Jan 2023 21:32:01 +0100 Subject: [PATCH 0742/1128] Fix sql error --- htdocs/accountancy/class/bookkeeping.class.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/htdocs/accountancy/class/bookkeeping.class.php b/htdocs/accountancy/class/bookkeeping.class.php index f880ac6481c..897f60e8aaa 100644 --- a/htdocs/accountancy/class/bookkeeping.class.php +++ b/htdocs/accountancy/class/bookkeeping.class.php @@ -1168,8 +1168,10 @@ class BookKeeping extends CommonObject $sql = 'SELECT'; $sql .= " t.numero_compte,"; $sql .= " t.label_compte,"; - $sql .= " t.subledger_account,"; - $sql .= " t.subledger_label,"; + if (!empty($option)) { + $sql .= " t.subledger_account,"; + $sql .= " t.subledger_label,"; + } $sql .= " SUM(t.debit) as debit,"; $sql .= " SUM(t.credit) as credit"; $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; @@ -1210,11 +1212,11 @@ class BookKeeping extends CommonObject if (!empty($option)) { $sql .= ' AND t.subledger_account IS NOT NULL'; $sql .= ' AND t.subledger_account != ""'; - $sql .= ' GROUP BY t.subledger_account'; + $sql .= ' GROUP BY t.numero_compte, t.label_compte, t.subledger_account, t.subledger_label'; $sortfield = 't.subledger_account'.($sortfield ? ','.$sortfield : ''); $sortorder = 'ASC'.($sortfield ? ','.$sortfield : ''); } else { - $sql .= ' GROUP BY t.numero_compte'; + $sql .= ' GROUP BY t.numero_compte, t.label_compte'; $sortfield = 't.numero_compte'.($sortfield ? ','.$sortfield : ''); $sortorder = 'ASC'.($sortorder ? ','.$sortorder : ''); } From 303220a88f90501ae466a88fda10938315e67cce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20NASSIET?= Date: Wed, 11 Jan 2023 22:51:17 +0100 Subject: [PATCH 0743/1128] ajout d'un hook pour ajouter des landingpage dans la liste de user_ihm --- htdocs/user/param_ihm.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/htdocs/user/param_ihm.php b/htdocs/user/param_ihm.php index 3d2e3240ce3..1bd806849b6 100644 --- a/htdocs/user/param_ihm.php +++ b/htdocs/user/param_ihm.php @@ -215,6 +215,14 @@ if (isModEnabled('ticket')) { $tmparray['ticket/list.php?mainmenu=ticket&leftmenu='] = 'Tickets'; } +// Hook for insertion new items in the List of possible landing pages +$reshook = $hookmanager->executeHooks('addToLandingPageList',$tmparray,$object); +if ($reshook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); +} else if ($reshook == 0) { + $tmparray=$hookmanager->resArray; +} + $head = user_prepare_head($object); $title = $langs->trans("User"); From 74a5c91a48238b505dac86fbfe204ce6dc8bdc38 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Wed, 11 Jan 2023 21:59:55 +0000 Subject: [PATCH 0744/1128] Fixing style errors. --- htdocs/user/param_ihm.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/user/param_ihm.php b/htdocs/user/param_ihm.php index 1bd806849b6..81ecdca8e73 100644 --- a/htdocs/user/param_ihm.php +++ b/htdocs/user/param_ihm.php @@ -216,10 +216,10 @@ if (isModEnabled('ticket')) { } // Hook for insertion new items in the List of possible landing pages -$reshook = $hookmanager->executeHooks('addToLandingPageList',$tmparray,$object); +$reshook = $hookmanager->executeHooks('addToLandingPageList', $tmparray, $object); if ($reshook < 0) { setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); -} else if ($reshook == 0) { +} elseif ($reshook == 0) { $tmparray=$hookmanager->resArray; } From 968c50d6f9281ba0705c6e88367580e3cc0b0104 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Thu, 12 Jan 2023 09:49:12 +0100 Subject: [PATCH 0745/1128] FIX wrong stock list with multicompany and without stock sharing --- htdocs/product/reassort.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/reassort.php b/htdocs/product/reassort.php index 79498562210..626d4e81ee2 100644 --- a/htdocs/product/reassort.php +++ b/htdocs/product/reassort.php @@ -141,7 +141,6 @@ $reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters); // N $sql .= $hookmanager->resPrint; $sql .= ' FROM '.MAIN_DB_PREFIX.'product as p'; $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'product_stock as s ON p.rowid = s.fk_product'; -$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'entrepot as e ON s.fk_entrepot = e.rowid AND e.entity IN ('.getEntity('stock').')'; if (!empty($conf->global->PRODUCT_USE_UNITS)) { $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_units as u on p.fk_unit = u.rowid'; } @@ -150,6 +149,7 @@ if ($search_categ > 0) { $sql .= ", ".MAIN_DB_PREFIX."categorie_product as cp"; } $sql .= " WHERE p.entity IN (".getEntity('product').")"; +$sql .= " AND EXISTS (SELECT e.rowid FROM ".MAIN_DB_PREFIX."entrepot as e WHERE e.rowid = s.fk_entrepot AND e.entity IN (".getEntity('stock')."))"; if ($search_categ > 0) { $sql .= " AND p.rowid = cp.fk_product"; // Join for the needed table to filter by categ } From 272f131b070a82ded90ab8fcb4131cd17070066a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9=20Cendrier?= Date: Thu, 12 Jan 2023 10:18:47 +0100 Subject: [PATCH 0746/1128] do not let closed inventories reset stock with URL --- htdocs/product/inventory/inventory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/inventory/inventory.php b/htdocs/product/inventory/inventory.php index fd82300fdda..cbe5d782082 100644 --- a/htdocs/product/inventory/inventory.php +++ b/htdocs/product/inventory/inventory.php @@ -118,7 +118,7 @@ if (empty($reshook)) { } // Close inventory by recording the stock movements - if ($action == 'update' && !empty($user->rights->stock->mouvement->creer)) { + if ($action == 'update' && !empty($user->rights->stock->mouvement->creer) && $object->status == $object::STATUS_VALIDATED) { $stockmovment = new MouvementStock($db); $stockmovment->setOrigin($object->element, $object->id); From f251e92eaa54ad11559f3a9eab604aa9f2accf41 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 12 Jan 2023 10:10:28 +0100 Subject: [PATCH 0747/1128] Fix warning --- htdocs/admin/modulehelp.php | 5 ++++- htdocs/core/modules/DolibarrModules.class.php | 4 ++-- htdocs/public/members/new.php | 3 --- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/admin/modulehelp.php b/htdocs/admin/modulehelp.php index 9a0c34aea2b..1af4b25bb27 100644 --- a/htdocs/admin/modulehelp.php +++ b/htdocs/admin/modulehelp.php @@ -498,7 +498,10 @@ if ($mode == 'feature') { if (isset($objMod->boxes) && is_array($objMod->boxes) && count($objMod->boxes)) { $i = 0; foreach ($objMod->boxes as $val) { - $text .= ($i ? ', ' : '').($val['file'] ? $val['file'] : $val[0]); + $boxstring = (empty($val['file']) ? (empty($val[0]) ? '' : $val[0]) : $val['file']); + if ($boxstring) { + $text .= ($i ? ', ' : '').$boxstring; + } $i++; } } else { diff --git a/htdocs/core/modules/DolibarrModules.class.php b/htdocs/core/modules/DolibarrModules.class.php index f88a05bd12b..96c8d14da31 100644 --- a/htdocs/core/modules/DolibarrModules.class.php +++ b/htdocs/core/modules/DolibarrModules.class.php @@ -976,8 +976,8 @@ class DolibarrModules // Can not be abstract, because we need to instantiate it $tmp = json_decode($obj->note, true); } return array( - 'authorid' => $tmp['authorid'], - 'ip' => $tmp['ip'], + 'authorid' => empty($tmp['authorid']) ? '' : $tmp['authorid'], + 'ip' => empty($tmp['ip']) ? '' : $tmp['ip'], 'lastactivationdate' => $this->db->jdate($obj->tms), 'lastactivationversion' => (!empty($tmp['lastactivationversion']) ? $tmp['lastactivationversion'] : 'unknown'), ); diff --git a/htdocs/public/members/new.php b/htdocs/public/members/new.php index b37cb15d9c0..7c3e5754b23 100644 --- a/htdocs/public/members/new.php +++ b/htdocs/public/members/new.php @@ -46,9 +46,6 @@ if (!defined('NOLOGIN')) { if (!defined('NOCSRFCHECK')) { define("NOCSRFCHECK", 1); // We accept to go on this page from external web site. } -if (!defined('NOIPCHECK')) { - define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip -} if (!defined('NOBROWSERNOTIF')) { define('NOBROWSERNOTIF', '1'); } From 2093be9895b56ac4042c09cbdd40b9e911bfc7fd Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 12 Jan 2023 11:34:28 +0100 Subject: [PATCH 0748/1128] New add file .idea/php.xml for qodana --- .idea/php.xml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .idea/php.xml diff --git a/.idea/php.xml b/.idea/php.xml new file mode 100644 index 00000000000..52e0bf0ae03 --- /dev/null +++ b/.idea/php.xml @@ -0,0 +1,5 @@ + + + + + From 1ed1ff953f618c4de5fa30a7ef8103d33d172aad Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 12 Jan 2023 11:40:24 +0100 Subject: [PATCH 0749/1128] Fix .gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 55a4c417ce7..e9603bd2d8f 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,6 @@ default.properties /.pydevproject /.vscode .DS_Store -.idea *.iml *.orig Thumbs.db From 366abff4f9956281628ad7feeba0db9976381772 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 12 Jan 2023 11:43:10 +0100 Subject: [PATCH 0750/1128] Avoid qodana error email --- qodana.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qodana.yaml b/qodana.yaml index 89cc459fdfa..44da591f9de 100644 --- a/qodana.yaml +++ b/qodana.yaml @@ -1,6 +1,6 @@ version: "1.0" linter: jetbrains/qodana-php:2022.3-eap -failThreshold: 0 +failThreshold: 20000 profile: name: qodana.recommended exclude: From 1e36b45791634e6668ccd3fe80efc502081544ac Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 12 Jan 2023 11:58:32 +0100 Subject: [PATCH 0751/1128] Fix missing entity --- htdocs/product/reassortlot.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/reassortlot.php b/htdocs/product/reassortlot.php index 40c8fcf4292..1dc632bf13d 100644 --- a/htdocs/product/reassortlot.php +++ b/htdocs/product/reassortlot.php @@ -227,7 +227,7 @@ $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'product_stock as ps on p.rowid = ps.fk_pro $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'entrepot as e on ps.fk_entrepot = e.rowid'; // Link on unique key $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'product_batch as pb on pb.fk_product_stock = ps.rowid'; // Detail for each lot on each warehouse $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'product_lot as pl on pl.fk_product = p.rowid AND pl.batch = pb.batch'; // Link on unique key -$sql .= " WHERE p.entity IN (".getEntity('product').")"; +$sql .= " WHERE p.entity IN (".getEntity('product').") AND e.entity IN (".getEntity('stock').")"; if (!empty($search_categ) && $search_categ != '-1') { $sql .= " AND "; if ($search_categ == -2) { From efe1d913a7e3b470bfcff39722b87d79be2257bc Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 12 Jan 2023 12:06:02 +0100 Subject: [PATCH 0752/1128] Fix MAIN_CHECKBOX_LEFT_COLUMN --- htdocs/product/reassort.php | 36 ++++++++++++++++++++++++++++------ htdocs/product/reassortlot.php | 25 +++++++++++++++++++++-- 2 files changed, 53 insertions(+), 8 deletions(-) diff --git a/htdocs/product/reassort.php b/htdocs/product/reassort.php index fb74b4ed297..b91ae62f663 100644 --- a/htdocs/product/reassort.php +++ b/htdocs/product/reassort.php @@ -363,6 +363,13 @@ if ($resql) { // Fields title search print ''; + // Action column + if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + $searchpicto = $form->showFilterAndCheckAddButtons(0); + print $searchpicto; + print ''; + } print ''; print ''; print ''; @@ -391,14 +398,20 @@ if ($resql) { $parameters = array(); $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; - print ''; - $searchpicto = $form->showFilterAndCheckAddButtons(0); - print $searchpicto; - print ''; + if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + $searchpicto = $form->showFilterAndCheckAddButtons(0); + print $searchpicto; + print ''; + } print ''; //Line for column titles print ""; + // Action column + if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print_liste_field_titre(''); + } print_liste_field_titre("Ref", $_SERVER["PHP_SELF"], "p.ref", '', $param, "", $sortfield, $sortorder); print_liste_field_titre("Label", $_SERVER["PHP_SELF"], "p.label", '', $param, "", $sortfield, $sortorder); if (isModEnabled("service") && $type == 1) { @@ -429,7 +442,10 @@ if ($resql) { $parameters = array('param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder); $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; - print_liste_field_titre(''); + // Action column + if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print_liste_field_titre(''); + } print "\n"; while ($i < min($num, $limit)) { @@ -440,6 +456,10 @@ if ($resql) { $product->load_stock(); print ''; + // Action column + if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + } print ''; print $product->getNomUrl(1, '', 16); //if ($objp->stock_theorique < $objp->seuil_stock_alerte) print ' '.img_warning($langs->trans("StockTooLow")); @@ -504,7 +524,11 @@ if ($resql) { $parameters = array('obj'=>$objp); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $product); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; - print ''; + // Action column + if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + } + print "\n"; $i++; } diff --git a/htdocs/product/reassortlot.php b/htdocs/product/reassortlot.php index 1dc632bf13d..c07f0785e2c 100644 --- a/htdocs/product/reassortlot.php +++ b/htdocs/product/reassortlot.php @@ -514,6 +514,13 @@ print ''; +// Action column +if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; +} print ''; @@ -571,6 +578,10 @@ $totalarray['nbfield'] = 0; // Fields title label // -------------------------------------------------------------------- print ''; +// Action column +if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print_liste_field_titre(''); +} print_liste_field_titre("Ref", $_SERVER["PHP_SELF"], "p.ref", '', $param, "", $sortfield, $sortorder); print_liste_field_titre("Label", $_SERVER["PHP_SELF"], "p.label", '', $param, "", $sortfield, $sortorder); if (isModEnabled("service") && $type == 1) { @@ -591,7 +602,9 @@ print_liste_field_titre("PhysicalStock", $_SERVER["PHP_SELF"], "stock_physique", print_liste_field_titre(''); print_liste_field_titre("ProductStatusOnSell", $_SERVER["PHP_SELF"], "p.tosell", "", $param, '', $sortfield, $sortorder, 'right '); print_liste_field_titre("ProductStatusOnBuy", $_SERVER["PHP_SELF"], "p.tobuy", "", $param, '', $sortfield, $sortorder, 'right '); -print_liste_field_titre(''); +if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print_liste_field_titre(''); +} print "\n"; $product_static = new Product($db); @@ -648,6 +661,11 @@ while ($i < $imaxinloop) { print ''; + // Action column + if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + } + // Ref print ''; - print ''; + // Action column + if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + } print "\n"; $i++; From 24651aaa6c060ebaf1d7ad407713a6343c92aaaa Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 12 Jan 2023 12:41:02 +0100 Subject: [PATCH 0753/1128] FIX #22731 #23524 --- htdocs/commande/list.php | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index ed00efdf10a..eb8b824ef3e 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -51,6 +51,7 @@ require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; // Load translation files required by the page $langs->loadLangs(array("orders", 'sendings', 'deliveries', 'companies', 'compta', 'bills', 'stocks', 'products')); +// Get Parameters $action = GETPOST('action', 'aZ09'); $massaction = GETPOST('massaction', 'alpha'); $show_files = GETPOST('show_files', 'int'); @@ -58,6 +59,7 @@ $confirm = GETPOST('confirm', 'alpha'); $toselect = GETPOST('toselect', 'array'); $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'orderlist'; +// Search Parameters $search_datecloture_start = GETPOST('search_datecloture_start', 'int'); if (empty($search_datecloture_start)) { $search_datecloture_start = dol_mktime(0, 0, 0, GETPOST('search_datecloture_startmonth', 'int'), GETPOST('search_datecloture_startday', 'int'), GETPOST('search_datecloture_startyear', 'int')); @@ -103,6 +105,7 @@ $search_remove_btn = GETPOST('button_removefilter', 'alpha'); $search_project_ref = GETPOST('search_project_ref', 'alpha'); $search_project = GETPOST('search_project', 'alpha'); $search_shippable = GETPOST('search_shippable', 'aZ09'); + $search_fk_cond_reglement = GETPOST("search_fk_cond_reglement", 'int'); $search_fk_shipping_method = GETPOST("search_fk_shipping_method", 'int'); $search_fk_mode_reglement = GETPOST("search_fk_mode_reglement", 'int'); @@ -803,7 +806,7 @@ if (!empty($extrafields->attributes[$object->table_element]['label'])) { } // Add fields from hooks $parameters = array(); -$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters); // Note that $action and $object may have been modified by hook +$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook $sql .= $hookmanager->resPrint; $sql .= ' FROM '.MAIN_DB_PREFIX.'societe as s'; $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as country on (country.rowid = s.fk_pays)"; @@ -836,7 +839,7 @@ if ($search_user > 0) { // Add table from hooks $parameters = array(); -$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object); // Note that $action and $object may have been modified by hook +$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object, $action); // Note that $action and $object may have been modified by hook $sql .= $hookmanager->resPrint; $sql .= ' WHERE c.fk_soc = s.rowid'; @@ -1197,7 +1200,7 @@ if ($resql) { // Add $param from hooks $parameters = array(); - $reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object); // Note that $action and $object may have been modified by hook + $reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object, $action); // Note that $action and $object may have been modified by hook $param .= $hookmanager->resPrint; // List of mass actions available @@ -1364,7 +1367,7 @@ if ($resql) { $moreforfilter .= ''; } $parameters = array(); - $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters); // Note that $action and $object may have been modified by hook + $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook if (empty($reshook)) { $moreforfilter .= $hookmanager->resPrint; } else { @@ -1575,7 +1578,7 @@ if ($resql) { include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php'; // Fields from hook $parameters = array('arrayfields'=>$arrayfields); - $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook + $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Date creation if (!empty($arrayfields['c.datec']['checked'])) { @@ -1769,7 +1772,7 @@ if ($resql) { 'sortorder' => $sortorder, 'totalarray' => &$totalarray, ); - $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook + $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; if (!empty($arrayfields['c.datec']['checked'])) { print_liste_field_titre($arrayfields['c.datec']['label'], $_SERVER["PHP_SELF"], "c.date_creation", "", $param, '', $sortfield, $sortorder, 'center nowrap '); @@ -1825,8 +1828,10 @@ if ($resql) { $total_ht = 0; $total_margin = 0; + $savnbfield = $totalarray['nbfield']; + $totalarray = array(); + $totalarray['nbfield'] = 0; $imaxinloop = ($limit ? min($num, $limit) : $num); - $last_num = min($num, $limit); while ($i < $imaxinloop) { $obj = $db->fetch_object($resql); @@ -2063,7 +2068,7 @@ if ($resql) { } // Amount HT if (!empty($arrayfields['c.total_ht']['checked'])) { - print '\n"; + print '\n"; if (!$i) { $totalarray['nbfield']++; } @@ -2247,7 +2252,7 @@ if ($resql) { if (!$i) { $totalarray['pos'][$totalarray['nbfield']] = 'total_mark_rate'; } - if ($i >= $last_num - 1) { + if ($i >= $imaxinloop - 1) { if (!empty($total_ht)) { $totalarray['val']['total_mark_rate'] = price2num($total_margin * 100 / $total_ht, 'MT'); } else { @@ -2260,7 +2265,7 @@ if ($resql) { include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; // Fields from hook $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Date creation @@ -2479,7 +2484,7 @@ if ($resql) { $db->free($resql); $parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql); - $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters); // Note that $action and $object may have been modified by hook + $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; print '
'; + $searchpicto = $form->showFilterButtons(); + print $searchpicto; + print ''; print ''; print '
'; print $product_static->getNomUrl(1, '', 16); @@ -711,7 +729,10 @@ while ($i < $imaxinloop) { print ''.$product_static->LibStatut($objp->tobuy, 5, 1).'
'.price($obj->total_ht)."'.price($obj->total_ht)."
'."\n"; From 3c7092a114e8151d0c3fe69ad7b1515b53ea771c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 12 Jan 2023 12:49:40 +0100 Subject: [PATCH 0754/1128] Doxygen --- htdocs/core/class/html.formadmin.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/html.formadmin.class.php b/htdocs/core/class/html.formadmin.class.php index a0d0dd2758e..2cc15a3dd42 100644 --- a/htdocs/core/class/html.formadmin.class.php +++ b/htdocs/core/class/html.formadmin.class.php @@ -36,7 +36,7 @@ class FormAdmin /** * Constructor * - * @param DoliDB $db Database handler + * @param DoliDB|null $db Database handler */ public function __construct($db) { From 4fdf9302694fd39fbe5d496cc6590aa4869319d2 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Thu, 12 Jan 2023 12:49:45 +0100 Subject: [PATCH 0755/1128] make PDF custom volume work as it work on expedition/card.php --- .../core/modules/expedition/doc/pdf_espadon.modules.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php b/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php index 97be43da689..fd5c2ee1980 100644 --- a/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php +++ b/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php @@ -846,12 +846,13 @@ class pdf_espadon extends ModelePdfExpedition $totalWeighttoshow = showDimensionInBestUnit($object->trueWeight, $object->weight_units, "weight", $outputlangs); } if ($object->trueVolume) { - $totalVolumetoshow = showDimensionInBestUnit($object->trueVolume, $object->volume_units, "volume", $outputlangs); + if ($object->volume_units < 50) { + $totalVolumetoshow = showDimensionInBestUnit($object->trueVolume, $object->volume_units, "volume", $outputlangs); + } else { + $totalVolumetoshow = price($object->trueVolume, 0, $outputlangs, 0, 0).' '.measuringUnitString(0, "volume", $object->volume_units); + } } - - - if ($this->getColumnStatus('desc')) { $this->printStdColumnContent($pdf, $tab2_top, 'desc', $outputlangs->transnoentities("Total")); } From 8c1ce7873f9d0d1d99d3004f5af9335380541489 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 12 Jan 2023 13:02:04 +0100 Subject: [PATCH 0756/1128] standardize code --- htdocs/fichinter/class/fichinter.class.php | 28 +++++++------- htdocs/reception/class/reception.class.php | 44 +++++++++++----------- 2 files changed, 35 insertions(+), 37 deletions(-) diff --git a/htdocs/fichinter/class/fichinter.class.php b/htdocs/fichinter/class/fichinter.class.php index 12159f29433..01533698b1c 100644 --- a/htdocs/fichinter/class/fichinter.class.php +++ b/htdocs/fichinter/class/fichinter.class.php @@ -749,25 +749,25 @@ class Fichinter extends CommonObject { // phpcs:enable // Init/load array of translation of status - if (empty($this->statuts) || empty($this->statuts_short) || empty($this->statuts_logo)) { + if (empty($this->labelStatus) || empty($this->labelStatusShort)) { global $langs; $langs->load("fichinter"); - $this->statuts[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft'); - $this->statuts[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Validated'); - $this->statuts[self::STATUS_BILLED] = $langs->transnoentitiesnoconv('StatusInterInvoiced'); - $this->statuts[self::STATUS_CLOSED] = $langs->transnoentitiesnoconv('Done'); - $this->statuts_short[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft'); - $this->statuts_short[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Validated'); - $this->statuts_short[self::STATUS_BILLED] = $langs->transnoentitiesnoconv('StatusInterInvoiced'); - $this->statuts_short[self::STATUS_CLOSED] = $langs->transnoentitiesnoconv('Done'); - $this->statuts_logo[self::STATUS_DRAFT] = 'status0'; - $this->statuts_logo[self::STATUS_VALIDATED] = 'status1'; - $this->statuts_logo[self::STATUS_BILLED] = 'status6'; - $this->statuts_logo[self::STATUS_CLOSED] = 'status6'; + $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft'); + $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Validated'); + $this->labelStatus[self::STATUS_BILLED] = $langs->transnoentitiesnoconv('StatusInterInvoiced'); + $this->labelStatus[self::STATUS_CLOSED] = $langs->transnoentitiesnoconv('Done'); + $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft'); + $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Validated'); + $this->labelStatusShort[self::STATUS_BILLED] = $langs->transnoentitiesnoconv('StatusInterInvoiced'); + $this->labelStatusShort[self::STATUS_CLOSED] = $langs->transnoentitiesnoconv('Done'); } - return dolGetStatus($this->statuts[$status], $this->statuts_short[$status], '', $this->statuts_logo[$status], $mode); + $statuscode = 'status'.$status; + if ($status == self::STATUS_BILLED || $status == self::STATUS_CLOSED) { + $statuscode = 'status6'; + } + return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statuscode, $mode); } /** diff --git a/htdocs/reception/class/reception.class.php b/htdocs/reception/class/reception.class.php index 03ed28a2200..e9a89691c88 100644 --- a/htdocs/reception/class/reception.class.php +++ b/htdocs/reception/class/reception.class.php @@ -140,27 +140,6 @@ class Reception extends CommonObject public function __construct($db) { $this->db = $db; - - // List of long language codes for status - $this->statuts = array(); - $this->statuts[-1] = 'StatusReceptionCanceled'; - $this->statuts[0] = 'StatusReceptionDraft'; - // product to receive if stock increase is on close or already received if stock increase is on validation - $this->statuts[1] = 'StatusReceptionValidated'; - if (getDolGlobalInt("STOCK_CALCULATE_ON_RECEPTION")) { - $this->statuts[1] = 'StatusReceptionValidatedReceived'; - } - if (getDolGlobalInt("STOCK_CALCULATE_ON_RECEPTION_CLOSE")) { - $this->statuts[1] = 'StatusReceptionValidatedToReceive'; - } - $this->statuts[2] = 'StatusReceptionProcessed'; - - // List of short language codes for status - $this->statuts_short = array(); - $this->statuts_short[-1] = 'StatusReceptionCanceledShort'; - $this->statuts_short[0] = 'StatusReceptionDraftShort'; - $this->statuts_short[1] = 'StatusReceptionValidatedShort'; - $this->statuts_short[2] = 'StatusReceptionProcessedShort'; } /** @@ -1317,8 +1296,27 @@ class Reception extends CommonObject // phpcs:enable global $langs; - $labelStatus = $langs->transnoentitiesnoconv($this->statuts[$status]); - $labelStatusShort = $langs->transnoentitiesnoconv($this->statuts_short[$status]); + // List of long language codes for status + $this->labelStatus[-1] = 'StatusReceptionCanceled'; + $this->labelStatus[0] = 'StatusReceptionDraft'; + // product to receive if stock increase is on close or already received if stock increase is on validation + $this->labelStatus[1] = 'StatusReceptionValidated'; + if (getDolGlobalInt("STOCK_CALCULATE_ON_RECEPTION")) { + $this->labelStatus[1] = 'StatusReceptionValidatedReceived'; + } + if (getDolGlobalInt("STOCK_CALCULATE_ON_RECEPTION_CLOSE")) { + $this->labelStatus[1] = 'StatusReceptionValidatedToReceive'; + } + $this->labelStatus[2] = 'StatusReceptionProcessed'; + + // List of short language codes for status + $this->labelStatusShort[-1] = 'StatusReceptionCanceledShort'; + $this->labelStatusShort[0] = 'StatusReceptionDraftShort'; + $this->labelStatusShort[1] = 'StatusReceptionValidatedShort'; + $this->labelStatusShort[2] = 'StatusReceptionProcessedShort'; + + $labelStatus = $langs->transnoentitiesnoconv($this->labelStatus[$status]); + $labelStatusShort = $langs->transnoentitiesnoconv($this->labelStatusShort[$status]); $statusType = 'status'.$status; if ($status == self::STATUS_VALIDATED) { From 924679515970789c67d9443e3a2b3c50ffa20f3c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 12 Jan 2023 12:47:57 +0100 Subject: [PATCH 0757/1128] Fix warning --- htdocs/core/class/utils.class.php | 3 +++ htdocs/core/modules/action/rapport.class.php | 5 +++++ htdocs/modulebuilder/index.php | 2 +- htdocs/public/recruitment/index.php | 2 +- 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/utils.class.php b/htdocs/core/class/utils.class.php index f8096ed84e9..16e000e7f59 100644 --- a/htdocs/core/class/utils.class.php +++ b/htdocs/core/class/utils.class.php @@ -34,6 +34,9 @@ class Utils */ public $db; + public $error; + public $errors; + public $output; // Used by Cron method to return message public $result; // Used by Cron method to return data diff --git a/htdocs/core/modules/action/rapport.class.php b/htdocs/core/modules/action/rapport.class.php index 8c0964b1378..d91b748d7d5 100644 --- a/htdocs/core/modules/action/rapport.class.php +++ b/htdocs/core/modules/action/rapport.class.php @@ -40,6 +40,11 @@ class CommActionRapport */ public $db; + public $error; + + public $errors; + + /** * @var string description */ diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index a6f3431bd2e..f871d916aa7 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -4461,7 +4461,7 @@ if ($module == 'initmodule') { print ''; print ''; print ' ('.$langs->trans("GeneratedOn").' '.dol_print_date(dol_filemtime($outputfiledocpdf), 'dayhour').')'; - print ' '.img_picto($langs->trans("Delete"), 'delete').''; + print ' '.img_picto($langs->trans("Delete"), 'delete').''; } print '
'; diff --git a/htdocs/public/recruitment/index.php b/htdocs/public/recruitment/index.php index 23a180b9a7b..4f82139656c 100644 --- a/htdocs/public/recruitment/index.php +++ b/htdocs/public/recruitment/index.php @@ -252,7 +252,7 @@ if (is_array($results)) { } } print ''; - print $tmpuser->getFullName(-1); + print $tmpuser->getFullName($langs); print '   '.dol_print_email($emailforcontact, 0, 0, 1, 0, 0, 'envelope'); print ''; print '
'; From c50c553999834427c38e0cad55e172f7a9387a0b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 12 Jan 2023 14:40:00 +0100 Subject: [PATCH 0758/1128] NEW Save date to invalidate other session into user table --- htdocs/install/mysql/migration/17.0.0-18.0.0.sql | 3 +++ htdocs/install/mysql/tables/llx_user.sql | 1 + htdocs/user/class/user.class.php | 10 +++++++--- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/htdocs/install/mysql/migration/17.0.0-18.0.0.sql b/htdocs/install/mysql/migration/17.0.0-18.0.0.sql index 84022422fba..376d89861f2 100644 --- a/htdocs/install/mysql/migration/17.0.0-18.0.0.sql +++ b/htdocs/install/mysql/migration/17.0.0-18.0.0.sql @@ -56,3 +56,6 @@ ALTER TABLE llx_payment_salary MODIFY COLUMN datep datetime; INSERT INTO llx_c_tva(rowid,fk_pays,code,taux,localtax1,localtax1_type,localtax2,localtax2_type,recuperableonly,note,active) values (1179, 117, 'I-28' , 28, 0, '0', 0, '0', 0, 'IGST', 1); INSERT INTO llx_c_tva(rowid,fk_pays,code,taux,localtax1,localtax1_type,localtax2,localtax2_type,recuperableonly,note,active) values (1176, 117, 'C+S-18', 0, 9, '1', 9, '1', 0, 'CGST+SGST - Same state sales', 1); + +ALTER TABLE llx_user ADD COLUMN flagdelsessionsbefore datetime DEFAULT NULL; + diff --git a/htdocs/install/mysql/tables/llx_user.sql b/htdocs/install/mysql/tables/llx_user.sql index ca0c7bc818d..a10f8489bcb 100644 --- a/htdocs/install/mysql/tables/llx_user.sql +++ b/htdocs/install/mysql/tables/llx_user.sql @@ -84,6 +84,7 @@ create table llx_user datelastpassvalidation datetime, -- last date we change password or we made a disconnect all datestartvalidity datetime, dateendvalidity datetime, + flagdelsessionsbefore datetime DEFAULT NULL, -- set this to a date if we need to launch an external process to invalidate all sessions for the same login created before this date iplastlogin varchar(250), ippreviouslogin varchar(250), egroupware_id integer, diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 74093af63c6..65a7b7d7842 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -1776,9 +1776,9 @@ class User extends CommonObject } } - if ($result > 0 && $member->fk_soc) { // If member is linked to a thirdparty + if ($result > 0 && $member->socid) { // If member is linked to a thirdparty $sql = "UPDATE ".$this->db->prefix()."user"; - $sql .= " SET fk_soc=".((int) $member->fk_soc); + $sql .= " SET fk_soc=".((int) $member->socid); $sql .= " WHERE rowid=".((int) $this->id); dol_syslog(get_class($this)."::create_from_member", LOG_DEBUG); @@ -2243,9 +2243,10 @@ class User extends CommonObject * @param int $notrigger 1=Does not launch triggers * @param int $nosyncmember Do not synchronize linked member * @param int $passwordalreadycrypted 0=Value is cleartext password, 1=Value is crypted value. + * @param int $flagdelsessionsbefore 1=Save also the current date to ask to invalidate all other session before this date. * @return string If OK return clear password, 0 if no change (warning, you may retreive 1 instead of 0 even if password was same), < 0 if error */ - public function setPassword($user, $password = '', $changelater = 0, $notrigger = 0, $nosyncmember = 0, $passwordalreadycrypted = 0) + public function setPassword($user, $password = '', $changelater = 0, $notrigger = 0, $nosyncmember = 0, $passwordalreadycrypted = 0, $flagdelsessionsbefore = 1) { global $conf, $langs; require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php'; @@ -2297,6 +2298,9 @@ class User extends CommonObject $sql = "UPDATE ".$this->db->prefix()."user"; $sql .= " SET pass_crypted = '".$this->db->escape($password_crypted)."',"; $sql .= " pass_temp = null"; + if (empty($flagdelsessionsbefore)) { + $sql .= ", flagdelsessionsbefore = '".$this->db->idate(dol_now() - 5, 'gmt')."'"; + } if (!empty($conf->global->DATABASE_PWD_ENCRYPTED)) { $sql .= ", pass = null"; } else { From 440d72ba9de2f151f6ab21a87db28057eb7f6c1b Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Thu, 12 Jan 2023 15:19:39 +0100 Subject: [PATCH 0759/1128] kanban mode for list of various payment --- .../bank/class/paymentvarious.class.php | 37 ++ htdocs/compta/bank/various_payment/list.php | 324 ++++++++++-------- 2 files changed, 214 insertions(+), 147 deletions(-) diff --git a/htdocs/compta/bank/class/paymentvarious.class.php b/htdocs/compta/bank/class/paymentvarious.class.php index 3d07c280559..857b49d1576 100644 --- a/htdocs/compta/bank/class/paymentvarious.class.php +++ b/htdocs/compta/bank/class/paymentvarious.class.php @@ -768,4 +768,41 @@ class PaymentVarious extends CommonObject } return 0; } + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $langs; + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(1) : $this->ref).''; + if (property_exists($this, 'fk_bank')) { + $return .= ' | '.$this->fk_bank.''; + } + if (property_exists($this, 'datep')) { + $return .= '
'.$langs->trans("Date").' : '.dol_print_date($this->db->jdate($this->datep), 'day').''; + } + if (property_exists($this, 'type_payment') && !empty($this->type_payment)) { + $return .= '
'.$langs->trans("Payment", $this->type_payment).' : '.$this->type_payment.''; + } + if (property_exists($this, 'accountancy_code')) { + $return .= '
'.$langs->trans("Account").' : '.$this->accountancy_code.''; + } + if (property_exists($this, 'amount')) { + $return .= '
'.$langs->trans("Debit").' : '.price($this->amount).''; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } diff --git a/htdocs/compta/bank/various_payment/list.php b/htdocs/compta/bank/various_payment/list.php index 0721aeb7ef0..9cd43b01924 100644 --- a/htdocs/compta/bank/various_payment/list.php +++ b/htdocs/compta/bank/various_payment/list.php @@ -45,6 +45,7 @@ if ($user->socid) { } $optioncss = GETPOST('optioncss', 'alpha'); +$mode = GETPOST('mode', 'alpha'); $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit; $search_ref = GETPOST('search_ref', 'int'); @@ -312,6 +313,9 @@ if ($resql) { $total = 0; $param = ''; + if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); + } if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -362,7 +366,10 @@ if ($resql) { if (!empty($socid)) { $url .= '&socid='.urlencode($socid); } - $newcardbutton = dolGetButtonTitle($langs->trans('MenuNewVariousPayment'), '', 'fa fa-plus-circle', $url, '', $user->rights->banque->modifier); + $newcardbutton = ''; + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); + $newcardbutton .= dolGetButtonTitle($langs->trans('MenuNewVariousPayment'), '', 'fa fa-plus-circle', $url, '', $user->rights->banque->modifier); print ''; @@ -375,6 +382,8 @@ if ($resql) { print ''; print ''; print ''; + print ''; + print_barre_liste($langs->trans("MenuVariousPayment"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'object_payment', 0, $newcardbutton, '', $limit, 0, 0, 1); @@ -568,166 +577,187 @@ if ($resql) { $variousstatic->id = $obj->rowid; $variousstatic->ref = $obj->rowid; $variousstatic->label = $obj->label; + $variousstatic->datep = $obj->datep; + $variousstatic->type_payment = $obj->payment_code; + $bankline->fetch($obj->fk_bank); + $variousstatic->fk_bank = $bankline->getNomUrl(1); + $variousstatic->amount = $obj->amount; - print ''; + $accountingaccount->fetch('', $obj->accountancy_code, 1); + $variousstatic->accountancy_code = $accountingaccount->getNomUrl(0, 0, 1, $obj->accountingaccount, 1); - // No - if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER_IN_LIST)) { - print ''.(($offset * $limit) + $i).''; - } - - // Ref - if ($arrayfields['ref']['checked']) { - print ''.$variousstatic->getNomUrl(1).""; - if (!$i) { - $totalarray['nbfield']++; + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + print '
'; } - } + // Output Kanban - // Label payment - if ($arrayfields['label']['checked']) { - print ''.$variousstatic->label.""; - if (!$i) { - $totalarray['nbfield']++; + print $variousstatic->getKanbanView(''); + if ($i == (min($num, $limit) - 1)) { + print '
'; + print ''; } - } + } else { + print ''; - // Date payment - if ($arrayfields['datep']['checked']) { - print ''.dol_print_date($obj->datep, 'day').""; - if (!$i) { - $totalarray['nbfield']++; + // No + if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER_IN_LIST)) { + print ''.(($offset * $limit) + $i).''; } - } - - // Date value - if ($arrayfields['datev']['checked']) { - print ''.dol_print_date($obj->datev, 'day').""; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Type - if ($arrayfields['type']['checked']) { - print ''; - if ($obj->payment_code) { - print $langs->trans("PaymentTypeShort".$obj->payment_code); - print ' '; - } - print $obj->num_payment; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Project - if ($arrayfields['project']['checked']) { - print ''; - if ($obj->fk_project > 0) { - $proj->fetch($obj->fk_project); - print $proj->getNomUrl(1); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Bank account - if ($arrayfields['bank']['checked']) { - print ''; - if ($obj->bid > 0) { - $accountstatic->id = $obj->bid; - $accountstatic->ref = $obj->bref; - $accountstatic->number = $obj->bnumber; - - if (isModEnabled('accounting')) { - $accountstatic->account_number = $obj->bank_account_number; - $accountingjournal->fetch($obj->accountancy_journal); - $accountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1, '', 1); + // Ref + if ($arrayfields['ref']['checked']) { + print ''.$variousstatic->getNomUrl(1).""; + if (!$i) { + $totalarray['nbfield']++; } - - $accountstatic->label = $obj->blabel; - print $accountstatic->getNomUrl(1); - } else { - print ' '; } - print ''; + + // Label payment + if ($arrayfields['label']['checked']) { + print ''.$variousstatic->label.""; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Date payment + if ($arrayfields['datep']['checked']) { + print ''.dol_print_date($obj->datep, 'day').""; + if (!$i) { + $totalarray['nbfield']++; + } + } + + + // Date value + if ($arrayfields['datev']['checked']) { + print ''.dol_print_date($obj->datev, 'day').""; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Type + if ($arrayfields['type']['checked']) { + print ''; + if ($obj->payment_code) { + print $langs->trans("PaymentTypeShort".$obj->payment_code); + print ' '; + } + print $obj->num_payment; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Project + if ($arrayfields['project']['checked']) { + print ''; + if ($obj->fk_project > 0) { + $proj->fetch($obj->fk_project); + print $proj->getNomUrl(1); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Bank account + if ($arrayfields['bank']['checked']) { + print ''; + if ($obj->bid > 0) { + $accountstatic->id = $obj->bid; + $accountstatic->ref = $obj->bref; + $accountstatic->number = $obj->bnumber; + + if (isModEnabled('accounting')) { + $accountstatic->account_number = $obj->bank_account_number; + $accountingjournal->fetch($obj->accountancy_journal); + $accountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1, '', 1); + } + + $accountstatic->label = $obj->blabel; + print $accountstatic->getNomUrl(1); + } else { + print ' '; + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Bank entry + if ($arrayfields['entry']['checked']) { + $bankline->fetch($obj->fk_bank); + print ''.$bankline->getNomUrl(1).''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Accounting account + if (!empty($arrayfields['account']['checked'])) { + $accountingaccount->fetch('', $obj->accountancy_code, 1); + + print ''.$accountingaccount->getNomUrl(0, 1, 1, '', 1).''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Accounting subledger account + if (!empty($arrayfields['subledger']['checked'])) { + print ''.length_accounta($obj->subledger_account).''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Debit + if ($arrayfields['debit']['checked']) { + print ''; + if ($obj->sens == 0) { + print ''.price($obj->amount).''; + $totalarray['val']['total_deb'] += $obj->amount; + } + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'total_deb'; + } + print ''; + } + + // Credit + if ($arrayfields['credit']['checked']) { + print ''; + if ($obj->sens == 1) { + print ''.price($obj->amount).''; + $totalarray['val']['total_cred'] += $obj->amount; + } + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'total_cred'; + } + print ''; + } + + print ''; + if (!$i) { $totalarray['nbfield']++; } + + print ''."\n"; } - - // Bank entry - if ($arrayfields['entry']['checked']) { - $bankline->fetch($obj->fk_bank); - print ''.$bankline->getNomUrl(1).''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Accounting account - if (!empty($arrayfields['account']['checked'])) { - $accountingaccount->fetch('', $obj->accountancy_code, 1); - - print ''.$accountingaccount->getNomUrl(0, 1, 1, '', 1).''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Accounting subledger account - if (!empty($arrayfields['subledger']['checked'])) { - print ''.length_accounta($obj->subledger_account).''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Debit - if ($arrayfields['debit']['checked']) { - print ''; - if ($obj->sens == 0) { - print ''.price($obj->amount).''; - $totalarray['val']['total_deb'] += $obj->amount; - } - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'total_deb'; - } - print ''; - } - - // Credit - if ($arrayfields['credit']['checked']) { - print ''; - if ($obj->sens == 1) { - print ''.price($obj->amount).''; - $totalarray['val']['total_cred'] += $obj->amount; - } - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'total_cred'; - } - print ''; - } - - print ''; - - if (!$i) { - $totalarray['nbfield']++; - } - - print ''."\n"; - $i++; } From a68df8e9f573751eff25ca66ee4e3b1d630d7318 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Thu, 12 Jan 2023 16:16:23 +0100 Subject: [PATCH 0760/1128] kanban mode for list of banks --- htdocs/compta/bank/class/account.class.php | 33 ++ htdocs/compta/bank/list.php | 429 +++++++++++---------- 2 files changed, 258 insertions(+), 204 deletions(-) diff --git a/htdocs/compta/bank/class/account.class.php b/htdocs/compta/bank/class/account.class.php index a73fd2b5f2c..5332150dfb4 100644 --- a/htdocs/compta/bank/class/account.class.php +++ b/htdocs/compta/bank/class/account.class.php @@ -1748,6 +1748,39 @@ class Account extends CommonObject return false; } } + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $langs; + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).''; + + if (property_exists($this, 'type_lib')) { + $return .= '
'.substr($this->type_lib[$this->type], 0, 24).'...'; + } + if (method_exists($this, 'solde')) { + $return .= '
'; + $return .= ''.$langs->trans("Balance").' : '.price($this->solde(1), 0, $langs, 1, -1, -1, $this->currency_code).''; + } + if (method_exists($this, 'getLibStatut')) { + $return .= '
'.$this->getLibStatut(5).'
'; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } diff --git a/htdocs/compta/bank/list.php b/htdocs/compta/bank/list.php index 38b666cc2ef..8efe9451b64 100644 --- a/htdocs/compta/bank/list.php +++ b/htdocs/compta/bank/list.php @@ -52,6 +52,7 @@ $show_files = GETPOST('show_files', 'int'); $confirm = GETPOST('confirm', 'alpha'); $toselect = GETPOST('toselect', 'array'); $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'bankaccountlist'; // To manage different context of search +$mode = GETPOST('mode', 'alpha'); $search_ref = GETPOST('search_ref', 'alpha'); $search_label = GETPOST('search_label', 'alpha'); @@ -305,6 +306,9 @@ llxHeader('', $title, $help_url); $arrayofselected = is_array($toselect) ? $toselect : array(); $param = ''; +if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); +} if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -365,8 +369,13 @@ print ''; print ''; print ''; +print ''; -$newcardbutton = dolGetButtonTitle($langs->trans('NewFinancialAccount'), '', 'fa fa-plus-circle', 'card.php?action=create', '', $user->rights->banque->configurer); + +$newcardbutton = ''; +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('NewFinancialAccount'), '', 'fa fa-plus-circle', 'card.php?action=create', '', $user->rights->banque->configurer); print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'bank_account', 0, $newcardbutton, '', $limit, 1); @@ -584,224 +593,236 @@ foreach ($accounts as $key => $type) { $lastcurrencycode = $objecttmp->currency_code; } - print ''; - // Action column - if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($objecttmp->id, $arrayofselected)) { - $selected = 1; + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + print '
'; + } + // Output Kanban + print $objecttmp->getKanbanView(''); + if ($i == (min($num, $limit) - 1)) { + print '
'; + print ''; + } + } else { + print ''; + // Action column + if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($objecttmp->id, $arrayofselected)) { + $selected = 1; + } + print ''; } - print ''; + print ''; } - print ''; - } - // Ref - if (!empty($arrayfields['b.ref']['checked'])) { - print ''.$objecttmp->getNomUrl(1).''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Label - if (!empty($arrayfields['b.label']['checked'])) { - print ''.dol_escape_htmltag($objecttmp->label).''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Account type - if (!empty($arrayfields['accountype']['checked'])) { - print ''; - print $objecttmp->type_lib[$objecttmp->type]; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Number - if (!empty($arrayfields['b.number']['checked'])) { - print ''.dol_escape_htmltag($objecttmp->number).''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Account number - if (!empty($arrayfields['b.account_number']['checked'])) { - print ''; - if (isModEnabled('accounting') && !empty($objecttmp->account_number)) { - $accountingaccount = new AccountingAccount($db); - $accountingaccount->fetch('', $objecttmp->account_number, 1); - print ''; - print $accountingaccount->getNomUrl(0, 1, 1, '', 0); - print ''; - } else { - print ''.$objecttmp->account_number.''; - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Accountancy journal - if (!empty($arrayfields['b.fk_accountancy_journal']['checked'])) { - print ''; - if (isModEnabled('accounting')) { - if (empty($objecttmp->fk_accountancy_journal)) { - print img_warning($langs->trans("Mandatory")); - } else { - $accountingjournal = new AccountingJournal($db); - $accountingjournal->fetch($objecttmp->fk_accountancy_journal); - print $accountingjournal->getNomUrl(0, 1, 1, '', 1); + // Ref + if (!empty($arrayfields['b.ref']['checked'])) { + print ''.$objecttmp->getNomUrl(1).''; + if (!$i) { + $totalarray['nbfield']++; } - } else { - print ''; - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Currency - if (!empty($arrayfields['b.currency_code']['checked'])) { - print ''; - print $objecttmp->currency_code; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Transactions to reconcile - if (!empty($arrayfields['toreconcile']['checked'])) { - $conciliate = $objecttmp->canBeConciliated(); - - $labeltoshow = ''; - if ($conciliate == -2) { - $labeltoshow = $langs->trans("CashAccount"); - } elseif ($conciliate == -3) { - $labeltoshow = $langs->trans("Closed"); - } elseif (empty($objecttmp->rappro)) { - $labeltoshow = $langs->trans("ConciliationDisabled"); } - print ''; - if ($conciliate == -2) { - print ''.$langs->trans("CashAccount").''; - } elseif ($conciliate == -3) { - print ''.$langs->trans("Closed").''; - } elseif (empty($objecttmp->rappro)) { - print ''.$langs->trans("ConciliationDisabled").''; - } else { - $result = $objecttmp->load_board($user, $objecttmp->id); - if (is_numeric($result) && $result < 0) { - setEventMessages($objecttmp->error, $objecttmp->errors, 'errors'); - } else { - print '
'; - print ''; - print $result->nbtodo; + // Label + if (!empty($arrayfields['b.label']['checked'])) { + print ''.dol_escape_htmltag($objecttmp->label).''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Account type + if (!empty($arrayfields['accountype']['checked'])) { + print ''; + print $objecttmp->type_lib[$objecttmp->type]; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Number + if (!empty($arrayfields['b.number']['checked'])) { + print ''.dol_escape_htmltag($objecttmp->number).''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Account number + if (!empty($arrayfields['b.account_number']['checked'])) { + print ''; + if (isModEnabled('accounting') && !empty($objecttmp->account_number)) { + $accountingaccount = new AccountingAccount($db); + $accountingaccount->fetch('', $objecttmp->account_number, 1); + print ''; + print $accountingaccount->getNomUrl(0, 1, 1, '', 0); print ''; - print ''; - if ($result->nbtodolate) { - print ''; - print ' '.$result->nbtodolate; + } else { + print ''.$objecttmp->account_number.''; + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Accountancy journal + if (!empty($arrayfields['b.fk_accountancy_journal']['checked'])) { + print ''; + if (isModEnabled('accounting')) { + if (empty($objecttmp->fk_accountancy_journal)) { + print img_warning($langs->trans("Mandatory")); + } else { + $accountingjournal = new AccountingJournal($db); + $accountingjournal->fetch($objecttmp->fk_accountancy_journal); + print $accountingjournal->getNomUrl(0, 1, 1, '', 1); + } + } else { + print ''; + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Currency + if (!empty($arrayfields['b.currency_code']['checked'])) { + print ''; + print $objecttmp->currency_code; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Transactions to reconcile + if (!empty($arrayfields['toreconcile']['checked'])) { + $conciliate = $objecttmp->canBeConciliated(); + + $labeltoshow = ''; + if ($conciliate == -2) { + $labeltoshow = $langs->trans("CashAccount"); + } elseif ($conciliate == -3) { + $labeltoshow = $langs->trans("Closed"); + } elseif (empty($objecttmp->rappro)) { + $labeltoshow = $langs->trans("ConciliationDisabled"); + } + + print ''; + if ($conciliate == -2) { + print ''.$langs->trans("CashAccount").''; + } elseif ($conciliate == -3) { + print ''.$langs->trans("Closed").''; + } elseif (empty($objecttmp->rappro)) { + print ''.$langs->trans("ConciliationDisabled").''; + } else { + $result = $objecttmp->load_board($user, $objecttmp->id); + if (is_numeric($result) && $result < 0) { + setEventMessages($objecttmp->error, $objecttmp->errors, 'errors'); + } else { + print ''; + print ''; + print $result->nbtodo; print ''; + print ''; + if ($result->nbtodolate) { + print ''; + print ' '.$result->nbtodolate; + print ''; + } } } - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Extra fields - if (is_array($objecttmp->array_options)) { - $obj = new stdClass(); - foreach ($objecttmp->array_options as $k => $v) { - $obj->$k = $v; - } - } - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $objecttmp, $action); // Note that $action and $objecttmpect may have been modified by hook - print $hookmanager->resPrint; - // Date creation - if (!empty($arrayfields['b.datec']['checked'])) { - print ''; - print dol_print_date($objecttmp->date_creation, 'dayhour'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Date modification - if (!empty($arrayfields['b.tms']['checked'])) { - print ''; - print dol_print_date($objecttmp->date_update, 'dayhour'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Status - if (!empty($arrayfields['b.clos']['checked'])) { - print ''.$objecttmp->getLibStatut(5).''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Balance - if (!empty($arrayfields['balance']['checked'])) { - print ''; - print ''; - print ''.price($solde, 0, $langs, 1, -1, -1, $objecttmp->currency_code).''; - print ''; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'balance'; - } - $totalarray['val']['balance'] += $solde; - } - - // Action column - if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($objecttmp->id, $arrayofselected)) { - $selected = 1; + print ''; + if (!$i) { + $totalarray['nbfield']++; } - print ''; } - print ''; - } - if (!$i) { - $totalarray['nbfield']++; - } - print ''; + // Extra fields + if (is_array($objecttmp->array_options)) { + $obj = new stdClass(); + foreach ($objecttmp->array_options as $k => $v) { + $obj->$k = $v; + } + } + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $objecttmp, $action); // Note that $action and $objecttmpect may have been modified by hook + print $hookmanager->resPrint; + // Date creation + if (!empty($arrayfields['b.datec']['checked'])) { + print ''; + print dol_print_date($objecttmp->date_creation, 'dayhour'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Date modification + if (!empty($arrayfields['b.tms']['checked'])) { + print ''; + print dol_print_date($objecttmp->date_update, 'dayhour'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } - if (empty($total[$objecttmp->currency_code])) { - $total[$objecttmp->currency_code] = $solde; - } else { - $total[$objecttmp->currency_code] += $solde; + // Status + if (!empty($arrayfields['b.clos']['checked'])) { + print ''.$objecttmp->getLibStatut(5).''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Balance + if (!empty($arrayfields['balance']['checked'])) { + print ''; + print ''; + print ''.price($solde, 0, $langs, 1, -1, -1, $objecttmp->currency_code).''; + print ''; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'balance'; + } + $totalarray['val']['balance'] += $solde; + } + + // Action column + if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($objecttmp->id, $arrayofselected)) { + $selected = 1; + } + print ''; + } + print ''; + } + if (!$i) { + $totalarray['nbfield']++; + } + + print ''; + + if (empty($total[$objecttmp->currency_code])) { + $total[$objecttmp->currency_code] = $solde; + } else { + $total[$objecttmp->currency_code] += $solde; + } } - $i++; } From 551daa5ca1806e0ac4d272a10a787ebf1b326a33 Mon Sep 17 00:00:00 2001 From: hystepik Date: Thu, 12 Jan 2023 16:26:39 +0100 Subject: [PATCH 0761/1128] New : Add reload of modules in configuration --- htdocs/admin/modules.php | 54 +++++++++++++++++++++++++++++++++++ htdocs/core/lib/admin.lib.php | 15 ++++++---- htdocs/langs/en_US/admin.lang | 2 ++ 3 files changed, 65 insertions(+), 6 deletions(-) diff --git a/htdocs/admin/modules.php b/htdocs/admin/modules.php index e93b5a58e96..db019bd262a 100644 --- a/htdocs/admin/modules.php +++ b/htdocs/admin/modules.php @@ -282,10 +282,39 @@ if ($action == 'set' && $user->admin) { } header("Location: ".$_SERVER["PHP_SELF"]."?mode=".$mode.$param.($page_y ? '&page_y='.$page_y : '')); exit; +} elseif (getDolGlobalInt("MAIN_FEATURES_LEVEL") > 1 && $action == 'reload' && $user->admin && GETPOST('confirm') == 'yes') { + $result = unActivateModule($value, 0); + dolibarr_set_const($db, "MAIN_IHM_PARAMS_REV", (int) $conf->global->MAIN_IHM_PARAMS_REV + 1, 'chaine', 0, '', $conf->entity); + if ($result) { + setEventMessages($result, null, 'errors'); + header("Location: ".$_SERVER["PHP_SELF"]."?mode=".$mode.$param.($page_y ? '&page_y='.$page_y : '')); + } + $resarray = activateModule($value, 0, 1); + dolibarr_set_const($db, "MAIN_IHM_PARAMS_REV", (int) $conf->global->MAIN_IHM_PARAMS_REV + 1, 'chaine', 0, '', $conf->entity); + if (!empty($resarray['errors'])) { + setEventMessages('', $resarray['errors'], 'errors'); + } else { + if ($resarray['nbperms'] > 0) { + $tmpsql = "SELECT COUNT(rowid) as nb FROM ".MAIN_DB_PREFIX."user WHERE admin <> 1"; + $resqltmp = $db->query($tmpsql); + if ($resqltmp) { + $obj = $db->fetch_object($resqltmp); + if ($obj && $obj->nb > 1) { + $msg = $langs->trans('ModuleEnabledAdminMustCheckRights'); + setEventMessages($msg, null, 'warnings'); + } + } else { + dol_print_error($db); + } + } + } + header("Location: ".$_SERVER["PHP_SELF"]."?mode=".$mode.$param.($page_y ? '&page_y='.$page_y : '')); + exit; } + /* * View */ @@ -464,6 +493,19 @@ if ($action == 'reset_confirm' && $user->admin) { } } +if ($action == 'reload_confirm' && $user->admin) { + if (!empty($modules[$value])) { + $objMod = $modules[$value]; + + if (!empty($objMod->langfiles)) { + $langs->loadLangs($objMod->langfiles); + } + + $form = new Form($db); + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?value='.$value.'&mode='.$mode.$param, $langs->trans('ConfirmReload'), $langs->trans(GETPOST('confirm_message_code')), 'reload', '', 'no', 1); + } +} + print $formconfirm; asort($orders); @@ -802,10 +844,22 @@ if ($mode == 'common' || $mode == 'commonkanban') { $codeenabledisable .= 'warnings_unactivation[$mysoc->country_code]).'&value='.$modName.'&mode='.$mode.$param.'">'; $codeenabledisable .= img_picto($langs->trans("Activated"), 'switch_on'); $codeenabledisable .= ''; + if (getDolGlobalInt("MAIN_FEATURES_LEVEL") > 1) { + $codeenabledisable .= ' '; + $codeenabledisable .= ''; + $codeenabledisable .= img_picto($langs->trans("Reload"), 'refresh', 'class="fa-15"'); + $codeenabledisable .= ''; + } } else { $codeenabledisable .= ''; $codeenabledisable .= img_picto($langs->trans("Activated"), 'switch_on'); $codeenabledisable .= ''; + if (getDolGlobalInt("MAIN_FEATURES_LEVEL") > 1) { + $codeenabledisable .= ' '; + $codeenabledisable .= ''; + $codeenabledisable .= img_picto($langs->trans("Reload"), 'refresh', 'class="fa-15"'); + $codeenabledisable .= ''; + } } } diff --git a/htdocs/core/lib/admin.lib.php b/htdocs/core/lib/admin.lib.php index 71bcc082961..92895793082 100644 --- a/htdocs/core/lib/admin.lib.php +++ b/htdocs/core/lib/admin.lib.php @@ -1084,11 +1084,12 @@ function purgeSessions($mysessionid) /** * Enable a module * - * @param string $value Name of module to activate - * @param int $withdeps Activate/Disable also all dependencies - * @return array array('nbmodules'=>nb modules activated with success, 'errors=>array of error messages, 'nbperms'=>Nb permission added); + * @param string $value Name of module to activate + * @param int $withdeps Activate/Disable also all dependencies + * @param int $noconfverification Remove verification of $conf variable for module + * @return array array('nbmodules'=>nb modules activated with success, 'errors=>array of error messages, 'nbperms'=>Nb permission added); */ -function activateModule($value, $withdeps = 1) +function activateModule($value, $withdeps = 1, $noconfverification = 0) { global $db, $langs, $conf, $mysoc; @@ -1144,8 +1145,10 @@ function activateModule($value, $withdeps = 1) } $const_name = $objMod->const_name; - if (!empty($conf->global->$const_name)) { - return $ret; + if ($noconfverification == 0) { + if (!empty($conf->global->$const_name)) { + return $ret; + } } $result = $objMod->init(); // Enable module diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 421ba4f6fa2..34bae07fc37 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -2357,3 +2357,5 @@ AllowExternalDownload=Allow external download (without login, using a shared lin DeadlineDayVATSubmission=Deadline day for vat submission on the next month MaxNumberOfAttachementOnForms=Max number of joinded files in a form IfDefinedUseAValueBeetween=If defined, use a value between %s and %s +Reload=Reload +ConfirmReload=Confirm module reload \ No newline at end of file From 8a5423b464df64b3c825efc47901f2ec1c61342d Mon Sep 17 00:00:00 2001 From: hystepik Date: Thu, 12 Jan 2023 16:29:58 +0100 Subject: [PATCH 0762/1128] add newline end of file --- htdocs/langs/en_US/admin.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 34bae07fc37..cfe01784bea 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -2358,4 +2358,4 @@ DeadlineDayVATSubmission=Deadline day for vat submission on the next month MaxNumberOfAttachementOnForms=Max number of joinded files in a form IfDefinedUseAValueBeetween=If defined, use a value between %s and %s Reload=Reload -ConfirmReload=Confirm module reload \ No newline at end of file +ConfirmReload=Confirm module reload From 23f89c9134640099ca5fa02bea86dff01864b392 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 12 Jan 2023 17:59:19 +0100 Subject: [PATCH 0763/1128] Missing photo --- htdocs/salaries/list.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/htdocs/salaries/list.php b/htdocs/salaries/list.php index 17addfa22f4..d2344f378a0 100644 --- a/htdocs/salaries/list.php +++ b/htdocs/salaries/list.php @@ -458,7 +458,7 @@ if (isModEnabled("banque")) { // Amount print ''; -//Status +// Status print ''; $liststatus = array('0' => $langs->trans("Unpaid"), '1' => $langs->trans("Paid")); print $form->selectarray('search_status', $liststatus, $search_status, 1, 0, 0, '', 0, 0, 0, '', 'search_status width100 onrightofpage'); @@ -538,7 +538,8 @@ while ($i < ($limit ? min($num, $limit) : $num)) { $userstatic->login = $obj->login; $userstatic->email = $obj->email; $userstatic->socid = $obj->fk_soc; - $userstatic->statut = $obj->status; + $userstatic->statut = $obj->status; // deprecated + $userstatic->status = $obj->status; $salstatic->id = $obj->rowid; $salstatic->ref = $obj->rowid; @@ -590,7 +591,7 @@ while ($i < ($limit ? min($num, $limit) : $num)) { } // Employee - print ''.$userstatic->getNomUrl(1)."\n"; + print ''.$userstatic->getNomUrl(-1)."\n"; if (!$i) { $totalarray['nbfield']++; } @@ -637,7 +638,7 @@ while ($i < ($limit ? min($num, $limit) : $num)) { } } - // if (!$i) $totalarray['pos'][$totalarray['nbfield']] = 'totalttcfield'; + // if (!$i) $totalarray['pos'][$totalarray['nbfield']] = 'totalttcfield'; // Amount print ''.price($obj->amount).''; From 3ae453136b1d6cbf4011e5d2509ff538cfa252ed Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 12 Jan 2023 18:06:26 +0100 Subject: [PATCH 0764/1128] Fix error --- htdocs/install/upgrade2.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/install/upgrade2.php b/htdocs/install/upgrade2.php index c9f1eb76b41..1e153109140 100644 --- a/htdocs/install/upgrade2.php +++ b/htdocs/install/upgrade2.php @@ -4196,7 +4196,7 @@ function migrate_delete_old_dir($db, $langs, $conf) } foreach ($filetodeletearray as $filetodelete) { - //print ''.$filetodelete."
\n"; + $result = 1; if (file_exists($filetodelete)) { $result = dol_delete_dir_recursive($filetodelete); } From dac735dc4be9984266df767ff6de606afb2f6b20 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 12 Jan 2023 18:11:10 +0100 Subject: [PATCH 0765/1128] Fix missing photo --- htdocs/salaries/list.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/salaries/list.php b/htdocs/salaries/list.php index d2344f378a0..fbbac2a2f3b 100644 --- a/htdocs/salaries/list.php +++ b/htdocs/salaries/list.php @@ -224,7 +224,7 @@ $now = dol_now(); $help_url = ''; $title = $langs->trans('Salaries'); -$sql = "SELECT u.rowid as uid, u.lastname, u.firstname, u.login, u.email, u.admin, u.salary as current_salary, u.fk_soc as fk_soc, u.statut as status,"; +$sql = "SELECT u.rowid as uid, u.lastname, u.firstname, u.login, u.email, u.admin, u.photo, u.salary as current_salary, u.fk_soc as fk_soc, u.statut as status,"; $sql .= " s.rowid, s.fk_account, s.paye, s.fk_user, s.amount, s.salary, s.label, s.datesp, s.dateep, s.fk_typepayment as paymenttype, "; $sql .= " ba.rowid as bid, ba.ref as bref, ba.number as bnumber, ba.account_number, ba.fk_accountancy_journal, ba.label as blabel, ba.iban_prefix as iban, ba.bic, ba.currency_code, ba.clos,"; $sql .= " pst.code as payment_code,"; @@ -540,6 +540,7 @@ while ($i < ($limit ? min($num, $limit) : $num)) { $userstatic->socid = $obj->fk_soc; $userstatic->statut = $obj->status; // deprecated $userstatic->status = $obj->status; + $userstatic->photo = $obj->photo; $salstatic->id = $obj->rowid; $salstatic->ref = $obj->rowid; From 7124a59110b4c9c3fd60a449d3c367281461b2eb Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Thu, 12 Jan 2023 18:28:57 +0100 Subject: [PATCH 0766/1128] kanban mode for list of prelevement orders --- .../class/bonprelevement.class.php | 34 +++++++++++++ htdocs/compta/prelevement/orders_list.php | 49 ++++++++++++++----- 2 files changed, 70 insertions(+), 13 deletions(-) diff --git a/htdocs/compta/prelevement/class/bonprelevement.class.php b/htdocs/compta/prelevement/class/bonprelevement.class.php index 959630a5538..e8e511f8c87 100644 --- a/htdocs/compta/prelevement/class/bonprelevement.class.php +++ b/htdocs/compta/prelevement/class/bonprelevement.class.php @@ -2397,4 +2397,38 @@ class BonPrelevement extends CommonObject */ return 0; } + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $langs; + + + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(1) : $this->ref).''; + + if (property_exists($this, 'date_echeance')) { + $return .= '
'.$langs->trans("Date").' : '.dol_print_date($this->db->jdate($this->date_echeance), 'day').''; + } + if (property_exists($this, 'total')) { + $return .= '
'.$langs->trans("Amount").' : '.price($this->total).''; + } + if (method_exists($this, 'LibStatut')) { + $return .= '
'.$this->LibStatut($this->statut, 5).'
'; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } diff --git a/htdocs/compta/prelevement/orders_list.php b/htdocs/compta/prelevement/orders_list.php index 01ef33eea9d..bead580ab31 100644 --- a/htdocs/compta/prelevement/orders_list.php +++ b/htdocs/compta/prelevement/orders_list.php @@ -54,6 +54,8 @@ if (!$sortfield) { } $optioncss = GETPOST('optioncss', 'alpha'); +$mode = GETPOST('mode', 'alpha'); + // Get supervariables $statut = GETPOST('statut', 'int'); @@ -147,6 +149,9 @@ if ($result) { $i = 0; $param = ''; + if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); + } if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -161,6 +166,8 @@ if ($result) { $selectedfields = ''; $newcardbutton = ''; + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); if ($usercancreate) { $newcardbutton .= dolGetButtonTitle($langs->trans('NewStandingOrder'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/compta/prelevement/create.php?type='.urlencode($type)); } @@ -176,6 +183,8 @@ if ($result) { print ''; print ''; print ''; + print ''; + if ($type != '') { print ''; } @@ -220,27 +229,41 @@ if ($result) { $directdebitorder->id = $obj->rowid; $directdebitorder->ref = $obj->ref; - $directdebitorder->datec = $obj->datec; - $directdebitorder->amount = $obj->amount; + $directdebitorder->date_echeance = $obj->datec; + $directdebitorder->total = $obj->amount; $directdebitorder->statut = $obj->statut; - print ''; + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + print '
'; + } + // Output Kanban - print ''; - print $directdebitorder->getNomUrl(1); - print "\n"; + print $directdebitorder->getKanbanView(''); + if ($i == (min($num, $limit) - 1)) { + print '
'; + print ''; + } + } else { + print ''; - print ''.dol_print_date($db->jdate($obj->datec), 'day')."\n"; + print ''; + print $directdebitorder->getNomUrl(1); + print "\n"; - print ''.price($obj->amount)."\n"; + print ''.dol_print_date($db->jdate($obj->datec), 'day')."\n"; - print ''; - print $bon->LibStatut($obj->statut, 5); - print ''; + print ''.price($obj->amount)."\n"; - print ''."\n"; + print ''; + print $bon->LibStatut($obj->statut, 5); + print ''; - print "\n"; + print ''."\n"; + + print "\n"; + } $i++; } } else { From 68370083985e998642eba61b7e15d925a0423582 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Thu, 12 Jan 2023 18:53:27 +0100 Subject: [PATCH 0767/1128] kanban view for ligne prelevement --- htdocs/compta/prelevement/list.php | 117 +++++++++++++++++------------ 1 file changed, 71 insertions(+), 46 deletions(-) diff --git a/htdocs/compta/prelevement/list.php b/htdocs/compta/prelevement/list.php index 4906313cad1..8d9489bbec7 100644 --- a/htdocs/compta/prelevement/list.php +++ b/htdocs/compta/prelevement/list.php @@ -43,6 +43,7 @@ $toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'directdebitcredittransferlinelist'; // To manage different context of search $backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print') +$mode = GETPOST('mode', 'alpha'); $type = GETPOST('type', 'aZ09'); @@ -188,12 +189,18 @@ if ($result) { $param = "&statut=".urlencode($statut); $param .= "&search_bon=".urlencode($search_bon); + if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); + } if ($type == 'bank-transfer') { $param .= '&type=bank-transfer'; } if ($limit > 0 && $limit != $conf->liste_limit) { $param .= '&limit='.urlencode($limit); } + $newcardbutton = ''; + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); print"\n\n"; print ''."\n"; @@ -206,6 +213,8 @@ if ($result) { print ''; print ''; print ''; + print ''; + if ($type != '') { print ''; } @@ -214,7 +223,7 @@ if ($result) { if ($type == 'bank-transfer') { $title = $langs->trans("CreditTransferLines"); } - print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'generic', 0, '', '', $limit, 0, 0, 1); + print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'generic', 0, $newcardbutton, '', $limit, 0, 0, 1); $moreforfilter = ''; @@ -262,61 +271,77 @@ if ($result) { $bon->id = $obj->rowid; $bon->ref = $obj->ref; $bon->statut = $obj->status; + $bon->date_echeance = $obj->datec; + $bon->total = $obj->amount; $company->id = $obj->socid; $company->name = $obj->name; $company->email = $obj->email; $company->code_client = $obj->code_client; - print ''; + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + print '
'; + } + // Output Kanban - print ''; - print $bon->getNomUrl(1); - print "\n"; + print $bon->getKanbanView(''); + if ($i == (min($num, $limit) - 1)) { + print '
'; + print ''; + } + } else { + print ''; - print ''; - print $line->LibStatut($obj->statut_ligne, 2); - print " "; - print ''; - print substr('000000'.$obj->rowid_ligne, -6); - print ''; + print ''; + print $bon->getNomUrl(1); + print "\n"; - print ''; - $link_to_bill = '/compta/facture/card.php?facid='; - $link_title = 'Invoice'; - $link_picto = 'bill'; - if ($type == 'bank-transfer') { - $link_to_bill = '/fourn/facture/card.php?facid='; - $link_title = 'SupplierInvoice'; - $link_picto = 'supplier_invoice'; + print ''; + print $line->LibStatut($obj->statut_ligne, 2); + print " "; + print ''; + print substr('000000'.$obj->rowid_ligne, -6); + print ''; + + print ''; + $link_to_bill = '/compta/facture/card.php?facid='; + $link_title = 'Invoice'; + $link_picto = 'bill'; + if ($type == 'bank-transfer') { + $link_to_bill = '/fourn/facture/card.php?facid='; + $link_title = 'SupplierInvoice'; + $link_picto = 'supplier_invoice'; + } + print ''; + print img_object($langs->trans($link_title), $link_picto); + print ' '.$obj->invoiceref."\n"; + print ''; + print ''; + + print ''; + print $company->getNomUrl(1); + print "\n"; + + + print ''; + $link_to_tab = '/comm/card.php?socid='; + $link_code = $obj->code_client; + if ($type == 'bank-transfer') { + $link_to_tab = '/fourn/card.php?socid='; + $link_code = $obj->code_fournisseur; + } + print ''.$link_code."\n"; + + print ''.dol_print_date($db->jdate($obj->datec), 'day')."\n"; + + print ''.price($obj->amount)."\n"; + + print ' '; + + print "\n"; } - print ''; - print img_object($langs->trans($link_title), $link_picto); - print ' '.$obj->invoiceref."\n"; - print ''; - print ''; - - print ''; - print $company->getNomUrl(1); - print "\n"; - - - print ''; - $link_to_tab = '/comm/card.php?socid='; - $link_code = $obj->code_client; - if ($type == 'bank-transfer') { - $link_to_tab = '/fourn/card.php?socid='; - $link_code = $obj->code_fournisseur; - } - print ''.$link_code."\n"; - - print ''.dol_print_date($db->jdate($obj->datec), 'day')."\n"; - - print ''.price($obj->amount)."\n"; - - print ' '; - - print "\n"; $i++; } } else { From 468b8bcab38e0b0ec6bc5f8226bc0758c776c405 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20NASSIET?= Date: Thu, 12 Jan 2023 19:26:55 +0100 Subject: [PATCH 0768/1128] correction bug si pas reponse sur le hook --- htdocs/user/param_ihm.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/htdocs/user/param_ihm.php b/htdocs/user/param_ihm.php index 81ecdca8e73..2f8f4ae24ad 100644 --- a/htdocs/user/param_ihm.php +++ b/htdocs/user/param_ihm.php @@ -216,11 +216,13 @@ if (isModEnabled('ticket')) { } // Hook for insertion new items in the List of possible landing pages -$reshook = $hookmanager->executeHooks('addToLandingPageList', $tmparray, $object); -if ($reshook < 0) { - setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); -} elseif ($reshook == 0) { - $tmparray=$hookmanager->resArray; +$reshook = $hookmanager->executeHooks('addToLandingPageList',$tmparray,$object); +if (!empty($reshook)) { + if ($reshook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + } else if ($reshook == 0) { + $tmparray=$hookmanager->resArray; + } } $head = user_prepare_head($object); From c8055715447465066a6a2855fb0958d08d0b8277 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20NASSIET?= Date: Thu, 12 Jan 2023 19:35:49 +0100 Subject: [PATCH 0769/1128] correction bug si pas reponse sur le hook --- htdocs/user/param_ihm.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/htdocs/user/param_ihm.php b/htdocs/user/param_ihm.php index 2f8f4ae24ad..4ee2c318f5e 100644 --- a/htdocs/user/param_ihm.php +++ b/htdocs/user/param_ihm.php @@ -217,14 +217,15 @@ if (isModEnabled('ticket')) { // Hook for insertion new items in the List of possible landing pages $reshook = $hookmanager->executeHooks('addToLandingPageList',$tmparray,$object); -if (!empty($reshook)) { - if ($reshook < 0) { - setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); - } else if ($reshook == 0) { +if ($reshook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); +} else if ($reshook === 0) { + if (count($hookmanager->resArray)!==0) { $tmparray=$hookmanager->resArray; } } + $head = user_prepare_head($object); $title = $langs->trans("User"); From 2f80f873eae389a27dd9851b02b1fdeebf8ae624 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Thu, 12 Jan 2023 18:36:33 +0000 Subject: [PATCH 0770/1128] Fixing style errors. --- htdocs/user/param_ihm.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/user/param_ihm.php b/htdocs/user/param_ihm.php index 4ee2c318f5e..da8eebacaac 100644 --- a/htdocs/user/param_ihm.php +++ b/htdocs/user/param_ihm.php @@ -216,10 +216,10 @@ if (isModEnabled('ticket')) { } // Hook for insertion new items in the List of possible landing pages -$reshook = $hookmanager->executeHooks('addToLandingPageList',$tmparray,$object); +$reshook = $hookmanager->executeHooks('addToLandingPageList', $tmparray, $object); if ($reshook < 0) { setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); -} else if ($reshook === 0) { +} elseif ($reshook === 0) { if (count($hookmanager->resArray)!==0) { $tmparray=$hookmanager->resArray; } From ca8188ee90140d0fb9ee4ab38e53f6b0618d130f Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Thu, 12 Jan 2023 19:48:32 +0100 Subject: [PATCH 0771/1128] kanban mode for list of payment cheque --- .../cheque/class/remisecheque.class.php | 39 ++++++++ htdocs/compta/paiement/cheque/list.php | 91 +++++++++++++------ 2 files changed, 100 insertions(+), 30 deletions(-) diff --git a/htdocs/compta/paiement/cheque/class/remisecheque.class.php b/htdocs/compta/paiement/cheque/class/remisecheque.class.php index e193939cdd6..1e4e7d05a7d 100644 --- a/htdocs/compta/paiement/cheque/class/remisecheque.class.php +++ b/htdocs/compta/paiement/cheque/class/remisecheque.class.php @@ -1020,4 +1020,43 @@ class RemiseCheque extends CommonObject return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statusType, $mode); } + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $langs; + + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).''; + + if (property_exists($this, 'date_bordereau')) { + $return .= '
'.$langs->trans("DateCreation").' : '.dol_print_date($this->db->jdate($this->date_bordereau), 'day').''; + } + if (property_exists($this, 'nbcheque')) { + $return .= '
'.$langs->trans("Cheque", '', '', '', '', 5).' : '.$this->nbcheque.''; + } + if (property_exists($this, 'account_id')) { + $return .= ' | '.$this->account_id.''; + } + if (method_exists($this, 'LibStatut')) { + $return .= '
'.$this->LibStatut($this->statut, 5).'
'; + } + if (property_exists($this, 'amount')) { + $return .= ' |
'.$langs->trans("Amount").' : '.price($this->amount).'
'; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } diff --git a/htdocs/compta/paiement/cheque/list.php b/htdocs/compta/paiement/cheque/list.php index 054ef800586..38db4fca14b 100644 --- a/htdocs/compta/paiement/cheque/list.php +++ b/htdocs/compta/paiement/cheque/list.php @@ -44,6 +44,7 @@ $result = restrictedArea($user, 'banque', '', ''); $search_ref = GETPOST('search_ref', 'alpha'); $search_account = GETPOST('search_account', 'int'); $search_amount = GETPOST('search_amount', 'alpha'); +$mode = GETPOST('mode', 'alpha'); $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit; $sortfield = GETPOST('sortfield', 'aZ09comma'); @@ -149,6 +150,9 @@ if ($resql) { $num = $db->num_rows($resql); $i = 0; $param = ''; + if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); + } if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.$contextpage; } @@ -160,7 +164,10 @@ if ($resql) { if (!empty($socid)) { $url .= '&socid='.$socid; } - $newcardbutton = dolGetButtonTitle($langs->trans('NewCheckDeposit'), '', 'fa fa-plus-circle', $url, '', $user->rights->banque->cheque); + $newcardbutton = ''; + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); + $newcardbutton .= dolGetButtonTitle($langs->trans('NewCheckDeposit'), '', 'fa fa-plus-circle', $url, '', $user->rights->banque->cheque); print ''; if ($optioncss != '') { @@ -172,6 +179,8 @@ if ($resql) { print ''; print ''; print ''; + print ''; + print_barre_liste($langs->trans("MenuChequeDeposits"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'bank_account', 0, $newcardbutton, '', $limit); @@ -220,42 +229,64 @@ if ($resql) { while ($i < min($num, $limit)) { $objp = $db->fetch_object($resql); - print ''; - - // Num ref cheque - print ''; $checkdepositstatic->id = $objp->rowid; $checkdepositstatic->ref = ($objp->ref ? $objp->ref : $objp->rowid); $checkdepositstatic->statut = $objp->statut; - print $checkdepositstatic->getNomUrl(1); - print ''; + $checkdepositstatic->nbcheque = $objp->nbcheque; + $checkdepositstatic->amount = $objp->amount; + $checkdepositstatic->date_bordereau = $objp->date_bordereau; - // Date - print ''.dol_print_date($db->jdate($objp->date_bordereau), 'day').''; // TODO Use date hour + $account = new Account($db); + $account->fetch($objp->bid); + $checkdepositstatic->account_id = $account->getNomUrl(1); - // Bank - print ''; - if ($objp->bid) { - print ''.img_object($langs->trans("ShowAccount"), 'account').' '.$objp->label.''; + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + print '
'; + } + // Output Kanban + print $checkdepositstatic->getKanbanView(''); + if ($i == (min($num, $limit) - 1)) { + print '
'; + print ''; + } } else { - print ' '; + print ''; + + // Num ref cheque + print ''; + + print $checkdepositstatic->getNomUrl(1); + print ''; + + // Date + print ''.dol_print_date($db->jdate($objp->date_bordereau), 'day').''; // TODO Use date hour + + // Bank + print ''; + if ($objp->bid) { + print ''.img_object($langs->trans("ShowAccount"), 'account').' '.$objp->label.''; + } else { + print ' '; + } + print ''; + + // Number of cheques + print ''.$objp->nbcheque.''; + + // Amount + print ''.price($objp->amount).''; + + // Statut + print ''; + print $checkdepositstatic->LibStatut($objp->statut, 5); + print ''; + + print ''; + + print "\n"; } - print ''; - - // Number of cheques - print ''.$objp->nbcheque.''; - - // Amount - print ''.price($objp->amount).''; - - // Statut - print ''; - print $checkdepositstatic->LibStatut($objp->statut, 5); - print ''; - - print ''; - - print "\n"; $i++; } } else { From 1b81cce3bb0a1886bfa820d4944cdd62547677a5 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Thu, 12 Jan 2023 20:46:49 +0100 Subject: [PATCH 0772/1128] kanban mode for list of cashcontrol --- .../compta/cashcontrol/cashcontrol_list.php | 157 ++++++++++-------- .../cashcontrol/class/cashcontrol.class.php | 32 ++++ 2 files changed, 124 insertions(+), 65 deletions(-) diff --git a/htdocs/compta/cashcontrol/cashcontrol_list.php b/htdocs/compta/cashcontrol/cashcontrol_list.php index 7d433282367..b4c20a824ba 100644 --- a/htdocs/compta/cashcontrol/cashcontrol_list.php +++ b/htdocs/compta/cashcontrol/cashcontrol_list.php @@ -41,7 +41,7 @@ $toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'cashcontrol'; // To manage different context of search $backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print') - +$mode = GETPOST('mode', 'alpha'); // for mode view result $id = GETPOST('id', 'int'); // Load variable for pagination @@ -344,6 +344,9 @@ $param = ''; if (!empty($mode)) { $param .= '&mode='.urlencode($mode); } +if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); +} if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -399,10 +402,13 @@ print ''; print ''; print ''; print ''; +print ''; $permforcashfence = 1; - -$newcardbutton = dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/compta/cashcontrol/cashcontrol_card.php?action=create&backtopage='.urlencode($_SERVER['PHP_SELF']), '', $permforcashfence); +$newcardbutton = ''; +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/compta/cashcontrol/cashcontrol_card.php?action=create&backtopage='.urlencode($_SERVER['PHP_SELF']), '', $permforcashfence); print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'cash-register', 0, $newcardbutton, '', $limit, 0, 0, 1); @@ -552,81 +558,102 @@ while ($i < ($limit ? min($num, $limit) : $num)) { // Store properties in $object $object->setVarsFromFetchObj($obj); - // Show here line of result - $j = 0; - print ''; - foreach ($object->fields as $key => $val) { - $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); - if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) { - $cssforfield .= ($cssforfield ? ' ' : '').'center'; - } elseif ($key == 'status') { - $cssforfield .= ($cssforfield ? ' ' : '').'center'; + // show kanban result + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + print '
'; } + // Output Kanban + //var_dump($obj->posmodule);exit; + $object->posmodule = $obj->posmodule; + $object->cash = $obj->cash; + $object->opening = $obj->opening; + $object->year_close = $obj->year_close; + $object->cheque = $obj->cheque; - if (in_array($val['type'], array('timestamp'))) { - $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; - } elseif ($key == 'ref') { - $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; + + print $object->getKanbanView(''); + if ($i == (min($num, $limit) - 1)) { + print '
'; + print ''; } + } else { + // Show here line of result + $j = 0; + print ''; + foreach ($object->fields as $key => $val) { + $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); + if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) { + $cssforfield .= ($cssforfield ? ' ' : '').'center'; + } elseif ($key == 'status') { + $cssforfield .= ($cssforfield ? ' ' : '').'center'; + } - if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'status')) && empty($val['arrayofkeyval'])) { - $cssforfield .= ($cssforfield ? ' ' : '').'right'; - } - //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100'; + if (in_array($val['type'], array('timestamp'))) { + $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; + } elseif ($key == 'ref') { + $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; + } - if (!empty($arrayfields['t.'.$key]['checked'])) { - print ''; - if ($key == 'status') { - print $object->getLibStatut(5); - } elseif ($key == 'rowid') { - print $object->showOutputField($val, $key, $object->id, ''); - } else { - print $object->showOutputField($val, $key, $object->$key, ''); - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - if (!empty($val['isameasure']) && $val['isameasure'] == 1) { + //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100'; + + if (!empty($arrayfields['t.'.$key]['checked'])) { + print ''; + if ($key == 'status') { + print $object->getLibStatut(5); + } elseif ($key == 'rowid') { + print $object->showOutputField($val, $key, $object->id, ''); + } else { + print $object->showOutputField($val, $key, $object->$key, ''); + } + print ''; if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key; + $totalarray['nbfield']++; } - if (!isset($totalarray['val'])) { - $totalarray['val'] = array(); + if (!empty($val['isameasure']) && $val['isameasure'] == 1) { + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key; + } + if (!isset($totalarray['val'])) { + $totalarray['val'] = array(); + } + if (!isset($totalarray['val']['t.'.$key])) { + $totalarray['val']['t.'.$key] = 0; + } + $totalarray['val']['t.'.$key] += $object->$key; } - if (!isset($totalarray['val']['t.'.$key])) { - $totalarray['val']['t.'.$key] = 0; - } - $totalarray['val']['t.'.$key] += $object->$key; } } - } - // Extra fields - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - // Action column - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($object->id, $arrayofselected)) { - $selected = 1; + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Action column + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($object->id, $arrayofselected)) { + $selected = 1; + } + print ''; + } + print ''; + if (!$i) { + $totalarray['nbfield']++; } - print ''; - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - - print ''."\n"; + print ''."\n"; + } $i++; } diff --git a/htdocs/compta/cashcontrol/class/cashcontrol.class.php b/htdocs/compta/cashcontrol/class/cashcontrol.class.php index bc45f3b417d..01bebc35f5d 100644 --- a/htdocs/compta/cashcontrol/class/cashcontrol.class.php +++ b/htdocs/compta/cashcontrol/class/cashcontrol.class.php @@ -469,4 +469,36 @@ class CashControl extends CommonObject return $result; } + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $langs; + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + //var_dump($this->fields['rowid']);exit; + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(1, 1) : $this->ref).''; + if (property_exists($this, 'posmodule')) { + $return .= '
'.substr($langs->trans("Module/Application"), 0, 12).' : '.$this->posmodule.''; + } + if (property_exists($this, 'year_close')) { + $return .= '
'.$langs->trans("Year").' : '.$this->year_close.''; + } + if (method_exists($this, 'getLibStatut')) { + $return .= '
'.$this->getLibStatut(5).'
'; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } From 256bd27c3307a0d5728856d90ad9b16d1c64bd50 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 12 Jan 2023 21:59:34 +0100 Subject: [PATCH 0773/1128] Fix delete website --- htdocs/admin/website.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/admin/website.php b/htdocs/admin/website.php index 3c348d71a12..aa2ee58853c 100644 --- a/htdocs/admin/website.php +++ b/htdocs/admin/website.php @@ -614,7 +614,7 @@ if ($id) { // Active print ''; - print ''.$actl[($obj->status ? 1 : 0)].''; + print ''.$actl[($obj->status ? 1 : 0)].''; print ""; // Modify link From 5bbfdbb77507372220dc3ee27163bc47ed357cb4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 12 Jan 2023 22:11:13 +0100 Subject: [PATCH 0774/1128] NEW Show counter of access of website in website list --- htdocs/admin/website.php | 49 ++++++++++++++----- htdocs/core/lib/website.lib.php | 9 +++- .../install/mysql/migration/17.0.0-18.0.0.sql | 2 + .../mysql/tables/llx_website-website.sql | 7 +-- htdocs/langs/en_US/main.lang | 1 + htdocs/langs/en_US/website.lang | 2 + 6 files changed, 53 insertions(+), 17 deletions(-) diff --git a/htdocs/admin/website.php b/htdocs/admin/website.php index 3c348d71a12..28909470701 100644 --- a/htdocs/admin/website.php +++ b/htdocs/admin/website.php @@ -84,7 +84,7 @@ $tablib[1] = "Websites"; // Requests to extract data $tabsql = array(); -$tabsql[1] = "SELECT f.rowid as rowid, f.entity, f.ref, f.description, f.virtualhost, f.position, f.status, f.date_creation FROM ".MAIN_DB_PREFIX.'website as f WHERE f.entity IN ('.getEntity('website').')'; +$tabsql[1] = "SELECT f.rowid as rowid, f.entity, f.ref, f.description, f.virtualhost, f.position, f.status, f.date_creation, f.lastaccess, f.pageviews_previous_month, f.pageviews_total FROM ".MAIN_DB_PREFIX.'website as f WHERE f.entity IN ('.getEntity('website').')'; // Criteria to sort dictionaries $tabsqlsort = array(); @@ -92,7 +92,7 @@ $tabsqlsort[1] = "ref ASC"; // Nom des champs en resultat de select pour affichage du dictionnaire $tabfield = array(); -$tabfield[1] = "ref,description,virtualhost,position,date_creation"; +$tabfield[1] = "ref,description,virtualhost,position,date_creation,lastaccess,pageviews_previous_month,pageviews_total"; // Nom des champs d'edition pour modification d'un enregistrement $tabfieldvalue = array(); @@ -186,7 +186,7 @@ if (GETPOST('actionadd', 'alpha') || GETPOST('actionmodify', 'alpha')) { $sql .= $tabrowid[$id].","; } $sql .= $tabfieldinsert[$id]; - $sql .= ",status)"; + $sql .= ", status, date_creation)"; $sql .= " VALUES("; // List of values @@ -211,7 +211,7 @@ if (GETPOST('actionadd', 'alpha') || GETPOST('actionmodify', 'alpha')) { } $i++; } - $sql .= ",1)"; + $sql .= ", 1, '".$db->idate(dol_now())."')"; dol_syslog("actionadd", LOG_DEBUG); $result = $db->query($sql); @@ -441,12 +441,10 @@ if ($id) { // Form to add a new line if ($tabname[$id]) { - $fieldlist = explode(',', $tabfield[$id]); - // Line for title print ''; foreach ($fieldlist as $field => $value) { - if ($fieldlist[$field] == 'date_creation') { + if (in_array($fieldlist[$field], array('date_creation', 'lastaccess', 'pageviews_previous_month', 'pageviews_month', 'pageviews_total'))) { continue; } @@ -522,6 +520,7 @@ if ($id) { print ''; print ''; + print '
'; print ''; // Title of lines @@ -533,6 +532,10 @@ if ($id) { $align = "left"; $sortable = 1; $valuetoshow = ''; + if (in_array($fieldlist[$field], array('pageviews_total', 'pageviews_previous_month'))) { + $align = 'right'; + } + /* $tmparray=getLabelOfField($fieldlist[$field]); $showfield=$tmp['showfield']; @@ -554,14 +557,24 @@ if ($id) { if ($fieldlist[$field] == 'date_creation') { $valuetoshow = $langs->trans("DateCreation"); } + if ($fieldlist[$field] == 'lastaccess') { + $valuetoshow = $langs->trans("LastAccess"); + } + if ($fieldlist[$field] == 'pageviews_previous_month') { + $valuetoshow = $langs->trans("PagesViewedPreviousMonth"); + } + if ($fieldlist[$field] == 'pageviews_total') { + $valuetoshow = $langs->trans("PagesViewedTotal"); + } // Affiche nom du champ if ($showfield) { - print getTitleFieldOfList($valuetoshow, 0, $_SERVER["PHP_SELF"], ($sortable ? $fieldlist[$field] : ''), ($page ? 'page='.$page.'&' : ''), "", "align=".$align, $sortfield, $sortorder); + print getTitleFieldOfList($valuetoshow, 0, $_SERVER["PHP_SELF"], ($sortable ? $fieldlist[$field] : ''), ($page ? 'page='.$page.'&' : ''), "", '', $sortfield, $sortorder, $align.' '); } } - print getTitleFieldOfList($langs->trans("Status"), 0, $_SERVER["PHP_SELF"], "status", ($page ? 'page='.$page.'&' : ''), "", 'align="center"', $sortfield, $sortorder); + // Status + print getTitleFieldOfList($langs->trans("Status"), 0, $_SERVER["PHP_SELF"], "status", ($page ? 'page='.$page.'&' : ''), "", '', $sortfield, $sortorder, 'center '); print getTitleFieldOfList(''); print getTitleFieldOfList(''); print ''; @@ -581,8 +594,9 @@ if ($id) { fieldListWebsites($fieldlist, $obj, $tabname[$id], 'edit'); } - print ''; + print ''; } else { $tmpaction = 'view'; $parameters = array('fieldlist'=>$fieldlist, 'tabname'=>$tabname[$id]); @@ -593,13 +607,16 @@ if ($id) { if (empty($reshook)) { foreach ($fieldlist as $field => $value) { $showfield = 1; - $align = "left"; $fieldname = $fieldlist[$field]; + $align = "left"; + if (in_array($fieldname, array('pageviews_total', 'pageviews_previous_month'))) { + $align = 'right'; + } $valuetoshow = $obj->$fieldname; // Show value for field if ($showfield) { - print ''; + print ''; } } } @@ -612,6 +629,7 @@ if ($id) { $url = $_SERVER["PHP_SELF"].'?'.($page ? 'page='.$page.'&' : '').'sortfield='.$sortfield.'&sortorder='.$sortorder.'&rowid='.(!empty($obj->rowid) ? $obj->rowid : (!empty($obj->code) ? $obj->code : '')).'&code='.(!empty($obj->code) ?urlencode($obj->code) : '').'&'; + // Active print '
 '; - print '  '; + print ''; + print ' '.$valuetoshow.''.$valuetoshow.''; print ''.$actl[($obj->status ? 1 : 0)].''; @@ -633,6 +651,7 @@ if ($id) { } print '
'; + print '
'; print ''; } @@ -668,6 +687,10 @@ function fieldListWebsites($fieldlist, $obj = '', $tabname = '', $context = '') $formadmin = new FormAdmin($db); foreach ($fieldlist as $field => $value) { + if (in_array($fieldlist[$field], array('lastaccess', 'pageviews_previous_month', 'pageviews_month', 'pageviews_total'))) { + continue; + } + $fieldname = $fieldlist[$field]; if ($fieldlist[$field] == 'lang') { diff --git a/htdocs/core/lib/website.lib.php b/htdocs/core/lib/website.lib.php index 32a6d9d962a..de5779a3f51 100644 --- a/htdocs/core/lib/website.lib.php +++ b/htdocs/core/lib/website.lib.php @@ -438,7 +438,14 @@ function dolWebsiteIncrementCounter($websiteid, $websitepagetype, $websitepageid if (in_array($websitepagetype, array('blogpost', 'page'))) { global $db; - $sql = "UPDATE ".$db->prefix()."website SET pageviews_total = pageviews_total + 1, lastaccess = '".$db->idate(dol_now())."'"; + $tmpnow = dol_getdate(dol_now('gmt'), true, 'gmt'); + + $sql = "UPDATE ".$db->prefix()."website SET "; + $sql .= " pageviews_total = pageviews_total + 1,"; + $sql .= " pageviews_month = pageviews_month + 1,"; + // if last access was done during previous month, we save pageview_month into pageviews_previous_month + $sql .= " pageviews_previous_month = ".$db->ifsql("lastaccess < '".$db->idate(dol_mktime(0, 0, 0, $tmpnow['month'], 1, $tmpnow['year'], 'gmt', 0), 'gmt')."'", 'pageviews_month', 'pageviews_previous_month').","; + $sql .= " lastaccess = '".$db->idate(dol_now('gmt'), 'gmt')."'"; $sql .= " WHERE rowid = ".((int) $websiteid); $resql = $db->query($sql); if (! $resql) { diff --git a/htdocs/install/mysql/migration/17.0.0-18.0.0.sql b/htdocs/install/mysql/migration/17.0.0-18.0.0.sql index 376d89861f2..d8e1b4c12c9 100644 --- a/htdocs/install/mysql/migration/17.0.0-18.0.0.sql +++ b/htdocs/install/mysql/migration/17.0.0-18.0.0.sql @@ -59,3 +59,5 @@ INSERT INTO llx_c_tva(rowid,fk_pays,code,taux,localtax1,localtax1_type,localtax2 ALTER TABLE llx_user ADD COLUMN flagdelsessionsbefore datetime DEFAULT NULL; +ALTER TABLE llx_website ADD COLUMN pageviews_previous_month BIGINT UNSIGNED DEFAULT 0; + diff --git a/htdocs/install/mysql/tables/llx_website-website.sql b/htdocs/install/mysql/tables/llx_website-website.sql index 0df6ccf8ef3..8ac580919aa 100644 --- a/htdocs/install/mysql/tables/llx_website-website.sql +++ b/htdocs/install/mysql/tables/llx_website-website.sql @@ -36,9 +36,10 @@ CREATE TABLE llx_website fk_user_modif integer, date_creation datetime, position integer DEFAULT 0, - lastaccess datetime NULL, - pageviews_month BIGINT UNSIGNED DEFAULT 0, - pageviews_total BIGINT UNSIGNED DEFAULT 0, + lastaccess datetime NULL, -- updated at each page access + pageviews_previous_month BIGINT UNSIGNED DEFAULT 0, + pageviews_month BIGINT UNSIGNED DEFAULT 0, -- increased by 1 at each page access, saved into pageviews_previous_month when on different month than lastaccess + pageviews_total BIGINT UNSIGNED DEFAULT 0, -- increased by 1 at each page access, no reset tms timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, import_key varchar(14) -- import key ) ENGINE=innodb; diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index 2473659a5c7..bdd0ef2bd0d 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -1216,3 +1216,4 @@ NoSpecificContactAddress=No specific contact or address NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. HideOnVCard=Hide %s AddToContacts=Add address to my contacts +LastAccess=Last access \ No newline at end of file diff --git a/htdocs/langs/en_US/website.lang b/htdocs/langs/en_US/website.lang index 742e3afff67..7b2cc90f7ac 100644 --- a/htdocs/langs/en_US/website.lang +++ b/htdocs/langs/en_US/website.lang @@ -155,3 +155,5 @@ WebpageMustBeDisabled=The web page must have the status "%s" SetWebsiteOnlineBefore=When website is offline, all pages are offline. Change status of website first. Booking=Booking Reservation=Reservation +PagesViewedPreviousMonth=Pages viewed (previous month) +PagesViewedTotal=Pages viewed (total) \ No newline at end of file From 22720b652ca6d50a1939fb98d5d2d314201f98e6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 12 Jan 2023 22:28:08 +0100 Subject: [PATCH 0775/1128] Fix phpcs --- htdocs/fourn/facture/list.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/fourn/facture/list.php b/htdocs/fourn/facture/list.php index deeecc3af6f..9b790050571 100644 --- a/htdocs/fourn/facture/list.php +++ b/htdocs/fourn/facture/list.php @@ -766,11 +766,11 @@ if ($limit > 0 && $limit != $conf->liste_limit) { if ($search_all) { $param .= '&search_all='.urlencode($search_all); } - if ($search_date_start) { - $param .= buildParamDate('search_date_start', null, '', 'tzserver'); +if ($search_date_start) { + $param .= buildParamDate('search_date_start', null, '', 'tzserver'); } - if ($search_date_end) { - $param .= buildParamDate('search_date_end', null, '', 'tzserver'); +if ($search_date_end) { + $param .= buildParamDate('search_date_end', null, '', 'tzserver'); } if ($search_datelimit_startday) { $param .= '&search_datelimit_startday='.urlencode($search_datelimit_startday); From c52fab09e608d7eede0ece3f314304db147234d8 Mon Sep 17 00:00:00 2001 From: Francis Appels Date: Fri, 13 Jan 2023 09:01:31 +0100 Subject: [PATCH 0776/1128] FIX re-open supplier order should not be allowed when there is a reception. --- htdocs/fourn/commande/card.php | 46 ++++++++++++++++++++-------------- htdocs/langs/en_US/orders.lang | 1 + 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index 644469a257d..ffb2e834db7 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -2440,6 +2440,19 @@ if ($action == 'create') { if (empty($reshook)) { $object->fetchObjectLinked(); // Links are used to show or not button, so we load them now. + // check if reception + $hasreception = 0; + if ($conf->reception->enabled) { + if (!empty($object->linkedObjects['reception'])) { + foreach ($object->linkedObjects['reception'] as $element) { + if ($element->statut >= 0) { + $hasreception = 1; + break; + } + } + } + } + // Validate if ($object->statut == 0 && $num > 0) { if ($usercanvalidate) { @@ -2515,17 +2528,21 @@ if ($action == 'create') { // Reopen if (in_array($object->statut, array(CommandeFournisseur::STATUS_ACCEPTED))) { $buttonshown = 0; - if (!$buttonshown && $usercanapprove) { - if (empty($conf->global->SUPPLIER_ORDER_REOPEN_BY_APPROVER_ONLY) - || (!empty($conf->global->SUPPLIER_ORDER_REOPEN_BY_APPROVER_ONLY) && $user->id == $object->user_approve_id)) { - print ''.$langs->trans("Disapprove").''; - $buttonshown++; + if ($hasreception) { + print ''.$langs->trans("Disapprove").''; + } else { + if (!$buttonshown && $usercanapprove) { + if (empty($conf->global->SUPPLIER_ORDER_REOPEN_BY_APPROVER_ONLY) + || (!empty($conf->global->SUPPLIER_ORDER_REOPEN_BY_APPROVER_ONLY) && $user->id == $object->user_approve_id)) { + print ''.$langs->trans("Disapprove").''; + $buttonshown++; + } } - } - if (!$buttonshown && $usercanapprovesecond && !empty($conf->global->SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED)) { - if (empty($conf->global->SUPPLIER_ORDER_REOPEN_BY_APPROVER2_ONLY) - || (!empty($conf->global->SUPPLIER_ORDER_REOPEN_BY_APPROVER2_ONLY) && $user->id == $object->user_approve_id2)) { - print ''.$langs->trans("Disapprove").''; + if (!$buttonshown && $usercanapprovesecond && !empty($conf->global->SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED)) { + if (empty($conf->global->SUPPLIER_ORDER_REOPEN_BY_APPROVER2_ONLY) + || (!empty($conf->global->SUPPLIER_ORDER_REOPEN_BY_APPROVER2_ONLY) && $user->id == $object->user_approve_id2)) { + print ''.$langs->trans("Disapprove").''; + } } } } @@ -2536,19 +2553,10 @@ if ($action == 'create') { } // Ship - $hasreception = 0; if (isModEnabled('stock') && (!empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER) || !empty($conf->global->STOCK_CALCULATE_ON_RECEPTION) || !empty($conf->global->STOCK_CALCULATE_ON_RECEPTION_CLOSE))) { $labelofbutton = $langs->trans('ReceiveProducts'); if ($conf->reception->enabled) { $labelofbutton = $langs->trans("CreateReception"); - if (!empty($object->linkedObjects['reception'])) { - foreach ($object->linkedObjects['reception'] as $element) { - if ($element->statut >= 0) { - $hasreception = 1; - break; - } - } - } } if (in_array($object->statut, array(3, 4, 5))) { diff --git a/htdocs/langs/en_US/orders.lang b/htdocs/langs/en_US/orders.lang index f988cd62f19..0accaadfa62 100644 --- a/htdocs/langs/en_US/orders.lang +++ b/htdocs/langs/en_US/orders.lang @@ -204,3 +204,4 @@ StatusSupplierOrderApproved=Approved StatusSupplierOrderRefused=Refused StatusSupplierOrderReceivedPartially=Partially received StatusSupplierOrderReceivedAll=All products received +NeedAtLeastOneInvoice = There has to be at least one Invoice From 534cb8f0a045552448006d957238565de7bc06c2 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Fri, 13 Jan 2023 09:55:57 +0100 Subject: [PATCH 0777/1128] fix: token for scan inventory --- htdocs/product/inventory/inventory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/inventory/inventory.php b/htdocs/product/inventory/inventory.php index 3d0dea9e3b7..cd27c09aaa0 100644 --- a/htdocs/product/inventory/inventory.php +++ b/htdocs/product/inventory/inventory.php @@ -609,7 +609,7 @@ if ($object->id > 0) { if ($permissiontoadd) { // Link to launch scan tool if (!empty($conf->barcode->enabled) || !empty($conf->productbatch->enabled)) { - print ''.img_picto('', 'barcode', 'class="paddingrightonly"').$langs->trans("UpdateByScaning").''; + print ''.img_picto('', 'barcode', 'class="paddingrightonly"').$langs->trans("UpdateByScaning").''; } // Link to autofill From 59a541ab8e43c413dbb5e6a0e6bc0eb42cfd0dfa Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Fri, 13 Jan 2023 10:33:48 +0100 Subject: [PATCH 0778/1128] NEW: Add SQL contraint on product_stock table to allow only exsting product and warehouse#23543 --- .../install/mysql/migration/17.0.0-18.0.0.sql | 36 +++++++++++++++++++ .../mysql/tables/llx_product_stock.key.sql | 2 ++ 2 files changed, 38 insertions(+) create mode 100644 htdocs/install/mysql/migration/17.0.0-18.0.0.sql diff --git a/htdocs/install/mysql/migration/17.0.0-18.0.0.sql b/htdocs/install/mysql/migration/17.0.0-18.0.0.sql new file mode 100644 index 00000000000..4e68aebfdc8 --- /dev/null +++ b/htdocs/install/mysql/migration/17.0.0-18.0.0.sql @@ -0,0 +1,36 @@ +-- +-- Be carefull to requests order. +-- This file must be loaded by calling /install/index.php page +-- when current version is 16.0.0 or higher. +-- +-- To restrict request to Mysql version x.y minimum use -- VMYSQLx.y +-- To restrict request to Pgsql version x.y minimum use -- VPGSQLx.y +-- To rename a table: ALTER TABLE llx_table RENAME TO llx_table_new; +-- To add a column: ALTER TABLE llx_table ADD COLUMN newcol varchar(60) NOT NULL DEFAULT '0' AFTER existingcol; +-- To rename a column: ALTER TABLE llx_table CHANGE COLUMN oldname newname varchar(60); +-- To drop a column: ALTER TABLE llx_table DROP COLUMN oldname; +-- To change type of field: ALTER TABLE llx_table MODIFY COLUMN name varchar(60); +-- To drop a foreign key: ALTER TABLE llx_table DROP FOREIGN KEY fk_name; +-- To create a unique index ALTER TABLE llx_table ADD UNIQUE INDEX uk_table_field (field); +-- To drop an index: -- VMYSQL4.1 DROP INDEX nomindex on llx_table; +-- To drop an index: -- VPGSQL8.2 DROP INDEX nomindex; +-- To make pk to be auto increment (mysql): +-- -- VMYSQL4.3 ALTER TABLE llx_table ADD PRIMARY KEY(rowid); +-- -- VMYSQL4.3 ALTER TABLE llx_table CHANGE COLUMN rowid rowid INTEGER NOT NULL AUTO_INCREMENT; +-- To make pk to be auto increment (postgres): +-- -- VPGSQL8.2 CREATE SEQUENCE llx_table_rowid_seq OWNED BY llx_table.rowid; +-- -- VPGSQL8.2 ALTER TABLE llx_table ADD PRIMARY KEY (rowid); +-- -- VPGSQL8.2 ALTER TABLE llx_table ALTER COLUMN rowid SET DEFAULT nextval('llx_table_rowid_seq'); +-- -- VPGSQL8.2 SELECT setval('llx_table_rowid_seq', MAX(rowid)) FROM llx_table; +-- To set a field as NULL: -- VMYSQL4.3 ALTER TABLE llx_table MODIFY COLUMN name varchar(60) NULL; +-- To set a field as NULL: -- VPGSQL8.2 ALTER TABLE llx_table ALTER COLUMN name DROP NOT NULL; +-- To set a field as NOT NULL: -- VMYSQL4.3 ALTER TABLE llx_table MODIFY COLUMN name varchar(60) NOT NULL; +-- To set a field as NOT NULL: -- VPGSQL8.2 ALTER TABLE llx_table ALTER COLUMN name SET NOT NULL; +-- To set a field as default NULL: -- VPGSQL8.2 ALTER TABLE llx_table ALTER COLUMN name SET DEFAULT NULL; +-- Note: fields with type BLOB/TEXT can't have default value. +-- To rebuild sequence for postgresql after insert by forcing id autoincrement fields: +-- -- VPGSQL8.2 SELECT dol_util_rebuild_sequences(); + + +ALTER TABLE llx_product_stock ADD CONSTRAINT fk_product_product_rowid FOREIGN KEY (fk_product) REFERENCES llx_product (rowid); +ALTER TABLE llx_product_stock ADD CONSTRAINT fk_entrepot_entrepot_rowid FOREIGN KEY (fk_entrepot) REFERENCES llx_entrepot (rowid); diff --git a/htdocs/install/mysql/tables/llx_product_stock.key.sql b/htdocs/install/mysql/tables/llx_product_stock.key.sql index 358a0c74f19..b07719a5478 100644 --- a/htdocs/install/mysql/tables/llx_product_stock.key.sql +++ b/htdocs/install/mysql/tables/llx_product_stock.key.sql @@ -20,5 +20,7 @@ ALTER TABLE llx_product_stock ADD INDEX idx_product_stock_fk_product (fk_product); ALTER TABLE llx_product_stock ADD INDEX idx_product_stock_fk_entrepot (fk_entrepot); +ALTER TABLE llx_product_stock ADD CONSTRAINT fk_product_product_rowid FOREIGN KEY (fk_product) REFERENCES llx_product (rowid); +ALTER TABLE llx_product_stock ADD CONSTRAINT fk_entrepot_entrepot_rowid FOREIGN KEY (fk_entrepot) REFERENCES llx_entrepot (rowid); ALTER TABLE llx_product_stock ADD UNIQUE INDEX uk_product_stock (fk_product,fk_entrepot); From a06a5d0f65e47010263b4d3aa5825ece10dc35e2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 13 Jan 2023 11:09:06 +0100 Subject: [PATCH 0779/1128] Fix lang file not loaded --- scripts/emailings/mailing-send.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/emailings/mailing-send.php b/scripts/emailings/mailing-send.php index fcaa40e1fde..71d1604df4e 100755 --- a/scripts/emailings/mailing-send.php +++ b/scripts/emailings/mailing-send.php @@ -66,6 +66,8 @@ if (empty($conf->global->MAILING_LIMIT_SENDBYCLI)) $conf->global->MAILING_LIMIT_SENDBYCLI = 0; } +$langs->loadLangs(array("main", "mails")); + /* * Main From fb25fcc46757ad201705a70d07c5f21bdfe90021 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Fri, 13 Jan 2023 11:22:45 +0100 Subject: [PATCH 0780/1128] kanban mode forl skill's list --- htdocs/hrm/class/skill.class.php | 31 +++++++ htdocs/hrm/skill_list.php | 153 ++++++++++++++++++------------- 2 files changed, 122 insertions(+), 62 deletions(-) diff --git a/htdocs/hrm/class/skill.class.php b/htdocs/hrm/class/skill.class.php index 0cdc63ec24e..5f58412b65a 100644 --- a/htdocs/hrm/class/skill.class.php +++ b/htdocs/hrm/class/skill.class.php @@ -1113,4 +1113,35 @@ class Skill extends CommonObject } return $result; } + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $selected, $langs; + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).''; + $return .= ''; + if (property_exists($this, 'skill_type')) { + $return .= '
'.$langs->trans("Type").''; + $return .= ' : '.$this->fields['skill_type']['arrayofkeyval'][$this->skill_type].''; + } + if (property_exists($this, 'description')) { + $return .= '
'.$langs->trans("Description").' : '; + $return .= '
'.(strlen($this->description) > 30 ? dol_substr($this->description, 0, 25).'...' : $this->description).''; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } diff --git a/htdocs/hrm/skill_list.php b/htdocs/hrm/skill_list.php index ddf385b170e..03302a812ff 100644 --- a/htdocs/hrm/skill_list.php +++ b/htdocs/hrm/skill_list.php @@ -54,7 +54,7 @@ $toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'skilllist'; // To manage different context of search $backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print') - +$mode = GETPOST('mode', 'alpha'); // Load variable for pagination $limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit; $sortfield = GETPOST('sortfield', 'aZ09comma'); @@ -347,6 +347,9 @@ llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', ''); $arrayofselected = is_array($toselect) ? $toselect : array(); $param = ''; +if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); +} if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -398,8 +401,12 @@ print ''; print ''; print ''; print ''; +print ''; -$newcardbutton = dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/hrm/skill_card.php?action=create', '', $permissiontoadd); +$newcardbutton = ''; +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/hrm/skill_card.php?action=create', '', $permissiontoadd); print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'object_'.$object->picto, 0, $newcardbutton, '', $limit, 0, 0, 1); @@ -546,78 +553,100 @@ while ($i < ($limit ? min($num, $limit) : $num)) { // Store properties in $object $object->setVarsFromFetchObj($obj); - // Show here line of result - print ''; - foreach ($object->fields as $key => $val) { - $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); - if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) { - $cssforfield .= ($cssforfield ? ' ' : '').'center'; - } elseif ($key == 'status') { - $cssforfield .= ($cssforfield ? ' ' : '').'center'; + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + print '
'; } + // Output Kanban - if (in_array($val['type'], array('timestamp'))) { - $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; - } elseif ($key == 'ref') { - $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; - } + $object->skill_type = $obj->skill_type; + $object->description = $obj->description; - if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'status')) && empty($val['arrayofkeyval'])) { - $cssforfield .= ($cssforfield ? ' ' : '').'right'; - } - //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100'; - - if (!empty($arrayfields['t.'.$key]['checked'])) { - print ''; - if ($key == 'status') { - print $object->getLibStatut(5); - } elseif ($key == 'rowid') { - print $object->showOutputField($val, $key, $object->id, ''); - } elseif ($key == 'label') { - print $object->getNomUrl(1); - } else { - print $object->showOutputField($val, $key, $object->$key, ''); + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($object->id, $arrayofselected)) { + $selected = 1; } - print ''; - if (!$i) { - $totalarray['nbfield']++; + print $object->getKanbanView(''); + } + if ($i == (min($num, $limit) - 1)) { + print '
'; + print ''; + } + } else { + // Show here line of result + print ''; + foreach ($object->fields as $key => $val) { + $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); + if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) { + $cssforfield .= ($cssforfield ? ' ' : '').'center'; + } elseif ($key == 'status') { + $cssforfield .= ($cssforfield ? ' ' : '').'center'; } - if (!empty($val['isameasure']) && $val['isameasure'] == 1) { + + if (in_array($val['type'], array('timestamp'))) { + $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; + } elseif ($key == 'ref') { + $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; + } + + if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'status')) && empty($val['arrayofkeyval'])) { + $cssforfield .= ($cssforfield ? ' ' : '').'right'; + } + //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100'; + + if (!empty($arrayfields['t.'.$key]['checked'])) { + print ''; + if ($key == 'status') { + print $object->getLibStatut(5); + } elseif ($key == 'rowid') { + print $object->showOutputField($val, $key, $object->id, ''); + } elseif ($key == 'label') { + print $object->getNomUrl(1); + } else { + print $object->showOutputField($val, $key, $object->$key, ''); + } + print ''; if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key; + $totalarray['nbfield']++; } - if (!isset($totalarray['val'])) { - $totalarray['val'] = array(); + if (!empty($val['isameasure']) && $val['isameasure'] == 1) { + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key; + } + if (!isset($totalarray['val'])) { + $totalarray['val'] = array(); + } + if (!isset($totalarray['val']['t.'.$key])) { + $totalarray['val']['t.'.$key] = 0; + } + $totalarray['val']['t.'.$key] += $object->$key; } - if (!isset($totalarray['val']['t.'.$key])) { - $totalarray['val']['t.'.$key] = 0; - } - $totalarray['val']['t.'.$key] += $object->$key; } } - } - // Extra fields - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - // Action column - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($object->id, $arrayofselected)) { - $selected = 1; + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Action column + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($object->id, $arrayofselected)) { + $selected = 1; + } + print ''; + } + print ''; + if (!$i) { + $totalarray['nbfield']++; } - print ''; - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - - print ''."\n"; + print ''."\n"; + } $i++; } From 336ac00ae382c803d3cb5824443d6b5d347dc918 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Fri, 13 Jan 2023 11:40:50 +0100 Subject: [PATCH 0781/1128] kanban mode for list of jobs --- htdocs/hrm/class/job.class.php | 31 +++++++ htdocs/hrm/job_list.php | 153 ++++++++++++++++++++------------- 2 files changed, 123 insertions(+), 61 deletions(-) diff --git a/htdocs/hrm/class/job.class.php b/htdocs/hrm/class/job.class.php index 93950979a1a..a013bb57a36 100644 --- a/htdocs/hrm/class/job.class.php +++ b/htdocs/hrm/class/job.class.php @@ -1054,6 +1054,37 @@ class Job extends CommonObject return $error; } + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $selected, $langs; + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(1) : $this->ref).''; + $return .= ''; + if (property_exists($this, 'deplacement')) { + $return .= '
'.$langs->trans("Type").''; + $return .= ' : '.$this->fields['deplacement']['arrayofkeyval'][$this->deplacement].''; + } + if (property_exists($this, 'description') && !(empty($this->description))) { + $return .= '
'.$langs->trans("Description").' : '; + $return .= '
'.(strlen($this->description) > 30 ? dol_substr($this->description, 0, 25).'...' : $this->description).''; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } diff --git a/htdocs/hrm/job_list.php b/htdocs/hrm/job_list.php index ed0fb480a3a..6e97c0d0483 100644 --- a/htdocs/hrm/job_list.php +++ b/htdocs/hrm/job_list.php @@ -52,6 +52,7 @@ $toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'joblist'; // To manage different context of search $backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print') +$mode = GETPOST('mode', 'alpha'); // for view result with other mode $id = GETPOST('id', 'int'); @@ -362,6 +363,9 @@ llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', ''); $arrayofselected = is_array($toselect) ? $toselect : array(); $param = ''; +if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); +} if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -413,8 +417,13 @@ print ''; print ''; print ''; print ''; +print ''; -$newcardbutton = dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', dol_buildpath('/hrm/job_card.php', 1).'?action=create', '', $permissiontoadd); + +$newcardbutton = ''; +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', dol_buildpath('/hrm/job_card.php', 1).'?action=create', '', $permissiontoadd); print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'object_'.$object->picto, 0, $newcardbutton, '', $limit, 0, 0, 1); @@ -561,78 +570,100 @@ while ($i < ($limit ? min($num, $limit) : $num)) { // Store properties in $object $object->setVarsFromFetchObj($obj); - // Show here line of result - print ''; - foreach ($object->fields as $key => $val) { - $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); - if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) { - $cssforfield .= ($cssforfield ? ' ' : '').'center'; - } elseif ($key == 'status') { - $cssforfield .= ($cssforfield ? ' ' : '').'center'; + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + print '
'; } + // Output Kanban - if (in_array($val['type'], array('timestamp'))) { - $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; - } elseif ($key == 'ref') { - $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; - } + $object->deplacement = $obj->deplacement; + $object->description = $obj->description; - if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'status')) && empty($val['arrayofkeyval'])) { - $cssforfield .= ($cssforfield ? ' ' : '').'right'; - } - //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100'; - - if (!empty($arrayfields['t.'.$key]['checked'])) { - print ''; - if ($key == 'status') { - print $object->getLibStatut(5); - } elseif ($key == 'rowid') { - print $object->showOutputField($val, $key, $object->id, ''); - } elseif ($key == 'label') { - print $object->getNomUrl(1); - } else { - print $object->showOutputField($val, $key, $object->$key, ''); + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($object->id, $arrayofselected)) { + $selected = 1; } - print ''; - if (!$i) { - $totalarray['nbfield']++; + print $object->getKanbanView(''); + } + if ($i == (min($num, $limit) - 1)) { + print '
'; + print ''; + } + } else { + // Show here line of result + print ''; + foreach ($object->fields as $key => $val) { + $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); + if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) { + $cssforfield .= ($cssforfield ? ' ' : '').'center'; + } elseif ($key == 'status') { + $cssforfield .= ($cssforfield ? ' ' : '').'center'; } - if (!empty($val['isameasure']) && $val['isameasure'] == 1) { + + if (in_array($val['type'], array('timestamp'))) { + $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; + } elseif ($key == 'ref') { + $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; + } + + if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'status')) && empty($val['arrayofkeyval'])) { + $cssforfield .= ($cssforfield ? ' ' : '').'right'; + } + //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100'; + + if (!empty($arrayfields['t.'.$key]['checked'])) { + print ''; + if ($key == 'status') { + print $object->getLibStatut(5); + } elseif ($key == 'rowid') { + print $object->showOutputField($val, $key, $object->id, ''); + } elseif ($key == 'label') { + print $object->getNomUrl(1); + } else { + print $object->showOutputField($val, $key, $object->$key, ''); + } + print ''; if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key; + $totalarray['nbfield']++; } - if (!isset($totalarray['val'])) { - $totalarray['val'] = array(); + if (!empty($val['isameasure']) && $val['isameasure'] == 1) { + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key; + } + if (!isset($totalarray['val'])) { + $totalarray['val'] = array(); + } + if (!isset($totalarray['val']['t.'.$key])) { + $totalarray['val']['t.'.$key] = 0; + } + $totalarray['val']['t.'.$key] += $object->$key; } - if (!isset($totalarray['val']['t.'.$key])) { - $totalarray['val']['t.'.$key] = 0; - } - $totalarray['val']['t.'.$key] += $object->$key; } } - } - // Extra fields - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - // Action column - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($object->id, $arrayofselected)) { - $selected = 1; + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Action column + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($object->id, $arrayofselected)) { + $selected = 1; + } + print ''; + } + print ''; + if (!$i) { + $totalarray['nbfield']++; } - print ''; - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - - print ''."\n"; + print ''."\n"; + } $i++; } From a5fba0fd09db765f91d11f00e07a01a2dbb70f94 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Fri, 13 Jan 2023 12:10:22 +0100 Subject: [PATCH 0782/1128] kanban for position list --- htdocs/hrm/class/position.class.php | 35 +++++++++++++++++++++++++++++ htdocs/hrm/position_list.php | 18 +++++++++++++-- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/htdocs/hrm/class/position.class.php b/htdocs/hrm/class/position.class.php index 98b5fd89be9..9d4f71d24fd 100644 --- a/htdocs/hrm/class/position.class.php +++ b/htdocs/hrm/class/position.class.php @@ -1118,6 +1118,41 @@ class Position extends CommonObject return $error; } + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $selected, $langs; + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(1) : $this->ref).''; + $return .= ''; + if (property_exists($this, 'fk_user') && !(empty($this->fk_user))) { + $return .= '
'.$langs->trans("Employee").' : '; + $return .= ''.$this->fk_user.''; + } + if (property_exists($this, 'fk_job') && !(empty($this->fk_job))) { + $return .= '
'.$langs->trans("Job").' : '; + $return .= ''.$this->fk_job.''; + } + if (property_exists($this, 'date_start') && property_exists($this, 'date_end')) { + $return .= '
'.dol_print_date($this->db->jdate($this->date_start), 'day').''; + $return .= ' - '.dol_print_date($this->db->jdate($this->date_end), 'day').'
'; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } diff --git a/htdocs/hrm/position_list.php b/htdocs/hrm/position_list.php index 40cb706b5df..5dc33859219 100644 --- a/htdocs/hrm/position_list.php +++ b/htdocs/hrm/position_list.php @@ -426,7 +426,10 @@ print ''; print ''; print ''; -$newcardbutton = dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', dol_buildpath('/hrm/position.php', 1).'?action=create', '', $permissiontoadd); +$newcardbutton = ''; +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', dol_buildpath('/hrm/position.php', 1).'?action=create', '', $permissiontoadd); print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'object_'.$object->picto, 0, $newcardbutton, '', $limit, 0, 0, 1); @@ -602,12 +605,23 @@ while ($i < $imaxinloop) { // Store properties in $object $object->setVarsFromFetchObj($obj); + if ($mode == 'kanban') { if ($i == 0) { print ''; print '
'; } - // Output Kanban + // get info needed + + $object->date_start = $obj->date_start; + $object->date_end = $obj->date_end; + $job = new job($db); + $job->fetch($obj->fk_job); + $object->fk_job = $job->getNomUrl(); + $userstatic = new User($db); + $userstatic->fetch($obj->fk_user); + $object->fk_user = $userstatic->getNomUrl(1); + // output kanban print $object->getKanbanView(''); if ($i == ($imaxinloop - 1)) { print '
'; From 8eb89e0ad14015ec4080042db82581cdf026bcf4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 13 Jan 2023 12:14:20 +0100 Subject: [PATCH 0783/1128] Remove merged feature with too many pb: 1=Not yet implemented everywhere. 2=Seems a duplicate info with the picto warning when late (so in past not done) 3=Is also a duplicate with the existing css event-future, event-past, event-current 4=It overwrites to choice done by the theme 5=Implementation is wrong, it must use css and not #background Use CSS instead --- htdocs/admin/agenda_other.php | 82 ++----------------------------- htdocs/admin/agenda_reminder.php | 1 - htdocs/comm/action/index.php | 1 + htdocs/comm/action/list.php | 21 ++++---- htdocs/core/lib/functions.lib.php | 2 +- htdocs/langs/en_US/admin.lang | 1 + htdocs/theme/eldy/global.inc.php | 4 ++ 7 files changed, 20 insertions(+), 92 deletions(-) diff --git a/htdocs/admin/agenda_other.php b/htdocs/admin/agenda_other.php index 8916433707d..aef46db26ef 100644 --- a/htdocs/admin/agenda_other.php +++ b/htdocs/admin/agenda_other.php @@ -113,33 +113,6 @@ if ($action == 'set') { } else { setEventMessages($langs->trans("RecordSaved"), null, 'mesgs'); } -} elseif ($action == 'setcolors') { - $event_color = preg_replace('/[^0-9a-f#]/i', '', (string) GETPOST('event_past_color', 'alphanohtml')); - $res = dolibarr_set_const($db, 'AGENDA_EVENT_PAST_COLOR', $event_color, 'chaine', 0, '', $conf->entity); - if (!$res > 0) { - $error++; - $errors[] = $db->lasterror(); - } - - $event_color = preg_replace('/[^0-9a-f#]/i', '', (string) GETPOST('event_current_color', 'alphanohtml')); - $res = dolibarr_set_const($db, 'AGENDA_EVENT_CURRENT_COLOR', $event_color, 'chaine', 0, '', $conf->entity); - if (!$res > 0) { - $error++; - $errors[] = $db->lasterror(); - } - - $event_color = preg_replace('/[^0-9a-f#]/i', '', (string) GETPOST('event_future_color', 'alphanohtml')); - $res = dolibarr_set_const($db, 'AGENDA_EVENT_FUTURE_COLOR', $event_color, 'chaine', 0, '', $conf->entity); - if (!$res > 0) { - $error++; - $errors[] = $db->lasterror(); - } - - if ($error) { - setEventMessages('', $errors, 'errors'); - } else { - setEventMessage($langs->trans('SetupSaved')); - } } elseif ($action == 'specimen') { // For orders $modele = GETPOST('module', 'alpha'); @@ -226,8 +199,6 @@ print dol_get_fiche_head($head, 'other', $langs->trans("Agenda"), -1, 'action'); * Miscellaneous */ -print load_fiche_titre($langs->trans('Miscellaneous'), '', ''); - // Define array def of models $def = array(); @@ -339,8 +310,11 @@ if ($conf->global->MAIN_FEATURES_LEVEL >= 2) { } } print '
'; + + print load_fiche_titre($langs->trans('MiscellaneousOptions'), '', ''); } + print '
'; print ''; print ''; @@ -431,56 +405,6 @@ print $form->buttonsSaveCancel("Save", ''); print '
'; -/* - * User interface (colors) - */ - -print load_fiche_titre($langs->trans('UserInterface'), '', ''); - -require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; -$formother = new FormOther($db); - -print '
'; -print ''; -print ''; - -print ''."\n"; -print ''."\n"; -print ''."\n"; -print ''."\n"; -print ''."\n"; -print ''."\n"; - -// AGENDA_EVENT_PAST_COLOR -print ''."\n"; -print ''."\n"; -print ''."\n"; -print ''."\n"; -// AGENDA_EVENT_CURRENT_COLOR -print ''."\n"; -print ''."\n"; -print ''."\n"; -print ''."\n"; -// AGENDA_EVENT_FUTURE_COLOR -print ''."\n"; -print ''."\n"; -print ''."\n"; -print ''."\n"; - -print '
'.$langs->trans("Parameters").' '.$langs->trans("Value").'
'.$langs->trans('AGENDA_EVENT_PAST_COLOR').' '."\n"; -print $formother->selectColor($conf->global->AGENDA_EVENT_PAST_COLOR, 'event_past_color'); -print '
'.$langs->trans('AGENDA_EVENT_CURRENT_COLOR').' '."\n"; -print $formother->selectColor($conf->global->AGENDA_EVENT_CURRENT_COLOR, 'event_current_color'); -print '
'.$langs->trans('AGENDA_EVENT_FUTURE_COLOR').' '."\n"; -print $formother->selectColor($conf->global->AGENDA_EVENT_FUTURE_COLOR, 'event_future_color'); -print '
'; - -print $form->buttonsSaveCancel("Save", ''); - -print '
'; - -print "
"; - print dol_get_fiche_end(); // End of page diff --git a/htdocs/admin/agenda_reminder.php b/htdocs/admin/agenda_reminder.php index 76c717b669d..42967b4f275 100644 --- a/htdocs/admin/agenda_reminder.php +++ b/htdocs/admin/agenda_reminder.php @@ -150,7 +150,6 @@ $linkback = 'trans("Agenda"), -1, 'action'); diff --git a/htdocs/comm/action/index.php b/htdocs/comm/action/index.php index 5b51d48392b..3460355a803 100644 --- a/htdocs/comm/action/index.php +++ b/htdocs/comm/action/index.php @@ -299,6 +299,7 @@ if (empty($user->conf->AGENDA_DISABLE_EXT)) { $enabled = 'AGENDA_EXT_ENABLED_'.$user->id.'_'.$i; $default = 'AGENDA_EXT_ACTIVEBYDEFAULT_'.$user->id.'_'.$i; $buggedfile = 'AGENDA_EXT_BUGGEDFILE_'.$user->id.'_'.$i; + if (getDolUserString($source) && getDolUserString($name)) { // Note: $conf->global->buggedfile can be empty or 'uselocalandtznodaylight' or 'uselocalandtzdaylight' $listofextcals[] = array( diff --git a/htdocs/comm/action/list.php b/htdocs/comm/action/list.php index dd137690e47..5abd2d3f101 100644 --- a/htdocs/comm/action/list.php +++ b/htdocs/comm/action/list.php @@ -951,14 +951,15 @@ while ($i < $imaxinloop) { $event_owner_style .= 'border-left: #' . $cache_user_list[$obj->fk_user_action]->color . ' 5px solid;'; } - // get event style for start date + // get event style for start and end date $event_more_class = ''; - $event_start_date_style = ''; + $event_start_date_css = ''; + $event_end_date_css = ''; $event_start_date_time = $actionstatic->datep; if ($event_start_date_time > $now) { // future event $event_more_class = 'event-future'; - $event_start_date_color = $conf->global->AGENDA_EVENT_FUTURE_COLOR; + $event_start_date_css = $event_end_date_css = $event_more_class; } else { if ($obj->fulldayevent == 1) { $today_start_date_time = $today_start_time; @@ -971,20 +972,16 @@ while ($i < $imaxinloop) { if ($event_end_date_time != null && $event_end_date_time < $today_start_date_time) { // past event $event_more_class = 'event-past'; - $event_start_date_color = $conf->global->AGENDA_EVENT_PAST_COLOR; } elseif ($event_end_date_time == null && $event_start_date_time < $today_start_date_time) { // past event $event_more_class = 'event-past'; - $event_start_date_color = $conf->global->AGENDA_EVENT_PAST_COLOR; } else { // current event $event_more_class = 'event-current'; - $event_start_date_color = $conf->global->AGENDA_EVENT_CURRENT_COLOR; } + $event_start_date_css = $event_end_date_css = $event_more_class; } - if ($event_start_date_color != '') { - $event_start_date_style .= 'background: #' . $event_start_date_color . ';'; - } + $event_start_date_css = $event_end_date_css = $event_more_class; print ''; // Action column @@ -1065,13 +1062,14 @@ while ($i < $imaxinloop) { // Start date if (!empty($arrayfields['a.datep']['checked'])) { - print ''; + print ''; if (empty($obj->fulldayevent)) { print dol_print_date($db->jdate($obj->dp), $formatToUse, 'tzuserrel'); } else { $tzforfullday = getDolGlobalString('MAIN_STORE_FULL_EVENT_IN_GMT'); print dol_print_date($db->jdate($obj->dp), $formatToUse, ($tzforfullday ? $tzforfullday : 'tzuserrel')); } + print ''; $late = 0; if ($actionstatic->hasDelay() && $actionstatic->percentage >= 0 && $actionstatic->percentage < 100 ) { $late = 1; @@ -1084,13 +1082,14 @@ while ($i < $imaxinloop) { // End date if (!empty($arrayfields['a.datep2']['checked'])) { - print ''; + print ''; if (empty($obj->fulldayevent)) { print dol_print_date($db->jdate($obj->dp2), $formatToUse, 'tzuserrel'); } else { $tzforfullday = getDolGlobalString('MAIN_STORE_FULL_EVENT_IN_GMT'); print dol_print_date($db->jdate($obj->dp2), $formatToUse, ($tzforfullday ? $tzforfullday : 'tzuserrel')); } + print ''; print ''; } diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 8920445508a..ab96f650b6f 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -116,7 +116,7 @@ function getDolUserString($key, $default = '', $tmpuser = null) } // return $conf->global->$key ?? $default; - return (string) (empty($tmpuser->conf->$key) ? $default : $$tmpuser->conf->$key); + return (string) (empty($tmpuser->conf->$key) ? $default : $tmpuser->conf->$key); } /** diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 6cc135e3b2c..db11289d299 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1272,6 +1272,7 @@ TriggerActiveAsModuleActive=Triggers in this file are active as module %s GeneratedPasswordDesc=Choose the method to be used for auto-generated passwords. DictionaryDesc=Insert all reference data. You can add your values to the default. ConstDesc=This page allows you to edit (override) parameters not available in other pages. These are mostly reserved parameters for developers/advanced troubleshooting only. +MiscellaneousOptions=Miscellaneous options MiscellaneousDesc=All other security related parameters are defined here. LimitsSetup=Limits/Precision setup LimitsDesc=You can define limits, precisions and optimizations used by Dolibarr here diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index b9e35e1e9ea..0ba59834d71 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -5428,6 +5428,10 @@ td.cal_other_month { opacity: 0.8; } +td.event-past span { + opacity: 0.5; +} + /* ============================================================================== */ From 04ce79191fb24085c27969e5bbe60e5096340970 Mon Sep 17 00:00:00 2001 From: hystepik Date: Fri, 13 Jan 2023 12:18:58 +0100 Subject: [PATCH 0784/1128] Fix #23531 : fix update bom line --- htdocs/core/modules/modBom.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/modBom.class.php b/htdocs/core/modules/modBom.class.php index 2e92d3baeaf..d6b9e7a6ff3 100644 --- a/htdocs/core/modules/modBom.class.php +++ b/htdocs/core/modules/modBom.class.php @@ -422,7 +422,7 @@ class modBom extends DolibarrModules $this->import_fieldshidden_array[$r] = array('extra.fk_object' => 'lastrowid-'.MAIN_DB_PREFIX.'bom_bomline'); $this->import_regex_array[$r] = array(); - $this->import_updatekeys_array[$r] = array('bd.fk_bom' => 'BOM Id'); + $this->import_updatekeys_array[$r] = array('bd.fk_bom' => 'BOM Id', 'bd.fk_product' => 'ProductRef'); $this->import_convertvalue_array[$r] = array( 'bd.fk_bom' => array( 'rule' => 'fetchidfromref', From 354b94abce48f77fad507376d8f6b803b2c9ac84 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 13 Jan 2023 12:24:28 +0100 Subject: [PATCH 0785/1128] Merge manually #23539 --- htdocs/public/onlinesign/newonlinesign.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/htdocs/public/onlinesign/newonlinesign.php b/htdocs/public/onlinesign/newonlinesign.php index f0738f0e420..c7c90b90229 100644 --- a/htdocs/public/onlinesign/newonlinesign.php +++ b/htdocs/public/onlinesign/newonlinesign.php @@ -545,6 +545,8 @@ if ($action == "dosign" && empty($cancel)) { $("#signbutton").attr("disabled",false); if(!$._data($("#signbutton")[0], "events")){ $("#signbutton").on("click",function(){ + console.log("We click on button sign"); + $("#signbutton").val(\''.dol_escape_js($langs->transnoentities('PleaseBePatient')).'\'); var signature = $("#signature").jSignature("getData", "image"); $.ajax({ type: "POST", From a42c879ac5589381ab83bcfcb14a54c67d9d4282 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Fri, 13 Jan 2023 12:25:44 +0100 Subject: [PATCH 0786/1128] modify colspan --- htdocs/hrm/position_list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/hrm/position_list.php b/htdocs/hrm/position_list.php index 5dc33859219..201be040d20 100644 --- a/htdocs/hrm/position_list.php +++ b/htdocs/hrm/position_list.php @@ -608,7 +608,7 @@ while ($i < $imaxinloop) { if ($mode == 'kanban') { if ($i == 0) { - print ''; + print ''; print '
'; } // get info needed From d823971151a1145659a9920464664d973e3b4381 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Fri, 13 Jan 2023 12:31:40 +0100 Subject: [PATCH 0787/1128] kanban for evaluation list --- htdocs/hrm/class/evaluation.class.php | 35 ++++++ htdocs/hrm/evaluation_list.php | 151 ++++++++++++++++---------- 2 files changed, 129 insertions(+), 57 deletions(-) diff --git a/htdocs/hrm/class/evaluation.class.php b/htdocs/hrm/class/evaluation.class.php index 4a41f1c8e0e..5a628725f95 100644 --- a/htdocs/hrm/class/evaluation.class.php +++ b/htdocs/hrm/class/evaluation.class.php @@ -1055,4 +1055,39 @@ class Evaluation extends CommonObject return $error; } + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $selected, $langs; + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(1) : $this->ref).''; + $return .= ''; + if (property_exists($this, 'fk_user') && !(empty($this->fk_user))) { + $return .= '
'.$langs->trans("Employee").' : '; + $return .= ''.$this->fk_user.''; + } + if (property_exists($this, 'fk_job') && !(empty($this->fk_job))) { + $return .= '
'.$langs->trans("Job").' : '; + $return .= ''.$this->fk_job.''; + } + + if (method_exists($this, 'getLibStatut')) { + $return .= '
'.$this->getLibStatut(5).'
'; + } + $return .= ''; + $return .= '
'; + $return .= '
'; + return $return; + } } diff --git a/htdocs/hrm/evaluation_list.php b/htdocs/hrm/evaluation_list.php index dea398ad6a6..999d6d0d44e 100644 --- a/htdocs/hrm/evaluation_list.php +++ b/htdocs/hrm/evaluation_list.php @@ -52,6 +52,7 @@ $toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'evaluationlist'; // To manage different context of search $backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print') +$mode = GETPOST('mode', 'alpha'); // for mode view result $id = GETPOST('id', 'int'); $ref = GETPOST('ref', 'alpha'); @@ -369,6 +370,9 @@ llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', ''); $arrayofselected = is_array($toselect) ? $toselect : array(); $param = ''; +if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); +} if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -420,8 +424,12 @@ print ''; print ''; print ''; print ''; +print ''; -$newcardbutton = dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', dol_buildpath('/hrm/evaluation_card.php', 1).'?action=create', '', $permissiontoadd); +$newcardbutton = ''; +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); +$newcardbutton .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', dol_buildpath('/hrm/evaluation_card.php', 1).'?action=create', '', $permissiontoadd); print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'object_'.$object->picto, 0, $newcardbutton, '', $limit, 0, 0, 1); @@ -568,75 +576,104 @@ while ($i < ($limit ? min($num, $limit) : $num)) { // Store properties in $object $object->setVarsFromFetchObj($obj); - // Show here line of result - print ''; - foreach ($object->fields as $key => $val) { - $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); - if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) { - $cssforfield .= ($cssforfield ? ' ' : '').'center'; - } elseif ($key == 'status') { - $cssforfield .= ($cssforfield ? ' ' : '').'center'; + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + print '
'; } + // Output Kanban + $object->date_eval = $obj->date_eval; - if (in_array($val['type'], array('timestamp'))) { - $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; - } elseif ($key == 'ref') { - $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; - } + $job = new job($db); + $job->fetch($obj->fk_job); + $object->fk_job = $job->getNomUrl(); - if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'status')) && empty($val['arrayofkeyval'])) { - $cssforfield .= ($cssforfield ? ' ' : '').'right'; - } - //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100'; + $userstatic = new User($db); + $userstatic->fetch($obj->fk_user); + $object->fk_user = $userstatic->getNomUrl(1); - if (!empty($arrayfields['t.'.$key]['checked'])) { - print ''; - if ($key == 'status') { - print $object->getLibStatut(5); - } elseif ($key == 'rowid') { - print $object->showOutputField($val, $key, $object->id, ''); - } else { - print $object->showOutputField($val, $key, $object->$key, ''); + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($object->id, $arrayofselected)) { + $selected = 1; } - print ''; - if (!$i) { - $totalarray['nbfield']++; + print $object->getKanbanView(''); + } + if ($i == ($imaxinloop - 1)) { + print '
'; + print ''; + } + } else { + // Show here line of result + print ''; + foreach ($object->fields as $key => $val) { + $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); + if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) { + $cssforfield .= ($cssforfield ? ' ' : '').'center'; + } elseif ($key == 'status') { + $cssforfield .= ($cssforfield ? ' ' : '').'center'; } - if (!empty($val['isameasure']) && $val['isameasure'] == 1) { + + if (in_array($val['type'], array('timestamp'))) { + $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; + } elseif ($key == 'ref') { + $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; + } + + if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'status')) && empty($val['arrayofkeyval'])) { + $cssforfield .= ($cssforfield ? ' ' : '').'right'; + } + //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100'; + + if (!empty($arrayfields['t.'.$key]['checked'])) { + print ''; + if ($key == 'status') { + print $object->getLibStatut(5); + } elseif ($key == 'rowid') { + print $object->showOutputField($val, $key, $object->id, ''); + } else { + print $object->showOutputField($val, $key, $object->$key, ''); + } + print ''; if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key; + $totalarray['nbfield']++; } - if (!isset($totalarray['val'])) { - $totalarray['val'] = array(); + if (!empty($val['isameasure']) && $val['isameasure'] == 1) { + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key; + } + if (!isset($totalarray['val'])) { + $totalarray['val'] = array(); + } + if (!isset($totalarray['val']['t.'.$key])) { + $totalarray['val']['t.'.$key] = 0; + } + $totalarray['val']['t.'.$key] += $object->$key; } - if (!isset($totalarray['val']['t.'.$key])) { - $totalarray['val']['t.'.$key] = 0; - } - $totalarray['val']['t.'.$key] += $object->$key; } } - } - // Extra fields - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - // Action column - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($object->id, $arrayofselected)) { - $selected = 1; + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Action column + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($object->id, $arrayofselected)) { + $selected = 1; + } + print ''; + } + print ''; + if (!$i) { + $totalarray['nbfield']++; } - print ''; - } - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - print ''."\n"; + print ''."\n"; + } $i++; } From 19b77e3dcda2e862afe82cc2a7b13eac97bf9b58 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Fri, 13 Jan 2023 12:33:25 +0100 Subject: [PATCH 0788/1128] modify checkbox action --- htdocs/hrm/position_list.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/htdocs/hrm/position_list.php b/htdocs/hrm/position_list.php index 201be040d20..7a6f7fcc417 100644 --- a/htdocs/hrm/position_list.php +++ b/htdocs/hrm/position_list.php @@ -622,7 +622,13 @@ while ($i < $imaxinloop) { $userstatic->fetch($obj->fk_user); $object->fk_user = $userstatic->getNomUrl(1); // output kanban - print $object->getKanbanView(''); + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($object->id, $arrayofselected)) { + $selected = 1; + } + print $object->getKanbanView(''); + } if ($i == ($imaxinloop - 1)) { print '
'; print ''; From 2d3f7d949e56f88896637afde42afb444aa2e4a5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 13 Jan 2023 12:53:56 +0100 Subject: [PATCH 0789/1128] Fix warnings --- htdocs/compta/resultat/result.php | 128 ++++++++++++++++++++++-------- 1 file changed, 97 insertions(+), 31 deletions(-) diff --git a/htdocs/compta/resultat/result.php b/htdocs/compta/resultat/result.php index 8615e595200..94a957a5c40 100644 --- a/htdocs/compta/resultat/result.php +++ b/htdocs/compta/resultat/result.php @@ -335,7 +335,7 @@ if ($modecompta == 'CREANCES-DETTES') { // Previous Fiscal year (N-1) foreach ($sommes as $code => $det) { - $vars[$code] = $det['NP']; + $vars[$code] = empty($det['NP']) ? 0 : $det['NP']; } $result = strtr($formula, $vars); @@ -355,12 +355,16 @@ if ($modecompta == 'CREANCES-DETTES') { // Year N $code = $cat['code']; // code of categorie ('VTE', 'MAR', ...) - $sommes[$code]['NP'] += $r; + if (empty($sommes[$code]['NP'])) { + $sommes[$code]['NP'] = $r; + } else { + $sommes[$code]['NP'] += $r; + } // Current fiscal year (N) if (is_array($sommes) && !empty($sommes)) { foreach ($sommes as $code => $det) { - $vars[$code] = $det['N']; + $vars[$code] = empty($det['N']) ? 0 : $det['N']; } } @@ -371,13 +375,17 @@ if ($modecompta == 'CREANCES-DETTES') { $r = dol_eval($result, 1, 1, '1'); print ''.price($r).''; - $sommes[$code]['N'] += $r; + if (empty($sommes[$code]['N'])) { + $sommes[$code]['N'] = $r; + } else { + $sommes[$code]['N'] += $r; + } // Detail by month foreach ($months as $k => $v) { if (($k + 1) >= $date_startmonth) { foreach ($sommes as $code => $det) { - $vars[$code] = $det['M'][$k]; + $vars[$code] = empty($det['M'][$k]) ? 0 : $det['M'][$k]; } $result = strtr($formula, $vars); $result = str_replace('--', '+', $result); @@ -386,14 +394,18 @@ if ($modecompta == 'CREANCES-DETTES') { $r = dol_eval($result, 1, 1, '1'); print ''.price($r).''; - $sommes[$code]['M'][$k] += $r; + if (empty($sommes[$code]['M'][$k])) { + $sommes[$code]['M'][$k] = $r; + } else { + $sommes[$code]['M'][$k] += $r; + } } } foreach ($months as $k => $v) { if (($k + 1) < $date_startmonth) { foreach ($sommes as $code => $det) { - $vars[$code] = $det['M'][$k]; + $vars[$code] = empty($det['M'][$k]) ? 0 : $det['M'][$k]; } $result = strtr($formula, $vars); $result = str_replace('--', '+', $result); @@ -402,7 +414,11 @@ if ($modecompta == 'CREANCES-DETTES') { $r = dol_eval($result, 1, 1, '1'); print ''.price($r).''; - $sommes[$code]['M'][$k] += $r; + if (empty($sommes[$code]['M'][$k])) { + $sommes[$code]['M'][$k] = $r; + } else { + $sommes[$code]['M'][$k] += $r; + } } } @@ -429,14 +445,14 @@ if ($modecompta == 'CREANCES-DETTES') { $arrayofaccountforfilter = array(); foreach ($cpts as $i => $cpt) { // Loop on each account. - if (!is_null($cpt['account_number'])) { + if (isset($cpt['account_number'])) { $arrayofaccountforfilter[] = $cpt['account_number']; } } // N-1 if (!empty($arrayofaccountforfilter)) { - $return = $AccCat->getSumDebitCredit($arrayofaccountforfilter, $date_start_previous, $date_end_previous, $cat['dc'] ? $cat['dc'] : 0); + $return = $AccCat->getSumDebitCredit($arrayofaccountforfilter, $date_start_previous, $date_end_previous, empty($cat['dc']) ? 0 : $cat['dc']); if ($return < 0) { setEventMessages(null, $AccCat->errors, 'errors'); $resultNP = 0; @@ -444,8 +460,16 @@ if ($modecompta == 'CREANCES-DETTES') { foreach ($cpts as $i => $cpt) { // Loop on each account found $resultNP = empty($AccCat->sdcperaccount[$cpt['account_number']]) ? 0 : $AccCat->sdcperaccount[$cpt['account_number']]; - $totCat['NP'] += $resultNP; - $sommes[$code]['NP'] += $resultNP; + if (empty($totCat['NP'])) { + $totCat['NP'] = $resultNP; + } else { + $totCat['NP'] += $resultNP; + } + if (empty($sommes[$code]['NP'])) { + $sommes[$code]['NP'] = $resultNP; + } else { + $sommes[$code]['NP'] += $resultNP; + } $totPerAccount[$cpt['account_number']]['NP'] = $resultNP; } } @@ -467,23 +491,47 @@ if ($modecompta == 'CREANCES-DETTES') { } //var_dump($monthtoprocess.'_'.$yeartoprocess); - $return = $AccCat->getSumDebitCredit($cpt['account_number'], $date_start, $date_end, $cat['dc'] ? $cat['dc'] : 0, 'nofilter', $monthtoprocess, $yeartoprocess); - if ($return < 0) { - setEventMessages(null, $AccCat->errors, 'errors'); - $resultM = 0; + if (isset($cpt['account_number'])) { + $return = $AccCat->getSumDebitCredit($cpt['account_number'], $date_start, $date_end, empty($cat['dc']) ? 0 : $cat['dc'], 'nofilter', $monthtoprocess, $yeartoprocess); + if ($return < 0) { + setEventMessages(null, $AccCat->errors, 'errors'); + $resultM = 0; + } else { + $resultM = $AccCat->sdc; + } } else { - $resultM = $AccCat->sdc; + $resultM = 0; + } + if (empty($totCat['M'][$k])) { + $totCat['M'][$k] = $resultM; + } else { + $totCat['M'][$k] += $resultM; + } + if (empty($sommes[$code]['M'][$k])) { + $sommes[$code]['M'][$k] = $resultM; + } else { + $sommes[$code]['M'][$k] += $resultM; + } + if (isset($cpt['account_number'])) { + $totPerAccount[$cpt['account_number']]['M'][$k] = $resultM; } - $totCat['M'][$k] += $resultM; - $sommes[$code]['M'][$k] += $resultM; - $totPerAccount[$cpt['account_number']]['M'][$k] = $resultM; $resultN += $resultM; } - $totCat['N'] += $resultN; - $sommes[$code]['N'] += $resultN; - $totPerAccount[$cpt['account_number']]['N'] = $resultN; + if (empty($totCat)) { + $totCat['N'] = $resultN; + } else { + $totCat['N'] += $resultN; + } + if (empty($sommes[$code]['N'])) { + $sommes[$code]['N'] = $resultN; + } else { + $sommes[$code]['N'] += $resultN; + } + if (isset($cpt['account_number'])) { + $totPerAccount[$cpt['account_number']]['N'] = $resultN; + } } @@ -543,16 +591,26 @@ if ($modecompta == 'CREANCES-DETTES') { // Loop on detail of all accounts to output the detail if ($showaccountdetail != 'no') { foreach ($cpts as $i => $cpt) { - $resultNP = $totPerAccount[$cpt['account_number']]['NP']; - $resultN = $totPerAccount[$cpt['account_number']]['N']; + if (isset($cpt['account_number'])) { + $resultNP = $totPerAccount[$cpt['account_number']]['NP']; + $resultN = $totPerAccount[$cpt['account_number']]['N']; + } else { + $resultNP = 0; + $resultN = 0; + } if ($showaccountdetail == 'all' || $resultN != 0) { print ''; print ''; - print ''; - print '     '.length_accountg($cpt['account_number']); - print ' - '; - print $cpt['account_label']; + + if (isset($cpt['account_number'])) { + $labeldetail = '     '.length_accountg($cpt['account_number']).' - '.$cpt['account_label']; + } else { + $labeldetail = '-'; + } + + print ''; + print dol_escape_htmltag($labeldetail); print ''; print ''.price($resultNP).''; print ''.price($resultN).''; @@ -560,13 +618,21 @@ if ($modecompta == 'CREANCES-DETTES') { // Make one call for each month foreach ($months as $k => $v) { if (($k + 1) >= $date_startmonth) { - $resultM = $totPerAccount[$cpt['account_number']]['M'][$k]; + if (isset($cpt['account_number'])) { + $resultM = $totPerAccount[$cpt['account_number']]['M'][$k]; + } else { + $resultM = 0; + } print ''.price($resultM).''; } } foreach ($months as $k => $v) { if (($k + 1) < $date_startmonth) { - $resultM = $totPerAccount[$cpt['account_number']]['M'][$k]; + if (isset($cpt['account_number'])) { + $resultM = empty($totPerAccount[$cpt['account_number']]['M'][$k]) ? 0 : $totPerAccount[$cpt['account_number']]['M'][$k]; + } else { + $resultM = 0; + } print ''.price($resultM).''; } } From fdfe27b5df3c6bf729d9003084c337f2e84c0072 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 13 Jan 2023 12:55:08 +0100 Subject: [PATCH 0790/1128] Doc --- ChangeLog | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ChangeLog b/ChangeLog index f752894b4d2..3f30b2a2f99 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,9 @@ English Dolibarr ChangeLog ***** ChangeLog for 18.0.0 compared to 17.0.0 ***** +NEW: PHP 8.2 compatibility: + + WARNING: Following changes may create regressions for some external modules, but were necessary to make Dolibarr better: From 276bca95d340bc0dd3fefe8b33a5739c1122aa9a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 13 Jan 2023 13:28:40 +0100 Subject: [PATCH 0791/1128] CSS --- htdocs/admin/modules.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/admin/modules.php b/htdocs/admin/modules.php index db019bd262a..714d8fc7a0a 100644 --- a/htdocs/admin/modules.php +++ b/htdocs/admin/modules.php @@ -847,7 +847,7 @@ if ($mode == 'common' || $mode == 'commonkanban') { if (getDolGlobalInt("MAIN_FEATURES_LEVEL") > 1) { $codeenabledisable .= ' '; $codeenabledisable .= '
'; - $codeenabledisable .= img_picto($langs->trans("Reload"), 'refresh', 'class="fa-15"'); + $codeenabledisable .= img_picto($langs->trans("Reload"), 'refresh', 'class="opacitymedium"'); $codeenabledisable .= ''; } } else { @@ -857,7 +857,7 @@ if ($mode == 'common' || $mode == 'commonkanban') { if (getDolGlobalInt("MAIN_FEATURES_LEVEL") > 1) { $codeenabledisable .= ' '; $codeenabledisable .= ''; - $codeenabledisable .= img_picto($langs->trans("Reload"), 'refresh', 'class="fa-15"'); + $codeenabledisable .= img_picto($langs->trans("Reload"), 'refresh', 'class="opacitymedium"'); $codeenabledisable .= ''; } } From 5fc9e093eb9a51741b80c8eec6413bc0f50171b3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 13 Jan 2023 14:09:54 +0100 Subject: [PATCH 0792/1128] css --- htdocs/admin/modules.php | 18 ++++++++++-------- htdocs/core/modules/DolibarrModules.class.php | 4 ++-- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/htdocs/admin/modules.php b/htdocs/admin/modules.php index 714d8fc7a0a..ccda604d35d 100644 --- a/htdocs/admin/modules.php +++ b/htdocs/admin/modules.php @@ -776,15 +776,17 @@ if ($mode == 'common' || $mode == 'commonkanban') { // Version (with picto warning or not) $version = $objMod->getVersion(0); $versiontrans = ''; + $warningstring = ''; if (preg_match('/development/i', $version)) { - $versiontrans .= img_warning($langs->trans("Development"), '', 'floatleft paddingright'); + $warningstring = $langs->trans("Development"); } if (preg_match('/experimental/i', $version)) { - $versiontrans .= img_warning($langs->trans("Experimental"), '', 'floatleft paddingright'); + $warningstring = $langs->trans("Experimental"); } if (preg_match('/deprecated/i', $version)) { - $versiontrans .= img_warning($langs->trans("Deprecated"), '', 'floatleft paddingright'); + $warningstring = $langs->trans("Deprecated"); } + if ($objMod->isCoreOrExternalModule() == 'external' || preg_match('/development|experimental|deprecated/i', $version)) { $versiontrans .= $objMod->getVersion(1); } @@ -842,7 +844,7 @@ if ($mode == 'common' || $mode == 'commonkanban') { } else { if (!empty($objMod->warnings_unactivation[$mysoc->country_code]) && method_exists($objMod, 'alreadyUsed') && $objMod->alreadyUsed()) { $codeenabledisable .= 'warnings_unactivation[$mysoc->country_code]).'&value='.$modName.'&mode='.$mode.$param.'">'; - $codeenabledisable .= img_picto($langs->trans("Activated"), 'switch_on'); + $codeenabledisable .= img_picto($langs->trans("Activated").($warningstring ? ' '.$warningstring : ''), 'switch_on'); $codeenabledisable .= ''; if (getDolGlobalInt("MAIN_FEATURES_LEVEL") > 1) { $codeenabledisable .= ' '; @@ -852,7 +854,7 @@ if ($mode == 'common' || $mode == 'commonkanban') { } } else { $codeenabledisable .= ''; - $codeenabledisable .= img_picto($langs->trans("Activated"), 'switch_on'); + $codeenabledisable .= img_picto($langs->trans("Activated").($warningstring ? ' '.$warningstring : ''), 'switch_on'); $codeenabledisable .= ''; if (getDolGlobalInt("MAIN_FEATURES_LEVEL") > 1) { $codeenabledisable .= ' '; @@ -961,7 +963,7 @@ if ($mode == 'common' || $mode == 'commonkanban') { // Output Kanban print $objMod->getKanbanView($codeenabledisable, $codetoconfig); } else { - print ''."\n"; + print ''."\n"; if (!empty($conf->global->MAIN_MODULES_SHOW_LINENUMBERS)) { print ''.$linenum.''; } @@ -995,7 +997,7 @@ if ($mode == 'common' || $mode == 'commonkanban') { print ''; // Version - print ''; + print ''; if ($objMod->needUpdate) { $versionTitle = $langs->trans('ModuleUpdateAvailable').' : '.$objMod->lastVersion; print ''.$versiontrans.''; @@ -1005,7 +1007,7 @@ if ($mode == 'common' || $mode == 'commonkanban') { print "\n"; // Link enable/disable - print ''; + print ''; print $codeenabledisable; print "\n"; diff --git a/htdocs/core/modules/DolibarrModules.class.php b/htdocs/core/modules/DolibarrModules.class.php index 4027fb0cbf2..f4b3b3eef1f 100644 --- a/htdocs/core/modules/DolibarrModules.class.php +++ b/htdocs/core/modules/DolibarrModules.class.php @@ -792,8 +792,8 @@ class DolibarrModules // Can not be abstract, because we need to instantiate it * For 'experimental' modules, gives 'experimental' translation * For 'dolibarr' modules, gives Dolibarr version * - * @param int $translated 1=Special version keys are translated, 0=Special version keys are not translated - * @return string Module version + * @param int $translated 1=Special version keys are translated, 0=Special version keys are not translated + * @return string Module version */ public function getVersion($translated = 1) { From 147e3ff945a31a5e04dab6a085fb4aa32f0a7605 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Fri, 13 Jan 2023 14:13:52 +0100 Subject: [PATCH 0793/1128] kanban for list of holidays --- htdocs/holiday/class/holiday.class.php | 37 ++++ htdocs/holiday/list.php | 284 ++++++++++++++----------- htdocs/theme/eldy/info-box.inc.php | 5 + 3 files changed, 200 insertions(+), 126 deletions(-) diff --git a/htdocs/holiday/class/holiday.class.php b/htdocs/holiday/class/holiday.class.php index 9b3f0a1ce16..e8f56659de9 100644 --- a/htdocs/holiday/class/holiday.class.php +++ b/htdocs/holiday/class/holiday.class.php @@ -2419,4 +2419,41 @@ class Holiday extends CommonObject return -1; } } + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $langs, $selected; + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(1) : $this->ref).''; + if (property_exists($this, 'fk_user') && !empty($this->id)) { + $return .= '| '.$this->fk_user.''; + $return .= ''; + } + if (property_exists($this, 'fk_type')) { + $return .= '
'.$langs->trans("Type").' : '; + $return .= ''.$langs->trans($this->getTypes(1, -1)[$this->fk_type]['code']).''; + } + if (property_exists($this, 'date_debut') && property_exists($this, 'date_fin')) { + $return .= '
'.dol_print_date($this->date_debut, 'day').''; + $return .= ' '.$langs->trans("To").' '; + $return .= ''.dol_print_date($this->date_fin, 'day').''; + } + if (method_exists($this, 'getLibStatut')) { + $return .= '
'.$this->getLibStatut(5).'
'; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } diff --git a/htdocs/holiday/list.php b/htdocs/holiday/list.php index 564fb8a2a96..b16fbaf8c16 100644 --- a/htdocs/holiday/list.php +++ b/htdocs/holiday/list.php @@ -52,6 +52,7 @@ $confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation $cancel = GETPOST('cancel', 'alpha'); // We click on a Cancel button $toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected into a list $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'holidaylist'; // To manage different context of search +$mode = GETPOST('mode', 'alpha'); // for switch mode view result $backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print') @@ -394,6 +395,9 @@ if ($resql) { $arrayofselected = is_array($toselect) ? $toselect : array(); $param = ''; + if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); + } if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -476,6 +480,8 @@ if ($resql) { print ''; print ''; print ''; + print ''; + if ($id > 0) { print ''; } @@ -519,7 +525,11 @@ if ($resql) { } else { $title = $langs->trans("ListeCP"); - $newcardbutton = dolGetButtonTitle($langs->trans('MenuAddCP'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/holiday/card.php?action=create', '', $user->rights->holiday->write); + + $newcardbutton = ''; + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); + $newcardbutton .= dolGetButtonTitle($langs->trans('MenuAddCP'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/holiday/card.php?action=create', '', $user->rights->holiday->write); print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_hrm', 0, $newcardbutton, '', $limit, 0, 0, 1); } @@ -787,7 +797,8 @@ if ($resql) { $holidaystatic->id = $obj->rowid; $holidaystatic->ref = ($obj->ref ? $obj->ref : $obj->rowid); $holidaystatic->statut = $obj->status; - $holidaystatic->date_debut = $db->jdate($obj->date_debut); + $holidaystatic->date_debut = $obj->date_debut; + $holidaystatic->date_fin = $obj->date_fin; // User $userstatic->id = $obj->fk_user; @@ -815,139 +826,160 @@ if ($resql) { $starthalfday = ($obj->halfday == -1 || $obj->halfday == 2) ? 'afternoon' : 'morning'; $endhalfday = ($obj->halfday == 1 || $obj->halfday == 2) ? 'morning' : 'afternoon'; - print ''; - // Action column - if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + print '
'; + } + + $holidaystatic->fk_type = $holidaystatic->getTypes(1, -1)[$obj->fk_type]['rowid']; + $holidaystatic->fk_user = $userstatic->getNomUrl(1); + // Output Kanban + if ($massactionbutton || $massaction) { $selected = 0; - if (in_array($obj->rowid, $arrayofselected)) { + if (in_array($object->id, $arrayofselected)) { $selected = 1; } - print ''; + print $holidaystatic->getKanbanView(''); } - print ''; - } - if (!empty($arrayfields['cp.ref']['checked'])) { - print ''; - print $holidaystatic->getNomUrl(1, 1); - print ''; - if (!$i) { - $totalarray['nbfield']++; + if ($i == (min($num, $limit) - 1)) { + print '
'; + print ''; } - } - if (!empty($arrayfields['cp.fk_user']['checked'])) { - print ''.$userstatic->getNomUrl(-1, 'leave').''; - if (!$i) { - $totalarray['nbfield']++; - } - } - if (!empty($arrayfields['cp.fk_validator']['checked'])) { - print ''.$approbatorstatic->getNomUrl(-1).''; - if (!$i) { - $totalarray['nbfield']++; - } - } - if (!empty($arrayfields['cp.fk_type']['checked'])) { - $labeltypeleavetoshow = ($langs->trans($typeleaves[$obj->fk_type]['code']) != $typeleaves[$obj->fk_type]['code'] ? $langs->trans($typeleaves[$obj->fk_type]['code']) : $typeleaves[$obj->fk_type]['label']); - $labeltypeleavetoshow = empty($typeleaves[$obj->fk_type]['label']) ? $langs->trans("TypeWasDisabledOrRemoved", $obj->fk_type) : $labeltypeleavetoshow; - - print ''; - print $labeltypeleavetoshow; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - if (!empty($arrayfields['duration']['checked'])) { - print ''; - $nbopenedday = num_open_day($db->jdate($obj->date_debut, 1), $db->jdate($obj->date_fin, 1), 0, 1, $obj->halfday); // user jdate(..., 1) because num_open_day need UTC dates - $totalduration += $nbopenedday; - print $nbopenedday; - //print ' '.$langs->trans('DurationDays'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - if (!empty($arrayfields['cp.date_debut']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_debut), 'day'); - print ' ('.$langs->trans($listhalfday[$starthalfday]).')'; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - if (!empty($arrayfields['cp.date_fin']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_fin), 'day'); - print ' ('.$langs->trans($listhalfday[$endhalfday]).')'; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Date validation - if (!empty($arrayfields['cp.date_valid']['checked'])) { // date_valid is both date_valid but also date_approval - print ''; - print dol_print_date($db->jdate($obj->date_valid), 'day'); - print ''; - if (!$i) $totalarray['nbfield']++; - } - // Date approval - if (!empty($arrayfields['cp.date_approval']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_approval), 'day'); - print ''; - if (!$i) $totalarray['nbfield']++; - } - - // Extra fields - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - - // Date creation - if (!empty($arrayfields['cp.date_create']['checked'])) { - print ''.dol_print_date($date, 'dayhour').''; - if (!$i) { - $totalarray['nbfield']++; - } - } - if (!empty($arrayfields['cp.tms']['checked'])) { - print ''.dol_print_date($date_modif, 'dayhour').''; - if (!$i) { - $totalarray['nbfield']++; - } - } - if (!empty($arrayfields['cp.statut']['checked'])) { - print ''.$holidaystatic->getLibStatut(5).''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Action column - if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->rowid, $arrayofselected)) { - $selected = 1; + } else { + print ''; + // Action column + if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->rowid, $arrayofselected)) { + $selected = 1; + } + print ''; } - print ''; + print ''; } - print ''; - } - if (!$i) { - $totalarray['nbfield']++; - } + if (!empty($arrayfields['cp.ref']['checked'])) { + print ''; + print $holidaystatic->getNomUrl(1, 1); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + if (!empty($arrayfields['cp.fk_user']['checked'])) { + print ''.$userstatic->getNomUrl(-1, 'leave').''; + if (!$i) { + $totalarray['nbfield']++; + } + } + if (!empty($arrayfields['cp.fk_validator']['checked'])) { + print ''.$approbatorstatic->getNomUrl(-1).''; + if (!$i) { + $totalarray['nbfield']++; + } + } + if (!empty($arrayfields['cp.fk_type']['checked'])) { + $labeltypeleavetoshow = ($langs->trans($typeleaves[$obj->fk_type]['code']) != $typeleaves[$obj->fk_type]['code'] ? $langs->trans($typeleaves[$obj->fk_type]['code']) : $typeleaves[$obj->fk_type]['label']); + $labeltypeleavetoshow = empty($typeleaves[$obj->fk_type]['label']) ? $langs->trans("TypeWasDisabledOrRemoved", $obj->fk_type) : $labeltypeleavetoshow; - print ''."\n"; + print ''; + print $labeltypeleavetoshow; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + if (!empty($arrayfields['duration']['checked'])) { + print ''; + $nbopenedday = num_open_day($db->jdate($obj->date_debut, 1), $db->jdate($obj->date_fin, 1), 0, 1, $obj->halfday); // user jdate(..., 1) because num_open_day need UTC dates + $totalduration += $nbopenedday; + print $nbopenedday; + //print ' '.$langs->trans('DurationDays'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + if (!empty($arrayfields['cp.date_debut']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_debut), 'day'); + print ' ('.$langs->trans($listhalfday[$starthalfday]).')'; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + if (!empty($arrayfields['cp.date_fin']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_fin), 'day'); + print ' ('.$langs->trans($listhalfday[$endhalfday]).')'; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Date validation + if (!empty($arrayfields['cp.date_valid']['checked'])) { // date_valid is both date_valid but also date_approval + print ''; + print dol_print_date($db->jdate($obj->date_valid), 'day'); + print ''; + if (!$i) $totalarray['nbfield']++; + } + // Date approval + if (!empty($arrayfields['cp.date_approval']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_approval), 'day'); + print ''; + if (!$i) $totalarray['nbfield']++; + } + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + + // Date creation + if (!empty($arrayfields['cp.date_create']['checked'])) { + print ''.dol_print_date($date, 'dayhour').''; + if (!$i) { + $totalarray['nbfield']++; + } + } + if (!empty($arrayfields['cp.tms']['checked'])) { + print ''.dol_print_date($date_modif, 'dayhour').''; + if (!$i) { + $totalarray['nbfield']++; + } + } + if (!empty($arrayfields['cp.statut']['checked'])) { + print ''.$holidaystatic->getLibStatut(5).''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + // Action column + if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->rowid, $arrayofselected)) { + $selected = 1; + } + print ''; + } + print ''; + } + if (!$i) { + $totalarray['nbfield']++; + } + + print ''."\n"; + } $i++; } diff --git a/htdocs/theme/eldy/info-box.inc.php b/htdocs/theme/eldy/info-box.inc.php index f35516ad58e..5c010e21e26 100644 --- a/htdocs/theme/eldy/info-box.inc.php +++ b/htdocs/theme/eldy/info-box.inc.php @@ -492,6 +492,11 @@ if (GETPOSTISSET('THEME_SATURATE_RATIO')) { max-width: 350px; } +/**for make a checkbox in the right of the box in mode kanban */ +.fright { + float:right; +} + @media only screen and (max-width: 1740px) { .info-box-module { min-width: 315px; From ee7bcc3d129bac92a35ad37563e2cad677f7c502 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Fri, 13 Jan 2023 14:16:22 +0100 Subject: [PATCH 0794/1128] modify style for checkbox --- htdocs/hrm/class/evaluation.class.php | 2 +- htdocs/theme/eldy/info-box.inc.php | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/htdocs/hrm/class/evaluation.class.php b/htdocs/hrm/class/evaluation.class.php index 5a628725f95..c410ae8bd8f 100644 --- a/htdocs/hrm/class/evaluation.class.php +++ b/htdocs/hrm/class/evaluation.class.php @@ -1072,7 +1072,7 @@ class Evaluation extends CommonObject $return .= ''; $return .= '
'; $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(1) : $this->ref).''; - $return .= ''; + $return .= ''; if (property_exists($this, 'fk_user') && !(empty($this->fk_user))) { $return .= '
'.$langs->trans("Employee").' : '; $return .= ''.$this->fk_user.''; diff --git a/htdocs/theme/eldy/info-box.inc.php b/htdocs/theme/eldy/info-box.inc.php index f35516ad58e..f13bd8c6c26 100644 --- a/htdocs/theme/eldy/info-box.inc.php +++ b/htdocs/theme/eldy/info-box.inc.php @@ -492,6 +492,10 @@ if (GETPOSTISSET('THEME_SATURATE_RATIO')) { max-width: 350px; } +/**for make a checkbox in the right of the box in mode kanban */ +.fright { + float:right; +} @media only screen and (max-width: 1740px) { .info-box-module { min-width: 315px; From 0ee90877aa0f20caeefe92614d474f6fc34d4f2e Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Fri, 13 Jan 2023 14:17:49 +0100 Subject: [PATCH 0795/1128] modify style for checkbox --- htdocs/hrm/class/position.class.php | 2 +- htdocs/theme/eldy/info-box.inc.php | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/htdocs/hrm/class/position.class.php b/htdocs/hrm/class/position.class.php index 9d4f71d24fd..2f4a127999a 100644 --- a/htdocs/hrm/class/position.class.php +++ b/htdocs/hrm/class/position.class.php @@ -1135,7 +1135,7 @@ class Position extends CommonObject $return .= ''; $return .= '
'; $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(1) : $this->ref).''; - $return .= ''; + $return .= ''; if (property_exists($this, 'fk_user') && !(empty($this->fk_user))) { $return .= '
'.$langs->trans("Employee").' : '; $return .= ''.$this->fk_user.''; diff --git a/htdocs/theme/eldy/info-box.inc.php b/htdocs/theme/eldy/info-box.inc.php index f35516ad58e..9c1f3b443ef 100644 --- a/htdocs/theme/eldy/info-box.inc.php +++ b/htdocs/theme/eldy/info-box.inc.php @@ -491,7 +491,10 @@ if (GETPOSTISSET('THEME_SATURATE_RATIO')) { min-width: 350px; max-width: 350px; } - +/**for make a checkbox in the right of the box in mode kanban */ +.fright { + float:right; +} @media only screen and (max-width: 1740px) { .info-box-module { min-width: 315px; From 313608b6273d4e4134c2561a05f147f791e9f110 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Fri, 13 Jan 2023 14:19:14 +0100 Subject: [PATCH 0796/1128] modify style for checkbox --- htdocs/hrm/class/job.class.php | 2 +- htdocs/theme/eldy/info-box.inc.php | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/htdocs/hrm/class/job.class.php b/htdocs/hrm/class/job.class.php index a013bb57a36..85845e557ab 100644 --- a/htdocs/hrm/class/job.class.php +++ b/htdocs/hrm/class/job.class.php @@ -1071,7 +1071,7 @@ class Job extends CommonObject $return .= ''; $return .= '
'; $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(1) : $this->ref).''; - $return .= ''; + $return .= ''; if (property_exists($this, 'deplacement')) { $return .= '
'.$langs->trans("Type").''; $return .= ' : '.$this->fields['deplacement']['arrayofkeyval'][$this->deplacement].''; diff --git a/htdocs/theme/eldy/info-box.inc.php b/htdocs/theme/eldy/info-box.inc.php index f35516ad58e..f13bd8c6c26 100644 --- a/htdocs/theme/eldy/info-box.inc.php +++ b/htdocs/theme/eldy/info-box.inc.php @@ -492,6 +492,10 @@ if (GETPOSTISSET('THEME_SATURATE_RATIO')) { max-width: 350px; } +/**for make a checkbox in the right of the box in mode kanban */ +.fright { + float:right; +} @media only screen and (max-width: 1740px) { .info-box-module { min-width: 315px; From 782594ba5622e46dc8092ec79661440d3e77b2a1 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Fri, 13 Jan 2023 14:27:19 +0100 Subject: [PATCH 0797/1128] fix problem style --- htdocs/compta/cashcontrol/cashcontrol_list.php | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/htdocs/compta/cashcontrol/cashcontrol_list.php b/htdocs/compta/cashcontrol/cashcontrol_list.php index b4c20a824ba..a1e5dae0c91 100644 --- a/htdocs/compta/cashcontrol/cashcontrol_list.php +++ b/htdocs/compta/cashcontrol/cashcontrol_list.php @@ -344,9 +344,6 @@ $param = ''; if (!empty($mode)) { $param .= '&mode='.urlencode($mode); } -if (!empty($mode)) { - $param .= '&mode='.urlencode($mode); -} if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -405,6 +402,7 @@ print ''; print ''; $permforcashfence = 1; + $newcardbutton = ''; $newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); $newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); @@ -564,8 +562,7 @@ while ($i < ($limit ? min($num, $limit) : $num)) { print ''; print '
'; } - // Output Kanban - //var_dump($obj->posmodule);exit; + $object->posmodule = $obj->posmodule; $object->cash = $obj->cash; $object->opening = $obj->opening; From fcd82c93f2dd2a5e69577048fdf48f48da4ca941 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Fri, 13 Jan 2023 16:58:55 +0100 Subject: [PATCH 0798/1128] fix total days for both view --- htdocs/holiday/list.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/htdocs/holiday/list.php b/htdocs/holiday/list.php index b16fbaf8c16..cef7375a4b6 100644 --- a/htdocs/holiday/list.php +++ b/htdocs/holiday/list.php @@ -826,6 +826,9 @@ if ($resql) { $starthalfday = ($obj->halfday == -1 || $obj->halfday == 2) ? 'afternoon' : 'morning'; $endhalfday = ($obj->halfday == 1 || $obj->halfday == 2) ? 'morning' : 'afternoon'; + $nbopenedday = num_open_day($db->jdate($obj->date_debut, 1), $db->jdate($obj->date_fin, 1), 0, 1, $obj->halfday); // user jdate(..., 1) because num_open_day need UTC dates + $totalduration += $nbopenedday; + if ($mode == 'kanban') { if ($i == 0) { print ''; From 97061a9a922bd9f75d67f7187943391502893105 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 13 Jan 2023 17:17:23 +0100 Subject: [PATCH 0799/1128] NEW Use a cache file for external RSS in calendar --- htdocs/comm/action/class/ical.class.php | 35 ++++++++++++++++++++----- htdocs/comm/action/index.php | 16 ++++++++--- htdocs/core/lib/date.lib.php | 1 + htdocs/core/lib/functions.lib.php | 16 +++++++++++ 4 files changed, 58 insertions(+), 10 deletions(-) diff --git a/htdocs/comm/action/class/ical.class.php b/htdocs/comm/action/class/ical.class.php index badd5db5c98..26db2cd5e6e 100644 --- a/htdocs/comm/action/class/ical.class.php +++ b/htdocs/comm/action/class/ical.class.php @@ -54,8 +54,8 @@ class ICal /** * Read text file, icalender text file * - * @param string $file File - * @return string + * @param string $file File + * @return string|null Content of remote file read or null if error */ public function read_file($file) { @@ -65,7 +65,7 @@ class ICal $tmpresult = getURLContent($file, 'GET'); if ($tmpresult['http_code'] != 200) { - $file_text = ''; + $file_text = null; $this->error = 'Error: '.$tmpresult['http_code'].' '.$tmpresult['content']; } else { $file_text = preg_replace("/[\r\n]{1,} /", "", $tmpresult['content']); @@ -102,17 +102,40 @@ class ICal /** * Translate Calendar * - * @param string $uri Url + * @param string $uri Url + * @param string $usecachefile Full path of a cache file to use a cache file + * @param string $delaycache Delay in seconds for cache (by default 3600 secondes) * @return array|string */ - public function parse($uri) + public function parse($uri, $usecachefile = '', $delaycache = 3600) { $this->cal = array(); // new empty array $this->event_count = -1; + $this->file_text = null; + + // Save file into a cache + if ($usecachefile) { + include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + $datefile = dol_filemtime($usecachefile); + $now = dol_now('gmt'); + //print $datefile.' '.$now.' ...'; + if ($datefile && $datefile > ($now - $delaycache)) { + // We reuse the cache file + $this->file_text = file_get_contents($usecachefile); + } + } // read FILE text - $this->file_text = $this->read_file($uri); + if (is_null($this->file_text)) { + $this->file_text = $this->read_file($uri); + + if ($usecachefile && !is_null($this->file_text)) { + // Save the file content into cache file + file_put_contents($usecachefile, $this->file_text, LOCK_EX); + dolChmod($usecachefile); + } + } $this->file_text = preg_split("[\n]", $this->file_text); diff --git a/htdocs/comm/action/index.php b/htdocs/comm/action/index.php index 3460355a803..b4e11125aee 100644 --- a/htdocs/comm/action/index.php +++ b/htdocs/comm/action/index.php @@ -49,6 +49,7 @@ if (empty($conf->global->AGENDA_EXT_NB)) { $conf->global->AGENDA_EXT_NB = 5; } $MAXAGENDA = $conf->global->AGENDA_EXT_NB; +$DELAYFORCACHE = 300; // 300 seconds $disabledefaultvalues = GETPOST('disabledefaultvalues', 'int'); @@ -615,7 +616,7 @@ if (!empty($conf->use_javascript_ajax)) { // If javascript on $default = ''; } - $s .= '
 
'; + $s .= '
 
'; } } @@ -1010,9 +1011,13 @@ if ($mode == 'show_day') { // Request only leaves for the current selected day $sql .= " AND '".$db->escape($year)."-".$db->escape($month)."-".$db->escape($day)."' BETWEEN x.date_debut AND x.date_fin"; // date_debut and date_fin are date without time } elseif ($mode == 'show_week') { - // TODO: Add filter to reduce database request + // Restrict on current month (we get more, but we will filter later) + $sql .= " AND date_debut < '".dol_get_last_day($year, $month)."'"; + $sql .= " AND date_fin >= '".dol_get_first_day($year, $month)."'"; } elseif ($mode == 'show_month') { - // TODO: Add filter to reduce database request + // Restrict on current month + $sql .= " AND date_debut <= '".dol_get_last_day($year, $month)."'"; + $sql .= " AND date_fin >= '".dol_get_first_day($year, $month)."'"; } $resql = $db->query($sql); @@ -1083,8 +1088,11 @@ if (count($listofextcals)) { $colorcal = $extcal['color']; $buggedfile = $extcal['buggedfile']; + $pathforcachefile = dol_sanitizePathName($conf->user->dir_temp).'/'.dol_sanitizeFileName('extcal_'.$namecal.'_user'.$user->id).'.cache'; + //var_dump($pathforcachefile);exit; + $ical = new ICal(); - $ical->parse($url); + $ical->parse($url, $pathforcachefile, $DELAYFORCACHE); // After this $ical->cal['VEVENT'] contains array of events, $ical->cal['DAYLIGHT'] contains daylight info, $ical->cal['STANDARD'] contains non daylight info, ... //var_dump($ical->cal); exit; diff --git a/htdocs/core/lib/date.lib.php b/htdocs/core/lib/date.lib.php index 03223a7b65a..773cb6a1a97 100644 --- a/htdocs/core/lib/date.lib.php +++ b/htdocs/core/lib/date.lib.php @@ -117,6 +117,7 @@ function getServerTimeZoneInt($refgmtdate = 'now') * @param int $duration_unit Unit of added delay (d, m, y, w, h, i) * @param int $ruleforendofmonth Change the behavior of PHP over data-interval, 0 or 1 * @return int New timestamp + * @see convertSecondToTime(), convertTimeToSeconds() */ function dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth = 0) { diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index ab96f650b6f..278f70507bb 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -6844,6 +6844,22 @@ function dol_mkdir($dir, $dataroot = '', $newmask = '') } +/** + * Change mod of a file + * + * @param string $filepath Full file path + * @return void + */ +function dolChmod($filepath) +{ + global $conf; + + if (!empty($conf->global->MAIN_UMASK)) { + @chmod($filepath, octdec($conf->global->MAIN_UMASK)); + } +} + + /** * Return picto saying a field is required * From 669beb50d25f810bf410bd1311e4e499c21747aa Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 13 Jan 2023 19:07:57 +0100 Subject: [PATCH 0800/1128] Better navigation bar for calendars --- htdocs/comm/action/index.php | 28 ++++++++++++++-------------- htdocs/comm/action/list.php | 2 +- htdocs/comm/action/pertype.php | 7 +++++-- htdocs/comm/action/peruser.php | 7 +++++-- htdocs/theme/eldy/global.inc.php | 13 +++++++++++++ htdocs/theme/md/style.css.php | 2 ++ 6 files changed, 40 insertions(+), 19 deletions(-) diff --git a/htdocs/comm/action/index.php b/htdocs/comm/action/index.php index b4e11125aee..8ec011f5e9d 100644 --- a/htdocs/comm/action/index.php +++ b/htdocs/comm/action/index.php @@ -429,36 +429,33 @@ if ($mode == 'show_day' || $mode == 'show_week' || $mode == 'show_month') { } // Show navigation bar +$nav = ''; +$nav .= ''; $nav .= $form->selectDate($dateselect, 'dateselect', 0, 0, 1, '', 1, 0); //$nav .= ' '; @@ -497,7 +494,8 @@ print ''; //print_actions_filter($form, $canedit, $status, $year, $month, $day, $showbirthday, 0, $filtert, 0, $pid, $socid, $action, $listofextcals, $actioncode, $usergroup, '', $resourceid); //print dol_get_fiche_end(); -$viewmode = ''; +$viewmode = ''; + $viewmode .= ''; // To add a space before the navigation tools diff --git a/htdocs/comm/action/list.php b/htdocs/comm/action/list.php index 5abd2d3f101..ab2037d5f76 100644 --- a/htdocs/comm/action/list.php +++ b/htdocs/comm/action/list.php @@ -600,7 +600,7 @@ $num = $db->num_rows($resql); $arrayofselected = is_array($toselect) ? $toselect : array(); // Local calendar -$newtitle = '
'; +$newtitle = '
'; $newtitle .= ' '.$langs->trans("LocalAgenda").'   '; $newtitle .= '
'; //$newtitle=$langs->trans($title); diff --git a/htdocs/comm/action/pertype.php b/htdocs/comm/action/pertype.php index ce33d0f40b2..c13de5fb183 100644 --- a/htdocs/comm/action/pertype.php +++ b/htdocs/comm/action/pertype.php @@ -368,12 +368,15 @@ $max_day_in_month = date("t", dol_mktime(0, 0, 0, $month, 1, $year, 'gmt')); $tmpday = $first_day; $picto = 'calendarweek'; -$nav = "
".img_previous($langs->trans("Previous"))."\n"; +// Show navigation bar +$nav = ''; $nav .= $form->selectDate($dateselect, 'dateselect', 0, 0, 1, '', 1, 0); $nav .= ' '; diff --git a/htdocs/comm/action/peruser.php b/htdocs/comm/action/peruser.php index bd35fc16e7d..0ee3b6db4a1 100644 --- a/htdocs/comm/action/peruser.php +++ b/htdocs/comm/action/peruser.php @@ -363,13 +363,16 @@ $max_day_in_month = date("t", dol_mktime(0, 0, 0, $month, 1, $year, 'gmt')); $tmpday = $first_day; $picto = 'calendarweek'; -$nav = "trans("Previous"))."\">   \n"; +// Show navigation bar +$nav = ''; $nav .= $form->selectDate($dateselect, 'dateselect', 0, 0, 1, '', 1, 0); $nav .= ' '; diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 0ba59834d71..061af67d2b5 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -1432,6 +1432,9 @@ select.flat.selectlimit { .tablelistofcalendars { margin-top: 25px !important; } +.navselectiondate { + width: 250px; +} /* Styles for amount on card */ table.paymenttable td.amountpaymentcomplete, table.paymenttable td.amountremaintopay, table.paymenttable td.amountremaintopayback { @@ -1604,6 +1607,7 @@ table[summary="list_of_modules"] .fa-cog { .minwidth100 { min-width: 100px; } .minwidth150 { min-width: 150px; } .minwidth200 { min-width: 200px; } + .minwidth250 { min-width: 250px; } .minwidth300 { min-width: 300px; } .minwidth400 { min-width: 400px; } .minwidth500 { min-width: 500px; } @@ -1626,6 +1630,7 @@ table[summary="list_of_modules"] .fa-cog { .width125 { width: 125px; } .width150 { width: 150px; } .width200 { width: 200px; } +.width250 { width: 250px; } .width300 { width: 300px; } .width400 { width: 400px; } .width500 { width: 500px; } @@ -7532,6 +7537,14 @@ div.clipboardCPValue.hidewithsize { { .imgopensurveywizard, .imgautosize { width:95%; height: auto; } + .fiche > .listactionsfilter .table-fiche-title .col-title .titre { + display: none; + } + + .navselectiondate { + width: 220px; + } + #tooltip { position: absolute; width: px; diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 39f6858570a..afc43936695 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -1824,6 +1824,7 @@ tr.nobottom td { .minwidth100 { min-width: 100px; } .minwidth150 { min-width: 150px; } .minwidth200 { min-width: 200px; } + .minwidth250 { min-width: 250px; } .minwidth300 { min-width: 300px; } .minwidth400 { min-width: 400px; } .minwidth500 { min-width: 500px; } @@ -1847,6 +1848,7 @@ tr.nobottom td { .width125 { width: 125px; } .width150 { width: 150px; } .width200 { width: 200px; } +.width250 { width: 250px; } .width300 { width: 300px; } .width400 { width: 400px; } .width500 { width: 500px; } From 8efb2e8f8867bf0aa2a207daa370667bdb4f6338 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 13 Jan 2023 19:44:35 +0100 Subject: [PATCH 0801/1128] Fix placeholder of status combo --- htdocs/admin/modules.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/htdocs/admin/modules.php b/htdocs/admin/modules.php index ccda604d35d..6e0d90499d4 100644 --- a/htdocs/admin/modules.php +++ b/htdocs/admin/modules.php @@ -589,6 +589,7 @@ if ($mode == 'common' || $mode == 'commonkanban') { $moreforfilter .= '
'; $moreforfilter .= $form->selectarray('search_nature', $arrayofnatures, dol_escape_htmltag($search_nature), $langs->trans('Origin'), 0, 0, '', 0, 0, 0, '', 'maxwidth250', 1); $moreforfilter .= '
'; + if (getDolGlobalInt('MAIN_FEATURES_LEVEL')) { $array_version = array('stable'=>$langs->transnoentitiesnoconv("Stable")); if ($conf->global->MAIN_FEATURES_LEVEL < 0) { @@ -601,11 +602,12 @@ if ($mode == 'common' || $mode == 'commonkanban') { $array_version['development'] = $langs->trans("Development"); } $moreforfilter .= '
'; - $moreforfilter .= $form->selectarray('search_version', $array_version, $search_version, $langs->trans('Version'), 0, 0, '', 0, 0, 0, '', 'maxwidth150', 1); + $moreforfilter .= $form->selectarray('search_version', $array_version, $search_version, $langs->transnoentitiesnoconv('Version'), 0, 0, '', 0, 0, 0, '', 'maxwidth150', 1); $moreforfilter .= '
'; } + $array_status = array('active'=>$langs->transnoentitiesnoconv("Enabled"), 'disabled'=>$langs->transnoentitiesnoconv("Disabled")); $moreforfilter .= '
'; - $moreforfilter .= $form->selectarray('search_status', array('active'=>$langs->transnoentitiesnoconv("Enabled"), 'disabled'=>$langs->transnoentitiesnoconv("Disabled")), $search_status, $langs->trans('Status'), 0, 0, '', 0, 0, 0, '', 'maxwidth150', 1); + $moreforfilter .= $form->selectarray('search_status', $array_status, $search_status, $langs->transnoentitiesnoconv('Status'), 0, 0, '', 0, 0, 0, '', 'maxwidth150', 1); $moreforfilter .= '
'; $moreforfilter .= ' '; $moreforfilter .= '
'; From 00415dfe54a9fe505ef89ebc5846aca2461aa3a9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 13 Jan 2023 19:53:31 +0100 Subject: [PATCH 0802/1128] css --- htdocs/theme/eldy/global.inc.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 061af67d2b5..bef2e6e7800 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -2012,11 +2012,12 @@ td.showDragHandle { z-index: 1005; } -global->THEME_DARKMODEENABLED)) { ?> -.side-nav-vert { - border-bottom: 1px solid #888; + +@media screen and (prefers-color-scheme: dark) { + .side-nav-vert { + border-bottom: 1px solid #888; + } } - .side-nav { /*display: block; From 1bd63b36d305f59a81b067e48387c003f8891022 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 13 Jan 2023 19:57:14 +0100 Subject: [PATCH 0803/1128] Trans --- htdocs/langs/en_US/companies.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/langs/en_US/companies.lang b/htdocs/langs/en_US/companies.lang index e022c7cb09f..7200ffb3d70 100644 --- a/htdocs/langs/en_US/companies.lang +++ b/htdocs/langs/en_US/companies.lang @@ -312,8 +312,8 @@ CustomerRelativeDiscountShort=Relative discount CustomerAbsoluteDiscountShort=Absolute discount CompanyHasRelativeDiscount=This customer has a default discount of %s%% CompanyHasNoRelativeDiscount=This customer has no relative discount by default -HasRelativeDiscountFromSupplier=You have a default discount of %s%% from this vendor -HasNoRelativeDiscountFromSupplier=No default relative discount from this vendor +HasRelativeDiscountFromSupplier=You have a default discount of %s%% with this vendor +HasNoRelativeDiscountFromSupplier=No default relative discount with this vendor CompanyHasAbsoluteDiscount=This customer has discounts available (credits notes or down payments) for %s %s CompanyHasDownPaymentOrCommercialDiscount=This customer has discounts available (commercial, down payments) for %s %s CompanyHasCreditNote=This customer still has credit notes for %s %s From 317b49917aa7192abc9ae375f807e96731f95292 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20NASSIET?= Date: Fri, 13 Jan 2023 23:06:44 +0100 Subject: [PATCH 0804/1128] correctif hook --- htdocs/user/param_ihm.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/htdocs/user/param_ihm.php b/htdocs/user/param_ihm.php index da8eebacaac..136da34e1bd 100644 --- a/htdocs/user/param_ihm.php +++ b/htdocs/user/param_ihm.php @@ -219,13 +219,12 @@ if (isModEnabled('ticket')) { $reshook = $hookmanager->executeHooks('addToLandingPageList', $tmparray, $object); if ($reshook < 0) { setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); -} elseif ($reshook === 0) { - if (count($hookmanager->resArray)!==0) { - $tmparray=$hookmanager->resArray; - } +} elseif ($reshook > 0) { + $tmparray=$hookmanager->resArray; +} elseif ($reshook == 0) { + $tmparray=array_merge($tmparray, $hookmanager->resArray); } - $head = user_prepare_head($object); $title = $langs->trans("User"); From b11a6a1741b53a8283fdb25eea4fe47cf2d64d06 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 14 Jan 2023 02:22:52 +0100 Subject: [PATCH 0805/1128] Fix link to download a file must contains &output=file --- htdocs/hrm/skill_tab.php | 5 ++++- htdocs/user/agenda_extsites.php | 5 ++++- htdocs/user/bank.php | 5 ++++- htdocs/user/card.php | 2 +- htdocs/user/clicktodial.php | 5 ++++- htdocs/user/document.php | 5 ++++- htdocs/user/info.php | 5 ++++- htdocs/user/note.php | 5 ++++- htdocs/user/notify/card.php | 5 ++++- htdocs/user/param_ihm.php | 5 ++++- htdocs/user/perms.php | 5 ++++- htdocs/user/virtualcard.php | 11 ++++------- 12 files changed, 45 insertions(+), 18 deletions(-) diff --git a/htdocs/hrm/skill_tab.php b/htdocs/hrm/skill_tab.php index b30484de54f..ce238b6caf4 100644 --- a/htdocs/hrm/skill_tab.php +++ b/htdocs/hrm/skill_tab.php @@ -226,10 +226,13 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea } else { $linkback = '' . $langs->trans("BackToList") . ''; - $morehtmlref = ''; + $morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; + $urltovirtualcard = '/user/virtualcard.php?id='.((int) $object->id); + $morehtmlref .= dolButtonToOpenUrlInDialogPopup('publicvirtualcard', $langs->trans("PublicVirtualCardUrl").' - '.$object->getFullName($langs), img_picto($langs->trans("PublicVirtualCardUrl"), 'card', 'class="valignmiddle marginleftonly paddingrightonly"'), $urltovirtualcard, '', 'nohover'); + dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'rowid', $morehtmlref, '&objecttype='.$objecttype); } diff --git a/htdocs/user/agenda_extsites.php b/htdocs/user/agenda_extsites.php index 4891480cc2d..13948dc841e 100644 --- a/htdocs/user/agenda_extsites.php +++ b/htdocs/user/agenda_extsites.php @@ -170,10 +170,13 @@ if ($user->rights->user->user->lire || $user->admin) { $linkback = ''.$langs->trans("BackToList").''; } -$morehtmlref = ''; +$morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; +$urltovirtualcard = '/user/virtualcard.php?id='.((int) $object->id); +$morehtmlref .= dolButtonToOpenUrlInDialogPopup('publicvirtualcard', $langs->trans("PublicVirtualCardUrl").' - '.$object->getFullName($langs), img_picto($langs->trans("PublicVirtualCardUrl"), 'card', 'class="valignmiddle marginleftonly paddingrightonly"'), $urltovirtualcard, '', 'nohover'); + dol_banner_tab($object, 'id', $linkback, $user->rights->user->user->lire || $user->admin, 'rowid', 'ref', $morehtmlref); diff --git a/htdocs/user/bank.php b/htdocs/user/bank.php index fb795ecc6e4..3d94d23f682 100644 --- a/htdocs/user/bank.php +++ b/htdocs/user/bank.php @@ -350,10 +350,13 @@ if ($action != 'edit' && $action != 'create') { // If not bank account yet, $ac $linkback = ''.$langs->trans("BackToList").''; } - $morehtmlref = ''; + $morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; + $urltovirtualcard = '/user/virtualcard.php?id='.((int) $object->id); + $morehtmlref .= dolButtonToOpenUrlInDialogPopup('publicvirtualcard', $langs->trans("PublicVirtualCardUrl").' - '.$object->getFullName($langs), img_picto($langs->trans("PublicVirtualCardUrl"), 'card', 'class="valignmiddle marginleftonly paddingrightonly"'), $urltovirtualcard, '', 'nohover'); + dol_banner_tab($object, 'id', $linkback, $user->rights->user->user->lire || $user->admin, 'rowid', 'ref', $morehtmlref); print '
'; diff --git a/htdocs/user/card.php b/htdocs/user/card.php index e7d001b1041..0d0c3e9f8dc 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -1432,7 +1432,7 @@ if ($action == 'create' || $action == 'adduserldap') { if ($action != 'edit') { print dol_get_fiche_head($head, 'user', $title, -1, 'user'); - $morehtmlref = ''; + $morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard").' ('.$langs->trans("AddToContacts").')', 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; diff --git a/htdocs/user/clicktodial.php b/htdocs/user/clicktodial.php index 562ab081ab8..985bf978074 100644 --- a/htdocs/user/clicktodial.php +++ b/htdocs/user/clicktodial.php @@ -106,10 +106,13 @@ if ($id > 0) { $linkback = ''.$langs->trans("BackToList").''; } - $morehtmlref = ''; + $morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; + $urltovirtualcard = '/user/virtualcard.php?id='.((int) $object->id); + $morehtmlref .= dolButtonToOpenUrlInDialogPopup('publicvirtualcard', $langs->trans("PublicVirtualCardUrl").' - '.$object->getFullName($langs), img_picto($langs->trans("PublicVirtualCardUrl"), 'card', 'class="valignmiddle marginleftonly paddingrightonly"'), $urltovirtualcard, '', 'nohover'); + dol_banner_tab($object, 'id', $linkback, $user->rights->user->user->lire || $user->admin, 'rowid', 'ref', $morehtmlref); print '
'; diff --git a/htdocs/user/document.php b/htdocs/user/document.php index b607cff7f3e..1a18cde92cc 100644 --- a/htdocs/user/document.php +++ b/htdocs/user/document.php @@ -152,10 +152,13 @@ if ($object->id) { $linkback = ''.$langs->trans("BackToList").''; } - $morehtmlref = ''; + $morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; + $urltovirtualcard = '/user/virtualcard.php?id='.((int) $object->id); + $morehtmlref .= dolButtonToOpenUrlInDialogPopup('publicvirtualcard', $langs->trans("PublicVirtualCardUrl").' - '.$object->getFullName($langs), img_picto($langs->trans("PublicVirtualCardUrl"), 'card', 'class="valignmiddle marginleftonly paddingrightonly"'), $urltovirtualcard, '', 'nohover'); + dol_banner_tab($object, 'id', $linkback, $user->hasRight("user", "user", "read") || $user->admin, 'rowid', 'ref', $morehtmlref); print '
'; diff --git a/htdocs/user/info.php b/htdocs/user/info.php index 3f5d1aea604..4a49fddf5c2 100644 --- a/htdocs/user/info.php +++ b/htdocs/user/info.php @@ -80,10 +80,13 @@ if ($user->rights->user->user->lire || $user->admin) { $linkback = ''.$langs->trans("BackToList").''; } -$morehtmlref = ''; +$morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; +$urltovirtualcard = '/user/virtualcard.php?id='.((int) $object->id); +$morehtmlref .= dolButtonToOpenUrlInDialogPopup('publicvirtualcard', $langs->trans("PublicVirtualCardUrl").' - '.$object->getFullName($langs), img_picto($langs->trans("PublicVirtualCardUrl"), 'card', 'class="valignmiddle marginleftonly paddingrightonly"'), $urltovirtualcard, '', 'nohover'); + dol_banner_tab($object, 'id', $linkback, $user->rights->user->user->lire || $user->admin, 'rowid', 'ref', $morehtmlref); diff --git a/htdocs/user/note.php b/htdocs/user/note.php index 4b64a15d217..d189226d575 100644 --- a/htdocs/user/note.php +++ b/htdocs/user/note.php @@ -94,10 +94,13 @@ if ($id) { $linkback = ''.$langs->trans("BackToList").''; } - $morehtmlref = ''; + $morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; + $urltovirtualcard = '/user/virtualcard.php?id='.((int) $object->id); + $morehtmlref .= dolButtonToOpenUrlInDialogPopup('publicvirtualcard', $langs->trans("PublicVirtualCardUrl").' - '.$object->getFullName($langs), img_picto($langs->trans("PublicVirtualCardUrl"), 'card', 'class="valignmiddle marginleftonly paddingrightonly"'), $urltovirtualcard, '', 'nohover'); + dol_banner_tab($object, 'id', $linkback, $user->hasRight("user", "user", "read") || $user->admin, 'rowid', 'ref', $morehtmlref); print '
'; diff --git a/htdocs/user/notify/card.php b/htdocs/user/notify/card.php index e20d7be3d9a..e0c01ba5d58 100644 --- a/htdocs/user/notify/card.php +++ b/htdocs/user/notify/card.php @@ -155,10 +155,13 @@ if ($result > 0) { $linkback = ''.$langs->trans("BackToList").''; - $morehtmlref = ''; + $morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; + $urltovirtualcard = '/user/virtualcard.php?id='.((int) $object->id); + $morehtmlref .= dolButtonToOpenUrlInDialogPopup('publicvirtualcard', $langs->trans("PublicVirtualCardUrl").' - '.$object->getFullName($langs), img_picto($langs->trans("PublicVirtualCardUrl"), 'card', 'class="valignmiddle marginleftonly paddingrightonly"'), $urltovirtualcard, '', 'nohover'); + dol_banner_tab($object, 'id', $linkback, $user->rights->user->user->lire || $user->admin, 'rowid', 'ref', $morehtmlref, '', 0, '', '', 0, ''); print '
'; diff --git a/htdocs/user/param_ihm.php b/htdocs/user/param_ihm.php index 3d2e3240ce3..b4a03fa700e 100644 --- a/htdocs/user/param_ihm.php +++ b/htdocs/user/param_ihm.php @@ -343,10 +343,13 @@ if ($action == 'edit') { $linkback = ''.$langs->trans("BackToList").''; - $morehtmlref = ''; + $morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; + $urltovirtualcard = '/user/virtualcard.php?id='.((int) $object->id); + $morehtmlref .= dolButtonToOpenUrlInDialogPopup('publicvirtualcard', $langs->trans("PublicVirtualCardUrl").' - '.$object->getFullName($langs), img_picto($langs->trans("PublicVirtualCardUrl"), 'card', 'class="valignmiddle marginleftonly paddingrightonly"'), $urltovirtualcard, '', 'nohover'); + dol_banner_tab($object, 'id', $linkback, $user->hasRight("user", "user", "read") || $user->admin, 'rowid', 'ref', $morehtmlref); print '
'; diff --git a/htdocs/user/perms.php b/htdocs/user/perms.php index a65762b6183..22acb8ca7d9 100644 --- a/htdocs/user/perms.php +++ b/htdocs/user/perms.php @@ -255,10 +255,13 @@ if ($user->hasRight("user", "user", "read") || $user->admin) { $linkback = ''.$langs->trans("BackToList").''; } -$morehtmlref = ''; +$morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; +$urltovirtualcard = '/user/virtualcard.php?id='.((int) $object->id); +$morehtmlref .= dolButtonToOpenUrlInDialogPopup('publicvirtualcard', $langs->trans("PublicVirtualCardUrl").' - '.$object->getFullName($langs), img_picto($langs->trans("PublicVirtualCardUrl"), 'card', 'class="valignmiddle marginleftonly paddingrightonly"'), $urltovirtualcard, '', 'nohover'); + dol_banner_tab($object, 'id', $linkback, $user->hasRight("user", "user", "read") || $user->admin, 'rowid', 'ref', $morehtmlref); diff --git a/htdocs/user/virtualcard.php b/htdocs/user/virtualcard.php index c2de7e17b06..ed3fbf7beb3 100644 --- a/htdocs/user/virtualcard.php +++ b/htdocs/user/virtualcard.php @@ -114,10 +114,13 @@ if ($user->rights->user->user->lire || $user->admin) { $linkback = ''.$langs->trans("BackToList").''; } -$morehtmlref = ''; +$morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; +$urltovirtualcard = '/user/virtualcard.php?id='.((int) $object->id); +$morehtmlref .= dolButtonToOpenUrlInDialogPopup('publicvirtualcard', $langs->trans("PublicVirtualCardUrl").' - '.$object->getFullName($langs), img_picto($langs->trans("PublicVirtualCardUrl"), 'card', 'class="valignmiddle marginleftonly paddingrightonly"'), $urltovirtualcard, '', 'nohover'); + //dol_banner_tab($object, 'id', $linkback, $user->rights->user->user->lire || $user->admin, 'rowid', 'ref', $morehtmlref); @@ -126,12 +129,6 @@ print '
'; print '
'; /* - print ''.$langs->trans("VCard").'
'; - -print ''; -print img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); -print ''; - print '
'; //print '
'; From b4702aee2454c75e6ef442a8fa34fa71cf138717 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 14 Jan 2023 02:31:53 +0100 Subject: [PATCH 0806/1128] Fix warning --- htdocs/core/class/vcard.class.php | 4 ++-- htdocs/user/card.php | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/vcard.class.php b/htdocs/core/class/vcard.class.php index 0e9372360e6..e7eb318e476 100644 --- a/htdocs/core/class/vcard.class.php +++ b/htdocs/core/class/vcard.class.php @@ -465,9 +465,9 @@ class vCard $this->setTitle($object->job); } - // For user, type=home + // For user, $object->url is not defined // For contact, $object->url is not defined - if ($object->url) { + if (!empty($object->url)) { $this->setURL($object->url, ""); } diff --git a/htdocs/user/card.php b/htdocs/user/card.php index 0d0c3e9f8dc..2e2534621b1 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -2464,6 +2464,7 @@ if ($action == 'create' || $action == 'adduserldap') { // Country print ''.$form->editfieldkey('Country', 'selectcounty_id', '', $object, 0).''; + print img_picto('', 'country', 'class="pictofixedwidth"'); if ($caneditfield) { print $form->select_country((GETPOST('country_id') != '' ?GETPOST('country_id') : $object->country_id), 'country_id'); if ($user->admin) { From 09a0d579cebac0d7ee231856ffc42df2a5d1d90f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 14 Jan 2023 02:40:44 +0100 Subject: [PATCH 0807/1128] Fix delete group of a user --- htdocs/user/card.php | 1 + htdocs/user/class/user.class.php | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/htdocs/user/card.php b/htdocs/user/card.php index 2e2534621b1..e995fc03001 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -375,6 +375,7 @@ if (empty($reshook)) { $editgroup->oldcopy = clone $editgroup; $object->fetch($id); + if ($action == 'addgroup') { $result = $object->SetInGroup($group, $editgroup->entity); } diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 65a7b7d7842..9e208ff3e37 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -2651,7 +2651,11 @@ class User extends CommonObject $sql = "DELETE FROM ".$this->db->prefix()."usergroup_user"; $sql .= " WHERE fk_user = ".((int) $this->id); $sql .= " AND fk_usergroup = ".((int) $group); - $sql .= " AND entity = ".((int) $entity); + if (empty($entity)) { + $sql .= " AND entity IN (0, 1)"; // group may be in entity 0 (so $entity=0) and link with user into entity 1. + } else { + $sql .= " AND entity = ".((int) $entity); + } $result = $this->db->query($sql); if ($result) { From 0afcec9f43ddf8e196ecb7f437ba575dac4ca43e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 14 Jan 2023 02:51:58 +0100 Subject: [PATCH 0808/1128] Clean code --- htdocs/main.inc.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index b2c76218a5d..9fec72e2e86 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -3208,7 +3208,6 @@ function printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinpu $ret = ''; $ret .= '
'; $ret .= ''; - $ret .= ''; $ret .= ''; if ($showtitlebefore) { $ret .= '
'.$title.'
'; From 704191b4d8bd3238cc29e2ab07f84e0f5d88e128 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 14 Jan 2023 03:06:27 +0100 Subject: [PATCH 0809/1128] Try to fix name of download file --- htdocs/user/card.php | 2 +- htdocs/user/vcard.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/user/card.php b/htdocs/user/card.php index e995fc03001..9ea05b69805 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -1433,7 +1433,7 @@ if ($action == 'create' || $action == 'adduserldap') { if ($action != 'edit') { print dol_get_fiche_head($head, 'user', $title, -1, 'user'); - $morehtmlref = ''; + $morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard").' ('.$langs->trans("AddToContacts").')', 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; diff --git a/htdocs/user/vcard.php b/htdocs/user/vcard.php index 576d2b90a5b..695cd0e556e 100644 --- a/htdocs/user/vcard.php +++ b/htdocs/user/vcard.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2010 Laurent Destailleur + * Copyright (C) 2004-2023 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2020 Tobias Sekan * Copyright (C) 2021-2022 Anthony Berton From 35eeb4a3c0e840f11f25eefb213d8f574ecafe33 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 14 Jan 2023 03:15:46 +0100 Subject: [PATCH 0810/1128] Fix download link --- htdocs/hrm/skill_tab.php | 2 +- htdocs/user/agenda_extsites.php | 2 +- htdocs/user/bank.php | 2 +- htdocs/user/card.php | 2 +- htdocs/user/clicktodial.php | 2 +- htdocs/user/document.php | 2 +- htdocs/user/info.php | 2 +- htdocs/user/note.php | 2 +- htdocs/user/notify/card.php | 2 +- htdocs/user/param_ihm.php | 2 +- htdocs/user/perms.php | 2 +- htdocs/user/virtualcard.php | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/htdocs/hrm/skill_tab.php b/htdocs/hrm/skill_tab.php index ce238b6caf4..705b4fc200e 100644 --- a/htdocs/hrm/skill_tab.php +++ b/htdocs/hrm/skill_tab.php @@ -226,7 +226,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea } else { $linkback = '' . $langs->trans("BackToList") . ''; - $morehtmlref = ''; + $morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; diff --git a/htdocs/user/agenda_extsites.php b/htdocs/user/agenda_extsites.php index 13948dc841e..3b9ebd007f6 100644 --- a/htdocs/user/agenda_extsites.php +++ b/htdocs/user/agenda_extsites.php @@ -170,7 +170,7 @@ if ($user->rights->user->user->lire || $user->admin) { $linkback = ''.$langs->trans("BackToList").''; } -$morehtmlref = ''; +$morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; diff --git a/htdocs/user/bank.php b/htdocs/user/bank.php index 3d94d23f682..7040add3950 100644 --- a/htdocs/user/bank.php +++ b/htdocs/user/bank.php @@ -350,7 +350,7 @@ if ($action != 'edit' && $action != 'create') { // If not bank account yet, $ac $linkback = ''.$langs->trans("BackToList").''; } - $morehtmlref = ''; + $morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; diff --git a/htdocs/user/card.php b/htdocs/user/card.php index 9ea05b69805..67ea2174322 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -1433,7 +1433,7 @@ if ($action == 'create' || $action == 'adduserldap') { if ($action != 'edit') { print dol_get_fiche_head($head, 'user', $title, -1, 'user'); - $morehtmlref = ''; + $morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard").' ('.$langs->trans("AddToContacts").')', 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; diff --git a/htdocs/user/clicktodial.php b/htdocs/user/clicktodial.php index 985bf978074..d2f9452bac5 100644 --- a/htdocs/user/clicktodial.php +++ b/htdocs/user/clicktodial.php @@ -106,7 +106,7 @@ if ($id > 0) { $linkback = ''.$langs->trans("BackToList").''; } - $morehtmlref = ''; + $morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; diff --git a/htdocs/user/document.php b/htdocs/user/document.php index 1a18cde92cc..f99eb9982a2 100644 --- a/htdocs/user/document.php +++ b/htdocs/user/document.php @@ -152,7 +152,7 @@ if ($object->id) { $linkback = ''.$langs->trans("BackToList").''; } - $morehtmlref = ''; + $morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; diff --git a/htdocs/user/info.php b/htdocs/user/info.php index 4a49fddf5c2..7804579edd5 100644 --- a/htdocs/user/info.php +++ b/htdocs/user/info.php @@ -80,7 +80,7 @@ if ($user->rights->user->user->lire || $user->admin) { $linkback = ''.$langs->trans("BackToList").''; } -$morehtmlref = ''; +$morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; diff --git a/htdocs/user/note.php b/htdocs/user/note.php index d189226d575..b3ee9398374 100644 --- a/htdocs/user/note.php +++ b/htdocs/user/note.php @@ -94,7 +94,7 @@ if ($id) { $linkback = ''.$langs->trans("BackToList").''; } - $morehtmlref = ''; + $morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; diff --git a/htdocs/user/notify/card.php b/htdocs/user/notify/card.php index e0c01ba5d58..e63269d5fa6 100644 --- a/htdocs/user/notify/card.php +++ b/htdocs/user/notify/card.php @@ -155,7 +155,7 @@ if ($result > 0) { $linkback = ''.$langs->trans("BackToList").''; - $morehtmlref = ''; + $morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; diff --git a/htdocs/user/param_ihm.php b/htdocs/user/param_ihm.php index b4a03fa700e..ee0f1d13914 100644 --- a/htdocs/user/param_ihm.php +++ b/htdocs/user/param_ihm.php @@ -343,7 +343,7 @@ if ($action == 'edit') { $linkback = ''.$langs->trans("BackToList").''; - $morehtmlref = ''; + $morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; diff --git a/htdocs/user/perms.php b/htdocs/user/perms.php index 22acb8ca7d9..23265513730 100644 --- a/htdocs/user/perms.php +++ b/htdocs/user/perms.php @@ -255,7 +255,7 @@ if ($user->hasRight("user", "user", "read") || $user->admin) { $linkback = ''.$langs->trans("BackToList").''; } -$morehtmlref = ''; +$morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; diff --git a/htdocs/user/virtualcard.php b/htdocs/user/virtualcard.php index ed3fbf7beb3..7e13950747c 100644 --- a/htdocs/user/virtualcard.php +++ b/htdocs/user/virtualcard.php @@ -114,7 +114,7 @@ if ($user->rights->user->user->lire || $user->admin) { $linkback = ''.$langs->trans("BackToList").''; } -$morehtmlref = ''; +$morehtmlref = ''; $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); $morehtmlref .= ''; From 79ecc945e9b1351b0364f64a9eb8cfe5780ab2bc Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 14 Jan 2023 11:43:47 +0100 Subject: [PATCH 0811/1128] Fix warning --- htdocs/bookmarks/list.php | 1 + htdocs/core/menus/standard/eldy_menu.php | 2 +- htdocs/core/search_page.php | 4 ++-- htdocs/modulebuilder/template/myobject_list.php | 10 +++++----- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/htdocs/bookmarks/list.php b/htdocs/bookmarks/list.php index 9434cf031a2..2500d40e25d 100644 --- a/htdocs/bookmarks/list.php +++ b/htdocs/bookmarks/list.php @@ -37,6 +37,7 @@ $toselect = GETPOST('toselect', 'array'); $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'bookmarklist'; // To manage different context of search $id = GETPOST("id", 'int'); $optioncss = GETPOST('optioncss', 'alpha'); +$mode = GETPOST('mode', 'aZ09'); // Load variable for pagination $limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit; diff --git a/htdocs/core/menus/standard/eldy_menu.php b/htdocs/core/menus/standard/eldy_menu.php index bbcd0cacf25..596e1e4cc3f 100644 --- a/htdocs/core/menus/standard/eldy_menu.php +++ b/htdocs/core/menus/standard/eldy_menu.php @@ -204,7 +204,7 @@ class MenuManager //if ($tmpmainmenu=='accountancy') { //var_dump($submenu->liste); exit; //} - $nexturl = dol_buildpath($submenu->liste[0]['url'], 1); + $nexturl = dol_buildpath(empty($submenu->liste[0]['url']) ? '' : $submenu->liste[0]['url'], 1); $canonrelurl = preg_replace('/\?.*$/', '', $relurl); $canonnexturl = preg_replace('/\?.*$/', '', $nexturl); diff --git a/htdocs/core/search_page.php b/htdocs/core/search_page.php index 4f6911497e4..2e5cad17c58 100644 --- a/htdocs/core/search_page.php +++ b/htdocs/core/search_page.php @@ -109,8 +109,8 @@ if ($conf->use_javascript_ajax && 1 == 2) { // select2 is not best with smartp $keysearch = 'search_all'; $accesskey = ''; - if (!$accesskeyalreadyassigned[$val['label'][0]]) { - $accesskey = $val['label'][0]; + if (empty($accesskeyalreadyassigned[$val['label'][0]])) { + $accesskey = $val['label'][0]; // First char of string $accesskeyalreadyassigned[$accesskey] = $accesskey; } diff --git a/htdocs/modulebuilder/template/myobject_list.php b/htdocs/modulebuilder/template/myobject_list.php index 29c9205b1f0..1135f6d9498 100644 --- a/htdocs/modulebuilder/template/myobject_list.php +++ b/htdocs/modulebuilder/template/myobject_list.php @@ -87,7 +87,7 @@ require_once __DIR__.'/class/myobject.class.php'; // Load translation files required by the page $langs->loadLangs(array("mymodule@mymodule", "other")); -$action = GETPOST('action', 'aZ09') ? GETPOST('action', 'aZ09') : 'view'; // The action 'add', 'create', 'edit', 'update', 'view', ... +$action = GETPOST('action', 'aZ09') ? GETPOST('action', 'aZ09') : 'view'; // The action 'create'/'add', 'edit'/'update', 'view', ... $massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists) $show_files = GETPOST('show_files', 'int'); // Show files area generated by bulk actions ? $confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation @@ -96,7 +96,7 @@ $toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : str_replace('_', '', basename(dirname(__FILE__)).basename(__FILE__, '.php')); // To manage different context of search $backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print') -$mode = GETPOST('mode', 'aZ'); +$mode = GETPOST('mode', 'aZ'); // The output mode ('list', 'kanban', 'hierarchy', 'calendar', ...) $id = GETPOST('id', 'int'); $ref = GETPOST('ref', 'alpha'); @@ -182,9 +182,9 @@ $arrayfields = dol_sort_array($arrayfields, 'position'); // Set $enablepermissioncheck to 1 to enable a minimum low level of checks $enablepermissioncheck = 0; if ($enablepermissioncheck) { - $permissiontoread = $user->rights->mymodule->myobject->read; - $permissiontoadd = $user->rights->mymodule->myobject->write; - $permissiontodelete = $user->rights->mymodule->myobject->delete; + $permissiontoread = $user->hasRight('mymodule', 'myobject', 'read'); + $permissiontoadd = $user->hasRight('mymodule', 'myobject', 'write'); + $permissiontodelete = $user->hasRight('mymodule', 'myobject', 'delete'); } else { $permissiontoread = 1; $permissiontoadd = 1; From b7c56f5680c74a33809b9999a1ad02d1742c447b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 14 Jan 2023 11:54:05 +0100 Subject: [PATCH 0812/1128] Fix warning --- htdocs/bookmarks/card.php | 8 +++++--- htdocs/bookmarks/list.php | 10 ++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/htdocs/bookmarks/card.php b/htdocs/bookmarks/card.php index 5b22b8918d9..245161ed253 100644 --- a/htdocs/bookmarks/card.php +++ b/htdocs/bookmarks/card.php @@ -188,7 +188,8 @@ if ($action == 'create') { // Visibility / Owner print ''.$langs->trans("Visibility").''; - print img_picto('', 'user').' '.$form->select_dolusers(GETPOSTISSET('userid') ? GETPOST('userid', 'int') : $user->id, 'userid', 0, '', 0, ($user->admin ? '' : array($user->id)), '', 0, 0, 0, '', ($user->admin) ? 1 : 0, '', 'maxwidth300 widthcentpercentminusx'); + print img_picto('', 'user', 'class="pictofixedwidth"'); + print $form->select_dolusers(GETPOSTISSET('userid') ? GETPOST('userid', 'int') : $user->id, 'userid', 0, '', 0, ($user->admin ? '' : array($user->id)), '', 0, 0, 0, '', ($user->admin) ? 1 : 0, '', 'maxwidth300 widthcentpercentminusx'); print ''; // Position @@ -282,12 +283,13 @@ if ($id > 0 && !preg_match('/^add/i', $action)) { // Visibility / owner print ''.$langs->trans("Visibility").''; if ($action == 'edit' && $user->admin) { - print img_picto('', 'user').' '.$form->select_dolusers(GETPOSTISSET('userid') ? GETPOST('userid', 'int') : ($object->fk_user ? $object->fk_user : ''), 'userid', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300 widthcentpercentminusx'); + print img_picto('', 'user', 'class="pictofixedwidth"'); + print $form->select_dolusers(GETPOSTISSET('userid') ? GETPOST('userid', 'int') : ($object->fk_user ? $object->fk_user : ''), 'userid', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300 widthcentpercentminusx'); } else { if ($object->fk_user > 0) { $fuser = new User($db); $fuser->fetch($object->fk_user); - print $fuser->getNomUrl(1); + print $fuser->getNomUrl(-1); } else { print ''.$langs->trans("Everybody").''; } diff --git a/htdocs/bookmarks/list.php b/htdocs/bookmarks/list.php index 2500d40e25d..2adef615a70 100644 --- a/htdocs/bookmarks/list.php +++ b/htdocs/bookmarks/list.php @@ -212,8 +212,6 @@ print_liste_field_titre("Position", $_SERVER["PHP_SELF"], "b.position", "", $par print_liste_field_titre(''); print "\n"; -$cacheOfUsers = array(); - $i = 0; while ($i < min($num, $limit)) { $obj = $db->fetch_object($resql); @@ -268,13 +266,13 @@ while ($i < min($num, $limit)) { // Author print ''; if ($obj->fk_user) { - if (empty($cacheOfUsers[$obj->fk_user])) { + if (empty($conf->cache['users'][$obj->fk_user])) { $tmpuser = new User($db); $tmpuser->fetch($obj->fk_user); - $cacheOfUsers[$obj->fk_user] = $tmpuser; + $conf->cache['users'][$obj->fk_user] = $tmpuser; } - $tmpuser = $cacheOfUsers[$obj->fk_user]; - print $tmpuser->getNomUrl(1); + $tmpuser = $conf->cache['users'][$obj->fk_user]; + print $tmpuser->getNomUrl(-1); } else { print ''.$langs->trans("Everybody").''; if (!$user->admin) { From e4515f01c04763794b3789e5fadcfcf16bf81b9d Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Sat, 14 Jan 2023 11:56:41 +0100 Subject: [PATCH 0813/1128] Fix php 8 warnings --- htdocs/core/lib/ticket.lib.php | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/htdocs/core/lib/ticket.lib.php b/htdocs/core/lib/ticket.lib.php index 5d0d691228e..2c218421543 100644 --- a/htdocs/core/lib/ticket.lib.php +++ b/htdocs/core/lib/ticket.lib.php @@ -91,7 +91,7 @@ function ticket_prepare_head($object) $head[$h][2] = 'tabTicket'; $h++; - if (empty($conf->global->MAIN_DISABLE_CONTACTS_TAB) && empty($user->socid) && isModEnabled("societe")) { + if (!getDolGlobalInt('MAIN_DISABLE_CONTACTS_TAB') && empty($user->socid) && isModEnabled("societe")) { $nbContact = count($object->liste_contact(-1, 'internal')) + count($object->liste_contact(-1, 'external')); $head[$h][0] = DOL_URL_ROOT.'/ticket/contact.php?track_id='.$object->track_id; $head[$h][1] = $langs->trans('ContactsAddresses'); @@ -166,7 +166,7 @@ function showDirectPublicLink($object) } $out = ''; - if (empty($conf->global->TICKET_ENABLE_PUBLIC_INTERFACE)) { + if (!getDolGlobalInt('TICKET_ENABLE_PUBLIC_INTERFACE')) { $langs->load('errors'); $out .= ''.$langs->trans("ErrorPublicInterfaceNotEnabled").''; } else { @@ -223,9 +223,9 @@ function llxHeaderTicket($title, $head = "", $disablejs = 0, $disablehead = 0, $ print '
'; // Define urllogo - if (!empty($conf->global->TICKET_SHOW_COMPANY_LOGO) || !empty($conf->global->TICKET_PUBLIC_INTERFACE_TOPIC)) { + if (getDolGlobalInt('TICKET_SHOW_COMPANY_LOGO') || getDolGlobalString('TICKET_PUBLIC_INTERFACE_TOPIC')) { // Print logo - if (!empty($conf->global->TICKET_SHOW_COMPANY_LOGO)) { + if (getDolGlobalInt('TICKET_SHOW_COMPANY_LOGO')) { $urllogo = DOL_URL_ROOT.'/theme/common/login_logo.png'; if (!empty($mysoc->logo_small) && is_readable($conf->mycompany->dir_output.'/logos/thumbs/'.$mysoc->logo_small)) { @@ -239,28 +239,28 @@ function llxHeaderTicket($title, $head = "", $disablejs = 0, $disablehead = 0, $ } // Output html code for logo - if ($urllogo || !empty($conf->global->TICKET_PUBLIC_INTERFACE_TOPIC)) { + if ($urllogo || getDolGlobalInt('TICKET_PUBLIC_INTERFACE_TOPIC')) { print '
'; print '
'; if ($urllogo) { - print ''; + print ''; print ''; print ''; } - if (!empty($conf->global->TICKET_PUBLIC_INTERFACE_TOPIC)) { - print '
'.($conf->global->TICKET_PUBLIC_INTERFACE_TOPIC ? $conf->global->TICKET_PUBLIC_INTERFACE_TOPIC : $langs->trans("TicketSystem")).''; + if (getDolGlobalInt('TICKET_PUBLIC_INTERFACE_TOPIC')) { + print '
'.(getDolGlobalString('TICKET_PUBLIC_INTERFACE_TOPIC') ? getDolGlobalString('TICKET_PUBLIC_INTERFACE_TOPIC') : $langs->trans("TicketSystem")).''; } print '
'; - if (empty($conf->global->MAIN_HIDE_POWERED_BY)) { + if (!getDolGlobalInt('MAIN_HIDE_POWERED_BY')) { print ''; } print '
'; } - if (!empty($conf->global->TICKET_IMAGE_PUBLIC_INTERFACE)) { + if (getDolGlobalInt('TICKET_IMAGE_PUBLIC_INTERFACE')) { print '
'; - print ''; + print ''; print '
'; } From 236b3aa9e89d2049c186d16d79f0612be21a7476 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 14 Jan 2023 12:28:44 +0100 Subject: [PATCH 0814/1128] Revert default type of hooks. Default is now 'addreplace' hooks (and exception become 'output' hooks, that become deprecated). --- ChangeLog | 5 +- htdocs/core/class/hookmanager.class.php | 116 ++++++------------ htdocs/document.php | 5 +- htdocs/main.inc.php | 6 +- htdocs/mrp/index.php | 3 +- .../variants/class/ProductAttribute.class.php | 2 +- .../productattributevalueline_edit.tpl.php | 2 +- htdocs/webhook/target_card.php | 4 +- 8 files changed, 54 insertions(+), 89 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3f30b2a2f99..1a3e96b18ce 100644 --- a/ChangeLog +++ b/ChangeLog @@ -11,8 +11,9 @@ NEW: PHP 8.2 compatibility: WARNING: Following changes may create regressions for some external modules, but were necessary to make Dolibarr better: -* The deprecated method escapeunderscore() of database handlers has been removed. You must use escapeforlike instead. -* The method nb_expedition() has been renamed into countNbOfShipments() +* The deprecated method "escapeunderscore()" of database handlers has been removed. You must use "escapeforlike()" instead. +* The method "nb_expedition()" has been renamed into "countNbOfShipments()" +* Revert default type of hooks. Default is now 'addreplace' hooks (and exception become 'output' hooks, that become deprecated). diff --git a/htdocs/core/class/hookmanager.class.php b/htdocs/core/class/hookmanager.class.php index 0659240c8c7..7a6af7b88ec 100644 --- a/htdocs/core/class/hookmanager.class.php +++ b/htdocs/core/class/hookmanager.class.php @@ -162,84 +162,44 @@ class HookManager //dol_syslog(get_class($this).'::executeHooks method='.$method." action=".$action." context=".$parameters['context']); // Define type of hook ('output' or 'addreplace'). - // TODO Remove hooks with type 'output' (exemple getNomUrl). All hooks must be converted into 'addreplace' hooks. - $hooktype = 'output'; - if (in_array( - $method, - array( - 'addCalendarChoice', - 'addCalendarView', - 'addMoreActionsButtons', - 'addMoreMassActions', - 'addSearchEntry', - 'addStatisticLine', - 'addSectionECMAuto', - 'checkSecureAccess', - 'createDictionaryFieldlist', - 'editDictionaryFieldlist', - 'getFormMail', - 'deleteFile', - 'doActions', - 'doMassActions', - 'formatEvent', - 'formConfirm', - 'formCreateThirdpartyOptions', - 'formObjectOptions', - 'formattachOptions', - 'formBuilddocLineOptions', - 'formatNotificationMessage', - 'formConfirm', - 'getAccessForbiddenMessage', - 'getDirList', - 'hookGetEntity', - 'getFormMail', - 'getFormatedCustomerRef', - 'getFormatedSupplierRef', - 'getIdProfUrl', - 'getInputIdProf', - 'isPaymentOK', - 'llxFooter', - 'menuDropdownQuickaddItems', - 'menuLeftMenuItems', - 'moveUploadedFile', - 'moreHtmlStatus', - 'pdf_build_address', - 'pdf_writelinedesc', - 'pdf_getlinenum', - 'pdf_getlineref', - 'pdf_getlineref_supplier', - 'pdf_getlinevatrate', - 'pdf_getlineupexcltax', - 'pdf_getlineupwithtax', - 'pdf_getlineqty', - 'pdf_getlineqty_asked', - 'pdf_getlineqty_shipped', - 'pdf_getlineqty_keeptoship', - 'pdf_getlineunit', - 'pdf_getlineremisepercent', - 'pdf_getlineprogress', - 'pdf_getlinetotalexcltax', - 'pdf_getlinetotalwithtax', - 'paymentsupplierinvoices', - 'printAddress', - 'printEmail', - 'printSearchForm', - 'printTabsHead', - 'printObjectLine', - 'printObjectSubLine', - 'restrictedArea', - 'sendMail', - 'sendMailAfter', - 'showOptionals', - 'showLinkToObjectBlock', - 'setContentSecurityPolicy', - 'setHtmlTitle', - 'completeTabsHead', - 'formDolBanner', - 'displayMarginInfos', - ) - )) { - $hooktype = 'addreplace'; + $hooktype = 'addreplace'; + // TODO Remove hooks with type 'output' (exemple createFrom). All hooks must be converted into 'addreplace' hooks. + if (!in_array($method, array( + 'createFrom', + 'dashboardMembers', + 'dashboardEmailings', + 'dashboardPropals', + 'dashboardPropals', + 'dashboardCommercials', + 'dashboardOrders', + 'dashboardSpecialBills', + 'dashboardAccountancy', + 'dashboardContracts', + 'dashboardDonation', + 'dashboardWarehouseSendings', + 'dashboardExpenseReport', + 'dashboardInterventions', + 'dashboardOrdersSuppliers', + 'dashboardHRM', + 'dashboardMRP', + 'dashboardOpensurvey', + 'dashboardWarehouse', + 'dashboardProductServices', + 'dashboardActivities', + 'dashboardProjects', + 'dashboardWarehouseReceptions', + 'dashboardThirdparties', + 'dashboardSupplierProposal', + 'dashboardTickets', + 'dashboardUsersGroups', + 'insertExtraHeader', + 'insertExtraFooter', + 'printLeftBlock', + 'formAddObjectLine', + 'formBuilddocOption', + 'showSocinfoOnPrint' + ))) { + $hooktype = 'output'; } // Init return properties diff --git a/htdocs/document.php b/htdocs/document.php index 4f6652fafda..eccf49de0be 100644 --- a/htdocs/document.php +++ b/htdocs/document.php @@ -286,9 +286,10 @@ $hookmanager->initHooks(array('document')); $parameters = array('ecmfile' => $ecmfile, 'modulepart' => $modulepart, 'original_file' => $original_file, 'entity' => $entity, 'refname' => $refname, 'fullpath_original_file' => $fullpath_original_file, 'filename' => $filename, 'fullpath_original_file_osencoded' => $fullpath_original_file_osencoded); -$reshook = $hookmanager->executeHooks('downloadDocument', $parameters); // Note that $action and $object may have been +$object = new stdClass(); +$reshook = $hookmanager->executeHooks('downloadDocument', $parameters, $object, $action); // Note that $action and $object may have been if ($reshook < 0) { - $errors = $hookmanager->error.(is_array($hookmanager->errors) ? (!empty($hookmanager->error) ? ', ' : '').join($separator, $hookmanager->errors) : ''); + $errors = $hookmanager->error.(is_array($hookmanager->errors) ? (!empty($hookmanager->error) ? ', ' : '').join(', ', $hookmanager->errors) : ''); dol_syslog("document.php - Errors when executing the hook 'downloadDocument' : ".$errors); print "ErrorDownloadDocumentHooks: ".$errors; exit; diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 9fec72e2e86..549c72157a6 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -2603,11 +2603,11 @@ function printDropdownQuickadd() $parameters = array(); $hook_items = $items; $reshook = $hookmanager->executeHooks('menuDropdownQuickaddItems', $parameters, $hook_items); // Note that $action and $object may have been modified by some hooks - if (is_numeric($reshook) && !empty($hookmanager->results) && is_array($hookmanager->results)) { + if (is_numeric($reshook) && !empty($hookmanager->resArray) && is_array($hookmanager->resArray)) { if ($reshook == 0) { - $items['items'] = array_merge($items['items'], $hookmanager->results); // add + $items['items'] = array_merge($items['items'], $hookmanager->resArray); // add } else { - $items = $hookmanager->results; // replace + $items = $hookmanager->resArray; // replace } // Sort menu items by 'position' value diff --git a/htdocs/mrp/index.php b/htdocs/mrp/index.php index d7929ce1422..835a06cc7c6 100644 --- a/htdocs/mrp/index.php +++ b/htdocs/mrp/index.php @@ -249,11 +249,12 @@ if ($resql) { print '
'; +$object = new stdClass(); $parameters = array( //'type' => $type, 'user' => $user, ); -$reshook = $hookmanager->executeHooks('dashboardMRP', $parameters); +$reshook = $hookmanager->executeHooks('dashboardMRP', $parameters, $object); // End of page llxFooter(); diff --git a/htdocs/variants/class/ProductAttribute.class.php b/htdocs/variants/class/ProductAttribute.class.php index f89adcce0f8..74ff3fe238c 100644 --- a/htdocs/variants/class/ProductAttribute.class.php +++ b/htdocs/variants/class/ProductAttribute.class.php @@ -919,7 +919,7 @@ class ProductAttribute extends CommonObject $parameters = array('rowid' => $rowid, 'position' => $position); $action = ''; $reshook = $hookmanager->executeHooks('afterPositionOfAttributeUpdate', $parameters, $this, $action); - return 1; + return ($reshook >= 0 ? 1 : -1); } } diff --git a/htdocs/variants/tpl/productattributevalueline_edit.tpl.php b/htdocs/variants/tpl/productattributevalueline_edit.tpl.php index 3b842962258..60fc81c7418 100644 --- a/htdocs/variants/tpl/productattributevalueline_edit.tpl.php +++ b/htdocs/variants/tpl/productattributevalueline_edit.tpl.php @@ -54,7 +54,7 @@ $coldisplay++; ref); ?>"> $line); + $parameters = array('line' => $line); $reshook = $hookmanager->executeHooks('formEditProductOptions', $parameters, $object, $action); if (!empty($hookmanager->resPrint)) { print $hookmanager->resPrint; diff --git a/htdocs/webhook/target_card.php b/htdocs/webhook/target_card.php index 83f2008703f..a35f04d0138 100644 --- a/htdocs/webhook/target_card.php +++ b/htdocs/webhook/target_card.php @@ -430,7 +430,9 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea $parameters = array(); $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook - if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + if ($reshook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + } if (empty($reshook)) $object->formAddObjectLine(1, $mysoc, $soc); } From f0f3deb6198130d6e8a150021db0a6422534acbe Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 14 Jan 2023 13:06:13 +0100 Subject: [PATCH 0815/1128] Debug v17 --- htdocs/compta/bank/class/account.class.php | 6 +- htdocs/user/bank.php | 89 +++++++-------------- htdocs/user/class/userbankaccount.class.php | 61 +++++++++++++- htdocs/user/notify/card.php | 6 +- 4 files changed, 95 insertions(+), 67 deletions(-) diff --git a/htdocs/compta/bank/class/account.class.php b/htdocs/compta/bank/class/account.class.php index 4aea92a510e..74db4005126 100644 --- a/htdocs/compta/bank/class/account.class.php +++ b/htdocs/compta/bank/class/account.class.php @@ -1077,8 +1077,6 @@ class Account extends CommonObject */ public function delete(User $user = null) { - global $conf; - $error = 0; $this->db->begin(); @@ -1096,8 +1094,8 @@ class Account extends CommonObject } if (!$error) { - $sql = "DELETE FROM ".MAIN_DB_PREFIX."bank_account"; - $sql .= " WHERE rowid = ".((int) $this->rowid); + $sql = "DELETE FROM ".MAIN_DB_PREFIX.$this->table_element; + $sql .= " WHERE rowid = ".((int) $this->id); dol_syslog(get_class($this)."::delete", LOG_DEBUG); $result = $this->db->query($sql); diff --git a/htdocs/user/bank.php b/htdocs/user/bank.php index fb795ecc6e4..1552ff94d82 100644 --- a/htdocs/user/bank.php +++ b/htdocs/user/bank.php @@ -25,7 +25,7 @@ /** * \file htdocs/user/bank.php * \ingroup HRM - * \brief Tab for HRM + * \brief Tab for HR and bank */ // Load Dolibarr environment @@ -79,7 +79,6 @@ if (empty($account->userid)) { $account->userid = $object->id; } - // Define value to know what current user can do on users $canadduser = (!empty($user->admin) || $user->rights->user->user->creer || $user->rights->hrm->write_personal_information->write); $canreaduser = (!empty($user->admin) || $user->rights->user->user->lire || $user->rights->hrm->read_personal_information->read); @@ -143,49 +142,6 @@ if ($action == 'add' && !$cancel && $permissiontoaddbankaccount) { if ($action == 'update' && !$cancel && $permissiontoaddbankaccount) { $account->userid = $object->id; - /* - if ($action == 'update' && !$cancel) - { - require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; - - if ($canedituser) // Case we can edit all field - { - $error = 0; - - if (!$error) - { - $objectuser->fetch($id); - - $objectuser->oldcopy = dol_clone($objectuser); - - $db->begin(); - - $objectuser->default_range = GETPOST('default_range'); - $objectuser->default_c_exp_tax_cat = GETPOST('default_c_exp_tax_cat'); - - if (!$error) { - $ret = $objectuser->update($user); - if ($ret < 0) { - $error++; - if ($db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS') { - $langs->load("errors"); - setEventMessages($langs->trans("ErrorLoginAlreadyExists", $objectuser->login), null, 'errors'); - } else { - setEventMessages($objectuser->error, $objectuser->errors, 'errors'); - } - } - } - - if (!$error && !count($objectuser->errors)) { - setEventMessages($langs->trans("UserModified"), null, 'mesgs'); - $db->commit(); - } else { - $db->rollback(); - } - } - } - }*/ - $account->bank = GETPOST('bank', 'alpha'); $account->label = GETPOST('label', 'alpha'); $account->courant = GETPOST('courant', 'alpha'); @@ -214,6 +170,18 @@ if ($action == 'update' && !$cancel && $permissiontoaddbankaccount) { } } +if ($action == 'delete_confirmed' && !$cancel && $permissiontoaddbankaccount) { + $result = $account->delete($user); + if ($result < 0) { + setEventMessages($account->error, $account->errors, 'errors'); + } else { + setEventMessages($langs->trans("RecordDeleted"), null, 'mesgs'); + header("Location: ".DOL_URL_ROOT.'/user/bank.php?id='.$object->id); + exit; + } + $action = ''; +} + // update birth if ($action == 'setbirth' && $canadduser && !$cancel) { $object->birth = dol_mktime(0, 0, 0, GETPOST('birthmonth', 'int'), GETPOST('birthday', 'int'), GETPOST('birthyear', 'int')); @@ -819,32 +787,32 @@ if ($action != 'edit' && $action != 'create') { // If not bank account yet, $ac if ($account->id > 0) { print ''; // Label - print ''.$account->label.''; + print ''.dol_escape_htmltag($account->label).''; // Bank name - print ''.$account->bank.''; + print ''.dol_escape_htmltag($account->bank).''; // Account number print ''; - $string = ''; + $stringescaped = ''; foreach ($account->getFieldsToShow() as $val) { if ($val == 'BankCode') { - $string .= $account->code_banque.' '; + $stringescaped .= dol_escape_htmltag($account->code_banque).' '; } elseif ($val == 'BankAccountNumber') { - $string .= $account->number.' '; + $stringescaped .= dol_escape_htmltag($account->number).' '; } elseif ($val == 'DeskCode') { - $string .= $account->code_guichet.' '; + $stringescaped .= dol_escape_htmltag($account->code_guichet).' '; } elseif ($val == 'BankAccountNumberKey') { - $string .= $account->cle_rib.' '; + $stringescaped .= dol_escape_htmltag($account->cle_rib).' '; } } if (!empty($account->label) && $account->number) { if (!checkBanForAccount($account)) { - $string .= ' '.img_picto($langs->trans("ValueIsNotValid"), 'warning'); + $stringescaped .= ' '.img_picto($langs->trans("ValueIsNotValid"), 'warning'); } else { - $string .= ' '.img_picto($langs->trans("ValueIsValid"), 'info'); + $stringescaped .= ' '.img_picto($langs->trans("ValueIsValid"), 'info'); } } - print $string; + print $stringescaped; print ''; // IBAN print ''.getIbanHumanReadable($account); @@ -855,7 +823,8 @@ if ($action != 'edit' && $action != 'create') { // If not bank account yet, $ac } print ''; // BIC - print ''.$account->bic; + print ''; + print dol_escape_htmltag($account->bic); if (!empty($account->bic)) { if (!checkSwiftForAccount($account)) { print ' '.img_picto($langs->trans("SwiftNotValid"), 'warning'); @@ -869,9 +838,13 @@ if ($action != 'edit' && $action != 'create') { // If not bank account yet, $ac // Edit/Delete print ''; if ($permissiontoaddbankaccount) { - print ''; + print ''; print img_picto($langs->trans("Modify"), 'edit'); print ''; + + print ''; + print img_picto($langs->trans("Delete"), 'delete'); + print ''; } print ''; @@ -880,7 +853,7 @@ if ($action != 'edit' && $action != 'create') { // If not bank account yet, $ac if ($account->id == 0) { - $colspan = 6; + $colspan = 7; print ''.$langs->trans("NoBANRecord").''; } diff --git a/htdocs/user/class/userbankaccount.class.php b/htdocs/user/class/userbankaccount.class.php index 6e9cc8e52af..857f60d55e5 100644 --- a/htdocs/user/class/userbankaccount.class.php +++ b/htdocs/user/class/userbankaccount.class.php @@ -117,8 +117,6 @@ class UserBankAccount extends Account */ public function update(User $user = null, $notrigger = 0) { - global $conf; - if (!$this->id) { $this->create(); } @@ -193,7 +191,7 @@ class UserBankAccount extends Account $obj = $this->db->fetch_object($resql); $this->id = $obj->rowid; - $this->userid = $obj->fk_soc; + $this->userid = $obj->fk_user; $this->bank = $obj->bank; $this->code_banque = $obj->code_banque; $this->code_guichet = $obj->code_guichet; @@ -226,6 +224,63 @@ class UserBankAccount extends Account } } + /** + * Delete user bank account from database + * + * @param User $user User deleting + * @return int <0 if KO, >0 if OK + */ + public function delete(User $user = null) + { + $error = 0; + + $this->db->begin(); + + // Delete link between tag and bank account + /* + if (!$error) { + $sql = "DELETE FROM ".MAIN_DB_PREFIX."categorie_account"; + $sql .= " WHERE fk_account = ".((int) $this->id); + + $resql = $this->db->query($sql); + if (!$resql) { + $error++; + $this->error = "Error ".$this->db->lasterror(); + } + } + */ + + if (!$error) { + $sql = "DELETE FROM ".MAIN_DB_PREFIX.$this->table_element; + $sql .= " WHERE rowid = ".((int) $this->id); + + dol_syslog(get_class($this)."::delete", LOG_DEBUG); + $result = $this->db->query($sql); + if ($result) { + // Remove extrafields + /* + if (!$error) { + $result = $this->deleteExtraFields(); + if ($result < 0) { + $error++; + dol_syslog(get_class($this)."::delete error -4 ".$this->error, LOG_ERR); + } + }*/ + } else { + $error++; + $this->error = "Error ".$this->db->lasterror(); + } + } + + if (!$error) { + $this->db->commit(); + return 1; + } else { + $this->db->rollback(); + return -1; + } + } + /** * Return RIB * diff --git a/htdocs/user/notify/card.php b/htdocs/user/notify/card.php index e20d7be3d9a..f55a42ca159 100644 --- a/htdocs/user/notify/card.php +++ b/htdocs/user/notify/card.php @@ -332,7 +332,8 @@ if ($result > 0) { $userstatic->email = $obj->email; $userstatic->statut = $obj->status; - print ''.$userstatic->getNomUrl(1); + print ''; + print ''.$userstatic->getNomUrl(1); if ($obj->type == 'email') { if (isValidEmail($obj->email)) { print ' <'.$obj->email.'>'; @@ -359,8 +360,9 @@ if ($result > 0) { $i++; } $db->free($resql); + } else { + print ''.$langs->trans("None").''; } - // List of notifications enabled for fixed email /* foreach($conf->global as $key => $val) { From f9158c9a0201b23906458fd881f1bf2056f178f1 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Sat, 14 Jan 2023 14:47:58 +0100 Subject: [PATCH 0816/1128] Fix php 8 warnings --- htdocs/societe/paymentmodes.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/societe/paymentmodes.php b/htdocs/societe/paymentmodes.php index 744d2763b71..de2c45381cb 100644 --- a/htdocs/societe/paymentmodes.php +++ b/htdocs/societe/paymentmodes.php @@ -6,7 +6,7 @@ * Copyright (C) 2013 Peter Fontaine * Copyright (C) 2015-2016 Marcos García * Copyright (C) 2017 Ferran Marcet - * Copyright (C) 2018-2021 Thibault FOUCART + * Copyright (C) 2018-2023 Thibault FOUCART * Copyright (C) 2021 Alexandre Spangaro * * This program is free software; you can redistribute it and/or modify @@ -1378,7 +1378,7 @@ if ($socid && $action != 'edit' && $action != 'create' && $action != 'editcard' if (is_array($currencybalance)) { foreach ($currencybalance as $cpt) { - print ''.$langs->trans("Currency".strtoupper($cpt['currency'])).''.price($cpt['available'], 0, '', 1, - 1, - 1, strtoupper($cpt['currency'])).''.price($cpt->pending, 0, '', 1, - 1, - 1, strtoupper($cpt['currency'])).''.price($cpt['available'] + $cpt->pending, 0, '', 1, - 1, - 1, strtoupper($cpt['currency'])).''; + print ''.$langs->trans("Currency".strtoupper($cpt['currency'])).''.price($cpt['available'], 0, '', 1, - 1, - 1, strtoupper($cpt['currency'])).''.price(isset($cpt->pending)?$cpt->pending:0, 0, '', 1, - 1, - 1, strtoupper($cpt['currency'])).''.price($cpt['available'] + (isset($cpt->pending)?$cpt->pending:0), 0, '', 1, - 1, - 1, strtoupper($cpt['currency'])).''; } } From 3e273d40042a7fd9f3769a25da155566d9dbc238 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 14 Jan 2023 15:11:15 +0100 Subject: [PATCH 0817/1128] Debug v17 --- htdocs/accountancy/expensereport/list.php | 1 - htdocs/accountancy/journal/bankjournal.php | 12 +- htdocs/compta/accounting-files.php | 5 + htdocs/compta/stats/byratecountry.php | 4 +- htdocs/compta/stats/casoc.php | 14 +- htdocs/compta/stats/index.php | 12 +- .../class/conferenceorbooth.class.php | 10 +- .../conferenceorbooth_list.php | 204 ++++++++++++------ htdocs/holiday/list.php | 23 +- htdocs/holiday/month_report.php | 75 ++++--- htdocs/hrm/class/establishment.class.php | 31 +-- .../knowledgerecord_list.php | 2 +- .../modulebuilder/template/myobject_list.php | 1 + .../recruitmentcandidature_agenda.php | 1 + .../recruitmentjobposition_agenda.php | 9 +- htdocs/user/agenda_extsites.php | 30 +++ htdocs/user/perms.php | 17 ++ 17 files changed, 311 insertions(+), 140 deletions(-) diff --git a/htdocs/accountancy/expensereport/list.php b/htdocs/accountancy/expensereport/list.php index 9cfbd940875..25b86a8d527 100644 --- a/htdocs/accountancy/expensereport/list.php +++ b/htdocs/accountancy/expensereport/list.php @@ -443,7 +443,6 @@ if ($result) { $expensereport_static->id = $objp->erid; $userstatic->id = $objp->userid; - $userstatic->ref = $objp->label; $userstatic->login = $objp->login; $userstatic->statut = $objp->statut; $userstatic->email = $objp->email; diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php index 699002395ab..c23392cada0 100644 --- a/htdocs/accountancy/journal/bankjournal.php +++ b/htdocs/accountancy/journal/bankjournal.php @@ -349,7 +349,11 @@ if ($result) { $societestatic->email = $tabcompany[$obj->rowid]['email']; $tabpay[$obj->rowid]["soclib"] = $societestatic->getNomUrl(1, '', 30); if ($compta_soc) { - $tabtp[$obj->rowid][$compta_soc] += $amounttouse; + if (empty($tabtp[$obj->rowid][$compta_soc])) { + $tabtp[$obj->rowid][$compta_soc] = $amounttouse; + } else { + $tabtp[$obj->rowid][$compta_soc] += $amounttouse; + } } } elseif ($links[$key]['type'] == 'user') { $userstatic->id = $links[$key]['url_id']; @@ -510,7 +514,11 @@ if ($result) { } } - $tabbq[$obj->rowid][$compta_bank] += $amounttouse; + if (empty($tabbq[$obj->rowid][$compta_bank])) { + $tabbq[$obj->rowid][$compta_bank] = $amounttouse; + } else { + $tabbq[$obj->rowid][$compta_bank] += $amounttouse; + } // If no links were found to know the amount on thirdparty, we try to guess it. // This may happens on bank entries without the links lines to 'company'. diff --git a/htdocs/compta/accounting-files.php b/htdocs/compta/accounting-files.php index 2f2f5816ae1..af8d626eba1 100644 --- a/htdocs/compta/accounting-files.php +++ b/htdocs/compta/accounting-files.php @@ -376,6 +376,9 @@ if (($action == 'searchfiles' || $action == 'dl')) { $nofile['country_code'] = $objd->country_code; $nofile['vatnum'] = $objd->vatnum; $nofile['sens'] = $objd->sens; + $nofile['currency'] = $objd->currency; + $nofile['link'] = ''; + $nofile['name'] = ''; $filesarray[$nofile['item'].'_'.$nofile['id']] = $nofile; } else { @@ -396,6 +399,7 @@ if (($action == 'searchfiles' || $action == 'dl')) { $file['country_code'] = $objd->country_code; $file['vatnum'] = $objd->vatnum; $file['sens'] = $objd->sens; + $file['currency'] = $objd->currency; // Save record into array (only the first time it is found) if (empty($filesarray[$file['item'].'_'.$file['id']])) { @@ -415,6 +419,7 @@ if (($action == 'searchfiles' || $action == 'dl')) { 'relpathnamelang' => $langs->trans($file['item']).'/'.$file['name'], 'modulepart' => $modulepart, 'subdir' => $subdir, + 'currency' => $file['currency'] ); //var_dump($file['item'].'_'.$file['id']); //var_dump($filesarray[$file['item'].'_'.$file['id']]['files']); diff --git a/htdocs/compta/stats/byratecountry.php b/htdocs/compta/stats/byratecountry.php index fb8ad4de1a5..b9dd6c7429d 100644 --- a/htdocs/compta/stats/byratecountry.php +++ b/htdocs/compta/stats/byratecountry.php @@ -461,9 +461,9 @@ if ($modecompta == 'CREANCES-DETTES') { $j -= 12; } $monthj = 'month'.str_pad($j, 2, '0', STR_PAD_LEFT); - print ''.price($totalpermonth[$j]).''; + print ''.price(empty($totalpermonth[$j]) ? 0 : $totalpermonth[$j]).''; } - print ''.price($totalpermonth['total']).''; + print ''.price(empty($totalpermonth['total']) ? 0 : $totalpermonth['total']).''; print ''; } else { print $db->lasterror(); // Show last sql error diff --git a/htdocs/compta/stats/casoc.php b/htdocs/compta/stats/casoc.php index d24e5a5452a..b499ca17c71 100644 --- a/htdocs/compta/stats/casoc.php +++ b/htdocs/compta/stats/casoc.php @@ -406,12 +406,16 @@ if ($modecompta == "RECETTES-DEPENSES") { while ($i < $num) { $obj = $db->fetch_object($result); - $amount[$obj->rowid] += $obj->amount_ttc; + if (empty($amount[$obj->socid])) { + $amount[$obj->socid] = $obj->amount_ttc; + } else { + $amount[$obj->socid] += $obj->amount_ttc; + } - $name[$obj->rowid] = $obj->name; - $address_zip[$obj->rowid] = $obj->zip; - $address_town[$obj->rowid] = $obj->town; - $address_pays[$obj->rowid] = getCountry($obj->fk_pays); + $name[$obj->socid] = $obj->name; + $address_zip[$obj->socid] = ''; + $address_town[$obj->socid] = ''; + $address_pays[$obj->socid] = 0; $catotal += $obj->amount_ttc; diff --git a/htdocs/compta/stats/index.php b/htdocs/compta/stats/index.php index 058fba33177..7d70bc10527 100644 --- a/htdocs/compta/stats/index.php +++ b/htdocs/compta/stats/index.php @@ -577,7 +577,7 @@ for ($annee = $year_start; $annee <= $year_end; $annee++) { // Montant total HT if ($total_ht[$annee] || ($annee >= $minyear && $annee <= max($nowyear, $maxyear))) { print ''; - print ($total_ht[$annee] ?price($total_ht[$annee]) : "0"); + print (empty($total_ht[$annee]) ? '0' : price($total_ht[$annee])); print ""; } else { print ' '; @@ -587,7 +587,7 @@ for ($annee = $year_start; $annee <= $year_end; $annee++) { // Total amount if (!empty($total[$annee]) || ($annee >= $minyear && $annee <= max($nowyear, $maxyear))) { print ''; - print ($total[$annee] ?price($total[$annee]) : "0"); + print (empty($total[$annee]) ? '0' : price($total[$annee])); print ""; } else { print ' '; @@ -595,19 +595,19 @@ for ($annee = $year_start; $annee <= $year_end; $annee++) { // Pourcentage total if ($annee > $minyear && $annee <= max($nowyear, $maxyear)) { - if ($total[$annee - 1] && $total[$annee]) { + if (!empty($total[$annee - 1]) && !empty($total[$annee])) { $percent = (round(($total[$annee] - $total[$annee - 1]) / $total[$annee - 1], 4) * 100); print ''; print ($percent >= 0 ? "+$percent" : "$percent").'%'; print ''; } - if ($total[$annee - 1] && !$total[$annee]) { + if (!empty($total[$annee - 1]) && empty($total[$annee])) { print '-100%'; } - if (!$total[$annee - 1] && $total[$annee]) { + if (empty($total[$annee - 1]) && !empty($total[$annee])) { print '+'.$langs->trans('Inf').'%'; } - if (!$total[$annee - 1] && !$total[$annee]) { + if (empty($total[$annee - 1]) && empty($total[$annee])) { print '+0%'; } } else { diff --git a/htdocs/eventorganization/class/conferenceorbooth.class.php b/htdocs/eventorganization/class/conferenceorbooth.class.php index 556443a25e8..db0928efc7d 100644 --- a/htdocs/eventorganization/class/conferenceorbooth.class.php +++ b/htdocs/eventorganization/class/conferenceorbooth.class.php @@ -104,12 +104,12 @@ class ConferenceOrBooth extends ActionComm */ public $fields = array( 'id' => array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>'1', 'position'=>1, 'notnull'=>1, 'visible'=>0, 'noteditable'=>'1', 'index'=>1, 'css'=>'left', 'comment'=>"Id"), - 'ref' => array('type'=>'integer', 'label'=>'Ref', 'enabled'=>'1', 'position'=>1, 'notnull'=>1, 'visible'=>2, 'noteditable'=>'1', 'index'=>1, 'css'=>'left', 'comment'=>"Id"), - 'label' => array('type'=>'varchar(255)', 'label'=>'Label', 'enabled'=>'1', 'position'=>30, 'notnull'=>0, 'visible'=>1, 'searchall'=>1, 'css'=>'minwidth300', 'csslist'=>'tdoverflowmax125', 'help'=>"OrganizationEvenLabelName", 'showoncombobox'=>'1',), - 'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php:1:status=1 AND entity IN (__SHARED_ENTITIES__)', 'label'=>'ThirdParty', 'enabled'=>'$conf->societe->enabled', 'position'=>50, 'notnull'=>-1, 'visible'=>1, 'index'=>1, 'help'=>"OrganizationEventLinkToThirdParty", 'picto'=>'company', 'css'=>'tdoverflowmax150 maxwidth500'), - 'fk_project' => array('type'=>'integer:Project:projet/class/project.class.php:1:t.usage_organize_event=1', 'label'=>'Project', 'enabled'=>"isModEnabled('project')", 'position'=>52, 'notnull'=>-1, 'visible'=>-1, 'index'=>1, 'picto'=>'project', 'css'=>'tdoverflowmax150 maxwidth500'), + 'ref' => array('type'=>'integer', 'label'=>'Ref', 'enabled'=>'1', 'position'=>1, 'notnull'=>1, 'visible'=>2, 'noteditable'=>'1', 'index'=>1, 'css'=>'left', 'csslist'=>'left', 'comment'=>"Id"), + 'label' => array('type'=>'varchar(255)', 'label'=>'Label', 'enabled'=>'1', 'position'=>30, 'notnull'=>1, 'visible'=>1, 'searchall'=>1, 'css'=>'minwidth300', 'csslist'=>'tdoverflowmax125', 'help'=>"OrganizationEvenLabelName", 'showoncombobox'=>'1', 'autofocusoncreate'=>1), + 'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php:1:status=1 AND entity IN (__SHARED_ENTITIES__)', 'label'=>'ThirdParty', 'enabled'=>'$conf->societe->enabled', 'position'=>50, 'notnull'=>-1, 'visible'=>1, 'index'=>1, 'help'=>"OrganizationEventLinkToThirdParty", 'picto'=>'company', 'css'=>'tdoverflowmax150 maxwidth500', 'csslist'=>'width100'), + 'fk_project' => array('type'=>'integer:Project:projet/class/project.class.php:1:t.usage_organize_event=1', 'label'=>'Project', 'enabled'=>"isModEnabled('project')", 'position'=>52, 'notnull'=>-1, 'visible'=>-1, 'index'=>1, 'picto'=>'project', 'css'=>'tdoverflowmax150 maxwidth500', 'csslist'=>'width100'), 'note' => array('type'=>'text', 'label'=>'Description', 'enabled'=>'1', 'position'=>60, 'notnull'=>0, 'visible'=>1), - 'fk_action' => array('type'=>'sellist:c_actioncomm:libelle:id::module LIKE (\'%@eventorganization\')', 'label'=>'Format', 'enabled'=>'1', 'position'=>60, 'notnull'=>1, 'visible'=>1, 'css'=>'width300'), + 'fk_action' => array('type'=>'sellist:c_actioncomm:libelle:id::module LIKE (\'%@eventorganization\')', 'label'=>'Format', 'enabled'=>'1', 'position'=>60, 'notnull'=>1, 'visible'=>1, 'css'=>'width100'), 'datep' => array('type'=>'datetime', 'label'=>'DateStart', 'enabled'=>'1', 'position'=>70, 'notnull'=>0, 'visible'=>1, 'showoncombobox'=>'2',), 'datep2' => array('type'=>'datetime', 'label'=>'DateEnd', 'enabled'=>'1', 'position'=>71, 'notnull'=>0, 'visible'=>1, 'showoncombobox'=>'3',), 'datec' => array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>'1', 'position'=>500, 'notnull'=>1, 'visible'=>-2,), diff --git a/htdocs/eventorganization/conferenceorbooth_list.php b/htdocs/eventorganization/conferenceorbooth_list.php index dd7bfd93a47..1dd77122384 100644 --- a/htdocs/eventorganization/conferenceorbooth_list.php +++ b/htdocs/eventorganization/conferenceorbooth_list.php @@ -25,17 +25,14 @@ // Load Dolibarr environment require '../main.inc.php'; - require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/project.lib.php'; - require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; require_once DOL_DOCUMENT_ROOT.'/eventorganization/class/conferenceorbooth.class.php'; require_once DOL_DOCUMENT_ROOT.'/eventorganization/class/conferenceorboothattendee.class.php'; require_once DOL_DOCUMENT_ROOT.'/eventorganization/lib/eventorganization_conferenceorbooth.lib.php'; - require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; global $dolibarr_main_url_root; @@ -56,6 +53,7 @@ $toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'conferenceorboothlist'; // To manage different context of search $backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print') +$mode = GETPOST('mode', 'aZ'); // The output mode ('list', 'kanban', 'hierarchy', 'calendar', ...) $id = GETPOST('id', 'int'); $projectid = GETPOST('projectid', 'int'); @@ -67,8 +65,9 @@ $sortfield = GETPOST('sortfield', 'aZ09comma'); $sortorder = GETPOST('sortorder', 'aZ09comma'); $page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int'); if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) { + // If $page is not defined, or '' or -1 or if we click on clear filters $page = 0; -} // If $page is not defined, or '' or -1 or if we click on clear filters +} $offset = $limit * $page; $pageprev = $page - 1; $pagenext = $page + 1; @@ -120,11 +119,11 @@ $arrayfields = array(); foreach ($object->fields as $key => $val) { // If $val['visible']==0, then we never show the field if (!empty($val['visible'])) { - $visible = (int) dol_eval($val['visible'], 1, 1, '1'); + $visible = (int) dol_eval($val['visible'], 1); $arrayfields['t.'.$key] = array( 'label'=>$val['label'], 'checked'=>(($visible < 0) ? 0 : 1), - 'enabled'=>($visible != 3 && dol_eval($val['enabled'], 1, 1, '1')), + 'enabled'=>(abs($visible) != 3 && dol_eval($val['enabled'], 1)), 'position'=>$val['position'], 'help'=> isset($val['help']) ? $val['help'] : '' ); @@ -235,9 +234,11 @@ if (empty($reshook)) { $form = new Form($db); $now = dol_now(); -$title = $langs->trans('ListOfConferencesOrBooths'); //$help_url="EN:Module_ConferenceOrBooth|FR:Module_ConferenceOrBooth_FR|ES:Módulo_ConferenceOrBooth"; $help_url = ''; +$title = $langs->trans('ListOfConferencesOrBooths'); +$morejs = array(); +$morecss = array(); if ($projectid > 0 || $projectref) { $project = new Project($db); @@ -524,9 +525,13 @@ $parameters = array(); $reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object); // Note that $action and $object may have been modified by hook $sql .= preg_replace('/^,/', '', $hookmanager->resPrint); $sql = preg_replace('/,\s*$/', '', $sql); +//$sql .= ", COUNT(rc.rowid) as anotherfield"; + +$sqlfields = $sql; // $sql fields to remove for count total + $sql .= " FROM ".MAIN_DB_PREFIX.$object->table_element." as t"; -if (!empty($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) { - $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (t.id = ef.fk_object)"; +if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) { + $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (t.rowid = ef.fk_object)"; } $sql .= " INNER JOIN ".MAIN_DB_PREFIX."c_actioncomm as cact ON cact.id=t.fk_action AND cact.module LIKE '%@eventorganization'"; // Add table from hooks @@ -554,17 +559,17 @@ foreach ($search as $key => $val) { $mode_search = 2; } if ($search[$key] != '') { - $sql .= natural_search($key, $search[$key], (($key == 'status') ? 2 : $mode_search)); + $sql .= natural_search("t.".$db->escape($key), $search[$key], (($key == 'status') ? 2 : $mode_search)); } } else { if (preg_match('/(_dtstart|_dtend)$/', $key) && $search[$key] != '') { $columnName = preg_replace('/(_dtstart|_dtend)$/', '', $key); if (preg_match('/^(date|timestamp|datetime)/', $object->fields[$columnName]['type'])) { if (preg_match('/_dtstart$/', $key)) { - $sql .= " AND t.".$columnName." >= '".$db->idate($search[$key])."'"; + $sql .= " AND t.".$db->escape($columnName)." >= '".$db->idate($search[$key])."'"; } if (preg_match('/_dtend$/', $key)) { - $sql .= " AND t." . $columnName . " <= '" . $db->idate($search[$key]) . "'"; + $sql .= " AND t.".$db->escape($columnName)." <= '".$db->idate($search[$key])."'"; } } } @@ -582,35 +587,42 @@ $parameters = array(); $reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object); // Note that $action and $object may have been modified by hook $sql .= $hookmanager->resPrint; -$sql .= $db->order($sortfield, $sortorder); - // Count total nb of records $nbtotalofrecords = ''; if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) { - $resql = $db->query($sql); - $nbtotalofrecords = $db->num_rows($resql); - if (($page * $limit) > $nbtotalofrecords) { // if total of record found is smaller than page * limit, goto and load page 0 + /* The fast and low memory method to get and count full list converts the sql into a sql count */ + $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql); + $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount); + $resql = $db->query($sqlforcount); + if ($resql) { + $objforcount = $db->fetch_object($resql); + $nbtotalofrecords = $objforcount->nbtotalofrecords; + } else { + dol_print_error($db); + } + + if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0 $page = 0; $offset = 0; } + $db->free($resql); } -// if total of record found is smaller than limit, no need to do paging and to restart another select with limits set. -if (is_numeric($nbtotalofrecords) && ($limit > $nbtotalofrecords || empty($limit))) { - $num = $nbtotalofrecords; -} else { - if ($limit) { - $sql .= $db->plimit($limit + 1, $offset); - } - $resql = $db->query($sql); - if (!$resql) { - dol_print_error($db); - exit; - } +// Complete request and execute it with limit +$sql .= $db->order($sortfield, $sortorder); - $num = $db->num_rows($resql); +if ($limit) { + $sql .= $db->plimit($limit + 1, $offset); } +$resql = $db->query($sql); +if (!$resql) { + dol_print_error($db); + exit; +} + +$num = $db->num_rows($resql); + // Direct jump if only one record found if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $search_all && !$page) { $obj = $db->fetch_object($resql); @@ -622,6 +634,9 @@ if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $ $arrayofselected = is_array($toselect) ? $toselect : array(); $param = ''; +if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); +} if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -629,11 +644,17 @@ if ($limit > 0 && $limit != $conf->liste_limit) { $param .= '&limit='.urlencode($limit); } foreach ($search as $key => $val) { - if (is_array($search[$key]) && count($search[$key])) { + if (is_array($search[$key])) { foreach ($search[$key] as $skey) { - $param .= '&search_'.$key.'[]='.urlencode($skey); + if ($skey != '') { + $param .= '&search_'.$key.'[]='.urlencode($skey); + } } - } else { + } elseif (preg_match('/(_dtstart|_dtend)$/', $key) && !empty($val)) { + $param .= '&search_'.$key.'month='.((int) GETPOST('search_'.$key.'month', 'int')); + $param .= '&search_'.$key.'day='.((int) GETPOST('search_'.$key.'day', 'int')); + $param .= '&search_'.$key.'year='.((int) GETPOST('search_'.$key.'year', 'int')); + } elseif ($search[$key] != '') { $param .= '&search_'.$key.'='.urlencode($search[$key]); } } @@ -655,7 +676,7 @@ $arrayofmassactions = array( 'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail").' ('.$langs->trans("ToSpeakers").')', //'presend_attendees'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail").' - '.$langs->trans("Attendees"), ); -if ($permissiontodelete) { +if (!empty($permissiontodelete)) { $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete"); } if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'predelete'))) { @@ -672,8 +693,11 @@ print ''; print ''; print ''; +print ''; print ''; print ''; +print ''; + $title = $langs->trans("EventOrganizationConfOrBoothes"); @@ -683,7 +707,7 @@ print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sort // Add code for pre mass action (confirmation or email presend form) -$topicmail = $projectstatic->title; +$topicmail = ''; $modelmail = "conferenceorbooth"; $objecttmp = new ConferenceOrBooth($db); $trackid = 'conferenceorbooth_'.$object->id; @@ -692,10 +716,13 @@ include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php'; if ($search_all) { + $setupstring = ''; foreach ($fieldstosearchall as $key => $val) { $fieldstosearchall[$key] = $langs->trans($val); + $setupstring .= $key."=".$val.";"; } - print '
'.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'
'; + print ''."\n"; + print '
'.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'
'."\n"; } $moreforfilter = ''; @@ -718,7 +745,7 @@ if (!empty($moreforfilter)) { } $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage; -$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields +$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN', '')); // This also change content of $arrayfields $selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : ''); @@ -729,9 +756,15 @@ print ''; +// Action column +if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; +} foreach ($object->fields as $key => $val) { - $searchkey = (empty($search[$key]) ? '' : $search[$key]); - + $searchkey = empty($search[$key]) ? '' : $search[$key]; $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); if ($key == 'status') { $cssforfield .= ($cssforfield ? ' ' : '').'center'; @@ -739,17 +772,15 @@ foreach ($object->fields as $key => $val) { $cssforfield .= ($cssforfield ? ' ' : '').'center'; } elseif (in_array($val['type'], array('timestamp'))) { $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; - } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) { + } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $key != 'rowid' && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) { $cssforfield .= ($cssforfield ? ' ' : '').'right'; } if (!empty($arrayfields['t.'.$key]['checked'])) { print ''; } @@ -769,16 +806,23 @@ $parameters = array('arrayfields'=>$arrayfields); $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Action column -print ''; +if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; +} print ''."\n"; +$totalarray = array(); +$totalarray['nbfield'] = 0; // Fields title label // -------------------------------------------------------------------- print ''; +if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n"; +} foreach ($object->fields as $key => $val) { $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); if ($key == 'status') { @@ -787,27 +831,32 @@ foreach ($object->fields as $key => $val) { $cssforfield .= ($cssforfield ? ' ' : '').'center'; } elseif (in_array($val['type'], array('timestamp'))) { $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; - } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'ref')) && $val['label'] != 'TechnicalID') { + } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $key != 'rowid' && $key != 'ref' && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) { $cssforfield .= ($cssforfield ? ' ' : '').'right'; } + $cssforfield = preg_replace('/small\s*/', '', $cssforfield); // the 'small' css must not be used for the title label if (!empty($arrayfields['t.'.$key]['checked'])) { print getTitleFieldOfList($arrayfields['t.'.$key]['label'], 0, $_SERVER['PHP_SELF'], 't.'.$key, '', $param, ($cssforfield ? 'class="'.$cssforfield.'"' : ''), $sortfield, $sortorder, ($cssforfield ? $cssforfield.' ' : ''))."\n"; + $totalarray['nbfield']++; } } // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php'; // Hook fields -$parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder); +$parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Action column -print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n"; +if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n"; +} +$totalarray['nbfield']++; print ''."\n"; // Detect if we need a fetch on each output line $needToFetchEachLine = 0; -if (!empty($extrafields->attributes[$object->table_element]['computed']) && is_array($extrafields->attributes[$object->table_element]['computed']) && count($extrafields->attributes[$object->table_element]['computed']) > 0) { +if (isset($extrafields->attributes[$object->table_element]['computed']) && is_array($extrafields->attributes[$object->table_element]['computed']) && count($extrafields->attributes[$object->table_element]['computed']) > 0) { foreach ($extrafields->attributes[$object->table_element]['computed'] as $key => $val) { if (preg_match('/\$object/', $val)) { $needToFetchEachLine++; // There is at least one compute field that use $object @@ -819,8 +868,11 @@ if (!empty($extrafields->attributes[$object->table_element]['computed']) && is_a // Loop on record // -------------------------------------------------------------------- $i = 0; +$savnbfield = $totalarray['nbfield']; $totalarray = array(); -while ($i < ($limit ? min($num, $limit) : $num)) { +$totalarray['nbfield'] = 0; +$imaxinloop = ($limit ? min($num, $limit) : $num); +while ($i < $imaxinloop) { $obj = $db->fetch_object($resql); if (empty($obj)) { break; // Should not happen @@ -830,10 +882,22 @@ while ($i < ($limit ? min($num, $limit) : $num)) { $object->setVarsFromFetchObj($obj); // Show here line of result - print ''; - $totalarray['nbfield'] = 0; + $j = 0; + print ''; + // Action column + if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + } foreach ($object->fields as $key => $val) { - $cssforfield = (empty($val['css']) ? '' : $val['css']); + $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) { $cssforfield .= ($cssforfield ? ' ' : '').'center'; } elseif ($key == 'status') { @@ -843,7 +907,7 @@ while ($i < ($limit ? min($num, $limit) : $num)) { if (in_array($val['type'], array('timestamp'))) { $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; } elseif ($key == 'ref') { - $cssforfield .= ($cssforfield ? ' ' : '').'nowrap left'; + $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; } if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'ref', 'status'))) { @@ -852,7 +916,11 @@ while ($i < ($limit ? min($num, $limit) : $num)) { //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100'; if (!empty($arrayfields['t.'.$key]['checked'])) { - print ''; + print ''; if ($key == 'status') { print $object->getLibStatut(5); } elseif ($key == 'ref') { @@ -885,15 +953,17 @@ while ($i < ($limit ? min($num, $limit) : $num)) { $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Action column - print ''; } - print ''; if (!$i) { $totalarray['nbfield']++; } @@ -921,7 +991,7 @@ if ($num == 0) { $db->free($resql); $parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql); -$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object); // Note that $action and $object may have been modified by hook +$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; print '
'; + $searchpicto = $form->showFilterButtons('left'); + print $searchpicto; + print ''; if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) { - print $form->selectarray('search_'.$key, $val['arrayofkeyval'], $searchkey, $val['notnull'], 0, 0, '', 1, 0, 0, '', 'maxwidth100', 1); - } elseif ((strpos($val['type'], 'integer:') === 0) || (strpos($val['type'], 'sellist:')=== 0)) { - print $object->showInputField($val, $key, $searchkey, '', '', 'search_', 'maxwidth125', 1); - } elseif (!preg_match('/^(date|timestamp|datetime)/', $val['type'])) { - print ''; + print $form->selectarray('search_'.$key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), $val['notnull'], 0, 0, '', 1, 0, 0, '', 'maxwidth100'.($key == 'status' ? ' search_status onrightofpage' : ''), 1); + } elseif ((strpos($val['type'], 'integer:') === 0) || (strpos($val['type'], 'sellist:') === 0)) { + print $object->showInputField($val, $key, (isset($search[$key]) ? $search[$key] : ''), '', '', 'search_', $cssforfield.' maxwidth250', 1); } elseif (preg_match('/^(date|timestamp|datetime)/', $val['type'])) { print '
'; print $form->selectDate($search[$key.'_dtstart'] ? $search[$key.'_dtstart'] : '', "search_".$key."_dtstart", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From')); @@ -757,6 +788,12 @@ foreach ($object->fields as $key => $val) { print '
'; print $form->selectDate($search[$key.'_dtend'] ? $search[$key.'_dtend'] : '', "search_".$key."_dtend", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to')); print '
'; + } elseif ($key == 'lang') { + require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php'; + $formadmin = new FormAdmin($db); + print $formadmin->select_language($search[$key], 'search_lang', 0, null, 1, 0, 0, 'minwidth150 maxwidth200', 2); + } else { + print ''; } print '
'; -$searchpicto = $form->showFilterButtons(); -print $searchpicto; -print ''; + $searchpicto = $form->showFilterButtons(); + print $searchpicto; + print '
'; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($object->id, $arrayofselected)) { + $selected = 1; + } + print ''; + } + print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($object->id, $arrayofselected)) { - $selected = 1; + if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($object->id, $arrayofselected)) { + $selected = 1; + } + print ''; } - print ''; + print '
'."\n"; diff --git a/htdocs/holiday/list.php b/htdocs/holiday/list.php index 564fb8a2a96..dedfed07157 100644 --- a/htdocs/holiday/list.php +++ b/htdocs/holiday/list.php @@ -827,6 +827,9 @@ if ($resql) { print ''; } print ''; + if (!$i) { + $totalarray['nbfield']++; + } } if (!empty($arrayfields['cp.ref']['checked'])) { print ''; @@ -849,8 +852,11 @@ if ($resql) { } } if (!empty($arrayfields['cp.fk_type']['checked'])) { - $labeltypeleavetoshow = ($langs->trans($typeleaves[$obj->fk_type]['code']) != $typeleaves[$obj->fk_type]['code'] ? $langs->trans($typeleaves[$obj->fk_type]['code']) : $typeleaves[$obj->fk_type]['label']); - $labeltypeleavetoshow = empty($typeleaves[$obj->fk_type]['label']) ? $langs->trans("TypeWasDisabledOrRemoved", $obj->fk_type) : $labeltypeleavetoshow; + if (empty($typeleaves[$obj->fk_type])) { + $labeltypeleavetoshow = $langs->trans("TypeWasDisabledOrRemoved", $obj->fk_type); + } else { + $labeltypeleavetoshow = ($langs->trans($typeleaves[$obj->fk_type]['code']) != $typeleaves[$obj->fk_type]['code'] ? $langs->trans($typeleaves[$obj->fk_type]['code']) : $typeleaves[$obj->fk_type]['label']); + } print ''; print $labeltypeleavetoshow; @@ -941,9 +947,9 @@ if ($resql) { print ''; } print ''; - } - if (!$i) { - $totalarray['nbfield']++; + if (!$i) { + $totalarray['nbfield']++; + } } print ''."\n"; @@ -954,6 +960,9 @@ if ($resql) { // Add a line for total if there is a total to show if (!empty($arrayfields['duration']['checked'])) { print ''; + if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { + print ''; + } foreach ($arrayfields as $key => $val) { if (!empty($val['checked'])) { if ($key == 'duration') { @@ -964,7 +973,9 @@ if ($resql) { } } // status - print ''; + if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { + print ''; + } print ''; } } diff --git a/htdocs/holiday/month_report.php b/htdocs/holiday/month_report.php index a1a23715126..fe2d33ff78a 100644 --- a/htdocs/holiday/month_report.php +++ b/htdocs/holiday/month_report.php @@ -227,27 +227,34 @@ print '
'; $moreforfilter = ''; $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage; -$selectedfields = ''; -$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields +$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields $selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : ''); print '
'; -print ''; +print '
'; -print ''; +print ''; + +// Action column +if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { + print ''; +} // Filter: Ref if (!empty($arrayfields['cp.ref']['checked'])) { - print ''; } // Filter: Employee if (!empty($arrayfields['cp.fk_user']['checked'])) { - print ''; } // Filter: Type @@ -259,45 +266,50 @@ if (!empty($arrayfields['cp.fk_type']['checked'])) { $arraytypeleaves[$val['rowid']] = $labeltoshow; } - print ''; } if (!empty($arrayfields['cp.date_debut']['checked'])) { - print ''; + print ''; } if (!empty($arrayfields['cp.date_fin']['checked'])) { - print ''; + print ''; } if (!empty($arrayfields['used_days']['checked'])) { - print ''; + print ''; } if (!empty($arrayfields['date_start_month']['checked'])) { - print ''; + print ''; } if (!empty($arrayfields['date_end_month']['checked'])) { - print ''; + print ''; } if (!empty($arrayfields['used_days_month']['checked'])) { - print ''; + print ''; } // Filter: Description if (!empty($arrayfields['cp.description']['checked'])) { - print ''; } - // Action column -print ''; +if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { + print ''; +} print ''; print ''; +// Action column +if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { + print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n"; +} if (!empty($arrayfields['cp.ref']['checked'])) { print_liste_field_titre($arrayfields['cp.ref']['label'], $_SERVER["PHP_SELF"], 'cp.ref', '', '', '', $sortfield, $sortorder); } @@ -331,11 +343,14 @@ if (!empty($arrayfields['used_days_month']['checked'])) { if (!empty($arrayfields['cp.description']['checked'])) { print_liste_field_titre($arrayfields['cp.description']['label'], $_SERVER["PHP_SELF"], 'cp.description', '', '', '', $sortfield, $sortorder); } -print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n"; +// Action column +if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { + print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n"; +} print ''; if ($num == 0) { - print ''; + print ''; } else { while ($obj = $db->fetch_object($resql)) { $user = new User($db); @@ -385,6 +400,10 @@ if ($num == 0) { $holidaystatic->ref = $obj->ref; print ''; + // Action column + if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { + print ''; + } if (!empty($arrayfields['cp.ref']['checked'])) { print ''; @@ -430,8 +449,10 @@ if ($num == 0) { if (!empty($arrayfields['cp.description']['checked'])) { print ''; } - - print ''; + // Action column + if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { + print ''; + } print ''; } } diff --git a/htdocs/hrm/class/establishment.class.php b/htdocs/hrm/class/establishment.class.php index 6a37ba1e929..05bd8d47cf8 100644 --- a/htdocs/hrm/class/establishment.class.php +++ b/htdocs/hrm/class/establishment.class.php @@ -285,7 +285,7 @@ class Establishment extends CommonObject * Load an object from database * * @param int $id Id of record to load - * @return int <0 if KO, >0 if OK + * @return int <0 if KO, >=0 if OK */ public function fetch($id) { @@ -299,21 +299,24 @@ class Establishment extends CommonObject $result = $this->db->query($sql); if ($result) { $obj = $this->db->fetch_object($result); + if ($obj) { + $this->id = $obj->rowid; + $this->ref = $obj->ref; + $this->label = $obj->label; + $this->address = $obj->address; + $this->zip = $obj->zip; + $this->town = $obj->town; + $this->status = $obj->status; + $this->entity = $obj->entity; - $this->id = $obj->rowid; - $this->ref = $obj->ref; - $this->label = $obj->label; - $this->address = $obj->address; - $this->zip = $obj->zip; - $this->town = $obj->town; - $this->status = $obj->status; - $this->entity = $obj->entity; + $this->country_id = $obj->country_id; + $this->country_code = $obj->country_code; + $this->country = $obj->country; - $this->country_id = $obj->country_id; - $this->country_code = $obj->country_code; - $this->country = $obj->country; - - return 1; + return 1; + } else { + return 0; + } } else { $this->error = $this->db->lasterror(); return -1; diff --git a/htdocs/knowledgemanagement/knowledgerecord_list.php b/htdocs/knowledgemanagement/knowledgerecord_list.php index dffd3d63d7b..cafb5776cf7 100644 --- a/htdocs/knowledgemanagement/knowledgerecord_list.php +++ b/htdocs/knowledgemanagement/knowledgerecord_list.php @@ -501,7 +501,7 @@ if (!empty($moreforfilter)) { } $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage; -$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields +$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields $selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : ''); print '
'; // You can use div-table-responsive-no-min if you dont need reserved height for your table diff --git a/htdocs/modulebuilder/template/myobject_list.php b/htdocs/modulebuilder/template/myobject_list.php index 1135f6d9498..95442195ff9 100644 --- a/htdocs/modulebuilder/template/myobject_list.php +++ b/htdocs/modulebuilder/template/myobject_list.php @@ -492,6 +492,7 @@ print ''; print ''; print ''; print ''; +print ''; print ''; diff --git a/htdocs/recruitment/recruitmentcandidature_agenda.php b/htdocs/recruitment/recruitmentcandidature_agenda.php index 04118f55572..3648b8ca13b 100644 --- a/htdocs/recruitment/recruitmentcandidature_agenda.php +++ b/htdocs/recruitment/recruitmentcandidature_agenda.php @@ -41,6 +41,7 @@ $action = GETPOST('action', 'aZ09'); $cancel = GETPOST('cancel', 'aZ09'); $backtopage = GETPOST('backtopage', 'alpha'); $socid = GETPOST('socid', 'int'); +$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : str_replace('_', '', basename(dirname(__FILE__)).basename(__FILE__, '.php')); // To manage different context of search if (GETPOST('actioncode', 'array')) { $actioncode = GETPOST('actioncode', 'array', 3); diff --git a/htdocs/recruitment/recruitmentjobposition_agenda.php b/htdocs/recruitment/recruitmentjobposition_agenda.php index f2f4d37484b..fab164dcd2f 100644 --- a/htdocs/recruitment/recruitmentjobposition_agenda.php +++ b/htdocs/recruitment/recruitmentjobposition_agenda.php @@ -40,6 +40,7 @@ $ref = GETPOST('ref', 'alpha'); $action = GETPOST('action', 'aZ09'); $cancel = GETPOST('cancel', 'aZ09'); $backtopage = GETPOST('backtopage', 'alpha'); +$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : str_replace('_', '', basename(dirname(__FILE__)).basename(__FILE__, '.php')); // To manage different context of search if (GETPOST('actioncode', 'array')) { $actioncode = GETPOST('actioncode', 'array', 3); @@ -79,7 +80,7 @@ $extrafields->fetch_name_optionals_label($object->table_element); // Load object include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals if ($id > 0 || !empty($ref)) { - $upload_dir = $conf->recruitment->multidir_output[$object->entity]."/".$object->id; + $upload_dir = $conf->recruitment->multidir_output[!empty($object->entity) ? $object->entity : $conf->entity]."/".$object->id; } $permissiontoadd = $user->rights->recruitment->recruitmentjobposition->write; // Used by the include of actions_addupdatedelete.inc.php @@ -163,11 +164,11 @@ if ($object->id > 0) { $morehtmlref .= ''; $morehtmlref .= ''; $morehtmlref .= ''; - $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1); + $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', 0, 0, 1, 0, 1, 0, 0, '', 1); $morehtmlref .= ''; $morehtmlref .= ''; } else { - $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1); + $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, 0, $object->fk_project, 'none', 0, 0, 0, 1); } } else { if (!empty($object->fk_project)) { @@ -228,7 +229,7 @@ if ($object->id > 0) { print '
'; if (isModEnabled('agenda') && (!empty($user->rights->agenda->myactions->read) || !empty($user->rights->agenda->allactions->read))) { - $param = '&id='.$object->id.'&socid='.$socid; + $param = '&id='.$object->id; if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } diff --git a/htdocs/user/agenda_extsites.php b/htdocs/user/agenda_extsites.php index 4891480cc2d..c2b58c4e2a0 100644 --- a/htdocs/user/agenda_extsites.php +++ b/htdocs/user/agenda_extsites.php @@ -176,8 +176,38 @@ $morehtmlref .= ''; dol_banner_tab($object, 'id', $linkback, $user->rights->user->user->lire || $user->admin, 'rowid', 'ref', $morehtmlref); +print '
'; print '
'; +print '
'; + $searchpicto = $form->showFilterButtons('left'); + print $searchpicto; + print ''; + print ''; print ''; - print ''; + print ''; + print ''; print $form->select_dolusers($search_employee, "search_employee", 1, null, 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth100'); - print ''; + print ''; + print ''; print $form->selectarray('search_type', $arraytypeleaves, $search_type, 1, 0, 0, '', 0, 0, 0, '', '', 1); - print ''; + print ''; + print ''; print ''; - print ''; + print ''; -$searchpicto = $form->showFilterButtons(); -print $searchpicto; -print ''; + $searchpicto = $form->showFilterButtons(); + print $searchpicto; + print '
'.$langs->trans('None').'
'.$langs->trans('None').'
'.$holidaystatic->getNomUrl(1, 1).''.dolGetFirstLineOfText(dol_string_nohtmltag($obj->description, 1)).'
'; + +// Login +print ''; +if (!empty($object->ldap_sid) && $object->statut == 0) { + print ''; +} else { + print ''; +} +print ''."\n"; + +print '
'.$langs->trans("Login").''; + print $langs->trans("LoginAccountDisableInDolibarr"); + print ''; + $addadmin = ''; + if (property_exists($object, 'admin')) { + if (isModEnabled('multicompany') && !empty($object->admin) && empty($object->entity)) { + $addadmin .= img_picto($langs->trans("SuperAdministratorDesc"), "redstar", 'class="paddingleft"'); + } elseif (!empty($object->admin)) { + $addadmin .= img_picto($langs->trans("AdministratorDesc"), "star", 'class="paddingleft"'); + } + } + print showValueWithClipboardCPButton($object->login).$addadmin; + print '
'; + +print '
'; + +print dol_get_fiche_end(); + print '
'; print ''.$langs->trans("AgendaExtSitesDesc")."
\n"; diff --git a/htdocs/user/perms.php b/htdocs/user/perms.php index a65762b6183..1cd094d882d 100644 --- a/htdocs/user/perms.php +++ b/htdocs/user/perms.php @@ -288,6 +288,23 @@ if (!empty($object->ldap_sid) && $object->statut == 0) { } print ''."\n"; +// Type +print ''; +$text = $langs->trans("Type"); +print $form->textwithpicto($text, $langs->trans("InternalExternalDesc")); +print ''; +$type = $langs->trans("Internal"); +if ($object->socid > 0) { + $type = $langs->trans("External"); +} +print ''; +print $type; +if ($object->ldap_sid) { + print ' ('.$langs->trans("DomainUser").')'; +} +print ''; +print ''."\n"; + print ''; print '
'; From fbc74cd571aa4deebbf8cac9f9d4c695452981da Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 14 Jan 2023 15:57:12 +0100 Subject: [PATCH 0818/1128] Fix missing doxygen doc --- .../DataCollector/DolConfigCollector.php | 21 +++++++++++++++ .../DataCollector/DolExceptionsCollector.php | 21 +++++++++++++++ .../class/DataCollector/DolLogsCollector.php | 21 +++++++++++++++ .../DataCollector/DolMemoryCollector.php | 26 ++++++++++++++++--- .../DataCollector/DolMessagesCollector.php | 21 +++++++++++++++ .../class/DataCollector/DolPhpCollector.php | 21 +++++++++++++++ .../class/DataCollector/DolQueryCollector.php | 21 +++++++++++++++ .../DataCollector/DolRequestDataCollector.php | 21 +++++++++++++++ .../DataCollector/DolTimeDataCollector.php | 21 +++++++++++++++ .../class/DataCollector/DolibarrCollector.php | 21 +++++++++++++++ htdocs/debugbar/class/DebugBar.php | 21 +++++++++++++++ htdocs/debugbar/class/TraceableDB.php | 21 +++++++++++++++ 12 files changed, 254 insertions(+), 3 deletions(-) diff --git a/htdocs/debugbar/class/DataCollector/DolConfigCollector.php b/htdocs/debugbar/class/DataCollector/DolConfigCollector.php index 715d20abcf9..0920b140dbc 100644 --- a/htdocs/debugbar/class/DataCollector/DolConfigCollector.php +++ b/htdocs/debugbar/class/DataCollector/DolConfigCollector.php @@ -1,4 +1,25 @@ + * + * 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/debugbar/class/DataCollector/DolConfigCollector.php + * \brief Class for debugbar collection + * \ingroup debugbar + */ use \DebugBar\DataCollector\ConfigCollector; diff --git a/htdocs/debugbar/class/DataCollector/DolExceptionsCollector.php b/htdocs/debugbar/class/DataCollector/DolExceptionsCollector.php index 15d433fd050..38d2b971dde 100644 --- a/htdocs/debugbar/class/DataCollector/DolExceptionsCollector.php +++ b/htdocs/debugbar/class/DataCollector/DolExceptionsCollector.php @@ -1,4 +1,25 @@ + * + * 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/debugbar/class/DataCollector/DolexceptionsCollector.php + * \brief Class for debugbar collection + * \ingroup debugbar + */ use \DebugBar\DataCollector\ExceptionsCollector; diff --git a/htdocs/debugbar/class/DataCollector/DolLogsCollector.php b/htdocs/debugbar/class/DataCollector/DolLogsCollector.php index d21cdd6233f..44885296bae 100644 --- a/htdocs/debugbar/class/DataCollector/DolLogsCollector.php +++ b/htdocs/debugbar/class/DataCollector/DolLogsCollector.php @@ -1,4 +1,25 @@ + * + * 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/debugbar/class/DataCollector/DolLogsCollector.php + * \brief Class for debugbar collection + * \ingroup debugbar + */ use DebugBar\DataCollector\MessagesCollector; use Psr\Log\LogLevel; diff --git a/htdocs/debugbar/class/DataCollector/DolMemoryCollector.php b/htdocs/debugbar/class/DataCollector/DolMemoryCollector.php index b52ac8ff8c4..3372e89c2b6 100644 --- a/htdocs/debugbar/class/DataCollector/DolMemoryCollector.php +++ b/htdocs/debugbar/class/DataCollector/DolMemoryCollector.php @@ -1,17 +1,37 @@ + * + * 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/debugbar/class/DataCollector/DolMemoryCollector.php + * \brief Class for debugbar collection + * \ingroup debugbar + */ use \DebugBar\DataCollector\MemoryCollector; /** * DolMemoryCollector class */ - class DolMemoryCollector extends MemoryCollector { /** * Return value of indicator * - * @return void + * @return array */ public function collect() { @@ -28,7 +48,7 @@ class DolMemoryCollector extends MemoryCollector /** * Return widget settings * - * @return void + * @return array */ public function getWidgets() { diff --git a/htdocs/debugbar/class/DataCollector/DolMessagesCollector.php b/htdocs/debugbar/class/DataCollector/DolMessagesCollector.php index 1fcf60c8ba6..733009e77c6 100644 --- a/htdocs/debugbar/class/DataCollector/DolMessagesCollector.php +++ b/htdocs/debugbar/class/DataCollector/DolMessagesCollector.php @@ -1,4 +1,25 @@ + * + * 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/debugbar/class/DataCollector/DolMessagesCollector.php + * \brief Class for debugbar collection + * \ingroup debugbar + */ use \DebugBar\DataCollector\MessagesCollector; diff --git a/htdocs/debugbar/class/DataCollector/DolPhpCollector.php b/htdocs/debugbar/class/DataCollector/DolPhpCollector.php index 3d6536bd258..bca2b2a7071 100644 --- a/htdocs/debugbar/class/DataCollector/DolPhpCollector.php +++ b/htdocs/debugbar/class/DataCollector/DolPhpCollector.php @@ -1,4 +1,25 @@ + * + * 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/debugbar/class/DataCollector/DolPhpCollector.php + * \brief Class for debugbar collection + * \ingroup debugbar + */ use DebugBar\DataCollector\DataCollector; use DebugBar\DataCollector\Renderable; diff --git a/htdocs/debugbar/class/DataCollector/DolQueryCollector.php b/htdocs/debugbar/class/DataCollector/DolQueryCollector.php index ca5aa284dd2..8cc55e34df9 100644 --- a/htdocs/debugbar/class/DataCollector/DolQueryCollector.php +++ b/htdocs/debugbar/class/DataCollector/DolQueryCollector.php @@ -1,4 +1,25 @@ + * + * 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/debugbar/class/DataCollector/DolQueryCollector.php + * \brief Class for debugbar collection + * \ingroup debugbar + */ use DebugBar\DataCollector\AssetProvider; use DebugBar\DataCollector\DataCollector; diff --git a/htdocs/debugbar/class/DataCollector/DolRequestDataCollector.php b/htdocs/debugbar/class/DataCollector/DolRequestDataCollector.php index 938643802d5..4ddcac9af7c 100644 --- a/htdocs/debugbar/class/DataCollector/DolRequestDataCollector.php +++ b/htdocs/debugbar/class/DataCollector/DolRequestDataCollector.php @@ -1,4 +1,25 @@ + * + * 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/debugbar/class/DataCollector/DolRequestDataCollector.php + * \brief Class for debugbar collection + * \ingroup debugbar + */ use \DebugBar\DataCollector\RequestDataCollector; diff --git a/htdocs/debugbar/class/DataCollector/DolTimeDataCollector.php b/htdocs/debugbar/class/DataCollector/DolTimeDataCollector.php index ed5e979d539..d16622d329f 100644 --- a/htdocs/debugbar/class/DataCollector/DolTimeDataCollector.php +++ b/htdocs/debugbar/class/DataCollector/DolTimeDataCollector.php @@ -1,4 +1,25 @@ + * + * 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/debugbar/class/DataCollector/DolTimeDataCollector.php + * \brief Class for debugbar collection + * \ingroup debugbar + */ use \DebugBar\DataCollector\TimeDataCollector; diff --git a/htdocs/debugbar/class/DataCollector/DolibarrCollector.php b/htdocs/debugbar/class/DataCollector/DolibarrCollector.php index 3193fe26176..11cedbe2b93 100644 --- a/htdocs/debugbar/class/DataCollector/DolibarrCollector.php +++ b/htdocs/debugbar/class/DataCollector/DolibarrCollector.php @@ -1,4 +1,25 @@ + * + * 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/debugbar/class/DataCollector/DolibarrCollector.php + * \brief Class for debugbar collection + * \ingroup debugbar + */ use DebugBar\DataCollector\AssetProvider; use DebugBar\DataCollector\DataCollector; diff --git a/htdocs/debugbar/class/DebugBar.php b/htdocs/debugbar/class/DebugBar.php index bf797e638f7..6181ad7cd60 100644 --- a/htdocs/debugbar/class/DebugBar.php +++ b/htdocs/debugbar/class/DebugBar.php @@ -1,4 +1,25 @@ + * + * 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/debugbar/class/DebugBar.php + * \brief Class for debugbar + * \ingroup debugbar + */ dol_include_once('/debugbar/class/autoloader.php'); diff --git a/htdocs/debugbar/class/TraceableDB.php b/htdocs/debugbar/class/TraceableDB.php index 9f0a83fae3c..8e28b0c59bd 100644 --- a/htdocs/debugbar/class/TraceableDB.php +++ b/htdocs/debugbar/class/TraceableDB.php @@ -1,4 +1,25 @@ + * + * 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/debugbar/class/DataCollector/TraceableDB.php + * \brief Class for debugbar DB + * \ingroup debugbar + */ require_once DOL_DOCUMENT_ROOT.'/core/db/DoliDB.class.php'; From 7aba21dd3e194ef49ed7dfee466856b345717085 Mon Sep 17 00:00:00 2001 From: UT from dolibit <45215329+dolibit-ut@users.noreply.github.com> Date: Sat, 14 Jan 2023 17:05:45 +0100 Subject: [PATCH 0819/1128] Update list.php --- htdocs/adherents/list.php | 67 +++++++++++++++++++++++++++++++++------ 1 file changed, 57 insertions(+), 10 deletions(-) diff --git a/htdocs/adherents/list.php b/htdocs/adherents/list.php index b9cbb252144..39a4d993221 100644 --- a/htdocs/adherents/list.php +++ b/htdocs/adherents/list.php @@ -73,7 +73,7 @@ $search_categ = GETPOST("search_categ", 'int'); $search_filter = GETPOST("search_filter", 'alpha'); $search_status = GETPOST("search_status", 'intcomma'); $search_morphy = GETPOST("search_morphy", 'alpha'); -$search_import_key = trim(GETPOST("search_import_key", "alpha")); +$search_import_key = trim(GETPOST("search_import_key", 'alpha')); $catid = GETPOST("catid", 'int'); $optioncss = GETPOST('optioncss', 'alpha'); $socid = GETPOST('socid', 'int'); @@ -141,6 +141,7 @@ $fieldstosearchall = array( if ($db->type == 'pgsql') { unset($fieldstosearchall['d.rowid']); } + $arrayfields = array( 'd.ref'=>array('label'=>"Ref", 'checked'=>1), 'd.civility'=>array('label'=>"Civility", 'checked'=>0), @@ -169,6 +170,7 @@ $arrayfields = array( 'd.statut'=>array('label'=>"Status", 'checked'=>1, 'position'=>1000), 'd.import_key'=>array('label'=>"ImportId", 'checked'=>0, 'position'=>1100), ); + // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php'; @@ -317,7 +319,11 @@ $formother = new FormOther($db); $membertypestatic = new AdherentType($db); $memberstatic = new Adherent($db); -$title = $langs->trans("Members"); +// Page Header +$title = $langs->trans("Members")." - ".$langs->trans("List");; +$help_url = 'EN:Module_Foundations|FR:Module_Adhérents|ES:Módulo_Miembros|DE:Modul_Mitglieder'; +llxHeader('', $title, $help_url); + $now = dol_now(); @@ -335,12 +341,14 @@ $sql .= " s.nom,"; $sql .= " ".$db->ifsql("d.societe IS NULL", "s.nom", "d.societe")." as companyname,"; $sql .= " t.libelle as type, t.subscription,"; $sql .= " state.code_departement as state_code, state.nom as state_name,"; + // Add fields from extrafields if (!empty($extrafields->attributes[$object->table_element]['label'])) { foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) { $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? "ef.".$key." as options_".$key.', ' : ''); } } + // Add fields from hooks $parameters = array(); $reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters); // Note that $action and $object may have been modified by hook @@ -349,13 +357,16 @@ $sql = preg_replace('/,\s*$/', '', $sql); $sqlfields = $sql; // $sql fields to remove for count total -$sql .= " FROM ".MAIN_DB_PREFIX."adherent as d"; +// SQL Aliase adherent +$sql .= " FROM ".MAIN_DB_PREFIX."adherent as d"; // maybe better to use ad (adh) instead od d if (!empty($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) { $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (d.rowid = ef.fk_object)"; } $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as country on (country.rowid = d.country)"; $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as state on (state.rowid = d.state_id)"; $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s on (s.rowid = d.fk_soc)"; + +// SQL Aliase adherent_type $sql .= ", ".MAIN_DB_PREFIX."adherent_type as t"; $sql .= " WHERE d.fk_adherent_type = t.rowid"; @@ -525,8 +536,6 @@ if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $ exit; } -$help_url = 'EN:Module_Foundations|FR:Module_Adhérents|ES:Módulo_Miembros'; -llxHeader('', $title, $help_url); if ($search_type > 0) { $membertype = new AdherentType($db); @@ -534,6 +543,7 @@ if ($search_type > 0) { $title .= " (".$membertype->label.")"; } +// $parameters $param = ''; if (!empty($mode)) { $param .= '&mode='.urlencode($mode); @@ -613,6 +623,7 @@ if ($search_type > 0) { if ($optioncss != '') { $param .= '&optioncss='.urlencode($optioncss); } + // Add $param from extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php'; @@ -705,6 +716,7 @@ print ''; + // Action column if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { print ''; } + // Line numbering if (!empty($conf->global->MAIN_SHOW_TECHNICAL_ID)) { print ''; @@ -723,32 +736,45 @@ if (!empty($arrayfields['d.ref']['checked'])) { print ''; print ''; } + +// Civility if (!empty($arrayfields['d.civility']['checked'])) { print ''; } + +// First Name if (!empty($arrayfields['d.firstname']['checked'])) { print ''; } + +// Last Name if (!empty($arrayfields['d.lastname']['checked'])) { print ''; } + +// Gender if (!empty($arrayfields['d.gender']['checked'])) { print ''; } + +// Company if (!empty($arrayfields['d.company']['checked'])) { print ''; } + +// Login if (!empty($arrayfields['d.login']['checked'])) { print ''; } + // Nature if (!empty($arrayfields['d.morphy']['checked'])) { print ''; } + +// Member Type if (!empty($arrayfields['t.libelle']['checked'])) { print ''; } @@ -766,51 +794,62 @@ if (!empty($arrayfields['t.libelle']['checked'])) { print ''; } +// Address - Street if (!empty($arrayfields['d.address']['checked'])) { print ''; } +// ZIP if (!empty($arrayfields['d.zip']['checked'])) { print ''; } + +// Town/City if (!empty($arrayfields['d.town']['checked'])) { print ''; } -// State + +// State / County / Departement if (!empty($arrayfields['state.nom']['checked'])) { print ''; } + // Country if (!empty($arrayfields['country.code_iso']['checked'])) { print ''; } + // Phone pro if (!empty($arrayfields['d.phone']['checked'])) { print ''; } + // Phone perso if (!empty($arrayfields['d.phone_perso']['checked'])) { print ''; + print ''; } + // Phone mobile if (!empty($arrayfields['d.phone_mobile']['checked'])) { print ''; } + // Email if (!empty($arrayfields['d.email']['checked'])) { print ''; } + // End of subscription date if (!empty($arrayfields['d.datefin']['checked'])) { print ''; } + // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php'; @@ -826,21 +866,25 @@ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php'; $parameters = array('arrayfields'=>$arrayfields); $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; + // Date creation if (!empty($arrayfields['d.datec']['checked'])) { print ''; } + // Birthday if (!empty($arrayfields['d.birth']['checked'])) { print ''; } + // Date modification if (!empty($arrayfields['d.tms']['checked'])) { print ''; } + // Status if (!empty($arrayfields['d.statut']['checked'])) { print ''; } + +// Import Key if (!empty($arrayfields['d.import_key']['checked'])) { print ''; } + if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { // Action column print ''; } - + // Technical ID if (!empty($conf->global->MAIN_SHOW_TECHNICAL_ID)) { print ''; if (!$i) { $totalarray['nbfield']++; } } - // Ref if (!empty($arrayfields['d.ref']['checked'])) { print "\n"; if (!$i) { From cb84d7797f2291824c4d62a835e81ac00e1cc1bd Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Sat, 14 Jan 2023 16:06:39 +0000 Subject: [PATCH 0820/1128] Fixing style errors. --- htdocs/adherents/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/adherents/list.php b/htdocs/adherents/list.php index 39a4d993221..d06d91cbea6 100644 --- a/htdocs/adherents/list.php +++ b/htdocs/adherents/list.php @@ -358,7 +358,7 @@ $sql = preg_replace('/,\s*$/', '', $sql); $sqlfields = $sql; // $sql fields to remove for count total // SQL Aliase adherent -$sql .= " FROM ".MAIN_DB_PREFIX."adherent as d"; // maybe better to use ad (adh) instead od d +$sql .= " FROM ".MAIN_DB_PREFIX."adherent as d"; // maybe better to use ad (adh) instead od d if (!empty($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) { $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (d.rowid = ef.fk_object)"; } From bff128a061735948435045d55893a5bcc6a0fd2a Mon Sep 17 00:00:00 2001 From: UT from dolibit <45215329+dolibit-ut@users.noreply.github.com> Date: Sat, 14 Jan 2023 17:41:29 +0100 Subject: [PATCH 0821/1128] Update list.php --- htdocs/contact/list.php | 100 +++++++++++++++++++++++++++++----------- 1 file changed, 74 insertions(+), 26 deletions(-) diff --git a/htdocs/contact/list.php b/htdocs/contact/list.php index a025ef81b97..1cc2d67cf93 100644 --- a/htdocs/contact/list.php +++ b/htdocs/contact/list.php @@ -101,10 +101,10 @@ $search_type = GETPOST('search_type', 'alpha'); $search_address = GETPOST('search_address', 'alpha'); $search_zip = GETPOST('search_zip', 'alpha'); $search_town = GETPOST('search_town', 'alpha'); -$search_import_key = GETPOST("search_import_key", "alpha"); +$search_import_key = GETPOST("search_import_key", 'alpha'); $search_country = GETPOST("search_country", 'intcomma'); $search_roles = GETPOST("search_roles", 'array'); -$search_level = GETPOST("search_level", "array"); +$search_level = GETPOST("search_level", 'array'); $search_stcomm = GETPOST('search_stcomm', 'int'); if ($search_status === '') { @@ -350,9 +350,14 @@ $formother = new FormOther($db); $formcompany = new FormCompany($db); $contactstatic = new Contact($db); -$morejs=array(); +$morejs = array(); $morecss = array(); +// Page Header +$title = $langs->trans("Contacts")." - ".$langs->trans("List"); +$help_url = 'EN:Module_Third_Parties|FR:Module_Tiers|ES:Módulo_Empresas'; +llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', 'bodyforlist'); + if (!empty($conf->global->THIRDPARTY_ENABLE_PROSPECTION_ON_ALTERNATIVE_ADRESSES)) { $contactstatic->loadCacheOfProspStatus(); } @@ -387,6 +392,7 @@ $sql .= " p.phone as phone_pro, p.phone_mobile, p.phone_perso, p.fax, p.fk_pays, $sql .= " p.import_key,"; $sql .= " st.libelle as stcomm, st.picto as stcomm_picto, p.fk_stcommcontact as stcomm_id, p.fk_prospectlevel,"; $sql .= " co.label as country, co.code as country_code"; + // Add fields from extrafields if (!empty($extrafields->attributes[$object->table_element]['label'])) { foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) { @@ -396,13 +402,15 @@ if (!empty($extrafields->attributes[$object->table_element]['label'])) { if (isModEnabled('mailing')) { $sql .= ", (SELECT count(*) FROM ".MAIN_DB_PREFIX."mailing_unsubscribe WHERE email = p.email) as unsubscribed"; } -// Add fields from hooks + +// Add fields from hooks - ListSelect $parameters = array(); $reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook $sql .= $hookmanager->resPrint; $sqlfields = $sql; // $sql fields to remove for count total +// SQL Table Aliase $sql .= " FROM ".MAIN_DB_PREFIX."socpeople as p"; if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) { $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (p.rowid = ef.fk_object)"; @@ -413,7 +421,8 @@ $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_stcommcontact as st ON st.id = p.fk_stco if (empty($user->rights->societe->client->voir) && !$socid) { $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON s.rowid = sc.fk_soc"; } -// Add fields from hooks + +// Add fields from hooks - ListFrom $parameters = array(); $reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object, $action); // Note that $action and $object may have been modified by hook $sql .= $hookmanager->resPrint; @@ -443,9 +452,13 @@ if ($search_priv != '0' && $search_priv != '1') { } } + +// Search Categories + + // Search Contact Categories $searchCategoryContactList = $search_categ ? array($search_categ) : array(); $searchCategoryContactOperator = 0; -// Search for tag/category ($searchCategoryContactList is an array of ID) + // Search for tag/category ($searchCategoryContactList is an array of ID) if (!empty($searchCategoryContactList)) { $searchCategoryContactSqlList = array(); $listofcategoryid = ''; @@ -473,9 +486,11 @@ if (!empty($searchCategoryContactList)) { } } } + + // Search Customer Categories $searchCategoryCustomerList = $search_categ_thirdparty ? array($search_categ_thirdparty) : array(); $searchCategoryCustomerOperator = 0; -// Search for tag/category ($searchCategoryCustomerList is an array of ID) + // Search for tag/category ($searchCategoryCustomerList is an array of ID) if (!empty($searchCategoryCustomerList)) { $searchCategoryCustomerSqlList = array(); $listofcategoryid = ''; @@ -503,9 +518,11 @@ if (!empty($searchCategoryCustomerList)) { } } } + + // Search Supplier Categories $searchCategorySupplierList = $search_categ_supplier ? array($search_categ_supplier) : array(); $searchCategorySupplierOperator = 0; -// Search for tag/category ($searchCategorySupplierList is an array of ID) + // Search for tag/category ($searchCategorySupplierList is an array of ID) if (!empty($searchCategorySupplierList)) { $searchCategorySupplierSqlList = array(); $listofcategoryid = ''; @@ -600,6 +617,7 @@ if (isModEnabled('socialnetworks')) { } } //print $sql; + if (strlen($search_email)) { $sql .= natural_search('p.email', $search_email); } @@ -627,20 +645,22 @@ if ($search_status != '' && $search_status >= 0) { if ($search_import_key) { $sql .= natural_search("p.import_key", $search_import_key); } -if ($type == "o") { // filtre sur type +if ($type == "o") { // filter on type $sql .= " AND p.fk_soc IS NULL"; -} elseif ($type == "f") { // filtre sur type +} elseif ($type == "f") { // filter on type $sql .= " AND s.fournisseur = 1"; -} elseif ($type == "c") { // filtre sur type +} elseif ($type == "c") { // filter on type $sql .= " AND s.client IN (1, 3)"; -} elseif ($type == "p") { // filtre sur type +} elseif ($type == "p") { // filter on type $sql .= " AND s.client IN (2, 3)"; } if (!empty($socid)) { $sql .= " AND s.rowid = ".((int) $socid); } + // Add where from extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php'; + // Add where from hooks $parameters = array(); $reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook @@ -695,8 +715,7 @@ if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && ( exit; } -$help_url = 'EN:Module_Third_Parties|FR:Module_Tiers|ES:Módulo_Empresas'; -llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', 'bodyforlist'); + $param = ''; if (!empty($mode)) { @@ -948,20 +967,25 @@ if (!empty($arrayfields['p.town']['checked'])) { print ''; print ''; } + +/* // State -/*if (!empty($arrayfields['state.nom']['checked'])) + if (!empty($arrayfields['state.nom']['checked'])) { print ''; } + // Region if (!empty($arrayfields['region.nom']['checked'])) { print ''; - }*/ + } +*/ + // Country if (!empty($arrayfields['country.code_iso']['checked'])) { print ''; } -// Alias +// Alias of ThirdParty if (!empty($arrayfields['s.name_alias']['checked'])) { print ''; -// Ligne des titres +// Title line print ''; if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch '); @@ -1238,6 +1262,7 @@ while ($i < min($num, $limit)) { } print ''; } + // ID if (!empty($arrayfields['p.rowid']['checked'])) { print ''; @@ -1263,6 +1290,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } + // Job position if (!empty($arrayfields['p.poste']['checked'])) { print ''; @@ -1270,6 +1298,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } + // Address if (!empty($arrayfields['p.address']['checked'])) { print ''; @@ -1277,6 +1306,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } + // Zip if (!empty($arrayfields['p.zip']['checked'])) { print ''; @@ -1284,6 +1314,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } + // Town if (!empty($arrayfields['p.town']['checked'])) { print ''; @@ -1291,18 +1322,22 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } + + /* // State - /*if (!empty($arrayfields['state.nom']['checked'])) + if (!empty($arrayfields['state.nom']['checked'])) { print "\n"; if (! $i) $totalarray['nbfield']++; } + // Region if (!empty($arrayfields['region.nom']['checked'])) { print "\n"; if (! $i) $totalarray['nbfield']++; }*/ + // Country if (!empty($arrayfields['country.code_iso']['checked'])) { print ''; if (!$i) { $totalarray['nbfield']++; } } + // Phone perso if (!empty($arrayfields['p.phone_perso']['checked'])) { print ''; @@ -1327,6 +1364,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } + // Phone mobile if (!empty($arrayfields['p.phone_mobile']['checked'])) { print ''; @@ -1334,6 +1372,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } + // Fax if (!empty($arrayfields['p.fax']['checked'])) { print ''; @@ -1341,6 +1380,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } + // EMail if (!empty($arrayfields['p.email']['checked'])) { print ''; @@ -1348,7 +1388,8 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } - // No EMail + + // No EMail Subscription if (!empty($arrayfields['unsubscribed']['checked'])) { print '"; @@ -1415,8 +1459,8 @@ while ($i < min($num, $limit)) { } } + // Prospect status if (!empty($arrayfields['p.fk_stcommcontact']['checked'])) { - // Prospect status print ''; @@ -1466,6 +1513,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } + // Import key if (!empty($arrayfields['p.import_key']['checked'])) { print ''; } - + // Region if (!empty($arrayfields['region.nom']['checked'])) { @@ -1262,7 +1262,7 @@ while ($i < min($num, $limit)) { } print ''; } - + // ID if (!empty($arrayfields['p.rowid']['checked'])) { print ''; @@ -1290,7 +1290,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } - + // Job position if (!empty($arrayfields['p.poste']['checked'])) { print ''; @@ -1298,7 +1298,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } - + // Address if (!empty($arrayfields['p.address']['checked'])) { print ''; @@ -1306,7 +1306,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } - + // Zip if (!empty($arrayfields['p.zip']['checked'])) { print ''; @@ -1314,7 +1314,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } - + // Town if (!empty($arrayfields['p.town']['checked'])) { print ''; @@ -1322,7 +1322,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } - + /* // State if (!empty($arrayfields['state.nom']['checked'])) @@ -1330,14 +1330,14 @@ while ($i < min($num, $limit)) { print "\n"; if (! $i) $totalarray['nbfield']++; } - + // Region if (!empty($arrayfields['region.nom']['checked'])) { print "\n"; if (! $i) $totalarray['nbfield']++; }*/ - + // Country if (!empty($arrayfields['country.code_iso']['checked'])) { print ''; @@ -1356,7 +1356,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } - + // Phone perso if (!empty($arrayfields['p.phone_perso']['checked'])) { print ''; @@ -1364,7 +1364,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } - + // Phone mobile if (!empty($arrayfields['p.phone_mobile']['checked'])) { print ''; @@ -1372,7 +1372,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } - + // Fax if (!empty($arrayfields['p.fax']['checked'])) { print ''; @@ -1380,7 +1380,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } - + // EMail if (!empty($arrayfields['p.email']['checked'])) { print ''; @@ -1388,7 +1388,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } - + // No EMail Subscription if (!empty($arrayfields['unsubscribed']['checked'])) { print ''; @@ -1513,7 +1513,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } - + // Import key if (!empty($arrayfields['p.import_key']['checked'])) { print '\n"; + // Address + print '\n"; + // Company name print '\n"; // Office fax print '\n"; // User mobile print '\n"; @@ -238,7 +238,7 @@ if (getDolUserInt('USER_ENABLE_PUBLIC', 0, $object)) { // Social networks print '\n"; @@ -262,7 +262,8 @@ if (getDolUserInt('USER_ENABLE_PUBLIC', 0, $object)) { print $langs->trans("Text"); print '\n"; From bd8a48b6ddd7b15788782a9703daa12db440ff55 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 15 Jan 2023 01:45:54 +0100 Subject: [PATCH 0831/1128] css --- htdocs/core/lib/functions.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 278f70507bb..3e3a87c7bd0 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -3170,7 +3170,7 @@ function dol_print_socialnetworks($value, $cid, $socid, $type, $dictsocialnetwor if (!empty($type)) { $htmllink = '
'; // Use dictionary definition for picto $dictsocialnetworks[$type]['icon'] - $htmllink .= ''; + $htmllink .= ''; if ($type == 'skype') { $htmllink .= dol_escape_htmltag($value); $htmllink .= ' 
'; //print '
'; From d7e4304992b37ff13a4059ccbe0e85856f4f9de0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 15 Jan 2023 02:09:55 +0100 Subject: [PATCH 0834/1128] Try to fix social network inks in vcard --- htdocs/core/class/vcard.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/vcard.class.php b/htdocs/core/class/vcard.class.php index a5e1cbf6814..f6c8d14979b 100644 --- a/htdocs/core/class/vcard.class.php +++ b/htdocs/core/class/vcard.class.php @@ -441,7 +441,7 @@ class vCard } } if ($urlsn) { - $this->properties["socialProfile;type=".$key] = $urlsn; + $this->properties["SOCIALPROFILE;TYPE=home"] = $key.':'.$urlsn; } } } From bec559aae9406eca2171cfb4b6926ad756563709 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 15 Jan 2023 02:16:35 +0100 Subject: [PATCH 0835/1128] Try to fix social network inks in vcard --- htdocs/core/class/vcard.class.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/vcard.class.php b/htdocs/core/class/vcard.class.php index f6c8d14979b..c66974f939b 100644 --- a/htdocs/core/class/vcard.class.php +++ b/htdocs/core/class/vcard.class.php @@ -359,7 +359,8 @@ class vCard $text .= "VERSION:4.0\r\n"; // With V4, all encoding are UTF-8 //$text.= "VERSION:2.1\r\n"; foreach ($this->properties as $key => $value) { - $text .= $key.":".$value."\r\n"; + $newkey = preg_replace('/-.*$/', '', $key); // remove suffix -twitter, -facebook, ... + $text .= $newkey.":".$value."\r\n"; } $text .= "REV:".date("Ymd")."T".date("His")."Z\r\n"; //$text .= "MAILER: Dolibarr\r\n"; @@ -441,7 +442,7 @@ class vCard } } if ($urlsn) { - $this->properties["SOCIALPROFILE;TYPE=home"] = $key.':'.$urlsn; + $this->properties["SOCIALPROFILE;TYPE=home-".$key] = $key.':'.$urlsn; } } } From 6a30104beb598a545d8798e68730c6afddc0981e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 15 Jan 2023 02:19:47 +0100 Subject: [PATCH 0836/1128] Try to fix social network inks in vcard --- htdocs/core/class/vcard.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/vcard.class.php b/htdocs/core/class/vcard.class.php index c66974f939b..7b5a320f678 100644 --- a/htdocs/core/class/vcard.class.php +++ b/htdocs/core/class/vcard.class.php @@ -442,7 +442,7 @@ class vCard } } if ($urlsn) { - $this->properties["SOCIALPROFILE;TYPE=home-".$key] = $key.':'.$urlsn; + $this->properties["SOCIALPROFILE;TYPE=WORK-".$key] = $key.':'.$urlsn; } } } From b54a15f5047ae977bf39ec959161aa6931c7763f Mon Sep 17 00:00:00 2001 From: Maxime Kohlhaas Date: Sun, 15 Jan 2023 09:11:29 +0100 Subject: [PATCH 0837/1128] Fix missing keywords in dol_dir_list_in_database --- htdocs/core/lib/files.lib.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index 21c290b595d..4195dee8dc1 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -344,6 +344,7 @@ function completeFileArrayWithDatabaseInfo(&$filearray, $relativedir) $filearray[$key]['position_name'] = ($filearrayindatabase[$key2]['position'] ? $filearrayindatabase[$key2]['position'] : '0').'_'.$filearrayindatabase[$key2]['name']; $filearray[$key]['position'] = $filearrayindatabase[$key2]['position']; $filearray[$key]['cover'] = $filearrayindatabase[$key2]['cover']; + $filearray[$key]['keywords'] = $filearrayindatabase[$key2]['keywords']; $filearray[$key]['acl'] = $filearrayindatabase[$key2]['acl']; $filearray[$key]['rowid'] = $filearrayindatabase[$key2]['rowid']; $filearray[$key]['label'] = $filearrayindatabase[$key2]['label']; From 24c5fcb5a7b0e6e0c2b97062bace7c5eab67a363 Mon Sep 17 00:00:00 2001 From: TuxGasy Date: Sun, 15 Jan 2023 10:24:19 +0100 Subject: [PATCH 0838/1128] Update to PHP 8.1 --- build/docker/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/docker/Dockerfile b/build/docker/Dockerfile index ead2a8af1c5..69f4d27b26f 100644 --- a/build/docker/Dockerfile +++ b/build/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM php:7.3-apache +FROM php:8.1-apache-bullseye ENV PHP_INI_DATE_TIMEZONE 'UTC' ENV PHP_INI_MEMORY_LIMIT 256M @@ -25,7 +25,7 @@ RUN apt-get update -y \ mailutils \ && apt-get autoremove -y \ && rm -rf /var/lib/apt/lists/* \ - && docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \ + && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) calendar intl mysqli pdo_mysql gd soap zip \ && docker-php-ext-configure ldap --with-libdir=lib/x86_64-linux-gnu/ \ && docker-php-ext-install -j$(nproc) ldap && \ From 0cb2af4ecb26b9cfdc932538e952a3918cb83a59 Mon Sep 17 00:00:00 2001 From: TuxGasy Date: Sun, 15 Jan 2023 10:42:52 +0100 Subject: [PATCH 0839/1128] Fix update PHP config --- build/docker/README.md | 2 +- build/docker/docker-compose.yml | 2 ++ build/docker/docker-run.sh | 8 ++++---- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/build/docker/README.md b/build/docker/README.md index d469c7c7aae..007b5db6ace 100644 --- a/build/docker/README.md +++ b/build/docker/README.md @@ -25,7 +25,7 @@ The URL to go to the Dolibarr is : The URL to go to PhpMyAdmin is (login/password is root/root) : http://0.0.0.0:8080 - + In Dolibarr configuration Email let PHP mail function, To see all mail send by Dolibarr go to maildev http://0.0.0.0:8081 diff --git a/build/docker/docker-compose.yml b/build/docker/docker-compose.yml index 8994043cd8a..e197d5dd06e 100644 --- a/build/docker/docker-compose.yml +++ b/build/docker/docker-compose.yml @@ -34,6 +34,8 @@ services: build: . environment: HOST_USER_ID: $HOST_USER_ID + PHP_INI_DATE_TIMEZONE: $PHP_INI_DATE_TIMEZONE + PHP_INI_MEMORY_LIMIT: $PHP_INI_MEMORY_LIMIT volumes: - ../../htdocs:/var/www/html/ - ../../documents:/var/documents diff --git a/build/docker/docker-run.sh b/build/docker/docker-run.sh index 4e69ea4a3a2..fbd256ab625 100644 --- a/build/docker/docker-run.sh +++ b/build/docker/docker-run.sh @@ -15,10 +15,10 @@ fi echo "[docker-run] => Set Permission to www-data for /var/documents" chown -R www-data:www-data /var/documents -if [ ! -f /usr/local/etc/php/php.ini ]; then - cat < /usr/local/etc/php/php.ini -date.timezone = $PHP_INI_DATE_TIMEZONE +echo "[docker-run] => update ${PHP_INI_DIR}/conf.d/dolibarr-php.ini" +cat < ${PHP_INI_DIR}/conf.d/dolibarr-php.ini +date.timezone = ${PHP_INI_DATE_TIMEZONE:-UTC} +memory_limit = ${PHP_INI_MEMORY_LIMIT:-256M} EOF -fi exec apache2-foreground From 132fe6c19d9f42682a5b1f596fc5fc224ee47ba5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 15 Jan 2023 11:13:53 +0100 Subject: [PATCH 0840/1128] Fix missing photo on user link --- htdocs/core/class/html.form.class.php | 5 +---- htdocs/user/card.php | 12 ++++++------ 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 369deba4455..276f7bacd69 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -2137,10 +2137,7 @@ class Form $out .= ' selected'; } $out .= ' data-html="'; - $outhtml = ''; - // if (!empty($obj->photo)) { - $outhtml .= $userstatic->getNomUrl(-3, '', 0, 1, 24, 1, 'login', '', 1).' '; - // } + $outhtml = $userstatic->getNomUrl(-3, '', 0, 1, 24, 1, 'login', '', 1).' '; if ($showstatus >= 0 && $obj->status == 0) { $outhtml .= ''; } diff --git a/htdocs/user/card.php b/htdocs/user/card.php index 0af78cc208f..ea47ba10beb 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -1514,7 +1514,7 @@ if ($action == 'create' || $action == 'adduserldap') { $huser = new User($db); if ($object->fk_user > 0) { $huser->fetch($object->fk_user); - print $huser->getNomUrl(1); + print $huser->getNomUrl(-1); } else { print ''.$langs->trans("None").''; } @@ -1532,7 +1532,7 @@ if ($action == 'create' || $action == 'adduserldap') { if (!empty($object->fk_user_expense_validator)) { $evuser = new User($db); $evuser->fetch($object->fk_user_expense_validator); - print $evuser->getNomUrl(1); + print $evuser->getNomUrl(-1); } print ''; print "\n"; @@ -1548,7 +1548,7 @@ if ($action == 'create' || $action == 'adduserldap') { if (!empty($object->fk_user_holiday_validator)) { $hvuser = new User($db); $hvuser->fetch($object->fk_user_holiday_validator); - print $hvuser->getNomUrl(1); + print $hvuser->getNomUrl(-1); } print ''; print "\n"; @@ -2263,7 +2263,7 @@ if ($action == 'create' || $action == 'adduserldap') { print ''; $huser = new User($db); $huser->fetch($object->fk_user); - print $huser->getNomUrl(1); + print $huser->getNomUrl(-1); } print ''; print "\n"; @@ -2281,7 +2281,7 @@ if ($action == 'create' || $action == 'adduserldap') { print ''; $evuser = new User($db); $evuser->fetch($object->fk_user_expense_validator); - print $evuser->getNomUrl(1); + print $evuser->getNomUrl(-1); } print ''; print "\n"; @@ -2300,7 +2300,7 @@ if ($action == 'create' || $action == 'adduserldap') { print ''; $hvuser = new User($db); $hvuser->fetch($object->fk_user_holiday_validator); - print $hvuser->getNomUrl(1); + print $hvuser->getNomUrl(-1); } print ''; print "\n"; From fe2a58cf1d4beb1650c3089a306a7295b388451c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 15 Jan 2023 11:36:31 +0100 Subject: [PATCH 0841/1128] Fix popup of companies in contract home page --- htdocs/contrat/index.php | 113 ++++++++++++++++++++++++++++----------- 1 file changed, 81 insertions(+), 32 deletions(-) diff --git a/htdocs/contrat/index.php b/htdocs/contrat/index.php index d537934a299..c14775449c6 100644 --- a/htdocs/contrat/index.php +++ b/htdocs/contrat/index.php @@ -241,7 +241,7 @@ print "
'; @@ -712,6 +724,7 @@ if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { print $searchpicto; print ' '; print ''; print ''; print ''; $arraygender = array('man'=>$langs->trans("Genderman"), 'woman'=>$langs->trans("Genderwoman"), 'other'=>$langs->trans("Genderother")); print $form->selectarray('search_gender', $arraygender, $search_gender, 1); print ''; print ''; print ''; @@ -756,6 +782,8 @@ if (!empty($arrayfields['d.morphy']['checked'])) { print $form->selectarray('search_morphy', $arraymorphy, $search_morphy, 1, 0, 0, '', 0, 0, 0, '', 'maxwidth100'); print ''; print ''; print ''; print ''; print ''; print ''; print $form->select_country($search_country, 'search_country', '', 0, 'minwidth100imp maxwidth100'); print ''; print ''; - print ''; print ''; print ''; @@ -819,6 +858,7 @@ if (!empty($arrayfields['d.datefin']['checked'])) { print $form->selectarray('search_filter', $selectarray, $search_filter); print ''; print ''; print ''; print ''; @@ -853,11 +897,14 @@ if (!empty($arrayfields['d.statut']['checked'])) { print $form->selectarray('search_status', $liststatus, $search_status, -3, 0, 0, '', 0, 0, 0, '', 'search_status width100 onrightofpage'); print ''; print ''; print ''; @@ -938,6 +985,7 @@ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php'; $parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder); $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; + if (!empty($arrayfields['d.datec']['checked'])) { print_liste_field_titre($arrayfields['d.datec']['label'], $_SERVER["PHP_SELF"], "d.datec", "", $param, 'align="center" class="nowrap"', $sortfield, $sortorder); } @@ -1025,14 +1073,13 @@ while ($i < min($num, $limit)) { } print ''.$obj->rowid.'"; @@ -1142,7 +1189,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } - // State + // State / County / Departement if (!empty($arrayfields['state.nom']['checked'])) { print "".$obj->state_name."'; print ''; print ''; print ''; print ''; @@ -1014,7 +1038,7 @@ if (!empty($arrayfields['p.fk_soc']['checked']) || !empty($arrayfields['s.nom'][ print ''; print ''; print ''; @@ -1079,7 +1103,7 @@ if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { } print '
'; @@ -1247,7 +1272,8 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } - // Name + + // (Last) Name if (!empty($arrayfields['p.lastname']['checked'])) { print ''; print $contactstatic->getNomUrl(1); @@ -1256,6 +1282,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } + // Firstname if (!empty($arrayfields['p.firstname']['checked'])) { print ''.dol_escape_htmltag($obj->firstname).''.dol_escape_htmltag($obj->poste).''.dol_escape_htmltag($obj->address).''.dol_escape_htmltag($obj->zip).''.dol_escape_htmltag($obj->town).'".$obj->state_name."".$obj->region_name."'; @@ -1313,13 +1348,15 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } - // Phone + + // Phone pro if (!empty($arrayfields['p.phone']['checked'])) { print ''.dol_print_phone($obj->phone_pro, $obj->country_code, $obj->rowid, $obj->socid, 'AC_TEL', ' ', 'phone').''.dol_print_phone($obj->phone_perso, $obj->country_code, $obj->rowid, $obj->socid, 'AC_TEL', ' ', 'phone').''.dol_print_phone($obj->phone_mobile, $obj->country_code, $obj->rowid, $obj->socid, 'AC_TEL', ' ', 'mobile').''.dol_print_phone($obj->fax, $obj->country_code, $obj->rowid, $obj->socid, 'AC_TEL', ' ', 'fax').''.dol_print_email($obj->email, $obj->rowid, $obj->socid, 'AC_EMAIL', 18, 0, 1).''; if (empty($obj->email)) { @@ -1361,6 +1402,8 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } + + // Social Networks if (isModEnabled('socialnetworks')) { foreach ($socialnetworks as $key => $value) { if ($value['active'] && !empty($arrayfields['p.'.$key]['checked'])) { @@ -1371,7 +1414,8 @@ while ($i < min($num, $limit)) { } } } - // Company + + // Company / Third Party if (!empty($arrayfields['p.fk_soc']['checked']) || !empty($arrayfields['s.nom']['checked'])) { print ''; if ($obj->socid) { @@ -1404,9 +1448,9 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } - + + // Prospect Level if (!empty($arrayfields['p.fk_prospectlevel']['checked'])) { - // Prospect level print ''; print $contactstatic->getLibProspLevel(); print "
'; print '
'.$contactstatic->libProspCommStatut($obj->stcomm_id, 2, $contactstatic->cacheprospectstatus[$obj->stcomm_id]['label'], $obj->stcomm_picto); print '
-
'; @@ -1437,6 +1481,7 @@ while ($i < min($num, $limit)) { // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook @@ -1450,6 +1495,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } + // Date modification if (!empty($arrayfields['p.tms']['checked'])) { print '
'; @@ -1459,6 +1505,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } + // Status if (!empty($arrayfields['p.statut']['checked'])) { print ''.$contactstatic->getLibStatut(5).''; From 35300b3dfc0b84910959113e74b2555f14804ca7 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Sat, 14 Jan 2023 16:42:30 +0000 Subject: [PATCH 0822/1128] Fixing style errors. --- htdocs/contact/list.php | 50 ++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/htdocs/contact/list.php b/htdocs/contact/list.php index 1cc2d67cf93..f34c477ff71 100644 --- a/htdocs/contact/list.php +++ b/htdocs/contact/list.php @@ -455,7 +455,7 @@ if ($search_priv != '0' && $search_priv != '1') { // Search Categories - // Search Contact Categories + // Search Contact Categories $searchCategoryContactList = $search_categ ? array($search_categ) : array(); $searchCategoryContactOperator = 0; // Search for tag/category ($searchCategoryContactList is an array of ID) @@ -487,7 +487,7 @@ if (!empty($searchCategoryContactList)) { } } - // Search Customer Categories + // Search Customer Categories $searchCategoryCustomerList = $search_categ_thirdparty ? array($search_categ_thirdparty) : array(); $searchCategoryCustomerOperator = 0; // Search for tag/category ($searchCategoryCustomerList is an array of ID) @@ -976,7 +976,7 @@ if (!empty($arrayfields['p.town']['checked'])) { print ''; print ''; @@ -1272,7 +1272,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } - + // (Last) Name if (!empty($arrayfields['p.lastname']['checked'])) { print ''; @@ -1282,7 +1282,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } - + // Firstname if (!empty($arrayfields['p.firstname']['checked'])) { print ''.dol_escape_htmltag($obj->firstname).''.dol_escape_htmltag($obj->poste).''.dol_escape_htmltag($obj->address).''.dol_escape_htmltag($obj->zip).''.dol_escape_htmltag($obj->town).'".$obj->state_name."".$obj->region_name."'; @@ -1348,7 +1348,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } - + // Phone pro if (!empty($arrayfields['p.phone']['checked'])) { print ''.dol_print_phone($obj->phone_pro, $obj->country_code, $obj->rowid, $obj->socid, 'AC_TEL', ' ', 'phone').''.dol_print_phone($obj->phone_perso, $obj->country_code, $obj->rowid, $obj->socid, 'AC_TEL', ' ', 'phone').''.dol_print_phone($obj->phone_mobile, $obj->country_code, $obj->rowid, $obj->socid, 'AC_TEL', ' ', 'mobile').''.dol_print_phone($obj->fax, $obj->country_code, $obj->rowid, $obj->socid, 'AC_TEL', ' ', 'fax').''.dol_print_email($obj->email, $obj->rowid, $obj->socid, 'AC_EMAIL', 18, 0, 1).''; @@ -1402,7 +1402,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } - + // Social Networks if (isModEnabled('socialnetworks')) { foreach ($socialnetworks as $key => $value) { @@ -1448,7 +1448,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } - + // Prospect Level if (!empty($arrayfields['p.fk_prospectlevel']['checked'])) { print ''; @@ -1481,7 +1481,7 @@ while ($i < min($num, $limit)) { // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - + // Fields from hook $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook @@ -1495,7 +1495,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } - + // Date modification if (!empty($arrayfields['p.tms']['checked'])) { print ''; @@ -1505,7 +1505,7 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } } - + // Status if (!empty($arrayfields['p.statut']['checked'])) { print ''.$contactstatic->getLibStatut(5).''; From 64ecdd0632f4ef18518abcedf7ba117635e99362 Mon Sep 17 00:00:00 2001 From: UT from dolibit <45215329+dolibit-ut@users.noreply.github.com> Date: Sat, 14 Jan 2023 18:35:09 +0100 Subject: [PATCH 0823/1128] Update subaccount.php --- htdocs/accountancy/admin/subaccount.php | 32 ++++++++++++++++--------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/htdocs/accountancy/admin/subaccount.php b/htdocs/accountancy/admin/subaccount.php index 4f2274269d8..2f6a731ca48 100644 --- a/htdocs/accountancy/admin/subaccount.php +++ b/htdocs/accountancy/admin/subaccount.php @@ -19,17 +19,18 @@ /** * \file htdocs/accountancy/admin/subaccount.php - * \ingroup Accountancy (Double entries) - * \brief List of accounting sub-account (auxiliary accounts) + * \ingroup Accountancy (Double entries) + * \brief List of accounting sub-account (auxiliary accounts) */ // Load Dolibarr environment require '../../main.inc.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; + // Load translation files required by the page -$langs->loadLangs(array("compta", "bills", "admin", "accountancy", "salaries", "hrm", "errors")); +$langs->loadLangs(array("accountancy", "admin", "bills", "compta", "errors", "hrm", "salaries")); $mesg = ''; $action = GETPOST('action', 'aZ09'); @@ -81,6 +82,7 @@ if ($conf->global->MAIN_FEATURES_LEVEL < 2) { unset($arrayfields['reconcilable']); } + /* * Actions */ @@ -120,11 +122,13 @@ if (empty($reshook)) { $form = new Form($db); -$help_url = ''; -$title = $langs->trans('ChartOfIndividualAccountsOfSubsidiaryLedger'); +// Page Header +$help_url = 'EN:Module_Double_Entry_Accounting#Setup'; +$title = $langs->trans('ChartOfIndividualAccountsOfSubsidiaryLedger'); llxHeader('', $title, $help_url); + // Customer $sql = "SELECT sa.rowid, sa.nom as label, sa.code_compta as subaccount, '1' as type, sa.entity"; $sql .= " FROM ".MAIN_DB_PREFIX."societe sa"; @@ -219,7 +223,7 @@ if (!empty($search_type) && $search_type >= 0) { $sql .= " HAVING type LIKE '".$db->escape($search_type)."'"; } -// User +// User - Employee $sql .= " UNION "; $sql .= " SELECT u.rowid, u.lastname as label, u.accountancy_code as subaccount, '3' as type, u.entity FROM ".MAIN_DB_PREFIX."user u"; $sql .= " WHERE u.entity IN (".getEntity('user').")"; @@ -400,14 +404,17 @@ if ($resql) { if (!empty($arrayfields['type']['checked'])) { print ''; $s = ''; + // Customer if ($obj->type == 1) { $s .= ''.$langs->trans("Customer").''; } elseif ($obj->type == 2) { - // Supplier + + // Supplier $s .= ''.$langs->trans("Supplier").''; } elseif ($obj->type == 3) { - // User + + // User - Employee $s .= ''.$langs->trans("Employee").''; } print $s; @@ -440,14 +447,17 @@ if ($resql) { // Action print ''; $e = ''; + // Customer if ($obj->type == 1) { $e .= ''.img_edit().''; } elseif ($obj->type == 2) { - // Supplier + + // Supplier $e .= ''.img_edit().''; } elseif ($obj->type == 3) { - // User + + // User - Employee $e .= ''.img_edit().''; } print $e; From 5fef3398fd2e70a17ff9d3c8ce9b4185e1deb356 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Sat, 14 Jan 2023 17:36:09 +0000 Subject: [PATCH 0824/1128] Fixing style errors. --- htdocs/accountancy/admin/subaccount.php | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/htdocs/accountancy/admin/subaccount.php b/htdocs/accountancy/admin/subaccount.php index 2f6a731ca48..40055a4b75f 100644 --- a/htdocs/accountancy/admin/subaccount.php +++ b/htdocs/accountancy/admin/subaccount.php @@ -404,17 +404,15 @@ if ($resql) { if (!empty($arrayfields['type']['checked'])) { print ''; $s = ''; - + // Customer if ($obj->type == 1) { $s .= ''.$langs->trans("Customer").''; } elseif ($obj->type == 2) { - - // Supplier + // Supplier $s .= ''.$langs->trans("Supplier").''; } elseif ($obj->type == 3) { - - // User - Employee + // User - Employee $s .= ''.$langs->trans("Employee").''; } print $s; @@ -447,17 +445,15 @@ if ($resql) { // Action print ''; $e = ''; - + // Customer if ($obj->type == 1) { $e .= ''.img_edit().''; } elseif ($obj->type == 2) { - - // Supplier + // Supplier $e .= ''.img_edit().''; } elseif ($obj->type == 3) { - - // User - Employee + // User - Employee $e .= ''.img_edit().''; } print $e; From 982ee6259fa649b233b98e0e5e9f88a5127cc54e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 14 Jan 2023 21:21:48 +0100 Subject: [PATCH 0825/1128] NEW Session invalidation after a password change --- htdocs/api/class/api_login.class.php | 3 +++ htdocs/core/lib/security2.lib.php | 7 +++---- htdocs/core/lib/ws.lib.php | 4 ++++ htdocs/core/login/functions_dolibarr.php | 19 ++++++++++++++++++- htdocs/main.inc.php | 1 + htdocs/user/card.php | 4 ++++ htdocs/user/class/user.class.php | 2 +- 7 files changed, 34 insertions(+), 6 deletions(-) diff --git a/htdocs/api/class/api_login.class.php b/htdocs/api/class/api_login.class.php index d5362f4ac56..0b8d3e64828 100644 --- a/htdocs/api/class/api_login.class.php +++ b/htdocs/api/class/api_login.class.php @@ -121,6 +121,9 @@ class Login include_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php'; $login = checkLoginPassEntity($login, $password, $entity, $authmode, 'api'); // Check credentials. + if ($login === '--bad-login-validity--') { + $login = ''; + } if (empty($login)) { throw new RestException(403, 'Access denied'); } diff --git a/htdocs/core/lib/security2.lib.php b/htdocs/core/lib/security2.lib.php index b33ad1333ef..5e4d58103d8 100644 --- a/htdocs/core/lib/security2.lib.php +++ b/htdocs/core/lib/security2.lib.php @@ -52,12 +52,11 @@ function dol_getwebuser($mode) * @param string $entitytotest Instance of data we must check * @param array $authmode Array list of selected authentication mode array('http', 'dolibarr', 'xxx'...) * @param string $context Context checkLoginPassEntity was created for ('api', 'dav', 'ws', '') - * @return string Login or '' + * @return string Login or '' or '--bad-login-validity--' */ function checkLoginPassEntity($usertotest, $passwordtotest, $entitytotest, $authmode, $context = '') { global $conf, $langs; - //global $dolauthmode; // To return authentication finally used // Check parameters if ($entitytotest == '') { @@ -100,10 +99,10 @@ function checkLoginPassEntity($usertotest, $passwordtotest, $entitytotest, $auth if ($login && $login != '--bad-login-validity--') { // Login is successfull $test = false; // To stop once at first login success $conf->authmode = $mode; // This properties is defined only when logged to say what mode was successfully used - $dol_tz = GETPOST('tz'); + /*$dol_tz = GETPOST('tz'); $dol_dst = GETPOST('dst'); $dol_screenwidth = GETPOST('screenwidth'); - $dol_screenheight = GETPOST('screenheight'); + $dol_screenheight = GETPOST('screenheight');*/ } } else { dol_syslog("Authentication KO - failed to load file '".$authfile."'", LOG_ERR); diff --git a/htdocs/core/lib/ws.lib.php b/htdocs/core/lib/ws.lib.php index ad4688f9134..a26604b18bc 100644 --- a/htdocs/core/lib/ws.lib.php +++ b/htdocs/core/lib/ws.lib.php @@ -86,6 +86,10 @@ function check_authentication($authentication, &$error, &$errorcode, &$errorlabe include_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php'; $login = checkLoginPassEntity($authentication['login'], $authentication['password'], $authentication['entity'], $authmode, 'ws'); + if ($login === '--bad-login-validity--') { + $login = ''; + } + if (empty($login)) { $error++; $errorcode = 'BAD_CREDENTIALS'; diff --git a/htdocs/core/login/functions_dolibarr.php b/htdocs/core/login/functions_dolibarr.php index e8c3ab38e46..b732d2ef64b 100644 --- a/htdocs/core/login/functions_dolibarr.php +++ b/htdocs/core/login/functions_dolibarr.php @@ -28,6 +28,7 @@ /** * Check validity of user/password/entity * If test is ko, reason must be filled into $_SESSION["dol_loginmesg"] + * Note: On critical error (hack attempt), we put a log "functions_dolibarr::check_user_password_dolibarr authentication KO" * * @param string $usertotest Login * @param string $passwordtotest Password @@ -56,7 +57,7 @@ function check_user_password_dolibarr($usertotest, $passwordtotest, $entitytotes $usernamecol2 = 'email'; $entitycol = 'entity'; - $sql = "SELECT rowid, login, entity, pass, pass_crypted, datestartvalidity, dateendvalidity"; + $sql = "SELECT rowid, login, entity, pass, pass_crypted, datestartvalidity, dateendvalidity, flagdelsessionsbefore"; $sql .= " FROM ".$table; $sql .= " WHERE (".$usernamecol1." = '".$db->escape($usertotest)."'"; if (preg_match('/@/', $usertotest)) { @@ -74,18 +75,34 @@ function check_user_password_dolibarr($usertotest, $passwordtotest, $entitytotes $obj = $db->fetch_object($resql); if ($obj) { $now = dol_now(); + // Check date start validity if ($obj->datestartvalidity && $db->jdate($obj->datestartvalidity) > $now) { // Load translation files required by the page $langs->loadLangs(array('main', 'errors')); $_SESSION["dol_loginmesg"] = $langs->transnoentitiesnoconv("ErrorLoginDateValidity"); + dol_syslog("functions_dolibarr::check_user_password_dolibarr bad datestart validity", LOG_WARNING); return '--bad-login-validity--'; } + // Check date end validity if ($obj->dateendvalidity && $db->jdate($obj->dateendvalidity) < dol_get_first_hour($now)) { // Load translation files required by the page $langs->loadLangs(array('main', 'errors')); $_SESSION["dol_loginmesg"] = $langs->transnoentitiesnoconv("ErrorLoginDateValidity"); + dol_syslog("functions_dolibarr::check_user_password_dolibarr bad date end validity", LOG_WARNING); return '--bad-login-validity--'; } + // If there is an invalidation date, check that the current session date is not before this date + if ($obj->flagdelsessionsbefore && !empty($_SESSION["dol_logindate"])) { + dol_syslog("functions_dolibarr::check_user_password_dolibarr user has a date for session invalidation = ".$obj->flagdelsessionsbefore." and session date = ".$_SESSION["dol_logindate"]); + $datetmp = $db->jdate($obj->flagdelsessionsbefore, 'gmt'); + if ($datetmp > $now) { + // Load translation files required by the page + $langs->loadLangs(array('main', 'errors')); + $_SESSION["dol_loginmesg"] = $langs->transnoentitiesnoconv("ErrorSessionInvalidatedAfterPasswordChange"); + dol_syslog("functions_dolibarr::check_user_password_dolibarr session was invalidated", LOG_WARNING); + return '--bad-login-validity--'; + } + } $passclear = $obj->pass; $passcrypted = $obj->pass_crypted; diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 549c72157a6..7d764d4a105 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1048,6 +1048,7 @@ if (!defined('NOLOGIN')) { // Store value into session (values always stored) $_SESSION["dol_login"] = $user->login; + $_SESSION["dol_logindate"] = dol_now('gmt'); $_SESSION["dol_authmode"] = isset($dol_authmode) ? $dol_authmode : ''; $_SESSION["dol_tz"] = isset($dol_tz) ? $dol_tz : ''; $_SESSION["dol_tz_string"] = isset($dol_tz_string) ? $dol_tz_string : ''; diff --git a/htdocs/user/card.php b/htdocs/user/card.php index 67ea2174322..0af78cc208f 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -71,6 +71,10 @@ $group = GETPOST("group", "int", 3); $cancel = GETPOST('cancel', 'alpha'); $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'useracard'; // To manage different context of search +if (empty($id)) { + $id = $user->id; +} + $dateemployment = dol_mktime(0, 0, 0, GETPOST('dateemploymentmonth', 'int'), GETPOST('dateemploymentday', 'int'), GETPOST('dateemploymentyear', 'int')); $dateemploymentend = dol_mktime(0, 0, 0, GETPOST('dateemploymentendmonth', 'int'), GETPOST('dateemploymentendday', 'int'), GETPOST('dateemploymentendyear', 'int')); $datestartvalidity = dol_mktime(0, 0, 0, GETPOST('datestartvaliditymonth', 'int'), GETPOST('datestartvalidityday', 'int'), GETPOST('datestartvalidityyear', 'int')); diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 9e208ff3e37..7e342e64337 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -2298,7 +2298,7 @@ class User extends CommonObject $sql = "UPDATE ".$this->db->prefix()."user"; $sql .= " SET pass_crypted = '".$this->db->escape($password_crypted)."',"; $sql .= " pass_temp = null"; - if (empty($flagdelsessionsbefore)) { + if (!empty($flagdelsessionsbefore)) { $sql .= ", flagdelsessionsbefore = '".$this->db->idate(dol_now() - 5, 'gmt')."'"; } if (!empty($conf->global->DATABASE_PWD_ENCRYPTED)) { From 39a224d7a1eaf637c369a199a8971b5c5874a019 Mon Sep 17 00:00:00 2001 From: UT from dolibit <45215329+dolibit-ut@users.noreply.github.com> Date: Sun, 15 Jan 2023 01:18:32 +0100 Subject: [PATCH 0826/1128] Update bookmarks.lang --- htdocs/langs/en_US/bookmarks.lang | 47 ++++++++++++++++--------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/htdocs/langs/en_US/bookmarks.lang b/htdocs/langs/en_US/bookmarks.lang index 26551eee4f0..bfbab1ef520 100644 --- a/htdocs/langs/en_US/bookmarks.lang +++ b/htdocs/langs/en_US/bookmarks.lang @@ -1,23 +1,24 @@ -# Dolibarr language file - Source file is en_US - marque pages -AddThisPageToBookmarks=Add current page to bookmarks -Bookmark=Bookmark -Bookmarks=Bookmarks -ListOfBookmarks=List of bookmarks -EditBookmarks=List/edit bookmarks -NewBookmark=New bookmark -ShowBookmark=Show bookmark -OpenANewWindow=Open a new tab -ReplaceWindow=Replace current tab -BookmarkTargetNewWindowShort=New tab -BookmarkTargetReplaceWindowShort=Current tab -BookmarkTitle=Bookmark name -UrlOrLink=URL -BehaviourOnClick=Behaviour when a bookmark URL is selected -CreateBookmark=Create bookmark -SetHereATitleForLink=Set a name for the bookmark -UseAnExternalHttpLinkOrRelativeDolibarrLink=Use an external/absolute link (https://externalurl.com) or an internal/relative link (/mypage.php). You can also use phone like tel:0123456. -ChooseIfANewWindowMustBeOpenedOnClickOnBookmark=Choose if the linked page should open in the current tab or a new tab -BookmarksManagement=Bookmarks management -BookmarksMenuShortCut=Ctrl + shift + m -NoBookmarks=No bookmarks defined -NoBookmarkFound=No bookmark found \ No newline at end of file +# Dolibarr language file - Source file is en_US - marque pages / bookmarks + +AddThisPageToBookmarks = Add current page to bookmarks +BehaviourOnClick = Behaviour when a bookmark URL is selected +Bookmark = Bookmark +Bookmarks = Bookmarks +BookmarkTargetNewWindowShort = New tab +BookmarkTargetReplaceWindowShort = Current tab +BookmarkTitle = Bookmark name +BookmarksManagement = Bookmarks management +BookmarksMenuShortCut = Ctrl + shift + m +ChooseIfANewWindowMustBeOpenedOnClickOnBookmark = Choose if the linked page should open in the current tab or a new tab +CreateBookmark = Create bookmark +EditBookmarks = List/edit bookmarks +ListOfBookmarks = List of bookmarks +NewBookmark = New bookmark +NoBookmarkFound = No bookmark found +NoBookmarks = No bookmarks defined +OpenANewWindow = Open a new tab +ReplaceWindow = Replace current tab +SetHereATitleForLink = Set a name for the bookmark +ShowBookmark = Show bookmark +UrlOrLink = URL +UseAnExternalHttpLinkOrRelativeDolibarrLink = Use an external/absolute link (https://externalurl.com) or an internal/relative link (/mypage.php). You can also use phone like tel:0123456. From b754b7a99fb530c4f7eee006ae7dc9b0ef0ee51f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 15 Jan 2023 01:25:07 +0100 Subject: [PATCH 0827/1128] Enhance vcard --- htdocs/core/class/vcard.class.php | 10 ++++++---- htdocs/public/users/view.php | 27 +++++++++++++++------------ htdocs/user/virtualcard.php | 8 ++++++++ 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/htdocs/core/class/vcard.class.php b/htdocs/core/class/vcard.class.php index e7eb318e476..4404736f5e0 100644 --- a/htdocs/core/class/vcard.class.php +++ b/htdocs/core/class/vcard.class.php @@ -183,7 +183,7 @@ class vCard } /** - * mise en forme de l'adresse + * Address * * @param string $postoffice Postoffice * @param string $extended Extended @@ -196,7 +196,7 @@ class vCard * @param string $label Label * @return void */ - public function setAddress($postoffice = "", $extended = "", $street = "", $city = "", $region = "", $zip = "", $country = "", $type = "HOME", $label = '') + public function setAddress($postoffice = "", $extended = "", $street = "", $city = "", $region = "", $zip = "", $country = "", $type = "", $label = "") { // $type may be DOM | INTL | POSTAL | PARCEL | HOME | WORK or any combination of these: e.g. "WORK;PARCEL;POSTAL" $key = "ADR"; @@ -207,7 +207,7 @@ class vCard $key .= ';LABEL="'.encode($label).'"'; } $key .= ";".$this->encoding; - $this->properties[$key] = ";".encode($extended).";".encode($street).";".encode($city).";".encode($region).";".encode($zip).";".encode($country); + $this->properties[$key] = encode($postoffice).";".encode($extended).";".encode($street).";".encode($city).";".encode($region).";".encode($zip).";".encode($country); //if ($this->properties["LABEL;".$type.";".$this->encoding] == '') { //$this->setLabel($postoffice, $extended, $street, $city, $region, $zip, $country, $type); @@ -215,7 +215,7 @@ class vCard } /** - * mise en forme du label + * Address (old standard) * * @param string $postoffice Postoffice * @param string $extended Extended @@ -226,6 +226,7 @@ class vCard * @param string $country Country * @param string $type Type * @return void + * @deprecated */ public function setLabel($postoffice = "", $extended = "", $street = "", $city = "", $region = "", $zip = "", $country = "", $type = "HOME") { @@ -378,6 +379,7 @@ class vCard /** * Return a VCARD string + * See RFC https://datatracker.ietf.org/doc/html/rfc6350 * * @param Object $object Object (User or Contact) * @param Societe|null $company Company. May be null diff --git a/htdocs/public/users/view.php b/htdocs/public/users/view.php index ec5f53377c2..a5d3ac5b1e6 100644 --- a/htdocs/public/users/view.php +++ b/htdocs/public/users/view.php @@ -114,11 +114,11 @@ if (!empty($object->photo)) { $urllogo = ''; $urllogofull = ''; if (!empty($logosmall) && is_readable($dir.'/'.$logosmall)) { - $urllogo = DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$conf->entity.'&securekey='.urlencode($securekey).'&file='.urlencode($logosmall); - $urllogofull = $dolibarr_main_url_root.'/viewimage.php?modulepart='.$modulepart.'&entity='.$conf->entity.'&securekey='.urlencode($securekey).'&file='.urlencode($logosmall); + $urllogo = DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.($conf->entity > 1 ? '&entity='.$conf->entity : '').'&securekey='.urlencode($securekey).'&file='.urlencode($logosmall); + $urllogofull = $dolibarr_main_url_root.'/viewimage.php?modulepart='.$modulepart.($conf->entity > 1 ? '&entity='.$conf->entity : '').'&securekey='.urlencode($securekey).'&file='.urlencode($logosmall); } elseif (!empty($logo) && is_readable($dir.'/'.$logo)) { - $urllogo = DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$conf->entity.'&securekey='.urlencode($securekey).'&file='.urlencode($logo); - $urllogofull = $dolibarr_main_url_root.'/viewimage.php?modulepart='.$modulepart.'&entity='.$conf->entity.'&securekey='.urlencode($securekey).'&file='.urlencode($logo); + $urllogo = DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.($conf->entity > 1 ? '&entity='.$conf->entity : '').'&securekey='.urlencode($securekey).'&file='.urlencode($logo); + $urllogofull = $dolibarr_main_url_root.'/viewimage.php?modulepart='.$modulepart.($conf->entity > 1 ? '&entity='.$conf->entity : '').'&securekey='.urlencode($securekey).'&file='.urlencode($logo); } // Clean data we don't want on public page @@ -152,6 +152,12 @@ if (getDolUserInt('USER_PUBLIC_HIDE_BIRTH', 0, $object)) { if (getDolUserInt('USER_PUBLIC_HIDE_SOCIALNETWORKS', 0, $object)) { $object->socialnetworks = ''; } +if (getDolUserInt('USER_PUBLIC_HIDE_ADDRESS', 0, $object)) { + $object->address = ''; + $object->zip = ''; + $object->state = ''; + $object->country = ''; +} if (getDolUserInt('USER_PUBLIC_HIDE_COMPANY', 0, $object)) { $company = null; } @@ -159,9 +165,6 @@ if (getDolUserInt('USER_PUBLIC_HIDE_COMPANY', 0, $object)) { // Output vcard if ($mode == 'vcard') { - // Reset data no selected for public VCard - - // We create VCard $output = $v->buildVCardString($object, $company, $langs, $urllogofull); @@ -169,7 +172,7 @@ if ($mode == 'vcard') { $filenameurlencoded = dol_sanitizeFileName(urlencode($filename)); //$filename = dol_sanitizeFileName($filename); - top_httphead('text/x-vcard; name="'.$filename.'"'); + top_httphead('text/vcard; name="'.$filename.'"'); header("Content-Disposition: attachment; filename=\"".$filename."\""); header("Content-Length: ".dol_strlen($output)); @@ -387,11 +390,11 @@ if (!getDolUserInt('USER_PUBLIC_HIDE_COMPANY', 0, $object)) { $urllogo = ''; $urllogofull = ''; if (!empty($logosmall) && is_readable($conf->mycompany->dir_output.'/logos/thumbs/'.$logosmall)) { - $urllogo = DOL_URL_ROOT.'/viewimage.php?modulepart=mycompany&entity='.$conf->entity.'&file='.urlencode('logos/thumbs/'.$logosmall); - $urllogofull = $dolibarr_main_url_root.'/viewimage.php?modulepart=mycompany&entity='.$conf->entity.'&file='.urlencode('logos/thumbs/'.$logosmall); + $urllogo = DOL_URL_ROOT.'/viewimage.php?modulepart=mycompany'.($conf->entity > 1 ? '&entity='.$conf->entity : '').'&file='.urlencode('logos/thumbs/'.$logosmall); + $urllogofull = $dolibarr_main_url_root.'/viewimage.php?modulepart=mycompany'.($conf->entity > 1 ? '&entity='.$conf->entity : '').'&file='.urlencode('logos/thumbs/'.$logosmall); } elseif (!empty($logo) && is_readable($conf->mycompany->dir_output.'/logos/'.$logo)) { - $urllogo = DOL_URL_ROOT.'/viewimage.php?modulepart=mycompany&entity='.$conf->entity.'&file='.urlencode('logos/'.$logo); - $urllogofull = $dolibarr_main_url_root.'/viewimage.php?modulepart=mycompany&entity='.$conf->entity.'&file='.urlencode('logos/'.$logo); + $urllogo = DOL_URL_ROOT.'/viewimage.php?modulepart=mycompany'.($conf->entity > 1 ? '&entity='.$conf->entity : '').'&file='.urlencode('logos/'.$logo); + $urllogofull = $dolibarr_main_url_root.'/viewimage.php?modulepart=mycompany'.($conf->entity > 1 ? '&entity='.$conf->entity : '').'&file='.urlencode('logos/'.$logo); } // Output html code for logo if ($urllogo) { diff --git a/htdocs/user/virtualcard.php b/htdocs/user/virtualcard.php index 7e13950747c..4685c6e9b16 100644 --- a/htdocs/user/virtualcard.php +++ b/htdocs/user/virtualcard.php @@ -75,6 +75,7 @@ if ($action == 'update') { $tmparray['USER_PUBLIC_HIDE_USER_MOBILE'] = (GETPOST('USER_PUBLIC_HIDE_USER_MOBILE') ? 1 : 0); $tmparray['USER_PUBLIC_HIDE_BIRTH'] = (GETPOST('USER_PUBLIC_HIDE_BIRTH') ? 1 : 0); $tmparray['USER_PUBLIC_HIDE_SOCIALNETWORKS'] = (GETPOST('USER_PUBLIC_HIDE_SOCIALNETWORKS') ? 1 : 0); + $tmparray['USER_PUBLIC_HIDE_ADDRESS'] = (GETPOST('USER_PUBLIC_HIDE_ADDRESS') ? 1 : 0); $tmparray['USER_PUBLIC_HIDE_COMPANY'] = (GETPOST('USER_PUBLIC_HIDE_COMPANY') ? 1 : 0); $tmparray['USER_PUBLIC_MORE'] = (GETPOST('USER_PUBLIC_MORE') ? GETPOST('USER_PUBLIC_MORE') : ''); @@ -242,6 +243,13 @@ if (getDolUserInt('USER_ENABLE_PUBLIC', 0, $object)) { print $form->selectyesno("USER_PUBLIC_HIDE_SOCIALNETWORKS", (getDolUserInt('USER_PUBLIC_HIDE_SOCIALNETWORKS', 0, $object) ? getDolUserInt('USER_PUBLIC_HIDE_SOCIALNETWORKS', 0, $object) : 0), 1); print "
'; + print $langs->trans("HideOnVCard", $langs->transnoentitiesnoconv("Address")); + print ''; + print $form->selectyesno("USER_PUBLIC_HIDE_ADDRESS", (getDolUserInt('USER_PUBLIC_HIDE_ADDRESS', 0, $object) ? getDolUserInt('USER_PUBLIC_HIDE_ADDRESS', 0, $object) : 0), 1); + print "
'; print $langs->trans("HideOnVCard", $langs->transnoentitiesnoconv("CompanySection")); From 35a7f3c0ff759ee89ac1f4fdc45db37a26bd209e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 15 Jan 2023 01:28:02 +0100 Subject: [PATCH 0828/1128] Enhance vcard --- htdocs/core/class/vcard.class.php | 2 +- htdocs/public/users/view.php | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/core/class/vcard.class.php b/htdocs/core/class/vcard.class.php index 4404736f5e0..8d586648f80 100644 --- a/htdocs/core/class/vcard.class.php +++ b/htdocs/core/class/vcard.class.php @@ -449,7 +449,7 @@ class vCard $country = $object->country_code ? $object->country : ''; if ($object->address || $object->town || $object->state || $object->zip || $object->country) { - $this->setAddress("", "", $object->address, $object->town, $object->state, $object->zip, $country, "TYPE=WORK"); + $this->setAddress("", "", $object->address, $object->town, $object->state, $object->zip, $country, ""); //$this->setLabel("", "", $object->address, $object->town, $object->state, $object->zip, $country, "TYPE=HOME"); } diff --git a/htdocs/public/users/view.php b/htdocs/public/users/view.php index a5d3ac5b1e6..03d153dedd0 100644 --- a/htdocs/public/users/view.php +++ b/htdocs/public/users/view.php @@ -154,6 +154,7 @@ if (getDolUserInt('USER_PUBLIC_HIDE_SOCIALNETWORKS', 0, $object)) { } if (getDolUserInt('USER_PUBLIC_HIDE_ADDRESS', 0, $object)) { $object->address = ''; + $object->town = ''; $object->zip = ''; $object->state = ''; $object->country = ''; From e41098c5273838f1ac3d7991eaec8a4c84061f52 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 15 Jan 2023 01:31:23 +0100 Subject: [PATCH 0829/1128] Enhance vcard --- htdocs/core/class/vcard.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/vcard.class.php b/htdocs/core/class/vcard.class.php index 8d586648f80..7625954690b 100644 --- a/htdocs/core/class/vcard.class.php +++ b/htdocs/core/class/vcard.class.php @@ -31,7 +31,7 @@ */ function encode($string) { - return str_replace(";", "\;", (dol_quoted_printable_encode(utf8_decode($string)))); + return str_replace(";", "\;", (dol_quoted_printable_encode($string))); } @@ -488,7 +488,7 @@ class vCard $this->setPhoneNumber($company->fax, "TYPE=WORK,FAX"); } if ($company->address || $company->town || $company->state || $company->zip || $company->country) { - $this->setAddress("", "", $company->address, $company->town, $company->state, $company->zip, $company->country, "TYPE=WORK"); + $this->setAddress("", "", $company->address, $company->town, $company->state, $company->zip, $company->country, ""); } if ($company->email && $company->email != $object->email) { From f8e5889ba7777d056a297c0c882a71c1841f5cd0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 15 Jan 2023 01:42:11 +0100 Subject: [PATCH 0830/1128] Enhance vcard --- htdocs/core/class/vcard.class.php | 2 +- htdocs/langs/en_US/companies.lang | 3 ++- htdocs/user/virtualcard.php | 11 ++++++----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/htdocs/core/class/vcard.class.php b/htdocs/core/class/vcard.class.php index 7625954690b..a5e1cbf6814 100644 --- a/htdocs/core/class/vcard.class.php +++ b/htdocs/core/class/vcard.class.php @@ -488,7 +488,7 @@ class vCard $this->setPhoneNumber($company->fax, "TYPE=WORK,FAX"); } if ($company->address || $company->town || $company->state || $company->zip || $company->country) { - $this->setAddress("", "", $company->address, $company->town, $company->state, $company->zip, $company->country, ""); + $this->setAddress("", "", $company->address, $company->town, $company->state, $company->zip, $company->country, "TYPE=WORK"); } if ($company->email && $company->email != $object->email) { diff --git a/htdocs/langs/en_US/companies.lang b/htdocs/langs/en_US/companies.lang index 7200ffb3d70..d31ecb077ff 100644 --- a/htdocs/langs/en_US/companies.lang +++ b/htdocs/langs/en_US/companies.lang @@ -499,4 +499,5 @@ OutOfEurope=Out of Europe (EEC) CurrentOutstandingBillLate=Current outstanding bill late BecarefullChangeThirdpartyBeforeAddProductToInvoice=Be carefull, depending on your product price settings, you should change thirdparty before adding product to POS. EmailAlreadyExistsPleaseRewriteYourCompanyName=email already exists please rewrite your company name -TwoRecordsOfCompanyName=more than one record exists for this company please contact us to complete your partnership request" \ No newline at end of file +TwoRecordsOfCompanyName=more than one record exists for this company please contact us to complete your partnership request" +CompanySection=Company section \ No newline at end of file diff --git a/htdocs/user/virtualcard.php b/htdocs/user/virtualcard.php index 4685c6e9b16..04f8fb42030 100644 --- a/htdocs/user/virtualcard.php +++ b/htdocs/user/virtualcard.php @@ -210,21 +210,21 @@ if (getDolUserInt('USER_ENABLE_PUBLIC', 0, $object)) { // Office phone print '
'; - print $langs->trans("HideOnVCard", $langs->transnoentitiesnoconv("OfficePhone")); + print $langs->trans("HideOnVCard", $langs->transnoentitiesnoconv("PhonePro")); print ''; print $form->selectyesno("USER_PUBLIC_HIDE_OFFICE_PHONE", (getDolUserInt('USER_PUBLIC_HIDE_OFFICE_PHONE', 0, $object) ? getDolUserInt('USER_PUBLIC_HIDE_OFFICE_PHONE', 0, $object) : 0), 1); print "
'; - print $langs->trans("HideOnVCard", $langs->transnoentitiesnoconv("OfficeFax")); + print $langs->trans("HideOnVCard", $langs->transnoentitiesnoconv("Fax")); print ''; print $form->selectyesno("USER_PUBLIC_HIDE_OFFICE_FAX", (getDolUserInt('USER_PUBLIC_HIDE_OFFICE_FAX', 0, $object) ? getDolUserInt('USER_PUBLIC_HIDE_OFFICE_FAX', 0, $object) : 0), 1); print "
'; - print $langs->trans("HideOnVCard", $langs->transnoentitiesnoconv("UserMobile")); + print $langs->trans("HideOnVCard", $langs->transnoentitiesnoconv("PhoneMobile")); print ''; print $form->selectyesno("USER_PUBLIC_HIDE_USER_MOBILE", (getDolUserInt('USER_PUBLIC_HIDE_USER_MOBILE', 0, $object) ? getDolUserInt('USER_PUBLIC_HIDE_USER_MOBILE', 0, $object) : 0), 1); print "
'; - print $langs->trans("HideOnVCard", $langs->transnoentitiesnoconv("SocialNetworks")); + print $langs->trans("HideOnVCard", $langs->transnoentitiesnoconv("SocialNetworksInformation")); print ''; print $form->selectyesno("USER_PUBLIC_HIDE_SOCIALNETWORKS", (getDolUserInt('USER_PUBLIC_HIDE_SOCIALNETWORKS', 0, $object) ? getDolUserInt('USER_PUBLIC_HIDE_SOCIALNETWORKS', 0, $object) : 0), 1); print "
'; require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; - $doleditor = new DolEditor('USER_PUBLIC_MORE', getDolUserString('USER_PUBLIC_MORE', '', $object), '', 160, 'dolibarr_notes', '', false, false, isModEnabled('fckeditor'), ROWS_5, '90%'); + $extendededitor = 0; // We force no WYSIWYG editor + $doleditor = new DolEditor('USER_PUBLIC_MORE', getDolUserString('USER_PUBLIC_MORE', '', $object), '', 160, 'dolibarr_notes', '', false, false, $extendededitor, ROWS_5, '90%'); $doleditor->Create(); print "

"; if (isModEnabled('contrat') && $user->rights->contrat->lire) { $sql = "SELECT c.rowid, c.ref,"; - $sql .= " s.nom as name, s.rowid as socid"; + $sql .= " s.nom as name, s.name_alias, s.logo, s.rowid as socid, s.client, s.fournisseur, s.code_client, s.code_fournisseur, s.code_compta, s.code_compta_fournisseur"; $sql .= " FROM ".MAIN_DB_PREFIX."contrat as c, ".MAIN_DB_PREFIX."societe as s"; if (empty($user->rights->societe->client->voir) && !$socid) { $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; @@ -266,8 +266,6 @@ if (isModEnabled('contrat') && $user->rights->contrat->lire) { print ''; print ''.$langs->trans("DraftContracts").($num ? ''.$num.'' : '').''; if ($num) { - $companystatic = new Societe($db); - $i = 0; //$tot_ttc = 0; while ($i < $num) { @@ -276,22 +274,29 @@ if (isModEnabled('contrat') && $user->rights->contrat->lire) { $staticcontrat->ref = $obj->ref; $staticcontrat->id = $obj->rowid; - $companystatic->id = $obj->socid; - $companystatic->name = $obj->name; - $companystatic->client = 1; + $staticcompany->id = $obj->socid; + $staticcompany->name = $obj->name; + $staticcompany->name_alias = $obj->name_alias; + $staticcompany->photo = 1; + $staticcompany->code_client = $obj->code_client; + $staticcompany->code_fournisseur = $obj->code_fournisseur; + $staticcompany->code_compta = $obj->code_compta; + $staticcompany->code_compta_fournisseur = $obj->code_compta_fournisseur; + $staticcompany->client = $obj->client; + $staticcompany->fournisseur = $obj->fournisseur; print ''; print $staticcontrat->getNomUrl(1, ''); print ''; print ''; - print $companystatic->getNomUrl(1, '', 16); + print $staticcompany->getNomUrl(1, '', 16); print ''; print ''; //$tot_ttc+=$obj->total_ttc; $i++; } } else { - print ''.$langs->trans("NoContracts").''; + print ''.$langs->trans("NoContracts").''; } print "

"; $db->free($resql); @@ -312,7 +317,8 @@ $sql .= " sum(".$db->ifsql("cd.statut=4 AND (cd.date_fin_validite IS NULL OR cd. $sql .= " sum(".$db->ifsql("cd.statut=4 AND (cd.date_fin_validite IS NOT NULL AND cd.date_fin_validite < '".$db->idate($now)."')", 1, 0).') as nb_expired,'; $sql .= " sum(".$db->ifsql("cd.statut=4 AND (cd.date_fin_validite IS NOT NULL AND cd.date_fin_validite < '".$db->idate($now - $conf->contrat->services->expires->warning_delay)."')", 1, 0).') as nb_late,'; $sql .= " sum(".$db->ifsql("cd.statut=5", 1, 0).') as nb_closed,'; -$sql .= " c.rowid as cid, c.ref, c.datec, c.tms, c.statut, s.nom as name, s.rowid as socid"; +$sql .= " c.rowid as cid, c.ref, c.datec, c.tms, c.statut,"; +$sql .= " s.nom as name, s.name_alias, s.logo, s.rowid as socid, s.client, s.fournisseur, s.code_client, s.code_fournisseur, s.code_compta, s.code_compta_fournisseur"; $sql .= " FROM ".MAIN_DB_PREFIX."societe as s,"; if (empty($user->rights->societe->client->voir) && !$socid) { $sql .= " ".MAIN_DB_PREFIX."societe_commerciaux as sc,"; @@ -328,7 +334,8 @@ if (empty($user->rights->societe->client->voir) && !$socid) { if ($socid) { $sql .= " AND s.rowid = ".((int) $socid); } -$sql .= " GROUP BY c.rowid, c.ref, c.datec, c.tms, c.statut, s.nom, s.rowid"; +$sql .= " GROUP BY c.rowid, c.ref, c.datec, c.tms, c.statut,"; +$sql .= " s.nom, s.name_alias, s.logo, s.rowid, s.client, s.fournisseur, s.code_client, s.code_fournisseur, s.code_compta, s.code_compta_fournisseur"; $sql .= " ORDER BY c.tms DESC"; $sql .= $db->plimit($max); @@ -356,6 +363,14 @@ if ($result) { $staticcompany->id = $obj->socid; $staticcompany->name = $obj->name; + $staticcompany->name_alias = $obj->name_alias; + $staticcompany->photo = 1; + $staticcompany->code_client = $obj->code_client; + $staticcompany->code_fournisseur = $obj->code_fournisseur; + $staticcompany->code_compta = $obj->code_compta; + $staticcompany->code_compta_fournisseur = $obj->code_compta_fournisseur; + $staticcompany->client = $obj->client; + $staticcompany->fournisseur = $obj->fournisseur; print ''; print ''; @@ -389,9 +404,9 @@ if ($result) { print '
'; // Last modified services -$sql = "SELECT c.ref, c.fk_soc, "; +$sql = "SELECT c.ref, c.fk_soc as socid,"; $sql .= " cd.rowid as cid, cd.statut, cd.label, cd.fk_product, cd.description as note, cd.fk_contrat, cd.date_fin_validite,"; -$sql .= " s.nom as name,"; +$sql .= " s.nom as name, s.name_alias, s.logo, s.rowid as socid, s.client, s.fournisseur, s.code_client, s.code_fournisseur, s.code_compta, s.code_compta_fournisseur,"; $sql .= " p.rowid as pid, p.ref as pref, p.label as plabel, p.fk_product_type as ptype, p.entity as pentity"; $sql .= " FROM (".MAIN_DB_PREFIX."contrat as c"; $sql .= ", ".MAIN_DB_PREFIX."societe as s"; @@ -427,9 +442,23 @@ if ($resql) { print ''; print ''; + $staticcontrat->ref = ($obj->ref ? $obj->ref : $obj->fk_contrat); $staticcontrat->id = $obj->fk_contrat; + + $staticcompany->id = $obj->socid; + $staticcompany->name = $obj->name; + $staticcompany->name_alias = $obj->name_alias; + $staticcompany->photo = 1; + $staticcompany->code_client = $obj->code_client; + $staticcompany->code_fournisseur = $obj->code_fournisseur; + $staticcompany->code_compta = $obj->code_compta; + $staticcompany->code_compta_fournisseur = $obj->code_compta_fournisseur; + $staticcompany->client = $obj->client; + $staticcompany->fournisseur = $obj->fournisseur; + print $staticcontrat->getNomUrl(1, 16); + //if (1 == 1) print img_warning($langs->trans("Late")); print ''; print ''; @@ -449,8 +478,6 @@ if ($resql) { } print ''; print ''; - $staticcompany->id = $obj->fk_soc; - $staticcompany->name = $obj->name; print $staticcompany->getNomUrl(1, '', 20); print ''; print ''; @@ -471,7 +498,7 @@ print '
'; // Not activated services $sql = "SELECT c.ref, c.fk_soc, cd.rowid as cid, cd.statut, cd.label, cd.fk_product, cd.description as note, cd.fk_contrat,"; -$sql .= " s.nom as name,"; +$sql .= " s.nom as name, s.name_alias, s.logo, s.rowid as socid, s.client, s.fournisseur, s.code_client, s.code_fournisseur, s.code_compta, s.code_compta_fournisseur,"; $sql .= " p.rowid as pid, p.ref as pref, p.label as plabel, p.fk_product_type as ptype, p.entity as pentity"; $sql .= " FROM (".MAIN_DB_PREFIX."contrat as c"; $sql .= ", ".MAIN_DB_PREFIX."societe as s"; @@ -507,19 +534,32 @@ if ($resql) { while ($i < $num) { $obj = $db->fetch_object($resql); + $staticcompany->id = $obj->fk_soc; + $staticcompany->name = $obj->name; + $staticcompany->name_alias = $obj->name_alias; + $staticcompany->photo = 1; + $staticcompany->code_client = $obj->code_client; + $staticcompany->code_fournisseur = $obj->code_fournisseur; + $staticcompany->code_compta = $obj->code_compta; + $staticcompany->code_compta_fournisseur = $obj->code_compta_fournisseur; + $staticcompany->client = $obj->client; + $staticcompany->fournisseur = $obj->fournisseur; + + $staticcontrat->ref = ($obj->ref ? $obj->ref : $obj->fk_contrat); + $staticcontrat->id = $obj->fk_contrat; + + $productstatic->id = $obj->fk_product; + $productstatic->type = $obj->ptype; + $productstatic->ref = $obj->pref; + $productstatic->entity = $obj->pentity; + print ''; print ''; - $staticcontrat->ref = ($obj->ref ? $obj->ref : $obj->fk_contrat); - $staticcontrat->id = $obj->fk_contrat; print $staticcontrat->getNomUrl(1, 16); print ''; print ''; if ($obj->fk_product > 0) { - $productstatic->id = $obj->fk_product; - $productstatic->type = $obj->ptype; - $productstatic->ref = $obj->pref; - $productstatic->entity = $obj->pentity; print $productstatic->getNomUrl(1, '', 20); } else { print '
'.img_object($langs->trans("ShowService"), "service"); @@ -531,8 +571,6 @@ if ($resql) { } print ''; print ''; - $staticcompany->id = $obj->fk_soc; - $staticcompany->name = $obj->name; print $staticcompany->getNomUrl(1, '', 20); print ''; print ''; @@ -553,7 +591,7 @@ print '
'; // Expired services $sql = "SELECT c.ref, c.fk_soc, cd.rowid as cid, cd.statut, cd.label, cd.fk_product, cd.description as note, cd.fk_contrat,"; -$sql .= " s.nom as name,"; +$sql .= " s.nom as name, s.name_alias, s.logo, s.rowid as socid, s.client, s.fournisseur, s.code_client, s.code_fournisseur, s.code_compta, s.code_compta_fournisseur,"; $sql .= " p.rowid as pid, p.ref as pref, p.label as plabel, p.fk_product_type as ptype, p.entity as pentity"; $sql .= " FROM (".MAIN_DB_PREFIX."contrat as c"; $sql .= ", ".MAIN_DB_PREFIX."societe as s"; @@ -590,19 +628,32 @@ if ($resql) { while ($i < $num) { $obj = $db->fetch_object($resql); + $staticcompany->id = $obj->fk_soc; + $staticcompany->name = $obj->name; + $staticcompany->name_alias = $obj->name_alias; + $staticcompany->photo = 1; + $staticcompany->code_client = $obj->code_client; + $staticcompany->code_fournisseur = $obj->code_fournisseur; + $staticcompany->code_compta = $obj->code_compta; + $staticcompany->code_compta_fournisseur = $obj->code_compta_fournisseur; + $staticcompany->client = $obj->client; + $staticcompany->fournisseur = $obj->fournisseur; + + $staticcontrat->ref = ($obj->ref ? $obj->ref : $obj->fk_contrat); + $staticcontrat->id = $obj->fk_contrat; + + $productstatic->id = $obj->fk_product; + $productstatic->type = $obj->ptype; + $productstatic->ref = $obj->pref; + $productstatic->entity = $obj->pentity; + print ''; print ''; - $staticcontrat->ref = ($obj->ref ? $obj->ref : $obj->fk_contrat); - $staticcontrat->id = $obj->fk_contrat; print $staticcontrat->getNomUrl(1, 16); print ''; print ''; if ($obj->fk_product > 0) { - $productstatic->id = $obj->fk_product; - $productstatic->type = $obj->ptype; - $productstatic->ref = $obj->pref; - $productstatic->entity = $obj->pentity; print $productstatic->getNomUrl(1, '', 20); } else { print '
'.img_object($langs->trans("ShowService"), "service"); @@ -614,8 +665,6 @@ if ($resql) { } print ''; print ''; - $staticcompany->id = $obj->fk_soc; - $staticcompany->name = $obj->name; print $staticcompany->getNomUrl(1, '', 20); print ''; print ''; From 3026842467387790c57cfb42f4bf3dc78f28fc08 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 15 Jan 2023 11:39:38 +0100 Subject: [PATCH 0842/1128] trans --- htdocs/langs/en_US/companies.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/companies.lang b/htdocs/langs/en_US/companies.lang index d31ecb077ff..38b6892dbae 100644 --- a/htdocs/langs/en_US/companies.lang +++ b/htdocs/langs/en_US/companies.lang @@ -499,5 +499,5 @@ OutOfEurope=Out of Europe (EEC) CurrentOutstandingBillLate=Current outstanding bill late BecarefullChangeThirdpartyBeforeAddProductToInvoice=Be carefull, depending on your product price settings, you should change thirdparty before adding product to POS. EmailAlreadyExistsPleaseRewriteYourCompanyName=email already exists please rewrite your company name -TwoRecordsOfCompanyName=more than one record exists for this company please contact us to complete your partnership request" +TwoRecordsOfCompanyName=more than one record exists for this company, please contact us to complete your partnership request CompanySection=Company section \ No newline at end of file From d842d0394d28db95428f5057dfdd6755a624d23f Mon Sep 17 00:00:00 2001 From: Francis Appels Date: Sun, 15 Jan 2023 12:51:21 +0100 Subject: [PATCH 0843/1128] Revert "FIX re-open supplier order should not be allowed when there is a reception." This reverts commit c52fab09e608d7eede0ece3f314304db147234d8. --- htdocs/fourn/commande/card.php | 46 ++++++++++++++-------------------- htdocs/langs/en_US/orders.lang | 1 - 2 files changed, 19 insertions(+), 28 deletions(-) diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index ffb2e834db7..644469a257d 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -2440,19 +2440,6 @@ if ($action == 'create') { if (empty($reshook)) { $object->fetchObjectLinked(); // Links are used to show or not button, so we load them now. - // check if reception - $hasreception = 0; - if ($conf->reception->enabled) { - if (!empty($object->linkedObjects['reception'])) { - foreach ($object->linkedObjects['reception'] as $element) { - if ($element->statut >= 0) { - $hasreception = 1; - break; - } - } - } - } - // Validate if ($object->statut == 0 && $num > 0) { if ($usercanvalidate) { @@ -2528,21 +2515,17 @@ if ($action == 'create') { // Reopen if (in_array($object->statut, array(CommandeFournisseur::STATUS_ACCEPTED))) { $buttonshown = 0; - if ($hasreception) { - print ''.$langs->trans("Disapprove").''; - } else { - if (!$buttonshown && $usercanapprove) { - if (empty($conf->global->SUPPLIER_ORDER_REOPEN_BY_APPROVER_ONLY) - || (!empty($conf->global->SUPPLIER_ORDER_REOPEN_BY_APPROVER_ONLY) && $user->id == $object->user_approve_id)) { - print ''.$langs->trans("Disapprove").''; - $buttonshown++; - } + if (!$buttonshown && $usercanapprove) { + if (empty($conf->global->SUPPLIER_ORDER_REOPEN_BY_APPROVER_ONLY) + || (!empty($conf->global->SUPPLIER_ORDER_REOPEN_BY_APPROVER_ONLY) && $user->id == $object->user_approve_id)) { + print ''.$langs->trans("Disapprove").''; + $buttonshown++; } - if (!$buttonshown && $usercanapprovesecond && !empty($conf->global->SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED)) { - if (empty($conf->global->SUPPLIER_ORDER_REOPEN_BY_APPROVER2_ONLY) - || (!empty($conf->global->SUPPLIER_ORDER_REOPEN_BY_APPROVER2_ONLY) && $user->id == $object->user_approve_id2)) { - print ''.$langs->trans("Disapprove").''; - } + } + if (!$buttonshown && $usercanapprovesecond && !empty($conf->global->SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED)) { + if (empty($conf->global->SUPPLIER_ORDER_REOPEN_BY_APPROVER2_ONLY) + || (!empty($conf->global->SUPPLIER_ORDER_REOPEN_BY_APPROVER2_ONLY) && $user->id == $object->user_approve_id2)) { + print ''.$langs->trans("Disapprove").''; } } } @@ -2553,10 +2536,19 @@ if ($action == 'create') { } // Ship + $hasreception = 0; if (isModEnabled('stock') && (!empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER) || !empty($conf->global->STOCK_CALCULATE_ON_RECEPTION) || !empty($conf->global->STOCK_CALCULATE_ON_RECEPTION_CLOSE))) { $labelofbutton = $langs->trans('ReceiveProducts'); if ($conf->reception->enabled) { $labelofbutton = $langs->trans("CreateReception"); + if (!empty($object->linkedObjects['reception'])) { + foreach ($object->linkedObjects['reception'] as $element) { + if ($element->statut >= 0) { + $hasreception = 1; + break; + } + } + } } if (in_array($object->statut, array(3, 4, 5))) { diff --git a/htdocs/langs/en_US/orders.lang b/htdocs/langs/en_US/orders.lang index 0accaadfa62..f988cd62f19 100644 --- a/htdocs/langs/en_US/orders.lang +++ b/htdocs/langs/en_US/orders.lang @@ -204,4 +204,3 @@ StatusSupplierOrderApproved=Approved StatusSupplierOrderRefused=Refused StatusSupplierOrderReceivedPartially=Partially received StatusSupplierOrderReceivedAll=All products received -NeedAtLeastOneInvoice = There has to be at least one Invoice From f45ec82904c9fc4c0aabe40760535675d687ee20 Mon Sep 17 00:00:00 2001 From: Francis Appels Date: Sun, 15 Jan 2023 13:13:49 +0100 Subject: [PATCH 0844/1128] Disallow line delete if already dispatched --- htdocs/fourn/class/fournisseur.commande.class.php | 13 ++++++++++++- htdocs/langs/en_US/orders.lang | 2 ++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index a08f2046790..8b539138bfb 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -2139,6 +2139,16 @@ class CommandeFournisseur extends CommonOrder return 0; } + // check if not yet received + $dispatchedLines = $this->getDispachedLines(); + foreach ($dispatchedLines as $dispatchLine) { + if ($dispatchLine['orderlineid'] == $idline) { + $this->error = "LineAlreadyDispatched"; + $this->errors[] = $this->error; + return -3; + } + } + if ($line->delete($notrigger) > 0) { $this->update_price(1); return 1; @@ -2327,7 +2337,7 @@ class CommandeFournisseur extends CommonOrder // List of already dispatched lines $sql = "SELECT p.ref, p.label,"; $sql .= " e.rowid as warehouse_id, e.ref as entrepot,"; - $sql .= " cfd.rowid as dispatchedlineid, cfd.fk_product, cfd.qty, cfd.eatby, cfd.sellby, cfd.batch, cfd.comment, cfd.status"; + $sql .= " cfd.rowid as dispatchedlineid, cfd.fk_product, cfd.qty, cfd.eatby, cfd.sellby, cfd.batch, cfd.comment, cfd.status, cfd.fk_commandefourndet"; $sql .= " FROM ".MAIN_DB_PREFIX."product as p,"; $sql .= " ".MAIN_DB_PREFIX."commande_fournisseur_dispatch as cfd"; $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."entrepot as e ON cfd.fk_entrepot = e.rowid"; @@ -2351,6 +2361,7 @@ class CommandeFournisseur extends CommonOrder 'productid' => $objp->fk_product, 'warehouseid' => $objp->warehouse_id, 'qty' => $objp->qty, + 'orderlineid' => $objp->fk_commandefourndet ); } diff --git a/htdocs/langs/en_US/orders.lang b/htdocs/langs/en_US/orders.lang index f988cd62f19..4be2b34fd73 100644 --- a/htdocs/langs/en_US/orders.lang +++ b/htdocs/langs/en_US/orders.lang @@ -204,3 +204,5 @@ StatusSupplierOrderApproved=Approved StatusSupplierOrderRefused=Refused StatusSupplierOrderReceivedPartially=Partially received StatusSupplierOrderReceivedAll=All products received +NeedAtLeastOneInvoice = There has to be at least one Invoice +LineAlreadyDispatched = The order line is already received. \ No newline at end of file From 2d2164550f2744d15ba8a757f532414868edc727 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 15 Jan 2023 20:48:29 +0100 Subject: [PATCH 0845/1128] Fix warnings --- htdocs/accountancy/customer/index.php | 7 +++++-- htdocs/accountancy/expensereport/index.php | 7 +++++-- htdocs/accountancy/supplier/index.php | 7 +++++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/htdocs/accountancy/customer/index.php b/htdocs/accountancy/customer/index.php index 69702d8b10e..5f603a973c2 100644 --- a/htdocs/accountancy/customer/index.php +++ b/htdocs/accountancy/customer/index.php @@ -121,6 +121,7 @@ if (($action == 'clean' || $action == 'validatehistory') && $user->hasRight('acc if ($action == 'validatehistory') { $error = 0; $nbbinddone = 0; + $nbbindfailed = 0; $notpossible = 0; $db->begin(); @@ -266,12 +267,14 @@ if ($action == 'validatehistory') { if (!$resqlupdate) { $error++; setEventMessages($db->lasterror(), null, 'errors'); + $nbbindfailed++; break; } else { $nbbinddone++; } } else { $notpossible++; + $nbbindfailed++; } $i++; @@ -286,8 +289,8 @@ if ($action == 'validatehistory') { } else { $db->commit(); setEventMessages($langs->trans('AutomaticBindingDone', $nbbinddone, $notpossible), null, ($notpossible ? 'warnings' : 'mesgs')); - if ($notpossible) { - setEventMessages($langs->trans('DoManualBindingForFailedRecord', $notpossible), null, 'warnings'); + if ($nbbindfailed) { + setEventMessages($langs->trans('DoManualBindingForFailedRecord', $nbbindfailed), null, 'warnings'); } } } diff --git a/htdocs/accountancy/expensereport/index.php b/htdocs/accountancy/expensereport/index.php index d256d13252a..0929c9c9e24 100644 --- a/htdocs/accountancy/expensereport/index.php +++ b/htdocs/accountancy/expensereport/index.php @@ -101,6 +101,7 @@ if (($action == 'clean' || $action == 'validatehistory') && $user->rights->accou if ($action == 'validatehistory') { $error = 0; $nbbinddone = 0; + $nbbindfailed = 0; $notpossible = 0; $db->begin(); @@ -143,12 +144,14 @@ if ($action == 'validatehistory') { if (!$resqlupdate) { $error++; setEventMessages($db->lasterror(), null, 'errors'); + $nbbindfailed++; break; } else { $nbbinddone++; } } else { $notpossible++; + $nbbindfailed++; } $i++; @@ -163,8 +166,8 @@ if ($action == 'validatehistory') { } else { $db->commit(); setEventMessages($langs->trans('AutomaticBindingDone', $nbbinddone, $notpossible), null, ($notpossible ? 'warnings' : 'mesgs')); - if ($notpossible) { - setEventMessages($langs->trans('DoManualBindingForFailedRecord', $notpossible), null, 'warnings'); + if ($nbbindfailed) { + setEventMessages($langs->trans('DoManualBindingForFailedRecord', $nbbindfailed), null, 'warnings'); } } } diff --git a/htdocs/accountancy/supplier/index.php b/htdocs/accountancy/supplier/index.php index 3e0f4fbd784..87e67bbfcb6 100644 --- a/htdocs/accountancy/supplier/index.php +++ b/htdocs/accountancy/supplier/index.php @@ -119,6 +119,7 @@ if (($action == 'clean' || $action == 'validatehistory') && $user->rights->accou if ($action == 'validatehistory') { $error = 0; $nbbinddone = 0; + $nbbindfailed = 0; $notpossible = 0; $db->begin(); @@ -264,12 +265,14 @@ if ($action == 'validatehistory') { if (!$resqlupdate) { $error++; setEventMessages($db->lasterror(), null, 'errors'); + $nbbindfailed++; break; } else { $nbbinddone++; } } else { $notpossible++; + $nbbindfailed++; } $i++; @@ -284,8 +287,8 @@ if ($action == 'validatehistory') { } else { $db->commit(); setEventMessages($langs->trans('AutomaticBindingDone', $nbbinddone, $notpossible), null, ($notpossible ? 'warnings' : 'mesgs')); - if ($notpossible) { - setEventMessages($langs->trans('DoManualBindingForFailedRecord', $notpossible), null, 'warnings'); + if ($nbbindfailed) { + setEventMessages($langs->trans('DoManualBindingForFailedRecord', $nbbindfailed), null, 'warnings'); } } } From 70f3a6d84701dc212a905a27d4edadf64e440e36 Mon Sep 17 00:00:00 2001 From: Christian Humpel Date: Sun, 15 Jan 2023 22:53:17 +0100 Subject: [PATCH 0846/1128] load bom class file. --- htdocs/mrp/mo_list.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/mrp/mo_list.php b/htdocs/mrp/mo_list.php index 99e91fec184..c3ae9247c9d 100644 --- a/htdocs/mrp/mo_list.php +++ b/htdocs/mrp/mo_list.php @@ -27,6 +27,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/bom/class/bom.class.php'; // load mrp libraries require_once __DIR__.'/class/mo.class.php'; From 70bec953075d5f2873bd5a14f4c10f0cb8ec4d1b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 Jan 2023 10:44:39 +0100 Subject: [PATCH 0847/1128] Fix regression test --- htdocs/core/class/hookmanager.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/hookmanager.class.php b/htdocs/core/class/hookmanager.class.php index 7a6af7b88ec..bcd5a506946 100644 --- a/htdocs/core/class/hookmanager.class.php +++ b/htdocs/core/class/hookmanager.class.php @@ -164,7 +164,7 @@ class HookManager // Define type of hook ('output' or 'addreplace'). $hooktype = 'addreplace'; // TODO Remove hooks with type 'output' (exemple createFrom). All hooks must be converted into 'addreplace' hooks. - if (!in_array($method, array( + if (in_array($method, array( 'createFrom', 'dashboardMembers', 'dashboardEmailings', From acc30da1fe2c25e221d01b6f5e5876aacf30a7e9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 Jan 2023 10:57:31 +0100 Subject: [PATCH 0848/1128] Fix do not change password if same --- .../triggers/interface_50_modAgenda_ActionsAuto.class.php | 2 +- htdocs/langs/en_US/users.lang | 3 ++- htdocs/user/card.php | 2 +- htdocs/user/class/user.class.php | 4 ++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php index be78b6ecc18..ae53b01e19b 100644 --- a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php +++ b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php @@ -931,7 +931,7 @@ class InterfaceActionsAuto extends DolibarrTriggers $object->sendtoid = 0; } else { // TODO Merge all previous cases into this generic one - // $action = BILL_DELETE, TICKET_CREATE, TICKET_MODIFY, TICKET_DELETE, CONTACT_SENTBYMAIL, RECRUITMENTCANDIDATURE_MODIFY, ... + // $action = PASSWORD, BILL_DELETE, TICKET_CREATE, TICKET_MODIFY, TICKET_DELETE, CONTACT_SENTBYMAIL, RECRUITMENTCANDIDATURE_MODIFY, ... // Can also be a value defined by an external module like SENTBYSMS, COMPANY_SENTBYSMS, MEMBER_SENTBYSMS, ... // Note: We are here only if $conf->global->MAIN_AGENDA_ACTIONAUTO_action is on (tested at begining of this function). // Note that these key can be set in agenda setup, only if defined into llx_c_action_trigger diff --git a/htdocs/langs/en_US/users.lang b/htdocs/langs/en_US/users.lang index 2f691153292..05c9ebb339d 100644 --- a/htdocs/langs/en_US/users.lang +++ b/htdocs/langs/en_US/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Link to user LinkedToDolibarrThirdParty=Link to third party CreateDolibarrLogin=Create a user CreateDolibarrThirdParty=Create a third party -LoginAccountDisableInDolibarr=Account disabled in Dolibarr. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Use personal value ExportDataset_user_1=Users and their properties DomainUser=Domain user %s diff --git a/htdocs/user/card.php b/htdocs/user/card.php index ea47ba10beb..b7254def46a 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -521,7 +521,7 @@ if (empty($reshook)) { } if (!$error) { - $ret = $object->update($user); + $ret = $object->update($user); // This may include call to setPassword if password has changed if ($ret < 0) { $error++; if ($db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS') { diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 7e342e64337..d7b93d323e1 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -2031,9 +2031,9 @@ class User extends CommonObject // Update password if (!empty($this->pass)) { - if ($this->pass != $this->pass_indatabase && $this->pass != $this->pass_indatabase_crypted) { + if ($this->pass != $this->pass_indatabase && !dol_verifyHash($this->pass, $this->pass_indatabase_crypted)) { // If a new value for password is set and different than the one crypted into database - $result = $this->setPassword($user, $this->pass, 0, $notrigger, $nosyncmemberpass); + $result = $this->setPassword($user, $this->pass, 0, $notrigger, $nosyncmemberpass, 0, 1); if ($result < 0) { return -5; } From 5867b6249661cbd15873e4ec3a9a63a8ffb772c9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 Jan 2023 10:57:31 +0100 Subject: [PATCH 0849/1128] Fix do not change password if same --- .../triggers/interface_50_modAgenda_ActionsAuto.class.php | 2 +- htdocs/langs/en_US/users.lang | 3 ++- htdocs/user/card.php | 2 +- htdocs/user/class/user.class.php | 4 ++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php index e3f798dec62..686f59a70c7 100644 --- a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php +++ b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php @@ -920,7 +920,7 @@ class InterfaceActionsAuto extends DolibarrTriggers $object->sendtoid = 0; } else { // TODO Merge all previous cases into this generic one - // $action = BILL_DELETE, TICKET_CREATE, TICKET_MODIFY, TICKET_DELETE, CONTACT_SENTBYMAIL, RECRUITMENTCANDIDATURE_MODIFY, ... + // $action = PASSWORD, BILL_DELETE, TICKET_CREATE, TICKET_MODIFY, TICKET_DELETE, CONTACT_SENTBYMAIL, RECRUITMENTCANDIDATURE_MODIFY, ... // Can also be a value defined by an external module like SENTBYSMS, COMPANY_SENTBYSMS, MEMBER_SENTBYSMS, ... // Note: We are here only if $conf->global->MAIN_AGENDA_ACTIONAUTO_action is on (tested at begining of this function). // Note that these key can be set in agenda setup, only if defined into llx_c_action_trigger diff --git a/htdocs/langs/en_US/users.lang b/htdocs/langs/en_US/users.lang index 757e9f1dedf..cfd8cbb0362 100644 --- a/htdocs/langs/en_US/users.lang +++ b/htdocs/langs/en_US/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Link to user LinkedToDolibarrThirdParty=Link to third party CreateDolibarrLogin=Create a user CreateDolibarrThirdParty=Create a third party -LoginAccountDisableInDolibarr=Account disabled in Dolibarr. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Use personal value ExportDataset_user_1=Users and their properties DomainUser=Domain user %s diff --git a/htdocs/user/card.php b/htdocs/user/card.php index aa8460ec9d5..775a4db05dc 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -516,7 +516,7 @@ if (empty($reshook)) { } if (!$error) { - $ret = $object->update($user); + $ret = $object->update($user); // This may include call to setPassword if password has changed if ($ret < 0) { $error++; if ($db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS') { diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index e90252877d1..1f179758d57 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -2032,9 +2032,9 @@ class User extends CommonObject // Update password if (!empty($this->pass)) { - if ($this->pass != $this->pass_indatabase && $this->pass != $this->pass_indatabase_crypted) { + if ($this->pass != $this->pass_indatabase && !dol_verifyHash($this->pass, $this->pass_indatabase_crypted)) { // If a new value for password is set and different than the one crypted into database - $result = $this->setPassword($user, $this->pass, 0, $notrigger, $nosyncmemberpass); + $result = $this->setPassword($user, $this->pass, 0, $notrigger, $nosyncmemberpass, 0, 1); if ($result < 0) { return -5; } From f2f4cdbe6ab8381efa86db1c7dd5eda37e79e554 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 Jan 2023 11:48:34 +0100 Subject: [PATCH 0850/1128] NEW Invalidate all sessions of a user when password is modified. --- htdocs/core/login/functions_dolibarr.php | 12 ------------ htdocs/langs/en_US/errors.lang | 2 ++ htdocs/main.inc.php | 21 +++++++++++++++------ htdocs/user/card.php | 14 ++++++++++++++ htdocs/user/class/user.class.php | 3 +++ 5 files changed, 34 insertions(+), 18 deletions(-) diff --git a/htdocs/core/login/functions_dolibarr.php b/htdocs/core/login/functions_dolibarr.php index b732d2ef64b..5f4b722ea1c 100644 --- a/htdocs/core/login/functions_dolibarr.php +++ b/htdocs/core/login/functions_dolibarr.php @@ -91,18 +91,6 @@ function check_user_password_dolibarr($usertotest, $passwordtotest, $entitytotes dol_syslog("functions_dolibarr::check_user_password_dolibarr bad date end validity", LOG_WARNING); return '--bad-login-validity--'; } - // If there is an invalidation date, check that the current session date is not before this date - if ($obj->flagdelsessionsbefore && !empty($_SESSION["dol_logindate"])) { - dol_syslog("functions_dolibarr::check_user_password_dolibarr user has a date for session invalidation = ".$obj->flagdelsessionsbefore." and session date = ".$_SESSION["dol_logindate"]); - $datetmp = $db->jdate($obj->flagdelsessionsbefore, 'gmt'); - if ($datetmp > $now) { - // Load translation files required by the page - $langs->loadLangs(array('main', 'errors')); - $_SESSION["dol_loginmesg"] = $langs->transnoentitiesnoconv("ErrorSessionInvalidatedAfterPasswordChange"); - dol_syslog("functions_dolibarr::check_user_password_dolibarr session was invalidated", LOG_WARNING); - return '--bad-login-validity--'; - } - } $passclear = $obj->pass; $passcrypted = $obj->pass_crypted; diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang index b3eeae4606b..b779c901b54 100644 --- a/htdocs/langs/en_US/errors.lang +++ b/htdocs/langs/en_US/errors.lang @@ -303,6 +303,7 @@ ErrorValueForTooLow=Value for %s is too low ErrorValueCantBeNull=Value for %s can't be null ErrorDateOfMovementLowerThanDateOfFileTransmission=The date of the bank transaction can't be lower than the date of the file transmission ErrorTooMuchFileInForm=Too much files in form, the maximum number is %s file(s) +ErrorSessionInvalidatedAfterPasswordChange=The session was invalidated after a password change. Please relogin. # Warnings WarningParamUploadMaxFileSizeHigherThanPostMaxSize=Your PHP parameter upload_max_filesize (%s) is higher than PHP parameter post_max_size (%s). This is not a consistent setup. @@ -325,6 +326,7 @@ WarningPaymentDateLowerThanInvoiceDate=Payment date (%s) is earlier than invoice WarningTooManyDataPleaseUseMoreFilters=Too many data (more than %s lines). Please use more filters or set the constant %s to a higher limit. WarningSomeLinesWithNullHourlyRate=Some times were recorded by some users while their hourly rate was not defined. A value of 0 %s per hour was used but this may result in wrong valuation of time spent. WarningYourLoginWasModifiedPleaseLogin=Your login was modified. For security purpose you will have to login with your new login before next action. +WarningYourPasswordWasModifiedPleaseLogin=Your password was modified. For security purpose you will have to login now with your new password. WarningAnEntryAlreadyExistForTransKey=An entry already exists for the translation key for this language WarningNumberOfRecipientIsRestrictedInMassAction=Warning, number of different recipient is limited to %s when using the mass actions on lists WarningDateOfLineMustBeInExpenseReportRange=Warning, the date of line is not in the range of the expense report diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 7d764d4a105..b53688de6e7 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -943,26 +943,35 @@ if (!defined('NOLOGIN')) { dol_syslog("- This is an already logged session. _SESSION['dol_login']=".$login." _SESSION['dol_entity']=".$entity, LOG_DEBUG); $resultFetchUser = $user->fetch('', $login, '', 1, ($entity > 0 ? $entity : -1)); - if ($resultFetchUser <= 0) { - // Account has been removed after login - dol_syslog("Can't load user even if session logged. _SESSION['dol_login']=".$login, LOG_WARNING); + if ($resultFetchUser <= 0 || ($user->flagdelsessionsbefore && !empty($_SESSION["dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION["dol_logindate"])) { + if ($resultFetchUser <= 0) { + // Account has been removed after login + dol_syslog("Can't load user even if session logged. _SESSION['dol_login']=".$login, LOG_WARNING); + } else { + // Session is no more valid + dol_syslog("The user has a date for session invalidation = ".$user->flagdelsessionsbefore." and a session date = ".$_SESSION["dol_logindate"].". We must invalidate its sessions."); + } session_destroy(); session_set_cookie_params(0, '/', null, (empty($dolibarr_main_force_https) ? false : true), true); // Add tag secure and httponly on session cookie session_name($sessionname); session_start(); if ($resultFetchUser == 0) { - // Load translation files required by page $langs->loadLangs(array('main', 'errors')); $_SESSION["dol_loginmesg"] = $langs->transnoentitiesnoconv("ErrorCantLoadUserFromDolibarrDatabase", $login); $user->trigger_mesg = 'ErrorCantLoadUserFromDolibarrDatabase - login='.$login; - } - if ($resultFetchUser < 0) { + } elseif ($resultFetchUser < 0) { $_SESSION["dol_loginmesg"] = $user->error; $user->trigger_mesg = $user->error; + } else { + $langs->loadLangs(array('main', 'errors')); + + $_SESSION["dol_loginmesg"] = $langs->transnoentitiesnoconv("ErrorSessionInvalidatedAfterPasswordChange"); + + $user->trigger_mesg = 'ErrorUserSessionWasInvalidated - login='.$login; } // Call trigger diff --git a/htdocs/user/card.php b/htdocs/user/card.php index b7254def46a..602bc25eb3a 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -521,6 +521,13 @@ if (empty($reshook)) { } if (!$error) { + $passwordismodified = 0; + if (!empty($object->pass)) { + if ($object->pass != $object->pass_indatabase && !dol_verifyHash($object->pass, $object->pass_indatabase_crypted)) { + $passwordismodified = 1; + } + } + $ret = $object->update($user); // This may include call to setPassword if password has changed if ($ret < 0) { $error++; @@ -615,6 +622,13 @@ if (empty($reshook)) { $langs->load("errors"); setEventMessages($langs->transnoentitiesnoconv("WarningYourLoginWasModifiedPleaseLogin"), null, 'warnings'); } + if ($passwordismodified && $object->login == $user->login) { // Current user has changed its password + $error++; + $langs->load("errors"); + setEventMessages($langs->transnoentitiesnoconv("WarningYourPasswordWasModifiedPleaseLogin"), null, 'warnings'); + header("Location: ".DOL_URL_ROOT.'/user/card.php?id='.$object->id); + exit; + } } else { $db->rollback(); } diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index d7b93d323e1..22556d3e1c2 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -276,6 +276,7 @@ class User extends CommonObject public $datelastlogin; public $datepreviouslogin; + public $flagdelsessionsbefore; public $iplastlogin; public $ippreviouslogin; public $datestartvalidity; @@ -441,6 +442,7 @@ class User extends CommonObject $sql .= " u.tms as datem,"; $sql .= " u.datelastlogin as datel,"; $sql .= " u.datepreviouslogin as datep,"; + $sql .= " u.flagdelsessionsbefore,"; $sql .= " u.iplastlogin,"; $sql .= " u.ippreviouslogin,"; $sql .= " u.datelastpassvalidation,"; @@ -575,6 +577,7 @@ class User extends CommonObject $this->datem = $this->db->jdate($obj->datem); $this->datelastlogin = $this->db->jdate($obj->datel); $this->datepreviouslogin = $this->db->jdate($obj->datep); + $this->flagdelsessionsbefore = $this->db->jdate($obj->flagdelsessionsbefore, 'gmt'); $this->iplastlogin = $obj->iplastlogin; $this->ippreviouslogin = $obj->ippreviouslogin; $this->datestartvalidity = $this->db->jdate($obj->datestartvalidity); From 6af49ff2165712d4789d2265c2b6927d803f46fd Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 Jan 2023 12:33:54 +0100 Subject: [PATCH 0851/1128] Fix warning php8 --- htdocs/main.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index b53688de6e7..2904f576bf7 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -984,7 +984,7 @@ if (!defined('NOLOGIN')) { // Hooks on failed login $action = ''; $hookmanager->initHooks(array('login')); - $parameters = array('dol_authmode'=>$dol_authmode, 'dol_loginmesg'=>$_SESSION["dol_loginmesg"]); + $parameters = array('dol_authmode' => (isset($dol_authmode) ? $dol_authmode : ''), 'dol_loginmesg' => $_SESSION["dol_loginmesg"]); $reshook = $hookmanager->executeHooks('afterLoginFailed', $parameters, $user, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { $error++; From 3fc2f9273d02a2104210546b36ac3ec69902091c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 Jan 2023 12:33:54 +0100 Subject: [PATCH 0852/1128] Fix warning php8 --- htdocs/main.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 1188dd023ab..2ed8b1a012f 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -975,7 +975,7 @@ if (!defined('NOLOGIN')) { // Hooks on failed login $action = ''; $hookmanager->initHooks(array('login')); - $parameters = array('dol_authmode'=>$dol_authmode, 'dol_loginmesg'=>$_SESSION["dol_loginmesg"]); + $parameters = array('dol_authmode' => (isset($dol_authmode) ? $dol_authmode : ''), 'dol_loginmesg' => $_SESSION["dol_loginmesg"]); $reshook = $hookmanager->executeHooks('afterLoginFailed', $parameters, $user, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { $error++; From 481215eef45175bafcada49258666abd7a2ec2f1 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Mon, 16 Jan 2023 14:40:35 +0100 Subject: [PATCH 0853/1128] FIX Multicompany use "element" name and not "table_element" --- htdocs/asset/class/asset.class.php | 2 +- htdocs/asset/class/assetmodel.class.php | 2 +- htdocs/bom/class/bom.class.php | 4 ++-- htdocs/core/class/commonobject.class.php | 2 +- htdocs/eventorganization/class/conferenceorbooth.class.php | 2 +- .../class/conferenceorboothattendee.class.php | 2 +- htdocs/hrm/class/evaluation.class.php | 2 +- htdocs/hrm/class/evaluationdet.class.php | 2 +- htdocs/hrm/class/job.class.php | 2 +- htdocs/hrm/class/position.class.php | 2 +- htdocs/hrm/class/skill.class.php | 2 +- htdocs/hrm/class/skilldet.class.php | 2 +- htdocs/hrm/class/skillrank.class.php | 2 +- htdocs/knowledgemanagement/class/knowledgerecord.class.php | 2 +- htdocs/mrp/class/mo.class.php | 4 ++-- htdocs/partnership/class/partnership.class.php | 2 +- htdocs/partnership/class/partnership_type.class.php | 2 +- .../product/stock/stocktransfer/class/stocktransfer.class.php | 2 +- .../stock/stocktransfer/class/stocktransferline.class.php | 2 +- htdocs/recruitment/class/recruitmentcandidature.class.php | 2 +- htdocs/recruitment/class/recruitmentjobposition.class.php | 2 +- htdocs/ticket/class/cticketcategory.class.php | 2 +- htdocs/webhook/class/target.class.php | 2 +- htdocs/workstation/class/workstation.class.php | 2 +- 24 files changed, 26 insertions(+), 26 deletions(-) diff --git a/htdocs/asset/class/asset.class.php b/htdocs/asset/class/asset.class.php index 7c2b55c045e..c01f4b967c4 100644 --- a/htdocs/asset/class/asset.class.php +++ b/htdocs/asset/class/asset.class.php @@ -410,7 +410,7 @@ class Asset extends CommonObject $sql .= $this->getFieldList('t'); $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element." as t"; if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) { - $sql .= " WHERE t.entity IN (".getEntity($this->table_element).")"; + $sql .= " WHERE t.entity IN (".getEntity($this->element).")"; } else { $sql .= " WHERE 1 = 1"; } diff --git a/htdocs/asset/class/assetmodel.class.php b/htdocs/asset/class/assetmodel.class.php index fb574e6ea18..a973abc3764 100644 --- a/htdocs/asset/class/assetmodel.class.php +++ b/htdocs/asset/class/assetmodel.class.php @@ -348,7 +348,7 @@ class AssetModel extends CommonObject $sql .= $this->getFieldList('t'); $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element." as t"; if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) { - $sql .= " WHERE t.entity IN (".getEntity($this->table_element).")"; + $sql .= " WHERE t.entity IN (".getEntity($this->element).")"; } else { $sql .= " WHERE 1 = 1"; } diff --git a/htdocs/bom/class/bom.class.php b/htdocs/bom/class/bom.class.php index cd5b119cabf..b819e438161 100644 --- a/htdocs/bom/class/bom.class.php +++ b/htdocs/bom/class/bom.class.php @@ -476,7 +476,7 @@ class BOM extends CommonObject $sql .= $this->getFieldList(); $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; if ($this->ismultientitymanaged) { - $sql .= ' WHERE t.entity IN ('.getEntity($this->table_element).')'; + $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')'; } else { $sql .= ' WHERE 1 = 1'; } @@ -1736,7 +1736,7 @@ class BOMLine extends CommonObjectLine $sql .= $this->getFieldList(); $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; if ($this->ismultientitymanaged) { - $sql .= ' WHERE t.entity IN ('.getEntity($this->table_element).')'; + $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')'; } else { $sql .= ' WHERE 1 = 1'; } diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index f1920c74931..471d835f4a3 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -9331,7 +9331,7 @@ abstract class CommonObject $sql .= ' WHERE 1 = 1'; // usage with empty id and empty ref is very rare } if (empty($id) && isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) { - $sql .= ' AND t.entity IN ('.getEntity($this->table_element).')'; + $sql .= ' AND t.entity IN ('.getEntity($this->element).')'; } if ($morewhere) { $sql .= $morewhere; diff --git a/htdocs/eventorganization/class/conferenceorbooth.class.php b/htdocs/eventorganization/class/conferenceorbooth.class.php index db0928efc7d..bc21d7bb1c5 100644 --- a/htdocs/eventorganization/class/conferenceorbooth.class.php +++ b/htdocs/eventorganization/class/conferenceorbooth.class.php @@ -284,7 +284,7 @@ class ConferenceOrBooth extends ActionComm $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; $sql .= " INNER JOIN ".MAIN_DB_PREFIX."c_actioncomm as cact ON cact.id=t.fk_action AND cact.module LIKE '%@eventorganization'"; if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) { - $sql .= ' WHERE t.entity IN ('.getEntity($this->table_element).')'; + $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')'; } else { $sql .= ' WHERE 1 = 1'; } diff --git a/htdocs/eventorganization/class/conferenceorboothattendee.class.php b/htdocs/eventorganization/class/conferenceorboothattendee.class.php index 595eaf67eeb..be06f70979e 100644 --- a/htdocs/eventorganization/class/conferenceorboothattendee.class.php +++ b/htdocs/eventorganization/class/conferenceorboothattendee.class.php @@ -423,7 +423,7 @@ class ConferenceOrBoothAttendee extends CommonObject $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."actioncomm as a on a.id = t.fk_actioncomm"; if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) { - $sql .= ' WHERE t.entity IN ('.getEntity($this->table_element).')'; + $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')'; } else { $sql .= ' WHERE 1 = 1'; } diff --git a/htdocs/hrm/class/evaluation.class.php b/htdocs/hrm/class/evaluation.class.php index 23ccc6c9fd2..51f8c8bc985 100644 --- a/htdocs/hrm/class/evaluation.class.php +++ b/htdocs/hrm/class/evaluation.class.php @@ -404,7 +404,7 @@ class Evaluation extends CommonObject $sql .= $this->getFieldList('t'); $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) { - $sql .= ' WHERE t.entity IN ('.getEntity($this->table_element).')'; + $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')'; } else { $sql .= ' WHERE 1 = 1'; } diff --git a/htdocs/hrm/class/evaluationdet.class.php b/htdocs/hrm/class/evaluationdet.class.php index 5489065e52d..50d2fac8821 100644 --- a/htdocs/hrm/class/evaluationdet.class.php +++ b/htdocs/hrm/class/evaluationdet.class.php @@ -373,7 +373,7 @@ class Evaluationline extends CommonObject $sql .= $this->getFieldList('t'); $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) { - $sql .= ' WHERE t.entity IN ('.getEntity($this->table_element).')'; + $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')'; } else { $sql .= ' WHERE 1 = 1'; } diff --git a/htdocs/hrm/class/job.class.php b/htdocs/hrm/class/job.class.php index 93950979a1a..076e223679d 100644 --- a/htdocs/hrm/class/job.class.php +++ b/htdocs/hrm/class/job.class.php @@ -374,7 +374,7 @@ class Job extends CommonObject $sql .= $this->getFieldList('t'); $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) { - $sql .= ' WHERE t.entity IN ('.getEntity($this->table_element).')'; + $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')'; } else { $sql .= ' WHERE 1 = 1'; } diff --git a/htdocs/hrm/class/position.class.php b/htdocs/hrm/class/position.class.php index 98b5fd89be9..b685147a9b9 100644 --- a/htdocs/hrm/class/position.class.php +++ b/htdocs/hrm/class/position.class.php @@ -385,7 +385,7 @@ class Position extends CommonObject $sql .= $this->getFieldList('t'); $sql .= ' FROM ' . MAIN_DB_PREFIX . $this->table_element . ' as t'; if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) { - $sql .= ' WHERE t.entity IN (' . getEntity($this->table_element) . ')'; + $sql .= ' WHERE t.entity IN (' . getEntity($this->element) . ')'; } else { $sql .= ' WHERE 1 = 1'; } diff --git a/htdocs/hrm/class/skill.class.php b/htdocs/hrm/class/skill.class.php index 3f56294a7b2..ec994a35746 100644 --- a/htdocs/hrm/class/skill.class.php +++ b/htdocs/hrm/class/skill.class.php @@ -443,7 +443,7 @@ class Skill extends CommonObject $sql .= $this->getFieldList('t'); $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) { - $sql .= ' WHERE t.entity IN ('.getEntity($this->table_element).')'; + $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')'; } else { $sql .= ' WHERE 1 = 1'; } diff --git a/htdocs/hrm/class/skilldet.class.php b/htdocs/hrm/class/skilldet.class.php index 4dface42230..3db74d26da1 100644 --- a/htdocs/hrm/class/skilldet.class.php +++ b/htdocs/hrm/class/skilldet.class.php @@ -366,7 +366,7 @@ class Skilldet extends CommonObject $sql .= $this->getFieldList('t'); $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) { - $sql .= ' WHERE t.entity IN ('.getEntity($this->table_element).')'; + $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')'; } else { $sql .= ' WHERE 1 = 1'; } diff --git a/htdocs/hrm/class/skillrank.class.php b/htdocs/hrm/class/skillrank.class.php index 2d75425823e..a08a647ca03 100644 --- a/htdocs/hrm/class/skillrank.class.php +++ b/htdocs/hrm/class/skillrank.class.php @@ -405,7 +405,7 @@ class SkillRank extends CommonObject $sql .= $this->getFieldList('t'); $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) { - $sql .= ' WHERE t.entity IN ('.getEntity($this->table_element).')'; + $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')'; } else { $sql .= ' WHERE 1 = 1'; } diff --git a/htdocs/knowledgemanagement/class/knowledgerecord.class.php b/htdocs/knowledgemanagement/class/knowledgerecord.class.php index bf2bf38bbef..1cdb3aff9f5 100644 --- a/htdocs/knowledgemanagement/class/knowledgerecord.class.php +++ b/htdocs/knowledgemanagement/class/knowledgerecord.class.php @@ -381,7 +381,7 @@ class KnowledgeRecord extends CommonObject $sql .= $this->getFieldList('t'); $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) { - $sql .= ' WHERE t.entity IN ('.getEntity($this->table_element).')'; + $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')'; } else { $sql .= ' WHERE 1 = 1'; } diff --git a/htdocs/mrp/class/mo.class.php b/htdocs/mrp/class/mo.class.php index 13d0f67316c..68523ace9da 100644 --- a/htdocs/mrp/class/mo.class.php +++ b/htdocs/mrp/class/mo.class.php @@ -451,7 +451,7 @@ class Mo extends CommonObject $sql .= $this->getFieldList(); $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) { - $sql .= ' WHERE t.entity IN ('.getEntity($this->table_element).')'; + $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')'; } else { $sql .= ' WHERE 1 = 1'; } @@ -1717,7 +1717,7 @@ class MoLine extends CommonObjectLine $sql .= $this->getFieldList(); $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) { - $sql .= ' WHERE t.entity IN ('.getEntity($this->table_element).')'; + $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')'; } else { $sql .= ' WHERE 1 = 1'; } diff --git a/htdocs/partnership/class/partnership.class.php b/htdocs/partnership/class/partnership.class.php index d7242f4e16c..a9645efaae2 100644 --- a/htdocs/partnership/class/partnership.class.php +++ b/htdocs/partnership/class/partnership.class.php @@ -483,7 +483,7 @@ class Partnership extends CommonObject $sql .= $this->getFieldList('t'); $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) { - $sql .= ' WHERE t.entity IN ('.getEntity($this->table_element).')'; + $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')'; } else { $sql .= ' WHERE 1 = 1'; } diff --git a/htdocs/partnership/class/partnership_type.class.php b/htdocs/partnership/class/partnership_type.class.php index 0c42dae87d2..ba0f2c2a1ab 100644 --- a/htdocs/partnership/class/partnership_type.class.php +++ b/htdocs/partnership/class/partnership_type.class.php @@ -168,7 +168,7 @@ class PartnershipType extends CommonObject $sql .= $this->getFieldList('t'); $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element." as t"; if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) { - $sql .= " WHERE t.entity IN (".getEntity($this->table_element).")"; + $sql .= " WHERE t.entity IN (".getEntity($this->element).")"; } else { $sql .= " WHERE 1 = 1"; } diff --git a/htdocs/product/stock/stocktransfer/class/stocktransfer.class.php b/htdocs/product/stock/stocktransfer/class/stocktransfer.class.php index 60f13396b80..0711815da15 100644 --- a/htdocs/product/stock/stocktransfer/class/stocktransfer.class.php +++ b/htdocs/product/stock/stocktransfer/class/stocktransfer.class.php @@ -428,7 +428,7 @@ class StockTransfer extends CommonObject $sql = 'SELECT '; $sql .= $this->getFieldList(); $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; - if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) $sql .= ' WHERE t.entity IN ('.getEntity($this->table_element).')'; + if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')'; else $sql .= ' WHERE 1 = 1'; // Manage filter $sqlwhere = array(); diff --git a/htdocs/product/stock/stocktransfer/class/stocktransferline.class.php b/htdocs/product/stock/stocktransfer/class/stocktransferline.class.php index 4ee2f1db631..0460430c337 100644 --- a/htdocs/product/stock/stocktransfer/class/stocktransferline.class.php +++ b/htdocs/product/stock/stocktransfer/class/stocktransferline.class.php @@ -338,7 +338,7 @@ class StockTransferLine extends CommonObjectLine $sql = 'SELECT '; $sql .= $this->getFieldList(); $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; - if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) $sql .= ' WHERE t.entity IN ('.getEntity($this->table_element).')'; + if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')'; else $sql .= ' WHERE 1 = 1'; // Manage filter $sqlwhere = array(); diff --git a/htdocs/recruitment/class/recruitmentcandidature.class.php b/htdocs/recruitment/class/recruitmentcandidature.class.php index 1690f13da56..25d8b352a81 100644 --- a/htdocs/recruitment/class/recruitmentcandidature.class.php +++ b/htdocs/recruitment/class/recruitmentcandidature.class.php @@ -374,7 +374,7 @@ class RecruitmentCandidature extends CommonObject $sql .= $this->getFieldList(); $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) { - $sql .= ' WHERE t.entity IN ('.getEntity($this->table_element).')'; + $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')'; } else { $sql .= ' WHERE 1 = 1'; } diff --git a/htdocs/recruitment/class/recruitmentjobposition.class.php b/htdocs/recruitment/class/recruitmentjobposition.class.php index 7a9d077f910..6b3fcf7eeb8 100644 --- a/htdocs/recruitment/class/recruitmentjobposition.class.php +++ b/htdocs/recruitment/class/recruitmentjobposition.class.php @@ -391,7 +391,7 @@ class RecruitmentJobPosition extends CommonObject $sql .= $this->getFieldList(); $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) { - $sql .= ' WHERE t.entity IN ('.getEntity($this->table_element).')'; + $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')'; } else { $sql .= ' WHERE 1 = 1'; } diff --git a/htdocs/ticket/class/cticketcategory.class.php b/htdocs/ticket/class/cticketcategory.class.php index dd8b75292ad..334ea7cd1ab 100644 --- a/htdocs/ticket/class/cticketcategory.class.php +++ b/htdocs/ticket/class/cticketcategory.class.php @@ -384,7 +384,7 @@ class CTicketCategory extends CommonObject $sql .= $this->getFieldList('t'); $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) { - $sql .= ' WHERE t.entity IN ('.getEntity($this->table_element).')'; + $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')'; } else { $sql .= ' WHERE 1 = 1'; } diff --git a/htdocs/webhook/class/target.class.php b/htdocs/webhook/class/target.class.php index 51a2a1beffa..701c74fbf4d 100644 --- a/htdocs/webhook/class/target.class.php +++ b/htdocs/webhook/class/target.class.php @@ -385,7 +385,7 @@ class Target extends CommonObject $sql .= $this->getFieldList('t'); $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element." as t"; if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) { - $sql .= " WHERE t.entity IN (".getEntity($this->table_element).")"; + $sql .= " WHERE t.entity IN (".getEntity($this->element).")"; } else { $sql .= " WHERE 1 = 1"; } diff --git a/htdocs/workstation/class/workstation.class.php b/htdocs/workstation/class/workstation.class.php index d3b098784da..58f326e3749 100644 --- a/htdocs/workstation/class/workstation.class.php +++ b/htdocs/workstation/class/workstation.class.php @@ -419,7 +419,7 @@ class Workstation extends CommonObject $sql .= $this->getFieldList(); $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) { - $sql .= ' WHERE t.entity IN ('.getEntity($this->table_element).')'; + $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')'; } else { $sql .= ' WHERE 1 = 1'; } From 20633aa7747bfb38aa508839515585e19c9b3025 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Mon, 16 Jan 2023 15:03:01 +0100 Subject: [PATCH 0854/1128] fix checkbox by mergin two class --- htdocs/hrm/class/job.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/hrm/class/job.class.php b/htdocs/hrm/class/job.class.php index 85845e557ab..fdeebe484eb 100644 --- a/htdocs/hrm/class/job.class.php +++ b/htdocs/hrm/class/job.class.php @@ -1071,7 +1071,7 @@ class Job extends CommonObject $return .= ''; $return .= '
'; $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(1) : $this->ref).''; - $return .= ''; + $return .= ''; if (property_exists($this, 'deplacement')) { $return .= '
'.$langs->trans("Type").''; $return .= ' : '.$this->fields['deplacement']['arrayofkeyval'][$this->deplacement].''; From 902351cbaa2d15b4f050509e506ec8e2288f3738 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 Jan 2023 15:45:17 +0100 Subject: [PATCH 0855/1128] Fix phpunit --- test/phpunit/UserTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/phpunit/UserTest.php b/test/phpunit/UserTest.php index f318ae4cbac..9963007af15 100644 --- a/test/phpunit/UserTest.php +++ b/test/phpunit/UserTest.php @@ -204,7 +204,7 @@ class UserTest extends PHPUnit\Framework\TestCase $newlocalobject=new User($this->savdb); $newlocalobject->initAsSpecimen(); $this->changeProperties($newlocalobject); - $this->assertEquals($this->objCompare($localobject, $newlocalobject, true, array('id','socid','societe_id','specimen','note','ref','pass','pass_indatabase','pass_indatabase_crypted','pass_temp','datec','datem','datelastlogin','datepreviouslogin','iplastlogin','ippreviouslogin','trackid')), array()); // Actual, Expected + $this->assertEquals($this->objCompare($localobject, $newlocalobject, true, array('id','socid','societe_id','specimen','note','ref','pass','pass_indatabase','pass_indatabase_crypted','pass_temp','datec','datem','datelastlogin','datepreviouslogin','flagdelsessionsbefore','iplastlogin','ippreviouslogin','trackid')), array()); // Actual, Expected return $localobject; } From 6983ef95846949955b5591ca918de5b353cab546 Mon Sep 17 00:00:00 2001 From: lamrani abdelwadoud Date: Mon, 16 Jan 2023 15:53:57 +0100 Subject: [PATCH 0856/1128] Update product.class.php fix style error --- htdocs/product/class/product.class.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 96e3ac7c7f5..b0882e95632 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -6291,7 +6291,6 @@ class Product extends CommonObject $return .= '
'; $return .= '
'; $label = ''; - if ($this->is_photo_available($conf->product->multidir_output[$this->entity])) { $label .= $this->show_photos('product', $conf->product->multidir_output[$this->entity]); $return .= $label; @@ -6303,7 +6302,6 @@ class Product extends CommonObject } $return .= $label; } - $return .= '
'; $return .= '
'; $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).''; From 690646b7da0d151a1662f7333a9b462cfb915e3c Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Mon, 16 Jan 2023 16:12:27 +0100 Subject: [PATCH 0857/1128] fix errors in info-box.css --- htdocs/theme/eldy/info-box.inc.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/htdocs/theme/eldy/info-box.inc.php b/htdocs/theme/eldy/info-box.inc.php index 5c010e21e26..99e8e5e2ca1 100644 --- a/htdocs/theme/eldy/info-box.inc.php +++ b/htdocs/theme/eldy/info-box.inc.php @@ -491,12 +491,9 @@ if (GETPOSTISSET('THEME_SATURATE_RATIO')) { min-width: 350px; max-width: 350px; } - -/**for make a checkbox in the right of the box in mode kanban */ .fright { float:right; } - @media only screen and (max-width: 1740px) { .info-box-module { min-width: 315px; From 6f93cac359f875dd97cead8973135ad1f4548e5d Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Mon, 16 Jan 2023 17:10:26 +0100 Subject: [PATCH 0858/1128] fix style error --- htdocs/loan/list.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/htdocs/loan/list.php b/htdocs/loan/list.php index 5acd2532bef..1225f5304be 100644 --- a/htdocs/loan/list.php +++ b/htdocs/loan/list.php @@ -66,8 +66,7 @@ $search_amount = GETPOST('search_amount', 'alpha'); $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'loanlist'; // To manage different context of search $optioncss = GETPOST('optioncss', 'alpha'); -$mode = GETPOST('mode', 'alpha'); // mode view result - +$mode = GETPOST('mode', 'alpha'); // mode view result /* From 931ce8be4a78871015e723839400b19b1e1d97bd Mon Sep 17 00:00:00 2001 From: marc Date: Mon, 16 Jan 2023 18:06:23 +0100 Subject: [PATCH 0859/1128] NEW #23436 Group social networks field Group social networks field on a thirdparty creation into one link --- htdocs/contact/card.php | 75 ++++++++++++++++++++++++---------------- htdocs/societe/card.php | 76 +++++++++++++++++++++++++---------------- 2 files changed, 91 insertions(+), 60 deletions(-) diff --git a/htdocs/contact/card.php b/htdocs/contact/card.php index 6cf7d3051f3..e0c263572cb 100644 --- a/htdocs/contact/card.php +++ b/htdocs/contact/card.php @@ -864,21 +864,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { if (isModEnabled('socialnetworks')) { - foreach ($socialnetworks as $key => $value) { - if ($value['active']) { - print ''; - print ''; - print ''; - if (!empty($value['icon'])) { - print ''; - } - print ''; - print ''; - print ''; - } elseif (!empty($object->socialnetworks[$key])) { - print ''; - } - } + showSocialNetwork(); } // Visibility @@ -1151,21 +1137,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { } if (isModEnabled('socialnetworks')) { - foreach ($socialnetworks as $key => $value) { - if ($value['active']) { - print ''; - print ''; - print ''; - if (!empty($value['icon'])) { - print ''; - } - print ''; - print ''; - print ''; - } elseif (!empty($object->socialnetworks[$key])) { - print ''; - } - } + showSocialNetwork(); } // Visibility @@ -1620,6 +1592,49 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { } } +function showSocialNetwork() { + global $socialnetworks, $object, $form, $object, $langs; + echo ''; + + print ' '; + foreach ($socialnetworks as $key => $value) { + if ($value['active']) { + print ''; + print ''; + print ''; + if (!empty($value['icon'])) { + print ''; + } + print ''; + print ''; + print ''; + } elseif (!empty($object->socialnetworks[$key])) { + print ''; + } + } + + print ''; +} + llxFooter(); diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php index 8b5dcd251d2..2d6356394dd 100644 --- a/htdocs/societe/card.php +++ b/htdocs/societe/card.php @@ -1663,21 +1663,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { // Social networks if (isModEnabled('socialnetworks')) { - foreach ($socialnetworks as $key => $value) { - if ($value['active']) { - print ''; - print ''; - print ''; - if (!empty($value['icon'])) { - print ''; - } - print ''; - print ''; - print ''; - } elseif (!empty($object->socialnetworks[$key])) { - print ''; - } - } + showSocialNetwork(); } // Prof ids @@ -2395,21 +2381,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { // Social network if (isModEnabled('socialnetworks')) { - foreach ($socialnetworks as $key => $value) { - if ($value['active']) { - print ''; - print ''; - print ''; - if (!empty($value['icon'])) { - print ''; - } - print ''; - print ''; - print ''; - } elseif (!empty($object->socialnetworks[$key])) { - print ''; - } - } + showSocialNetwork(); } // Prof ids @@ -3326,6 +3298,50 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php'; } } + +function showSocialNetwork() { + global $socialnetworks, $object, $form, $object, $langs; + echo ''; + + print ' '; + foreach ($socialnetworks as $key => $value) { + if ($value['active']) { + print ''; + print ''; + print ''; + if (!empty($value['icon'])) { + print ''; + } + print ''; + print ''; + print ''; + } elseif (!empty($object->socialnetworks[$key])) { + print ''; + } + } + + print ''; +} + // End of page llxFooter(); $db->close(); From b2df3e47f84c87388590fb77dfb401a8916b9670 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Mon, 16 Jan 2023 17:09:34 +0000 Subject: [PATCH 0860/1128] Fixing style errors. --- htdocs/contact/card.php | 3 ++- htdocs/societe/card.php | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/htdocs/contact/card.php b/htdocs/contact/card.php index e0c263572cb..8c061020dc3 100644 --- a/htdocs/contact/card.php +++ b/htdocs/contact/card.php @@ -1592,7 +1592,8 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { } } -function showSocialNetwork() { +function showSocialNetwork() +{ global $socialnetworks, $object, $form, $object, $langs; echo ''; diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php index 2d6356394dd..f06a4c14eee 100644 --- a/htdocs/societe/card.php +++ b/htdocs/societe/card.php @@ -3299,7 +3299,8 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { } } -function showSocialNetwork() { +function showSocialNetwork() +{ global $socialnetworks, $object, $form, $object, $langs; echo ''; From 9b164b907c1a9e9b641ff7bd9d4c308e9e36ba83 Mon Sep 17 00:00:00 2001 From: Francis Appels Date: Mon, 16 Jan 2023 19:25:54 +0100 Subject: [PATCH 0861/1128] Add warehouse modify and create triggers. Clean and remove deprecated vars. --- htdocs/product/stock/class/entrepot.class.php | 52 ++++++++++++------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/htdocs/product/stock/class/entrepot.class.php b/htdocs/product/stock/class/entrepot.class.php index 065883e7a2c..ce5bef9c939 100644 --- a/htdocs/product/stock/class/entrepot.class.php +++ b/htdocs/product/stock/class/entrepot.class.php @@ -182,16 +182,17 @@ class Entrepot extends CommonObject /** * Creation d'un entrepot en base * - * @param User $user Object user that create the warehouse + * @param User $user Object user that create the warehouse + * @param bool $notrigger false=launch triggers after, true=disable triggers * @return int >0 if OK, =<0 if KO */ - public function create($user) + public function create($user, $notrigger = false) { global $conf; $error = 0; - $this->label = trim(!empty($this->label) ? $this->label : $this->libelle); + $this->label = trim($this->label); // Error if label not defined if ($this->label == '') { @@ -222,14 +223,21 @@ class Entrepot extends CommonObject // Actions on extra fields if (!$error) { - if (!$error) { - $result = $this->insertExtraFields(); - if ($result < 0) { - $error++; - } + $result = $this->insertExtraFields(); + if ($result < 0) { + $error++; } } + if (!$error && !$notrigger) { + // Call triggers + $result = $this->call_trigger('WAREHOUSE_CREATE', $user); + if ($result < 0) { + $error++; + } + // End call triggers + } + if (!$error) { $this->db->commit(); return $id; @@ -254,11 +262,12 @@ class Entrepot extends CommonObject /** * Update properties of a warehouse * - * @param int $id id of warehouse to modify - * @param User $user User object + * @param int $id id of warehouse to modify + * @param User $user User object + * @param bool $notrigger false=launch triggers after, true=disable trigge * @return int >0 if OK, <0 if KO */ - public function update($id, $user) + public function update($id, $user, $notrigger = false) { global $conf; @@ -267,9 +276,6 @@ class Entrepot extends CommonObject if (empty($id)) { $id = $this->id; } - if (empty($this->label)) { - $this->label = $this->libelle; // For backward compatibility - } // Check if new parent is already a child of current warehouse if (!empty($this->fk_parent)) { @@ -281,7 +287,7 @@ class Entrepot extends CommonObject } } - $this->label = trim(!empty($this->label) ? $this->label : $this->libelle); + $this->label = trim($this->label); $this->description = trim($this->description); @@ -324,6 +330,15 @@ class Entrepot extends CommonObject } } + if (!$error && !$notrigger) { + // Call triggers + $result = $this->call_trigger('WAREHOUSE_MODIFY', $user); + if ($result < 0) { + $error++; + } + // End call triggers + } + if (!$error) { $this->db->commit(); return 1; @@ -461,7 +476,6 @@ class Entrepot extends CommonObject $this->fk_project = $obj->fk_project; $this->ref = $obj->label; $this->label = $obj->label; - $this->libelle = $obj->label; // deprecated $this->description = $obj->description; $this->statut = $obj->statut; $this->lieu = $obj->lieu; @@ -705,7 +719,7 @@ class Entrepot extends CommonObject if (isset($this->statut)) { $label .= ' '.$this->getLibStatut(5); } - $label .= '
'.$langs->trans('Ref').': '.(empty($this->ref) ? (empty($this->label) ? $this->libelle : $this->label) : $this->ref); + $label .= '
'.$langs->trans('Ref').': '.(empty($this->ref) ? $this->label : $this->ref); if (!empty($this->lieu)) { $label .= '
'.$langs->trans('LocationSummary').': '.$this->lieu; } @@ -742,7 +756,7 @@ class Entrepot extends CommonObject $result .= img_object(($notooltip ? '' : $label), ($this->picto ? $this->picto : 'generic'), ($notooltip ? (($withpicto != 2) ? 'class="paddingright"' : '') : 'class="'.(($withpicto != 2) ? 'paddingright ' : '').'classfortooltip"'), 0, 0, $notooltip ? 0 : 1); } if ($withpicto != 2) { - $result .= (($showfullpath || !empty($conf->global->STOCK_ALWAYS_SHOW_FULL_ARBO)) ? $this->get_full_arbo() : (empty($this->label) ? $this->libelle : $this->label)); + $result .= (($showfullpath || !empty($conf->global->STOCK_ALWAYS_SHOW_FULL_ARBO)) ? $this->get_full_arbo() : $this->label); } $result .= $linkend; @@ -798,7 +812,7 @@ class Entrepot extends CommonObject // phpcs:enable global $user, $langs, $conf; - $TArbo = array(empty($this->label) ? $this->libelle : $this->label); + $TArbo = array($this->label); $protection = 100; // We limit depth of warehouses to 100 From 73f4b80a0588a787f55e786dbc6b8f8062519d7c Mon Sep 17 00:00:00 2001 From: Francis Appels Date: Mon, 16 Jan 2023 19:47:32 +0100 Subject: [PATCH 0862/1128] Update changelog for removed libelle --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index 1a3e96b18ce..fe39e1c1497 100644 --- a/ChangeLog +++ b/ChangeLog @@ -14,6 +14,7 @@ Following changes may create regressions for some external modules, but were nec * The deprecated method "escapeunderscore()" of database handlers has been removed. You must use "escapeforlike()" instead. * The method "nb_expedition()" has been renamed into "countNbOfShipments()" * Revert default type of hooks. Default is now 'addreplace' hooks (and exception become 'output' hooks, that become deprecated). +* Deprecated property libelle removed from entrepot class. From 4cf4da973cac0cda9ca70558f8020c683fcf32f5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 Jan 2023 20:38:03 +0100 Subject: [PATCH 0863/1128] Add a method for test/dev purpose --- htdocs/core/login/functions_http.php | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/htdocs/core/login/functions_http.php b/htdocs/core/login/functions_http.php index a23047c8f1c..73f5824c3cd 100644 --- a/htdocs/core/login/functions_http.php +++ b/htdocs/core/login/functions_http.php @@ -63,3 +63,25 @@ function check_user_password_http($usertotest, $passwordtotest, $entitytotest) return $login; } + + +/** + * Decode the value found into the Authorization HTTP header. + * Ex: "Authorization: Basic bG9naW46cGFzcw==", $value is "Basic bG9naW46cGFzcw==" and after base64decode is "login:pass" + * Note: the $_SERVER["REMOTE_USER"] contains only the login used in the HTTP Basic form + * Method not used yet, but we keep it for some dev/test purposes. + * + * @param string $value Ex: $_SERVER["REMOTE_USER"] + * @return Object object.login & object.password + */ +function decodeHttpBasicAuth($value) +{ + $encoded_basic_auth = substr($value, 6); // Remove the "Basic " string + $decoded_basic_auth = base64_decode($encoded_basic_auth); + $credentials_basic_auth = explode(':', $decoded_basic_auth); + + return (object) [ + 'username'=> $credentials_basic_auth[0], + 'password' => $credentials_basic_auth[1] + ]; +} From 90137268a126be6e29adbe24d461ecb45f9d4be1 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Mon, 16 Jan 2023 22:15:02 +0100 Subject: [PATCH 0864/1128] FIX: missing tokan on Supplier proposal links --- htdocs/supplier_proposal/card.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/htdocs/supplier_proposal/card.php b/htdocs/supplier_proposal/card.php index 399d1271037..d09b6793dd0 100644 --- a/htdocs/supplier_proposal/card.php +++ b/htdocs/supplier_proposal/card.php @@ -1968,30 +1968,30 @@ if ($action == 'create') { // Create an order if (((!empty($conf->fournisseur->enabled) && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || !empty($conf->supplier_order->enabled)) && $object->statut == SupplierProposal::STATUS_SIGNED) { if ($usercancreateorder) { - print ''; + print ''; } } // Set accepted/refused if ($object->statut == SupplierProposal::STATUS_VALIDATED && $usercanclose) { - print '
global->MAIN_JUMP_TAG) ? '' : '#acceptedrefused').'"'; + print ''; } // Close if ($object->statut == SupplierProposal::STATUS_SIGNED && $usercanclose) { - print '
global->MAIN_JUMP_TAG) ? '' : '#close').'"'; + print ''; } // Clone if ($usercancreate) { - print ''; + print ''; } // Delete if (($object->statut == SupplierProposal::STATUS_DRAFT && $usercancreate) || $usercandelete) { - print ''; } } From dbc9ca981628577dea9245ff7d6823c3e48b5142 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Mon, 16 Jan 2023 22:17:22 +0100 Subject: [PATCH 0865/1128] FIX: missing token on Supplier proposal links --- htdocs/supplier_proposal/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/supplier_proposal/card.php b/htdocs/supplier_proposal/card.php index d09b6793dd0..d4bb56b3304 100644 --- a/htdocs/supplier_proposal/card.php +++ b/htdocs/supplier_proposal/card.php @@ -1986,7 +1986,7 @@ if ($action == 'create') { // Clone if ($usercancreate) { - print ''; + print ''; } // Delete From ce0c69ae96d589d91b3eef113ccc15d6ad65d231 Mon Sep 17 00:00:00 2001 From: Randall Mora <50120822+randallmoraes@users.noreply.github.com> Date: Mon, 16 Jan 2023 23:15:51 -0600 Subject: [PATCH 0866/1128] Restrict by supplier instead of customer restrict permissions if user does not have access to view providers --- htdocs/core/menus/standard/eldy.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index a671ea31756..d354bc2445c 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -1273,7 +1273,7 @@ function get_left_menu_thridparties($mainmenu, &$newmenu, $usemenuhider = 1, $le $newmenu->add("/contact/list.php?leftmenu=contacts&type=c", $langs->trans("Customers"), 2, $user->hasRight('societe', 'contact', 'lire')); } if ((isModEnabled('fournisseur') && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled('supplier_order') || isModEnabled('supplier_invoice')) { - $newmenu->add("/contact/list.php?leftmenu=contacts&type=f", $langs->trans("Suppliers"), 2, $user->hasRight('societe', 'contact', 'lire')); + $newmenu->add("/contact/list.php?leftmenu=contacts&type=f", $langs->trans("Suppliers"), 2, $user->hasRight('fournisseur', 'lire') ); } $newmenu->add("/contact/list.php?leftmenu=contacts&type=o", $langs->trans("ContactOthers"), 2, $user->hasRight('societe', 'contact', 'lire')); //$newmenu->add("/contact/list.php?userid=$user->id", $langs->trans("MyContacts"), 1, $user->hasRight('societe', 'contact', 'lire')); From 95b391ae0a944e83b4f3d393a54a803c35e485da Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Tue, 17 Jan 2023 10:21:00 +0100 Subject: [PATCH 0867/1128] Fix - pos total qty --- htdocs/commande/list_det.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/commande/list_det.php b/htdocs/commande/list_det.php index fd36f229e5c..a763394b15b 100644 --- a/htdocs/commande/list_det.php +++ b/htdocs/commande/list_det.php @@ -1509,10 +1509,7 @@ if ($resql) { } // Product QtyOrdered if (!empty($arrayfields['cdet.qty']['checked'])) { - print ''.$obj->qty.''; - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'cdet.qty'; - } + print ''.$obj->qty.''; if (isset($totalarray['val']['cdet.qty'])) { $totalarray['val']['cdet.qty'] += $obj->qty; } else { @@ -1521,6 +1518,9 @@ if ($resql) { if (!$i) { $totalarray['nbfield']++; } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'cdet.qty'; + } } // Ref From 7668233d0ce6b0cee0984c266e432d48b3f28603 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 17 Jan 2023 10:22:23 +0100 Subject: [PATCH 0868/1128] NEW Tooltip to explain how to add a photo on product --- htdocs/core/class/commonobject.class.php | 36 +++++++++++++----------- htdocs/core/lib/functions.lib.php | 4 +-- htdocs/langs/en_US/main.lang | 3 +- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 93a3e1b5536..d6be7c463a1 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -8583,21 +8583,21 @@ abstract class CommonObject /** * Show photos of an object (nbmax maximum), into several columns * - * @param string $modulepart 'product', 'ticket', ... - * @param string $sdir Directory to scan (full absolute path) - * @param int $size 0=original size, 1='small' use thumbnail if possible - * @param int $nbmax Nombre maximum de photos (0=pas de max) - * @param int $nbbyrow Number of image per line or -1 to use div separator or 0 to use no separator. Used only if size=1 or 'small'. - * @param int $showfilename 1=Show filename - * @param int $showaction 1=Show icon with action links (resize, delete) - * @param int $maxHeight Max height of original image when size='small' (so we can use original even if small requested). If 0, always use 'small' thumb image. - * @param int $maxWidth Max width of original image when size='small' - * @param int $nolink Do not add a href link to view enlarged imaged into a new tab - * @param int $notitle Do not add title tag on image - * @param int $usesharelink Use the public shared link of image (if not available, the 'nophoto' image will be shown instead) - * @return string Html code to show photo. Number of photos shown is saved in this->nbphoto + * @param string $modulepart 'product', 'ticket', ... + * @param string $sdir Directory to scan (full absolute path) + * @param int $size 0=original size, 1='small' use thumbnail if possible + * @param int $nbmax Nombre maximum de photos (0=pas de max) + * @param int $nbbyrow Number of image per line or -1 to use div separator or 0 to use no separator. Used only if size=1 or 'small'. + * @param int $showfilename 1=Show filename + * @param int $showaction 1=Show icon with action links (resize, delete) + * @param int $maxHeight Max height of original image when size='small' (so we can use original even if small requested). If 0, always use 'small' thumb image. + * @param int $maxWidth Max width of original image when size='small' + * @param int $nolink Do not add a href link to view enlarged imaged into a new tab + * @param int|string $overwritetitle Do not add title tag on image + * @param int $usesharelink Use the public shared link of image (if not available, the 'nophoto' image will be shown instead) + * @return string Html code to show photo. Number of photos shown is saved in this->nbphoto */ - public function show_photos($modulepart, $sdir, $size = 0, $nbmax = 0, $nbbyrow = 5, $showfilename = 0, $showaction = 0, $maxHeight = 120, $maxWidth = 160, $nolink = 0, $notitle = 0, $usesharelink = 0) + public function show_photos($modulepart, $sdir, $size = 0, $nbmax = 0, $nbbyrow = 5, $showfilename = 0, $showaction = 0, $maxHeight = 120, $maxWidth = 160, $nolink = 0, $overwritetitle = 0, $usesharelink = 0) { // phpcs:enable global $conf, $user, $langs; @@ -8700,8 +8700,12 @@ abstract class CommonObject // Si fichier vignette disponible et image source trop grande, on utilise la vignette, sinon on utilise photo origine $alt = $langs->transnoentitiesnoconv('File').': '.$relativefile; $alt .= ' - '.$langs->transnoentitiesnoconv('Size').': '.$imgarray['width'].'x'.$imgarray['height']; - if ($notitle) { - $alt = ''; + if ($overwritetitle) { + if (is_numeric($overwritetitle)) { + $alt = ''; + } else { + $alt = $overwritetitle; + } } $addphotorefcss = 1; diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 3e3a87c7bd0..a25d083c251 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -2122,14 +2122,14 @@ function dol_banner_tab($object, $paramid, $morehtml = '', $shownav = 1, $fieldi $maxvisiblephotos = 1; } if ($showimage) { - $morehtmlleft .= '
'.$object->show_photos('product', $conf->product->multidir_output[$entity], 'small', $maxvisiblephotos, 0, 0, 0, $width, 0).'
'; + $morehtmlleft .= '
'.$object->show_photos('product', $conf->product->multidir_output[$entity], 'small', $maxvisiblephotos, 0, 0, 0, 0, $width, 0, '').'
'; } else { if (!empty($conf->global->PRODUCT_NODISPLAYIFNOPHOTO)) { $nophoto = ''; $morehtmlleft .= '
'; } else { // Show no photo link $nophoto = '/public/theme/common/nophoto.png'; - $morehtmlleft .= '
No photo
'; + $morehtmlleft .= '
transnoentitiesnoconv("Documents"))).'" alt="No photo"'.($width ? ' style="width: '.$width.'px"' : '').' src="'.DOL_URL_ROOT.$nophoto.'">
'; } } } elseif ($object->element == 'ticket') { diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index e7c7e010266..f65a05ce455 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -1219,4 +1219,5 @@ NoSpecificContactAddress=No specific contact or address NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. HideOnVCard=Hide %s AddToContacts=Add address to my contacts -LastAccess=Last access \ No newline at end of file +LastAccess=Last access +UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here \ No newline at end of file From 756a971dadf049ded467dc4e5fca14747331e32c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 17 Jan 2023 11:23:19 +0100 Subject: [PATCH 0869/1128] NEW Bank name no more mandatory on creation. Can be generated if empty. --- htdocs/societe/paymentmodes.php | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/htdocs/societe/paymentmodes.php b/htdocs/societe/paymentmodes.php index 0166a3a5635..bf4e1135f96 100644 --- a/htdocs/societe/paymentmodes.php +++ b/htdocs/societe/paymentmodes.php @@ -257,13 +257,8 @@ if (empty($reshook)) { if ($action == 'add') { $error = 0; - if (!GETPOST('label', 'alpha') || !GETPOST('bank', 'alpha')) { - if (!GETPOST('label', 'alpha')) { - setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Label")), null, 'errors'); - } - if (!GETPOST('bank', 'alpha')) { - setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("BankName")), null, 'errors'); - } + if (!GETPOST('label', 'alpha')) { + setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Label")), null, 'errors'); $action = 'create'; $error++; } @@ -274,6 +269,8 @@ if (empty($reshook)) { $companybankaccount->socid = $object->id; + $companybankaccount->fetch_thirdparty(); + $companybankaccount->bank = GETPOST('bank', 'alpha'); $companybankaccount->label = GETPOST('label', 'alpha'); $companybankaccount->courant = GETPOST('courant', 'alpha'); @@ -293,6 +290,12 @@ if (empty($reshook)) { $companybankaccount->datec = dol_now(); $companybankaccount->status = 1; + $companybankaccount->bank = trim($companybankaccount->bank); + if (empty($companybankaccount->bank) && !empty($companybankaccount->thirdparty)) { + $companybankaccount->bank = $langs->trans("Bank").' '.$companybankaccount->thirdparty->name; + } + $companybankaccount->bic = str_replace(' ', '', $companybankaccount->bic); + $db->begin(); // This test can be done only once properties were set @@ -1980,7 +1983,7 @@ if ($socid && $action == 'create' && $permissiontoaddupdatepaymentinformation) { print ''.$langs->trans("Label").''; print ''; - print ''.$langs->trans("Bank").''; + print ''.$langs->trans("Bank").''; print ''; // Show fields of bank account From eb6b42d1e34f8f177f58f62e473b26a59bb6b017 Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Tue, 17 Jan 2023 11:25:16 +0100 Subject: [PATCH 0870/1128] NEW - Add sub total in order list det --- htdocs/commande/list_det.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/htdocs/commande/list_det.php b/htdocs/commande/list_det.php index fd36f229e5c..e638e56ff9a 100644 --- a/htdocs/commande/list_det.php +++ b/htdocs/commande/list_det.php @@ -1402,6 +1402,7 @@ if ($resql) { $total_ht = 0; $total_margin = 0; + // Détail commande $totalqty = 0; @@ -1419,6 +1420,15 @@ if ($resql) { $text_warning = ''; $nbprod = 0; + // Print SubTotal + if (empty($i)) { + $oldref = $obj->product_ref; + } + if ($oldref != $obj->product_ref) { + include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php'; + $oldref = $obj->product_ref; + } + $companystatic->id = $obj->socid; $companystatic->name = $obj->name; $companystatic->name_alias = $obj->alias; From 9c082d5df26e89494225b96aec026162b700cc0b Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Tue, 17 Jan 2023 11:31:40 +0100 Subject: [PATCH 0871/1128] kanban mode for liste of expensereport --- .../class/expensereport.class.php | 37 ++ htdocs/expensereport/list.php | 373 ++++++++++-------- 2 files changed, 237 insertions(+), 173 deletions(-) diff --git a/htdocs/expensereport/class/expensereport.class.php b/htdocs/expensereport/class/expensereport.class.php index 63cbeaad67b..e0b10319b45 100644 --- a/htdocs/expensereport/class/expensereport.class.php +++ b/htdocs/expensereport/class/expensereport.class.php @@ -2675,6 +2675,43 @@ class ExpenseReport extends CommonObject return -1; } } + + /** + * Return clicable link of object (with eventually picto) + * + * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @return string HTML Code for Kanban thumb. + */ + public function getKanbanView($option = '') + { + global $langs, $selected,$arrayofselected; + $return = '
'; + $return .= '
'; + $return .= ''; + $return .= img_picto('', $this->picto); + $return .= ''; + $return .= '
'; + $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(1) : $this->ref).''; + if (in_array($this->id, $arrayofselected)) { + $selected = 1; + } + $return .= ''; + if (property_exists($this, 'fk_user_author') && !empty($this->id)) { + $return .= '
'.$this->fk_user_author.''; + } + if (property_exists($this, 'date_debut') && property_exists($this, 'date_fin')) { + $return .= '
'.dol_print_date($this->date_debut, 'day').''; + $return .= ' '.$langs->trans("To").' '; + $return .= ''.dol_print_date($this->date_fin, 'day').''; + } + if (method_exists($this, 'getLibStatut')) { + $return .= '
'.$this->getLibStatut(5).'
'; + } + $return .= '
'; + $return .= '
'; + $return .= '
'; + return $return; + } } diff --git a/htdocs/expensereport/list.php b/htdocs/expensereport/list.php index ad16d5fb09f..918c916a52c 100644 --- a/htdocs/expensereport/list.php +++ b/htdocs/expensereport/list.php @@ -50,6 +50,7 @@ $confirm = GETPOST('confirm', 'alpha'); $cancel = GETPOST('cancel', 'alpha'); // We click on a Cancel button $toselect = GETPOST('toselect', 'array'); $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'expensereportlist'; +$mode = GETPOST('mode', 'alpha'); $childids = $user->getAllChildIds(1); @@ -378,6 +379,9 @@ if ($resql) { $arrayofselected = is_array($toselect) ? $toselect : array(); $param = ''; + if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); + } if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -471,6 +475,7 @@ if ($resql) { print ''; print ''; print ''; + print ''; if ($id > 0) { print ''; } @@ -512,7 +517,10 @@ if ($resql) { if (!empty($socid)) { $url .= '&socid='.$socid; } - $newcardbutton = dolGetButtonTitle($langs->trans('NewTrip'), '', 'fa fa-plus-circle', $url, '', $user->rights->expensereport->creer); + $newcardbutton = ''; + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition')); + $newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); + $newcardbutton .= dolGetButtonTitle($langs->trans('NewTrip'), '', 'fa fa-plus-circle', $url, '', $user->rights->expensereport->creer); print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'trip', 0, $newcardbutton, '', $limit, 0, 0, 1); } @@ -739,185 +747,204 @@ if ($resql) { $expensereportstatic->note_private = $obj->note_private; $expensereportstatic->note_public = $obj->note_public; + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + print '
'; + } + $usertmp->fetch($obj->id_user); + $expensereportstatic->fk_user_author = $usertmp->getNomUrl(1); - print ''; - // Action column - if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->rowid, $arrayofselected)) { - $selected = 1; + // Output Kanban + if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { + if ($massactionbutton || $massaction) { + $selected = 0; + + print $expensereportstatic->getKanbanView(''); } - print ''; } - print ''; - } - // Ref - if (!empty($arrayfields['d.ref']['checked'])) { - print ''; - print ''; - print ''; - // Warning late icon and note - print ''; } - if ($expensereportstatic->status == 5 && $expensereportstatic->hasDelay('topay')) { - print img_warning($langs->trans("Late")); - } - if (!empty($obj->note_private) || !empty($obj->note_public)) { - print ' '; - print ''.img_picto($langs->trans("ViewPrivateNote"), 'object_generic').''; - print ''; - } - print ''; - print ''; - print '
'; - print $expensereportstatic->getNomUrl(1); - print ''; - if ($expensereportstatic->status == 2 && $expensereportstatic->hasDelay('toappove')) { - print img_warning($langs->trans("Late")); + if ($i == (min($num, $limit) - 1)) { + print ''; + print '
'; - $filename = dol_sanitizeFileName($obj->ref); - $filedir = $conf->expensereport->dir_output.'/'.dol_sanitizeFileName($obj->ref); - $urlsource = $_SERVER['PHP_SELF'].'?id='.$obj->rowid; - print $formfile->getDocumentsLink($expensereportstatic->element, $filename, $filedir); - print '
'; - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // User - if (!empty($arrayfields['user']['checked'])) { - print ''; - $usertmp->id = $obj->id_user; - $usertmp->lastname = $obj->lastname; - $usertmp->firstname = $obj->firstname; - $usertmp->login = $obj->login; - $usertmp->statut = $obj->statut; - $usertmp->photo = $obj->photo; - $usertmp->email = $obj->email; - print $usertmp->getNomUrl(-1); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Start date - if (!empty($arrayfields['d.date_debut']['checked'])) { - print ''.($obj->date_debut > 0 ? dol_print_date($db->jdate($obj->date_debut), 'day') : '').''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // End date - if (!empty($arrayfields['d.date_fin']['checked'])) { - print ''.($obj->date_fin > 0 ? dol_print_date($db->jdate($obj->date_fin), 'day') : '').''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Date validation - if (!empty($arrayfields['d.date_valid']['checked'])) { - print ''.($obj->date_valid > 0 ? dol_print_date($db->jdate($obj->date_valid), 'day') : '').''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Date approval - if (!empty($arrayfields['d.date_approve']['checked'])) { - print ''.($obj->date_approve > 0 ? dol_print_date($db->jdate($obj->date_approve), 'day') : '').''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Amount HT - if (!empty($arrayfields['d.total_ht']['checked'])) { - print ''.price($obj->total_ht)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'd.total_ht'; - } - $totalarray['val']['d.total_ht'] += $obj->total_ht; - } - // Amount VAT - if (!empty($arrayfields['d.total_vat']['checked'])) { - print ''.price($obj->total_tva)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'd.total_tva'; - } - $totalarray['val']['d.total_tva'] += $obj->total_tva; - } - // Amount TTC - if (!empty($arrayfields['d.total_ttc']['checked'])) { - print ''.price($obj->total_ttc)."\n"; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'd.total_ttc'; - } - $totalarray['val']['d.total_ttc'] += $obj->total_ttc; - } - - // Extra fields - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - - // Date creation - if (!empty($arrayfields['d.date_create']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_create), 'dayhour'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Date modification - if (!empty($arrayfields['d.tms']['checked'])) { - print ''; - print dol_print_date($db->jdate($obj->date_modif), 'dayhour'); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Status - if (!empty($arrayfields['d.fk_statut']['checked'])) { - print ''.$expensereportstatic->getLibStatut(5).''; - if (!$i) { - $totalarray['nbfield']++; - } - } - // Action column - if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { - print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($obj->rowid, $arrayofselected)) { - $selected = 1; + } else { + print ''; + // Action column + if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->rowid, $arrayofselected)) { + $selected = 1; + } + print ''; } - print ''; + print ''; } - print ''; + // Ref + if (!empty($arrayfields['d.ref']['checked'])) { + print ''; + print ''; + print ''; + // Warning late icon and note + print ''; + print ''; + print '
'; + print $expensereportstatic->getNomUrl(1); + print ''; + if ($expensereportstatic->status == 2 && $expensereportstatic->hasDelay('toappove')) { + print img_warning($langs->trans("Late")); + } + if ($expensereportstatic->status == 5 && $expensereportstatic->hasDelay('topay')) { + print img_warning($langs->trans("Late")); + } + if (!empty($obj->note_private) || !empty($obj->note_public)) { + print ' '; + print ''.img_picto($langs->trans("ViewPrivateNote"), 'object_generic').''; + print ''; + } + print ''; + $filename = dol_sanitizeFileName($obj->ref); + $filedir = $conf->expensereport->dir_output.'/'.dol_sanitizeFileName($obj->ref); + $urlsource = $_SERVER['PHP_SELF'].'?id='.$obj->rowid; + print $formfile->getDocumentsLink($expensereportstatic->element, $filename, $filedir); + print '
'; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // User + if (!empty($arrayfields['user']['checked'])) { + print ''; + $usertmp->id = $obj->id_user; + $usertmp->lastname = $obj->lastname; + $usertmp->firstname = $obj->firstname; + $usertmp->login = $obj->login; + $usertmp->statut = $obj->statut; + $usertmp->photo = $obj->photo; + $usertmp->email = $obj->email; + print $usertmp->getNomUrl(-1); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Start date + if (!empty($arrayfields['d.date_debut']['checked'])) { + print ''.($obj->date_debut > 0 ? dol_print_date($db->jdate($obj->date_debut), 'day') : '').''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // End date + if (!empty($arrayfields['d.date_fin']['checked'])) { + print ''.($obj->date_fin > 0 ? dol_print_date($db->jdate($obj->date_fin), 'day') : '').''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Date validation + if (!empty($arrayfields['d.date_valid']['checked'])) { + print ''.($obj->date_valid > 0 ? dol_print_date($db->jdate($obj->date_valid), 'day') : '').''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Date approval + if (!empty($arrayfields['d.date_approve']['checked'])) { + print ''.($obj->date_approve > 0 ? dol_print_date($db->jdate($obj->date_approve), 'day') : '').''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Amount HT + if (!empty($arrayfields['d.total_ht']['checked'])) { + print ''.price($obj->total_ht)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'd.total_ht'; + } + $totalarray['val']['d.total_ht'] += $obj->total_ht; + } + // Amount VAT + if (!empty($arrayfields['d.total_vat']['checked'])) { + print ''.price($obj->total_tva)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'd.total_tva'; + } + $totalarray['val']['d.total_tva'] += $obj->total_tva; + } + // Amount TTC + if (!empty($arrayfields['d.total_ttc']['checked'])) { + print ''.price($obj->total_ttc)."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'd.total_ttc'; + } + $totalarray['val']['d.total_ttc'] += $obj->total_ttc; + } + + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + + // Date creation + if (!empty($arrayfields['d.date_create']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_create), 'dayhour'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Date modification + if (!empty($arrayfields['d.tms']['checked'])) { + print ''; + print dol_print_date($db->jdate($obj->date_modif), 'dayhour'); + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Status + if (!empty($arrayfields['d.fk_statut']['checked'])) { + print ''.$expensereportstatic->getLibStatut(5).''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Action column + if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($obj->rowid, $arrayofselected)) { + $selected = 1; + } + print ''; + } + print ''; + } + if (!$i) { + $totalarray['nbfield']++; + } + + print "\n"; } - if (!$i) { - $totalarray['nbfield']++; - } - - print "\n"; - - $total_total_ht = $total_total_ht + $obj->total_ht; - $total_total_tva = $total_total_tva + $obj->total_tva; - $total_total_ttc = $total_total_ttc + $obj->total_ttc; - + $total_total_ht = $total_total_ht + $obj->total_ht; + $total_total_tva = $total_total_tva + $obj->total_tva; + $total_total_ttc = $total_total_ttc + $obj->total_ttc; $i++; } } else { From 957e8538a4b7768a60d7495331eaad3d33d31b49 Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Tue, 17 Jan 2023 11:36:03 +0100 Subject: [PATCH 0872/1128] FIX - Order list det sortfield default --- htdocs/commande/list_det.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/commande/list_det.php b/htdocs/commande/list_det.php index fd36f229e5c..c05ff36e9d2 100644 --- a/htdocs/commande/list_det.php +++ b/htdocs/commande/list_det.php @@ -137,10 +137,10 @@ $offset = $limit * $page; $pageprev = $page - 1; $pagenext = $page + 1; if (!$sortfield) { - $sortfield = 'c.ref'; + $sortfield = 'pr.ref'; } if (!$sortorder) { - $sortorder = 'DESC'; + $sortorder = 'ASSC'; } $show_shippable_command = GETPOST('show_shippable_command', 'aZ09'); From a165489237b8dc5da4b8213b247d33365d779e74 Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Tue, 17 Jan 2023 11:46:39 +0100 Subject: [PATCH 0873/1128] Move checkbox --- htdocs/commande/list_det.php | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/htdocs/commande/list_det.php b/htdocs/commande/list_det.php index fd36f229e5c..385408663fd 100644 --- a/htdocs/commande/list_det.php +++ b/htdocs/commande/list_det.php @@ -830,10 +830,6 @@ if ($resql) { print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'order', 0, $newcardbutton, '', $limit, 0, 0, 1); - print ''; - print ''; - print ''; - $topicmail = "SendOrderRef"; $modelmail = "order_send"; $objecttmp = new Commande($db); @@ -849,6 +845,11 @@ if ($resql) { $moreforfilter = ''; + $moreforfilter .= ''; + $moreforfilter .= ''; + $moreforfilter .= ''; + $moreforfilter .= '
'; + // If the user can view prospects other than his' if ($user->rights->user->user->lire) { $langs->load("commercial"); @@ -888,6 +889,8 @@ if ($resql) { $moreforfilter .= img_picto($tmptitle, 'stock', 'class="pictofixedwidth"').$formproduct->selectWarehouses($search_warehouse, 'search_warehouse', '', 1, 0, 0, $tmptitle, 0, 0, array(), 'maxwidth250 widthcentpercentminusx'); $moreforfilter .= '
'; } + + $parameters = array(); $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters); // Note that $action and $object may have been modified by hook if (empty($reshook)) { From 8ced6d52e745f0ee6ae95f093e24298f2d01df55 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 17 Jan 2023 11:47:16 +0100 Subject: [PATCH 0874/1128] FIX Component js to generate password --- htdocs/core/ajax/security.php | 9 +++++---- htdocs/core/lib/security2.lib.php | 7 ++++--- htdocs/user/card.php | 14 ++++++++------ 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/htdocs/core/ajax/security.php b/htdocs/core/ajax/security.php index e5dc91c05d1..b01c952662e 100644 --- a/htdocs/core/ajax/security.php +++ b/htdocs/core/ajax/security.php @@ -36,9 +36,10 @@ if (!defined('NOREQUIREAJAX')) { if (!defined('NOREQUIRESOC')) { define('NOREQUIRESOC', '1'); } -if (!defined('NOREQUIRETRAN')) { +// We need langs because the getRandomPassword may use user language to define some rules of pass generation +/*if (!defined('NOREQUIRETRAN')) { define('NOREQUIRETRAN', '1'); -} +}*/ // Load Dolibarr environment require '../../main.inc.php'; @@ -55,9 +56,9 @@ top_httphead(); //print ''."\n"; -// Registering the location of boxes +// Return a new generated password if ($action) { - if ($action == 'getrandompassword' && ($user->admin || $user->rights->api->apikey->generate)) { + if ($action == 'getrandompassword') { require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php'; $generic = GETPOST('generic') ? true : false; echo getRandomPassword($generic); diff --git a/htdocs/core/lib/security2.lib.php b/htdocs/core/lib/security2.lib.php index 5e4d58103d8..f450d390dff 100644 --- a/htdocs/core/lib/security2.lib.php +++ b/htdocs/core/lib/security2.lib.php @@ -560,10 +560,11 @@ function getRandomPassword($generic = false, $replaceambiguouschars = null, $len * * @param string $htmlname HTML name of element to insert key into * @param string $htmlnameofbutton HTML name of button + * @param int $generic 1=Return a generic pass, 0=Return a pass following setup rules * @return string HTML javascript code to set a password * @see getRandomPassword() */ -function dolJSToSetRandomPassword($htmlname, $htmlnameofbutton = 'generate_token') +function dolJSToSetRandomPassword($htmlname, $htmlnameofbutton = 'generate_token', $generic = 1) { global $conf; @@ -571,10 +572,10 @@ function dolJSToSetRandomPassword($htmlname, $htmlnameofbutton = 'generate_token print "\n".' - \n"; From 947365fabfabd96a198952de5acfa24dfe5bf99d Mon Sep 17 00:00:00 2001 From: Anthony Berton <34568357+BB2A-Anthony@users.noreply.github.com> Date: Tue, 17 Jan 2023 17:48:37 +0100 Subject: [PATCH 0895/1128] Update list_det.php --- htdocs/commande/list_det.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/commande/list_det.php b/htdocs/commande/list_det.php index c05ff36e9d2..48d21abf4a3 100644 --- a/htdocs/commande/list_det.php +++ b/htdocs/commande/list_det.php @@ -140,7 +140,7 @@ if (!$sortfield) { $sortfield = 'pr.ref'; } if (!$sortorder) { - $sortorder = 'ASSC'; + $sortorder = 'ASC'; } $show_shippable_command = GETPOST('show_shippable_command', 'aZ09'); From e5d4ea1b7cc6184bafa1aa0ccda8ee829af0f14d Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Tue, 17 Jan 2023 18:30:06 +0100 Subject: [PATCH 0896/1128] FIX error with dol_banner_tab, ref is needed --- htdocs/contrat/agenda.php | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/htdocs/contrat/agenda.php b/htdocs/contrat/agenda.php index d654ac38d9f..3e51e9a1de5 100644 --- a/htdocs/contrat/agenda.php +++ b/htdocs/contrat/agenda.php @@ -54,7 +54,11 @@ $ref = GETPOST('ref', 'alpha'); if ($user->socid) { $socid = $user->socid; } -$result = restrictedArea($user, 'contrat', $id, ''); + +// Security check +$fieldvalue = (!empty($id) ? $id : (!empty($ref) ? $ref : '')); +$fieldtype = (!empty($id) ? 'rowid' : 'ref'); +$result = restrictedArea($user, 'contrat', $fieldvalue, '', '', '', $fieldtype); $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit; $sortfield = GETPOST('sortfield', 'aZ09comma'); @@ -73,6 +77,13 @@ if (!$sortorder) { $sortorder = 'DESC,DESC'; } + +$object = new Contrat($db); + +if ($id > 0 || !empty($ref)) { + $result = $object->fetch($id, $ref); +} + // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context $hookmanager->initHooks(array('agendacontract', 'globalcard')); @@ -81,7 +92,7 @@ $hookmanager->initHooks(array('agendacontract', 'globalcard')); * Actions */ -$parameters = array('id'=>$id); +$parameters = array('id' => $id, 'ref' => $ref); $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); @@ -102,8 +113,6 @@ if (empty($reshook)) { } - - /* * View */ @@ -114,7 +123,7 @@ if (!empty($conf->projet->enabled)) { $formproject = new FormProjets($db); } -if ($id > 0) { +if ($object->id > 0) { // Load object modContract $module = (!empty($conf->global->CONTRACT_ADDON) ? $conf->global->CONTRACT_ADDON : 'mod_contract_serpis'); if (substr($module, 0, 13) == 'mod_contract_' && substr($module, -3) == 'php') { @@ -128,8 +137,6 @@ if ($id > 0) { require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php'; - $object = new Contrat($db); - $result = $object->fetch($id); $object->fetch_thirdparty(); $title = $langs->trans("Agenda"); @@ -205,13 +212,13 @@ if ($id > 0) { } $morehtmlref .= '
'; - dol_banner_tab($object, 'id', $linkback, 1, 'ref', 'none', $morehtmlref); + dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'none', $morehtmlref); print '
'; print '
'; - $object->info($id); + $object->info($object->id); dol_print_object_info($object, 1); print '
'; @@ -254,7 +261,7 @@ if ($id > 0) { if (!empty($conf->agenda->enabled) && (!empty($user->rights->agenda->myactions->read) || !empty($user->rights->agenda->allactions->read))) { print '
'; - $param = '&id='.$id; + $param = '&id='.$object->id; if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.$contextpage; } From 82cccc82f58a342b52b3ce2d33bf81fda3abf6be Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Tue, 17 Jan 2023 19:23:01 +0000 Subject: [PATCH 0897/1128] Fixing style errors. --- htdocs/bom/tpl/objectline_view.tpl.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/bom/tpl/objectline_view.tpl.php b/htdocs/bom/tpl/objectline_view.tpl.php index be12ec460ba..2c18ffbd87f 100644 --- a/htdocs/bom/tpl/objectline_view.tpl.php +++ b/htdocs/bom/tpl/objectline_view.tpl.php @@ -170,7 +170,7 @@ $total_cost = 0; $tmpbom->calculateCosts(); print ''; $coldisplay++; -if(!empty($line->fk_bom_child)) { +if (!empty($line->fk_bom_child)) { echo ''.price($tmpbom->total_cost).''; } else { echo ''.price($line->total_cost).''; From 26972c55a8c9ea716b5af46bd2e1f002779c20db Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 17 Jan 2023 23:56:22 +0100 Subject: [PATCH 0898/1128] Fix warnings --- htdocs/filefunc.inc.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/filefunc.inc.php b/htdocs/filefunc.inc.php index aca15e9d7a3..a5b5264052d 100644 --- a/htdocs/filefunc.inc.php +++ b/htdocs/filefunc.inc.php @@ -138,10 +138,10 @@ if (!empty($dolibarr_main_prod)) { } // Clean parameters -$dolibarr_main_data_root = trim($dolibarr_main_data_root); -$dolibarr_main_url_root = trim(preg_replace('/\/+$/', '', $dolibarr_main_url_root)); +$dolibarr_main_data_root = (empty($dolibarr_main_data_root) ? '' : trim($dolibarr_main_data_root)); +$dolibarr_main_url_root = trim(preg_replace('/\/+$/', '', empty($dolibarr_main_url_root) ? '' : $dolibarr_main_url_root)); $dolibarr_main_url_root_alt = (empty($dolibarr_main_url_root_alt) ? '' : trim($dolibarr_main_url_root_alt)); -$dolibarr_main_document_root = trim($dolibarr_main_document_root); +$dolibarr_main_document_root = (empty($dolibarr_main_document_root) ? '' : trim($dolibarr_main_document_root)); $dolibarr_main_document_root_alt = (empty($dolibarr_main_document_root_alt) ? '' : trim($dolibarr_main_document_root_alt)); if (empty($dolibarr_main_db_port)) { From 708e284381f15d06da6fbf9591fc89f5ed73831a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 18 Jan 2023 00:13:21 +0100 Subject: [PATCH 0899/1128] Enhance backward compatibility --- htdocs/societe/class/societe.class.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 5876e8aff4a..2b233f3e0f6 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -794,6 +794,9 @@ class Societe extends CommonObject public $partnerships = array(); + const STATUS_CEASED = 0; + const STATUS_INACTIVITY = 1; + /** * @var Account|string Default BAN account From 29966d8499b59a9f01562979c7f472f1ab1cd44a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9=20Courtier?= Date: Wed, 18 Jan 2023 09:29:11 +0100 Subject: [PATCH 0900/1128] FIX: Add missing token when deleting template inn order_supplier admin menu --- htdocs/admin/supplier_order.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/admin/supplier_order.php b/htdocs/admin/supplier_order.php index 7cf64e4800d..5b7a9845c10 100644 --- a/htdocs/admin/supplier_order.php +++ b/htdocs/admin/supplier_order.php @@ -381,7 +381,7 @@ foreach ($dirmodels as $reldir) { if (in_array($name, $def)) { print ''."\n"; if ($conf->global->COMMANDE_SUPPLIER_ADDON_PDF != "$name") { - print 'scandir.'&label='.urlencode($module->name).'&type=order_supplier">'; + print 'scandir.'&label='.urlencode($module->name).'&type=order_supplier">'; print img_picto($langs->trans("Enabled"), 'switch_on'); print ''; } else { From d344e108c95d29e2d6d4101148ce9fae4f37baab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9=20Courtier?= Date: Wed, 18 Jan 2023 09:44:23 +0100 Subject: [PATCH 0901/1128] FIX: Errors Handling for CreateFrom Hooks --- htdocs/comm/action/class/actioncomm.class.php | 2 ++ htdocs/comm/propal/card.php | 1 + htdocs/comm/propal/class/propal.class.php | 2 ++ htdocs/commande/card.php | 1 + htdocs/commande/class/commande.class.php | 4 ++++ htdocs/compta/facture/class/facture.class.php | 4 ++++ htdocs/contrat/card.php | 1 + htdocs/contrat/class/contrat.class.php | 2 ++ htdocs/expensereport/class/expensereport.class.php | 2 ++ htdocs/fichinter/class/fichinter.class.php | 2 ++ htdocs/fourn/class/fournisseur.commande.class.php | 2 ++ htdocs/fourn/commande/card.php | 1 + htdocs/supplier_proposal/card.php | 1 + htdocs/supplier_proposal/class/supplier_proposal.class.php | 2 ++ 14 files changed, 27 insertions(+) diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index 769bd9ddd50..8032ead20ba 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -708,6 +708,8 @@ class ActionComm extends CommonObject $action = ''; $reshook = $hookmanager->executeHooks('createFrom', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { + $this->errors += $hookmanager->errors; + $this->error = $hookmanager->error; $error++; } } diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index da4c756705f..ea2ab40db42 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -567,6 +567,7 @@ if (empty($reshook)) { $reshook = $hookmanager->executeHooks('createFrom', $parameters, $object, $action); // Note that $action and $object may have been // modified by hook if ($reshook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); $error++; } } else { diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index f36b8027461..6567e11cdbf 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -1412,6 +1412,8 @@ class Propal extends CommonObject $action = ''; $reshook = $hookmanager->executeHooks('createFrom', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { + $this->errors += $hookmanager->errors; + $this->error = $hookmanager->error; $error++; } } diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index d394df997ff..b74114164b0 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -445,6 +445,7 @@ if (empty($reshook)) { // Note that $action and $object may be modified by hook $reshook = $hookmanager->executeHooks('createFrom', $parameters, $object, $action); if ($reshook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); $error++; } } else { diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 33de271b45d..bd3be625561 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -1252,6 +1252,8 @@ class Commande extends CommonOrder $action = ''; $reshook = $hookmanager->executeHooks('createFrom', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { + $this->errors += $hookmanager->errors; + $this->error = $hookmanager->error; $error++; } } @@ -1406,6 +1408,8 @@ class Commande extends CommonOrder $action = ''; $reshook = $hookmanager->executeHooks('createFrom', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { + $this->errors += $hookmanager->errors; + $this->error = $hookmanager->error; $error++; } diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 862a86e9e16..ba5eab04d16 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -1299,6 +1299,8 @@ class Facture extends CommonInvoice $action = ''; $reshook = $hookmanager->executeHooks('createFrom', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { + $this->errors += $hookmanager->errors; + $this->error = $hookmanager->error; $error++; } } @@ -1432,6 +1434,8 @@ class Facture extends CommonInvoice $action = ''; $reshook = $hookmanager->executeHooks('createFrom', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { + $this->errors += $hookmanager->errors; + $this->error = $hookmanager->error; $error++; } diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index 624d59b0d94..2acf59593ff 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -341,6 +341,7 @@ if (empty($reshook)) { $reshook = $hookmanager->executeHooks('createFrom', $parameters, $object, $action); // Note that $action and $object may have been // modified by hook if ($reshook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); $error++; } } else { diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index 309df80605e..3d397fcb6c1 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -2564,6 +2564,8 @@ class Contrat extends CommonObject $action = ''; $reshook = $hookmanager->executeHooks('createFrom', $parameters, $clonedObj, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { + $this->errors += $hookmanager->errors; + $this->error = $hookmanager->error; $error++; } } diff --git a/htdocs/expensereport/class/expensereport.class.php b/htdocs/expensereport/class/expensereport.class.php index 3f62087dd0b..fa69245dc58 100644 --- a/htdocs/expensereport/class/expensereport.class.php +++ b/htdocs/expensereport/class/expensereport.class.php @@ -455,6 +455,8 @@ class ExpenseReport extends CommonObject $action = ''; $reshook = $hookmanager->executeHooks('createFrom', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { + $this->errors += $hookmanager->errors; + $this->error = $hookmanager->error; $error++; } } diff --git a/htdocs/fichinter/class/fichinter.class.php b/htdocs/fichinter/class/fichinter.class.php index 000b654bf72..d8e213d31e8 100644 --- a/htdocs/fichinter/class/fichinter.class.php +++ b/htdocs/fichinter/class/fichinter.class.php @@ -1211,6 +1211,8 @@ class Fichinter extends CommonObject $action = ''; $reshook = $hookmanager->executeHooks('createFrom', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { + $this->errors += $hookmanager->errors; + $this->error = $hookmanager->error; $error++; } } diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index e78dd9dd02a..c5f700dd6a7 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -1654,6 +1654,8 @@ class CommandeFournisseur extends CommonOrder $action = ''; $reshook = $hookmanager->executeHooks('createFrom', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { + $this->errors += $hookmanager->errors; + $this->error = $hookmanager->error; $error++; } } diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index 86e34ce39a1..f7e339c6c9a 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -1314,6 +1314,7 @@ if (empty($reshook)) { $reshook = $hookmanager->executeHooks('createFrom', $parameters, $object, $action); // Note that $action and $object may have been if ($reshook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); $error++; } } else { diff --git a/htdocs/supplier_proposal/card.php b/htdocs/supplier_proposal/card.php index 4ad5fa9ff56..2f4dd6e0540 100644 --- a/htdocs/supplier_proposal/card.php +++ b/htdocs/supplier_proposal/card.php @@ -407,6 +407,7 @@ if (empty($reshook)) { $reshook = $hookmanager->executeHooks('createFrom', $parameters, $object, $action); // Note that $action and $object may have been // modified by hook if ($reshook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); $error++; } } else { diff --git a/htdocs/supplier_proposal/class/supplier_proposal.class.php b/htdocs/supplier_proposal/class/supplier_proposal.class.php index 78fc1c7fd15..dc18f7dcb2b 100644 --- a/htdocs/supplier_proposal/class/supplier_proposal.class.php +++ b/htdocs/supplier_proposal/class/supplier_proposal.class.php @@ -1160,6 +1160,8 @@ class SupplierProposal extends CommonObject $action = ''; $reshook = $hookmanager->executeHooks('createFrom', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { + $this->errors += $hookmanager->errors; + $this->error = $hookmanager->error; $error++; } } From 4ee0ede6d8e8205e9431da95463de6ef886312f6 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Wed, 18 Jan 2023 08:53:28 +0000 Subject: [PATCH 0902/1128] Fixing style errors. --- htdocs/comm/action/class/actioncomm.class.php | 4 ++-- htdocs/comm/propal/card.php | 2 +- htdocs/comm/propal/class/propal.class.php | 4 ++-- htdocs/commande/card.php | 2 +- htdocs/commande/class/commande.class.php | 8 ++++---- htdocs/compta/facture/class/facture.class.php | 8 ++++---- htdocs/contrat/card.php | 2 +- htdocs/contrat/class/contrat.class.php | 4 ++-- htdocs/expensereport/class/expensereport.class.php | 4 ++-- htdocs/fichinter/class/fichinter.class.php | 4 ++-- htdocs/fourn/class/fournisseur.commande.class.php | 4 ++-- htdocs/fourn/commande/card.php | 2 +- htdocs/supplier_proposal/card.php | 2 +- .../supplier_proposal/class/supplier_proposal.class.php | 4 ++-- 14 files changed, 27 insertions(+), 27 deletions(-) diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index 8032ead20ba..f5e1fe40b1f 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -708,8 +708,8 @@ class ActionComm extends CommonObject $action = ''; $reshook = $hookmanager->executeHooks('createFrom', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { - $this->errors += $hookmanager->errors; - $this->error = $hookmanager->error; + $this->errors += $hookmanager->errors; + $this->error = $hookmanager->error; $error++; } } diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index ea2ab40db42..e575195799c 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -567,7 +567,7 @@ if (empty($reshook)) { $reshook = $hookmanager->executeHooks('createFrom', $parameters, $object, $action); // Note that $action and $object may have been // modified by hook if ($reshook < 0) { - setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); $error++; } } else { diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index 6567e11cdbf..edd443c1b58 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -1412,8 +1412,8 @@ class Propal extends CommonObject $action = ''; $reshook = $hookmanager->executeHooks('createFrom', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { - $this->errors += $hookmanager->errors; - $this->error = $hookmanager->error; + $this->errors += $hookmanager->errors; + $this->error = $hookmanager->error; $error++; } } diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index b74114164b0..e099aafc9ca 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -445,7 +445,7 @@ if (empty($reshook)) { // Note that $action and $object may be modified by hook $reshook = $hookmanager->executeHooks('createFrom', $parameters, $object, $action); if ($reshook < 0) { - setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); $error++; } } else { diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index bd3be625561..c636b4e905d 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -1252,8 +1252,8 @@ class Commande extends CommonOrder $action = ''; $reshook = $hookmanager->executeHooks('createFrom', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { - $this->errors += $hookmanager->errors; - $this->error = $hookmanager->error; + $this->errors += $hookmanager->errors; + $this->error = $hookmanager->error; $error++; } } @@ -1408,8 +1408,8 @@ class Commande extends CommonOrder $action = ''; $reshook = $hookmanager->executeHooks('createFrom', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { - $this->errors += $hookmanager->errors; - $this->error = $hookmanager->error; + $this->errors += $hookmanager->errors; + $this->error = $hookmanager->error; $error++; } diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index ba5eab04d16..2af2b35240d 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -1299,8 +1299,8 @@ class Facture extends CommonInvoice $action = ''; $reshook = $hookmanager->executeHooks('createFrom', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { - $this->errors += $hookmanager->errors; - $this->error = $hookmanager->error; + $this->errors += $hookmanager->errors; + $this->error = $hookmanager->error; $error++; } } @@ -1434,8 +1434,8 @@ class Facture extends CommonInvoice $action = ''; $reshook = $hookmanager->executeHooks('createFrom', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { - $this->errors += $hookmanager->errors; - $this->error = $hookmanager->error; + $this->errors += $hookmanager->errors; + $this->error = $hookmanager->error; $error++; } diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index 2acf59593ff..a63e8d7c6ca 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -341,7 +341,7 @@ if (empty($reshook)) { $reshook = $hookmanager->executeHooks('createFrom', $parameters, $object, $action); // Note that $action and $object may have been // modified by hook if ($reshook < 0) { - setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); $error++; } } else { diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index 3d397fcb6c1..f16b26646bc 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -2564,8 +2564,8 @@ class Contrat extends CommonObject $action = ''; $reshook = $hookmanager->executeHooks('createFrom', $parameters, $clonedObj, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { - $this->errors += $hookmanager->errors; - $this->error = $hookmanager->error; + $this->errors += $hookmanager->errors; + $this->error = $hookmanager->error; $error++; } } diff --git a/htdocs/expensereport/class/expensereport.class.php b/htdocs/expensereport/class/expensereport.class.php index fa69245dc58..a0fe9fa8335 100644 --- a/htdocs/expensereport/class/expensereport.class.php +++ b/htdocs/expensereport/class/expensereport.class.php @@ -455,8 +455,8 @@ class ExpenseReport extends CommonObject $action = ''; $reshook = $hookmanager->executeHooks('createFrom', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { - $this->errors += $hookmanager->errors; - $this->error = $hookmanager->error; + $this->errors += $hookmanager->errors; + $this->error = $hookmanager->error; $error++; } } diff --git a/htdocs/fichinter/class/fichinter.class.php b/htdocs/fichinter/class/fichinter.class.php index d8e213d31e8..0205fec9e39 100644 --- a/htdocs/fichinter/class/fichinter.class.php +++ b/htdocs/fichinter/class/fichinter.class.php @@ -1211,8 +1211,8 @@ class Fichinter extends CommonObject $action = ''; $reshook = $hookmanager->executeHooks('createFrom', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { - $this->errors += $hookmanager->errors; - $this->error = $hookmanager->error; + $this->errors += $hookmanager->errors; + $this->error = $hookmanager->error; $error++; } } diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index c5f700dd6a7..112708a92b7 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -1654,8 +1654,8 @@ class CommandeFournisseur extends CommonOrder $action = ''; $reshook = $hookmanager->executeHooks('createFrom', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { - $this->errors += $hookmanager->errors; - $this->error = $hookmanager->error; + $this->errors += $hookmanager->errors; + $this->error = $hookmanager->error; $error++; } } diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index f7e339c6c9a..a8ee29fc974 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -1314,7 +1314,7 @@ if (empty($reshook)) { $reshook = $hookmanager->executeHooks('createFrom', $parameters, $object, $action); // Note that $action and $object may have been if ($reshook < 0) { - setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); $error++; } } else { diff --git a/htdocs/supplier_proposal/card.php b/htdocs/supplier_proposal/card.php index 2f4dd6e0540..01f9ad5e2dd 100644 --- a/htdocs/supplier_proposal/card.php +++ b/htdocs/supplier_proposal/card.php @@ -407,7 +407,7 @@ if (empty($reshook)) { $reshook = $hookmanager->executeHooks('createFrom', $parameters, $object, $action); // Note that $action and $object may have been // modified by hook if ($reshook < 0) { - setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); $error++; } } else { diff --git a/htdocs/supplier_proposal/class/supplier_proposal.class.php b/htdocs/supplier_proposal/class/supplier_proposal.class.php index dc18f7dcb2b..088594f6ab4 100644 --- a/htdocs/supplier_proposal/class/supplier_proposal.class.php +++ b/htdocs/supplier_proposal/class/supplier_proposal.class.php @@ -1160,8 +1160,8 @@ class SupplierProposal extends CommonObject $action = ''; $reshook = $hookmanager->executeHooks('createFrom', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { - $this->errors += $hookmanager->errors; - $this->error = $hookmanager->error; + $this->errors += $hookmanager->errors; + $this->error = $hookmanager->error; $error++; } } From 98356222c18786336ef9c421a2ac7b39b776ae01 Mon Sep 17 00:00:00 2001 From: kkhelifa Date: Wed, 18 Jan 2023 10:36:52 +0100 Subject: [PATCH 0903/1128] NEW: Can add any contact on events if global MAIN_ACTIONCOM_CAN_ADD_ANY_CONTACT is set at 1 --- htdocs/comm/action/card.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/comm/action/card.php b/htdocs/comm/action/card.php index 91eb9f49516..e6205cd5317 100644 --- a/htdocs/comm/action/card.php +++ b/htdocs/comm/action/card.php @@ -1446,7 +1446,7 @@ if ($action == 'create') { } if ($origin=='contact') $preselectedids[GETPOST('originid', 'int')] = GETPOST('originid', 'int'); print img_picto('', 'contact', 'class="paddingrightonly"'); - print $form->selectcontacts(GETPOST('socid', 'int'), $preselectedids, 'socpeopleassigned[]', 1, '', '', 0, 'minwidth300 quatrevingtpercent', false, 0, array(), false, 'multiple', 'contactid'); + print $form->selectcontacts(empty($conf->global->MAIN_ACTIONCOM_CAN_ADD_ANY_CONTACT) ? GETPOST('socid', 'int') : 0, $preselectedids, 'socpeopleassigned[]', 1, '', '', 0, 'minwidth300 quatrevingtpercent', false, 0, array(), false, 'multiple', 'contactid'); print ''; } @@ -1949,7 +1949,7 @@ if ($id > 0) { // related contact print ''.$langs->trans("ActionOnContact").''; print '
'; - print img_picto('', 'contact', 'class="paddingrightonly"').$form->selectcontacts($object->socid, array_keys($object->socpeopleassigned), 'socpeopleassigned[]', 1, '', '', 1, 'quatrevingtpercent', false, 0, 0, array(), 'multiple', 'contactid'); + print img_picto('', 'contact', 'class="paddingrightonly"').$form->selectcontacts(empty($conf->global->MAIN_ACTIONCOM_CAN_ADD_ANY_CONTACT) ? $object->socid : 0, array_keys($object->socpeopleassigned), 'socpeopleassigned[]', 1, '', '', 1, 'quatrevingtpercent', false, 0, 0, array(), 'multiple', 'contactid'); print '
'; print ''; print ''; From cb963780312edca5445f075d516eecd6955856a7 Mon Sep 17 00:00:00 2001 From: Ferran Marcet Date: Wed, 18 Jan 2023 10:48:18 +0100 Subject: [PATCH 0904/1128] FIX: API access for deactivated users --- htdocs/api/class/api_access.class.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/htdocs/api/class/api_access.class.php b/htdocs/api/class/api_access.class.php index 5a4097b089b..09bb46ed98e 100644 --- a/htdocs/api/class/api_access.class.php +++ b/htdocs/api/class/api_access.class.php @@ -1,6 +1,7 @@ * Copyright (C) 2016 Laurent Destailleur + * Copyright (C) 2023 Ferran Marcet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -147,6 +148,9 @@ class DolibarrApiAccess implements iAuthenticate if ($result <= 0) { throw new RestException(503, 'Error when fetching user :'.$fuser->error.' (conf->entity='.$conf->entity.')'); } + if ($fuser->statut == 0) { + throw new RestException(503, 'Error when fetching user. This user has been locked or disabled'); + } $fuser->getrights(); From 1d50acb3cfdc083bc142d00d65c3f21808881143 Mon Sep 17 00:00:00 2001 From: GregM Date: Wed, 18 Jan 2023 12:10:58 +0100 Subject: [PATCH 0905/1128] Fix fieldvalue emailtemplate --- htdocs/core/class/html.formsetup.class.php | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/htdocs/core/class/html.formsetup.class.php b/htdocs/core/class/html.formsetup.class.php index 1cfddb588fd..0c9adf0be59 100644 --- a/htdocs/core/class/html.formsetup.class.php +++ b/htdocs/core/class/html.formsetup.class.php @@ -1069,16 +1069,18 @@ class FormSetupItem } elseif ($this->type == 'yesno') { $out.= ajax_constantonoff($this->confKey); } elseif (preg_match('/emailtemplate:/', $this->type)) { - include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php'; - $formmail = new FormMail($this->db); + if ($this->fieldValue > 0){ + include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php'; + $formmail = new FormMail($this->db); - $tmp = explode(':', $this->type); + $tmp = explode(':', $this->type); - $template = $formmail->getEMailTemplate($this->db, $tmp[1], $user, $this->langs, $this->fieldValue); - if ($template<0) { - $this->setErrors($formmail->errors); + $template = $formmail->getEMailTemplate($this->db, $tmp[1], $user, $this->langs, $this->fieldValue); + if ($template<0) { + $this->setErrors($formmail->errors); + } + $out.= $this->langs->trans($template->label); } - $out.= $this->langs->trans($template->label); } elseif (preg_match('/category:/', $this->type)) { require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; $c = new Categorie($this->db); From 289570ffe5ddc4e5010627500a4e7b3dc7f436f4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 18 Jan 2023 12:57:18 +0100 Subject: [PATCH 0906/1128] Debug --- htdocs/compta/facture/prelevement.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/facture/prelevement.php b/htdocs/compta/facture/prelevement.php index 195b04a2ed5..896aecb1b8c 100644 --- a/htdocs/compta/facture/prelevement.php +++ b/htdocs/compta/facture/prelevement.php @@ -742,8 +742,8 @@ if ($object->id > 0) { print ''; print ''; - if (!empty($conf->global->STRIPE_SEPA_DIRECT_DEBIT_SHOW_BUTTON)) { - // TODO Replace this with a checkbox for each payment mode: "Send request to PaymentModeManager immediatly..." + if (!empty($conf->global->STRIPE_SEPA_DIRECT_DEBIT_SHOW_OLD_BUTTON)) { // This is hidden, prefer to use mode enabled with STRIPE_SEPA_DIRECT_DEBIT + // TODO Replace this with a checkbox for each payment mode: "Send request to XXX immediatly..." print "
"; //add stripe sepa button $buttonlabel = $langs->trans("MakeWithdrawRequestStripe"); From 330f2307bd850b34edcc14db2961d7ae3b894a12 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 18 Jan 2023 12:59:48 +0100 Subject: [PATCH 0907/1128] Fix message --- htdocs/compta/facture/prelevement.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/compta/facture/prelevement.php b/htdocs/compta/facture/prelevement.php index 896aecb1b8c..365fa59fdcb 100644 --- a/htdocs/compta/facture/prelevement.php +++ b/htdocs/compta/facture/prelevement.php @@ -742,7 +742,7 @@ if ($object->id > 0) { print ''; print ''; - if (!empty($conf->global->STRIPE_SEPA_DIRECT_DEBIT_SHOW_OLD_BUTTON)) { // This is hidden, prefer to use mode enabled with STRIPE_SEPA_DIRECT_DEBIT + if (getDolGlobalString('STRIPE_SEPA_DIRECT_DEBIT_SHOW_OLD_BUTTON')) { // This is hidden, prefer to use mode enabled with STRIPE_SEPA_DIRECT_DEBIT // TODO Replace this with a checkbox for each payment mode: "Send request to XXX immediatly..." print "
"; //add stripe sepa button @@ -781,14 +781,14 @@ if ($object->id > 0) { if ($type == 'bank-transfer') { print '
'.$langs->trans("DoCreditTransferBeforePayments"); - if (isModEnabled('stripe')) { + if (isModEnabled('stripe') && getDolGlobalString('STRIPE_SEPA_DIRECT_DEBIT')) { print ' '.$langs->trans("DoStandingOrdersBeforePayments2"); } print ' '.$langs->trans("DoStandingOrdersBeforePayments3"); print '

'; } else { print '
'.$langs->trans("DoStandingOrdersBeforePayments"); - if (isModEnabled('stripe')) { + if (isModEnabled('stripe') && getDolGlobalString('STRIPE_SEPA_DIRECT_DEBIT')) { print ' '.$langs->trans("DoStandingOrdersBeforePayments2"); } print ' '.$langs->trans("DoStandingOrdersBeforePayments3"); From a384bdecdcca3e05f781dee7224da2ff611f9531 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 18 Jan 2023 14:36:46 +0100 Subject: [PATCH 0908/1128] Debug payment SEPA from backoffice with Stripe --- htdocs/compta/facture/prelevement.php | 18 +- htdocs/core/class/commoninvoice.class.php | 202 +++++++--------------- 2 files changed, 77 insertions(+), 143 deletions(-) diff --git a/htdocs/compta/facture/prelevement.php b/htdocs/compta/facture/prelevement.php index 365fa59fdcb..39e6446b573 100644 --- a/htdocs/compta/facture/prelevement.php +++ b/htdocs/compta/facture/prelevement.php @@ -807,13 +807,13 @@ if ($object->id > 0) { print ''.$langs->trans("User").''; print ''.$langs->trans("Amount").''; print ''.$langs->trans("DateProcess").''; - print ' '; if ($type == 'bank-transfer') { print ''.$langs->trans("BankTransferReceipt").''; } else { print ''.$langs->trans("WithdrawalReceipt").''; } print ' '; + print ' '; print ''; $sql = "SELECT pfd.rowid, pfd.traite, pfd.date_demande as date_demande,"; @@ -864,9 +864,10 @@ if ($object->id > 0) { // Amount print ''.price($obj->amount).''; - // Ref of SEPA request + // Date process print ''.$langs->trans("OrderWaiting").''; + // Link to make payment now print ''; if (!empty($conf->global->STRIPE_SEPA_DIRECT_DEBIT)) { $langs->load("stripe"); @@ -874,8 +875,10 @@ if ($object->id > 0) { } print ''; + // print '-'; + // Actions print ''; print ''; print img_delete(); @@ -929,14 +932,21 @@ if ($object->id > 0) { print ''; + // Date print ''.dol_print_date($db->jdate($obj->date_demande), 'day')."\n"; + // User print ''; print $tmpuser->getNomUrl(1, '', 0, 0, 0, 0, 'login'); print ''; + // Amount print ''.price($obj->amount).''; + // Date process + print ''.dol_print_date($db->jdate($obj->date_traite), 'day')."\n"; + + // Link to payment request done print ''; if ($obj->fk_prelevement_bons > 0) { $withdrawreceipt = new BonPrelevement($db); @@ -946,10 +956,10 @@ if ($object->id > 0) { } print "\n"; + // print ' '; - print ''.dol_print_date($db->jdate($obj->date_traite), 'day')."\n"; - + // Actions print ' '; print "\n"; diff --git a/htdocs/core/class/commoninvoice.class.php b/htdocs/core/class/commoninvoice.class.php index 3f53c3c4e94..7a8b5e3cbf7 100644 --- a/htdocs/core/class/commoninvoice.class.php +++ b/htdocs/core/class/commoninvoice.class.php @@ -865,7 +865,7 @@ abstract class CommonInvoice extends CommonObject /** - * Create a withdrawal request for a direct debit order or a credit transfer order. + * Create a withdrawal request at Stripe for a direct debit order or a credit transfer order. * Use the remain to pay excluding all existing open direct debit requests. * * @param User $fuser User asking the direct debit transfer @@ -900,6 +900,7 @@ abstract class CommonInvoice extends CommonObject $sql = "SELECT rowid, date_demande, amount, fk_facture, fk_facture_fourn"; $sql .= " FROM ".$this->db->prefix()."prelevement_demande"; + $sql .= " AND fk_facture = ".((int) $this->fk_facture); // Add a protection to not pay another invoice than current one $sql .= " WHERE rowid = ".((int) $did); dol_syslog(get_class($this)."::makeStripeSepaRequest 1", LOG_DEBUG); @@ -1035,9 +1036,9 @@ abstract class CommonInvoice extends CommonObject } - dol_syslog("makeStripeSepaRequest get stripe account", LOG_DEBUG); + dol_syslog("makeStripeSepaRequest get stripe connet account", LOG_DEBUG); $stripeacc = $stripe->getStripeAccount($service, $this->socid); // Get Stripe OAuth connect account if it exists (no network access here) - dol_syslog("makeStripeSepaRequest get stripe account return " . json_encode($stripeacc), LOG_DEBUG); + dol_syslog("makeStripeSepaRequest get stripe connect account return " . json_encode($stripeacc), LOG_DEBUG); if ($foundalternativestripeaccount) { if (empty($stripeacc)) { // If the Stripe connect account not set, we use common API usage @@ -1072,101 +1073,64 @@ abstract class CommonInvoice extends CommonObject } if (!$error) { // Payment was not canceled - //erics card or sepa ? $sepaMode = false; + $stripecard = null; if ($companypaymentmode->type == 'ban') { $sepaMode = true; $stripecard = $stripe->sepaStripe($customer, $companypaymentmode, $stripeacc, $servicestatus, 0); - } else { - $stripecard = $stripe->cardStripe($customer, $companypaymentmode, $stripeacc, $servicestatus, 0); } - if ($stripecard) { // Can be card_... (old mode) or pm_... (new mode) + if ($stripecard) { // Can be src_... (for sepa) - Other card_... (old mode) or pm_... (new mode) should not happen here. $FULLTAG = 'INV=' . $this->id . '-CUS=' . $thirdparty->id; - $description = 'Stripe payment from doTakePaymentStripeForThirdparty: ' . $FULLTAG . ' ref=' . $this->ref; + $description = 'Stripe payment from makeStripeSepaRequest: ' . $FULLTAG . ' ref=' . $this->ref; $stripefailurecode = ''; $stripefailuremessage = ''; $stripefailuredeclinecode = ''; - if (preg_match('/^card_/', $stripecard->id)) { // Using old method - dol_syslog("* Create charge on card " . $stripecard->id . ", amountstripe=" . $amountstripe . ", FULLTAG=" . $FULLTAG, LOG_DEBUG); + // Using new SCA method + dol_syslog("* Create payment on SEPA " . $stripecard->id . ", amounttopay=" . $amounttopay . ", amountstripe=" . $amountstripe . ", FULLTAG=" . $FULLTAG, LOG_DEBUG); - $ipaddress = getUserRemoteIP(); + // Create payment intent and charge payment (confirmnow = true) + $paymentintent = $stripe->getPaymentIntent($amounttopay, $currency, $FULLTAG, $description, $this, $customer->id, $stripeacc, $servicestatus, 0, 'automatic', true, $stripecard->id, 1); - $charge = null; // Force reset of $charge, so, if already set from a previous fetch, it will be empty even if there is an exception at next step - try { - $charge = \Stripe\Charge::create([ - 'amount' => price2num($amountstripe, 'MU'), - 'currency' => $currency, - 'capture' => true, // Charge immediatly - 'description' => $description, - 'metadata' => ["FULLTAG" => $FULLTAG, 'Recipient' => $mysoc->name, 'dol_version' => DOL_VERSION, 'dol_entity' => $conf->entity, 'ipaddress' => $ipaddress], - 'customer' => $customer->id, - //'customer' => 'bidon_to_force_error', // To use to force a stripe error - 'source' => $stripecard, - 'statement_descriptor' => dol_trunc('INV=' . $this->id, 10, 'right', 'UTF-8', 1), // 22 chars that appears on bank receipt (company + description) - ]); - } catch (\Stripe\Error\Card $e) { - // Since it's a decline, Stripe_CardError will be caught - $body = $e->getJsonBody(); - $err = $body['error']; + $charge = new stdClass(); + //erics add processing sepa is like success ? + if ($paymentintent->status === 'succeeded' || $paymentintent->status === 'processing') { + $charge->status = 'ok'; + $charge->id = $paymentintent->id; + $charge->customer = $customer->id; + } elseif ($paymentintent->status === 'requires_action') { + //paymentintent->status may be => 'requires_action' (no error in such a case) + dol_syslog(var_export($paymentintent, true), LOG_DEBUG); - $stripefailurecode = $err['code']; - $stripefailuremessage = $err['message']; - $stripefailuredeclinecode = $err['decline_code']; - } catch (Exception $e) { - $stripefailurecode = 'UnknownChargeError'; - $stripefailuremessage = $e->getMessage(); - } - } else { // Using new SCA method - if ($sepaMode) { - dol_syslog("* Create payment on SEPA " . $stripecard->id . ", amounttopay=" . $amounttopay . ", amountstripe=" . $amountstripe . ", FULLTAG=" . $FULLTAG, LOG_DEBUG); - } else { - dol_syslog("* Create payment on card " . $stripecard->id . ", amounttopay=" . $amounttopay . ", amountstripe=" . $amountstripe . ", FULLTAG=" . $FULLTAG, LOG_DEBUG); - } + $charge->status = 'failed'; + $charge->customer = $customer->id; + $charge->failure_code = $stripe->code; + $charge->failure_message = $stripe->error; + $charge->failure_declinecode = $stripe->declinecode; + $stripefailurecode = $stripe->code; + $stripefailuremessage = 'Action required. Contact the support at ';// . $conf->global->SELLYOURSAAS_MAIN_EMAIL; + $stripefailuredeclinecode = $stripe->declinecode; + } else { + dol_syslog(var_export($paymentintent, true), LOG_DEBUG); - // Create payment intent and charge payment (confirmnow = true) - $paymentintent = $stripe->getPaymentIntent($amounttopay, $currency, $FULLTAG, $description, $invoice, $customer->id, $stripeacc, $servicestatus, 0, 'automatic', true, $stripecard->id, 1); - - $charge = new stdClass(); - //erics add processing sepa is like success ? - if ($paymentintent->status === 'succeeded' || $paymentintent->status === 'processing') { - $charge->status = 'ok'; - $charge->id = $paymentintent->id; - $charge->customer = $customer->id; - } elseif ($paymentintent->status === 'requires_action') { - //paymentintent->status may be => 'requires_action' (no error in such a case) - dol_syslog(var_export($paymentintent, true), LOG_DEBUG); - - $charge->status = 'failed'; - $charge->customer = $customer->id; - $charge->failure_code = $stripe->code; - $charge->failure_message = $stripe->error; - $charge->failure_declinecode = $stripe->declinecode; - $stripefailurecode = $stripe->code; - $stripefailuremessage = 'Action required. Contact the support at ';// . $conf->global->SELLYOURSAAS_MAIN_EMAIL; - $stripefailuredeclinecode = $stripe->declinecode; - } else { - dol_syslog(var_export($paymentintent, true), LOG_DEBUG); - - $charge->status = 'failed'; - $charge->customer = $customer->id; - $charge->failure_code = $stripe->code; - $charge->failure_message = $stripe->error; - $charge->failure_declinecode = $stripe->declinecode; - $stripefailurecode = $stripe->code; - $stripefailuremessage = $stripe->error; - $stripefailuredeclinecode = $stripe->declinecode; - } - - //var_dump("stripefailurecode=".$stripefailurecode." stripefailuremessage=".$stripefailuremessage." stripefailuredeclinecode=".$stripefailuredeclinecode); - //exit; + $charge->status = 'failed'; + $charge->customer = $customer->id; + $charge->failure_code = $stripe->code; + $charge->failure_message = $stripe->error; + $charge->failure_declinecode = $stripe->declinecode; + $stripefailurecode = $stripe->code; + $stripefailuremessage = $stripe->error; + $stripefailuredeclinecode = $stripe->declinecode; } + //var_dump("stripefailurecode=".$stripefailurecode." stripefailuremessage=".$stripefailuremessage." stripefailuredeclinecode=".$stripefailuredeclinecode); + //exit; + // Return $charge = array('id'=>'ch_XXXX', 'status'=>'succeeded|pending|failed', 'failure_code'=>, 'failure_message'=>...) if (empty($charge) || $charge->status == 'failed') { - dol_syslog('Failed to charge card or payment mode ' . $stripecard->id . ' stripefailurecode=' . $stripefailurecode . ' stripefailuremessage=' . $stripefailuremessage . ' stripefailuredeclinecode=' . $stripefailuredeclinecode, LOG_WARNING); + dol_syslog('Failed to charge payment mode ' . $stripecard->id . ' stripefailurecode=' . $stripefailurecode . ' stripefailuremessage=' . $stripefailuremessage . ' stripefailuredeclinecode=' . $stripefailuredeclinecode, LOG_WARNING); // Save a stripe payment was in error $this->stripechargeerror++; @@ -1202,20 +1166,20 @@ abstract class CommonInvoice extends CommonObject $errmsg .= ($stripefailuredeclinecode ? ' - ' . $stripefailuredeclinecode : ''); } - $description = 'Stripe payment ERROR from doTakePaymentStripeForThirdparty: ' . $FULLTAG; + $description = 'Stripe payment ERROR from makeStripeSepaRequest: ' . $FULLTAG; $postactionmessages[] = $errmsg . ' (' . $stripearrayofkeys['publishable_key'] . ')'; $this->errors[] = $errmsg; } else { - dol_syslog('Successfuly charge card ' . $stripecard->id); + dol_syslog('Successfuly charge direct debit ' . $stripecard->id); - $postactionmessages[] = 'Success to charge card (' . $charge->id . ' with ' . $stripearrayofkeys['publishable_key'] . ')'; + $postactionmessages[] = 'Success to charge direct debit (' . $charge->id . ' with ' . $stripearrayofkeys['publishable_key'] . ')'; // Save a stripe payment was done in realy life so later we will be able to force a commit on recorded payments // even if in batch mode (method doTakePaymentStripe), we will always make all action in one transaction with a forced commit. $this->stripechargedone++; // Default description used for label of event. Will be overwrite by another value later. - $description = 'Stripe payment OK (' . $charge->id . ') from doTakePaymentStripeForThirdparty: ' . $FULLTAG; + $description = 'Stripe payment OK (' . $charge->id . ') from makeStripeSepaRequest: ' . $FULLTAG; $db = $this->db; @@ -1300,13 +1264,8 @@ abstract class CommonInvoice extends CommonObject if (!$errorforinvoice && isModEnabled('banque')) { dol_syslog('* Add payment to bank'); + // The bank used is the one defined into Stripe setup $bankaccountid = 0; - if ($paymentmethod == 'paybox') { - $bankaccountid = $conf->global->PAYBOX_BANK_ACCOUNT_FOR_PAYMENTS; - } - if ($paymentmethod == 'paypal') { - $bankaccountid = $conf->global->PAYPAL_BANK_ACCOUNT_FOR_PAYMENTS; - } if ($paymentmethod == 'stripe') { $bankaccountid = $conf->global->STRIPE_BANK_ACCOUNT_FOR_PAYMENTS; } @@ -1323,7 +1282,7 @@ abstract class CommonInvoice extends CommonObject $error++; $errorforinvoice++; } else { - $postactionmessages[] = 'Bank transaction of payment created (by doTakePaymentStripeForThirdparty)'; + $postactionmessages[] = 'Bank transaction of payment created (by makeStripeSepaRequest)'; } } else { $postactionmessages[] = 'Setup of bank account to use in module ' . $paymentmethod . ' was not set. No way to record the payment.'; @@ -1334,55 +1293,24 @@ abstract class CommonInvoice extends CommonObject } if ($ispostactionok < 1) { - $description = 'Stripe payment OK (' . $charge->id . ' - ' . $amounttopay . ' ' . $conf->currency . ') but post action KO from doTakePaymentStripeForThirdparty: ' . $FULLTAG; + $description = 'Stripe payment OK (' . $charge->id . ' - ' . $amounttopay . ' ' . $conf->currency . ') but post action KO from makeStripeSepaRequest: ' . $FULLTAG; } else { - $description = 'Stripe payment+post action OK (' . $charge->id . ' - ' . $amounttopay . ' ' . $conf->currency . ') from doTakePaymentStripeForThirdparty: ' . $FULLTAG; + $description = 'Stripe payment+post action OK (' . $charge->id . ' - ' . $amounttopay . ' ' . $conf->currency . ') from makeStripeSepaRequest: ' . $FULLTAG; } } $object = $invoice; - // Send emails - $labeltouse = 'InvoicePaymentSuccess'; - $sendemailtocustomer = 1; - - if (empty($charge) || $charge->status == 'failed') { - $labeltouse = 'InvoicePaymentFailure'; - if ($noemailtocustomeriferror) { - $sendemailtocustomer = 0; - } // $noemailtocustomeriferror is set when error already reported on myaccount screen - } - - // Track an event - if (empty($charge) || $charge->status == 'failed') { - $actioncode = 'PAYMENT_STRIPE_KO'; - $extraparams = $stripefailurecode; - $extraparams .= (($extraparams && $stripefailuremessage) ? ' - ' : '') . $stripefailuremessage; - $extraparams .= (($extraparams && $stripefailuredeclinecode) ? ' - ' : '') . $stripefailuredeclinecode; - } else { - $actioncode = 'PAYMENT_STRIPE_OK'; - $extraparams = ''; - } + $actioncode = ''; + $extraparams = ''; } else { $error++; $errorforinvoice++; - dol_syslog("No card or payment method found for this stripe customer " . $customer->id, LOG_WARNING); - $this->errors[] = 'Failed to get card | payment method for stripe customer = ' . $customer->id; - - $labeltouse = 'InvoicePaymentFailure'; - $sendemailtocustomer = 1; - if ($noemailtocustomeriferror) { - $sendemailtocustomer = 0; - } // $noemailtocustomeriferror is set when error already reported on myaccount screen - - $description = 'Failed to find or use the payment mode - no credit card defined for the customer account'; - $stripefailurecode = 'BADPAYMENTMODE'; - $stripefailuremessage = 'Failed to find or use the payment mode - no credit card defined for the customer account'; - $postactionmessages[] = $description . ' (' . $stripearrayofkeys['publishable_key'] . ')'; - + dol_syslog("No direct debit payment method found for this stripe customer " . $customer->id, LOG_WARNING); + $this->errors[] = 'Failed to get direct debit payment method for stripe customer = ' . $customer->id; $object = $invoice; - $actioncode = 'PAYMENT_STRIPE_KO'; + $actioncode = ''; $extraparams = ''; } } else { @@ -1427,6 +1355,7 @@ abstract class CommonInvoice extends CommonObject $extraparams = ''; } + /* // Send email + create action after if ($sendemailtocustomer && $labeltouse) { dol_syslog("* Send email with result of payment - " . $labeltouse); @@ -1537,6 +1466,7 @@ abstract class CommonInvoice extends CommonObject } } } + */ if ($description) { dol_syslog("* Record event for payment result - " . $description); @@ -1588,18 +1518,12 @@ abstract class CommonInvoice extends CommonObject $this->errors[] = "Remain to pay is null for the invoice " . $this->id . " " . $this->ref . ". Why is the invoice not classified 'Paid' ?"; } - $sql = "INSERT INTO ".MAIN_DB_PREFIX."prelevement_demande("; - $sql .= "fk_facture, "; - $sql .= " amount, date_demande, fk_user_demande, ext_payment_id, ext_payment_site, sourcetype, entity)"; - $sql .= " VALUES (".$this->id; - $sql .= ",".((float) price2num($amount)); - $sql .= ",'".$this->db->idate($now)."'"; - $sql .= ",".((int) $fuser->id); - $sql .= ",'".$this->db->escape($stripe_id)."'"; - $sql .= ",'".$this->db->escape($stripe_uri)."'"; - $sql .= ",'".$this->db->escape($sourcetype)."'"; - $sql .= ",".$conf->entity; - $sql .= ")"; + // TODO Create a prelevement_bon ? + // For the moment no + + // We must update the direct debit payment request as "done" + $sql = "UPDATE".MAIN_DB_PREFIX."prelevement_demande SET traite = 1, date_traite = '".$this->db->idate(dol_now())."'"; + $sql .= "WHERE rowid = ".((int) $did); dol_syslog(get_class($this)."::makeStripeSepaRequest", LOG_DEBUG); $resql = $this->db->query($sql); From 1fe589ac3e2d67effa6b8722fe47a8e17309b58b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 18 Jan 2023 14:43:09 +0100 Subject: [PATCH 0909/1128] Fix debug payment using SEPA Stripe --- htdocs/core/class/commoninvoice.class.php | 45 +++++++++++++++++++---- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/htdocs/core/class/commoninvoice.class.php b/htdocs/core/class/commoninvoice.class.php index 7a8b5e3cbf7..93d125291ef 100644 --- a/htdocs/core/class/commoninvoice.class.php +++ b/htdocs/core/class/commoninvoice.class.php @@ -1299,18 +1299,49 @@ abstract class CommonInvoice extends CommonObject } } - $object = $invoice; + $object = $this; - $actioncode = ''; - $extraparams = ''; + // Send emails + $labeltouse = 'InvoicePaymentSuccess'; + $sendemailtocustomer = 1; + + if (empty($charge) || $charge->status == 'failed') { + $labeltouse = 'InvoicePaymentFailure'; + if ($noemailtocustomeriferror) { + $sendemailtocustomer = 0; + } // $noemailtocustomeriferror is set when error already reported on myaccount screen + } + + // Track an event + if (empty($charge) || $charge->status == 'failed') { + $actioncode = 'PAYMENT_STRIPE_KO'; + $extraparams = $stripefailurecode; + $extraparams .= (($extraparams && $stripefailuremessage) ? ' - ' : '') . $stripefailuremessage; + $extraparams .= (($extraparams && $stripefailuredeclinecode) ? ' - ' : '') . $stripefailuredeclinecode; + } else { + $actioncode = 'PAYMENT_STRIPE_OK'; + $extraparams = ''; + } } else { $error++; $errorforinvoice++; dol_syslog("No direct debit payment method found for this stripe customer " . $customer->id, LOG_WARNING); $this->errors[] = 'Failed to get direct debit payment method for stripe customer = ' . $customer->id; - $object = $invoice; - $actioncode = ''; + $labeltouse = 'InvoicePaymentFailure'; + $sendemailtocustomer = 1; + if ($noemailtocustomeriferror) { + $sendemailtocustomer = 0; + } // $noemailtocustomeriferror is set when error already reported on myaccount screen + + $description = 'Failed to find or use the payment mode - no credit card defined for the customer account'; + $stripefailurecode = 'BADPAYMENTMODE'; + $stripefailuremessage = 'Failed to find or use the payment mode - no credit card defined for the customer account'; + $postactionmessages[] = $description . ' (' . $stripearrayofkeys['publishable_key'] . ')'; + + $object = $this; + + $actioncode = 'PAYMENT_STRIPE_KO'; $extraparams = ''; } } else { @@ -1322,7 +1353,7 @@ abstract class CommonInvoice extends CommonObject $stripefailurecode = ''; $stripefailuremessage = ''; - $object = $invoice; + $object = $this; $actioncode = ''; $extraparams = ''; @@ -1349,7 +1380,7 @@ abstract class CommonInvoice extends CommonObject $stripefailuremessage = 'Failed to find or use your payment mode (no payment mode for this customer id)'; $postactionmessages = []; - $object = $invoice; + $object = $this; $actioncode = 'PAYMENT_STRIPE_KO'; $extraparams = ''; From 6d8f80d46e778dc65b5edbad47d0e3ae69a95b18 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Wed, 18 Jan 2023 16:10:21 +0100 Subject: [PATCH 0910/1128] fix: module builder, backport workgin solution form 15.0 --- htdocs/modulebuilder/index.php | 50 ++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index 25034194119..fcfea65dd83 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -1295,33 +1295,35 @@ if ($dirins && $action == 'addproperty' && empty($cancel) && !empty($module) && $error++; setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Type")), null, 'errors'); } - } - if (!$error) { - $addfieldentry = array( - 'name'=>GETPOST('propname', 'aZ09'), - 'label'=>GETPOST('proplabel', 'alpha'), - 'type'=>GETPOST('proptype', 'alpha'), - 'arrayofkeyval'=>GETPOST('proparrayofkeyval', 'restricthtml'), // Example json string '{"0":"Draft","1":"Active","-1":"Cancel"}' - 'visible'=>GETPOST('propvisible', 'int'), - 'enabled'=>GETPOST('propenabled', 'int'), - 'position'=>GETPOST('propposition', 'int'), - 'notnull'=>GETPOST('propnotnull', 'int'), - 'index'=>GETPOST('propindex', 'int'), - 'searchall'=>GETPOST('propsearchall', 'int'), - 'isameasure'=>GETPOST('propisameasure', 'int'), - 'comment'=>GETPOST('propcomment', 'alpha'), - 'help'=>GETPOST('prophelp', 'alpha'), - 'css'=>GETPOST('propcss', 'aZ09'), - 'cssview'=>GETPOST('propcssview', 'aZ09'), - 'csslist'=>GETPOST('propcsslist', 'aZ09'), - 'default'=>GETPOST('propdefault', 'restricthtml'), - 'noteditable'=>intval(GETPOST('propnoteditable', 'int')), - ); + if (!$error && !GETPOST('regenerateclasssql')&& !GETPOST('regeneratemissing')) { + $addfieldentry = array( + 'name'=>GETPOST('propname', 'aZ09'), + 'label'=>GETPOST('proplabel', 'alpha'), + 'type'=>GETPOST('proptype', 'alpha'), + 'arrayofkeyval'=>GETPOST('proparrayofkeyval', 'restricthtml'), // Example json string '{"0":"Draft","1":"Active","-1":"Cancel"}' + 'visible'=>GETPOST('propvisible', 'int'), + 'enabled'=>GETPOST('propenabled', 'int'), + 'position'=>GETPOST('propposition', 'int'), + 'notnull'=>GETPOST('propnotnull', 'int'), + 'index'=>GETPOST('propindex', 'int'), + 'searchall'=>GETPOST('propsearchall', 'int'), + 'isameasure'=>GETPOST('propisameasure', 'int'), + 'comment'=>GETPOST('propcomment', 'alpha'), + 'help'=>GETPOST('prophelp', 'alpha'), + 'css'=>GETPOST('propcss', 'aZ09'), + 'cssview'=>GETPOST('propcssview', 'aZ09'), + 'csslist'=>GETPOST('propcsslist', 'aZ09'), + 'default'=>GETPOST('propdefault', 'restricthtml'), + 'noteditable'=>intval(GETPOST('propnoteditable', 'int')), + ); - if (!empty($addfieldentry['arrayofkeyval']) && !is_array($addfieldentry['arrayofkeyval'])) { - $addfieldentry['arrayofkeyval'] = json_decode($addfieldentry['arrayofkeyval'], true); + if (!empty($addfieldentry['arrayofkeyval']) && !is_array($addfieldentry['arrayofkeyval'])) { + $addfieldentry['arrayofkeyval'] = json_decode($addfieldentry['arrayofkeyval'], true); + } } + } else { + $addfieldentry = array(); } /*if (GETPOST('regeneratemissing')) From a00fa5a192dd339c8ca49e7f489ce4ecb31a5feb Mon Sep 17 00:00:00 2001 From: Ferran Marcet Date: Wed, 18 Jan 2023 16:11:22 +0100 Subject: [PATCH 0911/1128] FIX: Do not convert negative line to discount if variable is active --- htdocs/commande/list.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index eb8b824ef3e..2211422f3c5 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -9,7 +9,7 @@ * Copyright (C) 2015-2018 Frédéric France * Copyright (C) 2015 Marcos García * Copyright (C) 2015 Jean-François Ferry - * Copyright (C) 2016-2021 Ferran Marcet + * Copyright (C) 2016-2023 Ferran Marcet * Copyright (C) 2018 Charlene Benke * Copyright (C) 2021 Anthony Berton * @@ -403,7 +403,7 @@ if (empty($reshook)) { $desc = dol_concatdesc($desc, $langs->trans("Order").' '.$cmd->ref.' - '.dol_print_date($cmd->date, 'day')); } - if ($lines[$i]->subprice < 0) { + if ($lines[$i]->subprice < 0 && empty($conf->global->INVOICE_KEEP_DISCOUNT_LINES_AS_IN_ORIGIN)) { // Negative line, we create a discount line $discount = new DiscountAbsolute($db); $discount->fk_soc = $objecttmp->socid; From a3d4eb404df858202eeacf5f872d6fc3d7b1cd3d Mon Sep 17 00:00:00 2001 From: GregM Date: Wed, 18 Jan 2023 17:36:05 +0100 Subject: [PATCH 0912/1128] Fix contact firstname lastname extrafields --- htdocs/core/class/extrafields.class.php | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php index 1d5bd8dc7ef..6644548d87c 100644 --- a/htdocs/core/class/extrafields.class.php +++ b/htdocs/core/class/extrafields.class.php @@ -1457,15 +1457,15 @@ class ExtraFields $labeltoshow = dol_trunc($labeltoshow, 45); if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) { + $labeltoshow = ''; foreach ($fields_label as $field_toshow) { $translabel = $langs->trans($obj->$field_toshow); if ($translabel != $obj->$field_toshow) { - $labeltoshow = dol_trunc($translabel, 18).' '; + $labeltoshow .= ' '.dol_trunc($translabel, 18).' '; } else { - $labeltoshow = dol_trunc($obj->$field_toshow, 18).' '; + $labeltoshow .= ' '.dol_trunc($obj->$field_toshow, 18).' '; } } - $data[$obj->rowid] = $labeltoshow; } else { if (!$notrans) { @@ -1774,17 +1774,20 @@ class ExtraFields $fields_label = explode('|', $InfoFieldList[1]); if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) { if (is_array($fields_label) && count($fields_label) > 1) { + $label = '
  • '; foreach ($fields_label as $field_toshow) { $translabel = ''; if (!empty($obj->$field_toshow)) { $translabel = $langs->trans($obj->$field_toshow); } if ($translabel != $field_toshow) { - $toprint[] = '
  • '.dol_trunc($translabel, 18).'
  • '; + $label .= ' '.dol_trunc($translabel, 18); } else { - $toprint[] = '
  • '.$obj->$field_toshow.'
  • '; + $label .= ' '.$obj->$field_toshow; } } + $label .= ''; + $toprint[] = $label; } else { $translabel = ''; if (!empty($obj->{$InfoFieldList[1]})) { From 4637f8a65e900a61e3f64bcc796e7ad882a004cf Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 18 Jan 2023 19:11:15 +0100 Subject: [PATCH 0913/1128] Fix security --- SECURITY.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index b121b606180..e095b64fdff 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -53,16 +53,17 @@ ONLY vulnerabilities discovered, when the following setup on test platform is us * $dolibarr_nocsrfcheck must be kept to the value 0 into conf.php (this is the default value) * $dolibarr_main_force_https must be set to something else than 0. * The constant MAIN_SECURITY_CSRF_WITH_TOKEN must be set to 3 into backoffice menu Home - Setup - Other (this protection should be set to 3 soon by default) -* The module DebugBar and ModuleBuilder must NOT be enabled (by default, these modules are not enabled. They are developer tools) * ONLY security reports on modules provided by default and with the "stable" status are valid (troubles into "experimental", "developement" or external modules are not valid vulnerabilities). * The root of web server must link to htdocs and the documents directory must be outside of the web server root (this is the default when using the default installer but may differs with external installer). * The web server setup must be done so that only the documents directory is in write mode. The root directory called htdocs must be read-only. * CSRF attacks are accepted but double check that you have set MAIN_SECURITY_CSRF_WITH_TOKEN to value 3. +* The module DebugBar and ModuleBuilder must NOT be enabled (by default, these modules are not enabled. They are developer tools) * Ability for a high level user to edit web site pages into the CMS by including HTML or Javascript is an expected feature. Vulnerabilities into the website module are validated only if HTML or Javascript injection can be done by a non allowed user. +* Fail2ban rules for rate limit on the login page,password forgotten page and all public pages (/public/*) must be installed as recommendend into the section "About - Admin tools - Section Access limits and mitigation". Scope is the web application (back office) and the APIs. -## Qualifying vulnerabilities for reporting +## Example of vulnerabilities Qualified for reporting. * Remote code execution (RCE) * Local files access and manipulation (LFI, RFI, XXE, SSRF, XSPA) @@ -78,7 +79,7 @@ Scope is the web application (back office) and the APIs. * Software version disclosure (for non admin users only) * Stack traces or path disclosure (for non admin users only) -## Non-qualifying vulnerabilities for reporting +## Example of vulnerabilities non Non-qualified for reporting. * "Self" XSS * SSL/TLS best practices @@ -95,3 +96,4 @@ Scope is the web application (back office) and the APIs. * Software version or private IP disclosure when logged user is admin * Stack traces or path disclosure when logged user is admin * Any vulnerabilities due to a configuration different than the one defined into chapter "Scope for qualified vulnerabilities". +* Brute force attacks on login page, password forgotten page or any public pages (/public/*) are not qualified if the fail2ban recommended fail2ban rules were not installed. From 40e007bb6195735ebc4410d413916594247fd3cd Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 18 Jan 2023 19:54:38 +0100 Subject: [PATCH 0914/1128] More generic error message --- htdocs/api/class/api_access.class.php | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/htdocs/api/class/api_access.class.php b/htdocs/api/class/api_access.class.php index f885677225e..37b7b079716 100644 --- a/htdocs/api/class/api_access.class.php +++ b/htdocs/api/class/api_access.class.php @@ -142,12 +142,28 @@ class DolibarrApiAccess implements iAuthenticate if (!$login) { throw new RestException(503, 'Error when searching login user from api key'); } + + $genericmessageerroruser = 'Error user not valid (not found or bad status or bad validity dates) (conf->entity='.$conf->entity.')'; + $fuser = new User($this->db); $result = $fuser->fetch('', $login, '', 0, (empty($userentity) ? -1 : $conf->entity)); // If user is not entity 0, we search in working entity $conf->entity (that may have been forced to a different value than user entity) if ($result <= 0) { - throw new RestException(503, 'Error when fetching user :'.$fuser->error.' (conf->entity='.$conf->entity.')'); + throw new RestException(503, $genericmessageerroruser); } + $now = dol_now(); + + // Check date start validity + if ($fuser->datestartvalidity && $this->db->jdate($fuser->datestartvalidity) > $now) { + throw new RestException(503, $genericmessageerroruser); + } + // Check date end validity + if ($fuser->dateendvalidity && $this->db->jdate($fuser->dateendvalidity) < dol_get_first_hour($now)) { + throw new RestException(503, $genericmessageerroruser); + } + + + // User seems valid $fuser->getrights(); // Set the property $user to the $user of API From aa273d215572d896ba26f1dae8489edd1238e4c2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 18 Jan 2023 20:11:12 +0100 Subject: [PATCH 0915/1128] Update index.php --- htdocs/modulebuilder/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index fcfea65dd83..052b1189b3d 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -1296,7 +1296,7 @@ if ($dirins && $action == 'addproperty' && empty($cancel) && !empty($module) && setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Type")), null, 'errors'); } - if (!$error && !GETPOST('regenerateclasssql')&& !GETPOST('regeneratemissing')) { + if (!$error && !GETPOST('regenerateclasssql') && !GETPOST('regeneratemissing')) { $addfieldentry = array( 'name'=>GETPOST('propname', 'aZ09'), 'label'=>GETPOST('proplabel', 'alpha'), From c31aee2e27f004486945586a9d65c899d19dd689 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 18 Jan 2023 20:42:29 +0100 Subject: [PATCH 0916/1128] Doc --- htdocs/core/class/html.formticket.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/html.formticket.class.php b/htdocs/core/class/html.formticket.class.php index be515a2abf3..5692a285dda 100644 --- a/htdocs/core/class/html.formticket.class.php +++ b/htdocs/core/class/html.formticket.class.php @@ -49,12 +49,12 @@ class FormTicket public $db; /** - * @var string The track_id of the ticket. Used also for the $keytoavoidconflict to name session vars to upload files. + * @var string A hash value of the ticket. Duplicate of ref but for public purposes. */ public $track_id; /** - * @var string trackid + * @var string Email $trackid. Used also for the $keytoavoidconflict to name session vars to upload files. */ public $trackid; From ea6964ccd059de8382ccec91d4f2ad2f3cc506ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20France?= Date: Wed, 18 Jan 2023 22:03:38 +0100 Subject: [PATCH 0917/1128] fix undeclared properties for php 8.2 --- htdocs/adherents/class/adherent.class.php | 15 ++++++++++++++- htdocs/adherents/class/adherent_type.class.php | 13 +++++++++++++ htdocs/core/class/commonobject.class.php | 9 +++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php index 225261e8f9f..99e84d61026 100644 --- a/htdocs/adherents/class/adherent.class.php +++ b/htdocs/adherents/class/adherent.class.php @@ -7,7 +7,7 @@ * Copyright (C) 2009-2017 Regis Houssin * Copyright (C) 2014-2018 Alexandre Spangaro * Copyright (C) 2015 Marcos García - * Copyright (C) 2015-2022 Frédéric France + * Copyright (C) 2015-2023 Frédéric France * Copyright (C) 2015 Raphaël Doursenaud * Copyright (C) 2016 Juanjo Menent * Copyright (C) 2018-2019 Thibault FOUCART @@ -89,6 +89,11 @@ class Adherent extends CommonObject */ public $pass_indatabase_crypted; + /** + * @var string fullname + */ + public $fullname; + /** * @var string company name * @deprecated @@ -292,6 +297,10 @@ class Adherent extends CommonObject public $first_subscription_date; + public $first_subscription_date_start; + + public $first_subscription_date_end; + public $first_subscription_amount; public $last_subscription_date; @@ -304,6 +313,10 @@ class Adherent extends CommonObject public $subscriptions = array(); + /** + * @var string ip + */ + public $ip; // Fields loaded by fetchPartnerships() from partnership table diff --git a/htdocs/adherents/class/adherent_type.class.php b/htdocs/adherents/class/adherent_type.class.php index 0a4663f8149..915502a9e96 100644 --- a/htdocs/adherents/class/adherent_type.class.php +++ b/htdocs/adherents/class/adherent_type.class.php @@ -129,6 +129,19 @@ class AdherentType extends CommonObject /** @var string string other */ public $other = array(); + /** + * @var string description + */ + public $description; + + /** + * @var string email + */ + public $email; + + /** + * @var array multilangs + */ public $multilangs = array(); diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index ecf03696d7a..9f28f6c0d70 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -593,6 +593,15 @@ abstract class CommonObject protected $labelStatus; protected $labelStatusShort; + /** + * @var array nb used in load_stateboard + */ + public $nb = array(); + + /** + * @var string output + */ + public $output; /** * @var array List of child tables. To test if we can delete object. From cccba873a8f5eaf49e45ffa61eb43cb3635c6ecb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20France?= Date: Wed, 18 Jan 2023 22:20:25 +0100 Subject: [PATCH 0918/1128] fix undeclared properties for php 8.2 --- htdocs/adherents/class/adherent.class.php | 7 +++++++ htdocs/contact/class/contact.class.php | 15 +++++++++++++++ htdocs/user/class/user.class.php | 5 +++++ 3 files changed, 27 insertions(+) diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php index 99e84d61026..2d8433de0c4 100644 --- a/htdocs/adherents/class/adherent.class.php +++ b/htdocs/adherents/class/adherent.class.php @@ -94,6 +94,13 @@ class Adherent extends CommonObject */ public $fullname; + /** + * @var string The civility code, not an integer + */ + public $civility_id; + public $civility_code; + public $civility; + /** * @var string company name * @deprecated diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php index 67b3ce2a38a..8c3991cabaf 100644 --- a/htdocs/contact/class/contact.class.php +++ b/htdocs/contact/class/contact.class.php @@ -130,6 +130,16 @@ class Contact extends CommonObject public $civility_code; public $civility; + /** + * @var int egroupware_id + */ + public $egroupware_id; + + /** + * @var int birthday_alert + */ + public $birthday_alert; + /** * @var string The civilite code, not an integer * @deprecated @@ -137,6 +147,11 @@ class Contact extends CommonObject */ public $civilite; + /** + * @var string fullname + */ + public $fullname; + /** * @var string Address */ diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 22556d3e1c2..3dc74832503 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -76,6 +76,11 @@ class User extends CommonObject public $employee; public $civility_code; + /** + * @var string fullname + */ + public $fullname; + /** * @var string gender */ From 0f475783deb28af48e98141c9733f31c471a6114 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 18 Jan 2023 22:27:52 +0100 Subject: [PATCH 0919/1128] Enhance method getKanbanView --- htdocs/adherents/class/adherent.class.php | 3 +- .../adherents/class/adherent_type.class.php | 5 +-- htdocs/adherents/class/subscription.class.php | 3 +- htdocs/bom/class/bom.class.php | 5 +-- htdocs/comm/propal/class/propal.class.php | 5 +-- htdocs/compta/bank/class/account.class.php | 5 +-- .../bank/class/paymentvarious.class.php | 5 +-- .../cashcontrol/class/cashcontrol.class.php | 5 +-- htdocs/compta/facture/class/facture.class.php | 5 +-- .../compta/localtax/class/localtax.class.php | 5 +-- .../cheque/class/remisecheque.class.php | 5 +-- .../class/bonprelevement.class.php | 5 +-- .../sociales/class/chargesociales.class.php | 5 +-- htdocs/compta/tva/class/tva.class.php | 5 +-- htdocs/contact/class/contact.class.php | 3 +- htdocs/contrat/class/contrat.class.php | 5 +-- htdocs/core/class/commonobject.class.php | 28 ---------------- htdocs/core/class/commonobjectline.class.php | 33 ------------------- htdocs/core/class/commonorder.class.php | 3 +- htdocs/don/class/don.class.php | 5 +-- .../class/expensereport.class.php | 5 +-- .../class/paymentexpensereport.class.php | 5 +-- htdocs/fichinter/class/fichinter.class.php | 5 +-- .../class/fournisseur.commande.class.php | 5 +-- .../fourn/class/fournisseur.facture.class.php | 5 +-- htdocs/holiday/class/holiday.class.php | 14 ++++---- htdocs/holiday/list.php | 13 ++++++-- htdocs/hrm/class/evaluation.class.php | 5 +-- htdocs/hrm/class/job.class.php | 5 +-- htdocs/hrm/class/skill.class.php | 5 +-- .../class/knowledgerecord.class.php | 5 +-- .../template/class/myobject.class.php | 5 ++- htdocs/mrp/class/mo.class.php | 5 +-- htdocs/product/stock/class/entrepot.class.php | 3 +- htdocs/projet/class/task.class.php | 5 +-- .../class/recruitmentcandidature.class.php | 5 +-- .../class/recruitmentjobposition.class.php | 5 +-- htdocs/salaries/class/paymentsalary.class.php | 5 +-- htdocs/salaries/class/salary.class.php | 5 +-- .../class/supplier_proposal.class.php | 5 +-- htdocs/ticket/class/ticket.class.php | 5 +-- htdocs/user/class/user.class.php | 3 +- htdocs/user/class/usergroup.class.php | 3 +- 43 files changed, 125 insertions(+), 144 deletions(-) diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php index 225261e8f9f..fb72636ef1a 100644 --- a/htdocs/adherents/class/adherent.class.php +++ b/htdocs/adherents/class/adherent.class.php @@ -3208,9 +3208,10 @@ class Adherent extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @param array $arraydata Array of data * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { $return = '
    '; diff --git a/htdocs/adherents/class/adherent_type.class.php b/htdocs/adherents/class/adherent_type.class.php index 0a4663f8149..ea60e9c1fcd 100644 --- a/htdocs/adherents/class/adherent_type.class.php +++ b/htdocs/adherents/class/adherent_type.class.php @@ -933,9 +933,10 @@ class AdherentType extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs,$user; $return = '
    '; diff --git a/htdocs/adherents/class/subscription.class.php b/htdocs/adherents/class/subscription.class.php index 12e19fd9c3a..b5079676603 100644 --- a/htdocs/adherents/class/subscription.class.php +++ b/htdocs/adherents/class/subscription.class.php @@ -510,9 +510,10 @@ class Subscription extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @param array $arraydata Array of data * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { $return = '
    '; $return .= '
    '; diff --git a/htdocs/bom/class/bom.class.php b/htdocs/bom/class/bom.class.php index 1e28aafffe2..d7982a44069 100644 --- a/htdocs/bom/class/bom.class.php +++ b/htdocs/bom/class/bom.class.php @@ -1523,9 +1523,10 @@ class BOM extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $db,$langs; $prod = new Product($db); diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index 1541478a321..c4328328f18 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -3921,9 +3921,10 @@ class Propal extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs; $return = '
    '; diff --git a/htdocs/compta/bank/class/account.class.php b/htdocs/compta/bank/class/account.class.php index fe0a267dc83..e144677832f 100644 --- a/htdocs/compta/bank/class/account.class.php +++ b/htdocs/compta/bank/class/account.class.php @@ -1751,9 +1751,10 @@ class Account extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs; $return = '
    '; diff --git a/htdocs/compta/bank/class/paymentvarious.class.php b/htdocs/compta/bank/class/paymentvarious.class.php index 857b49d1576..d5888e0e7a1 100644 --- a/htdocs/compta/bank/class/paymentvarious.class.php +++ b/htdocs/compta/bank/class/paymentvarious.class.php @@ -773,9 +773,10 @@ class PaymentVarious extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs; $return = '
    '; diff --git a/htdocs/compta/cashcontrol/class/cashcontrol.class.php b/htdocs/compta/cashcontrol/class/cashcontrol.class.php index 01bebc35f5d..8cc3c93b59c 100644 --- a/htdocs/compta/cashcontrol/class/cashcontrol.class.php +++ b/htdocs/compta/cashcontrol/class/cashcontrol.class.php @@ -474,9 +474,10 @@ class CashControl extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs; $return = '
    '; diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 431c3b0a2a3..561ebf3e9ed 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -5758,9 +5758,10 @@ class Facture extends CommonInvoice * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { $return = '
    '; $return .= '
    '; diff --git a/htdocs/compta/localtax/class/localtax.class.php b/htdocs/compta/localtax/class/localtax.class.php index d2300128550..a6db785b779 100644 --- a/htdocs/compta/localtax/class/localtax.class.php +++ b/htdocs/compta/localtax/class/localtax.class.php @@ -634,9 +634,10 @@ class Localtax extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs; $return = '
    '; diff --git a/htdocs/compta/paiement/cheque/class/remisecheque.class.php b/htdocs/compta/paiement/cheque/class/remisecheque.class.php index 1e4e7d05a7d..6666f0fe1c4 100644 --- a/htdocs/compta/paiement/cheque/class/remisecheque.class.php +++ b/htdocs/compta/paiement/cheque/class/remisecheque.class.php @@ -1025,9 +1025,10 @@ class RemiseCheque extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs; diff --git a/htdocs/compta/prelevement/class/bonprelevement.class.php b/htdocs/compta/prelevement/class/bonprelevement.class.php index 24db7fb5b64..b9d1fd7c54a 100644 --- a/htdocs/compta/prelevement/class/bonprelevement.class.php +++ b/htdocs/compta/prelevement/class/bonprelevement.class.php @@ -2412,9 +2412,10 @@ class BonPrelevement extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs; diff --git a/htdocs/compta/sociales/class/chargesociales.class.php b/htdocs/compta/sociales/class/chargesociales.class.php index b5e98b3b62e..cacc2280f53 100644 --- a/htdocs/compta/sociales/class/chargesociales.class.php +++ b/htdocs/compta/sociales/class/chargesociales.class.php @@ -754,9 +754,10 @@ class ChargeSociales extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs; $return = '
    '; diff --git a/htdocs/compta/tva/class/tva.class.php b/htdocs/compta/tva/class/tva.class.php index 78fb178ff27..2ec1199dd29 100644 --- a/htdocs/compta/tva/class/tva.class.php +++ b/htdocs/compta/tva/class/tva.class.php @@ -911,9 +911,10 @@ class Tva extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs; $return = '
    '; diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php index 67b3ce2a38a..8c5c84a0d61 100644 --- a/htdocs/contact/class/contact.class.php +++ b/htdocs/contact/class/contact.class.php @@ -2123,9 +2123,10 @@ class Contact extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @param array $arraydata Array of data * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs; $return = '
    '; diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index ddec606a82c..539d7b63f31 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -2796,9 +2796,10 @@ class Contrat extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs; $return = '
    '; diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index ecf03696d7a..40c05e06b91 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -770,34 +770,6 @@ abstract class CommonObject } } - /** - * Return clicable link of object (with eventually picto) - * - * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. - */ - public function getKanbanView($option = '') - { - $return = '
    '; - $return .= '
    '; - $return .= ''; - $return .= img_picto('', $this->picto); - $return .= ''; - $return .= '
    '; - $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).''; - if (property_exists($this, 'label')) { - $return .= '
    '.$this->label.''; - } - if (method_exists($this, 'getLibStatut')) { - $return .= '
    '.$this->getLibStatut(5).'
    '; - } - $return .= '
    '; - $return .= '
    '; - $return .= '
    '; - - return $return; - } - /** * Return full address of contact * diff --git a/htdocs/core/class/commonobjectline.class.php b/htdocs/core/class/commonobjectline.class.php index b116519ad53..972ab7e4476 100644 --- a/htdocs/core/class/commonobjectline.class.php +++ b/htdocs/core/class/commonobjectline.class.php @@ -166,37 +166,4 @@ abstract class CommonObjectLine extends CommonObject { return 0; } - - /** - * Return clicable link of object (with eventually picto) - * - * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. - */ - public function getKanbanView($option = '') - { - global $langs; - $return = '
    '; - $return .= '
    '; - $return .= ''; - $return .= img_picto('', $this->picto); - //$return .= ''; // Can be image - $return .= ''; - $return .= '
    '; - $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(1) : '').''; - if (property_exists($this, 'date_delivery')) { - $return .= '
    '.dol_print_date($this->db->jdate($this->date_delivery), "dayhour").''; - } - if (property_exists($this, 'town') && !empty($this->town)) { - $return .= '
    '.$langs->trans("Town").''; - $return .= ' : '.$this->town.''; - } - if (method_exists($this, 'getLibStatut')) { - $return .= '
    '.$this->getLibStatut(5).'
    '; - } - $return .= '
    '; - $return .= '
    '; - $return .= '
    '; - return $return; - } } diff --git a/htdocs/core/class/commonorder.class.php b/htdocs/core/class/commonorder.class.php index 9002d50ed39..65ae367c3b2 100644 --- a/htdocs/core/class/commonorder.class.php +++ b/htdocs/core/class/commonorder.class.php @@ -37,9 +37,10 @@ abstract class CommonOrder extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @param array $arraydata Array of data * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs, $conf; diff --git a/htdocs/don/class/don.class.php b/htdocs/don/class/don.class.php index c1d09a6cdd0..acd3b34961c 100644 --- a/htdocs/don/class/don.class.php +++ b/htdocs/don/class/don.class.php @@ -1146,9 +1146,10 @@ class Don extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs; diff --git a/htdocs/expensereport/class/expensereport.class.php b/htdocs/expensereport/class/expensereport.class.php index f56167651ab..06adcd92770 100644 --- a/htdocs/expensereport/class/expensereport.class.php +++ b/htdocs/expensereport/class/expensereport.class.php @@ -2682,9 +2682,10 @@ class ExpenseReport extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs, $selected,$arrayofselected; $return = '
    '; diff --git a/htdocs/expensereport/class/paymentexpensereport.class.php b/htdocs/expensereport/class/paymentexpensereport.class.php index 5ca4135dc30..053f46d20cf 100644 --- a/htdocs/expensereport/class/paymentexpensereport.class.php +++ b/htdocs/expensereport/class/paymentexpensereport.class.php @@ -718,9 +718,10 @@ class PaymentExpenseReport extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs; $return = '
    '; diff --git a/htdocs/fichinter/class/fichinter.class.php b/htdocs/fichinter/class/fichinter.class.php index 4a7872b2859..450e2c63af3 100644 --- a/htdocs/fichinter/class/fichinter.class.php +++ b/htdocs/fichinter/class/fichinter.class.php @@ -1461,9 +1461,10 @@ class Fichinter extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs; $return = '
    '; diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index 5355e969443..910cebdb38e 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -3551,9 +3551,10 @@ class CommandeFournisseur extends CommonOrder * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs; $return = '
    '; diff --git a/htdocs/fourn/class/fournisseur.facture.class.php b/htdocs/fourn/class/fournisseur.facture.class.php index 9ca933b7c43..2c45a8d67d5 100644 --- a/htdocs/fourn/class/fournisseur.facture.class.php +++ b/htdocs/fourn/class/fournisseur.facture.class.php @@ -3237,9 +3237,10 @@ class FactureFournisseur extends CommonInvoice * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs; $return = '
    '; diff --git a/htdocs/holiday/class/holiday.class.php b/htdocs/holiday/class/holiday.class.php index e8f56659de9..e4a82be6ea7 100644 --- a/htdocs/holiday/class/holiday.class.php +++ b/htdocs/holiday/class/holiday.class.php @@ -2423,25 +2423,23 @@ class Holiday extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @param array $arraydata Label of holiday type (if known) * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { - global $langs, $selected; + global $langs; + $return = '
    '; $return .= '
    '; $return .= ''; $return .= img_picto('', $this->picto); $return .= ''; $return .= '
    '; - $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(1) : $this->ref).''; - if (property_exists($this, 'fk_user') && !empty($this->id)) { - $return .= '| '.$this->fk_user.''; - $return .= ''; - } + $return .= ''.$arraydata['user']->getNomUrl(-1).''; if (property_exists($this, 'fk_type')) { $return .= '
    '.$langs->trans("Type").' : '; - $return .= ''.$langs->trans($this->getTypes(1, -1)[$this->fk_type]['code']).''; + $return .= ''.arraydata['labeltype'].''; } if (property_exists($this, 'date_debut') && property_exists($this, 'date_fin')) { $return .= '
    '.dol_print_date($this->date_debut, 'day').''; diff --git a/htdocs/holiday/list.php b/htdocs/holiday/list.php index 56dd3ff2d98..6166ffb3b4e 100644 --- a/htdocs/holiday/list.php +++ b/htdocs/holiday/list.php @@ -835,15 +835,22 @@ if ($resql) { print '
    '; } - $holidaystatic->fk_type = $holidaystatic->getTypes(1, -1)[$obj->fk_type]['rowid']; - $holidaystatic->fk_user = $userstatic->getNomUrl(1); + $holidaystatic->fk_type = $typeleaves[$obj->fk_type]['rowid']; + // Output Kanban if ($massactionbutton || $massaction) { $selected = 0; if (in_array($object->id, $arrayofselected)) { $selected = 1; } - print $holidaystatic->getKanbanView(''); + if (empty($typeleaves[$obj->fk_type])) { + $labeltypeleavetoshow = $langs->trans("TypeWasDisabledOrRemoved", $obj->fk_type); + } else { + $labeltypeleavetoshow = ($langs->trans($typeleaves[$obj->fk_type]['code']) != $typeleaves[$obj->fk_type]['code'] ? $langs->trans($typeleaves[$obj->fk_type]['code']) : $typeleaves[$obj->fk_type]['label']); + } + + $arraydata = array('user'=>$userstatic, 'labeltype'=>$labeltypeleavetoshow); + print $holidaystatic->getKanbanView('', $arraydata); } if ($i == (min($num, $limit) - 1)) { print '
    '; diff --git a/htdocs/hrm/class/evaluation.class.php b/htdocs/hrm/class/evaluation.class.php index 4a9dd0defde..48cb8cdd0c3 100644 --- a/htdocs/hrm/class/evaluation.class.php +++ b/htdocs/hrm/class/evaluation.class.php @@ -1060,9 +1060,10 @@ class Evaluation extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $selected, $langs; $return = '
    '; diff --git a/htdocs/hrm/class/job.class.php b/htdocs/hrm/class/job.class.php index dfed55cebec..1afa8c75647 100644 --- a/htdocs/hrm/class/job.class.php +++ b/htdocs/hrm/class/job.class.php @@ -1059,9 +1059,10 @@ class Job extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $selected, $langs; $return = '
    '; diff --git a/htdocs/hrm/class/skill.class.php b/htdocs/hrm/class/skill.class.php index 5960ef8d351..8b7b6910f2b 100644 --- a/htdocs/hrm/class/skill.class.php +++ b/htdocs/hrm/class/skill.class.php @@ -1118,9 +1118,10 @@ class Skill extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $selected, $langs; $return = '
    '; diff --git a/htdocs/knowledgemanagement/class/knowledgerecord.class.php b/htdocs/knowledgemanagement/class/knowledgerecord.class.php index 4d9aa9d7ed4..3f9f1b40223 100644 --- a/htdocs/knowledgemanagement/class/knowledgerecord.class.php +++ b/htdocs/knowledgemanagement/class/knowledgerecord.class.php @@ -1071,9 +1071,10 @@ class KnowledgeRecord extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs, $selected,$arrayofselected; $return = '
    '; diff --git a/htdocs/modulebuilder/template/class/myobject.class.php b/htdocs/modulebuilder/template/class/myobject.class.php index 4bee8d9529a..5ac7f8c30de 100644 --- a/htdocs/modulebuilder/template/class/myobject.class.php +++ b/htdocs/modulebuilder/template/class/myobject.class.php @@ -869,10 +869,10 @@ class MyObject extends CommonObject * Return a thumb for kanban views * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @param array $arraydata Array of data * @return string HTML Code for Kanban thumb. */ - /* - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { $return = '
    '; $return .= '
    '; @@ -893,7 +893,6 @@ class MyObject extends CommonObject return $return; } - */ /** * Return the label of the status diff --git a/htdocs/mrp/class/mo.class.php b/htdocs/mrp/class/mo.class.php index f95064454b7..9a7ba6007cc 100644 --- a/htdocs/mrp/class/mo.class.php +++ b/htdocs/mrp/class/mo.class.php @@ -1562,9 +1562,10 @@ class Mo extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs; $return = '
    '; diff --git a/htdocs/product/stock/class/entrepot.class.php b/htdocs/product/stock/class/entrepot.class.php index ce5bef9c939..3ce244a4bb1 100644 --- a/htdocs/product/stock/class/entrepot.class.php +++ b/htdocs/product/stock/class/entrepot.class.php @@ -921,9 +921,10 @@ class Entrepot extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @param array $arraydata Array of data * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { $return = '
    '; diff --git a/htdocs/projet/class/task.class.php b/htdocs/projet/class/task.class.php index 6c2e8ad29a4..597e680f8f0 100644 --- a/htdocs/projet/class/task.class.php +++ b/htdocs/projet/class/task.class.php @@ -2330,9 +2330,10 @@ class Task extends CommonObjectLine * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs, $conf; $return = '
    '; diff --git a/htdocs/recruitment/class/recruitmentcandidature.class.php b/htdocs/recruitment/class/recruitmentcandidature.class.php index bdbcdb97811..e3dfd4bd135 100644 --- a/htdocs/recruitment/class/recruitmentcandidature.class.php +++ b/htdocs/recruitment/class/recruitmentcandidature.class.php @@ -1029,9 +1029,10 @@ class RecruitmentCandidature extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs, $selected,$arrayofselected; $return = '
    '; diff --git a/htdocs/recruitment/class/recruitmentjobposition.class.php b/htdocs/recruitment/class/recruitmentjobposition.class.php index 7ab290e691a..a63e6b012b2 100644 --- a/htdocs/recruitment/class/recruitmentjobposition.class.php +++ b/htdocs/recruitment/class/recruitmentjobposition.class.php @@ -1113,9 +1113,10 @@ class RecruitmentJobPosition extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs, $selected,$arrayofselected,$obj; $return = '
    '; diff --git a/htdocs/salaries/class/paymentsalary.class.php b/htdocs/salaries/class/paymentsalary.class.php index 4817abec6c8..0f141bc3023 100644 --- a/htdocs/salaries/class/paymentsalary.class.php +++ b/htdocs/salaries/class/paymentsalary.class.php @@ -767,9 +767,10 @@ class PaymentSalary extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs, $db; $return = '
    '; diff --git a/htdocs/salaries/class/salary.class.php b/htdocs/salaries/class/salary.class.php index 7f9ea31cdc9..2f7bb36869e 100644 --- a/htdocs/salaries/class/salary.class.php +++ b/htdocs/salaries/class/salary.class.php @@ -712,9 +712,10 @@ class Salary extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs; $return = '
    '; diff --git a/htdocs/supplier_proposal/class/supplier_proposal.class.php b/htdocs/supplier_proposal/class/supplier_proposal.class.php index 5de7b1d851a..f2e6d19afa8 100644 --- a/htdocs/supplier_proposal/class/supplier_proposal.class.php +++ b/htdocs/supplier_proposal/class/supplier_proposal.class.php @@ -2732,9 +2732,10 @@ class SupplierProposal extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs; $return = '
    '; diff --git a/htdocs/ticket/class/ticket.class.php b/htdocs/ticket/class/ticket.class.php index d390fd6f351..e0f880264f9 100644 --- a/htdocs/ticket/class/ticket.class.php +++ b/htdocs/ticket/class/ticket.class.php @@ -2937,9 +2937,10 @@ class Ticket extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) - * @return string HTML Code for Kanban thumb. + * @param array $arraydata Array of data + * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs, $selected,$arrayofselected,$obj; $return = '
    '; diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 22556d3e1c2..7f61ba2c7ab 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -2996,9 +2996,10 @@ class User extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @param array $arraydata Array of data * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { $return = '
    '; $return .= '
    '; diff --git a/htdocs/user/class/usergroup.class.php b/htdocs/user/class/usergroup.class.php index 71339991172..a9884ca59d1 100644 --- a/htdocs/user/class/usergroup.class.php +++ b/htdocs/user/class/usergroup.class.php @@ -922,9 +922,10 @@ class UserGroup extends CommonObject * Return clicable link of object (with eventually picto) * * @param string $option Where point the link (0=> main card, 1,2 => shipment, 'nolink'=>No link) + * @param array $arraydata Array of data * @return string HTML Code for Kanban thumb. */ - public function getKanbanView($option = '') + public function getKanbanView($option = '', $arraydata = null) { global $langs; $return = '
    '; From 9cd6adb6c8df667dd63f1a1bed3ce1723aac31cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20France?= Date: Wed, 18 Jan 2023 22:28:43 +0100 Subject: [PATCH 0920/1128] use oldcopy only to retrieve old values instaed undeclared properties --- htdocs/contact/card.php | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/htdocs/contact/card.php b/htdocs/contact/card.php index 3e7f5fdb1f1..66cdc1ed1aa 100644 --- a/htdocs/contact/card.php +++ b/htdocs/contact/card.php @@ -322,9 +322,6 @@ if (empty($reshook)) { $result = $object->fetch($id); $object->oldcopy = clone $object; - $object->old_lastname = (string) GETPOST("old_lastname", 'alpha'); - $object->old_firstname = (string) GETPOST("old_firstname", 'alpha'); - $result = $object->delete(); // TODO Add $user as first param if ($result > 0) { setEventMessages("RecordDeleted", null, 'mesgs'); @@ -408,9 +405,6 @@ if (empty($reshook)) { $object->oldcopy = clone $object; - $object->old_lastname = (string) GETPOST("old_lastname", 'alpha'); - $object->old_firstname = (string) GETPOST("old_firstname", 'alpha'); - $object->socid = GETPOST("socid", 'int'); $object->lastname = (string) GETPOST("lastname", 'alpha'); $object->firstname = (string) GETPOST("firstname", 'alpha'); @@ -972,7 +966,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { /* set country at end because it will trigger page refresh */ console.log("Set country id to '.dol_escape_js($objsoc->country_id).'"); $(\'select[name="country_id"]\').val("'.dol_escape_js($objsoc->country_id).'").trigger("change"); /* trigger required to update select2 components */ - }); + }); })'."\n"; print ''."\n"; } @@ -982,8 +976,6 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { print ''; print ''; print ''; - print ''; - print ''; if (!empty($backtopage)) { print ''; } @@ -1033,7 +1025,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { print '
    '; print ''; print '
    '; - if ($conf->use_javascript_ajax) { + if (!empty($conf->use_javascript_ajax)) { print ''.$langs->trans('CopyAddressFromSoc').'
    '; } print '
    '; @@ -1636,7 +1628,7 @@ function showSocialNetwork() items.show(); lnk.text("'.dol_escape_js($langs->transnoentitiesnoconv("HideSocialNetwork")).'"); if(chgCookieState) {document.cookie = "DOLUSER_SOCIALNETWORKS_SHOW=true; SameSite=Strict";} - } + } } '; } From 9d314ac035d751cff8943e42e1eff3d68dc2bf3d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 18 Jan 2023 22:34:59 +0100 Subject: [PATCH 0921/1128] Debug v17 --- htdocs/core/actions_addupdatedelete.inc.php | 2 +- htdocs/eventorganization/class/conferenceorbooth.class.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/actions_addupdatedelete.inc.php b/htdocs/core/actions_addupdatedelete.inc.php index 49f3b2fa302..18ab3ac5eda 100644 --- a/htdocs/core/actions_addupdatedelete.inc.php +++ b/htdocs/core/actions_addupdatedelete.inc.php @@ -285,7 +285,7 @@ if ($action == 'update' && !empty($permissiontoadd)) { $action = 'view'; $urltogo = $backtopage ? str_replace('__ID__', $result, $backtopage) : $backurlforlist; $urltogo = preg_replace('/--IDFORBACKTOPAGE--/', $object->id, $urltogo); // New method to autoselect project after a New on another form object creation - if ($urltogo && !$noback) { + if ($urltogo && empty($noback)) { header("Location: " . $urltogo); exit; } diff --git a/htdocs/eventorganization/class/conferenceorbooth.class.php b/htdocs/eventorganization/class/conferenceorbooth.class.php index bc21d7bb1c5..92ec38981ba 100644 --- a/htdocs/eventorganization/class/conferenceorbooth.class.php +++ b/htdocs/eventorganization/class/conferenceorbooth.class.php @@ -108,7 +108,7 @@ class ConferenceOrBooth extends ActionComm 'label' => array('type'=>'varchar(255)', 'label'=>'Label', 'enabled'=>'1', 'position'=>30, 'notnull'=>1, 'visible'=>1, 'searchall'=>1, 'css'=>'minwidth300', 'csslist'=>'tdoverflowmax125', 'help'=>"OrganizationEvenLabelName", 'showoncombobox'=>'1', 'autofocusoncreate'=>1), 'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php:1:status=1 AND entity IN (__SHARED_ENTITIES__)', 'label'=>'ThirdParty', 'enabled'=>'$conf->societe->enabled', 'position'=>50, 'notnull'=>-1, 'visible'=>1, 'index'=>1, 'help'=>"OrganizationEventLinkToThirdParty", 'picto'=>'company', 'css'=>'tdoverflowmax150 maxwidth500', 'csslist'=>'width100'), 'fk_project' => array('type'=>'integer:Project:projet/class/project.class.php:1:t.usage_organize_event=1', 'label'=>'Project', 'enabled'=>"isModEnabled('project')", 'position'=>52, 'notnull'=>-1, 'visible'=>-1, 'index'=>1, 'picto'=>'project', 'css'=>'tdoverflowmax150 maxwidth500', 'csslist'=>'width100'), - 'note' => array('type'=>'text', 'label'=>'Description', 'enabled'=>'1', 'position'=>60, 'notnull'=>0, 'visible'=>1), + 'note' => array('type'=>'text', 'label'=>'Description', 'enabled'=>'1', 'position'=>60, 'notnull'=>0, 'visible'=>3), 'fk_action' => array('type'=>'sellist:c_actioncomm:libelle:id::module LIKE (\'%@eventorganization\')', 'label'=>'Format', 'enabled'=>'1', 'position'=>60, 'notnull'=>1, 'visible'=>1, 'css'=>'width100'), 'datep' => array('type'=>'datetime', 'label'=>'DateStart', 'enabled'=>'1', 'position'=>70, 'notnull'=>0, 'visible'=>1, 'showoncombobox'=>'2',), 'datep2' => array('type'=>'datetime', 'label'=>'DateEnd', 'enabled'=>'1', 'position'=>71, 'notnull'=>0, 'visible'=>1, 'showoncombobox'=>'3',), @@ -249,7 +249,7 @@ class ConferenceOrBooth extends ActionComm $link_subscription = $dolibarr_main_url_root.'/public/eventorganization/attendee_new.php?id='.urlencode($id).'&type=conf'; - $encodedsecurekey = dol_hash($conf->global->EVENTORGANIZATION_SECUREKEY.'conferenceorbooth'.$id, 2); + $encodedsecurekey = dol_hash(getDolGlobalString('EVENTORGANIZATION_SECUREKEY').'conferenceorbooth'.$id, 2); $link_subscription .= '&securekey='.urlencode($encodedsecurekey); /*$this->fields['pubregister'] = array('type'=>'url', 'label'=>$langs->trans("PublicAttendeeSubscriptionPage"), 'enabled'=>'1', 'position'=>72, 'notnull'=>0, 'visible'=>1); From 823a7ee72b5af6840a1197fa79882e4554e0eaef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Wed, 18 Jan 2023 22:37:08 +0100 Subject: [PATCH 0922/1128] fix undeclared properties --- htdocs/commande/class/commande.class.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 35ebda89c2c..2a462f77bc4 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -11,7 +11,7 @@ * Copyright (C) 2014-2015 Marcos García * Copyright (C) 2018 Nicolas ZABOURI * Copyright (C) 2016-2022 Ferran Marcet - * Copyright (C) 2021-2022 Frédéric France + * Copyright (C) 2021-2023 Frédéric France * Copyright (C) 2022 Gauthier VERDOL * * This program is free software; you can redistribute it and/or modify @@ -236,6 +236,11 @@ class Commande extends CommonOrder */ public $user_valid; + /** + * @var OrderLine one line of an order + */ + public $line; + /** * @var OrderLine[] */ From 20956e9b7deebbbffe8a323bfb986abe48841acf Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 18 Jan 2023 22:50:13 +0100 Subject: [PATCH 0923/1128] Fix data truncated --- htdocs/loan/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/loan/card.php b/htdocs/loan/card.php index c3c08b6cf2f..f1d845bcc41 100644 --- a/htdocs/loan/card.php +++ b/htdocs/loan/card.php @@ -100,7 +100,7 @@ if (empty($reshook)) { $datestart = dol_mktime(12, 0, 0, GETPOST('startmonth', 'int'), GETPOST('startday', 'int'), GETPOST('startyear', 'int')); $dateend = dol_mktime(12, 0, 0, GETPOST('endmonth', 'int'), GETPOST('endday', 'int'), GETPOST('endyear', 'int')); $capital = price2num(GETPOST('capital')); - $rate = GETPOST('rate'); + $rate = price2num(GETPOST('rate')); if (!$capital) { $error++; $action = 'create'; From 1a2b48c57560ac8677b493c383252a405621a9f8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 18 Jan 2023 23:07:34 +0100 Subject: [PATCH 0924/1128] Fix kanban --- htdocs/bom/bom_list.php | 95 ++++++++++++------- .../modulebuilder/template/myobject_list.php | 14 +-- 2 files changed, 68 insertions(+), 41 deletions(-) diff --git a/htdocs/bom/bom_list.php b/htdocs/bom/bom_list.php index 1cb4946715a..601eb9b75b3 100644 --- a/htdocs/bom/bom_list.php +++ b/htdocs/bom/bom_list.php @@ -72,6 +72,7 @@ $search_array_options = $extrafields->getOptionalsFromPost($object->table_elemen // Default sort order (if not yet defined by previous GETPOST) if (!$sortfield) { + reset($object->fields); // Reset is required to avoid key() to return null. $sortfield = "t.".key($object->fields); // Set here default search field. By default 1st field in definition. } if (!$sortorder) { @@ -79,7 +80,7 @@ if (!$sortorder) { } // Initialize array of search criterias -$search_all = GETPOST("search_all", 'alpha'); +$search_all = GETPOST('search_all', 'alphanohtml'); $search = array(); foreach ($object->fields as $key => $val) { if (GETPOST('search_'.$key, 'alpha') !== '') { @@ -108,7 +109,7 @@ foreach ($object->fields as $key => $val) { $arrayfields['t.'.$key] = array( 'label'=>$val['label'], 'checked'=>(($visible < 0) ? 0 : 1), - 'enabled'=>($visible != 3 && dol_eval($val['enabled'], 1, 1, '1')), + 'enabled'=>(abs($visible) != 3 && dol_eval($val['enabled'], 1)), 'position'=>$val['position'], 'help'=> isset($val['help']) ? $val['help'] : '' ); @@ -299,7 +300,7 @@ $sql .= $object->getFieldList('t'); // Add fields from extrafields if (!empty($extrafields->attributes[$object->table_element]['label'])) { foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) { - $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key.' ' : ''); + $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : ''); } } // Add fields from hooks @@ -336,17 +337,17 @@ foreach ($search as $key => $val) { $mode_search = 2; } if ($search[$key] != '') { - $sql .= natural_search($key, $search[$key], (($key == 'status') ? 2 : $mode_search)); + $sql .= natural_search("t.".$db->escape($key), $search[$key], (($key == 'status') ? 2 : $mode_search)); } } else { if (preg_match('/(_dtstart|_dtend)$/', $key) && $search[$key] != '') { $columnName=preg_replace('/(_dtstart|_dtend)$/', '', $key); if (preg_match('/^(date|timestamp|datetime)/', $object->fields[$columnName]['type'])) { if (preg_match('/_dtstart$/', $key)) { - $sql .= " AND t." . $columnName . " >= '" . $db->idate($search[$key]) . "'"; + $sql .= " AND t.".$db->escape($columnName)." >= '".$db->idate($search[$key])."'"; } if (preg_match('/_dtend$/', $key)) { - $sql .= " AND t." . $columnName . " <= '" . $db->idate($search[$key]) . "'"; + $sql .= " AND t.".$db->escape($columnName)." <= '".$db->idate($search[$key])."'"; } } } @@ -366,9 +367,8 @@ $sql .= $hookmanager->resPrint; /* If a group by is required $sql.= " GROUP BY "; -foreach($object->fields as $key => $val) -{ - $sql .= "t.".$key.", "; +foreach($object->fields as $key => $val) { + $sql .= "t.".$db->escape($key).", "; } // Add fields from extrafields if (!empty($extrafields->attributes[$object->table_element]['label'])) { @@ -445,11 +445,17 @@ if ($limit > 0 && $limit != $conf->liste_limit) { $param .= '&limit='.urlencode($limit); } foreach ($search as $key => $val) { - if (is_array($search[$key]) && count($search[$key])) { + if (is_array($search[$key])) { foreach ($search[$key] as $skey) { - $param .= '&search_'.$key.'[]='.urlencode($skey); + if ($skey != '') { + $param .= '&search_'.$key.'[]='.urlencode($skey); + } } - } else { + } elseif (preg_match('/(_dtstart|_dtend)$/', $key) && !empty($val)) { + $param .= '&search_'.$key.'month='.((int) GETPOST('search_'.$key.'month', 'int')); + $param .= '&search_'.$key.'day='.((int) GETPOST('search_'.$key.'day', 'int')); + $param .= '&search_'.$key.'year='.((int) GETPOST('search_'.$key.'year', 'int')); + } elseif ($search[$key] != '') { $param .= '&search_'.$key.'='.urlencode($search[$key]); } } @@ -469,7 +475,7 @@ $arrayofmassactions = array( 'enable'=>img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Enable"), 'disable'=>img_picto('', 'close_title', 'class="pictofixedwidth"').$langs->trans("Disable"), ); -if ($permissiontodelete) { +if (!empty($permissiontodelete)) { $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete"); } if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'predelete'))) { @@ -488,6 +494,7 @@ print ''; print ''; print ''; print ''; +print ''; print ''; $newcardbutton = ''; @@ -505,10 +512,13 @@ $trackid = 'bom'.$object->id; include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php'; if ($search_all) { + $setupstring = ''; foreach ($fieldstosearchall as $key => $val) { $fieldstosearchall[$key] = $langs->trans($val); + $setupstring .= $key."=".$val.";"; } - print '
    '.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'
    '; + print ''."\n"; + print '
    '.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'
    '."\n"; } $moreforfilter = ''; @@ -544,13 +554,14 @@ print ''; // Action column if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { - print ''; + print ''; $searchpicto = $form->showFilterButtons('left'); print $searchpicto; print ''; } foreach ($object->fields as $key => $val) { + $searchkey = empty($search[$key]) ? '' : $search[$key]; $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); if ($key == 'status') { $cssforfield .= ($cssforfield ? ' ' : '').'center'; @@ -558,13 +569,13 @@ foreach ($object->fields as $key => $val) { $cssforfield .= ($cssforfield ? ' ' : '').'center'; } elseif (in_array($val['type'], array('timestamp'))) { $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; - } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) { + } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $key != 'rowid' && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) { $cssforfield .= ($cssforfield ? ' ' : '').'right'; } if (!empty($arrayfields['t.'.$key]['checked'])) { print ''; if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) { - print $form->selectarray('search_'.$key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), $val['notnull'], 0, 0, '', 1, 0, 0, '', 'maxwidth100'.($key == 'status' ? ' search_status onrightofpage' : ''), 1); + print $form->selectarray('search_'.$key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), $val['notnull'], 0, 0, '', 1, 0, 0, '', 'maxwidth100'.($key == 'status' ? ' search_status width100 onrightofpage' : ''), 1); } elseif ((strpos($val['type'], 'integer:') === 0) || (strpos($val['type'], 'sellist:') === 0)) { print $object->showInputField($val, $key, (isset($search[$key]) ? $search[$key] : ''), '', '', 'search_', 'maxwidth125', 1); } elseif (!preg_match('/^(date|timestamp|datetime)/', $val['type'])) { @@ -576,6 +587,12 @@ foreach ($object->fields as $key => $val) { print '
    '; print $form->selectDate($search[$key.'_dtend'] ? $search[$key.'_dtend'] : '', "search_".$key."_dtend", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to')); print '
    '; + } elseif ($key == 'lang') { + require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php'; + $formadmin = new FormAdmin($db); + print $formadmin->select_language($search[$key], 'search_lang', 0, null, 1, 0, 0, 'minwidth150 maxwidth200', 2); + } else { + print ''; } print ''; } @@ -589,20 +606,22 @@ $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $obje print $hookmanager->resPrint; // Action column if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { - print ''; + print ''; $searchpicto = $form->showFilterButtons(); print $searchpicto; print ''; } print ''."\n"; +$totalarray = array(); +$totalarray['nbfield'] = 0; // Fields title label // -------------------------------------------------------------------- print ''; // Action column if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { - print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n"; + print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n"; } foreach ($object->fields as $key => $val) { $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); @@ -612,23 +631,26 @@ foreach ($object->fields as $key => $val) { $cssforfield .= ($cssforfield ? ' ' : '').'center'; } elseif (in_array($val['type'], array('timestamp'))) { $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; - } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) { + } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $key != 'rowid' && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) { $cssforfield .= ($cssforfield ? ' ' : '').'right'; } + $cssforfield = preg_replace('/small\s*/', '', $cssforfield); // the 'small' css must not be used for the title label if (!empty($arrayfields['t.'.$key]['checked'])) { print getTitleFieldOfList($arrayfields['t.'.$key]['label'], 0, $_SERVER['PHP_SELF'], 't.'.$key, '', $param, ($cssforfield ? 'class="'.$cssforfield.'"' : ''), $sortfield, $sortorder, ($cssforfield ? $cssforfield.' ' : ''))."\n"; + $totalarray['nbfield']++; } } // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php'; // Hook fields -$parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder); +$parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Action column if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { - print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n"; + print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n"; } +$totalarray['nbfield']++; // For the column action print ''."\n"; @@ -646,9 +668,11 @@ if (isset($extrafields->attributes[$object->table_element]['computed']) && is_ar // Loop on record // -------------------------------------------------------------------- $i = 0; +$savnbfield = $totalarray['nbfield']; $totalarray = array(); $totalarray['nbfield'] = 0; -while ($i < ($limit ? min($num, $limit) : $num)) { +$imaxinloop = ($limit ? min($num, $limit) : $num); +while ($i < $imaxinloop) { $obj = $db->fetch_object($resql); if (empty($obj)) { break; // Should not happen @@ -660,20 +684,19 @@ while ($i < ($limit ? min($num, $limit) : $num)) { // mode view kanban if ($mode == 'kanban') { if ($i == 0) { - print ''; + print ''; print '
    '; } - + // Output kanban print $object->getKanbanView(''); - - - if ($i == min($num, $limit)-1) { + if ($i == ($imaxinloop - 1)) { print '
    '; print ''; } } else { // Show here line of result - print ''; + $j = 0; + print ''; // Action column if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { print ''; @@ -705,7 +728,11 @@ while ($i < ($limit ? min($num, $limit) : $num)) { } if (!empty($arrayfields['t.'.$key]['checked'])) { - print ''; + print ''; if ($key == 'status') { print $object->getLibStatut(5); } elseif ($key == 'rowid') { @@ -754,9 +781,9 @@ while ($i < ($limit ? min($num, $limit) : $num)) { } print ''."\n"; - - $i++; } + + $i++; } // Show total line @@ -771,14 +798,14 @@ if ($num == 0) { $colspan++; } } - print ''.$langs->trans("NoRecordFound").''; + print ''.$langs->trans("NoRecordFound").''; } $db->free($resql); $parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql); -$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object); // Note that $action and $object may have been modified by hook +$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; print ''."\n"; diff --git a/htdocs/modulebuilder/template/myobject_list.php b/htdocs/modulebuilder/template/myobject_list.php index 5ff0628bc8f..b28a7a5f955 100644 --- a/htdocs/modulebuilder/template/myobject_list.php +++ b/htdocs/modulebuilder/template/myobject_list.php @@ -136,7 +136,7 @@ if (!$sortorder) { } // Initialize array of search criterias -$search_all = GETPOST('search_all', 'alphanohtml') ? GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml'); +$search_all = GETPOST('search_all', 'alphanohtml'); $search = array(); foreach ($object->fields as $key => $val) { if (GETPOST('search_'.$key, 'alpha') !== '') { @@ -552,7 +552,7 @@ print ''; // Action column -if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { +if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { print ''; }*/ // Action column -if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { +if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { print ''; -if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { +if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n"; } foreach ($object->fields as $key => $val) { @@ -649,7 +649,7 @@ print $hookmanager->resPrint; $totalarray['nbfield']++; }*/ // Action column -if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { +if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n"; } $totalarray['nbfield']++; // For the column action @@ -699,7 +699,7 @@ while ($i < $imaxinloop) { $j = 0; print ''; // Action column - if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { print ''; }*/ // Action column - if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { print ''; - // Action column - if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { - print ''; - } - foreach ($object->fields as $key => $val) { - $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); - if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) { - $cssforfield .= ($cssforfield ? ' ' : '').'center'; - } elseif ($key == 'status') { - $cssforfield .= ($cssforfield ? ' ' : '').'center'; + // Output Kanban + print $object->getKanbanView(''); + if ($i == ($imaxinloop - 1)) { + print ''; + print ''; } - - if (in_array($val['type'], array('timestamp'))) { - $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; - } elseif ($key == 'ref') { - $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; - } - - if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'status')) && empty($val['arrayofkeyval'])) { - $cssforfield .= ($cssforfield ? ' ' : '').'right'; - } - //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100'; - - if (!empty($arrayfields['t.'.$key]['checked'])) { - print ''; - if ($key == 'status') { - print $object->getLibStatut(5); - } elseif ($key == 'ref') { - print $object->getNomUrl(1, 0, '', (($projectid > 0)?'withproject':'')); - } else { - print $object->showOutputField($val, $key, $object->$key, ''); + } else { + // Show here line of result + $j = 0; + print ''; + // Action column + if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { + print ''; if (!$i) { $totalarray['nbfield']++; } - if (!empty($val['isameasure']) && $val['isameasure'] == 1) { - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key; - } - if (!isset($totalarray['val'])) { - $totalarray['val'] = array(); - } - if (!isset($totalarray['val']['t.'.$key])) { - $totalarray['val']['t.'.$key] = 0; - } - $totalarray['val']['t.'.$key] += $object->$key; - } } - } - // Extra fields - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - // Action column - if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { - print ''; - } - if (!$i) { - $totalarray['nbfield']++; - } - print ''."\n"; + if (in_array($val['type'], array('timestamp'))) { + $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; + } elseif ($key == 'ref') { + $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; + } + + if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'ref', 'status')) && empty($val['arrayofkeyval'])) { + $cssforfield .= ($cssforfield ? ' ' : '').'right'; + } + //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100'; + + if (!empty($arrayfields['t.'.$key]['checked'])) { + print ''; + if ($key == 'status') { + print $object->getLibStatut(5); + } elseif ($key == 'ref') { + print $object->getNomUrl(1, 0, '', (($projectid > 0)?'withproject':'')); + } else { + print $object->showOutputField($val, $key, $object->$key, ''); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + if (!empty($val['isameasure']) && $val['isameasure'] == 1) { + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key; + } + if (!isset($totalarray['val'])) { + $totalarray['val'] = array(); + } + if (!isset($totalarray['val']['t.'.$key])) { + $totalarray['val']['t.'.$key] = 0; + } + $totalarray['val']['t.'.$key] += $object->$key; + } + } + } + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Action column + if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + + print ''."\n"; + } $i++; } diff --git a/htdocs/modulebuilder/template/myobject_list.php b/htdocs/modulebuilder/template/myobject_list.php index a7609f02b25..9c27366867f 100644 --- a/htdocs/modulebuilder/template/myobject_list.php +++ b/htdocs/modulebuilder/template/myobject_list.php @@ -552,7 +552,7 @@ print '
    '; $searchpicto = $form->showFilterButtons('left'); print $searchpicto; @@ -604,7 +604,7 @@ print $hookmanager->resPrint; print ''; $searchpicto = $form->showFilterButtons(); print $searchpicto; @@ -618,7 +618,7 @@ $totalarray['nbfield'] = 0; // Fields title label // -------------------------------------------------------------------- print '
    '; if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined $selected = 0; @@ -770,7 +770,7 @@ while ($i < $imaxinloop) { print ''.$obj->anotherfield.''; if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined $selected = 0; From 1f3fb86e9b002525c6e47b560864ae3d3ad9fe22 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 18 Jan 2023 23:15:10 +0100 Subject: [PATCH 0925/1128] css --- .../class/conferenceorbooth.class.php | 2 +- .../conferenceorbooth_list.php | 22 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/htdocs/eventorganization/class/conferenceorbooth.class.php b/htdocs/eventorganization/class/conferenceorbooth.class.php index 92ec38981ba..76b1941fe69 100644 --- a/htdocs/eventorganization/class/conferenceorbooth.class.php +++ b/htdocs/eventorganization/class/conferenceorbooth.class.php @@ -106,7 +106,7 @@ class ConferenceOrBooth extends ActionComm 'id' => array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>'1', 'position'=>1, 'notnull'=>1, 'visible'=>0, 'noteditable'=>'1', 'index'=>1, 'css'=>'left', 'comment'=>"Id"), 'ref' => array('type'=>'integer', 'label'=>'Ref', 'enabled'=>'1', 'position'=>1, 'notnull'=>1, 'visible'=>2, 'noteditable'=>'1', 'index'=>1, 'css'=>'left', 'csslist'=>'left', 'comment'=>"Id"), 'label' => array('type'=>'varchar(255)', 'label'=>'Label', 'enabled'=>'1', 'position'=>30, 'notnull'=>1, 'visible'=>1, 'searchall'=>1, 'css'=>'minwidth300', 'csslist'=>'tdoverflowmax125', 'help'=>"OrganizationEvenLabelName", 'showoncombobox'=>'1', 'autofocusoncreate'=>1), - 'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php:1:status=1 AND entity IN (__SHARED_ENTITIES__)', 'label'=>'ThirdParty', 'enabled'=>'$conf->societe->enabled', 'position'=>50, 'notnull'=>-1, 'visible'=>1, 'index'=>1, 'help'=>"OrganizationEventLinkToThirdParty", 'picto'=>'company', 'css'=>'tdoverflowmax150 maxwidth500', 'csslist'=>'width100'), + 'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php:1:status=1 AND entity IN (__SHARED_ENTITIES__)', 'label'=>'ThirdParty', 'enabled'=>'$conf->societe->enabled', 'position'=>50, 'notnull'=>-1, 'visible'=>1, 'index'=>1, 'help'=>"OrganizationEventLinkToThirdParty", 'picto'=>'company', 'csslist'=>'tdoverflowmax150', 'css'=>'maxwidth500'), 'fk_project' => array('type'=>'integer:Project:projet/class/project.class.php:1:t.usage_organize_event=1', 'label'=>'Project', 'enabled'=>"isModEnabled('project')", 'position'=>52, 'notnull'=>-1, 'visible'=>-1, 'index'=>1, 'picto'=>'project', 'css'=>'tdoverflowmax150 maxwidth500', 'csslist'=>'width100'), 'note' => array('type'=>'text', 'label'=>'Description', 'enabled'=>'1', 'position'=>60, 'notnull'=>0, 'visible'=>3), 'fk_action' => array('type'=>'sellist:c_actioncomm:libelle:id::module LIKE (\'%@eventorganization\')', 'label'=>'Format', 'enabled'=>'1', 'position'=>60, 'notnull'=>1, 'visible'=>1, 'css'=>'width100'), diff --git a/htdocs/eventorganization/conferenceorbooth_list.php b/htdocs/eventorganization/conferenceorbooth_list.php index 1dd77122384..21172d774d9 100644 --- a/htdocs/eventorganization/conferenceorbooth_list.php +++ b/htdocs/eventorganization/conferenceorbooth_list.php @@ -757,7 +757,7 @@ print ''; // Action column -if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { +if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { print ''; -if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { +if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n"; } foreach ($object->fields as $key => $val) { @@ -831,7 +831,7 @@ foreach ($object->fields as $key => $val) { $cssforfield .= ($cssforfield ? ' ' : '').'center'; } elseif (in_array($val['type'], array('timestamp'))) { $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; - } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $key != 'rowid' && $key != 'ref' && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) { + } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $key != 'rowid' && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) { $cssforfield .= ($cssforfield ? ' ' : '').'right'; } $cssforfield = preg_replace('/small\s*/', '', $cssforfield); // the 'small' css must not be used for the title label @@ -847,7 +847,7 @@ $parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$ $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Action column -if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { +if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n"; } $totalarray['nbfield']++; @@ -885,7 +885,7 @@ while ($i < $imaxinloop) { $j = 0; print ''; // Action column - if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { print ''; + print ''; } From a4c06a2188edad3fd08e609bff92a5368e50f4ca Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 18 Jan 2023 23:19:09 +0100 Subject: [PATCH 0926/1128] css --- .../class/conferenceorbooth.class.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/htdocs/eventorganization/class/conferenceorbooth.class.php b/htdocs/eventorganization/class/conferenceorbooth.class.php index 76b1941fe69..b3232f079f6 100644 --- a/htdocs/eventorganization/class/conferenceorbooth.class.php +++ b/htdocs/eventorganization/class/conferenceorbooth.class.php @@ -112,13 +112,13 @@ class ConferenceOrBooth extends ActionComm 'fk_action' => array('type'=>'sellist:c_actioncomm:libelle:id::module LIKE (\'%@eventorganization\')', 'label'=>'Format', 'enabled'=>'1', 'position'=>60, 'notnull'=>1, 'visible'=>1, 'css'=>'width100'), 'datep' => array('type'=>'datetime', 'label'=>'DateStart', 'enabled'=>'1', 'position'=>70, 'notnull'=>0, 'visible'=>1, 'showoncombobox'=>'2',), 'datep2' => array('type'=>'datetime', 'label'=>'DateEnd', 'enabled'=>'1', 'position'=>71, 'notnull'=>0, 'visible'=>1, 'showoncombobox'=>'3',), - 'datec' => array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>'1', 'position'=>500, 'notnull'=>1, 'visible'=>-2,), - 'tms' => array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>'1', 'position'=>501, 'notnull'=>0, 'visible'=>-2,), - 'fk_user_author' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserAuthor', 'enabled'=>'1', 'position'=>510, 'notnull'=>1, 'visible'=>-2, 'foreignkey'=>'user.rowid',), - 'fk_user_mod' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserModif', 'enabled'=>'1', 'position'=>511, 'notnull'=>-1, 'visible'=>-2,), + 'datec' => array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>'1', 'position'=>500, 'notnull'=>1, 'visible'=>-2, 'csslist'=>'nowraponall'), + 'tms' => array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>'1', 'position'=>501, 'notnull'=>0, 'visible'=>-2, 'csslist'=>'nowraponall'), + 'fk_user_author' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserAuthor', 'enabled'=>'1', 'position'=>510, 'notnull'=>1, 'visible'=>-2, 'foreignkey'=>'user.rowid', 'csslist'=>'tdoverflowmax100'), + 'fk_user_mod' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserModif', 'enabled'=>'1', 'position'=>511, 'notnull'=>-1, 'visible'=>-2, 'csslist'=>'tdoverflowmax100'), + 'num_vote' => array('type'=>'smallint', 'label'=>'NbVotes', 'enabled'=>'1', 'position'=>800, 'notnull'=>-1, 'visible'=>5, 'default'=>'0', 'index'=>0), 'import_key' => array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>'1', 'position'=>1000, 'notnull'=>-1, 'visible'=>-2,), 'status' => array('type'=>'smallint', 'label'=>'Status', 'enabled'=>'1', 'position'=>1000, 'notnull'=>1, 'visible'=>1, 'default'=>'0', 'index'=>1, 'arrayofkeyval'=>array('0'=>'EvntOrgDraft', '1'=>'EvntOrgSuggested', '2'=> 'EvntOrgConfirmed', '3' =>'EvntOrgNotQualified', '4' =>'EvntOrgDone', '9'=>'EvntOrgCancelled'),), - 'num_vote' => array('type'=>'smallint', 'label'=>'NbVotes', 'enabled'=>'1', 'position'=>1001, 'notnull'=>-1, 'visible'=>5, 'default'=>'0', 'index'=>0), ); public $rowid; public $id; From ff7a666c2b2e53191198e4187466e98b854e3f84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Wed, 18 Jan 2023 23:43:54 +0100 Subject: [PATCH 0927/1128] Update bonprelevement.class.php --- htdocs/compta/prelevement/class/bonprelevement.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/prelevement/class/bonprelevement.class.php b/htdocs/compta/prelevement/class/bonprelevement.class.php index a1dcdba6f58..7d16bcd8136 100644 --- a/htdocs/compta/prelevement/class/bonprelevement.class.php +++ b/htdocs/compta/prelevement/class/bonprelevement.class.php @@ -1690,7 +1690,7 @@ class BonPrelevement extends CommonObject fclose($this->file); if (!empty($conf->global->MAIN_UMASK)) { - @chmod($this->file, octdec($conf->global->MAIN_UMASK)); + @chmod($this->filename, octdec($conf->global->MAIN_UMASK)); } return $result; From a33603b6aeb76b9e67d35744865c1639dea9a189 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 18 Jan 2023 23:58:26 +0100 Subject: [PATCH 0928/1128] Doxygen --- .../fichinter/class/api_interventions.class.php | 16 ++++++---------- htdocs/reception/class/api_receptions.class.php | 15 +++++++-------- .../recruitment/class/api_recruitment.class.php | 8 ++++---- htdocs/societe/class/api_thirdparties.class.php | 13 +++++++------ .../class/api_supplier_proposals.class.php | 2 +- htdocs/zapier/class/api_zapier.class.php | 4 ++-- 6 files changed, 27 insertions(+), 31 deletions(-) diff --git a/htdocs/fichinter/class/api_interventions.class.php b/htdocs/fichinter/class/api_interventions.class.php index f96dc3d6aa7..14fc9f16fcf 100644 --- a/htdocs/fichinter/class/api_interventions.class.php +++ b/htdocs/fichinter/class/api_interventions.class.php @@ -64,11 +64,10 @@ class Interventions extends DolibarrApi /** * Get properties of a Expense Report object - * * Return an array with Expense Report information * * @param int $id ID of Expense Report - * @return array|mixed Data without useless information + * @return Object Object with cleaned properties * * @throws RestException */ @@ -93,7 +92,6 @@ class Interventions extends DolibarrApi /** * List of interventions - * * Return a list of interventions * * @param string $sortfield Sort field @@ -336,12 +334,11 @@ class Interventions extends DolibarrApi * "notrigger": 0 * } * - * @param int $id Intervention ID - * @param int $notrigger 1=Does not execute triggers, 0= execute triggers + * @param int $id Intervention ID + * @param int $notrigger 1=Does not execute triggers, 0= execute triggers + * @return Object Object with cleaned properties * * @url POST {id}/validate - * - * @return array */ public function validate($id, $notrigger = 0) { @@ -373,11 +370,10 @@ class Interventions extends DolibarrApi /** * Close an intervention * - * @param int $id Intervention ID + * @param int $id Intervention ID + * @return Object Object with cleaned properties * * @url POST {id}/close - * - * @return array */ public function closeFichinter($id) { diff --git a/htdocs/reception/class/api_receptions.class.php b/htdocs/reception/class/api_receptions.class.php index 473650161e2..ca46cb8909c 100644 --- a/htdocs/reception/class/api_receptions.class.php +++ b/htdocs/reception/class/api_receptions.class.php @@ -59,7 +59,7 @@ class Receptions extends DolibarrApi * Return an array with reception informations * * @param int $id ID of reception - * @return array|mixed data without useless information + * @return Object Object with cleaned properties * * @throws RestException */ @@ -497,12 +497,12 @@ class Receptions extends DolibarrApi * This may record stock movements if module stock is enabled and option to * decrease stock on reception is on. * - * @param int $id Reception ID - * @param int $notrigger 1=Does not execute triggers, 0= execute triggers + * @param int $id Reception ID + * @param int $notrigger 1=Does not execute triggers, 0= execute triggers + * @return Object Object with cleaned properties * * @url POST {id}/validate * - * @return array * \todo An error 403 is returned if the request has an empty body. * Error message: "Forbidden: Content type `text/plain` is not supported." * Workaround: send this in the body @@ -625,12 +625,11 @@ class Receptions extends DolibarrApi /** * Close a reception (Classify it as "Delivered") * - * @param int $id Reception ID - * @param int $notrigger Disabled triggers + * @param int $id Reception ID + * @param int $notrigger Disabled triggers + * @return Object Object with cleaned properties * * @url POST {id}/close - * - * @return int */ public function close($id, $notrigger = 0) { diff --git a/htdocs/recruitment/class/api_recruitment.class.php b/htdocs/recruitment/class/api_recruitment.class.php index cf4fa7a143e..9162a6250f3 100644 --- a/htdocs/recruitment/class/api_recruitment.class.php +++ b/htdocs/recruitment/class/api_recruitment.class.php @@ -66,8 +66,8 @@ class Recruitment extends DolibarrApi * * Return an array with jobposition informations * - * @param int $id ID of jobposition - * @return array|mixed data without useless information + * @param int $id ID of jobposition + * @return Object Object with cleaned properties * * @url GET jobposition/{id} * @@ -97,8 +97,8 @@ class Recruitment extends DolibarrApi * * Return an array with candidature informations * - * @param int $id ID of candidature - * @return array|mixed data without useless information + * @param int $id ID of candidature + * @return Object Object with cleaned properties * * @url GET candidature/{id} * diff --git a/htdocs/societe/class/api_thirdparties.class.php b/htdocs/societe/class/api_thirdparties.class.php index c4781c0df6a..10266b6f0ac 100644 --- a/htdocs/societe/class/api_thirdparties.class.php +++ b/htdocs/societe/class/api_thirdparties.class.php @@ -523,8 +523,8 @@ class Thirdparties extends DolibarrApi /** * Delete thirdparty * - * @param int $id Thirdparty ID - * @return integer + * @param int $id Thirdparty ID + * @return array */ public function delete($id) { @@ -1351,10 +1351,10 @@ class Thirdparties extends DolibarrApi /** * Generate a Document from a bank account record (like SEPA mandate) * - * @param int $id Thirdparty id - * @param int $companybankid Companybank id - * @param string $model Model of document to generate - * @return void + * @param int $id Thirdparty id + * @param int $companybankid Companybank id + * @param string $model Model of document to generate + * @return array * * @url GET {id}/generateBankAccountDocument/{companybankid}/{model} */ @@ -1375,6 +1375,7 @@ class Thirdparties extends DolibarrApi $this->company->setDocModel(DolibarrApiAccess::$user, $model); $this->company->fk_bank = $this->company->fk_account; + $this->company->fk_account = $this->company->fk_account; $outputlangs = $langs; $newlang = ''; diff --git a/htdocs/supplier_proposal/class/api_supplier_proposals.class.php b/htdocs/supplier_proposal/class/api_supplier_proposals.class.php index f2036edda88..496d67df829 100644 --- a/htdocs/supplier_proposal/class/api_supplier_proposals.class.php +++ b/htdocs/supplier_proposal/class/api_supplier_proposals.class.php @@ -58,7 +58,7 @@ class Supplierproposals extends DolibarrApi * Return an array with supplier proposal informations * * @param int $id ID of supplier proposal - * @return array|mixed data without useless information + * @return Object Object with cleaned properties * * @throws RestException */ diff --git a/htdocs/zapier/class/api_zapier.class.php b/htdocs/zapier/class/api_zapier.class.php index 56ab923435d..aac72a281f7 100644 --- a/htdocs/zapier/class/api_zapier.class.php +++ b/htdocs/zapier/class/api_zapier.class.php @@ -66,8 +66,8 @@ class Zapier extends DolibarrApi * * Return an array with hook informations * - * @param int $id ID of hook - * @return array|mixed data without useless information + * @param int $id ID of hook + * @return Object Object with cleaned properties * * @url GET /hooks/{id} * @throws RestException From 58645a1d4aadc575d5c965573d7dd56b3a1df0a6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 19 Jan 2023 00:19:57 +0100 Subject: [PATCH 0929/1128] Debug v17 --- htdocs/admin/system/modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/admin/system/modules.php b/htdocs/admin/system/modules.php index c2ad387d955..6ea79cf00eb 100644 --- a/htdocs/admin/system/modules.php +++ b/htdocs/admin/system/modules.php @@ -241,7 +241,7 @@ if ($arrayfields['version']['checked']) { } if ($arrayfields['id']['checked']) { print ''; } if ($arrayfields['permission']['checked']) { From e28fce631827f318431287ea71c20367b52f3542 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 19 Jan 2023 01:16:39 +0100 Subject: [PATCH 0930/1128] Debug --- htdocs/bookcal/admin/about.php | 80 ------------------- .../admin/availabilities_extrafields.php | 4 +- htdocs/bookcal/admin/booking_extrafields.php | 4 +- htdocs/bookcal/admin/setup.php | 4 +- htdocs/bookcal/availabilities_agenda.php | 2 +- htdocs/bookcal/availabilities_card.php | 2 +- htdocs/bookcal/availabilities_contact.php | 2 +- htdocs/bookcal/availabilities_document.php | 2 +- htdocs/bookcal/availabilities_list.php | 4 +- htdocs/bookcal/availabilities_note.php | 2 +- htdocs/bookcal/bookcalindex.php | 2 +- htdocs/bookcal/booking_agenda.php | 2 +- htdocs/bookcal/booking_card.php | 2 +- htdocs/bookcal/booking_contact.php | 2 +- htdocs/bookcal/booking_document.php | 2 +- htdocs/bookcal/booking_list.php | 2 +- htdocs/bookcal/booking_note.php | 2 +- htdocs/bookcal/class/availabilities.class.php | 12 +-- htdocs/bookcal/class/booking.class.php | 6 +- htdocs/bookcal/lib/bookcal.lib.php | 7 +- .../lib/bookcal_availabilities.lib.php | 2 +- htdocs/bookcal/lib/bookcal_booking.lib.php | 2 +- htdocs/comm/action/index.php | 6 +- htdocs/core/class/commonobject.class.php | 19 +++-- htdocs/core/modules/modBookCal.class.php | 8 +- htdocs/langs/en_US/admin.lang | 2 + htdocs/societe/class/societe.class.php | 4 +- 27 files changed, 56 insertions(+), 132 deletions(-) delete mode 100644 htdocs/bookcal/admin/about.php diff --git a/htdocs/bookcal/admin/about.php b/htdocs/bookcal/admin/about.php deleted file mode 100644 index 2ff4e874450..00000000000 --- a/htdocs/bookcal/admin/about.php +++ /dev/null @@ -1,80 +0,0 @@ - - * Copyright (C) 2022 Alice Adminson - * - * 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 bookcal/admin/about.php - * \ingroup bookcal - * \brief About page of module BookCal. - */ - -// Load Dolibarr environment -require '../../main.inc.php'; - -// Libraries -require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; -require_once '../lib/bookcal.lib.php'; - -// Translations -$langs->loadLangs(array("errors", "admin", "bookcal@bookcal")); - -// Access control -if (!$user->admin) { - accessforbidden(); -} - -// Parameters -$action = GETPOST('action', 'aZ09'); -$backtopage = GETPOST('backtopage', 'alpha'); - - -/* - * Actions - */ - -// None - - -/* - * View - */ - -$form = new Form($db); - -$help_url = ''; -$page_name = "BookCalAbout"; - -llxHeader('', $langs->trans($page_name), $help_url); - -// Subheader -$linkback = ''.$langs->trans("BackToModuleList").''; - -print load_fiche_titre($langs->trans($page_name), $linkback, 'title_setup'); - -// Configuration header -$head = bookcalAdminPrepareHead(); -print dol_get_fiche_head($head, 'about', $langs->trans($page_name), 0, 'bookcal@bookcal'); - -dol_include_once('/bookcal/core/modules/modBookCal.class.php'); -$tmpmodule = new modBookCal($db); -print $tmpmodule->getDescLong(); - -// Page end -print dol_get_fiche_end(); -llxFooter(); -$db->close(); diff --git a/htdocs/bookcal/admin/availabilities_extrafields.php b/htdocs/bookcal/admin/availabilities_extrafields.php index ba7dca39570..190a44f339d 100644 --- a/htdocs/bookcal/admin/availabilities_extrafields.php +++ b/htdocs/bookcal/admin/availabilities_extrafields.php @@ -33,7 +33,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; require_once '../lib/bookcal.lib.php'; // Load translation files required by the page -$langs->loadLangs(array('bookcal@bookcal', 'admin')); +$langs->loadLangs(array('agenda', 'admin')); $extrafields = new ExtraFields($db); $form = new Form($db); @@ -80,7 +80,7 @@ print load_fiche_titre($langs->trans($page_name), $linkback, 'title_setup'); $head = bookcalAdminPrepareHead(); -print dol_get_fiche_head($head, 'availabilities_extrafields', $langs->trans($page_name), -1, 'bookcal@bookcal'); +print dol_get_fiche_head($head, 'availabilities_extrafields', $langs->trans($page_name), -1, 'fa-calendar-check'); require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; diff --git a/htdocs/bookcal/admin/booking_extrafields.php b/htdocs/bookcal/admin/booking_extrafields.php index 2e9163af158..b4029a99338 100644 --- a/htdocs/bookcal/admin/booking_extrafields.php +++ b/htdocs/bookcal/admin/booking_extrafields.php @@ -33,7 +33,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; require_once '../lib/bookcal.lib.php'; // Load translation files required by the page -$langs->loadLangs(array('bookcal@bookcal', 'admin')); +$langs->loadLangs(array('agenda', 'admin')); $extrafields = new ExtraFields($db); $form = new Form($db); @@ -80,7 +80,7 @@ print load_fiche_titre($langs->trans($page_name), $linkback, 'title_setup'); $head = bookcalAdminPrepareHead(); -print dol_get_fiche_head($head, 'booking_extrafields', $langs->trans($page_name), -1, 'bookcal@bookcal'); +print dol_get_fiche_head($head, 'booking_extrafields', $langs->trans($page_name), -1, 'fa-calendar-check'); require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; diff --git a/htdocs/bookcal/admin/setup.php b/htdocs/bookcal/admin/setup.php index 9772ffbbbf0..e3addec83e3 100644 --- a/htdocs/bookcal/admin/setup.php +++ b/htdocs/bookcal/admin/setup.php @@ -33,7 +33,7 @@ require_once '../lib/bookcal.lib.php'; //require_once "../class/myclass.class.php"; // Translations -$langs->loadLangs(array("admin", "bookcal@bookcal")); +$langs->loadLangs(array("admin", "agenda")); // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context $hookmanager->initHooks(array('bookcalsetup', 'globalsetup')); @@ -269,7 +269,7 @@ print load_fiche_titre($langs->trans($page_name), $linkback, 'title_setup'); // Configuration header $head = bookcalAdminPrepareHead(); -print dol_get_fiche_head($head, 'settings', $langs->trans($page_name), -1, "bookcal@bookcal"); +print dol_get_fiche_head($head, 'settings', $langs->trans($page_name), -1, "fa-calendar-check"); // Setup page goes here echo ''.$langs->trans("BookCalSetupPage").'

    '; diff --git a/htdocs/bookcal/availabilities_agenda.php b/htdocs/bookcal/availabilities_agenda.php index 0d34fa992c1..d97970c3add 100644 --- a/htdocs/bookcal/availabilities_agenda.php +++ b/htdocs/bookcal/availabilities_agenda.php @@ -33,7 +33,7 @@ require_once DOL_DOCUMENT_ROOT.'/bookcal/lib/bookcal_availabilities.lib.php'; // Load translation files required by the page -$langs->loadLangs(array("bookcal@bookcal", "other")); +$langs->loadLangs(array("agenda", "other")); // Get parameters $id = GETPOST('id', 'int'); diff --git a/htdocs/bookcal/availabilities_card.php b/htdocs/bookcal/availabilities_card.php index ac580c650c5..f64b5e6f4b6 100644 --- a/htdocs/bookcal/availabilities_card.php +++ b/htdocs/bookcal/availabilities_card.php @@ -32,7 +32,7 @@ require_once DOL_DOCUMENT_ROOT.'/bookcal/class/availabilities.class.php'; require_once DOL_DOCUMENT_ROOT.'/bookcal/lib/bookcal_availabilities.lib.php'; // Load translation files required by the page -$langs->loadLangs(array("bookcal@bookcal", "other")); +$langs->loadLangs(array("agenda", "other")); // Get parameters $id = GETPOST('id', 'int'); diff --git a/htdocs/bookcal/availabilities_contact.php b/htdocs/bookcal/availabilities_contact.php index 41508aaa46a..348602f58a9 100644 --- a/htdocs/bookcal/availabilities_contact.php +++ b/htdocs/bookcal/availabilities_contact.php @@ -31,7 +31,7 @@ require_once DOL_DOCUMENT_ROOT.'/bookcal/class/availabilities.class.php'; require_once DOL_DOCUMENT_ROOT.'/bookcal/lib/bookcal_availabilities.lib.php'; // Load translation files required by the page -$langs->loadLangs(array("bookcal@bookcal", "companies", "other", "mails")); +$langs->loadLangs(array("agenda", "companies", "other", "mails")); $id = (GETPOST('id') ?GETPOST('id', 'int') : GETPOST('facid', 'int')); // For backward compatibility $ref = GETPOST('ref', 'alpha'); diff --git a/htdocs/bookcal/availabilities_document.php b/htdocs/bookcal/availabilities_document.php index e7335bff74c..ed6b2976570 100644 --- a/htdocs/bookcal/availabilities_document.php +++ b/htdocs/bookcal/availabilities_document.php @@ -33,7 +33,7 @@ require_once DOL_DOCUMENT_ROOT.'/bookcal/class/availabilities.class.php'; require_once DOL_DOCUMENT_ROOT.'/bookcal/lib/bookcal_availabilities.lib.php'; // Load translation files required by the page -$langs->loadLangs(array("bookcal@bookcal", "companies", "other", "mails")); +$langs->loadLangs(array("agenda", "companies", "other", "mails")); $action = GETPOST('action', 'aZ09'); diff --git a/htdocs/bookcal/availabilities_list.php b/htdocs/bookcal/availabilities_list.php index 9af4b65a022..26d66ce0ca4 100644 --- a/htdocs/bookcal/availabilities_list.php +++ b/htdocs/bookcal/availabilities_list.php @@ -36,7 +36,7 @@ require_once __DIR__.'/class/availabilities.class.php'; //dol_include_once('/othermodule/class/otherobject.class.php'); // Load translation files required by the page -$langs->loadLangs(array("bookcal@bookcal", "other")); +$langs->loadLangs(array("agenda", "other")); $id = GETPOST('id', 'int'); $ref = GETPOST('ref', 'alpha'); @@ -210,7 +210,7 @@ $now = dol_now(); //$help_url = "EN:Module_Availabilities|FR:Module_Availabilities_FR|ES:Módulo_Availabilities"; $help_url = ''; -$title = $langs->trans("Availabilitiess"); +$title = $langs->trans("Availabilities"); $morejs = array(); $morecss = array(); diff --git a/htdocs/bookcal/availabilities_note.php b/htdocs/bookcal/availabilities_note.php index 44ced158e03..6913491d85e 100644 --- a/htdocs/bookcal/availabilities_note.php +++ b/htdocs/bookcal/availabilities_note.php @@ -29,7 +29,7 @@ require_once DOL_DOCUMENT_ROOT.'/bookcal/class/availabilities.class.php'; require_once DOL_DOCUMENT_ROOT.'/bookcal/lib/bookcal_availabilities.lib.php'; // Load translation files required by the page -$langs->loadLangs(array("bookcal@bookcal", "companies")); +$langs->loadLangs(array("agenda", "companies")); // Get parameters $id = GETPOST('id', 'int'); diff --git a/htdocs/bookcal/bookcalindex.php b/htdocs/bookcal/bookcalindex.php index 6ec6ae6fb3e..46281eb048a 100644 --- a/htdocs/bookcal/bookcalindex.php +++ b/htdocs/bookcal/bookcalindex.php @@ -30,7 +30,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; // Load translation files required by the page -$langs->loadLangs(array("bookcal@bookcal")); +$langs->loadLangs(array("agenda")); $action = GETPOST('action', 'aZ09'); diff --git a/htdocs/bookcal/booking_agenda.php b/htdocs/bookcal/booking_agenda.php index a9163d7f70d..fb26fce4fc7 100644 --- a/htdocs/bookcal/booking_agenda.php +++ b/htdocs/bookcal/booking_agenda.php @@ -33,7 +33,7 @@ require_once DOL_DOCUMENT_ROOT.'/bookcal/lib/bookcal_booking.lib.php'; // Load translation files required by the page -$langs->loadLangs(array("bookcal@bookcal", "other")); +$langs->loadLangs(array("agenda", "other")); // Get parameters $id = GETPOST('id', 'int'); diff --git a/htdocs/bookcal/booking_card.php b/htdocs/bookcal/booking_card.php index 7f0fc3b9f3a..82bd884cd2d 100644 --- a/htdocs/bookcal/booking_card.php +++ b/htdocs/bookcal/booking_card.php @@ -32,7 +32,7 @@ require_once DOL_DOCUMENT_ROOT.'/bookcal/class/booking.class.php'; require_once DOL_DOCUMENT_ROOT.'/bookcal/lib/bookcal_booking.lib.php'; // Load translation files required by the page -$langs->loadLangs(array("bookcal@bookcal", "other")); +$langs->loadLangs(array("agenda", "other")); // Get parameters $id = GETPOST('id', 'int'); diff --git a/htdocs/bookcal/booking_contact.php b/htdocs/bookcal/booking_contact.php index bb73368b770..631f6af8e6c 100644 --- a/htdocs/bookcal/booking_contact.php +++ b/htdocs/bookcal/booking_contact.php @@ -31,7 +31,7 @@ require_once DOL_DOCUMENT_ROOT.'/bookcal/class/booking.class.php'; require_once DOL_DOCUMENT_ROOT.'/bookcal/lib/bookcal_booking.lib.php'; // Load translation files required by the page -$langs->loadLangs(array("bookcal@bookcal", "companies", "other", "mails")); +$langs->loadLangs(array("agenda", "companies", "other", "mails")); $id = (GETPOST('id') ?GETPOST('id', 'int') : GETPOST('facid', 'int')); // For backward compatibility $ref = GETPOST('ref', 'alpha'); diff --git a/htdocs/bookcal/booking_document.php b/htdocs/bookcal/booking_document.php index c102597e189..fa925759399 100644 --- a/htdocs/bookcal/booking_document.php +++ b/htdocs/bookcal/booking_document.php @@ -33,7 +33,7 @@ require_once DOL_DOCUMENT_ROOT.'/bookcal/class/booking.class.php'; require_once DOL_DOCUMENT_ROOT.'/bookcal/lib/bookcal_booking.lib.php'; // Load translation files required by the page -$langs->loadLangs(array("bookcal@bookcal", "companies", "other", "mails")); +$langs->loadLangs(array("agenda", "companies", "other", "mails")); $action = GETPOST('action', 'aZ09'); diff --git a/htdocs/bookcal/booking_list.php b/htdocs/bookcal/booking_list.php index c7ebdd6f378..2e4fbfccd16 100644 --- a/htdocs/bookcal/booking_list.php +++ b/htdocs/bookcal/booking_list.php @@ -36,7 +36,7 @@ require_once __DIR__.'/class/booking.class.php'; //dol_include_once('/othermodule/class/otherobject.class.php'); // Load translation files required by the page -$langs->loadLangs(array("bookcal@bookcal", "other")); +$langs->loadLangs(array("agenda", "other")); $id = GETPOST('id', 'int'); $ref = GETPOST('ref', 'alpha'); diff --git a/htdocs/bookcal/booking_note.php b/htdocs/bookcal/booking_note.php index c8b2de4e6ff..809f382cc16 100644 --- a/htdocs/bookcal/booking_note.php +++ b/htdocs/bookcal/booking_note.php @@ -29,7 +29,7 @@ require_once DOL_DOCUMENT_ROOT.'/bookcal/class/booking.class.php'; require_once DOL_DOCUMENT_ROOT.'/bookcal/lib/bookcal_booking.lib.php'; // Load translation files required by the page -$langs->loadLangs(array("bookcal@bookcal", "companies")); +$langs->loadLangs(array("agenda", "companies")); // Get parameters $id = GETPOST('id', 'int'); diff --git a/htdocs/bookcal/class/availabilities.class.php b/htdocs/bookcal/class/availabilities.class.php index 3ccc4542670..6b4502e3364 100644 --- a/htdocs/bookcal/class/availabilities.class.php +++ b/htdocs/bookcal/class/availabilities.class.php @@ -116,10 +116,10 @@ class Availabilities extends CommonObject 'import_key' => array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>'1', 'position'=>1000, 'notnull'=>-1, 'visible'=>-2,), 'model_pdf' => array('type'=>'varchar(255)', 'label'=>'Model pdf', 'enabled'=>'1', 'position'=>1010, 'notnull'=>-1, 'visible'=>0,), 'status' => array('type'=>'integer', 'label'=>'Status', 'enabled'=>'1', 'position'=>2000, 'notnull'=>1, 'visible'=>1, 'index'=>1, 'arrayofkeyval'=>array('0'=>'Draft', '1'=>'Validated', '9'=>'Canceled'), 'validate'=>'1',), - 'start' => array('type'=>'date', 'label'=>'Start Date', 'enabled'=>'1', 'position'=>40, 'notnull'=>1, 'visible'=>1, 'searchall'=>1, 'isameasure'=>'1',), - 'end' => array('type'=>'date', 'label'=>'End Date', 'enabled'=>'1', 'position'=>45, 'notnull'=>1, 'visible'=>1, 'searchall'=>1, 'isameasure'=>'1',), + 'start' => array('type'=>'date', 'label'=>'Start Date', 'enabled'=>'1', 'position'=>40, 'notnull'=>1, 'visible'=>1, 'searchall'=>1), + 'end' => array('type'=>'date', 'label'=>'End Date', 'enabled'=>'1', 'position'=>45, 'notnull'=>1, 'visible'=>1, 'searchall'=>1), 'type' => array('type'=>'integer', 'label'=>'Type', 'enabled'=>'1', 'position'=>49, 'notnull'=>1, 'visible'=>1, 'index'=>1, 'arrayofkeyval'=>array('0'=>'Customer', '1'=>'Supplier', '2'=>'Else'),), - 'duration' => array('type'=>'integer', 'label'=>'Duration', 'enabled'=>'1', 'position'=>47, 'notnull'=>1, 'visible'=>1, 'default'=>'30', 'isameasure'=>'1',), + 'duration' => array('type'=>'integer', 'label'=>'Duration', 'enabled'=>'1', 'position'=>47, 'notnull'=>1, 'visible'=>1, 'default'=>'30'), 'startHour' => array('type'=>'integer', 'label'=>'Start Hour', 'enabled'=>'1', 'position'=>46, 'notnull'=>1, 'visible'=>-1,), 'endHour' => array('type'=>'integer', 'label'=>'End Hour', 'enabled'=>'1', 'position'=>46.5, 'notnull'=>1, 'visible'=>-1,), ); @@ -842,7 +842,7 @@ class Availabilities extends CommonObject // phpcs:enable if (empty($this->labelStatus) || empty($this->labelStatusShort)) { global $langs; - //$langs->load("bookcal@bookcal"); + //$langs->load("agenda"); $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft'); $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled'); $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled'); @@ -944,7 +944,7 @@ class Availabilities extends CommonObject public function getNextNumRef() { global $langs, $conf; - $langs->load("bookcal@bookcal"); + $langs->load("agenda"); if (empty($conf->global->BOOKCAL_AVAILABILITIES_ADDON)) { $conf->global->BOOKCAL_AVAILABILITIES_ADDON = 'mod_availabilities_standard'; @@ -1009,7 +1009,7 @@ class Availabilities extends CommonObject $result = 0; $includedocgeneration = 0; - $langs->load("bookcal@bookcal"); + $langs->load("agenda"); if (!dol_strlen($modele)) { $modele = 'standard_availabilities'; diff --git a/htdocs/bookcal/class/booking.class.php b/htdocs/bookcal/class/booking.class.php index 1a4f402626b..80807d7125f 100644 --- a/htdocs/bookcal/class/booking.class.php +++ b/htdocs/bookcal/class/booking.class.php @@ -842,7 +842,7 @@ class Booking extends CommonObject // phpcs:enable if (empty($this->labelStatus) || empty($this->labelStatusShort)) { global $langs; - //$langs->load("bookcal@bookcal"); + //$langs->load("agenda"); $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft'); $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled'); $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled'); @@ -944,7 +944,7 @@ class Booking extends CommonObject public function getNextNumRef() { global $langs, $conf; - $langs->load("bookcal@bookcal"); + $langs->load("agenda"); if (empty($conf->global->BOOKCAL_BOOKING_ADDON)) { $conf->global->BOOKCAL_BOOKING_ADDON = 'mod_booking_standard'; @@ -1009,7 +1009,7 @@ class Booking extends CommonObject $result = 0; $includedocgeneration = 0; - $langs->load("bookcal@bookcal"); + $langs->load("agenda"); if (!dol_strlen($modele)) { $modele = 'standard_booking'; diff --git a/htdocs/bookcal/lib/bookcal.lib.php b/htdocs/bookcal/lib/bookcal.lib.php index bc60468fb1d..3f809da08d8 100644 --- a/htdocs/bookcal/lib/bookcal.lib.php +++ b/htdocs/bookcal/lib/bookcal.lib.php @@ -30,7 +30,7 @@ function bookcalAdminPrepareHead() { global $langs, $conf; - $langs->load("bookcal@bookcal"); + $langs->load("agenda"); $h = 0; $head = array(); @@ -47,11 +47,6 @@ function bookcalAdminPrepareHead() $h++; */ - $head[$h][0] = dol_buildpath("/bookcal/admin/about.php", 1); - $head[$h][1] = $langs->trans("About"); - $head[$h][2] = 'about'; - $h++; - // Show more tabs from modules // Entries must be declared in modules descriptor with line //$this->tabs = array( diff --git a/htdocs/bookcal/lib/bookcal_availabilities.lib.php b/htdocs/bookcal/lib/bookcal_availabilities.lib.php index 83d204a2d76..1fb4b2aed75 100644 --- a/htdocs/bookcal/lib/bookcal_availabilities.lib.php +++ b/htdocs/bookcal/lib/bookcal_availabilities.lib.php @@ -31,7 +31,7 @@ function availabilitiesPrepareHead($object) { global $db, $langs, $conf; - $langs->load("bookcal@bookcal"); + $langs->load("agenda"); $showtabofpagecontact = 1; $showtabofpagenote = 1; diff --git a/htdocs/bookcal/lib/bookcal_booking.lib.php b/htdocs/bookcal/lib/bookcal_booking.lib.php index a6cb0e50df6..c0dec7d6d2e 100644 --- a/htdocs/bookcal/lib/bookcal_booking.lib.php +++ b/htdocs/bookcal/lib/bookcal_booking.lib.php @@ -31,7 +31,7 @@ function bookingPrepareHead($object) { global $db, $langs, $conf; - $langs->load("bookcal@bookcal"); + $langs->load("agenda"); $showtabofpagecontact = 1; $showtabofpagenote = 1; diff --git a/htdocs/comm/action/index.php b/htdocs/comm/action/index.php index 8ec011f5e9d..e730243bfbf 100644 --- a/htdocs/comm/action/index.php +++ b/htdocs/comm/action/index.php @@ -1945,7 +1945,7 @@ function show_day_events($db, $day, $month, $year, $monthshown, $style, &$eventa } $listofusertoshow = ''; - $listofusertoshow .= '
    '.$cacheusers[$tmpid]->getNomUrl(-1, '', 0, 0, 0, 0, '', 'paddingright valigntextbottom'); + $listofusertoshow .= '
    '.$cacheusers[$tmpid]->getNomUrl(-1, '', 0, 0, 0, 0, '', 'paddingright valignmiddle'); print $listofusertoshow; } else { // Other calendar // Picto @@ -2020,7 +2020,7 @@ function show_day_events($db, $day, $month, $year, $monthshown, $style, &$eventa $cacheusers[$tmpid] = $newuser; } - $listofusertoshow .= $cacheusers[$tmpid]->getNomUrl(-3, '', 0, 0, 0, 0, '', 'paddingright valigntextbottom'); + $listofusertoshow .= $cacheusers[$tmpid]->getNomUrl(-3, '', 0, 0, 0, 0, '', 'valignmiddle'); } print $titletoshow; @@ -2070,7 +2070,7 @@ function show_day_events($db, $day, $month, $year, $monthshown, $style, &$eventa $linerelatedto .= dolGetElementUrl($event->fk_element, $event->elementtype, 1); } if ($linerelatedto) { - print '
    '.$linerelatedto; + print ' '.$linerelatedto; } } diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 82d3d263e21..b998fcbd71a 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -7858,30 +7858,34 @@ abstract class CommonObject /** * Return validation test result for a field * - * @param array $val Array of properties of field to show + * @param array $fields Array of properties of field to show * @param string $fieldKey Key of attribute * @param string $fieldValue value of attribute * @return bool return false if fail true on success, see $this->error for error message */ - public function validateField($val, $fieldKey, $fieldValue) + public function validateField($fields, $fieldKey, $fieldValue) { global $langs; - if (!class_exists('Validate')) { require_once DOL_DOCUMENT_ROOT . '/core/class/validate.class.php'; } + if (!class_exists('Validate')) { + require_once DOL_DOCUMENT_ROOT . '/core/class/validate.class.php'; + } $this->clearFieldError($fieldKey); - if (!isset($val[$fieldKey])) { + if (!isset($fields[$fieldKey])) { $this->setFieldError($fieldKey, $langs->trans('FieldNotFoundInObject')); return false; } + $val = $fields[$fieldKey]; + $param = array(); $param['options'] = array(); - $type = $val[$fieldKey]['type']; + $type = $val['type']; $required = false; - if (isset($val[$fieldKey]['notnull']) && $val[$fieldKey]['notnull'] === 1) { + if (isset($val['notnull']) && $val['notnull'] === 1) { // 'notnull' is set to 1 if not null in database. Set to -1 if we must set data to null if empty ('' or 0). $required = true; } @@ -7892,6 +7896,7 @@ abstract class CommonObject // // PREPARE Elements // + $reg = array(); // Convert var to be able to share same code than showOutputField of extrafields if (preg_match('/varchar\((\d+)\)/', $type, $reg)) { @@ -7905,7 +7910,7 @@ abstract class CommonObject $type = 'select'; } - if (preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg)) { + if (!empty($val['type']) && preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg)) { $type = 'link'; } diff --git a/htdocs/core/modules/modBookCal.class.php b/htdocs/core/modules/modBookCal.class.php index c3066dbd2e0..6e3d6768206 100644 --- a/htdocs/core/modules/modBookCal.class.php +++ b/htdocs/core/modules/modBookCal.class.php @@ -40,11 +40,12 @@ class modBookCal extends DolibarrModules public function __construct($db) { global $langs, $conf; + $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 = 500000; // TODO Go on page https://wiki.dolibarr.org/index.php/List_of_modules_id to reserve an id number for your module + $this->numero = 2430; // Key text used to identify module (for permissions, menus, etc...) $this->rights_class = 'bookcal'; @@ -76,7 +77,7 @@ class modBookCal extends DolibarrModules // 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' // To use a supported fa-xxx css style of font awesome, use this->picto='xxx' - $this->picto = 'fa-generic'; + $this->picto = 'fa-calendar-check'; // Define some features supported by module (triggers, login, substitutions, menus, css, etc...) $this->module_parts = array( @@ -463,8 +464,7 @@ class modBookCal extends DolibarrModules { global $conf, $langs; - //$result = $this->_load_tables('/install/mysql/', 'bookcal'); - $result = $this->_load_tables('/bookcal/sql/'); + $result = $this->_load_tables('/install/mysql/', 'bookcal'); if ($result < 0) { return -1; // Do not activate module if error 'not allowed' returned when loading module SQL queries (the _load_table run sql with run_sql with the error allowed parameter set to 'default') } diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 934464db3de..8e0acd832d5 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -645,6 +645,8 @@ Module2300Name=Scheduled jobs Module2300Desc=Scheduled jobs management (alias cron or chrono table) Module2400Name=Events/Agenda Module2400Desc=Track events. Log automatic events for tracking purposes or record manual events or meetings. This is the principal module for good Customer or Vendor Relationship Management. +Module2430Name=Booking Calendar System +Module2430Desc=Provide an online calendar to allow anyone to book rendez-vous, according to predefined ranges or availabilities. Module2500Name=DMS / ECM Module2500Desc=Document Management System / Electronic Content Management. Automatic organization of your generated or stored documents. Share them when you need. Module2600Name=API / Web services (SOAP server) diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 98b2bec97a0..29f400fc778 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -2763,11 +2763,13 @@ class Societe extends CommonObject $linkclose .= ' alt="'.dol_escape_htmltag($label, 1).'"'; } $linkclose .= ' title="'.dol_escape_htmltag($label, 1).'"'; - $linkclose .= ' class="classfortooltip refurl"'; + $linkclose .= ' class="classfortooltip refurl valignmiddle"'; $target_value = array('_self', '_blank', '_parent', '_top'); if (in_array($target, $target_value)) { $linkclose .= ' target="'.dol_escape_htmltag($target).'"'; } + } else { + $linkclose .= ' class="valignmiddle"'; } $linkstart .= $linkclose.'>'; $linkend = ''; From b2d9ade2d34443e48a0aeca8ce212b0d0f1d501a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 19 Jan 2023 01:26:59 +0100 Subject: [PATCH 0931/1128] Fix bad test --- htdocs/comm/action/peruser.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/comm/action/peruser.php b/htdocs/comm/action/peruser.php index 0ee3b6db4a1..fda36284add 100644 --- a/htdocs/comm/action/peruser.php +++ b/htdocs/comm/action/peruser.php @@ -628,10 +628,11 @@ if ($mode == 'show_day') { if ($type) { $sql .= " AND ca.id = ".((int) $type); } +var_dump($status); if ($status == '0') { $sql .= " AND a.percent = 0"; } -if ($status == '-1' || $status == 'na') { +if ($status === 'na') { // Not applicable $sql .= " AND a.percent = -1"; } @@ -658,7 +659,7 @@ if ($filtert > 0 || $usergroup > 0) { } // Sort on date $sql .= ' ORDER BY fk_user_action, datep'; //fk_user_action - +print $sql; dol_syslog("comm/action/peruser.php", LOG_DEBUG); $resql = $db->query($sql); From df345945ad67794f9310f206f7b714d18ca1248f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 19 Jan 2023 01:28:04 +0100 Subject: [PATCH 0932/1128] Fix regression --- htdocs/comm/action/peruser.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/htdocs/comm/action/peruser.php b/htdocs/comm/action/peruser.php index fda36284add..bf0747a2582 100644 --- a/htdocs/comm/action/peruser.php +++ b/htdocs/comm/action/peruser.php @@ -628,7 +628,6 @@ if ($mode == 'show_day') { if ($type) { $sql .= " AND ca.id = ".((int) $type); } -var_dump($status); if ($status == '0') { $sql .= " AND a.percent = 0"; } @@ -659,7 +658,6 @@ if ($filtert > 0 || $usergroup > 0) { } // Sort on date $sql .= ' ORDER BY fk_user_action, datep'; //fk_user_action -print $sql; dol_syslog("comm/action/peruser.php", LOG_DEBUG); $resql = $db->query($sql); From d3c4255e0e12a16228a67ce135ab8ab34f9847c6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 19 Jan 2023 01:28:48 +0100 Subject: [PATCH 0933/1128] Fix bad test --- htdocs/comm/action/peruser.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/comm/action/peruser.php b/htdocs/comm/action/peruser.php index 5c5ef948c30..c6c91228af0 100644 --- a/htdocs/comm/action/peruser.php +++ b/htdocs/comm/action/peruser.php @@ -628,7 +628,7 @@ if ($type) { if ($status == '0') { $sql .= " AND a.percent = 0"; } -if ($status == '-1' || $status == 'na') { +if ($status == 'na') { // Not applicable $sql .= " AND a.percent = -1"; } From a6936a0b6a5f3b3b323befaf212d95baa1227e2d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 19 Jan 2023 02:26:24 +0100 Subject: [PATCH 0934/1128] Debug v17 --- htdocs/comm/action/list.php | 5 +- htdocs/comm/action/pertype.php | 88 ++++++++++++++++++---------------- htdocs/comm/action/peruser.php | 53 ++++++++++++-------- 3 files changed, 81 insertions(+), 65 deletions(-) diff --git a/htdocs/comm/action/list.php b/htdocs/comm/action/list.php index ab2037d5f76..8807ccd4764 100644 --- a/htdocs/comm/action/list.php +++ b/htdocs/comm/action/list.php @@ -795,9 +795,8 @@ if (!empty($arrayfields['a.tms']['checked'])) { print '
    '; } if (!empty($arrayfields['a.percent']['checked'])) { - print ''; } // Action column diff --git a/htdocs/comm/action/pertype.php b/htdocs/comm/action/pertype.php index c13de5fb183..9d3bd0044e4 100644 --- a/htdocs/comm/action/pertype.php +++ b/htdocs/comm/action/pertype.php @@ -63,23 +63,19 @@ if (empty($filtert) && empty($conf->global->AGENDA_ALL_CALENDARS)) { // Sorting $sortfield = GETPOST('sortfield', 'aZ09comma'); -if (!$sortfield) { - $sortfield = "a.datec"; -} - $sortorder = GETPOST('sortorder', 'aZ09comma'); -if (!$sortorder) { - $sortorder = "ASC"; -} - -// Page $page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int'); if (empty($page) || $page == -1) { $page = 0; } // If $page is not defined, or '' or -1 $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit; $offset = $limit * $page; - +if (!$sortorder) { + $sortorder = "ASC"; +} +if (!$sortfield) { + $sortfield = "a.datec"; +} // Security check @@ -110,14 +106,14 @@ $month = GETPOST("month", "int") ? GETPOST("month", "int") : date("m"); $week = GETPOST("week", "int") ? GETPOST("week", "int") : date("W"); $day = GETPOST("day", "int") ? GETPOST("day", "int") : date("d"); $pid = GETPOSTISSET("search_projectid") ? GETPOST("search_projectid", "int", 3) : GETPOST("projectid", "int", 3); -$status = GETPOSTISSET("search_status") ? GETPOST("search_status", 'alpha') : GETPOST("status", 'alpha'); +$status = GETPOSTISSET("search_status") ? GETPOST("search_status", 'aZ09') : GETPOST("status", 'aZ09'); $type = GETPOSTISSET("search_type") ? GETPOST("search_type", 'alpha') : GETPOST("type", 'alpha'); $maxprint = ((GETPOST("maxprint", 'int') != '') ? GETPOST("maxprint", 'int') : $conf->global->AGENDA_MAX_EVENTS_DAY_VIEW); $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print') // Set actioncode (this code must be same for setting actioncode into peruser, listacton and index) -if (GETPOST('search_actioncode', 'array')) { - $actioncode = GETPOST('search_actioncode', 'array', 3); +if (GETPOST('search_actioncode', 'array:aZ09')) { + $actioncode = GETPOST('search_actioncode', 'array:aZ09', 3); if (!count($actioncode)) { $actioncode = '0'; } @@ -321,7 +317,7 @@ if ($pid) { if ($type) { $param .= "&search_type=".urlencode($type); } -if ($mode == 'show_day' || $mode == 'show_week' || $mode == 'show_month' || $mode != 'show_peruser') { +if ($mode != 'show_pertype') { $param .= '&mode='.urlencode($mode); } if ($begin_h != '') { @@ -356,12 +352,13 @@ $next_year = $year + 1; $next_month = $month; $next_day = $day; -// Define firstdaytoshow and lastdaytoshow (warning: lastdaytoshow is last second to show + 1) +// Define firstdaytoshow and lastdaytoshow. Warning: lastdaytoshow is last second to show + 1 +// $firstdaytoshow and lastdaytoshow become a gmt dates to use to search/compare because first_xxx are in tz idea and we used tzuserrel $firstdaytoshow = dol_mktime(0, 0, 0, $first_month, $first_day, $first_year, 'tzuserrel'); $lastdaytoshow = dol_time_plus_duree($firstdaytoshow, 7, 'd'); //print $firstday.'-'.$first_month.'-'.$first_year; -//print dol_print_date($firstdaytoshow,'dayhour'); -//print dol_print_date($lastdaytoshow,'dayhour'); +//print dol_print_date($firstdaytoshow, 'dayhour', 'gmt'); +//print dol_print_date($lastdaytoshow,'dayhour', 'gmt'); $max_day_in_month = date("t", dol_mktime(0, 0, 0, $month, 1, $year, 'gmt')); @@ -480,7 +477,7 @@ if (empty($reshook)) { $viewmode = $hookmanager->resPrint; } - +$newparam = ''; $newcardbutton = ''; if ($user->rights->agenda->myactions->create || $user->hasRight('agenda', 'allactions', 'create')) { $tmpforcreatebutton = dol_getdate(dol_now(), true); @@ -595,12 +592,12 @@ if ($filtert > 0 || $usergroup > 0) { if ($mode == 'show_day') { $sql .= " AND ("; $sql .= " (a.datep BETWEEN '".$db->idate(dol_mktime(0, 0, 0, $month, $day, $year, 'tzuserrel'))."'"; - $sql .= " AND '".$db->idate(dol_mktime(23, 59, 59, $month, $day, $year))."')"; + $sql .= " AND '".$db->idate(dol_mktime(23, 59, 59, $month, $day, $year, 'tzuserrel'))."')"; $sql .= " OR "; $sql .= " (a.datep2 BETWEEN '".$db->idate(dol_mktime(0, 0, 0, $month, $day, $year, 'tzuserrel'))."'"; - $sql .= " AND '".$db->idate(dol_mktime(23, 59, 59, $month, $day, $year))."')"; + $sql .= " AND '".$db->idate(dol_mktime(23, 59, 59, $month, $day, $year, 'tzuserrel'))."')"; $sql .= " OR "; - $sql .= " (a.datep < '".$db->idate(dol_mktime(0, 0, 0, $month, $day, $year))."'"; + $sql .= " (a.datep < '".$db->idate(dol_mktime(0, 0, 0, $month, $day, $year, 'tzuserrel'))."'"; $sql .= " AND a.datep2 > '".$db->idate(dol_mktime(23, 59, 59, $month, $day, $year, 'tzuserrel'))."')"; $sql .= ')'; } else { @@ -622,12 +619,14 @@ if ($type) { if ($status == '0') { $sql .= " AND a.percent = 0"; } -if ($status == '-1') { +if ($status === 'na') { + // Not applicable $sql .= " AND a.percent = -1"; -} // Not applicable +} if ($status == '50') { + // Running already started $sql .= " AND (a.percent > 0 AND a.percent < 100)"; -} // Running already started +} if ($status == 'done' || $status == '100') { $sql .= " AND (a.percent = 100)"; } @@ -791,8 +790,9 @@ echo ''; //print "begin_d=".$begin_d." end_d=".$end_d; +echo '
    '; -echo '
    '; $searchpicto = $form->showFilterButtons('left'); print $searchpicto; @@ -776,9 +776,9 @@ foreach ($object->fields as $key => $val) { $cssforfield .= ($cssforfield ? ' ' : '').'right'; } if (!empty($arrayfields['t.'.$key]['checked'])) { - print ''; + print ''; if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) { - print $form->selectarray('search_'.$key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), $val['notnull'], 0, 0, '', 1, 0, 0, '', 'maxwidth100'.($key == 'status' ? ' search_status onrightofpage' : ''), 1); + print $form->selectarray('search_'.$key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), $val['notnull'], 0, 0, '', 1, 0, 0, '', 'maxwidth100'.($key == 'status' ? ' search_status width100 onrightofpage' : ''), 1); } elseif ((strpos($val['type'], 'integer:') === 0) || (strpos($val['type'], 'sellist:') === 0)) { print $object->showInputField($val, $key, (isset($search[$key]) ? $search[$key] : ''), '', '', 'search_', $cssforfield.' maxwidth250', 1); } elseif (preg_match('/^(date|timestamp|datetime)/', $val['type'])) { @@ -806,7 +806,7 @@ $parameters = array('arrayfields'=>$arrayfields); $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Action column -if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { +if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { print ''; $searchpicto = $form->showFilterButtons(); print $searchpicto; @@ -820,7 +820,7 @@ $totalarray['nbfield'] = 0; // Fields title label // -------------------------------------------------------------------- print '
    '; if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined $selected = 0; @@ -910,7 +910,7 @@ while ($i < $imaxinloop) { $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; } - if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'ref', 'status'))) { + if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'status')) && empty($val['arrayofkeyval'])) { $cssforfield .= ($cssforfield ? ' ' : '').'right'; } //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100'; @@ -953,7 +953,7 @@ while ($i < $imaxinloop) { $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Action column - if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { print ''; if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined $selected = 0; @@ -984,7 +984,7 @@ if ($num == 0) { $colspan++; } } - print '
    '.$langs->trans("NoRecordFound").'
    '.$langs->trans("NoRecordFound").'
    '; - print ''; + print ''; print ''; - $formactions->form_select_status_action('formaction', $search_status, 1, 'search_status', 1, 2, 'minwidth100imp maxwidth125'); - print ajax_combobox('selectsearch_status'); + print ''; + $formactions->form_select_status_action('formaction', $search_status, 1, 'search_status', 1, 2, 'search_status width100 onrightofpage'); print '
    '; +echo '
    '; echo ''; echo ''; @@ -850,10 +850,11 @@ foreach ($typeofevents as $typeofevent) { // Show days of the current week $curtime = dol_time_plus_duree($firstdaytoshow, $iter_day, 'd'); - $tmparray = dol_getdate($curtime, 'fast'); - $tmpday = $tmparray['mday']; - $tmpmonth = $tmparray['mon']; - $tmpyear = $tmparray['year']; + // $curtime is a gmt time, but we want the day, month, year in user TZ + $tmpday = dol_print_date($curtime, "%d", "tzuserrel"); + $tmpmonth = dol_print_date($curtime, "%m", "tzuserrel"); + $tmpyear = dol_print_date($curtime, "%Y", "tzuserrel"); + //var_dump($curtime.' '.$tmpday.' '.$tmpmonth.' '.$tmpyear); $style = 'cal_current_month'; if ($iter_day == 6) { @@ -878,6 +879,8 @@ foreach ($typeofevents as $typeofevent) { echo "
    \n"; echo "
    "; +echo ''; + if (!empty($conf->global->AGENDA_USE_EVENT_TYPE)) { $langs->load("commercial"); print '
    '.$langs->trans("Legend").':
    '; @@ -987,14 +990,14 @@ function show_day_events_pertype($username, $day, $month, $year, $monthshown, $s // We are in a particular day for $username, now we scan all events foreach ($eventarray as $daykey => $notused) { - $annee = dol_print_date($daykey, '%Y'); - $mois = dol_print_date($daykey, '%m'); - $jour = dol_print_date($daykey, '%d'); + $annee = dol_print_date($daykey, '%Y', 'tzuserrel'); + $mois = dol_print_date($daykey, '%m', 'tzuserrel'); + $jour = dol_print_date($daykey, '%d', 'tzuserrel'); - if ($day == $jour && $month == $mois && $year == $annee) { // Is it the day we are looking for when calling function ? + if ($day == $jour && (int) $month == (int) $mois && $year == $annee) { // Is it the day we are looking for when calling function ? // Scan all event for this date foreach ($eventarray[$daykey] as $index => $event) { - //print $daykey.' '.$year.'-'.$month.'-'.$day.' -> '.$event->id.' '.$index.' '.$annee.'-'.$mois.'-'.$jour."
    \n"; + //print 'daykey='.$daykey.' '.$year.'-'.$month.'-'.$day.' -> '.$event->id.' '.$index.' '.$annee.'-'.$mois.'-'.$jour."
    \n"; //var_dump($event); $keysofuserassigned = array_keys($event->userassigned); @@ -1176,7 +1179,7 @@ function show_day_events_pertype($username, $day, $month, $year, $monthshown, $s } } - // Now output $casesX + // Now output $casesX from start hour to end hour for ($h = $begin_h; $h < $end_h; $h++) { $color1 = ''; $color2 = ''; $style1 = ''; $style2 = ''; @@ -1217,11 +1220,12 @@ function show_day_events_pertype($username, $day, $month, $year, $monthshown, $s } } - $ids1 = ''; $ids2 = ''; - if (count($cases1[$h]) && array_keys($cases1[$h])) { + $ids1 = ''; + $ids2 = ''; + if (!empty($cases1[$h]) && is_array($cases1[$h]) && count($cases1[$h]) && array_keys($cases1[$h])) { $ids1 = join(',', array_keys($cases1[$h])); } - if (count($cases2[$h]) && array_keys($cases2[$h])) { + if (!empty($cases2[$h]) && is_array($cases2[$h]) && count($cases2[$h]) && array_keys($cases2[$h])) { $ids2 = join(',', array_keys($cases2[$h])); } @@ -1230,7 +1234,7 @@ function show_day_events_pertype($username, $day, $month, $year, $monthshown, $s } else { echo '
    '; } - if (count($cases1[$h]) == 1) { // only 1 event + if (!empty($cases1[$h]) && is_array($cases1[$h]) && count($cases1[$h]) == 1) { // only 1 event $output = array_slice($cases1[$h], 0, 1); $title1 = $langs->trans("Ref").' '.$ids1.($title1 ? ' - '.$title1 : ''); if ($output[0]['string']) { @@ -1239,12 +1243,12 @@ function show_day_events_pertype($username, $day, $month, $year, $monthshown, $s if ($output[0]['color']) { $color1 = $output[0]['color']; } - } elseif (count($cases1[$h]) > 1) { + } elseif (!empty($cases1[$h]) && is_array($cases1[$h]) && count($cases1[$h]) > 1) { $title1 = $langs->trans("Ref").' '.$ids1.($title1 ? ' - '.$title1 : ''); $color1 = '222222'; } - if (count($cases2[$h]) == 1) { // only 1 event + if (!empty($cases2[$h]) && is_array($cases2[$h]) && count($cases2[$h]) == 1) { // only 1 event $output = array_slice($cases2[$h], 0, 1); $title2 = $langs->trans("Ref").' '.$ids2.($title2 ? ' - '.$title2 : ''); if ($output[0]['string']) { @@ -1253,7 +1257,7 @@ function show_day_events_pertype($username, $day, $month, $year, $monthshown, $s if ($output[0]['color']) { $color2 = $output[0]['color']; } - } elseif (count($cases2[$h]) > 1) { + } elseif (!empty($cases2[$h]) && is_array($cases2[$h]) && count($cases2[$h]) > 1) { $title2 = $langs->trans("Ref").' '.$ids2.($title2 ? ' - '.$title2 : ''); $color2 = '222222'; } diff --git a/htdocs/comm/action/peruser.php b/htdocs/comm/action/peruser.php index bf0747a2582..1ae651dae6d 100644 --- a/htdocs/comm/action/peruser.php +++ b/htdocs/comm/action/peruser.php @@ -349,14 +349,14 @@ $next_year = $next['year']; $next_month = $next['month']; $next_day = $next['day']; -// Define firstdaytoshow and lastdaytoshow (warning: lastdaytoshow is last second to show + 1) -$firstdaytoshow = dol_mktime(0, 0, 0, $first_month, $first_day, $first_year, 'gmt'); - +// Define firstdaytoshow and lastdaytoshow. Warning: lastdaytoshow is last second to show + 1 +// $firstdaytoshow and lastdaytoshow become a gmt dates to use to search/compare because first_xxx are in tz idea and we used tzuserrel +$firstdaytoshow = dol_mktime(0, 0, 0, $first_month, $first_day, $first_year, 'tzuserrel'); $nb_weeks_to_show = (!empty($conf->global->AGENDA_NB_WEEKS_IN_VIEW_PER_USER)) ? ((int) $conf->global->AGENDA_NB_WEEKS_IN_VIEW_PER_USER * 7) : 7; $lastdaytoshow = dol_time_plus_duree($firstdaytoshow, $nb_weeks_to_show, 'd'); //print $firstday.'-'.$first_month.'-'.$first_year; -//print dol_print_date($firstdaytoshow,'dayhour'); -//print dol_print_date($lastdaytoshow,'dayhour'); +//print dol_print_date($firstdaytoshow, 'dayhour', 'gmt'); +//print dol_print_date($lastdaytoshow,'dayhour', 'gmt'); $max_day_in_month = date("t", dol_mktime(0, 0, 0, $month, 1, $year, 'gmt')); @@ -658,6 +658,7 @@ if ($filtert > 0 || $usergroup > 0) { } // Sort on date $sql .= ' ORDER BY fk_user_action, datep'; //fk_user_action +//print $sql; dol_syslog("comm/action/peruser.php", LOG_DEBUG); $resql = $db->query($sql); @@ -667,6 +668,7 @@ if ($resql) { $i = 0; while ($i < $num) { $obj = $db->fetch_object($resql); + //print $obj->fk_user_action.' '.$obj->id."
    "; // Discard auto action if option is on if (!empty($conf->global->AGENDA_ALWAYS_HIDE_AUTO) && $obj->code == 'AC_OTH_AUTO') { @@ -677,6 +679,7 @@ if ($resql) { $datep = $db->jdate($obj->datep); $datep2 = $db->jdate($obj->datep2); + // Create a new object action $event = new ActionComm($db); $event->id = $obj->id; @@ -719,13 +722,15 @@ if ($resql) { } } + //print '
    '.$i.' - eventid='.$event->id.' '.dol_print_date($event->date_start_in_calendar, 'dayhour').' '.dol_print_date($firstdaytoshow, 'dayhour').' - '.dol_print_date($event->date_end_in_calendar, 'dayhour').' '.dol_print_date($lastdaytoshow, 'dayhour').'
    '."\n"; + // Check values if ($event->date_end_in_calendar < $firstdaytoshow || $event->date_start_in_calendar >= $lastdaytoshow) { // This record is out of visible range unset($event); } else { - //print $i.' - '.dol_print_date($this->date_start_in_calendar, 'dayhour').' - '.dol_print_date($this->date_end_in_calendar, 'dayhour').'
    '."\n"; + //print $i.' - eventid='.$event->id.' '.dol_print_date($event->date_start_in_calendar, 'dayhour').' - '.dol_print_date($event->date_end_in_calendar, 'dayhour').'
    '."\n"; $event->fetch_userassigned(); // This load $event->userassigned if ($event->date_start_in_calendar < $firstdaytoshow) { @@ -746,7 +751,7 @@ if ($resql) { $loop = true; $j = 0; $daykey = dol_mktime(0, 0, 0, $mois, $jour, $annee, 'gmt'); do { - //if ($event->id==408) print 'daykey='.$daykey.' '.$event->datep.' '.$event->datef.'
    '; + //print 'Add event into eventarray for daykey='.$daykey.'='.dol_print_date($daykey, 'dayhour', 'gmt').' '.$event->id.' '.$event->datep.' '.$event->datef.'
    '; $eventarray[$daykey][] = $event; $j++; @@ -804,6 +809,7 @@ echo ''; $currentdaytoshow = $firstdaytoshow; echo '
    '; +//print dol_print_date($currentdaytoshow, 'dayhour', 'gmt'); while ($currentdaytoshow < $lastdaytoshow) { echo ''; @@ -855,9 +861,9 @@ while ($currentdaytoshow < $lastdaytoshow) { echo ''.$langs->trans("Day".(($i + (isset($conf->global->MAIN_START_WEEK) ? $conf->global->MAIN_START_WEEK : 1)) % 7)).''; print "
    "; if ($i) { - print dol_print_date(dol_time_plus_duree($currentdaytoshow, $i, 'd'), 'day'); + print dol_print_date(dol_time_plus_duree($currentdaytoshow, $i, 'd'), 'day', 'tzuserrel'); } else { - print dol_print_date($currentdaytoshow, 'day'); + print dol_print_date($currentdaytoshow, 'day', 'tzuserrel'); } echo "\n"; $i++; @@ -978,6 +984,8 @@ while ($currentdaytoshow < $lastdaytoshow) { $showheader = true; $var = false; foreach ($usernames as $username) { + //if ($username->login != 'admin') continue; + $var = !$var; echo ""; echo '
    '; @@ -995,10 +1003,10 @@ while ($currentdaytoshow < $lastdaytoshow) { // Show days of the current week $curtime = dol_time_plus_duree($currentdaytoshow, $iter_day, 'd'); - $tmparray = dol_getdate($curtime, 'fast'); - $tmpday = $tmparray['mday']; - $tmpmonth = $tmparray['mon']; - $tmpyear = $tmparray['year']; + // $curtime is a gmt time, but we want the day, month, year in user TZ + $tmpday = dol_print_date($curtime, "%d", "tzuserrel"); + $tmpmonth = dol_print_date($curtime, "%m", "tzuserrel"); + $tmpyear = dol_print_date($curtime, "%Y", "tzuserrel"); //var_dump($curtime.' '.$tmpday.' '.$tmpmonth.' '.$tmpyear); $style = 'cal_current_month'; @@ -1136,17 +1144,22 @@ function show_day_events2($username, $day, $month, $year, $monthshown, $style, & //if ($username->id && $day==1) { //var_dump($eventarray); //} + //var_dump("------ username=".$username->login." for day=".$day); // We are in a particular day for $username, now we scan all events foreach ($eventarray as $daykey => $notused) { - $annee = dol_print_date($daykey, '%Y'); - $mois = dol_print_date($daykey, '%m'); - $jour = dol_print_date($daykey, '%d'); + $annee = dol_print_date($daykey, '%Y', 'tzuserrel'); + $mois = dol_print_date($daykey, '%m', 'tzuserrel'); + $jour = dol_print_date($daykey, '%d', 'tzuserrel'); + //var_dump("daykey=$daykey day=$day jour=$jour, month=$month mois=$mois, year=$year annee=$annee"); + + + if ($day == $jour && (int) $month == (int) $mois && $year == $annee) { // Is it the day we are looking for when calling function ? + //var_dump("day=$day jour=$jour month=$month mois=$mois year=$year annee=$annee"); - if ($day == $jour && $month == $mois && $year == $annee) { // Is it the day we are looking for when calling function ? // Scan all event for this date foreach ($eventarray[$daykey] as $index => $event) { - //print $daykey.' '.dol_print_date($daykey, 'dayhour', 'gmt').' '.$year.'-'.$month.'-'.$day.' -> '.$event->id.' '.$index.' '.$annee.'-'.$mois.'-'.$jour."
    \n"; + //print 'daykey='.$daykey.'='.dol_print_date($daykey, 'dayhour', 'gmt').' '.$year.'-'.$month.'-'.$day.' -> This event: '.$event->id.' '.$index.' is open for this daykey '.$annee.'-'.$mois.'-'.$jour."
    \n"; //var_dump($event); $keysofuserassigned = array_keys($event->userassigned); @@ -1355,7 +1368,7 @@ function show_day_events2($username, $day, $month, $year, $monthshown, $style, & } } - // Now output $casesX + // Now output $casesX from start hour to end hour for ($h = $begin_h; $h < $end_h; $h++) { $color1 = ''; $color2 = ''; $style1 = ''; $style2 = ''; @@ -1437,7 +1450,7 @@ function show_day_events2($username, $day, $month, $year, $monthshown, $style, & $title2 = $langs->trans("Ref").' '.$ids2.($title2 ? ' - '.$title2 : ''); $color2 = '222222'; } - print ''; + print '
    '; print ''; } if (!empty($arrayfields['a.percent']['checked'])) { - print ''; } // Action column diff --git a/htdocs/comm/action/pertype.php b/htdocs/comm/action/pertype.php index 61092df5665..7fe8f8108ed 100644 --- a/htdocs/comm/action/pertype.php +++ b/htdocs/comm/action/pertype.php @@ -63,23 +63,19 @@ if (empty($filtert) && empty($conf->global->AGENDA_ALL_CALENDARS)) { // Sorting $sortfield = GETPOST('sortfield', 'aZ09comma'); -if (!$sortfield) { - $sortfield = "a.datec"; -} - $sortorder = GETPOST('sortorder', 'aZ09comma'); -if (!$sortorder) { - $sortorder = "ASC"; -} - -// Page $page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int'); if (empty($page) || $page == -1) { $page = 0; } // If $page is not defined, or '' or -1 $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit; $offset = $limit * $page; - +if (!$sortorder) { + $sortorder = "ASC"; +} +if (!$sortfield) { + $sortfield = "a.datec"; +} // Security check @@ -110,14 +106,14 @@ $month = GETPOST("month", "int") ? GETPOST("month", "int") : date("m"); $week = GETPOST("week", "int") ? GETPOST("week", "int") : date("W"); $day = GETPOST("day", "int") ? GETPOST("day", "int") : date("d"); $pid = GETPOSTISSET("search_projectid") ? GETPOST("search_projectid", "int", 3) : GETPOST("projectid", "int", 3); -$status = GETPOSTISSET("search_status") ? GETPOST("search_status", 'alpha') : GETPOST("status", 'alpha'); +$status = GETPOSTISSET("search_status") ? GETPOST("search_status", 'aZ09') : GETPOST("status", 'aZ09'); $type = GETPOSTISSET("search_type") ? GETPOST("search_type", 'alpha') : GETPOST("type", 'alpha'); $maxprint = ((GETPOST("maxprint", 'int') != '') ? GETPOST("maxprint", 'int') : $conf->global->AGENDA_MAX_EVENTS_DAY_VIEW); $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print') // Set actioncode (this code must be same for setting actioncode into peruser, listacton and index) -if (GETPOST('search_actioncode', 'array')) { - $actioncode = GETPOST('search_actioncode', 'array', 3); +if (GETPOST('search_actioncode', 'array:aZ09')) { + $actioncode = GETPOST('search_actioncode', 'array:aZ09', 3); if (!count($actioncode)) { $actioncode = '0'; } @@ -321,7 +317,7 @@ if ($pid) { if ($type) { $param .= "&search_type=".urlencode($type); } -if ($mode == 'show_day' || $mode == 'show_week' || $mode == 'show_month' || $mode != 'show_peruser') { +if ($mode != 'show_pertype') { $param .= '&mode='.urlencode($mode); } if ($begin_h != '') { @@ -356,12 +352,13 @@ $next_year = $year + 1; $next_month = $month; $next_day = $day; -// Define firstdaytoshow and lastdaytoshow (warning: lastdaytoshow is last second to show + 1) +// Define firstdaytoshow and lastdaytoshow. Warning: lastdaytoshow is last second to show + 1 +// $firstdaytoshow and lastdaytoshow become a gmt dates to use to search/compare because first_xxx are in tz idea and we used tzuserrel $firstdaytoshow = dol_mktime(0, 0, 0, $first_month, $first_day, $first_year, 'tzuserrel'); $lastdaytoshow = dol_time_plus_duree($firstdaytoshow, 7, 'd'); //print $firstday.'-'.$first_month.'-'.$first_year; -//print dol_print_date($firstdaytoshow,'dayhour'); -//print dol_print_date($lastdaytoshow,'dayhour'); +//print dol_print_date($firstdaytoshow, 'dayhour', 'gmt'); +//print dol_print_date($lastdaytoshow,'dayhour', 'gmt'); $max_day_in_month = date("t", dol_mktime(0, 0, 0, $month, 1, $year, 'gmt')); @@ -477,7 +474,7 @@ if (empty($reshook)) { $viewmode = $hookmanager->resPrint; } - +$newparam = ''; $newcardbutton = ''; if ($user->rights->agenda->myactions->create || $user->rights->agenda->allactions->create) { $tmpforcreatebutton = dol_getdate(dol_now(), true); @@ -592,12 +589,12 @@ if ($filtert > 0 || $usergroup > 0) { if ($mode == 'show_day') { $sql .= " AND ("; $sql .= " (a.datep BETWEEN '".$db->idate(dol_mktime(0, 0, 0, $month, $day, $year, 'tzuserrel'))."'"; - $sql .= " AND '".$db->idate(dol_mktime(23, 59, 59, $month, $day, $year))."')"; + $sql .= " AND '".$db->idate(dol_mktime(23, 59, 59, $month, $day, $year, 'tzuserrel'))."')"; $sql .= " OR "; $sql .= " (a.datep2 BETWEEN '".$db->idate(dol_mktime(0, 0, 0, $month, $day, $year, 'tzuserrel'))."'"; - $sql .= " AND '".$db->idate(dol_mktime(23, 59, 59, $month, $day, $year))."')"; + $sql .= " AND '".$db->idate(dol_mktime(23, 59, 59, $month, $day, $year, 'tzuserrel'))."')"; $sql .= " OR "; - $sql .= " (a.datep < '".$db->idate(dol_mktime(0, 0, 0, $month, $day, $year))."'"; + $sql .= " (a.datep < '".$db->idate(dol_mktime(0, 0, 0, $month, $day, $year, 'tzuserrel'))."'"; $sql .= " AND a.datep2 > '".$db->idate(dol_mktime(23, 59, 59, $month, $day, $year, 'tzuserrel'))."')"; $sql .= ')'; } else { @@ -619,12 +616,14 @@ if ($type) { if ($status == '0') { $sql .= " AND a.percent = 0"; } -if ($status == '-1') { +if ($status === 'na') { + // Not applicable $sql .= " AND a.percent = -1"; -} // Not applicable +} if ($status == '50') { + // Running already started $sql .= " AND (a.percent > 0 AND a.percent < 100)"; -} // Running already started +} if ($status == 'done' || $status == '100') { $sql .= " AND (a.percent = 100)"; } @@ -788,8 +787,9 @@ echo ''; //print "begin_d=".$begin_d." end_d=".$end_d; +echo '
    '; -echo '
    Date: Thu, 19 Jan 2023 02:26:24 +0100 Subject: [PATCH 0935/1128] Debug v17 --- htdocs/comm/action/list.php | 5 +- htdocs/comm/action/pertype.php | 88 ++++++++++++++++++---------------- htdocs/comm/action/peruser.php | 53 ++++++++++++-------- 3 files changed, 81 insertions(+), 65 deletions(-) diff --git a/htdocs/comm/action/list.php b/htdocs/comm/action/list.php index 5eb538d4e62..4ff5c864908 100644 --- a/htdocs/comm/action/list.php +++ b/htdocs/comm/action/list.php @@ -795,9 +795,8 @@ if (!empty($arrayfields['a.tms']['checked'])) { print ''; - $formactions->form_select_status_action('formaction', $search_status, 1, 'search_status', 1, 2, 'minwidth100imp maxwidth125'); - print ajax_combobox('selectsearch_status'); + print ''; + $formactions->form_select_status_action('formaction', $search_status, 1, 'search_status', 1, 2, 'search_status width100 onrightofpage'); print '
    '; +echo '
    '; echo ''; echo ''; @@ -847,10 +847,11 @@ foreach ($typeofevents as $typeofevent) { // Show days of the current week $curtime = dol_time_plus_duree($firstdaytoshow, $iter_day, 'd'); - $tmparray = dol_getdate($curtime, 'fast'); - $tmpday = $tmparray['mday']; - $tmpmonth = $tmparray['mon']; - $tmpyear = $tmparray['year']; + // $curtime is a gmt time, but we want the day, month, year in user TZ + $tmpday = dol_print_date($curtime, "%d", "tzuserrel"); + $tmpmonth = dol_print_date($curtime, "%m", "tzuserrel"); + $tmpyear = dol_print_date($curtime, "%Y", "tzuserrel"); + //var_dump($curtime.' '.$tmpday.' '.$tmpmonth.' '.$tmpyear); $style = 'cal_current_month'; if ($iter_day == 6) { @@ -875,6 +876,8 @@ foreach ($typeofevents as $typeofevent) { echo "
    \n"; echo "
    "; +echo ''; + if (!empty($conf->global->AGENDA_USE_EVENT_TYPE)) { $langs->load("commercial"); print '
    '.$langs->trans("Legend").':
    '; @@ -984,14 +987,14 @@ function show_day_events_pertype($username, $day, $month, $year, $monthshown, $s // We are in a particular day for $username, now we scan all events foreach ($eventarray as $daykey => $notused) { - $annee = dol_print_date($daykey, '%Y'); - $mois = dol_print_date($daykey, '%m'); - $jour = dol_print_date($daykey, '%d'); + $annee = dol_print_date($daykey, '%Y', 'tzuserrel'); + $mois = dol_print_date($daykey, '%m', 'tzuserrel'); + $jour = dol_print_date($daykey, '%d', 'tzuserrel'); - if ($day == $jour && $month == $mois && $year == $annee) { // Is it the day we are looking for when calling function ? + if ($day == $jour && (int) $month == (int) $mois && $year == $annee) { // Is it the day we are looking for when calling function ? // Scan all event for this date foreach ($eventarray[$daykey] as $index => $event) { - //print $daykey.' '.$year.'-'.$month.'-'.$day.' -> '.$event->id.' '.$index.' '.$annee.'-'.$mois.'-'.$jour."
    \n"; + //print 'daykey='.$daykey.' '.$year.'-'.$month.'-'.$day.' -> '.$event->id.' '.$index.' '.$annee.'-'.$mois.'-'.$jour."
    \n"; //var_dump($event); $keysofuserassigned = array_keys($event->userassigned); @@ -1173,7 +1176,7 @@ function show_day_events_pertype($username, $day, $month, $year, $monthshown, $s } } - // Now output $casesX + // Now output $casesX from start hour to end hour for ($h = $begin_h; $h < $end_h; $h++) { $color1 = ''; $color2 = ''; $style1 = ''; $style2 = ''; @@ -1214,11 +1217,12 @@ function show_day_events_pertype($username, $day, $month, $year, $monthshown, $s } } - $ids1 = ''; $ids2 = ''; - if (count($cases1[$h]) && array_keys($cases1[$h])) { + $ids1 = ''; + $ids2 = ''; + if (!empty($cases1[$h]) && is_array($cases1[$h]) && count($cases1[$h]) && array_keys($cases1[$h])) { $ids1 = join(',', array_keys($cases1[$h])); } - if (count($cases2[$h]) && array_keys($cases2[$h])) { + if (!empty($cases2[$h]) && is_array($cases2[$h]) && count($cases2[$h]) && array_keys($cases2[$h])) { $ids2 = join(',', array_keys($cases2[$h])); } @@ -1227,7 +1231,7 @@ function show_day_events_pertype($username, $day, $month, $year, $monthshown, $s } else { echo '
    '; } - if (count($cases1[$h]) == 1) { // only 1 event + if (!empty($cases1[$h]) && is_array($cases1[$h]) && count($cases1[$h]) == 1) { // only 1 event $output = array_slice($cases1[$h], 0, 1); $title1 = $langs->trans("Ref").' '.$ids1.($title1 ? ' - '.$title1 : ''); if ($output[0]['string']) { @@ -1236,12 +1240,12 @@ function show_day_events_pertype($username, $day, $month, $year, $monthshown, $s if ($output[0]['color']) { $color1 = $output[0]['color']; } - } elseif (count($cases1[$h]) > 1) { + } elseif (!empty($cases1[$h]) && is_array($cases1[$h]) && count($cases1[$h]) > 1) { $title1 = $langs->trans("Ref").' '.$ids1.($title1 ? ' - '.$title1 : ''); $color1 = '222222'; } - if (count($cases2[$h]) == 1) { // only 1 event + if (!empty($cases2[$h]) && is_array($cases2[$h]) && count($cases2[$h]) == 1) { // only 1 event $output = array_slice($cases2[$h], 0, 1); $title2 = $langs->trans("Ref").' '.$ids2.($title2 ? ' - '.$title2 : ''); if ($output[0]['string']) { @@ -1250,7 +1254,7 @@ function show_day_events_pertype($username, $day, $month, $year, $monthshown, $s if ($output[0]['color']) { $color2 = $output[0]['color']; } - } elseif (count($cases2[$h]) > 1) { + } elseif (!empty($cases2[$h]) && is_array($cases2[$h]) && count($cases2[$h]) > 1) { $title2 = $langs->trans("Ref").' '.$ids2.($title2 ? ' - '.$title2 : ''); $color2 = '222222'; } diff --git a/htdocs/comm/action/peruser.php b/htdocs/comm/action/peruser.php index c6c91228af0..993bc3a908a 100644 --- a/htdocs/comm/action/peruser.php +++ b/htdocs/comm/action/peruser.php @@ -349,14 +349,14 @@ $next_year = $next['year']; $next_month = $next['month']; $next_day = $next['day']; -// Define firstdaytoshow and lastdaytoshow (warning: lastdaytoshow is last second to show + 1) -$firstdaytoshow = dol_mktime(0, 0, 0, $first_month, $first_day, $first_year, 'gmt'); - +// Define firstdaytoshow and lastdaytoshow. Warning: lastdaytoshow is last second to show + 1 +// $firstdaytoshow and lastdaytoshow become a gmt dates to use to search/compare because first_xxx are in tz idea and we used tzuserrel +$firstdaytoshow = dol_mktime(0, 0, 0, $first_month, $first_day, $first_year, 'tzuserrel'); $nb_weeks_to_show = (!empty($conf->global->AGENDA_NB_WEEKS_IN_VIEW_PER_USER)) ? ((int) $conf->global->AGENDA_NB_WEEKS_IN_VIEW_PER_USER * 7) : 7; $lastdaytoshow = dol_time_plus_duree($firstdaytoshow, $nb_weeks_to_show, 'd'); //print $firstday.'-'.$first_month.'-'.$first_year; -//print dol_print_date($firstdaytoshow,'dayhour'); -//print dol_print_date($lastdaytoshow,'dayhour'); +//print dol_print_date($firstdaytoshow, 'dayhour', 'gmt'); +//print dol_print_date($lastdaytoshow,'dayhour', 'gmt'); $max_day_in_month = date("t", dol_mktime(0, 0, 0, $month, 1, $year, 'gmt')); @@ -655,6 +655,7 @@ if ($filtert > 0 || $usergroup > 0) { } // Sort on date $sql .= ' ORDER BY fk_user_action, datep'; //fk_user_action +//print $sql; dol_syslog("comm/action/peruser.php", LOG_DEBUG); @@ -665,6 +666,7 @@ if ($resql) { $i = 0; while ($i < $num) { $obj = $db->fetch_object($resql); + //print $obj->fk_user_action.' '.$obj->id."
    "; // Discard auto action if option is on if (!empty($conf->global->AGENDA_ALWAYS_HIDE_AUTO) && $obj->code == 'AC_OTH_AUTO') { @@ -675,6 +677,7 @@ if ($resql) { $datep = $db->jdate($obj->datep); $datep2 = $db->jdate($obj->datep2); + // Create a new object action $event = new ActionComm($db); $event->id = $obj->id; @@ -717,13 +720,15 @@ if ($resql) { } } + //print '
    '.$i.' - eventid='.$event->id.' '.dol_print_date($event->date_start_in_calendar, 'dayhour').' '.dol_print_date($firstdaytoshow, 'dayhour').' - '.dol_print_date($event->date_end_in_calendar, 'dayhour').' '.dol_print_date($lastdaytoshow, 'dayhour').'
    '."\n"; + // Check values if ($event->date_end_in_calendar < $firstdaytoshow || $event->date_start_in_calendar >= $lastdaytoshow) { // This record is out of visible range unset($event); } else { - //print $i.' - '.dol_print_date($this->date_start_in_calendar, 'dayhour').' - '.dol_print_date($this->date_end_in_calendar, 'dayhour').'
    '."\n"; + //print $i.' - eventid='.$event->id.' '.dol_print_date($event->date_start_in_calendar, 'dayhour').' - '.dol_print_date($event->date_end_in_calendar, 'dayhour').'
    '."\n"; $event->fetch_userassigned(); // This load $event->userassigned if ($event->date_start_in_calendar < $firstdaytoshow) { @@ -744,7 +749,7 @@ if ($resql) { $loop = true; $j = 0; $daykey = dol_mktime(0, 0, 0, $mois, $jour, $annee, 'gmt'); do { - //if ($event->id==408) print 'daykey='.$daykey.' '.$event->datep.' '.$event->datef.'
    '; + //print 'Add event into eventarray for daykey='.$daykey.'='.dol_print_date($daykey, 'dayhour', 'gmt').' '.$event->id.' '.$event->datep.' '.$event->datef.'
    '; $eventarray[$daykey][] = $event; $j++; @@ -802,6 +807,7 @@ echo ''; $currentdaytoshow = $firstdaytoshow; echo '
    '; +//print dol_print_date($currentdaytoshow, 'dayhour', 'gmt'); while ($currentdaytoshow < $lastdaytoshow) { echo ''; @@ -853,9 +859,9 @@ while ($currentdaytoshow < $lastdaytoshow) { echo ''.$langs->trans("Day".(($i + (isset($conf->global->MAIN_START_WEEK) ? $conf->global->MAIN_START_WEEK : 1)) % 7)).''; print "
    "; if ($i) { - print dol_print_date(dol_time_plus_duree($currentdaytoshow, $i, 'd'), 'day'); + print dol_print_date(dol_time_plus_duree($currentdaytoshow, $i, 'd'), 'day', 'tzuserrel'); } else { - print dol_print_date($currentdaytoshow, 'day'); + print dol_print_date($currentdaytoshow, 'day', 'tzuserrel'); } echo "\n"; $i++; @@ -976,6 +982,8 @@ while ($currentdaytoshow < $lastdaytoshow) { $showheader = true; $var = false; foreach ($usernames as $username) { + //if ($username->login != 'admin') continue; + $var = !$var; echo ""; echo ''; // Ref Product - print ''; - // Description + // Description of line print ''; } $db->free($resql); + + if ($num == 0) { + print ''; + } } else { print $db->lasterror(); // Show last sql error } diff --git a/htdocs/accountancy/expensereport/list.php b/htdocs/accountancy/expensereport/list.php index 39508332d40..1cf9149024a 100644 --- a/htdocs/accountancy/expensereport/list.php +++ b/htdocs/accountancy/expensereport/list.php @@ -418,8 +418,8 @@ if ($result) { print_liste_field_titre("Description", $_SERVER["PHP_SELF"], "erd.comments", "", $param, '', $sortfield, $sortorder); print_liste_field_titre("Amount", $_SERVER["PHP_SELF"], "erd.total_ht", "", $param, '', $sortfield, $sortorder, 'right maxwidth50 '); print_liste_field_titre("VATRate", $_SERVER["PHP_SELF"], "erd.tva_tx", "", $param, '', $sortfield, $sortorder, 'right '); - print_liste_field_titre("AccountAccountingSuggest", '', '', '', '', '', '', '', 'nowraponall '); - print_liste_field_titre("IntoAccount", '', '', '', '', '', '', '', ''); + print_liste_field_titre("DataUsedToSuggestAccount", '', '', '', '', '', '', '', 'nowraponall '); + print_liste_field_titre("AccountAccountingSuggest", '', '', '', '', '', '', '', ''); $checkpicto = ''; if ($massactionbutton) { $checkpicto = $form->showCheckAddButtons('checkforselect', 1); diff --git a/htdocs/accountancy/supplier/list.php b/htdocs/accountancy/supplier/list.php index dfd8af7f68f..aae34a51e03 100644 --- a/htdocs/accountancy/supplier/list.php +++ b/htdocs/accountancy/supplier/list.php @@ -111,7 +111,7 @@ if (!isModEnabled('accounting')) { if ($user->socid > 0) { accessforbidden(); } -if (empty($user->rights->accounting->mouvements->lire)) { +if (!$user->hasRight('accounting', 'mouvements', 'lire')) { accessforbidden(); } @@ -531,8 +531,8 @@ if ($result) { print_liste_field_titre("ThirdParty", $_SERVER["PHP_SELF"], "s.nom", "", $param, '', $sortfield, $sortorder); print_liste_field_titre("Country", $_SERVER["PHP_SELF"], "co.label", "", $param, '', $sortfield, $sortorder); print_liste_field_titre("VATIntraShort", $_SERVER["PHP_SELF"], "s.tva_intra", "", $param, '', $sortfield, $sortorder); - print_liste_field_titre("AccountAccountingSuggest", '', '', '', '', '', '', '', 'nowraponall '); - print_liste_field_titre("IntoAccount", '', '', '', '', '', '', '', 'center '); + print_liste_field_titre("DataUsedToSuggestAccount", '', '', '', '', '', '', '', 'nowraponall '); + print_liste_field_titre("AccountAccountingSuggest", '', '', '', '', '', '', '', 'center '); $checkpicto = ''; if ($massactionbutton) { $checkpicto = $form->showCheckAddButtons('checkforselect', 1); @@ -711,14 +711,19 @@ if ($result) { // Found accounts print '"; print ''; // Date End print ""; print ''; // Number of terms diff --git a/htdocs/loan/list.php b/htdocs/loan/list.php index 1225f5304be..b664d784e7e 100644 --- a/htdocs/loan/list.php +++ b/htdocs/loan/list.php @@ -42,6 +42,7 @@ $limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit; $sortfield = GETPOST('sortfield', 'aZ09comma'); $sortorder = GETPOST('sortorder', 'aZ09comma'); $page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int'); +$massaction = GETPOST('massaction', 'alpha'); if (empty($page) || $page == -1 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha') || (empty($toselect) && $massaction === '0')) { $page = 0; } // If $page is not defined, or '' or -1 or if we click on clear filters or if we select empty mass action @@ -148,6 +149,7 @@ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) { } $db->free($resql); } +$arrayfields = array(); // Complete request and execute it with limit $sql .= $db->order($sortfield, $sortorder); diff --git a/htdocs/product/card.php b/htdocs/product/card.php index 8a5aecf1513..ac465b16bd7 100644 --- a/htdocs/product/card.php +++ b/htdocs/product/card.php @@ -1485,7 +1485,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { } } - if ($type == 1 && $conf->workstation->enabled) { + if ($type == 1 && isModEnabled("workstation")) { // Default workstation print ''; - print ''; - // Other attributes - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php'; + print ($res == 0 && $object->status >= $object::STATUS_VALIDATED) ? '' : load_fiche_titre($langs->trans('BOMProductsList'), '', 'product'); - print '
    '; @@ -993,10 +1001,10 @@ while ($currentdaytoshow < $lastdaytoshow) { // Show days of the current week $curtime = dol_time_plus_duree($currentdaytoshow, $iter_day, 'd'); - $tmparray = dol_getdate($curtime, 'fast'); - $tmpday = $tmparray['mday']; - $tmpmonth = $tmparray['mon']; - $tmpyear = $tmparray['year']; + // $curtime is a gmt time, but we want the day, month, year in user TZ + $tmpday = dol_print_date($curtime, "%d", "tzuserrel"); + $tmpmonth = dol_print_date($curtime, "%m", "tzuserrel"); + $tmpyear = dol_print_date($curtime, "%Y", "tzuserrel"); //var_dump($curtime.' '.$tmpday.' '.$tmpmonth.' '.$tmpyear); $style = 'cal_current_month'; @@ -1134,17 +1142,22 @@ function show_day_events2($username, $day, $month, $year, $monthshown, $style, & //if ($username->id && $day==1) { //var_dump($eventarray); //} + //var_dump("------ username=".$username->login." for day=".$day); // We are in a particular day for $username, now we scan all events foreach ($eventarray as $daykey => $notused) { - $annee = dol_print_date($daykey, '%Y'); - $mois = dol_print_date($daykey, '%m'); - $jour = dol_print_date($daykey, '%d'); + $annee = dol_print_date($daykey, '%Y', 'tzuserrel'); + $mois = dol_print_date($daykey, '%m', 'tzuserrel'); + $jour = dol_print_date($daykey, '%d', 'tzuserrel'); + //var_dump("daykey=$daykey day=$day jour=$jour, month=$month mois=$mois, year=$year annee=$annee"); + + + if ($day == $jour && (int) $month == (int) $mois && $year == $annee) { // Is it the day we are looking for when calling function ? + //var_dump("day=$day jour=$jour month=$month mois=$mois year=$year annee=$annee"); - if ($day == $jour && $month == $mois && $year == $annee) { // Is it the day we are looking for when calling function ? // Scan all event for this date foreach ($eventarray[$daykey] as $index => $event) { - //print $daykey.' '.dol_print_date($daykey, 'dayhour', 'gmt').' '.$year.'-'.$month.'-'.$day.' -> '.$event->id.' '.$index.' '.$annee.'-'.$mois.'-'.$jour."
    \n"; + //print 'daykey='.$daykey.'='.dol_print_date($daykey, 'dayhour', 'gmt').' '.$year.'-'.$month.'-'.$day.' -> This event: '.$event->id.' '.$index.' is open for this daykey '.$annee.'-'.$mois.'-'.$jour."
    \n"; //var_dump($event); $keysofuserassigned = array_keys($event->userassigned); @@ -1353,7 +1366,7 @@ function show_day_events2($username, $day, $month, $year, $monthshown, $style, & } } - // Now output $casesX + // Now output $casesX from start hour to end hour for ($h = $begin_h; $h < $end_h; $h++) { $color1 = ''; $color2 = ''; $style1 = ''; $style2 = ''; @@ -1435,7 +1448,7 @@ function show_day_events2($username, $day, $month, $year, $monthshown, $style, & $title2 = $langs->trans("Ref").' '.$ids2.($title2 ? ' - '.$title2 : ''); $color2 = '222222'; } - print ''; + print '
    '; print ''; } // Action column From 79c21e083a42ecaa6ecd67ab91390abad9bd16df Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 19 Jan 2023 14:29:28 +0100 Subject: [PATCH 0945/1128] Fix bad position title lines --- htdocs/contrat/services_list.php | 111 ++++++++++++++++--------------- 1 file changed, 56 insertions(+), 55 deletions(-) diff --git a/htdocs/contrat/services_list.php b/htdocs/contrat/services_list.php index 9b3081a412a..21f49ebc789 100644 --- a/htdocs/contrat/services_list.php +++ b/htdocs/contrat/services_list.php @@ -517,60 +517,6 @@ $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfi print '
    '; print '
    Date: Thu, 19 Jan 2023 11:24:53 +0100 Subject: [PATCH 0936/1128] Harmonize CSS for tables in fichehalfleft/fichehalfright --- htdocs/theme/eldy/global.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 43dfbf67869..1592fed7493 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -3549,7 +3549,7 @@ td.border, div.tagtable div div.border { } -.fichehalfright table.noborder { +.fichehalfright table.noborder , .fichehalfleft table.noborder{ margin: 0px 0px 0px 0px; } table.liste, table.noborder, table.formdoc, div.noborder { From 9e353c328432eaa5b340605f7a5011e90db73cd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Thu, 19 Jan 2023 11:55:41 +0100 Subject: [PATCH 0937/1128] fix undeclared properties --- .../class/companypaymentmode.class.php | 17 +++- htdocs/societe/class/societe.class.php | 95 ++++++++++++------- htdocs/societe/class/societeaccount.class.php | 3 +- 3 files changed, 77 insertions(+), 38 deletions(-) diff --git a/htdocs/societe/class/companypaymentmode.class.php b/htdocs/societe/class/companypaymentmode.class.php index eb77a928f14..1e221695a11 100644 --- a/htdocs/societe/class/companypaymentmode.class.php +++ b/htdocs/societe/class/companypaymentmode.class.php @@ -122,7 +122,7 @@ class CompanyPaymentMode extends CommonObject 'datec' =>array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>1, 'visible'=>-2, 'position'=>20), 'tms' =>array('type'=>'timestamp', 'label'=>'Tms', 'enabled'=>1, 'visible'=>-2, 'notnull'=>1, 'position'=>25), 'import_key' =>array('type'=>'varchar(14)', 'label'=>'Import key', 'enabled'=>1, 'visible'=>-2, 'position'=>105), - //'aaa' =>array('type'=>'date', 'label'=>'Ending date', 'enabled'=>0, 'visible'=>-2, 'position'=>185), + //'aaa' =>array('type'=>'date', 'label'=>'Ending date', 'enabled'=>0, 'visible'=>-2, 'position'=>185), ); /** @@ -146,6 +146,18 @@ class CompanyPaymentMode extends CommonObject public $number; public $cle_rib; public $bic; + + /** + * @var string iban + * @deprecated + * @see iban_prefix + */ + public $iban; + + /** + * iban_prefix + * @var string + */ public $iban_prefix; public $domiciliation; public $proprio; @@ -255,8 +267,7 @@ class CompanyPaymentMode extends CommonObject // Clear fields $object->ref = "copy_of_".$object->ref; - $object->title = $langs->trans("CopyOf")." ".$object->title; - // ... + // $object->title = $langs->trans("CopyOf")." ".$object->title; // Create clone $object->context['createfromclone'] = 'createfromclone'; diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 29f400fc778..c5b8df20d0e 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -15,7 +15,7 @@ * Copyright (C) 2017 Rui Strecht * Copyright (C) 2018 Philippe Grand * Copyright (C) 2019-2020 Josep Lluís Amador - * Copyright (C) 2019-2022 Frédéric France + * Copyright (C) 2019-2023 Frédéric France * Copyright (C) 2020 Open-Dsi * Copyright (C) 2022 ButterflyOfFire * @@ -128,6 +128,22 @@ class Societe extends CommonObject */ public $restrictiononfksoc = 1; + /** + * @var Societe To store a cloned copy of object before to edit it and keep track of old properties + */ + public $oldcopy; + + /** + * array of supplier categories + * @var array + */ + public $SupplierCategories = array(); + + /** + * prefixCustomerIsRequired + * @var int + */ + public $prefixCustomerIsRequired; /** * 'type' field format ('integer', 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter]]', 'sellist:TableName:LabelFieldName[:KeyFieldName[:KeyFieldParent[:Filter]]]', 'varchar(x)', 'double(24,8)', 'real', 'price', 'text', 'text:none', 'html', 'date', 'datetime', 'timestamp', 'duration', 'mail', 'phone', 'url', 'password') @@ -351,12 +367,19 @@ class Societe extends CommonObject * @var string */ public $fax; + /** * Email * @var string */ public $email; + /** + * No Email + * @var int + */ + public $no_email; + /** * @var array array of socialnetworks */ @@ -462,6 +485,12 @@ class Societe extends CommonObject */ public $idprof6; + /** + * Object of company + * @var string + */ + public $object; + /** * @var string Prefix comm */ @@ -4257,14 +4286,14 @@ class Societe extends CommonObject global $langs; $this->id = 0; - $this->name = empty($conf->global->MAIN_INFO_SOCIETE_NOM) ? '' : $conf->global->MAIN_INFO_SOCIETE_NOM; - $this->address = empty($conf->global->MAIN_INFO_SOCIETE_ADDRESS) ? '' : $conf->global->MAIN_INFO_SOCIETE_ADDRESS; - $this->zip = empty($conf->global->MAIN_INFO_SOCIETE_ZIP) ? '' : $conf->global->MAIN_INFO_SOCIETE_ZIP; - $this->town = empty($conf->global->MAIN_INFO_SOCIETE_TOWN) ? '' : $conf->global->MAIN_INFO_SOCIETE_TOWN; - $this->region_code = empty($conf->global->MAIN_INFO_SOCIETE_REGION) ? '' : $conf->global->MAIN_INFO_SOCIETE_REGION; - $this->object = empty($conf->global->MAIN_INFO_SOCIETE_OBJECT) ? '' : $conf->global->MAIN_INFO_SOCIETE_OBJECT; + $this->name = getDolGlobalString('MAIN_INFO_SOCIETE_NOM'); + $this->address = getDolGlobalString('MAIN_INFO_SOCIETE_ADDRESS'); + $this->zip = getDolGlobalString('MAIN_INFO_SOCIETE_ZIP'); + $this->town = getDolGlobalString('MAIN_INFO_SOCIETE_TOWN'); + $this->region_code = getDolGlobalString('MAIN_INFO_SOCIETE_REGION'); + $this->object = getDolGlobalString('MAIN_INFO_SOCIETE_OBJECT'); - $this->note_private = empty($conf->global->MAIN_INFO_SOCIETE_NOTE) ? '' : $conf->global->MAIN_INFO_SOCIETE_NOTE; + $this->note_private = getDolGlobalString('MAIN_INFO_SOCIETE_NOTE'); $this->nom = $this->name; // deprecated @@ -4276,8 +4305,8 @@ class Societe extends CommonObject if (!empty($tmp[1])) { // If $conf->global->MAIN_INFO_SOCIETE_COUNTRY is "id:code:label" $country_code = $tmp[1]; $country_label = $tmp[2]; - } else // For backward compatibility - { + } else { + // For backward compatibility dol_syslog("Your country setup use an old syntax. Reedit it using setup area.", LOG_WARNING); include_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; $country_code = getCountry($country_id, 2, $this->db); // This need a SQL request, but it's the old feature that should not be used anymore @@ -4314,40 +4343,40 @@ class Societe extends CommonObject $this->state = ($langs->trans('State'.$state_code) != 'State'.$state_code) ? $langs->trans('State'.$state_code) : $state_label; } - $this->phone = empty($conf->global->MAIN_INFO_SOCIETE_TEL) ? '' : $conf->global->MAIN_INFO_SOCIETE_TEL; - $this->fax = empty($conf->global->MAIN_INFO_SOCIETE_FAX) ? '' : $conf->global->MAIN_INFO_SOCIETE_FAX; - $this->url = empty($conf->global->MAIN_INFO_SOCIETE_WEB) ? '' : $conf->global->MAIN_INFO_SOCIETE_WEB; + $this->phone = getDolGlobalString('MAIN_INFO_SOCIETE_TEL'); + $this->fax = getDolGlobalString('MAIN_INFO_SOCIETE_FAX'); + $this->url = getDolGlobalString('MAIN_INFO_SOCIETE_WEB'); // Social networks - $this->facebook_url = empty($conf->global->MAIN_INFO_SOCIETE_FACEBOOK_URL) ? '' : $conf->global->MAIN_INFO_SOCIETE_FACEBOOK_URL; - $this->twitter_url = empty($conf->global->MAIN_INFO_SOCIETE_TWITTER_URL) ? '' : $conf->global->MAIN_INFO_SOCIETE_TWITTER_URL; - $this->linkedin_url = empty($conf->global->MAIN_INFO_SOCIETE_LINKEDIN_URL) ? '' : $conf->global->MAIN_INFO_SOCIETE_LINKEDIN_URL; - $this->instagram_url = empty($conf->global->MAIN_INFO_SOCIETE_INSTAGRAM_URL) ? '' : $conf->global->MAIN_INFO_SOCIETE_INSTAGRAM_URL; - $this->youtube_url = empty($conf->global->MAIN_INFO_SOCIETE_YOUTUBE_URL) ? '' : $conf->global->MAIN_INFO_SOCIETE_YOUTUBE_URL; - $this->github_url = empty($conf->global->MAIN_INFO_SOCIETE_GITHUB_URL) ? '' : $conf->global->MAIN_INFO_SOCIETE_GITHUB_URL; + $facebook_url = getDolGlobalString('MAIN_INFO_SOCIETE_FACEBOOK_URL'); + $twitter_url = getDolGlobalString('MAIN_INFO_SOCIETE_TWITTER_URL'); + $linkedin_url = getDolGlobalString('MAIN_INFO_SOCIETE_LINKEDIN_URL'); + $instagram_url = getDolGlobalString('MAIN_INFO_SOCIETE_INSTAGRAM_URL'); + $youtube_url = getDolGlobalString('MAIN_INFO_SOCIETE_YOUTUBE_URL'); + $github_url = getDolGlobalString('MAIN_INFO_SOCIETE_GITHUB_URL'); $this->socialnetworks = array(); - if (!empty($this->facebook_url)) { - $this->socialnetworks['facebook'] = $this->facebook_url; + if (!empty($facebook_url)) { + $this->socialnetworks['facebook'] = $facebook_url; } - if (!empty($this->twitter_url)) { - $this->socialnetworks['twitter'] = $this->twitter_url; + if (!empty($twitter_url)) { + $this->socialnetworks['twitter'] = $twitter_url; } - if (!empty($this->linkedin_url)) { - $this->socialnetworks['linkedin'] = $this->linkedin_url; + if (!empty($linkedin_url)) { + $this->socialnetworks['linkedin'] = $linkedin_url; } - if (!empty($this->instagram_url)) { - $this->socialnetworks['instagram'] = $this->instagram_url; + if (!empty($instagram_url)) { + $this->socialnetworks['instagram'] = $instagram_url; } - if (!empty($this->youtube_url)) { - $this->socialnetworks['youtube'] = $this->youtube_url; + if (!empty($youtube_url)) { + $this->socialnetworks['youtube'] = $youtube_url; } - if (!empty($this->github_url)) { - $this->socialnetworks['github'] = $this->github_url; + if (!empty($github_url)) { + $this->socialnetworks['github'] = $github_url; } // Id prof generiques - $this->idprof1 = empty($conf->global->MAIN_INFO_SIREN) ? '' : $conf->global->MAIN_INFO_SIREN; - $this->idprof2 = empty($conf->global->MAIN_INFO_SIRET) ? '' : $conf->global->MAIN_INFO_SIRET; + $this->idprof1 = getDolGlobalString('MAIN_INFO_SIREN'); + $this->idprof2 = getDolGlobalString('MAIN_INFO_SIRET'); $this->idprof3 = empty($conf->global->MAIN_INFO_APE) ? '' : $conf->global->MAIN_INFO_APE; $this->idprof4 = empty($conf->global->MAIN_INFO_RCS) ? '' : $conf->global->MAIN_INFO_RCS; $this->idprof5 = empty($conf->global->MAIN_INFO_PROFID5) ? '' : $conf->global->MAIN_INFO_PROFID5; diff --git a/htdocs/societe/class/societeaccount.class.php b/htdocs/societe/class/societeaccount.class.php index 79f5aedbe68..411b11a4cd9 100644 --- a/htdocs/societe/class/societeaccount.class.php +++ b/htdocs/societe/class/societeaccount.class.php @@ -216,8 +216,7 @@ class SocieteAccount extends CommonObject // Clear fields $object->ref = "copy_of_".$object->ref; - $object->title = $langs->trans("CopyOf")." ".$object->title; - // ... + // $object->title = $langs->trans("CopyOf")." ".$object->title; // Create clone $object->context['createfromclone'] = 'createfromclone'; From 17b6cb2724ae6afa81b61ec67d974891ab806e1b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 19 Jan 2023 13:23:08 +0100 Subject: [PATCH 0938/1128] Fix warning --- htdocs/core/modules/mailings/contacts1.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/mailings/contacts1.modules.php b/htdocs/core/modules/mailings/contacts1.modules.php index 09595b61376..eee3ee68e6c 100644 --- a/htdocs/core/modules/mailings/contacts1.modules.php +++ b/htdocs/core/modules/mailings/contacts1.modules.php @@ -309,7 +309,7 @@ class mailing_contacts1 extends MailingTargets // Choose language if multilangue active - if (@$conf->global->MAIN_MULTILANGS==1) { + if (getDolGlobalInt('MAIN_MULTILANGS') == 1) { require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php'; $formadmin = new FormAdmin($this->db); $s .= ''.$langs->trans("DefaultLang").': '; From 4157263cb898f1847cfcfc22dee6007c01b13a4d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 19 Jan 2023 13:40:37 +0100 Subject: [PATCH 0939/1128] FIX Add bookmark with search fields that are arrays --- htdocs/bookmarks/bookmarks.lib.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/htdocs/bookmarks/bookmarks.lib.php b/htdocs/bookmarks/bookmarks.lib.php index c13b810a4bc..88cae3e4293 100644 --- a/htdocs/bookmarks/bookmarks.lib.php +++ b/htdocs/bookmarks/bookmarks.lib.php @@ -52,6 +52,7 @@ function printDropdownBookmarksList() } } } + $tmpurl = ''; // No urlencode, all param $url will be urlencoded later if ($sortfield) { @@ -65,7 +66,13 @@ function printDropdownBookmarksList() if ((preg_match('/^search_/', $key) || in_array($key, $authorized_var)) && $val != '' && !array_key_exists($key, $url_param)) { - $url_param[$key] = http_build_query(array(dol_escape_htmltag($key) => dol_escape_htmltag($val))); + if (is_array($val)) { + foreach ($val as $tmpsubval) { + $url_param[] = http_build_query(array(dol_escape_htmltag($key).'[]' => dol_escape_htmltag($tmpsubval))); + } + } elseif ($val != '') { + $url_param[$key] = http_build_query(array(dol_escape_htmltag($key) => dol_escape_htmltag($val))); + } } } } From d426598ab59da022843d23166fe77dab1944990c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 19 Jan 2023 13:46:54 +0100 Subject: [PATCH 0940/1128] Fix search criteria on service lines --- htdocs/contrat/services_list.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/contrat/services_list.php b/htdocs/contrat/services_list.php index cfc888e229a..08989fdcad0 100644 --- a/htdocs/contrat/services_list.php +++ b/htdocs/contrat/services_list.php @@ -256,7 +256,7 @@ $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON cd.fk_product = p.rowid"; if ($search_product_category > 0) { $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_product as cp ON cp.fk_product=cd.fk_product'; } -$sql .= " WHERE c.entity = ".$conf->entity; +$sql .= " WHERE c.entity IN (".getEntity($object->element).")"; $sql .= " AND c.rowid = cd.fk_contrat"; if ($search_product_category > 0) { $sql .= " AND cp.fk_categorie = ".((int) $search_product_category); @@ -281,13 +281,13 @@ if ($filter == "notexpired") { $sql .= " AND cd.date_fin_validite >= '".$db->idate($now)."'"; } if ($search_name) { - $sql .= " AND s.nom LIKE '%".$db->escape($search_name)."%'"; + $sql .= natural_search("c.ref", $search_name); } if ($search_contract) { - $sql .= " AND c.ref LIKE '%".$db->escape($search_contract)."%' "; + $sql .= natural_search("c.ref", $search_contract); } if ($search_service) { - $sql .= " AND (p.ref LIKE '%".$db->escape($search_service)."%' OR p.description LIKE '%".$db->escape($search_service)."%' OR cd.description LIKE '%".$db->escape($search_service)."%')"; + $sql .= natural_search(array("p.ref", "p.description", "cd.description"), $search_service); } if ($socid > 0) { $sql .= " AND s.rowid = ".((int) $socid); From 1afd2069461f6d20a0a86c816840e10884f675ca Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 19 Jan 2023 13:50:11 +0100 Subject: [PATCH 0941/1128] Fix debug v17 --- htdocs/contrat/services_list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/contrat/services_list.php b/htdocs/contrat/services_list.php index 08989fdcad0..99d03f2d793 100644 --- a/htdocs/contrat/services_list.php +++ b/htdocs/contrat/services_list.php @@ -217,7 +217,7 @@ $form = new Form($db); $sql = "SELECT c.rowid as cid, c.ref, c.statut as cstatut, c.ref_customer, c.ref_supplier,"; $sql .= " s.rowid as socid, s.nom as name, s.email, s.client, s.fournisseur,"; -$sql .= " cd.rowid, cd.description, cd.statut,"; +$sql .= " cd.rowid, cd.description, cd.statut, cd.product_type as type,"; $sql .= " p.rowid as pid, p.ref as pref, p.label as label, p.fk_product_type as ptype, p.tobuy, p.tosell, p.barcode, p.entity as pentity,"; if (empty($user->rights->societe->client->voir) && !$socid) { $sql .= " sc.fk_soc, sc.fk_user,"; From d171750e28567e90b115086cee327874fbf808a8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 19 Jan 2023 13:53:37 +0100 Subject: [PATCH 0942/1128] Fix warning --- htdocs/contrat/services_list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/contrat/services_list.php b/htdocs/contrat/services_list.php index 99d03f2d793..9b3081a412a 100644 --- a/htdocs/contrat/services_list.php +++ b/htdocs/contrat/services_list.php @@ -692,7 +692,7 @@ $contractstatic = new Contrat($db); $productstatic = new Product($db); $i = 0; -$totalarray = array(); +$totalarray = array('nbfield'=>0); while ($i < min($num, $limit)) { $obj = $db->fetch_object($resql); From 7cf144890feb32fb7e951595cb6acb8c36c1b039 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 19 Jan 2023 14:17:11 +0100 Subject: [PATCH 0943/1128] Fix default value --- htdocs/contrat/services_list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/contrat/services_list.php b/htdocs/contrat/services_list.php index 99d03f2d793..6efd3e84e4e 100644 --- a/htdocs/contrat/services_list.php +++ b/htdocs/contrat/services_list.php @@ -136,7 +136,7 @@ $arrayfields = array( 's.nom'=>array('label'=>"ThirdParty", 'checked'=>1, 'position'=>90), 'cd.tva_tx'=>array('label'=>"VATRate", 'checked'=>-1, 'position'=>100), 'cd.subprice'=>array('label'=>"PriceUHT", 'checked'=>-1, 'position'=>105), - 'cd.qty'=>array('label'=>"Qty", 'checked'=>-1, 'position'=>108), + 'cd.qty'=>array('label'=>"Qty", 'checked'=>1, 'position'=>108), 'cd.total_ht'=>array('label'=>"TotalHT", 'checked'=>-1, 'position'=>109), 'cd.total_tva'=>array('label'=>"TotalVAT", 'checked'=>-1, 'position'=>110), 'cd.date_ouverture_prevue'=>array('label'=>"DateStartPlannedShort", 'checked'=>(($mode == "" || $mode == -1) || $mode == "0"), 'position'=>150), From d01135a931b0e00c81dfb67ee321a0e1c4e23865 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 19 Jan 2023 14:28:10 +0100 Subject: [PATCH 0944/1128] css --- htdocs/contrat/class/contrat.class.php | 2 +- htdocs/contrat/services_list.php | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index 539d7b63f31..4d08fdb96cd 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -2979,7 +2979,7 @@ class ContratLigne extends CommonObjectLine 'rowid' =>array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>10), 'entity' =>array('type'=>'integer', 'label'=>'Entity', 'default'=>1, 'enabled'=>1, 'visible'=>-2, 'notnull'=>1, 'position'=>30, 'index'=>1), 'tms' =>array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>35), - 'qty' =>array('type'=>'integer', 'label'=>'Quantity', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>35, 'isameasure'=>1), + 'qty' =>array('type'=>'integer', 'label'=>'Quantity', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'position'=>35, 'isameasure'=>1), 'total_ht' =>array('type'=>'integer', 'label'=>'AmountHT', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>36, 'isameasure'=>1), 'total_tva' =>array('type'=>'integer', 'label'=>'AmountVAT', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>37, 'isameasure'=>1), 'total_ttc' =>array('type'=>'integer', 'label'=>'AmountTTC', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>38, 'isameasure'=>1), diff --git a/htdocs/contrat/services_list.php b/htdocs/contrat/services_list.php index 6efd3e84e4e..19c4659c589 100644 --- a/htdocs/contrat/services_list.php +++ b/htdocs/contrat/services_list.php @@ -137,7 +137,7 @@ $arrayfields = array( 'cd.tva_tx'=>array('label'=>"VATRate", 'checked'=>-1, 'position'=>100), 'cd.subprice'=>array('label'=>"PriceUHT", 'checked'=>-1, 'position'=>105), 'cd.qty'=>array('label'=>"Qty", 'checked'=>1, 'position'=>108), - 'cd.total_ht'=>array('label'=>"TotalHT", 'checked'=>-1, 'position'=>109), + 'cd.total_ht'=>array('label'=>"TotalHT", 'checked'=>-1, 'position'=>109, 'isameasure'=>1), 'cd.total_tva'=>array('label'=>"TotalVAT", 'checked'=>-1, 'position'=>110), 'cd.date_ouverture_prevue'=>array('label'=>"DateStartPlannedShort", 'checked'=>(($mode == "" || $mode == -1) || $mode == "0"), 'position'=>150), 'cd.date_ouverture'=>array('label'=>"DateStartRealShort", 'checked'=>(($mode == "" || $mode == -1) || $mode > 0), 'position'=>160), @@ -670,7 +670,7 @@ if (!empty($arrayfields['cd.tms']['checked'])) { } if (!empty($arrayfields['status']['checked'])) { // Status - print ''; + print ''; $arrayofstatus = array( '0'=>$langs->trans("ServiceStatusInitial"), '4'=>$langs->trans("ServiceStatusRunning"), @@ -678,7 +678,7 @@ if (!empty($arrayfields['status']['checked'])) { '4&filter=expired'=>$langs->trans("ServiceStatusLate"), '5'=>$langs->trans("ServiceStatusClosed") ); - print $form->selectarray('search_status', $arrayofstatus, (strstr($search_status, ',') ?-1 : $search_status), 1, 0, 0, '', 0, 0, 0, '', 'minwidth100imp maxwidth150'); + print $form->selectarray('search_status', $arrayofstatus, (strstr($search_status, ',') ?-1 : $search_status), 1, 0, 0, '', 0, 0, 0, '', 'search_status width100 onrightofpage'); print '
    '."\n"; -print ''; -if (!empty($arrayfields['c.ref']['checked'])) { - print_liste_field_titre($arrayfields['c.ref']['label'], $_SERVER["PHP_SELF"], "c.ref", "", $param, "", $sortfield, $sortorder); -} -if (!empty($arrayfields['p.description']['checked'])) { - print_liste_field_titre($arrayfields['p.description']['label'], $_SERVER["PHP_SELF"], "p.description", "", $param, "", $sortfield, $sortorder); -} -if (!empty($arrayfields['cd.tva_tx']['checked'])) { - print_liste_field_titre($arrayfields['cd.tva_tx']['label'], $_SERVER["PHP_SELF"], "cd.tva_tx", "", $param, '', $sortfield, $sortorder, 'center nowrap '); -} -if (!empty($arrayfields['cd.subprice']['checked'])) { - print_liste_field_titre($arrayfields['cd.subprice']['label'], $_SERVER["PHP_SELF"], "cd.subprice", "", $param, '', $sortfield, $sortorder, 'center nowrap '); -} -if (!empty($arrayfields['cd.qty']['checked'])) { - print_liste_field_titre($arrayfields['cd.qty']['label'], $_SERVER["PHP_SELF"], "cd.qty", "", $param, '', $sortfield, $sortorder, 'center nowrap '); -} -if (!empty($arrayfields['cd.total_ht']['checked'])) { - print_liste_field_titre($arrayfields['cd.total_ht']['label'], $_SERVER["PHP_SELF"], "cd.total_ht", "", $param, '', $sortfield, $sortorder, 'center nowrap '); -} -if (!empty($arrayfields['cd.total_tva']['checked'])) { - print_liste_field_titre($arrayfields['cd.total_tva']['label'], $_SERVER["PHP_SELF"], "cd.total_tva", "", $param, '', $sortfield, $sortorder, 'center nowrap '); -} -if (!empty($arrayfields['s.nom']['checked'])) { - print_liste_field_titre($arrayfields['s.nom']['label'], $_SERVER["PHP_SELF"], "s.nom", "", $param, "", $sortfield, $sortorder); -} -if (!empty($arrayfields['cd.date_ouverture_prevue']['checked'])) { - print_liste_field_titre($arrayfields['cd.date_ouverture_prevue']['label'], $_SERVER["PHP_SELF"], "cd.date_ouverture_prevue", "", $param, '', $sortfield, $sortorder, 'center '); -} -if (!empty($arrayfields['cd.date_ouverture']['checked'])) { - print_liste_field_titre($arrayfields['cd.date_ouverture']['label'], $_SERVER["PHP_SELF"], "cd.date_ouverture", "", $param, '', $sortfield, $sortorder, 'center '); -} -if (!empty($arrayfields['cd.date_fin_validite']['checked'])) { - print_liste_field_titre($arrayfields['cd.date_fin_validite']['label'], $_SERVER["PHP_SELF"], "cd.date_fin_validite", "", $param, '', $sortfield, $sortorder, 'center '); -} -if (!empty($arrayfields['cd.date_cloture']['checked'])) { - print_liste_field_titre($arrayfields['cd.date_cloture']['label'], $_SERVER["PHP_SELF"], "cd.date_cloture", "", $param, '', $sortfield, $sortorder, 'center '); -} -// Extra fields -include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php'; -// Hook fields -$parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder); -$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook -print $hookmanager->resPrint; -if (!empty($arrayfields['cd.datec']['checked'])) { - print_liste_field_titre($arrayfields['cd.datec']['label'], $_SERVER["PHP_SELF"], "cd.datec", "", $param, '', $sortfield, $sortorder, 'center nowrap '); -} -if (!empty($arrayfields['cd.tms']['checked'])) { - print_liste_field_titre($arrayfields['cd.tms']['label'], $_SERVER["PHP_SELF"], "cd.tms", "", $param, '', $sortfield, $sortorder, 'center nowrap '); -} -if (!empty($arrayfields['status']['checked'])) { - print_liste_field_titre($arrayfields['status']['label'], $_SERVER["PHP_SELF"], "cd.statut,c.statut", "", $param, '', $sortfield, $sortorder, 'right '); -} -print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch '); -print "\n"; print ''; if (!empty($arrayfields['c.ref']['checked'])) { @@ -614,7 +560,6 @@ if (!empty($arrayfields['s.nom']['checked'])) { print ''; } - if (!empty($arrayfields['cd.date_ouverture_prevue']['checked'])) { print ''; print "\n"; +print ''; +if (!empty($arrayfields['c.ref']['checked'])) { + print_liste_field_titre($arrayfields['c.ref']['label'], $_SERVER["PHP_SELF"], "c.ref", "", $param, "", $sortfield, $sortorder); +} +if (!empty($arrayfields['p.description']['checked'])) { + print_liste_field_titre($arrayfields['p.description']['label'], $_SERVER["PHP_SELF"], "p.description", "", $param, "", $sortfield, $sortorder); +} +if (!empty($arrayfields['cd.tva_tx']['checked'])) { + print_liste_field_titre($arrayfields['cd.tva_tx']['label'], $_SERVER["PHP_SELF"], "cd.tva_tx", "", $param, '', $sortfield, $sortorder, 'center nowrap '); +} +if (!empty($arrayfields['cd.subprice']['checked'])) { + print_liste_field_titre($arrayfields['cd.subprice']['label'], $_SERVER["PHP_SELF"], "cd.subprice", "", $param, '', $sortfield, $sortorder, 'center nowrap '); +} +if (!empty($arrayfields['cd.qty']['checked'])) { + print_liste_field_titre($arrayfields['cd.qty']['label'], $_SERVER["PHP_SELF"], "cd.qty", "", $param, '', $sortfield, $sortorder, 'center nowrap '); +} +if (!empty($arrayfields['cd.total_ht']['checked'])) { + print_liste_field_titre($arrayfields['cd.total_ht']['label'], $_SERVER["PHP_SELF"], "cd.total_ht", "", $param, '', $sortfield, $sortorder, 'center nowrap '); +} +if (!empty($arrayfields['cd.total_tva']['checked'])) { + print_liste_field_titre($arrayfields['cd.total_tva']['label'], $_SERVER["PHP_SELF"], "cd.total_tva", "", $param, '', $sortfield, $sortorder, 'center nowrap '); +} +if (!empty($arrayfields['s.nom']['checked'])) { + print_liste_field_titre($arrayfields['s.nom']['label'], $_SERVER["PHP_SELF"], "s.nom", "", $param, "", $sortfield, $sortorder); +} +if (!empty($arrayfields['cd.date_ouverture_prevue']['checked'])) { + print_liste_field_titre($arrayfields['cd.date_ouverture_prevue']['label'], $_SERVER["PHP_SELF"], "cd.date_ouverture_prevue", "", $param, '', $sortfield, $sortorder, 'center '); +} +if (!empty($arrayfields['cd.date_ouverture']['checked'])) { + print_liste_field_titre($arrayfields['cd.date_ouverture']['label'], $_SERVER["PHP_SELF"], "cd.date_ouverture", "", $param, '', $sortfield, $sortorder, 'center '); +} +if (!empty($arrayfields['cd.date_fin_validite']['checked'])) { + print_liste_field_titre($arrayfields['cd.date_fin_validite']['label'], $_SERVER["PHP_SELF"], "cd.date_fin_validite", "", $param, '', $sortfield, $sortorder, 'center '); +} +if (!empty($arrayfields['cd.date_cloture']['checked'])) { + print_liste_field_titre($arrayfields['cd.date_cloture']['label'], $_SERVER["PHP_SELF"], "cd.date_cloture", "", $param, '', $sortfield, $sortorder, 'center '); +} +// Extra fields +include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php'; +// Hook fields +$parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder); +$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook +print $hookmanager->resPrint; +if (!empty($arrayfields['cd.datec']['checked'])) { + print_liste_field_titre($arrayfields['cd.datec']['label'], $_SERVER["PHP_SELF"], "cd.datec", "", $param, '', $sortfield, $sortorder, 'center nowrap '); +} +if (!empty($arrayfields['cd.tms']['checked'])) { + print_liste_field_titre($arrayfields['cd.tms']['label'], $_SERVER["PHP_SELF"], "cd.tms", "", $param, '', $sortfield, $sortorder, 'center nowrap '); +} +if (!empty($arrayfields['status']['checked'])) { + print_liste_field_titre($arrayfields['status']['label'], $_SERVER["PHP_SELF"], "cd.statut,c.statut", "", $param, '', $sortfield, $sortorder, 'right '); +} +print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch '); +print "\n"; + + $contractstatic = new Contrat($db); $productstatic = new Product($db); From ac6705a7f6832c1b547fe83d19b645a50c1f5e07 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 19 Jan 2023 14:54:11 +0100 Subject: [PATCH 0946/1128] NEW Filter on amount and qty on list of service's contracts --- htdocs/contrat/services_list.php | 60 +++++++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 8 deletions(-) diff --git a/htdocs/contrat/services_list.php b/htdocs/contrat/services_list.php index 84ee5b3f88c..e1ab25a2030 100644 --- a/htdocs/contrat/services_list.php +++ b/htdocs/contrat/services_list.php @@ -58,6 +58,11 @@ if (!$sortorder) { $mode = GETPOST("mode"); $filter = GETPOST("filter"); $search_name = GETPOST("search_name", 'alpha'); +$search_subprice = GETPOST("search_subprice", 'alpha'); +$search_qty = GETPOST("search_name", 'alpha'); +$search_total_ht = GETPOST("search_total_ht", 'alpha'); +$search_total_tva = GETPOST("search_total_tva", 'alpha'); +$search_total_ttc = GETPOST("search_total_ttc", 'alpha'); $search_contract = GETPOST("search_contract", 'alpha'); $search_service = GETPOST("search_service", 'alpha'); $search_status = GETPOST("search_status", 'alpha'); @@ -180,6 +185,11 @@ if (empty($reshook)) { if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All test are required to be compatible with all browsers $search_product_category = 0; $search_name = ""; + $search_subprice = ""; + $search_qty = ""; + $search_total_ht = ""; + $search_total_tva = ""; + $search_total_ttc = ""; $search_contract = ""; $search_service = ""; $search_status = -1; @@ -280,8 +290,23 @@ if ($filter == "expired") { if ($filter == "notexpired") { $sql .= " AND cd.date_fin_validite >= '".$db->idate($now)."'"; } +if ($search_subprice) { + $sql .= natural_search("cd.subprice", $search_subprice, 1); +} +if ($search_qty) { + $sql .= natural_search("cd.total_qty", $search_qty, 1); +} +if ($search_total_ht) { + $sql .= natural_search("cd.total_ht", $search_total_ht, 1); +} +if ($search_total_tva) { + $sql .= natural_search("cd.total_tva", $search_total_tva, 1); +} +if ($search_total_ttc) { + $sql .= natural_search("cd.total_ttc", $search_total_ttc, 1); +} if ($search_name) { - $sql .= natural_search("c.ref", $search_name); + $sql .= natural_search("s.nom", $search_name); } if ($search_contract) { $sql .= natural_search("c.ref", $search_contract); @@ -398,6 +423,21 @@ if ($search_contract) { if ($search_name) { $param .= '&search_name='.urlencode($search_name); } +if ($search_subprice) { + $param .= '&search_subprice='.urlencode($search_subprice); +} +if ($search_qty) { + $param .= '&search_qty='.urlencode($search_qty); +} +if ($search_total_ht) { + $param .= '&search_total_ht='.urlencode($search_total_ht); +} +if ($search_total_tva) { + $param .= '&search_total_tva='.urlencode($search_total_tva); +} +if ($search_total_ttc) { + $param .= '&search_total_ttc='.urlencode($search_total_ttc); +} if ($search_service) { $param .= '&search_service='.urlencode($search_service); } @@ -538,19 +578,23 @@ if (!empty($arrayfields['cd.tva_tx']['checked'])) { print ''; } if (!empty($arrayfields['cd.subprice']['checked'])) { - print ''; } if (!empty($arrayfields['cd.qty']['checked'])) { - print ''; } if (!empty($arrayfields['cd.total_ht']['checked'])) { - print ''; } if (!empty($arrayfields['cd.total_tva']['checked'])) { - print ''; } // Third party @@ -647,13 +691,13 @@ if (!empty($arrayfields['cd.subprice']['checked'])) { print_liste_field_titre($arrayfields['cd.subprice']['label'], $_SERVER["PHP_SELF"], "cd.subprice", "", $param, '', $sortfield, $sortorder, 'center nowrap '); } if (!empty($arrayfields['cd.qty']['checked'])) { - print_liste_field_titre($arrayfields['cd.qty']['label'], $_SERVER["PHP_SELF"], "cd.qty", "", $param, '', $sortfield, $sortorder, 'center nowrap '); + print_liste_field_titre($arrayfields['cd.qty']['label'], $_SERVER["PHP_SELF"], "cd.qty", "", $param, '', $sortfield, $sortorder, 'right nowrap '); } if (!empty($arrayfields['cd.total_ht']['checked'])) { - print_liste_field_titre($arrayfields['cd.total_ht']['label'], $_SERVER["PHP_SELF"], "cd.total_ht", "", $param, '', $sortfield, $sortorder, 'center nowrap '); + print_liste_field_titre($arrayfields['cd.total_ht']['label'], $_SERVER["PHP_SELF"], "cd.total_ht", "", $param, '', $sortfield, $sortorder, 'right nowrap '); } if (!empty($arrayfields['cd.total_tva']['checked'])) { - print_liste_field_titre($arrayfields['cd.total_tva']['label'], $_SERVER["PHP_SELF"], "cd.total_tva", "", $param, '', $sortfield, $sortorder, 'center nowrap '); + print_liste_field_titre($arrayfields['cd.total_tva']['label'], $_SERVER["PHP_SELF"], "cd.total_tva", "", $param, '', $sortfield, $sortorder, 'right nowrap '); } if (!empty($arrayfields['s.nom']['checked'])) { print_liste_field_titre($arrayfields['s.nom']['label'], $_SERVER["PHP_SELF"], "s.nom", "", $param, "", $sortfield, $sortorder); From 97dfaf267e99160bd787d3ab7663ab60fd6aa0b9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 19 Jan 2023 14:59:02 +0100 Subject: [PATCH 0947/1128] Fix missing total on qties --- htdocs/contrat/services_list.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/htdocs/contrat/services_list.php b/htdocs/contrat/services_list.php index e1ab25a2030..fb50283991b 100644 --- a/htdocs/contrat/services_list.php +++ b/htdocs/contrat/services_list.php @@ -737,7 +737,7 @@ $contractstatic = new Contrat($db); $productstatic = new Product($db); $i = 0; -$totalarray = array('nbfield'=>0); +$totalarray = array('nbfield'=>0, 'cd.qty'=>0, 'cd.total_ht'=>0, 'cd.total_tva'=>0); while ($i < min($num, $limit)) { $obj = $db->fetch_object($resql); @@ -819,6 +819,10 @@ while ($i < min($num, $limit)) { if (!$i) { $totalarray['nbfield']++; } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'cd.qty'; + } + $totalarray['val']['cd.qty'] += $obj->qty; } if (!empty($arrayfields['cd.total_ht']['checked'])) { print ''; } // Date invoice @@ -728,7 +738,7 @@ if ($resql) { } } if (!empty($arrayfields['s.nom']['checked'])) { - print ''; + print ''; if (!$i) { $totalarray['nbfield']++; } From 84436e1217327fac1e27c395613d41c8abf75ce7 Mon Sep 17 00:00:00 2001 From: hystepik Date: Thu, 19 Jan 2023 15:31:47 +0100 Subject: [PATCH 0949/1128] Fix : php 8.1 warnings and dolibarr log --- htdocs/barcode/printsheet.php | 2 +- htdocs/comm/action/index.php | 2 +- htdocs/comm/mailing/cibles.php | 2 +- htdocs/comm/mailing/index.php | 4 ++-- htdocs/core/boxes/box_graph_nb_ticket_last_x_days.php | 4 ++-- htdocs/hrm/class/position.class.php | 4 ++-- htdocs/modulebuilder/index.php | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/htdocs/barcode/printsheet.php b/htdocs/barcode/printsheet.php index 373effecbe8..56361b948f0 100644 --- a/htdocs/barcode/printsheet.php +++ b/htdocs/barcode/printsheet.php @@ -226,7 +226,7 @@ if ($action == 'builddoc') { 'code'=>$code, 'encoding'=>$encoding, 'is2d'=>$is2d, - 'photo'=>$barcodeimage // Photo must be a file that exists with format supported by TCPDF + 'photo'=>!empty($barcodeimage) ? $barcodeimage : '' // Photo must be a file that exists with format supported by TCPDF ); } } else { diff --git a/htdocs/comm/action/index.php b/htdocs/comm/action/index.php index e730243bfbf..9d84e205f2b 100644 --- a/htdocs/comm/action/index.php +++ b/htdocs/comm/action/index.php @@ -2048,7 +2048,7 @@ function show_day_events($db, $day, $month, $year, $monthshown, $style, &$eventa } } if (!empty($contact_id) && $contact_id > 0) { - if (!is_object($cachecontacts[$contact_id])) { + if (empty($cachecontacts[$contact_id]) || !is_object($cachecontacts[$contact_id])) { $contact = new Contact($db); $contact->fetch($contact_id); $cachecontacts[$contact_id] = $contact; diff --git a/htdocs/comm/mailing/cibles.php b/htdocs/comm/mailing/cibles.php index dde6e3204d6..c39e4fbf834 100644 --- a/htdocs/comm/mailing/cibles.php +++ b/htdocs/comm/mailing/cibles.php @@ -675,7 +675,7 @@ if ($object->fetch($id) >= 0) { // Date last update print ''; // Status of recipient sending email (Warning != status of emailing) diff --git a/htdocs/comm/mailing/index.php b/htdocs/comm/mailing/index.php index d3ebc379b55..cf3d18adbac 100644 --- a/htdocs/comm/mailing/index.php +++ b/htdocs/comm/mailing/index.php @@ -101,7 +101,7 @@ if (is_resource($handle)) { $qualified = 1; foreach ($mailmodule->require_module as $key) { - if (!$conf->$key->enabled || (!$user->admin && $mailmodule->require_admin)) { + if (empty($conf->$key->enabled) || (!$user->admin && $mailmodule->require_admin)) { $qualified = 0; //print "Les pr�requis d'activation du module mailing ne sont pas respect�s. Il ne sera pas actif"; break; @@ -176,7 +176,7 @@ if ($result) { print ''; print ''; - print ''; + print ''; print ''; print ''; print ''; diff --git a/htdocs/core/boxes/box_graph_nb_ticket_last_x_days.php b/htdocs/core/boxes/box_graph_nb_ticket_last_x_days.php index b75d0752334..5a6dbbedd37 100644 --- a/htdocs/core/boxes/box_graph_nb_ticket_last_x_days.php +++ b/htdocs/core/boxes/box_graph_nb_ticket_last_x_days.php @@ -120,7 +120,7 @@ class box_graph_nb_ticket_last_x_days extends ModeleBoxes while ($i < $num) { $objp = $this->db->fetch_object($resql); while ($minimumdatecformated < $objp->datec) { - $dataseries[] = array('label' => dol_print_date($minimumdatecformated, 'day'), 'data' => 0); + $dataseries[] = array('label' => dol_print_date($minimumdatec, 'day'), 'data' => 0); $minimumdatec = dol_time_plus_duree($minimumdatec, $intervaltoadd, 'd'); $minimumdatecformated = dol_print_date($minimumdatec, 'dayrfc'); } @@ -130,7 +130,7 @@ class box_graph_nb_ticket_last_x_days extends ModeleBoxes $i++; } while (count($dataseries) < $days) { - $dataseries[] = array('label' => dol_print_date($minimumdatecformated, 'day'), 'data' => 0); + $dataseries[] = array('label' => dol_print_date($minimumdatec, 'day'), 'data' => 0); $minimumdatec = dol_time_plus_duree($minimumdatec, $intervaltoadd, 'd'); $minimumdatecformated = dol_print_date($minimumdatec, 'dayrfc'); $i++; diff --git a/htdocs/hrm/class/position.class.php b/htdocs/hrm/class/position.class.php index b685147a9b9..caf2ff00b03 100644 --- a/htdocs/hrm/class/position.class.php +++ b/htdocs/hrm/class/position.class.php @@ -395,10 +395,10 @@ class Position extends CommonObject foreach ($filter as $key => $value) { if ($key == 't.rowid') { $sqlwhere[] = $key . '=' . $value; - } elseif (in_array($this->fields[$key]['type'], array('date', 'datetime', 'timestamp'))) { - $sqlwhere[] = $key . ' = \'' . $this->db->idate($value) . '\''; } elseif ($key == 'customsql') { $sqlwhere[] = $value; + } elseif (in_array($this->fields[$key]['type'], array('date', 'datetime', 'timestamp'))) { + $sqlwhere[] = $key . ' = \'' . $this->db->idate($value) . '\''; } elseif (strpos($value, '%') === false) { $sqlwhere[] = $key . ' IN (' . $this->db->sanitize($this->db->escape($value)) . ')'; } else { diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index b8810a2696d..0d2137928ac 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -3739,7 +3739,7 @@ if ($module == 'initmodule') { print ''; print ''; print ''; print ''; print ''; print ''; @@ -256,20 +256,20 @@ if ($nb) { if ($type == 'bank-transfer') { $title = $langs->trans('BankToPayCreditTransfer').': '; } - print $title; + print ''.$title.''; print img_picto('', 'bank_account'); $default_account = ($type == 'bank-transfer' ? 'PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT' : 'PRELEVEMENT_ID_BANKACCOUNT'); - print $form->select_comptes($conf->global->$default_account, 'id_bankaccount', 0, "courant=1", 0, '', 0, '', 1); - print ' - '; + print $form->select_comptes(getDolGlobalInt($default_account), 'id_bankaccount', 0, "courant=1", 0, '', 0, 'widthcentpercentminusx maxwidth300', 1); + print '     '; if (empty($executiondate)) { $delayindays = 0; if ($type != 'bank-transfer') { - $delayindays = $conf->global->PRELEVEMENT_ADDDAYS; + $delayindays = getDolGlobalInt('PRELEVEMENT_ADDDAYS'); } else { - $delayindays = $conf->global->PAYMENTBYBANKTRANSFER_ADDDAYS; + $delayindays = getDolGlobalInt('PAYMENTBYBANKTRANSFER_ADDDAYS'); } $executiondate = dol_time_plus_duree(dol_now(), $delayindays, 'd'); @@ -292,14 +292,14 @@ if ($nb) { print ''; print ''; } - print ''; + print ''; } else { $title = $langs->trans("CreateAll"); if ($type == 'bank-transfer') { $title = $langs->trans("CreateFileForPaymentByBankTransfer"); } print ''."\n"; - print ''."\n"; + print ''."\n"; } } else { if ($mysoc->isInEEC()) { @@ -307,18 +307,18 @@ if ($nb) { if ($type == 'bank-transfer') { $title = $langs->trans("CreateSepaFileForPaymentByBankTransfer"); } - print ''.$title."\n"; + print ''.$title."\n"; if ($type != 'bank-transfer') { $title = $langs->trans("CreateForSepaRCUR"); - print ''.$title."\n"; + print ''.$title."\n"; } } else { $title = $langs->trans("CreateAll"); if ($type == 'bank-transfer') { $title = $langs->trans("CreateFileForPaymentByBankTransfer"); } - print ''.$title."\n"; + print ''.$title."\n"; } } } else { @@ -328,7 +328,9 @@ if ($nb) { $titlefortab = $langs->transnoentitiesnoconv("PaymentByBankTransfers"); $title = $langs->trans("CreateFileForPaymentByBankTransfer"); } - print ''.$title."\n"; + print ''; + print $title; + print "\n"; } print "\n"; @@ -343,6 +345,9 @@ print '
    '; */ $sql = "SELECT f.ref, f.rowid, f.total_ttc, s.nom as name, s.rowid as socid,"; +if ($type == 'bank-transfer') { + $sql .= " f.ref_supplier,"; +} $sql .= " pfd.rowid as request_row_id, pfd.date_demande, pfd.amount"; if ($type == 'bank-transfer') { $sql .= " FROM ".MAIN_DB_PREFIX."facture_fourn as f,"; @@ -423,6 +428,9 @@ if ($resql) { print '
    '; $arrayofoperators = array('<'=>'<', '>'=>'>'); @@ -688,6 +633,62 @@ print $searchpicto; print '
    '; + print ''; + print ''; print ''; + print ''; + print ''; print ''; + print ''; + print ''; print ''; + print ''; + print ''; print ''; From a092654ea8cf6b0a340a30667ae2edf6a869f231 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 19 Jan 2023 15:17:40 +0100 Subject: [PATCH 0948/1128] NEW Add filter on nb of generation done in list of recurring invoices --- htdocs/compta/facture/invoicetemplate_list.php | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/facture/invoicetemplate_list.php b/htdocs/compta/facture/invoicetemplate_list.php index ae9e4c2959b..0471b97c038 100644 --- a/htdocs/compta/facture/invoicetemplate_list.php +++ b/htdocs/compta/facture/invoicetemplate_list.php @@ -94,6 +94,7 @@ $search_date_when_end = dol_mktime(23, 59, 59, $search_date_when_endmonth, $sear $search_recurring = GETPOST('search_recurring', 'int'); $search_frequency = GETPOST('search_frequency', 'alpha'); $search_unit_frequency = GETPOST('search_unit_frequency', 'alpha'); +$search_nb_gen_done = GETPOST('search_nb_gen_done', 'aplha'); $search_status = GETPOST('search_status', 'int'); $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit; @@ -236,6 +237,7 @@ if (empty($reshook)) { $search_recurring = ''; $search_frequency = ''; $search_unit_frequency = ''; + $search_nb_gen_done = ''; $search_status = ''; $search_array_options = array(); } @@ -334,7 +336,11 @@ if ($search_frequency != '') { $sql .= natural_search('f.frequency', $search_frequency, 1); } if ($search_unit_frequency != '') { - $sql .= ' AND f.frequency > 0'.natural_search('f.unit_frequency', $search_unit_frequency); + $sql .= ' AND f.frequency > 0'; + $sql .= natural_search('f.unit_frequency', $search_unit_frequency); +} +if ($search_nb_gen_done != '') { + $sql .= natural_search("f.nb_gen_done", $search_nb_gen_done, 1); } if ($search_status != '' && $search_status >= -1) { if ($search_status == 0) { @@ -458,6 +464,9 @@ if ($resql) { if ($search_unit_frequency != '') { $param .= '&search_unit_frequency='.urlencode($search_unit_frequency); } + if ($search_nb_gen_done != '') { + $param .= '&search_nb_gen_done='.urlencode($search_nb_gen_done); + } if ($search_status != '') { $param .= '&search_status='.urlencode($search_status); } @@ -561,6 +570,7 @@ if ($resql) { if (!empty($arrayfields['f.nb_gen_done']['checked'])) { // Nb generation print ''; + print ''; print ''.$companystatic->getNomUrl(1, 'customer').''.$companystatic->getNomUrl(1, 'customer').''; - print dol_print_date($obj->tms, 'dayhour'); + print dol_print_date(dol_stringtotime($obj->tms), 'dayhour'); print '
    '.$mailstatic->getNomUrl(1).''.dol_trunc($obj->title, 38).''.(!empty($obj->title) ? dol_trunc($obj->title, 38) : '').''.dol_print_date($db->jdate($obj->date_creat), 'day').''.($obj->nbemail ? $obj->nbemail : "0").''.$mailstatic->LibStatut($obj->statut, 5).''; - print dol_escape_htmltag($menu['leftmenu']); + print !empty($menu['leftmenu']) ? dol_escape_htmltag($menu['leftmenu']) : ''; print ''; From b4b6cba9fb92b0bd55eec00848e20ec5a7d5a7e6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 19 Jan 2023 15:56:30 +0100 Subject: [PATCH 0950/1128] NEW Show supplier invoice ref of direct debit transfer tab invoices --- htdocs/compta/prelevement/factures.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/htdocs/compta/prelevement/factures.php b/htdocs/compta/prelevement/factures.php index 0ed75b5c3b8..378480ef0d2 100644 --- a/htdocs/compta/prelevement/factures.php +++ b/htdocs/compta/prelevement/factures.php @@ -21,7 +21,7 @@ /** * \file htdocs/compta/prelevement/factures.php * \ingroup prelevement - * \brief Page liste des factures prelevees + * \brief Page list of invoice paied by direct debit or credit transfer */ // Load Dolibarr environment @@ -174,6 +174,9 @@ if ($id > 0 || $ref) { // List of invoices $sql = "SELECT pf.rowid, p.type,"; $sql .= " f.rowid as facid, f.ref as ref, f.total_ttc,"; +if ($object->type == 'bank-transfer') { + $sql .= " f.ref_supplier,"; +} $sql .= " s.rowid as socid, s.nom as name, pl.statut, pl.amount as amount_requested"; $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_bons as p"; $sql .= ", ".MAIN_DB_PREFIX."prelevement_lignes as pl"; @@ -251,6 +254,9 @@ if ($resql) { print ''; print ''; print_liste_field_titre("Bill", $_SERVER["PHP_SELF"], "p.ref", '', $param, '', $sortfield, $sortorder); + if ($object->type == 'bank-transfer') { + print_liste_field_titre("RefSupplierShort", $_SERVER["PHP_SELF"], "f.ref_supplier", '', $param, '', $sortfield, $sortorder); + } print_liste_field_titre("ThirdParty", $_SERVER["PHP_SELF"], "s.nom", '', $param, '', $sortfield, $sortorder); print_liste_field_titre("AmountInvoice", $_SERVER["PHP_SELF"], "f.total_ttc", "", $param, 'class="right"', $sortfield, $sortorder); print_liste_field_titre("AmountRequested", $_SERVER["PHP_SELF"], "pl.amount", "", $param, 'class="right"', $sortfield, $sortorder); @@ -282,6 +288,12 @@ if ($resql) { print $invoicetmp->getNomUrl(1); print "\n"; + if ($object->type == 'bank-transfer') { + print '\n"; + } + print '\n"; From e6ca13ca65b5339102809ce50af657765828936c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 19 Jan 2023 15:57:44 +0100 Subject: [PATCH 0951/1128] Missing column --- htdocs/compta/prelevement/factures.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/htdocs/compta/prelevement/factures.php b/htdocs/compta/prelevement/factures.php index 378480ef0d2..cc416d7d530 100644 --- a/htdocs/compta/prelevement/factures.php +++ b/htdocs/compta/prelevement/factures.php @@ -334,6 +334,9 @@ if ($resql) { if ($num > 0) { print ''; print ''; + if ($object->type == 'bank-transfer') { + print ''; + } print ''; print ''; - foreach ($socialnetworks as $key => $value) { - if ($value['active']) { - print ''; - print ''; - print ''; - print ''; - } elseif (!empty($object->socialnetworks[$key])) { - print ''; - } - } - - print ''; -} - llxFooter(); diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php index e55f123a540..c9d62c410b3 100644 --- a/htdocs/contact/class/contact.class.php +++ b/htdocs/contact/class/contact.class.php @@ -32,6 +32,7 @@ * \brief File of contacts class */ require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/commonsocialnetworks.class.php'; /** @@ -39,6 +40,8 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php'; */ class Contact extends CommonObject { + use CommonSocialNetworks; + /** * @var string ID to identify managed object */ diff --git a/htdocs/core/class/commonsocialnetworks.class.php b/htdocs/core/class/commonsocialnetworks.class.php new file mode 100644 index 00000000000..eeb6583ca65 --- /dev/null +++ b/htdocs/core/class/commonsocialnetworks.class.php @@ -0,0 +1,102 @@ + + * + * 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/core/class/commonincoterm.class.php + * \ingroup core + * \brief File of the superclass of object classes that support incoterm (customer and supplier) + */ + + +/** + * Superclass for social networks + */ +trait CommonSocialNetworks +{ + /** + * Show social network part if the module is enabled with hiding functionality + * + * @param array $socialnetworks Array of social networks + * @param int $colspan Colspan + * @return void + */ + public function showSocialNetwork($socialnetworks, $colspan = 4) + { + global $object, $form, $langs; + + $nbofnetworks = count($socialnetworks); + $nbactive = 0; + foreach ($socialnetworks as $key => $value) { + if (!empty($object->socialnetworks[$key])) { + $nbactive++; + } + } + + if ($nbofnetworks > 1) { + print ''; + print ''; + print '
    '.$nbactive.''; + print ''; + print '
    '; + } + foreach ($socialnetworks as $key => $value) { + if ($value['active'] || $nbofnetworks == 1) { + print ''; + print ''; + print ''; + print ''; + } elseif (!empty($object->socialnetworks[$key])) { + print ''; + } + } + print '
    '; + + if ($nbofnetworks > 1) { + print ''; + } + } +} diff --git a/htdocs/langs/en_US/companies.lang b/htdocs/langs/en_US/companies.lang index 38b6892dbae..911ba31bc25 100644 --- a/htdocs/langs/en_US/companies.lang +++ b/htdocs/langs/en_US/companies.lang @@ -500,4 +500,6 @@ CurrentOutstandingBillLate=Current outstanding bill late BecarefullChangeThirdpartyBeforeAddProductToInvoice=Be carefull, depending on your product price settings, you should change thirdparty before adding product to POS. EmailAlreadyExistsPleaseRewriteYourCompanyName=email already exists please rewrite your company name TwoRecordsOfCompanyName=more than one record exists for this company, please contact us to complete your partnership request -CompanySection=Company section \ No newline at end of file +CompanySection=Company section +ShowSocialNetworks=Show social networks +HideSocialNetworks=Hide social networks diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php index 6ef8d929361..02d0b042aab 100644 --- a/htdocs/societe/card.php +++ b/htdocs/societe/card.php @@ -1663,7 +1663,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { // Social networks if (isModEnabled('socialnetworks')) { - showSocialNetwork(); + $object->showSocialNetwork($socialnetworks, ($conf->browser->layout == 'phone' ? 2 : 4)); } // Prof ids @@ -2381,7 +2381,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { // Social network if (isModEnabled('socialnetworks')) { - showSocialNetwork(); + $object->showSocialNetwork($socialnetworks, ($conf->browser->layout == 'phone' ? 2 : 4)); } // Prof ids @@ -3299,54 +3299,6 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { } } -/** - * Show social network part if the module is enabled with hiding functionality - * - * @return void - */ -function showSocialNetwork() -{ - global $socialnetworks, $object, $form, $object, $langs; - echo ''; - - print ''; - foreach ($socialnetworks as $key => $value) { - if ($value['active']) { - print ''; - print ''; - print ''; - print ''; - } elseif (!empty($object->socialnetworks[$key])) { - print ''; - } - } - - print ''; -} // End of page llxFooter(); diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 29f400fc778..2e633126f64 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -40,6 +40,7 @@ */ require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/commonincoterm.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/commonsocialnetworks.class.php'; require_once DOL_DOCUMENT_ROOT.'/multicurrency/class/multicurrency.class.php'; @@ -49,6 +50,7 @@ require_once DOL_DOCUMENT_ROOT.'/multicurrency/class/multicurrency.class.php'; class Societe extends CommonObject { use CommonIncoterm; + use CommonSocialNetworks; /** * @var string ID to identify managed object From 7df07b57ce9d9925abe2f092c2db2263444f9bba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Fri, 20 Jan 2023 13:58:04 +0100 Subject: [PATCH 0967/1128] fix missing global in template modulebuilder --- htdocs/modulebuilder/template/class/myobject.class.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/modulebuilder/template/class/myobject.class.php b/htdocs/modulebuilder/template/class/myobject.class.php index c60dbaa7e5b..4cc03121988 100644 --- a/htdocs/modulebuilder/template/class/myobject.class.php +++ b/htdocs/modulebuilder/template/class/myobject.class.php @@ -874,6 +874,7 @@ class MyObject extends CommonObject */ public function getKanbanView($option = '', $arraydata = null) { + global $conf, $langs; $return = '
    '; $return .= '
    '; $return .= ''; From 0721c8b5d8e558dd7519a56e47cf6fbc3571df69 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 20 Jan 2023 15:14:44 +0100 Subject: [PATCH 0968/1128] Clean code --- htdocs/core/class/commoninvoice.class.php | 27 +++++++++++++++----- htdocs/stripe/class/stripe.class.php | 31 ++++++++++++++++++----- 2 files changed, 44 insertions(+), 14 deletions(-) diff --git a/htdocs/core/class/commoninvoice.class.php b/htdocs/core/class/commoninvoice.class.php index 93d125291ef..17c9c7deae3 100644 --- a/htdocs/core/class/commoninvoice.class.php +++ b/htdocs/core/class/commoninvoice.class.php @@ -865,7 +865,7 @@ abstract class CommonInvoice extends CommonObject /** - * Create a withdrawal request at Stripe for a direct debit order or a credit transfer order. + * Create a withdrawal request, from a prelevement_demande, to Stripe for a direct debit order or a credit transfer order. * Use the remain to pay excluding all existing open direct debit requests. * * @param User $fuser User asking the direct debit transfer @@ -901,6 +901,7 @@ abstract class CommonInvoice extends CommonObject $sql = "SELECT rowid, date_demande, amount, fk_facture, fk_facture_fourn"; $sql .= " FROM ".$this->db->prefix()."prelevement_demande"; $sql .= " AND fk_facture = ".((int) $this->fk_facture); // Add a protection to not pay another invoice than current one + $sql .= " AND traite = 0"; // Add a protection to not process twice $sql .= " WHERE rowid = ".((int) $did); dol_syslog(get_class($this)."::makeStripeSepaRequest 1", LOG_DEBUG); @@ -1077,10 +1078,11 @@ abstract class CommonInvoice extends CommonObject $stripecard = null; if ($companypaymentmode->type == 'ban') { $sepaMode = true; + // Check into societe_rib if a payment mode for Stripe and ban payment exists $stripecard = $stripe->sepaStripe($customer, $companypaymentmode, $stripeacc, $servicestatus, 0); } - if ($stripecard) { // Can be src_... (for sepa) - Other card_... (old mode) or pm_... (new mode) should not happen here. + if ($stripecard) { // Can be src_... (for sepa). Note that card_... (old card mode) or pm_... (new card mode) should not happen here. $FULLTAG = 'INV=' . $this->id . '-CUS=' . $thirdparty->id; $description = 'Stripe payment from makeStripeSepaRequest: ' . $FULLTAG . ' ref=' . $this->ref; @@ -1128,6 +1130,7 @@ abstract class CommonInvoice extends CommonObject //var_dump("stripefailurecode=".$stripefailurecode." stripefailuremessage=".$stripefailuremessage." stripefailuredeclinecode=".$stripefailuredeclinecode); //exit; + // Return $charge = array('id'=>'ch_XXXX', 'status'=>'succeeded|pending|failed', 'failure_code'=>, 'failure_message'=>...) if (empty($charge) || $charge->status == 'failed') { dol_syslog('Failed to charge payment mode ' . $stripecard->id . ' stripefailurecode=' . $stripefailurecode . ' stripefailuremessage=' . $stripefailuremessage . ' stripefailuredeclinecode=' . $stripefailuredeclinecode, LOG_WARNING); @@ -1179,7 +1182,11 @@ abstract class CommonInvoice extends CommonObject $this->stripechargedone++; // Default description used for label of event. Will be overwrite by another value later. - $description = 'Stripe payment OK (' . $charge->id . ') from makeStripeSepaRequest: ' . $FULLTAG; + $description = 'Stripe payment request OK (' . $charge->id . ') from makeStripeSepaRequest: ' . $FULLTAG; + + + // TODO Save request to status pending. Done should be set with a webhook. + $db = $this->db; @@ -1549,13 +1556,19 @@ abstract class CommonInvoice extends CommonObject $this->errors[] = "Remain to pay is null for the invoice " . $this->id . " " . $this->ref . ". Why is the invoice not classified 'Paid' ?"; } - // TODO Create a prelevement_bon ? - // For the moment no + // TODO Create a prelevement_bon and set its status to sent instead of this + $idtransferfile = 0; - // We must update the direct debit payment request as "done" - $sql = "UPDATE".MAIN_DB_PREFIX."prelevement_demande SET traite = 1, date_traite = '".$this->db->idate(dol_now())."'"; + // Update the direct debit payment request of the processed invoice to save the id of the prelevement_bon + $sql = "UPDATE".MAIN_DB_PREFIX."prelevement_demande SET"; + $sql .= " traite = 1,"; // TODO Remove this + $sql .= " date_traite = '".$this->db->idate(dol_now())."'"; // TODO Remove this + if ($idtransferfile > 0) { + $sql .= " fk_prelevement_bons = ".((int) $idtransferfile); + } $sql .= "WHERE rowid = ".((int) $did); + dol_syslog(get_class($this)."::makeStripeSepaRequest", LOG_DEBUG); $resql = $this->db->query($sql); if (!$resql) { diff --git a/htdocs/stripe/class/stripe.class.php b/htdocs/stripe/class/stripe.class.php index 972d2e25c23..942d5d8d275 100644 --- a/htdocs/stripe/class/stripe.class.php +++ b/htdocs/stripe/class/stripe.class.php @@ -602,7 +602,7 @@ class Stripe extends CommonObject * but not when using the STRIPE_USE_NEW_CHECKOUT. * * @param string $description Description - * @param Societe $object Object to pay with Stripe + * @param Societe $object Object of company to link the Stripe payment mode with * @param string $customer Stripe customer ref 'cus_xxxxxxxxxxxxx' via customerStripe() * @param string $key ''=Use common API. If not '', it is the Stripe connect account 'acc_....' to use Stripe connect * @param int $status Status (0=test, 1=live) @@ -813,8 +813,21 @@ class Stripe extends CommonObject $ipaddress = getUserRemoteIP(); $dataforcard = array( - "source" => array('object'=>'card', 'exp_month'=>$exp_date_month, 'exp_year'=>$exp_date_year, 'number'=>$number, 'cvc'=>$cvc, 'name'=>$cardholdername), - "metadata" => array('dol_id'=>$object->id, 'dol_version'=>DOL_VERSION, 'dol_entity'=>$conf->entity, 'ipaddress'=>$ipaddress) + "source" => array( + 'object'=>'card', + 'exp_month'=>$exp_date_month, + 'exp_year'=>$exp_date_year, + 'number'=>$number, + 'cvc'=>$cvc, + 'name'=>$cardholdername + ), + "metadata" => array( + 'dol_type'=>$object->element, + 'dol_id'=>$object->id, + 'dol_version'=>DOL_VERSION, + 'dol_entity'=>$conf->entity, + 'ipaddress'=>$ipaddress + ) ); //$a = \Stripe\Stripe::getApiKey(); @@ -898,8 +911,8 @@ class Stripe extends CommonObject * @param CompanyPaymentMode $object Object companypaymentmode to check, or create on stripe (create on stripe also update the societe_rib table for current entity) * @param string $stripeacc ''=Use common API. If not '', it is the Stripe connect account 'acc_....' to use Stripe connect * @param int $status Status (0=test, 1=live) - * @param int $createifnotlinkedtostripe 1=Create the stripe sepa and the link if the sepa is not yet linked to a stripe sepa. Deprecated with new Stripe API and SCA. - * @return \Stripe\PaymentMethod|null Stripe SEPA or null if not found + * @param int $createifnotlinkedtostripe 1=Create the stripe sepa and the link if the sepa is not yet linked to a stripe sepa. Used by the "Create bank to Stripe" feature. + * @return \Stripe\PaymentMethod|null Stripe SEPA or null if not found */ public function sepaStripe($cu, CompanyPaymentMode $object, $stripeacc = '', $status = 0, $createifnotlinkedtostripe = 0) { @@ -996,8 +1009,10 @@ class Stripe extends CommonObject $stripeacc = $stripearrayofkeysbyenv[$servicestatus]['secret_key']; dol_syslog("Try to create sepa_debit with data = ".json_encode($dataforcard)); - // TODO Replace with PaymentIntent. Can use $stripe->getPaymentIntent ? + $s = new \Stripe\StripeClient($stripeacc); + + // TODO Deprecated with the new Stripe API and SCA. Replace ->create() and ->createSource() Replace with getSetupIntent() ? $sepa = $s->sources->create($dataforcard); if (!$sepa) { $this->error = 'Creation of sepa_debit on Stripe has failed'; @@ -1007,9 +1022,10 @@ class Stripe extends CommonObject if (!$cs) { $this->error = 'Link SEPA <-> Customer failed'; } else { - dol_syslog("Update the payment request"); + dol_syslog("Update the payment mode of the customer"); // print json_encode($sepa); + // Save the Stripe payment mode ID into the Dolibarr database $sql = "UPDATE ".MAIN_DB_PREFIX."societe_rib"; $sql .= " SET stripe_card_ref = '".$this->db->escape($sepa->id)."', card_type = 'sepa_debit',"; $sql .= " stripe_account= '" . $this->db->escape($cu->id . "@" . $stripeacc) . "'"; @@ -1034,6 +1050,7 @@ class Stripe extends CommonObject return $sepa; } + /** * Create charge. * This is called by page htdocs/stripe/payment.php and may be deprecated. From e2dd443c584aa1dc21c7ff2b3396008fec6cd6e2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 20 Jan 2023 16:04:23 +0100 Subject: [PATCH 0969/1128] Doc --- htdocs/stripe/class/stripe.class.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/stripe/class/stripe.class.php b/htdocs/stripe/class/stripe.class.php index 942d5d8d275..6a6ad66a96a 100644 --- a/htdocs/stripe/class/stripe.class.php +++ b/htdocs/stripe/class/stripe.class.php @@ -804,6 +804,7 @@ class Stripe extends CommonObject dol_syslog($this->error, LOG_WARNING); } } elseif ($createifnotlinkedtostripe) { + // Deprecated with new Stripe API and SCA. We should not use anymore this part of code now. $exp_date_month = $obj->exp_date_month; $exp_date_year = $obj->exp_date_year; $number = $obj->number; @@ -1012,7 +1013,8 @@ class Stripe extends CommonObject $s = new \Stripe\StripeClient($stripeacc); - // TODO Deprecated with the new Stripe API and SCA. Replace ->create() and ->createSource() Replace with getSetupIntent() ? + // TODO Deprecated with the new Stripe API and SCA. + // TODO Replace ->create() and ->createSource() and replace with ->getSetupIntent() to get a Payment mode with $payment_method = \Stripe\PaymentMethod::retrieve($setupintent->payment_method); ? $sepa = $s->sources->create($dataforcard); if (!$sepa) { $this->error = 'Creation of sepa_debit on Stripe has failed'; From 343922210c66ccbb87ac1e5e0eee1f7dc94ff365 Mon Sep 17 00:00:00 2001 From: Randall Mora <50120822+randallmoraes@users.noreply.github.com> Date: Fri, 20 Jan 2023 09:12:58 -0600 Subject: [PATCH 0970/1128] repair security issue When reassing value to the $socid in line 68 clean the filter set by $user->socid --- htdocs/comm/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/comm/index.php b/htdocs/comm/index.php index 67af97cfe12..b748cac3df4 100644 --- a/htdocs/comm/index.php +++ b/htdocs/comm/index.php @@ -65,7 +65,7 @@ $max = $conf->global->MAIN_SIZE_SHORTLIST_LIMIT; $now = dol_now(); // Security check -$socid = GETPOST("socid", 'int'); +//$socid = GETPOST("socid", 'int'); if ($user->socid > 0) { $action = ''; $id = $user->socid; From 210410775982614150ee25f26c0d4e1e22c8d353 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 20 Jan 2023 17:38:47 +0100 Subject: [PATCH 0971/1128] Fix warnings --- htdocs/societe/class/societe.class.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 12a82c44180..01a72c6c7f3 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -784,6 +784,10 @@ class Societe extends CommonObject */ public $multicurrency_code; + /** + * @var string Set if company email found into unsubscribe of emailing list table + */ + public $no_email; // Fields loaded by fetchPartnerships() From 56f0efa2fc3142ee59eba51ceb8dfef0fddf25fc Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 20 Jan 2023 19:09:56 +0100 Subject: [PATCH 0972/1128] Fix greek language --- htdocs/langs/el_GR/main.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/langs/el_GR/main.lang b/htdocs/langs/el_GR/main.lang index 605ee14d77a..68583623c45 100644 --- a/htdocs/langs/el_GR/main.lang +++ b/htdocs/langs/el_GR/main.lang @@ -7,10 +7,10 @@ DIRECTION=ltr # To read Chinese pdf with Linux: sudo apt-get install poppler-data # cid0jp is for Japanish # cid0kr is for Korean -# DejaVuSans is for some Eastern languages, some Asian languages and some Arabic languages +# DejaVuSans is for some Eastern languages, greek, some Asian languages and some Arabic languages # freemono is for ru_RU or uk_UA, uz_UZ # freeserif is for Tamil -FONTFORPDF=helvetica +FONTFORPDF=DejaVuSans FONTSIZEFORPDF=10 SeparatorDecimal=, SeparatorThousand=. From f7302232df71d2d276984d4bf4d455ef77af39a2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 20 Jan 2023 19:34:26 +0100 Subject: [PATCH 0973/1128] Fix rounding --- htdocs/core/lib/functions.lib.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index c20f58a943d..0d4e30f4a2a 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -5743,9 +5743,9 @@ function price($amount, $form = 0, $outlangs = '', $trunc = 1, $rounding = -1, $ // If force rounding if ((string) $forcerounding != '-1') { - if ($forcerounding == 'MU') { + if ($forcerounding === 'MU') { $nbdecimal = $conf->global->MAIN_MAX_DECIMALS_UNIT; - } elseif ($forcerounding == 'MT') { + } elseif ($forcerounding === 'MT') { $nbdecimal = $conf->global->MAIN_MAX_DECIMALS_TOT; } elseif ($forcerounding >= 0) { $nbdecimal = $forcerounding; From 439f8d4bb429538ac16ff07c275ae67ef410490d Mon Sep 17 00:00:00 2001 From: Christian Humpel Date: Sat, 21 Jan 2023 08:45:10 +0100 Subject: [PATCH 0974/1128] New: REST Api - GET /setup/dictionary/incoterms --- htdocs/api/class/api_setup.class.php | 62 ++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/htdocs/api/class/api_setup.class.php b/htdocs/api/class/api_setup.class.php index e06cdeb0312..34fed417e70 100644 --- a/htdocs/api/class/api_setup.class.php +++ b/htdocs/api/class/api_setup.class.php @@ -1682,6 +1682,68 @@ class Setup extends DolibarrApi return $list; } + /** + * Get the list of incoterms. + * + * @param string $sortfield Sort field + * @param string $sortorder Sort order + * @param int $limit Number of items per page + * @param int $page Page number (starting from zero) + * @param int $active Payment term is active or not {@min 0} {@max 1} + * @param string $lang Code of the language the label of the type must be translated to + * @param string $sqlfilters Other criteria to filter answers separated by a comma. Syntax example "(t.code:like:'A%') and (t.active:>=:0)" + * @return array List of ticket types + * + * @url GET dictionary/incoterms + * + * @throws RestException + */ + public function getListOfIncoterms($sortfield = "code", $sortorder = 'ASC', $limit = 100, $page = 0, $active = 1, $lang = '', $sqlfilters = '') + { + $list = array(); + + $sql = "SELECT rowid, code, active"; + $sql .= " FROM ".MAIN_DB_PREFIX."c_incoterms as t"; + $sql .= " WHERE 1=1"; + + // Add sql filters + if ($sqlfilters) { + $errormessage = ''; + if (!DolibarrApi::_checkFilters($sqlfilters, $errormessage)) { + throw new RestException(400, 'Error when validating parameter sqlfilters -> '.$errormessage); + } + $regexstring = '\(([^:\'\(\)]+:[^:\'\(\)]+:[^\(\)]+)\)'; + $sql .= " AND (".preg_replace_callback('/'.$regexstring.'/', 'DolibarrApi::_forge_criteria_callback', $sqlfilters).")"; + } + + + $sql .= $this->db->order($sortfield, $sortorder); + + if ($limit) { + if ($page < 0) { + $page = 0; + } + $offset = $limit * $page; + + $sql .= $this->db->plimit($limit, $offset); + } + + $result = $this->db->query($sql); + + if ($result) { + $num = $this->db->num_rows($result); + $min = min($num, ($limit <= 0 ? $num : $limit)); + for ($i = 0; $i < $min; $i++) { + $type =$this->db->fetch_object($result); + $list[] = $type; + } + } else { + throw new RestException(503, 'Error when retrieving list of incoterm types : '.$this->db->lasterror()); + } + + return $list; + } + /** * Get properties of company * From 3c26825b5d86e3507f31b23c68aeee3ac20d9f6a Mon Sep 17 00:00:00 2001 From: Christian Humpel Date: Sat, 21 Jan 2023 08:49:24 +0100 Subject: [PATCH 0975/1128] change description --- htdocs/api/class/api_setup.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/api/class/api_setup.class.php b/htdocs/api/class/api_setup.class.php index 34fed417e70..c79a3e63653 100644 --- a/htdocs/api/class/api_setup.class.php +++ b/htdocs/api/class/api_setup.class.php @@ -1692,7 +1692,7 @@ class Setup extends DolibarrApi * @param int $active Payment term is active or not {@min 0} {@max 1} * @param string $lang Code of the language the label of the type must be translated to * @param string $sqlfilters Other criteria to filter answers separated by a comma. Syntax example "(t.code:like:'A%') and (t.active:>=:0)" - * @return array List of ticket types + * @return array List of incoterm types * * @url GET dictionary/incoterms * From 6ab5c79c6b0ff4ab70033743bb5889f16a1a47b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Sat, 21 Jan 2023 11:46:11 +0100 Subject: [PATCH 0976/1128] box_birthday_member doesn't give same date than box_birthday --- htdocs/core/boxes/box_birthdays_members.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/boxes/box_birthdays_members.php b/htdocs/core/boxes/box_birthdays_members.php index fc8dc4c6745..64a1f16e624 100644 --- a/htdocs/core/boxes/box_birthdays_members.php +++ b/htdocs/core/boxes/box_birthdays_members.php @@ -2,7 +2,7 @@ /* Copyright (C) 2003-2007 Rodolphe Quiedeville * Copyright (C) 2004-2010 Laurent Destailleur * Copyright (C) 2005-2009 Regis Houssin - * Copyright (C) 2015-2019 Frederic France + * Copyright (C) 2015-2023 Frederic France * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -115,7 +115,7 @@ class box_birthdays_members extends ModeleBoxes $this->info_box_contents[$line][] = array( 'td' => 'class="center nowraponall"', - 'text' => dol_print_date($dateb, "day", 'gmt').' - '.$age.' '.$langs->trans('DurationYears') + 'text' => dol_print_date($dateb, "day", 'tzserver').' - '.$age.' '.$langs->trans('DurationYears') ); /*$this->info_box_contents[$line][] = array( From fa185e9cf0118ff88b91f6e968d63cd5f9414755 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 21 Jan 2023 12:24:54 +0100 Subject: [PATCH 0977/1128] NEW Add helplist property to describe fields of obects --- htdocs/modulebuilder/template/class/myobject.class.php | 2 +- htdocs/modulebuilder/template/myobject_list.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/modulebuilder/template/class/myobject.class.php b/htdocs/modulebuilder/template/class/myobject.class.php index c60dbaa7e5b..9544e9c25ef 100644 --- a/htdocs/modulebuilder/template/class/myobject.class.php +++ b/htdocs/modulebuilder/template/class/myobject.class.php @@ -96,7 +96,7 @@ class MyObject extends CommonObject * 'searchall' is 1 if we want to search in this field when making a search from the quick search button. * 'isameasure' must be set to 1 or 2 if field can be used for measure. Field type must be summable like integer or double(24,8). Use 1 in most cases, or 2 if you don't want to see the column total into list (for example for percentage) * 'css' and 'cssview' and 'csslist' is the CSS style to use on field. 'css' is used in creation and update. 'cssview' is used in view mode. 'csslist' is used for columns in lists. For example: 'css'=>'minwidth300 maxwidth500 widthcentpercentminusx', 'cssview'=>'wordbreak', 'csslist'=>'tdoverflowmax200' - * 'help' is a 'TranslationString' to use to show a tooltip on field. You can also use 'TranslationString:keyfortooltiponlick' for a tooltip on click. + * 'help' and 'helplist' is a 'TranslationString' to use to show a tooltip on field. You can also use 'TranslationString:keyfortooltiponlick' for a tooltip on click. * 'showoncombobox' if value of the field must be visible into the label of the combobox that list record * 'disabled' is 1 if we want to have the field locked by a 'disabled' attribute. In most cases, this is never set into the definition of $fields into class, but is set dynamically by some part of code. * 'arrayofkeyval' to set a list of values if type is a list of predefined values. For example: array("0"=>"Draft","1"=>"Active","-1"=>"Cancel"). Note that type can be 'integer' or 'varchar' diff --git a/htdocs/modulebuilder/template/myobject_list.php b/htdocs/modulebuilder/template/myobject_list.php index b28a7a5f955..58231ee7de5 100644 --- a/htdocs/modulebuilder/template/myobject_list.php +++ b/htdocs/modulebuilder/template/myobject_list.php @@ -634,7 +634,7 @@ foreach ($object->fields as $key => $val) { } $cssforfield = preg_replace('/small\s*/', '', $cssforfield); // the 'small' css must not be used for the title label if (!empty($arrayfields['t.'.$key]['checked'])) { - print getTitleFieldOfList($arrayfields['t.'.$key]['label'], 0, $_SERVER['PHP_SELF'], 't.'.$key, '', $param, ($cssforfield ? 'class="'.$cssforfield.'"' : ''), $sortfield, $sortorder, ($cssforfield ? $cssforfield.' ' : ''))."\n"; + print getTitleFieldOfList($arrayfields['t.'.$key]['label'], 0, $_SERVER['PHP_SELF'], 't.'.$key, '', $param, ($cssforfield ? 'class="'.$cssforfield.'"' : ''), $sortfield, $sortorder, ($cssforfield ? $cssforfield.' ' : ''), 0, (empty($val['helplist']) ? '' : $val['helplist']))."\n"; $totalarray['nbfield']++; } } From 7d6c802085854529144946d274cbc60a5328de87 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 21 Jan 2023 12:25:23 +0100 Subject: [PATCH 0978/1128] Fix image size --- doc/images/dolibarr_screenshot1_1280x800.jpg | Bin 140952 -> 175013 bytes doc/images/dolibarr_screenshot2_1280x800.jpg | Bin 159669 -> 185341 bytes doc/images/dolibarr_screenshot5_1280x800.jpg | Bin 135317 -> 157713 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/images/dolibarr_screenshot1_1280x800.jpg b/doc/images/dolibarr_screenshot1_1280x800.jpg index ac238d39c1f8d5e022217ad3a690ccee819cd100..6d2c431239430a9949d125120f24abf215d66e0a 100644 GIT binary patch literal 175013 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

      TMpr=C4~b=d24m0EtS+K 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 diff --git a/doc/images/dolibarr_screenshot2_1280x800.jpg b/doc/images/dolibarr_screenshot2_1280x800.jpg index 2956a55d36aa8b86d46eae11e987f1c88c4c77e3..7f5319942c280da6f083e2eef93106d07c796212 100644 GIT binary patch literal 185341 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 z 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

      k=&p%0vx@~)?vnG|FD}&AsfzZ1~a}B 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

      2yQWp{p{P6PFV6n*i9 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%0D!N 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�<&qccLSIk{jL8 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%0Aq&_@9cyKK$hZ#2zu8Ci4Dv7+c0l)xt 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 O{@DZ9C;ia>e-i*~FhZ{Y diff --git a/doc/images/dolibarr_screenshot5_1280x800.jpg b/doc/images/dolibarr_screenshot5_1280x800.jpg index 6eea0a2f02936c757f5403c168a1c67678f2d3d3..f9ddd1d1f77bb72e03ffd0fb8dc84bb6e9b926da 100644 GIT binary patch literal 157713 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

      (2r!V>?s;JfU4J99?#AZm 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Ę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 BA`}1s From fb492515dfa60ba8569d93de4829fc963833302c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Sat, 21 Jan 2023 13:08:47 +0100 Subject: [PATCH 0979/1128] fix missing include --- htdocs/mailmanspip/class/mailmanspip.class.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/mailmanspip/class/mailmanspip.class.php b/htdocs/mailmanspip/class/mailmanspip.class.php index 6bc34977e4e..e03ea174ef7 100644 --- a/htdocs/mailmanspip/class/mailmanspip.class.php +++ b/htdocs/mailmanspip/class/mailmanspip.class.php @@ -6,7 +6,7 @@ * Copyright (C) 2004 Benoit Mortier * Copyright (C) 2009 Regis Houssin * Copyright (C) 2012 Marcos García - * Copyright (C) 2018 Frédéric France + * Copyright (C) 2018-2023 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 @@ -128,6 +128,7 @@ class MailmanSpip { global $conf; + require_once DOL_DOCUMENT_ROOT.'/core/lib/geturl.lib.php'; //Patterns that are going to be replaced with their original value $patterns = array( '%LISTE%', @@ -139,7 +140,7 @@ class MailmanSpip $list, $object->email, $object->pass, - $conf->global->ADHERENT_MAILMAN_ADMIN_PASSWORD + getDolGlobalString('ADHERENT_MAILMAN_ADMIN_PASSWORD') ); $curl_url = str_replace($patterns, $replace, $url); From e48b16a9c5b9c8a6aea162f74584e237fad68b73 Mon Sep 17 00:00:00 2001 From: Christian Humpel Date: Sat, 21 Jan 2023 23:20:43 +0100 Subject: [PATCH 0980/1128] integrate Contact Management for Supplier Orders --- .../fourn/class/api_supplier_orders.class.php | 149 ++++++++++++++++++ 1 file changed, 149 insertions(+) diff --git a/htdocs/fourn/class/api_supplier_orders.class.php b/htdocs/fourn/class/api_supplier_orders.class.php index d55a398dbd6..1b7098d9cc5 100644 --- a/htdocs/fourn/class/api_supplier_orders.class.php +++ b/htdocs/fourn/class/api_supplier_orders.class.php @@ -288,6 +288,155 @@ class SupplierOrders extends DolibarrApi return false; } + /** + * Get contacts of given supplier order + * + * Return an array with contact informations + * + * @param int $id ID of supplier order + * @param string $source Source of the contact (internal, external, all). + * @param string $type Type of the contact (BILLING, SHIPPING, CUSTOMER, SALESREPFOLL, ...) + * @return Object Object with cleaned properties + * + * @url GET {id}/contacts + * + * @throws RestException + */ + public function getContacts($id, $source, $type = '') + { + if (!DolibarrApiAccess::$user->rights->fournisseur->commande->lire) { + throw new RestException(401); + } + + $result = $this->order->fetch($id); + if (!$result) { + throw new RestException(404, 'Supplier order not found'); + } + + if (!DolibarrApi::_checkAccessToResource('fournisseur', $this->order->id, 'commande_fournisseur', 'commande')) { + throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); + } + $contacts = array(); + + if ($source == 'all' || $source == 'external') { + $tmpContacts = $this->order->liste_contact(-1, 'external', 0, $type); + $contacts = array_merge($contacts, $tmpContacts); + } + + if ($source == 'all' || $source == 'internal') { + $tmpContacts = $this->order->liste_contact(-1, 'internal', 0, $type); + $contacts = array_merge($contacts, $tmpContacts); + } + + return $this->_cleanObjectDatas($contacts); + } + + /** + * Add a contact type of given supplier order + * + * @param int $id Id of supplier order to update + * @param int $contactid Id of contact/user to add + * @param string $type Type of the contact (BILLING, SHIPPING, CUSTOMER, SALESREPFOLL, ...) + * @param string $source Source of the contact (external, internal) + * @return array + * + * @url POST {id}/contact/{contactid}/{type}/{source} + * + * @throws RestException 401 + * @throws RestException 404 + */ + public function postContact($id, $contactid, $type, $source) + { + if (!DolibarrApiAccess::$user->rights->fournisseur->commande->creer) { + throw new RestException(401); + } + + $result = $this->order->fetch($id); + if (!$result) { + throw new RestException(404, 'Supplier order not found'); + } + + if (!DolibarrApi::_checkAccessToResource('fournisseur', $this->order->id, 'commande_fournisseur', 'commande')) { + throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); + } + + $result = $this->order->add_contact($contactid, $type, $source); + + if ($result < 0) { + throw new RestException(500, 'Error when added the contact'); + } + + if ($result == 0) { + throw new RestException(304, 'contact already added'); + } + + return array( + 'success' => array( + 'code' => 200, + 'message' => 'Contact linked to the order' + ) + ); + } + + /** + * Unlink a contact type of given supplier order + * + * @param int $id Id of supplier order to update + * @param int $contactid Id of contact/user to add + * @param string $type Type of the contact (BILLING, SHIPPING, CUSTOMER, SALESREPFOLL, ...). + * @param string $source Source of the contact (internal, external). + * + * @url DELETE {id}/contact/{contactid}/{type}/{source} + * + * @return array + * + * @throws RestException 401 + * @throws RestException 404 + * @throws RestException 500 System error + */ + public function deleteContact($id, $contactid, $type, $source) + { + if (!DolibarrApiAccess::$user->rights->fournisseur->commande->creer) { + throw new RestException(401); + } + + $result = $this->order->fetch($id); + if (!$result) { + throw new RestException(404, 'Supplier order not found'); + } + + if (!DolibarrApi::_checkAccessToResource('fournisseur', $this->order->id, 'commande_fournisseur', 'commande')) { + throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); + } + + $contacts = $this->order->liste_contact(-1, $source, 0, $type); + + $contactToUnlink = 0; + foreach ($contacts as $contact) { + if ($contact['id'] == $contactid && $contact['code'] == $type) { + $contactToUnlink = $contact['rowid']; + break; + } + } + + if ($contactToUnlink == 0) { + throw new RestException(404, 'Linked contact not found'); + } + + $result = $this->order->delete_contact($contact['rowid']); + + if (!$result) { + throw new RestException(500, 'Error when deleted the contact'); + } + + return array( + 'success' => array( + 'code' => 200, + 'message' => 'Contact unlinked from supplier order' + ) + ); + } + /** * Delete supplier order * From 5c5d8d11f338906ee3feed954bfef0ab1a71dae1 Mon Sep 17 00:00:00 2001 From: Christian Humpel Date: Sat, 21 Jan 2023 23:43:47 +0100 Subject: [PATCH 0981/1128] add parentId (example id for SupplierOrder) --- htdocs/core/class/commonobject.class.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index b998fcbd71a..88fefed035f 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -1397,6 +1397,7 @@ abstract class CommonObject $transkey = "TypeContact_".$obj->element."_".$obj->source."_".$obj->code; $libelle_type = ($langs->trans($transkey) != $transkey ? $langs->trans($transkey) : $obj->libelle); $tab[$i] = array( + 'parentId' => $this->id, 'source' => $obj->source, 'socid' => $obj->socid, 'id' => $obj->id, From 9806941217c7f96c2612276858b5c1f4464252c5 Mon Sep 17 00:00:00 2001 From: Faustin Date: Sun, 22 Jan 2023 12:37:40 +0100 Subject: [PATCH 0982/1128] Update what is needed --- htdocs/admin/oauth.php | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/htdocs/admin/oauth.php b/htdocs/admin/oauth.php index 1ed4683496e..6fadc36a285 100644 --- a/htdocs/admin/oauth.php +++ b/htdocs/admin/oauth.php @@ -109,13 +109,36 @@ if ($action == 'update') { $error++; } } - print $newconstvalue.'_ID'."######".GETPOST($constvalue.'_ID')."\n"; + // If name changed, we have to delete old const and proceed few other changes if ($constvalue !== $newconstvalue) { dolibarr_del_const($db, $constvalue.'_ID', $conf->entity); dolibarr_del_const($db, $constvalue.'_SECRET', $conf->entity); dolibarr_del_const($db, $constvalue.'_URLAUTHORIZE', $conf->entity); dolibarr_del_const($db, $constvalue.'_SCOPE', $conf->entity); + + // Update name of token + $oldname = preg_replace('/^OAUTH_/', '', $constvalue); + $oldprovider = ucfirst(strtolower(preg_replace('/-.*$/', '', $oldname))); + $oldlabel = preg_replace('/^.*-/', '', $oldname); + $newlabel = preg_replace('/^.*-/', '', $newconstvalue); + + $sql = "UPDATE ".MAIN_DB_PREFIX."oauth_token"; + $sql.= " SET service = '".$oldprovider."-".$newlabel."'"; + $sql.= " WHERE service = '".$oldprovider."-".$oldlabel."'"; + + + $resql = $db->query($sql); + if (!$resql) { + $error++; + } + + // Update const where the token was used, might not be exhaustive + if (getDolGlobalString('MAIN_MAIL_SMTPS_OAUTH_SERVICE') == $oldname) { + if (!dolibarr_set_const($db, 'MAIN_MAIL_SMTPS_OAUTH_SERVICE', strtoupper($oldprovider).'-'.$newlabel, 'chaine', 0, '', $conf->entity)) { + $error++; + } + } } } } From 70509d105c2bc99b2d199bbd2a083e8511c25ecd Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 22 Jan 2023 13:27:22 +0100 Subject: [PATCH 0983/1128] Fix responsive --- htdocs/compta/prelevement/create.php | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/htdocs/compta/prelevement/create.php b/htdocs/compta/prelevement/create.php index 37a2d74c5e3..317136e1333 100644 --- a/htdocs/compta/prelevement/create.php +++ b/htdocs/compta/prelevement/create.php @@ -74,6 +74,8 @@ if ($type == 'bank-transfer') { $error = 0; $option = ""; +$mesg = ''; + /* * Actions @@ -225,13 +227,13 @@ if ($type == 'bank-transfer') { $title = $langs->trans("NbOfInvoiceToPayByBankTransfer"); } -print '

    '; -print ''; +print ''; print ''; -print ''; print ''; @@ -417,6 +419,7 @@ if ($resql) { $tradinvoice = "SupplierInvoice"; } + print '
    '; print '
    '; + print dol_escape_htmltag($invoicetmp->ref_supplier); + print "'; print $thirdpartytmp->getNomUrl(1); print "
    '.$langs->trans("Total").'  '; //if ($totalinvoices != $object->amount) print img_warning("AmountOfFileDiffersFromSumOfInvoices"); // It is normal to have total that differs. For an amount of invoice of 100, request to pay may be 50 only. From 9a40c966bd7d4cb67b8f16fbbb97b01d345034b0 Mon Sep 17 00:00:00 2001 From: piernov Date: Thu, 19 Jan 2023 16:25:59 +0100 Subject: [PATCH 0952/1128] Fix: don setPaid sets paid field When donation is classified as paid, paid field also needs to be set to 1 so that accounting reports show the correct information. --- htdocs/don/class/don.class.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/don/class/don.class.php b/htdocs/don/class/don.class.php index 181b3fc0ca3..3b09e8cc178 100644 --- a/htdocs/don/class/don.class.php +++ b/htdocs/don/class/don.class.php @@ -758,7 +758,7 @@ class Don extends CommonObject */ public function setPaid($id, $modepayment = 0) { - $sql = "UPDATE ".MAIN_DB_PREFIX."don SET fk_statut = 2"; + $sql = "UPDATE ".MAIN_DB_PREFIX."don SET fk_statut = 2, paid = 1"; if ($modepayment) { $sql .= ", fk_payment = ".((int) $modepayment); } @@ -768,6 +768,7 @@ class Don extends CommonObject if ($resql) { if ($this->db->affected_rows($resql)) { $this->statut = 2; + $this->paid = 1; return 1; } else { return 0; From 62d0b7b97299964cf85c5cd44c78eded7f92787a Mon Sep 17 00:00:00 2001 From: "T. Mulzer" Date: Thu, 19 Jan 2023 17:10:50 +0100 Subject: [PATCH 0953/1128] Update get_attribute_values.php --- htdocs/variants/ajax/get_attribute_values.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/variants/ajax/get_attribute_values.php b/htdocs/variants/ajax/get_attribute_values.php index 1867eb368de..3950a262500 100644 --- a/htdocs/variants/ajax/get_attribute_values.php +++ b/htdocs/variants/ajax/get_attribute_values.php @@ -83,4 +83,4 @@ if ($res == -1) { exit(); } -print json_encode($res); +print json_encode($res, JSON_PARTIAL_OUTPUT_ON_ERROR); From d8dcb0d1012278aea36f05f29cd4dde52a1714db Mon Sep 17 00:00:00 2001 From: "T. Mulzer" Date: Thu, 19 Jan 2023 17:13:25 +0100 Subject: [PATCH 0954/1128] Solves issue #17181 --- htdocs/variants/combinations.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/variants/combinations.php b/htdocs/variants/combinations.php index 5128f31d0c5..e5043dcd7fa 100644 --- a/htdocs/variants/combinations.php +++ b/htdocs/variants/combinations.php @@ -511,7 +511,7 @@ if (!empty($id) || !empty($ref)) { '; - - print '
     
    '; - if (!empty($value['icon'])) { - print ''; - } - print ''; - print '

    '; + if (!empty($value['icon'])) { + print ''; + } + print ''; + print '
     
    '; - if (!empty($value['icon'])) { - print ''; - } - print ''; - print '
    '.$title.''; -print $nb; +print '
    '.$title.''; +print dol_escape_htmltag($nb); print '
    '.$langs->trans("AmountTotal").''; +print ''; print price($pricetowithdraw); print '
    '; print ''; print ''; @@ -510,6 +513,8 @@ if ($resql) { print ''; } print "
    '.$langs->trans($tradinvoice).'
    '.$langs->trans("None").'
    "; + print ""; + print ""; print "
    \n"; } else { From 4208cb3bc67341ef7341f9a55aa70b327dd4c645 Mon Sep 17 00:00:00 2001 From: Faustin Date: Sun, 22 Jan 2023 13:54:39 +0100 Subject: [PATCH 0984/1128] escape missing in sql request --- htdocs/admin/oauth.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/admin/oauth.php b/htdocs/admin/oauth.php index 6fadc36a285..8c082d674db 100644 --- a/htdocs/admin/oauth.php +++ b/htdocs/admin/oauth.php @@ -123,9 +123,10 @@ if ($action == 'update') { $oldlabel = preg_replace('/^.*-/', '', $oldname); $newlabel = preg_replace('/^.*-/', '', $newconstvalue); + $sql = "UPDATE ".MAIN_DB_PREFIX."oauth_token"; - $sql.= " SET service = '".$oldprovider."-".$newlabel."'"; - $sql.= " WHERE service = '".$oldprovider."-".$oldlabel."'"; + $sql.= " SET service = '".$db->escape($oldprovider."-".$newlabel)."'"; + $sql.= " WHERE service = '".$db->escape($oldprovider."-".$oldlabel)."'"; $resql = $db->query($sql); From 1beb0ad3981ebf837a0f9600887c9617318bf5d2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 22 Jan 2023 14:09:19 +0100 Subject: [PATCH 0985/1128] Fix responsive --- htdocs/compta/prelevement/create.php | 48 ++++++++++++++++++---------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/htdocs/compta/prelevement/create.php b/htdocs/compta/prelevement/create.php index 317136e1333..b6e651029de 100644 --- a/htdocs/compta/prelevement/create.php +++ b/htdocs/compta/prelevement/create.php @@ -234,7 +234,7 @@ print '
    '.$langs->trans("AmountTotal").''; -print price($pricetowithdraw); +print price($pricetowithdraw, 0, $langs, 1,-1, -1, $conf->currency); print '
    '; print ''; print ''; + if ($type == 'bank-transfer') { + print ''; + } print ''; print ''; print ''; @@ -442,17 +450,25 @@ if ($resql) { $bac->fetch(0, $obj->socid); + $invoicestatic->id = $obj->rowid; + $invoicestatic->ref = $obj->ref; + $invoicestatic->ref_supplier = $obj->ref_supplier; + print ''; // Ref invoice - print ''; + if ($type == 'bank-transfer') { + print ''; + } + // Thirdparty - print ''; From 9f8e368890d2e8d0bbd73423580417da63cee5ca Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 22 Jan 2023 14:15:55 +0100 Subject: [PATCH 0986/1128] CSS --- htdocs/theme/eldy/global.inc.php | 2 +- htdocs/theme/md/style.css.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index bef2e6e7800..a8a79e8bb34 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -1638,7 +1638,7 @@ table[summary="list_of_modules"] .fa-cog { .maxwidth40 { max-width: 40px; } .maxwidth50 { max-width: 50px; } .maxwidth75 { max-width: 75px; } -.maxwidthdate { max-width: 80px; } +.maxwidthdate { max-width: 85px; } .maxwidth100 { max-width: 100px; } .maxwidth125 { max-width: 125px; } .maxwidth150 { max-width: 150px; } diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index afc43936695..0fde8b72044 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -1856,7 +1856,7 @@ tr.nobottom td { .maxwidth40 { max-width: 40px; } .maxwidth50 { max-width: 50px; } .maxwidth75 { max-width: 75px; } -.maxwidthdate { max-width: 80px; } +.maxwidthdate { max-width: 85px; } .maxwidth100 { max-width: 100px; } .maxwidth125 { max-width: 125px; } .maxwidth150 { max-width: 150px; } @@ -7652,7 +7652,7 @@ div.clipboardCPValue.hidewithsize { .lilevel1 span.paddingright { padding-right: 3px; } - + img.userphotopublicvcard { left: unset; top: unset; From 260ef315d053a9ff1d0235c696fb801e73763899 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 22 Jan 2023 14:21:47 +0100 Subject: [PATCH 0987/1128] Fix missing include --- htdocs/compta/prelevement/create.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/compta/prelevement/create.php b/htdocs/compta/prelevement/create.php index b6e651029de..56a047a387c 100644 --- a/htdocs/compta/prelevement/create.php +++ b/htdocs/compta/prelevement/create.php @@ -34,6 +34,7 @@ require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/bank.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/prelevement.lib.php'; require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; From 642ba67a55730128a6c9af4f687111266277a498 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 22 Jan 2023 14:21:47 +0100 Subject: [PATCH 0988/1128] Fix missing include --- htdocs/compta/prelevement/create.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/compta/prelevement/create.php b/htdocs/compta/prelevement/create.php index 37a2d74c5e3..7c91bfcca8e 100644 --- a/htdocs/compta/prelevement/create.php +++ b/htdocs/compta/prelevement/create.php @@ -34,6 +34,7 @@ require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/bank.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/prelevement.lib.php'; require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; From 29531b8cb425b639ee4499cdfb943722caa04845 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 22 Jan 2023 18:57:22 +0100 Subject: [PATCH 0989/1128] Fix phpcs --- htdocs/compta/prelevement/create.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/prelevement/create.php b/htdocs/compta/prelevement/create.php index 56a047a387c..598b86fcda3 100644 --- a/htdocs/compta/prelevement/create.php +++ b/htdocs/compta/prelevement/create.php @@ -235,7 +235,7 @@ print ''; print ''; print ''; print ''; From 1513c46c77fe21b1fd38d82f57e8db200a8273fc Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 22 Jan 2023 19:25:37 +0100 Subject: [PATCH 0990/1128] Doxygen --- htdocs/core/lib/functions.lib.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index a25d083c251..1076d32602f 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -3885,14 +3885,14 @@ function dol_strlen($string, $stringencoding = 'UTF-8') /** * Make a substring. Works even if mbstring module is not enabled for better compatibility. * - * @param string $string String to scan - * @param string $start Start position - * @param int $length Length (in nb of characters or nb of bytes depending on trunconbytes param) - * @param string $stringencoding Page code used for input string encoding - * @param int $trunconbytes 1=Length is max of bytes instead of max of characters - * @return string substring + * @param string $string String to scan + * @param string $start Start position + * @param int|null $length Length (in nb of characters or nb of bytes depending on trunconbytes param) + * @param string $stringencoding Page code used for input string encoding + * @param int $trunconbytes 1=Length is max of bytes instead of max of characters + * @return string substring */ -function dol_substr($string, $start, $length, $stringencoding = '', $trunconbytes = 0) +function dol_substr($string, $start, $length = null, $stringencoding = '', $trunconbytes = 0) { global $langs; From 545fa935e399faa293e7865294f76e7bf859fc81 Mon Sep 17 00:00:00 2001 From: UT from dolibit <45215329+dolibit-ut@users.noreply.github.com> Date: Sun, 22 Jan 2023 20:41:25 +0100 Subject: [PATCH 0991/1128] Update ChangeLog --- ChangeLog | 136 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 70 insertions(+), 66 deletions(-) diff --git a/ChangeLog b/ChangeLog index 76ec4faf452..00fbde60b91 100644 --- a/ChangeLog +++ b/ChangeLog @@ -24,10 +24,10 @@ For users: --------------- NEW: Minimal PHP version is now PHP 7.0 instead of PHP 5.6 -NEW: #21780 Add pid field to Cronjob class and store PID on job execution NEW: #19680 Add option PRODUCT_ALLOW_EXTERNAL_DOWNLOAD to automatically have uploaded files shared publicly by a link NEW: #20650 can move the checkbox column on left (experimental option MAIN_CHECKBOX_LEFT_COLUMN) NEW: #21000 Added columns 'alias_name' on project, supplier invoice, supplier order, supplier proposals and task list +NEW: #21780 Add pid field to Cronjob class and store PID on job execution NEW: #21395 Added option for dark theme mode in display - color and theme NEW: #21397 added option to auto define barcode numbers for third-parties in barcode module setup NEW: #21399 @@ -46,15 +46,11 @@ NEW: #22676 massaction for updating product prices NEW: #22735 Massaction to affect users on projects NEW: #25594 can chose if VAT ID is unique or not for third parties NEW: #4482 adding js to hide/show advanced option on the export data page + NEW: Add a constant to disallow modification of the product reference. -NEW: Add a method doAutoRenewContracts that can be used as a cron task. -NEW: Add " as enclosure by default for CSV export. Keep removing CR/LF. NEW: add attached file in presend email form of thirdparty card NEW: Add a way to enter LICENSE file content in property of website -NEW: add constant PROPAL_BYPASS_VALIDATED_STATUS NEW: Add employment anniversary in birthday box -NEW: Add fail2ban rules examples to limit access to /public pages -NEW: Add filter "Product subject to lot/Serial" in stock per lot/serial NEW: Add hidden option MAIN_EMAIL_SUPPORT_ACK to restore Email ack checkbox (feature abandonned by mailers) NEW: Add link to create an element from the category page NEW: Add max size send for "backup and link to mail" option @@ -63,43 +59,58 @@ NEW: Add more advices into the Setup security page NEW: Add new global variable for keeping the previous signature information on proposale (case of reopen a proposale) NEW: Add objectLink on expedition NEW: Add oldcopy to Ticket so triggers intercepting TICKET_MODIFY have access to old values of the updated properties -NEW: Add option FICHINTER_ALLOW_EXTERNAL_DOWNLOAD NEW: Add option --force on CLI cron_run_jobs.php NEW: Add option "Show price on the generated documents for receptions" -NEW: Add performance index (name for company and contact) and llx_bank_url(url_id) -NEW: Add picto property on sub-module for password generation +NEW: invoice export : add accounting affectation +NEW: label on products categories filter +NEW: manage no email with thirdparties (better for GDPR) +NEW: Manage VAT on all lines on purchases cycle +NEW: On a bank reconciled line, we can modify the bank receipt +NEW: parent company column and filter in invoice and order list +NEW: possibility to select scopes with checkbox for Oauth tokens +NEW: private and public note on user, thirdparty and contact list +NEW: Public counters feature +NEW: Saved token of OAUTH module are now encrypted into llx_oauth_token +NEW: Save one click to select on delivery ack, on emails. +NEW: scheduled job to send unpaid invoice reminder can now use the cc and bcc from email template +NEW: experimental SMTP using PhpImap allowing OAuth2 authentication (need to add option MAIN_IMAP_USE_PHPIMAP) +NEW: can substitue project title in mail template +NEW: The purge of files can purge only if older than a number of seconds +NEW: Update ActionComm type_code on email message ticket +NEW: Finance - VAT - Admin - Add information on deadline day for submission of VAT declaration +NEW: Add the target to select attendees of event for emailings NEW: add redirect on action confirm addconsumedline and addproduceline -NEW: Add a new advanced permission "read price" -NEW: Add substitution key __SENDEREMAIL_SIGNATURE__ NEW: Add the referrer-policy to "same-origin" by default on all public pages. -NEW: Add the SMTP header References on ticket email created by email NEW: Add trigger to record the event of sending an email from a project #20912 -NEW: Allow download link option in module configuration (propal,invoice,supplier proposal, order) -NEW: Can enter the unit price including the vat +NEW: Allow download link option in module configuration (propal, order, invoice, supplier proposal) +NEW: Can enter the unit price including the VAT NEW: Can invoice task time per different services -NEW: Can join several files by default on email form NEW: Can set a commercial discount by entering amount including VAT -NEW: Can set a monthly frequency (or multiple) in cron tasks. NEW: Can set start and end dates and comment on button "Activate all services" NEW: can sort and preselected best supplier price -NEW: Can use products categories to make inventory -NEW: Change filter type on tickets list into a multiselect combo NEW: show date delivery planned on orders linked to company and product -NEW: Encrypt all sensitive constants in llx_const NEW: filter on reception dates (from / to) in cheque paiement card + NEW: Accountancy - Add a graphic option to enable lettering function - FPC21 NEW: Accountancy - Add a way to clean some words when you generate thirdparty accounting account NEW: Accountancy - Added an option during export to export or not the lettering FPC21 NEW: Accountancy - Manage supplier deposit with specific account NEW: Accountancy - Model Digitaria - Add a way to clean some words when you generate thirdparty accounting account FPC22 +NEW: Agenda - start a simple support of recurrent events on agenda NEW: Bank - add salaries & VAT in tab planned entries -NEW: Contracts - Default template of contract is not mandatory +NEW: Contracts - add a method doAutoRenewContracts that can be used as a cron task +NEW: Contracts - default template of contract is not mandatory NEW: Contracts - Manage Position (Rank) on Contract Lines NEW: EMail - can copy/paste images into emails sent NEW: EMail - can edit label of an emailing even once sent +NEW: EMail - can join several files by default on email form NEW: EMail - can send an email on scheduled job error +NEW: EMail - on a form to send an email, we show all emails of all contacts of object +NEW: EMail - add the SMTP header References on ticket email created by email +NEW: EMail - add substitution key __SENDEREMAIL_SIGNATURE__ NEW: EMail-Collector - add IMAP port setting NEW: EMail-Collector - add a button "Test collect" +NEW: Export - Add " as enclosure by default for CSV export. Keep removing CR/LF. NEW: Event-Organization - add date event (!= date project) and location on event organization NEW: Extrafields - add badge in admin extrafields setup NEW: Extrafields - can edit property css, cssview, csslist on extrafields @@ -111,8 +122,10 @@ NEW: Invoice - Add french mention on pdf when vat debit option is on NEW: Members - default_lang for members NEW: Members - Table of membership types NEW: Members - add free membership amounts at the membership type level +NEW: Orders - resize parent company column in order list +NEW: Products supplier price - autofill default supplier VAT NEW: Projects - add author on list -NEW: Projects - add the thirdparty column to the time list (projet/tasks/time.php) +NEW: Projects - add thirdparty column to the time list (projet/tasks/time.php) NEW: Proposals - show delivery mode on PDF for proposals NEW: Proposals - skip accept/refuse process for proposals (option PROPAL_SKIP_ACCEPT_REFUSE) NEW: Reception - add a from/to on search on date field @@ -120,64 +133,55 @@ NEW: Stock - page for mass stock transfer can be used with no source stock NEW: Stock - product categories filter on inventory list NEW: Stock - show product label on inventory NEW: Stock - manage virtual stock at a future date +NEW: Stock Inventory - add filter "Product subject to lot/Serial" in stock per lot/serial +NEW: Stock Inventory - can use products categories to make inventory +NEW: Supplier Order List - add column private and public note NEW: TakePOS - add margin infos to TakePOS invoice lines -NEW: TakePOS - display currency in TakePOS menu -NEW: TakePOS - Header Scroll in TakePOS NEW: TakePOS - add price to product box in TakePOS NEW: TakePOS - add setup parameters, can setup terminal name -NEW: TakePOS - support of Stripe Terminal with TakePOS -NEW: TakePOS - Receipt preview in TakePOS setup NEW: TakePOS - different product list on smartphone +NEW: TakePOS - display currency in TakePOS menu +NEW: TakePOS - Header Scroll in TakePOS +NEW: TakePOS - Receipt preview in TakePOS setup +NEW: TakePOS - support of Stripe Terminal with TakePOS NEW: Thirdparty - set thirdparty type with company modify trigger +NEW: Tickets - change filter type on tickets list into a multiselect combo NEW: Website - can delete a whole website if disabled NEW: Website - can remove a website template NEW: Website - can set header "Strict-Transport-Security" in web sites. NEW: Website - can switch status of website and page from the website toolbar NEW: Website - Templates of websites are now directories and not zip into core repo NEW: Website - add 4 other templates in website module -NEW: General - Bulk action to remove a category in list/search website pages -NEW: General - If we select another view list mode, we keep it -NEW: General - Introduce dolEncrypt and dolDecrypt to be able to encrypt data in db -NEW: invoice export : add accounting affectation -NEW: label on products categories filter -NEW: The link "add to bookmark" is always on top in the bookmark popup -NEW: manage no email with thirdparties (better for GDPR) -NEW: Manage VAT on all lines on purchases cycle -NEW: On a bank reconciled line, we can modify the bank receipt -NEW: On a form to send an email, we show all emails of all contacts of object -NEW: parent company column and filter in invoice and order list -NEW: Add show "Sales rep" option for PDF -NEW: Picto for shared link is clickable -NEW: possibility to select scopes with checkbox for Oauth tokens -NEW: private and public note on user, thirdparty and contact list -NEW: Product supplier price: autofill default supplier VAT -NEW: Public counters feature -NEW: Start a simple support of recurrent events on agenda -NEW: Resize parent company column in order list -NEW: Saved token of OAUTH module are now encrypted into llx_oauth_token -NEW: Save one click to select on delivery ack, on emails. -NEW: scheduled job to send unpaid invoice reminder can now use the cc and bcc from email template -NEW: Show also scheduled task never finished in scheduled task widget -NEW: show badge with number of extrafields in setup -NEW: show category tree in sellist and chkbxlst for common object -NEW: Show picto and color into combo for selection of tags -NEW: show sell-by and eat-by dates only if not empty -NEW: show SellBy/EatBy dates for each batch product in shipment card -NEW: experimental SMTP using PhpImap allowing OAuth2 authentication (need to add option MAIN_IMAP_USE_PHPIMAP) -NEW: can substitue project title in mail template -NEW: Supplier order list - Add column private and public note -NEW: The purge of files can purge only if older than a number of seconds -NEW: Update ActionComm type_code on email message ticket -NEW: VAT - Admin - Add information on deadline day for submission of VAT declaration -NEW: expand/collapse permissions on user permission page -NEW: Add the target to select attendees of event for emailings + +General: +NEW: Actions: Bulk action to remove a category in list/search website pages +NEW: Cronjobs: can set a monthly frequency (or multiple) in cron tasks +NEW: Database: Encrypt all sensitive constants in llx_const +NEW: Database: Add performance index (name for company and contact) and llx_bank_url(url_id) +NEW: Database: Introduce dolEncrypt and dolDecrypt to be able to encrypt data in db +NEW: GUI: If we select another view list mode, we keep it +NEW: GUI: the link "add to bookmark" is always on top in the bookmark popup +NEW: GUI: Picto for shared link is clickable +NEW: GUI: add picto property on sub-module for password generation +NEW: GUI: show also scheduled task never finished in scheduled task widget +NEW: GUI: show badge with number of extrafields in setup +NEW: GUI: show category tree in sellist and chkbxlst for common object +NEW: GUI: show picto and color into combo for selection of tags +NEW: GUI: show sell-by and eat-by dates only if not empty +NEW: GUI: show SellBy/EatBy dates for each batch product in shipment card +NEW: GUI/Permissions: expand/collapse permissions on user permission page +NEW: Permissions: add a new advanced permission "read price" +NEW: Print: add show "Sales rep" option for PDF +NEW: Security: add fail2ban rules examples to limit access to /public pages Option / Const for System: -NEW: MAIN_SEARCH_CATEGORY_PRODUCT_ON_LISTS const to show category customer filter -NEW: PRODUCTBATCH_SHOW_WAREHOUSE_ON_SHIPMENT showing warehouse on PDF -NEW: PRODUIT_DESC_IN_FORM accept (desktop only or +smartphone) +NEW: FICHINTER_ALLOW_EXTERNAL_DOWNLOAD +NEW: MAIN_SEARCH_CATEGORY_PRODUCT_ON_LISTS - const to show category customer filter +NEW: PRODUCTBATCH_SHOW_WAREHOUSE_ON_SHIPMENT - showing warehouse on PDF +NEW: PRODUIT_DESC_IN_FORM accept - desktop only or +smartphone +NEW: PROPAL_BYPASS_VALIDATED_STATUS NEW: PROPAL_NEW_AS_SIGNED -NEW: TIMESPENT_ALWAYS_UPDATE_THM, when it's on we always check current thm of user to update it in task time line +NEW: TIMESPENT_ALWAYS_UPDATE_THM - when it's on we always check current thm of user to update it in task time line Localisation: NEW: adding JAPAN Chart-of-Account and regions/departments @@ -207,7 +211,7 @@ NEW: support multilang in Civilities API Hooks: NEW: Actioncomm - add new hooks for actioncomm -NEW: Actioncomm - hook formConfirm on action comm card +NEW: Actioncomm - hook formConfirm on actioncomm card NEW: Agenda - hook on agenda pages NEW: Help - hook "changeHelpURL" to modify target of the help button NEW: Product - add hook to show virtual stock details on product stock card From fb2d9b315a7496b03e2e2960e67bf9c53137708e Mon Sep 17 00:00:00 2001 From: Christian Humpel Date: Sun, 22 Jan 2023 22:31:46 +0100 Subject: [PATCH 0992/1128] Fix bracket. --- htdocs/bom/bom_card.php | 301 ++++++++++++++++++++-------------------- 1 file changed, 150 insertions(+), 151 deletions(-) diff --git a/htdocs/bom/bom_card.php b/htdocs/bom/bom_card.php index 333b6232f9f..fbced8e6773 100644 --- a/htdocs/bom/bom_card.php +++ b/htdocs/bom/bom_card.php @@ -358,11 +358,11 @@ if (empty($reshook)) { // Confirmation to delete if ($action == 'delete') { - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('DeleteBillOfMaterials'), $langs->trans('ConfirmDeleteBillOfMaterials'), 'confirm_delete', '', 0, 1); + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('DeleteBillOfMaterials'), $langs->trans('ConfirmDeleteBillOfMaterials'), 'confirm_delete', '', 0, 1); } // Confirmation to delete line if ($action == 'deleteline') { - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$lineid, $langs->trans('DeleteLine'), $langs->trans('ConfirmDeleteLine'), 'confirm_deleteline', '', 0, 1); + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id . '&lineid=' . $lineid, $langs->trans('DeleteLine'), $langs->trans('ConfirmDeleteLine'), 'confirm_deleteline', '', 0, 1); } // Confirmation of validation @@ -393,13 +393,13 @@ if (empty($reshook)) { $forcecombo = 1; // There is a bug in IE10 that make combo inside popup crazy } $formquestion = array( - // 'text' => $langs->trans("ConfirmClone"), - // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1), - // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1), + // 'text' => $langs->trans("ConfirmClone"), + // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1), + // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1), ); } - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('Validate'), $text, 'confirm_validate', $formquestion, 0, 1, 220); + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('Validate'), $text, 'confirm_validate', $formquestion, 0, 1, 220); } // Confirmation of closing @@ -421,13 +421,13 @@ if (empty($reshook)) { $forcecombo = 1; // There is a bug in IE10 that make combo inside popup crazy } $formquestion = array( - // 'text' => $langs->trans("ConfirmClone"), - // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1), - // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1), + // 'text' => $langs->trans("ConfirmClone"), + // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1), + // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1), ); } - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('Close'), $text, 'confirm_close', $formquestion, 0, 1, 220); + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('Close'), $text, 'confirm_close', $formquestion, 0, 1, 220); } // Confirmation of reopen @@ -444,26 +444,26 @@ if (empty($reshook)) { $formquestion = array(); if (isModEnabled('bom')) { $langs->load("mrp"); - require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php'; + require_once DOL_DOCUMENT_ROOT . '/product/class/html.formproduct.class.php'; $forcecombo = 0; if ($conf->browser->name == 'ie') { $forcecombo = 1; // There is a bug in IE10 that make combo inside popup crazy } $formquestion = array( - // 'text' => $langs->trans("ConfirmClone"), - // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1), - // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1), + // 'text' => $langs->trans("ConfirmClone"), + // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1), + // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1), ); } - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ReOpen'), $text, 'confirm_reopen', $formquestion, 0, 1, 220); + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('ReOpen'), $text, 'confirm_reopen', $formquestion, 0, 1, 220); } // Clone confirmation if ($action == 'clone') { // Create an array for form $formquestion = array(); - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneBillOfMaterials', $object->ref), 'confirm_clone', $formquestion, 'yes', 1); + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneBillOfMaterials', $object->ref), 'confirm_clone', $formquestion, 'yes', 1); } // Confirmation of action xxxx @@ -471,7 +471,7 @@ if (empty($reshook)) { $text = $langs->trans('ConfirmSetToDraft', $object->ref); $formquestion = array(); - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('SetToDraft'), $text, 'confirm_setdraft', $formquestion, 0, 1, 220); + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('SetToDraft'), $text, 'confirm_setdraft', $formquestion, 0, 1, 220); } // Call Hook formConfirm @@ -489,7 +489,7 @@ if (empty($reshook)) { // Object card // ------------------------------------------------------------ - $linkback = ''.$langs->trans("BackToList").''; + $linkback = '' . $langs->trans("BackToList") . ''; $morehtmlref = '
    '; /* @@ -538,17 +538,17 @@ if (empty($reshook)) { print '
    '; print '
    '; print '
    '; - print '
    '.$langs->trans($tradinvoice).''.$langs->trans("RefSupplier").''.$langs->trans("ThirdParty").''.$langs->trans("RIB").''.$langs->trans("RUM").'
    '; - $invoicestatic->id = $obj->rowid; - $invoicestatic->ref = $obj->ref; + print ''; print $invoicestatic->getNomUrl(1, 'withdraw'); print ''; + print dol_escape_htmltag($invoicestatic->ref_supplier); + print ''; + print ''; $thirdpartystatic->fetch($obj->socid); print $thirdpartystatic->getNomUrl(1, 'ban'); print '
    '.$langs->trans("AmountTotal").''; -print price($pricetowithdraw, 0, $langs, 1,-1, -1, $conf->currency); +print price($pricetowithdraw, 0, $langs, 1, -1, -1, $conf->currency); print '
    '."\n"; + print '
    ' . "\n"; // Common attributes $keyforbreak = 'duration'; - include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_view.tpl.php'; + include DOL_DOCUMENT_ROOT . '/core/tpl/commonfields_view.tpl.php'; $object->calculateCosts(); - print ''; - print ''; + print ''; + print ''; // Other attributes - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php'; + include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php'; print '
    '.$form->textwithpicto($langs->trans("TotalCost"), $langs->trans("BOMTotalCost")).''.price($object->total_cost).'
    '.$langs->trans("UnitCost").''.price($object->unit_cost).'
    ' . $form->textwithpicto($langs->trans("TotalCost"), $langs->trans("BOMTotalCost")) . '' . price($object->total_cost) . '
    ' . $langs->trans("UnitCost") . '' . price($object->unit_cost) . '
    '; print ''; @@ -559,7 +559,6 @@ if (empty($reshook)) { print dol_get_fiche_end(); - /* * Lines */ @@ -580,7 +579,7 @@ if (empty($reshook)) { '; if (!empty($conf->use_javascript_ajax) && $object->status == 0) { - include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php'; + include DOL_DOCUMENT_ROOT . '/core/tpl/ajaxrow.tpl.php'; } print '
    '; @@ -602,7 +601,7 @@ if (empty($reshook)) { $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); if (empty($reshook)) - $object->formAddObjectLine(1, $mysoc, null, '/bom/tpl'); + $object->formAddObjectLine(1, $mysoc, null, '/bom/tpl'); } } @@ -652,7 +651,7 @@ if (empty($reshook)) { $reshook = $hookmanager->executeHooks('formAddObjectServiceLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); if (empty($reshook)) - $object->formAddObjectLine(1, $mysoc, null, '/bom/tpl'); + $object->formAddObjectLine(1, $mysoc, null, '/bom/tpl'); } } } @@ -665,146 +664,146 @@ if (empty($reshook)) { print "\n"; mrpCollapseBomManagement(); - } - $res = $object->fetchLines(); + $res = $object->fetchLines(); - // Buttons for actions + // Buttons for actions - if ($action != 'presend' && $action != 'editline') { - print '
    '."\n"; - $parameters = array(); - $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook - if ($reshook < 0) { - setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); - } - - if (empty($reshook)) { - // Send - //if (empty($user->socid)) { - // print '' . $langs->trans('SendMail') . ''."\n"; - //} - - // Back to draft - if ($object->status == $object::STATUS_VALIDATED) { - if ($permissiontoadd) { - print ''.$langs->trans("SetToDraft").''."\n"; - } + if ($action != 'presend' && $action != 'editline') { + print '
    ' . "\n"; + $parameters = array(); + $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + if ($reshook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); } - // Modify - if ($object->status == $object::STATUS_DRAFT) { - if ($permissiontoadd) { - print ''.$langs->trans("Modify").''."\n"; - } else { - print ''.$langs->trans('Modify').''."\n"; - } - } + if (empty($reshook)) { + // Send + //if (empty($user->socid)) { + // print '' . $langs->trans('SendMail') . ''."\n"; + //} - // Validate - if ($object->status == $object::STATUS_DRAFT) { - if ($permissiontoadd) { - if (is_array($object->lines) && count($object->lines) > 0) { - print ''.$langs->trans("Validate").''."\n"; - } else { - $langs->load("errors"); - print ''.$langs->trans("Validate").''."\n"; + // Back to draft + if ($object->status == $object::STATUS_VALIDATED) { + if ($permissiontoadd) { + print '' . $langs->trans("SetToDraft") . '' . "\n"; } } - } - // Re-open - if ($permissiontoadd && $object->status == $object::STATUS_CANCELED) { - print ''.$langs->trans("ReOpen").''."\n"; - } - - // Create MO - if (isModEnabled('mrp')) { - if ($object->status == $object::STATUS_VALIDATED && !empty($user->rights->mrp->write)) { - print ''.$langs->trans("CreateMO").''."\n"; + // Modify + if ($object->status == $object::STATUS_DRAFT) { + if ($permissiontoadd) { + print '' . $langs->trans("Modify") . '' . "\n"; + } else { + print '' . $langs->trans('Modify') . '' . "\n"; + } } - } - // Clone - if ($permissiontoadd) { - print dolGetButtonAction($langs->trans("ToClone"), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.(!empty($object->socid) ? '&socid='.$object->socid : "").'&action=clone&object=bom', 'clone', $permissiontoadd); - } + // Validate + if ($object->status == $object::STATUS_DRAFT) { + if ($permissiontoadd) { + if (is_array($object->lines) && count($object->lines) > 0) { + print '' . $langs->trans("Validate") . '' . "\n"; + } else { + $langs->load("errors"); + print '' . $langs->trans("Validate") . '' . "\n"; + } + } + } - // Close / Cancel - if ($permissiontoadd && $object->status == $object::STATUS_VALIDATED) { - print ''.$langs->trans("Disable").''."\n"; - } + // Re-open + if ($permissiontoadd && $object->status == $object::STATUS_CANCELED) { + print '' . $langs->trans("ReOpen") . '' . "\n"; + } - /* - if ($user->rights->bom->write) - { - if ($object->status == 1) - { - print ''.$langs->trans("Disable").''."\n"; - } - else - { - print ''.$langs->trans("Enable").''."\n"; - } - } - */ + // Create MO + if (isModEnabled('mrp')) { + if ($object->status == $object::STATUS_VALIDATED && !empty($user->rights->mrp->write)) { + print '' . $langs->trans("CreateMO") . '' . "\n"; + } + } - // Delete - print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $permissiontodelete); + // Clone + if ($permissiontoadd) { + print dolGetButtonAction($langs->trans("ToClone"), '', 'default', $_SERVER['PHP_SELF'] . '?id=' . $object->id . (!empty($object->socid) ? '&socid=' . $object->socid : "") . '&action=clone&object=bom', 'clone', $permissiontoadd); + } + + // Close / Cancel + if ($permissiontoadd && $object->status == $object::STATUS_VALIDATED) { + print '' . $langs->trans("Disable") . '' . "\n"; + } + + /* + if ($user->rights->bom->write) + { + if ($object->status == 1) + { + print ''.$langs->trans("Disable").''."\n"; + } + else + { + print ''.$langs->trans("Enable").''."\n"; + } + } + */ + + // Delete + print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"] . '?id=' . $object->id . '&action=delete&token=' . newToken(), 'delete', $permissiontodelete); + } + print '
    ' . "\n"; } - print '
    '."\n"; + + + // Select mail models is same action as presend + if (GETPOST('modelselected')) { + $action = 'presend'; + } + + if ($action != 'presend') { + print '
    '; + print ''; // ancre + + // Documents + $objref = dol_sanitizeFileName($object->ref); + $relativepath = $objref . '/' . $objref . '.pdf'; + $filedir = $conf->bom->dir_output . '/' . $objref; + $urlsource = $_SERVER["PHP_SELF"] . "?id=" . $object->id; + $genallowed = $user->rights->bom->read; // If you can read, you can build the PDF to read content + $delallowed = $user->rights->bom->write; // If you can create/edit, you can remove a file on card + print $formfile->showdocuments('bom', $objref, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf, 1, 0, 0, 28, 0, '', '', '', $langs->defaultlang); + + // Show links to link elements + $linktoelem = $form->showLinkToObjectBlock($object, null, array('bom')); + $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem); + + + print '
    '; + + $MAXEVENT = 10; + + $morehtmlcenter = dolGetButtonTitle($langs->trans('SeeAll'), '', 'fa fa-bars imgforviewmode', DOL_URL_ROOT . '/bom/bom_agenda.php?id=' . $object->id); + + // List of actions on element + include_once DOL_DOCUMENT_ROOT . '/core/class/html.formactions.class.php'; + $formactions = new FormActions($db); + $somethingshown = $formactions->showactions($object, $object->element, 0, 1, '', $MAXEVENT, '', $morehtmlcenter); + + print '
    '; + } + + //Select mail models is same action as presend + if (GETPOST('modelselected')) { + $action = 'presend'; + } + + // Presend form + $modelmail = 'bom'; + $defaulttopic = 'InformationMessage'; + $diroutput = $conf->bom->dir_output; + $trackid = 'bom' . $object->id; + + include DOL_DOCUMENT_ROOT . '/core/tpl/card_presend.tpl.php'; } - - - // Select mail models is same action as presend - if (GETPOST('modelselected')) { - $action = 'presend'; - } - - if ($action != 'presend') { - print '
    '; - print ''; // ancre - - // Documents - $objref = dol_sanitizeFileName($object->ref); - $relativepath = $objref.'/'.$objref.'.pdf'; - $filedir = $conf->bom->dir_output.'/'.$objref; - $urlsource = $_SERVER["PHP_SELF"]."?id=".$object->id; - $genallowed = $user->rights->bom->read; // If you can read, you can build the PDF to read content - $delallowed = $user->rights->bom->write; // If you can create/edit, you can remove a file on card - print $formfile->showdocuments('bom', $objref, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf, 1, 0, 0, 28, 0, '', '', '', $langs->defaultlang); - - // Show links to link elements - $linktoelem = $form->showLinkToObjectBlock($object, null, array('bom')); - $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem); - - - print '
    '; - - $MAXEVENT = 10; - - $morehtmlcenter = dolGetButtonTitle($langs->trans('SeeAll'), '', 'fa fa-bars imgforviewmode', DOL_URL_ROOT.'/bom/bom_agenda.php?id='.$object->id); - - // List of actions on element - include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php'; - $formactions = new FormActions($db); - $somethingshown = $formactions->showactions($object, $object->element, 0, 1, '', $MAXEVENT, '', $morehtmlcenter); - - print '
    '; - } - - //Select mail models is same action as presend - if (GETPOST('modelselected')) { - $action = 'presend'; - } - - // Presend form - $modelmail = 'bom'; - $defaulttopic = 'InformationMessage'; - $diroutput = $conf->bom->dir_output; - $trackid = 'bom'.$object->id; - - include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php'; } // End of page From c067e52ec8c5896ff756d4b12d6c4ea220749f2c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 23 Jan 2023 11:28:37 +0100 Subject: [PATCH 0993/1128] Doc --- htdocs/core/website.inc.php | 2 +- htdocs/main.inc.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/website.inc.php b/htdocs/core/website.inc.php index 2bdc9080b78..82fcabd557b 100644 --- a/htdocs/core/website.inc.php +++ b/htdocs/core/website.inc.php @@ -112,7 +112,7 @@ if (!defined('USEDOLIBARRSERVER') && !defined('USEDOLIBARREDITOR')) { // The constant WEBSITE_MAIN_SECURITY_FORCECSP should never be defined by page, but the variable used just after may be // A default security policy that keep usage of js external component like ckeditor, stripe, google, working - // $contentsecuritypolicy = "font-src *; img-src *; style-src * 'unsafe-inline' 'unsafe-eval'; default-src 'self' *.stripe.com 'unsafe-inline' 'unsafe-eval'; script-src 'self' *.stripe.com 'unsafe-inline' 'unsafe-eval'; frame-src 'self' *.stripe.com; connect-src 'self';"; + // $contentsecuritypolicy = "font-src *; img-src *; style-src * 'unsafe-inline' 'unsafe-eval'; default-src 'self' *.stripe.com 'unsafe-inline' 'unsafe-eval'; script-src 'self' *.stripe.com 'unsafe-inline' 'unsafe-eval'; frame-ancestors 'self'; frame-src 'self' *.stripe.com; connect-src 'self';"; $contentsecuritypolicy = getDolGlobalString('WEBSITE_MAIN_SECURITY_FORCECSP'); if (!is_object($hookmanager)) { diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 2904f576bf7..115be3cf0cf 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1473,7 +1473,7 @@ function top_httphead($contenttype = 'text/html', $forcenocache = 0) // If CSP not forced from the page // A default security policy that keep usage of js external component like ckeditor, stripe, google, working - // $contentsecuritypolicy = "font-src *; img-src *; style-src * 'unsafe-inline' 'unsafe-eval'; default-src 'self' *.stripe.com 'unsafe-inline' 'unsafe-eval'; script-src 'self' *.stripe.com 'unsafe-inline' 'unsafe-eval'; frame-src 'self' *.stripe.com; connect-src 'self';"; + // $contentsecuritypolicy = "frame-ancestors 'self'; font-src *; img-src *; style-src * 'unsafe-inline' 'unsafe-eval'; default-src 'self' *.stripe.com 'unsafe-inline' 'unsafe-eval'; script-src 'self' *.stripe.com 'unsafe-inline' 'unsafe-eval'; frame-src 'self' *.stripe.com; connect-src 'self';"; $contentsecuritypolicy = getDolGlobalString('MAIN_SECURITY_FORCECSP'); if (!is_object($hookmanager)) { @@ -1492,7 +1492,7 @@ function top_httphead($contenttype = 'text/html', $forcenocache = 0) if (!empty($contentsecuritypolicy)) { // For example, to restrict 'script', 'object', 'frames' or 'img' to some domains: - // script-src https://api.google.com https://anotherhost.com; object-src https://youtube.com; frame-src https://youtube.com; img-src: https://static.example.com + // frame-ancestors 'self'; script-src https://api.google.com https://anotherhost.com; object-src https://youtube.com; frame-src https://youtube.com; img-src https://static.example.com // For example, to restrict everything to one domain, except 'object', ...: // default-src https://cdn.example.net; object-src 'none' // For example, to restrict everything to itself except img that can be on other servers: From 58043c5d5e225fd61df58b6e5b65cb63ad7e7bf1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 23 Jan 2023 12:28:17 +0100 Subject: [PATCH 0994/1128] Add imgs --- doc/images/dolibarr_screenshot12_1280x800.jpg | Bin 0 -> 136840 bytes doc/images/dolibarr_screenshot4_1280x800.jpg | Bin 0 -> 117180 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/images/dolibarr_screenshot12_1280x800.jpg create mode 100644 doc/images/dolibarr_screenshot4_1280x800.jpg diff --git a/doc/images/dolibarr_screenshot12_1280x800.jpg b/doc/images/dolibarr_screenshot12_1280x800.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bdc3a13722803f97f641202bca8266bbd16578e0 GIT binary patch literal 136840 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

    *?*HeLgt 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�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 Date: Mon, 23 Jan 2023 19:36:55 +0100 Subject: [PATCH 0995/1128] Update llx_10_c_regions.sql add new Slovakia --- htdocs/install/mysql/data/llx_10_c_regions.sql | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/htdocs/install/mysql/data/llx_10_c_regions.sql b/htdocs/install/mysql/data/llx_10_c_regions.sql index 52a1a3bbbb6..f86fbe069b8 100644 --- a/htdocs/install/mysql/data/llx_10_c_regions.sql +++ b/htdocs/install/mysql/data/llx_10_c_regions.sql @@ -78,6 +78,7 @@ -- Portugal -- Romania -> for Departmements -- San Salvador +-- Slovakia -- Slovenia -- Spain -- Switzerland/Suisse -> for Departmements/Cantons @@ -450,6 +451,13 @@ INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) values ( 8 INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) values ( 86, 8603, NULL, NULL, 'Occidental'); +-- Slovakia Regions (rowid country=201) +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 201, '20101', 'SK01', NULL, 'Bratislava Region'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 201, '20102', 'SK02', NULL, 'Western Slovakia'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 201, '20103', 'SK03', NULL, 'Central Slovakia'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 201, '20104', 'SK04', NULL, 'Eastern Slovakia'); + + -- Slovenia Regions (rowid country=202) INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 202, '20203', 'SI03', NULL, 'East Slovenia'); INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 202, '20204', 'SI04', NULL, 'West Slovenia'); From c5fcd99f6e92f6228cddc3c998c28b758230dbd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20NASSIET?= Date: Mon, 23 Jan 2023 19:51:00 +0100 Subject: [PATCH 0996/1128] Adding a hook addToLandingPageList in userihm context --- htdocs/user/param_ihm.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/htdocs/user/param_ihm.php b/htdocs/user/param_ihm.php index 3d2e3240ce3..136da34e1bd 100644 --- a/htdocs/user/param_ihm.php +++ b/htdocs/user/param_ihm.php @@ -215,6 +215,16 @@ if (isModEnabled('ticket')) { $tmparray['ticket/list.php?mainmenu=ticket&leftmenu='] = 'Tickets'; } +// Hook for insertion new items in the List of possible landing pages +$reshook = $hookmanager->executeHooks('addToLandingPageList', $tmparray, $object); +if ($reshook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); +} elseif ($reshook > 0) { + $tmparray=$hookmanager->resArray; +} elseif ($reshook == 0) { + $tmparray=array_merge($tmparray, $hookmanager->resArray); +} + $head = user_prepare_head($object); $title = $langs->trans("User"); From 229b06a33309c794d862a96cb2ed6f66d303b32b Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Mon, 23 Jan 2023 19:56:52 +0100 Subject: [PATCH 0997/1128] fix sql request by adding left join for user table --- htdocs/hrm/position_list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/hrm/position_list.php b/htdocs/hrm/position_list.php index 308e48e153b..de86b3d41c5 100644 --- a/htdocs/hrm/position_list.php +++ b/htdocs/hrm/position_list.php @@ -234,7 +234,7 @@ $parameters = array(); $reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object); // Note that $action and $object may have been modified by hook $sql .= preg_replace('/^,/', '', $hookmanager->resPrint); $sql = preg_replace('/,\s*$/', '', $sql); -$sql .= " FROM ".MAIN_DB_PREFIX.$object->table_element." as t, ".MAIN_DB_PREFIX.$userstatic->table_element." as u,".MAIN_DB_PREFIX."hrm_job as j"; +$sql .= " FROM ".MAIN_DB_PREFIX.$object->table_element." as t LEFT JOIN ".MAIN_DB_PREFIX.$userstatic->table_element." as u on t.fk_user = u.rowid, ".MAIN_DB_PREFIX."hrm_job as j"; if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) { $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (t.rowid = ef.fk_object)"; } From 5ad4f278ca4a77d83bf58652d9f568a751a1f5dc Mon Sep 17 00:00:00 2001 From: UT from dolibit <45215329+dolibit-ut@users.noreply.github.com> Date: Mon, 23 Jan 2023 20:26:04 +0100 Subject: [PATCH 0998/1128] Update list.php update parameters (like /modulebuilder/template/myobject_list.php) --- htdocs/adherents/list.php | 63 +++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 29 deletions(-) diff --git a/htdocs/adherents/list.php b/htdocs/adherents/list.php index d06d91cbea6..2e04aba9167 100644 --- a/htdocs/adherents/list.php +++ b/htdocs/adherents/list.php @@ -30,9 +30,9 @@ // Load Dolibarr environment require '../main.inc.php'; -require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php'; require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent_type.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; @@ -41,47 +41,51 @@ $langs->loadLangs(array("members", "companies")); // Get parameters -$action = GETPOST('action', 'aZ09'); +$action = GETPOST('action', 'aZ09'); $massaction = GETPOST('massaction', 'alpha'); $show_files = GETPOST('show_files', 'int'); -$confirm = GETPOST('confirm', 'alpha'); -$toselect = GETPOST('toselect', 'array'); +$confirm = GETPOST('confirm', 'alpha'); +$cancel = GETPOST('cancel', 'alpha'); +$toselect = GETPOST('toselect', 'array'); $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'memberslist'; // To manage different context of search -$mode = GETPOST('mode', 'alpha'); - +$backtopage = GETPOST('backtopage', 'alpha'); +$optioncss = GETPOST('optioncss', 'aZ'); +$mode = GETPOST('mode', 'alpha'); // Search fields -$search = GETPOST("search", 'alpha'); -$search_ref = GETPOST("search_ref", 'alpha'); -$search_lastname = GETPOST("search_lastname", 'alpha'); -$search_firstname = GETPOST("search_firstname", 'alpha'); -$search_gender = GETPOST("search_gender", 'alpha'); -$search_civility = GETPOST("search_civility", 'alpha'); -$search_company = GETPOST('search_company', 'alphanohtml'); -$search_login = GETPOST("search_login", 'alpha'); -$search_address = GETPOST("search_address", 'alpha'); -$search_zip = GETPOST("search_zip", 'alpha'); -$search_town = GETPOST("search_town", 'alpha'); -$search_state = GETPOST("search_state", 'alpha'); -$search_country = GETPOST("search_country", 'alpha'); -$search_phone = GETPOST("search_phone", 'alpha'); +$search = GETPOST("search", 'alpha'); +$search_ref = GETPOST("search_ref", 'alpha'); +$search_lastname = GETPOST("search_lastname", 'alpha'); +$search_firstname = GETPOST("search_firstname", 'alpha'); +$search_gender = GETPOST("search_gender", 'alpha'); +$search_civility = GETPOST("search_civility", 'alpha'); +$search_company = GETPOST('search_company', 'alphanohtml'); +$search_login = GETPOST("search_login", 'alpha'); +$search_address = GETPOST("search_address", 'alpha'); +$search_zip = GETPOST("search_zip", 'alpha'); +$search_town = GETPOST("search_town", 'alpha'); +$search_state = GETPOST("search_state", 'alpha'); // county / departement / federal state +$search_country = GETPOST("search_country", 'alpha'); +$search_phone = GETPOST("search_phone", 'alpha'); $search_phone_perso = GETPOST("search_phone_perso", 'alpha'); $search_phone_mobile = GETPOST("search_phone_mobile", 'alpha'); -$search_type = GETPOST("search_type", 'alpha'); -$search_email = GETPOST("search_email", 'alpha'); -$search_categ = GETPOST("search_categ", 'int'); -$search_filter = GETPOST("search_filter", 'alpha'); -$search_status = GETPOST("search_status", 'intcomma'); -$search_morphy = GETPOST("search_morphy", 'alpha'); +$search_type = GETPOST("search_type", 'alpha'); +$search_email = GETPOST("search_email", 'alpha'); +$search_categ = GETPOST("search_categ", 'int'); +$search_morphy = GETPOST("search_morphy", 'alpha'); $search_import_key = trim(GETPOST("search_import_key", 'alpha')); -$catid = GETPOST("catid", 'int'); -$optioncss = GETPOST('optioncss', 'alpha'); -$socid = GETPOST('socid', 'int'); + +$catid = GETPOST("catid", 'int'); +$socid = GETPOST('socid', 'int'); + +$search_filter = GETPOST("search_filter", 'alpha'); +$search_status = GETPOST("search_status", 'intcomma'); // statut $filter = GETPOST("filter", 'alpha'); if ($filter) { $search_filter = $filter; // For backward compatibility } + $statut = GETPOST("statut", 'alpha'); if ($statut != '') { $search_status = $statut; // For backward compatibility @@ -93,6 +97,7 @@ if ($search_status < -2) { $search_status = ''; } +// Pagination parameters $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit; $sortfield = GETPOST('sortfield', 'aZ09comma'); $sortorder = GETPOST('sortorder', 'aZ09comma'); From 2dcd811e37b1392b91090274e4e03974053878a5 Mon Sep 17 00:00:00 2001 From: UT from dolibit <45215329+dolibit-ut@users.noreply.github.com> Date: Mon, 23 Jan 2023 20:35:17 +0100 Subject: [PATCH 0999/1128] Update list.php update parameters --- htdocs/bookmarks/list.php | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/htdocs/bookmarks/list.php b/htdocs/bookmarks/list.php index 2adef615a70..3eae08bb60a 100644 --- a/htdocs/bookmarks/list.php +++ b/htdocs/bookmarks/list.php @@ -29,15 +29,18 @@ require_once DOL_DOCUMENT_ROOT.'/bookmarks/class/bookmark.class.php'; $langs->loadLangs(array('bookmarks', 'admin')); // Get Parameters -$action = GETPOST('action', 'aZ09'); +$id = GETPOST("id", 'int'); + +$action = GETPOST('action', 'aZ09'); $massaction = GETPOST('massaction', 'alpha'); $show_files = GETPOST('show_files', 'int'); -$confirm = GETPOST('confirm', 'alpha'); -$toselect = GETPOST('toselect', 'array'); +$confirm = GETPOST('confirm', 'alpha'); +$cancel = GETPOST('cancel', 'alpha'); +$toselect = GETPOST('toselect', 'array'); $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'bookmarklist'; // To manage different context of search -$id = GETPOST("id", 'int'); -$optioncss = GETPOST('optioncss', 'alpha'); -$mode = GETPOST('mode', 'aZ09'); +$backtopage = GETPOST('backtopage', 'alpha'); +$optioncss = GETPOST('optioncss', 'alpha'); +$mode = GETPOST('mode', 'aZ09'); // Load variable for pagination $limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit; From 6cf41da7745a397956d9ab97cef9bb29a6d0c5e8 Mon Sep 17 00:00:00 2001 From: UT from dolibit <45215329+dolibit-ut@users.noreply.github.com> Date: Mon, 23 Jan 2023 20:41:39 +0100 Subject: [PATCH 1000/1128] Update list.php --- htdocs/comm/action/list.php | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/htdocs/comm/action/list.php b/htdocs/comm/action/list.php index 8807ccd4764..a0176ca18b0 100644 --- a/htdocs/comm/action/list.php +++ b/htdocs/comm/action/list.php @@ -33,18 +33,22 @@ require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php'; require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/agenda.lib.php'; -include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; +include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php'; + // Load translation files required by the page $langs->loadLangs(array("users", "companies", "agenda", "commercial", "other", "orders", "bills")); -$action = GETPOST('action', 'aZ09'); +// Get Parameters +$action = GETPOST('action', 'aZ09'); $massaction = GETPOST('massaction', 'alpha'); +$confirm = GETPOST('confirm', 'alpha'); +$cancel = GETPOST('cancel', 'alpha'); +$toselect = GETPOST('toselect', 'array'); $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'actioncommlist'; // To manage different context of search -$optioncss = GETPOST('optioncss', 'alpha'); -$toselect = GETPOST('toselect', 'array'); -$confirm = GETPOST('confirm', 'alpha'); +$optioncss = GETPOST('optioncss', 'alpha'); + $disabledefaultvalues = GETPOST('disabledefaultvalues', 'int'); @@ -70,6 +74,7 @@ if (GETPOST('search_actioncode', 'array')) { $actioncode = GETPOST("search_actioncode", "alpha", 3) ?GETPOST("search_actioncode", "alpha", 3) : (GETPOST("search_actioncode") == '0' ? '0' : ((empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE) || $disabledefaultvalues) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE)); } +// Search Fields $search_id = GETPOST('search_id', 'alpha'); $search_title = GETPOST('search_title', 'alpha'); $search_note = GETPOST('search_note', 'alpha'); @@ -106,6 +111,7 @@ if (empty($filtert) && empty($conf->global->AGENDA_ALL_CALENDARS)) { $filtert = $user->id; } +// Pagination parameters $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit; $sortfield = GETPOST('sortfield', 'aZ09comma'); $sortorder = GETPOST('sortorder', 'aZ09comma'); From cd13fcb0af0b687b61d60b416cac1d904ceff030 Mon Sep 17 00:00:00 2001 From: UT from dolibit <45215329+dolibit-ut@users.noreply.github.com> Date: Mon, 23 Jan 2023 21:04:31 +0100 Subject: [PATCH 1001/1128] Update list.php --- htdocs/comm/mailing/list.php | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/htdocs/comm/mailing/list.php b/htdocs/comm/mailing/list.php index 6916a2dfe5d..501de4c11cf 100644 --- a/htdocs/comm/mailing/list.php +++ b/htdocs/comm/mailing/list.php @@ -27,20 +27,24 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/comm/mailing/class/mailing.class.php'; // Load translation files required by the page -$langs->load("mails"); +$langs->load('mails'); -$sortfield = GETPOST('sortfield', 'aZ09comma'); -$sortorder = GETPOST('sortorder', 'aZ09comma'); -$limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit; -$optioncss = GETPOST('optioncss', 'alpha'); +// Get Parameters $massaction = GETPOST('massaction', 'alpha'); -$page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int'); +$optioncss = GETPOST('optioncss', 'alpha'); + +// Pagination +$limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit; +$sortfield = GETPOST('sortfield', 'aZ09comma'); +$sortorder = GETPOST('sortorder', 'aZ09comma'); +$page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int'); if (empty($page) || $page == -1 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha') || (empty($toselect) && $massaction === '0')) { $page = 0; } // If $page is not defined, or '' or -1 or if we click on clear filters or if we select empty mass action $offset = $limit * $page; $pageprev = $page - 1; $pagenext = $page + 1; + if (!$sortorder) { $sortorder = "DESC"; } @@ -48,10 +52,12 @@ if (!$sortfield) { $sortfield = "m.date_creat"; } +// Search Fields $search_all = trim((GETPOST('search_all', 'alphanohtml') != '') ?GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml')); $search_ref = GETPOST("search_ref", "alpha") ? GETPOST("search_ref", "alpha") : GETPOST("sref", "alpha"); $filteremail = GETPOST('filteremail', 'alpha'); +// Initialize objects $object = new Mailing($db); // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context @@ -128,7 +134,9 @@ if (empty($reshook)) { * View */ -llxHeader('', $langs->trans("Mailing"), 'EN:Module_EMailing|FR:Module_Mailing|ES:Módulo_Mailing'); +// Page Header +$help_url = 'EN:Module_EMailing|FR:Module_Mailing|ES:Módulo_Mailing'; +llxHeader('', $langs->trans("Mailing"), $help_url); $form = new Form($db); From 0c30837f154c3089a7562708587d58b6d30edc6c Mon Sep 17 00:00:00 2001 From: UT from dolibit <45215329+dolibit-ut@users.noreply.github.com> Date: Mon, 23 Jan 2023 21:09:34 +0100 Subject: [PATCH 1002/1128] Update list.php --- htdocs/comm/propal/list.php | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php index cc5872abb25..93d2298795c 100644 --- a/htdocs/comm/propal/list.php +++ b/htdocs/comm/propal/list.php @@ -62,21 +62,23 @@ if (isModEnabled("expedition")) { $langs->loadLangs(array('sendings')); } +// Get Parameters $socid = GETPOST('socid', 'int'); -$action = GETPOST('action', 'aZ09'); +$action = GETPOST('action', 'aZ09'); $massaction = GETPOST('massaction', 'alpha'); $show_files = GETPOST('show_files', 'int'); -$confirm = GETPOST('confirm', 'alpha'); -$toselect = GETPOST('toselect', 'array'); +$confirm = GETPOST('confirm', 'alpha'); +$cancel = GETPOST('cancel', 'alpha'); +$toselect = GETPOST('toselect', 'array'); $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'proposallist'; -$mode = GETPOST('mode', 'alpha'); +$mode = GETPOST('mode', 'alpha'); -$search_user = GETPOST('search_user', 'int'); -$search_sale = GETPOST('search_sale', 'int'); -$search_ref = GETPOST('sf_ref') ?GETPOST('sf_ref', 'alpha') : GETPOST('search_ref', 'alpha'); +// Search Fields +$search_user = GETPOST('search_user', 'int'); +$search_sale = GETPOST('search_sale', 'int'); +$search_ref = GETPOST('sf_ref') ?GETPOST('sf_ref', 'alpha') : GETPOST('search_ref', 'alpha'); $search_refcustomer = GETPOST('search_refcustomer', 'alpha'); - $search_refproject = GETPOST('search_refproject', 'alpha'); $search_project = GETPOST('search_project', 'alpha'); @@ -140,15 +142,15 @@ $search_date_signature_endyear = GETPOST('search_date_signature_endyear', 'int') $search_date_signature_start = dol_mktime(0, 0, 0, $search_date_signature_startmonth, $search_date_signature_startday, $search_date_signature_startyear); $search_date_signature_end = dol_mktime(23, 59, 59, $search_date_signature_endmonth, $search_date_signature_endday, $search_date_signature_endyear); - $search_status = GETPOST('search_status', 'alpha'); + $optioncss = GETPOST('optioncss', 'alpha'); $object_statut = GETPOST('search_statut', 'alpha'); $sall = trim((GETPOST('search_all', 'alphanohtml') != '') ?GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml')); $mesg = (GETPOST("msg") ? GETPOST("msg") : GETPOST("mesg")); - +// Pagination $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit; $sortfield = GETPOST('sortfield', 'aZ09comma'); $sortorder = GETPOST('sortorder', 'aZ09comma'); @@ -263,6 +265,7 @@ foreach ($object->fields as $key => $val) { $fieldstosearchall['t.'.$key] = $val['label']; } }*/ + // Definition of array of fields for columns /*$arrayfields = array(); foreach ($object->fields as $key => $val) { @@ -278,9 +281,11 @@ foreach ($object->fields as $key => $val) { ); } }*/ + // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php'; +// Permissions $permissiontoread = $user->rights->propal->lire; $permissiontoadd = $user->rights->propal->creer; $permissiontodelete = $user->rights->propal->supprimer; From 482c842895e925f547221787f8ce9f8ed0077ec1 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Mon, 23 Jan 2023 20:15:00 +0000 Subject: [PATCH 1003/1128] Fixing style errors. --- htdocs/comm/propal/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php index 93d2298795c..cc507041ac6 100644 --- a/htdocs/comm/propal/list.php +++ b/htdocs/comm/propal/list.php @@ -69,7 +69,7 @@ $action = GETPOST('action', 'aZ09'); $massaction = GETPOST('massaction', 'alpha'); $show_files = GETPOST('show_files', 'int'); $confirm = GETPOST('confirm', 'alpha'); -$cancel = GETPOST('cancel', 'alpha'); +$cancel = GETPOST('cancel', 'alpha'); $toselect = GETPOST('toselect', 'array'); $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'proposallist'; $mode = GETPOST('mode', 'alpha'); From 25a6be008a199bec10b4eeae055235d2296e946b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Mon, 23 Jan 2023 21:34:20 +0100 Subject: [PATCH 1004/1128] clean code emailcollectorfilter --- .../class/emailcollectorfilter.class.php | 27 +++---------------- 1 file changed, 4 insertions(+), 23 deletions(-) diff --git a/htdocs/emailcollector/class/emailcollectorfilter.class.php b/htdocs/emailcollector/class/emailcollectorfilter.class.php index cff80aa4153..327159f61a4 100644 --- a/htdocs/emailcollector/class/emailcollectorfilter.class.php +++ b/htdocs/emailcollector/class/emailcollectorfilter.class.php @@ -206,16 +206,14 @@ class EmailCollectorFilter extends CommonObject // Clear fields $object->ref = "copy_of_".$object->ref; - $object->title = $langs->trans("CopyOf")." ".$object->title; - // ... + // $object->title = $langs->trans("CopyOf")." ".$object->title; + // Clear extrafields that are unique if (is_array($object->array_options) && count($object->array_options) > 0) { $extrafields->fetch_name_optionals_label($this->table_element); foreach ($object->array_options as $key => $option) { $shortkey = preg_replace('/options_/', '', $key); if (!empty($extrafields->attributes[$this->element]['unique'][$shortkey])) { - //var_dump($key); - //var_dump($clonedObj->array_options[$key]); exit; unset($object->array_options[$key]); } } @@ -252,26 +250,10 @@ class EmailCollectorFilter extends CommonObject public function fetch($id, $ref = null) { $result = $this->fetchCommon($id, $ref); - if ($result > 0 && !empty($this->table_element_line)) { - $this->fetchLines(); - } + return $result; } - /** - * Load object lines in memory from the database - * - * @return int <0 if KO, 0 if not found, >0 if OK - */ - /*public function fetchLines() - { - $this->lines=array(); - - // Load lines with object EmailcollectorFilterLine - - return count($this->lines)?1:0; - }*/ - /** * Update object into database * @@ -317,7 +299,6 @@ class EmailCollectorFilter extends CommonObject } $result = ''; - $companylink = ''; $label = ''.$langs->trans("EmailcollectorFilter").''; $label .= '
    '; @@ -468,7 +449,7 @@ class EmailCollectorFilter extends CommonObject $this->user_creation_id = $obj->fk_user_creat; $this->user_modification_id = $obj->fk_user_modif; - $this->date_creation = $this->db->jdate($obj->datec); + $this->date_creation = $this->db->jdate($obj->datec); $this->date_modification = empty($obj->datem) ? '' : $this->db->jdate($obj->datem); } From d08965c293ecee1409c4720e63bd6d19463d1afb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Mon, 23 Jan 2023 21:42:09 +0100 Subject: [PATCH 1005/1128] Update emailcollectoraction.class.php --- .../class/emailcollectoraction.class.php | 60 ++----------------- 1 file changed, 4 insertions(+), 56 deletions(-) diff --git a/htdocs/emailcollector/class/emailcollectoraction.class.php b/htdocs/emailcollector/class/emailcollectoraction.class.php index e43a86da515..5616abbbd35 100644 --- a/htdocs/emailcollector/class/emailcollectoraction.class.php +++ b/htdocs/emailcollector/class/emailcollectoraction.class.php @@ -24,8 +24,6 @@ // Put here all includes required by your class file require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php'; -//require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php'; -//require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php'; /** * Class for EmailCollectorAction @@ -113,37 +111,6 @@ class EmailCollectorAction extends CommonObject public $status; // END MODULEBUILDER PROPERTIES - - - // If this object has a subtable with lines - - // /** - // * @var string Name of subtable line - // */ - //public $table_element_line = 'emailcollectoractiondet'; - - // /** - // * @var string Field with ID of parent key if this field has a parent - // */ - //public $fk_element = 'fk_emailcollectoraction'; - - // /** - // * @var string Name of subtable class that manage subtable lines - // */ - //public $class_element_line = 'EmailcollectorActionline'; - - // /** - // * @var array List of child tables. To test if we can delete object. - // */ - //protected $childtables=array(); - - // /** - // * @var EmailcollectorActionLine[] Array of subtable lines - // */ - //public $lines = array(); - - - /** * Constructor * @@ -225,16 +192,14 @@ class EmailCollectorAction extends CommonObject // Clear fields $object->ref = "copy_of_".$object->ref; - $object->title = $langs->trans("CopyOf")." ".$object->title; - // ... + // $object->title = $langs->trans("CopyOf")." ".$object->title; + // Clear extrafields that are unique if (is_array($object->array_options) && count($object->array_options) > 0) { $extrafields->fetch_name_optionals_label($this->table_element); foreach ($object->array_options as $key => $option) { $shortkey = preg_replace('/options_/', '', $key); if (!empty($extrafields->attributes[$this->element]['unique'][$shortkey])) { - //var_dump($key); - //var_dump($clonedObj->array_options[$key]); exit; unset($object->array_options[$key]); } } @@ -271,26 +236,10 @@ class EmailCollectorAction extends CommonObject public function fetch($id, $ref = null) { $result = $this->fetchCommon($id, $ref); - // if ($result > 0 && !empty($this->table_element_line)) { - // $this->fetchLinesCommon(); - // } + return $result; } - /** - * Load object lines in memory from the database - * - * @return int <0 if KO, 0 if not found, >0 if OK - */ - /*public function fetchLines() - { - $this->lines=array(); - - // Load lines with object EmailcollectorActionLine - - return count($this->lines)?1:0; - }*/ - /** * Update object into database * @@ -336,7 +285,6 @@ class EmailCollectorAction extends CommonObject } $result = ''; - $companylink = ''; $label = ''.$langs->trans("EmailcollectorAction").''; $label .= '
    '; @@ -487,7 +435,7 @@ class EmailCollectorAction extends CommonObject $this->user_creation_id = $obj->fk_user_creat; $this->user_modification_id = $obj->fk_user_modif; - $this->date_creation = $this->db->jdate($obj->datec); + $this->date_creation = $this->db->jdate($obj->datec); $this->date_modification = empty($obj->datem) ? '' : $this->db->jdate($obj->datem); } From 124a76029ecdf541c4eef2428aea7a567f1ec497 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20NASSIET?= Date: Mon, 23 Jan 2023 21:45:28 +0100 Subject: [PATCH 1006/1128] Protection against deletion of ref_employee and national_registration_number while fields are not presents in the user tab --- htdocs/user/card.php | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/htdocs/user/card.php b/htdocs/user/card.php index dbe1764f54e..21e18c94e99 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -417,8 +417,18 @@ if (empty($reshook)) { $object->civility_code = GETPOST("civility_code", 'aZ09'); $object->lastname = GETPOST("lastname", 'alphanohtml'); $object->firstname = GETPOST("firstname", 'alphanohtml'); - $object->ref_employee = GETPOST("ref_employee", 'alphanohtml'); - $object->national_registration_number = GETPOST("national_registration_number", 'alphanohtml'); + /* + * Protection against deletion of ref_employee while the field is not present in the user tab + */ + if (GETPOSTISSET("ref_employee")){ + $object->ref_employee = GETPOST("ref_employee", 'alphanohtml'); + } + /* + * Protection against deletion of national_registration_number while the field is not present in the user tab + */ + if (GETPOSTISSET("national_registration_number")){ + $object->national_registration_number = GETPOST("national_registration_number", 'alphanohtml'); + } $object->gender = GETPOST("gender", 'aZ09'); $object->pass = GETPOST("password", 'none'); // We can keep 'none' for password fields $object->api_key = (GETPOST("api_key", 'alphanohtml')) ? GETPOST("api_key", 'alphanohtml') : $object->api_key; From cade14a80736678fa09c2033581bd1a4cb9c6415 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Mon, 23 Jan 2023 21:13:30 +0000 Subject: [PATCH 1007/1128] Fixing style errors. --- htdocs/user/card.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/user/card.php b/htdocs/user/card.php index 21e18c94e99..688ac6c28ac 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -420,13 +420,13 @@ if (empty($reshook)) { /* * Protection against deletion of ref_employee while the field is not present in the user tab */ - if (GETPOSTISSET("ref_employee")){ + if (GETPOSTISSET("ref_employee")) { $object->ref_employee = GETPOST("ref_employee", 'alphanohtml'); } /* * Protection against deletion of national_registration_number while the field is not present in the user tab */ - if (GETPOSTISSET("national_registration_number")){ + if (GETPOSTISSET("national_registration_number")) { $object->national_registration_number = GETPOST("national_registration_number", 'alphanohtml'); } $object->gender = GETPOST("gender", 'aZ09'); From 7f6d993040979d61a4a359d722cb2109c26c90a1 Mon Sep 17 00:00:00 2001 From: David Pareja Rodriguez Date: Tue, 24 Jan 2023 10:54:48 +0100 Subject: [PATCH 1008/1128] Encase database name in backticks --- htdocs/core/db/mysqli.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/db/mysqli.class.php b/htdocs/core/db/mysqli.class.php index fa24e4a70ac..3514777dd45 100644 --- a/htdocs/core/db/mysqli.class.php +++ b/htdocs/core/db/mysqli.class.php @@ -678,7 +678,7 @@ class DoliDBMysqli extends DoliDB } $tmpdatabase = preg_replace('/[^a-z0-9\.\-\_]/i', '', $database); - $sql = "SHOW TABLES FROM ".$tmpdatabase." ".$like.";"; + $sql = "SHOW TABLES FROM `".$tmpdatabase."` ".$like.";"; //print $sql; $result = $this->query($sql); if ($result) { From 01e90a48541973b95743f27a7073a91fee1c07b3 Mon Sep 17 00:00:00 2001 From: David Pareja Rodriguez Date: Tue, 24 Jan 2023 11:04:26 +0100 Subject: [PATCH 1009/1128] Fix wrong variable used to fetch replaced invoice --- htdocs/fourn/facture/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index d1cd74099ae..fe952a31893 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -2940,7 +2940,7 @@ if ($action == 'create') { } if (isset($objectidnext) && $objectidnext > 0) { $facthatreplace = new FactureFournisseur($db); - $facthatreplace->fetch($facidnext); + $facthatreplace->fetch($objectidnext); print ' ('.$langs->transnoentities("ReplacedByInvoice", $facthatreplace->getNomUrl(1)).')'; } if ($object->type == FactureFournisseur::TYPE_CREDIT_NOTE || $object->type == FactureFournisseur::TYPE_DEPOSIT) { From b2ac7a72bee80f7fe1ae197648cb707689db005d Mon Sep 17 00:00:00 2001 From: VESSILLER Date: Tue, 24 Jan 2023 11:21:59 +0100 Subject: [PATCH 1010/1128] FIX simple quote in generated file name from build doc mass action --- htdocs/core/actions_massactions.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php index 34e2fe8b34e..3c33765c407 100644 --- a/htdocs/core/actions_massactions.inc.php +++ b/htdocs/core/actions_massactions.inc.php @@ -1035,7 +1035,7 @@ if (!$error && $massaction == "builddoc" && $permissiontoread && !GETPOST('butto $arrayofinclusion[] = '^'.preg_quote(dol_sanitizeFileName($tmppdf), '/').'\.pdf$'; } foreach ($listofobjectref as $tmppdf) { - $arrayofinclusion[] = '^'.preg_quote(dol_sanitizeFileName($tmppdf), '/').'_[a-zA-Z0-9-_]+\.pdf$'; // To include PDF generated from ODX files + $arrayofinclusion[] = '^'.preg_quote(dol_sanitizeFileName($tmppdf), '/').'_[a-zA-Z0-9\-\_\']+\.pdf$'; // To include PDF generated from ODX files } $listoffiles = dol_dir_list($uploaddir, 'all', 1, implode('|', $arrayofinclusion), '\.meta$|\.png', 'date', SORT_DESC, 0, true); From c463f0972d9577fb1833f549326782fd854c20a0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 24 Jan 2023 12:15:57 +0100 Subject: [PATCH 1011/1128] Clean code --- htdocs/accountancy/customer/list.php | 5 ++--- htdocs/accountancy/expensereport/list.php | 3 +-- htdocs/accountancy/supplier/list.php | 5 ++--- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/htdocs/accountancy/customer/list.php b/htdocs/accountancy/customer/list.php index 021c1ec7821..a4a12b97b98 100644 --- a/htdocs/accountancy/customer/list.php +++ b/htdocs/accountancy/customer/list.php @@ -43,10 +43,11 @@ $langs->loadLangs(array("bills", "companies", "compta", "accountancy", "other", $action = GETPOST('action', 'aZ09'); $massaction = GETPOST('massaction', 'alpha'); -$show_files = GETPOST('show_files', 'int'); $confirm = GETPOST('confirm', 'alpha'); $toselect = GETPOST('toselect', 'array'); +$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'accountancycustomerlist'; // To manage different context of search $optioncss = GETPOST('optioncss', 'alpha'); + $default_account = GETPOST('default_account', 'int'); // Select Box @@ -73,8 +74,6 @@ $search_date_end = dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_en $search_country = GETPOST('search_country', 'alpha'); $search_tvaintra = GETPOST('search_tvaintra', 'alpha'); -$btn_ventil = GETPOST('ventil', 'alpha'); - // Load variable for pagination $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : (empty($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION) ? $conf->liste_limit : $conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION); $sortfield = GETPOST('sortfield', 'aZ09comma'); diff --git a/htdocs/accountancy/expensereport/list.php b/htdocs/accountancy/expensereport/list.php index 25b86a8d527..39508332d40 100644 --- a/htdocs/accountancy/expensereport/list.php +++ b/htdocs/accountancy/expensereport/list.php @@ -40,10 +40,9 @@ $langs->loadLangs(array("bills", "companies", "compta", "accountancy", "other", $action = GETPOST('action', 'aZ09'); $massaction = GETPOST('massaction', 'alpha'); -$show_files = GETPOST('show_files', 'int'); $confirm = GETPOST('confirm', 'alpha'); $toselect = GETPOST('toselect', 'array'); -$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'expensereportlist'; // To manage different context of search +$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'accountancyexpensereportlist'; // To manage different context of search $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print') diff --git a/htdocs/accountancy/supplier/list.php b/htdocs/accountancy/supplier/list.php index 3b8e93cb54b..dfd8af7f68f 100644 --- a/htdocs/accountancy/supplier/list.php +++ b/htdocs/accountancy/supplier/list.php @@ -44,10 +44,11 @@ $langs->loadLangs(array("bills", "companies", "compta", "accountancy", "other", $action = GETPOST('action', 'aZ09'); $massaction = GETPOST('massaction', 'alpha'); -$show_files = GETPOST('show_files', 'int'); $confirm = GETPOST('confirm', 'alpha'); $toselect = GETPOST('toselect', 'array'); +$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'accountancysupplierlist'; // To manage different context of search $optioncss = GETPOST('optioncss', 'alpha'); + $default_account = GETPOST('default_account', 'int'); // Select Box @@ -75,8 +76,6 @@ $search_date_end = dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_en $search_country = GETPOST('search_country', 'alpha'); $search_tvaintra = GETPOST('search_tvaintra', 'alpha'); -$btn_ventil = GETPOST('ventil', 'alpha'); - // Load variable for pagination $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : (empty($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION) ? $conf->liste_limit : $conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION); $sortfield = GETPOST('sortfield', 'aZ09comma'); From 5b5a3547e29a870ed6fed0485e8384df33ea72df Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 24 Jan 2023 13:00:09 +0100 Subject: [PATCH 1012/1128] Debug v17 --- .../class/accountingaccount.class.php | 4 +++- htdocs/accountancy/customer/list.php | 19 +++++++++++++------ htdocs/accountancy/expensereport/index.php | 18 +++++++++++++----- htdocs/accountancy/expensereport/list.php | 4 ++-- htdocs/accountancy/supplier/list.php | 15 ++++++++++----- htdocs/core/class/html.form.class.php | 2 +- htdocs/core/lib/functions.lib.php | 4 ++-- htdocs/langs/en_US/accountancy.lang | 9 +++++---- 8 files changed, 49 insertions(+), 26 deletions(-) diff --git a/htdocs/accountancy/class/accountingaccount.class.php b/htdocs/accountancy/class/accountingaccount.class.php index 94ee1ac6029..8e5f7690dd1 100644 --- a/htdocs/accountancy/class/accountingaccount.class.php +++ b/htdocs/accountancy/class/accountingaccount.class.php @@ -723,7 +723,7 @@ class AccountingAccount extends CommonObject } /** - * Return Suggest accounting accounts to bind + * Return a suggested account (from chart of accounts) to bind * * @param Societe $buyer Object buyer * @param Societe $seller Object seller @@ -733,6 +733,8 @@ class AccountingAccount extends CommonObject * @param array $accountingAccount Array of Accounting account * @param string $type Customer / Supplier * @return array|int Accounting accounts suggested or < 0 if technical error. + * 'suggestedaccountingaccountbydefaultfor'=>Will be used for the label to show on tooltip for account by default on any product + * 'suggestedaccountingaccountfor'=>Is the account suggested for this product */ public function getAccountingCodeToBind(Societe $buyer, Societe $seller, Product $product, $facture, $factureDet, $accountingAccount = array(), $type = '') { diff --git a/htdocs/accountancy/customer/list.php b/htdocs/accountancy/customer/list.php index a4a12b97b98..35be32d6b34 100644 --- a/htdocs/accountancy/customer/list.php +++ b/htdocs/accountancy/customer/list.php @@ -519,8 +519,8 @@ if ($result) { print_liste_field_titre("ThirdParty", $_SERVER["PHP_SELF"], "s.nom", "", $param, '', $sortfield, $sortorder); print_liste_field_titre("Country", $_SERVER["PHP_SELF"], "co.label", "", $param, '', $sortfield, $sortorder); print_liste_field_titre("VATIntraShort", $_SERVER["PHP_SELF"], "s.tva_intra", "", $param, '', $sortfield, $sortorder); - print_liste_field_titre("AccountAccountingSuggest", '', '', '', '', '', '', '', 'nowraponall '); - print_liste_field_titre("IntoAccount", '', '', '', '', '', '', '', 'center '); + print_liste_field_titre("DataUsedToSuggestAccount", '', '', '', '', '', '', '', 'nowraponall '); + print_liste_field_titre("AccountAccountingSuggest", '', '', '', '', '', '', '', 'center '); $checkpicto = ''; if ($massactionbutton) { $checkpicto = $form->showCheckAddButtons('checkforselect', 1); @@ -639,7 +639,7 @@ if ($result) { print '

    '.dol_print_date($facture_static->date, 'day').''; + print ''; if ($product_static->id > 0) { print $product_static->getNomUrl(1); } @@ -648,7 +648,7 @@ if ($result) { } print ''; $text = dolGetFirstLineOfText(dol_string_nohtmltag($facture_static_det->desc, 1)); $trunclength = empty($conf->global->ACCOUNTING_LENGTH_DESCRIPTION) ? 32 : $conf->global->ACCOUNTING_LENGTH_DESCRIPTION; @@ -682,15 +682,22 @@ if ($result) { // Found accounts print ''; + // First show default account for any products $s = '1. '.(($facture_static_det->product_type == 1) ? $langs->trans("DefaultForService") : $langs->trans("DefaultForProduct")).': '; - $shelp = ''; + $shelp = ''; $ttype = 'help'; if ($suggestedaccountingaccountbydefaultfor == 'eec') { $shelp .= $langs->trans("SaleEEC"); + } elseif ($suggestedaccountingaccountbydefaultfor == 'eecwithvat') { + $shelp = $langs->trans("SaleEECWithVAT"); + } elseif ($suggestedaccountingaccountbydefaultfor == 'eecwithoutvatnumber') { + $shelp = $langs->trans("SaleEECWithoutVATNumber"); + $ttype = 'warning'; } elseif ($suggestedaccountingaccountbydefaultfor == 'export') { $shelp .= $langs->trans("SaleExport"); } $s .= ($code_sell_l > 0 ? length_accountg($code_sell_l) : ''.$langs->trans("NotDefined").''); - print $form->textwithpicto($s, $shelp, 1, 'help', '', 0, 2, '', 1); + print $form->textwithpicto($s, $shelp, 1, $ttype, '', 0, 2, '', 1); + // Now show account for product if ($product_static->id > 0) { print '
    '; $s = '2. '.(($facture_static_det->product_type == 1) ? $langs->trans("ThisService") : $langs->trans("ThisProduct")).': '; diff --git a/htdocs/accountancy/expensereport/index.php b/htdocs/accountancy/expensereport/index.php index 5064003c7ff..948130dd98a 100644 --- a/htdocs/accountancy/expensereport/index.php +++ b/htdocs/accountancy/expensereport/index.php @@ -58,6 +58,8 @@ $year_current = $year_start; // Validate History $action = GETPOST('action', 'aZ09'); +$chartaccountcode = dol_getIdFromCode($db, $conf->global->CHARTOFACCOUNTS, 'accounting_system', 'rowid', 'pcg_version'); + // Security check if (!isModEnabled('accounting')) { accessforbidden(); @@ -65,7 +67,7 @@ if (!isModEnabled('accounting')) { if ($user->socid > 0) { accessforbidden(); } -if (empty($user->rights->accounting->mouvements->lire)) { +if (!$user->hasRight('accounting', 'mouvements', 'lire')) { accessforbidden(); } @@ -74,7 +76,7 @@ if (empty($user->rights->accounting->mouvements->lire)) { * Actions */ -if (($action == 'clean' || $action == 'validatehistory') && $user->rights->accounting->bind->write) { +if (($action == 'clean' || $action == 'validatehistory') && $user->hasRight('accounting', 'bind', 'write')) { // Clean database $db->begin(); $sql1 = "UPDATE ".MAIN_DB_PREFIX."expensereport_det as erd"; @@ -109,8 +111,7 @@ if ($action == 'validatehistory') { $sql1 = "SELECT erd.rowid, accnt.rowid as suggestedid"; $sql1 .= " FROM ".MAIN_DB_PREFIX."expensereport_det as erd"; $sql1 .= " LEFT JOIN ".MAIN_DB_PREFIX."c_type_fees as t ON erd.fk_c_type_fees = t.id"; - $sql1 .= " LEFT JOIN ".MAIN_DB_PREFIX."accounting_account as accnt ON t.accountancy_code = accnt.account_number AND accnt.active = 1 AND accnt.entity =".((int) $conf->entity); - $sql1 .= " LEFT JOIN ".MAIN_DB_PREFIX."accounting_system as syst ON accnt.fk_pcg_version = syst.pcg_version AND syst.rowid = ".((int) $conf->global->CHARTOFACCOUNTS).' AND syst.active = 1,'; + $sql1 .= " LEFT JOIN ".MAIN_DB_PREFIX."accounting_account as accnt ON t.accountancy_code = accnt.account_number AND accnt.active = 1 AND accnt.fk_pcg_version = '".$db->escape($chartaccountcode)."' AND accnt.entity =".((int) $conf->entity); $sql1 .= " ".MAIN_DB_PREFIX."expensereport as er"; $sql1 .= " WHERE erd.fk_expensereport = er.rowid AND er.entity = ".((int) $conf->entity); $sql1 .= " AND er.fk_statut IN (".ExpenseReport::STATUS_APPROVED.", ".ExpenseReport::STATUS_CLOSED.") AND erd.fk_code_ventilation <= 0"; @@ -176,6 +177,7 @@ llxHeader('', $langs->trans("ExpenseReportsVentilation")); $textprevyear = ''.img_previous().''; $textnextyear = ' '.img_next().''; + print load_fiche_titre($langs->trans("ExpenseReportsVentilation")." ".$textprevyear." ".$langs->trans("Year")." ".$year_start." ".$textnextyear, '', 'title_accountancy'); print ''.$langs->trans("DescVentilExpenseReport").'
    '; @@ -247,7 +249,7 @@ $sql .= " AND aa.account_number IS NULL"; $sql .= " GROUP BY erd.fk_code_ventilation,aa.account_number,aa.label"; $sql .= ' ORDER BY aa.account_number'; -dol_syslog('/accountancy/expensereport/index.php:: sql='.$sql); +dol_syslog('/accountancy/expensereport/index.php', LOG_DEBUG); $resql = $db->query($sql); if ($resql) { $num = $db->num_rows($resql); @@ -277,6 +279,12 @@ if ($resql) { print '
    '; + print ''.$langs->trans("NoRecordFound").''; + print '
    '; $s = '1. '.(($facturefourn_static_det->product_type == 1) ? $langs->trans("DefaultForService") : $langs->trans("DefaultForProduct")).': '; - $shelp = ''; + $shelp = ''; $ttype = 'help'; if ($suggestedaccountingaccountbydefaultfor == 'eec') { $shelp .= $langs->trans("SaleEEC"); + } elseif ($suggestedaccountingaccountbydefaultfor == 'eecwithvat') { + $shelp = $langs->trans("SaleEECWithVAT"); + } elseif ($suggestedaccountingaccountbydefaultfor == 'eecwithoutvatnumber') { + $shelp = $langs->trans("SaleEECWithoutVATNumber"); + $ttype = 'warning'; } elseif ($suggestedaccountingaccountbydefaultfor == 'export') { $shelp .= $langs->trans("SaleExport"); } $s .= ($code_buy_l > 0 ? length_accountg($code_buy_l) : ''.$langs->trans("NotDefined").''); - print $form->textwithpicto($s, $shelp, 1, 'help', '', 0, 2, '', 1); + print $form->textwithpicto($s, $shelp, 1, $ttype, '', 0, 2, '', 1); if ($product_static->id > 0) { print '
    '; $s = '2. '.(($facturefourn_static_det->product_type == 1) ? $langs->trans("ThisService") : $langs->trans("ThisProduct")).': '; diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 1bdad2ed3c5..52f91f86963 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -6273,7 +6273,7 @@ class Form if (!empty($conf->global->SERVICE_ARE_ECOMMERCE_200238EC)) { // If option to have vat for end customer for services is on require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; if (!isInEEC($societe_vendeuse) && (!is_object($societe_acheteuse) || (isInEEC($societe_acheteuse) && !$societe_acheteuse->isACompany()))) { - // We also add the buyer + // We also add the buyer country code if (is_numeric($type)) { if ($type == 1) { // We know product is a service $code_country .= ",'".$societe_acheteuse->country_code."'"; diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 0d4e30f4a2a..6bfc788ddd4 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -6490,7 +6490,7 @@ function get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, if (!empty($conf->global->SERVICE_ARE_ECOMMERCE_200238EC)) { if ($seller_in_cee && $buyer_in_cee) { $isacompany = $thirdparty_buyer->isACompany(); - if ($isacompany && !empty($conf->global->MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL)) { + if ($isacompany && getDolGlobalString('MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) { require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; if (!isValidVATID($thirdparty_buyer)) { $isacompany = 0; @@ -6526,7 +6526,7 @@ function get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, // Si (vendeur et acheteur dans Communaute europeenne) et (acheteur = particulier) alors TVA par defaut=TVA du produit vendu. Fin de regle if (($seller_in_cee && $buyer_in_cee)) { $isacompany = $thirdparty_buyer->isACompany(); - if ($isacompany && !empty($conf->global->MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL)) { + if ($isacompany && getDolGlobalString('MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) { require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; if (!isValidVATID($thirdparty_buyer)) { $isacompany = 0; diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang index 5a1e51a2269..d44c86ceccd 100644 --- a/htdocs/langs/en_US/accountancy.lang +++ b/htdocs/langs/en_US/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Select the carriage return type ACCOUNTING_EXPORT_PREFIX_SPEC=Specify the prefix for the file name ThisService=This service ThisProduct=This product -DefaultForService=Default for service -DefaultForProduct=Default for product +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Product for this thirdparty ServiceForThisThirdparty=Service for this thirdparty CantSuggest=Can't suggest @@ -101,7 +101,8 @@ ShowAccountingAccount=Show accounting account ShowAccountingJournal=Show accounting journal ShowAccountingAccountInLedger=Show accounting account in ledger ShowAccountingAccountInJournals=Show accounting account in journals -AccountAccountingSuggest=Accounting account suggested +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=Default accounts MenuBankAccounts=Bank accounts MenuVatAccounts=Vat accounts @@ -401,7 +402,7 @@ SaleLocal=Local sale SaleExport=Export sale SaleEEC=Sale in EEC SaleEECWithVAT=Sale in EEC with a VAT not null, so we suppose this is NOT an intracommunautary sale and the suggested account is the standard product account. -SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fallback on the product account for standard sales. You can fix the VAT ID of thirdparty or the product account if needed. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Forbidden: The transaction has been validated and/or exported. ForbiddenTransactionAlreadyValidated=Forbidden: The transaction has been validated. ## Dictionary From b964f1a4761c8adf2de08162ced6cc50f2167e84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9=20Courtier?= Date: Tue, 24 Jan 2023 14:21:14 +0100 Subject: [PATCH 1013/1128] FIX: page was not reloaded after addline causing a new lline creation was page was reloaded --- htdocs/expensereport/card.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/expensereport/card.php b/htdocs/expensereport/card.php index 31cf21c34ae..3f0541c89b4 100644 --- a/htdocs/expensereport/card.php +++ b/htdocs/expensereport/card.php @@ -1161,8 +1161,9 @@ if (empty($reshook)) { setEventMessages($object->error, $object->errors, 'errors'); } } - - $action = ''; + + header("Location: ".$_SERVER["PHP_SELF"]."?id=".GETPOST('id', 'int')); + exit; } if ($action == 'confirm_delete_line' && GETPOST("confirm", 'alpha') == "yes" && $user->rights->expensereport->creer) { From 08bd8caaf255fe5ec08dc9608238d9e99334d8b0 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Tue, 24 Jan 2023 13:28:59 +0000 Subject: [PATCH 1014/1128] Fixing style errors. --- htdocs/expensereport/card.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/expensereport/card.php b/htdocs/expensereport/card.php index 3f0541c89b4..0756cb1bc7f 100644 --- a/htdocs/expensereport/card.php +++ b/htdocs/expensereport/card.php @@ -1161,9 +1161,9 @@ if (empty($reshook)) { setEventMessages($object->error, $object->errors, 'errors'); } } - - header("Location: ".$_SERVER["PHP_SELF"]."?id=".GETPOST('id', 'int')); - exit; + + header("Location: ".$_SERVER["PHP_SELF"]."?id=".GETPOST('id', 'int')); + exit; } if ($action == 'confirm_delete_line' && GETPOST("confirm", 'alpha') == "yes" && $user->rights->expensereport->creer) { From 32da192db44a043b6d8e32f1b3339c5f9964289b Mon Sep 17 00:00:00 2001 From: hystepik Date: Tue, 24 Jan 2023 14:32:20 +0100 Subject: [PATCH 1015/1128] fix : php 8.1 warnings --- htdocs/compta/localtax/card.php | 5 ++++- htdocs/contrat/services_list.php | 3 +++ htdocs/loan/card.php | 5 +++-- htdocs/loan/list.php | 2 ++ htdocs/product/card.php | 2 +- htdocs/product/reassort.php | 2 +- htdocs/reception/contact.php | 2 +- htdocs/salaries/payments.php | 9 ++++++++- 8 files changed, 23 insertions(+), 7 deletions(-) diff --git a/htdocs/compta/localtax/card.php b/htdocs/compta/localtax/card.php index 8b6119db13a..ad80b6d1b6d 100644 --- a/htdocs/compta/localtax/card.php +++ b/htdocs/compta/localtax/card.php @@ -144,9 +144,12 @@ $form = new Form($db); $title = $langs->trans("LT".$object->ltt)." - ".$langs->trans("Card"); $help_url = ''; -llxHeader('', $title, $helpurl); +llxHeader('', $title, $help_url); if ($action == 'create') { + $datev = dol_mktime(12, 0, 0, GETPOST("datevmonth"), GETPOST("datevday"), GETPOST("datevyear")); + $datep = dol_mktime(12, 0, 0, GETPOST("datepmonth"), GETPOST("datepday"), GETPOST("datepyear")); + print load_fiche_titre($langs->transcountry($lttype == 2 ? "newLT2Payment" : "newLT1Payment", $mysoc->country_code)); print '
    '."\n"; diff --git a/htdocs/contrat/services_list.php b/htdocs/contrat/services_list.php index fb50283991b..d42dc70f49a 100644 --- a/htdocs/contrat/services_list.php +++ b/htdocs/contrat/services_list.php @@ -822,6 +822,9 @@ while ($i < min($num, $limit)) { if (!$i) { $totalarray['pos'][$totalarray['nbfield']] = 'cd.qty'; } + if (!$i) { + $totalarray['val']['cd.qty'] = $obj->qty; + } $totalarray['val']['cd.qty'] += $obj->qty; } if (!empty($arrayfields['cd.total_ht']['checked'])) { diff --git a/htdocs/loan/card.php b/htdocs/loan/card.php index a45577b6608..afa7aa5eaa8 100644 --- a/htdocs/loan/card.php +++ b/htdocs/loan/card.php @@ -66,6 +66,7 @@ $error = 0; * Actions */ +$parameters = array(); $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); @@ -291,13 +292,13 @@ if ($action == 'create') { // Date Start print "
    '.$langs->trans("DateStart").''; - print $form->selectDate($datestart ? $datestart : -1, 'start', '', '', '', 'add', 1, 1); + print $form->selectDate(!empty($datestart) ? $datestart : -1, 'start', '', '', '', 'add', 1, 1); print '
    '.$langs->trans("DateEnd").''; - print $form->selectDate($dateend ? $dateend : -1, 'end', '', '', '', 'add', 1, 1); + print $form->selectDate(!empty($dateend) ? $dateend : -1, 'end', '', '', '', 'add', 1, 1); print '
    '.$langs->trans("DefaultWorkstation").''; print img_picto($langs->trans("DefaultWorkstation"), 'workstation', 'class="pictofixedwidth"'); diff --git a/htdocs/product/reassort.php b/htdocs/product/reassort.php index 10581d19b7c..9946e7a9077 100644 --- a/htdocs/product/reassort.php +++ b/htdocs/product/reassort.php @@ -133,7 +133,7 @@ $helpurl = 'EN:Module_Stocks_En|FR:Module_Stock|ES:Módulo_Stocks'; $form = new Form($db); $htmlother = new FormOther($db); -if ($objp->stock_physique < 0) { print ''; } +if (!empty($objp->stock_physique) && $objp->stock_physique < 0) { print ''; } $sql = 'SELECT p.rowid, p.ref, p.label, p.barcode, p.price, p.price_ttc, p.price_base_type, p.entity,'; $sql .= ' p.fk_product_type, p.tms as datem,'; diff --git a/htdocs/reception/contact.php b/htdocs/reception/contact.php index 02cbc9af957..11ab664c6c0 100644 --- a/htdocs/reception/contact.php +++ b/htdocs/reception/contact.php @@ -72,7 +72,7 @@ if ($origin == 'reception') { } else { if ($origin == 'supplierorder' || $origin == 'order_supplier') { $result = restrictedArea($user, 'fournisseur', $origin_id, 'commande_fournisseur', 'commande'); - } elseif (empty($user->rights->{$origin}->lire) && empty($user->rights->{$origin}->read)) { + } elseif (empty($user->hasRight($origin, "lire")) && empty($user->hasRight($origin, "read"))) { accessforbidden(); } } diff --git a/htdocs/salaries/payments.php b/htdocs/salaries/payments.php index 5a5ccb08bf6..7bf61f3021f 100644 --- a/htdocs/salaries/payments.php +++ b/htdocs/salaries/payments.php @@ -97,6 +97,7 @@ $search_chq_number = GETPOST('search_chq_number', 'int'); $filtre = GETPOST("filtre", 'restricthtml'); +$search_type_id = ''; if (!GETPOST('search_type_id', 'int')) { $newfiltre = str_replace('filtre=', '', $filtre); $filterarray = explode('-', $newfiltre); @@ -532,6 +533,7 @@ if (isset($extrafields->attributes[$object->table_element]['computed']) && is_ar $i = 0; $total = 0; $totalarray = array(); +$totalarray['nbfield'] = 0; while ($i < ($limit ? min($num, $limit) : $num)) { $obj = $db->fetch_object($resql); if (empty($obj)) { @@ -697,7 +699,12 @@ while ($i < ($limit ? min($num, $limit) : $num)) { if (!$i) { $totalarray['pos'][$totalarray['nbfield']] = 'totalttcfield'; } - $totalarray['val']['totalttcfield'] += $obj->amount; + if (!$i) { + $totalarray['val']['totalttcfield'] = $obj->amount; + } else { + $totalarray['val']['totalttcfield'] += $obj->amount; + } + // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; From fe6d9730cdd8c2cc44749b56fed71401e4de9322 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 24 Jan 2023 16:58:35 +0100 Subject: [PATCH 1016/1128] Fix messages to avoid confusion. --- htdocs/accountancy/bookkeeping/list.php | 11 +++++++---- htdocs/langs/en_US/accountancy.lang | 2 ++ htdocs/langs/en_US/main.lang | 4 ++-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php index fa42b5bd6fd..983da7502d9 100644 --- a/htdocs/accountancy/bookkeeping/list.php +++ b/htdocs/accountancy/bookkeeping/list.php @@ -474,7 +474,7 @@ if (empty($reshook)) { if ($conf->global->ACCOUNTING_REEXPORT == 1) { setEventMessages($langs->trans("ExportOfPiecesAlreadyExportedIsEnable"), null, 'mesgs'); } else { - setEventMessages($langs->trans("ExportOfPiecesAlreadyExportedIsDisable"), null, 'mesgs'); + setEventMessages($langs->trans("ExportOfPiecesAlreadyExportedIsDisable"), null, 'warnings'); } } else { setEventMessages($langs->trans("Error"), null, 'errors'); @@ -953,11 +953,14 @@ $newcardbutton = empty($hookmanager->resPrint) ? '' : $hookmanager->resPrint; if (empty($reshook)) { // Button re-export if (!empty($conf->global->ACCOUNTING_REEXPORT)) { - $newcardbutton .= ''.img_picto($langs->trans("Activated"), 'switch_on').' '; + $newcardbutton .= ''.img_picto($langs->trans("ClickToHideAlreadyExportedLines"), 'switch_off', 'class="small size15x valignmiddle"'); + $newcardbutton .= ''.$langs->trans("ClickToHideAlreadyExportedLines").''; + $newcardbutton .= ''; } else { - $newcardbutton .= ''.img_picto($langs->trans("Disabled"), 'switch_off').' '; + $newcardbutton .= ''.img_picto($langs->trans("DocsAlreadyExportedAreExcluded"), 'switch_on', 'class="warning size15x valignmiddle"').''; + $newcardbutton .= ''.$langs->trans("DocsAlreadyExportedAreExcluded").''; + $newcardbutton .= ''; } - $newcardbutton .= ''.$langs->trans("IncludeDocsAlreadyExported").''; if ($user->hasRight('accounting', 'mouvements', 'export')) { $newcardbutton .= dolGetButtonTitle($buttonLabel, $langs->trans("ExportFilteredList").' ('.$listofformat[$formatexportset].')', 'fa fa-file-export paddingleft', $_SERVER["PHP_SELF"].'?action=export_file&token='.newToken().($param ? '&'.$param : ''), $user->hasRight('accounting', 'mouvements', 'export')); diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang index d44c86ceccd..801618352aa 100644 --- a/htdocs/langs/en_US/accountancy.lang +++ b/htdocs/langs/en_US/accountancy.lang @@ -472,5 +472,7 @@ FECFormatMulticurrencyCode=Multicurrency code (Idevise) DateExport=Date export WarningReportNotReliable=Warning, this report is not based on the Ledger, so does not contains transaction modified manually in the Ledger. If your journalization is up to date, the bookkeeping view is more accurate. ExpenseReportJournal=Expense Report Journal +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s accounts diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index 73dfee80a69..45119814420 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -912,8 +912,8 @@ 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 +ExportOfPiecesAlreadyExportedIsEnable=Documents already exported are visible and will be exported +ExportOfPiecesAlreadyExportedIsDisable=Documents already exported are hidden and won't be exported AllExportedMovementsWereRecordedAsExported=All exported movements were recorded as exported NotAllExportedMovementsCouldBeRecordedAsExported=Not all exported movements could be recorded as exported Miscellaneous=Miscellaneous From 891ba8f4ef6362639710058bc0d2f7242ef9fdea Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 24 Jan 2023 17:05:42 +0100 Subject: [PATCH 1017/1128] Debug v17 --- htdocs/core/class/conf.class.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/htdocs/core/class/conf.class.php b/htdocs/core/class/conf.class.php index 279ccded71c..2d6cc4f5715 100644 --- a/htdocs/core/class/conf.class.php +++ b/htdocs/core/class/conf.class.php @@ -783,6 +783,11 @@ class Conf $this->global->USE_STRICT_CSV_RULES = 2; } + // By default, option is on. Once set by user, this code is useless + if (!isset($this->global->ACCOUNTING_REEXPORT)) { + $this->global->ACCOUNTING_REEXPORT = 1; + } + // Use a SCA ready workflow with Stripe module (STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION by default if nothing defined) if (!isset($this->global->STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION) && empty($this->global->STRIPE_USE_NEW_CHECKOUT)) { $this->global->STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION = 1; From 5429882147db304bd3fa533f443e6436a79290d6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 24 Jan 2023 18:23:46 +0100 Subject: [PATCH 1018/1128] Debug v17 --- htdocs/accountancy/bookkeeping/list.php | 7 +- htdocs/core/lib/functions.lib.php | 2 +- htdocs/hrm/job_list.php | 290 +++++++++++++++--------- 3 files changed, 182 insertions(+), 117 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php index 983da7502d9..086a5acd918 100644 --- a/htdocs/accountancy/bookkeeping/list.php +++ b/htdocs/accountancy/bookkeeping/list.php @@ -994,7 +994,7 @@ if ($massaction == 'preunletteringauto') { include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php'; $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage; -$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields +$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN', '')); // This also change content of $arrayfields if ($massactionbutton && $contextpage != 'poslist') { $selectedfields .= $form->showCheckAddButtons('checkforselect', 1); } @@ -1010,7 +1010,7 @@ if (empty($reshook)) { } print '
    '; -print ''; +print '
    '; // Filters lines print ''; @@ -1166,8 +1166,7 @@ print "\n"; print ''; if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { - print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch '); -} + print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch actioncolumn ');} if (!empty($arrayfields['t.piece_num']['checked'])) { print_liste_field_titre($arrayfields['t.piece_num']['label'], $_SERVER['PHP_SELF'], "t.piece_num", "", $param, "", $sortfield, $sortorder); } diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 6bfc788ddd4..4d38c7e5e5d 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -4085,7 +4085,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $ 'delete', 'dolly', 'dollyrevert', 'donation', 'download', 'dynamicprice', 'edit', 'ellipsis-h', 'email', 'entity', 'envelope', 'eraser', 'establishment', 'expensereport', 'external-link-alt', 'external-link-square-alt', 'eye', 'filter', 'file-code', 'file-export', 'file-import', 'file-upload', 'autofill', 'folder', 'folder-open', 'folder-plus', - 'generate', 'globe', 'globe-americas', 'graph', 'grip', 'grip_title', 'group', + 'gears', 'generate', 'globe', 'globe-americas', 'graph', 'grip', 'grip_title', 'group', 'help', 'holiday', 'images', 'incoterm', 'info', 'intervention', 'inventory', 'intracommreport', 'knowledgemanagement', 'label', 'language', 'line', 'link', 'list', 'list-alt', 'listlight', 'loan', 'lock', 'lot', 'long-arrow-alt-right', diff --git a/htdocs/hrm/job_list.php b/htdocs/hrm/job_list.php index ed0fb480a3a..6cb1a4bf62c 100644 --- a/htdocs/hrm/job_list.php +++ b/htdocs/hrm/job_list.php @@ -115,11 +115,11 @@ $arrayfields = array(); foreach ($object->fields as $key => $val) { // If $val['visible']==0, then we never show the field if (!empty($val['visible'])) { - $visible = (int) dol_eval($val['visible'], 1, 1, '1'); + $visible = (int) dol_eval($val['visible'], 1); $arrayfields['t.'.$key] = array( 'label'=>$val['label'], 'checked'=>(($visible < 0) ? 0 : 1), - 'enabled'=>($visible != 3 && dol_eval($val['enabled'], 1, 1, '1')), + 'enabled'=>(abs($visible) != 3 && dol_eval($val['enabled'], 1)), 'position'=>$val['position'], 'help'=> isset($val['help']) ? $val['help'] : '' ); @@ -136,18 +136,15 @@ $permissiontoread = $user->rights->hrm->all->read; $permissiontoadd = $user->rights->hrm->all->write; $permissiontodelete = $user->rights->hrm->all->delete; -// Security check -if (empty($conf->hrm->enabled)) { - accessforbidden('Module not enabled'); -} - // Security check (enable the most restrictive one) if ($user->socid > 0) accessforbidden(); //if ($user->socid > 0) accessforbidden(); //$socid = 0; if ($user->socid > 0) $socid = $user->socid; //$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0); //restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft); -if (empty($conf->hrm->enabled)) accessforbidden(); +if (!isModEnabled('hrm')) { + accessforbidden('Module hrm not enabled'); +} if (!$permissiontoread) accessforbidden(); @@ -256,17 +253,17 @@ foreach ($search as $key => $val) { $mode_search = 2; } if ($search[$key] != '') { - $sql .= natural_search($key, $search[$key], (($key == 'status') ? 2 : $mode_search)); + $sql .= natural_search("t.".$db->escape($key), $search[$key], (($key == 'status') ? 2 : $mode_search)); } } else { if (preg_match('/(_dtstart|_dtend)$/', $key) && $search[$key] != '') { $columnName=preg_replace('/(_dtstart|_dtend)$/', '', $key); if (preg_match('/^(date|timestamp|datetime)/', $object->fields[$columnName]['type'])) { if (preg_match('/_dtstart$/', $key)) { - $sql .= " AND t." . $columnName . " >= '" . $db->idate($search[$key]) . "'"; + $sql .= " AND t.".$db->escape($columnName)." >= '".$db->idate($search[$key])."'"; } if (preg_match('/_dtend$/', $key)) { - $sql .= " AND t." . $columnName . " <= '" . $db->idate($search[$key]) . "'"; + $sql .= " AND t.".$db->escape($columnName)." <= '".$db->idate($search[$key])."'"; } } } @@ -286,7 +283,7 @@ $sql .= $hookmanager->resPrint; /* If a group by is required $sql .= " GROUP BY "; foreach($object->fields as $key => $val) { - $sql .= "t.".$key.", "; + $sql .= "t.".$db->escape($key).", "; } // Add fields from extrafields if (!empty($extrafields->attributes[$object->table_element]['label'])) { @@ -301,8 +298,6 @@ $sql .= $hookmanager->resPrint; $sql = preg_replace('/,\s*$/', '', $sql); */ -$sql .= $db->order($sortfield, $sortorder); - // Count total nb of records $nbtotalofrecords = ''; if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) { @@ -312,24 +307,24 @@ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) { $page = 0; $offset = 0; } + $db->free($resql); } -// if total of record found is smaller than limit, no need to do paging and to restart another select with limits set. -if (is_numeric($nbtotalofrecords) && ($limit > $nbtotalofrecords || empty($limit))) { - $num = $nbtotalofrecords; -} else { - if ($limit) { - $sql .= $db->plimit($limit + 1, $offset); - } - $resql = $db->query($sql); - if (!$resql) { - dol_print_error($db); - exit; - } - - $num = $db->num_rows($resql); +// Complete request and execute it with limit +$sql .= $db->order($sortfield, $sortorder); +if ($limit) { + $sql .= $db->plimit($limit + 1, $offset); } +$resql = $db->query($sql); +if (!$resql) { + dol_print_error($db); + exit; +} + +$num = $db->num_rows($resql); + + // Direct jump if only one record found if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $search_all && !$page) { $obj = $db->fetch_object($resql); @@ -362,6 +357,9 @@ llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', ''); $arrayofselected = is_array($toselect) ? $toselect : array(); $param = ''; +if (!empty($mode)) { + $param .= '&mode='.urlencode($mode); +} if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { $param .= '&contextpage='.urlencode($contextpage); } @@ -369,11 +367,17 @@ if ($limit > 0 && $limit != $conf->liste_limit) { $param .= '&limit='.urlencode($limit); } foreach ($search as $key => $val) { - if (is_array($search[$key]) && count($search[$key])) { + if (is_array($search[$key])) { foreach ($search[$key] as $skey) { - $param .= '&search_'.$key.'[]='.urlencode($skey); + if ($skey != '') { + $param .= '&search_'.$key.'[]='.urlencode($skey); + } } - } else { + } elseif (preg_match('/(_dtstart|_dtend)$/', $key) && !empty($val)) { + $param .= '&search_'.$key.'month='.((int) GETPOST('search_'.$key.'month', 'int')); + $param .= '&search_'.$key.'day='.((int) GETPOST('search_'.$key.'day', 'int')); + $param .= '&search_'.$key.'year='.((int) GETPOST('search_'.$key.'year', 'int')); + } elseif ($search[$key] != '') { $param .= '&search_'.$key.'='.urlencode($search[$key]); } } @@ -394,7 +398,7 @@ $arrayofmassactions = array( //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"), //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"), ); -if ($permissiontodelete) { +if (!empty($permissiontodelete)) { $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete"); } if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'predelete'))) { @@ -413,6 +417,7 @@ print ''; print ''; print ''; print ''; +print ''; $newcardbutton = dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', dol_buildpath('/hrm/job_card.php', 1).'?action=create', '', $permissiontoadd); @@ -426,9 +431,12 @@ $trackid = 'xxxx'.$object->id; include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php'; if ($search_all) { + $setupstring = ''; foreach ($fieldstosearchall as $key => $val) { $fieldstosearchall[$key] = $langs->trans($val); + $setupstring .= $key."=".$val.";"; } + print ''."\n"; print '
    '.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'
    '; } @@ -452,7 +460,7 @@ if (!empty($moreforfilter)) { } $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage; -$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields +$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN', '')); // This also change content of $arrayfields $selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : ''); print '
    '; // You can use div-table-responsive-no-min if you dont need reserved height for your table @@ -462,7 +470,15 @@ print '
    '; +// Action column +if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; +} foreach ($object->fields as $key => $val) { + $searchkey = empty($search[$key]) ? '' : $search[$key]; $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); if ($key == 'status') { $cssforfield .= ($cssforfield ? ' ' : '').'center'; @@ -470,7 +486,7 @@ foreach ($object->fields as $key => $val) { $cssforfield .= ($cssforfield ? ' ' : '').'center'; } elseif (in_array($val['type'], array('timestamp'))) { $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; - } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) { + } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $key != 'rowid' && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) { $cssforfield .= ($cssforfield ? ' ' : '').'right'; } if (!empty($arrayfields['t.'.$key]['checked'])) { @@ -478,9 +494,7 @@ foreach ($object->fields as $key => $val) { if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) { print $form->selectarray('search_'.$key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), $val['notnull'], 0, 0, '', 1, 0, 0, '', 'maxwidth100', 1); } elseif ((strpos($val['type'], 'integer:') === 0) || (strpos($val['type'], 'sellist:') === 0)) { - print $object->showInputField($val, $key, (isset($search[$key]) ? $search[$key] : ''), '', '', 'search_', 'maxwidth125', 1); - } elseif (!preg_match('/^(date|timestamp|datetime)/', $val['type'])) { - print ''; + print $object->showInputField($val, $key, (isset($search[$key]) ? $search[$key] : ''), '', '', 'search_', $cssforfield.' maxwidth125', 1); } elseif (preg_match('/^(date|timestamp|datetime)/', $val['type'])) { print '
    '; print $form->selectDate($search[$key.'_dtstart'] ? $search[$key.'_dtstart'] : '', "search_".$key."_dtstart", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From')); @@ -488,6 +502,12 @@ foreach ($object->fields as $key => $val) { print '
    '; print $form->selectDate($search[$key.'_dtend'] ? $search[$key.'_dtend'] : '', "search_".$key."_dtend", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to')); print '
    '; + } elseif ($key == 'lang') { + require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php'; + $formadmin = new FormAdmin($db); + print $formadmin->select_language($search[$key], 'search_lang', 0, null, 1, 0, 0, 'minwidth150 maxwidth200', 2); + } else { + print ''; } print ''; } @@ -500,16 +520,23 @@ $parameters = array('arrayfields'=>$arrayfields); $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Action column -print '
    '; +if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; +} print ''."\n"; +$totalarray = array(); +$totalarray['nbfield'] = 0; // Fields title label // -------------------------------------------------------------------- print ''; +if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n"; +} foreach ($object->fields as $key => $val) { $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); if ($key == 'status') { @@ -518,21 +545,26 @@ foreach ($object->fields as $key => $val) { $cssforfield .= ($cssforfield ? ' ' : '').'center'; } elseif (in_array($val['type'], array('timestamp'))) { $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; - } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) { + } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $key != 'rowid' && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) { $cssforfield .= ($cssforfield ? ' ' : '').'right'; } + $cssforfield = preg_replace('/small\s*/', '', $cssforfield); // the 'small' css must not be used for the title label if (!empty($arrayfields['t.'.$key]['checked'])) { print getTitleFieldOfList($arrayfields['t.'.$key]['label'], 0, $_SERVER['PHP_SELF'], 't.'.$key, '', $param, ($cssforfield ? 'class="'.$cssforfield.'"' : ''), $sortfield, $sortorder, ($cssforfield ? $cssforfield.' ' : ''))."\n"; + $totalarray['nbfield']++; } } // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php'; // Hook fields -$parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder); +$parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder, 'totalarray'=>&$totalarray); $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Action column -print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n"; +if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n"; +} +$totalarray['nbfield']++; print ''."\n"; @@ -550,9 +582,11 @@ if (isset($extrafields->attributes[$object->table_element]['computed']) && is_ar // Loop on record // -------------------------------------------------------------------- $i = 0; +$savnbfield = $totalarray['nbfield']; $totalarray = array(); $totalarray['nbfield'] = 0; -while ($i < ($limit ? min($num, $limit) : $num)) { +$imaxinloop = ($limit ? min($num, $limit) : $num); +while ($i < $imaxinloop) { $obj = $db->fetch_object($resql); if (empty($obj)) { break; // Should not happen @@ -561,77 +595,109 @@ while ($i < ($limit ? min($num, $limit) : $num)) { // Store properties in $object $object->setVarsFromFetchObj($obj); - // Show here line of result - print ''; - foreach ($object->fields as $key => $val) { - $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); - if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) { - $cssforfield .= ($cssforfield ? ' ' : '').'center'; - } elseif ($key == 'status') { - $cssforfield .= ($cssforfield ? ' ' : '').'center'; + if ($mode == 'kanban') { + if ($i == 0) { + print ''; } - - if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'status')) && empty($val['arrayofkeyval'])) { - $cssforfield .= ($cssforfield ? ' ' : '').'right'; - } - //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100'; - - if (!empty($arrayfields['t.'.$key]['checked'])) { - print ''; - if ($key == 'status') { - print $object->getLibStatut(5); - } elseif ($key == 'rowid') { - print $object->showOutputField($val, $key, $object->id, ''); - } elseif ($key == 'label') { - print $object->getNomUrl(1); - } else { - print $object->showOutputField($val, $key, $object->$key, ''); + } else { + // Show here line of result + $j = 0; + print ''; + // Action column + if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; - if (!$i) { - $totalarray['nbfield']++; - } - if (!empty($val['isameasure']) && $val['isameasure'] == 1) { - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key; - } - if (!isset($totalarray['val'])) { - $totalarray['val'] = array(); - } - if (!isset($totalarray['val']['t.'.$key])) { - $totalarray['val']['t.'.$key] = 0; - } - $totalarray['val']['t.'.$key] += $object->$key; - } } - } - // Extra fields - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - // Action column - print ''; - if (!$i) { - $totalarray['nbfield']++; - } + foreach ($object->fields as $key => $val) { + $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); + if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) { + $cssforfield .= ($cssforfield ? ' ' : '').'center'; + } elseif ($key == 'status') { + $cssforfield .= ($cssforfield ? ' ' : '').'center'; + } - print ''."\n"; + if (in_array($val['type'], array('timestamp'))) { + $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; + } elseif ($key == 'ref') { + $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; + } + + if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'status')) && empty($val['arrayofkeyval'])) { + $cssforfield .= ($cssforfield ? ' ' : '').'right'; + } + //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100'; + + if (!empty($arrayfields['t.'.$key]['checked'])) { + print ''; + if ($key == 'status') { + print $object->getLibStatut(5); + } elseif ($key == 'rowid') { + print $object->showOutputField($val, $key, $object->id, ''); + } elseif ($key == 'label') { + print $object->getNomUrl(1); + } else { + print $object->showOutputField($val, $key, $object->$key, ''); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + if (!empty($val['isameasure']) && $val['isameasure'] == 1) { + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key; + } + if (!isset($totalarray['val'])) { + $totalarray['val'] = array(); + } + if (!isset($totalarray['val']['t.'.$key])) { + $totalarray['val']['t.'.$key] = 0; + } + $totalarray['val']['t.'.$key] += $object->$key; + } + } + } + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray); + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Action column + if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + } + if (!$i) { + $totalarray['nbfield']++; + } + + print ''."\n"; + } $i++; } @@ -647,14 +713,14 @@ if ($num == 0) { $colspan++; } } - print ''; + print ''; } $db->free($resql); $parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql); -$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object); // Note that $action and $object may have been modified by hook +$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; print '
    '; + $searchpicto = $form->showFilterButtons('left'); + print $searchpicto; + print ''; -$searchpicto = $form->showFilterButtons(); -print $searchpicto; -print ''; + $searchpicto = $form->showFilterButtons(); + print $searchpicto; + print '
    '; + print '
    '; } - - if (in_array($val['type'], array('timestamp'))) { - $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; - } elseif ($key == 'ref') { - $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; + // Output Kanban + print $object->getKanbanView(''); + if ($i == ($imaxinloop - 1)) { + print '
    '; + print '
    '; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($object->id, $arrayofselected)) { + $selected = 1; + } + print ''; } print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($object->id, $arrayofselected)) { - $selected = 1; - } - print ''; - } - print '
    '; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($object->id, $arrayofselected)) { + $selected = 1; + } + print ''; + } + print '
    '.$langs->trans("NoRecordFound").'
    '.$langs->trans("NoRecordFound").'
    '."\n"; From 87d9b8075bb88d8a12fb2a82a45f96c7be42514e Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Tue, 24 Jan 2023 20:40:16 +0100 Subject: [PATCH 1019/1128] fix error style --- htdocs/hrm/position_list.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/hrm/position_list.php b/htdocs/hrm/position_list.php index de86b3d41c5..4518d28bf65 100644 --- a/htdocs/hrm/position_list.php +++ b/htdocs/hrm/position_list.php @@ -247,7 +247,6 @@ if ($object->ismultientitymanaged == 1) { } else { $sql .= " WHERE 1 = 1"; } -$sql .= " AND t.fk_user = u.rowid"; $sql .= " AND t.fk_job = j.rowid"; foreach ($search as $key => $val) { if (array_key_exists($key, $object->fields)) { From 373c8d83df1c50cea5270b126c35af984a1966ba Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 24 Jan 2023 23:26:17 +0100 Subject: [PATCH 1020/1128] Doc --- htdocs/core/class/commoninvoice.class.php | 8 +++++--- htdocs/stripe/class/stripe.class.php | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/htdocs/core/class/commoninvoice.class.php b/htdocs/core/class/commoninvoice.class.php index 17c9c7deae3..cb737a8bdd4 100644 --- a/htdocs/core/class/commoninvoice.class.php +++ b/htdocs/core/class/commoninvoice.class.php @@ -1079,10 +1079,12 @@ abstract class CommonInvoice extends CommonObject if ($companypaymentmode->type == 'ban') { $sepaMode = true; // Check into societe_rib if a payment mode for Stripe and ban payment exists + // To make a Stripe SEPA payment request, we must have the payment mode source already saved into societe_rib and retreived with ->sepaStripe + // The payment mode source is created when we create the bank account on Stripe with paymentmodes.php?action=create $stripecard = $stripe->sepaStripe($customer, $companypaymentmode, $stripeacc, $servicestatus, 0); } - if ($stripecard) { // Can be src_... (for sepa). Note that card_... (old card mode) or pm_... (new card mode) should not happen here. + if ($stripecard) { // Can be src_... (for sepa) or pm_... (new card mode). Note that card_... (old card mode) should not happen here. $FULLTAG = 'INV=' . $this->id . '-CUS=' . $thirdparty->id; $description = 'Stripe payment from makeStripeSepaRequest: ' . $FULLTAG . ' ref=' . $this->ref; @@ -1097,7 +1099,7 @@ abstract class CommonInvoice extends CommonObject $paymentintent = $stripe->getPaymentIntent($amounttopay, $currency, $FULLTAG, $description, $this, $customer->id, $stripeacc, $servicestatus, 0, 'automatic', true, $stripecard->id, 1); $charge = new stdClass(); - //erics add processing sepa is like success ? + if ($paymentintent->status === 'succeeded' || $paymentintent->status === 'processing') { $charge->status = 'ok'; $charge->id = $paymentintent->id; @@ -1185,7 +1187,7 @@ abstract class CommonInvoice extends CommonObject $description = 'Stripe payment request OK (' . $charge->id . ') from makeStripeSepaRequest: ' . $FULLTAG; - // TODO Save request to status pending. Done should be set with a webhook. + // @TODO LMR Save request to status pending instead of done. Done should be set with a webhook. $db = $this->db; diff --git a/htdocs/stripe/class/stripe.class.php b/htdocs/stripe/class/stripe.class.php index 6a6ad66a96a..bc98a085d08 100644 --- a/htdocs/stripe/class/stripe.class.php +++ b/htdocs/stripe/class/stripe.class.php @@ -1013,8 +1013,8 @@ class Stripe extends CommonObject $s = new \Stripe\StripeClient($stripeacc); - // TODO Deprecated with the new Stripe API and SCA. - // TODO Replace ->create() and ->createSource() and replace with ->getSetupIntent() to get a Payment mode with $payment_method = \Stripe\PaymentMethod::retrieve($setupintent->payment_method); ? + // TODO LMR Deprecated with the new Stripe API and SCA. + // TODO LMR Replace ->create() and ->createSource() and replace with ->getSetupIntent() to then, get the Payment mode with $payment_method = \Stripe\PaymentMethod::retrieve($setupintent->payment_method); ? $sepa = $s->sources->create($dataforcard); if (!$sepa) { $this->error = 'Creation of sepa_debit on Stripe has failed'; From fe8a870f5a4dadb581c10433daba81b3e4feb21d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 25 Jan 2023 09:51:18 +0100 Subject: [PATCH 1021/1128] Add TODO --- htdocs/core/class/commoninvoice.class.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/commoninvoice.class.php b/htdocs/core/class/commoninvoice.class.php index cb737a8bdd4..d1eb324cc7f 100644 --- a/htdocs/core/class/commoninvoice.class.php +++ b/htdocs/core/class/commoninvoice.class.php @@ -1175,9 +1175,9 @@ abstract class CommonInvoice extends CommonObject $postactionmessages[] = $errmsg . ' (' . $stripearrayofkeys['publishable_key'] . ')'; $this->errors[] = $errmsg; } else { - dol_syslog('Successfuly charge direct debit ' . $stripecard->id); + dol_syslog('Successfuly request direct debit ' . $stripecard->id); - $postactionmessages[] = 'Success to charge direct debit (' . $charge->id . ' with ' . $stripearrayofkeys['publishable_key'] . ')'; + $postactionmessages[] = 'Success to request direct debit (' . $charge->id . ' with ' . $stripearrayofkeys['publishable_key'] . ')'; // Save a stripe payment was done in realy life so later we will be able to force a commit on recorded payments // even if in batch mode (method doTakePaymentStripe), we will always make all action in one transaction with a forced commit. @@ -1229,6 +1229,7 @@ abstract class CommonInvoice extends CommonObject $ispostactionok = 1; // Creation of payment line + // TODO LMR This must be move into the stripe server listening hooks public/stripe/ipn.php include_once DOL_DOCUMENT_ROOT . '/compta/paiement/class/paiement.class.php'; $paiement = new Paiement($this->db); $paiement->datepaye = $now; From ae118f2109b171f28bef55b6205df209b56d1423 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 25 Jan 2023 14:48:41 +0100 Subject: [PATCH 1022/1128] Clean code --- htdocs/contrat/list.php | 51 ++++++++++++------- .../modulebuilder/template/myobject_list.php | 2 +- 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/htdocs/contrat/list.php b/htdocs/contrat/list.php index 7ea26bf6f1b..ce3ac212b68 100644 --- a/htdocs/contrat/list.php +++ b/htdocs/contrat/list.php @@ -63,7 +63,7 @@ $search_type_thirdparty = GETPOST("search_type_thirdparty", 'int'); $search_contract = GETPOST('search_contract', 'alpha'); $search_ref_customer = GETPOST('search_ref_customer', 'alpha'); $search_ref_supplier = GETPOST('search_ref_supplier', 'alpha'); -$sall = (GETPOST('search_all', 'alphanohtml') != '') ? GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml'); +$search_all = (GETPOST('search_all', 'alphanohtml') != '') ? GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml'); $search_status = GETPOST('search_status', 'alpha'); $socid = GETPOST('socid', 'int'); $search_user = GETPOST('search_user', 'int'); @@ -167,9 +167,12 @@ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php'; $object->fields = dol_sort_array($object->fields, 'position'); $arrayfields = dol_sort_array($arrayfields, 'position'); +$permissiontoread = $user->rights->contrat->lire; +$permissiontodelete = $user->rights->contrat->supprimer; + /* - * Action + * Actions */ if (GETPOST('cancel', 'alpha')) { @@ -213,7 +216,7 @@ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x' $search_date_endyear = ''; $search_date_start = ''; $search_date_end = ''; - $sall = ""; + $search_all = ""; $search_status = ""; $toselect = array(); $search_type_thirdparty = ''; @@ -224,8 +227,6 @@ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x' if (empty($reshook)) { $objectclass = 'Contrat'; $objectlabel = 'Contracts'; - $permissiontoread = $user->rights->contrat->lire; - $permissiontodelete = $user->rights->contrat->supprimer; $uploaddir = $conf->contrat->dir_output; include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php'; } @@ -265,6 +266,9 @@ if (!empty($extrafields->attributes[$object->table_element]['label'])) { $parameters = array(); $reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook $sql .= $hookmanager->resPrint; + +$sqlfields = $sql; // $sql fields to remove for count total + $sql .= " FROM ".MAIN_DB_PREFIX."societe as s"; $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as country on (country.rowid = s.fk_pays)"; $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_typent as typent on (typent.id = s.fk_typent)"; @@ -325,8 +329,8 @@ if ($search_country && $search_country != '-1') { if ($search_sale > 0) { $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $search_sale); } -if ($sall) { - $sql .= natural_search(array_keys($fieldstosearchall), $sall); +if ($search_all) { + $sql .= natural_search(array_keys($fieldstosearchall), $search_all); } if ($search_user > 0) { $sql .= " AND ec.fk_c_type_contact = tc.rowid AND tc.element='contrat' AND tc.source='internal' AND ec.element_id = c.rowid AND ec.fk_socpeople = ".((int) $search_user); @@ -456,13 +460,17 @@ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) { } } } else { - $sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/Ui', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql); - $sqlforcount = preg_replace('/LEFT JOIN '.MAIN_DB_PREFIX.'contratdet as cd ON c.rowid = cd.fk_contrat/', '', $sqlforcount); + /* The fast and low memory method to get and count full list converts the sql into a sql count */ + $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql); $sqlforcount = preg_replace('/GROUP BY.*$/', '', $sqlforcount); $resql = $db->query($sqlforcount); - $objforcount = $db->fetch_object($resql); - $nbtotalofrecords = $objforcount->nbtotalofrecords; + if ($resql) { + $objforcount = $db->fetch_object($resql); + $nbtotalofrecords = $objforcount->nbtotalofrecords; + } else { + dol_print_error($db); + } } if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0 @@ -485,7 +493,7 @@ if (!$resql) { $num = $db->num_rows($resql); // Direct jump if only one record found -if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $sall && !$page) { +if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $search_all && !$page) { $obj = $db->fetch_object($resql); $id = $obj->rowid; header("Location: ".DOL_URL_ROOT.'/contrat/card.php?id='.$id); @@ -520,8 +528,8 @@ if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { if ($limit > 0 && $limit != $conf->liste_limit) { $param .= '&limit='.urlencode($limit); } -if ($sall != '') { - $param .= '&sall='.urlencode($sall); +if ($search_all != '') { + $param .= '&search_all='.urlencode($search_all); } if ($search_contract != '') { $param .= '&search_contract='.urlencode($search_contract); @@ -598,10 +606,10 @@ $arrayofmassactions = array( 'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"), 'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"), ); -if ($user->rights->contrat->supprimer) { +if (!empty($permissiontodelete)) { $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete"); } -if (in_array($massaction, array('presend', 'predelete'))) { +if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'predelete'))) { $arrayofmassactions = array(); } $massactionbutton = $form->selectMassAction('', $arrayofmassactions); @@ -615,7 +623,7 @@ $newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars i $newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition')); $newcardbutton .= dolGetButtonTitle($langs->trans('NewContractSubscription'), '', 'fa fa-plus-circle', $url, '', $user->rights->contrat->creer); -print ''; +print ''; if ($optioncss != '') { print ''; } @@ -624,7 +632,9 @@ print ''; print ''; print ''; +print ''; print ''; +print ''; print ''; print_barre_liste($langs->trans("Contracts"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'contract', 0, $newcardbutton, '', $limit, 0, 0, 1); @@ -635,11 +645,14 @@ $objecttmp = new Contrat($db); $trackid = 'con'.$object->id; include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php'; -if ($sall) { +if ($search_all) { + $setupstring = ''; foreach ($fieldstosearchall as $key => $val) { $fieldstosearchall[$key] = $langs->trans($val); + $setupstring .= $key."=".$val.";"; } - print '
    '.$langs->trans("FilterOnInto", $sall).join(', ', $fieldstosearchall).'
    '; + print ''."\n"; + print '
    '.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'
    '."\n"; } $moreforfilter = ''; diff --git a/htdocs/modulebuilder/template/myobject_list.php b/htdocs/modulebuilder/template/myobject_list.php index 58231ee7de5..e9a33177f67 100644 --- a/htdocs/modulebuilder/template/myobject_list.php +++ b/htdocs/modulebuilder/template/myobject_list.php @@ -527,7 +527,7 @@ $moreforfilter.= $langs->trans('MyFilter') . ': '."\n"; + print ''."\n"; print '
    '.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'
    '."\n"; } diff --git a/htdocs/modulebuilder/template/myobject_list.php b/htdocs/modulebuilder/template/myobject_list.php index e9a33177f67..88775b823f5 100644 --- a/htdocs/modulebuilder/template/myobject_list.php +++ b/htdocs/modulebuilder/template/myobject_list.php @@ -517,7 +517,7 @@ if ($search_all) { $fieldstosearchall[$key] = $langs->trans($val); $setupstring .= $key."=".$val.";"; } - print ''."\n"; + print ''."\n"; print '
    '.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'
    '."\n"; } From d0e9290dafaed4b781425b0d23da6a7bf4339413 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 25 Jan 2023 15:27:10 +0100 Subject: [PATCH 1024/1128] NEW An external module can modify the quick search fields --- htdocs/bom/bom_list.php | 2 +- htdocs/bookcal/availabilities_list.php | 2 +- htdocs/bookcal/booking_list.php | 2 +- .../compta/cashcontrol/cashcontrol_list.php | 2 +- htdocs/contrat/class/contrat.class.php | 9 ++++---- htdocs/contrat/list.php | 23 ++++++++++++------- .../conferenceorbooth_list.php | 2 +- .../knowledgerecord_list.php | 2 +- .../modulebuilder/template/myobject_list.php | 9 +++++++- htdocs/partnership/partnership_list.php | 2 +- .../recruitmentcandidature_list.php | 2 +- htdocs/ticket/list.php | 2 +- htdocs/user/group/list.php | 2 +- 13 files changed, 38 insertions(+), 23 deletions(-) diff --git a/htdocs/bom/bom_list.php b/htdocs/bom/bom_list.php index 601eb9b75b3..c5e5491dff8 100644 --- a/htdocs/bom/bom_list.php +++ b/htdocs/bom/bom_list.php @@ -517,7 +517,7 @@ if ($search_all) { $fieldstosearchall[$key] = $langs->trans($val); $setupstring .= $key."=".$val.";"; } - print ''."\n"; + print ''."\n"; print '
    '.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'
    '."\n"; } diff --git a/htdocs/bookcal/availabilities_list.php b/htdocs/bookcal/availabilities_list.php index 26d66ce0ca4..414faf2dc5a 100644 --- a/htdocs/bookcal/availabilities_list.php +++ b/htdocs/bookcal/availabilities_list.php @@ -470,7 +470,7 @@ if ($search_all) { $fieldstosearchall[$key] = $langs->trans($val); $setupstring .= $key."=".$val.";"; } - print ''."\n"; + print ''."\n"; print '
    '.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'
    '."\n"; } diff --git a/htdocs/bookcal/booking_list.php b/htdocs/bookcal/booking_list.php index 2e4fbfccd16..3c78ffea120 100644 --- a/htdocs/bookcal/booking_list.php +++ b/htdocs/bookcal/booking_list.php @@ -470,7 +470,7 @@ if ($search_all) { $fieldstosearchall[$key] = $langs->trans($val); $setupstring .= $key."=".$val.";"; } - print ''."\n"; + print ''."\n"; print '
    '.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'
    '."\n"; } diff --git a/htdocs/compta/cashcontrol/cashcontrol_list.php b/htdocs/compta/cashcontrol/cashcontrol_list.php index a1e5dae0c91..05612f54166 100644 --- a/htdocs/compta/cashcontrol/cashcontrol_list.php +++ b/htdocs/compta/cashcontrol/cashcontrol_list.php @@ -423,7 +423,7 @@ if ($search_all) { $fieldstosearchall[$key] = $langs->trans($val); $setupstring .= $key."=".$val.";"; } - print ''."\n"; + print ''."\n"; print '
    '.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'
    '."\n"; } diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index 4d08fdb96cd..bf945eeae96 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -225,9 +225,10 @@ class Contrat extends CommonObject */ public $fields = array( 'rowid' =>array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>10), - 'ref' =>array('type'=>'varchar(50)', 'label'=>'Ref', 'enabled'=>1, 'visible'=>-1, 'showoncombobox'=>1, 'position'=>15), + 'ref' =>array('type'=>'varchar(50)', 'label'=>'Ref', 'enabled'=>1, 'visible'=>-1, 'showoncombobox'=>1, 'position'=>15, 'searchall'=>1), 'ref_ext' =>array('type'=>'varchar(255)', 'label'=>'Ref ext', 'enabled'=>1, 'visible'=>0, 'position'=>20), - 'ref_supplier' =>array('type'=>'varchar(50)', 'label'=>'Ref supplier', 'enabled'=>1, 'visible'=>-1, 'position'=>25), + 'ref_customer' =>array('type'=>'varchar(50)', 'label'=>'RefCustomer', 'enabled'=>1, 'visible'=>-1, 'position'=>25, 'searchall'=>1), + 'ref_supplier' =>array('type'=>'varchar(50)', 'label'=>'RefSupplier', 'enabled'=>1, 'visible'=>-1, 'position'=>26, 'searchall'=>1), 'entity' =>array('type'=>'integer', 'label'=>'Entity', 'default'=>1, 'enabled'=>1, 'visible'=>-2, 'notnull'=>1, 'position'=>30, 'index'=>1), 'tms' =>array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>35), 'datec' =>array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>1, 'visible'=>-1, 'position'=>40), @@ -237,8 +238,8 @@ class Contrat extends CommonObject 'fk_commercial_signature' =>array('type'=>'integer:User:user/class/user.class.php', 'label'=>'SaleRepresentative Signature', 'enabled'=>1, 'visible'=>-1, 'position'=>80), 'fk_commercial_suivi' =>array('type'=>'integer:User:user/class/user.class.php', 'label'=>'SaleRepresentative follower', 'enabled'=>1, 'visible'=>-1, 'position'=>85), 'fk_user_author' =>array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserAuthor', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>90), - 'note_public' =>array('type'=>'text', 'label'=>'NotePublic', 'enabled'=>1, 'visible'=>0, 'position'=>105), - 'note_private' =>array('type'=>'text', 'label'=>'NotePrivate', 'enabled'=>1, 'visible'=>0, 'position'=>110), + 'note_public' =>array('type'=>'text', 'label'=>'NotePublic', 'enabled'=>1, 'visible'=>0, 'position'=>105, 'searchall'=>1), + 'note_private' =>array('type'=>'text', 'label'=>'NotePrivate', 'enabled'=>1, 'visible'=>0, 'position'=>110, 'searchall'=>1), 'model_pdf' =>array('type'=>'varchar(255)', 'label'=>'Model pdf', 'enabled'=>1, 'visible'=>0, 'position'=>115), 'import_key' =>array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>1, 'visible'=>-2, 'position'=>120), 'extraparams' =>array('type'=>'varchar(255)', 'label'=>'Extraparams', 'enabled'=>1, 'visible'=>-1, 'position'=>125), diff --git a/htdocs/contrat/list.php b/htdocs/contrat/list.php index f24bbad4a85..31d489c4b1f 100644 --- a/htdocs/contrat/list.php +++ b/htdocs/contrat/list.php @@ -133,16 +133,23 @@ $extrafields->fetch_name_optionals_label($object->table_element); $search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_'); // List of fields to search into when doing a "search in all" -$fieldstosearchall = array( - 'c.ref'=>'Ref', - 'c.ref_customer'=>'RefCustomer', - 'c.ref_supplier'=>'RefSupplier', - 's.nom'=>"ThirdParty", - 'c.note_public'=>'NotePublic', -); +$fieldstosearchall = array(); +foreach ($object->fields as $key => $val) { + if (!empty($val['searchall'])) { + $fieldstosearchall['c.'.$key] = $val['label']; + } +} +$fieldstosearchall["s.nom"] = "ThirdParty"; if (empty($user->socid)) { $fieldstosearchall["c.note_private"] = "NotePrivate"; } +$parameters = array('fieldstosearchall'=>$fieldstosearchall); +$reshook = $hookmanager->executeHooks('completeFieldsToSearchAll', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks +if ($reshook > 0) { + $fieldstosearchall = $hookmanager->resArray['fieldstosearchall']; +} elseif ($reshook == 0) { + $fieldstosearchall = array_merge($fieldstosearchall, $hookmanager->resArray['fieldstosearchall']); +} $arrayfields = array( 'c.ref'=>array('label'=>$langs->trans("Ref"), 'checked'=>1, 'position'=>10), @@ -651,7 +658,7 @@ if ($search_all) { $fieldstosearchall[$key] = $langs->trans($val); $setupstring .= $key."=".$val.";"; } - print ''."\n"; + print ''."\n"; print '
    '.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'
    '."\n"; } diff --git a/htdocs/eventorganization/conferenceorbooth_list.php b/htdocs/eventorganization/conferenceorbooth_list.php index 21172d774d9..06fb65a8b10 100644 --- a/htdocs/eventorganization/conferenceorbooth_list.php +++ b/htdocs/eventorganization/conferenceorbooth_list.php @@ -721,7 +721,7 @@ if ($search_all) { $fieldstosearchall[$key] = $langs->trans($val); $setupstring .= $key."=".$val.";"; } - print ''."\n"; + print ''."\n"; print '
    '.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'
    '."\n"; } diff --git a/htdocs/knowledgemanagement/knowledgerecord_list.php b/htdocs/knowledgemanagement/knowledgerecord_list.php index 7f3e3cec2c1..7cd5a24c764 100644 --- a/htdocs/knowledgemanagement/knowledgerecord_list.php +++ b/htdocs/knowledgemanagement/knowledgerecord_list.php @@ -469,7 +469,7 @@ if ($search_all) { $fieldstosearchall[$key] = $langs->trans($val); $setupstring .= $key."=".$val.";"; } - print ''."\n"; + print ''."\n"; print '
    '.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'
    '."\n"; } diff --git a/htdocs/modulebuilder/template/myobject_list.php b/htdocs/modulebuilder/template/myobject_list.php index 88775b823f5..66aa7b0b35e 100644 --- a/htdocs/modulebuilder/template/myobject_list.php +++ b/htdocs/modulebuilder/template/myobject_list.php @@ -118,7 +118,7 @@ $pagenext = $page + 1; $object = new MyObject($db); $extrafields = new ExtraFields($db); $diroutputmassaction = $conf->mymodule->dir_output.'/temp/massgeneration/'.$user->id; -$hookmanager->initHooks(array('myobjectlist')); // Note that conf->hooks_modules contains array +$hookmanager->initHooks(array($contextpage)); // Note that conf->hooks_modules contains array of activated contexes // Fetch optionals attributes and labels $extrafields->fetch_name_optionals_label($object->table_element); @@ -155,6 +155,13 @@ foreach ($object->fields as $key => $val) { $fieldstosearchall['t.'.$key] = $val['label']; } } +$parameters = array('fieldstosearchall'=>$fieldstosearchall); +$reshook = $hookmanager->executeHooks('completeFieldsToSearchAll', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks +if ($reshook > 0) { + $fieldstosearchall = $hookmanager->resArray['fieldstosearchall']; +} elseif ($reshook == 0) { + $fieldstosearchall = array_merge($fieldstosearchall, $hookmanager->resArray['fieldstosearchall']); +} // Definition of array of fields for columns $arrayfields = array(); diff --git a/htdocs/partnership/partnership_list.php b/htdocs/partnership/partnership_list.php index a795d8d33f4..7144f201022 100644 --- a/htdocs/partnership/partnership_list.php +++ b/htdocs/partnership/partnership_list.php @@ -664,7 +664,7 @@ if ($search_all) { $fieldstosearchall[$key] = $langs->trans($val); $setupstring .= $key."=".$val.";"; } - print ''."\n"; + print ''."\n"; print '
    '.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'
    '."\n"; } diff --git a/htdocs/recruitment/recruitmentcandidature_list.php b/htdocs/recruitment/recruitmentcandidature_list.php index aff8c86a955..95b6ac6203d 100644 --- a/htdocs/recruitment/recruitmentcandidature_list.php +++ b/htdocs/recruitment/recruitmentcandidature_list.php @@ -571,7 +571,7 @@ if ($search_all) { $fieldstosearchall[$key] = $langs->trans($val); $setupstring .= $key."=".$val.";"; } - print ''."\n"; + print ''."\n"; print '
    '.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'
    '."\n"; } diff --git a/htdocs/ticket/list.php b/htdocs/ticket/list.php index 1d2cefaf622..f3e2c82d703 100644 --- a/htdocs/ticket/list.php +++ b/htdocs/ticket/list.php @@ -782,7 +782,7 @@ if ($search_all) { $fieldstosearchall[$key] = $langs->trans($val); $setupstring .= $key."=".$val.";"; } - print ''."\n"; + print ''."\n"; print '
    '.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'
    '."\n"; } diff --git a/htdocs/user/group/list.php b/htdocs/user/group/list.php index 7e707b6b4fc..b0327eebe08 100644 --- a/htdocs/user/group/list.php +++ b/htdocs/user/group/list.php @@ -285,7 +285,7 @@ if ($search_all) { $fieldstosearchall[$key] = $langs->trans($val); $setupstring .= $key."=".$val.";"; } - print ''."\n"; + print ''."\n"; print '
    '.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'
    '."\n"; } From e8c2c6b6999f2ef060565c92f0e971d1de0a2ca5 Mon Sep 17 00:00:00 2001 From: kkhelifa Date: Wed, 25 Jan 2023 15:28:34 +0100 Subject: [PATCH 1025/1128] FIX: Rights on action for payments by bank transfer --- htdocs/compta/prelevement/card.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/prelevement/card.php b/htdocs/compta/prelevement/card.php index c9f90b8b240..33a4409bac9 100644 --- a/htdocs/compta/prelevement/card.php +++ b/htdocs/compta/prelevement/card.php @@ -272,7 +272,7 @@ if ($id > 0 || $ref) { print $formconfirm; - if (empty($object->date_trans) && $user->rights->prelevement->bons->send && $action == 'settransmitted') { + if (empty($object->date_trans) && (($user->rights->prelevement->bons->send && $object->type != 'bank-transfer') || ($user->rights->paymentbybanktransfer->send && $object->type == 'bank-transfer')) && $action == 'settransmitted') { print ''; print ''; print ''; @@ -291,7 +291,7 @@ if ($id > 0 || $ref) { print '
    '; } - if (!empty($object->date_trans) && empty($object->date_credit) && $user->rights->prelevement->bons->credit && $action == 'setcredited') { + if (!empty($object->date_trans) && empty($object->date_credit) && (($user->rights->prelevement->bons->credit && $object->type != 'bank-transfer') || ($user->rights->paymentbybanktransfer->debit && $object->type == 'bank-transfer')) && $action == 'setcredited') { $btnLabel = ($object->type == 'bank-transfer') ? $langs->trans("ClassDebited") : $langs->trans("ClassCredited"); print ''; print ''; From 79b7b106fc1f1fdf6baf93bb5c1fe42c9a7c8c14 Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Wed, 25 Jan 2023 15:35:09 +0100 Subject: [PATCH 1026/1128] FIX - PHP8 Warnning admin commande --- htdocs/admin/commande.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/admin/commande.php b/htdocs/admin/commande.php index 79c42f6e2db..20064ca099c 100644 --- a/htdocs/admin/commande.php +++ b/htdocs/admin/commande.php @@ -117,7 +117,7 @@ if ($action == 'updateMask') { } elseif ($action == 'del') { $ret = delDocumentModel($value, $type); if ($ret > 0) { - if ($conf->global->COMMANDE_ADDON_PDF == "$value") { + if (getDolGlobalString('COMMANDE_ADDON_PDF') == $value) { dolibarr_del_const($db, 'COMMANDE_ADDON_PDF', $conf->entity); } } From 4e289bf5baf343a10db140561e8b90587aa0fa2a Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Wed, 25 Jan 2023 15:36:47 +0100 Subject: [PATCH 1027/1128] next --- htdocs/admin/commande.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/admin/commande.php b/htdocs/admin/commande.php index 20064ca099c..b366ea928ef 100644 --- a/htdocs/admin/commande.php +++ b/htdocs/admin/commande.php @@ -461,7 +461,7 @@ foreach ($dirmodels as $reldir) { // Default print '
    '; - if ($conf->global->COMMANDE_ADDON_PDF == $name) { + if (getDolGlobalString('COMMANDE_ADDON_PDF') == $name) { print img_picto($langs->trans("Default"), 'on'); } else { print 'scandir).'&label='.urlencode($module->name).'" alt="'.$langs->trans("Default").'">'.img_picto($langs->trans("Disabled"), 'off').''; From 8c7f0e8e93739e2781d3cce2ab9a8ed8fe7f5efe Mon Sep 17 00:00:00 2001 From: hystepik Date: Wed, 25 Jan 2023 16:06:41 +0100 Subject: [PATCH 1028/1128] fix travis --- htdocs/reception/contact.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/reception/contact.php b/htdocs/reception/contact.php index 11ab664c6c0..97d6d19a4f9 100644 --- a/htdocs/reception/contact.php +++ b/htdocs/reception/contact.php @@ -72,7 +72,7 @@ if ($origin == 'reception') { } else { if ($origin == 'supplierorder' || $origin == 'order_supplier') { $result = restrictedArea($user, 'fournisseur', $origin_id, 'commande_fournisseur', 'commande'); - } elseif (empty($user->hasRight($origin, "lire")) && empty($user->hasRight($origin, "read"))) { + } elseif (!$user->hasRight($origin, "lire") && !$user->hasRight($origin, "read")) { accessforbidden(); } } From 8c0c69c4952ebb4c73ef4d416aa7278d06f51ecd Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 25 Jan 2023 16:38:05 +0100 Subject: [PATCH 1029/1128] Debug set/edit date/end of contrat lines --- htdocs/contrat/card.php | 61 +++++++++++--------------- htdocs/contrat/class/contrat.class.php | 14 +++--- 2 files changed, 32 insertions(+), 43 deletions(-) diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index b29f001bda2..54779bb692d 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -143,7 +143,16 @@ if (empty($reshook)) { include DOL_DOCUMENT_ROOT.'/core/actions_lineupdown.inc.php'; // Must be include, not include_once if ($action == 'confirm_active' && $confirm == 'yes' && $user->rights->contrat->activer) { - $result = $object->active_line($user, GETPOST('ligne', 'int'), GETPOST('date'), GETPOST('dateend'), GETPOST('comment')); + $date_start = ''; + $date_end = ''; + if (GETPOST('startmonth') && GETPOST('startday') && GETPOST('startyear')) { + $date_start = dol_mktime(GETPOST('starthour'), GETPOST('startmin'), 0, GETPOST('startmonth'), GETPOST('startday'), GETPOST('startyear')); + } + if (GETPOST('endmonth') && GETPOST('endday') && GETPOST('endyear')) { + $date_end = dol_mktime(GETPOST('endhour'), GETPOST('endmin'), 0, GETPOST('endmonth'), GETPOST('endday'), GETPOST('endyear')); + } + + $result = $object->active_line($user, GETPOST('ligne', 'int'), $date_start, $date_end, GETPOST('comment')); if ($result > 0) { header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id); @@ -152,12 +161,16 @@ if (empty($reshook)) { setEventMessages($object->error, $object->errors, 'errors'); } } elseif ($action == 'confirm_closeline' && $confirm == 'yes' && $user->rights->contrat->activer) { - if (!GETPOST('dateend')) { + $date_end = ''; + if (GETPOST('endmonth') && GETPOST('endday') && GETPOST('endyear')) { + $date_end = dol_mktime(GETPOST('endhour'), GETPOST('endmin'), 0, GETPOST('endmonth'), GETPOST('endday'), GETPOST('endyear')); + } + if (!$date_end) { $error++; setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("DateEnd")), null, 'errors'); } if (!$error) { - $result = $object->close_line($user, GETPOST('ligne', 'int'), GETPOST('dateend'), urldecode(GETPOST('comment'))); + $result = $object->close_line($user, GETPOST('ligne', 'int'), $date_end, urldecode(GETPOST('comment'))); if ($result > 0) { header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id); exit; @@ -1838,34 +1851,6 @@ if ($action == 'create') { print '
    '; } - /* - * Confirmation de la validation activation - */ - if ($action == 'active' && !$cancel && $user->rights->contrat->activer && $object->lines[$cursorline - 1]->id == GETPOST('ligne', 'int')) { - $dateactstart = dol_mktime(12, 0, 0, GETPOST('remonth'), GETPOST('reday'), GETPOST('reyear')); - $dateactend = dol_mktime(12, 0, 0, GETPOST('endmonth'), GETPOST('endday'), GETPOST('endyear')); - $comment = GETPOST('comment', 'alpha'); - print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id."&ligne=".GETPOST('ligne', 'int')."&date=".$dateactstart."&dateend=".$dateactend."&comment=".urlencode($comment), $langs->trans("ActivateService"), $langs->trans("ConfirmActivateService", dol_print_date($dateactstart, "%A %d %B %Y")), "confirm_active", '', 0, 1); - print '
    '; - } - - /* - * Confirmation de la validation fermeture - */ - if ($action == 'closeline' && !$cancel && $user->rights->contrat->activer && $object->lines[$cursorline - 1]->id == GETPOST('ligne', 'int')) { - $dateactstart = dol_mktime(12, 0, 0, GETPOST('remonth'), GETPOST('reday'), GETPOST('reyear')); - $dateactend = dol_mktime(12, 0, 0, GETPOST('endmonth'), GETPOST('endday'), GETPOST('endyear')); - $comment = GETPOST('comment', 'alpha'); - - if (empty($dateactend)) { - setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("DateEndReal")), null, 'errors'); - } else { - print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id."&ligne=".GETPOST('ligne', 'int')."&date=".$dateactstart."&dateend=".$dateactend."&comment=".urlencode($comment), $langs->trans("CloseService"), $langs->trans("ConfirmCloseService", dol_print_date($dateactend, "%A %d %B %Y")), "confirm_closeline", '', 0, 1); - } - print '
    '; - } - - // Area with status and activation info of line if ($object->statut > 0) { print ''; @@ -1931,8 +1916,12 @@ if ($action == 'create') { // Form to activate line if ($user->rights->contrat->activer && $action == 'activateline' && $object->lines[$cursorline - 1]->id == GETPOST('ligne', 'int')) { - print ''; + print ''; print ''; + print ''; + print ''; + print ''; + print ''; print '
    '; @@ -1957,7 +1946,7 @@ if ($action == 'create') { print ''; print ''; print '
    '.$langs->trans("DateServiceActivate").''; - print $form->selectDate($dateactstart, '', $usehm, $usehm, '', "active", 1, 0); + print $form->selectDate($dateactstart, 'start', $usehm, $usehm, '', "active", 1, 0); print ''.$langs->trans("DateEndPlanned").''; print $form->selectDate($dateactend, "end", $usehm, $usehm, '', "active", 1, 0); @@ -1985,10 +1974,10 @@ if ($action == 'create') { * Disable a contract line */ print ''."\n"; - print ''; - + print ''; print ''; - print ''; + print ''; + print ''; print ''; diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index bf945eeae96..0357459052b 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -321,15 +321,15 @@ class Contrat extends CommonObject * * @param User $user Objet User who activate contract * @param int $line_id Id of line to activate - * @param int $date Opening date + * @param int $date_start Opening date * @param int|string $date_end Expected end date * @param string $comment A comment typed by user * @return int <0 if KO, >0 if OK */ - public function active_line($user, $line_id, $date, $date_end = '', $comment = '') + public function active_line($user, $line_id, $date_start, $date_end = '', $comment = '') { // phpcs:enable - $result = $this->lines[$this->lines_id_index_mapper[$line_id]]->active_line($user, $date, $date_end, $comment); + $result = $this->lines[$this->lines_id_index_mapper[$line_id]]->active_line($user, $date_start, $date_end, $comment); if ($result < 0) { $this->error = $this->lines[$this->lines_id_index_mapper[$line_id]]->error; $this->errors = $this->lines[$this->lines_id_index_mapper[$line_id]]->errors; @@ -3588,7 +3588,7 @@ class ContratLigne extends CommonObjectLine * Activate a contract line * * @param User $user Objet User who activate contract - * @param int $date Date activation + * @param int $date Date real activation * @param int|string $date_end Date planned end. Use '-1' to keep it unchanged. * @param string $comment A comment typed by user * @return int <0 if KO, >0 if OK @@ -3603,13 +3603,13 @@ class ContratLigne extends CommonObjectLine $this->db->begin(); $this->statut = ContratLigne::STATUS_OPEN; - $this->date_start = $date; + $this->date_start_real = $date; $this->date_end = $date_end; $this->fk_user_ouverture = $user->id; $this->date_end_real = null; $this->commentaire = $comment; - $sql = "UPDATE ".MAIN_DB_PREFIX."contratdet SET statut = ".$this->statut.","; + $sql = "UPDATE ".MAIN_DB_PREFIX."contratdet SET statut = ".((int) $this->statut).","; $sql .= " date_ouverture = ".(dol_strlen($this->date_start_real) != 0 ? "'".$this->db->idate($this->date_start_real)."'" : "null").","; if ($date_end >= 0) { $sql .= " date_fin_validite = ".(dol_strlen($this->date_end) != 0 ? "'".$this->db->idate($this->date_end)."'" : "null").","; @@ -3648,7 +3648,7 @@ class ContratLigne extends CommonObjectLine * Close a contract line * * @param User $user Objet User who close contract - * @param int $date_end_real Date end + * @param int $date_end_real Date end * @param string $comment A comment typed by user * @param int $notrigger 1=Does not execute triggers, 0=Execute triggers * @return int <0 if KO, >0 if OK From 1d5e2bd0256a3c2ea3b204a3a0b8fd304d8c826c Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Wed, 25 Jan 2023 16:39:45 +0100 Subject: [PATCH 1030/1128] fix : Warning: Undefined array key xStartPos in /home/httpd/vhosts/aflac.fr/domains/dev.aflac.fr/httpdocs/core/class/commondocgenerator.class.php on line 1109 --- htdocs/core/class/commondocgenerator.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/commondocgenerator.class.php b/htdocs/core/class/commondocgenerator.class.php index 7c136f446d9..b4eddcc252f 100644 --- a/htdocs/core/class/commondocgenerator.class.php +++ b/htdocs/core/class/commondocgenerator.class.php @@ -1104,7 +1104,7 @@ abstract class CommonDocGenerator public function getColumnContentXStart($colKey) { $colDef = $this->cols[$colKey]; - return $colDef['xStartPos'] + $colDef['content']['padding'][3]; + return (isset($colDef['xStartPos']) ? $colDef['xStartPos'] : 0) + $colDef['content']['padding'][3]; } /** From 3d814ac3d3fb6982e6b5cc391d721827746b64f3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 25 Jan 2023 16:38:05 +0100 Subject: [PATCH 1031/1128] Debug set/edit date/end of contrat lines --- htdocs/contrat/card.php | 61 +++++++++++--------------- htdocs/contrat/class/contrat.class.php | 14 +++--- 2 files changed, 32 insertions(+), 43 deletions(-) diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index db501e113fb..6b3937df76a 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -143,7 +143,16 @@ if (empty($reshook)) { include DOL_DOCUMENT_ROOT.'/core/actions_lineupdown.inc.php'; // Must be include, not include_once if ($action == 'confirm_active' && $confirm == 'yes' && $user->rights->contrat->activer) { - $result = $object->active_line($user, GETPOST('ligne', 'int'), GETPOST('date'), GETPOST('dateend'), GETPOST('comment')); + $date_start = ''; + $date_end = ''; + if (GETPOST('startmonth') && GETPOST('startday') && GETPOST('startyear')) { + $date_start = dol_mktime(GETPOST('starthour'), GETPOST('startmin'), 0, GETPOST('startmonth'), GETPOST('startday'), GETPOST('startyear')); + } + if (GETPOST('endmonth') && GETPOST('endday') && GETPOST('endyear')) { + $date_end = dol_mktime(GETPOST('endhour'), GETPOST('endmin'), 0, GETPOST('endmonth'), GETPOST('endday'), GETPOST('endyear')); + } + + $result = $object->active_line($user, GETPOST('ligne', 'int'), $date_start, $date_end, GETPOST('comment')); if ($result > 0) { header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id); @@ -152,12 +161,16 @@ if (empty($reshook)) { setEventMessages($object->error, $object->errors, 'errors'); } } elseif ($action == 'confirm_closeline' && $confirm == 'yes' && $user->rights->contrat->activer) { - if (!GETPOST('dateend')) { + $date_end = ''; + if (GETPOST('endmonth') && GETPOST('endday') && GETPOST('endyear')) { + $date_end = dol_mktime(GETPOST('endhour'), GETPOST('endmin'), 0, GETPOST('endmonth'), GETPOST('endday'), GETPOST('endyear')); + } + if (!$date_end) { $error++; setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("DateEnd")), null, 'errors'); } if (!$error) { - $result = $object->close_line($user, GETPOST('ligne', 'int'), GETPOST('dateend'), urldecode(GETPOST('comment'))); + $result = $object->close_line($user, GETPOST('ligne', 'int'), $date_end, urldecode(GETPOST('comment'))); if ($result > 0) { header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id); exit; @@ -1837,34 +1850,6 @@ if ($action == 'create') { print '
    '; } - /* - * Confirmation de la validation activation - */ - if ($action == 'active' && !$cancel && $user->rights->contrat->activer && $object->lines[$cursorline - 1]->id == GETPOST('ligne', 'int')) { - $dateactstart = dol_mktime(12, 0, 0, GETPOST('remonth'), GETPOST('reday'), GETPOST('reyear')); - $dateactend = dol_mktime(12, 0, 0, GETPOST('endmonth'), GETPOST('endday'), GETPOST('endyear')); - $comment = GETPOST('comment', 'alpha'); - print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id."&ligne=".GETPOST('ligne', 'int')."&date=".$dateactstart."&dateend=".$dateactend."&comment=".urlencode($comment), $langs->trans("ActivateService"), $langs->trans("ConfirmActivateService", dol_print_date($dateactstart, "%A %d %B %Y")), "confirm_active", '', 0, 1); - print '
    '; - } - - /* - * Confirmation de la validation fermeture - */ - if ($action == 'closeline' && !$cancel && $user->rights->contrat->activer && $object->lines[$cursorline - 1]->id == GETPOST('ligne', 'int')) { - $dateactstart = dol_mktime(12, 0, 0, GETPOST('remonth'), GETPOST('reday'), GETPOST('reyear')); - $dateactend = dol_mktime(12, 0, 0, GETPOST('endmonth'), GETPOST('endday'), GETPOST('endyear')); - $comment = GETPOST('comment', 'alpha'); - - if (empty($dateactend)) { - setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("DateEndReal")), null, 'errors'); - } else { - print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id."&ligne=".GETPOST('ligne', 'int')."&date=".$dateactstart."&dateend=".$dateactend."&comment=".urlencode($comment), $langs->trans("CloseService"), $langs->trans("ConfirmCloseService", dol_print_date($dateactend, "%A %d %B %Y")), "confirm_closeline", '', 0, 1); - } - print '
    '; - } - - // Area with status and activation info of line if ($object->statut > 0) { print ''; @@ -1930,8 +1915,12 @@ if ($action == 'create') { // Form to activate line if ($user->rights->contrat->activer && $action == 'activateline' && $object->lines[$cursorline - 1]->id == GETPOST('ligne', 'int')) { - print ''; + print ''; print ''; + print ''; + print ''; + print ''; + print ''; print '
    '; @@ -1956,7 +1945,7 @@ if ($action == 'create') { print ''; print ''; print ''; + if (!$i) { + $totalarray['nbfield']++; + } } foreach ($object->fields as $key => $val) { $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); @@ -787,9 +790,9 @@ while ($i < $imaxinloop) { print ''; } print ''; - } - if (!$i) { - $totalarray['nbfield']++; + if (!$i) { + $totalarray['nbfield']++; + } } print ''."\n"; From 583891a8e53c8e031c195f89830a8e0426290f7e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 31 Jan 2023 01:13:57 +0100 Subject: [PATCH 1110/1128] Fix template for line total --- htdocs/modulebuilder/template/myobject_list.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/htdocs/modulebuilder/template/myobject_list.php b/htdocs/modulebuilder/template/myobject_list.php index 44e870b12de..a7609f02b25 100644 --- a/htdocs/modulebuilder/template/myobject_list.php +++ b/htdocs/modulebuilder/template/myobject_list.php @@ -709,6 +709,9 @@ while ($i < $imaxinloop) { print ''; } print ''; + if (!$i) { + $totalarray['nbfield']++; + } } foreach ($object->fields as $key => $val) { $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); @@ -780,9 +783,9 @@ while ($i < $imaxinloop) { print ''; } print ''; - } - if (!$i) { - $totalarray['nbfield']++; + if (!$i) { + $totalarray['nbfield']++; + } } print ''."\n"; From 89ce31b84000d2bc528f6720f983992bdc94b60e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 31 Jan 2023 04:14:39 +0100 Subject: [PATCH 1111/1128] Debug IMAP with PHP_IMAP --- .../emailcollector/class/emailcollector.class.php | 6 +++++- .../includes/webklex/php-imap/vendor/autoload.php | 13 +++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/htdocs/emailcollector/class/emailcollector.class.php b/htdocs/emailcollector/class/emailcollector.class.php index 6d8a8a048d3..2c23f6e0475 100644 --- a/htdocs/emailcollector/class/emailcollector.class.php +++ b/htdocs/emailcollector/class/emailcollector.class.php @@ -2803,7 +2803,11 @@ class EmailCollector extends CommonObject // TODO Move mail using PHP-IMAP } } else { - dol_syslog("EmailCollector::doCollectOneCollector message ".$imapemail." to ".$connectstringtarget." was set to read", LOG_DEBUG); + if (empty($conf->global->MAIN_IMAP_USE_PHPIMAP)) { + dol_syslog("EmailCollector::doCollectOneCollector message ".((string) $imapemail)." to ".$connectstringtarget." was set to read", LOG_DEBUG); + } else { + dol_syslog("EmailCollector::doCollectOneCollector message '".($imapemail->getHeader()->get('subject'))."' using this->host=".$this->host.", this->access_type=".$this->acces_type." was set to read", LOG_DEBUG); + } } } else { $errorforemail++; diff --git a/htdocs/includes/webklex/php-imap/vendor/autoload.php b/htdocs/includes/webklex/php-imap/vendor/autoload.php index f4e36963c6a..298bedf9b9c 100644 --- a/htdocs/includes/webklex/php-imap/vendor/autoload.php +++ b/htdocs/includes/webklex/php-imap/vendor/autoload.php @@ -13,10 +13,23 @@ require_once __DIR__ . '/composer/autoload_real.php'; return ComposerAutoloaderInit4da13270269c89a28e472e1f7324e6d1::getLoader(); */ + +// Add class/method of PHP8 for compatibility with older versions of PHP +require_once(__DIR__.'/symfony/polyfill-php80/bootstrap.php'); + + spl_autoload_register(function ($class_name) { // Enable this to detect what we need for require_once //var_dump($class_name); + + $preg_match = preg_match('/^Symfony\\\Polyfill\\\Php80\\\/', $class_name); + if (1 === $preg_match) { + $class_name = preg_replace('/\\\/', '/', $class_name); + $class_name = preg_replace('/^Symfony\\/Polyfill\\/Php80\\//', '', $class_name); + require_once __DIR__ . '/symfony/polyfill-php80/' . $class_name . '.php'; + } + $preg_match = preg_match('/^Webklex\\\PHPIMAP\\\/', $class_name); if (1 === $preg_match) { $class_name = preg_replace('/\\\/', '/', $class_name); From 6c02e890d8dd12fdc777bc91fdaf8bed489f8f3e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 31 Jan 2023 04:37:04 +0100 Subject: [PATCH 1112/1128] Fix CSS --- htdocs/holiday/list.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/holiday/list.php b/htdocs/holiday/list.php index dedfed07157..83255a671a6 100644 --- a/htdocs/holiday/list.php +++ b/htdocs/holiday/list.php @@ -597,7 +597,7 @@ if ($resql) { } print ''; } @@ -612,7 +612,7 @@ if ($resql) { foreach ($valideurobjects as $val) { $valideurarray[$val->id] = $val->id; } - print $form->select_dolusers($search_valideur, "search_valideur", 1, "", 0, $valideurarray, '', 0, 0, 0, $morefilter, 0, '', 'maxwidth150'); + print $form->select_dolusers($search_valideur, "search_valideur", 1, "", 0, $valideurarray, '', 0, 0, 0, $morefilter, 0, '', 'maxwidth125'); print ''; } else { print ''; @@ -632,7 +632,7 @@ if ($resql) { //$labeltoshow .= ($val['delay'] > 0 ? ' ('.$langs->trans("NoticePeriod").': '.$val['delay'].' '.$langs->trans("days").')':''); $arraytypeleaves[$val['rowid']] = $labeltoshow; } - print $form->selectarray('search_type', $arraytypeleaves, $search_type, 1, 0, 0, '', 0, 0, 0, '', '', 1); + print $form->selectarray('search_type', $arraytypeleaves, $search_type, 1, 0, 0, '', 0, 0, 0, '', 'maxwidth100', 1); } print ''; } From 5dbc1f5529abbf5e227a54b0be149659fa8a3e80 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 31 Jan 2023 04:48:18 +0100 Subject: [PATCH 1113/1128] FIX must load only the id --- htdocs/holiday/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/holiday/list.php b/htdocs/holiday/list.php index 6166ffb3b4e..340686668e6 100644 --- a/htdocs/holiday/list.php +++ b/htdocs/holiday/list.php @@ -617,7 +617,7 @@ if ($resql) { print ''; print "\n"; + $object->fetch($object->id, '', true); // true to force load of all users, member of the group + if (!empty($object->members)) { foreach ($object->members as $useringroup) { print ''; diff --git a/htdocs/user/group/list.php b/htdocs/user/group/list.php index b0327eebe08..5f017da01c9 100644 --- a/htdocs/user/group/list.php +++ b/htdocs/user/group/list.php @@ -380,8 +380,8 @@ while ($i < $imaxinloop) { $object->name = $obj->name; $object->note = $obj->note; - $object->members = $obj->nb; $object->nb_rights = $obj->nbpermissions; + $object->nb_users = $obj->nb; if ($mode == 'kanban') { if ($i == 0) { From 16ca0ab80123a4cd1076b6322f8b8f726c1c5daf Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 31 Jan 2023 05:02:26 +0100 Subject: [PATCH 1115/1128] Debug v17 --- .../adherents/class/adherent_type.class.php | 2 +- htdocs/comm/action/peruser.php | 20 ------------------- htdocs/holiday/list.php | 2 +- htdocs/holiday/view_log.php | 3 +-- 4 files changed, 3 insertions(+), 24 deletions(-) diff --git a/htdocs/adherents/class/adherent_type.class.php b/htdocs/adherents/class/adherent_type.class.php index 765e536fec9..30616cdc883 100644 --- a/htdocs/adherents/class/adherent_type.class.php +++ b/htdocs/adherents/class/adherent_type.class.php @@ -626,7 +626,7 @@ class AdherentType extends CommonObject $sql .= ' AND ('.$excludefilter.')'; } - dol_syslog(get_class($this)."::listUsersForGroup", LOG_DEBUG); + dol_syslog(get_class($this)."::listMembersForMemberType", LOG_DEBUG); $resql = $this->db->query($sql); if ($resql) { while ($obj = $this->db->fetch_object($resql)) { diff --git a/htdocs/comm/action/peruser.php b/htdocs/comm/action/peruser.php index 993bc3a908a..de4af0c26c7 100644 --- a/htdocs/comm/action/peruser.php +++ b/htdocs/comm/action/peruser.php @@ -946,26 +946,6 @@ while ($currentdaytoshow < $lastdaytoshow) { $usernames[] = $tmpuser; } - /* - if ($filtert > 0) - { - $tmpuser = new User($db); - $tmpuser->fetch($filtert); - $usernames[] = $tmpuser; - } - else if ($usergroup) - { - $tmpgroup = new UserGroup($db); - $tmpgroup->fetch($usergroup); - $usernames = $tmpgroup->listUsersForGroup(); - } - else - { - $tmpgroup = new UserGroup($db); - //$tmpgroup->fetch($usergroup); No fetch, we want all users for all groups - $usernames = $tmpgroup->listUsersForGroup(); - }*/ - // Load array of colors by type $colorsbytype = array(); $labelbytype = array(); diff --git a/htdocs/holiday/list.php b/htdocs/holiday/list.php index 83255a671a6..392fb7d3079 100644 --- a/htdocs/holiday/list.php +++ b/htdocs/holiday/list.php @@ -607,7 +607,7 @@ if ($resql) { print ''; } diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 767517b362c..3246ce3fb23 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -156,6 +156,7 @@ th.liste_titre a div div:hover, th.liste_titre_sel a div div:hover { text-decora tr.liste_titre th.liste_titre_sel:not(.maxwidthsearch), tr.liste_titre td.liste_titre_sel:not(.maxwidthsearch), tr.liste_titre th.liste_titre:not(.maxwidthsearch), tr.liste_titre td.liste_titre:not(.maxwidthsearch) { opacity: 0.8; } /* th.liste_titre_sel a, th.liste_titre a, td.liste_titre_sel a, td.liste_titre a { color: #766; } */ +tr.liste_titre_filter th.liste_titre { text-align: unset; } input { font-size: unset; diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 78b962aa87d..bac403fa48a 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -4392,6 +4392,7 @@ tr.liste_titre:last-child th.liste_titre, tr.liste_titre:last-child th.liste_tit /* border-bottom: 1px solid var(--colortopbordertitle1); */ border-bottom: none; } +tr.liste_titre_filter th.liste_titre { text-align: unset; } div.liste_titre { padding-left: 3px; From c046f100bfee41ec8d1c77a622b4efa0e6fa1060 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 31 Jan 2023 10:42:39 +0100 Subject: [PATCH 1117/1128] Fix css --- htdocs/main.inc.php | 4 ++-- htdocs/theme/md/style.css.php | 18 +++++++++++------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 2ed8b1a012f..b01db102bff 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1995,11 +1995,11 @@ function top_menu($head, $title = '', $target = '', $disablejs = 0, $disablehead $logouthtmltext .= $langs->trans("Logout").'
    '; $logouttext .= ''; - $logouttext .= img_picto($langs->trans('Logout'), 'sign-out', '', false, 0, 0, '', 'atoplogin'); + $logouttext .= img_picto($langs->trans('Logout'), 'sign-out', '', false, 0, 0, '', 'atoplogin valignmiddle'); $logouttext .= ''; } else { $logouthtmltext .= $langs->trans("NoLogoutProcessWithAuthMode", $_SESSION["dol_authmode"]); - $logouttext .= img_picto($langs->trans('Logout'), 'sign-out', '', false, 0, 0, '', 'atoplogin opacitymedium'); + $logouttext .= img_picto($langs->trans('Logout'), 'sign-out', '', false, 0, 0, '', 'atoplogin valignmiddle opacitymedium'); } } diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index bac403fa48a..d0ba44f3b23 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -3124,11 +3124,11 @@ div.login_block { } div.login_block a { - color: var(--colortextbackhmenu); + color: var(--colortexthmenu); display: inline-block; } div.login_block span.aversion { - color: var(--colortextbackhmenu); + color: var(--colortexthmenu); filter: contrast(0.7); } div.login_block table { @@ -3140,10 +3140,10 @@ div.login { float: right; } div.login a { - color: var(--colortextbackvmenu); + color: var(--colortextvmenu); } div.login a:hover { - color: var(--colortextbackvmenu); + color: var(--colortextvmenu); text-decoration:underline; } div.login_block_user, div.login_block_other { clear: both; } @@ -3165,10 +3165,14 @@ div.login_block_other { padding-top: 15px; } max-width: 200px; } +.login_block_other .login_block_elem { + height: 25px; + line-height: 25px; +} .login_block_elem { float: right; - vertical-align: top; - padding: 0px 0px 0px 2px !important; + vertical-align: middle; + padding: 0px 3px 0px 3px !important; height: 18px; } .login_block_elem_name { @@ -3183,7 +3187,7 @@ a.aversion { } .atoplogin, .atoplogin:hover { - color: var(--colortextbackhmenu) !important; + color: var(--colortexthmenu) !important; } .alogin, .alogin:hover { color: #888 !important; From 23a213d94817e515eb05e88a10c8a0acf7a318ca Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 31 Jan 2023 10:56:16 +0100 Subject: [PATCH 1118/1128] Fix warning --- htdocs/compta/ajaxpayment.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/htdocs/compta/ajaxpayment.php b/htdocs/compta/ajaxpayment.php index aeb8d164928..3e8669d0900 100644 --- a/htdocs/compta/ajaxpayment.php +++ b/htdocs/compta/ajaxpayment.php @@ -72,6 +72,10 @@ if (is_array($remains)) { unset($remains[$key]); } } +} elseif ($remains) { + $remains = array(price2num($remains)); +} else { + $remains = array(); } // Treatment From c1c21846ab0730826a3123d743a385f77365d921 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 31 Jan 2023 11:13:17 +0100 Subject: [PATCH 1119/1128] Fix look and feel v17 --- htdocs/holiday/month_report.php | 63 ++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/htdocs/holiday/month_report.php b/htdocs/holiday/month_report.php index a4ad8fe4224..9b611c18852 100644 --- a/htdocs/holiday/month_report.php +++ b/htdocs/holiday/month_report.php @@ -118,16 +118,16 @@ if (empty($reshook)) { } $arrayfields = array( - 'cp.ref'=>array('label' => 'Ref', 'checked'=>1), - 'cp.fk_user'=>array('label' => 'Employee', 'checked'=>1), - 'cp.fk_type'=>array('label' => 'Type', 'checked'=>1), - 'cp.date_debut'=>array('label' => 'DateDebCP', 'checked'=>1), - 'cp.date_fin'=>array('label' => 'DateFinCP', 'checked'=>1), - 'used_days'=>array('label' => 'NbUseDaysCPShort', 'checked'=>1), - 'date_start_month'=>array('label' => 'DateStartInMonth', 'checked'=>1), - 'date_end_month'=>array('label' => 'DateEndInMonth', 'checked'=>1), - 'used_days_month'=>array('label' => 'NbUseDaysCPShortInMonth', 'checked'=>1), - 'cp.description'=>array('label' => 'DescCP', 'checked'=>1), + 'cp.ref'=>array('label' => 'Ref', 'checked'=>1, 'position'=>5), + 'cp.fk_type'=>array('label' => 'Type', 'checked'=>1, 'position'=>10), + 'cp.fk_user'=>array('label' => 'Employee', 'checked'=>1, 'position'=>20), + 'cp.date_debut'=>array('label' => 'DateDebCP', 'checked'=>1, 'position'=>30), + 'cp.date_fin'=>array('label' => 'DateFinCP', 'checked'=>1, 'position'=>32), + 'used_days'=>array('label' => 'NbUseDaysCPShort', 'checked'=>1, 'position'=>34), + 'date_start_month'=>array('label' => 'DateStartInMonth', 'checked'=>1, 'position'=>50), + 'date_end_month'=>array('label' => 'DateEndInMonth', 'checked'=>1, 'position'=>52), + 'used_days_month'=>array('label' => 'NbUseDaysCPShortInMonth', 'checked'=>1, 'position'=>54), + 'cp.description'=>array('label' => 'DescCP', 'checked'=>-1, 'position'=>800), ); @@ -149,7 +149,7 @@ $search_month = GETPOST("remonth", 'int') ?GETPOST("remonth", 'int') : date("m", $search_year = GETPOST("reyear", 'int') ?GETPOST("reyear", 'int') : date("Y", time()); $year_month = sprintf("%04d", $search_year).'-'.sprintf("%02d", $search_month); -$sql = "SELECT cp.rowid, cp.ref, cp.fk_user, cp.date_debut, cp.date_fin, cp.fk_type, cp.description, cp.halfday"; +$sql = "SELECT cp.rowid, cp.ref, cp.fk_user, cp.date_debut, cp.date_fin, cp.fk_type, cp.description, cp.halfday, cp.statut as status"; $sql .= " FROM ".MAIN_DB_PREFIX."holiday cp"; $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user u ON cp.fk_user = u.rowid"; $sql .= " WHERE cp.rowid > 0"; @@ -250,13 +250,6 @@ if (!empty($arrayfields['cp.ref']['checked'])) { print ''; } -// Filter: Employee -if (!empty($arrayfields['cp.fk_user']['checked'])) { - print '
    '; -} - // Filter: Type if (!empty($arrayfields['cp.fk_type']['checked'])) { $typeleaves = $holidaystatic->getTypes(1, -1); @@ -271,6 +264,13 @@ if (!empty($arrayfields['cp.fk_type']['checked'])) { print ''; } +// Filter: Employee +if (!empty($arrayfields['cp.fk_user']['checked'])) { + print ''; +} + if (!empty($arrayfields['cp.date_debut']['checked'])) { print ''; } @@ -313,12 +313,12 @@ if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { if (!empty($arrayfields['cp.ref']['checked'])) { print_liste_field_titre($arrayfields['cp.ref']['label'], $_SERVER["PHP_SELF"], 'cp.ref', '', '', '', $sortfield, $sortorder); } -if (!empty($arrayfields['cp.fk_user']['checked'])) { - print_liste_field_titre($arrayfields['cp.fk_user']['label'], $_SERVER["PHP_SELF"], 'cp.fk_user', '', '', '', $sortfield, $sortorder); -} if (!empty($arrayfields['cp.fk_type']['checked'])) { print_liste_field_titre($arrayfields['cp.fk_type']['label'], $_SERVER["PHP_SELF"], 'cp.fk_type', '', '', '', $sortfield, $sortorder); } +if (!empty($arrayfields['cp.fk_user']['checked'])) { + print_liste_field_titre($arrayfields['cp.fk_user']['label'], $_SERVER["PHP_SELF"], 'cp.fk_user', '', '', '', $sortfield, $sortorder); +} if (!empty($arrayfields['ct.label']['checked'])) { print_liste_field_titre($arrayfields['ct.label']['label'], $_SERVER["PHP_SELF"], 'ct.label', '', '', '', $sortfield, $sortorder); } @@ -398,6 +398,15 @@ if ($num == 0) { // Leave request $holidaystatic->id = $obj->rowid; $holidaystatic->ref = $obj->ref; + $holidaystatic->statut = $obj->status; + $holidaystatic->status = $obj->status; + $holidaystatic->fk_user = $obj->fk_user; + $holidaystatic->fk_type = $obj->fk_type; + $holidaystatic->description = $obj->description; + $holidaystatic->halfday = $obj->halfday; + $holidaystatic->date_debut = $db->jdate($obj->date_debut); + $holidaystatic->date_fin = $db->jdate($obj->date_fin); + print ''; // Action column @@ -408,12 +417,12 @@ if ($num == 0) { if (!empty($arrayfields['cp.ref']['checked'])) { print ''; } - if (!empty($arrayfields['cp.fk_user']['checked'])) { - print ''; - } if (!empty($arrayfields['cp.fk_type']['checked'])) { print ''; } + if (!empty($arrayfields['cp.fk_user']['checked'])) { + print ''; + } if (!empty($arrayfields['cp.date_debut']['checked'])) { print ''; } if (!empty($arrayfields['cp.description']['checked'])) { - print ''; + print ''; } // Action column if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { From e2efeeef9a2c14a9a7d0ef62bda8633eb255b7a3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 31 Jan 2023 16:05:19 +0100 Subject: [PATCH 1120/1128] Fix menu accountancy not visible with module "comptabilite" --- htdocs/user/class/user.class.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 1f179758d57..7c4e9a76712 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -710,6 +710,7 @@ class User extends CommonObject global $conf; // For compatibility with bad naming permissions on module $moduletomoduletouse = array( + 'compta' => 'comptabilite', 'contract' => 'contrat', 'member' => 'adherent', 'mo' => 'mrp', @@ -738,7 +739,8 @@ class User extends CommonObject $moduleRightsMapping = array( 'product' => 'produit', // We must check $user->rights->produit... - 'margin' => 'margins' + 'margin' => 'margins', + 'comptabilite' => 'compta' ); $rightsPath = $module; @@ -760,8 +762,10 @@ class User extends CommonObject // In $conf->modules, we have 'accounting', 'product', 'facture', ... // In $user->rights, we have 'accounting', 'produit', 'facture', ... //var_dump($module); + //var_dump($rightsPath); //var_dump($this->rights->$rightsPath); //var_dump($conf->modules); + //var_dump($module.' '.isModEnabled($module).' '.$rightsPath.' '.$permlevel1.' '.$permlevel2); if (!isModEnabled($module)) { return 0; } @@ -778,6 +782,7 @@ class User extends CommonObject } //var_dump($this->rights); + //var_dump($rightsPath.' '.$permlevel1.' '.$permlevel2); if (empty($rightsPath) || empty($this->rights) || empty($this->rights->$rightsPath) || empty($permlevel1)) { return 0; } From 52267efb99dd50c3403485d9f36d2d71dc2ddff3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 31 Jan 2023 18:18:33 +0100 Subject: [PATCH 1121/1128] Fix filter must use the Dolibarr filter syntax --- htdocs/bom/class/bom.class.php | 2 +- htdocs/core/class/html.form.class.php | 8 +++++++- htdocs/modulebuilder/template/class/myobject.class.php | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/htdocs/bom/class/bom.class.php b/htdocs/bom/class/bom.class.php index e7798341f79..059f558fd17 100644 --- a/htdocs/bom/class/bom.class.php +++ b/htdocs/bom/class/bom.class.php @@ -102,7 +102,7 @@ class BOM extends CommonObject 'label' => array('type'=>'varchar(255)', 'label'=>'Label', 'enabled'=>1, 'visible'=>1, 'position'=>30, 'notnull'=>1, 'searchall'=>1, 'showoncombobox'=>'2', 'autofocusoncreate'=>1, 'css'=>'minwidth300 maxwidth400', 'csslist'=>'tdoverflowmax200'), 'bomtype' => array('type'=>'integer', 'label'=>'Type', 'enabled'=>1, 'visible'=>1, 'position'=>33, 'notnull'=>1, 'default'=>'0', 'arrayofkeyval'=>array(0=>'Manufacturing', 1=>'Disassemble'), 'css'=>'minwidth175', 'csslist'=>'minwidth175 center'), //'bomtype' => array('type'=>'integer', 'label'=>'Type', 'enabled'=>1, 'visible'=>-1, 'position'=>32, 'notnull'=>1, 'default'=>'0', 'arrayofkeyval'=>array(0=>'Manufacturing')), - 'fk_product' => array('type'=>'integer:Product:product/class/product.class.php:1:(finished IS NULL or finished <> 0)', 'label'=>'Product', 'picto'=>'product', 'enabled'=>1, 'visible'=>1, 'position'=>35, 'notnull'=>1, 'index'=>1, 'help'=>'ProductBOMHelp', 'css'=>'maxwidth500', 'csslist'=>'tdoverflowmax100'), + 'fk_product' => array('type'=>'integer:Product:product/class/product.class.php:1:((finished:is:null) or (finished:!=:0))', 'label'=>'Product', 'picto'=>'product', 'enabled'=>1, 'visible'=>1, 'position'=>35, 'notnull'=>1, 'index'=>1, 'help'=>'ProductBOMHelp', 'css'=>'maxwidth500', 'csslist'=>'tdoverflowmax100'), 'description' => array('type'=>'text', 'label'=>'Description', 'enabled'=>1, 'visible'=>-1, 'position'=>60, 'notnull'=>-1,), 'qty' => array('type'=>'real', 'label'=>'Quantity', 'enabled'=>1, 'visible'=>1, 'default'=>1, 'position'=>55, 'notnull'=>1, 'isameasure'=>'1', 'css'=>'maxwidth75imp'), //'efficiency' => array('type'=>'real', 'label'=>'ManufacturingEfficiency', 'enabled'=>1, 'visible'=>-1, 'default'=>1, 'position'=>100, 'notnull'=>0, 'css'=>'maxwidth50imp', 'help'=>'ValueOfMeansLossForProductProduced'), diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 52f91f86963..6f0023548b9 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -7764,7 +7764,7 @@ class Form } /** - * Function to forge a SQL criteria + * Function to forge a SQL criteria from a Dolibarr filter syntax string. * * @param array $matches Array of found string by regex search. Example: "t.ref:like:'SO-%'" or "t.date_creation:<:'20160101'" or "t.nature:is:NULL" * @return string Forged criteria. Example: "t.field like 'abc%'" @@ -7784,11 +7784,17 @@ class Form $tmpescaped = $tmp[2]; $regbis = array(); + if (preg_match('/^\'(.*)\'$/', $tmpescaped, $regbis)) { $tmpescaped = "'".$db->escape($regbis[1])."'"; } else { $tmpescaped = $db->escape($tmpescaped); } + + if ($tmp[1] == '!=') { + $tmp[1] = '<>'; + } + return $db->escape($tmp[0]).' '.strtoupper($db->escape($tmp[1]))." ".$tmpescaped; } diff --git a/htdocs/modulebuilder/template/class/myobject.class.php b/htdocs/modulebuilder/template/class/myobject.class.php index afd7b4860fb..14b8fc6c09c 100644 --- a/htdocs/modulebuilder/template/class/myobject.class.php +++ b/htdocs/modulebuilder/template/class/myobject.class.php @@ -81,7 +81,7 @@ class MyObject extends CommonObject * 'date', 'datetime', 'timestamp', 'duration', * 'boolean', 'checkbox', 'radio', 'array', * 'mail', 'phone', 'url', 'password', 'ip' - * Note: Filter can be a string like "(t.ref:like:'SO-%') or (t.date_creation:<:'20160101') or (t.nature:is:NULL)" + * Note: Filter must be a Dolibarr filter syntax string. Example: "(t.ref:like:'SO-%') or (t.date_creation:<:'20160101') or (t.status:!=:0) or (t.nature:is:NULL)" * 'label' the translation key. * 'picto' is code of a picto to show before value in forms * 'enabled' is a condition when the field must be managed (Example: 1 or '$conf->global->MY_SETUP_PARAM' or 'isModEnabled("multicurrency")' ...) From 99f26b49b7c23951d165a96495adab41d933604e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 31 Jan 2023 19:46:02 +0100 Subject: [PATCH 1122/1128] Trans --- htdocs/bom/bom_card.php | 696 ++++++++++++++++--------------- htdocs/bom/bom_net_needs.php | 4 +- htdocs/bom/class/bom.class.php | 2 +- htdocs/langs/en_US/main.lang | 3 +- htdocs/theme/eldy/global.inc.php | 8 +- htdocs/theme/md/style.css.php | 4 +- 6 files changed, 360 insertions(+), 357 deletions(-) diff --git a/htdocs/bom/bom_card.php b/htdocs/bom/bom_card.php index b25785ae368..dcb5d02b260 100644 --- a/htdocs/bom/bom_card.php +++ b/htdocs/bom/bom_card.php @@ -275,303 +275,303 @@ if (empty($reshook)) { $object->calculateCosts(); } } +} +/* + * View + */ - /* - * View - */ - - $form = new Form($db); - $formfile = new FormFile($db); +$form = new Form($db); +$formfile = new FormFile($db); - $title = $langs->trans('BOM'); - $help_url ='EN:Module_BOM'; - llxHeader('', $title, $help_url); +$title = $langs->trans('BOM'); +$help_url ='EN:Module_BOM'; +llxHeader('', $title, $help_url); - // Part to create - if ($action == 'create') { - print load_fiche_titre($langs->trans("NewBOM"), '', 'bom'); +// Part to create +if ($action == 'create') { + print load_fiche_titre($langs->trans("NewBOM"), '', 'bom'); - print ''; - print ''; - print ''; - print ''; + print ''; + print ''; + print ''; + print ''; - print dol_get_fiche_head(array(), ''); + print dol_get_fiche_head(array(), ''); - print '
    '.$langs->trans("DateServiceActivate").''; - print $form->selectDate($dateactstart, '', $usehm, $usehm, '', "active", 1, 0); + print $form->selectDate($dateactstart, 'start', $usehm, $usehm, '', "active", 1, 0); print ''.$langs->trans("DateEndPlanned").''; print $form->selectDate($dateactend, "end", $usehm, $usehm, '', "active", 1, 0); @@ -1984,10 +1973,10 @@ if ($action == 'create') { * Disable a contract line */ print ''."\n"; - print ''; - + print ''; print ''; - print ''; + print ''; + print ''; print ''; diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index 486a647fb68..1e8f0e1f7e5 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -320,15 +320,15 @@ class Contrat extends CommonObject * * @param User $user Objet User who activate contract * @param int $line_id Id of line to activate - * @param int $date Opening date + * @param int $date_start Opening date * @param int|string $date_end Expected end date * @param string $comment A comment typed by user * @return int <0 if KO, >0 if OK */ - public function active_line($user, $line_id, $date, $date_end = '', $comment = '') + public function active_line($user, $line_id, $date_start, $date_end = '', $comment = '') { // phpcs:enable - $result = $this->lines[$this->lines_id_index_mapper[$line_id]]->active_line($user, $date, $date_end, $comment); + $result = $this->lines[$this->lines_id_index_mapper[$line_id]]->active_line($user, $date_start, $date_end, $comment); if ($result < 0) { $this->error = $this->lines[$this->lines_id_index_mapper[$line_id]]->error; $this->errors = $this->lines[$this->lines_id_index_mapper[$line_id]]->errors; @@ -3554,7 +3554,7 @@ class ContratLigne extends CommonObjectLine * Activate a contract line * * @param User $user Objet User who activate contract - * @param int $date Date activation + * @param int $date Date real activation * @param int|string $date_end Date planned end. Use '-1' to keep it unchanged. * @param string $comment A comment typed by user * @return int <0 if KO, >0 if OK @@ -3569,13 +3569,13 @@ class ContratLigne extends CommonObjectLine $this->db->begin(); $this->statut = ContratLigne::STATUS_OPEN; - $this->date_start = $date; + $this->date_start_real = $date; $this->date_end = $date_end; $this->fk_user_ouverture = $user->id; $this->date_end_real = null; $this->commentaire = $comment; - $sql = "UPDATE ".MAIN_DB_PREFIX."contratdet SET statut = ".$this->statut.","; + $sql = "UPDATE ".MAIN_DB_PREFIX."contratdet SET statut = ".((int) $this->statut).","; $sql .= " date_ouverture = ".(dol_strlen($this->date_start_real) != 0 ? "'".$this->db->idate($this->date_start_real)."'" : "null").","; if ($date_end >= 0) { $sql .= " date_fin_validite = ".(dol_strlen($this->date_end) != 0 ? "'".$this->db->idate($this->date_end)."'" : "null").","; @@ -3614,7 +3614,7 @@ class ContratLigne extends CommonObjectLine * Close a contract line * * @param User $user Objet User who close contract - * @param int $date_end_real Date end + * @param int $date_end_real Date end * @param string $comment A comment typed by user * @param int $notrigger 1=Does not execute triggers, 0=Execute triggers * @return int <0 if KO, >0 if OK From d8ce744e4c4dc70c897775203f56f1c28c1ce588 Mon Sep 17 00:00:00 2001 From: hystepik Date: Wed, 25 Jan 2023 16:56:27 +0100 Subject: [PATCH 1032/1128] New : Export for module ticket --- htdocs/core/modules/modTicket.class.php | 28 +++++++++++++++++++++++++ htdocs/langs/en_US/ticket.lang | 3 +++ 2 files changed, 31 insertions(+) diff --git a/htdocs/core/modules/modTicket.class.php b/htdocs/core/modules/modTicket.class.php index 37e6552af2f..ff80385235f 100644 --- a/htdocs/core/modules/modTicket.class.php +++ b/htdocs/core/modules/modTicket.class.php @@ -208,6 +208,13 @@ class modTicket extends DolibarrModules $this->rights[$r][3] = 0; // La permission est-elle une permission par defaut $this->rights[$r][4] = 'manage'; + $r++; + $this->rights[$r][0] = 56006; // id de la permission + $this->rights[$r][1] = "Export ticket"; // libelle de la permission + //$this->rights[$r][2] = 'd'; // type de la permission (deprecie a ce jour) + $this->rights[$r][3] = 0; // La permission est-elle une permission par defaut + $this->rights[$r][4] = 'export'; + /* Seems not used and in conflict with societe->client->voir (see all thirdparties) $r++; $this->rights[$r][0] = 56005; // id de la permission @@ -318,6 +325,27 @@ class modTicket extends DolibarrModules 'target' => '', 'user' => 0); $r++; + + // Exports + //-------- + $r = 1; + + // Export list of tickets and attributes + $langs->load("ticket"); + $this->export_code[$r]=$this->rights_class.'_'.$r; + $this->export_label[$r]='ExportDataset_ticket_1'; // Translation key (used only if key ExportDataset_xxx_z not found) + $this->export_permission[$r] = array(array("ticket", "export")); + $this->export_icon[$r]='ticket'; + $keyforclass = 'Ticket';$keyforclassfile='/ticket/class/ticket.class.php';$keyforelement='ticket'; + include DOL_DOCUMENT_ROOT.'/core/commonfieldsinexport.inc.php'; + $keyforselect='ticket'; $keyforaliasextra='extra'; $keyforelement='ticket'; + include DOL_DOCUMENT_ROOT.'/core/extrafieldsinexport.inc.php'; + $this->export_sql_start[$r]='SELECT DISTINCT '; + $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'ticket as t'; + $this->export_sql_end[$r] .= ' LEFT JOIN '.MAIN_DB_PREFIX.'ticket_extrafields as extra on (t.rowid = extra.fk_object)'; + $this->export_sql_end[$r] .=' WHERE 1 = 1'; + $this->export_sql_end[$r] .=' AND t.entity IN ('.getEntity('ticket').')'; + $r++; } /** diff --git a/htdocs/langs/en_US/ticket.lang b/htdocs/langs/en_US/ticket.lang index ea560012afc..de54d475591 100644 --- a/htdocs/langs/en_US/ticket.lang +++ b/htdocs/langs/en_US/ticket.lang @@ -26,6 +26,7 @@ Permission56002=Modify tickets Permission56003=Delete tickets Permission56004=Manage tickets Permission56005=See tickets of all third parties (not effective for external users, always be limited to the third party they depend on) +Permission56006=Export tickets Tickets=Tickets TicketDictType=Ticket - Types @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=External contributor OriginEmail=Reporter Email Notify_TICKET_SENTBYMAIL=Send ticket message by email +ExportDataset_ticket_1=Tickets + # Status Read=Read Assigned=Assigned From 934bcc72c489799d451f0c49642728460bed1880 Mon Sep 17 00:00:00 2001 From: GregM Date: Wed, 25 Jan 2023 17:34:57 +0100 Subject: [PATCH 1033/1128] update space --- htdocs/core/class/html.formsetup.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/html.formsetup.class.php b/htdocs/core/class/html.formsetup.class.php index 0c9adf0be59..a7fb11e624f 100644 --- a/htdocs/core/class/html.formsetup.class.php +++ b/htdocs/core/class/html.formsetup.class.php @@ -1069,7 +1069,7 @@ class FormSetupItem } elseif ($this->type == 'yesno') { $out.= ajax_constantonoff($this->confKey); } elseif (preg_match('/emailtemplate:/', $this->type)) { - if ($this->fieldValue > 0){ + if ($this->fieldValue > 0) { include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php'; $formmail = new FormMail($this->db); From faa44379e81aef112835b254644ea5b49ffb28eb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 25 Jan 2023 17:38:04 +0100 Subject: [PATCH 1034/1128] Debug view of thumbs for svg --- htdocs/core/class/commonobject.class.php | 5 ++++- htdocs/core/lib/functions.lib.php | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 88fefed035f..b67f518d2af 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -8652,7 +8652,10 @@ abstract class CommonObject // Find name of thumb file $photo_vignette = basename(getImageFileNameForSize($dir.$file, '_small')); if (!dol_is_file($dirthumb.$photo_vignette)) { - $photo_vignette = ''; + // The thumb does not exists, so we will use the original file + $dirthumb = $dir; + $pdirthumb = $pdir; + $photo_vignette = basename($file); } // Get filesize of original file diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 1076d32602f..fe47ecc64d7 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -9943,7 +9943,7 @@ function showDirectDownloadLink($object) * @param string $file Original filename (full or relative path) * @param string $extName Extension to differenciate thumb file name ('', '_small', '_mini') * @param string $extImgTarget Force image extension for thumbs. Use '' to keep same extension than original image (default). - * @return string New file name (full or relative path, including the thumbs/) + * @return string New file name (full or relative path, including the thumbs/). May be the original path if no thumb can exists. */ function getImageFileNameForSize($file, $extName, $extImgTarget = '') { From dbfa172e195be8d007792aaefbfa50cbddc04f65 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 25 Jan 2023 17:38:04 +0100 Subject: [PATCH 1035/1128] Debug view of thumbs for svg --- htdocs/core/class/commonobject.class.php | 5 ++++- htdocs/core/lib/functions.lib.php | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 471d835f4a3..2c9bb0c14c0 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -8650,7 +8650,10 @@ abstract class CommonObject // Find name of thumb file $photo_vignette = basename(getImageFileNameForSize($dir.$file, '_small')); if (!dol_is_file($dirthumb.$photo_vignette)) { - $photo_vignette = ''; + // The thumb does not exists, so we will use the original file + $dirthumb = $dir; + $pdirthumb = $pdir; + $photo_vignette = basename($file); } // Get filesize of original file diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 4d38c7e5e5d..81f830d6456 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -9903,7 +9903,7 @@ function showDirectDownloadLink($object) * @param string $file Original filename (full or relative path) * @param string $extName Extension to differenciate thumb file name ('', '_small', '_mini') * @param string $extImgTarget Force image extension for thumbs. Use '' to keep same extension than original image (default). - * @return string New file name (full or relative path, including the thumbs/) + * @return string New file name (full or relative path, including the thumbs/). May be the original path if no thumb can exists. */ function getImageFileNameForSize($file, $extName, $extImgTarget = '') { From 35f16e821da3843fa93cefe5a284f9676b6501e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Wed, 25 Jan 2023 21:56:49 +0100 Subject: [PATCH 1036/1128] fix php8.2 warnings --- htdocs/debugbar/class/DataCollector/DolLogsCollector.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/htdocs/debugbar/class/DataCollector/DolLogsCollector.php b/htdocs/debugbar/class/DataCollector/DolLogsCollector.php index 44885296bae..3d3b3b25a0e 100644 --- a/htdocs/debugbar/class/DataCollector/DolLogsCollector.php +++ b/htdocs/debugbar/class/DataCollector/DolLogsCollector.php @@ -41,6 +41,11 @@ class DolLogsCollector extends MessagesCollector */ protected $maxnboflines; + /** + * @var int number of lines + */ + protected $nboflines; + /** * Constructor * @@ -54,7 +59,7 @@ class DolLogsCollector extends MessagesCollector parent::__construct($name); $this->nboflines = 0; - $this->maxnboflines = empty($conf->global->DEBUGBAR_LOGS_LINES_NUMBER) ? 250 : $conf->global->DEBUGBAR_LOGS_LINES_NUMBER; // High number slows seriously output + $this->maxnboflines = getDolGlobalInt('DEBUGBAR_LOGS_LINES_NUMBER', 250); // High number slows seriously output $this->path = $path ?: $this->getLogsFile(); } From 1a4cb5b4e2057f2b66254fdcaf9100abb438fe1f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 26 Jan 2023 02:06:40 +0100 Subject: [PATCH 1037/1128] FIX #22964 #23012 --- htdocs/core/class/commonobject.class.php | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 63858fa28e2..ed74194d492 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -1207,7 +1207,7 @@ abstract class CommonObject // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps /** - * Delete all links between an object $this and all its contacts + * Delete all links between an object $this and all its contacts in llx_element_contact * * @param string $source '' or 'internal' or 'external' * @param string $code Type of contact (code or id) @@ -1224,12 +1224,16 @@ abstract class CommonObject } $listId = implode(",", $temp); - $sql = "DELETE FROM ".MAIN_DB_PREFIX."element_contact"; - $sql .= " WHERE element_id = ".((int) $this->id); - if ($listId) { - $sql .= " AND fk_c_type_contact IN (".$this->db->sanitize($listId).")"; + // If $listId is empty, we have not criteria on fk_c_type_contact so we will delete record on element_id for + // any type or record instead of only the ones of the current object. So we do nothing in such a case. + if (empty($listId)) { + return 0; } + $sql = "DELETE FROM ".$this->db->prefix()."element_contact"; + $sql .= " WHERE element_id = ".((int) $this->id); + $sql .= " AND fk_c_type_contact IN (".$this->db->sanitize($listId).")"; + dol_syslog(get_class($this)."::delete_linked_contact", LOG_DEBUG); if ($this->db->query($sql)) { return 1; From 59f163f6998d5929607528513e305e5538539332 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 26 Jan 2023 02:12:42 +0100 Subject: [PATCH 1038/1128] Fix regression --- htdocs/expensereport/card.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/htdocs/expensereport/card.php b/htdocs/expensereport/card.php index 0756cb1bc7f..0201dfdd7f6 100644 --- a/htdocs/expensereport/card.php +++ b/htdocs/expensereport/card.php @@ -1158,12 +1158,17 @@ if (empty($reshook)) { unset($date); } else { + $error++; setEventMessages($object->error, $object->errors, 'errors'); } } - header("Location: ".$_SERVER["PHP_SELF"]."?id=".GETPOST('id', 'int')); - exit; + if (!$error) { + header("Location: ".$_SERVER["PHP_SELF"]."?id=".GETPOST('id', 'int')); + exit; + } else { + $action = ''; + } } if ($action == 'confirm_delete_line' && GETPOST("confirm", 'alpha') == "yes" && $user->rights->expensereport->creer) { From 6aadb7b9ccf4150c5b1dbf45ff974cf3eb5cbea3 Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Thu, 26 Jan 2023 10:36:44 +0100 Subject: [PATCH 1039/1128] =?UTF-8?q?FIX=20-=20Error=20to=20g=C3=A9n=C3=A9?= =?UTF-8?q?rate=20product=20doc=20-=20NEW=20-=20Add=20photo=20on=20product?= =?UTF-8?q?=20doc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../product/doc/pdf_standard.modules.php | 73 ++++++++++++++----- 1 file changed, 56 insertions(+), 17 deletions(-) diff --git a/htdocs/core/modules/product/doc/pdf_standard.modules.php b/htdocs/core/modules/product/doc/pdf_standard.modules.php index 8baef2ffa75..9247e8c7e34 100644 --- a/htdocs/core/modules/product/doc/pdf_standard.modules.php +++ b/htdocs/core/modules/product/doc/pdf_standard.modules.php @@ -209,10 +209,10 @@ class pdf_standard extends ModelePDFProduct $pdf->SetDrawColor(128, 128, 128); $pdf->SetTitle($outputlangs->convToOutputCharset($object->ref)); - $pdf->SetSubject($outputlangs->transnoentities("Order")); + $pdf->SetSubject($outputlangs->transnoentities("Product")); $pdf->SetCreator("Dolibarr ".DOL_VERSION); $pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs))); - $pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("Order")." ".$outputlangs->convToOutputCharset($object->thirdparty->name)); + $pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("Product")); if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) { $pdf->SetCompression(false); } @@ -242,6 +242,53 @@ class pdf_standard extends ModelePDFProduct $pdf->writeHTMLCell(190, 3, $this->marge_gauche, $tab_top, dol_htmlentitiesbr($object->label), 0, 1); $nexY = $pdf->GetY(); + // Show photo + if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO')) { + $pdir[0] = get_exdir($object->id, 2, 0, 0, $object, 'product').$object->id."/photos/"; + $pdir[1] = get_exdir(0, 0, 0, 0, $object, 'product').dol_sanitizeFileName($object->ref).'/'; + } else { + $pdir[0] = get_exdir(0, 0, 0, 0, $object, 'product'); // default + $pdir[1] = get_exdir($object->id, 2, 0, 0, $object, 'product').$object->id."/photos/"; // alternative + } + + $arephoto = false; + foreach ($pdir as $midir) { + if (!$arephoto) { + if ($conf->entity != $object->entity) { + $dir = $conf->product->multidir_output[$object->entity].'/'.$midir; //Check repertories of current entities + } else { + $dir = $conf->product->dir_output.'/'.$midir; //Check repertory of the current product + } + foreach ($object->liste_photos($dir, 1) as $key => $obj) { + if (!getDolGlobalInt('CAT_HIGH_QUALITY_IMAGES')) { // If CAT_HIGH_QUALITY_IMAGES not defined, we use thumb if defined and then original photo + if ($obj['photo_vignette']) { + $filename = $obj['photo_vignette']; + } else { + $filename = $obj['photo']; + } + } else { + $filename = $obj['photo']; + } + $realpath = $dir.$filename; + $arephoto = true; + } + } + } + // Define size of image if we need it + $imglinesize = array(); + if (!empty($realpath) && $arephoto) { + $imgsize = pdf_getSizeForImage($realpath); + $imgsizewidth = $imgsize['width'] + 20; + $imgsizeheight = $imgsize['height'] + 20; + + $midelpage = ($this->page_largeur - $this->marge_gauche - $this->marge_droite) / 2; + $posxphoto = $midelpage + ($midelpage / 2) - ($imgsizewidth / 2); + $posyphoto = $tab_top - 1; + $pdf->Image($realpath, $posxphoto, $posyphoto, $imgsizewidth, $imgsizeheight, '', '', '', 2, 300); // Use 300 dpi + $nexyafterphoto = $tab_top + $imgsizeheight; + } + + // Description $pdf->SetFont('', '', $default_font_size); $pdf->writeHTMLCell(190, 3, $this->marge_gauche, $nexY, dol_htmlentitiesbr($object->description), 0, 1); $nexY = $pdf->GetY(); @@ -276,30 +323,22 @@ class pdf_standard extends ModelePDFProduct $nexY = $pdf->GetY(); } + $tab_top = 88; + if (!empty($nexyafterphoto) && $nexyafterphoto > $tab_top) { + $tab_top = $nexyafterphoto; + } + // Show notes // TODO There is no public note on product yet $notetoshow = empty($object->note_public) ? '' : $object->note_public; - if (!empty($conf->global->MAIN_ADD_SALE_REP_SIGNATURE_IN_NOTE)) { - // Get first sale rep - if (is_object($object->thirdparty)) { - $salereparray = $object->thirdparty->getSalesRepresentatives($user); - $salerepobj = new User($this->db); - $salerepobj->fetch($salereparray[0]['id']); - if (!empty($salerepobj->signature)) { - $notetoshow = dol_concatdesc($notetoshow, $salerepobj->signature); - } - } - } if ($notetoshow) { $substitutionarray = pdf_getSubstitutionArray($outputlangs, null, $object); complete_substitutions_array($substitutionarray, $outputlangs, $object); $notetoshow = make_substitutions($notetoshow, $substitutionarray, $outputlangs); $notetoshow = convertBackOfficeMediasLinksToPublicLinks($notetoshow); - $tab_top = 88; - $pdf->SetFont('', '', $default_font_size - 1); - $pdf->writeHTMLCell(190, 3, $this->posxdesc - 1, $tab_top, dol_htmlentitiesbr($notetoshow), 0, 1); + $pdf->writeHTMLCell(190, 3, $this->marge_gauche - 1, $tab_top, dol_htmlentitiesbr($notetoshow), 0, 1); $nexY = $pdf->GetY(); $height_note = $nexY - $tab_top; @@ -687,7 +726,7 @@ class pdf_standard extends ModelePDFProduct pdf_pagehead($pdf, $outputlangs, $this->page_hauteur); // Show Draft Watermark - if ($object->statut == 0 && getDolGlobalString('COMMANDE_DRAFT_WATERMARK')) { + if ($object->statut == 0 && getDolGlobalString('PRODUCT_DRAFT_WATERMARK')) { pdf_watermark($pdf, $outputlangs, $this->page_hauteur, $this->page_largeur, 'mm', getDolGlobalString('COMMANDE_DRAFT_WATERMARK')); } From 2a26ca7212c177091e3e68ed91f46acde90a52cc Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Thu, 26 Jan 2023 10:40:41 +0100 Subject: [PATCH 1040/1128] Cop --- htdocs/core/modules/product/doc/pdf_standard.modules.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/core/modules/product/doc/pdf_standard.modules.php b/htdocs/core/modules/product/doc/pdf_standard.modules.php index 9247e8c7e34..44d75b99726 100644 --- a/htdocs/core/modules/product/doc/pdf_standard.modules.php +++ b/htdocs/core/modules/product/doc/pdf_standard.modules.php @@ -1,5 +1,6 @@ +/* Copyright (C) 2017 Laurent Destailleur + * Copyright (C) 2017 Anthony Berton * * 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 From 890f9120d71e59af514a02fcb5f8a10cf7e5a49d Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Thu, 26 Jan 2023 10:48:27 +0100 Subject: [PATCH 1041/1128] Cop --- htdocs/core/modules/product/doc/pdf_standard.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/product/doc/pdf_standard.modules.php b/htdocs/core/modules/product/doc/pdf_standard.modules.php index 44d75b99726..7427fc7170e 100644 --- a/htdocs/core/modules/product/doc/pdf_standard.modules.php +++ b/htdocs/core/modules/product/doc/pdf_standard.modules.php @@ -1,6 +1,6 @@ - * Copyright (C) 2017 Anthony Berton + * Copyright (C) 2023 Anthony Berton * * 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 From 35b05cfc7b45ad79cad9c3ebccb0135c65d7158d Mon Sep 17 00:00:00 2001 From: mgabriel Date: Thu, 26 Jan 2023 11:00:00 +0100 Subject: [PATCH 1042/1128] Implements MAIN_SECURITY_ALLOW_UNSECURED_REF_LABELS for product refs and labels. --- htdocs/product/card.php | 12 ++++++++++-- htdocs/product/class/product.class.php | 18 +++++++++++++++--- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/htdocs/product/card.php b/htdocs/product/card.php index ac465b16bd7..ba1bc47046f 100644 --- a/htdocs/product/card.php +++ b/htdocs/product/card.php @@ -93,7 +93,11 @@ $refalreadyexists = 0; // Get parameters $id = GETPOST('id', 'int'); -$ref = (GETPOSTISSET('ref') ? GETPOST('ref', 'alpha') : null); +if (!empty($conf->global->MAIN_SECURITY_ALLOW_UNSECURED_REF_LABELS)) { + $ref = (GETPOSTISSET('ref') ? GETPOST('ref', 'nohtml') : null); +} else { + $ref = (GETPOSTISSET('ref') ? GETPOST('ref', 'alpha') : null); +} $type = (GETPOSTISSET('type') ? GETPOST('type', 'int') : Product::TYPE_PRODUCT); $action = (GETPOST('action', 'alpha') ? GETPOST('action', 'alpha') : 'view'); $cancel = GETPOST('cancel', 'alpha'); @@ -113,7 +117,11 @@ $accountancy_code_buy_export = GETPOST('accountancy_code_buy_export', 'alpha'); $checkmandatory = GETPOST('accountancy_code_buy_export', 'alpha'); // by default 'alphanohtml' (better security); hidden conf MAIN_SECURITY_ALLOW_UNSECURED_LABELS_WITH_HTML allows basic html -$label_security_check = empty($conf->global->MAIN_SECURITY_ALLOW_UNSECURED_LABELS_WITH_HTML) ? 'alphanohtml' : 'restricthtml'; +if (!empty($conf->global->MAIN_SECURITY_ALLOW_UNSECURED_REF_LABELS)) { + $label_security_check = 'nohtml'; +} else { + $label_security_check = empty($conf->global->MAIN_SECURITY_ALLOW_UNSECURED_LABELS_WITH_HTML) ? 'alphanohtml' : 'restricthtml'; +} if (!empty($user->socid)) { $socid = $user->socid; diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index d464871941a..1a2b3fa4cf2 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -572,7 +572,11 @@ class Product extends CommonObject */ public function check() { - $this->ref = dol_sanitizeFileName(stripslashes($this->ref)); + if (!empty($conf->global->MAIN_SECURITY_ALLOW_UNSECURED_REF_LABELS)) { + $this->ref = trim($this->ref); + } else { + $this->ref = dol_sanitizeFileName(stripslashes($this->ref)); + } $err = 0; if (dol_strlen(trim($this->ref)) == 0) { @@ -604,7 +608,11 @@ class Product extends CommonObject $error = 0; // Clean parameters - $this->ref = dol_sanitizeFileName(dol_string_nospecial(trim($this->ref))); + if (!empty($conf->global->MAIN_SECURITY_ALLOW_UNSECURED_REF_LABELS)) { + $this->ref = trim($this->ref); + } else { + $this->ref = dol_sanitizeFileName(dol_string_nospecial(trim($this->ref))); + } $this->label = trim($this->label); $this->price_ttc = price2num($this->price_ttc); $this->price = price2num($this->price); @@ -999,7 +1007,11 @@ class Product extends CommonObject } // Clean parameters - $this->ref = dol_string_nospecial(trim($this->ref)); + if (!empty($conf->global->MAIN_SECURITY_ALLOW_UNSECURED_REF_LABELS)) { + $this->ref = trim($this->ref); + } else { + $this->ref = dol_string_nospecial(trim($this->ref)); + } $this->label = trim($this->label); $this->description = trim($this->description); $this->note_private = (isset($this->note_private) ? trim($this->note_private) : null); From d4f7b3e42f0aa3e2c0e8e69812f25aade4c0a79f Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Thu, 26 Jan 2023 11:01:44 +0100 Subject: [PATCH 1043/1128] FIX - Logo MYCOMPANY --- .../product/doc/pdf_standard.modules.php | 40 +++++++++++++------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/htdocs/core/modules/product/doc/pdf_standard.modules.php b/htdocs/core/modules/product/doc/pdf_standard.modules.php index 7427fc7170e..c8190a362f5 100644 --- a/htdocs/core/modules/product/doc/pdf_standard.modules.php +++ b/htdocs/core/modules/product/doc/pdf_standard.modules.php @@ -713,6 +713,9 @@ class pdf_standard extends ModelePDFProduct { global $conf, $langs, $hookmanager; + $ltrdirection = 'L'; + if ($outputlangs->trans("DIRECTION") == 'rtl') $ltrdirection = 'R'; + // Load traductions files required by page $outputlangs->loadLangs(array("main", "propal", "companies", "bills", "orders")); @@ -734,28 +737,41 @@ class pdf_standard extends ModelePDFProduct $pdf->SetTextColor(0, 0, 60); $pdf->SetFont('', 'B', $default_font_size + 3); + $w = 100; + $posy = $this->marge_haute; $posx = $this->page_largeur - $this->marge_droite - 100; $pdf->SetXY($this->marge_gauche, $posy); // Logo - $logo = $conf->mycompany->dir_output.'/logos/'.$this->emetteur->logo; - if ($this->emetteur->logo) { - if (is_readable($logo)) { - $height = pdf_getHeightForLogo($logo); - $pdf->Image($logo, $this->marge_gauche, $posy, 0, $height); // width=0 (auto) + if (!getDolGlobalInt('PDF_DISABLE_MYCOMPANY_LOGO')) { + if ($this->emetteur->logo) { + $logodir = $conf->mycompany->dir_output; + if (!empty($conf->mycompany->multidir_output[$object->entity])) { + $logodir = $conf->mycompany->multidir_output[$object->entity]; + } + if (!getDolGlobalInt('MAIN_PDF_USE_LARGE_LOGO')) { + $logo = $logodir.'/logos/thumbs/'.$this->emetteur->logo_small; + } else { + $logo = $logodir.'/logos/'.$this->emetteur->logo; + } + if (is_readable($logo)) { + $height = pdf_getHeightForLogo($logo); + $pdf->Image($logo, $this->marge_gauche, $posy, 0, $height); // width=0 (auto) + } else { + $pdf->SetTextColor(200, 0, 0); + $pdf->SetFont('', 'B', $default_font_size - 2); + $pdf->MultiCell($w, 3, $outputlangs->transnoentities("ErrorLogoFileNotFound", $logo), 0, 'L'); + $pdf->MultiCell($w, 3, $outputlangs->transnoentities("ErrorGoToGlobalSetup"), 0, 'L'); + } } else { - $pdf->SetTextColor(200, 0, 0); - $pdf->SetFont('', 'B', $default_font_size - 2); - $pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorLogoFileNotFound", $logo), 0, 'L'); - $pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorGoToGlobalSetup"), 0, 'L'); + $text = $this->emetteur->name; + $pdf->MultiCell($w, 4, $outputlangs->convToOutputCharset($text), 0, $ltrdirection); } - } else { - $text = $this->emetteur->name; - $pdf->MultiCell(100, 4, $outputlangs->convToOutputCharset($text), 0, 'L'); } + $pdf->SetFont('', 'B', $default_font_size + 3); $pdf->SetXY($posx, $posy); $pdf->SetTextColor(0, 0, 60); From c5f0ac9f29557c9842738f1e637f7c73d2663fcc Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 26 Jan 2023 12:07:04 +0100 Subject: [PATCH 1044/1128] Fix public page for user --- htdocs/public/users/view.php | 26 ++++++++++++++++---------- htdocs/theme/eldy/global.inc.php | 7 +++++++ htdocs/theme/md/style.css.php | 7 +++++++ 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/htdocs/public/users/view.php b/htdocs/public/users/view.php index d63a2a66eee..b0b4b3ae32f 100644 --- a/htdocs/public/users/view.php +++ b/htdocs/public/users/view.php @@ -229,6 +229,12 @@ if ($object->job && !getDolUserInt('USER_PUBLIC_HIDE_JOBPOSITION', 0, $object)) print dol_escape_htmltag($object->job); print ''; } +if (!getDolUserInt('USER_PUBLIC_HIDE_COMPANY', 0, $object)) { + print '
    '; + print dol_escape_htmltag($mysoc->name); + print '
    '; +} + print ''; @@ -240,7 +246,7 @@ print ''; if (!empty($conf->global->USER_IMAGE_PUBLIC_INTERFACE)) { print '
    '; - print ''; + print ''; print '
    '; } @@ -292,19 +298,19 @@ if ($object->office_phone && !getDolUserInt('USER_PUBLIC_HIDE_OFFICE_PHONE', 0, $usersection .= '
    '; $usersection .= img_picto('', 'phone', 'class="pictofixedwidth"'); $usersection .= dol_print_phone($object->office_phone, $object->country_code, 0, $mysoc->id, 'tel', ' ', 0, ''); - $usersection .= '
    '; + $usersection .= '
    '; } if ($object->office_fax && !getDolUserInt('USER_PUBLIC_HIDE_OFFICE_FAX', 0, $object)) { $usersection .= '
    '; $usersection .= img_picto('', 'phoning_fax', 'class="pictofixedwidth"'); $usersection .= dol_print_phone($object->office_fax, $object->country_code, 0, $mysoc->id, 'fax', ' ', 0, ''); - $usersection .= '
    '; + $usersection .= '
    '; } if ($object->user_mobile && !getDolUserInt('USER_PUBLIC_HIDE_USER_MOBILE', 0, $object)) { $usersection .= '
    '; $usersection .= img_picto('', 'phone', 'class="pictofixedwidth"'); $usersection .= dol_print_phone($object->user_mobile, $object->country_code, 0, $mysoc->id, 'tel', ' ', 0, ''); - $usersection .= '
    '; + $usersection .= '
    '; } // Social networks @@ -324,7 +330,7 @@ if ($usersection) { // Output payment summary form print '
    '; - print ''; + if (!empty($conf->global->PRODUCT_USE_UNITS)) { + print ''; + } print ''; } else { print ''; - print ''; - print ''; + if (!empty($conf->global->PRODUCT_USE_UNITS)) { + print ''; + } + print ''; } From 1200174b83e2974d9c07c5d442527feb55a7a2d4 Mon Sep 17 00:00:00 2001 From: Adrien Raze Date: Thu, 26 Jan 2023 18:03:18 +0100 Subject: [PATCH 1050/1128] FIX : The folder on BOM card who display or not the sub BOM was not working --- htdocs/bom/bom_card.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/htdocs/bom/bom_card.php b/htdocs/bom/bom_card.php index 333b6232f9f..b25785ae368 100644 --- a/htdocs/bom/bom_card.php +++ b/htdocs/bom/bom_card.php @@ -613,9 +613,6 @@ if (empty($reshook)) { print "\n"; - mrpCollapseBomManagement(); - - //Services $filtertype = 1; $res = $object->fetchLinesbytypeproduct(1); From 072ee3f1eac56895ef660761213f456bf634d123 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 26 Jan 2023 19:20:03 +0100 Subject: [PATCH 1051/1128] Fix regression --- htdocs/comm/card.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/comm/card.php b/htdocs/comm/card.php index 9c848883332..2e259a2c8bc 100644 --- a/htdocs/comm/card.php +++ b/htdocs/comm/card.php @@ -1427,7 +1427,7 @@ if ($object->id > 0) { $sql .= " WHERE f.fk_soc = s.rowid AND s.rowid = ".((int) $object->id); $sql .= " AND f.entity IN (".getEntity('invoice').")"; $sql .= ' GROUP BY f.rowid, f.ref, f.type, f.total_ht, f.total_tva, f.total_ttc,'; - $sql .= ' f.entity, f.datef, f.datec, f.paye, f.fk_statut,'; + $sql .= ' f.entity, f.datef, f.date_lim_reglement, f.datec, f.paye, f.fk_statut,'; $sql .= ' s.nom, s.rowid'; $sql .= " ORDER BY f.datef DESC, f.datec DESC"; @@ -1441,7 +1441,7 @@ if ($object->id > 0) { print '
    '; - print '
    '; + print '
    '; print $usersection; @@ -344,7 +350,7 @@ if (!getDolUserInt('USER_PUBLIC_HIDE_COMPANY', 0, $object)) { $companysection .= '
    '; $companysection .= img_picto('', 'email', 'class="pictofixedwidth"'); $companysection .= dol_print_email($mysoc->email, 0, 0, 1); - $companysection .= '
    '; + $companysection .= '
    '; } if ($mysoc->url) { @@ -358,13 +364,13 @@ if (!getDolUserInt('USER_PUBLIC_HIDE_COMPANY', 0, $object)) { $companysection .= '
    '; $companysection .= img_picto('', 'phone', 'class="pictofixedwidth"'); $companysection .= dol_print_phone($mysoc->phone, $mysoc->country_code, 0, $mysoc->id, 'tel', ' ', 0, ''); - $companysection .= '
    '; + $companysection .= '
    '; } if ($mysoc->fax) { $companysection .= '
    '; $companysection .= img_picto('', 'phoning_fax', 'class="pictofixedwidth"'); $companysection .= dol_print_phone($mysoc->fax, $mysoc->country_code, 0, $mysoc->id, 'fax', ' ', 0, ''); - $companysection .= '
    '; + $companysection .= '
    '; } // Social networks @@ -414,12 +420,12 @@ if (!getDolUserInt('USER_PUBLIC_HIDE_COMPANY', 0, $object)) { // Output payment summary form print '
    '; - print '
    '; + print '
    '; // Add company info if ($mysoc->name) { print '
    '; - print $mysoc->name; + print dol_escape_htmltag($mysoc->name); print '
    '; print '
    '; } diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 0b987de469e..e3df53d52cb 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -1770,6 +1770,13 @@ select.widthcentpercentminusxx, span.widthcentpercentminusxx:not(.select2-select .smallonsmartphone { font-size: 0.8em; } + + .nopaddingtoponsmartphone { + padding-top: 0 !important; + } + .nopaddingbottomonsmartphone { + padding-bottom: 0 !important; + } } /* Force values for small screen 570 */ diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 0fde8b72044..429940fd537 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -1981,6 +1981,13 @@ select.widthcentpercentminusxx, span.widthcentpercentminusxx:not(.select2-select .smallonsmartphone { font-size: 0.8em; } + + .nopaddingtoponsmartphone { + padding-top: 0 !important; + } + .nopaddingbottomonsmartphone { + padding-bottom: 0 !important; + } } /* Force values for small screen 570 */ From 8735894a61e8b4dfb2e383e1b9432bce1796899b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 26 Jan 2023 12:09:33 +0100 Subject: [PATCH 1045/1128] Fix missing new Form --- htdocs/admin/company_socialnetworks.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/htdocs/admin/company_socialnetworks.php b/htdocs/admin/company_socialnetworks.php index e9171431187..fb496c1dce1 100644 --- a/htdocs/admin/company_socialnetworks.php +++ b/htdocs/admin/company_socialnetworks.php @@ -84,6 +84,8 @@ if (($action == 'update' && !GETPOST("cancel", 'alpha'))) { * View */ +$form = new Form($db); + $wikihelp = 'EN:First_setup|FR:Premiers_paramétrages|ES:Primeras_configuraciones'; llxHeader('', $langs->trans("Setup"), $wikihelp); From 3de3b421b92938e037fc26a3e56996fcca2ba22d Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Thu, 26 Jan 2023 14:37:15 +0100 Subject: [PATCH 1046/1128] fix : Warning: Trying to access array offset on value of type bool in /home/httpd/vhosts/aflac.fr/domains/dev.aflac.fr/httpdocs/includes/tcpdi/tcpdi_parser.php on line 1377 --- htdocs/includes/tcpdi/tcpdi_parser.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/includes/tcpdi/tcpdi_parser.php b/htdocs/includes/tcpdi/tcpdi_parser.php index 13e9839f2b4..6d3cf789b6a 100644 --- a/htdocs/includes/tcpdi/tcpdi_parser.php +++ b/htdocs/includes/tcpdi/tcpdi_parser.php @@ -1373,7 +1373,7 @@ class tcpdi_parser { return false; } else { $res = $this->_getPageRotation($obj[1][1]['/Parent']); - if ($res[0] == PDF_TYPE_OBJECT) + if ($res && $res[0] == PDF_TYPE_OBJECT) return $res[1]; return $res; } From 777cfd5753a3d41fe75d3724a736a1e81e0426c8 Mon Sep 17 00:00:00 2001 From: Adrien Raze Date: Thu, 26 Jan 2023 15:26:24 +0100 Subject: [PATCH 1047/1128] FIX : Sub-Bom costs were not good --- htdocs/bom/tpl/objectline_view.tpl.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/bom/tpl/objectline_view.tpl.php b/htdocs/bom/tpl/objectline_view.tpl.php index 5992578a6e0..2df13e9af83 100644 --- a/htdocs/bom/tpl/objectline_view.tpl.php +++ b/htdocs/bom/tpl/objectline_view.tpl.php @@ -171,7 +171,7 @@ $tmpbom->calculateCosts(); print '
    '; $coldisplay++; if (!empty($line->fk_bom_child)) { - echo ''.price($tmpbom->total_cost).''; + echo ''.price($tmpbom->total_cost * $line->qty).''; } else { echo ''.price($line->total_cost).''; } From 52c39d05f796f2435f061e3ee18d0555f2e5590a Mon Sep 17 00:00:00 2001 From: Adrien Raze Date: Thu, 26 Jan 2023 15:32:37 +0100 Subject: [PATCH 1048/1128] FIX : Make help text part bold --- htdocs/langs/fr_FR/mrp.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/langs/fr_FR/mrp.lang b/htdocs/langs/fr_FR/mrp.lang index 557b1f09175..47e8dcf13d3 100644 --- a/htdocs/langs/fr_FR/mrp.lang +++ b/htdocs/langs/fr_FR/mrp.lang @@ -82,7 +82,7 @@ ProductsToConsume=Produits à consommer ProductsToProduce=Produits à produire UnitCost=Coût unitaire TotalCost=Coût total -BOMTotalCost=Le coût de production de cette nomenclature basé sur chaque quantité et produit à consommer (utilise le cout de la sous BOM si existante, sinon le prix de revient du produit si défini, sinon le PMP si défini, sinon le meilleur prix d'achat) +BOMTotalCost=Le coût de production de cette nomenclature basé sur chaque quantité et produit à consommer (utilise le cout de la sous BOM si existante, sinon le prix de revient du produit si défini, sinon le PMP si défini, sinon le meilleur prix d'achat) BOMTotalCostService=Si le module "Poste de travail" est activé et qu'un poste de travail est défini par défaut sur la ligne, alors le calcul est "quantité (convertie en heures) x poste de travail ahr", sinon "quantité (convertie en heures) x prix de revient du service" GoOnTabProductionToProduceFirst=Vous devez avoir la production pour clôturer un Ordre de Fabrication (voir onglet '%s'). Mais vous pouvez l'annuler. ErrorAVirtualProductCantBeUsedIntoABomOrMo=Un kit ne peut pas être utilisé dans une Nomenclature ou un Ordre de fabrication. From 331dd7d4792ab881701845a053628da4087fa7c8 Mon Sep 17 00:00:00 2001 From: Adrien Raze Date: Thu, 26 Jan 2023 15:56:04 +0100 Subject: [PATCH 1049/1128] FIX : Sub-Bom indentations were not good --- htdocs/bom/tpl/objectline_view.tpl.php | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/htdocs/bom/tpl/objectline_view.tpl.php b/htdocs/bom/tpl/objectline_view.tpl.php index 2df13e9af83..ac277f6e880 100644 --- a/htdocs/bom/tpl/objectline_view.tpl.php +++ b/htdocs/bom/tpl/objectline_view.tpl.php @@ -269,16 +269,20 @@ if ($resql) { $label = $sub_bom_product->getLabelOfUnit('long'); if ($sub_bom_line->qty_frozen > 0) { print ''.price($sub_bom_line->qty, 0, '', 0, 0).''; - if ($label !== '') print $langs->trans($label); - print ''; + if ($label !== '') print $langs->trans($label); + print ''.$langs->trans('Yes').''.price($sub_bom_line->qty * $line->qty, 0, '', 0, 0).''; - if ($label !== '') print $langs->trans($label); - print ''; + if ($label !== '') print $langs->trans($label); + print ' 
    '; print ''; - print ''; print ''; print ''; } // National registration number - if ($user->hasRight('hrm', 'read_personal_information', 'read') || $user->hasRight('hrm', 'write_personal_information', 'write')) { + if ($permissiontoreadhr) { print ''; print ''; print ''; } diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 2893378bdd9..089e082fae3 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -99,34 +99,10 @@ class User extends CommonObject public $personal_email; /** - * @var array array of socialnetworks + * @var array array of socialnetwo18dprks */ public $socialnetworks; - /** - * @var string skype account - * @deprecated - */ - public $skype; - - /** - * @var string twitter account - * @deprecated - */ - public $twitter; - - /** - * @var string facebook account - * @deprecated - */ - public $facebook; - - /** - * @var string linkedin account - * @deprecated - */ - public $linkedin; - /** * @var string job position */ diff --git a/htdocs/user/list.php b/htdocs/user/list.php index 3cac5d06c56..30adec1dd08 100644 --- a/htdocs/user/list.php +++ b/htdocs/user/list.php @@ -116,6 +116,9 @@ if (!empty($conf->api->enabled)) { $fieldstosearchall['u.api_key'] = "ApiKey"; } +$permissiontoreadhr = $user->hasRight('hrm', 'read_personal_information', 'read') || $user->hasRight('hrm', 'write_personal_information', 'write'); +$permissiontowritehr = $user->hasRight('hrm', 'write_personal_information', 'write'); + // Definition of fields for list $arrayfields = array( 'u.login'=>array('label'=>"Login", 'checked'=>1, 'position'=>10), @@ -124,14 +127,16 @@ $arrayfields = array( 'u.entity'=>array('label'=>"Entity", 'checked'=>1, 'position'=>50, 'enabled'=>(isModEnabled('multicompany') && empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE))), 'u.gender'=>array('label'=>"Gender", 'checked'=>0, 'position'=>22), 'u.employee'=>array('label'=>"Employee", 'checked'=>($contextpage == 'employeelist' ? 1 : 0), 'position'=>25), - 'u.fk_user'=>array('label'=>"HierarchicalResponsible", 'checked'=>1, 'position'=>27), + 'u.fk_user'=>array('label'=>"HierarchicalResponsible", 'checked'=>1, 'position'=>27, 'csslist'=>'maxwidth150'), 'u.accountancy_code'=>array('label'=>"AccountancyCode", 'checked'=>0, 'position'=>30), 'u.office_phone'=>array('label'=>"PhonePro", 'checked'=>1, 'position'=>31), 'u.user_mobile'=>array('label'=>"PhoneMobile", 'checked'=>1, 'position'=>32), 'u.email'=>array('label'=>"EMail", 'checked'=>1, 'position'=>35), 'u.api_key'=>array('label'=>"ApiKey", 'checked'=>0, 'position'=>40, "enabled"=>(!empty($conf->api->enabled) && $user->admin)), 'u.fk_soc'=>array('label'=>"Company", 'checked'=>($contextpage == 'employeelist' ? 0 : 1), 'position'=>45), - 'u.salary'=>array('label'=>"Salary", 'checked'=>1, 'position'=>80, 'enabled'=>(!empty($conf->salaries->enabled) && $user->hasRight("salaries", "readall"))), + 'u.ref_employee'=>array('label'=>"RefEmployee", 'checked'=>1, 'position'=>60, 'enabled'=>(isModEnabled('hrm') && $permissiontoreadhr)), + 'u.national_registration_number'=>array('label'=>"NationalRegistrationNumber", 'checked'=>1, 'position'=>61, 'enabled'=>(isModEnabled('hrm') && $permissiontoreadhr)), + 'u.salary'=>array('label'=>"Salary", 'checked'=>1, 'position'=>80, 'enabled'=>(isModEnabled('salaries') && $user->hasRight("salaries", "readall"))), 'u.datelastlogin'=>array('label'=>"LastConnexion", 'checked'=>1, 'position'=>100), 'u.datepreviouslogin'=>array('label'=>"PreviousConnexion", 'checked'=>0, 'position'=>110), 'u.datec'=>array('label'=>"DateCreation", 'checked'=>0, 'position'=>500), @@ -357,7 +362,7 @@ $morehtmlright = ""; // Build and execute select // -------------------------------------------------------------------- $sql = "SELECT DISTINCT u.rowid, u.lastname, u.firstname, u.admin, u.fk_soc, u.login, u.office_phone, u.user_mobile, u.email, u.api_key, u.accountancy_code, u.gender, u.employee, u.photo,"; -$sql .= " u.salary, u.datelastlogin, u.datepreviouslogin,"; +$sql .= " u.ref_employee, u.national_registration_number, u.salary, u.datelastlogin, u.datepreviouslogin,"; $sql .= " u.ldap_sid, u.statut as status, u.entity,"; $sql .= " u.tms as date_update, u.datec as date_creation,"; $sql .= " u2.rowid as id2, u2.login as login2, u2.firstname as firstname2, u2.lastname as lastname2, u2.admin as admin2, u2.fk_soc as fk_soc2, u2.office_phone as ofice_phone2, u2.user_mobile as user_mobile2, u2.email as email2, u2.gender as gender2, u2.photo as photo2, u2.entity as entity2, u2.statut as status2,"; @@ -772,6 +777,12 @@ if (!empty($arrayfields['u.fk_soc']['checked'])) { if (!empty($arrayfields['u.entity']['checked'])) { print ''; } +if (!empty($arrayfields['u.ref_employee']['checked'])) { + print ''; +} +if (!empty($arrayfields['u.national_registration_number']['checked'])) { + print ''; +} if (!empty($arrayfields['u.salary']['checked'])) { print ''; } @@ -874,6 +885,14 @@ if (!empty($arrayfields['u.entity']['checked'])) { print_liste_field_titre("Entity", $_SERVER['PHP_SELF'], "u.entity", $param, "", "", $sortfield, $sortorder); $totalarray['nbfield']++; } +if (!empty($arrayfields['u.ref_employee']['checked'])) { + print_liste_field_titre("RefEmployee", $_SERVER['PHP_SELF'], "u.ref_employee", $param, "", "", $sortfield, $sortorder); + $totalarray['nbfield']++; +} +if (!empty($arrayfields['u.national_registration_number']['checked'])) { + print_liste_field_titre("NationalRegistrationNumber", $_SERVER['PHP_SELF'], "u.national_registration_number", $param, "", "", $sortfield, $sortorder); + $totalarray['nbfield']++; +} if (!empty($arrayfields['u.salary']['checked'])) { print_liste_field_titre("Salary", $_SERVER['PHP_SELF'], "u.salary", $param, "", "", $sortfield, $sortorder, 'right '); $totalarray['nbfield']++; @@ -1160,6 +1179,24 @@ while ($i < $imaxinloop) { } } + // Ref employee + if (!empty($arrayfields['u.ref_employee']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } + // National number + if (!empty($arrayfields['u.national_registration_number']['checked'])) { + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } // Salary if (!empty($arrayfields['u.salary']['checked'])) { print ''; } if (!empty($arrayfields['u.accountancy_code']['checked'])) { @@ -1019,12 +1019,12 @@ while ($i < $imaxinloop) { // Login if (!empty($arrayfields['u.login']['checked'])) { print ''; if (!$i) { $totalarray['nbfield']++; @@ -1076,8 +1076,7 @@ while ($i < $imaxinloop) { // Supervisor if (!empty($arrayfields['u.fk_user']['checked'])) { - // Resp - print ''; if (!$i) { @@ -1181,7 +1180,7 @@ while ($i < $imaxinloop) { // Ref employee if (!empty($arrayfields['u.ref_employee']['checked'])) { - print ''; if (!$i) { @@ -1190,7 +1189,7 @@ while ($i < $imaxinloop) { } // National number if (!empty($arrayfields['u.national_registration_number']['checked'])) { - print ''; if (!$i) { From 6e054bc278775f4488375deb87632af69adbbb4a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 31 Jan 2023 01:13:45 +0100 Subject: [PATCH 1108/1128] Add line total on user list --- htdocs/user/list.php | 45 ++++++++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/htdocs/user/list.php b/htdocs/user/list.php index 296aaad5cc9..ef659197607 100644 --- a/htdocs/user/list.php +++ b/htdocs/user/list.php @@ -44,7 +44,7 @@ $toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'userlist'; // To manage different context of search $backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print') -$mode = GETPOST("mode", 'alpha'); +$mode = GETPOST("mode", 'aZ'); // Security check (for external users) $socid = 0; @@ -84,7 +84,7 @@ if (!$sortorder) { } // Initialize array of search criterias -$search_all = GETPOST('search_all', 'alphanohtml') ? GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml'); +$search_all = GETPOST('search_all', 'alphanohtml'); $search = array(); foreach ($object->fields as $key => $val) { if (GETPOST('search_'.$key, 'alpha') !== '') { @@ -136,7 +136,7 @@ $arrayfields = array( 'u.fk_soc'=>array('label'=>"Company", 'checked'=>($contextpage == 'employeelist' ? 0 : 1), 'position'=>45), 'u.ref_employee'=>array('label'=>"RefEmployee", 'checked'=>-1, 'position'=>60, 'enabled'=>(isModEnabled('hrm') && $permissiontoreadhr)), 'u.national_registration_number'=>array('label'=>"NationalRegistrationNumber", 'checked'=>-1, 'position'=>61, 'enabled'=>(isModEnabled('hrm') && $permissiontoreadhr)), - 'u.salary'=>array('label'=>"Salary", 'checked'=>-1, 'position'=>80, 'enabled'=>(isModEnabled('salaries') && $user->hasRight("salaries", "readall"))), + 'u.salary'=>array('label'=>"Salary", 'checked'=>-1, 'position'=>80, 'enabled'=>(isModEnabled('salaries') && $user->hasRight("salaries", "readall")), 'isameasure'=>1), 'u.datelastlogin'=>array('label'=>"LastConnexion", 'checked'=>1, 'position'=>100), 'u.datepreviouslogin'=>array('label'=>"PreviousConnexion", 'checked'=>0, 'position'=>110), 'u.datec'=>array('label'=>"DateCreation", 'checked'=>0, 'position'=>500), @@ -631,6 +631,7 @@ print ''; print ''; print ''; print ''; +print ''; print ''; $url = DOL_URL_ROOT.'/user/card.php?action=create'.($contextpage == 'employeelist' ? '&search_employee=1' : '').'&leftmenu='; @@ -724,7 +725,7 @@ print '
    '; + print ''; print ''; @@ -1493,14 +1493,14 @@ if ($object->id > 0) { //print $formfile->getDocumentsLink($facturestatic->element, $filename, $filedir); print ''; if ($objp->df > 0) { - print ''; + print ''; } else { - print ''; + print ''; } if ($objp->dl > 0) { - print ''; + print ''; } else { - print ''; + print ''; } print ''; print '\n"; if (!$i) { From 82f73da1ac7288d1cda74cb272b09cd69d225e83 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 27 Jan 2023 10:31:12 +0100 Subject: [PATCH 1055/1128] Fix debug filter list services --- htdocs/contrat/services_list.php | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/htdocs/contrat/services_list.php b/htdocs/contrat/services_list.php index fb50283991b..e66b5eaa273 100644 --- a/htdocs/contrat/services_list.php +++ b/htdocs/contrat/services_list.php @@ -36,6 +36,7 @@ require_once DOL_DOCUMENT_ROOT."/societe/class/societe.class.php"; $langs->loadLangs(array('products', 'contracts', 'companies')); $optioncss = GETPOST('optioncss', 'aZ09'); +$mode = GETPOST("mode"); $massaction = GETPOST('massaction', 'alpha'); $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit; @@ -55,11 +56,10 @@ if (!$sortorder) { $sortorder = "ASC"; } -$mode = GETPOST("mode"); $filter = GETPOST("filter"); $search_name = GETPOST("search_name", 'alpha'); $search_subprice = GETPOST("search_subprice", 'alpha'); -$search_qty = GETPOST("search_name", 'alpha'); +$search_qty = GETPOST("search_qty", 'alpha'); $search_total_ht = GETPOST("search_total_ht", 'alpha'); $search_total_tva = GETPOST("search_total_tva", 'alpha'); $search_total_ttc = GETPOST("search_total_ttc", 'alpha'); @@ -144,10 +144,10 @@ $arrayfields = array( 'cd.qty'=>array('label'=>"Qty", 'checked'=>1, 'position'=>108), 'cd.total_ht'=>array('label'=>"TotalHT", 'checked'=>-1, 'position'=>109, 'isameasure'=>1), 'cd.total_tva'=>array('label'=>"TotalVAT", 'checked'=>-1, 'position'=>110), - 'cd.date_ouverture_prevue'=>array('label'=>"DateStartPlannedShort", 'checked'=>(($mode == "" || $mode == -1) || $mode == "0"), 'position'=>150), - 'cd.date_ouverture'=>array('label'=>"DateStartRealShort", 'checked'=>(($mode == "" || $mode == -1) || $mode > 0), 'position'=>160), - 'cd.date_fin_validite'=>array('label'=>"DateEndPlannedShort", 'checked'=>(($mode == "" || $mode == -1) || $mode < 5), 'position'=>170), - 'cd.date_cloture'=>array('label'=>"DateEndRealShort", 'checked'=>(($mode == "" || $mode == -1) || $mode >= 5), 'position'=>180), + 'cd.date_ouverture_prevue'=>array('label'=>"DateStartPlannedShort", 'checked'=>1, 'position'=>150), + 'cd.date_ouverture'=>array('label'=>"DateStartRealShort", 'checked'=>1, 'position'=>160), + 'cd.date_fin_validite'=>array('label'=>"DateEndPlannedShort", 'checked'=>1, 'position'=>170), + 'cd.date_cloture'=>array('label'=>"DateEndRealShort", 'checked'=>1, 'position'=>180), //'cd.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500), 'cd.tms'=>array('label'=>"DateModificationShort", 'checked'=>0, 'position'=>500), 'status'=>array('label'=>"Status", 'checked'=>1, 'position'=>1000) @@ -294,7 +294,7 @@ if ($search_subprice) { $sql .= natural_search("cd.subprice", $search_subprice, 1); } if ($search_qty) { - $sql .= natural_search("cd.total_qty", $search_qty, 1); + $sql .= natural_search("cd.qty", $search_qty, 1); } if ($search_total_ht) { $sql .= natural_search("cd.total_ht", $search_total_ht, 1); @@ -563,7 +563,7 @@ if (!empty($arrayfields['c.ref']['checked'])) { print ''; } // Service label @@ -961,6 +961,17 @@ while ($i < min($num, $limit)) { // Show total line include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php'; +// If no record found +if ($num == 0) { + $colspan = 1; + foreach ($arrayfields as $key => $val) { + if (!empty($val['checked'])) { + $colspan++; + } + } + print ''; +} + $db->free($resql); $parameters = array('sql' => $sql); From b84bd58fdc35252673a4dd1c35e91f87ed3b5126 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 27 Jan 2023 10:42:32 +0100 Subject: [PATCH 1056/1128] Standardize code --- htdocs/contrat/class/contrat.class.php | 6 ++--- htdocs/contrat/index.php | 6 ++--- htdocs/contrat/services_list.php | 33 ++++++++++--------------- htdocs/core/menus/init_menu_auguria.sql | 8 +++--- htdocs/core/menus/standard/eldy.lib.php | 8 +++--- 5 files changed, 27 insertions(+), 34 deletions(-) diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index 4c7fe585d32..ad2cbcea84b 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -2249,15 +2249,15 @@ class Contrat extends CommonObject $warning_delay = $conf->contrat->services->inactifs->warning_delay; $label = $langs->trans("BoardNotActivatedServices"); $labelShort = $langs->trans("BoardNotActivatedServicesShort"); - $url = DOL_URL_ROOT.'/contrat/services_list.php?mainmenu=commercial&leftmenu=contracts&mode=0&sortfield=cd.date_fin_validite&sortorder=asc'; + $url = DOL_URL_ROOT.'/contrat/services_list.php?mainmenu=commercial&leftmenu=contracts&search_status=0&sortfield=cd.date_fin_validite&sortorder=asc'; } elseif ($mode == 'expired') { $warning_delay = $conf->contrat->services->expires->warning_delay; - $url = DOL_URL_ROOT.'/contrat/services_list.php?mainmenu=commercial&leftmenu=contracts&mode=4&filter=expired&sortfield=cd.date_fin_validite&sortorder=asc'; + $url = DOL_URL_ROOT.'/contrat/services_list.php?mainmenu=commercial&leftmenu=contracts&search_status=4&filter=expired&sortfield=cd.date_fin_validite&sortorder=asc'; $label = $langs->trans("BoardExpiredServices"); $labelShort = $langs->trans("BoardExpiredServicesShort"); } else { $warning_delay = $conf->contrat->services->expires->warning_delay; - $url = DOL_URL_ROOT.'/contrat/services_list.php?mainmenu=commercial&leftmenu=contracts&mode=4&sortfield=cd.date_fin_validite&sortorder=asc'; + $url = DOL_URL_ROOT.'/contrat/services_list.php?mainmenu=commercial&leftmenu=contracts&search_status=4&sortfield=cd.date_fin_validite&sortorder=asc'; //$url.= '&op2day='.$arraydatetouse['mday'].'&op2month='.$arraydatetouse['mon'].'&op2year='.$arraydatetouse['year']; //if ($warning_delay >= 0) $url.='&filter=expired'; $label = $langs->trans("BoardRunningServices"); diff --git a/htdocs/contrat/index.php b/htdocs/contrat/index.php index c14775449c6..c40453ec7af 100644 --- a/htdocs/contrat/index.php +++ b/htdocs/contrat/index.php @@ -194,7 +194,7 @@ foreach ($listofstatus as $status) { if (empty($conf->use_javascript_ajax)) { print ''; print ''; - print ''; + print ''; print "\n"; } if ($status == 4 && !$bool) { @@ -224,7 +224,7 @@ foreach ($listofstatus as $status) { if (empty($conf->use_javascript_ajax)) { print ''; print ''; - print ''; + print ''; if ($status == 4 && !$bool) { $bool = true; } else { @@ -622,7 +622,7 @@ if ($resql) { print '
    '; print '
    '.$langs->trans("LastCustomersBills", ($num <= $MAXLIST ? "" : $MAXLIST)).''.$langs->trans("AllBills").''.$num.''; print ''; print '
    '.$langs->trans("LastCustomersBills", ($num <= $MAXLIST ? "" : $MAXLIST)).''.$langs->trans("AllBills").''.$num.''.img_picto($langs->trans("Statistics"), 'stats').'
    '.$langs->trans('DateInvoice').": ".dol_print_date($db->jdate($objp->df), 'day').''.dol_print_date($db->jdate($objp->df), 'day').'!!!!!!'.$langs->trans('DateMaxPayment').": ".dol_print_date($db->jdate($objp->dl), 'day').''.dol_print_date($db->jdate($objp->dl), 'day').'!!!!!!'; print price($objp->total_ht); From 2493732edb0dc0ea3081e6537e051e47dd272308 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 26 Jan 2023 19:23:43 +0100 Subject: [PATCH 1052/1128] Fix properties --- htdocs/comm/card.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/htdocs/comm/card.php b/htdocs/comm/card.php index 2e259a2c8bc..46343919cb6 100644 --- a/htdocs/comm/card.php +++ b/htdocs/comm/card.php @@ -1458,6 +1458,8 @@ if ($object->id > 0) { $facturestatic->total_tva = $objp->total_tva; $facturestatic->total_ttc = $objp->total_ttc; $facturestatic->statut = $objp->status; + $facturestatic->date = $db->jdate($objp->df); + $facturestatic->date_lim_reglement = $db->jdate($objp->dl); print '
    '; From cedd0792f38598d6183e5531ef2d35035fce69ba Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 27 Jan 2023 01:03:44 +0100 Subject: [PATCH 1053/1128] Fix duplicate --- htdocs/contrat/class/contrat.class.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index 0357459052b..4c7fe585d32 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -243,7 +243,6 @@ class Contrat extends CommonObject 'model_pdf' =>array('type'=>'varchar(255)', 'label'=>'Model pdf', 'enabled'=>1, 'visible'=>0, 'position'=>115), 'import_key' =>array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>1, 'visible'=>-2, 'position'=>120), 'extraparams' =>array('type'=>'varchar(255)', 'label'=>'Extraparams', 'enabled'=>1, 'visible'=>-1, 'position'=>125), - 'ref_customer' =>array('type'=>'varchar(50)', 'label'=>'Ref customer', 'enabled'=>1, 'visible'=>-1, 'position'=>130), 'fk_user_modif' =>array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserModif', 'enabled'=>1, 'visible'=>-2, 'notnull'=>-1, 'position'=>135), 'last_main_doc' =>array('type'=>'varchar(255)', 'label'=>'Last main doc', 'enabled'=>1, 'visible'=>-1, 'position'=>140), 'statut' =>array('type'=>'smallint(6)', 'label'=>'Statut', 'enabled'=>1, 'visible'=>-1, 'position'=>500, 'notnull'=>1, 'arrayofkeyval'=>array(0=>'Draft', 1=>'Validated', 2=>'Closed')) From 31652fd7324ceb755111fcafcbb035e5a380728c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 27 Jan 2023 02:43:41 +0100 Subject: [PATCH 1054/1128] css --- htdocs/product/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/list.php b/htdocs/product/list.php index f9a353b81b0..3b911a4c2c7 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -1456,7 +1456,7 @@ while ($i < $imaxinloop) { // Ref if (!empty($arrayfields['p.ref']['checked'])) { - print ''; + print ''; print $product_static->getNomUrl(1); print "'; print ''; print ''; - print ''; + print ''; print '
    '.$langs->trans("NoRecordFound").'
    '.$staticcontratligne->LibStatut($status, 0, ($bool ? 1 : 0)).''.($nb[$status.$bool] ? $nb[$status.$bool] : 0).' '.$staticcontratligne->LibStatut($status, 3, ($bool ? 1 : 0)).''.($nb[$status.$bool] ? $nb[$status.$bool] : 0).' '.$staticcontratligne->LibStatut($status, 3, ($bool ? 1 : 0)).'
    '.$staticcontratligne->LibStatut($status, 0, ($bool ? 1 : 0)).''.($nb[$status.$bool] ? $nb[$status.$bool] : 0).' '.$staticcontratligne->LibStatut($status, 3, ($bool ? 1 : 0)).''.($nb[$status.$bool] ? $nb[$status.$bool] : 0).' '.$staticcontratligne->LibStatut($status, 3, ($bool ? 1 : 0)).'
    '; - print ''; + print ''; print "\n"; while ($i < $num) { diff --git a/htdocs/contrat/services_list.php b/htdocs/contrat/services_list.php index a4713c14b6b..47818081448 100644 --- a/htdocs/contrat/services_list.php +++ b/htdocs/contrat/services_list.php @@ -56,7 +56,7 @@ if (!$sortorder) { $sortorder = "ASC"; } -$filter = GETPOST("filter"); +$filter = GETPOST("filter", 'alpha'); $search_name = GETPOST("search_name", 'alpha'); $search_subprice = GETPOST("search_subprice", 'alpha'); $search_qty = GETPOST("search_qty", 'alpha'); @@ -110,7 +110,6 @@ $result = restrictedArea($user, 'contrat', $contratid); if ($search_status != '') { $tmp = explode('&', $search_status); - $mode = $tmp[0]; if (empty($tmp[1])) { $filter = ''; } else { @@ -121,14 +120,6 @@ if ($search_status != '') { $filter = 'expired'; } } -} else { - $search_status = $mode; - if ($filter == 'expired') { - $search_status .= '&filter=expired'; - } - if ($filter == 'notexpired') { - $search_status .= '&filter=notexpired'; - } } $staticcontrat = new Contrat($db); @@ -209,7 +200,6 @@ if (empty($reshook)) { $opclotureday = ""; $opclotureyear = ""; $filter_opcloture = ""; - $mode = ''; $filter = ''; $toselect = array(); $search_array_options = array(); @@ -275,13 +265,13 @@ $sql .= " AND c.fk_soc = s.rowid"; if (empty($user->rights->societe->client->voir) && !$socid) { $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id); } -if ($mode == "0") { +if ($search_status == "0") { $sql .= " AND cd.statut = 0"; } -if ($mode == "4") { +if ($search_status == "4") { $sql .= " AND cd.statut = 4"; } -if ($mode == "5") { +if ($search_status == "5") { $sql .= " AND cd.statut = 5"; } if ($filter == "expired") { @@ -417,6 +407,9 @@ if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { if ($limit > 0 && $limit != $conf->liste_limit) { $param .= '&limit='.$limit; } +if ($mode) { + $param .= '&mode='.urlencode($mode); +} if ($search_contract) { $param .= '&search_contract='.urlencode($search_contract); } @@ -441,8 +434,8 @@ if ($search_total_ttc) { if ($search_service) { $param .= '&search_service='.urlencode($search_service); } -if ($mode) { - $param .= '&mode='.urlencode($mode); +if ($search_status) { + $param .= '&search_status='.urlencode($search_status); } if ($filter) { $param .= '&filter='.urlencode($filter); @@ -500,16 +493,16 @@ print ''; print ''; $title = $langs->trans("ListOfServices"); -if ($mode == "0") { +if ($search_status == "0") { $title = $langs->trans("ListOfInactiveServices"); // Must use == "0" } -if ($mode == "4" && $filter != "expired") { +if ($search_status == "4" && $filter != "expired") { $title = $langs->trans("ListOfRunningServices"); } -if ($mode == "4" && $filter == "expired") { +if ($search_status == "4" && $filter == "expired") { $title = $langs->trans("ListOfExpiredServices"); } -if ($mode == "5") { +if ($search_status == "5") { $title = $langs->trans("ListOfClosedServices"); } diff --git a/htdocs/core/menus/init_menu_auguria.sql b/htdocs/core/menus/init_menu_auguria.sql index cef586ad1da..5c819488971 100644 --- a/htdocs/core/menus/init_menu_auguria.sql +++ b/htdocs/core/menus/init_menu_auguria.sql @@ -205,10 +205,10 @@ insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, left insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->contrat->enabled', __HANDLER__, 'left', 1401__+MAX_llx_menu__, 'commercial', '', 1400__+MAX_llx_menu__, '/contrat/card.php?mainmenu=commercial&action=create&leftmenu=contracts', 'NewContract', 1, 'contracts', '$user->rights->contrat->creer', '', 2, 0, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->contrat->enabled', __HANDLER__, 'left', 1402__+MAX_llx_menu__, 'commercial', '', 1400__+MAX_llx_menu__, '/contrat/list.php?mainmenu=commercial&leftmenu=contracts', 'List', 1, 'contracts', '$user->rights->contrat->lire', '', 2, 1, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->contrat->enabled', __HANDLER__, 'left', 1403__+MAX_llx_menu__, 'commercial', '', 1400__+MAX_llx_menu__, '/contrat/services_list.php?mainmenu=commercial&leftmenu=contracts', 'MenuServices', 1, 'contracts', '$user->rights->contrat->lire', '', 2, 2, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->contrat->enabled && $leftmenu=="contracts"', __HANDLER__, 'left', 1404__+MAX_llx_menu__, 'commercial', '', 1403__+MAX_llx_menu__, '/contrat/services_list.php?mainmenu=commercial&leftmenu=contracts&mode=0', 'MenuInactiveServices', 2, 'contracts', '$user->rights->contrat->lire', '', 2, 0, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->contrat->enabled && $leftmenu=="contracts"', __HANDLER__, 'left', 1405__+MAX_llx_menu__, 'commercial', '', 1403__+MAX_llx_menu__, '/contrat/services_list.php?mainmenu=commercial&leftmenu=contracts&mode=4', 'MenuRunningServices', 2, 'contracts', '$user->rights->contrat->lire', '', 2, 1, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->contrat->enabled && $leftmenu=="contracts"', __HANDLER__, 'left', 1406__+MAX_llx_menu__, 'commercial', '', 1403__+MAX_llx_menu__, '/contrat/services_list.php?mainmenu=commercial&leftmenu=contracts&mode=4&filter=expired', 'MenuExpiredServices', 2, 'contracts', '$user->rights->contrat->lire', '', 2, 2, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->contrat->enabled && $leftmenu=="contracts"', __HANDLER__, 'left', 1407__+MAX_llx_menu__, 'commercial', '', 1403__+MAX_llx_menu__, '/contrat/services_list.php?mainmenu=commercial&leftmenu=contracts&mode=5', 'MenuClosedServices', 2, 'contracts', '$user->rights->contrat->lire', '', 2, 3, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->contrat->enabled && $leftmenu=="contracts"', __HANDLER__, 'left', 1404__+MAX_llx_menu__, 'commercial', '', 1403__+MAX_llx_menu__, '/contrat/services_list.php?mainmenu=commercial&leftmenu=contracts&search_status=0', 'MenuInactiveServices', 2, 'contracts', '$user->rights->contrat->lire', '', 2, 0, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->contrat->enabled && $leftmenu=="contracts"', __HANDLER__, 'left', 1405__+MAX_llx_menu__, 'commercial', '', 1403__+MAX_llx_menu__, '/contrat/services_list.php?mainmenu=commercial&leftmenu=contracts&search_status=4', 'MenuRunningServices', 2, 'contracts', '$user->rights->contrat->lire', '', 2, 1, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->contrat->enabled && $leftmenu=="contracts"', __HANDLER__, 'left', 1406__+MAX_llx_menu__, 'commercial', '', 1403__+MAX_llx_menu__, '/contrat/services_list.php?mainmenu=commercial&leftmenu=contracts&search_status=4&filter=expired', 'MenuExpiredServices', 2, 'contracts', '$user->rights->contrat->lire', '', 2, 2, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->contrat->enabled && $leftmenu=="contracts"', __HANDLER__, 'left', 1407__+MAX_llx_menu__, 'commercial', '', 1403__+MAX_llx_menu__, '/contrat/services_list.php?mainmenu=commercial&leftmenu=contracts&search_status=5', 'MenuClosedServices', 2, 'contracts', '$user->rights->contrat->lire', '', 2, 3, __ENTITY__); -- Commercial - Interventions insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->ficheinter->enabled', __HANDLER__, 'left', 1500__+MAX_llx_menu__, 'commercial', 'ficheinter', 5__+MAX_llx_menu__, '/fichinter/list.php?mainmenu=commercial&leftmenu=ficheinter', 'Interventions', 0, 'interventions', '$user->rights->ficheinter->lire', '', 2, 8, __ENTITY__); diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index dbc2be872eb..a0b8be128c4 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -1385,10 +1385,10 @@ function get_left_menu_commercial($mainmenu, &$newmenu, $usemenuhider = 1, $left $newmenu->add("/contrat/list.php?leftmenu=contracts", $langs->trans("List"), 1, $user->hasRight('contrat', 'lire')); $newmenu->add("/contrat/services_list.php?leftmenu=contracts", $langs->trans("MenuServices"), 1, $user->hasRight('contrat', 'lire')); if ($usemenuhider || empty($leftmenu) || $leftmenu == "contracts") { - $newmenu->add("/contrat/services_list.php?leftmenu=contracts&mode=0", $langs->trans("MenuInactiveServices"), 2, $user->hasRight('contrat', 'lire')); - $newmenu->add("/contrat/services_list.php?leftmenu=contracts&mode=4", $langs->trans("MenuRunningServices"), 2, $user->hasRight('contrat', 'lire')); - $newmenu->add("/contrat/services_list.php?leftmenu=contracts&mode=4&filter=expired", $langs->trans("MenuExpiredServices"), 2, $user->hasRight('contrat', 'lire')); - $newmenu->add("/contrat/services_list.php?leftmenu=contracts&mode=5", $langs->trans("MenuClosedServices"), 2, $user->hasRight('contrat', 'lire')); + $newmenu->add("/contrat/services_list.php?leftmenu=contracts&search_status=0", $langs->trans("MenuInactiveServices"), 2, $user->hasRight('contrat', 'lire')); + $newmenu->add("/contrat/services_list.php?leftmenu=contracts&search_status=4", $langs->trans("MenuRunningServices"), 2, $user->hasRight('contrat', 'lire')); + $newmenu->add("/contrat/services_list.php?leftmenu=contracts&search_status=4&filter=expired", $langs->trans("MenuExpiredServices"), 2, $user->hasRight('contrat', 'lire')); + $newmenu->add("/contrat/services_list.php?leftmenu=contracts&search_status=5", $langs->trans("MenuClosedServices"), 2, $user->hasRight('contrat', 'lire')); } } From f6ad2c3a7628e73c815bcbe7863d380c1bea5af9 Mon Sep 17 00:00:00 2001 From: hystepik Date: Fri, 27 Jan 2023 11:01:16 +0100 Subject: [PATCH 1057/1128] Fix : php 8.1 warning --- htdocs/compta/paiement/card.php | 4 ++++ htdocs/compta/paiement/list.php | 7 ++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/htdocs/compta/paiement/card.php b/htdocs/compta/paiement/card.php index 073365fa876..14442e6c965 100644 --- a/htdocs/compta/paiement/card.php +++ b/htdocs/compta/paiement/card.php @@ -46,6 +46,10 @@ $action = GETPOST('action', 'aZ09'); $confirm = GETPOST('confirm', 'alpha'); $backtopage = GETPOST('backtopage', 'alpha'); +$socid = GETPOST('socid', 'int'); if ($socid < 0) { + $socid = 0; +} + $object = new Paiement($db); // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context $hookmanager->initHooks(array('paymentcard', 'globalcard')); diff --git a/htdocs/compta/paiement/list.php b/htdocs/compta/paiement/list.php index 658f2c150f1..6db18f6aa55 100644 --- a/htdocs/compta/paiement/list.php +++ b/htdocs/compta/paiement/list.php @@ -513,6 +513,7 @@ foreach ($arrayfields as $column) { $i = 0; $totalarray = array(); +$totalarray['nbfield'] = 0; while ($i < min($num, $limit)) { $objp = $db->fetch_object($resql); @@ -620,7 +621,11 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } $totalarray['pos'][$checkedCount] = 'amount'; - $totalarray['val']['amount'] += $objp->amount; + if (empty($totalarray['val']['amount'])) { + $totalarray['val']['amount'] = $objp->amount; + } else { + $totalarray['val']['amount'] += $objp->amount; + } } // Status From 923e63c8e31bda7139fe3f973c307fb2101ba8da Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 27 Jan 2023 11:05:06 +0100 Subject: [PATCH 1058/1128] Trans --- htdocs/langs/en_US/main.lang | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index 405417d7da6..f22666c4197 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -1220,4 +1220,5 @@ NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or HideOnVCard=Hide %s AddToContacts=Add address to my contacts LastAccess=Last access -UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here \ No newline at end of file +UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here +LastPasswordChangeDate=Last password change date \ No newline at end of file From 9c904236c43998d5b04e828fc2b7b93a9a4e0fcb Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Fri, 27 Jan 2023 11:25:55 +0100 Subject: [PATCH 1059/1128] NEW - Add hook online sign --- htdocs/public/onlinesign/newonlinesign.php | 27 +++++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/htdocs/public/onlinesign/newonlinesign.php b/htdocs/public/onlinesign/newonlinesign.php index c47bbd7f734..c6f11e6b2ac 100644 --- a/htdocs/public/onlinesign/newonlinesign.php +++ b/htdocs/public/onlinesign/newonlinesign.php @@ -156,6 +156,8 @@ if ($source == 'proposal') { httponly_accessforbidden($langs->trans('ErrorBadParameters')." - Bad value for source", 400, 1); } +// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context +$hookmanager->initHooks(array('onlinesign')); /* * Actions @@ -346,10 +348,21 @@ if ($source == 'proposal') { print ''."\n"; // Amount - print ''."\n"; + $amount = ''."\n"; + + // Call Hook formConfirm + $parameters = array('source' => $source); + $reshook = $hookmanager->executeHooks('amountpropalsign', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + if (empty($reshook)) { + $amount .= $hookmanager->resPrint; + } elseif ($reshook > 0) { + $amount = $hookmanager->resPrint; + } + + print $amount; // Object $text = ''.$langs->trans("SignatureProposalRef", $object->ref).''; @@ -457,6 +470,7 @@ if ($source == 'proposal') { $langs->load("fichinter"); $result = $object->fetch_thirdparty($object->socid); + // Proposer print ''."\n"; } +// Call Hook addformsign +$parameters = array('source' => $source); +$reshook = $hookmanager->executeHooks('addformsign', $parameters, $object, $action); // Note that $action and $object may have been modified by hook if (!$found && !$mesg) { $mesg = $langs->transnoentitiesnoconv("ErrorBadParameters"); From 6715cdec0fa4719920148a29627d23c90edfcbba Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Fri, 27 Jan 2023 11:27:25 +0100 Subject: [PATCH 1060/1128] case --- htdocs/public/onlinesign/newonlinesign.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/public/onlinesign/newonlinesign.php b/htdocs/public/onlinesign/newonlinesign.php index c6f11e6b2ac..e5a195471de 100644 --- a/htdocs/public/onlinesign/newonlinesign.php +++ b/htdocs/public/onlinesign/newonlinesign.php @@ -353,9 +353,9 @@ if ($source == 'proposal') { $amount .= ''.price($object->total_ttc, 0, $langs, 1, -1, -1, $conf->currency).''; $amount .= ''."\n"; - // Call Hook formConfirm + // Call Hook amountPropalSign $parameters = array('source' => $source); - $reshook = $hookmanager->executeHooks('amountpropalsign', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + $reshook = $hookmanager->executeHooks('amountPropalSign', $parameters, $object, $action); // Note that $action and $object may have been modified by hook if (empty($reshook)) { $amount .= $hookmanager->resPrint; } elseif ($reshook > 0) { @@ -515,9 +515,9 @@ if ($source == 'proposal') { print ''."\n"; } -// Call Hook addformsign +// Call Hook addFormSign $parameters = array('source' => $source); -$reshook = $hookmanager->executeHooks('addformsign', $parameters, $object, $action); // Note that $action and $object may have been modified by hook +$reshook = $hookmanager->executeHooks('addFormSign', $parameters, $object, $action); // Note that $action and $object may have been modified by hook if (!$found && !$mesg) { $mesg = $langs->transnoentitiesnoconv("ErrorBadParameters"); From c4245e2c05ede1ac4a0d9072e6d0d822542909c6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 27 Jan 2023 11:52:58 +0100 Subject: [PATCH 1061/1128] Prepare use of upgrade.unlock --- htdocs/install/step5.php | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/htdocs/install/step5.php b/htdocs/install/step5.php index 31b086636f2..c516cc70aef 100644 --- a/htdocs/install/step5.php +++ b/htdocs/install/step5.php @@ -368,13 +368,16 @@ if ($action == "set" || empty($action) || preg_match('/upgrade/i', $action)) { if ($action == "set") { if ($success) { if (empty($conf->global->MAIN_VERSION_LAST_UPGRADE) || ($conf->global->MAIN_VERSION_LAST_UPGRADE == DOL_VERSION)) { - // Install is finished + // Install is finished (database is on same version than files) print '
    '.$langs->trans("SystemIsInstalled")."
    "; + // Create install.lock file + // No need for the moment to create it automatically, creation by web assistant means permissions are given + // to the web user, it is better to show a warning to say to create it manually with correct user/permission (not erasable by a web process) $createlock = 0; - if (!empty($force_install_lockinstall) || !empty($conf->global->MAIN_ALWAYS_CREATE_LOCK_AFTER_LAST_UPGRADE)) { - // Install is finished, we create the lock file + // Install is finished, we create the "install.lock" file, so install won't be possible anymore. + // TODO Upgrade will be still be possible if a file "upgrade.unlock" is present $lockfile = DOL_DATA_ROOT.'/install.lock'; $fp = @fopen($lockfile, "w"); if ($fp) { @@ -413,13 +416,14 @@ if ($action == "set") { } elseif (empty($action) || preg_match('/upgrade/i', $action)) { // If upgrade if (empty($conf->global->MAIN_VERSION_LAST_UPGRADE) || ($conf->global->MAIN_VERSION_LAST_UPGRADE == DOL_VERSION)) { - // Upgrade is finished + // Upgrade is finished (database is on same version than files) print 'Configuration '.$langs->trans("SystemIsUpgraded")."
    "; + // Create install.lock file if it does not exists. + // Note: it should always exists. A better solution to allow upgrade will be to add an upgrade.unlock file $createlock = 0; - if (!empty($force_install_lockinstall) || !empty($conf->global->MAIN_ALWAYS_CREATE_LOCK_AFTER_LAST_UPGRADE)) { - // Upgrade is finished, we create the lock file + // Upgrade is finished, we modify the lock file $lockfile = DOL_DATA_ROOT.'/install.lock'; $fp = @fopen($lockfile, "w"); if ($fp) { @@ -436,6 +440,10 @@ if ($action == "set") { print '
    '.$langs->trans("WarningRemoveInstallDir")."
    "; } + // Delete the upgrade.unlock file it it exists + $unlockupgradefile = DOL_DATA_ROOT.'/upgrade.unlock'; + dol_delete_file($unlockupgradefile, 0, 0, 0, null, false, 0); + print "
    "; $morehtml = '
    '; From dfcba305775af1d5fd1fab9515e87a52ee6421c0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 27 Jan 2023 14:06:31 +0100 Subject: [PATCH 1062/1128] FIX Check of date of validity --- htdocs/api/class/api_access.class.php | 18 +++++++------ htdocs/core/lib/security2.lib.php | 3 ++- htdocs/core/login/functions_dolibarr.php | 20 +-------------- htdocs/dav/fileserver.php | 19 +++++++++++--- htdocs/main.inc.php | 23 ++++++++++++----- htdocs/user/class/user.class.php | 32 ++++++++++++++++++++++-- 6 files changed, 76 insertions(+), 39 deletions(-) diff --git a/htdocs/api/class/api_access.class.php b/htdocs/api/class/api_access.class.php index e5cc664fa0e..6874d3faaed 100644 --- a/htdocs/api/class/api_access.class.php +++ b/htdocs/api/class/api_access.class.php @@ -155,17 +155,19 @@ class DolibarrApiAccess implements iAuthenticate throw new RestException(503, 'Error when fetching user. This user has been locked or disabled'); } - $now = dol_now(); - - // Check date start validity - if ($fuser->datestartvalidity && $this->db->jdate($fuser->datestartvalidity) > $now) { - throw new RestException(503, $genericmessageerroruser); - } - // Check date end validity - if ($fuser->dateendvalidity && $this->db->jdate($fuser->dateendvalidity) < dol_get_first_hour($now)) { + // Check if session was unvalidated by a password change + if (($fuser->flagdelsessionsbefore && !empty($_SESSION["dol_logindate"]) && $fuser->flagdelsessionsbefore > $_SESSION["dol_logindate"])) { + // Session is no more valid + dol_syslog("The user has a date for session invalidation = ".$fuser->flagdelsessionsbefore." and a session date = ".$_SESSION["dol_logindate"].". We must invalidate its sessions."); throw new RestException(503, $genericmessageerroruser); } + // Check date validity + if ($fuser->isNotIntoValidityDateRange()) { + // User validity dates are no more valid + dol_syslog("The user login has a validity between [".$fuser->datestartvalidity." and ".$fuser->dateendvalidity."], curren date is ".dol_now()); + throw new RestException(503, $genericmessageerroruser); + } // User seems valid $fuser->getrights(); diff --git a/htdocs/core/lib/security2.lib.php b/htdocs/core/lib/security2.lib.php index f450d390dff..93da106aebd 100644 --- a/htdocs/core/lib/security2.lib.php +++ b/htdocs/core/lib/security2.lib.php @@ -96,7 +96,8 @@ function checkLoginPassEntity($usertotest, $passwordtotest, $entitytotest, $auth // Call function to check user/password $function = 'check_user_password_'.$mode; $login = call_user_func($function, $usertotest, $passwordtotest, $entitytotest, $context); - if ($login && $login != '--bad-login-validity--') { // Login is successfull + if ($login && $login != '--bad-login-validity--') { + // Login is successfull with this method $test = false; // To stop once at first login success $conf->authmode = $mode; // This properties is defined only when logged to say what mode was successfully used /*$dol_tz = GETPOST('tz'); diff --git a/htdocs/core/login/functions_dolibarr.php b/htdocs/core/login/functions_dolibarr.php index 5f4b722ea1c..9b65bf4d877 100644 --- a/htdocs/core/login/functions_dolibarr.php +++ b/htdocs/core/login/functions_dolibarr.php @@ -74,24 +74,6 @@ function check_user_password_dolibarr($usertotest, $passwordtotest, $entitytotes if ($resql) { $obj = $db->fetch_object($resql); if ($obj) { - $now = dol_now(); - // Check date start validity - if ($obj->datestartvalidity && $db->jdate($obj->datestartvalidity) > $now) { - // Load translation files required by the page - $langs->loadLangs(array('main', 'errors')); - $_SESSION["dol_loginmesg"] = $langs->transnoentitiesnoconv("ErrorLoginDateValidity"); - dol_syslog("functions_dolibarr::check_user_password_dolibarr bad datestart validity", LOG_WARNING); - return '--bad-login-validity--'; - } - // Check date end validity - if ($obj->dateendvalidity && $db->jdate($obj->dateendvalidity) < dol_get_first_hour($now)) { - // Load translation files required by the page - $langs->loadLangs(array('main', 'errors')); - $_SESSION["dol_loginmesg"] = $langs->transnoentitiesnoconv("ErrorLoginDateValidity"); - dol_syslog("functions_dolibarr::check_user_password_dolibarr bad date end validity", LOG_WARNING); - return '--bad-login-validity--'; - } - $passclear = $obj->pass; $passcrypted = $obj->pass_crypted; $passtyped = $passwordtotest; @@ -121,7 +103,7 @@ function check_user_password_dolibarr($usertotest, $passwordtotest, $entitytotes if ((!$passcrypted || $passtyped) && ($passclear && ($passtyped == $passclear))) { $passok = true; - dol_syslog("functions_dolibarr::check_user_password_dolibarr Authentification ok - found pass in database"); + dol_syslog("functions_dolibarr::check_user_password_dolibarr Authentification ok - found old pass in database", LOG_WARNING); } } diff --git a/htdocs/dav/fileserver.php b/htdocs/dav/fileserver.php index 7abe3f2bacf..15d9cd1764f 100644 --- a/htdocs/dav/fileserver.php +++ b/htdocs/dav/fileserver.php @@ -92,8 +92,7 @@ $tmpDir = $conf->dav->multidir_output[$entity]; // We need root dir, not a dir t // Authentication callback function $authBackend = new \Sabre\DAV\Auth\Backend\BasicCallBack(function ($username, $password) { - global $user; - global $conf; + global $user, $conf; global $dolibarr_main_authentication, $dolibarr_auto_user; if (empty($user->login)) { @@ -101,7 +100,7 @@ $authBackend = new \Sabre\DAV\Auth\Backend\BasicCallBack(function ($username, $p return false; } if ($user->socid > 0) { - dol_syslog("Failed to authenticate to DAV, use is an external user", LOG_WARNING); + dol_syslog("Failed to authenticate to DAV, user is an external user", LOG_WARNING); return false; } if ($user->login != $username) { @@ -132,6 +131,20 @@ $authBackend = new \Sabre\DAV\Auth\Backend\BasicCallBack(function ($username, $p return false; } + // Check if session was unvalidated by a password change + if (($user->flagdelsessionsbefore && !empty($_SESSION["dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION["dol_logindate"])) { + // Session is no more valid + dol_syslog("The user has a date for session invalidation = ".$user->flagdelsessionsbefore." and a session date = ".$_SESSION["dol_logindate"].". We must invalidate its sessions."); + return false; + } + + // Check date validity + if ($user->isNotIntoValidityDateRange()) { + // User validity dates are no more valid + dol_syslog("The user login has a validity between [".$user->datestartvalidity." and ".$user->dateendvalidity."], curren date is ".dol_now()); + return false; + } + return true; }); diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 115be3cf0cf..24ce10ea7c1 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -879,8 +879,8 @@ if (!defined('NOLOGIN')) { exit; } - $resultFetchUser = $user->fetch('', $login, '', 1, ($entitytotest > 0 ? $entitytotest : -1)); // login was retrieved previously when checking password. - if ($resultFetchUser <= 0) { + $resultFetchUser = $user->fetch('', $login, '', 1, ($entitytotest > 0 ? $entitytotest : -1)); // value for $login was retrieved previously when checking password. + if ($resultFetchUser <= 0 || $user->isNotIntoValidityDateRange()) { dol_syslog('User not found, connexion refused'); session_destroy(); session_set_cookie_params(0, '/', null, (empty($dolibarr_main_force_https) ? false : true), true); // Add tag secure and httponly on session cookie @@ -894,11 +894,17 @@ if (!defined('NOLOGIN')) { $_SESSION["dol_loginmesg"] = $langs->transnoentitiesnoconv("ErrorCantLoadUserFromDolibarrDatabase", $login); $user->trigger_mesg = 'ErrorCantLoadUserFromDolibarrDatabase - login='.$login; - } - if ($resultFetchUser < 0) { + } elseif ($resultFetchUser < 0) { $_SESSION["dol_loginmesg"] = $user->error; $user->trigger_mesg = $user->error; + } else { + // Load translation files required by the page + $langs->loadLangs(array('main', 'errors')); + + $_SESSION["dol_loginmesg"] = $langs->transnoentitiesnoconv("ErrorLoginDateValidity"); + + $user->trigger_mesg = $langs->trans("ErrorLoginDateValidity").' - login='.$login; } // Call trigger @@ -943,13 +949,18 @@ if (!defined('NOLOGIN')) { dol_syslog("- This is an already logged session. _SESSION['dol_login']=".$login." _SESSION['dol_entity']=".$entity, LOG_DEBUG); $resultFetchUser = $user->fetch('', $login, '', 1, ($entity > 0 ? $entity : -1)); - if ($resultFetchUser <= 0 || ($user->flagdelsessionsbefore && !empty($_SESSION["dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION["dol_logindate"])) { + if ($resultFetchUser <= 0 + || ($user->flagdelsessionsbefore && !empty($_SESSION["dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION["dol_logindate"]) + || ($user->isNotIntoValidtyDateRange())) { if ($resultFetchUser <= 0) { // Account has been removed after login dol_syslog("Can't load user even if session logged. _SESSION['dol_login']=".$login, LOG_WARNING); - } else { + } elseif ($user->flagdelsessionsbefore && !empty($_SESSION["dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION["dol_logindate"]) { // Session is no more valid dol_syslog("The user has a date for session invalidation = ".$user->flagdelsessionsbefore." and a session date = ".$_SESSION["dol_logindate"].". We must invalidate its sessions."); + } else { + // User validity dates are no more valid + dol_syslog("The user login has a validity between [".$user->datestartvalidity." and ".$user->dateendvalidity."], curren date is ".dol_now()); } session_destroy(); session_set_cookie_params(0, '/', null, (empty($dolibarr_main_force_https) ? false : true), true); // Add tag secure and httponly on session cookie diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index b32c23ab7fc..f8d437d4fa0 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -1885,8 +1885,12 @@ class User extends CommonObject $this->employee = ($this->employee > 0 ? $this->employee : 0); $this->login = trim((string) $this->login); $this->gender = trim((string) $this->gender); + $this->pass = trim((string) $this->pass); $this->api_key = trim((string) $this->api_key); + $this->datestartvalidity = empty($this->datestartvalidity) ? '' : $this->datestartvalidity; + $this->dateendvalidity = empty($this->dateendvalidity) ? '' : $this->dateendvalidity; + $this->address = trim((string) $this->address); $this->zip = trim((string) $this->zip); $this->town = trim((string) $this->town); @@ -1911,8 +1915,7 @@ class User extends CommonObject $this->color = trim((string) $this->color); $this->dateemployment = empty($this->dateemployment) ? '' : $this->dateemployment; $this->dateemploymentend = empty($this->dateemploymentend) ? '' : $this->dateemploymentend; - $this->datestartvalidity = empty($this->datestartvalidity) ? '' : $this->datestartvalidity; - $this->dateendvalidity = empty($this->dateendvalidity) ? '' : $this->dateendvalidity; + $this->birth = empty($this->birth) ? '' : $this->birth; $this->fk_warehouse = (int) $this->fk_warehouse; @@ -2695,6 +2698,31 @@ class User extends CommonObject } + /** + * Return a link with photo + * Use this->id,this->photo + * + * @return int 0=No more valid, >0 if OK + */ + public function isNotIntoValidtyDateRange() + { + include_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; + + $now = dol_now(); + + // Check date start validity + if ($this->datestartvalidity && $this->datestartvalidity > dol_get_last_hour($now)) { + return 0; + } + // Check date end validity + if ($this->dateendvalidity && $this->dateendvalidity < dol_get_first_hour($now)) { + return 0; + } + + return 1; + } + + /** * Return a link with photo * Use this->id,this->photo From e7c63bfe1ba64c520bf382f62bb467ba3e8265cf Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 27 Jan 2023 14:27:51 +0100 Subject: [PATCH 1063/1128] FIX Check of date of validity --- htdocs/langs/en_US/errors.lang | 2 +- htdocs/main.inc.php | 7 +++++-- htdocs/user/class/user.class.php | 12 +++++++----- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang index b779c901b54..240dd7c4c41 100644 --- a/htdocs/langs/en_US/errors.lang +++ b/htdocs/langs/en_US/errors.lang @@ -303,7 +303,7 @@ ErrorValueForTooLow=Value for %s is too low ErrorValueCantBeNull=Value for %s can't be null ErrorDateOfMovementLowerThanDateOfFileTransmission=The date of the bank transaction can't be lower than the date of the file transmission ErrorTooMuchFileInForm=Too much files in form, the maximum number is %s file(s) -ErrorSessionInvalidatedAfterPasswordChange=The session was invalidated after a password change. Please relogin. +ErrorSessionInvalidatedAfterPasswordChange=The session was invalidated after a password or dates of validity change. Please relogin. # Warnings WarningParamUploadMaxFileSizeHigherThanPostMaxSize=Your PHP parameter upload_max_filesize (%s) is higher than PHP parameter post_max_size (%s). This is not a consistent setup. diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 24ce10ea7c1..df62eea68c4 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -881,7 +881,7 @@ if (!defined('NOLOGIN')) { $resultFetchUser = $user->fetch('', $login, '', 1, ($entitytotest > 0 ? $entitytotest : -1)); // value for $login was retrieved previously when checking password. if ($resultFetchUser <= 0 || $user->isNotIntoValidityDateRange()) { - dol_syslog('User not found, connexion refused'); + dol_syslog('User not found or not valid, connexion refused'); session_destroy(); session_set_cookie_params(0, '/', null, (empty($dolibarr_main_force_https) ? false : true), true); // Add tag secure and httponly on session cookie session_name($sessionname); @@ -949,9 +949,12 @@ if (!defined('NOLOGIN')) { dol_syslog("- This is an already logged session. _SESSION['dol_login']=".$login." _SESSION['dol_entity']=".$entity, LOG_DEBUG); $resultFetchUser = $user->fetch('', $login, '', 1, ($entity > 0 ? $entity : -1)); + + //var_dump(dol_print_date($user->flagdelsessionsbefore, 'dayhour', 'gmt')." ".dol_print_date($_SESSION["dol_logindate"], 'dayhour', 'gmt')); + if ($resultFetchUser <= 0 || ($user->flagdelsessionsbefore && !empty($_SESSION["dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION["dol_logindate"]) - || ($user->isNotIntoValidtyDateRange())) { + || ($user->isNotIntoValidityDateRange())) { if ($resultFetchUser <= 0) { // Account has been removed after login dol_syslog("Can't load user even if session logged. _SESSION['dol_login']=".$login, LOG_WARNING); diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index f8d437d4fa0..2893378bdd9 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -2702,24 +2702,26 @@ class User extends CommonObject * Return a link with photo * Use this->id,this->photo * - * @return int 0=No more valid, >0 if OK + * @return int 0=Valid, >0 if not valid */ - public function isNotIntoValidtyDateRange() + public function isNotIntoValidityDateRange() { include_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; $now = dol_now(); + //dol_syslog("isNotIntoValidityDateRange ".$this->datestartvalidity); + // Check date start validity if ($this->datestartvalidity && $this->datestartvalidity > dol_get_last_hour($now)) { - return 0; + return 1; } // Check date end validity if ($this->dateendvalidity && $this->dateendvalidity < dol_get_first_hour($now)) { - return 0; + return 1; } - return 1; + return 0; } From 0765a1196f421c4aeff269c416985ea4d61ddf00 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 27 Jan 2023 14:27:51 +0100 Subject: [PATCH 1064/1128] FIX Check of date of validity --- htdocs/api/class/api_access.class.php | 9 +++++++-- htdocs/dav/fileserver.php | 7 +++++++ htdocs/langs/en_US/errors.lang | 2 +- htdocs/main.inc.php | 11 +++++++++-- htdocs/user/class/user.class.php | 12 +++++++----- 5 files changed, 31 insertions(+), 10 deletions(-) diff --git a/htdocs/api/class/api_access.class.php b/htdocs/api/class/api_access.class.php index 6874d3faaed..541682101c6 100644 --- a/htdocs/api/class/api_access.class.php +++ b/htdocs/api/class/api_access.class.php @@ -144,6 +144,7 @@ class DolibarrApiAccess implements iAuthenticate throw new RestException(503, 'Error when searching login user from api key'); } + $genericmessageerroruser = 'Error user not valid (not found or bad status or bad validity dates) (conf->entity='.$conf->entity.')'; $fuser = new User($this->db); @@ -151,8 +152,12 @@ class DolibarrApiAccess implements iAuthenticate if ($result <= 0) { throw new RestException(503, $genericmessageerroruser); } - if ($fuser->statut == 0) { - throw new RestException(503, 'Error when fetching user. This user has been locked or disabled'); + + // Check if user status is enabled + if ($fuser->statut != $fuser::STATUS_ENABLED) { + // Status is disabled + dol_syslog("The user has been disabled"); + throw new RestException(503, $genericmessageerroruser); } // Check if session was unvalidated by a password change diff --git a/htdocs/dav/fileserver.php b/htdocs/dav/fileserver.php index 15d9cd1764f..af23fde5fff 100644 --- a/htdocs/dav/fileserver.php +++ b/htdocs/dav/fileserver.php @@ -131,6 +131,13 @@ $authBackend = new \Sabre\DAV\Auth\Backend\BasicCallBack(function ($username, $p return false; } + // Check if user status is enabled + if ($user->statut != $user::STATUS_ENABLED) { + // Status is disabled + dol_syslog("The user has been disabled."); + return false; + } + // Check if session was unvalidated by a password change if (($user->flagdelsessionsbefore && !empty($_SESSION["dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION["dol_logindate"])) { // Session is no more valid diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang index b779c901b54..240dd7c4c41 100644 --- a/htdocs/langs/en_US/errors.lang +++ b/htdocs/langs/en_US/errors.lang @@ -303,7 +303,7 @@ ErrorValueForTooLow=Value for %s is too low ErrorValueCantBeNull=Value for %s can't be null ErrorDateOfMovementLowerThanDateOfFileTransmission=The date of the bank transaction can't be lower than the date of the file transmission ErrorTooMuchFileInForm=Too much files in form, the maximum number is %s file(s) -ErrorSessionInvalidatedAfterPasswordChange=The session was invalidated after a password change. Please relogin. +ErrorSessionInvalidatedAfterPasswordChange=The session was invalidated after a password or dates of validity change. Please relogin. # Warnings WarningParamUploadMaxFileSizeHigherThanPostMaxSize=Your PHP parameter upload_max_filesize (%s) is higher than PHP parameter post_max_size (%s). This is not a consistent setup. diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 24ce10ea7c1..8a4efc8466b 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -881,7 +881,7 @@ if (!defined('NOLOGIN')) { $resultFetchUser = $user->fetch('', $login, '', 1, ($entitytotest > 0 ? $entitytotest : -1)); // value for $login was retrieved previously when checking password. if ($resultFetchUser <= 0 || $user->isNotIntoValidityDateRange()) { - dol_syslog('User not found, connexion refused'); + dol_syslog('User not found or not valid, connexion refused'); session_destroy(); session_set_cookie_params(0, '/', null, (empty($dolibarr_main_force_https) ? false : true), true); // Add tag secure and httponly on session cookie session_name($sessionname); @@ -949,15 +949,22 @@ if (!defined('NOLOGIN')) { dol_syslog("- This is an already logged session. _SESSION['dol_login']=".$login." _SESSION['dol_entity']=".$entity, LOG_DEBUG); $resultFetchUser = $user->fetch('', $login, '', 1, ($entity > 0 ? $entity : -1)); + + //var_dump(dol_print_date($user->flagdelsessionsbefore, 'dayhour', 'gmt')." ".dol_print_date($_SESSION["dol_logindate"], 'dayhour', 'gmt')); + if ($resultFetchUser <= 0 || ($user->flagdelsessionsbefore && !empty($_SESSION["dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION["dol_logindate"]) - || ($user->isNotIntoValidtyDateRange())) { + || ($user->status != $user::STATUS_ENABLED) + || ($user->isNotIntoValidityDateRange())) { if ($resultFetchUser <= 0) { // Account has been removed after login dol_syslog("Can't load user even if session logged. _SESSION['dol_login']=".$login, LOG_WARNING); } elseif ($user->flagdelsessionsbefore && !empty($_SESSION["dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION["dol_logindate"]) { // Session is no more valid dol_syslog("The user has a date for session invalidation = ".$user->flagdelsessionsbefore." and a session date = ".$_SESSION["dol_logindate"].". We must invalidate its sessions."); + } elseif ($user->status != $user::STATUS_ENABLED) { + // User is not enabled + dol_syslog("The user login is disabled"); } else { // User validity dates are no more valid dol_syslog("The user login has a validity between [".$user->datestartvalidity." and ".$user->dateendvalidity."], curren date is ".dol_now()); diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index f8d437d4fa0..2893378bdd9 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -2702,24 +2702,26 @@ class User extends CommonObject * Return a link with photo * Use this->id,this->photo * - * @return int 0=No more valid, >0 if OK + * @return int 0=Valid, >0 if not valid */ - public function isNotIntoValidtyDateRange() + public function isNotIntoValidityDateRange() { include_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; $now = dol_now(); + //dol_syslog("isNotIntoValidityDateRange ".$this->datestartvalidity); + // Check date start validity if ($this->datestartvalidity && $this->datestartvalidity > dol_get_last_hour($now)) { - return 0; + return 1; } // Check date end validity if ($this->dateendvalidity && $this->dateendvalidity < dol_get_first_hour($now)) { - return 0; + return 1; } - return 1; + return 0; } From 9ecd2c4beef7af17e3e029e05a12827cb12c63b1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 27 Jan 2023 14:47:43 +0100 Subject: [PATCH 1065/1128] Trans --- htdocs/langs/en_US/errors.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang index 240dd7c4c41..50d5c0e90d7 100644 --- a/htdocs/langs/en_US/errors.lang +++ b/htdocs/langs/en_US/errors.lang @@ -303,7 +303,7 @@ ErrorValueForTooLow=Value for %s is too low ErrorValueCantBeNull=Value for %s can't be null ErrorDateOfMovementLowerThanDateOfFileTransmission=The date of the bank transaction can't be lower than the date of the file transmission ErrorTooMuchFileInForm=Too much files in form, the maximum number is %s file(s) -ErrorSessionInvalidatedAfterPasswordChange=The session was invalidated after a password or dates of validity change. Please relogin. +ErrorSessionInvalidatedAfterPasswordChange=The session was been invalidated following a change of password, status or dates of validity. Please relogin. # Warnings WarningParamUploadMaxFileSizeHigherThanPostMaxSize=Your PHP parameter upload_max_filesize (%s) is higher than PHP parameter post_max_size (%s). This is not a consistent setup. From 2a104af20e111b7c92bbd9e7e375a2b2bc3cee14 Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Fri, 27 Jan 2023 15:11:14 +0100 Subject: [PATCH 1066/1128] Cop --- htdocs/public/onlinesign/newonlinesign.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/public/onlinesign/newonlinesign.php b/htdocs/public/onlinesign/newonlinesign.php index e5a195471de..cd793a91bfc 100644 --- a/htdocs/public/onlinesign/newonlinesign.php +++ b/htdocs/public/onlinesign/newonlinesign.php @@ -2,6 +2,7 @@ /* Copyright (C) 2001-2002 Rodolphe Quiedeville * Copyright (C) 2006-2017 Laurent Destailleur * Copyright (C) 2009-2012 Regis Houssin + * Copyright (C) 2023 anthony Berton * * 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 From 791a69dd09b8c487f57ce4b7175f22f68355e732 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sat, 28 Jan 2023 04:48:55 +0100 Subject: [PATCH 1067/1128] FIX Accountancy - Quadra export --- .../class/accountancyexport.class.php | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/htdocs/accountancy/class/accountancyexport.class.php b/htdocs/accountancy/class/accountancyexport.class.php index 73035c55d5d..2215ed1352e 100644 --- a/htdocs/accountancy/class/accountancyexport.class.php +++ b/htdocs/accountancy/class/accountancyexport.class.php @@ -5,7 +5,7 @@ * Copyright (C) 2015 Florian Henry * Copyright (C) 2015 Raphaël Doursenaud * Copyright (C) 2016 Pierre-Henry Favre - * Copyright (C) 2016-2021 Alexandre Spangaro + * Copyright (C) 2016-2023 Alexandre Spangaro * Copyright (C) 2013-2017 Olivier Geffroy * Copyright (C) 2017 Elarifr. Ari Elbaz * Copyright (C) 2017-2019 Frédéric France @@ -518,7 +518,7 @@ class AccountancyExport /** * Export format : Quadratus (Format ASCII) * Format since 2015 compatible QuadraCOMPTA - * Last review for this format : 2021/09/13 Alexandre Spangaro (aspangaro@open-dsi.fr) + * Last review for this format : 2023/01/28 Alexandre Spangaro (aspangaro@open-dsi.fr) * * Help : https://docplayer.fr/20769649-Fichier-d-entree-ascii-dans-quadracompta.html * In QuadraCompta | Use menu : "Outils" > "Suivi des dossiers" > "Import ASCII(Compta)" @@ -536,6 +536,14 @@ class AccountancyExport // $date_ecriture = dol_print_date(dol_now(), $conf->global->ACCOUNTING_EXPORT_DATE); // format must be ddmmyy // $date_ecriture = dol_print_date(time(), $conf->global->ACCOUNTING_EXPORT_DATE); // format must be ddmmyy foreach ($TData as $data) { + // Clean some data + $data->doc_ref = dol_string_unaccent($data->doc_ref); + $data->label_operation = dol_string_unaccent($data->label_operation); + $data->numero_compte = dol_string_unaccent($data->numero_compte); + $data->label_compte = dol_string_unaccent($data->label_compte); + $data->subledger_account = dol_string_unaccent($data->subledger_account); + $data->subledger_label = dol_string_unaccent($data->subledger_label); + $code_compta = $data->numero_compte; if (!empty($data->subledger_account)) { $code_compta = $data->subledger_account; @@ -567,9 +575,9 @@ class AccountancyExport if ($data->doc_type == 'customer_invoice') { $Tab['type_compte'] = 'C'; } elseif ($data->doc_type == 'supplier_invoice') { - $Tab['coll_compte'] = 'F'; + $Tab['type_compte'] = 'F'; } else { - $Tab['coll_compte'] = 'G'; + $Tab['type_compte'] = 'G'; } $Tab['filler3'] = str_repeat(' ', 235); @@ -590,7 +598,7 @@ class AccountancyExport //$Tab['date_ecriture'] = $date_ecriture; $Tab['date_ecriture'] = dol_print_date($data->doc_date, '%d%m%y'); $Tab['filler'] = ' '; - $Tab['libelle_ecriture'] = str_pad(self::trunc(dol_string_unaccent($data->doc_ref).' '.dol_string_unaccent($data->label_operation), 20), 20); + $Tab['libelle_ecriture'] = str_pad(self::trunc($data->doc_ref.' '.$data->label_operation, 20), 20); // Credit invoice - invert sens /* @@ -640,8 +648,8 @@ class AccountancyExport // TODO: we should filter more than only accent to avoid wrong line size // TODO: remove invoice number doc_ref in libelle, // TODO: we should offer an option for customer to build the libelle using invoice number / name / date in accounting software - //$Tab['libelle_ecriture2'] = str_pad(self::trunc(dol_string_unaccent($data->doc_ref) . ' ' . dol_string_unaccent($data->label_operation), 30), 30); - $Tab['libelle_ecriture2'] = str_pad(self::trunc(dol_string_unaccent($data->label_operation), 30), 30); + //$Tab['libelle_ecriture2'] = str_pad(self::trunc($data->doc_ref . ' ' . $data->label_operation, 30), 30); + $Tab['libelle_ecriture2'] = str_pad(self::trunc($data->label_operation, 30), 30); $Tab['codetva'] = str_repeat(' ', 2); // We need to keep the 10 lastest number of invoice doc_ref not the beginning part that is the unusefull almost same part From a27642cbfe91dd09627af0ab7600e9d5602aedf7 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 28 Jan 2023 10:32:07 +0100 Subject: [PATCH 1068/1128] better comment --- htdocs/core/class/commondocgenerator.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/commondocgenerator.class.php b/htdocs/core/class/commondocgenerator.class.php index b4eddcc252f..dda475e8c89 100644 --- a/htdocs/core/class/commondocgenerator.class.php +++ b/htdocs/core/class/commondocgenerator.class.php @@ -1279,7 +1279,7 @@ abstract class CommonDocGenerator $extrafieldOptionsKey = $extrafieldsKeyPrefix.$extrafieldKey; - // Load extrafiels if not allready does + // Load extra fields if they haven't been loaded already. if (empty($this->extrafieldsCache)) { $this->extrafieldsCache = new ExtraFields($this->db); } @@ -1605,7 +1605,7 @@ abstract class CommonDocGenerator return 0; } - // Load extrafiels if not allready does + // Load extra fields if they haven't been loaded already. if (empty($this->extrafieldsCache)) { $this->extrafieldsCache = new ExtraFields($this->db); } From 6cfe70dfe5144b07ef2c63bd6e74a96c12bcc9e9 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 28 Jan 2023 10:36:34 +0100 Subject: [PATCH 1069/1128] fix : Warning: Undefined array key label --- htdocs/core/class/commondocgenerator.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/commondocgenerator.class.php b/htdocs/core/class/commondocgenerator.class.php index dda475e8c89..9d18fccf423 100644 --- a/htdocs/core/class/commondocgenerator.class.php +++ b/htdocs/core/class/commondocgenerator.class.php @@ -1615,7 +1615,7 @@ abstract class CommonDocGenerator $extrafields = $this->extrafieldsCache; - if (!empty($extrafields->attributes[$object->table_element]) && is_array($extrafields->attributes[$object->table_element]['label'])) { + if (!empty($extrafields->attributes[$object->table_element]) && is_array($extrafields->attributes[$object->table_element]) && array_key_exists('label', $extrafields->attributes[$object->table_element]) && is_array($extrafields->attributes[$object->table_element]['label'])) { foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $label) { // Dont display separator yet even is set to be displayed (not compatible yet) if ($extrafields->attributes[$object->table_element]['type'][$key] == 'separate') { From d3b1ee367ac0dec93e5d5be52a6f2b7a40500ff3 Mon Sep 17 00:00:00 2001 From: Eric Seigne Date: Sat, 28 Jan 2023 14:27:45 +0100 Subject: [PATCH 1070/1128] fix #23716 : handle hookmanagers returns --- htdocs/public/payment/newpayment.php | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/htdocs/public/payment/newpayment.php b/htdocs/public/payment/newpayment.php index 9cecbc90885..69ce8977030 100644 --- a/htdocs/public/payment/newpayment.php +++ b/htdocs/public/payment/newpayment.php @@ -212,6 +212,11 @@ $parameters = [ 'validpaymentmethod' => &$validpaymentmethod ]; $reshook = $hookmanager->executeHooks('doValidatePayment', $parameters, $object, $action); +if ($reshook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); +} elseif ($reshook > 0) { + print $hookmanager->resPrint; +} // Check security token $valid = true; @@ -1674,6 +1679,12 @@ if ($action != 'dopayment') 'object' => $object ]; $reshook = $hookmanager->executeHooks('doCheckStatus', $parameters, $object, $action); + if ($reshook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + } elseif ($reshook > 0) { + print $hookmanager->resPrint; + } + if ($source == 'order' && $object->billed) { print '

    '.$langs->trans("OrderBilled").''; @@ -1699,6 +1710,12 @@ if ($action != 'dopayment') 'paymentmethod' => $paymentmethod ]; $reshook = $hookmanager->executeHooks('doAddButton', $parameters, $object, $action); + if ($reshook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + } elseif ($reshook > 0) { + print $hookmanager->resPrint; + } + if ((empty($paymentmethod) || $paymentmethod == 'paybox') && !empty($conf->paybox->enabled)) { print '
    '; @@ -2299,9 +2316,13 @@ if (preg_match('/^dopayment/', $action)) // If we choosed/click on the payment 'dopayment' => GETPOST('dopayment', 'alpha') ]; $reshook = $hookmanager->executeHooks('doPayment', $parameters, $object, $action); + if ($reshook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + } elseif ($reshook > 0) { + print $hookmanager->resPrint; + } } - htmlPrintOnlinePaymentFooter($mysoc, $langs, 1, $suffix, $object); llxFooter('', 'public'); From f4bfe865214047ebdec4deefb901469e9f2b4016 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 28 Jan 2023 17:48:43 +0100 Subject: [PATCH 1071/1128] css --- htdocs/product/class/product.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index d464871941a..2a1ac8dc932 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -515,7 +515,7 @@ class Product extends CommonObject 'rowid' => array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>1, 'visible'=>-2, 'notnull'=>1, 'index'=>1, 'position'=>1, 'comment'=>'Id'), 'ref' =>array('type'=>'varchar(128)', 'label'=>'Ref', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'showoncombobox'=>1, 'index'=>1, 'position'=>10, 'searchall'=>1, 'comment'=>'Reference of object'), 'entity' =>array('type'=>'integer', 'label'=>'Entity', 'enabled'=>1, 'visible'=>0, 'default'=>1, 'notnull'=>1, 'index'=>1, 'position'=>5), - 'label' =>array('type'=>'varchar(255)', 'label'=>'Label', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'showoncombobox'=>2, 'position'=>15), + 'label' =>array('type'=>'varchar(255)', 'label'=>'Label', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'showoncombobox'=>2, 'position'=>15, 'csslist'=>'tdoverflowmax250'), 'barcode' =>array('type'=>'varchar(255)', 'label'=>'Barcode', 'enabled'=>'isModEnabled("barcode")', 'position'=>20, 'visible'=>-1, 'showoncombobox'=>3), 'fk_barcode_type' => array('type'=>'integer', 'label'=>'BarcodeType', 'enabled'=>'1', 'position'=>21, 'notnull'=>0, 'visible'=>-1,), 'note_public' =>array('type'=>'html', 'label'=>'NotePublic', 'enabled'=>1, 'visible'=>0, 'position'=>61), From a2a18ffb7173f05befdab55ebe8e827df39af969 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 28 Jan 2023 18:35:01 +0100 Subject: [PATCH 1072/1128] Trans --- htdocs/langs/en_US/mrp.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/langs/en_US/mrp.lang b/htdocs/langs/en_US/mrp.lang index 6bdea0cc951..82cf7c38012 100644 --- a/htdocs/langs/en_US/mrp.lang +++ b/htdocs/langs/en_US/mrp.lang @@ -102,6 +102,7 @@ NbOperatorsRequired=Number of operators required THMOperatorEstimated=Estimated operator THM THMMachineEstimated=Estimated machine THM WorkstationType=Workstation type +DefaultWorkstation=Default workstation Human=Human Machine=Machine HumanMachine=Human / Machine From da3e228504bb3444c5e29af99cfd9159d95d536f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Sat, 28 Jan 2023 18:45:37 +0100 Subject: [PATCH 1073/1128] input is too small --- htdocs/admin/mails_senderprofile_list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/admin/mails_senderprofile_list.php b/htdocs/admin/mails_senderprofile_list.php index 95f57d5dfc5..a73b899dd00 100644 --- a/htdocs/admin/mails_senderprofile_list.php +++ b/htdocs/admin/mails_senderprofile_list.php @@ -416,7 +416,7 @@ if ($action != 'create') { print '
    '; print ''; + print ''; print ''; print ''; + print ''; print ''; print ''; +print ''; print ''; print '
    '.$langs->trans("ListOfExpiredServices").' '.$num.'
    '.$langs->trans("ListOfExpiredServices").' '.$num.'
    '.$langs->trans("Amount"); - print ''; - print ''.price($object->total_ttc, 0, $langs, 1, -1, -1, $conf->currency).''; - print '
    '.$langs->trans("Amount"); + $amount .= ''; + $amount .= ''.price($object->total_ttc, 0, $langs, 1, -1, -1, $conf->currency).''; + $amount .= '
    '.$langs->trans("Proposer"); print ''; @@ -496,13 +510,14 @@ if ($source == 'proposal') { print $langs->trans("DownloadDocument").''; } } - - print ''; print ''; print '
    '.$langs->trans("Label").'
    '.$langs->trans("Email").''; print img_picto('', 'email', 'class="pictofixedwidth"'); - print '
    '.$langs->trans("Signature").''; require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; $doleditor = new DolEditor('signature', GETPOST('signature'), '', 138, 'dolibarr_notes', 'In', true, true, empty($conf->global->FCKEDITOR_ENABLE_USERSIGN) ? 0 : 1, ROWS_4, '90%'); From 474f5d74a2262b8d3937f5cd398269e5ba038eae Mon Sep 17 00:00:00 2001 From: notmarrco Date: Sun, 29 Jan 2023 01:31:44 +0100 Subject: [PATCH 1074/1128] feat(invoice): Add bankline id to listOfPayments fields --- htdocs/core/class/commoninvoice.class.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/htdocs/core/class/commoninvoice.class.php b/htdocs/core/class/commoninvoice.class.php index d1eb324cc7f..dd0ec988062 100644 --- a/htdocs/core/class/commoninvoice.class.php +++ b/htdocs/core/class/commoninvoice.class.php @@ -332,6 +332,7 @@ abstract class CommonInvoice extends CommonObject $field = 'fk_facture'; $field2 = 'fk_paiement'; $field3 = ', p.ref_ext'; + $field4 = ', p.fk_bank'; // Bank line id $sharedentity = 'facture'; if ($this->element == 'facture_fourn' || $this->element == 'invoice_supplier') { $table = 'paiementfourn_facturefourn'; @@ -342,7 +343,7 @@ abstract class CommonInvoice extends CommonObject $sharedentity = 'facture_fourn'; } - $sql = "SELECT p.ref, pf.amount, pf.multicurrency_amount, p.fk_paiement, p.datep, p.num_paiement as num, t.code".$field3; + $sql = "SELECT p.ref, pf.amount, pf.multicurrency_amount, p.fk_paiement, p.datep, p.num_paiement as num, t.code".$field3 . $field4; $sql .= " FROM ".$this->db->prefix().$table." as pf, ".$this->db->prefix().$table2." as p, ".$this->db->prefix()."c_paiement as t"; $sql .= " WHERE pf.".$field." = ".((int) $this->id); $sql .= " AND pf.".$field2." = p.rowid"; @@ -363,6 +364,9 @@ abstract class CommonInvoice extends CommonObject if (!empty($field3)) { $tmp['ref_ext'] = $obj->ref_ext; } + if (!empty($field4)) { + $tmp['fk_bank_line'] = $obj->fk_bank; + } $retarray[] = $tmp; $i++; } From b963ddb0bc27daae5e2cb6e1d13c9720a6b83386 Mon Sep 17 00:00:00 2001 From: daraelmin Date: Sun, 29 Jan 2023 14:33:13 +0100 Subject: [PATCH 1075/1128] Fix PHP8 Warning --- htdocs/core/modules/project/task/mod_task_universal.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/htdocs/core/modules/project/task/mod_task_universal.php b/htdocs/core/modules/project/task/mod_task_universal.php index 6de02dcaf99..ba61a0363df 100644 --- a/htdocs/core/modules/project/task/mod_task_universal.php +++ b/htdocs/core/modules/project/task/mod_task_universal.php @@ -128,8 +128,7 @@ class mod_task_universal extends ModeleNumRefTask require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; - // On defini critere recherche compteur - $mask = $conf->global->PROJECT_TASK_UNIVERSAL_MASK; + $mask = !empty($conf->global->PROJECT_TASK_UNIVERSAL_MASK) ? $conf->global->PROJECT_TASK_UNIVERSAL_MASK : ''; if (!$mask) { $this->error = 'NotConfigured'; From b0332730a6e9ac64f4757c043fa2baced81278dd Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 29 Jan 2023 18:45:09 +0100 Subject: [PATCH 1076/1128] Fix count --- htdocs/contrat/list.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/contrat/list.php b/htdocs/contrat/list.php index 31d489c4b1f..38c37c1389e 100644 --- a/htdocs/contrat/list.php +++ b/htdocs/contrat/list.php @@ -469,6 +469,7 @@ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) { } else { /* The fast and low memory method to get and count full list converts the sql into a sql count */ $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql); + $sqlforcount = preg_replace('/LEFT JOIN '.MAIN_DB_PREFIX.'contratdet as cd ON c.rowid = cd.fk_contrat /', '', $sqlforcount); $sqlforcount = preg_replace('/GROUP BY.*$/', '', $sqlforcount); $resql = $db->query($sqlforcount); From 22ffef7b4e2b2e1fa40863256167eb35b391b91f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 29 Jan 2023 20:25:42 +0100 Subject: [PATCH 1077/1128] Update card.php --- htdocs/compta/paiement/card.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/compta/paiement/card.php b/htdocs/compta/paiement/card.php index 14442e6c965..36f14dca2fc 100644 --- a/htdocs/compta/paiement/card.php +++ b/htdocs/compta/paiement/card.php @@ -46,7 +46,8 @@ $action = GETPOST('action', 'aZ09'); $confirm = GETPOST('confirm', 'alpha'); $backtopage = GETPOST('backtopage', 'alpha'); -$socid = GETPOST('socid', 'int'); if ($socid < 0) { +$socid = GETPOST('socid', 'int'); +if ($socid < 0) { $socid = 0; } From 244239d44db2104570f37dcc13016a95d51174e9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 29 Jan 2023 20:52:24 +0100 Subject: [PATCH 1078/1128] Doc --- dev/dolibarr_changes.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/dev/dolibarr_changes.txt b/dev/dolibarr_changes.txt index 461db52f959..e12c237e28e 100644 --- a/dev/dolibarr_changes.txt +++ b/dev/dolibarr_changes.txt @@ -209,6 +209,11 @@ with with foreach ($value[1] as $k => $v) { +* Fix by replacing + if ($res[0] == PDF_TYPE_OBJECT) +with + if ($res && $res[0] == PDF_TYPE_OBJECT) + JSGANTT: From 0279f1ec44e377135ffb25b38cbfdfdcb9973caf Mon Sep 17 00:00:00 2001 From: Christian Humpel Date: Sun, 29 Jan 2023 23:05:39 +0100 Subject: [PATCH 1079/1128] filter on extrafields --- htdocs/projet/class/api_projects.class.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/projet/class/api_projects.class.php b/htdocs/projet/class/api_projects.class.php index 8cbb3949cd5..fc10f49d38d 100644 --- a/htdocs/projet/class/api_projects.class.php +++ b/htdocs/projet/class/api_projects.class.php @@ -122,6 +122,7 @@ class Projects extends DolibarrApi $sql .= ", sc.fk_soc, sc.fk_user"; // We need these fields in order to filter by sale (including the case where the user can only see his prospects) } $sql .= " FROM ".MAIN_DB_PREFIX."projet as t"; + $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."projet_extrafields AS ef ON ef.fk_object = t.rowid"; // So we will be able to filter on extrafields if ($category > 0) { $sql .= ", ".MAIN_DB_PREFIX."categorie_project as c"; } From d03ec374d083c832f8858e515b04c7c098bf09a3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 30 Jan 2023 02:21:54 +0100 Subject: [PATCH 1080/1128] NEW Can set a checkbox in formconfirm by clicking on the label --- htdocs/accountancy/class/accountancyexport.class.php | 2 +- htdocs/core/class/html.form.class.php | 2 +- htdocs/core/modules/modAccounting.class.php | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/accountancy/class/accountancyexport.class.php b/htdocs/accountancy/class/accountancyexport.class.php index 4c6e2d09838..cec3cc5be73 100644 --- a/htdocs/accountancy/class/accountancyexport.class.php +++ b/htdocs/accountancy/class/accountancyexport.class.php @@ -203,7 +203,7 @@ class AccountancyExport 'ACCOUNTING_EXPORT_FORMAT' => empty($conf->global->ACCOUNTING_EXPORT_FORMAT) ? 'txt' : $conf->global->ACCOUNTING_EXPORT_FORMAT, 'ACCOUNTING_EXPORT_SEPARATORCSV' => empty($conf->global->ACCOUNTING_EXPORT_SEPARATORCSV) ? ',' : $conf->global->ACCOUNTING_EXPORT_SEPARATORCSV, 'ACCOUNTING_EXPORT_ENDLINE' => empty($conf->global->ACCOUNTING_EXPORT_ENDLINE) ? 1 : $conf->global->ACCOUNTING_EXPORT_ENDLINE, - 'ACCOUNTING_EXPORT_DATE' => empty($conf->global->ACCOUNTING_EXPORT_DATE) ? '%d%m%Y' : $conf->global->ACCOUNTING_EXPORT_DATE, + 'ACCOUNTING_EXPORT_DATE' => getDolGlobalString('ACCOUNTING_EXPORT_DATE', '%Y-%m-%d'), ), self::$EXPORT_TYPE_CEGID => array( 'label' => $langs->trans('Modelcsv_CEGID'), diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 7ed3f76c4bf..a9e69ed9b2b 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -5109,7 +5109,7 @@ class Form $more .= ''."\n"; } elseif ($input['type'] == 'checkbox') { $more .= '
    '; - $more .= '
    '.$input['label'].'
    '; + $more .= '
    '; $more .= 'const[11] = array( "ACCOUNTING_EXPORT_DATE", "chaine", - "%d%m%Y", + "%Y-%m-%d", "", 0, 'current', 0 ); $this->const[12] = array( @@ -338,7 +338,7 @@ class modAccounting extends DolibarrModules 'b.sens'=>'C' // This field is still used by accounting export. We can remove it once it has been replace into accountancyexport.class.php by a detection using ->debit and ->credit ); - // General ledger - Fichier FEC + // General ledger - File FEC $r++; $this->import_code[$r] = $this->rights_class.'_'.$r; $this->import_label[$r] = 'ImportAccountingEntriesFECFormat'; From 3fdc32337871ce06dda75eda1b251cc452fbfe7d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 30 Jan 2023 02:41:13 +0100 Subject: [PATCH 1081/1128] Fix menu --- htdocs/core/menus/standard/eldy.lib.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index bf75035f333..d04cf9edc1a 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -1726,7 +1726,10 @@ function get_left_menu_accountancy($mainmenu, &$newmenu, $usemenuhider = 1, $lef if ($nature) { $langs->load('accountancy'); - $journallabel = $langs->transnoentities($objp->label); // Label of bank account in llx_accounting_journal + $journallabel = ''; + if ($objp->label) { + $journallabel = '('.$langs->transnoentities($objp->label).')'; // Label of bank account in llx_accounting_journal + } $key = $langs->trans("AccountingJournalType".strtoupper($objp->nature)); $transferlabel = ($objp->nature && $key != "AccountingJournalType".strtoupper($langs->trans($objp->nature)) ? $key.($journallabel != $key ? ' '.$journallabel : ''): $journallabel); From 1fe08ad3b84beb95fece41902c98a936c6729b13 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 30 Jan 2023 02:56:29 +0100 Subject: [PATCH 1082/1128] Fix missing hook --- htdocs/core/lib/payments.lib.php | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/htdocs/core/lib/payments.lib.php b/htdocs/core/lib/payments.lib.php index 44691f7c2c4..29947dda57c 100644 --- a/htdocs/core/lib/payments.lib.php +++ b/htdocs/core/lib/payments.lib.php @@ -146,7 +146,7 @@ function payment_supplier_prepare_head(Paiement $object) */ function getValidOnlinePaymentMethods($paymentmethod = '') { - global $conf, $langs; + global $conf, $langs, $hookmanager, $action; $validpaymentmethod = array(); @@ -162,8 +162,24 @@ function getValidOnlinePaymentMethods($paymentmethod = '') $langs->load("stripe"); $validpaymentmethod['stripe'] = 'valid'; } - // TODO Add trigger + // This hook is used to complete the $validpaymentmethod array so an external payment modules + // can add its own key (ie 'payzen' for Payzen, ...) + $parameters = [ + 'paymentmethod' => $paymentmethod, + 'validpaymentmethod' => &$validpaymentmethod + ]; + $tmpobject = new stdClass(); + $reshook = $hookmanager->executeHooks('getValidPayment', $parameters, $tmpobject, $action); + if ($reshook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + } elseif (!empty($hookmanager->resArray['validpaymentmethod'])) { + if ($reshook == 0) { + $validpaymentmethod = array_merge($validpaymentmethod, $hookmanager->resArray['validpaymentmethod']); + } else { + $validpaymentmethod = $hookmanager->resArray['validpaymentmethod']; + } + } return $validpaymentmethod; } From 854bd4efa1f4d0be7037aa7db56644f1bde07e04 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Jan 2023 05:08:05 +0000 Subject: [PATCH 1083/1128] Bump JetBrains/qodana-action from 2022.3.0 to 2022.3.2 Bumps [JetBrains/qodana-action](https://github.com/JetBrains/qodana-action) from 2022.3.0 to 2022.3.2. - [Release notes](https://github.com/JetBrains/qodana-action/releases) - [Commits](https://github.com/JetBrains/qodana-action/compare/v2022.3.0...v2022.3.2) --- updated-dependencies: - dependency-name: JetBrains/qodana-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/code_quality.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/code_quality.yml b/.github/workflows/code_quality.yml index 65f350e1b53..e5351acaf78 100644 --- a/.github/workflows/code_quality.yml +++ b/.github/workflows/code_quality.yml @@ -18,7 +18,7 @@ jobs: fetch-depth: 1 #php-version: '7.1' - name: 'Qodana Scan' - uses: JetBrains/qodana-action@v2022.3.0 + uses: JetBrains/qodana-action@v2022.3.2 #with: # php-version: '7.1' env: From 6765a14a58ec692021f887522f266c266ab731cb Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Mon, 30 Jan 2023 11:36:00 +0100 Subject: [PATCH 1084/1128] fix : Warning: Undefined property: BOM:: in /home/httpd/vhosts/aflac.fr/domains/dev.aflac.fr/httpdocs/core/class/commondocgenerator.class.php on line 446 --- htdocs/core/class/commondocgenerator.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/commondocgenerator.class.php b/htdocs/core/class/commondocgenerator.class.php index e1780985c7c..b94fcccd99c 100644 --- a/htdocs/core/class/commondocgenerator.class.php +++ b/htdocs/core/class/commondocgenerator.class.php @@ -443,7 +443,7 @@ abstract class CommonDocGenerator } } - $date = ($object->element == 'contrat' ? $object->date_contrat : $object->date); + $date = (isset($object->element) && $object->element == 'contrat' && isset($object->date_contrat)) ? $object->date_contrat : (isset($object->date) ? $object->date : null); $resarray = array( $array_key.'_id'=>$object->id, From 665acb45cf3539559e6b5a3212959958c6adeea3 Mon Sep 17 00:00:00 2001 From: Christian Humpel Date: Sun, 29 Jan 2023 23:05:39 +0100 Subject: [PATCH 1085/1128] filter on extrafields --- htdocs/projet/class/api_projects.class.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/projet/class/api_projects.class.php b/htdocs/projet/class/api_projects.class.php index 6a522346210..9ed1bbf1441 100644 --- a/htdocs/projet/class/api_projects.class.php +++ b/htdocs/projet/class/api_projects.class.php @@ -123,6 +123,7 @@ class Projects extends DolibarrApi $sql .= ", sc.fk_soc, sc.fk_user"; // We need these fields in order to filter by sale (including the case where the user can only see his prospects) } $sql .= " FROM ".MAIN_DB_PREFIX."projet as t"; + $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."projet_extrafields AS ef ON ef.fk_object = t.rowid"; // So we will be able to filter on extrafields if ($category > 0) { $sql .= ", ".MAIN_DB_PREFIX."categorie_project as c"; } From cd9db0067c157514e4ae98ce2affcf24ad6086de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Sat, 28 Jan 2023 18:45:37 +0100 Subject: [PATCH 1086/1128] input is too small --- htdocs/admin/mails_senderprofile_list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/admin/mails_senderprofile_list.php b/htdocs/admin/mails_senderprofile_list.php index 95f57d5dfc5..a73b899dd00 100644 --- a/htdocs/admin/mails_senderprofile_list.php +++ b/htdocs/admin/mails_senderprofile_list.php @@ -416,7 +416,7 @@ if ($action != 'create') { print '
    '.$langs->trans("Label").'
    '.$langs->trans("Email").''; print img_picto('', 'email', 'class="pictofixedwidth"'); - print '
    '.$langs->trans("Signature").''; require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; $doleditor = new DolEditor('signature', GETPOST('signature'), '', 138, 'dolibarr_notes', 'In', true, true, empty($conf->global->FCKEDITOR_ENABLE_USERSIGN) ? 0 : 1, ROWS_4, '90%'); From 7e9d3c22e288a773b5c6a53c91cb6ad9e74ed16a Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Sat, 28 Jan 2023 10:36:34 +0100 Subject: [PATCH 1087/1128] fix : Warning: Undefined array key label --- htdocs/core/class/commondocgenerator.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/commondocgenerator.class.php b/htdocs/core/class/commondocgenerator.class.php index b94fcccd99c..74d0c9fa6b5 100644 --- a/htdocs/core/class/commondocgenerator.class.php +++ b/htdocs/core/class/commondocgenerator.class.php @@ -1618,7 +1618,7 @@ abstract class CommonDocGenerator $extrafields = $this->extrafieldsCache; - if (!empty($extrafields->attributes[$object->table_element]) && is_array($extrafields->attributes[$object->table_element]['label'])) { + if (!empty($extrafields->attributes[$object->table_element]) && is_array($extrafields->attributes[$object->table_element]) && array_key_exists('label', $extrafields->attributes[$object->table_element]) && is_array($extrafields->attributes[$object->table_element]['label'])) { foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $label) { // Dont display separator yet even is set to be displayed (not compatible yet) if ($extrafields->attributes[$object->table_element]['type'][$key] == 'separate') { From 5d787a0ba93c46dfdfdd3250c6ed207d35a8f278 Mon Sep 17 00:00:00 2001 From: hystepik Date: Fri, 27 Jan 2023 11:01:16 +0100 Subject: [PATCH 1088/1128] Fix : php 8.1 warning --- htdocs/compta/paiement/card.php | 4 ++++ htdocs/compta/paiement/list.php | 7 ++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/htdocs/compta/paiement/card.php b/htdocs/compta/paiement/card.php index 4930ce9e53c..29d9ce25bb6 100644 --- a/htdocs/compta/paiement/card.php +++ b/htdocs/compta/paiement/card.php @@ -46,6 +46,10 @@ $action = GETPOST('action', 'aZ09'); $confirm = GETPOST('confirm', 'alpha'); $backtopage = GETPOST('backtopage', 'alpha'); +$socid = GETPOST('socid', 'int'); if ($socid < 0) { + $socid = 0; +} + $object = new Paiement($db); // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context $hookmanager->initHooks(array('paymentcard', 'globalcard')); diff --git a/htdocs/compta/paiement/list.php b/htdocs/compta/paiement/list.php index 658f2c150f1..6db18f6aa55 100644 --- a/htdocs/compta/paiement/list.php +++ b/htdocs/compta/paiement/list.php @@ -513,6 +513,7 @@ foreach ($arrayfields as $column) { $i = 0; $totalarray = array(); +$totalarray['nbfield'] = 0; while ($i < min($num, $limit)) { $objp = $db->fetch_object($resql); @@ -620,7 +621,11 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } $totalarray['pos'][$checkedCount] = 'amount'; - $totalarray['val']['amount'] += $objp->amount; + if (empty($totalarray['val']['amount'])) { + $totalarray['val']['amount'] = $objp->amount; + } else { + $totalarray['val']['amount'] += $objp->amount; + } } // Status From 3a7552431fc79820e41ffaa2d5239f580801ab57 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 27 Jan 2023 01:03:44 +0100 Subject: [PATCH 1089/1128] Fix duplicate --- htdocs/contrat/class/contrat.class.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index 1e8f0e1f7e5..8f66cbdef2e 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -242,7 +242,6 @@ class Contrat extends CommonObject 'model_pdf' =>array('type'=>'varchar(255)', 'label'=>'Model pdf', 'enabled'=>1, 'visible'=>0, 'position'=>115), 'import_key' =>array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>1, 'visible'=>-2, 'position'=>120), 'extraparams' =>array('type'=>'varchar(255)', 'label'=>'Extraparams', 'enabled'=>1, 'visible'=>-1, 'position'=>125), - 'ref_customer' =>array('type'=>'varchar(50)', 'label'=>'Ref customer', 'enabled'=>1, 'visible'=>-1, 'position'=>130), 'fk_user_modif' =>array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserModif', 'enabled'=>1, 'visible'=>-2, 'notnull'=>-1, 'position'=>135), 'last_main_doc' =>array('type'=>'varchar(255)', 'label'=>'Last main doc', 'enabled'=>1, 'visible'=>-1, 'position'=>140), 'statut' =>array('type'=>'smallint(6)', 'label'=>'Statut', 'enabled'=>1, 'visible'=>-1, 'position'=>500, 'notnull'=>1, 'arrayofkeyval'=>array(0=>'Draft', 1=>'Validated', 2=>'Closed')) From 3692f9534ee52e9ddf5f49b453979faae3036e69 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 26 Jan 2023 19:23:43 +0100 Subject: [PATCH 1090/1128] Fix properties --- htdocs/comm/card.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/htdocs/comm/card.php b/htdocs/comm/card.php index e6162b45b52..b64673f0670 100644 --- a/htdocs/comm/card.php +++ b/htdocs/comm/card.php @@ -1458,6 +1458,8 @@ if ($object->id > 0) { $facturestatic->total_tva = $objp->total_tva; $facturestatic->total_ttc = $objp->total_ttc; $facturestatic->statut = $objp->status; + $facturestatic->date = $db->jdate($objp->df); + $facturestatic->date_lim_reglement = $db->jdate($objp->dl); print '
    '; From 47d241bf502a3b35f579ff0832293b50cbb8109f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Wed, 25 Jan 2023 21:56:49 +0100 Subject: [PATCH 1091/1128] fix php8.2 warnings --- htdocs/debugbar/class/DataCollector/DolLogsCollector.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/htdocs/debugbar/class/DataCollector/DolLogsCollector.php b/htdocs/debugbar/class/DataCollector/DolLogsCollector.php index d21cdd6233f..893804ae865 100644 --- a/htdocs/debugbar/class/DataCollector/DolLogsCollector.php +++ b/htdocs/debugbar/class/DataCollector/DolLogsCollector.php @@ -20,6 +20,11 @@ class DolLogsCollector extends MessagesCollector */ protected $maxnboflines; + /** + * @var int number of lines + */ + protected $nboflines; + /** * Constructor * @@ -33,7 +38,7 @@ class DolLogsCollector extends MessagesCollector parent::__construct($name); $this->nboflines = 0; - $this->maxnboflines = empty($conf->global->DEBUGBAR_LOGS_LINES_NUMBER) ? 250 : $conf->global->DEBUGBAR_LOGS_LINES_NUMBER; // High number slows seriously output + $this->maxnboflines = getDolGlobalInt('DEBUGBAR_LOGS_LINES_NUMBER', 250); // High number slows seriously output $this->path = $path ?: $this->getLogsFile(); } From d52d39318548bd0b67e61b31d662c340e6a825bb Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Wed, 25 Jan 2023 15:35:09 +0100 Subject: [PATCH 1092/1128] FIX - PHP8 Warnning admin commande --- htdocs/admin/commande.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/admin/commande.php b/htdocs/admin/commande.php index 79c42f6e2db..20064ca099c 100644 --- a/htdocs/admin/commande.php +++ b/htdocs/admin/commande.php @@ -117,7 +117,7 @@ if ($action == 'updateMask') { } elseif ($action == 'del') { $ret = delDocumentModel($value, $type); if ($ret > 0) { - if ($conf->global->COMMANDE_ADDON_PDF == "$value") { + if (getDolGlobalString('COMMANDE_ADDON_PDF') == $value) { dolibarr_del_const($db, 'COMMANDE_ADDON_PDF', $conf->entity); } } From a8bb58f2989a4b1d8e6c28dc59a2548373d8f291 Mon Sep 17 00:00:00 2001 From: kkhelifa Date: Wed, 25 Jan 2023 15:28:34 +0100 Subject: [PATCH 1093/1128] FIX: Rights on action for payments by bank transfer --- htdocs/compta/prelevement/card.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/prelevement/card.php b/htdocs/compta/prelevement/card.php index c9f90b8b240..33a4409bac9 100644 --- a/htdocs/compta/prelevement/card.php +++ b/htdocs/compta/prelevement/card.php @@ -272,7 +272,7 @@ if ($id > 0 || $ref) { print $formconfirm; - if (empty($object->date_trans) && $user->rights->prelevement->bons->send && $action == 'settransmitted') { + if (empty($object->date_trans) && (($user->rights->prelevement->bons->send && $object->type != 'bank-transfer') || ($user->rights->paymentbybanktransfer->send && $object->type == 'bank-transfer')) && $action == 'settransmitted') { print '
    '; print ''; print ''; @@ -291,7 +291,7 @@ if ($id > 0 || $ref) { print '
    '; } - if (!empty($object->date_trans) && empty($object->date_credit) && $user->rights->prelevement->bons->credit && $action == 'setcredited') { + if (!empty($object->date_trans) && empty($object->date_credit) && (($user->rights->prelevement->bons->credit && $object->type != 'bank-transfer') || ($user->rights->paymentbybanktransfer->debit && $object->type == 'bank-transfer')) && $action == 'setcredited') { $btnLabel = ($object->type == 'bank-transfer') ? $langs->trans("ClassDebited") : $langs->trans("ClassCredited"); print ''; print ''; From 6ab7ca1279354787e5b64a3f6cad4ff35c1caced Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Mon, 30 Jan 2023 12:28:20 +0100 Subject: [PATCH 1094/1128] fix : Warning: Undefined variable in /home/httpd/vhosts/aflac.fr/domains/dev.aflac.fr/httpdocs/core/class/commondocgenerator.class.php on line 455 --- htdocs/core/class/commondocgenerator.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/commondocgenerator.class.php b/htdocs/core/class/commondocgenerator.class.php index 74d0c9fa6b5..f6725c6aef1 100644 --- a/htdocs/core/class/commondocgenerator.class.php +++ b/htdocs/core/class/commondocgenerator.class.php @@ -452,7 +452,7 @@ abstract class CommonDocGenerator $array_key.'_ref_ext' => (property_exists($object, 'ref_ext') ? $object->ref_ext : ''), $array_key.'_ref_customer'=>(!empty($object->ref_client) ? $object->ref_client : (empty($object->ref_customer) ? '' : $object->ref_customer)), $array_key.'_ref_supplier'=>(!empty($object->ref_fournisseur) ? $object->ref_fournisseur : (empty($object->ref_supplier) ? '' : $object->ref_supplier)), - $array_key.'_source_invoice_ref'=>$invoice_source->ref, + $array_key.'_source_invoice_ref'=>(!empty($invoice_source->ref) ? $invoice_source->ref : (empty($invoice_source->ref) ? '' : $invoice_source->ref)), // Dates $array_key.'_hour'=>dol_print_date($date, 'hour'), $array_key.'_date'=>dol_print_date($date, 'day'), From 3349cd392edebf5570adc765d1a7406a6929c396 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 30 Jan 2023 13:22:44 +0100 Subject: [PATCH 1095/1128] Update commondocgenerator.class.php --- htdocs/core/class/commondocgenerator.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/commondocgenerator.class.php b/htdocs/core/class/commondocgenerator.class.php index f6725c6aef1..5799a1607e9 100644 --- a/htdocs/core/class/commondocgenerator.class.php +++ b/htdocs/core/class/commondocgenerator.class.php @@ -452,7 +452,7 @@ abstract class CommonDocGenerator $array_key.'_ref_ext' => (property_exists($object, 'ref_ext') ? $object->ref_ext : ''), $array_key.'_ref_customer'=>(!empty($object->ref_client) ? $object->ref_client : (empty($object->ref_customer) ? '' : $object->ref_customer)), $array_key.'_ref_supplier'=>(!empty($object->ref_fournisseur) ? $object->ref_fournisseur : (empty($object->ref_supplier) ? '' : $object->ref_supplier)), - $array_key.'_source_invoice_ref'=>(!empty($invoice_source->ref) ? $invoice_source->ref : (empty($invoice_source->ref) ? '' : $invoice_source->ref)), + $array_key.'_source_invoice_ref'=>((empty($invoice_source) || empty($invoice_source->ref)) ? '' : $invoice_source->ref), // Dates $array_key.'_hour'=>dol_print_date($date, 'hour'), $array_key.'_date'=>dol_print_date($date, 'day'), From ca04491b2ee966f730dacabfdd373e77be947c69 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 30 Jan 2023 13:57:11 +0100 Subject: [PATCH 1096/1128] Rename object into socialobject to avoid confusion --- htdocs/admin/company.php | 6 +++--- htdocs/core/modules/dons/html_cerfafr.modules.php | 2 +- htdocs/societe/class/societe.class.php | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/htdocs/admin/company.php b/htdocs/admin/company.php index d6760ef45e8..7b2708e1906 100644 --- a/htdocs/admin/company.php +++ b/htdocs/admin/company.php @@ -195,7 +195,7 @@ if (($action == 'update' && !GETPOST("cancel", 'alpha')) dolibarr_set_const($db, "MAIN_INFO_PROFID6", GETPOST("MAIN_INFO_PROFID6", 'alphanohtml'), 'chaine', 0, '', $conf->entity); dolibarr_set_const($db, "MAIN_INFO_TVAINTRA", GETPOST("tva", 'alphanohtml'), 'chaine', 0, '', $conf->entity); - dolibarr_set_const($db, "MAIN_INFO_SOCIETE_OBJECT", GETPOST("object", 'alphanohtml'), 'chaine', 0, '', $conf->entity); + dolibarr_set_const($db, "MAIN_INFO_SOCIETE_OBJECT", GETPOST("socialobject", 'alphanohtml'), 'chaine', 0, '', $conf->entity); dolibarr_set_const($db, "SOCIETE_FISCAL_MONTH_START", GETPOST("SOCIETE_FISCAL_MONTH_START", 'int'), 'chaine', 0, '', $conf->entity); @@ -676,8 +676,8 @@ print '
    '; -print '
    '; +print '
    '; diff --git a/htdocs/core/modules/dons/html_cerfafr.modules.php b/htdocs/core/modules/dons/html_cerfafr.modules.php index d859ae0ca56..155d16842ec 100644 --- a/htdocs/core/modules/dons/html_cerfafr.modules.php +++ b/htdocs/core/modules/dons/html_cerfafr.modules.php @@ -162,7 +162,7 @@ class html_cerfafr extends ModeleDon $form = str_replace('__MAIN_INFO_SOCIETE_ADDRESS__', $mysoc->address, $form); $form = str_replace('__MAIN_INFO_SOCIETE_ZIP__', $mysoc->zip, $form); $form = str_replace('__MAIN_INFO_SOCIETE_TOWN__', $mysoc->town, $form); - $form = str_replace('__MAIN_INFO_SOCIETE_OBJECT__', $mysoc->object, $form); + $form = str_replace('__MAIN_INFO_SOCIETE_OBJECT__', $mysoc->socialobject, $form); $form = str_replace('__DONATOR_FIRSTNAME__', $don->firstname, $form); $form = str_replace('__DONATOR_LASTNAME__', $don->lastname, $form); $form = str_replace('__DONATOR_SOCIETE__', $don->societe, $form); diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index e0309535ab7..9a8aaf7d96b 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -4268,7 +4268,7 @@ class Societe extends CommonObject $this->zip = empty($conf->global->MAIN_INFO_SOCIETE_ZIP) ? '' : $conf->global->MAIN_INFO_SOCIETE_ZIP; $this->town = empty($conf->global->MAIN_INFO_SOCIETE_TOWN) ? '' : $conf->global->MAIN_INFO_SOCIETE_TOWN; $this->region_code = empty($conf->global->MAIN_INFO_SOCIETE_REGION) ? '' : $conf->global->MAIN_INFO_SOCIETE_REGION; - $this->object = empty($conf->global->MAIN_INFO_SOCIETE_OBJECT) ? '' : $conf->global->MAIN_INFO_SOCIETE_OBJECT; + $this->socialobject = empty($conf->global->MAIN_INFO_SOCIETE_OBJECT) ? '' : $conf->global->MAIN_INFO_SOCIETE_OBJECT; $this->note_private = empty($conf->global->MAIN_INFO_SOCIETE_NOTE) ? '' : $conf->global->MAIN_INFO_SOCIETE_NOTE; From c533b7235157cadfa5ec1cb494f6f527c9da6e01 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 30 Jan 2023 13:59:36 +0100 Subject: [PATCH 1097/1128] Update societe.class.php --- htdocs/societe/class/societe.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index a6027eccd02..d1796e54577 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -486,10 +486,10 @@ class Societe extends CommonObject public $idprof6; /** - * Object of company + * Social object of the company * @var string */ - public $object; + public $socialobject; /** * @var string Prefix comm From 2a0a0fc4706206eb4af6cfcda481de8bf715046a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 30 Jan 2023 14:13:02 +0100 Subject: [PATCH 1098/1128] Clean old deprecated code on social networks fields --- htdocs/adherents/card.php | 9 -- htdocs/api/class/api_setup.class.php | 5 - htdocs/contact/card.php | 10 -- htdocs/contact/class/contact.class.php | 19 ---- htdocs/core/class/commonobject.class.php | 21 ----- .../core/class/commonsocialnetworks.class.php | 6 ++ htdocs/core/class/ldap.class.php | 1 - .../class/actions_datapolicy.class.php | 91 ++----------------- .../societe/class/api_thirdparties.class.php | 10 -- htdocs/societe/class/societe.class.php | 5 - htdocs/user/class/api_users.class.php | 5 - 11 files changed, 13 insertions(+), 169 deletions(-) diff --git a/htdocs/adherents/card.php b/htdocs/adherents/card.php index f72682ce22a..f57bb2e312d 100644 --- a/htdocs/adherents/card.php +++ b/htdocs/adherents/card.php @@ -313,10 +313,6 @@ if (empty($reshook)) { $object->socialnetworks[$key] = trim(GETPOST($key, 'alphanohtml')); } } - //$object->skype = trim(GETPOST("skype", 'alpha')); - //$object->twitter = trim(GETPOST("twitter", 'alpha')); - //$object->facebook = trim(GETPOST("facebook", 'alpha')); - //$object->linkedin = trim(GETPOST("linkedin", 'alpha')); $object->birth = $birthdate; $object->default_lang = GETPOST('default_lang', 'alpha'); $object->typeid = GETPOST("typeid", 'int'); @@ -488,11 +484,6 @@ if (empty($reshook)) { } } - // $object->skype = $skype; - // $object->twitter = $twitter; - // $object->facebook = $facebook; - // $object->linkedin = $linkedin; - $object->email = $email; $object->url = $url; $object->login = $login; diff --git a/htdocs/api/class/api_setup.class.php b/htdocs/api/class/api_setup.class.php index c79a3e63653..17649370ae0 100644 --- a/htdocs/api/class/api_setup.class.php +++ b/htdocs/api/class/api_setup.class.php @@ -1762,11 +1762,6 @@ class Setup extends DolibarrApi throw new RestException(403, 'Error API open to admin users only or to the users with logins defined into constant API_LOGINS_ALLOWED_FOR_GET_COMPANY'); } - unset($mysoc->skype); - unset($mysoc->twitter); - unset($mysoc->facebook); - unset($mysoc->linkedin); - unset($mysoc->pays); unset($mysoc->note); unset($mysoc->nom); diff --git a/htdocs/contact/card.php b/htdocs/contact/card.php index 4fde1b75552..cd94f4ebbac 100644 --- a/htdocs/contact/card.php +++ b/htdocs/contact/card.php @@ -213,11 +213,6 @@ if (empty($reshook)) { $object->town = (string) GETPOST("town", 'alpha'); $object->country_id = (int) GETPOST("country_id", 'int'); $object->state_id = (int) GETPOST("state_id", 'int'); - //$object->jabberid = GETPOST("jabberid", 'alpha'); - //$object->skype = GETPOST("skype", 'alpha'); - //$object->twitter = GETPOST("twitter", 'alpha'); - //$object->facebook = GETPOST("facebook", 'alpha'); - //$object->linkedin = GETPOST("linkedin", 'alpha'); $object->socialnetworks = array(); if (isModEnabled('socialnetworks')) { foreach ($socialnetworks as $key => $value) { @@ -419,11 +414,6 @@ if (empty($reshook)) { $object->email = (string) GETPOST('email', 'custom', 0, FILTER_SANITIZE_EMAIL); $object->no_email = GETPOST("no_email", "int"); - //$object->jabberid = GETPOST("jabberid", 'alpha'); - //$object->skype = GETPOST("skype", 'alpha'); - //$object->twitter = GETPOST("twitter", 'alpha'); - //$object->facebook = GETPOST("facebook", 'alpha'); - //$object->linkedin = GETPOST("linkedin", 'alpha'); $object->socialnetworks = array(); if (isModEnabled('socialnetworks')) { foreach ($socialnetworks as $key => $value) { diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php index c9d62c410b3..52ea2b69c8d 100644 --- a/htdocs/contact/class/contact.class.php +++ b/htdocs/contact/class/contact.class.php @@ -702,22 +702,6 @@ class Contact extends CommonObject $tmpobj->socialnetworks = $this->socialnetworks; $usermustbemodified++; } - // if ($tmpobj->skype != $this->skype) { - // $tmpobj->skype = $this->skype; - // $usermustbemodified++; - // } - // if ($tmpobj->twitter != $this->twitter) { - // $tmpobj->twitter = $this->twitter; - // $usermustbemodified++; - // } - // if ($tmpobj->facebook != $this->facebook) { - // $tmpobj->facebook = $this->facebook; - // $usermustbemodified++; - // } - // if ($tmpobj->linkedin != $this->linkedin) { - // $tmpobj->linkedin = $this->linkedin; - // $usermustbemodified++; - // } if ($usermustbemodified) { $result = $tmpobj->update($user, 0, 1, 1, 1); if ($result < 0) { @@ -850,9 +834,6 @@ class Contact extends CommonObject if ($this->fax && !empty($conf->global->LDAP_CONTACT_FIELD_FAX)) { $info[$conf->global->LDAP_CONTACT_FIELD_FAX] = $this->fax; } - if ($this->skype && !empty($conf->global->LDAP_CONTACT_FIELD_SKYPE)) { - $info[$conf->global->LDAP_CONTACT_FIELD_SKYPE] = $this->skype; - } if ($this->note_private && !empty($conf->global->LDAP_CONTACT_FIELD_DESCRIPTION)) { $info[$conf->global->LDAP_CONTACT_FIELD_DESCRIPTION] = dol_string_nohtmltag($this->note_private, 2); } diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 9b8f0dfc6dd..25f16cbbdb4 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -961,27 +961,6 @@ abstract class CommonObject } $outdone++; } - } else { // Old code to remove - if (!empty($this->skype)) { - $outsocialnetwork .= dol_print_socialnetworks($this->skype, $this->id, $object->id, 'skype'); - } - $outdone++; - if (!empty($this->jabberid)) { - $outsocialnetwork .= dol_print_socialnetworks($this->jabberid, $this->id, $object->id, 'jabber'); - } - $outdone++; - if (!empty($this->twitter)) { - $outsocialnetwork .= dol_print_socialnetworks($this->twitter, $this->id, $object->id, 'twitter'); - } - $outdone++; - if (!empty($this->facebook)) { - $outsocialnetwork .= dol_print_socialnetworks($this->facebook, $this->id, $object->id, 'facebook'); - } - $outdone++; - if (!empty($this->linkedin)) { - $outsocialnetwork .= dol_print_socialnetworks($this->linkedin, $this->id, $object->id, 'linkedin'); - } - $outdone++; } if ($outsocialnetwork) { diff --git a/htdocs/core/class/commonsocialnetworks.class.php b/htdocs/core/class/commonsocialnetworks.class.php index eeb6583ca65..4ec32194f3d 100644 --- a/htdocs/core/class/commonsocialnetworks.class.php +++ b/htdocs/core/class/commonsocialnetworks.class.php @@ -27,6 +27,12 @@ */ trait CommonSocialNetworks { + /** + * @var array array of socialnetworks + */ + public $socialnetworks; + + /** * Show social network part if the module is enabled with hiding functionality * diff --git a/htdocs/core/class/ldap.class.php b/htdocs/core/class/ldap.class.php index 9ad06ba137c..8b3c9177d3e 100644 --- a/htdocs/core/class/ldap.class.php +++ b/htdocs/core/class/ldap.class.php @@ -1291,7 +1291,6 @@ class Ldap $this->firstname = $this->convToOutputCharset($result[0][$this->attr_firstname][0], $this->ldapcharset); $this->login = $this->convToOutputCharset($result[0][$this->attr_login][0], $this->ldapcharset); $this->phone = $this->convToOutputCharset($result[0][$this->attr_phone][0], $this->ldapcharset); - $this->skype = $this->convToOutputCharset($result[0][$this->attr_skype][0], $this->ldapcharset); $this->fax = $this->convToOutputCharset($result[0][$this->attr_fax][0], $this->ldapcharset); $this->mail = $this->convToOutputCharset($result[0][$this->attr_mail][0], $this->ldapcharset); $this->mobile = $this->convToOutputCharset($result[0][$this->attr_mobile][0], $this->ldapcharset); diff --git a/htdocs/datapolicy/class/actions_datapolicy.class.php b/htdocs/datapolicy/class/actions_datapolicy.class.php index ac360674c85..768ddd216d7 100644 --- a/htdocs/datapolicy/class/actions_datapolicy.class.php +++ b/htdocs/datapolicy/class/actions_datapolicy.class.php @@ -82,11 +82,11 @@ class ActionsDatapolicy /** * Overloading the doActions function : replacing the parent's function with the one below * - * @param array $parameters Hook metadatas (context, etc...) - * @param CommonObject $object The object to process (an invoice if you are in invoice module, a propale in propale's module, etc...) - * @param string $action Current action (if set). Generally create or edit or null - * @param HookManager $hookmanager Hook manager propagated to allow calling another hook - * @return int < 0 on error, 0 on success, 1 to replace standard code + * @param array $parameters Hook metadatas (context, etc...) + * @param Societe|CommonObject $object The object to process (an invoice if you are in invoice module, a propale in propale's module, etc...) + * @param string $action Current action (if set). Generally create or edit or null + * @param HookManager $hookmanager Hook manager propagated to allow calling another hook + * @return int < 0 on error, 0 on success, 1 to replace standard code */ public function doActions($parameters, &$object, &$action, $hookmanager) { @@ -103,7 +103,6 @@ class ActionsDatapolicy // on verifie si l'objet est utilisé if ($object->isObjectUsed(GETPOST('socid'))) { $object->name = $langs->trans('ANONYME'); - $object->name_bis = ''; $object->name_alias = ''; $object->address = ''; $object->town = ''; @@ -115,7 +114,7 @@ class ActionsDatapolicy $object->state = ''; $object->country = ''; $object->state_id = ''; - $object->skype = ''; + $object->socialnetworks = ''; $object->country_id = ''; $object->note_private = $object->note_private.'
    '.$langs->trans('ANONYMISER_AT', dol_print_date(time())); @@ -128,76 +127,6 @@ class ActionsDatapolicy header('Location:'.$_SERVER["PHP_SELF"]."?socid=".$object->id); } } - } elseif ($parameters['currentcontext'] == 'thirdpartycard' && $action == 'datapolicy_portabilite') { - header('Content-Type: application/csv'); - header('Content-Disposition: attachment; filename=datapolicy_portabilite.csv'); - header('Pragma: no-cache'); - $object->fetch(GETPOST('socid')); - echo 'Name;Firstname;Civility;Thirdparty;Function;Address;ZipCode;City;Department;Country;Email;Pro Phone;Perso Phone;Mobile Phone;Instant Mail;Birthday;'.PHP_EOL; - echo $object->name.';'; - echo ';'; - echo ';'; - echo ';'; - echo ';'; - echo $object->address.';'; - echo $object->zip.';'; - echo $object->town.';'; - echo $object->state.';'; - echo $object->country.';'; - echo $object->email.';'; - echo $object->phone.';'; - echo ';'; - echo ';'; - echo $object->skype.';'; - echo ';'; - exit; - } elseif ($parameters['currentcontext'] == 'membercard' && $action == 'datapolicy_portabilite') { - header('Content-Type: application/csv'); - header('Content-Disposition: attachment; filename=datapolicy_portabilite.csv'); - header('Pragma: no-cache'); - $soc = $object->fetch_thirdparty(); - - echo 'Name;Firstname;Civility;Thirdparty;Function;Address;ZipCode;City;Department;Country;Email;Pro Phone;Perso Phone;Mobile Phone;Instant Mail;Birthday;'.PHP_EOL; - echo $object->lastname.';'; - echo $object->firstname.';'; - echo $object->getCivilityLabel().';'; - echo ($soc != -1 ? $object->thirdparty->name : '').';'; - echo ';'; - echo $object->address.';'; - echo $object->zip.';'; - echo $object->town.';'; - echo $object->state.';'; - echo $object->country.';'; - echo $object->email.';'; - echo $object->phone.';'; - echo $object->phone_perso.';'; - echo $object->phone_mobile.';'; - echo $object->skype.';'; - echo dol_print_date($object->birth).';'; - exit; - } elseif ($parameters['currentcontext'] == 'contactcard' && $action == 'datapolicy_portabilite') { - $object->fetch(GETPOST('id')); - header('Content-Type: application/csv'); - header('Content-Disposition: attachment; filename=datapolicy_portabilite.csv'); - header('Pragma: no-cache'); - $soc = $object->fetch_thirdparty(); - echo 'Name;Firstname;Civility;Thirdparty;Function;Address;ZipCode;City;Department;Country;Email;Pro Phone;Perso Phone;Mobile Phone;Instant Mail;Birthday;'.PHP_EOL; - echo $object->lastname.';'; - echo $object->firstname.';'; - echo $object->getCivilityLabel().';'; - echo ($soc != -1 ? $object->thirdparty->name : '').';'; - echo $object->poste.';'; - echo $object->address.';'; - echo $object->zip.';'; - echo $object->town.';'; - echo $object->state.';'; - echo $object->country.';'; - echo $object->email.';'; - echo $object->phone_pro.';'; - echo $object->phone_perso.';'; - echo $object->phone_mobile.';'; - echo dol_print_date($object->birth).';'; - exit; } elseif ($parameters['currentcontext'] == 'contactcard' && $action == 'send_datapolicy') { $object->fetch(GETPOST('id')); @@ -358,13 +287,7 @@ class ActionsDatapolicy } ); '; echo $dialog; - if ($parameters['currentcontext'] == 'thirdpartycard' && in_array($object->forme_juridique_code, array(11, 12, 13, 15, 17, 18, 19, 35, 60, 200, 311, 312, 316, 401, 600, 700, 1005)) || $object->typent_id == 8) { - echo '
    '; - } elseif ($parameters['currentcontext'] == 'membercard') { - echo ''; - } elseif ($parameters['currentcontext'] == 'contactcard') { - echo ''; - } + // TODO Replace test of hardcoded values if (!empty($object->mail) && empty($object->array_options['options_datapolicy_send']) && $parameters['currentcontext'] == 'thirdpartycard' && in_array($object->forme_juridique_code, array(11, 12, 13, 15, 17, 18, 19, 35, 60, 200, 311, 312, 316, 401, 600, 700, 1005)) || $object->typent_id == 8) { echo ''; } elseif (!empty($object->mail) && empty($object->array_options['options_datapolicy_send']) && $parameters['currentcontext'] == 'membercard') { diff --git a/htdocs/societe/class/api_thirdparties.class.php b/htdocs/societe/class/api_thirdparties.class.php index 10266b6f0ac..9921167d00c 100644 --- a/htdocs/societe/class/api_thirdparties.class.php +++ b/htdocs/societe/class/api_thirdparties.class.php @@ -1826,16 +1826,6 @@ class Thirdparties extends DolibarrApi unset($object->fk_delivery_address); // deprecated feature - unset($object->skype); - unset($object->twitter); - unset($object->facebook); - unset($object->linkedin); - unset($object->instagram); - unset($object->snapchat); - unset($object->googleplus); - unset($object->youtube); - unset($object->whatsapp); - return $object; } diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index e8e8d044b74..fa6d77ad485 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -382,11 +382,6 @@ class Societe extends CommonObject */ public $no_email; - /** - * @var array array of socialnetworks - */ - public $socialnetworks; - /** * Skype username * @var string diff --git a/htdocs/user/class/api_users.class.php b/htdocs/user/class/api_users.class.php index 747d4ab3286..2bbadd267cf 100644 --- a/htdocs/user/class/api_users.class.php +++ b/htdocs/user/class/api_users.class.php @@ -701,11 +701,6 @@ class Users extends DolibarrApi unset($object->lines); unset($object->model_pdf); - unset($object->skype); - unset($object->twitter); - unset($object->facebook); - unset($object->linkedin); - $canreadsalary = ((!empty($conf->salaries->enabled) && !empty(DolibarrApiAccess::$user->rights->salaries->read)) || (empty($conf->salaries->enabled))); if (!$canreadsalary) { From 95cb4237bf3376e88e4342f92c9ae4b082a4eca1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 30 Jan 2023 15:51:34 +0100 Subject: [PATCH 1099/1128] Fix css --- htdocs/admin/emailcollector_list.php | 6 +++++- htdocs/emailcollector/class/emailcollector.class.php | 4 ++-- htdocs/modulebuilder/template/myobject_list.php | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/htdocs/admin/emailcollector_list.php b/htdocs/admin/emailcollector_list.php index 3be38cca113..fb09143412f 100644 --- a/htdocs/admin/emailcollector_list.php +++ b/htdocs/admin/emailcollector_list.php @@ -601,13 +601,17 @@ while ($i < $imaxinloop) { //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100'; if (!empty($arrayfields['t.'.$key]['checked'])) { - print ''; if ($key == 'status') { print $object->getLibStatut(5); + } elseif ($key == 'lastresult') { + print '
    '; + print $object->showOutputField($val, $key, $object->$key, ''); + print '
    '; } elseif ($key == 'rowid') { print $object->showOutputField($val, $key, $object->id, ''); } else { diff --git a/htdocs/emailcollector/class/emailcollector.class.php b/htdocs/emailcollector/class/emailcollector.class.php index b2b3cb70f39..ba274fba2c2 100644 --- a/htdocs/emailcollector/class/emailcollector.class.php +++ b/htdocs/emailcollector/class/emailcollector.class.php @@ -128,7 +128,7 @@ class EmailCollector extends CommonObject public $fields = array( 'rowid' => array('type'=>'integer', 'label'=>'TechnicalID', 'visible'=>2, 'enabled'=>1, 'position'=>1, 'notnull'=>1, 'index'=>1), 'entity' => array('type'=>'integer', 'label'=>'Entity', 'enabled'=>1, 'visible'=>0, 'default'=>1, 'notnull'=>1, 'index'=>1, 'position'=>20), - 'ref' => array('type'=>'varchar(128)', 'label'=>'Ref', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'showoncombobox'=>1, 'index'=>1, 'position'=>10, 'searchall'=>1, 'help'=>'Example: MyCollector1', 'csslist'=>'tdoverflowmax150'), + 'ref' => array('type'=>'varchar(128)', 'label'=>'Ref', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'showoncombobox'=>1, 'index'=>1, 'position'=>10, 'searchall'=>1, 'help'=>'Example: MyCollector1', 'csslist'=>'tdoverflowmax200'), 'label' => array('type'=>'varchar(255)', 'label'=>'Label', 'visible'=>1, 'enabled'=>1, 'position'=>30, 'notnull'=>-1, 'searchall'=>1, 'help'=>'Example: My Email collector', 'csslist'=>'tdoverflowmax150'), 'description' => array('type'=>'text', 'label'=>'Description', 'visible'=>-1, 'enabled'=>1, 'position'=>60, 'notnull'=>-1, 'csslist'=>'small'), 'host' => array('type'=>'varchar(255)', 'label'=>'EMailHost', 'visible'=>1, 'enabled'=>1, 'position'=>90, 'notnull'=>1, 'searchall'=>1, 'comment'=>"IMAP server", 'help'=>'Example: imap.gmail.com', 'csslist'=>'tdoverflowmax125'), @@ -145,7 +145,7 @@ class EmailCollector extends CommonObject 'maxemailpercollect' => array('type'=>'integer', 'label'=>'MaxEmailCollectPerCollect', 'visible'=>-1, 'enabled'=>1, 'position'=>111, 'default'=>100), 'datelastresult' => array('type'=>'datetime', 'label'=>'DateLastCollectResult', 'visible'=>1, 'enabled'=>'$action != "create" && $action != "edit"', 'position'=>121, 'notnull'=>-1, 'csslist'=>'nowraponall'), 'codelastresult' => array('type'=>'varchar(16)', 'label'=>'CodeLastResult', 'visible'=>1, 'enabled'=>'$action != "create" && $action != "edit"', 'position'=>122, 'notnull'=>-1,), - 'lastresult' => array('type'=>'varchar(255)', 'label'=>'LastResult', 'visible'=>1, 'enabled'=>'$action != "create" && $action != "edit"', 'position'=>123, 'notnull'=>-1, 'csslist'=>'small'), + 'lastresult' => array('type'=>'varchar(255)', 'label'=>'LastResult', 'visible'=>1, 'enabled'=>'$action != "create" && $action != "edit"', 'position'=>123, 'notnull'=>-1, 'csslist'=>'small tdoverflowmax200'), 'datelastok' => array('type'=>'datetime', 'label'=>'DateLastcollectResultOk', 'visible'=>1, 'enabled'=>'$action != "create"', 'position'=>125, 'notnull'=>-1, 'csslist'=>'nowraponall'), 'note_public' => array('type'=>'html', 'label'=>'NotePublic', 'visible'=>0, 'enabled'=>1, 'position'=>61, 'notnull'=>-1,), 'note_private' => array('type'=>'html', 'label'=>'NotePrivate', 'visible'=>0, 'enabled'=>1, 'position'=>62, 'notnull'=>-1,), diff --git a/htdocs/modulebuilder/template/myobject_list.php b/htdocs/modulebuilder/template/myobject_list.php index 66aa7b0b35e..78e7c31077b 100644 --- a/htdocs/modulebuilder/template/myobject_list.php +++ b/htdocs/modulebuilder/template/myobject_list.php @@ -737,7 +737,7 @@ while ($i < $imaxinloop) { //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100'; if (!empty($arrayfields['t.'.$key]['checked'])) { - print ' Date: Mon, 30 Jan 2023 15:51:34 +0100 Subject: [PATCH 1100/1128] Fix css --- htdocs/admin/emailcollector_list.php | 6 +++++- htdocs/emailcollector/class/emailcollector.class.php | 4 ++-- htdocs/modulebuilder/template/myobject_list.php | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/htdocs/admin/emailcollector_list.php b/htdocs/admin/emailcollector_list.php index 3be38cca113..fb09143412f 100644 --- a/htdocs/admin/emailcollector_list.php +++ b/htdocs/admin/emailcollector_list.php @@ -601,13 +601,17 @@ while ($i < $imaxinloop) { //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100'; if (!empty($arrayfields['t.'.$key]['checked'])) { - print ''; if ($key == 'status') { print $object->getLibStatut(5); + } elseif ($key == 'lastresult') { + print '
    '; + print $object->showOutputField($val, $key, $object->$key, ''); + print '
    '; } elseif ($key == 'rowid') { print $object->showOutputField($val, $key, $object->id, ''); } else { diff --git a/htdocs/emailcollector/class/emailcollector.class.php b/htdocs/emailcollector/class/emailcollector.class.php index 7bf8306f4fd..6d8a8a048d3 100644 --- a/htdocs/emailcollector/class/emailcollector.class.php +++ b/htdocs/emailcollector/class/emailcollector.class.php @@ -128,7 +128,7 @@ class EmailCollector extends CommonObject public $fields = array( 'rowid' => array('type'=>'integer', 'label'=>'TechnicalID', 'visible'=>2, 'enabled'=>1, 'position'=>1, 'notnull'=>1, 'index'=>1), 'entity' => array('type'=>'integer', 'label'=>'Entity', 'enabled'=>1, 'visible'=>0, 'default'=>1, 'notnull'=>1, 'index'=>1, 'position'=>20), - 'ref' => array('type'=>'varchar(128)', 'label'=>'Ref', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'showoncombobox'=>1, 'index'=>1, 'position'=>10, 'searchall'=>1, 'help'=>'Example: MyCollector1', 'csslist'=>'tdoverflowmax150'), + 'ref' => array('type'=>'varchar(128)', 'label'=>'Ref', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'showoncombobox'=>1, 'index'=>1, 'position'=>10, 'searchall'=>1, 'help'=>'Example: MyCollector1', 'csslist'=>'tdoverflowmax200'), 'label' => array('type'=>'varchar(255)', 'label'=>'Label', 'visible'=>1, 'enabled'=>1, 'position'=>30, 'notnull'=>-1, 'searchall'=>1, 'help'=>'Example: My Email collector', 'csslist'=>'tdoverflowmax150'), 'description' => array('type'=>'text', 'label'=>'Description', 'visible'=>-1, 'enabled'=>1, 'position'=>60, 'notnull'=>-1, 'csslist'=>'small'), 'host' => array('type'=>'varchar(255)', 'label'=>'EMailHost', 'visible'=>1, 'enabled'=>1, 'position'=>90, 'notnull'=>1, 'searchall'=>1, 'comment'=>"IMAP server", 'help'=>'Example: imap.gmail.com', 'csslist'=>'tdoverflowmax125'), @@ -145,7 +145,7 @@ class EmailCollector extends CommonObject 'maxemailpercollect' => array('type'=>'integer', 'label'=>'MaxEmailCollectPerCollect', 'visible'=>-1, 'enabled'=>1, 'position'=>111, 'default'=>100), 'datelastresult' => array('type'=>'datetime', 'label'=>'DateLastCollectResult', 'visible'=>1, 'enabled'=>'$action != "create" && $action != "edit"', 'position'=>121, 'notnull'=>-1, 'csslist'=>'nowraponall'), 'codelastresult' => array('type'=>'varchar(16)', 'label'=>'CodeLastResult', 'visible'=>1, 'enabled'=>'$action != "create" && $action != "edit"', 'position'=>122, 'notnull'=>-1,), - 'lastresult' => array('type'=>'varchar(255)', 'label'=>'LastResult', 'visible'=>1, 'enabled'=>'$action != "create" && $action != "edit"', 'position'=>123, 'notnull'=>-1, 'csslist'=>'small'), + 'lastresult' => array('type'=>'varchar(255)', 'label'=>'LastResult', 'visible'=>1, 'enabled'=>'$action != "create" && $action != "edit"', 'position'=>123, 'notnull'=>-1, 'csslist'=>'small tdoverflowmax200'), 'datelastok' => array('type'=>'datetime', 'label'=>'DateLastcollectResultOk', 'visible'=>1, 'enabled'=>'$action != "create"', 'position'=>125, 'notnull'=>-1, 'csslist'=>'nowraponall'), 'note_public' => array('type'=>'html', 'label'=>'NotePublic', 'visible'=>0, 'enabled'=>1, 'position'=>61, 'notnull'=>-1,), 'note_private' => array('type'=>'html', 'label'=>'NotePrivate', 'visible'=>0, 'enabled'=>1, 'position'=>62, 'notnull'=>-1,), diff --git a/htdocs/modulebuilder/template/myobject_list.php b/htdocs/modulebuilder/template/myobject_list.php index 95442195ff9..44e870b12de 100644 --- a/htdocs/modulebuilder/template/myobject_list.php +++ b/htdocs/modulebuilder/template/myobject_list.php @@ -730,7 +730,7 @@ while ($i < $imaxinloop) { //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100'; if (!empty($arrayfields['t.'.$key]['checked'])) { - print ' Date: Mon, 30 Jan 2023 16:16:36 +0100 Subject: [PATCH 1101/1128] NEW The refresh link for imap collector is always visible --- htdocs/admin/emailcollector_card.php | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/htdocs/admin/emailcollector_card.php b/htdocs/admin/emailcollector_card.php index b3d6e045470..034997b1716 100644 --- a/htdocs/admin/emailcollector_card.php +++ b/htdocs/admin/emailcollector_card.php @@ -387,7 +387,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea $morehtmlref = '
    '; $morehtmlref .= '
    '; - $morehtml = $langs->trans("NbOfEmailsInInbox").' : '; + $morehtml = ''; $sourcedir = $object->source_directory; $targetdir = ($object->target_directory ? $object->target_directory : ''); // Can be '[Gmail]/Trash' or 'mytag' @@ -404,6 +404,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea $connectstringserver = $object->getConnectStringIMAP($usessl); if ($action == 'scan') { + $nbemail = ''; if (!empty($conf->global->MAIN_IMAP_USE_PHPIMAP)) { if ($object->acces_type == 1) { // Mode OAUth2 with PHP-IMAP @@ -493,7 +494,6 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea $f = $client->getFolders(false, $object->source_directory); $nbemail = $f[0]->examine()["exists"]; - $morehtml .= $nbemail; } else { try { if ($sourcedir) { @@ -525,15 +525,15 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea } if (!$connection) { - $morehtml .= 'Failed to open IMAP connection '.$connectstringsource; + $nbemail .= 'Failed to open IMAP connection '.$connectstringsource; if (function_exists('imap_last_error')) { - $morehtml .= '
    '.imap_last_error(); + $nbemail .= '
    '.imap_last_error(); } dol_syslog("Error ".$morehtml, LOG_WARNING); //var_dump(imap_errors()) } else { dol_syslog("Imap connected. Now we call imap_num_msg()"); - $morehtml .= imap_num_msg($connection); + $nbemail .= imap_num_msg($connection); } if ($connection) { @@ -541,12 +541,15 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea imap_close($connection); } } - } else { - $morehtml .= ''.img_picto('', 'refresh', 'class="paddingrightonly"').$langs->trans("Refresh").''; } - $morehtml .= $form->textwithpicto('', 'connect string '.$connectstringserver); + $morehtml .= $form->textwithpicto($langs->trans("NbOfEmailsInInbox"), 'connect string '.$connectstringserver).': '; + + $morehtml .= ($nbemail != '' ? $nbemail : '?'); + + $morehtml .= '   '.img_picto('', 'refresh', 'class="paddingrightonly"').$langs->trans("Refresh").''; } else { + $morehtml .= $langs->trans("NbOfEmailsInInbox").': '; $morehtml .= 'IMAP functions not available on your PHP. '; } From cc9cd3e3c7cc468b6c287012de088501c1dd9014 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 30 Jan 2023 19:06:18 +0100 Subject: [PATCH 1102/1128] NEW Can set background style with MAIN_LOGIN_BACKGROUND_STYLE --- htdocs/core/tpl/login.tpl.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/htdocs/core/tpl/login.tpl.php b/htdocs/core/tpl/login.tpl.php index 7f97e751ded..4900acc9ec2 100644 --- a/htdocs/core/tpl/login.tpl.php +++ b/htdocs/core/tpl/login.tpl.php @@ -133,9 +133,15 @@ $(document).ready(function () { -
    '; - print $form->editfieldkey("RefEmployee", 'ref_employee', $object->ref_employee, $object, $user->rights->user->user->creer || $user->rights->hrm->write_personal_information->write); + print $form->editfieldkey("RefEmployee", 'ref_employee', $object->ref_employee, $object, $permissiontowritehr); print ''; - print $form->editfieldval("RefEmployee", 'ref_employee', $object->ref_employee, $object, $user->rights->user->user->creer || $user->rights->hrm->write_personal_information->write, 'string', $object->ref_employee); + print $form->editfieldval("RefEmployee", 'ref_employee', $object->ref_employee, $object, $permissiontowritehr, 'string', $object->ref_employee); print '
    '; - print $form->editfieldkey("NationalRegistrationNumber", 'national_registration_number', $object->national_registration_number, $object, $user->rights->user->user->creer || $user->rights->hrm->write_personal_information->write); + print $form->editfieldkey("NationalRegistrationNumber", 'national_registration_number', $object->national_registration_number, $object, $permissiontowritehr); print ''; - print $form->editfieldval("NationalRegistrationNumber", 'national_registration_number', $object->national_registration_number, $object, $user->rights->user->user->creer || $user->rights->hrm->write_personal_information->write, 'string', $object->national_registration_number); + print $form->editfieldval("NationalRegistrationNumber", 'national_registration_number', $object->national_registration_number, $object, $permissiontowritehr, 'string', $object->national_registration_number); print '
    '; + print dol_escape_htmltag($obj->ref_employee); + print ''; + print dol_escape_htmltag($obj->national_registration_number); + print ''; From 8da61848d9992ec9d4525f04e18edea826980838 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 31 Jan 2023 00:55:00 +0100 Subject: [PATCH 1107/1128] CSS --- htdocs/user/list.php | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/htdocs/user/list.php b/htdocs/user/list.php index 30adec1dd08..296aaad5cc9 100644 --- a/htdocs/user/list.php +++ b/htdocs/user/list.php @@ -134,9 +134,9 @@ $arrayfields = array( 'u.email'=>array('label'=>"EMail", 'checked'=>1, 'position'=>35), 'u.api_key'=>array('label'=>"ApiKey", 'checked'=>0, 'position'=>40, "enabled"=>(!empty($conf->api->enabled) && $user->admin)), 'u.fk_soc'=>array('label'=>"Company", 'checked'=>($contextpage == 'employeelist' ? 0 : 1), 'position'=>45), - 'u.ref_employee'=>array('label'=>"RefEmployee", 'checked'=>1, 'position'=>60, 'enabled'=>(isModEnabled('hrm') && $permissiontoreadhr)), - 'u.national_registration_number'=>array('label'=>"NationalRegistrationNumber", 'checked'=>1, 'position'=>61, 'enabled'=>(isModEnabled('hrm') && $permissiontoreadhr)), - 'u.salary'=>array('label'=>"Salary", 'checked'=>1, 'position'=>80, 'enabled'=>(isModEnabled('salaries') && $user->hasRight("salaries", "readall"))), + 'u.ref_employee'=>array('label'=>"RefEmployee", 'checked'=>-1, 'position'=>60, 'enabled'=>(isModEnabled('hrm') && $permissiontoreadhr)), + 'u.national_registration_number'=>array('label'=>"NationalRegistrationNumber", 'checked'=>-1, 'position'=>61, 'enabled'=>(isModEnabled('hrm') && $permissiontoreadhr)), + 'u.salary'=>array('label'=>"Salary", 'checked'=>-1, 'position'=>80, 'enabled'=>(isModEnabled('salaries') && $user->hasRight("salaries", "readall"))), 'u.datelastlogin'=>array('label'=>"LastConnexion", 'checked'=>1, 'position'=>100), 'u.datepreviouslogin'=>array('label'=>"PreviousConnexion", 'checked'=>0, 'position'=>110), 'u.datec'=>array('label'=>"DateCreation", 'checked'=>0, 'position'=>500), @@ -753,7 +753,7 @@ if (!empty($arrayfields['u.employee']['checked'])) { // Supervisor if (!empty($arrayfields['u.fk_user']['checked'])) { print ''; - print $form->select_dolusers($search_supervisor, 'search_supervisor', 1, array(), 0, '', 0, 0, 0, 0, '', 0, '', 'maxwidth150'); + print $form->select_dolusers($search_supervisor, 'search_supervisor', 1, array(), 0, '', 0, 0, 0, 0, '', 0, '', 'maxwidth125'); print ''; - print $li; if (isModEnabled('multicompany') && $obj->admin && !$obj->entity) { - print img_picto($langs->trans("SuperAdministrator"), 'redstar', 'class="valignmiddle paddingleft"'); + print img_picto($langs->trans("SuperAdministrator"), 'redstar', 'class="valignmiddle paddingright"'); } elseif ($obj->admin) { - print img_picto($langs->trans("Administrator"), 'star', 'class="valignmiddle paddingleft"'); + print img_picto($langs->trans("Administrator"), 'star', 'class="valignmiddle paddingright"'); } + print $li; print ''; + print ''; if ($obj->login2) { $user2->id = $obj->id2; $user2->login = $obj->login2; @@ -1092,12 +1091,12 @@ while ($i < $imaxinloop) { $user2->socid = $obj->fk_soc2; $user2->statut = $obj->status2; $user2->status = $obj->status2; - print $user2->getNomUrl(-1, '', 0, 0, 24, 0, '', '', 1); if (isModEnabled('multicompany') && $obj->admin2 && !$obj->entity2) { - print img_picto($langs->trans("SuperAdministrator"), 'redstar', 'class="valignmiddle paddingleft"'); + print img_picto($langs->trans("SuperAdministrator"), 'redstar', 'class="valignmiddle paddingright"'); } elseif ($obj->admin2) { - print img_picto($langs->trans("Administrator"), 'star', 'class="valignmiddle paddingleft"'); + print img_picto($langs->trans("Administrator"), 'star', 'class="valignmiddle paddingright"'); } + print $user2->getNomUrl(-1, '', 0, 0, 24, 0, '', '', 1); } print ''; + print ''; print dol_escape_htmltag($obj->ref_employee); print ''; + print ''; print dol_escape_htmltag($obj->national_registration_number); print '
    '; // Action column -if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { +if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { print ''; } // Action column -if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { +if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { print ''; -if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { +if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n"; $totalarray['nbfield']++; } @@ -924,7 +925,7 @@ if (!empty($arrayfields['u.statut']['checked'])) { $totalarray['nbfield']++; } // Action column -if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { +if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n"; $totalarray['nbfield']++; } @@ -946,6 +947,7 @@ if (isset($extrafields->attributes[$object->table_element]['computed']) && is_ar // -------------------------------------------------------------------- $i = 0; $savnbfield = $totalarray['nbfield']; +$totalarray = array('val'=>array('u.salary'=>0)); $totalarray['nbfield'] = 0; $imaxinloop = ($limit ? min($num, $limit) : $num); while ($i < $imaxinloop) { @@ -954,7 +956,9 @@ while ($i < $imaxinloop) { break; // Should not happen } - if (empty($obj->country_code)) $obj->country_code = ''; // TODO Add join in select with country table to get country_code + if (empty($obj->country_code)) { + $obj->country_code = ''; // TODO Add join in select with country table to get country_code + } // Store properties in $object $object->setVarsFromFetchObj($obj); @@ -1005,7 +1009,7 @@ while ($i < $imaxinloop) { $j = 0; print ''; // Action column - if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { print ''; + if (!$i) { + $totalarray['nbfield']++; + } } // Login if (!empty($arrayfields['u.login']['checked'])) { @@ -1210,6 +1217,16 @@ while ($i < $imaxinloop) { if (!$i) { $totalarray['nbfield']++; } + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 'u.salary'; + } + if (!isset($totalarray['val'])) { + $totalarray['val'] = array(); + } + if (!isset($totalarray['val']['u.salary'])) { + $totalarray['val']['u.salary'] = 0; + } + $totalarray['val']['u.salary'] += $obj->salary; } // Date last login @@ -1259,7 +1276,7 @@ while ($i < $imaxinloop) { } } // Action column - if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { print ''; - } - if (!$i) { - $totalarray['nbfield']++; + if (!$i) { + $totalarray['nbfield']++; + } } print ''."\n"; @@ -1298,7 +1315,7 @@ if ($num == 0) { $db->free($resql); $parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql); -$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object); // Note that $action and $object may have been modified by hook +$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; print '
    '; $searchpicto = $form->showFilterButtons('left'); print $searchpicto; @@ -815,7 +816,7 @@ if (!empty($arrayfields['u.statut']['checked'])) { print ''; $searchpicto = $form->showFilterButtons(); print $searchpicto; @@ -829,7 +830,7 @@ $totalarray['nbfield'] = 0; // Fields title label // -------------------------------------------------------------------- print '
    '; if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined $selected = 0; @@ -1015,6 +1019,9 @@ while ($i < $imaxinloop) { print ''; } print ''; if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined $selected = 0; @@ -1269,9 +1286,9 @@ while ($i < $imaxinloop) { print ''; } print '
    '."\n"; From a628852a32dae2fb20a3f32358ef2a02f767431f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 31 Jan 2023 01:13:57 +0100 Subject: [PATCH 1109/1128] Fix template for line total --- htdocs/modulebuilder/template/myobject_list.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/htdocs/modulebuilder/template/myobject_list.php b/htdocs/modulebuilder/template/myobject_list.php index 78e7c31077b..8cdbd1f9938 100644 --- a/htdocs/modulebuilder/template/myobject_list.php +++ b/htdocs/modulebuilder/template/myobject_list.php @@ -716,6 +716,9 @@ while ($i < $imaxinloop) { print ''; } print '
    '; - print $form->select_dolusers($search_employee, "search_employee", 1, "", $disabled, $include, '', 0, 0, 0, $morefilter, 0, '', 'maxwidth150'); + print $form->select_dolusers($search_employee, "search_employee", 1, "", $disabled, $include, '', 0, 0, 0, $morefilter, 0, '', 'maxwidth125'); print ' '; $validator = new UserGroup($db); $excludefilter = $user->admin ? '' : 'u.rowid <> '.$user->id; - $valideurobjects = $validator->listUsersForGroup($excludefilter); + $valideurobjects = $validator->listUsersForGroup($excludefilter, 1); $valideurarray = array(); foreach ($valideurobjects as $val) { $valideurarray[$val->id] = $val->id; From 404a70a2a99f3b04e809cd0e566a20fc678dbc96 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 31 Jan 2023 05:01:30 +0100 Subject: [PATCH 1114/1128] Debug v18 --- htdocs/user/class/usergroup.class.php | 24 ++++++++++++++++++------ htdocs/user/group/card.php | 5 +++-- htdocs/user/group/list.php | 2 +- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/htdocs/user/class/usergroup.class.php b/htdocs/user/class/usergroup.class.php index a9884ca59d1..250fec08c30 100644 --- a/htdocs/user/class/usergroup.class.php +++ b/htdocs/user/class/usergroup.class.php @@ -100,6 +100,7 @@ class UserGroup extends CommonObject public $members = array(); // Array of users public $nb_rights; // Number of rights granted to the user + public $nb_users; // Number of users in the group private $_tab_loaded = array(); // Array of cache of already loaded permissions @@ -151,7 +152,7 @@ class UserGroup extends CommonObject * @param boolean $load_members Load all members of the group * @return int <0 if KO, >0 if OK */ - public function fetch($id = '', $groupname = '', $load_members = true) + public function fetch($id = '', $groupname = '', $load_members = false) { global $conf; @@ -166,7 +167,7 @@ class UserGroup extends CommonObject if ($result) { if ($load_members) { - $this->members = $this->listUsersForGroup(); + $this->members = $this->listUsersForGroup(); // This make a lot of subrequests } return 1; @@ -237,7 +238,7 @@ class UserGroup extends CommonObject $ret = array(); - $sql = "SELECT u.rowid"; + $sql = "SELECT u.rowid, u.login, u.lastname, u.firstname, u.photo, u.fk_soc, u.entity, u.employee, u.email"; if (!empty($this->id)) { $sql .= ", ug.entity as usergroup_entity"; } @@ -263,12 +264,23 @@ class UserGroup extends CommonObject dol_syslog(get_class($this)."::listUsersForGroup", LOG_DEBUG); $resql = $this->db->query($sql); + if ($resql) { while ($obj = $this->db->fetch_object($resql)) { if (!array_key_exists($obj->rowid, $ret)) { if ($mode != 1) { $newuser = new User($this->db); - $newuser->fetch($obj->rowid); + //$newuser->fetch($obj->rowid); // We are inside a loop, no subrequests inside a loop + $newuser->id = $obj->rowid; + $newuser->login = $obj->login; + $newuser->photo = $obj->photo; + $newuser->lastname = $obj->lastname; + $newuser->firstname = $obj->firstname; + $newuser->email = $obj->email; + $newuser->socid = $obj->fk_soc; + $newuser->entity = $obj->entity; + $newuser->employee = $obj->employee; + $ret[$obj->rowid] = $newuser; } else { $ret[$obj->rowid] = $obj->rowid; @@ -936,10 +948,10 @@ class UserGroup extends CommonObject $return .= '
    '; $return .= ''.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).''; if (property_exists($this, 'members')) { - $return .= '
    '.(!empty($this->members)? $this->members : 0).' '.$langs->trans('Users').''; + $return .= '
    '.(empty($this->nb_users) ? 0 : $this->nb_users).' '.$langs->trans('Users').''; } if (property_exists($this, 'nb_rights')) { - $return .= '
    '.$langs->trans('NbOfPermissions').' : '.$this->nb_rights.'
    '; + $return .= '
    '.$langs->trans('NbOfPermissions').' : '.(empty($this->nb_rights) ? 0 : $this->nb_rights).'
    '; } $return .= '
    '; $return .= ''; diff --git a/htdocs/user/group/card.php b/htdocs/user/group/card.php index a9a16826ee3..7bafaf5aee5 100644 --- a/htdocs/user/group/card.php +++ b/htdocs/user/group/card.php @@ -247,6 +247,7 @@ if (empty($reshook)) { /* * View */ + $title = $object->name.' - '.$langs->trans("Card"); if ($action == 'create') { $title = $langs->trans("NewGroup"); @@ -309,8 +310,6 @@ if ($action == 'create') { /* */ /* ************************************************************************** */ if ($id) { - $res = $object->fetch_optionals(); - $head = group_prepare_head($object); $title = $langs->trans("Group"); @@ -447,6 +446,8 @@ if ($action == 'create') { print '
     
    '; $validator = new UserGroup($db); $excludefilter = $user->admin ? '' : 'u.rowid <> '.$user->id; - $valideurobjects = $validator->listUsersForGroup($excludefilter); + $valideurobjects = $validator->listUsersForGroup($excludefilter, 1); $valideurarray = array(); foreach ($valideurobjects as $val) { $valideurarray[$val->id] = $val->id; diff --git a/htdocs/holiday/view_log.php b/htdocs/holiday/view_log.php index 9bd55252a43..4235b7261eb 100644 --- a/htdocs/holiday/view_log.php +++ b/htdocs/holiday/view_log.php @@ -333,9 +333,8 @@ if (!empty($arrayfields['cpl.date_action']['checked'])) { if (!empty($arrayfields['cpl.fk_user_action']['checked'])) { $validator = new UserGroup($db); $excludefilter = $user->admin ? '' : 'u.rowid <> '.$user->id; - $valideurobjects = $validator->listUsersForGroup($excludefilter); + $valideurobjects = $validator->listUsersForGroup($excludefilter, 1); $valideurarray = array(); - foreach ($valideurobjects as $val) { $valideurarray[$val->id] = $val->id; } From e3441e9772f839abfefc1b12509841756574e86d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 31 Jan 2023 05:32:14 +0100 Subject: [PATCH 1116/1128] css --- htdocs/holiday/month_report.php | 2 +- htdocs/theme/eldy/global.inc.php | 1 + htdocs/theme/md/style.css.php | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/holiday/month_report.php b/htdocs/holiday/month_report.php index fe2d33ff78a..a4ad8fe4224 100644 --- a/htdocs/holiday/month_report.php +++ b/htdocs/holiday/month_report.php @@ -267,7 +267,7 @@ if (!empty($arrayfields['cp.fk_type']['checked'])) { } print ''; - print $form->selectarray('search_type', $arraytypeleaves, $search_type, 1, 0, 0, '', 0, 0, 0, '', '', 1); + print $form->selectarray('search_type', $arraytypeleaves, $search_type, 1, 0, 0, '', 0, 0, 0, '', 'maxwidth100', 1); print ''; - print $form->select_dolusers($search_employee, "search_employee", 1, null, 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth100'); - print ''; + print $form->select_dolusers($search_employee, "search_employee", 1, null, 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth100'); + print '
    '.$holidaystatic->getNomUrl(1, 1).''.$user->getFullName($langs).''.$arraytypeleaves[$obj->fk_type].''.$user->getFullName($langs).''.dol_print_date($db->jdate($obj->date_debut), 'day'); @@ -447,7 +456,11 @@ if ($num == 0) { print ''.num_open_day($date_start_inmonth, $date_end_inmonth, 0, 1, $halfdayinmonth).''.dolGetFirstLineOfText(dol_string_nohtmltag($obj->description, 1)).''; + print '
    '; + print dolGetFirstLineOfText(dol_string_nohtmltag($obj->description, 1)); + print '
    '; + print '
    '."\n"; + print '
    '."\n"; - // Common attributes - include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_add.tpl.php'; + // Common attributes + include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_add.tpl.php'; - // Other attributes - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php'; + // Other attributes + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php'; - print '
    '."\n"; + print '
    '."\n"; - print dol_get_fiche_end(); + print dol_get_fiche_end(); - print $form->buttonsSaveCancel("Create"); + print $form->buttonsSaveCancel("Create"); - print ''; + print ''; +} + +// Part to edit record +if (($id || $ref) && $action == 'edit') { + print load_fiche_titre($langs->trans("BillOfMaterials"), '', 'cubes'); + + print '
    '; + print ''; + print ''; + print ''; + print ''; + + print dol_get_fiche_head(); + + //$object->fields['keyfield']['disabled'] = 1; + + print ''."\n"; + + // Common attributes + include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_edit.tpl.php'; + + // Other attributes + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_edit.tpl.php'; + + print '
    '; + + print dol_get_fiche_end(); + + print $form->buttonsSaveCancel("Create"); + + print '
    '; +} + +// Part to show record +if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'create'))) { + $head = bomPrepareHead($object); + print dol_get_fiche_head($head, 'card', $langs->trans("BillOfMaterials"), -1, 'bom'); + + $formconfirm = ''; + + // Confirmation to delete + if ($action == 'delete') { + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('DeleteBillOfMaterials'), $langs->trans('ConfirmDeleteBillOfMaterials'), 'confirm_delete', '', 0, 1); + } + // Confirmation to delete line + if ($action == 'deleteline') { + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$lineid, $langs->trans('DeleteLine'), $langs->trans('ConfirmDeleteLine'), 'confirm_deleteline', '', 0, 1); } - // Part to edit record - if (($id || $ref) && $action == 'edit') { - print load_fiche_titre($langs->trans("BillOfMaterials"), '', 'cubes'); - - print '
    '; - print ''; - print ''; - print ''; - print ''; - - print dol_get_fiche_head(); - - //$object->fields['keyfield']['disabled'] = 1; - - print ''."\n"; - - // Common attributes - include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_edit.tpl.php'; - - // Other attributes - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_edit.tpl.php'; - - print '
    '; - - print dol_get_fiche_end(); - - print $form->buttonsSaveCancel("Create"); - - print '
    '; - } - - // Part to show record - if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'create'))) { - $head = bomPrepareHead($object); - print dol_get_fiche_head($head, 'card', $langs->trans("BillOfMaterials"), -1, 'bom'); - - $formconfirm = ''; - - // Confirmation to delete - if ($action == 'delete') { - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('DeleteBillOfMaterials'), $langs->trans('ConfirmDeleteBillOfMaterials'), 'confirm_delete', '', 0, 1); - } - // Confirmation to delete line - if ($action == 'deleteline') { - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$lineid, $langs->trans('DeleteLine'), $langs->trans('ConfirmDeleteLine'), 'confirm_deleteline', '', 0, 1); - } - - // Confirmation of validation - if ($action == 'validate') { - // We check that object has a temporary ref - $ref = substr($object->ref, 1, 4); - if ($ref == 'PROV') { - $object->fetch_product(); - $numref = $object->getNextNumRef($object->product); - } else { - $numref = $object->ref; - } - - $text = $langs->trans('ConfirmValidateBom', $numref); - /*if (isModEnabled('notification')) - { - require_once DOL_DOCUMENT_ROOT . '/core/class/notify.class.php'; - $notify = new Notify($db); - $text .= '
    '; - $text .= $notify->confirmMessage('BOM_VALIDATE', $object->socid, $object); - }*/ - - $formquestion = array(); - if (isModEnabled('bom')) { - $langs->load("mrp"); - $forcecombo = 0; - if ($conf->browser->name == 'ie') { - $forcecombo = 1; // There is a bug in IE10 that make combo inside popup crazy - } - $formquestion = array( - // 'text' => $langs->trans("ConfirmClone"), - // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1), - // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1), - ); - } - - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('Validate'), $text, 'confirm_validate', $formquestion, 0, 1, 220); - } - - // Confirmation of closing - if ($action == 'close') { - $text = $langs->trans('ConfirmCloseBom', $object->ref); - /*if (isModEnabled('notification')) - { - require_once DOL_DOCUMENT_ROOT . '/core/class/notify.class.php'; - $notify = new Notify($db); - $text .= '
    '; - $text .= $notify->confirmMessage('BOM_CLOSE', $object->socid, $object); - }*/ - - $formquestion = array(); - if (isModEnabled('bom')) { - $langs->load("mrp"); - $forcecombo = 0; - if ($conf->browser->name == 'ie') { - $forcecombo = 1; // There is a bug in IE10 that make combo inside popup crazy - } - $formquestion = array( - // 'text' => $langs->trans("ConfirmClone"), - // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1), - // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1), - ); - } - - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('Close'), $text, 'confirm_close', $formquestion, 0, 1, 220); - } - - // Confirmation of reopen - if ($action == 'reopen') { - $text = $langs->trans('ConfirmReopenBom', $object->ref); - /*if (isModEnabled('notification')) - { - require_once DOL_DOCUMENT_ROOT . '/core/class/notify.class.php'; - $notify = new Notify($db); - $text .= '
    '; - $text .= $notify->confirmMessage('BOM_CLOSE', $object->socid, $object); - }*/ - - $formquestion = array(); - if (isModEnabled('bom')) { - $langs->load("mrp"); - require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php'; - $forcecombo = 0; - if ($conf->browser->name == 'ie') { - $forcecombo = 1; // There is a bug in IE10 that make combo inside popup crazy - } - $formquestion = array( - // 'text' => $langs->trans("ConfirmClone"), - // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1), - // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1), - ); - } - - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ReOpen'), $text, 'confirm_reopen', $formquestion, 0, 1, 220); - } - - // Clone confirmation - if ($action == 'clone') { - // Create an array for form - $formquestion = array(); - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneBillOfMaterials', $object->ref), 'confirm_clone', $formquestion, 'yes', 1); - } - - // Confirmation of action xxxx - if ($action == 'setdraft') { - $text = $langs->trans('ConfirmSetToDraft', $object->ref); - - $formquestion = array(); - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('SetToDraft'), $text, 'confirm_setdraft', $formquestion, 0, 1, 220); - } - - // Call Hook formConfirm - $parameters = array('formConfirm' => $formconfirm, 'lineid' => $lineid); - $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook - if (empty($reshook)) { - $formconfirm .= $hookmanager->resPrint; - } elseif ($reshook > 0) { - $formconfirm = $hookmanager->resPrint; - } - - // Print form confirm - print $formconfirm; - - - // Object card - // ------------------------------------------------------------ - $linkback = ''.$langs->trans("BackToList").''; - - $morehtmlref = '
    '; - /* - // Ref bis - $morehtmlref.=$form->editfieldkey("RefBis", 'ref_client', $object->ref_client, $object, $user->rights->bom->creer, 'string', '', 0, 1); - $morehtmlref.=$form->editfieldval("RefBis", 'ref_client', $object->ref_client, $object, $user->rights->bom->creer, 'string', '', null, null, '', 1); - // Thirdparty - $morehtmlref.='
    '.$langs->trans('ThirdParty') . ' : ' . $soc->getNomUrl(1); - // Project - if (isModEnabled('project')) - { - $langs->load("projects"); - $morehtmlref.='
    '.$langs->trans('Project') . ' '; - if ($permissiontoadd) - { - if ($action != 'classify') - $morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : '; - if ($action == 'classify') { - //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1); - $morehtmlref.='
    '; - $morehtmlref.=''; - $morehtmlref.=''; - $morehtmlref.=$formproject->select_projects($object->socid, $object->fk_project, 'projectid', 0, 0, 1, 0, 1, 0, 0, '', 1); - $morehtmlref.=''; - $morehtmlref.='
    '; - } else { - $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1); - } + // Confirmation of validation + if ($action == 'validate') { + // We check that object has a temporary ref + $ref = substr($object->ref, 1, 4); + if ($ref == 'PROV') { + $object->fetch_product(); + $numref = $object->getNextNumRef($object->product); } else { - if (! empty($object->fk_project)) { - $proj = new Project($db); - $proj->fetch($object->fk_project); - $morehtmlref.=$proj->getNomUrl(); - } else { - $morehtmlref.=''; + $numref = $object->ref; + } + + $text = $langs->trans('ConfirmValidateBom', $numref); + /*if (isModEnabled('notification')) + { + require_once DOL_DOCUMENT_ROOT . '/core/class/notify.class.php'; + $notify = new Notify($db); + $text .= '
    '; + $text .= $notify->confirmMessage('BOM_VALIDATE', $object->socid, $object); + }*/ + + $formquestion = array(); + if (isModEnabled('bom')) { + $langs->load("mrp"); + $forcecombo = 0; + if ($conf->browser->name == 'ie') { + $forcecombo = 1; // There is a bug in IE10 that make combo inside popup crazy } + $formquestion = array( + // 'text' => $langs->trans("ConfirmClone"), + // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1), + // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1), + ); } + + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('Validate'), $text, 'confirm_validate', $formquestion, 0, 1, 220); + } + + // Confirmation of closing + if ($action == 'close') { + $text = $langs->trans('ConfirmCloseBom', $object->ref); + /*if (isModEnabled('notification')) + { + require_once DOL_DOCUMENT_ROOT . '/core/class/notify.class.php'; + $notify = new Notify($db); + $text .= '
    '; + $text .= $notify->confirmMessage('BOM_CLOSE', $object->socid, $object); + }*/ + + $formquestion = array(); + if (isModEnabled('bom')) { + $langs->load("mrp"); + $forcecombo = 0; + if ($conf->browser->name == 'ie') { + $forcecombo = 1; // There is a bug in IE10 that make combo inside popup crazy + } + $formquestion = array( + // 'text' => $langs->trans("ConfirmClone"), + // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1), + // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1), + ); } - */ - $morehtmlref .= '
    '; + + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('Close'), $text, 'confirm_close', $formquestion, 0, 1, 220); + } + + // Confirmation of reopen + if ($action == 'reopen') { + $text = $langs->trans('ConfirmReopenBom', $object->ref); + /*if (isModEnabled('notification')) + { + require_once DOL_DOCUMENT_ROOT . '/core/class/notify.class.php'; + $notify = new Notify($db); + $text .= '
    '; + $text .= $notify->confirmMessage('BOM_CLOSE', $object->socid, $object); + }*/ + + $formquestion = array(); + if (isModEnabled('bom')) { + $langs->load("mrp"); + require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php'; + $forcecombo = 0; + if ($conf->browser->name == 'ie') { + $forcecombo = 1; // There is a bug in IE10 that make combo inside popup crazy + } + $formquestion = array( + // 'text' => $langs->trans("ConfirmClone"), + // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1), + // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1), + ); + } + + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ReOpen'), $text, 'confirm_reopen', $formquestion, 0, 1, 220); + } + + // Clone confirmation + if ($action == 'clone') { + // Create an array for form + $formquestion = array(); + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneBillOfMaterials', $object->ref), 'confirm_clone', $formquestion, 'yes', 1); + } + + // Confirmation of action xxxx + if ($action == 'setdraft') { + $text = $langs->trans('ConfirmSetToDraft', $object->ref); + + $formquestion = array(); + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('SetToDraft'), $text, 'confirm_setdraft', $formquestion, 0, 1, 220); + } + + // Call Hook formConfirm + $parameters = array('formConfirm' => $formconfirm, 'lineid' => $lineid); + $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + if (empty($reshook)) { + $formconfirm .= $hookmanager->resPrint; + } elseif ($reshook > 0) { + $formconfirm = $hookmanager->resPrint; + } + + // Print form confirm + print $formconfirm; - dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref); + // Object card + // ------------------------------------------------------------ + $linkback = ''.$langs->trans("BackToList").''; + + $morehtmlref = '
    '; + /* + // Ref bis + $morehtmlref.=$form->editfieldkey("RefBis", 'ref_client', $object->ref_client, $object, $user->rights->bom->creer, 'string', '', 0, 1); + $morehtmlref.=$form->editfieldval("RefBis", 'ref_client', $object->ref_client, $object, $user->rights->bom->creer, 'string', '', null, null, '', 1); + // Thirdparty + $morehtmlref.='
    '.$langs->trans('ThirdParty') . ' : ' . $soc->getNomUrl(1); + // Project + if (isModEnabled('project')) + { + $langs->load("projects"); + $morehtmlref.='
    '.$langs->trans('Project') . ' '; + if ($permissiontoadd) + { + if ($action != 'classify') + $morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : '; + if ($action == 'classify') { + //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1); + $morehtmlref.='
    '; + $morehtmlref.=''; + $morehtmlref.=''; + $morehtmlref.=$formproject->select_projects($object->socid, $object->fk_project, 'projectid', 0, 0, 1, 0, 1, 0, 0, '', 1); + $morehtmlref.=''; + $morehtmlref.='
    '; + } else { + $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1); + } + } else { + if (! empty($object->fk_project)) { + $proj = new Project($db); + $proj->fetch($object->fk_project); + $morehtmlref.=$proj->getNomUrl(); + } else { + $morehtmlref.=''; + } + } + } + */ + $morehtmlref .= '
    '; - print '
    '; - print '
    '; - print '
    '; - print ''."\n"; + dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref); - // Common attributes - $keyforbreak = 'duration'; - include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_view.tpl.php'; + + print '
    '; + print '
    '; + print '
    '; + print '
    '."\n"; + + // Common attributes + $keyforbreak = 'duration'; + include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_view.tpl.php'; + $object->calculateCosts(); + print ''; + print ''; + + // Other attributes + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php'; + + print '
    '.$form->textwithpicto($langs->trans("TotalCost"), $langs->trans("BOMTotalCost")).''.price($object->total_cost).'
    '.$langs->trans("UnitCost").''.price($object->unit_cost).'
    '; + print '
    '; + print '
    '; + + print '
    '; + + print dol_get_fiche_end(); + + + + /* + * Lines + */ + + if (!empty($object->table_element_line)) { + //Products + $res = $object->fetchLinesbytypeproduct(0); $object->calculateCosts(); - print '
    '.$form->textwithpicto($langs->trans("TotalCost"), $langs->trans("BOMTotalCost")).''.price($object->total_cost).'
    '.$langs->trans("UnitCost").''.price($object->unit_cost).'
    '; - print '
    '; - print ''; - - print '
    '; - - print dol_get_fiche_end(); - - - - /* - * Lines - */ - - if (!empty($object->table_element_line)) { - //Products - $res = $object->fetchLinesbytypeproduct(0); - $object->calculateCosts(); - - print ($res == 0 && $object->status >= $object::STATUS_VALIDATED) ? '' : load_fiche_titre($langs->trans('BOMProductsList'), '', 'product'); - - print '
    + print ' @@ -579,78 +579,30 @@ if (empty($reshook)) { '; - if (!empty($conf->use_javascript_ajax) && $object->status == 0) { - include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php'; - } + if (!empty($conf->use_javascript_ajax) && $object->status == 0) { + include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php'; + } - print '
    '; - if (!empty($object->lines) || ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action != 'selectlines' && $action != 'editline')) { - print ''; - } + print '
    '; + if (!empty($object->lines) || ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action != 'selectlines' && $action != 'editline')) { + print '
    '; + } - if (!empty($object->lines)) { - $object->printObjectLines($action, $mysoc, null, GETPOST('lineid', 'int'), 1, '/bom/tpl'); - } + if (!empty($object->lines)) { + $object->printObjectLines($action, $mysoc, null, GETPOST('lineid', 'int'), 1, '/bom/tpl'); + } - // Form to add new line - if ($object->status == 0 && $permissiontoadd && $action != 'selectlines') { - if ($action != 'editline') { - // Add products/services form + // Form to add new line + if ($object->status == 0 && $permissiontoadd && $action != 'selectlines') { + if ($action != 'editline') { + // Add products/services form - $parameters = array(); - $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook - if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); - if (empty($reshook)) + $parameters = array(); + $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + if (empty($reshook)) $object->formAddObjectLine(1, $mysoc, null, '/bom/tpl'); - } - } - - if (!empty($object->lines) || ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action != 'selectlines' && $action != 'editline')) { - print '
    '; - } - print '
    '; - - print "
    \n"; - - //Services - $filtertype = 1; - $res = $object->fetchLinesbytypeproduct(1); - $object->calculateCosts(); - - print ($res == 0 && $object->status >= $object::STATUS_VALIDATED) ? '' : load_fiche_titre($langs->trans('BOMServicesList'), '', 'service'); - - print '
    - - - - - '; - - if (!empty($conf->use_javascript_ajax) && $object->status == 0) { - $tagidfortablednd = 'tablelinesservice'; - include DOL_DOCUMENT_ROOT . '/core/tpl/ajaxrow.tpl.php'; - } - - print '
    '; - if (!empty($object->lines) || ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action != 'selectlines' && $action != 'editline')) { - print ''; - } - - if (!empty($object->lines)) { - $object->printObjectLines($action, $mysoc, null, GETPOST('lineid', 'int'), 1, '/bom/tpl'); - } - - // Form to add new line - if ($object->status == 0 && $permissiontoadd && $action != 'selectlines') { - if ($action != 'editline') { - // Add services form - $parameters = array(); - $reshook = $hookmanager->executeHooks('formAddObjectServiceLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook - if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); - if (empty($reshook)) - $object->formAddObjectLine(1, $mysoc, null, '/bom/tpl'); - } } } @@ -661,9 +613,58 @@ if (empty($reshook)) { print "\n"; - mrpCollapseBomManagement(); + //Services + $filtertype = 1; + $res = $object->fetchLinesbytypeproduct(1); + $object->calculateCosts(); + + print ($res == 0 && $object->status >= $object::STATUS_VALIDATED) ? '' : load_fiche_titre($langs->trans('BOMServicesList'), '', 'service'); + + print ' + + + + + '; + + if (!empty($conf->use_javascript_ajax) && $object->status == 0) { + $tagidfortablednd = 'tablelinesservice'; + include DOL_DOCUMENT_ROOT . '/core/tpl/ajaxrow.tpl.php'; + } + + print '
    '; + if (!empty($object->lines) || ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action != 'selectlines' && $action != 'editline')) { + print '
    '; + } + + if (!empty($object->lines)) { + $object->printObjectLines($action, $mysoc, null, GETPOST('lineid', 'int'), 1, '/bom/tpl'); + } + + // Form to add new line + if ($object->status == 0 && $permissiontoadd && $action != 'selectlines') { + if ($action != 'editline') { + // Add services form + $parameters = array(); + $reshook = $hookmanager->executeHooks('formAddObjectServiceLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + if (empty($reshook)) + $object->formAddObjectLine(1, $mysoc, null, '/bom/tpl'); + } + } } + if (!empty($object->lines) || ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action != 'selectlines' && $action != 'editline')) { + print '
    '; + } + print '
    '; + + print "\n"; + + + mrpCollapseBomManagement(); + + $res = $object->fetchLines(); // Buttons for actions @@ -733,18 +734,18 @@ if (empty($reshook)) { } /* - if ($user->rights->bom->write) - { - if ($object->status == 1) - { - print ''.$langs->trans("Disable").''."\n"; - } - else - { - print ''.$langs->trans("Enable").''."\n"; - } - } - */ + if ($user->rights->bom->write) + { + if ($object->status == 1) + { + print ''.$langs->trans("Disable").''."\n"; + } + else + { + print ''.$langs->trans("Enable").''."\n"; + } + } + */ // Delete print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $permissiontodelete); @@ -804,6 +805,7 @@ if (empty($reshook)) { include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php'; } + // End of page llxFooter(); $db->close(); diff --git a/htdocs/bom/bom_net_needs.php b/htdocs/bom/bom_net_needs.php index 1b8afa91e52..60736d085da 100644 --- a/htdocs/bom/bom_net_needs.php +++ b/htdocs/bom/bom_net_needs.php @@ -187,8 +187,8 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea print dol_get_fiche_end(); - $viewlink = dolGetButtonTitle($langs->trans('GroupByProduct'), '', 'fa fa-bars imgforviewmode', $_SERVER['PHP_SELF'].'?id='.$object->id.'&token='.newToken(), '', 1, array('morecss' => 'reposition '.($action !== 'treeview' ? 'btnTitleSelected':''))); - $viewlink .= dolGetButtonTitle($langs->trans('TreeStructure'), '', 'fa fa-stream imgforviewmode', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=treeview&token='.newToken(), '', 1, array('morecss' => 'reposition marginleftonly '.($action == 'treeview' ? 'btnTitleSelected':''))); + $viewlink = dolGetButtonTitle($langs->trans('GroupByX', $langs->transnoentitiesnoconv("Products")), '', 'fa fa-bars imgforviewmode', $_SERVER['PHP_SELF'].'?id='.$object->id.'&token='.newToken(), '', 1, array('morecss' => 'reposition '.($action !== 'treeview' ? 'btnTitleSelected':''))); + $viewlink .= dolGetButtonTitle($langs->trans('TreeView'), '', 'fa fa-stream imgforviewmode', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=treeview&token='.newToken(), '', 1, array('morecss' => 'reposition marginleftonly '.($action == 'treeview' ? 'btnTitleSelected':''))); print load_fiche_titre($langs->trans("BOMNetNeeds"), $viewlink, ''); diff --git a/htdocs/bom/class/bom.class.php b/htdocs/bom/class/bom.class.php index 059f558fd17..a213e788113 100644 --- a/htdocs/bom/class/bom.class.php +++ b/htdocs/bom/class/bom.class.php @@ -104,7 +104,7 @@ class BOM extends CommonObject //'bomtype' => array('type'=>'integer', 'label'=>'Type', 'enabled'=>1, 'visible'=>-1, 'position'=>32, 'notnull'=>1, 'default'=>'0', 'arrayofkeyval'=>array(0=>'Manufacturing')), 'fk_product' => array('type'=>'integer:Product:product/class/product.class.php:1:((finished:is:null) or (finished:!=:0))', 'label'=>'Product', 'picto'=>'product', 'enabled'=>1, 'visible'=>1, 'position'=>35, 'notnull'=>1, 'index'=>1, 'help'=>'ProductBOMHelp', 'css'=>'maxwidth500', 'csslist'=>'tdoverflowmax100'), 'description' => array('type'=>'text', 'label'=>'Description', 'enabled'=>1, 'visible'=>-1, 'position'=>60, 'notnull'=>-1,), - 'qty' => array('type'=>'real', 'label'=>'Quantity', 'enabled'=>1, 'visible'=>1, 'default'=>1, 'position'=>55, 'notnull'=>1, 'isameasure'=>'1', 'css'=>'maxwidth75imp'), + 'qty' => array('type'=>'real', 'label'=>'Quantity', 'enabled'=>1, 'visible'=>1, 'default'=>1, 'position'=>55, 'notnull'=>1, 'isameasure'=>'1', 'css'=>'maxwidth50imp right'), //'efficiency' => array('type'=>'real', 'label'=>'ManufacturingEfficiency', 'enabled'=>1, 'visible'=>-1, 'default'=>1, 'position'=>100, 'notnull'=>0, 'css'=>'maxwidth50imp', 'help'=>'ValueOfMeansLossForProductProduced'), 'duration' => array('type'=>'duration', 'label'=>'EstimatedDuration', 'enabled'=>1, 'visible'=>-1, 'position'=>101, 'notnull'=>-1, 'css'=>'maxwidth50imp', 'help'=>'EstimatedDurationDesc'), 'fk_warehouse' => array('type'=>'integer:Entrepot:product/stock/class/entrepot.class.php:0', 'label'=>'WarehouseForProduction', 'picto'=>'stock', 'enabled'=>1, 'visible'=>-1, 'position'=>102, 'css'=>'maxwidth500', 'csslist'=>'tdoverflowmax100'), diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index 45119814420..a79a5083b69 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -919,6 +919,7 @@ NotAllExportedMovementsCouldBeRecordedAsExported=Not all exported movements coul Miscellaneous=Miscellaneous Calendar=Calendar GroupBy=Group by... +GroupByX=Group by %s ViewFlatList=View flat list ViewAccountList=View ledger ViewSubAccountList=View subaccount ledger @@ -1213,4 +1214,4 @@ InternalUser=Internal user ExternalUser=External user NoSpecificContactAddress=No specific contact or address NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. - +TreeView=Tree view diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 3246ce3fb23..ca7df8be394 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -3813,12 +3813,12 @@ table.liste, table.noborder, table.formdoc, div.noborder { box-shadow: 1px 1px 5px #ddd; */ } -#tablelines { +#tablelines, #tablelinesservice { border-bottom-width: 1px; border-bottom-color: var(--colortopbordertitle1); border-bottom-style: solid; } -table.liste tr:last-of-type td, table.noborder:not(#tablelines) tr:last-of-type td, table.formdoc tr:last-of-type td, div.noborder tr:last-of-type td { +table.liste tr:last-of-type td, table.noborder:not(#tablelines):not(#tablelinesservice) tr:last-of-type td, table.formdoc tr:last-of-type td, div.noborder tr:last-of-type td { border-bottom-width: 1px; border-bottom-color: var(--colortopbordertitle1); border-bottom-style: solid; @@ -4371,10 +4371,10 @@ div.tabBar .noborder { box-shadow: 0px 0px 0px #DDD !important; } -#tablelines tr.liste_titre td, .paymenttable tr.liste_titre td, .margintable tr.liste_titre td, .tableforservicepart1 tr.liste_titre td { +#tablelines tr.liste_titre td, #tablelinesservice tr.liste_titre td, .paymenttable tr.liste_titre td, .margintable tr.liste_titre td, .tableforservicepart1 tr.liste_titre td { border-bottom: 1px solid var(--colortopbordertitle1) !important; } -#tablelines tr td { +#tablelines tr td, #tablelinesservice tr td { height: unset; } diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index d0ba44f3b23..780059e3a8f 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -4480,10 +4480,10 @@ div .tdtop:not(.tagtdnote) { padding-bottom: 0px !important; } -#tablelines tr.liste_titre td, .paymenttable tr.liste_titre td, .margintable tr.liste_titre td, .tableforservicepart1 tr.liste_titre td { +#tablelines tr.liste_titre td, #tablelinesservice tr.liste_titre td, .paymenttable tr.liste_titre td, .margintable tr.liste_titre td, .tableforservicepart1 tr.liste_titre td { border-bottom: 1px solid #AAA !important; } -#tablelines tr td { +#tablelines tr td, #tablelinesservice tr td { height: unset; } From 5e8e4551fb0ecfbe3c6cbd1d935cbd3c728d8e4d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 31 Jan 2023 20:07:08 +0100 Subject: [PATCH 1123/1128] Debug v17 --- htdocs/bom/bom_card.php | 10 +++++----- htdocs/bom/tpl/objectline_create.tpl.php | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/bom/bom_card.php b/htdocs/bom/bom_card.php index dcb5d02b260..9aa7d084ef1 100644 --- a/htdocs/bom/bom_card.php +++ b/htdocs/bom/bom_card.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2017-2023 Laurent Destailleur * Copyright (C) 2019 Frédéric France * * This program is free software; you can redistribute it and/or modify @@ -565,7 +565,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea */ if (!empty($object->table_element_line)) { - //Products + // Products $res = $object->fetchLinesbytypeproduct(0); $object->calculateCosts(); @@ -613,7 +613,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea print "\n"; - //Services + // Services $filtertype = 1; $res = $object->fetchLinesbytypeproduct(1); $object->calculateCosts(); @@ -657,9 +657,9 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea if (!empty($object->lines) || ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action != 'selectlines' && $action != 'editline')) { print '
    '; } - print '
    '; + print ''; - print "\n"; + print "\n"; mrpCollapseBomManagement(); diff --git a/htdocs/bom/tpl/objectline_create.tpl.php b/htdocs/bom/tpl/objectline_create.tpl.php index e644c7813e7..b57196bb9a8 100644 --- a/htdocs/bom/tpl/objectline_create.tpl.php +++ b/htdocs/bom/tpl/objectline_create.tpl.php @@ -107,7 +107,7 @@ print '
    '; if (isModEnabled("product") || isModEnabled("service")) { if ($filtertype == 1) { print $langs->trans("Service"); - } elseif (!empty($conf->global->BOM_SUB_BOM)) { + } else { print $langs->trans("Product"); } echo ''; From 19eced39819135e53cad45d5ae32161566677c1e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 31 Jan 2023 20:10:39 +0100 Subject: [PATCH 1124/1128] css --- htdocs/eventorganization/class/conferenceorbooth.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/eventorganization/class/conferenceorbooth.class.php b/htdocs/eventorganization/class/conferenceorbooth.class.php index b3232f079f6..7dd9ff7303e 100644 --- a/htdocs/eventorganization/class/conferenceorbooth.class.php +++ b/htdocs/eventorganization/class/conferenceorbooth.class.php @@ -106,7 +106,7 @@ class ConferenceOrBooth extends ActionComm 'id' => array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>'1', 'position'=>1, 'notnull'=>1, 'visible'=>0, 'noteditable'=>'1', 'index'=>1, 'css'=>'left', 'comment'=>"Id"), 'ref' => array('type'=>'integer', 'label'=>'Ref', 'enabled'=>'1', 'position'=>1, 'notnull'=>1, 'visible'=>2, 'noteditable'=>'1', 'index'=>1, 'css'=>'left', 'csslist'=>'left', 'comment'=>"Id"), 'label' => array('type'=>'varchar(255)', 'label'=>'Label', 'enabled'=>'1', 'position'=>30, 'notnull'=>1, 'visible'=>1, 'searchall'=>1, 'css'=>'minwidth300', 'csslist'=>'tdoverflowmax125', 'help'=>"OrganizationEvenLabelName", 'showoncombobox'=>'1', 'autofocusoncreate'=>1), - 'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php:1:status=1 AND entity IN (__SHARED_ENTITIES__)', 'label'=>'ThirdParty', 'enabled'=>'$conf->societe->enabled', 'position'=>50, 'notnull'=>-1, 'visible'=>1, 'index'=>1, 'help'=>"OrganizationEventLinkToThirdParty", 'picto'=>'company', 'csslist'=>'tdoverflowmax150', 'css'=>'maxwidth500'), + 'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php:1:status=1 AND entity IN (__SHARED_ENTITIES__)', 'label'=>'ThirdParty', 'enabled'=>'$conf->societe->enabled', 'position'=>50, 'notnull'=>-1, 'visible'=>1, 'index'=>1, 'help'=>"OrganizationEventLinkToThirdParty", 'picto'=>'company', 'csslist'=>'tdoverflowmax125', 'css'=>'maxwidth500'), 'fk_project' => array('type'=>'integer:Project:projet/class/project.class.php:1:t.usage_organize_event=1', 'label'=>'Project', 'enabled'=>"isModEnabled('project')", 'position'=>52, 'notnull'=>-1, 'visible'=>-1, 'index'=>1, 'picto'=>'project', 'css'=>'tdoverflowmax150 maxwidth500', 'csslist'=>'width100'), 'note' => array('type'=>'text', 'label'=>'Description', 'enabled'=>'1', 'position'=>60, 'notnull'=>0, 'visible'=>3), 'fk_action' => array('type'=>'sellist:c_actioncomm:libelle:id::module LIKE (\'%@eventorganization\')', 'label'=>'Format', 'enabled'=>'1', 'position'=>60, 'notnull'=>1, 'visible'=>1, 'css'=>'width100'), From 79eacba4d8d26a50890a5b15fa5796610c57ba5b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 31 Jan 2023 20:41:00 +0100 Subject: [PATCH 1125/1128] Add a protection for forged sql filters --- htdocs/core/class/html.form.class.php | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index a9e69ed9b2b..01742ace308 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -7801,7 +7801,7 @@ class Form } /** - * Function to forge a SQL criteria + * Function to forge a SQL criteria from a Dolibarr filter syntax string. * * @param array $matches Array of found string by regex search. Example: "t.ref:like:'SO-%'" or "t.date_creation:<:'20160101'" or "t.nature:is:NULL" * @return string Forged criteria. Example: "t.field like 'abc%'" @@ -7816,7 +7816,7 @@ class Form } $tmp = explode(':', $matches[1]); if (count($tmp) < 3) { - return ''; + return '1=2'; // An always false request } $tmpescaped = $tmp[2]; @@ -7826,7 +7826,19 @@ class Form } else { $tmpescaped = $db->escape($tmpescaped); } - return $db->escape($tmp[0]).' '.strtoupper($db->escape($tmp[1]))." ".$tmpescaped; + + if ($tmp[1] == '!=') { + $tmp[1] = '<>'; + } + + if (preg_match('/[\(\)]/', $tmp[0])) { + return '1=2'; // An always false request + } + if (! in_array($tmp[1], array('<', '>', '<>', 'is', 'isnot', '=', 'like'))) { + return '1=2'; // An always false request + } + + return $db->escape($tmp[0]).' '.strtoupper($db->escape($tmp[1])).' '.$tmpescaped; } /** From 67bf4a3ec05a1e0345cb7f105f2676e59bb6e21c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 31 Jan 2023 20:45:32 +0100 Subject: [PATCH 1126/1128] Debug v17 --- .../class/conferenceorbooth.class.php | 4 +- .../conferenceorbooth_list.php | 194 ++++++++++-------- .../modulebuilder/template/myobject_list.php | 12 +- htdocs/projet/list.php | 11 +- 4 files changed, 118 insertions(+), 103 deletions(-) diff --git a/htdocs/eventorganization/class/conferenceorbooth.class.php b/htdocs/eventorganization/class/conferenceorbooth.class.php index 7dd9ff7303e..b15dcf3e545 100644 --- a/htdocs/eventorganization/class/conferenceorbooth.class.php +++ b/htdocs/eventorganization/class/conferenceorbooth.class.php @@ -106,10 +106,10 @@ class ConferenceOrBooth extends ActionComm 'id' => array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>'1', 'position'=>1, 'notnull'=>1, 'visible'=>0, 'noteditable'=>'1', 'index'=>1, 'css'=>'left', 'comment'=>"Id"), 'ref' => array('type'=>'integer', 'label'=>'Ref', 'enabled'=>'1', 'position'=>1, 'notnull'=>1, 'visible'=>2, 'noteditable'=>'1', 'index'=>1, 'css'=>'left', 'csslist'=>'left', 'comment'=>"Id"), 'label' => array('type'=>'varchar(255)', 'label'=>'Label', 'enabled'=>'1', 'position'=>30, 'notnull'=>1, 'visible'=>1, 'searchall'=>1, 'css'=>'minwidth300', 'csslist'=>'tdoverflowmax125', 'help'=>"OrganizationEvenLabelName", 'showoncombobox'=>'1', 'autofocusoncreate'=>1), + 'fk_project' => array('type'=>'integer:Project:projet/class/project.class.php:1:t.usage_organize_event=1', 'label'=>'Project', 'enabled'=>"isModEnabled('project')", 'position'=>52, 'notnull'=>-1, 'visible'=>1, 'index'=>1, 'picto'=>'project', 'css'=>'tdoverflowmax150 maxwidth500', 'csslist'=>'width100'), 'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php:1:status=1 AND entity IN (__SHARED_ENTITIES__)', 'label'=>'ThirdParty', 'enabled'=>'$conf->societe->enabled', 'position'=>50, 'notnull'=>-1, 'visible'=>1, 'index'=>1, 'help'=>"OrganizationEventLinkToThirdParty", 'picto'=>'company', 'csslist'=>'tdoverflowmax125', 'css'=>'maxwidth500'), - 'fk_project' => array('type'=>'integer:Project:projet/class/project.class.php:1:t.usage_organize_event=1', 'label'=>'Project', 'enabled'=>"isModEnabled('project')", 'position'=>52, 'notnull'=>-1, 'visible'=>-1, 'index'=>1, 'picto'=>'project', 'css'=>'tdoverflowmax150 maxwidth500', 'csslist'=>'width100'), 'note' => array('type'=>'text', 'label'=>'Description', 'enabled'=>'1', 'position'=>60, 'notnull'=>0, 'visible'=>3), - 'fk_action' => array('type'=>'sellist:c_actioncomm:libelle:id::module LIKE (\'%@eventorganization\')', 'label'=>'Format', 'enabled'=>'1', 'position'=>60, 'notnull'=>1, 'visible'=>1, 'css'=>'width100'), + 'fk_action' => array('type'=>'sellist:c_actioncomm:libelle:id::module LIKE (\'%@eventorganization\')', 'label'=>'Format', 'enabled'=>'1', 'position'=>60, 'notnull'=>1, 'visible'=>1, 'css'=>'width100', 'csslist'=>'tdoverflowmax100'), 'datep' => array('type'=>'datetime', 'label'=>'DateStart', 'enabled'=>'1', 'position'=>70, 'notnull'=>0, 'visible'=>1, 'showoncombobox'=>'2',), 'datep2' => array('type'=>'datetime', 'label'=>'DateEnd', 'enabled'=>'1', 'position'=>71, 'notnull'=>0, 'visible'=>1, 'showoncombobox'=>'3',), 'datec' => array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>'1', 'position'=>500, 'notnull'=>1, 'visible'=>-2, 'csslist'=>'nowraponall'), diff --git a/htdocs/eventorganization/conferenceorbooth_list.php b/htdocs/eventorganization/conferenceorbooth_list.php index 21172d774d9..4d8ea00c421 100644 --- a/htdocs/eventorganization/conferenceorbooth_list.php +++ b/htdocs/eventorganization/conferenceorbooth_list.php @@ -44,20 +44,20 @@ global $dolibarr_main_url_root; $langs->loadLangs(array("eventorganization", "other", "projects", "companies")); // Get Parameters -$action = GETPOST('action', 'aZ09') ?GETPOST('action', 'aZ09') : 'view'; // The action 'add', 'create', 'edit', 'update', 'view', ... +$action = GETPOST('action', 'aZ09') ? GETPOST('action', 'aZ09') : 'view'; // The action 'create'/'add', 'edit'/'update', 'view', ... $massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists) $show_files = GETPOST('show_files', 'int'); // Show files area generated by bulk actions ? $confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation $cancel = GETPOST('cancel', 'alpha'); // We click on a Cancel button $toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected into a list -$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'conferenceorboothlist'; // To manage different context of search +$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : str_replace('_', '', basename(dirname(__FILE__)).basename(__FILE__, '.php')); // To manage different context of search $backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print') $mode = GETPOST('mode', 'aZ'); // The output mode ('list', 'kanban', 'hierarchy', 'calendar', ...) $id = GETPOST('id', 'int'); $projectid = GETPOST('projectid', 'int'); -$projectref = GETPOST('ref'); +$projectref = GETPOST('ref', 'alpha'); // Load variable for pagination $limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit; @@ -76,7 +76,7 @@ $pagenext = $page + 1; $object = new ConferenceOrBooth($db); $extrafields = new ExtraFields($db); $diroutputmassaction = $conf->eventorganization->dir_output.'/temp/massgeneration/'.$user->id; -$hookmanager->initHooks(array('conferenceorboothlist')); // Note that conf->hooks_modules contains array +$hookmanager->initHooks(array($contextpage)); // Note that conf->hooks_modules contains array // Fetch optionals attributes and labels $extrafields->fetch_name_optionals_label($object->table_element); @@ -140,8 +140,8 @@ $permissiontoadd = $user->rights->eventorganization->write; $permissiontodelete = $user->rights->eventorganization->delete; // Security check -if (empty($conf->eventorganization->enabled)) { - accessforbidden('Module not enabled'); +if (!isModEnabled('eventorganization')) { + accessforbidden('Module eventorganization not enabled'); } $socid = 0; if ($user->socid > 0) { // Protection if external user @@ -234,7 +234,7 @@ if (empty($reshook)) { $form = new Form($db); $now = dol_now(); -//$help_url="EN:Module_ConferenceOrBooth|FR:Module_ConferenceOrBooth_FR|ES:Módulo_ConferenceOrBooth"; +//$help_url = "EN:Module_ConferenceOrBooth|FR:Module_ConferenceOrBooth_FR|ES:Módulo_ConferenceOrBooth"; $help_url = ''; $title = $langs->trans('ListOfConferencesOrBooths'); $morejs = array(); @@ -772,13 +772,13 @@ foreach ($object->fields as $key => $val) { $cssforfield .= ($cssforfield ? ' ' : '').'center'; } elseif (in_array($val['type'], array('timestamp'))) { $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; - } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $key != 'rowid' && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) { + } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $key != 'rowid' && $key != 'ref' && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) { $cssforfield .= ($cssforfield ? ' ' : '').'right'; } if (!empty($arrayfields['t.'.$key]['checked'])) { - print ''; + print ''; if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) { - print $form->selectarray('search_'.$key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), $val['notnull'], 0, 0, '', 1, 0, 0, '', 'maxwidth100'.($key == 'status' ? ' search_status width100 onrightofpage' : ''), 1); + print $form->selectarray('search_'.$key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), $val['notnull'], 0, 0, '', 1, 0, 0, '', 'maxwidth100'.($key == 'status' ? ' search_status onrightofpage' : ''), 1); } elseif ((strpos($val['type'], 'integer:') === 0) || (strpos($val['type'], 'sellist:') === 0)) { print $object->showInputField($val, $key, (isset($search[$key]) ? $search[$key] : ''), '', '', 'search_', $cssforfield.' maxwidth250', 1); } elseif (preg_match('/^(date|timestamp|datetime)/', $val['type'])) { @@ -831,7 +831,7 @@ foreach ($object->fields as $key => $val) { $cssforfield .= ($cssforfield ? ' ' : '').'center'; } elseif (in_array($val['type'], array('timestamp'))) { $cssforfield .= ($cssforfield ? ' ' : '').'nowrap'; - } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $key != 'rowid' && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) { + } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $key != 'rowid' && $key != 'ref' && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) { $cssforfield .= ($cssforfield ? ' ' : '').'right'; } $cssforfield = preg_replace('/small\s*/', '', $cssforfield); // the 'small' css must not be used for the title label @@ -881,94 +881,110 @@ while ($i < $imaxinloop) { // Store properties in $object $object->setVarsFromFetchObj($obj); - // Show here line of result - $j = 0; - print '
    '; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($object->id, $arrayofselected)) { - $selected = 1; - } - print ''; + if ($mode == 'kanban') { + if ($i == 0) { + print '
    '; + print '
    '; } - print '
    '; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($object->id, $arrayofselected)) { + $selected = 1; + } + print ''; } print ''; - if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - $selected = 0; - if (in_array($object->id, $arrayofselected)) { - $selected = 1; + foreach ($object->fields as $key => $val) { + $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); + if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) { + $cssforfield .= ($cssforfield ? ' ' : '').'center'; + } elseif ($key == 'status') { + $cssforfield .= ($cssforfield ? ' ' : '').'center'; } - print ''; - } - print '
    '; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($object->id, $arrayofselected)) { + $selected = 1; + } + print ''; + } + print '
    '; // Action column -if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { +if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { print ''; }*/ // Action column -if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { +if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { print ''; -if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { +if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n"; } foreach ($object->fields as $key => $val) { @@ -649,7 +649,7 @@ print $hookmanager->resPrint; $totalarray['nbfield']++; }*/ // Action column -if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { +if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n"; } $totalarray['nbfield']++; @@ -699,7 +699,7 @@ while ($i < $imaxinloop) { $j = 0; print ''; // Action column - if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { print ''; }*/ // Action column - if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) { print ''; } if (!empty($arrayfields['p.fk_statut']['checked'])) { - print ''; } // Action column @@ -1298,7 +1297,7 @@ if (!empty($arrayfields['p.import_key']['checked'])) { print_liste_field_titre($arrayfields['p.import_key']['label'], $_SERVER["PHP_SELF"], "p.import_key", "", $param, '', $sortfield, $sortorder, ''); } if (!empty($arrayfields['p.fk_statut']['checked'])) { - print_liste_field_titre($arrayfields['p.fk_statut']['label'], $_SERVER["PHP_SELF"], "p.fk_statut", "", $param, '', $sortfield, $sortorder, 'right '); + print_liste_field_titre($arrayfields['p.fk_statut']['label'], $_SERVER["PHP_SELF"], "p.fk_statut", "", $param, '', $sortfield, $sortorder, 'center '); } if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch '); @@ -1771,7 +1770,7 @@ while ($i < $imaxinloop) { } // Status if (!empty($arrayfields['p.fk_statut']['checked'])) { - print ''; + print ''; if (!$i) { $totalarray['nbfield']++; } From 36cf05318bf58a447b2123169d95cf15a9b542de Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 31 Jan 2023 21:17:06 +0100 Subject: [PATCH 1127/1128] Debug v17 --- htdocs/core/class/html.formprojet.class.php | 5 +++++ htdocs/core/lib/functions.lib.php | 16 ++++++++----- htdocs/core/lib/security.lib.php | 4 +++- htdocs/core/modules/modTicket.class.php | 2 +- htdocs/projet/card.php | 4 +++- htdocs/projet/comment.php | 2 +- htdocs/projet/contact.php | 2 +- htdocs/projet/element.php | 25 ++++++++++----------- htdocs/projet/ganttview.php | 2 +- htdocs/projet/tasks.php | 2 +- htdocs/projet/tasks/task.php | 2 +- htdocs/projet/tasks/time.php | 4 ++-- htdocs/ticket/class/ticket.class.php | 2 +- 13 files changed, 42 insertions(+), 30 deletions(-) diff --git a/htdocs/core/class/html.formprojet.class.php b/htdocs/core/class/html.formprojet.class.php index a0e74c5cdd5..e05931f437d 100644 --- a/htdocs/core/class/html.formprojet.class.php +++ b/htdocs/core/class/html.formprojet.class.php @@ -39,6 +39,9 @@ class FormProjets */ public $error = ''; + public $errors = array(); + + public $nboftasks; @@ -622,6 +625,8 @@ class FormProjets if ($resql) { $num = $this->db->num_rows($resql); $i = 0; + $sellist = ''; + if ($num > 0) { $sellist = ''; @@ -1443,9 +1443,11 @@ if ($action == 'create' && $user->rights->projet->creer) { '; } + /* * Actions Buttons */ + print '
    '; $parameters = array(); $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been diff --git a/htdocs/projet/comment.php b/htdocs/projet/comment.php index 024dce3abc9..7103916cdb4 100644 --- a/htdocs/projet/comment.php +++ b/htdocs/projet/comment.php @@ -136,7 +136,7 @@ print ''; // Budget print '
    '; diff --git a/htdocs/projet/contact.php b/htdocs/projet/contact.php index f6827fc19b3..2174a02c347 100644 --- a/htdocs/projet/contact.php +++ b/htdocs/projet/contact.php @@ -387,7 +387,7 @@ if ($id > 0 || !empty($ref)) { // Budget print ''; diff --git a/htdocs/projet/element.php b/htdocs/projet/element.php index 7bad7fd493d..8f548685631 100644 --- a/htdocs/projet/element.php +++ b/htdocs/projet/element.php @@ -291,14 +291,14 @@ if (!empty($conf->global->PROJECT_USE_OPPORTUNITIES)) { // Opportunity percent print ''; // Opportunity Amount print ''; @@ -657,7 +657,6 @@ if (!empty($conf->global->PROJECT_ELEMENTS_FOR_MINUS_MARGIN)) { } - $parameters = array('listofreferent'=>$listofreferent); $resHook = $hookmanager->executeHooks('completeListOfReferent', $parameters, $object, $action); @@ -693,7 +692,7 @@ if (!$showdatefilter) { print '
    '; print '
    '; print ''; - print ''; + print ''; print ''; print '
    '; print $form->selectDate($dates, 'dates', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From")); @@ -730,7 +729,7 @@ $tooltiponprofitplus = $tooltiponprofitminus = ''; foreach ($listofreferent as $key => $value) { $name = $langs->trans($value['name']); $qualified = $value['test']; - $margin = $value['margin']; + $margin = empty($value['margin']) ? 0 : $value['margin']; if ($qualified && isset($margin)) { // If this element must be included into profit calculation ($margin is 'minus' or 'add') if ($margin == 'add') { $tooltiponprofitplus .= ' > '.$name." (+)
    \n"; @@ -777,8 +776,8 @@ foreach ($listofreferent as $key => $value) { $tablename = $value['table']; $datefieldname = $value['datefieldname']; $qualified = $value['test']; - $margin = $value['margin']; - $project_field = $value['project_field']; + $margin = empty($value['margin']) ? 0 : $value['margin']; + $project_field = empty($value['project_field']) ? '' : $value['project_field']; if ($qualified && isset($margin)) { // If this element must be included into profit calculation ($margin is 'minus' or 'add') $element = new $classname($db); @@ -990,11 +989,11 @@ foreach ($listofreferent as $key => $value) { $tablename = $value['table']; $datefieldname = $value['datefieldname']; $qualified = $value['test']; - $langtoload = $value['lang']; - $urlnew = $value['urlnew']; - $buttonnew = $value['buttonnew']; - $testnew = $value['testnew']; - $project_field = $value['project_field']; + $langtoload = empty($value['lang']) ? '' : $value['lang']; + $urlnew = empty($value['urlnew']) ? '' : $value['urlnew']; + $buttonnew = empty($value['buttonnew']) ? '' : $value['buttonnew']; + $testnew = empty($value['testnew']) ? '' : $value['testnew']; + $project_field = empty($value['project_field']) ? '' : $value['project_field']; $exclude_select_element = array('payment_various'); if (!empty($value['exclude_select_element'])) { diff --git a/htdocs/projet/ganttview.php b/htdocs/projet/ganttview.php index f2889d7c469..dea34c4badc 100644 --- a/htdocs/projet/ganttview.php +++ b/htdocs/projet/ganttview.php @@ -181,7 +181,7 @@ if (($id > 0 && is_numeric($id)) || !empty($ref)) { // Budget print '
    '; diff --git a/htdocs/projet/tasks.php b/htdocs/projet/tasks.php index 3322b63b171..d3097631a6f 100644 --- a/htdocs/projet/tasks.php +++ b/htdocs/projet/tasks.php @@ -616,7 +616,7 @@ if ($id > 0 || !empty($ref)) { // Budget print ''; diff --git a/htdocs/projet/tasks/task.php b/htdocs/projet/tasks/task.php index fccf9d2ffe1..dfa26202a2d 100644 --- a/htdocs/projet/tasks/task.php +++ b/htdocs/projet/tasks/task.php @@ -632,7 +632,7 @@ if ($id > 0 || !empty($ref)) { // Budget print ''; diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index 94ed0edaffd..139a1711658 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -1004,7 +1004,7 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser // Budget print ''; @@ -2616,7 +2616,7 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser if (!count($tasks)) { $totalnboffields = 1; foreach ($arrayfields as $value) { - if ($value['checked']) { + if (!empty($value['checked'])) { $totalnboffields++; } } diff --git a/htdocs/ticket/class/ticket.class.php b/htdocs/ticket/class/ticket.class.php index d4e0148f662..05c724b718e 100644 --- a/htdocs/ticket/class/ticket.class.php +++ b/htdocs/ticket/class/ticket.class.php @@ -294,7 +294,7 @@ class Ticket extends CommonObject 'email_msgid' => array('type'=>'varchar(255)', 'label'=>'EmailMsgID', 'visible'=>-2, 'enabled'=>1, 'position'=>540, 'notnull'=>-1, 'help'=>'EmailMsgIDDesc'), 'email_date' => array('type'=>'datetime', 'label'=>'EmailDate', 'visible'=>-2, 'enabled'=>1, 'position'=>541), 'progress' => array('type'=>'integer', 'label'=>'Progression', 'visible'=>-1, 'enabled'=>1, 'position'=>540, 'notnull'=>-1, 'css'=>'right', 'help'=>"", 'isameasure'=>2, 'csslist'=>'width50'), - 'resolution' => array('type'=>'integer', 'label'=>'Resolution', 'visible'=>-1, 'enabled'=>'$conf->global->TICKET_ENABLE_RESOLUTION', 'position'=>550, 'notnull'=>1), + 'resolution' => array('type'=>'integer', 'label'=>'Resolution', 'visible'=>-1, 'enabled'=>'getDolGlobalString("TICKET_ENABLE_RESOLUTION")', 'position'=>550, 'notnull'=>1), 'fk_statut' => array('type'=>'integer', 'label'=>'Status', 'visible'=>1, 'enabled'=>1, 'position'=>600, 'notnull'=>1, 'index'=>1, 'arrayofkeyval'=>array(0 => 'Unread', 1 => 'Read', 3 => 'Answered', 4 => 'Assigned', 5 => 'InProgress', 6 => 'Waiting', 8 => 'SolvedClosed', 9 => 'Deleted')), 'import_key' =>array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>1, 'visible'=>-2, 'position'=>900), ); From 670d77ce34423e96fc4ec44b5e5bea3c07c514e6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 31 Jan 2023 23:41:05 +0100 Subject: [PATCH 1128/1128] Sync transifex --- htdocs/langs/ar_IQ/companies.lang | 3 + htdocs/langs/ar_SA/accountancy.lang | 19 +- htdocs/langs/ar_SA/main.lang | 26 +- htdocs/langs/ar_SA/stripe.lang | 8 +- htdocs/langs/ar_SA/ticket.lang | 3 + htdocs/langs/ar_SA/users.lang | 6 +- htdocs/langs/bg_BG/accountancy.lang | 19 +- htdocs/langs/bg_BG/main.lang | 26 +- htdocs/langs/bg_BG/stripe.lang | 9 +- htdocs/langs/bg_BG/ticket.lang | 3 + htdocs/langs/bg_BG/users.lang | 6 +- htdocs/langs/bs_BA/accountancy.lang | 19 +- htdocs/langs/bs_BA/users.lang | 6 +- htdocs/langs/ca_ES/accountancy.lang | 31 +- htdocs/langs/ca_ES/admin.lang | 13 +- htdocs/langs/ca_ES/bills.lang | 8 +- htdocs/langs/ca_ES/blockedlog.lang | 52 +-- htdocs/langs/ca_ES/companies.lang | 9 +- htdocs/langs/ca_ES/cron.lang | 6 +- htdocs/langs/ca_ES/errors.lang | 2 + htdocs/langs/ca_ES/eventorganization.lang | 2 + htdocs/langs/ca_ES/main.lang | 26 +- htdocs/langs/ca_ES/members.lang | 2 +- htdocs/langs/ca_ES/orders.lang | 7 + htdocs/langs/ca_ES/projects.lang | 5 +- htdocs/langs/ca_ES/stocks.lang | 4 +- htdocs/langs/ca_ES/stripe.lang | 12 +- htdocs/langs/ca_ES/ticket.lang | 3 + htdocs/langs/ca_ES/users.lang | 11 +- htdocs/langs/ca_ES/withdrawals.lang | 10 +- htdocs/langs/ca_ES/zapier.lang | 2 +- htdocs/langs/cs_CZ/accountancy.lang | 19 +- htdocs/langs/cs_CZ/main.lang | 26 +- htdocs/langs/cs_CZ/stripe.lang | 9 +- htdocs/langs/cs_CZ/ticket.lang | 3 + htdocs/langs/cs_CZ/users.lang | 6 +- htdocs/langs/cy_GB/accountancy.lang | 19 +- htdocs/langs/cy_GB/main.lang | 26 +- htdocs/langs/cy_GB/stripe.lang | 9 +- htdocs/langs/cy_GB/users.lang | 6 +- htdocs/langs/da_DK/accountancy.lang | 19 +- htdocs/langs/da_DK/admin.lang | 11 + htdocs/langs/da_DK/boxes.lang | 1 + htdocs/langs/da_DK/companies.lang | 9 +- htdocs/langs/da_DK/errors.lang | 2 + htdocs/langs/da_DK/eventorganization.lang | 2 + htdocs/langs/da_DK/main.lang | 26 +- htdocs/langs/da_DK/mrp.lang | 1 + htdocs/langs/da_DK/orders.lang | 7 + htdocs/langs/da_DK/projects.lang | 1 + htdocs/langs/da_DK/stripe.lang | 10 +- htdocs/langs/da_DK/ticket.lang | 3 + htdocs/langs/da_DK/users.lang | 6 +- htdocs/langs/da_DK/website.lang | 2 + htdocs/langs/de_AT/stripe.lang | 3 + htdocs/langs/de_CH/accountancy.lang | 5 +- htdocs/langs/de_CH/companies.lang | 1 - htdocs/langs/de_CH/main.lang | 8 +- htdocs/langs/de_CH/stripe.lang | 3 + htdocs/langs/de_CH/users.lang | 1 + htdocs/langs/de_DE/accountancy.lang | 21 +- htdocs/langs/de_DE/admin.lang | 29 +- htdocs/langs/de_DE/boxes.lang | 1 + htdocs/langs/de_DE/categories.lang | 8 +- htdocs/langs/de_DE/companies.lang | 21 +- htdocs/langs/de_DE/errors.lang | 2 + htdocs/langs/de_DE/eventorganization.lang | 2 + htdocs/langs/de_DE/hrm.lang | 2 +- htdocs/langs/de_DE/mails.lang | 8 +- htdocs/langs/de_DE/main.lang | 24 +- htdocs/langs/de_DE/mrp.lang | 7 +- htdocs/langs/de_DE/orders.lang | 7 + htdocs/langs/de_DE/other.lang | 2 +- htdocs/langs/de_DE/projects.lang | 1 + htdocs/langs/de_DE/stripe.lang | 10 +- htdocs/langs/de_DE/ticket.lang | 3 + htdocs/langs/de_DE/users.lang | 6 +- htdocs/langs/de_DE/website.lang | 2 + htdocs/langs/el_CY/stripe.lang | 3 + htdocs/langs/el_GR/accountancy.lang | 23 +- htdocs/langs/el_GR/admin.lang | 39 +- htdocs/langs/el_GR/bills.lang | 4 +- htdocs/langs/el_GR/boxes.lang | 3 +- htdocs/langs/el_GR/commercial.lang | 16 +- htdocs/langs/el_GR/companies.lang | 19 +- htdocs/langs/el_GR/errors.lang | 2 + htdocs/langs/el_GR/eventorganization.lang | 2 + htdocs/langs/el_GR/holiday.lang | 39 +- htdocs/langs/el_GR/hrm.lang | 8 +- htdocs/langs/el_GR/main.lang | 38 +- htdocs/langs/el_GR/mrp.lang | 1 + htdocs/langs/el_GR/orders.lang | 13 +- htdocs/langs/el_GR/other.lang | 2 +- htdocs/langs/el_GR/products.lang | 104 ++--- htdocs/langs/el_GR/projects.lang | 3 +- htdocs/langs/el_GR/propal.lang | 10 +- htdocs/langs/el_GR/stripe.lang | 10 +- htdocs/langs/el_GR/ticket.lang | 3 + htdocs/langs/el_GR/users.lang | 21 +- htdocs/langs/el_GR/website.lang | 2 + htdocs/langs/en_AE/stripe.lang | 3 + htdocs/langs/en_AU/stripe.lang | 3 + htdocs/langs/en_CA/stripe.lang | 3 + htdocs/langs/en_GB/accountancy.lang | 2 +- htdocs/langs/en_GB/stripe.lang | 3 + htdocs/langs/en_IN/stripe.lang | 3 + htdocs/langs/en_SG/stripe.lang | 3 + htdocs/langs/en_ZA/stripe.lang | 3 + htdocs/langs/es_AR/accountancy.lang | 6 +- htdocs/langs/es_AR/main.lang | 7 +- htdocs/langs/es_AR/stripe.lang | 3 + htdocs/langs/es_AR/users.lang | 1 - htdocs/langs/es_BO/stripe.lang | 3 + htdocs/langs/es_CL/accountancy.lang | 4 +- htdocs/langs/es_CL/main.lang | 7 +- htdocs/langs/es_CL/stripe.lang | 3 +- htdocs/langs/es_CL/users.lang | 1 - htdocs/langs/es_CO/accountancy.lang | 14 +- htdocs/langs/es_CO/admin.lang | 5 - htdocs/langs/es_CO/companies.lang | 7 +- htdocs/langs/es_CO/eventorganization.lang | 3 - htdocs/langs/es_CO/main.lang | 13 +- htdocs/langs/es_CO/mrp.lang | 1 - htdocs/langs/es_CO/stripe.lang | 3 +- htdocs/langs/es_CO/users.lang | 1 - htdocs/langs/es_CR/accountancy.lang | 3 + htdocs/langs/es_CR/admin.lang | 5 + htdocs/langs/es_CR/companies.lang | 4 + htdocs/langs/es_CR/stripe.lang | 3 + htdocs/langs/es_DO/stripe.lang | 3 + htdocs/langs/es_EC/accountancy.lang | 3 +- htdocs/langs/es_EC/main.lang | 7 +- htdocs/langs/es_EC/stripe.lang | 3 +- htdocs/langs/es_EC/users.lang | 1 - htdocs/langs/es_ES/accountancy.lang | 75 ++-- htdocs/langs/es_ES/admin.lang | 25 +- htdocs/langs/es_ES/boxes.lang | 1 + htdocs/langs/es_ES/companies.lang | 13 +- htdocs/langs/es_ES/errors.lang | 2 + htdocs/langs/es_ES/eventorganization.lang | 8 +- htdocs/langs/es_ES/main.lang | 40 +- htdocs/langs/es_ES/mrp.lang | 7 +- htdocs/langs/es_ES/orders.lang | 7 + htdocs/langs/es_ES/stripe.lang | 10 +- htdocs/langs/es_ES/ticket.lang | 3 + htdocs/langs/es_ES/users.lang | 6 +- htdocs/langs/es_GT/stripe.lang | 3 + htdocs/langs/es_HN/stripe.lang | 3 + htdocs/langs/es_MX/accountancy.lang | 3 +- htdocs/langs/es_MX/stripe.lang | 3 + htdocs/langs/es_PA/stripe.lang | 3 + htdocs/langs/es_PE/accountancy.lang | 4 +- htdocs/langs/es_PE/stripe.lang | 3 + htdocs/langs/es_PY/stripe.lang | 3 + htdocs/langs/es_US/stripe.lang | 3 + htdocs/langs/es_UY/stripe.lang | 3 + htdocs/langs/es_VE/accountancy.lang | 3 + htdocs/langs/es_VE/stripe.lang | 3 + htdocs/langs/et_EE/users.lang | 6 +- htdocs/langs/fa_IR/accountancy.lang | 19 +- htdocs/langs/fa_IR/main.lang | 26 +- htdocs/langs/fa_IR/ticket.lang | 3 + htdocs/langs/fa_IR/users.lang | 6 +- htdocs/langs/fi_FI/accountancy.lang | 19 +- htdocs/langs/fi_FI/ticket.lang | 3 + htdocs/langs/fi_FI/users.lang | 6 +- htdocs/langs/fr_BE/stripe.lang | 3 + htdocs/langs/fr_CA/accountancy.lang | 5 +- htdocs/langs/fr_CA/categories.lang | 1 - htdocs/langs/fr_CH/stripe.lang | 3 + htdocs/langs/fr_CI/stripe.lang | 3 + htdocs/langs/fr_CM/stripe.lang | 3 + htdocs/langs/fr_FR/accountancy.lang | 73 ++-- htdocs/langs/fr_FR/admin.lang | 27 +- htdocs/langs/fr_FR/bills.lang | 2 +- htdocs/langs/fr_FR/boxes.lang | 1 + htdocs/langs/fr_FR/categories.lang | 30 +- htdocs/langs/fr_FR/companies.lang | 11 +- htdocs/langs/fr_FR/compta.lang | 10 +- htdocs/langs/fr_FR/contracts.lang | 1 - htdocs/langs/fr_FR/errors.lang | 2 + htdocs/langs/fr_FR/eventorganization.lang | 2 + htdocs/langs/fr_FR/holiday.lang | 8 +- htdocs/langs/fr_FR/languages.lang | 2 +- htdocs/langs/fr_FR/loan.lang | 6 +- htdocs/langs/fr_FR/main.lang | 28 +- htdocs/langs/fr_FR/mrp.lang | 5 +- htdocs/langs/fr_FR/orders.lang | 7 + htdocs/langs/fr_FR/products.lang | 2 +- htdocs/langs/fr_FR/projects.lang | 1 + htdocs/langs/fr_FR/salaries.lang | 4 +- htdocs/langs/fr_FR/stripe.lang | 8 +- htdocs/langs/fr_FR/ticket.lang | 5 +- htdocs/langs/fr_FR/users.lang | 6 +- htdocs/langs/fr_FR/website.lang | 2 + htdocs/langs/fr_GA/stripe.lang | 3 + htdocs/langs/gl_ES/accountancy.lang | 17 +- htdocs/langs/gl_ES/admin.lang | 11 + htdocs/langs/gl_ES/boxes.lang | 1 + htdocs/langs/gl_ES/companies.lang | 13 +- htdocs/langs/gl_ES/errors.lang | 2 + htdocs/langs/gl_ES/eventorganization.lang | 2 + htdocs/langs/gl_ES/main.lang | 26 +- htdocs/langs/gl_ES/mrp.lang | 1 + htdocs/langs/gl_ES/orders.lang | 7 + htdocs/langs/gl_ES/stripe.lang | 10 +- htdocs/langs/gl_ES/ticket.lang | 3 + htdocs/langs/gl_ES/users.lang | 6 +- htdocs/langs/hi_IN/accountancy.lang | 162 +++++--- htdocs/langs/hr_HR/accountancy.lang | 19 +- htdocs/langs/hr_HR/admin.lang | 17 +- htdocs/langs/hr_HR/main.lang | 30 +- htdocs/langs/hr_HR/ticket.lang | 3 + htdocs/langs/hr_HR/users.lang | 6 +- htdocs/langs/hu_HU/accountancy.lang | 19 +- htdocs/langs/hu_HU/admin.lang | 17 +- htdocs/langs/hu_HU/companies.lang | 19 +- htdocs/langs/hu_HU/main.lang | 26 +- htdocs/langs/hu_HU/projects.lang | 43 ++- htdocs/langs/hu_HU/sms.lang | 2 +- htdocs/langs/hu_HU/stripe.lang | 10 +- htdocs/langs/hu_HU/ticket.lang | 3 + htdocs/langs/hu_HU/users.lang | 6 +- htdocs/langs/id_ID/accountancy.lang | 19 +- htdocs/langs/id_ID/main.lang | 26 +- htdocs/langs/id_ID/stripe.lang | 9 +- htdocs/langs/id_ID/users.lang | 6 +- htdocs/langs/is_IS/users.lang | 6 +- htdocs/langs/it_IT/accountancy.lang | 19 +- htdocs/langs/it_IT/admin.lang | 95 +++-- htdocs/langs/it_IT/companies.lang | 15 +- htdocs/langs/it_IT/main.lang | 26 +- htdocs/langs/it_IT/members.lang | 146 +++---- htdocs/langs/it_IT/productbatch.lang | 3 +- htdocs/langs/it_IT/receptions.lang | 76 ++-- htdocs/langs/it_IT/stocks.lang | 16 +- htdocs/langs/it_IT/stripe.lang | 8 +- htdocs/langs/it_IT/users.lang | 11 +- htdocs/langs/ja_JP/accountancy.lang | 21 +- htdocs/langs/ja_JP/admin.lang | 149 ++++---- htdocs/langs/ja_JP/boxes.lang | 1 + htdocs/langs/ja_JP/companies.lang | 13 +- htdocs/langs/ja_JP/errors.lang | 18 +- htdocs/langs/ja_JP/eventorganization.lang | 2 + htdocs/langs/ja_JP/main.lang | 32 +- htdocs/langs/ja_JP/mrp.lang | 7 +- htdocs/langs/ja_JP/orders.lang | 7 + htdocs/langs/ja_JP/stripe.lang | 10 +- htdocs/langs/ja_JP/ticket.lang | 17 +- htdocs/langs/ja_JP/users.lang | 14 +- htdocs/langs/kk_KZ/accountancy.lang | 19 +- htdocs/langs/kk_KZ/main.lang | 26 +- htdocs/langs/kk_KZ/stripe.lang | 9 +- htdocs/langs/kk_KZ/users.lang | 6 +- htdocs/langs/lo_LA/accountancy.lang | 19 +- htdocs/langs/lo_LA/main.lang | 26 +- htdocs/langs/lo_LA/stripe.lang | 9 +- htdocs/langs/lo_LA/users.lang | 6 +- htdocs/langs/lt_LT/accountancy.lang | 19 +- htdocs/langs/lt_LT/users.lang | 6 +- htdocs/langs/lv_LV/accountancy.lang | 73 ++-- htdocs/langs/lv_LV/admin.lang | 51 ++- htdocs/langs/lv_LV/agenda.lang | 2 +- htdocs/langs/lv_LV/bills.lang | 8 +- htdocs/langs/lv_LV/boxes.lang | 5 +- htdocs/langs/lv_LV/companies.lang | 9 +- htdocs/langs/lv_LV/compta.lang | 10 +- htdocs/langs/lv_LV/errors.lang | 2 + htdocs/langs/lv_LV/eventorganization.lang | 8 +- htdocs/langs/lv_LV/holiday.lang | 12 +- htdocs/langs/lv_LV/hrm.lang | 2 +- htdocs/langs/lv_LV/interventions.lang | 2 +- htdocs/langs/lv_LV/loan.lang | 6 +- htdocs/langs/lv_LV/main.lang | 40 +- htdocs/langs/lv_LV/members.lang | 2 +- htdocs/langs/lv_LV/mrp.lang | 7 +- htdocs/langs/lv_LV/orders.lang | 7 + htdocs/langs/lv_LV/other.lang | 10 +- htdocs/langs/lv_LV/projects.lang | 7 +- htdocs/langs/lv_LV/salaries.lang | 4 +- htdocs/langs/lv_LV/stripe.lang | 8 +- htdocs/langs/lv_LV/ticket.lang | 3 + htdocs/langs/lv_LV/users.lang | 6 +- htdocs/langs/lv_LV/website.lang | 2 + htdocs/langs/lv_LV/withdrawals.lang | 2 +- htdocs/langs/mk_MK/accountancy.lang | 19 +- htdocs/langs/nb_NO/accountancy.lang | 73 ++-- htdocs/langs/nb_NO/admin.lang | 41 +- htdocs/langs/nb_NO/agenda.lang | 2 +- htdocs/langs/nb_NO/bills.lang | 8 +- htdocs/langs/nb_NO/boxes.lang | 5 +- htdocs/langs/nb_NO/companies.lang | 41 +- htdocs/langs/nb_NO/compta.lang | 10 +- htdocs/langs/nb_NO/errors.lang | 2 + htdocs/langs/nb_NO/eventorganization.lang | 8 +- htdocs/langs/nb_NO/holiday.lang | 12 +- htdocs/langs/nb_NO/hrm.lang | 47 +-- htdocs/langs/nb_NO/interventions.lang | 2 +- htdocs/langs/nb_NO/loan.lang | 6 +- htdocs/langs/nb_NO/main.lang | 40 +- htdocs/langs/nb_NO/members.lang | 12 +- htdocs/langs/nb_NO/mrp.lang | 9 +- htdocs/langs/nb_NO/orders.lang | 7 + htdocs/langs/nb_NO/other.lang | 46 ++- htdocs/langs/nb_NO/projects.lang | 9 +- htdocs/langs/nb_NO/salaries.lang | 4 +- htdocs/langs/nb_NO/stripe.lang | 8 +- htdocs/langs/nb_NO/ticket.lang | 3 + htdocs/langs/nb_NO/users.lang | 6 +- htdocs/langs/nb_NO/website.lang | 2 + htdocs/langs/nb_NO/withdrawals.lang | 2 +- htdocs/langs/nl_BE/accountancy.lang | 1 - htdocs/langs/nl_NL/accountancy.lang | 25 +- htdocs/langs/nl_NL/main.lang | 26 +- htdocs/langs/nl_NL/stripe.lang | 11 +- htdocs/langs/nl_NL/ticket.lang | 3 + htdocs/langs/nl_NL/users.lang | 6 +- htdocs/langs/pl_PL/accountancy.lang | 19 +- htdocs/langs/pl_PL/main.lang | 26 +- htdocs/langs/pl_PL/stripe.lang | 9 +- htdocs/langs/pl_PL/ticket.lang | 3 + htdocs/langs/pl_PL/users.lang | 6 +- htdocs/langs/pt_AO/companies.lang | 3 + htdocs/langs/pt_AO/stripe.lang | 2 + htdocs/langs/pt_BR/accountancy.lang | 3 - htdocs/langs/pt_BR/main.lang | 2 - htdocs/langs/pt_BR/stripe.lang | 2 +- htdocs/langs/pt_BR/users.lang | 4 +- htdocs/langs/pt_MZ/accountancy.lang | 3 - htdocs/langs/pt_MZ/main.lang | 5 +- htdocs/langs/pt_MZ/stripe.lang | 2 + htdocs/langs/pt_PT/accountancy.lang | 19 +- htdocs/langs/pt_PT/main.lang | 26 +- htdocs/langs/pt_PT/ticket.lang | 3 + htdocs/langs/pt_PT/users.lang | 6 +- htdocs/langs/ro_RO/accountancy.lang | 19 +- htdocs/langs/ro_RO/admin.lang | 11 + htdocs/langs/ro_RO/boxes.lang | 1 + htdocs/langs/ro_RO/companies.lang | 13 +- htdocs/langs/ro_RO/errors.lang | 2 + htdocs/langs/ro_RO/eventorganization.lang | 2 + htdocs/langs/ro_RO/main.lang | 24 +- htdocs/langs/ro_RO/mrp.lang | 1 + htdocs/langs/ro_RO/orders.lang | 7 + htdocs/langs/ro_RO/stripe.lang | 10 +- htdocs/langs/ro_RO/ticket.lang | 3 + htdocs/langs/ro_RO/users.lang | 6 +- htdocs/langs/ru_RU/accountancy.lang | 19 +- htdocs/langs/ru_RU/main.lang | 26 +- htdocs/langs/ru_RU/stripe.lang | 11 +- htdocs/langs/ru_RU/ticket.lang | 3 + htdocs/langs/ru_RU/users.lang | 6 +- htdocs/langs/sk_SK/accountancy.lang | 19 +- htdocs/langs/sk_SK/users.lang | 6 +- htdocs/langs/sl_SI/accountancy.lang | 19 +- htdocs/langs/sl_SI/companies.lang | 443 +++++++++++----------- htdocs/langs/sl_SI/main.lang | 26 +- htdocs/langs/sl_SI/stripe.lang | 8 +- htdocs/langs/sl_SI/ticket.lang | 3 + htdocs/langs/sl_SI/users.lang | 6 +- htdocs/langs/sr_RS/users.lang | 6 +- htdocs/langs/sv_SE/accountancy.lang | 19 +- htdocs/langs/sv_SE/admin.lang | 11 + htdocs/langs/sv_SE/boxes.lang | 1 + htdocs/langs/sv_SE/companies.lang | 7 +- htdocs/langs/sv_SE/errors.lang | 2 + htdocs/langs/sv_SE/eventorganization.lang | 2 + htdocs/langs/sv_SE/main.lang | 26 +- htdocs/langs/sv_SE/mrp.lang | 1 + htdocs/langs/sv_SE/orders.lang | 7 + htdocs/langs/sv_SE/products.lang | 4 +- htdocs/langs/sv_SE/stripe.lang | 8 +- htdocs/langs/sv_SE/ticket.lang | 3 + htdocs/langs/sv_SE/users.lang | 6 +- htdocs/langs/ta_IN/accountancy.lang | 19 +- htdocs/langs/ta_IN/main.lang | 26 +- htdocs/langs/ta_IN/stripe.lang | 9 +- htdocs/langs/ta_IN/users.lang | 6 +- htdocs/langs/tg_TJ/accountancy.lang | 19 +- htdocs/langs/tg_TJ/main.lang | 26 +- htdocs/langs/tg_TJ/stripe.lang | 9 +- htdocs/langs/tg_TJ/users.lang | 6 +- htdocs/langs/th_TH/users.lang | 6 +- htdocs/langs/tr_TR/accountancy.lang | 19 +- htdocs/langs/tr_TR/ticket.lang | 3 + htdocs/langs/tr_TR/users.lang | 6 +- htdocs/langs/uk_UA/accountancy.lang | 19 +- htdocs/langs/uk_UA/main.lang | 26 +- htdocs/langs/uk_UA/stripe.lang | 9 +- htdocs/langs/uk_UA/ticket.lang | 3 + htdocs/langs/uk_UA/users.lang | 6 +- htdocs/langs/ur_PK/accountancy.lang | 19 +- htdocs/langs/ur_PK/main.lang | 26 +- htdocs/langs/ur_PK/stripe.lang | 9 +- htdocs/langs/ur_PK/users.lang | 6 +- htdocs/langs/uz_UZ/accountancy.lang | 19 +- htdocs/langs/uz_UZ/main.lang | 26 +- htdocs/langs/uz_UZ/stripe.lang | 9 +- htdocs/langs/uz_UZ/users.lang | 6 +- htdocs/langs/vi_VN/accountancy.lang | 19 +- htdocs/langs/vi_VN/main.lang | 26 +- htdocs/langs/vi_VN/stripe.lang | 9 +- htdocs/langs/vi_VN/ticket.lang | 3 + htdocs/langs/vi_VN/users.lang | 6 +- htdocs/langs/zh_CN/accountancy.lang | 19 +- htdocs/langs/zh_CN/ticket.lang | 3 + htdocs/langs/zh_CN/users.lang | 6 +- htdocs/langs/zh_TW/accountancy.lang | 19 +- htdocs/langs/zh_TW/admin.lang | 13 +- htdocs/langs/zh_TW/companies.lang | 9 +- htdocs/langs/zh_TW/main.lang | 26 +- htdocs/langs/zh_TW/stripe.lang | 9 +- htdocs/langs/zh_TW/suppliers.lang | 8 + htdocs/langs/zh_TW/ticket.lang | 3 + htdocs/langs/zh_TW/users.lang | 6 +- 415 files changed, 3721 insertions(+), 1768 deletions(-) create mode 100644 htdocs/langs/ar_IQ/companies.lang create mode 100644 htdocs/langs/de_AT/stripe.lang create mode 100644 htdocs/langs/de_CH/stripe.lang create mode 100644 htdocs/langs/el_CY/stripe.lang create mode 100644 htdocs/langs/en_AE/stripe.lang create mode 100644 htdocs/langs/en_AU/stripe.lang create mode 100644 htdocs/langs/en_CA/stripe.lang create mode 100644 htdocs/langs/en_GB/stripe.lang create mode 100644 htdocs/langs/en_IN/stripe.lang create mode 100644 htdocs/langs/en_SG/stripe.lang create mode 100644 htdocs/langs/en_ZA/stripe.lang create mode 100644 htdocs/langs/es_AR/stripe.lang create mode 100644 htdocs/langs/es_BO/stripe.lang create mode 100644 htdocs/langs/es_CR/accountancy.lang create mode 100644 htdocs/langs/es_CR/companies.lang create mode 100644 htdocs/langs/es_CR/stripe.lang create mode 100644 htdocs/langs/es_DO/stripe.lang create mode 100644 htdocs/langs/es_GT/stripe.lang create mode 100644 htdocs/langs/es_HN/stripe.lang create mode 100644 htdocs/langs/es_MX/stripe.lang create mode 100644 htdocs/langs/es_PA/stripe.lang create mode 100644 htdocs/langs/es_PE/stripe.lang create mode 100644 htdocs/langs/es_PY/stripe.lang create mode 100644 htdocs/langs/es_US/stripe.lang create mode 100644 htdocs/langs/es_UY/stripe.lang create mode 100644 htdocs/langs/es_VE/accountancy.lang create mode 100644 htdocs/langs/es_VE/stripe.lang create mode 100644 htdocs/langs/fr_BE/stripe.lang create mode 100644 htdocs/langs/fr_CH/stripe.lang create mode 100644 htdocs/langs/fr_CI/stripe.lang create mode 100644 htdocs/langs/fr_CM/stripe.lang create mode 100644 htdocs/langs/fr_GA/stripe.lang create mode 100644 htdocs/langs/pt_AO/companies.lang create mode 100644 htdocs/langs/pt_AO/stripe.lang create mode 100644 htdocs/langs/pt_MZ/stripe.lang diff --git a/htdocs/langs/ar_IQ/companies.lang b/htdocs/langs/ar_IQ/companies.lang new file mode 100644 index 00000000000..68a71bb368e --- /dev/null +++ b/htdocs/langs/ar_IQ/companies.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - companies +HasRelativeDiscountFromSupplier=You have a default discount of %s%% with this vendor +HasNoRelativeDiscountFromSupplier=No default relative discount with this vendor diff --git a/htdocs/langs/ar_SA/accountancy.lang b/htdocs/langs/ar_SA/accountancy.lang index e7db1d05f66..d4fb4d12a14 100644 --- a/htdocs/langs/ar_SA/accountancy.lang +++ b/htdocs/langs/ar_SA/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=حدد نوع إرجاع السطر ACCOUNTING_EXPORT_PREFIX_SPEC=تحديد بادئة لاسم الملف ThisService=هذه الخدمة ThisProduct=هذا المنتج -DefaultForService=افتراضي للخدمة -DefaultForProduct=افتراضي للمنتج +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=منتج لهذا الطرف الثالث ServiceForThisThirdparty=خدمة لهذا الطرف الثالث CantSuggest=لا أستطيع أن أقترح @@ -101,7 +101,8 @@ ShowAccountingAccount=عرض حساب المحاسبة ShowAccountingJournal=عرض دفتر يومية ShowAccountingAccountInLedger=عرض حساب المحاسبة في دفتر الأستاذ ShowAccountingAccountInJournals=عرض حساب المحاسبة في دفاتر اليومية -AccountAccountingSuggest=حساب المحاسبة المقترح +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=الحسابات الافتراضية MenuBankAccounts=الحسابات المصرفية MenuVatAccounts=حسابات ضريبة القيمة المضافة @@ -126,6 +127,7 @@ WriteBookKeeping=تسجيل المعاملات في المحاسبة Bookkeeping=دفتر حسابات BookkeepingSubAccount=حساب استاذ فرعي AccountBalance=رصيد الحساب +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=مرجع الكائن المصدر CAHTF=Total purchase vendor before tax TotalExpenseReport=تقرير المصاريف الإجمالية @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=تخزين حساب العميل كحساب فردي في دفتر الأستاذ الفرعي لخطوط الدفعات المقدمة (إذا تم تعطيله ، فسيظل الحساب الفردي لبنود الدَفعة المقدمة فارغًا) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=اسم دفتر اليومية NumPiece=رقم القطعة TransactionNumShort=رقم. العملية AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=تجميع حسب حساب دفتر الأستاذ العام GroupBySubAccountAccounting=تجميع حسب حساب دفتر الأستاذ الفرعي AccountingAccountGroupsDesc=يمكنك هنا تحديد بعض مجموعات الحساب. سيتم استخدامها لتقارير المحاسبة الشخصية. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=عرض المجموع الفرعي حسب المستوى Pcgtype=مجموعة الحساب PcgtypeDesc=تُستخدم مجموعة الحسابات كمعايير "تصفية" و "تجميع" محددة مسبقًا لبعض التقارير المحاسبية. على سبيل المثال ، يتم استخدام "الدخل" أو "المصاريف" كمجموعات لحسابات المنتجات لإنشاء تقرير المصاريف / الدخل. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=قابل للتسوية @@ -294,6 +299,7 @@ DescValidateMovements=سيتم حظر أي تعديل أو حذف للكتابة ValidateHistory=ربط تلقائي AutomaticBindingDone=تم إجراء عمليات ربط تلقائية (%s) - الربط التلقائي غير ممكن لبعض السجلات (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=الحركة غير متوازنة بشكل صحيح. الخصم = %s والائتمان = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=تعطيل الربط والتحويل في ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=تعطيل الربط والتحويل في المحاسبة على المشتريات (لن يتم أخذ فواتير البائعين في الاعتبار في المحاسبة) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=تعطيل الربط والتحويل في المحاسبة على تقارير المصروفات (لن يتم أخذ تقارير المصروفات في الاعتبار في المحاسبة) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=ضع علامة على الخطوط المصدرة كـ (لتعديل سطر ، ستحتاج إلى حذف المعاملة بالكامل وإعادة تحويلها إلى المحاسبة) NotifiedValidationDate=تحقق من صحة الإدخالات التي تم تصديرها وقفلها (نفس التأثير من ميزة "%s" ، ولن يكون تعديل الأسطر وحذفها بالتأكيد ممكنًا) +NotifiedExportFull=Export documents ? DateValidationAndLock=التحقق من صحة التاريخ والقفل ConfirmExportFile=تأكيد إنشاء ملف محاسبي تصدير؟ ExportDraftJournal=تصدير مسودة دفتر اليومية @@ -398,7 +406,7 @@ SaleLocal=بيع محلي SaleExport=بيع تصدير SaleEEC=بيع في الاتحاد الاوروبي SaleEECWithVAT=البيع في EEC مع ضريبة القيمة المضافة ليست فارغة ، لذلك نفترض أن هذا ليس بيعًا داخل الاتحاد والحساب المقترح هو حساب المنتج القياسي. -SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fallback on the product account for standard sales. You can fix the VAT ID of thirdparty or the product account if needed. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=ممنوع: تم التحقق من صحة المعاملة و / أو تصديرها. ForbiddenTransactionAlreadyValidated=ممنوع: تم التحقق من صحة المعاملة. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=عدم تطابق في التوفيق بين AccountancyErrorMismatchBalanceAmount=الرصيد (%s) لا يساوي 0 AccountancyErrorLetteringBookkeeping=حدثت أخطاء بخصوص المعاملات: %s ErrorAccountNumberAlreadyExists=رقم المحاسبة %s موجود بالفعل +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=مداخيل حسابية @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=كود متعدد العملات (ايديفيز) DateExport=تاريخ التصدير WarningReportNotReliable=تحذير ، هذا التقرير لا يستند إلى دفتر الأستاذ ، لذلك لا يحتوي على معاملة تم تعديلها يدويًا في دفتر الأستاذ. إذا كان تسجيل دفتر اليومية الخاص بك محدثًا ، فسيكون عرض مسك الدفاتر أكثر دقة. ExpenseReportJournal=تقرير دفتر المصاريف +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s حساباً diff --git a/htdocs/langs/ar_SA/main.lang b/htdocs/langs/ar_SA/main.lang index 2d93cc6fedf..8e6c8c6381a 100644 --- a/htdocs/langs/ar_SA/main.lang +++ b/htdocs/langs/ar_SA/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=لم يتم تحديد مجموعة مستخدمين Password=كلمة المرور PasswordRetype=Repeat your password NoteSomeFeaturesAreDisabled=لاحظ أنه تم تعطيل الكثير من الميزات | الوحدات في هذا العرض التوضيحي. +YourUserFile=Your user file Name=اسم NameSlashCompany=الاسم | الشركة Person=شخص @@ -897,6 +898,9 @@ MassFilesArea=مساحة للملفات التي تم إنشاؤها بواسط ShowTempMassFilesArea=عرض مساحة الملفات التي تم إنشاؤها بواسطة الإجراءات الجماعية ConfirmMassDeletion=تأكيد الحذف الضخم ConfirmMassDeletionQuestion=هل أنت متأكد من أنك تريد حذف %s السجل (السجلات) المحددة؟ +ConfirmMassClone=Bulk clone confirmation +ConfirmMassCloneQuestion=Select project to clone to +ConfirmMassCloneToOneProject=Clone to project %s RelatedObjects=كائنات ذات صلة ClassifyBilled=تصنيف الفواتير ClassifyUnbilled=تصنيف غير مفوتر @@ -912,8 +916,8 @@ ExportFilteredList=تصدير قائمة التى تم تصفيتها ExportList=قائمة التصدير ExportOptions=خيارات التصدير IncludeDocsAlreadyExported=تضمين المستندات التي تم تصديرها -ExportOfPiecesAlreadyExportedIsEnable=Export of pieces already exported is enable -ExportOfPiecesAlreadyExportedIsDisable=Export of pieces already exported is disable +ExportOfPiecesAlreadyExportedIsEnable=Documents already exported are visible and will be exported +ExportOfPiecesAlreadyExportedIsDisable=Documents already exported are hidden and won't be exported AllExportedMovementsWereRecordedAsExported=تم تسجيل جميع حركات التصدير على أنها مصدرة NotAllExportedMovementsCouldBeRecordedAsExported=لا يمكن تسجيل جميع حركات التصدير على أنها مصدرة Miscellaneous=متفرقات @@ -1128,6 +1132,7 @@ DeleteFileText=هل تريد حقا حذف هذا الملف؟ ShowOtherLanguages=عرض اللغات الأخرى SwitchInEditModeToAddTranslation=قم بالتبديل في وضع التحرير لإضافة ترجمات لهذه اللغة NotUsedForThisCustomer=غير مستخدم لهذا العميل +NotUsedForThisVendor=Not used for this vendor AmountMustBePositive=المبلغ يجب أن يكون موجبًا ByStatus=حسب الحالة InformationMessage=معلومات @@ -1148,14 +1153,14 @@ EventReminder=تذكير بالحدث UpdateForAllLines=تحديث لجميع البنود OnHold=في الانتظار Civility=Civility -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Set Supervisor +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor CreateExternalUser=إنشاء مستخدم خارجي ConfirmAffectTag=Bulk Tag Assignement ConfirmAffectUser=Bulk User Assignement -ProjectRole=Role assigned on each project -TasksRole=Role assigned on each task of each project +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ConfirmSetSupervisor=Bulk Supervisor Set ConfirmUpdatePrice=Choose a increase/decrease price rate ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=تم إنشاؤه من بوابة عامة UserAgent=User Agent InternalUser=مستخدم داخلي ExternalUser=مستخدم خارجي +NoSpecificContactAddress=No specific contact or address +NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. +HideOnVCard=Hide %s +AddToContacts=Add address to my contacts +LastAccess=Last access +UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here +LastPasswordChangeDate=Last password change date diff --git a/htdocs/langs/ar_SA/stripe.lang b/htdocs/langs/ar_SA/stripe.lang index 94865279dd8..442c1a2788a 100644 --- a/htdocs/langs/ar_SA/stripe.lang +++ b/htdocs/langs/ar_SA/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=المفتاح المباشر للخطاف التلقا ONLINE_PAYMENT_WAREHOUSE=المخزون الذي سيتم استخدامه لتقليل المخزون عند إتمام الدفع عبر الإنترنت
    (TODO عندما يتم تنفيذ خيار تقليل المخزون على إجراء على الفاتورة ويقوم الدفع عبر الإنترنت بإنشاء الفاتورة بنفسه؟) StripeLiveEnabled=تم تمكين Stripe Live (بخلاف ذلك وضع الاختبار / وضع الحماية) StripeImportPayment=استيراد مدفوعات الشريط -ExampleOfTestCreditCard=مثال على بطاقة الائتمان للاختبار: %s => صالحة ، %s => خطأ CVC ، %s => منتهية الصلاحية ، %s => فشل الشحن +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +ExampleOfTestBankAcountForSEPA=Example of bank account BAN for direct debit test: %s StripeGateways=بوابات شريطية OAUTH_STRIPE_TEST_ID=معرف عميل Stripe Connect (ca _...) OAUTH_STRIPE_LIVE_ID=معرف عميل Stripe Connect (ca _...) @@ -70,5 +71,8 @@ ToOfferALinkForLiveWebhook=رابط لإعداد Stripe WebHook لاستدعاء PaymentWillBeRecordedForNextPeriod=سيتم تسجيل الدفع للفترة القادمة. ClickHereToTryAgain= انقر هنا للمحاولة مرة أخرى ... CreationOfPaymentModeMustBeDoneFromStripeInterface=نظرًا لقواعد مصادقة العميل القوية ، يجب أن يتم إنشاء بطاقة من Stripe backoffice. يمكنك النقر هنا للتبديل إلى سجل عميل Stripe: %s -TERMINAL_LOCATION=موقع (العنوان) للمحطات +STRIPE_CARD_PRESENT=Card Present for Stripe Terminals +TERMINAL_LOCATION=Location (address) for Stripe Terminals RequestDirectDebitWithStripe=Request Direct Debit with Stripe +STRIPE_SEPA_DIRECT_DEBIT=Enable the Direct Debit payments through Stripe + diff --git a/htdocs/langs/ar_SA/ticket.lang b/htdocs/langs/ar_SA/ticket.lang index ba141c195ad..c9f94d6f391 100644 --- a/htdocs/langs/ar_SA/ticket.lang +++ b/htdocs/langs/ar_SA/ticket.lang @@ -26,6 +26,7 @@ Permission56002=تعديل التذاكر Permission56003=حذف التذاكر Permission56004=إدارة التذاكر Permission56005=عرض جميع تذاكر الأطراف الثالثة (غير فعالة للمستخدمين الخارجيين ، دائماً محدودين بالطرف الثالث المعتمدين عليه) +Permission56006=Export tickets Tickets=التذاكر TicketDictType=انواع - التذاكر @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=مساهم خارجي OriginEmail=البريد الإلكتروني للمبلغ Notify_TICKET_SENTBYMAIL=إرسال إشعار التذكرة بالبريد الإلكتروني +ExportDataset_ticket_1=التذاكر + # Status Read=قراءة Assigned=مسند diff --git a/htdocs/langs/ar_SA/users.lang b/htdocs/langs/ar_SA/users.lang index df3d662f0b2..742d573c6f3 100644 --- a/htdocs/langs/ar_SA/users.lang +++ b/htdocs/langs/ar_SA/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=ارتباط بالمستخدم LinkedToDolibarrThirdParty=رابط لطرف ثالث CreateDolibarrLogin=انشاء مستخدم CreateDolibarrThirdParty=إيجاد طرف ثالث -LoginAccountDisableInDolibarr=في حساب المعاقين Dolibarr. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=استخدام الشخصي قيمة ExportDataset_user_1=المستخدمون وخصائصهم DomainUser=النطاق المستخدم ق ٪ @@ -129,3 +130,6 @@ IPLastLogin=آخر تسجيل دخول إلى IP IPPreviousLogin=تسجيل الدخول السابق إلى IP ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/bg_BG/accountancy.lang b/htdocs/langs/bg_BG/accountancy.lang index 93acfa70491..7baa0711571 100644 --- a/htdocs/langs/bg_BG/accountancy.lang +++ b/htdocs/langs/bg_BG/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Изберете типа пренасяне на но ACCOUNTING_EXPORT_PREFIX_SPEC=Посочете префикса в името на файла ThisService=Тази услуга ThisProduct=Този продукт -DefaultForService=По подразбиране за услуга -DefaultForProduct=По подразбиране за продукт +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Product for this thirdparty ServiceForThisThirdparty=Service for this thirdparty CantSuggest=Не може да се предложи @@ -101,7 +101,8 @@ ShowAccountingAccount=Показване на счетоводна сметка ShowAccountingJournal=Показване на счетоводен журнал ShowAccountingAccountInLedger=Show accounting account in ledger ShowAccountingAccountInJournals=Show accounting account in journals -AccountAccountingSuggest=Предложена счетоводна сметка +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=Сметки по подразбиране MenuBankAccounts=Банкови сметки MenuVatAccounts=Сметки за ДДС @@ -126,6 +127,7 @@ WriteBookKeeping=Record transactions in accounting Bookkeeping=Главна счетоводна книга BookkeepingSubAccount=Subledger AccountBalance=Салдо по сметка +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Обект № CAHTF=Обща покупка от доставчик преди ДДС TotalExpenseReport=Общ разходен отчет @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=Име на журнал NumPiece=Пореден номер TransactionNumShort=Транзакция № AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Group by general ledger account GroupBySubAccountAccounting=Group by subledger account AccountingAccountGroupsDesc=Тук може да определите някои групи счетоводни сметки. Те ще бъдат използвани за персонализирани счетоводни отчети. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Show subtotal by level Pcgtype=Група от сметки PcgtypeDesc=Групата от сметки се използва като предварително зададен критерий за филтриране и групиране за някои счетоводни отчети. Например 'Приход' или 'Разход' се използват като групи за счетоводни сметки на продукти за съставяне на отчет за разходи / приходи. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Съвместим @@ -294,6 +299,7 @@ DescValidateMovements=Всякакви промени или изтриване ValidateHistory=Автоматично свързване AutomaticBindingDone=Automatic bindings done (%s) - Automatic binding not possible for some record (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Disable binding & transfer in accountancy on ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Disable binding & transfer in accountancy on purchases (vendor invoices will not be taken into account in accounting) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Disable binding & transfer in accountancy on expense reports (expense reports will not be taken into account in accounting) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Flag exported lines as Exported (to modify a line, you will need to delete the whole transaction and re-transfert it into accounting) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=Date validation and lock ConfirmExportFile=Confirmation of the generation of the accounting export file ? ExportDraftJournal=Експортиране на журнал в чернова @@ -398,7 +406,7 @@ SaleLocal=Локална продажба SaleExport=Експортна продажба SaleEEC=Вътреобщностна продажба SaleEECWithVAT=Продажба в ЕИО с ДДС различен от нула, за която се предполага, че НЕ е вътреобщностна продажба, поради тази причина се препоръчва стандартната сметка за продукти. -SaleEECWithoutVATNumber=Продажба в ЕИО без ДДС, но идентификационният номер по ДДС на контрагента не е определен. Ще се използва стандартната сметка за продажба на продукти. Може да въведете идентификационен номер по ДДС на контрагента или сметка на продукта, ако е необходимо. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Forbidden: The transaction has been validated and/or exported. ForbiddenTransactionAlreadyValidated=Forbidden: The transaction has been validated. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Mismatch in reconcile code AccountancyErrorMismatchBalanceAmount=The balance (%s) is not equal to 0 AccountancyErrorLetteringBookkeeping=Errors have occurred concerning the transactions: %s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Счетоводни записи @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Multicurrency code (Idevise) DateExport=Дата на експортиране WarningReportNotReliable=Внимание, тази справка не се основава на главната счетоводна книга, така че не съдържа транзакция, ръчно променена в книгата. Ако осчетоводяването ви е актуално, то прегледът на счетоводството е по-точен. ExpenseReportJournal=Журнал за разходни отчети +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s accounts diff --git a/htdocs/langs/bg_BG/main.lang b/htdocs/langs/bg_BG/main.lang index a9c4989034a..46f43ddf58b 100644 --- a/htdocs/langs/bg_BG/main.lang +++ b/htdocs/langs/bg_BG/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=Няма дефинирана потребителска гр Password=Парола PasswordRetype=Repeat your password NoteSomeFeaturesAreDisabled=Имайте предвид, че много функции / модули са деактивирани в тази демонстрация. +YourUserFile=Your user file Name=Име NameSlashCompany=Име / Фирма Person=Лице @@ -897,6 +898,9 @@ MassFilesArea=Секция с файлове, създадени от масов ShowTempMassFilesArea=Показване на секцията с файлове, създадени от масови действия ConfirmMassDeletion=Потвърждение за масово изтриване ConfirmMassDeletionQuestion=Сигурни ли сте, че искате да изтриете избраните %s записа? +ConfirmMassClone=Bulk clone confirmation +ConfirmMassCloneQuestion=Select project to clone to +ConfirmMassCloneToOneProject=Clone to project %s RelatedObjects=Свързани обекти ClassifyBilled=Класифициране като фактурирано ClassifyUnbilled=Класифициране като нетаксувано @@ -912,8 +916,8 @@ ExportFilteredList=Експортиране на филтрирания спис ExportList=Списък за експортиране ExportOptions=Настройки за експортиране IncludeDocsAlreadyExported=Включените документи са вече експортирани -ExportOfPiecesAlreadyExportedIsEnable=Експортът на вече експортирани части е разрешен -ExportOfPiecesAlreadyExportedIsDisable=Експортът на вече експортирани части е забранен +ExportOfPiecesAlreadyExportedIsEnable=Documents already exported are visible and will be exported +ExportOfPiecesAlreadyExportedIsDisable=Documents already exported are hidden and won't be exported AllExportedMovementsWereRecordedAsExported=Всички експортирани движения бяха записани като експортирани NotAllExportedMovementsCouldBeRecordedAsExported=Не всички експортирани движения могат да бъдат записани като експортирани Miscellaneous=Разни @@ -1128,6 +1132,7 @@ DeleteFileText=Сигурни ли сте, че искате да изтриет ShowOtherLanguages=Показване на други езици SwitchInEditModeToAddTranslation=Превключете в режим на редактиране, за да добавите преводи за този език. NotUsedForThisCustomer=Не се използва за този клиент +NotUsedForThisVendor=Not used for this vendor AmountMustBePositive=Amount must be positive ByStatus=By status InformationMessage=Информация @@ -1148,14 +1153,14 @@ EventReminder=Event Reminder UpdateForAllLines=Update for all lines OnHold=На изчакване Civility=Civility -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Set Supervisor +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor CreateExternalUser=Create external user ConfirmAffectTag=Bulk Tag Assignement ConfirmAffectUser=Bulk User Assignement -ProjectRole=Role assigned on each project -TasksRole=Role assigned on each task of each project +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ConfirmSetSupervisor=Bulk Supervisor Set ConfirmUpdatePrice=Choose a increase/decrease price rate ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Created from Public portal UserAgent=User Agent InternalUser=Вътрешен потребител ExternalUser=Външен потребител +NoSpecificContactAddress=No specific contact or address +NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. +HideOnVCard=Hide %s +AddToContacts=Add address to my contacts +LastAccess=Last access +UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here +LastPasswordChangeDate=Last password change date diff --git a/htdocs/langs/bg_BG/stripe.lang b/htdocs/langs/bg_BG/stripe.lang index c3902716951..00f338b7ed7 100644 --- a/htdocs/langs/bg_BG/stripe.lang +++ b/htdocs/langs/bg_BG/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Работен Webhook ключ ONLINE_PAYMENT_WAREHOUSE=Склад, който да се използва за намаляване на наличности, когато се извършва онлайн плащане
    (Да се направи, когато възможността за намаляване на наличности се извършва при действие върху фактура и онлайн плащането генерира фактурата?) StripeLiveEnabled=Активиран е работен режим на Stripe (в противен случай тестов режим / пясъчник) StripeImportPayment=Импортиране на Stripe плащания -ExampleOfTestCreditCard=Пример с кредитна карта за тест: %s => валидна, %s => грешка в CVC, %s => изтекла, %s => неуспешно таксуване +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +ExampleOfTestBankAcountForSEPA=Example of bank account BAN for direct debit test: %s StripeGateways=Stripe шлюзове OAUTH_STRIPE_TEST_ID=Тестов Stripe Connect Client ID (ca_...) OAUTH_STRIPE_LIVE_ID=Реален Stripe Connect Client ID (ca_...) @@ -61,6 +62,7 @@ DeleteACard=Изтриване на карта ConfirmDeleteCard=Сигурни ли сте, че искате да изтриете тази кредитна или дебитна карта? CreateCustomerOnStripe=Създаване на клиент в Stripe CreateCardOnStripe=Създаване на карта в Stripe +CreateBANOnStripe=Create bank on Stripe ShowInStripe=Показване в Stripe StripeUserAccountForActions=Потребителски акаунт, който да се използва за известяване по имейл при някои Stripe събития (Stripe изплащания) StripePayoutList=Списък със Stripe изплащания @@ -69,3 +71,8 @@ ToOfferALinkForLiveWebhook=Връзка към настройка на Stripe We PaymentWillBeRecordedForNextPeriod=Плащането ще бъде регистрирано за следващия период. ClickHereToTryAgain=Кликнете тук, за да опитате отново ... CreationOfPaymentModeMustBeDoneFromStripeInterface=Due to Strong Customer Authentication rules, creation of a card must be done from Stripe backoffice. You can click here to switch on Stripe customer record: %s +STRIPE_CARD_PRESENT=Card Present for Stripe Terminals +TERMINAL_LOCATION=Location (address) for Stripe Terminals +RequestDirectDebitWithStripe=Request Direct Debit with Stripe +STRIPE_SEPA_DIRECT_DEBIT=Enable the Direct Debit payments through Stripe + diff --git a/htdocs/langs/bg_BG/ticket.lang b/htdocs/langs/bg_BG/ticket.lang index 13bdf4bbdd0..be19f01c898 100644 --- a/htdocs/langs/bg_BG/ticket.lang +++ b/htdocs/langs/bg_BG/ticket.lang @@ -26,6 +26,7 @@ Permission56002=Промяна на тикети Permission56003=Изтриване на тикети Permission56004=Управление на тикети Permission56005=Преглед на тикети от всички контрагенти (не е приложимо за външни потребители, винаги ще бъдат ограничени до контрагента от който зависят) +Permission56006=Export tickets Tickets=Тикети TicketDictType=Тикет - Видове @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=Сътрудник от страна н OriginEmail=Reporter Email Notify_TICKET_SENTBYMAIL=Изпращане на тикет съобщението по имейл +ExportDataset_ticket_1=Тикети + # Status Read=Прочетен Assigned=Възложен diff --git a/htdocs/langs/bg_BG/users.lang b/htdocs/langs/bg_BG/users.lang index de922457273..df1a93675a5 100644 --- a/htdocs/langs/bg_BG/users.lang +++ b/htdocs/langs/bg_BG/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Link to user LinkedToDolibarrThirdParty=Link to third party CreateDolibarrLogin=Създаване на потребител CreateDolibarrThirdParty=Създаване на контрагент -LoginAccountDisableInDolibarr=Профилът е деактивиран в системата. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Използване на лична стойност ExportDataset_user_1=Потребители и техните реквизити DomainUser=Домейн потребител %s @@ -129,3 +130,6 @@ IPLastLogin=IP last login IPPreviousLogin=IP previous login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/bs_BA/accountancy.lang b/htdocs/langs/bs_BA/accountancy.lang index d1b45e43d0b..a15b6a0d8b7 100644 --- a/htdocs/langs/bs_BA/accountancy.lang +++ b/htdocs/langs/bs_BA/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Select the carriage return type ACCOUNTING_EXPORT_PREFIX_SPEC=Odredi prefiks za naziv datoteke ThisService=This service ThisProduct=Ovaj proizvod -DefaultForService=Default for service -DefaultForProduct=Pretpostavljeno za proizvod +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Product for this thirdparty ServiceForThisThirdparty=Service for this thirdparty CantSuggest=Can't suggest @@ -101,7 +101,8 @@ ShowAccountingAccount=Show accounting account ShowAccountingJournal=Show accounting journal ShowAccountingAccountInLedger=Show accounting account in ledger ShowAccountingAccountInJournals=Show accounting account in journals -AccountAccountingSuggest=Predloženi računovodstveni račun +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=Default accounts MenuBankAccounts=Žiro računi MenuVatAccounts=Vat accounts @@ -126,6 +127,7 @@ WriteBookKeeping=Record transactions in accounting Bookkeeping=Ledger BookkeepingSubAccount=Subledger AccountBalance=Account balance +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Source object ref CAHTF=Total purchase vendor before tax TotalExpenseReport=Total expense report @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=Journal label NumPiece=Piece number TransactionNumShort=Num. transaction AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Group by general ledger account GroupBySubAccountAccounting=Group by subledger account AccountingAccountGroupsDesc=You can define here some groups of accounting account. They will be used for personalized accounting reports. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Show subtotal by level Pcgtype=Group of account PcgtypeDesc=Group of account are used as predefined 'filter' and 'grouping' criteria for some accounting reports. For example, 'INCOME' or 'EXPENSE' are used as groups for accounting accounts of products to build the expense/income report. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Reconcilable @@ -294,6 +299,7 @@ DescValidateMovements=Any modification or deletion of writing, lettering and del ValidateHistory=Bind Automatically AutomaticBindingDone=Automatic bindings done (%s) - Automatic binding not possible for some record (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Disable binding & transfer in accountancy on ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Disable binding & transfer in accountancy on purchases (vendor invoices will not be taken into account in accounting) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Disable binding & transfer in accountancy on expense reports (expense reports will not be taken into account in accounting) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Flag exported lines as Exported (to modify a line, you will need to delete the whole transaction and re-transfert it into accounting) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=Date validation and lock ConfirmExportFile=Confirmation of the generation of the accounting export file ? ExportDraftJournal=Export draft journal @@ -398,7 +406,7 @@ SaleLocal=Local sale SaleExport=Export sale SaleEEC=Sale in EEC SaleEECWithVAT=Sale in EEC with a VAT not null, so we suppose this is NOT an intracommunautary sale and the suggested account is the standard product account. -SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fallback on the product account for standard sales. You can fix the VAT ID of thirdparty or the product account if needed. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Forbidden: The transaction has been validated and/or exported. ForbiddenTransactionAlreadyValidated=Forbidden: The transaction has been validated. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Mismatch in reconcile code AccountancyErrorMismatchBalanceAmount=The balance (%s) is not equal to 0 AccountancyErrorLetteringBookkeeping=Errors have occurred concerning the transactions: %s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Accounting entries @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Multicurrency code (Idevise) DateExport=Date export WarningReportNotReliable=Warning, this report is not based on the Ledger, so does not contains transaction modified manually in the Ledger. If your journalization is up to date, the bookkeeping view is more accurate. ExpenseReportJournal=Expense Report Journal +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s accounts diff --git a/htdocs/langs/bs_BA/users.lang b/htdocs/langs/bs_BA/users.lang index c0d6210a338..5266d7c1bd3 100644 --- a/htdocs/langs/bs_BA/users.lang +++ b/htdocs/langs/bs_BA/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Link to user LinkedToDolibarrThirdParty=Link to third party CreateDolibarrLogin=Kreiraj korisnika CreateDolibarrThirdParty=Napravi subjekat -LoginAccountDisableInDolibarr=Račun isključen u Dolibarru. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Koristite lične vrijednosti ExportDataset_user_1=Users and their properties DomainUser=Korisnik domene %s @@ -129,3 +130,6 @@ IPLastLogin=IP last login IPPreviousLogin=IP previous login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/ca_ES/accountancy.lang b/htdocs/langs/ca_ES/accountancy.lang index 35a6fd4b114..4a42cad58e8 100644 --- a/htdocs/langs/ca_ES/accountancy.lang +++ b/htdocs/langs/ca_ES/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Seleccioneu el tipus de retorn ACCOUNTING_EXPORT_PREFIX_SPEC=Especifica el prefix del nom del fitxer ThisService=Aquest servei ThisProduct=Aquest producte -DefaultForService=Defecte per al servei -DefaultForProduct=Defecte per al producte +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Producte per a aquest tercer ServiceForThisThirdparty=Servei per a aquest tercer CantSuggest=No es pot suggerir @@ -101,7 +101,8 @@ ShowAccountingAccount=Mostrar diari de comptes ShowAccountingJournal=Mostrar diari comptable ShowAccountingAccountInLedger=Mostra el compte comptable al Llibre major ShowAccountingAccountInJournals=Mostra el compte comptable als diaris -AccountAccountingSuggest=Compte comptable suggerit +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=Comptes per defecte MenuBankAccounts=Comptes bancaris MenuVatAccounts=Comptes d'IVA @@ -126,6 +127,7 @@ WriteBookKeeping=Registrar transaccions en comptabilitat Bookkeeping=Llibre major BookkeepingSubAccount=Subcompte AccountBalance=Compte saldo +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Referència de l'objecte origen CAHTF=Total de compra a Proveïdor abans d'impostos TotalExpenseReport=Informe de despeses totals @@ -165,8 +167,8 @@ ACCOUNTANCY_COMBO_FOR_AUX=Activa la llista combinada per a un compte subsidiari ACCOUNTING_DATE_START_BINDING=Definiu una data per a començar la vinculació i transferència a la comptabilitat. Per sota d’aquesta data, les transaccions no es transferiran a la comptabilitat. ACCOUNTING_DEFAULT_PERIOD_ON_TRANSFER=En la transferència comptable, quin és el període seleccionat per defecte -ACCOUNTING_SELL_JOURNAL=Sales journal (sales and returns) -ACCOUNTING_PURCHASE_JOURNAL=Purchase journal (purchase and returns) +ACCOUNTING_SELL_JOURNAL=Diari de vendes (vendes i devolucions) +ACCOUNTING_PURCHASE_JOURNAL=Diari de compres (compres i devolucions) ACCOUNTING_BANK_JOURNAL=Cash journal (receipts and disbursements) ACCOUNTING_EXPENSEREPORT_JOURNAL=Diari de l'informe de despeses ACCOUNTING_MISCELLANEOUS_JOURNAL=Diari general @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Emmagatzema el compte del client com a compte individual al llibre major subsidiari per a les línies de pagament inicial (si està desactivat, el compte individual per a les línies de pagament inicial romandrà buit) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Emmagatzema el compte del proveïdor com a compte individual al llibre major subsidiari per a les línies de pagament inicial (si està desactivat, el compte individual de les línies de pagament inicial romandrà buit) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -217,7 +220,8 @@ Codejournal=Diari JournalLabel=Nom del diari NumPiece=Número de peça TransactionNumShort=Número de transacció -AccountingCategory=Custom group of accounts +AccountingCategory=Grup de comptes personalitzat +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Agrupa per compte major GroupBySubAccountAccounting=Agrupa per subcompte comptable AccountingAccountGroupsDesc=Podeu definir aquí alguns grups de comptes comptables. S'utilitzaran per a informes comptables personalitzats. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Mostra el subtotal per nivell Pcgtype=Grup de comptes PcgtypeDesc=S'utilitzen grups de comptes com a criteris predefinits de «filtre» i «agrupació» per a alguns informes de comptabilitat. Per exemple, «INGRESSOS» o «DESPESES» s'utilitzen com a grups per a comptes comptables de productes per a crear l'informe de despeses/ingressos. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Reconciliable @@ -294,6 +299,7 @@ DescValidateMovements=Queda prohibida qualsevol modificació o supressió de reg ValidateHistory=Comptabilitza automàticament AutomaticBindingDone=Enllaços automàtics fets (%s): l'enllaç automàtic no és possible per a alguns registres (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Moviment no equilibrat correctament. Dèbit = %s i crèdit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Desactiva la vinculació i transferència de ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Desactiva la vinculació i transferència a la comptabilitat de les compres (les factures de proveïdors no es tindran en compte a la comptabilitat) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Desactiva la vinculació i transferència de comptes en els informes de despeses (els informes de despeses no es tindran en compte a la comptabilitat) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Marca les línies exportades com a Exportades (per a modificar una línia, hauràs de suprimir tota la transacció i tornar-la a transferir a la comptabilitat) -NotifiedValidationDate=Validar i bloquejar les entrades exportades (mateix efecte que la característica "%s", la modificació i la supressió de les línies DEFINITIVAMENT no seran possibles) +NotifiedValidationDate=Validar i bloquejar les entrades exportades (mateix efecte que la característica "%s", la modificació i la supressió de les línies DEFINITIVAMENT no seran possibles) +NotifiedExportFull=Export documents ? DateValidationAndLock=Validació de data i bloqueig ConfirmExportFile=Confirmació de la generació del fitxer d'exportació comptable? ExportDraftJournal=Exporta els esborranys del llibre @@ -398,7 +406,7 @@ SaleLocal=Venda local SaleExport=Venda d’exportació SaleEEC=Venda en CEE SaleEECWithVAT=Venda a la CEE amb un IVA que no és nul, per la qual cosa suposem que NO es tracta d’una venda intracomunitària i el compte suggerit és el compte estàndard del producte. -SaleEECWithoutVATNumber=Venda a la CEE sense IVA, però l’identificador d’IVA del tercer no està definit. S'ha emprat el compte del producte per a vendes estàndard. Podeu corregir l’identificador d’IVA del tercer o el compte del producte si cal. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Prohibit: la transacció ha estat validada i/o exportada. ForbiddenTransactionAlreadyValidated=Prohibit: la transacció s'ha validat. ## Dictionary @@ -429,19 +437,20 @@ ConfirmMassDeleteBookkeepingWritingQuestion=Això suprimirà la transacció de l ## Error SomeMandatoryStepsOfSetupWereNotDone=No s'han fet alguns passos obligatoris de configuració, si us plau, completeu-los ErrorNoAccountingCategoryForThisCountry=No hi ha cap grup de comptes comptables disponible per al país %s (Vegeu Inici - Configuració - Diccionaris) -ErrorInvoiceContainsLinesNotYetBounded=Intenta actualitzar algunes línies de la factura %s , però algunes altres encara no estan vinculades al compte de comptabilitat. Es rebutja el registre comptable de totes les línies d'aquesta factura. +ErrorInvoiceContainsLinesNotYetBounded=Intenteu registrar algunes línies de la factura %s, però algunes altres línies encara no estan vinculades al compte comptable. Es denega el registre al diari de totes les línies d'aquesta factura. ErrorInvoiceContainsLinesNotYetBoundedShort=Algunes línies a la factura no estan vinculades al compte de comptabilitat. ExportNotSupported=El format d'exportació configurat no està suportat en aquesta pàgina BookeppingLineAlreayExists=Les línies ja existeixen en la comptabilitat NoJournalDefined=Cap diari definit Binded=Línies comptabilitzades ToBind=Línies a comptabilitzar -UseMenuToSetBindindManualy=Línies encara no enllaçades, utilitzeu el menú %s per a fer l'enllaç manualment +UseMenuToSetBindindManualy=Línies encara no enllaçades, utilitzeu el menú %s per a fer l'enllaç manualment SorryThisModuleIsNotCompatibleWithTheExperimentalFeatureOfSituationInvoices=Ho sentim, aquest mòdul no és compatible amb la funció experimental de les factures de situació AccountancyErrorMismatchLetterCode=No coincideix en el codi de conciliació AccountancyErrorMismatchBalanceAmount=El saldo (%s) no és igual a 0 AccountancyErrorLetteringBookkeeping=S'han produït errors relacionats amb les transaccions: %s ErrorAccountNumberAlreadyExists=El número de comptabilitat %s ja existeix +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Entrades de comptabilitat @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Codi multidivisa (Idevise) DateExport=Data d'exportació WarningReportNotReliable=Avís, aquest informe no està basat en el Llibre Major, de manera que no conté assentaments modificats manualment en el Llibre Major. Si el registre diari està actualitzat, la vista de comptes és més precisa. ExpenseReportJournal=Diari d'informe de despeses +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=comptes %s diff --git a/htdocs/langs/ca_ES/admin.lang b/htdocs/langs/ca_ES/admin.lang index 48dc1627b3a..78fd6572a90 100644 --- a/htdocs/langs/ca_ES/admin.lang +++ b/htdocs/langs/ca_ES/admin.lang @@ -645,6 +645,8 @@ Module2300Name=Tasques programades Module2300Desc=Gestió de tasques programades (àlies cron o taula de crons) Module2400Name=Esdeveniments/Agenda Module2400Desc=Seguiment d'esdeveniments. Registre d'esdeveniments automàtics per a fer el seguiment o registrar esdeveniments manuals o reunions. Aquest és el mòdul principal per a una bona gestió de la relació amb clients o proveïdors. +Module2430Name=Booking Calendar System +Module2430Desc=Provide an online calendar to allow anyone to book rendez-vous, according to predefined ranges or availabilities. Module2500Name=SGD / GCE Module2500Desc=Sistema de gestió de documents / Gestió de continguts electrònics. Organització automàtica dels vostres documents generats o emmagatzemats. Compartiu-los quan ho necessiteu. Module2600Name=Serveis API / Web (servidor SOAP) @@ -660,6 +662,8 @@ Module2900Name=GeoIPMaxmind Module2900Desc=Capacitats de conversió GeoIP Maxmind Module3200Name=Arxius inalterables Module3200Desc=Activa el registre d'alguns esdeveniments de negoci en un registre inalterable. Els esdeveniments s'arxiven en temps real. El registre és una taula d'esdeveniments encadenats que només es poden llegir i exportar. Aquest mòdul pot ser obligatori per a alguns països. +Module3300Name=Module Builder +Module3200Desc=Activa el registre d'alguns esdeveniments de negoci en un registre inalterable. Els esdeveniments s'arxiven en temps real. El registre és una taula d'esdeveniments encadenats que només es poden llegir i exportar. Aquest mòdul pot ser obligatori per a alguns països. Module3400Name=Xarxes socials Module3400Desc=Activa els camps de les xarxes socials a tercers i adreces (skype, twitter, facebook...). Module4000Name=RH @@ -1270,6 +1274,7 @@ TriggerActiveAsModuleActive=Els activadors d'aquest fitxer estan actius, ja que GeneratedPasswordDesc=Trieu el mètode que s'utilitzarà per a les contrasenyes generades automàticament. DictionaryDesc=Afegeix totes les dades de referència. Pots afegir els teus valors per defecte. ConstDesc=Aquesta pàgina permet editar (anul·lar) paràmetres no disponibles en altres pàgines. Aquests són paràmetres reservats només per a desenvolupadors o solucions avançades de problemes. +MiscellaneousOptions=Miscellaneous options MiscellaneousDesc=Aquí es defineixen la resta de paràmetres relacionats amb la seguretat. LimitsSetup=Configuració de límits i precisions LimitsDesc=Podeu definir aquí els límits i precisions utilitzats per Dolibarr @@ -1496,7 +1501,7 @@ AdherentLoginRequired= Gestiona un compte d'usuari per a cada soci AdherentMailRequired=Cal un correu electrònic per a crear un soci nou MemberSendInformationByMailByDefault=La casella de selecció per a enviar una confirmació per correu electrònic als socis (validació o nova subscripció) està activada per defecte MemberCreateAnExternalUserForSubscriptionValidated=Creeu un usuari extern per a cada subscripció nova membre validada -VisitorCanChooseItsPaymentMode=Visitor can choose from any available payment modes +VisitorCanChooseItsPaymentMode=El visitant pot triar entre qualsevol forma de pagament disponible MEMBER_REMINDER_EMAIL=Activa el recordatori automàtic per correu electrònic de les subscripcions caducades. Nota: El mòdul %s s'ha d'habilitar i configurar correctament per a enviar recordatoris. MembersDocModules=Plantilles de documents per a documents generats a partir del registre de socis ##### LDAP setup ##### @@ -1826,6 +1831,9 @@ AGENDA_USE_EVENT_TYPE=Utilitzeu tipus d'esdeveniments (gestionats en el menú Co AGENDA_USE_EVENT_TYPE_DEFAULT=Estableix automàticament aquest valor predeterminat per al tipus d'esdeveniment en el formulari de creació de l'esdeveniment AGENDA_DEFAULT_FILTER_TYPE=Estableix automàticament aquest tipus d'esdeveniment al filtre de cerca de la vista d'agenda AGENDA_DEFAULT_FILTER_STATUS=Estableix automàticament aquest estat per a esdeveniments al filtre de cerca de la visualització d'agenda +AGENDA_EVENT_PAST_COLOR=Past event color +AGENDA_EVENT_CURRENT_COLOR=Current event color +AGENDA_EVENT_FUTURE_COLOR=Future event color AGENDA_DEFAULT_VIEW=Quina vista voleu obrir de manera predeterminada en seleccionar el menú Agenda AGENDA_REMINDER_BROWSER=Activa el recordatori d'esdeveniments al navegador de l'usuari (Quan s'arriba a la data de recordatori, el navegador mostra una finestra emergent. Cada usuari pot desactivar aquestes notificacions des de la configuració de notificacions del navegador). AGENDA_REMINDER_BROWSER_SOUND=Habilita les notificacions sonores @@ -2129,6 +2137,7 @@ CodeLastResult=Últim codi retornat NbOfEmailsInInbox=Nombre de correus electrònics en el directori font LoadThirdPartyFromName=Carregueu la cerca de tercers al %s (només carrega) LoadThirdPartyFromNameOrCreate=Carregueu la cerca de tercers a %s (crear si no es troba) +LoadContactFromEmailOrCreate=Load contact searching on %s (create if not found) AttachJoinedDocumentsToObject=Deseu els fitxers adjunts als documents d'objectes si es troba una referència d'un objecte al tema del correu electrònic. WithDolTrackingID=Missatge d'una conversa iniciada per un primer correu electrònic enviat des de Dolibarr WithoutDolTrackingID=Missatge d'una conversa iniciada per un primer correu electrònic NO enviat des de Dolibarr @@ -2355,3 +2364,5 @@ AllowExternalDownload=Allow external download (without login, using a shared lin DeadlineDayVATSubmission=Deadline day for vat submission on the next month MaxNumberOfAttachementOnForms=Max number of joinded files in a form IfDefinedUseAValueBeetween=If defined, use a value between %s and %s +Reload=Reload +ConfirmReload=Confirm module reload diff --git a/htdocs/langs/ca_ES/bills.lang b/htdocs/langs/ca_ES/bills.lang index 04cfb614f83..44769c6d765 100644 --- a/htdocs/langs/ca_ES/bills.lang +++ b/htdocs/langs/ca_ES/bills.lang @@ -17,7 +17,7 @@ DisabledBecauseNotLastSituationInvoice=Disabled because invoice is not erasable. DisabledBecauseNotErasable=S'ha desactivat perquè no es pot esborrar InvoiceStandard=Factura estàndard InvoiceStandardAsk=Factura estàndard -InvoiceStandardDesc=Aquest tipus de factura és la factura tradicional. També es coneix com factura de dèbit (del verb deure). +InvoiceStandardDesc=Aquest tipus de factura és la factura comuna. InvoiceStandardShort=Estàndard InvoiceDeposit=Factura de bestreta InvoiceDepositAsk=Factura de bestreta @@ -31,7 +31,7 @@ InvoiceReplacementAsk=Factura rectificativa de la factura InvoiceReplacementDesc=La factura de substitució s’utilitza per a substituir completament una factura sense que s’hagi rebut cap pagament.

    Nota: Només es poden substituir les factures sense pagament. Si la factura que reemplaça encara no està tancada, es tancarà automàticament a 'abandonada' InvoiceAvoir=Abonament InvoiceAvoirAsk=Abonament per factura rectificativa -InvoiceAvoirDesc=L'abonament és una factura negativa destinada a compensar un import de factura que difereix de l'import realment pagat (per haver pagat de més o per devolució de productes, per exemple). +InvoiceAvoirDesc=La nota de crèdit és una factura negativa que s'utilitza per a corregir el fet que una factura mostra un import diferent de l'import realment pagat (p. ex., el client va pagar massa per error o no pagarà l'import complet perquè alguns productes van ser retornats) . invoiceAvoirWithLines=Crear abonament amb les línies de la factura d'origen invoiceAvoirWithPaymentRestAmount=Crear abonament de la factura pendent de pagament invoiceAvoirLineWithPaymentRestAmount=Abonament per a la quantitat restant no pagada @@ -244,7 +244,7 @@ RemainderToPayMulticurrency=La moneda original pendent de pagament RemainderToTake=Import restant per a cobrar RemainderToTakeMulticurrency=Import restant, moneda original RemainderToPayBack=Import restant a reemborsar -RemainderToPayBackMulticurrency=Import restant per reembossar, moneda original +RemainderToPayBackMulticurrency=Import restant a reemborsar, moneda original NegativeIfExcessRefunded=negatiu si es reemborsa l'excés Rest=Pendent AmountExpected=Import reclamat @@ -263,7 +263,7 @@ NoOtherDraftBills=Cap altra factura esborrany NoDraftInvoices=Sense factures esborrany RefBill=Ref. factura ToBill=A facturar -RemainderToBill=Queda per facturar +RemainderToBill=Queda per a facturar SendBillByMail=Envia factura per e-mail SendReminderBillByMail=Envia recordatori per e-mail RelatedCommercialProposals=Pressupostos relacionats diff --git a/htdocs/langs/ca_ES/blockedlog.lang b/htdocs/langs/ca_ES/blockedlog.lang index f878fc12d5a..2c1a310ef20 100644 --- a/htdocs/langs/ca_ES/blockedlog.lang +++ b/htdocs/langs/ca_ES/blockedlog.lang @@ -8,34 +8,12 @@ BrowseBlockedLog=Registres inalterables ShowAllFingerPrintsMightBeTooLong=Mostra tots els registres arxivats (pot ser llarg) ShowAllFingerPrintsErrorsMightBeTooLong=Mostra tots els registres d'arxiu no vàlids (pot ser llarg) DownloadBlockChain=Baixa les empremtes dactilars -KoCheckFingerprintValidity=L’entrada de registre arxivada no és vàlida. Significa que algú (un pirata informàtic?) ha modificat algunes dades d’aquest registre després que es va gravar, o que ha estat esborrat el registre arxivat anterior (comproveu que la línia amb numeració anterior existeix) o ha sigut modificat el el checksum del registre anterior. +KoCheckFingerprintValidity=L'entrada de registre arxivada no és vàlida. Significa que algú (un pirata informàtic?) ha modificat algunes dades d'aquest registre després d'haver-lo enregistrat, o ha esborrat el registre arxivat anterior (comproveu que existeixi la línia amb la numeració anterior) o ha modificat la suma de verificació del registre anterior. OkCheckFingerprintValidity=El registre del registre arxivat és vàlid. Les dades d'aquesta línia no s'han modificat i l'entrada segueix l'anterior. OkCheckFingerprintValidityButChainIsKo=El registre arxivat sembla ser vàlid en comparació amb l'anterior, però la cadena s'ha corromput prèviament. AddedByAuthority=Emmagatzemat a l'autoritat remota NotAddedByAuthorityYet=Encara no emmagatzemat a l'autoritat remota ShowDetails=Mostra els detalls emmagatzemats -logPAYMENT_VARIOUS_CREATE=S'ha creat el pagament (no assignat a una factura) -logPAYMENT_VARIOUS_MODIFY=S'ha modificat el pagament (no assignat a una factura) -logPAYMENT_VARIOUS_DELETE=Supressió lògica de pagament (no assignada a una factura) -logPAYMENT_ADD_TO_BANK=Pagament afegit al banc -logPAYMENT_CUSTOMER_CREATE=S'ha creat el pagament del client -logPAYMENT_CUSTOMER_DELETE=Lògica de liquidació del pagament del client -logDONATION_PAYMENT_CREATE=Pagament de donació creat -logDONATION_PAYMENT_DELETE=Llicència de pagament de la donació -logBILL_PAYED=S'ha pagat la factura del client -logBILL_UNPAYED=Establiment de la factura del client no remunerat -logBILL_VALIDATE=Validació factura -logBILL_SENTBYMAIL=La factura del client s'envia per correu -logBILL_DELETE=S'ha suprimit la factura del client lògicament -logMODULE_RESET=S'ha desactivat el mòdul bloquejat -logMODULE_SET=S'ha habilitat el mòdul bloquejat -logDON_VALIDATE=Donació validada -logDON_MODIFY=Donació modificada -logDON_DELETE=Donació de l'eliminació lògica -logMEMBER_SUBSCRIPTION_CREATE=S'ha creat una subscripció de membre -logMEMBER_SUBSCRIPTION_MODIFY=S'ha modificat la subscripció de membre -logMEMBER_SUBSCRIPTION_DELETE=Supressió lògica de subscripció de membre -logCASHCONTROL_VALIDATE=Registre de tancament de caixa BlockedLogBillDownload=Descarrega la factura del client BlockedLogBillPreview=Previsualització de la factura del client BlockedlogInfoDialog=Detalls del registre @@ -48,10 +26,36 @@ DataOfArchivedEvent=Dades completes d'esdeveniments arxivats ImpossibleToReloadObject=Objecte original (tipus %s, identificador %s) no enllaçat (vegeu la columna "Dades completes" per a obtenir dades desades inalterables) BlockedLogAreRequiredByYourCountryLegislation=El mòdul de registres inalterables pot ser requerit per la legislació del vostre país. La desactivació d'aquest mòdul pot fer que qualsevol transacció futura sigui invàlida pel que fa a la llei i l'ús del programari legal, ja que no es pot validar mitjançant una auditoria fiscal. BlockedLogActivatedBecauseRequiredByYourCountryLegislation=El mòdul de registres inalterables s'ha activat a causa de la legislació del vostre país. La desactivació d'aquest mòdul pot fer que qualsevol transacció futura sigui invàlida pel que fa a la llei i l'ús del programari legal, ja que no es pot validar mitjançant una auditoria fiscal. -BlockedLogDisableNotAllowedForCountry=Llista de països on l'ús d'aquest mòdul és obligatori (només per impedir que es desactivi el mòdul per error, si el vostre país està en aquesta llista, la desactivació del mòdul no és possible sense editar aquesta llista. Noteu també que habilitar / desactivar aquest mòdul seguiu una pista en el registre inalterable). +BlockedLogDisableNotAllowedForCountry=Llista de països on l'ús d'aquest mòdul és obligatori (només per a evitar que es desactivi el mòdul per error, si el vostre país és en aquesta llista, no és possible desactivar el mòdul sense editar aquesta llista primer. Tingueu en compte també que activar/desactivar aquest mòdul mantindrà un registre al registre inalterable). OnlyNonValid=No vàlid TooManyRecordToScanRestrictFilters=Hi ha massa registres per a escanejar/analitzar. Limita la llista amb filtres més restrictius. RestrictYearToExport=Restringeix el mes / any per a exportar BlockedLogEnabled=S'ha habilitat el sistema per a fer el seguiment d'esdeveniments en registres inalterables BlockedLogDisabled=El sistema per a fer el seguiment d'esdeveniments en registres inalterables s'ha desactivat després de fer algunes gravacions. Hem desat una empremta digital especial per a fer un seguiment de la cadena com a trencada BlockedLogDisabledBis=S'ha desactivat el sistema per a fer el seguiment d'esdeveniments en registres inalterables. Això és possible perquè encara no s'ha fet cap registre. + +## logTypes +logBILL_DELETE=S'ha suprimit la factura del client lògicament +logBILL_PAYED=S'ha pagat la factura del client +logBILL_SENTBYMAIL=La factura del client s'envia per correu +logBILL_UNPAYED=Establiment de la factura del client no remunerat +logBILL_VALIDATE=Validació factura +logCASHCONTROL_VALIDATE=Registre de tancament de caixa +logDOC_DOWNLOAD=Descàrrega d'un document validat per a imprimir o enviar +logDOC_PREVIEW=Vista prèvia d'un document validat per a imprimir o descarregar +logDONATION_PAYMENT_CREATE=Pagament de donació creat +logDONATION_PAYMENT_DELETE=Llicència de pagament de la donació +logDON_DELETE=Donació de l'eliminació lògica +logDON_MODIFY=Donació modificada +logDON_VALIDATE=Donació validada +logMEMBER_SUBSCRIPTION_CREATE=S'ha creat una subscripció de membre +logMEMBER_SUBSCRIPTION_DELETE=Supressió lògica de subscripció de membre +logMEMBER_SUBSCRIPTION_MODIFY=S'ha modificat la subscripció de membre +logMODULE_RESET=S'ha desactivat el mòdul bloquejat +logMODULE_SET=S'ha habilitat el mòdul bloquejat +logPAYMENT_ADD_TO_BANK=Pagament afegit al banc +logPAYMENT_CUSTOMER_CREATE=S'ha creat el pagament del client +logPAYMENT_CUSTOMER_DELETE=Lògica de liquidació del pagament del client +logPAYMENT_VARIOUS_CREATE=S'ha creat el pagament (no assignat a una factura) +logPAYMENT_VARIOUS_DELETE=Supressió lògica de pagament (no assignada a una factura) +logPAYMENT_VARIOUS_MODIFY=S'ha modificat el pagament (no assignat a una factura) diff --git a/htdocs/langs/ca_ES/companies.lang b/htdocs/langs/ca_ES/companies.lang index 44780aca714..ba49594bb39 100644 --- a/htdocs/langs/ca_ES/companies.lang +++ b/htdocs/langs/ca_ES/companies.lang @@ -312,8 +312,8 @@ CustomerRelativeDiscountShort=Descompte relatiu CustomerAbsoluteDiscountShort=Descompte fixe CompanyHasRelativeDiscount=Aquest client té un descompte per defecte de %s%% CompanyHasNoRelativeDiscount=Aquest client no té descomptes relatius per defecte -HasRelativeDiscountFromSupplier=Teniu un descompte predeterminat de %s%% d'aquest proveïdor -HasNoRelativeDiscountFromSupplier=No default relative discount from this vendor +HasRelativeDiscountFromSupplier=You have a default discount of %s%% with this vendor +HasNoRelativeDiscountFromSupplier=No default relative discount with this vendor CompanyHasAbsoluteDiscount=Aquest client té descomptes disponibles (notes de crèdit o bestretes) per %s %s CompanyHasDownPaymentOrCommercialDiscount=Aquest client té un descompte disponible (comercial, de pagament) per a %s%s CompanyHasCreditNote=Aquest client encara té abonaments per %s %s @@ -499,4 +499,7 @@ OutOfEurope=Fora d’Europa (CEE) CurrentOutstandingBillLate=Factura pendent actual en retard BecarefullChangeThirdpartyBeforeAddProductToInvoice=Ves amb compte, en funció de la configuració del preu del producte, has de canviar de tercer abans d’afegir el producte al TPV. EmailAlreadyExistsPleaseRewriteYourCompanyName=El correu electrònic ja existeix, si us plau, reescriu el nom de la teva empresa -TwoRecordsOfCompanyName=Hi ha més d'un registre per a aquesta empresa, poseu-vos en contacte amb nosaltres per a completar la vostra sol·licitud d'associació" +TwoRecordsOfCompanyName=more than one record exists for this company, please contact us to complete your partnership request +CompanySection=Secció d'empresa +ShowSocialNetworks=Mostra les xarxes socials +HideSocialNetworks=Amaga les xarxes socials diff --git a/htdocs/langs/ca_ES/cron.lang b/htdocs/langs/ca_ES/cron.lang index a8b7e209e63..b2c8d96b8fc 100644 --- a/htdocs/langs/ca_ES/cron.lang +++ b/htdocs/langs/ca_ES/cron.lang @@ -84,14 +84,14 @@ MakeLocalDatabaseDumpShort=Còpia de seguretat de la base de dades local MakeLocalDatabaseDump=Crear un bolcat de la base de dades local. Els paràmetres són: compressió ('gz' o 'bz' o 'none'), tipus de còpia de seguretat ('mysql' o 'pgsql'), 1, 'auto' o nom de fitxer per a compilar, nombre de fitxers de còpia de seguretat per conservar MakeSendLocalDatabaseDumpShort=Envia una còpia de seguretat de la base de dades local MakeSendLocalDatabaseDump=Envieu una còpia de seguretat de la base de dades local per correu electrònic. Els paràmetres són: to, from, subject, message, filename (nom del fitxer enviat), filtre ('sql' només per a la còpia de seguretat de la base de dades) -BackupIsTooLargeSend=Sorry, last backup file is too large to be send by email +BackupIsTooLargeSend=Ho sentim, l'últim fitxer de còpia de seguretat és massa gran per a enviar-lo per correu electrònic CleanUnfinishedCronjobShort=Neteja les tasques programades inacabades CleanUnfinishedCronjob=Neteja les tasques programades bloquejades en el processament quan el procés ja no s'executa WarningCronDelayed=Atenció, a efectes de rendiment, sigui quina sigui la propera data d'execució de les tasques habilitades, és possible que les vostres tasques es retardin a un màxim de %s hores abans de ser executades. DATAPOLICYJob=Netejador de dades i anonimitzador JobXMustBeEnabled=La tasca %s s'ha d'activar -EmailIfError=Email for warning on error -ErrorInBatch=Error when running the job %s +EmailIfError=Correu electrònic per a advertir d'error +ErrorInBatch=Error en executar la tasca %s # Cron Boxes LastExecutedScheduledJob=Darrera tasca programada executada diff --git a/htdocs/langs/ca_ES/errors.lang b/htdocs/langs/ca_ES/errors.lang index 92d701f368e..0818df26ea1 100644 --- a/htdocs/langs/ca_ES/errors.lang +++ b/htdocs/langs/ca_ES/errors.lang @@ -303,6 +303,7 @@ ErrorValueForTooLow=Value for %s is too low ErrorValueCantBeNull=Value for %s can't be null ErrorDateOfMovementLowerThanDateOfFileTransmission=The date of the bank transaction can't be lower than the date of the file transmission ErrorTooMuchFileInForm=Too much files in form, the maximum number is %s file(s) +ErrorSessionInvalidatedAfterPasswordChange=The session was been invalidated following a change of password, status or dates of validity. Please relogin. # Warnings WarningParamUploadMaxFileSizeHigherThanPostMaxSize=El paràmetre PHP upload_max_filesize (%s) és superior al paràmetre PHP post_max_size (%s). No es tracta d’una configuració consistent. @@ -325,6 +326,7 @@ WarningPaymentDateLowerThanInvoiceDate=La data de pagament (%s) és anterior a l WarningTooManyDataPleaseUseMoreFilters=Massa dades (més de %s línies). Utilitza més filtres o indica la constant %s amb un límit superior. WarningSomeLinesWithNullHourlyRate=Algunes vegades es van registrar per alguns usuaris quan no s'havia definit el seu preu per hora. Es va utilitzar un valor de 0 %s per hora, però això pot resultar una valoració incorrecta del temps dedicat. WarningYourLoginWasModifiedPleaseLogin=El vostre nom d'usuari s'ha modificat. Per motius de seguretat, haureu d'iniciar sessió amb el vostre nou nom d'usuari abans de la propera acció. +WarningYourPasswordWasModifiedPleaseLogin=S'ha modificat la teva contrasenya. Per motius de seguretat, haureu d'iniciar sessió ara amb la vostra nova contrasenya. WarningAnEntryAlreadyExistForTransKey=Ja existeix una entrada per la clau de traducció d'aquest idioma WarningNumberOfRecipientIsRestrictedInMassAction=Advertència: el nombre de destinataris diferents està limitat a %s quan s'utilitzen les accions massives a les llistes. WarningDateOfLineMustBeInExpenseReportRange=Advertència, la data de la línia no està dins del rang de l'informe de despeses diff --git a/htdocs/langs/ca_ES/eventorganization.lang b/htdocs/langs/ca_ES/eventorganization.lang index e17596d878c..f2acfbb129e 100644 --- a/htdocs/langs/ca_ES/eventorganization.lang +++ b/htdocs/langs/ca_ES/eventorganization.lang @@ -172,3 +172,5 @@ ErrorSeveralCompaniesWithEmailContactUs=S'han trobat diverses empreses amb aques ErrorSeveralCompaniesWithNameContactUs=S'han trobat diverses empreses amb aquest nom, de manera que no podem validar automàticament el vostre registre. Si us plau, poseu-vos en contacte amb nosaltres a %s per a obtenir una validació manual NoPublicActionsAllowedForThisEvent=No hi ha cap acció pública oberta al públic per a aquest esdeveniment MaxNbOfAttendees=Nombre màxim d'assistents +DateStartEvent=Data d'inici de l'esdeveniment +DateEndEvent=Data de finalització de l'esdeveniment diff --git a/htdocs/langs/ca_ES/main.lang b/htdocs/langs/ca_ES/main.lang index ef9b8f4c8d5..77b9b4cd021 100644 --- a/htdocs/langs/ca_ES/main.lang +++ b/htdocs/langs/ca_ES/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=Grup d'usuari no definit Password=Contrasenya PasswordRetype=Repetiu la vostra contrasenya NoteSomeFeaturesAreDisabled=Tingues en compte que molts mòduls i funcionalitats estan deshabilitats en aquesta demostració. +YourUserFile=Your user file Name=Nom NameSlashCompany=Nom / Empresa Person=Persona @@ -897,6 +898,9 @@ MassFilesArea=Àrea de fitxers generats per accions massives ShowTempMassFilesArea=Mostra l'àrea de fitxers generats per accions massives ConfirmMassDeletion=Confirmació d'esborrament massiu ConfirmMassDeletionQuestion=Esteu segur que voleu suprimir els (s) registre (s) %s? +ConfirmMassClone=Bulk clone confirmation +ConfirmMassCloneQuestion=Select project to clone to +ConfirmMassCloneToOneProject=Clone to project %s RelatedObjects=Objectes relacionats ClassifyBilled=Classifica facturat ClassifyUnbilled=Classifica no facturat @@ -912,8 +916,8 @@ ExportFilteredList=Llistat filtrat d'exportació ExportList=Llistat d'exportació ExportOptions=Opcions d'exportació IncludeDocsAlreadyExported=Inclou documents ja exportats -ExportOfPiecesAlreadyExportedIsEnable=L’exportació de peces ja exportades està habilitada -ExportOfPiecesAlreadyExportedIsDisable=L’exportació de peces ja exportades està inhabilitada +ExportOfPiecesAlreadyExportedIsEnable=Documents already exported are visible and will be exported +ExportOfPiecesAlreadyExportedIsDisable=Documents already exported are hidden and won't be exported AllExportedMovementsWereRecordedAsExported=Tots els moviments exportats s'han registrat com a exportats NotAllExportedMovementsCouldBeRecordedAsExported=No s'ha pogut registrar tots els moviments exportats com a exportats Miscellaneous=Diversos @@ -1128,6 +1132,7 @@ DeleteFileText=Realment vols suprimir aquest fitxer? ShowOtherLanguages=Mostrar altres idiomes SwitchInEditModeToAddTranslation=Canviar a mode d'edició per a afegir traduccions per a aquest idioma NotUsedForThisCustomer=No s'utilitza per a aquest client +NotUsedForThisVendor=Not used for this vendor AmountMustBePositive=L'import ha de ser positiu ByStatus=Per estat InformationMessage=Informació @@ -1148,14 +1153,14 @@ EventReminder=Recordatori d'esdeveniments UpdateForAllLines=Actualització per a totes les línies OnHold=Fora de servei Civility=Civilitat -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Set Supervisor +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor CreateExternalUser=Crea un usuari extern ConfirmAffectTag=Bulk Tag Assignement ConfirmAffectUser=Bulk User Assignement -ProjectRole=Role assigned on each project -TasksRole=Role assigned on each task of each project +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ConfirmSetSupervisor=Bulk Supervisor Set ConfirmUpdatePrice=Choose a increase/decrease price rate ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Creat a partir del portal públic UserAgent=Agent d'usuari InternalUser=Usuari intern ExternalUser=Usuari extern +NoSpecificContactAddress=No specific contact or address +NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. +HideOnVCard=Hide %s +AddToContacts=Add address to my contacts +LastAccess=Últim accés +UploadAnImageToSeeAPhotoHere=Carregueu una imatge de la pestanya %s per a veure una foto aquí +LastPasswordChangeDate=Last password change date diff --git a/htdocs/langs/ca_ES/members.lang b/htdocs/langs/ca_ES/members.lang index 7c5232f0eee..db410480361 100644 --- a/htdocs/langs/ca_ES/members.lang +++ b/htdocs/langs/ca_ES/members.lang @@ -207,7 +207,7 @@ NbOfSubscriptions=Nombre de contribucions AmountOfSubscriptions=Import recaptat de les contribucions TurnoverOrBudget=Volum de vendes (empresa) o Pressupost (associació o col.lectiu) DefaultAmount=Import per defecte de la contribució -CanEditAmount=Subscription amount is free +CanEditAmount=L'import de la subscripció és gratuït CanEditAmountDetail=El visitant pot triar/editar la quantitat de la seva contribució independentment del tipus de soci AmountIsLowerToMinimumNotice=sobre un total d'%s MEMBER_NEWFORM_PAYONLINE=After the online registration, switch automatically on the online payment page diff --git a/htdocs/langs/ca_ES/orders.lang b/htdocs/langs/ca_ES/orders.lang index 472cd6f2c80..530bfe3f540 100644 --- a/htdocs/langs/ca_ES/orders.lang +++ b/htdocs/langs/ca_ES/orders.lang @@ -96,6 +96,10 @@ OrdersStatisticsSuppliers=Estadístiques de comandes de compra NumberOfOrdersByMonth=Nombre de comandes per mes AmountOfOrdersByMonthHT=Quantitat de comandes per mes (sense IVA) ListOfOrders=Llistat de comandes +ListOrderLigne=Lines of orders +productobuy=Products to buy only +productonly=Només productes +disablelinefree=No lines free CloseOrder=Tancar comanda ConfirmCloseOrder=Vols classificar aquesta comanda com entregada? Un cop s'entrega la comanda, es podrà classificar com a facturada. ConfirmDeleteOrder=Vols eliminar aquesta comanda? @@ -131,6 +135,7 @@ SupplierOrderClassifiedBilled=Comanda de compra %s com a facturada OtherOrders=Altres comandes SupplierOrderValidatedAndApproved=La comanda del proveïdor està validada i aprovada: %s SupplierOrderValidated=La comanda del proveïdor està validada: %s +OrderShowDetail=Show order detail ##### Types de contacts ##### TypeContact_commande_internal_SALESREPFOLL=Ordre de venda de seguiment representatiu TypeContact_commande_internal_SHIPPING=Responsable del seguiment de l'enviament @@ -199,3 +204,5 @@ StatusSupplierOrderApproved=Aprovat StatusSupplierOrderRefused=Rebutjat StatusSupplierOrderReceivedPartially=Rebuda parcialment StatusSupplierOrderReceivedAll=Tots els productes rebuts +NeedAtLeastOneInvoice = Hi ha d'haver almenys una factura +LineAlreadyDispatched = La línia de comanda ja s'ha rebut. diff --git a/htdocs/langs/ca_ES/projects.lang b/htdocs/langs/ca_ES/projects.lang index e0bd97da30b..7e49d3d4d4e 100644 --- a/htdocs/langs/ca_ES/projects.lang +++ b/htdocs/langs/ca_ES/projects.lang @@ -125,7 +125,7 @@ ValidateProject=Validar projecte ConfirmValidateProject=Vols validar aquest projecte? CloseAProject=Tancar projecte ConfirmCloseAProject=Vols tancar aquest projecte? -AlsoCloseAProject=Also close project +AlsoCloseAProject=Tanca el projecte també AlsoCloseAProjectTooltip=Manteniu-lo obert si encara heu de seguir les tasques de producció ReOpenAProject=Reobrir projecte ConfirmReOpenAProject=Vols reobrir aquest projecte? @@ -259,6 +259,7 @@ RecordsClosed=%s projecte(s) tancat(s) SendProjectRef=Informació del projecte %s ModuleSalaryToDefineHourlyRateMustBeEnabled=El mòdul "Salaris" ha d'estar habilitat per a definir la tarifa horària dels empleats per tal de valorar el temps dedicat NewTaskRefSuggested=Tasca ref en ús, es requereix una nova tasca ref +NumberOfTasksCloned=%s task(s) cloned TimeSpentInvoiced=Temps de facturació facturat TimeSpentForIntervention=Temps dedicat TimeSpentForInvoice=Temps dedicat @@ -287,7 +288,7 @@ AddPersonToTask=Afegeix també a les tasques UsageOrganizeEvent=Ús: organització d'esdeveniments PROJECT_CLASSIFY_CLOSED_WHEN_ALL_TASKS_DONE=Classifica un projecte com a tancat quan s'hagin completat totes les seves tasques (progrés 100%%) PROJECT_CLASSIFY_CLOSED_WHEN_ALL_TASKS_DONE_help=Note: existing projects with all tasks already set to a progress of 100 %% won't be affected: you will have to close them manually. This option only affects open projects. -SelectLinesOfTimeSpentToInvoice=Seleccioneu les línies de temps que no es facturen i, a continuació, feu una acció massiva "Genera factura" per facturar-les +SelectLinesOfTimeSpentToInvoice=Seleccioneu les línies de temps invertides que no estiguin facturades i, a continuació, feu l'acció massiva "Genera factura" per a facturar-les. ProjectTasksWithoutTimeSpent=Projecte tasques sense temps dedicat FormForNewLeadDesc=Gràcies per omplir el següent formulari per contactar amb nosaltres. També podeu enviar-nos un correu electrònic directament a %s . ProjectsHavingThisContact=Projectes amb aquest contacte diff --git a/htdocs/langs/ca_ES/stocks.lang b/htdocs/langs/ca_ES/stocks.lang index abdf7041022..0db83a567c2 100644 --- a/htdocs/langs/ca_ES/stocks.lang +++ b/htdocs/langs/ca_ES/stocks.lang @@ -49,7 +49,7 @@ StockCorrection=Regularització d'estoc CorrectStock=Regularització d'estoc StockTransfer=Transferència d’estoc TransferStock=Transferència d'estoc -MassStockTransferShort=Bulk stock change +MassStockTransferShort=Canvi d'estoc massiu StockMovement=Moviment d'estoc StockMovements=Moviments d'estoc NumberOfUnit=Nombre d'unitats @@ -107,7 +107,7 @@ LieuWareHouse=Localització magatzem WarehousesAndProducts=Magatzems i productes WarehousesAndProductsBatchDetail=Magatzems i productes (amb detall per lot/sèrie) AverageUnitPricePMPShort=Preu mitjà ponderat -AverageUnitPricePMPDesc=El preu unitari mitjà d’entrada que vam haver de gastar per aconseguir una unitat de producte al nostre estoc. +AverageUnitPricePMPDesc=El preu unitari mitjà d'entrada que hem hagut de gastar per a incorporar 1 unitat de producte al nostre estoc. SellPriceMin=Preu de venda unitari EstimatedStockValueSellShort=Valor per vendre EstimatedStockValueSell=Valor per vendre diff --git a/htdocs/langs/ca_ES/stripe.lang b/htdocs/langs/ca_ES/stripe.lang index ff4fd2e511b..190e2d222cb 100644 --- a/htdocs/langs/ca_ES/stripe.lang +++ b/htdocs/langs/ca_ES/stripe.lang @@ -28,7 +28,7 @@ AccountParameter=Paràmetres del compte UsageParameter=Paràmetres d'ús InformationToFindParameters=Ajuda per a trobar la vostra informació del compte %s STRIPE_CGI_URL_V2=URL CGI del mòdul Stripe per al pagament -CSSUrlForPaymentForm=Url del full d'estil CSS per al formulari de pagament +CSSUrlForPaymentForm=URL del full d'estil CSS per al formulari de pagament NewStripePaymentReceived=S'ha rebut un pagament nou de Stripe NewStripePaymentFailed=S'ha intentat el pagament nou de Stripe, però ha fallat FailedToChargeCard=No s'ha pogut fer el càrrec a la targeta @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Webhook clau en directe ONLINE_PAYMENT_WAREHOUSE=Estoc a utilitzar per a disminuir l'estoc quan es fa el pagament en línia
    (Pendent de fer quan l'opció per a reduir l'estoc es fa en una acció a la factura i el pagament en línia es genera la seva factura?) StripeLiveEnabled=Stripe live activat (en cas contrari, mode de prova/sandbox) StripeImportPayment=Importar pagaments per Stripe -ExampleOfTestCreditCard=Exemple de targeta de crèdit per a la prova: %s => vàlid, %s => error CVC, %s => caducat, %s => falla la càrrega +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +ExampleOfTestBankAcountForSEPA=Exemple de compte bancari BAN per a la prova de domiciliació bancària: %s StripeGateways=Passarel·les Stripe OAUTH_STRIPE_TEST_ID=Identificador de client de Stripe Connect (ca _...) OAUTH_STRIPE_LIVE_ID=Identificador de client de Stripe Connect (ca _...) @@ -61,6 +62,7 @@ DeleteACard=Suprimeix la targeta ConfirmDeleteCard=Estàs segur que vols eliminar aquesta targeta de crèdit o de dèbit? CreateCustomerOnStripe=Crea un client a Stripe CreateCardOnStripe=Crea una targeta a Stripe +CreateBANOnStripe=Create bank on Stripe ShowInStripe=Mostra a Stripe StripeUserAccountForActions=Compte d'usuari que s'utilitzarà per a la notificació per correu electrònic d'alguns esdeveniments de Stripe (pagaments de Stripe) StripePayoutList=Llista de pagaments de Stripe @@ -69,4 +71,8 @@ ToOfferALinkForLiveWebhook=Enllaç a la configuració de Stripe WebHook per truc PaymentWillBeRecordedForNextPeriod=El pagament es registrarà per al període següent. ClickHereToTryAgain= Feu clic aquí per a tornar-ho a provar... CreationOfPaymentModeMustBeDoneFromStripeInterface=A causa de les fortes regles d'autenticació de clients, la creació d'una fitxa s'ha de fer des del panell de Stripe. Podeu fer clic aquí per a activar el registre de clients de Stripe: %s -TERMINAL_LOCATION=Ubicació (adreça) per a terminals +STRIPE_CARD_PRESENT=Card Present for Stripe Terminals +TERMINAL_LOCATION=Location (address) for Stripe Terminals +RequestDirectDebitWithStripe=Request Direct Debit with Stripe +STRIPE_SEPA_DIRECT_DEBIT=Activeu els pagaments per domiciliació bancària mitjançant Stripe + diff --git a/htdocs/langs/ca_ES/ticket.lang b/htdocs/langs/ca_ES/ticket.lang index 6d113e189d6..849bef2cda1 100644 --- a/htdocs/langs/ca_ES/ticket.lang +++ b/htdocs/langs/ca_ES/ticket.lang @@ -26,6 +26,7 @@ Permission56002=Modifica tiquets Permission56003=Esborrar tiquets Permission56004=Gestiona els tiquets Permission56005=Veure els tiquets de tots els tercers (no efectiu per als usuaris externs, sempre estarà limitat al tercer del qual depenen) +Permission56006=Export tickets Tickets=Tiquets TicketDictType=Tiquet - Tipus @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=Col·laborador extern OriginEmail=Correu electrònic del reporter Notify_TICKET_SENTBYMAIL=Envia el missatge del tiquet per correu electrònic +ExportDataset_ticket_1=Tiquets + # Status Read=Llegit Assigned=Assignat diff --git a/htdocs/langs/ca_ES/users.lang b/htdocs/langs/ca_ES/users.lang index 0fbf167ffb5..ab4e884a2d7 100644 --- a/htdocs/langs/ca_ES/users.lang +++ b/htdocs/langs/ca_ES/users.lang @@ -47,7 +47,7 @@ RemoveFromGroup=Eliminar del grup PasswordChangedAndSentTo=Contrasenya canviada i enviada a %s. PasswordChangeRequest=Sol·licitud de canvi de contrasenya per %s PasswordChangeRequestSent=Petició de canvi de contrasenya per a %s enviada a %s. -IfLoginExistPasswordRequestSent=Si aquest inici de sessió és un compte vàlid, s'ha enviat un correu electrònic per a restablir la contrasenya. +IfLoginExistPasswordRequestSent=If this login is a valid account (with a valid email), an email to reset password has been sent. IfEmailExistPasswordRequestSent=Si aquest correu electrònic és un compte vàlid, s'ha enviat un correu electrònic per a restablir la contrasenya. ConfirmPasswordReset=Confirma la restauració de la contrasenya MenuUsersAndGroups=Usuaris i grups @@ -66,9 +66,9 @@ LinkedToDolibarrUser=Enllaç a l'usuari LinkedToDolibarrThirdParty=Enllaç a tercers CreateDolibarrLogin=Crear un compte d'usuari CreateDolibarrThirdParty=Crea un tercer -LoginAccountDisableInDolibarr=El compte està desactivat en Dolibarr +LoginAccountDisableInDolibarr=Compte desactivat a Dolibarr +PASSWORDInDolibarr=Contrasenya modificada a Dolibarr UsePersonalValue=Utilitzar valors personalitzats -InternalUser=Usuari intern ExportDataset_user_1=Usuaris i les seves propietats DomainUser=Usuari de domini Reactivate=Reactivar @@ -128,3 +128,8 @@ DateLastLogin=Data darrera sessió DatePreviousLogin=Data d'inici de sessió anterior IPLastLogin=IP darrer inici de sessió IPPreviousLogin=IP d'inici de sessió anterior +ShowAllPerms=Show all permission rows +HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/ca_ES/withdrawals.lang b/htdocs/langs/ca_ES/withdrawals.lang index d6b183c7c69..00d8bd28f98 100644 --- a/htdocs/langs/ca_ES/withdrawals.lang +++ b/htdocs/langs/ca_ES/withdrawals.lang @@ -101,11 +101,11 @@ CreditDate=Abonada el WithdrawalFileNotCapable=No es pot generar el fitxer de rebut de domiciliació del vostre país %s (El vostre país no és compatible) ShowWithdraw=Mostra l'ordre de domiciliació IfInvoiceNeedOnWithdrawPaymentWontBeClosed=Tot i això, si la factura té com a mínim una ordre de pagament per domiciliació bancària encara no processada, no s’establirà com a pagament per a permetre la gestió prèvia de la retirada. -DoStandingOrdersBeforePayments=Aquesta pestanya permet sol·licitar una ordre de pagament per domiciliació bancària. Un cop fet, podeu entrar al menú "Banc->Pagament per domiciliació bancària" per generar i gestionar un fitxer de comanda de domiciliació bancària. +DoStandingOrdersBeforePayments=Aquesta pestanya permet sol·licitar una ordre de pagament per domiciliació bancària. Un cop fet, podeu entrar al menú "Banc->Pagament per domiciliació bancària" per a generar i gestionar un fitxer de domiciliació bancària. DoStandingOrdersBeforePayments2=També podeu enviar una sol·licitud directament a un processador de pagaments SEPA com Stripe, ... -DoStandingOrdersBeforePayments3=Quan es tanqui l'ordre de domiciliació bancària, el pagament de les factures es registrarà automàticament i les factures es tanquen si la resta per pagar és nul·la. -DoCreditTransferBeforePayments=Aquesta pestanya us permet sol·licitar una ordre de transferència de crèdit. Un cop fet, aneu al menú "Banc->Pagament per transferència de crèdit" per generar i gestionar un fitxer d'ordre de transferència de crèdit. -DoCreditTransferBeforePayments3=Quan es tanqui l'ordre de transferència de crèdit, el pagament de les factures es registrarà automàticament i les factures es tanquen si la resta per pagar és nul·la. +DoStandingOrdersBeforePayments3=Quan es tanqui l'ordre de domiciliació bancària, el pagament de les factures es registrarà automàticament i les factures es tanquen si la resta per a pagar és nul·la. +DoCreditTransferBeforePayments=Aquesta pestanya us permet sol·licitar una ordre de transferència de crèdit. Un cop fet, aneu al menú "Banc->Pagament per transferència de crèdit" per a generar i gestionar un fitxer d'ordre de transferència de crèdit. +DoCreditTransferBeforePayments3=Quan es tanqui l'ordre de transferència de crèdit, el pagament de les factures es registrarà automàticament i les factures es tanquen si la resta per a pagar és nul·la. WithdrawalFile=Fitxer de comanda de dèbit CreditTransferFile=Fitxer de transferència de crèdit SetToStatusSent=Estableix l'estat "Fitxer enviat" @@ -122,7 +122,7 @@ WithdrawRequestErrorNilAmount=No és possible crear una domiciliació sense impo SepaMandate=Mandat de domiciliació bancària SEPA SepaMandateShort=Mandat SEPA PleaseReturnMandate=Si us plau, envieu aquest formulari de mandat per correu electrònic a %s o per correu postal a -SEPALegalText=En signar aquest formulari de mandat, autoritzeu (A) a %s i al seu proveïdor de serveis de pagament a enviar instruccions al vostre banc per carregar el vostre compte i (B) al vostre banc a domiciliar el vostre compte d'acord amb les instruccions d'%s. Com a part dels vostres drets, teniu dret a un reemborsament del vostre banc segons els termes i condicions del vostre acord amb el vostre banc. Els vostres drets respecte al mandat anterior s'expliquen en un comunicat que podeu obtenir al vostre banc. +SEPALegalText=En signar aquest formulari de mandat, autoritzeu (A) a %s i al seu proveïdor de serveis de pagament a enviar instruccions al vostre banc per a carregar el vostre compte i (B) al vostre banc a domiciliar el vostre compte d'acord amb les instruccions d'%s. Com a part dels vostres drets, teniu dret a un reemborsament del vostre banc segons els termes i condicions del vostre acord amb el vostre banc. Els vostres drets respecte al mandat anterior s'expliquen en un comunicat que podeu obtenir al vostre banc. CreditorIdentifier=Identificador del creditor CreditorName=Nom del creditor SEPAFillForm=(B) Si us plau completa tots els camps marcats amb * diff --git a/htdocs/langs/ca_ES/zapier.lang b/htdocs/langs/ca_ES/zapier.lang index 65d851a78bd..3ddf2a27546 100644 --- a/htdocs/langs/ca_ES/zapier.lang +++ b/htdocs/langs/ca_ES/zapier.lang @@ -18,4 +18,4 @@ ModuleZapierForDolibarrDesc = Mòdul Zapier per a Dolibarr ZapierForDolibarrSetup=Configuració de Zapier per a Dolibarr ZapierDescription=Interfície amb Zapier ZapierAbout=Quant al mòdul Zapier -ZapierSetupPage=No cal una configuració de Dolibarr per a utilitzar Zapier. Tanmateix, heu de generar i publicar un paquet a zapier per a poder utilitzar Zapier amb Dolibarr. Vegeu la documentació sobre aquesta pàgina wiki . +ZapierSetupPage=No cal una configuració de Dolibarr per a utilitzar Zapier. Tanmateix, heu de generar i publicar un paquet a zapier per a poder utilitzar Zapier amb Dolibarr. Vegeu la documentació sobre aquesta pàgina wiki. diff --git a/htdocs/langs/cs_CZ/accountancy.lang b/htdocs/langs/cs_CZ/accountancy.lang index 10e039ebde0..15d52b75959 100644 --- a/htdocs/langs/cs_CZ/accountancy.lang +++ b/htdocs/langs/cs_CZ/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Zvolte typ návratu vozíku ACCOUNTING_EXPORT_PREFIX_SPEC=Určete předponu pro název souboru ThisService=Tato služba ThisProduct=Tento výrobek -DefaultForService=Výchozí nastavení pro službu -DefaultForProduct=Výchozí produkt +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Produkty pro tento subjekt ServiceForThisThirdparty=Služby pro tento subjekt CantSuggest=Nelze navrhnout @@ -101,7 +101,8 @@ ShowAccountingAccount=Zobrazit účetní účet ShowAccountingJournal=Zobrazit účetní deník ShowAccountingAccountInLedger=Show accounting account in ledger ShowAccountingAccountInJournals=Show accounting account in journals -AccountAccountingSuggest=Účetní účet navrhl +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=výchozí účty MenuBankAccounts=Bankovní účty MenuVatAccounts=Účty DPH @@ -126,6 +127,7 @@ WriteBookKeeping=Record transactions in accounting Bookkeeping=účetní kniha BookkeepingSubAccount=Subledger AccountBalance=Zůstatek na účtu +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Zdrojový objekt ref CAHTF=Celkový prodejce před zdaněním TotalExpenseReport=Celková výkaz výdajů @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=Označení časopisu NumPiece=počet kusů TransactionNumShort=Num. transakce AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Group by general ledger account GroupBySubAccountAccounting=Group by subledger account AccountingAccountGroupsDesc=Zde můžete definovat některé skupiny účetních účtů. Budou se používat pro personalizované účetní výkazy. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Show subtotal by level Pcgtype=Skupina účtů PcgtypeDesc=Skupina účtů se používá jako předdefinovaná kritéria pro filtrování a seskupování pro některé účetní výkazy. Například „PŘÍJMY“ nebo „VÝDAJE“ se používají jako skupiny pro účetní účty produktů k sestavení výkazu nákladů / výnosů. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Smíření @@ -294,6 +299,7 @@ DescValidateMovements=Jakékoli úpravy nebo vymazání písem, nápisů a vymaz ValidateHistory=Ověřit automaticky AutomaticBindingDone=Automatic bindings done (%s) - Automatic binding not possible for some record (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Disable binding & transfer in accountancy on ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Disable binding & transfer in accountancy on purchases (vendor invoices will not be taken into account in accounting) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Disable binding & transfer in accountancy on expense reports (expense reports will not be taken into account in accounting) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Flag exported lines as Exported (to modify a line, you will need to delete the whole transaction and re-transfert it into accounting) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=Date validation and lock ConfirmExportFile=Confirmation of the generation of the accounting export file ? ExportDraftJournal=Exportovat deník návrhu @@ -398,7 +406,7 @@ SaleLocal=Místní prodej SaleExport=Exportní prodej SaleEEC=Prodej v EHS SaleEECWithVAT=Prodej v EHS s nulovou DPH, takže předpokládáme, že se nejedná o intrakomunitní prodej a navrhovaný účet je standardní produktový účet. -SaleEECWithoutVATNumber=Prodej v EHS bez DPH, ale DIČ třetí strany není definováno. Pro standardní prodej jsme upadli na produktový účet. V případě potřeby můžete opravit DIČ třetí strany nebo produktový účet. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Forbidden: The transaction has been validated and/or exported. ForbiddenTransactionAlreadyValidated=Forbidden: The transaction has been validated. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Mismatch in reconcile code AccountancyErrorMismatchBalanceAmount=The balance (%s) is not equal to 0 AccountancyErrorLetteringBookkeeping=Errors have occurred concerning the transactions: %s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Účetní zápisy @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Multicurrency code (Idevise) DateExport=Datum exportu WarningReportNotReliable=Upozornění: Tento přehled není založen na záznamníku, takže neobsahuje transakci upravenou ručně v Knihovně. Je-li vaše deník aktuální, zobrazení účetnictví je přesnější. ExpenseReportJournal=Účet výkazů výdajů +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s accounts diff --git a/htdocs/langs/cs_CZ/main.lang b/htdocs/langs/cs_CZ/main.lang index 77d27372595..8ddc04c49f2 100644 --- a/htdocs/langs/cs_CZ/main.lang +++ b/htdocs/langs/cs_CZ/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=Žádná uživatelská skupina není definována Password=Heslo PasswordRetype=Repeat your password NoteSomeFeaturesAreDisabled=Všimněte si, že v této demonstraci je mnoho funkcí / modulů zakázáno. +YourUserFile=Your user file Name=Název NameSlashCompany=Název / společnost Person=Osoba @@ -897,6 +898,9 @@ MassFilesArea=Plocha pro soubory postavený masových akcí ShowTempMassFilesArea=Show area souborů postavený masových akcí ConfirmMassDeletion=Hromadné smazání potvrzení ConfirmMassDeletionQuestion=Opravdu chcete odstranit vybraný záznam(y) %s? +ConfirmMassClone=Bulk clone confirmation +ConfirmMassCloneQuestion=Select project to clone to +ConfirmMassCloneToOneProject=Clone to project %s RelatedObjects=Související objekty ClassifyBilled=Označit jako účtováno ClassifyUnbilled=Zařadit nevyfakturované @@ -912,8 +916,8 @@ ExportFilteredList=Export filtrovaný seznam ExportList=seznam export ExportOptions=Možnosti exportu IncludeDocsAlreadyExported=Zahrnout již exportované dokumenty -ExportOfPiecesAlreadyExportedIsEnable=Export již exportovaných kusů je povolen -ExportOfPiecesAlreadyExportedIsDisable=Export již exportovaných kusů je zakázán +ExportOfPiecesAlreadyExportedIsEnable=Documents already exported are visible and will be exported +ExportOfPiecesAlreadyExportedIsDisable=Documents already exported are hidden and won't be exported AllExportedMovementsWereRecordedAsExported=Všechny exportované pohyby byly zaznamenány jako exportované NotAllExportedMovementsCouldBeRecordedAsExported=Ne všechny exportované pohyby nelze zaznamenat jako exportované Miscellaneous=Smíšený @@ -1128,6 +1132,7 @@ DeleteFileText=Opravdu chcete tento soubor odstranit? ShowOtherLanguages=Zobrazit další jazyky SwitchInEditModeToAddTranslation=Přepnutím v režimu úprav přidáte překlady do tohoto jazyka NotUsedForThisCustomer=Nepoužívá se pro tohoto zákazníka +NotUsedForThisVendor=Not used for this vendor AmountMustBePositive=Amount must be positive ByStatus=By status InformationMessage=Informace @@ -1148,14 +1153,14 @@ EventReminder=Event Reminder UpdateForAllLines=Update for all lines OnHold=Pozdržen Civility=Civility -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Set Supervisor +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor CreateExternalUser=Create external user ConfirmAffectTag=Bulk Tag Assignement ConfirmAffectUser=Bulk User Assignement -ProjectRole=Role assigned on each project -TasksRole=Role assigned on each task of each project +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ConfirmSetSupervisor=Bulk Supervisor Set ConfirmUpdatePrice=Choose a increase/decrease price rate ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Created from Public portal UserAgent=User Agent InternalUser=Interní uživatel ExternalUser=Externí uživatel +NoSpecificContactAddress=No specific contact or address +NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. +HideOnVCard=Hide %s +AddToContacts=Add address to my contacts +LastAccess=Last access +UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here +LastPasswordChangeDate=Last password change date diff --git a/htdocs/langs/cs_CZ/stripe.lang b/htdocs/langs/cs_CZ/stripe.lang index dfc420fc999..7c2cb64cd34 100644 --- a/htdocs/langs/cs_CZ/stripe.lang +++ b/htdocs/langs/cs_CZ/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Webhook live klíč ONLINE_PAYMENT_WAREHOUSE=Sklad, který se má použít k poklesu akcií, když je hotovo on-line platba
    (TODO Pokud se volba k poklesu zásob uskuteční na akci na faktuře a on-line platba vygeneruje fakturu?) StripeLiveEnabled=Stripe live povoleno (jinak testovací režim / režim sandbox) StripeImportPayment=Platby importu Stripe -ExampleOfTestCreditCard=Příklad kreditní karty pro test: %s (platný), %s (chyba CVC), %s (uplynula), %s (poplatek selže) +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +ExampleOfTestBankAcountForSEPA=Example of bank account BAN for direct debit test: %s StripeGateways=Brána Stripe OAUTH_STRIPE_TEST_ID=Připojení klienta Stripe Connect (ca _...) OAUTH_STRIPE_LIVE_ID=Připojení klienta Stripe Connect (ca _...) @@ -61,6 +62,7 @@ DeleteACard=Smazat kartu ConfirmDeleteCard=Opravdu chcete tuto kreditní nebo debetní kartu smazat? CreateCustomerOnStripe=Vytvořte zákazníka na Stripe CreateCardOnStripe=Vytvořte kartu na Stripe +CreateBANOnStripe=Create bank on Stripe ShowInStripe=Zobrazit ve Stripe StripeUserAccountForActions=Uživatelský účet, který se má používat pro e-mailové upozornění na některé události Stripe (Stripe výplaty) StripePayoutList=Seznam páskových výplat @@ -69,3 +71,8 @@ ToOfferALinkForLiveWebhook=Odkaz na nastavení Stripe WebHook pro volání IPN ( PaymentWillBeRecordedForNextPeriod=Platba bude zaznamenána pro další období. ClickHereToTryAgain= Klikněte zde a zkuste to znovu ... CreationOfPaymentModeMustBeDoneFromStripeInterface=Vzhledem k přísným pravidlům pro ověřování zákazníků musí být karta vytvořena z backoffice Stripe. Klepnutím sem zapnete záznam zákazníka Stripe: %s +STRIPE_CARD_PRESENT=Card Present for Stripe Terminals +TERMINAL_LOCATION=Location (address) for Stripe Terminals +RequestDirectDebitWithStripe=Request Direct Debit with Stripe +STRIPE_SEPA_DIRECT_DEBIT=Enable the Direct Debit payments through Stripe + diff --git a/htdocs/langs/cs_CZ/ticket.lang b/htdocs/langs/cs_CZ/ticket.lang index b121180eab7..93a2528ce94 100644 --- a/htdocs/langs/cs_CZ/ticket.lang +++ b/htdocs/langs/cs_CZ/ticket.lang @@ -26,6 +26,7 @@ Permission56002=Změnit vstupenky Permission56003=Smazat vstupenky Permission56004=Správa vstupenek Permission56005=Viz vstupenky všech subjektů (neplatí pro externí uživatele, vždy se omezují na subjekt, na který se vztahují) +Permission56006=Export tickets Tickets=Vstupenky TicketDictType=Vstupenka - Typy @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=Externí přispěvatel OriginEmail=Reporter Email Notify_TICKET_SENTBYMAIL=Odeslat e-mailem zprávu o lince +ExportDataset_ticket_1=Vstupenky + # Status Read=Číst Assigned=Přidělené diff --git a/htdocs/langs/cs_CZ/users.lang b/htdocs/langs/cs_CZ/users.lang index bfc589bed06..2ac189e660f 100644 --- a/htdocs/langs/cs_CZ/users.lang +++ b/htdocs/langs/cs_CZ/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Link to user LinkedToDolibarrThirdParty=Link to third party CreateDolibarrLogin=Vytvoření uživatele CreateDolibarrThirdParty=Vytvořit třetí stranu -LoginAccountDisableInDolibarr=Účet byl zakázán v Dolibarr. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Používejte osobní hodnotu ExportDataset_user_1=Uživatelé a jejich vlastnosti DomainUser=Doménový uživatel %s @@ -129,3 +130,6 @@ IPLastLogin=IP last login IPPreviousLogin=IP previous login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/cy_GB/accountancy.lang b/htdocs/langs/cy_GB/accountancy.lang index bdaa125540b..f7813cfe19c 100644 --- a/htdocs/langs/cy_GB/accountancy.lang +++ b/htdocs/langs/cy_GB/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Dewiswch y math dychwelyd cerbyd ACCOUNTING_EXPORT_PREFIX_SPEC=Nodwch y rhagddodiad ar gyfer enw'r ffeil ThisService=Y gwasanaeth hwn ThisProduct=Mae'r cynnyrch hwn -DefaultForService=Diofyn ar gyfer gwasanaeth -DefaultForProduct=Diofyn ar gyfer cynnyrch +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Cynnyrch ar gyfer y trydydd parti hwn ServiceForThisThirdparty=Gwasanaeth ar gyfer y trydydd parti hwn CantSuggest=Methu awgrymu @@ -101,7 +101,8 @@ ShowAccountingAccount=Dangos cyfrif cyfrifeg ShowAccountingJournal=Dangos dyddlyfr cyfrifo ShowAccountingAccountInLedger=Dangos cyfrif cyfrifeg yn y cyfriflyfr ShowAccountingAccountInJournals=Dangos cyfrif cyfrifeg mewn cyfnodolion -AccountAccountingSuggest=Awgrymu cyfrif cyfrifo +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=Cyfrifon rhagosodedig MenuBankAccounts=Cyfrifon banc MenuVatAccounts=Cyfrifon TAW @@ -126,6 +127,7 @@ WriteBookKeeping=Cofnodi trafodion mewn cyfrifeg Bookkeeping=Cyfriflyfr BookkeepingSubAccount=Subledger AccountBalance=Balans cyfrif +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Ffynhonnell gwrthrych cyf CAHTF=Cyfanswm y gwerthwr pryniant cyn treth TotalExpenseReport=Adroddiad cyfanswm gwariant @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=Label cyfnodolyn NumPiece=Rhif y darn TransactionNumShort=Rhif. trafodiad AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Grwpio yn ôl cyfrif cyfriflyfr cyffredinol GroupBySubAccountAccounting=Grwpio yn ôl cyfrif subledger AccountingAccountGroupsDesc=Gallwch ddiffinio yma rai grwpiau o gyfrifon cyfrifeg. Cânt eu defnyddio ar gyfer adroddiadau cyfrifyddu personol. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Dangos is-gyfanswm yn ôl lefel Pcgtype=Grŵp o gyfrifon PcgtypeDesc=Defnyddir grŵp cyfrifon fel meini prawf 'hidlo' a 'grwpio' rhagnodedig ar gyfer rhai adroddiadau cyfrifyddu. Er enghraifft, defnyddir 'INCOME' neu 'GREUL' fel grwpiau ar gyfer cyfrifon cyfrifon cynhyrchion i adeiladu'r adroddiad treuliau/incwm. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Cymodi @@ -294,6 +299,7 @@ DescValidateMovements=Gwaherddir unrhyw newid neu ddileu ysgrifen, llythrennau a ValidateHistory=Rhwymo'n Awtomatig AutomaticBindingDone=Cwblhawyd rhwymiadau awtomatig (%s) - Nid yw rhwymo awtomatig yn bosibl ar gyfer rhywfaint o gofnod (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Analluogi rhwymo a throsglwyddo cyfrifyddiae ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Analluogi rhwymo a throsglwyddo cyfrifyddiaeth ar bryniannau (ni fydd anfonebau gwerthwr yn cael eu hystyried wrth gyfrifo) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Analluogi rhwymo a throsglwyddo cyfrifon ar adroddiadau treuliau (ni fydd adroddiadau gwariant yn cael eu hystyried wrth gyfrifo) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Baner llinellau wedi'u hallforio fel Allforiwyd (i addasu llinell, bydd angen i chi ddileu'r trafodiad cyfan a'i ail-drosglwyddo i gyfrifeg) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=Dyddiad dilysu a chlo ConfirmExportFile=Cadarnhad o gynhyrchu'r ffeil allforio cyfrifo ? ExportDraftJournal=Allforio cyfnodolyn drafft @@ -398,7 +406,7 @@ SaleLocal=Gwerthiant lleol SaleExport=Gwerthu allforio SaleEEC=Gwerthu yn EEC SaleEECWithVAT=Gwerthiant mewn EEC gyda TAW nid nwl, felly mae'n debyg NID yw hwn yn werthiant mewngymunedol a'r cyfrif a awgrymir yw'r cyfrif cynnyrch safonol. -SaleEECWithoutVATNumber=Gwerthu mewn EEC heb TAW ond nid yw ID TAW trydydd parti wedi'i ddiffinio. Rydym wrth gefn ar y cyfrif cynnyrch ar gyfer gwerthiannau safonol. Gallwch drwsio ID TAW trydydd parti neu gyfrif y cynnyrch os oes angen. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Wedi'i wahardd: Mae'r trafodiad wedi'i ddilysu a/neu ei allforio. ForbiddenTransactionAlreadyValidated=Wedi'i wahardd: Mae'r trafodiad wedi'i ddilysu. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Mismatch in reconcile code AccountancyErrorMismatchBalanceAmount=The balance (%s) is not equal to 0 AccountancyErrorLetteringBookkeeping=Errors have occurred concerning the transactions: %s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Cofnodion cyfrifeg @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Cod aml-arian (Dyfeisio) DateExport=Dyddiad allforio WarningReportNotReliable=Rhybudd, nid yw'r adroddiad hwn yn seiliedig ar y Cyfriflyfr, felly nid yw'n cynnwys trafodiad a addaswyd â llaw yn y Cyfriflyfr. Os yw eich cyfnodolyn yn gyfredol, mae'r olwg cadw cyfrifon yn fwy cywir. ExpenseReportJournal=Cyfnodolyn Adroddiad Treuliau +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s cyfrifon diff --git a/htdocs/langs/cy_GB/main.lang b/htdocs/langs/cy_GB/main.lang index 2939668089a..3e611f62ff9 100644 --- a/htdocs/langs/cy_GB/main.lang +++ b/htdocs/langs/cy_GB/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=Dim grŵp defnyddwyr wedi'i ddiffinio Password=Cyfrinair PasswordRetype=Repeat your password NoteSomeFeaturesAreDisabled=Sylwch fod llawer o nodweddion/modiwlau wedi'u hanalluogi yn yr arddangosiad hwn. +YourUserFile=Your user file Name=Enw NameSlashCompany=Enw / Cwmni Person=Person @@ -897,6 +898,9 @@ MassFilesArea=Ardal ar gyfer ffeiliau a adeiladwyd gan gamau gweithredu torfol ShowTempMassFilesArea=Dangos arwynebedd y ffeiliau a adeiladwyd gan weithredoedd torfol ConfirmMassDeletion=Cadarnhad Swmp Dileu ConfirmMassDeletionQuestion=A ydych yn siŵr eich bod am ddileu'r cofnod(au) %s a ddewiswyd? +ConfirmMassClone=Bulk clone confirmation +ConfirmMassCloneQuestion=Select project to clone to +ConfirmMassCloneToOneProject=Clone to project %s RelatedObjects=Gwrthrychau Cysylltiedig ClassifyBilled=Dosbarthu wedi'i bilio ClassifyUnbilled=Dosbarthu heb ei filio @@ -912,8 +916,8 @@ ExportFilteredList=Allforio rhestr wedi'i hidlo ExportList=Rhestr allforio ExportOptions=Opsiynau Allforio IncludeDocsAlreadyExported=Cynnwys dogfennau sydd eisoes wedi'u hallforio -ExportOfPiecesAlreadyExportedIsEnable=Allforio darnau a allforiwyd eisoes yn galluogi -ExportOfPiecesAlreadyExportedIsDisable=Mae allforio darnau sydd eisoes wedi'u hallforio yn analluog +ExportOfPiecesAlreadyExportedIsEnable=Documents already exported are visible and will be exported +ExportOfPiecesAlreadyExportedIsDisable=Documents already exported are hidden and won't be exported AllExportedMovementsWereRecordedAsExported=Cofnodwyd bod yr holl symudiadau a allforiwyd wedi'u hallforio NotAllExportedMovementsCouldBeRecordedAsExported=Ni ellid cofnodi pob symudiad a allforiwyd fel un wedi'i allforio Miscellaneous=Amrywiol @@ -1128,6 +1132,7 @@ DeleteFileText=Ydych chi wir eisiau dileu'r ffeil hon? ShowOtherLanguages=Dangos ieithoedd eraill SwitchInEditModeToAddTranslation=Newidiwch y modd golygu i ychwanegu cyfieithiadau ar gyfer yr iaith hon NotUsedForThisCustomer=Heb ei ddefnyddio ar gyfer y cwsmer hwn +NotUsedForThisVendor=Not used for this vendor AmountMustBePositive=Rhaid i'r swm fod yn bositif ByStatus=Yn ôl statws InformationMessage=Gwybodaeth @@ -1148,14 +1153,14 @@ EventReminder=Nodyn Atgoffa am Ddigwyddiad UpdateForAllLines=Diweddariad ar gyfer pob llinell OnHold=Ar stop Civility=Gwareiddiad -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Set Supervisor +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor CreateExternalUser=Creu defnyddiwr allanol ConfirmAffectTag=Bulk Tag Assignement ConfirmAffectUser=Bulk User Assignement -ProjectRole=Role assigned on each project -TasksRole=Role assigned on each task of each project +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ConfirmSetSupervisor=Bulk Supervisor Set ConfirmUpdatePrice=Choose a increase/decrease price rate ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Created from Public portal UserAgent=User Agent InternalUser=Internal user ExternalUser=External user +NoSpecificContactAddress=No specific contact or address +NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. +HideOnVCard=Hide %s +AddToContacts=Add address to my contacts +LastAccess=Last access +UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here +LastPasswordChangeDate=Last password change date diff --git a/htdocs/langs/cy_GB/stripe.lang b/htdocs/langs/cy_GB/stripe.lang index 04b1fadf885..c50c262f6b1 100644 --- a/htdocs/langs/cy_GB/stripe.lang +++ b/htdocs/langs/cy_GB/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Webhook allwedd byw ONLINE_PAYMENT_WAREHOUSE=Stoc i'w ddefnyddio ar gyfer gostyngiad stoc pan wneir taliad ar-lein
    (TODO Pan fydd opsiwn i leihau stoc yn cael ei wneud ar weithred ar anfoneb a'r taliad ar-lein yn cynhyrchu'r anfoneb ei hun ?) StripeLiveEnabled=Stripe live wedi'i alluogi (modd prawf / blwch tywod fel arall) StripeImportPayment=Mewnforio taliadau Stripe -ExampleOfTestCreditCard=Enghraifft o gerdyn credyd ar gyfer prawf: %s => dilys, %s => gwall CVC, %s => wedi dod i ben, %s => tâl yn methu +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +ExampleOfTestBankAcountForSEPA=Example of bank account BAN for direct debit test: %s StripeGateways=Pyrth streipen OAUTH_STRIPE_TEST_ID=ID Cleient Stripe Connect (ca_...) OAUTH_STRIPE_LIVE_ID=ID Cleient Stripe Connect (ca_...) @@ -61,6 +62,7 @@ DeleteACard=Dileu Cerdyn ConfirmDeleteCard=Ydych chi'n siŵr eich bod am ddileu'r cerdyn Credyd neu Ddebyd hwn? CreateCustomerOnStripe=Creu cwsmer ar Stripe CreateCardOnStripe=Creu cerdyn ar Stripe +CreateBANOnStripe=Create bank on Stripe ShowInStripe=Dangos yn Stripe StripeUserAccountForActions=Cyfrif defnyddiwr i'w ddefnyddio ar gyfer hysbysiad e-bost o rai digwyddiadau Stripe (taliadau Stripe) StripePayoutList=Rhestr o daliadau Stripe @@ -69,3 +71,8 @@ ToOfferALinkForLiveWebhook=Dolen i'r gosodiad Stripe WebHook i ffonio'r IPN (mod PaymentWillBeRecordedForNextPeriod=Bydd taliad yn cael ei gofnodi ar gyfer y cyfnod nesaf. ClickHereToTryAgain= Cliciwch yma i geisio eto... CreationOfPaymentModeMustBeDoneFromStripeInterface=Oherwydd rheolau Dilysu Cwsmeriaid Cryf, rhaid creu cerdyn o swyddfa gefn Stripe. Gallwch glicio yma i droi cofnod cwsmer Stripe ymlaen: %s +STRIPE_CARD_PRESENT=Card Present for Stripe Terminals +TERMINAL_LOCATION=Location (address) for Stripe Terminals +RequestDirectDebitWithStripe=Request Direct Debit with Stripe +STRIPE_SEPA_DIRECT_DEBIT=Enable the Direct Debit payments through Stripe + diff --git a/htdocs/langs/cy_GB/users.lang b/htdocs/langs/cy_GB/users.lang index a27365d59af..6f2871b0d36 100644 --- a/htdocs/langs/cy_GB/users.lang +++ b/htdocs/langs/cy_GB/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Dolen i'r defnyddiwr LinkedToDolibarrThirdParty=Dolen i drydydd parti CreateDolibarrLogin=Creu defnyddiwr CreateDolibarrThirdParty=Creu trydydd parti -LoginAccountDisableInDolibarr=Cyfrif wedi'i analluogi yn Dolibarr. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Defnyddiwch werth personol ExportDataset_user_1=Defnyddwyr a'u priodweddau DomainUser=Defnyddiwr parth %s @@ -129,3 +130,6 @@ IPLastLogin=IP last login IPPreviousLogin=IP previous login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/da_DK/accountancy.lang b/htdocs/langs/da_DK/accountancy.lang index f5cd33c205d..bfce7602092 100644 --- a/htdocs/langs/da_DK/accountancy.lang +++ b/htdocs/langs/da_DK/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Vælg linjeskift type ACCOUNTING_EXPORT_PREFIX_SPEC=Angiv præfiks for filnavnet ThisService=Denne ydelse ThisProduct=Dette produkt -DefaultForService=Forvalg ydelse -DefaultForProduct=Forvalg produkt +DefaultForService=Standard for tjenester +DefaultForProduct=Standard for produkter ProductForThisThirdparty=Produkt til denne tredjepart ServiceForThisThirdparty=Service for denne tredjepart CantSuggest=Kan ikke foreslå @@ -101,7 +101,8 @@ ShowAccountingAccount=Vis regnskabs konto ShowAccountingJournal=Vis kontokladde ShowAccountingAccountInLedger=Vis regnskabskonto i hovedbog ShowAccountingAccountInJournals=Vis regnskabskonto i tidsskrifter -AccountAccountingSuggest=Forelslået regnskabskonto +DataUsedToSuggestAccount=Data brugt til at foreslå konto +AccountAccountingSuggest=Konto foreslået MenuDefaultAccounts=Standardkonti MenuBankAccounts=Bankkonti MenuVatAccounts=Momskonti @@ -126,6 +127,7 @@ WriteBookKeeping=Registrer transaktioner i regnskabet Bookkeeping=Hovedbog BookkeepingSubAccount=Underkonti AccountBalance=Kontobalance +AccountBalanceSubAccount=Underkonti balance ObjectsRef=Objektreference CAHTF=Samlet købeleverandør før skat TotalExpenseReport=Rapport for samlede udgifter @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Konto (fra kontoplanen) skal bruges som stan UseAuxiliaryAccountOnCustomerDeposit=Gem kundekonto som individuel konto i hovedbog for linjer med forudbetalinger (hvis den er deaktiveret, forbliver individuel konto for forudbetalingslinjer tomme) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Konto (fra kontoplanen), der skal bruges som standard UseAuxiliaryAccountOnSupplierDeposit=Gem leverandørkonto som individuel konto i hovedbog for linjer med forudbetalinger (hvis den er deaktiveret, vil individuel konto for forudbetalingslinjer forblive tom) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Regnskabskonto som standard for at registrere kundebeholdt garanti ACCOUNTING_PRODUCT_BUY_ACCOUNT=Konto (fra kontoplanen), der skal bruges som standardkonto for de produkter, der er købt i samme land (bruges, hvis det ikke er defineret i produktarket) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Konto (fra kontoplanen), der skal bruges som standardkonto for produkter købt fra EF til et andet EF-land (bruges, hvis det ikke er defineret i produktarket) @@ -218,6 +221,7 @@ JournalLabel=Journalmærke NumPiece=Partsnummer TransactionNumShort=Transaktionsnr. AccountingCategory=Brugerdefineret gruppe af konti +AccountingCategories=Brugerdefinerede grupper af konti GroupByAccountAccounting=Gruppér efter hovedkontokonto GroupBySubAccountAccounting=Gruppér efter underkonti AccountingAccountGroupsDesc=Du kan definere her nogle grupper af regnskabskonto. De vil blive brugt til personlige regnskabsrapporter. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Vis subtotal efter niveau Pcgtype=Kontoens gruppe PcgtypeDesc=Kontogruppe bruges som foruddefinerede 'filter' og 'gruppering' kriterier for nogle regnskabsrapporter. For eksempel bruges 'INKOMST' eller 'UDGIFT' som grupper til regnskabsmæssige regnskaber for produkter til at oprette omkostnings- / indkomstrapporten. +AccountingCategoriesDesc=Brugerdefineret gruppe af konti kan bruges til at gruppere regnskabskonti i ét navn for at lette filterbrug eller opbygning af tilpassede rapporter. Reconcilable=Afstemning @@ -294,6 +299,7 @@ DescValidateMovements=Enhver ændring eller sletning af skrivning, bogstaver og ValidateHistory=Automatisk Bogføring AutomaticBindingDone=Automatiske bindinger udført (%s) - Automatisk binding er ikke mulig for nogle poster (%s) +DoManualBindingForFailedRecord=Du skal lave et manuelt link for %s række(r), der ikke linkes automatisk. ErrorAccountancyCodeIsAlreadyUse=Fejl, du kan ikke fjerne eller deaktivere denne kontoplan, fordi den er brugt MvtNotCorrectlyBalanced=Bevægelse ikke korrekt afbalanceret. Debet = %s & Kredit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Deaktiver binding og overførsel i regnskab ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Deaktiver binding og overførsel i regnskab ved køb (leverandørfakturaer tages ikke med i regnskabet) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Deaktiver binding og overførsel i regnskab på udgiftsrapporter (udgiftsrapporter tages ikke med i regnskabet) ACCOUNTING_ENABLE_LETTERING=Aktiver bogstavfunktionen i regnskabet +ACCOUNTING_ENABLE_AUTOLETTERING=Aktiver den automatiske bogstaver ved overførsel til regnskab ## Export NotExportLettering=Eksporter ikke bogstaverne, når du genererer filen NotifiedExportDate=Flag eksporterede linjer som eksporteret (for at ændre en linje skal du slette hele transaktionen og overføre den til regnskab igen) NotifiedValidationDate=Valider og lås de eksporterede indgange (samme effekt som "%s"-funktionen, ændring og sletning af linjerne vil DEFINITIVT ikke være mulig) +NotifiedExportFull=Eksportere dokumenter? DateValidationAndLock=Datovalidering og lås ConfirmExportFile=Bekræftelse af genereringen af den regnskabsmæssige eksportfil? ExportDraftJournal=Eksporter udkast til kladde @@ -398,7 +406,7 @@ SaleLocal=Lokalt salg SaleExport=Eksport salg SaleEEC=Salg i EU SaleEECWithVAT=Salg i EU med en moms, der ikke er null, så vi antager, at dette IKKE er et intrakommunalt salg, og den foreslåede konto er standardproduktskontoen. -SaleEECWithoutVATNumber=Du kan fastsætte moms nummer for tredjepart eller produktkonto om nødvendigt. +SaleEECWithoutVATNumber=Salg i EEC uden moms, men tredjemands moms-id er ikke defineret. Vi falder tilbage på kontoen for standardsalg. Du kan rette tredjepartens moms-id eller ændre den produktkonto, der er foreslået til binding, hvis det er nødvendigt. ForbiddenTransactionAlreadyExported=Forbudt: Transaktionen er blevet valideret og/eller eksporteret. ForbiddenTransactionAlreadyValidated=Forbudt: Transaktionen er blevet valideret. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Uoverensstemmelse i afstemningskode AccountancyErrorMismatchBalanceAmount=Saldoen (%s) er ikke lig med 0 AccountancyErrorLetteringBookkeeping=Der er opstået fejl vedrørende transaktionerne: %s ErrorAccountNumberAlreadyExists=Kontonummeret %s findes allerede +ErrorArchiveAddFile=Kan ikke lægge "%s" fil i arkivet ## Import ImportAccountingEntries=Regnskabsposter @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=MultiValuta-kode (Idevise) DateExport=Eksport dato WarningReportNotReliable=Advarsel, denne rapport er ikke baseret på Ledger, så indeholder ikke transaktion ændret manuelt i Ledger. Hvis din journalisering er opdateret, er bogføringsvisningen mere præcis. ExpenseReportJournal=Udgifts Journal +DocsAlreadyExportedAreExcluded=Dokumenter, der allerede er eksporteret, er ekskluderet +ClickToHideAlreadyExportedLines=Klik for at skjule allerede eksporterede linjer NAccounts=%s konti diff --git a/htdocs/langs/da_DK/admin.lang b/htdocs/langs/da_DK/admin.lang index 84ede269564..390a3d10170 100644 --- a/htdocs/langs/da_DK/admin.lang +++ b/htdocs/langs/da_DK/admin.lang @@ -645,6 +645,8 @@ Module2300Name=Planlagte job Module2300Desc=Planlagt job styring (alias cron eller chrono tabel) Module2400Name=Begivenheder/tidsplan Module2400Desc=Spor begivenheder. Log automatiske begivenheder til sporingsformål eller optag manuelle begivenheder eller møder. Dette er hovedmodulet for god kunde- eller leverandør-relationsstyring. +Module2430Name=Bestillingskalendersystem +Module2430Desc=Giv en onlinekalender, så alle kan booke et møde, i henhold til foruddefinerede intervaller eller tilgængeligheder. Module2500Name=DMS / ECM Module2500Desc=Dokumentstyringssystem / Elektronisk indholdsstyring. Automatisk organisering af dine genererede eller gemte dokumenter. Del dem, når du har behov for det. Module2600Name=API / webtjenester (SOAP-server) @@ -660,6 +662,8 @@ Module2900Name=GeoIPMaxmind Module2900Desc=GeoIP Maxmind konverteringsmuligheder Module3200Name=Uforanderlige arkiver Module3200Desc=Aktiver en uforanderlig log over forretningsbegivenheder. Begivenheder arkiveres i realtid. Loggen er en skrivebeskyttet tabel over kædede hændelser, der kan eksporteres. Dette modul er obligatorisk i nogle lande. +Module3300Name=Modulbygger +Module3200Desc=Aktiver en uforanderlig log over forretningsbegivenheder. Begivenheder arkiveres i realtid. Loggen er en skrivebeskyttet tabel over kædede hændelser, der kan eksporteres. Dette modul er obligatorisk i nogle lande. Module3400Name=Sociale netværk Module3400Desc=Aktiver sociale netværksfelter til tredjeparter og adresser (Skype, Twitter, Facebook, ...). Module4000Name=Personaleadministration @@ -1270,6 +1274,7 @@ TriggerActiveAsModuleActive=Udløsere i denne fil er aktive, da modulet %spå brugerens browser
    (Når påmindelsesdatoen er nået, vises en pop op af browseren. Hver bruger kan deaktivere sådanne meddelelser fra sin browsermeddelelsesopsætning). AGENDA_REMINDER_BROWSER_SOUND=Aktiver lydmeddelelse @@ -2129,6 +2137,7 @@ CodeLastResult=Seneste resultatkode NbOfEmailsInInbox=Antal e-mails i kildekataloget LoadThirdPartyFromName=Indlæs tredjepartssøgning på %s (kun indlæsning) LoadThirdPartyFromNameOrCreate=Indlæs tredjepartssøgning på %s (opret, hvis den ikke findes) +LoadContactFromEmailOrCreate=Indlæs kontaktsøgning på %s (opret, hvis den ikke findes) AttachJoinedDocumentsToObject=Gem vedhæftede filer i objektdokumenter, hvis der findes en ref af et objekt i e-mail emnet. WithDolTrackingID=Besked fra en samtale initieret af en første e-mail sendt fra Dolibarr WithoutDolTrackingID=Besked fra en samtale initieret af en første e-mail IKKE sendt fra Dolibarr @@ -2355,3 +2364,5 @@ AllowExternalDownload=Tillad ekstern download (uden login, ved hjælp af et delt DeadlineDayVATSubmission=Deadline dag for momsindsendelse den næste måned MaxNumberOfAttachementOnForms=Maks. antal sammenføjede filer i en formular IfDefinedUseAValueBeetween=Hvis det er defineret, skal du bruge en værdi mellem %s og %s +Reload=Genindlæs +ConfirmReload=Bekræft modulgenindlæsning diff --git a/htdocs/langs/da_DK/boxes.lang b/htdocs/langs/da_DK/boxes.lang index d2ca38da8a4..8bdaee3825d 100644 --- a/htdocs/langs/da_DK/boxes.lang +++ b/htdocs/langs/da_DK/boxes.lang @@ -24,6 +24,7 @@ BoxFicheInter=Latest interventions BoxCurrentAccounts=Open accounts balance BoxTitleMemberNextBirthdays=Fødselsdage i denne måned (medlemmer) BoxTitleMembersByType=Medlemmer efter type og status +BoxTitleMembersByTags=Medlemmer efter tags og status BoxTitleMembersSubscriptionsByYear=Medlemmer Abonnementer efter år BoxTitleLastRssInfos=Latest %s news from %s BoxTitleLastProducts=Produkter / tjenester: sidst %s ændret diff --git a/htdocs/langs/da_DK/companies.lang b/htdocs/langs/da_DK/companies.lang index eaa7b8ee001..cf3f69cbe95 100644 --- a/htdocs/langs/da_DK/companies.lang +++ b/htdocs/langs/da_DK/companies.lang @@ -312,8 +312,8 @@ CustomerRelativeDiscountShort=Relativ rabat CustomerAbsoluteDiscountShort=Absolut rabat CompanyHasRelativeDiscount=Denne kunde har en standardrabat på %s%% CompanyHasNoRelativeDiscount=Denne kunde har som standard ingen rabat -HasRelativeDiscountFromSupplier=Du har en standardrabat på %s%% fra denne leverandør -HasNoRelativeDiscountFromSupplier=Ingen standard relativ rabat fra denne leverandør +HasRelativeDiscountFromSupplier=Du har en standardrabat på %s%% hos denne leverandør +HasNoRelativeDiscountFromSupplier=Ingen standard relativ rabat hos denne leverandør CompanyHasAbsoluteDiscount=Denne kunde har tilgodehavender (kreditnotaer eller forudbetalinger) for %s %s CompanyHasDownPaymentOrCommercialDiscount=Denne kunde har tilgængelige rabatter (kommercielle, forudbetalinger) for %s %s CompanyHasCreditNote=Denne kunde har stadig kreditnotaer for %s %s @@ -499,4 +499,7 @@ OutOfEurope=Uden for Europa (EØF) CurrentOutstandingBillLate=Aktuel udestående regninger i restance BecarefullChangeThirdpartyBeforeAddProductToInvoice=Vær forsigtig, afhængigt af dine produkt prisindstillinger bør du ændre tredjepart, før du tilføjer produkt til POS. EmailAlreadyExistsPleaseRewriteYourCompanyName=e-mail eksisterer allerede, skriv venligst dit firmanavn -TwoRecordsOfCompanyName=der findes mere end én registrering for denne virksomhed, kontakt os venligst for at fuldføre din partnerskabsanmodning" +TwoRecordsOfCompanyName=der findes mere end én registrering for denne virksomhed, kontakt os venligst for at fuldføre din partnerskabsanmodning +CompanySection=Virksomhedssektion +ShowSocialNetworks=Vis sociale netværk +HideSocialNetworks=Skjul sociale netværk diff --git a/htdocs/langs/da_DK/errors.lang b/htdocs/langs/da_DK/errors.lang index 10c3d0f830b..94d7ff0f677 100644 --- a/htdocs/langs/da_DK/errors.lang +++ b/htdocs/langs/da_DK/errors.lang @@ -303,6 +303,7 @@ ErrorValueForTooLow=Værdien for %s er for lav ErrorValueCantBeNull=Værdien for %s kan ikke være 0 ErrorDateOfMovementLowerThanDateOfFileTransmission=Datoen for banktransaktionen må ikke være lavere end datoen for filoverførslen ErrorTooMuchFileInForm=For mange filer i form, det maksimale antal er %s fil(er) +ErrorSessionInvalidatedAfterPasswordChange=Sessionen blev ugyldiggjort efter en ændring af adgangskode, status eller gyldighedsdatoer. Log venligst på igen. # Warnings WarningParamUploadMaxFileSizeHigherThanPostMaxSize=Din PHP-parameter upload_max_filesize (%s) er højere end PHP-parameter post_max_size (%s). Dette er ikke en ensartet opsætning. @@ -325,6 +326,7 @@ WarningPaymentDateLowerThanInvoiceDate=Betalingsdato (%s) er tidligere end faktu WarningTooManyDataPleaseUseMoreFilters=For mange data (mere end %s linjer). Brug venligst flere filtre eller indstil konstanten %s til en højere grænse. WarningSomeLinesWithNullHourlyRate=Nogle tidspunkter blev registreret af nogle brugere, mens deres timepris ikke var defineret. Der blev brugt en værdi på 0 %s pr. time, men dette kan resultere i forkert værdiansættelse af brugt tid. WarningYourLoginWasModifiedPleaseLogin=Dit login blev ændret. Af sikkerhedsmæssige årsager skal du logge ind med dit nye login før næste handling. +WarningYourPasswordWasModifiedPleaseLogin=Din adgangskode blev ændret. Af sikkerhedsmæssige årsager skal du logge ind nu med din nye adgangskode. WarningAnEntryAlreadyExistForTransKey=Der findes allerede en post for oversættelsesnøglen for dette sprog WarningNumberOfRecipientIsRestrictedInMassAction=Advarsel, antallet af forskellige modtagere er begrænset til %s, når du bruger massehandlingerne på lister WarningDateOfLineMustBeInExpenseReportRange=Advarsel, datoen for linjen ligger ikke inden for udgiftsrapporten diff --git a/htdocs/langs/da_DK/eventorganization.lang b/htdocs/langs/da_DK/eventorganization.lang index 49d5ec90885..d6a594121db 100644 --- a/htdocs/langs/da_DK/eventorganization.lang +++ b/htdocs/langs/da_DK/eventorganization.lang @@ -172,3 +172,5 @@ ErrorSeveralCompaniesWithEmailContactUs=Flere virksomheder med denne e -mail er ErrorSeveralCompaniesWithNameContactUs=Flere virksomheder med dette navn er fundet, så vi kan ikke automatisk validere din registrering. Kontakt os venligst på %s for en manuel validering NoPublicActionsAllowedForThisEvent=Ingen offentlige handlinger er åbne for offentligheden for denne begivenhed MaxNbOfAttendees=Max antal deltagere +DateStartEvent=Begivenhedens startdato +DateEndEvent=Begivenheds slutdato diff --git a/htdocs/langs/da_DK/main.lang b/htdocs/langs/da_DK/main.lang index 6037eaed8ec..98efad1705a 100644 --- a/htdocs/langs/da_DK/main.lang +++ b/htdocs/langs/da_DK/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=Ingen brugergruppe defineret Password=Adgangskode PasswordRetype=Gentag din adgangskode NoteSomeFeaturesAreDisabled=Bemærk, at mange funktioner/moduler er deaktiveret i denne demonstration. +YourUserFile=Din brugerfil Name=Navn NameSlashCompany=Navn/virksomhed Person=Person @@ -897,6 +898,9 @@ MassFilesArea=Område for filer opbygget af massehandlinger ShowTempMassFilesArea=Vis område af filer bygget af massehandlinger ConfirmMassDeletion=Bekræftelse på massesletning ConfirmMassDeletionQuestion=Er du sikker på, at du vil slette den/de valgt/valgte %s post(er)? +ConfirmMassClone=Bulk klon bekræftelse +ConfirmMassCloneQuestion=Vælg det projekt, der skal klones til +ConfirmMassCloneToOneProject=Klon for at projektere %s RelatedObjects=Relaterede objekter ClassifyBilled=Klassificere faktureret ClassifyUnbilled=Klassificer Ikke faktureret @@ -912,8 +916,8 @@ ExportFilteredList=Eksporter filtreret liste ExportList=Eksportliste ExportOptions=Eksport indstillinger IncludeDocsAlreadyExported=Inkluder dokumenter, der allerede er eksporteret -ExportOfPiecesAlreadyExportedIsEnable=Eksport af allerede eksporterede stykker er aktiveret -ExportOfPiecesAlreadyExportedIsDisable=Eksport af allerede eksporterede stykker er deaktiveret +ExportOfPiecesAlreadyExportedIsEnable=Dokumenter, der allerede er eksporteret, er synlige og vil blive eksporteret +ExportOfPiecesAlreadyExportedIsDisable=Dokumenter, der allerede er eksporteret, er skjulte og vil ikke blive eksporteret AllExportedMovementsWereRecordedAsExported=Alle eksporterede bevægelser blev registreret som eksporteret NotAllExportedMovementsCouldBeRecordedAsExported=Ikke alle eksporterede bevægelser kunne registreres som eksporteret Miscellaneous=Diverse @@ -1128,6 +1132,7 @@ DeleteFileText=Vil du virkelig slette denne fil? ShowOtherLanguages=Vis andre sprog SwitchInEditModeToAddTranslation=Skift i redigeringsfunktion for at tilføje oversættelser til dette sprog NotUsedForThisCustomer=Ikke brugt til denne kunde +NotUsedForThisVendor=Ikke brugt til denne leverandør AmountMustBePositive=Beløbet skal være positivt ByStatus=Efter status InformationMessage=Information @@ -1148,14 +1153,14 @@ EventReminder=Påmindelse om begivenhed UpdateForAllLines=Opdatering til alle linjer OnHold=Afventer Civility=Høflighed -AffectTag=Tildel tag -AffectUser=Tildel bruger -SetSupervisor=Sæt Supervisor +AffectTag=Tildel et tag +AffectUser=Tildel en bruger +SetSupervisor=Indstil vejlederen CreateExternalUser=Opret ekstern bruger ConfirmAffectTag=Bulk Tag Tildeling ConfirmAffectUser=Massebrugertildeling -ProjectRole=Rolle tildelt på hvert projekt -TasksRole=Rolle tildelt på hver opgave i hvert projekt +ProjectRole=Rolle tildelt på hvert projekt/mulighed +TasksRole=Rolle tildelt hver opgave (hvis brugt) ConfirmSetSupervisor=Bulk supervisor sæt ConfirmUpdatePrice=Vælg en stigning/reduktionspris ConfirmAffectTagQuestion=Er du sikker på, at du vil tildele tags til de(n) valgte post(er) %s? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Oprettet fra offentlig portal UserAgent=Brugeragent InternalUser=Intern bruger ExternalUser=Ekstern bruger +NoSpecificContactAddress=Ingen specifik kontakt eller adresse +NoSpecificContactAddressBis=Denne fane er dedikeret til at tvinge specifikke kontakter eller adresser til det aktuelle objekt. Brug det kun, hvis du ønsker at definere en eller flere specifikke kontakter eller adresser for objektet, når oplysningerne om tredjeparten ikke er tilstrækkelige eller ikke nøjagtige. +HideOnVCard=Skjul %s +AddToContacts=Tilføj adresse til mine kontakter +LastAccess=Sidste adgang +UploadAnImageToSeeAPhotoHere=Upload et billede fra fanen %s for at se et billede her +LastPasswordChangeDate=Dato for sidste ændring af adgangskode diff --git a/htdocs/langs/da_DK/mrp.lang b/htdocs/langs/da_DK/mrp.lang index e47bec20cb1..22b926c5ef5 100644 --- a/htdocs/langs/da_DK/mrp.lang +++ b/htdocs/langs/da_DK/mrp.lang @@ -102,6 +102,7 @@ NbOperatorsRequired=Antal krævede operatører THMOperatorEstimated=Anslået operatør THM THMMachineEstimated=Anslået maskine THM WorkstationType=Arbejdsstationstype +DefaultWorkstation=Standard arbejdsstation Human=Person Machine=Maskine HumanMachine=Person / maskine diff --git a/htdocs/langs/da_DK/orders.lang b/htdocs/langs/da_DK/orders.lang index f726c1b6bab..b75a3272702 100644 --- a/htdocs/langs/da_DK/orders.lang +++ b/htdocs/langs/da_DK/orders.lang @@ -96,6 +96,10 @@ OrdersStatisticsSuppliers=Indkøbsordrestatistik NumberOfOrdersByMonth=Antallet af ordrer efter måned AmountOfOrdersByMonthHT=Mængden af ordrer efter måned (ekskl. Moms) ListOfOrders=Liste af ordrer +ListOrderLigne=Ordrerækker +productobuy=Kun produkter til køb +productonly=Kun produkter +disablelinefree=Ingen linjer fri CloseOrder=Luk for ConfirmCloseOrder=Er du sikker på, at du vil indstille denne ordre til levering? Når en ordre er leveret, kan den indstilles til fakturering. ConfirmDeleteOrder=Er du sikker på, at du vil slette denne ordre? @@ -131,6 +135,7 @@ SupplierOrderClassifiedBilled=Indkøbsordre %s er faktureret OtherOrders=Andre ordrer SupplierOrderValidatedAndApproved=Leverandørordre er valideret og godkendt: %s SupplierOrderValidated=Leverandørordre er valideret: %s +OrderShowDetail=Vis ordredetaljer ##### Types de contacts ##### TypeContact_commande_internal_SALESREPFOLL=Repræsentative opfølgning salgsordre TypeContact_commande_internal_SHIPPING=Repræsentant opfølgning shipping @@ -199,3 +204,5 @@ StatusSupplierOrderApproved=Godkendt StatusSupplierOrderRefused=Afvist StatusSupplierOrderReceivedPartially=Delvist modtaget StatusSupplierOrderReceivedAll=Alle varer modtaget +NeedAtLeastOneInvoice = Der skal være mindst én faktura +LineAlreadyDispatched = Ordrelinjen er allerede modtaget. diff --git a/htdocs/langs/da_DK/projects.lang b/htdocs/langs/da_DK/projects.lang index e040819d02c..8fd681ffc10 100644 --- a/htdocs/langs/da_DK/projects.lang +++ b/htdocs/langs/da_DK/projects.lang @@ -259,6 +259,7 @@ RecordsClosed=%s projekt (er) lukket SendProjectRef=Informationsprojekt %s ModuleSalaryToDefineHourlyRateMustBeEnabled=Modul 'lønninger' skal være aktiveret for at definere medarbejderens timepris for at få brugt tid valideret NewTaskRefSuggested=Task ref allerede brugt, en ny task ref kræves +NumberOfTasksCloned=%s opgave(r) klonet TimeSpentInvoiced=Faktureret tid TimeSpentForIntervention=Tid brugt TimeSpentForInvoice=Tid brugt diff --git a/htdocs/langs/da_DK/stripe.lang b/htdocs/langs/da_DK/stripe.lang index 2caa038cc39..173725802f8 100644 --- a/htdocs/langs/da_DK/stripe.lang +++ b/htdocs/langs/da_DK/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Webhook-livenøgle ONLINE_PAYMENT_WAREHOUSE=Lager til brug for lagerreduktion, når online betaling er færdig
    (TODO Når valgmuligheden for at reducere lagerbeholdningen sker på en handling på faktura, og online betaling genererer selve fakturaen?) StripeLiveEnabled=Stripe live aktiveret (ellers test / sandbox mode) StripeImportPayment=Import Stripe betalinger -ExampleOfTestCreditCard=Eksempel på kreditkort til test:%s => gyldigt,%s => fejl CVC,%s => udløbet, %s=> gebyr mislykkes +ExampleOfTestCreditCard=Eksempel på kreditkort til SEPA-test: %s => gyldig, %s => fejl CVC, %s => udløbet, %s => opladning mislykkes +ExampleOfTestBankAcountForSEPA=Eksempel på bankkonto BAN til test af direkte debitering: %s StripeGateways=Stripe gateways OAUTH_STRIPE_TEST_ID=Stripe Connect Client ID (ca. _...) OAUTH_STRIPE_LIVE_ID=Stripe Connect Client ID (ca. _...) @@ -61,6 +62,7 @@ DeleteACard=Slet kort ConfirmDeleteCard=Er du sikker på, at du vil slette dette kredit- eller betalingskort? CreateCustomerOnStripe=Opret kunde på Stripe CreateCardOnStripe=Opret kort på Stripe +CreateBANOnStripe=Opret bank på Stripe ShowInStripe=Vis i Stripe StripeUserAccountForActions=Brugerkonto, der skal bruges til e-mail-meddelelse om nogle Stripe begivenheder (Stripe udbetalinger) StripePayoutList=Liste over Stripe udbetalinger @@ -69,4 +71,8 @@ ToOfferALinkForLiveWebhook=Link til opsætning Stripe WebHook for at ringe til I PaymentWillBeRecordedForNextPeriod=Betaling registreres for den næste periode. ClickHereToTryAgain=Klik her for at prøve igen ... CreationOfPaymentModeMustBeDoneFromStripeInterface=På grund af stærke kunde autentificerings regler skal oprettelse af et kort foretages fra Stripe backoffice. Du kan klikke her for at tænde for Stripe-kundepost:%s -TERMINAL_LOCATION=Placering (adresse) for terminaler +STRIPE_CARD_PRESENT=Kort til stede til Stripe-terminaler +TERMINAL_LOCATION=Placering (adresse) for Stripe Terminals +RequestDirectDebitWithStripe=Anmod om direkte debitering med Stripe +STRIPE_SEPA_DIRECT_DEBIT=Aktiver direkte debitering via Stripe + diff --git a/htdocs/langs/da_DK/ticket.lang b/htdocs/langs/da_DK/ticket.lang index bbeb209fc8a..14f5fcde62b 100644 --- a/htdocs/langs/da_DK/ticket.lang +++ b/htdocs/langs/da_DK/ticket.lang @@ -26,6 +26,7 @@ Permission56002=Ændre sager Permission56003=Slet sager Permission56004=Administrer sager Permission56005=Se sager fra alle tredjepart (ikke effektiv for eksterne brugere, vær altid begrænset til den tredjepart, de er afhængige af) +Permission56006=Eksportér billetter Tickets=Sager TicketDictType=Sag - Typer @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=Ekstern bidragyder OriginEmail=Sagsopretter e-mail Notify_TICKET_SENTBYMAIL=Send sagsbesked via e-mail +ExportDataset_ticket_1=Sager + # Status Read=Læs Assigned=Tildelt diff --git a/htdocs/langs/da_DK/users.lang b/htdocs/langs/da_DK/users.lang index 4f91274ef1a..48076bd127a 100644 --- a/htdocs/langs/da_DK/users.lang +++ b/htdocs/langs/da_DK/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Link til bruger LinkedToDolibarrThirdParty=Link til tredjepart CreateDolibarrLogin=Opret Dolibarr konto CreateDolibarrThirdParty=Opret en tredjepart -LoginAccountDisableInDolibarr=Konto deaktiveret i Dolibarr. +LoginAccountDisableInDolibarr=Konto deaktiveret i Dolibarr +PASSWORDInDolibarr=Adgangskode ændret i Dolibarr UsePersonalValue=Brug personlige værdi ExportDataset_user_1=Brugere og deres egenskaber DomainUser=Domænebruger %s @@ -129,3 +130,6 @@ IPLastLogin=IP sidste login IPPreviousLogin=IP tidligere login ShowAllPerms=Vis alle tilladelsesrækker HideAllPerms=Skjul alle tilladelsesrækker +UserPublicPageDesc=Du kan aktivere et virtuelt kort for denne bruger. En url med brugerprofilen og en stregkode vil være tilgængelig, så alle med en smartphone kan scanne den og tilføje din kontakt til dens adressebog. +EnablePublicVirtualCard=Aktiver det offentlige virtuelle brugerkort +PublicVirtualCardUrl=Offentligt virtuelt brugerkort diff --git a/htdocs/langs/da_DK/website.lang b/htdocs/langs/da_DK/website.lang index 311b985d372..40a033d367d 100644 --- a/htdocs/langs/da_DK/website.lang +++ b/htdocs/langs/da_DK/website.lang @@ -155,3 +155,5 @@ WebpageMustBeDisabled=Websiden skal have status "%s" SetWebsiteOnlineBefore=Når hjemmesiden er offline, er alle sider offline. Skift status på webstedet først. Booking=Booking Reservation=Reservation +PagesViewedPreviousMonth=Viste sider (forrige måned) +PagesViewedTotal=Viste sider (i alt) diff --git a/htdocs/langs/de_AT/stripe.lang b/htdocs/langs/de_AT/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/de_AT/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/de_CH/accountancy.lang b/htdocs/langs/de_CH/accountancy.lang index e5e638185a8..3ccdcb82ebe 100644 --- a/htdocs/langs/de_CH/accountancy.lang +++ b/htdocs/langs/de_CH/accountancy.lang @@ -10,8 +10,6 @@ Selectformat=Wähle das Dateiformat ACCOUNTING_EXPORT_FORMAT=Wähle das Dateiformat ACCOUNTING_EXPORT_ENDLINE=Wähle das Steuerzeichen für den Wagenrücklauf (Carriage Return CR) ACCOUNTING_EXPORT_PREFIX_SPEC=Wähle dein Präfix für den Dateinamen -DefaultForService=Standard für Leistungen -DefaultForProduct=Standard für Produkte ServiceForThisThirdparty=Dienstleistung für diesen Geschäftspartner CantSuggest=Ich habe keinen Vorschlag AccountancySetupDoneFromAccountancyMenu=Die meisten Einstellungen der Buchhaltung setzt du im Menu %s @@ -75,7 +73,6 @@ ShowAccountingAccount=Zeige Buchhaltungskonto ShowAccountingJournal=Zeige Buchhaltungssjournal ShowAccountingAccountInLedger=Zeige dieses Buchhaltungskonto im Hauptbuch. ShowAccountingAccountInJournals=Zeige dieses Buchhaltungskonto in den Journalen -AccountAccountingSuggest=Vorgeschlagenes Buchhaltungskonto MenuVatAccounts=MWST - Konten MenuExpenseReportAccounts=Spesenabrechnungskonten MenuProductsAccounts=Produktkonten @@ -136,6 +133,8 @@ LetteringCode=Beschriftung Lettering=Beschriftung JournalLabel=Journalbezeichnung TransactionNumShort=Transaktionsnummer +AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Nach Hauptbuchkonto gruppieren GroupBySubAccountAccounting=Nach Nebenbuchkonto gruppieren AccountingAccountGroupsDesc=Trage hier deine eigenen Buchhaltungs - Kontogruppen ein. Daraus kannst du spezielle Berichte erzeugen. diff --git a/htdocs/langs/de_CH/companies.lang b/htdocs/langs/de_CH/companies.lang index 1869e91605d..074c9fb606a 100644 --- a/htdocs/langs/de_CH/companies.lang +++ b/htdocs/langs/de_CH/companies.lang @@ -14,7 +14,6 @@ ThirdPartyContact=Geschäftspartner-Kontakt Companies=Unternehmen CountryIsInEEC=EU - Staat PriceFormatInCurrentLanguage=Währungsanzeige dieser Sprache -ThirdPartyName=Name des Geschäftspartners ThirdPartyEmail=E-Mail des Geschäftspartners ThirdPartyProspectsStats=Interessenten Statistik ThirdPartyType=Typ des Geschäftspartners diff --git a/htdocs/langs/de_CH/main.lang b/htdocs/langs/de_CH/main.lang index df9de7000cd..8b888ed2bfa 100644 --- a/htdocs/langs/de_CH/main.lang +++ b/htdocs/langs/de_CH/main.lang @@ -83,6 +83,7 @@ Close=Schliessen CloseBox=Box vom Startbildschirm entfernen ConfirmSendCardByMail=Willst du diese Karte wirklich an %s mailen? Resiliate=Abschliessen +Cancel=Abbrechen Validate=Bestätigen ValidateAndApprove=Freigeben und bestätigen NotValidated=Nicht validiert @@ -309,8 +310,6 @@ BackOffice=Dolibarr ExportFilteredList=Exportiere gefilterte Positionen ExportList=Exportiere Positionen IncludeDocsAlreadyExported=Beziehe bereits exportierte Dokumente mit ein -ExportOfPiecesAlreadyExportedIsEnable=Bereits exportierte Dateien erneut exportieren ist "Ein". -ExportOfPiecesAlreadyExportedIsDisable=Bereits exportierte Dateien erneut exportieren ist "Aus". AllExportedMovementsWereRecordedAsExported=Alles erfolgreich exportiert:-) NotAllExportedMovementsCouldBeRecordedAsExported=Nicht alles konnte korrekt exportiert werden:-( Calendar=Kalender @@ -385,4 +384,9 @@ CustomReports=Eigene Berichte StatisticsOn=Statistiken zu SelectYourGraphOptionsFirst=Wähle den Diagrammtyp Measures=Masseinheiten +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) Terminate=Abschliessen diff --git a/htdocs/langs/de_CH/stripe.lang b/htdocs/langs/de_CH/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/de_CH/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/de_CH/users.lang b/htdocs/langs/de_CH/users.lang index c7c14ca597b..b5a0fd13dcb 100644 --- a/htdocs/langs/de_CH/users.lang +++ b/htdocs/langs/de_CH/users.lang @@ -32,6 +32,7 @@ ConfirmCreateThirdParty=Willst du wirklich für dieses Mitglied einen Partner er LoginToCreate=Zu erstellende Anmeldung NameToCreate=Name des neuen Geschäftspartners YourRole=Ihre Rolle +HierarchicalResponsible=Vorgesetzter UseTypeFieldToChange=Nutzen sie das Feld "Typ" zum ändern WeeklyHours=Geleistete Stunden pro Woche DisabledInMonoUserMode=Im Wartungsmodus deaktiviert diff --git a/htdocs/langs/de_DE/accountancy.lang b/htdocs/langs/de_DE/accountancy.lang index b2565f04044..521161d3f8f 100644 --- a/htdocs/langs/de_DE/accountancy.lang +++ b/htdocs/langs/de_DE/accountancy.lang @@ -5,7 +5,7 @@ ACCOUNTING_EXPORT_SEPARATORCSV=Spaltentrennzeichen für die Exportdatei ACCOUNTING_EXPORT_DATE=Datumsformat der Exportdatei ACCOUNTING_EXPORT_PIECE=Stückzahl exportieren ACCOUNTING_EXPORT_GLOBAL_ACCOUNT=Mit globalem Konto exportieren -ACCOUNTING_EXPORT_LABEL=Exportiere Beschriftung +ACCOUNTING_EXPORT_LABEL=Exportiere Bezeichnung ACCOUNTING_EXPORT_AMOUNT=Exportiere Betrag ACCOUNTING_EXPORT_DEVISE=Exportiere Währung Selectformat=Wählen Sie das Format für die Datei @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Art des Zeilenumbruchs wählen ACCOUNTING_EXPORT_PREFIX_SPEC=Präfix für den Dateinamen angeben ThisService=Diese Leistung ThisProduct=Dieses Produkt -DefaultForService=Standard für Leistung -DefaultForProduct=Standard für Produkt +DefaultForService=Standard für Leistungen +DefaultForProduct=Standard für Produkte ProductForThisThirdparty=Produkt für diesen Geschäftspartner ServiceForThisThirdparty=Leistungen für diesen Geschäftspartner CantSuggest=Kann keines vorschlagen @@ -101,6 +101,7 @@ ShowAccountingAccount=Buchungskonto anzeigen ShowAccountingJournal=Buchhaltungsjournal anzeigen ShowAccountingAccountInLedger=Buchungskonto im Hauptbuch anzeigen ShowAccountingAccountInJournals=Buchungskonto in Journalen anzeigen +DataUsedToSuggestAccount=Daten, die verwendet werden, um ein Buchungskonto vorzuschlagen AccountAccountingSuggest=Vorgeschlagenes Buchungskonto MenuDefaultAccounts=Standardkonten MenuBankAccounts=Bankkonten @@ -126,6 +127,7 @@ WriteBookKeeping=Transaktionen in der Buchhaltung erfassen Bookkeeping=Hauptbuch BookkeepingSubAccount=Nebenbuch AccountBalance=Summen und Salden +AccountBalanceSubAccount=Saldo der Unterkonten ObjectsRef=Quellreferenz CAHTF=Gesamtbetrag Lieferant vor Steuern TotalExpenseReport=Gesamtausgaben Spesenabrechnung @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Konto (aus dem Kontenplan), das als Standard UseAuxiliaryAccountOnCustomerDeposit=Debitorenkonto als Einzelkonto im Nebenbuch für Anzahlungspositionen hinterlegen (bei Deaktivierung bleibt Einzelkonto für Anzahlungspositionen leer) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Konto (aus dem Kontenplan), das als Standard verwendet werden soll UseAuxiliaryAccountOnSupplierDeposit=Lieferantenkonto als Einzelkonto im Nebenbuch für Anzahlungsbuchungen speichern (falls deaktiviert, bleibt Einzelkonto für Anzahlungsbuchungen leer) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Standard-Buchungskonto zur Erfassung der vom Kunden einbehaltenen Garantie ACCOUNTING_PRODUCT_BUY_ACCOUNT=Konto (aus dem Kontenplan), das als Standardkonto für die im selben Land gekauften Produkte verwendet werden soll (wird verwendet, wenn nicht im Produktblatt definiert) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Konto (aus dem Kontenplan), das als Standardkonto für in der EWG aus einem anderen EWG-Land gekauften Produkte verwendet werden soll (wird verwendet, wenn nicht im Produktblatt definiert) @@ -217,7 +220,8 @@ Codejournal=Journal JournalLabel=Journal-Bezeichnung NumPiece=Teilenummer TransactionNumShort=Buchungsnr. -AccountingCategory=Custom group of accounts +AccountingCategory=Benutzerdefinierte Kontengruppe +AccountingCategories=Benutzerdefinierte Kontengruppe GroupByAccountAccounting=Gruppieren nach Hauptbuchkonto GroupBySubAccountAccounting=Gruppieren nach Nebenbuchkonto AccountingAccountGroupsDesc=Hier können Kontengruppen definiert werden. Diese werden für personaliserte Buchhaltungsreports verwendet. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Zwischensumme nach Ebene anzeigen Pcgtype=Kontenklasse PcgtypeDesc=Kontengruppen werden für einige Buchhaltungsberichte als vordefinierte Filter- und Gruppierungskriterien verwendet. Beispielsweise werden "Aufwand" oder "Ertrag" als Gruppen für die Buchungskonten von Produkten genutzt, um die Ausgaben-/Einnahmenrechnung zu erstellen. +AccountingCategoriesDesc=Benutzerdefinierte Kontengruppen können verwendet werden, um mehrere Buchhaltungskonten unter einem Namen zu gruppieren, um die Verwendung von Filtern oder das Erstellen von benutzerdefinierten Berichten zu vereinfachen. Reconcilable=ausgleichsfähig @@ -294,6 +299,7 @@ DescValidateMovements=Es sind danach keinerlei Änderungen oder Löschungen mehr ValidateHistory=Automatisch kontieren AutomaticBindingDone=Automatische Zuordnungen durchgeführt (%s) - Automatische Zuordnung für einige Datensätze nicht möglich (%s) +DoManualBindingForFailedRecord=Sie müssen eine manuelle Verknüpfung für die %s-Zeile(n) vornehmen, die nicht automatisch verknüpft wurden. ErrorAccountancyCodeIsAlreadyUse=Fehler, Sie können dieses Buchungskonto nicht löschen, da es benutzt wird. MvtNotCorrectlyBalanced=Buchungssalden nicht ausgeglichen. Soll = %s & Haben = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Deaktivieren Sie die Bindung und Übertragun ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Deaktivieren Sie die Bindung und Übertragung in der Buchhaltung bei Einkäufen (Lieferantenrechnungen werden in der Buchhaltung nicht berücksichtigt). ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Deaktivieren Sie die Bindung und Übertragung in der Buchhaltung für Spesenabrechnungen (Spesenabrechnungen werden bei der Buchhaltung nicht berücksichtigt). ACCOUNTING_ENABLE_LETTERING=Aktivieren Sie die Abstimmungsfunktion in der Buchhaltung +ACCOUNTING_ENABLE_AUTOLETTERING=Aktivieren Sie den automatischen Buchungsabgleich bei der Übergabe an die Buchhaltung ## Export NotExportLettering=Beim Generieren der Datei die Abstimmungsinformationen nicht exportieren NotifiedExportDate=Exportierte Zeilen als exportiert kennzeichnen (um eine Zeile zu ändern, müssen Sie die gesamte Transaktion löschen und erneut in die Buchhaltung übertragen) NotifiedValidationDate=Festschreiben der exportierten Einträge (gleiche Wirkung wie die Funktion "%s", Änderungen und Löschungen der Zeilen sind danach DEFINITIV NICHT möglich) +NotifiedExportFull=Dokumente exportieren? DateValidationAndLock=Festschreibungsdatum ConfirmExportFile=Exportdatei der Buchhaltung erstellen? ExportDraftJournal=Entwurfsjournal exportieren @@ -398,7 +406,7 @@ SaleLocal=Verkauf Inland SaleExport=Verkauf Export (ausserhalb EWG) SaleEEC=Verkauf in EU/EWG SaleEECWithVAT=Verkauf in der EU mit Mehrwertsteuer (nicht null), und daher anzunehmen ist, dass es sich NICHT um einen innergemeinschaftlichen Verkauf handelt und das vorgeschlagene Konto daher das Standardproduktkonto ist. -SaleEECWithoutVATNumber=Verkauf in der EU ohne USt., aber ohne dass die erforderliche USt.-ID des Geschäftspartners hinterlegt ist. Es wird stattdessen auf das Produktkonto für Standardverkäufe zurückgegriffen. Bei Bedarf kann die USt.-ID des Geschäftspartners festgelegt oder die Einstellung für das Produktkonto geändert werden. +SaleEECWithoutVATNumber=Verkauf in der EWG ohne Mehrwertsteuer, ohne dass die Umsatzsteuer-ID des Geschäftspartners definiert ist. Es wird stattdessen auf das Buchungskonto für Standardverkäufe zurückgegriffen. Sie können die Umsatzsteuer-ID des Geschäftspartners korrigieren oder das zur Kontierung vorgeschlagene Buchungskonto bei Bedarf ändern. ForbiddenTransactionAlreadyExported=Unzulässig: Die Transaktion wurde bereits freigegeben und/oder exportiert. ForbiddenTransactionAlreadyValidated=Unzulässig: Die Transaktion wurde bereits freigegeben. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Fehlende Übereinstimmung im Code für Abglei AccountancyErrorMismatchBalanceAmount=Der Saldo (%s) ist ungleich 0 AccountancyErrorLetteringBookkeeping=Bei den Transaktionen sind Fehler aufgetreten: %s ErrorAccountNumberAlreadyExists=Das Buchungskonto %s existiert bereits +ErrorArchiveAddFile=Die Datei „%s“ kann nicht im Archiv abgelegt werden ## Import ImportAccountingEntries=Buchaltungseinträge @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Mehrwährungs-Code (Idevise) DateExport=Exportdatum WarningReportNotReliable=Achtung, dieser Bericht basiert nicht auf dem Hauptbuch und enthält keine Transaktionen, die manuell im Hauptbuch geändert wurden. Wenn Ihre Journalisierung aktuell ist, ist die Buchhaltungsansicht genauer. ExpenseReportJournal=Spesenabrechnung Journal +DocsAlreadyExportedAreExcluded=Bereits exportierte Dokumente sind ausgeschlossen +ClickToHideAlreadyExportedLines=Klicken Sie hier, um bereits exportierte Positionen auszublenden NAccounts=%s Konten diff --git a/htdocs/langs/de_DE/admin.lang b/htdocs/langs/de_DE/admin.lang index 01a14256c24..68fcfa043dc 100644 --- a/htdocs/langs/de_DE/admin.lang +++ b/htdocs/langs/de_DE/admin.lang @@ -203,7 +203,7 @@ ExtendedInsert=Erweiterte INSERTS NoLockBeforeInsert=Keine Sperrbefehle (Lock) für INSERT DelayedInsert=Verzögerte INSERTS EncodeBinariesInHexa=Hexadezimal-Codierung für Binärdaten -IgnoreDuplicateRecords=Fehler zu doppelten Zeiten ignorieren (INSERT IGNORE) +IgnoreDuplicateRecords=Fehler zu doppelten Datensätzen ignorieren (INSERT IGNORE) AutoDetectLang=Automatische Erkennung (Browser-Sprache) FeatureDisabledInDemo=Funktion in der Demoversion deaktiviert FeatureAvailableOnlyOnStable=Diese Funktion steht nur in offiziellen stabilen Versionen zur Verfügung @@ -285,7 +285,7 @@ NewByMonth=Neu nach Monat Emails=E-Mail EMailsSetup=E-Mail-Einstellungen EMailsDesc=Auf dieser Seite können Sie Parameter oder Optionen für das Senden von E-Mails festlegen. -EmailSenderProfiles=E-Mail-Signaturen +EmailSenderProfiles=E-Mail-Absenderprofile EMailsSenderProfileDesc=Sie können diesen Bereich leer lassen. Wenn Sie hier E-Mail-Adressen angeben, werden diese beim Schreiben einer neuen E-Mail in die Liste der möglichen Absender aufgenommen. MAIN_MAIL_SMTP_PORT=SMTP(S)-Port (Standardwert Ihrer php.ini: %s) MAIN_MAIL_SMTP_SERVER=SMTP(S)-Server (Standardwert Ihrer php.ini: %s) @@ -645,6 +645,8 @@ Module2300Name=Geplante Aufgaben Module2300Desc=Verwaltung geplanter Aufgaben (Cron oder chrono Tabelle) Module2400Name=Agenda (Ereignisse/Termine) Module2400Desc=Modul zur Terminplanung und Ereignissaufzeichnung: Protokollieren Sie automatisch Ereignisse wie beispielsweise Änderungen an Produktdatensätzen zu Verfolgungszwecken oder tragen Sie Termine manuell ein.\nDies ist ein wichtiges Modul für ein gutes Kunden- und/oder Lieferantenbeziehungsmanagement. +Module2430Name=Kalender-Buchungssystem +Module2430Desc=Stellen Sie einen Online-Kalender bereit, damit jeder Besprechungen in vordefinierten Bereichen oder Verfügbarkeiten buchen kann. Module2500Name=DMS/ECM Module2500Desc=Speicherung und Verteilung von Dokumenten. Automatische organisation der generierten oder gespeicherten Dokumente. Teilen Sie sie bei Bedarf. Module2600Name=API/Webservice (SOAP Server) @@ -660,6 +662,8 @@ Module2900Name=GeoIPMaxmind Module2900Desc=GeoIP Maxmind Konvertierung Module3200Name=Unveränderliche Archive Module3200Desc=Aktivieren Sie ein unveränderliches Protokoll von Geschäftsereignissen. Ereignisse werden in Echtzeit archiviert. Das Protokoll ist eine schreibgeschützte Tabelle mit verketteten Ereignissen, die exportiert werden können. Dieses Modul kann für einige Länder zwingend erforderlich sein. +Module3300Name=Module-Builder +Module3200Desc=Aktivieren Sie ein unveränderliches Protokoll von Geschäftsereignissen. Ereignisse werden in Echtzeit archiviert. Das Protokoll ist eine schreibgeschützte Tabelle mit verketteten Ereignissen, die exportiert werden können. Dieses Modul kann für einige Länder zwingend erforderlich sein. Module3400Name=Soziale Netzwerke Module3400Desc=Aktiviert Felder für soziale Netzwerke für Dritte und Adressen (Skype, Twitter, Facebook, ...). Module4000Name=Personal @@ -1270,6 +1274,7 @@ TriggerActiveAsModuleActive=Trigger in dieser Datei sind durch das übergeordnet GeneratedPasswordDesc=Wählen Sie die Methode für automatisch erzeugte Passwörter. DictionaryDesc=Alle Standardwerte einfügen. Sie können eigene Werte zu den Standartwerten hinzufügen. ConstDesc=Auf dieser Seite können Sie Parameter bearbeiten (überschreiben), die auf anderen Seiten nicht verfügbar sind. Diese Funktion ist für Entwickler und/oder die fortgeschrittene Fehlerbehebung vorgesehen. +MiscellaneousOptions=Verschiedene Optionen MiscellaneousDesc=Alle anderen sicherheitsrelevanten Parameter werden hier eingestellt. LimitsSetup=Einstellungen zu Dezimalstellen und Rundung LimitsDesc=Hier können Sie die von Dolibarr verwendeten Grenzwerte, Genauigkeiten und Optimierungen definieren @@ -1797,17 +1802,17 @@ FailedToInitializeMenu=Menü konnte nicht erstellt werden ##### Tax ##### TaxSetup=Steuer-, Sozialabgaben- und Dividendenmodul-Einstellungen OptionVatMode=USt. fällig -OptionVATDefault=Ist-Versteuerung -OptionVATDebitOption=Soll-Versteuerung -OptionVatDefaultDesc=USt fällig:
    - Bei Lieferung/Zahlung für Waren
    - Bei Zahlung für Leistungen -OptionVatDebitOptionDesc=USt fällig:
    - Bei Lieferung/Zahlung für Waren
    - Bei Rechnungslegung (Lastschrift) für Dienstleistungen -OptionPaymentForProductAndServices=Cash-Basis für Produkte und Leistungen -OptionPaymentForProductAndServicesDesc=USt is fällig:
    - Bei Bezahlung von Waren
    - Bei Bezahlung von Dienstleistungen +OptionVATDefault=Unterschiedliche Versteuerung für Produkte und Leistungen (z.B. in Frankreich) +OptionVATDebitOption=Soll-Versteuerung für Produkte und Leistungen +OptionVatDefaultDesc=USt fällig:
    - zum Rechnungsdatum bei Produkten
    - zum Zahlungsdatum bei Leistungen +OptionVatDebitOptionDesc=USt fällig:
    - zum Rechnungsdatum bei Produkten
    - zum Rechnungsdatum bei Leistungen +OptionPaymentForProductAndServices=Ist-Versteuerung für Produkte und Leistungen +OptionPaymentForProductAndServicesDesc=USt fällig:
    - zum Zahlungsdatum bei Produkten
    - zum Zahlungsdatum bei Leistungen SummaryOfVatExigibilityUsedByDefault=Standardmäßiger Zeitpunkt der USt.-Fälligkeit in Abhängigkeit zur derzeit gewählten Option: OnDelivery=Bei Lieferung OnPayment=Bei Zahlung OnInvoice=Bei Rechnungslegung -SupposedToBePaymentDate=Zahlungsdatum in Verwendung falls Lieferdatum unbekannt +SupposedToBePaymentDate=Zahlungsdatum wird verwendet SupposedToBeInvoiceDate=Rechnungsdatum verwendet Buy=Kaufen Sell=Verkaufen @@ -1826,6 +1831,9 @@ AGENDA_USE_EVENT_TYPE=Verwenden der Ereignissarten \nEinstellen unter (Start -> AGENDA_USE_EVENT_TYPE_DEFAULT=Diesen Standardwert automatisch als Ereignistyp im Ereignis Erstell-Formular verwenden. AGENDA_DEFAULT_FILTER_TYPE=Diesen Ereignisstatus automatisch in den Suchfilter für die Agenda-Ansicht übernehmen AGENDA_DEFAULT_FILTER_STATUS=Diesen Ereignisstatus automatisch in den Suchfilter für die Agenda-Ansicht übernehmen +AGENDA_EVENT_PAST_COLOR=Farbe für Ereignisse in der Vergangenheit +AGENDA_EVENT_CURRENT_COLOR=Farbe für aktuelle Ereignisse +AGENDA_EVENT_FUTURE_COLOR=Farbe für Ereignisse in der Zukunft AGENDA_DEFAULT_VIEW=Welche Standardansicht soll geöffnet werden, wenn das Menü 'Agenda' geöffnet wird AGENDA_REMINDER_BROWSER=Aktiviere die Ereigniserinnerung im Browser des Benutzers. (Wenn das Erinnerungsdatum erreicht ist, wird vom Browser ein Popup angezeigt. Jeder Benutzer kann solche Benachrichtigungen in seinem Browser-Benachrichtigungs-Setup deaktivieren.) AGENDA_REMINDER_BROWSER_SOUND=Aktiviere Tonbenachrichtigung @@ -2129,6 +2137,7 @@ CodeLastResult=Letzter Resultatcode NbOfEmailsInInbox=Anzahl E-Mails im Quellverzeichnis LoadThirdPartyFromName=Drittanbieter-Suche auf %s laden (nur laden) LoadThirdPartyFromNameOrCreate=Drittanbieter-Suche auf %s laden (erstellen, wenn nicht gefunden) +LoadContactFromEmailOrCreate=Kontakt aus %s entnehmen (erstellen, wenn nicht gefunden) AttachJoinedDocumentsToObject=Speichern Sie angehängte Dateien als Dokumente eines Objekts, wenn die Referenz des Objekts im Betreff der E-Mail gefunden wird. WithDolTrackingID=Nachricht einer Unterhaltung die durch eine erste von Dolibarr gesendete E-Mail initiiert wurde WithoutDolTrackingID=Nachricht einer Unterhaltung die NICHT durch eine erste von Dolibarr gesendete E-Mail initiiert wurde @@ -2355,3 +2364,5 @@ AllowExternalDownload=Externen Download zulassen (ohne Anmeldung, über einen fr DeadlineDayVATSubmission=Stichtag für die MwSt.-Einreichung im nächsten Monat MaxNumberOfAttachementOnForms=Maximale Anzahl verbundener Dateien in einem Formular IfDefinedUseAValueBeetween=Wenn definiert, einen Wert zwischen %s und %s verwenden +Reload=Neu laden +ConfirmReload=Neuladen des Moduls bestätigen diff --git a/htdocs/langs/de_DE/boxes.lang b/htdocs/langs/de_DE/boxes.lang index b8ba765a3d1..10eeb91d1e4 100644 --- a/htdocs/langs/de_DE/boxes.lang +++ b/htdocs/langs/de_DE/boxes.lang @@ -24,6 +24,7 @@ BoxFicheInter=Neueste Serviceaufträge BoxCurrentAccounts=Saldo offene Konten BoxTitleMemberNextBirthdays=Geburtstage in diesem Monat (Mitglieder) BoxTitleMembersByType=Mitglieder nach Typ und Status +BoxTitleMembersByTags=Mitglieder nach Kategorien und Status BoxTitleMembersSubscriptionsByYear=Mitgliederabonnements nach Jahr BoxTitleLastRssInfos=%s neueste Neuigkeiten von %s BoxTitleLastProducts=Zuletzt bearbeitete Produkte / Leistungen (maximal %s) diff --git a/htdocs/langs/de_DE/categories.lang b/htdocs/langs/de_DE/categories.lang index 1369f84b2a3..9e9f407c2b0 100644 --- a/htdocs/langs/de_DE/categories.lang +++ b/htdocs/langs/de_DE/categories.lang @@ -78,11 +78,11 @@ CatContactList=Liste der Schlagwörter / Kategorien für Kontakte CatProjectsList=Liste der Schlagwörter / Kategorien für Projekte CatUsersList=Liste der Schlagwörter / Kategorien für Benutzer CatSupLinks=Verknüpfungen zwischen Anbietern und Schlagwörter / Kategorien -CatCusLinks=Verbindung zwischen Kunden-/Leads und Kategorien +CatCusLinks=Verknüpfungen zwischen Kunden-/Leads und Kategorien CatContactsLinks=Verknüpfungen zwischen Kontakten/Adressen und Tags/Kategorien -CatProdLinks=Verbindung zwischen Produkten/Leistungen und Kategorien -CatMembersLinks=Verbindung zwischen Mitgliedern und Kategorien -CatProjectsLinks=Verbindung zwischen Projekten und Kategorien bzw. Suchwörtern +CatProdLinks=Verknüpfungen zwischen Produkten/Leistungen und Kategorien +CatMembersLinks=Verknüpfungen zwischen Mitgliedern und Kategorien +CatProjectsLinks=Verknüpfungen zwischen Projekten und Kategorien bzw. Suchwörtern CatUsersLinks=Verknüpfungen zwischen Benutzern und Schlagwörter / Kategorien DeleteFromCat=Aus Kategorie entfernen ExtraFieldsCategories=Ergänzende Attribute diff --git a/htdocs/langs/de_DE/companies.lang b/htdocs/langs/de_DE/companies.lang index 0797e3164ab..2c1086dbf3a 100644 --- a/htdocs/langs/de_DE/companies.lang +++ b/htdocs/langs/de_DE/companies.lang @@ -29,7 +29,7 @@ AliasNameShort=Alias-Name Companies=Firmen CountryIsInEEC=Land ist EU-Mitglied PriceFormatInCurrentLanguage=Preisanzeigeformat in der aktuellen Sprache und Währung -ThirdPartyName=Name des Partners +ThirdPartyName=Name des Geschäftspartners ThirdPartyEmail=Geschäftspartner E-Mail ThirdParty=Geschäftspartner ThirdParties=Geschäftspartner @@ -130,7 +130,7 @@ ProfId1AT=Steuernummer (Finanzamt) ProfId2AT=Gerichtsstand ProfId3AT=Firmenbuchnummer ProfId4AT=DVR-Nummer -ProfId5AT=EORI-Nummer +ProfId5AT=EORI Nummer ProfId6AT=- ProfId1AU=Prof ID 1 ProfId2AU=- @@ -313,7 +313,7 @@ CustomerAbsoluteDiscountShort=Rabatt absolut CompanyHasRelativeDiscount=Dieser Kunde hat einen Rabatt von %s%% CompanyHasNoRelativeDiscount=Dieser Kunde hat standardmäßig keinen prozentualen Rabatt HasRelativeDiscountFromSupplier=Sie haben einen Standardrabatt von %s%% bei diesem Lieferanten -HasNoRelativeDiscountFromSupplier=Kein prozentualer Rabatt bei diesem Lieferanten +HasNoRelativeDiscountFromSupplier=Kein prozentualer Standardrabatt bei diesem Lieferanten CompanyHasAbsoluteDiscount=Dieser Kunde hat ein Guthaben verfügbar (Gutschriften oder Anzahlungen) für %s %s CompanyHasDownPaymentOrCommercialDiscount=Dieser Kunde hat ein Guthaben verfügbar (Gutschriften oder Anzahlungen) für%s %s CompanyHasCreditNote=Dieser Kunde hat noch Gutschriften über %s %s @@ -358,8 +358,8 @@ ValidityControledByModule=Vom Modul kontrollierte Gültigkeit ThisIsModuleRules=Regeln für dieses Modul ProspectToContact=Zu kontaktierender Interessent CompanyDeleted=Unternehmen "%s" aus der Datenbank gelöscht. -ListOfContacts=Liste der Kontakte -ListOfContactsAddresses=Liste der Kontakte +ListOfContacts=Liste der Kontakte/Adressen +ListOfContactsAddresses=Liste der Kontakte/Adressen ListOfThirdParties=Liste der Geschäftspartner ShowCompany=Geschäftspartner ShowContact=Kontakt-Adresse @@ -435,8 +435,8 @@ ExportDataset_company_1=Geschäftspartner (Firmen/Stiftungen/Natürliche Persone ExportDataset_company_2=Kontakte und ihre Eigenschaften ImportDataset_company_1=Geschäftspartner und ihre Eigenschaften ImportDataset_company_2=Kontakte/Adressen und Attribute -ImportDataset_company_3=Bankkonten des Geschäftspartners -ImportDataset_company_4=Dem Geschäftspartner zugeordneter Vertriebsmitarbeiter (Vertriebsmitarbeiter/Benutzer zu Unternehmen zuordnen) +ImportDataset_company_3=Bankkonten der Geschäftspartner +ImportDataset_company_4=Geschäftspartnern zugeordnete Vertriebsmitarbeiter (Vertriebsmitarbeiter/Benutzer zu Unternehmen zuordnen) PriceLevel=Preisstufe PriceLevelLabels=Preisniveau Etiketten DeliveryAddress=Lieferadresse @@ -444,7 +444,7 @@ AddAddress=Adresse hinzufügen SupplierCategory=Lieferantenkategorie JuridicalStatus200=Unabhängig DeleteFile=Datei löschen -ConfirmDeleteFile=Möchten Sie diese Datei wirklich löschen? +ConfirmDeleteFile=Möchten Sie die Datei %s wirklich löschen? AllocateCommercial=Diesem Vertriebsmitarbeiter zugeordnet Organization=Organisation FiscalYearInformation=Geschäftsjahr @@ -498,3 +498,8 @@ RestOfEurope=übriges Europa (EU / EWG) OutOfEurope=außerhalb Europas (EU / EWG) CurrentOutstandingBillLate=Offene Posten BecarefullChangeThirdpartyBeforeAddProductToInvoice=Seien Sie vorsichtig: Abhängig von Ihren Produktpreiseinstellungen sollten Sie den Geschäftspartner wechseln, bevor Sie das Produkt zum POS hinzufügen. +EmailAlreadyExistsPleaseRewriteYourCompanyName=E-Mail existiert bereits, bitte geben Sie Ihren Firmennamen neu ein +TwoRecordsOfCompanyName=Für dieses Unternehmen existiert mehr als ein Datensatz. Bitte kontaktieren Sie uns, um Ihre Partnerschaftsanfrage abzuschließen. +CompanySection=Unternehmensbereich +ShowSocialNetworks=Soziale Netzwerke anzeigen +HideSocialNetworks=Soziale Netzwerke ausblenden diff --git a/htdocs/langs/de_DE/errors.lang b/htdocs/langs/de_DE/errors.lang index 0553f3ba730..0791a31a29a 100644 --- a/htdocs/langs/de_DE/errors.lang +++ b/htdocs/langs/de_DE/errors.lang @@ -303,6 +303,7 @@ ErrorValueForTooLow=Wert für %s ist zu niedrig ErrorValueCantBeNull=Der Wert für %s darf nicht null sein ErrorDateOfMovementLowerThanDateOfFileTransmission=Das Datum der Banküberweisung darf nicht vor dem Datum der Dateiübermittlung liegen ErrorTooMuchFileInForm=Zu viele Dateien im Formular, die maximale Anzahl beträgt %s Datei(en) +ErrorSessionInvalidatedAfterPasswordChange=Die Sitzung wurde nach einer Änderung von Passwort, Status oder Gültigkeitsdaten ungültig. Bitte melden Sie sich erneut an. # Warnings WarningParamUploadMaxFileSizeHigherThanPostMaxSize=Ihr PHP Parameter upload_max_filesize (%s) ist größer als Parameter post_max_size (%s). Dies ist eine inkonsistente Einstellung. @@ -325,6 +326,7 @@ WarningPaymentDateLowerThanInvoiceDate=Zahlungsdatum (%s) liegt vor dem Rechnung WarningTooManyDataPleaseUseMoreFilters=Zu viele Ergebnisse (mehr als %s Zeilen). Bitte benutzen Sie mehr Filter oder erhöhen sie die Konstante %s auf einen höheren Wert. WarningSomeLinesWithNullHourlyRate=Einige erfasste Zeiten wurden von Benutzern erfasst bei denen der Stundensatz undefiniert war. Ein Stundenansatz von 0 %s pro Stunde wurde verwendet, was eine fehlerhafte Zeitauswertungen zur Folge haben kann. WarningYourLoginWasModifiedPleaseLogin=Ihr Login wurde verändert. Aus Sicherheitsgründen müssen Sie sich vor der nächsten Aktion mit Ihrem neuen Login anmelden. +WarningYourPasswordWasModifiedPleaseLogin=Ihr Passwort wurde geändert. Aus Sicherheitsgründen müssen Sie sich jetzt mit Ihrem neuen Passwort anmelden. WarningAnEntryAlreadyExistForTransKey=Eine Übersetzung für diesen Übersetzungsschlüssel existiert schon für diese Sprache WarningNumberOfRecipientIsRestrictedInMassAction=Achtung, die Anzahl der verschiedenen Empfänger ist auf %s beschränkt, wenn Massenaktionen für Listen verwendet werden WarningDateOfLineMustBeInExpenseReportRange=Das Datum dieser Positionszeile ist ausserhalb der Datumsspanne dieser Spesenabrechnung diff --git a/htdocs/langs/de_DE/eventorganization.lang b/htdocs/langs/de_DE/eventorganization.lang index 02fdde502eb..d3b21af3c45 100644 --- a/htdocs/langs/de_DE/eventorganization.lang +++ b/htdocs/langs/de_DE/eventorganization.lang @@ -172,3 +172,5 @@ ErrorSeveralCompaniesWithEmailContactUs=Es wurden mehrere Unternehmen mit dieser ErrorSeveralCompaniesWithNameContactUs=Es wurden mehrere Unternehmen mit diesem Namen gefunden, so dass wir Ihre Registrierung nicht automatisch freigeben können. Bitte kontaktieren Sie uns unter %s für eine manuelle Freigabe NoPublicActionsAllowedForThisEvent=Für diese Veranstaltung sind keine Aktionen für die Öffentlichkeit zugänglich MaxNbOfAttendees=Maximale Teilnehmerzahl +DateStartEvent=Startdatum der Veranstaltung +DateEndEvent=Enddatum der Veranstaltung diff --git a/htdocs/langs/de_DE/hrm.lang b/htdocs/langs/de_DE/hrm.lang index cb1f4691727..c456572ac18 100644 --- a/htdocs/langs/de_DE/hrm.lang +++ b/htdocs/langs/de_DE/hrm.lang @@ -86,7 +86,7 @@ SaveAddSkill = Kompetenz(en) hinzugefügt SaveLevelSkill = Kompetenzstufe gespeichert DeleteSkill = Kompetenz entfernt SkillsExtraFields=Ergänzende Attribute (Kompetenzen) -JobsExtraFields=Ergänzende Attribute (Mitarbeiter) +JobsExtraFields=Ergänzende Attribute (Stellenprofil) EvaluationsExtraFields=Ergänzende Attribute (Beurteilungen) NeedBusinessTravels=Geschäftsreisen erforderlich NoDescription=Keine Beschreibung diff --git a/htdocs/langs/de_DE/mails.lang b/htdocs/langs/de_DE/mails.lang index 2ecaed7fd36..95e4c06ba4b 100644 --- a/htdocs/langs/de_DE/mails.lang +++ b/htdocs/langs/de_DE/mails.lang @@ -7,13 +7,13 @@ MailCard=E-Mail-Kampagnenkarte MailRecipients=Empfänger MailRecipient=Empfänger MailTitle=Bezeichnung -MailFrom=Absenderadresse +MailFrom=Von MailErrorsTo=Fehlerrückmeldungen an MailReply=Antwort an -MailTo=Empfänger -MailToUsers=An Empfänger: +MailTo=An +MailToUsers=An Benutzer MailCC=Kopie an -MailToCCUsers=Kopie an Empfänger +MailToCCUsers=Kopie an Benutzer MailCCC=Blindkopie an MailTopic=E-Mail Betreff MailText=Inhalt diff --git a/htdocs/langs/de_DE/main.lang b/htdocs/langs/de_DE/main.lang index 9d1a2ae7e30..6b1db066cd9 100644 --- a/htdocs/langs/de_DE/main.lang +++ b/htdocs/langs/de_DE/main.lang @@ -174,7 +174,7 @@ ConfirmSendCardByMail=Möchten Sie wirklich die Inhalte dieser Karteikarte per E Delete=Löschen Remove=Entfernen Resiliate=Beenden -Cancel=Abbrechen +Cancel=Stornieren Modify=Ändern Edit=Bearbeiten Validate=Freigeben @@ -226,6 +226,7 @@ NoUserGroupDefined=Keine Benutzergruppe definiert Password=Passwort PasswordRetype=Passwort wiederholen NoteSomeFeaturesAreDisabled=Bitte beachten Sie, dass viele Funktionen/Module in dieser Demo deaktiviert sind +YourUserFile=Ihre Benutzerdatei Name=Name NameSlashCompany=Name / Firma Person=Person @@ -897,6 +898,9 @@ MassFilesArea=Bereich für Dateien aus Massenaktionen ShowTempMassFilesArea=Bereich für Dateien aus Massenaktionen zeigen ConfirmMassDeletion=Bestätigung für Massenlöschen ConfirmMassDeletionQuestion=Möchten Sie den/die %s ausgewählten Datensatz/-sätze wirklich löschen? +ConfirmMassClone=Bestätigung des Massen-Klonens +ConfirmMassCloneQuestion=Wählen Sie das Projekt aus, in das geklont werden soll +ConfirmMassCloneToOneProject=In Projekt %s klonen RelatedObjects=Verknüpfte Objekte ClassifyBilled=Als verrechnet markieren ClassifyUnbilled=als "nicht berechnet" markieren @@ -912,8 +916,8 @@ ExportFilteredList=Exportiere gefilterte Auswahl ExportList=Liste exportieren ExportOptions=Exportoptionen IncludeDocsAlreadyExported=Bereits exportierte Dokumente einschließen -ExportOfPiecesAlreadyExportedIsEnable=Der Export von bereits exportierten Daten ist möglich -ExportOfPiecesAlreadyExportedIsDisable=Der Export von bereits exportierten Daten ist deaktiviert +ExportOfPiecesAlreadyExportedIsEnable=Bereits exportierte Dokumente sind sichtbar und werden exportiert +ExportOfPiecesAlreadyExportedIsDisable=Bereits exportierte Dokumente sind ausgeblendet und werden nicht exportiert AllExportedMovementsWereRecordedAsExported=Alle exportierten Buchungen wurden als exportiert erfasst NotAllExportedMovementsCouldBeRecordedAsExported=Nicht alle exportierten Bewegungen konnten als exportiert erfasst werden. Miscellaneous=Verschiedenes @@ -1128,10 +1132,11 @@ DeleteFileText=Möchten Sie diese Datei wirklich löschen? ShowOtherLanguages=Andere Sprachen anzeigen SwitchInEditModeToAddTranslation=Wechseln Sie in den Bearbeitungsmodus, um Übersetzungen für diese Sprache hinzuzufügen NotUsedForThisCustomer=Wird für diesen Kunden nicht verwendet +NotUsedForThisVendor=Für diesen Lieferanten nicht verwendet AmountMustBePositive=Der Betrag muss positiv sein ByStatus=Nach Status InformationMessage=Information -Used=Gebraucht +Used=Verwendet ASAP=So schnell wie möglich CREATEInDolibarr=Datensatz %s erstellt MODIFYInDolibarr=Datensatz %s geändert @@ -1154,8 +1159,8 @@ SetSupervisor=Führungskraft festlegen CreateExternalUser=Externen Benutzer anlegen ConfirmAffectTag=Massenzuweisung von Schlagwörtern/Kategorien ConfirmAffectUser=Massenzuordnung von Benutzern -ProjectRole=Zugewiesene Rolle für jedes Projekt -TasksRole=Zugewiesene Rolle für jede Aufgabe jedes Projekts +ProjectRole=Für jedes Projekt / jeden Lead zugewiesene Rolle +TasksRole=Für jede Aufgabe zugewiesene Rolle (falls verwendet) ConfirmSetSupervisor=Führungskraft für mehrere festlegen ConfirmUpdatePrice=Wählen Sie den Wert der Preiserhöhung/-senkung ConfirmAffectTagQuestion=Möchten Sie den %s ausgewählten Datensätzen wirklich Schlagwörter/Kategorien zuweisen? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Erstellt aus dem öffentlichen Portal UserAgent=User-Agent InternalUser=Interne Benutzer ExternalUser=Externer Benutzer +NoSpecificContactAddress=Kein Kontakt oder Adresse +NoSpecificContactAddressBis=Diese Registerkarte dient dazu, bestimmte Kontakte oder Adressen für das aktuelle Objekt zu erzwingen. Verwenden Sie diese Funktion nur, wenn Sie einen oder mehrere spezifische Kontakte oder Adressen für das Objekt definieren möchten für den Fall, dass die Informationen über den Geschäftspartner nicht ausreichen oder nicht spezifisch genug sind. +HideOnVCard=%s ausblenden +AddToContacts=Adresse zu meinen Kontakten hinzufügen +LastAccess=Letzter Zugriff +UploadAnImageToSeeAPhotoHere=Laden Sie ein Bild auf der Registerkarte %s hoch, um hier ein Foto zu sehen +LastPasswordChangeDate=Datum der letzten Passwortänderung diff --git a/htdocs/langs/de_DE/mrp.lang b/htdocs/langs/de_DE/mrp.lang index 339efbf1f3e..339079761f1 100644 --- a/htdocs/langs/de_DE/mrp.lang +++ b/htdocs/langs/de_DE/mrp.lang @@ -11,7 +11,7 @@ Bom=Stücklisten BillOfMaterials=Stückliste BillOfMaterialsLines=Stücklistenpositionen BOMsSetup=Stücklisten Modul einrichten -ListOfBOMs=Bills of material - BOM +ListOfBOMs=Stücklisten - BOM ListOfManufacturingOrders=Fertigungsaufträge NewBOM=Neue Stückliste ProductBOMHelp=Mit dieser Stückliste zu erstellendes (oder zu zerlegendes) Produkt.
    Hinweis: Produkte mit der Eigenschaft 'Art des Produkts' = 'Rohstoff' sind in dieser Liste nicht sichtbar. @@ -102,6 +102,7 @@ NbOperatorsRequired=Anzahl der erforderlichen Bediener THMOperatorEstimated=Geschätzter Bediener THM THMMachineEstimated=Geschätzter Maschinen THM WorkstationType=Arbeitsstationstyp +DefaultWorkstation=Standard-Arbeitsstation Human=Mensch Machine=Maschine HumanMachine=Mensch & Maschine @@ -116,5 +117,5 @@ ParentMo=Übergeordneter Fertigungsauftrag MOChild=Untergeordneter Fertigungsauftrag BomCantAddChildBom=Die Nomenklatur %s ist bereits im Baum vorhanden, der zur Nomenklatur %s führt BOMNetNeeds = BOM-Nettobedarf -BOMProductsList=BOM's products -BOMServicesList=BOM's services +BOMProductsList=BOM-Produkte +BOMServicesList=BOM-Leistungen diff --git a/htdocs/langs/de_DE/orders.lang b/htdocs/langs/de_DE/orders.lang index cace09c16e1..984e8eb981c 100644 --- a/htdocs/langs/de_DE/orders.lang +++ b/htdocs/langs/de_DE/orders.lang @@ -96,6 +96,10 @@ OrdersStatisticsSuppliers=Statistik Lieferantenbestellungen NumberOfOrdersByMonth=Anzahl der Bestellungen pro Monat AmountOfOrdersByMonthHT=Gesamtbetrag der Bestellungen pro Monat (exkl. Steuern) ListOfOrders=Liste Aufträge +ListOrderLigne=Auftragspositionen +productobuy=Produkte nur zum Kaufen +productonly=Nur Produkte +disablelinefree=Keine kostenfreien Positionen anzeigen CloseOrder=Bestellung schließen ConfirmCloseOrder=Möchten Sie diese Bestellung wirklich auf "geliefert" setzen? Sobald eine Bestellung geliefert ist, kann sie auf "berechnet" gesetzt werden. ConfirmDeleteOrder=Möchten Sie diese Bestellung wirklich löschen? @@ -131,6 +135,7 @@ SupplierOrderClassifiedBilled=Bestellung %s als verrechnet markieren OtherOrders=zeige weitere Bestellungen dieses Partners SupplierOrderValidatedAndApproved=Die Lieferantenbestellung ist freigegeben und genehmigt: %s SupplierOrderValidated=Lieferantenbestellung ist freigegeben: %s +OrderShowDetail=Auftragsdetail anzeigen ##### Types de contacts ##### TypeContact_commande_internal_SALESREPFOLL=Kundenauftrag-Nachbetreuung durch Vertreter TypeContact_commande_internal_SHIPPING=Versand-Nachbetreuung durch Vertreter @@ -199,3 +204,5 @@ StatusSupplierOrderApproved=Genehmigt StatusSupplierOrderRefused=Abgelehnt StatusSupplierOrderReceivedPartially=Teilweise erhalten StatusSupplierOrderReceivedAll=Alle Produkte erhalten +NeedAtLeastOneInvoice = Es muss mindestens eine Rechnung vorhanden sein +LineAlreadyDispatched = Die Bestellposition ist bereits eingegangen. diff --git a/htdocs/langs/de_DE/other.lang b/htdocs/langs/de_DE/other.lang index 83512bde292..78e2310165c 100644 --- a/htdocs/langs/de_DE/other.lang +++ b/htdocs/langs/de_DE/other.lang @@ -131,7 +131,7 @@ ModifiedByLogin=Letzte Änderung durch Benutzerlogin ValidatedByLogin=Freigabe durch User CanceledByLogin=storniert durch Benutzername ClosedByLogin=geschlossen von User -FileWasRemoved=Datei wurde entfernt +FileWasRemoved=Datei %s wurde entfernt DirWasRemoved=Verzeichnis wurde entfernt FeatureNotYetAvailable=Diese Funktion steht in dieser Version noch nicht zur Verfügung FeatureNotAvailableOnDevicesWithoutMouse=Funktion auf Geräten ohne Maus nicht verfügbar diff --git a/htdocs/langs/de_DE/projects.lang b/htdocs/langs/de_DE/projects.lang index 30bc766e650..92589e6721a 100644 --- a/htdocs/langs/de_DE/projects.lang +++ b/htdocs/langs/de_DE/projects.lang @@ -259,6 +259,7 @@ RecordsClosed=%s Projekt(e) geschlossen SendProjectRef=Informationen zu Projekt %s ModuleSalaryToDefineHourlyRateMustBeEnabled=Das Modul 'Gehälter' muss aktiviert sein, um den Stundensatz des Mitarbeiters zu definieren und den Zeitaufwand zu bewerten NewTaskRefSuggested=Aufgabenreferenz bereits verwendet, eine neue Aufgabenreferenz ist erforderlich +NumberOfTasksCloned=%s Aufgabe(n) geklont TimeSpentInvoiced=Zeitaufwand in Rechnung gestellt TimeSpentForIntervention=Zeitaufwand TimeSpentForInvoice=Zeitaufwand diff --git a/htdocs/langs/de_DE/stripe.lang b/htdocs/langs/de_DE/stripe.lang index 5db52f3c5c0..2cefe44f2be 100644 --- a/htdocs/langs/de_DE/stripe.lang +++ b/htdocs/langs/de_DE/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Webhook Produktivschlüssel ONLINE_PAYMENT_WAREHOUSE=Warenlager für die Bestandsminderung bei Onlinezahlung
    (TODO When option to decrease stock is done on an action on invoice and the online payment generate itself the invoice?) StripeLiveEnabled=Stripe live aktiviert (Nicht im Test/Sandbox Modus) StripeImportPayment=Stripe Zahlungen importieren -ExampleOfTestCreditCard=Beispiel für eine zu testende Kreditkarte: %s => gültig, %s => Fehler CVC, %s => abgelaufen, %s => Belastung fehlgeschlagen +ExampleOfTestCreditCard=Beispiel Kreditkarte für SEPA-Test: %s => gültig, %s => Fehler CVC, %s => abgelaufen, %s => Belastung fehlgeschlagen +ExampleOfTestBankAcountForSEPA=Beispiel Bankkonto IBAN für Lastschrifttest: %s StripeGateways=Stripe Gateways OAUTH_STRIPE_TEST_ID=Stripe Connect Client ID (ca_...) OAUTH_STRIPE_LIVE_ID=Stripe Connect Client ID (ca_...) @@ -61,6 +62,7 @@ DeleteACard=Karte löschen ConfirmDeleteCard=Wollen Sie diese Debit- oder Kreditkarte wirklich löschen? CreateCustomerOnStripe=Kunden auf Stripe erstellen CreateCardOnStripe=Karte auf Stripe erstellen +CreateBANOnStripe=Bank auf Stripe erstellen ShowInStripe=In Stripe anzeigen StripeUserAccountForActions=Benutzerkonto zur E-Mail-Benachrichtigung über einige Stripe-Ereignisse (Stripe-Auszahlungen) StripePayoutList=Liste der Auszahlungen @@ -69,4 +71,8 @@ ToOfferALinkForLiveWebhook=Link zum Einrichten von Stripe WebHook zum Aufruf von PaymentWillBeRecordedForNextPeriod=Die Zahlung wird für den folgenden Zeitraum erfasst. ClickHereToTryAgain=Hier klicken und nochmal versuchen... CreationOfPaymentModeMustBeDoneFromStripeInterface=Aufgrund strenger Kundenauthentifizierungs-Regeln muss die Erstellung einer Karte im Stripe-Backoffice erfolgen. Sie können hier klicken, um zum Stripe-Kundendatensatz zu wechseln: %s -TERMINAL_LOCATION=Standort (Adresse) für Terminals +STRIPE_CARD_PRESENT='Card present' für Stripe-Terminals +TERMINAL_LOCATION=Standort (Adresse) für Stripe-Terminals +RequestDirectDebitWithStripe=Lastschrift über Stripe anfordern +STRIPE_SEPA_DIRECT_DEBIT=Aktivieren Sie die Lastschriftzahlungen über Stripe + diff --git a/htdocs/langs/de_DE/ticket.lang b/htdocs/langs/de_DE/ticket.lang index 8240ebb0637..db22f635a81 100644 --- a/htdocs/langs/de_DE/ticket.lang +++ b/htdocs/langs/de_DE/ticket.lang @@ -26,6 +26,7 @@ Permission56002=Tickets ändern Permission56003=Tickets löschen Permission56004=Tickets bearbeiten Permission56005=Tickets aller Geschäftspartner anzeigen (nicht gültig für externe Benutzer, diese sehen immer nur die Tickets des eigenen Geschäftspartners) +Permission56006=Tickets exportieren Tickets=Tickets TicketDictType=Ticket-Anfragearten @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=Externer Mitarbeiter OriginEmail=Ersteller E-Mail Notify_TICKET_SENTBYMAIL=Ticket Nachricht per E-Mail versenden +ExportDataset_ticket_1=Tickets + # Status Read=Gelesen Assigned=Zugewiesen diff --git a/htdocs/langs/de_DE/users.lang b/htdocs/langs/de_DE/users.lang index 52a6415bbc2..3831051df46 100644 --- a/htdocs/langs/de_DE/users.lang +++ b/htdocs/langs/de_DE/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Verknüpfung mit Benutzer LinkedToDolibarrThirdParty=Verknüpfung mit Geschäftspartner CreateDolibarrLogin=Benutzerkonto erstellen CreateDolibarrThirdParty=Neuen Geschäftspartner erstellen -LoginAccountDisableInDolibarr=Benutzerkonto im System deaktiviert. +LoginAccountDisableInDolibarr=Benutzerkonto in Dolibarr deaktiviert +PASSWORDInDolibarr=Passwort in Dolibarr geändert UsePersonalValue=Eigenen Wert verwenden ExportDataset_user_1=Benutzer und -eigenschaften DomainUser=Domain-Benutzer %s @@ -129,3 +130,6 @@ IPLastLogin=IP der letzten Anmeldung IPPreviousLogin=IP der vorangegangenen Anmeldung ShowAllPerms=Alle Berechtigungen anzeigen HideAllPerms=Alle Berechtigungen ausblenden +UserPublicPageDesc=Sie können für diesen Benutzer eine virtuelle Karte aktivieren. Eine URL mit dem Benutzerprofil und einem Barcode wird verfügbar sein, damit jeder mit einem Smartphone sie scannen und Ihren Kontakt zu seinem Adressbuch hinzufügen kann. +EnablePublicVirtualCard=Aktivieren Sie die öffentliche virtuelle Benutzerkarte +PublicVirtualCardUrl=Öffentliche virtuelle Benutzerkarte diff --git a/htdocs/langs/de_DE/website.lang b/htdocs/langs/de_DE/website.lang index 88e820fd684..73ad12ac6cb 100644 --- a/htdocs/langs/de_DE/website.lang +++ b/htdocs/langs/de_DE/website.lang @@ -155,3 +155,5 @@ WebpageMustBeDisabled=Die Webseite muss den Status „%s“ haben SetWebsiteOnlineBefore=Wenn die Website offline ist, sind alle Seiten offline. Ändern Sie zuerst den Status der Website. Booking=Buchung Reservation=Reservierung +PagesViewedPreviousMonth=Angesehene Seiten (Vormonat) +PagesViewedTotal=Angesehene Seiten (gesamt) diff --git a/htdocs/langs/el_CY/stripe.lang b/htdocs/langs/el_CY/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/el_CY/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/el_GR/accountancy.lang b/htdocs/langs/el_GR/accountancy.lang index 2e1dcef796c..7aa219573b5 100644 --- a/htdocs/langs/el_GR/accountancy.lang +++ b/htdocs/langs/el_GR/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Επιλέξτε τον τύπο επιστροφής ACCOUNTING_EXPORT_PREFIX_SPEC=Καθορίστε το πρόθεμα για το όνομα του αρχείου ThisService=Αυτή η υπηρεσία ThisProduct=Αυτό το προϊόν -DefaultForService=Προεπιλογή για υπηρεσία -DefaultForProduct=Προεπιλογή για προϊόν +DefaultForService=Προεπιλογή για υπηρεσίες +DefaultForProduct=Προεπιλογή για προϊόντα ProductForThisThirdparty=Προϊόν προς τρίτο μέρος ServiceForThisThirdparty=Υπηρεσία προς τρίτο μέρος CantSuggest=Δεν προτείνεται @@ -101,7 +101,8 @@ ShowAccountingAccount=Εμφάνιση λογαριασμού λογιστική ShowAccountingJournal=Εμφάνιση ημερολογίου λογιστικής ShowAccountingAccountInLedger=Εμφάνιση λογαριασμού λογιστικής στο καθολικό ShowAccountingAccountInJournals=Εμφάνιση λογαριασμού λογιστικής στα ημερολόγια -AccountAccountingSuggest=Προτεινόμενος λογαριασμός λογιστικής +DataUsedToSuggestAccount=Δεδομένα που χρησιμοποιούνται για την πρόταση λογαριασμού +AccountAccountingSuggest=Προτεινόμενος λογαριασμός MenuDefaultAccounts=Προεπιλεγμένοι λογαριασμοί MenuBankAccounts=Τραπεζικοί Λογαριασμοί MenuVatAccounts=Λογαριασμοί Φ.Π.Α. @@ -126,6 +127,7 @@ WriteBookKeeping=Καταγραφή συναλλαγών στη λογιστικ Bookkeeping=Καθολικό BookkeepingSubAccount=Βοηθητικό καθολικό AccountBalance=Ισοζύγιο λογαριασμού +AccountBalanceSubAccount=Υπόλοιπο υπολογαριασμών ObjectsRef=Αναφορά αντικειμένου προέλευσης CAHTF=Σύνολο αγορών προμηθευτών προ φόρων TotalExpenseReport=Σύνολο αναφοράς εξόδων @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Λογαριασμός (από το λογι UseAuxiliaryAccountOnCustomerDeposit=Αποθηκεύστε τον λογαριασμό πελάτη ως ατομικό λογαριασμό στο θυγατρικό καθολικό για γραμμές προκαταβολών (εάν απενεργοποιηθεί, ο ατομικός λογαριασμός για τις γραμμές προκαταβολών θα παραμείνει κενός) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Λογαριασμός (από το λογιστικό σχέδιο) που θα χρησιμοποιηθεί ως προεπιλογή UseAuxiliaryAccountOnSupplierDeposit=Αποθηκεύστε τον λογαριασμό προμηθευτή ως ατομικό λογαριασμό στο θυγατρικό καθολικό για γραμμές προκαταβολών (εάν απενεργοποιηθεί, ο ατομικός λογαριασμός για τις γραμμές προκαταβολών θα παραμείνει κενός) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Λογαριασμός λογιστικής από προεπιλογή για την εγγραφή της εγγύησης που δόθηκε από τον πελάτη ACCOUNTING_PRODUCT_BUY_ACCOUNT=Λογαριασμός (από το λογιστικό σχέδιο) που θα χρησιμοποιηθεί ως ο προεπιλεγμένος λογαριασμός για τα προϊόντα που αγοράστηκαν στην ίδια χώρα (χρησιμοποιείται εάν δεν ορίζεται στο φύλλο προϊόντος) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Λογαριασμός (από το λογιστικό σχέδιο) που θα χρησιμοποιηθεί ως προεπιλεγμένος λογαριασμός για τα προϊόντα που αγοράστηκαν από την Ε.Ε. σε άλλη χώρα της Ε.Ε. (χρησιμοποιείται εάν δεν ορίζεται στο φύλλο προϊόντος) @@ -217,7 +220,8 @@ Codejournal=Ημερολόγιο JournalLabel=Ετικέτα Ημερολογίου NumPiece=Αριθμός καταχώρησης TransactionNumShort=Αριθ. συναλλαγής -AccountingCategory=Custom group of accounts +AccountingCategory=Προσαρμοσμένη ομάδα λογαριασμών +AccountingCategories=Προσαρμοσμένες ομάδες λογαριασμών GroupByAccountAccounting=Ομαδοποίηση ανά λογαριασμό γενικού καθολικού GroupBySubAccountAccounting=Ομαδοποίηση ανά λογαριασμό βοηθητικού καθολικού AccountingAccountGroupsDesc=Μπορείτε να ορίσετε εδώ ορισμένες ομάδες λογιστικού λογαριασμού. Θα χρησιμοποιηθούν για εξατομικευμένες λογιστικές εκθέσεις. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Εμφάνιση υποσυνόλου ανά επίπεδο Pcgtype=Ομάδα του λογαριασμού PcgtypeDesc=Η ομάδα λογαριασμού χρησιμοποιείται ως προκαθορισμένο κριτήριο «φίλτρου» και «ομαδοποίησης» για ορισμένες λογιστικές αναφορές. Για παράδειγμα, «ΕΣΟΔΑ» ή «ΕΞΟΔΑ» χρησιμοποιούνται ως ομάδες λογιστικών λογαριασμών προϊόντων για τη δημιουργία της αναφοράς εξόδων / εσόδων. +AccountingCategoriesDesc=Η προσαρμοσμένη ομάδα λογαριασμών μπορεί να χρησιμοποιηθεί για την ομαδοποίηση λογιστικών λογαριασμών σε ένα όνομα για τη διευκόλυνση της χρήσης φίλτρου ή της δημιουργίας προσαρμοσμένων αναφορών. Reconcilable=Προς συμφωνία @@ -277,7 +282,7 @@ DescVentilDoneCustomer=Δείτε εδώ τη λίστα με τις γραμμ DescVentilTodoCustomer=Δεσμεύστε τις γραμμές τιμολογίου που δεν έχουν ήδη δεσμευθεί με έναν λογαριασμό προϊόντος από το λογιστικό σχέδιο ChangeAccount=Αλλάξτε τον λογαριασμό προϊόντος/υπηρεσίας (από το λογιστικό σχέδιο) για τις επιλεγμένες γραμμές με τον ακόλουθο λογαριασμό: Vide=- -DescVentilSupplier=Consult here the list of vendor invoice lines bound or not yet bound to a product account from chart of account (only record not already transfered in accountancy are visible) +DescVentilSupplier=Συμβουλευτείτε εδώ τη λίστα των γραμμών τιμολογίων προμηθευτή που είναι συνδεδεμένες ή δεν έχουν ακόμη δεσμευτεί σε λογαριασμό προϊόντος από το λογιστικό σχέδιο (μόνο το αρχείο που δεν έχει ήδη μεταφερθεί στη λογιστική είναι ορατό) DescVentilDoneSupplier=Συμβουλευτείτε εδώ τον κατάλογο των γραμμών των τιμολογίων προμηθευτών και του λογιστικού λογαριασμού τους DescVentilTodoExpenseReport=Δεσμεύστε τις γραμμές αναφοράς εξόδων που δεν έχουν ήδη δεσμευθεί με ένα Λογιστικός λογαριασμός αμοιβής DescVentilExpenseReport=Συμβουλευτείτε εδώ τον κατάλογο των γραμμών αναφοράς εξόδων που δεσμεύονται (ή όχι) σε ένα λογαριασμό λογιστικής αμοιβής @@ -294,6 +299,7 @@ DescValidateMovements=Απαγορεύεται οποιαδήποτε τροπο ValidateHistory=Δεσμεύστε αυτόματα AutomaticBindingDone=Ολοκληρώθηκαν οι αυτόματες δεσμεύσεις (%s) - Δεν είναι δυνατή η αυτόματη δέσμευση για κάποιες εγγραφές (%s) +DoManualBindingForFailedRecord=Πρέπει να κάνετε έναν χειροκίνητο σύνδεσμο για τις %s σειρές που δεν συνδέθηκαν αυτόματα. ErrorAccountancyCodeIsAlreadyUse=Σφάλμα, δεν μπορείτε να καταργήσετε ή να απενεργοποιήσετε αυτόν τον λογαριασμό του λογιστικού σχεδίου επειδή χρησιμοποιείται MvtNotCorrectlyBalanced=Η κίνηση δεν είναι σωστά ισοζυγισμένη. Χρέωση = %s & Πίστωση = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Απενεργοποίηση δέσμευσ ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Απενεργοποίηση δέσμευσης και μεταφοράς των αγορών στη λογιστική (τα τιμολόγια προμηθευτών δεν θα λαμβάνονται υπόψη στη λογιστική) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Απενεργοποίηση δέσμευσης και μεταφοράς των αναφορών εξόδων (στη λογιστική οι αναφορές εξόδων δεν θα ληφθούν υπόψη στη λογιστική) ACCOUNTING_ENABLE_LETTERING=Ενεργοποίηση της λειτουργίας συμφωνίας στη λογιστική +ACCOUNTING_ENABLE_AUTOLETTERING=Ενεργοποιήστε την αυτόματη συμφωνία κατά τη μεταφορά στη λογιστική ## Export NotExportLettering=Μην εξάγετε τη συμφωνία κατά τη δημιουργία του αρχείου NotifiedExportDate=Επισημάνετε τις εξαγόμενες γραμμές ως Εξαγόμενες (για να τροποποιήσετε μια γραμμή, θα χρειαστεί να διαγράψετε ολόκληρη τη συναλλαγή και να τη μεταφέρετε ξανά στη λογιστική) NotifiedValidationDate=Επικύρωση και Κλείδωμα των εξαγόμενων καταχωρήσεων (το ίδιο αποτέλεσμα με τη δυνατότητα "%s", η τροποποίηση και η διαγραφή των γραμμών ΣΙΓΟΥΡΑ δεν θα είναι δυνατή) +NotifiedExportFull=Εξαγωγή εγγράφων ; DateValidationAndLock=Ημερομηνία επικύρωσης και κλειδώματος ConfirmExportFile=Επιβεβαίωση δημιουργίας του λογιστικού αρχείου εξαγωγής ; ExportDraftJournal=Εξαγωγή προσχεδίου ημερολογίου @@ -398,7 +406,7 @@ SaleLocal=Τοπική πώληση SaleExport=Εξαγωγική πώληση SaleEEC=Πώληση στην Ε.Ε. SaleEECWithVAT=Πώληση στην Ε.Ε. με μη μηδενικό ΦΠΑ, άρα υποθέτουμε ότι ΔΕΝ πρόκειται για ενδοκοινοτική πώληση και ο προτεινόμενος λογαριασμός είναι ο τυπικός λογαριασμός προϊόντος. -SaleEECWithoutVATNumber=Πώληση στην Ε.Ε. χωρίς ΦΠΑ αλλά δεν έχει οριστεί το ΑΦΜ του τρίτου μέρους. Επιστρέφουμε στον λογαριασμό προϊόντος για τυπικές πωλήσεις. Μπορείτε να διορθώσετε το ΑΦΜ τρίτου μέρους ή τον λογαριασμό προϊόντος εάν χρειάζεται. +SaleEECWithoutVATNumber=Πώληση στην Ε.Ε. χωρίς ΦΠΑ αλλά χωρίς ΑΦΜ τρίτου. Επιστρέφουμε στον λογαριασμό για τυπικές πωλήσεις. Μπορείτε να διορθώσετε το ΑΦΜ του τρίτου μέρους ή να αλλάξετε τον λογαριασμό προϊόντος που προτείνεται για δέσμευση, εάν χρειάζεται. ForbiddenTransactionAlreadyExported=Απαγορευμένο: Η συναλλαγή έχει επικυρωθεί ή/και έχει εξαχθεί. ForbiddenTransactionAlreadyValidated=Απαγορευμένο: Η συναλλαγή έχει επικυρωθεί. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Αναντιστοιχία στον κώδι AccountancyErrorMismatchBalanceAmount=Το ισοζύγιο (%s) δεν είναι ίσο με 0 AccountancyErrorLetteringBookkeeping=Παρουσιάστηκαν σφάλματα σχετικά με τις συναλλαγές: %s ErrorAccountNumberAlreadyExists=Ο λογιστικός αριθμός %s υπάρχει ήδη +ErrorArchiveAddFile=Δεν είναι δυνατή η αρχειοθέτηση του αρχείου "%s" ## Import ImportAccountingEntries=Λογιστικές εγγραφές @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Κωδικός πολλαπλών νομισμάτω DateExport=Ημερομηνία εξαγωγής WarningReportNotReliable=Προειδοποίηση, αυτή η αναφορά δεν βασίζεται στο Καθολικό, επομένως δεν περιέχει συναλλαγή που τροποποιήθηκε χειροκίνητα στο Καθολικό. Εάν τα ημερολόγια σας είναι ενημερωμένα, η προβολή της λογιστικής είναι πιο ακριβής. ExpenseReportJournal=Ημερολόγιο Αναφοράς Εξόδων +DocsAlreadyExportedAreExcluded=Εξαιρούνται τα έγγραφα που έχουν ήδη εξαχθεί +ClickToHideAlreadyExportedLines=Κάντε κλικ για απόκρυψη γραμμών που έχουν ήδη εξαχθεί NAccounts= %s λογαριασμοί diff --git a/htdocs/langs/el_GR/admin.lang b/htdocs/langs/el_GR/admin.lang index f48ca6d0304..8e30b738283 100644 --- a/htdocs/langs/el_GR/admin.lang +++ b/htdocs/langs/el_GR/admin.lang @@ -547,7 +547,7 @@ Module2Desc=Εμπορική διαχείριση Module10Name=Λογιστική (απλουστευμένη) Module10Desc=Απλές λογιστικές αναφορές (ημερολόγια, κύκλος εργασιών) με βάση το περιεχόμενο της βάσης δεδομένων. Δεν χρησιμοποιεί κανένα πίνακα καθολικών. Module20Name=Προσφορές -Module20Desc=Διαχείριση εμπορικών προσφορών +Module20Desc=Διαχείριση προσφορών Module22Name=Μαζική αποστολή e-mail Module22Desc=Διαχείριση μαζικής αποστολής email Module23Name=Ενέργεια @@ -611,7 +611,7 @@ Module320Desc=Προσθέστε μια ροή RSS στις σελίδες Dolib Module330Name=Σελιδοδείκτες και συντομεύσεις Module330Desc=Δημιουργήστε συντομεύσεις, πάντα προσιτές, στις εσωτερικές ή εξωτερικές σελίδες στις οποίες έχετε συχνά πρόσβαση Module400Name=Έργα ή προοπτικές -Module400Desc=Διαχείριση έργων, προοπτικών/ευκαιριών ή/και εργασιών. Μπορείτε επίσης να αντιστοιχίσετε οποιοδήποτε στοιχείο (τιμολόγιο, παραγγελία, πρόταση, παρέμβαση, ...) σε ένα έργο και να λάβετε μια εγκάρσια προβολή από την προβολή έργου. +Module400Desc=Διαχείριση έργων, προοπτικών/ευκαιριών ή/και εργασιών. Μπορείτε επίσης να αντιστοιχίσετε οποιοδήποτε στοιχείο (τιμολόγιο, παραγγελία, προσφορά, παρέμβαση, ...) σε ένα έργο και να λάβετε μια εγκάρσια προβολή από την προβολή έργου. Module410Name=Ημερολόγιο ιστού Module410Desc=Ενσωμάτωση ημερολογίου ιστού Module500Name=Φόροι & Ειδικά Έξοδα @@ -645,6 +645,8 @@ Module2300Name=Προγραμματισμένες εργασίες Module2300Desc=Διαχείριση προγραμματισμένων εργασιών (alias cron ή chrono table) Module2400Name=Συμβάντα / Ατζέντα Module2400Desc=Παρακολούθηση συμβάντων. Καταγράψτε αυτόματα συμβάντα για σκοπούς παρακολούθησης ή καταγράψτε μη αυτόματα συμβάντα ή συσκέψεις. Αυτή είναι η κύρια ενότητα για την καλή διαχείριση σχέσεων πελατών ή προμηθευτών. +Module2430Name=Σύστημα Ημερολογίου Κρατήσεων +Module2430Desc=Ενα διαδικτυακό ημερολόγιο για να επιτρέψετε σε οποιονδήποτε να κάνει κράτηση για ραντεβού, σε προκαθορισμένα χρονικά περιθώρια ή διαθεσιμότητες. Module2500Name=DMS / ECM Module2500Desc=Σύστημα Διαχείρισης Εγγράφων / Ηλεκτρονική Διαχείριση Περιεχομένου. Αυτόματη οργάνωση των παραγόμενων ή αποθηκευμένων εγγράφων σας. Μοιραστείτε τα όταν χρειάζεστε. Module2600Name=API / Web services (SOAP server) @@ -660,6 +662,8 @@ Module2900Name=GeoIP Maxmind Module2900Desc=GeoIP Maxmind conversions capabilities Module3200Name=Αναλλοίωτα αρχεία Module3200Desc=Ενεργοποιήστε ένα αναλλοίωτο αρχείο καταγραφής επιχειρηματικών εκδηλώσεων. Τα συμβάντα αρχειοθετούνται σε πραγματικό χρόνο. Το αρχείο καταγραφής είναι ένας πίνακας μόνο για ανάγνωση των αλυσιδωτών συμβάντων που μπορούν να εξαχθούν. Αυτή η ενότητα μπορεί να είναι υποχρεωτική για ορισμένες χώρες. +Module3300Name=Module Builder +Module3200Desc=Ενεργοποιήστε ένα αναλλοίωτο αρχείο καταγραφής επιχειρηματικών εκδηλώσεων. Τα συμβάντα αρχειοθετούνται σε πραγματικό χρόνο. Το αρχείο καταγραφής είναι ένας πίνακας μόνο για ανάγνωση των αλυσιδωτών συμβάντων που μπορούν να εξαχθούν. Αυτή η ενότητα μπορεί να είναι υποχρεωτική για ορισμένες χώρες. Module3400Name=Κοινωνικά Δίκτυα Module3400Desc=Ενεργοποιήστε τα πεδία Κοινωνικών Δικτύων σε τρίτα μέρη και διευθύνσεις (skype, twitter, facebook, ...). Module4000Name=HRM @@ -708,13 +712,13 @@ Permission14=Επικύρωση τιμολογίων πελατών Permission15=Αποστολή τιμολογίων πελατών μέσω ηλεκτρονικού ταχυδρομείου Permission16=Δημιουργία πληρωμών για τιμολόγια πελατών Permission19=Διαγραφή τιμολογίων πελατών -Permission21=Ανάγνωση εμπορικών προτάσεων -Permission22=Δημιουργία / τροποποίηση εμπορικών προτάσεων -Permission24=Επικύρωση εμπορικών προτάσεων -Permission25=Αποστολή εμπορικών προτάσεων -Permission26=Κλείσιμο εμπορικών προτάσεων -Permission27=Διαγραφή εμπορικών προτάσεων -Permission28=Εξαγωγή εμπορικών προτάσεων +Permission21=Ανάγνωση προσφορών +Permission22=Δημιουργία / τροποποίηση προσφορών +Permission24=Επικύρωση προσφορών +Permission25=Αποστολή προσφορών +Permission26=Κλείσιμο προσφορών +Permission27=Διαγραφή προσφορών +Permission28=Εξαγωγή προσφορών Permission31=Ανάγνωση προϊόντων Permission32=Δημιουργία / τροποποίηση προϊόντων Permission33=Ανάγνωση τιμών προϊόντων @@ -833,7 +837,7 @@ PermissionAdvanced253=Δημιουργία / τροποποίηση εσωτερ Permission254=Δημιουργία / τροποποίηση μόνο εξωτερικών χρηστών Permission255=Τροποποίηση κωδικού πρόσβασης άλλων χρηστών Permission256=Διαγραφή ή απενεργοποίηση άλλων χρήστων -Permission262=Επέκταση της πρόσβασης σε όλα τα τρίτα μέρη ΚΑΙ τα αντικείμενά τους (όχι μόνο τρίτα μέρη για τα οποία ο χρήστης είναι αντιπρόσωπος πωλήσεων).
    Δεν είναι αποτελεσματικό για εξωτερικούς χρήστες (περιορίζονται πάντα στους εαυτούς τους για προτάσεις, παραγγελίες, τιμολόγια, συμβάσεις κ.λπ.).
    Δεν ισχύει για έργα (μόνο σε κανόνες για τις άδειες έργων, την προβολή και τα θέματα ανάθεσης). +Permission262=Επέκταση της πρόσβασης σε όλα τα τρίτα μέρη ΚΑΙ τα αντικείμενά τους (όχι μόνο τρίτα μέρη για τα οποία ο χρήστης είναι αντιπρόσωπος πωλήσεων).
    Δεν είναι αποτελεσματικό για εξωτερικούς χρήστες (περιορίζονται πάντα στους εαυτούς τους για προσφορές, παραγγελίες, τιμολόγια, συμβάσεις κ.λπ.).
    Δεν ισχύει για έργα (μόνο σε κανόνες για τις άδειες έργων, την προβολή και τα θέματα ανάθεσης). Permission263=Επέκταση της πρόσβασης σε όλα τα τρίτα μέρη ΧΩΡΙΣ τα αντικείμενά τους (όχι μόνο τρίτα μέρη για τα οποία ο χρήστης είναι αντιπρόσωπος πωλήσεων).
    Δεν είναι αποτελεσματικό για εξωτερικούς χρήστες (περιορίζονται πάντα στους εαυτούς τους για προτάσεις, παραγγελίες, τιμολόγια, συμβάσεις κ.λπ.).
    Δεν ισχύει για έργα (μόνο σε κανόνες για τις άδειες έργων, την προβολή και τα θέματα ανάθεσης). Permission271=Ανάγνωση CA Permission272=Ανάγνωση τιμολογίων @@ -1270,6 +1274,7 @@ TriggerActiveAsModuleActive=Τα triggers σε αυτό το αρχείο είν GeneratedPasswordDesc=Επιλέξτε τη μέθοδο που θα χρησιμοποιηθεί για κωδικούς πρόσβασης που δημιουργούνται αυτόματα. DictionaryDesc=Εισάγετε όλα τα δεδομένα αναφοράς. Μπορείτε να προσθέσετε τις τιμές σας στην προεπιλογή. ConstDesc=Αυτή η σελίδα επιτρέπει την επεξεργασία (αντικατάσταση) παραμέτρων που δεν είναι διαθέσιμες σε άλλες σελίδες. Αυτές είναι κυρίως δεσμευμένες παράμετροι για προγραμματιστές/ προχωρημένη αντιμετώπιση προβλημάτων μόνο. +MiscellaneousOptions=Διάφορες επιλογές MiscellaneousDesc=Όλες οι άλλες παράμετροι που σχετίζονται με την ασφάλεια ορίζονται εδώ. LimitsSetup=Ρύθμιση Ορίων/Ακριβείας LimitsDesc=Μπορείτε να ορίσετε όρια, ακρίβεια και βελτιστοποιήσεις που χρησιμοποιούνται από το Dolibarr εδώ @@ -1445,9 +1450,9 @@ SuppliersPayment=Πληρωμές προμηθευτών SupplierPaymentSetup=Ρύθμιση πληρωμών προμηθευτή InvoiceCheckPosteriorDate=Ελέγξτε την ημερομηνία του παραστατικού πριν από την επικύρωση InvoiceCheckPosteriorDateHelp=Η επικύρωση ενός τιμολογίου θα απαγορεύεται εάν η ημερομηνία του είναι προγενέστερη από την ημερομηνία του τελευταίου τιμολογίου του ίδιου τύπου. -InvoiceOptionCategoryOfOperations=Display the mention "category of operations" on the invoice. -InvoiceOptionCategoryOfOperationsHelp=Depending on the situation, the mention will appear in the form:
    - Category of operations: Delivery of goods
    - Category of operations: Provision of services
    - Category of operations: Mixed - Delivery of goods & provision of services -InvoiceOptionCategoryOfOperationsYes1=Yes, below the address block +InvoiceOptionCategoryOfOperations=Εμφάνιση της αναφοράς «κατηγορία πράξεων» στο τιμολόγιο. +InvoiceOptionCategoryOfOperationsHelp=Ανάλογα με την κατάσταση, η αναφορά θα εμφανίζεται με τη μορφή:
    - Κατηγορία πράξεων: Παράδοση αγαθών
    - Κατηγορία πράξεων: Παροχή υπηρεσιών
    - Κατηγορία πράξεων: Μικτή Παράδοση αγαθών & Παροχή υπηρεσιών +InvoiceOptionCategoryOfOperationsYes1=Ναι, κάτω από το μπλοκ διευθύνσεων InvoiceOptionCategoryOfOperationsYes2=Ναι, στην κάτω αριστερή γωνία ##### Proposals ##### PropalSetup=Ρύθμιση ενότητας εμπορικών προσφορών @@ -1758,7 +1763,7 @@ ActivateFCKeditor=Ενεργοποιήστε το προηγμένο πρόγρ FCKeditorForNotePublic=WYSIWYG δημιουργία/έκδοση του πεδίου «δημόσιες σημειώσεις» στοιχείων FCKeditorForNotePrivate=WYSIWYG δημιουργία/έκδοση του πεδίου "ιδιωτικές σημειώσεις" στοιχείων FCKeditorForCompany=WYSIWYG δημιουργία/έκδοση της περιγραφής πεδίου στοιχείων (εκτός προϊόντων/υπηρεσιών) -FCKeditorForProductDetails=WYSIWIG δημιουργία/διόρθωση περιγραφής προϊόντων ή γραμμών για αντικείμενα (γραμμές προσφορών, παραγγελίες, τιμολόγια κ.λπ...). +FCKeditorForProductDetails=WYSIWYG δημιουργία/διόρθωση περιγραφής προϊόντων ή γραμμών για αντικείμενα (γραμμές προσφορών, παραγγελίες, τιμολόγια κ.λπ...). FCKeditorForProductDetails2=Προειδοποίηση: Η χρήση αυτής της επιλογής για αυτήν την περίπτωση δεν συνιστάται, καθώς μπορεί να δημιουργήσει προβλήματα με ειδικούς χαρακτήρες και τη μορφοποίηση σελίδας κατά τη δημιουργία αρχείων PDF. FCKeditorForMailing= Δημιουργία / έκδοση WYSIWYG για μαζικά eMailings (Εργαλεία-> eMailing) FCKeditorForUserSignature=WYSIWYG δημιουργία/έκδοση υπογραφής χρήστη @@ -1826,6 +1831,9 @@ AGENDA_USE_EVENT_TYPE=Χρήση τύπων συμβάντων (διαχείρι AGENDA_USE_EVENT_TYPE_DEFAULT=Αυτόματη ρύθμιση αυτής της προεπιλεγμένης τιμής για τον τύπο συμβάντος στη φόρμα δημιουργίας συμβάντος AGENDA_DEFAULT_FILTER_TYPE=Αυτόματη ρύθμιση αυτού του τύπου συμβάντος στο φίλτρο αναζήτησης της προβολής ατζέντας AGENDA_DEFAULT_FILTER_STATUS=Αυτόματη ρύθμιση αυτής της κατάστασης για συμβάντα στο φίλτρο αναζήτησης της προβολής ατζέντας +AGENDA_EVENT_PAST_COLOR=Χρώμα παρελθόντος συμβάντος +AGENDA_EVENT_CURRENT_COLOR=Χρώμα τρέχοντος συμβάντος +AGENDA_EVENT_FUTURE_COLOR=Χρώμα μελλοντικής εκδήλωσης AGENDA_DEFAULT_VIEW=Ποια προβολή θέλετε να ανοίγετε από προεπιλογή όταν επιλέγετε το μενού Ατζέντα AGENDA_REMINDER_BROWSER=Ενεργοποίηση υπενθύμισης συμβάντος στο πρόγραμμα περιήγησης του χρήστη (Όταν φτάσει η ημερομηνία υπενθύμισης, εμφανίζεται ένα αναδυόμενο παράθυρο από το πρόγραμμα περιήγησης. Κάθε χρήστης μπορεί να απενεργοποιήσει τέτοιες ειδοποιήσεις από τη ρύθμιση ειδοποιήσεων του προγράμματος περιήγησης του). AGENDA_REMINDER_BROWSER_SOUND=Ενεργοποίηση ειδοποίησης ήχου @@ -2129,6 +2137,7 @@ CodeLastResult=Κωδικός Τελευταίου αποτελέσματος NbOfEmailsInInbox=Αριθμός email στον κατάλογο προέλευσης LoadThirdPartyFromName=Φόρτωση αναζήτησης τρίτου μέρους στο %s (μόνο φόρτωση) LoadThirdPartyFromNameOrCreate=Φόρτωση αναζήτησης τρίτου μέρους στο %s (δημιουργία αν δεν βρεθεί) +LoadContactFromEmailOrCreate=Φόρτωση αναζήτησης επαφής στο %s (δημιουργία αν δεν βρεθεί) AttachJoinedDocumentsToObject=Αποθηκεύστε τα συνημμένα αρχεία σε έγγραφα αντικειμένων εάν βρεθεί μια αναφορά ενός αντικειμένου στο θέμα του email. WithDolTrackingID=Μήνυμα από μια συνομιλία που ξεκίνησε από ένα πρώτο email που στάλθηκε από το Dolibarr WithoutDolTrackingID=Μήνυμα από μια συνομιλία που ξεκίνησε από ένα πρώτο email που ΔΕΝ εστάλη από το Dolibarr @@ -2355,3 +2364,5 @@ AllowExternalDownload=Να επιτρέπεται εξωτερική λήψη ( DeadlineDayVATSubmission=Προθεσμία υποβολής ΦΠΑ για τον επόμενο μήνα MaxNumberOfAttachementOnForms=Μέγιστος αριθμός επισυναπτόμενων αρχείων σε μια φόρμα IfDefinedUseAValueBeetween=Εάν ορίζεται, χρησιμοποιήστε μια τιμή μεταξύ %s και %s +Reload=Επαναφόρτωση +ConfirmReload=Επιβεβαίωση επαναφόρτωσης της μονάδας diff --git a/htdocs/langs/el_GR/bills.lang b/htdocs/langs/el_GR/bills.lang index 8fed9327ac5..3f07afff034 100644 --- a/htdocs/langs/el_GR/bills.lang +++ b/htdocs/langs/el_GR/bills.lang @@ -627,7 +627,7 @@ SendEmailsRemindersOnInvoiceDueDate=Αποστολή υπενθύμισης μέ MakePaymentAndClassifyPayed=Καταγραφή πληρωμής BulkPaymentNotPossibleForInvoice=Δεν είναι δυνατή η μαζική πληρωμή για το τιμολόγιο %s (λάθος τύπος ή κατάσταση) MentionVATDebitOptionIsOn=Δυνατότητα πληρωμής φόρου βάσει χρεώσεων -MentionCategoryOfOperations=Category of operations +MentionCategoryOfOperations=Κατηγορία πράξεων MentionCategoryOfOperations0=Διανομή αγαθών MentionCategoryOfOperations1=Παροχή υπηρεσιών -MentionCategoryOfOperations2=Mixed - Delivery of goods & provision of services +MentionCategoryOfOperations2=Μικτή - Παράδοση αγαθών & παροχή υπηρεσιών diff --git a/htdocs/langs/el_GR/boxes.lang b/htdocs/langs/el_GR/boxes.lang index c3728d5600e..03f769b4c26 100644 --- a/htdocs/langs/el_GR/boxes.lang +++ b/htdocs/langs/el_GR/boxes.lang @@ -9,7 +9,7 @@ BoxLastSupplierBills=Τελευταία τιμολόγια προμηθευτή BoxLastCustomerBills=Τελευταία τιμολόγια πελατών BoxOldestUnpaidCustomerBills=Παλαιότερα μη πληρωμένα τιμολόγια πελατών BoxOldestUnpaidSupplierBills=Παλαιότερα μη πληρωμένα τιμολόγια προμηθευτών -BoxLastProposals=Τελευταίες εμπορικές προτάσεις +BoxLastProposals=Τελευταίες προσφορές BoxLastProspects=Τελευταίες τροποποιημένες προοπτικές BoxLastCustomers=Τελευταίοι τροποποιημένοι πελάτες BoxLastSuppliers=Τελευταίοι τροποποιημένοι προμηθευτές @@ -24,6 +24,7 @@ BoxFicheInter=Τελευταίες παρεμβάσεις BoxCurrentAccounts=Ισοζύγιο ανοιχτών λογαριασμών BoxTitleMemberNextBirthdays=Γενέθλια αυτού του μήνα (μέλη) BoxTitleMembersByType=Μέλη ανά τύπο και κατάσταση +BoxTitleMembersByTags=Μέλη ανά ετικέτα και κατάσταση BoxTitleMembersSubscriptionsByYear=Συνδρομές μελών ανά έτος BoxTitleLastRssInfos=Τα τελευταία %s νέα από %s BoxTitleLastProducts=Προϊόντα / Υπηρεσίες: τελευταία %s τροποποιημένα diff --git a/htdocs/langs/el_GR/commercial.lang b/htdocs/langs/el_GR/commercial.lang index 746c112fe41..8d91921c35b 100644 --- a/htdocs/langs/el_GR/commercial.lang +++ b/htdocs/langs/el_GR/commercial.lang @@ -50,7 +50,7 @@ ActionAffectedTo=Η ενέργεια αφορά τον/την ActionDoneBy=Η ενέργεια έγινε από τον/την ActionAC_TEL=Τηλεφώνημα ActionAC_FAX=Αποστολή fax -ActionAC_PROP=Αποστολή προσφορας με email +ActionAC_PROP=Αποστολή προσφοράς με email ActionAC_EMAIL=Αποστολή email ActionAC_EMAIL_IN=Λήψη email ActionAC_RDV=Συναντήσεις @@ -74,8 +74,16 @@ StatusProsp=Κατάσταση προοπτικής DraftPropals=Προσχέδιο προσφορών NoLimit=Κανένα όριο ToOfferALinkForOnlineSignature=Σύνδεσμος για ηλεκτρονική υπογραφή -WelcomeOnOnlineSignaturePage=Καλώς ήρθατε στη σελίδα αποδοχής εμπορικών προτάσεων από %s -ThisScreenAllowsYouToSignDocFrom=Αυτή η οθόνη σάς επιτρέπει να αποδεχτείτε και να υπογράψετε ή να αρνηθείτε μια προσφορά -ThisIsInformationOnDocumentToSign=Αυτές είναι οι πληροφορίες σχετικά με το έγγραφο προς αποδοχή ή απορρίψη +WelcomeOnOnlineSignaturePageProposal=Καλώς ήρθατε στη σελίδα αποδοχής εμπορικών προσφορών από %s +WelcomeOnOnlineSignaturePageContract=Καλώς ορίσατε στη σελίδα υπογραφής PDF της σύμβασης %s +WelcomeOnOnlineSignaturePageFichinter=Καλώς ορίσατε στη σελίδα υπογραφής PDF της παρέμβασης %s +ThisScreenAllowsYouToSignDocFromProposal=Αυτή η οθόνη σάς επιτρέπει να αποδεχτείτε και να υπογράψετε ή να αρνηθείτε μια προσφορά +ThisScreenAllowsYouToSignDocFromContract=Αυτή η οθόνη σάς επιτρέπει την online υπογραφή σύμβασης σε μορφή PDF. +ThisScreenAllowsYouToSignDocFromFichinter=Αυτή η οθόνη σάς επιτρέπει να υπογράψετε διαδικτυακή παρέμβαση σε μορφή PDF. +ThisIsInformationOnDocumentToSignProposal=Αυτές είναι οι πληροφορίες σχετικά με το έγγραφο προς αποδοχή ή απόρριψη +ThisIsInformationOnDocumentToSignContract=Αυτές είναι πληροφορίες για την σύμβαση προς υπογραφή +ThisIsInformationOnDocumentToSignFichinter=Αυτές είναι πληροφορίες σχετικά με την παρέμβαση προς υπογραφή SignatureProposalRef=Υπογραφή προσφοράς / εμπορικής πρότασης %s +SignatureContractRef=Υπογραφή σύμβασης %s +SignatureFichinterRef=Υπογραφή παρέμβασης %s FeatureOnlineSignDisabled=Η δυνατότητα για ηλεκτρονική υπογραφή απενεργοποιήθηκε ή δημιουργήθηκε έγγραφο πριν από την ενεργοποίηση της δυνατότητας diff --git a/htdocs/langs/el_GR/companies.lang b/htdocs/langs/el_GR/companies.lang index 661a9fe9688..3ec8674c6ba 100644 --- a/htdocs/langs/el_GR/companies.lang +++ b/htdocs/langs/el_GR/companies.lang @@ -53,7 +53,7 @@ RegisteredOffice=Έδρα της εταιρείας Lastname=Επίθετο Firstname=Όνομα RefEmployee=Κωδικός εργαζομένου -NationalRegistrationNumber=National registration number +NationalRegistrationNumber=Εθνικός αριθμός μητρώου PostOrFunction=Θέση εργασίας UserTitle=Τίτλος NatureOfThirdParty=Φύση του τρίτου μέρους @@ -103,8 +103,8 @@ LocalTax2IsUsedES= IRPF is used LocalTax2IsNotUsedES= IRPF is not used WrongCustomerCode=Άκυρος κωδικός πελάτη WrongSupplierCode=Άκυρος κωδικός προμηθευτή -CustomerCodeModel=Μοντέλο κωδικού πελάτη -SupplierCodeModel=Μοντέλο κωδικού προμηθευτή +CustomerCodeModel=Υπόδειγμα κωδικού πελάτη +SupplierCodeModel=Υπόδειγμα κωδικού προμηθευτή Gencod=Barcode GencodBuyPrice=Barcode αναφοράς τιμής ##### Professional ID ##### @@ -312,12 +312,12 @@ CustomerRelativeDiscountShort=Σχετική έκπτωση CustomerAbsoluteDiscountShort=Απόλυτη έκπτωση CompanyHasRelativeDiscount=Αυτός ο πελάτης έχει προεπιλεγμένη έκπτωση %s%% CompanyHasNoRelativeDiscount=Αυτός ο πελάτης δεν έχει σχετική έκπτωση από προεπιλογή -HasRelativeDiscountFromSupplier=Έχετε προεπιλεγμένη έκπτωση %s%% από αυτόν τον προμηθευτή -HasNoRelativeDiscountFromSupplier=Δεν έχετε προεπιλεγμένη σχετική έκπτωση από αυτόν τον προμηθευτή +HasRelativeDiscountFromSupplier=Έχετε μια προεπιλεγμένη έκπτωση %s%% από αυτόν τον προμηθευτή +HasNoRelativeDiscountFromSupplier=Δεν υπάρχει προεπιλεγμένη σχετική έκπτωση από αυτόν τον προμηθευτή CompanyHasAbsoluteDiscount=Αυτός ο πελάτης έχει διαθέσιμες εκπτώσεις (πιστωτικές σημειώσεις ή προκαταβολές) για %s %s CompanyHasDownPaymentOrCommercialDiscount=Αυτός ο πελάτης έχει διαθέσιμες εκπτώσεις (εμπορικές, προκαταβολές) για %s %s CompanyHasCreditNote=Αυτός ο πελάτης έχει ακόμα πιστωτικές σημειώσεις για %s %s -HasNoAbsoluteDiscountFromSupplier=Δεν έχετε διαθέσιμη πίστωση έκπτωσης από αυτόν τον προμηθευτή +HasNoAbsoluteDiscountFromSupplier=Δεν διατίθεται έκπτωση/πίστωση από αυτόν τον προμηθευτή HasAbsoluteDiscountFromSupplier=Έχετε διαθέσιμες εκπτώσεις (πιστωτικές σημειώσεις ή προκαταβολές) για %s %s από αυτόν τον προμηθευτή HasDownPaymentOrCommercialDiscountFromSupplier=Έχετε διαθέσιμες εκπτώσεις (εμπορικές, προκαταβολές) για %s %s από αυτόν τον προμηθευτή HasCreditNoteFromSupplier=Έχετε πιστωτικές σημειώσεις για %s %s από αυτόν τον προμηθευτή @@ -444,7 +444,7 @@ AddAddress=Προσθήκη διεύθυνσης SupplierCategory=Κατηγορία προμηθευτή JuridicalStatus200=Ανεξάρτητος DeleteFile=Διαγραφή Αρχείου -ConfirmDeleteFile=Είστε σίγουροι ότι θέλετε να διαγράψετε το αρχείο; +ConfirmDeleteFile=Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το αρχείο %s ; AllocateCommercial=Ανατέθηκε σε αντιπρόσωπο πωλήσεων Organization=Οργανισμός FiscalYearInformation=Οικονομικό έτος @@ -498,3 +498,8 @@ RestOfEurope=Υπόλοιπη Ευρώπη (ΕΕ) OutOfEurope=Εκτός Ευρώπης (ΕΕ) CurrentOutstandingBillLate=Καθυστερημένος ανεξόφλητος λογαριασμός BecarefullChangeThirdpartyBeforeAddProductToInvoice=Προσοχή, ανάλογα με τις ρυθμίσεις τιμής του προϊόντος σας, θα πρέπει να αλλάξετε το Τρίτο Μέρος πριν προσθέσετε το προϊόν στο POS. +EmailAlreadyExistsPleaseRewriteYourCompanyName=Το email υπάρχει ήδη, ξαναγράψτε το όνομα της εταιρείας σας +TwoRecordsOfCompanyName=υπάρχουν περισσότερες από μια εγγραφή για αυτήν την εταιρεία, επικοινωνήστε μαζί μας για να ολοκληρώσετε το αίτημα συνεργασίας σας +CompanySection=Τμήμα εταιρείας +ShowSocialNetworks=Εμφάνιση κοινωνικών δικτύων +HideSocialNetworks=Απόκρυψη κοινωνικών δικτύων diff --git a/htdocs/langs/el_GR/errors.lang b/htdocs/langs/el_GR/errors.lang index 6b3bd6c7ef3..89f518ceea0 100644 --- a/htdocs/langs/el_GR/errors.lang +++ b/htdocs/langs/el_GR/errors.lang @@ -303,6 +303,7 @@ ErrorValueForTooLow=Η τιμή για %s είναι πολύ χαμη ErrorValueCantBeNull=Η τιμή για %s δεν μπορεί να είναι μηδενική ErrorDateOfMovementLowerThanDateOfFileTransmission=Η ημερομηνία της τραπεζικής συναλλαγής δεν μπορεί να είναι παλαιότερη από την ημερομηνία αποστολής του αρχείου ErrorTooMuchFileInForm=Πάρα πολλά αρχεία στην φόρμα, ο μέγιστος αριθμός είναι %s αρχεία +ErrorSessionInvalidatedAfterPasswordChange=Η συνεδρία ακυρώθηκε μετά από αλλαγή κωδικού πρόσβασης, κατάστασης ή ημερομηνιών εγκυρότητας. Παρακαλώ συνδεθείτε ξανά. # Warnings WarningParamUploadMaxFileSizeHigherThanPostMaxSize=Η παράμετρος PHP upload_max_filesize (%s) είναι υψηλότερη από την παράμετρο PHP post_max_size (%s). Αυτή δεν είναι μια συνεπής ρύθμιση. @@ -325,6 +326,7 @@ WarningPaymentDateLowerThanInvoiceDate=Η ημερομηνία πληρωμής WarningTooManyDataPleaseUseMoreFilters=Πάρα πολλά δεδομένα (περισσότερες από %sγραμμές). Χρησιμοποιήστε περισσότερα φίλτρα ή ορίστε τη σταθερά %s σε υψηλότερο όριο. WarningSomeLinesWithNullHourlyRate=Κάποιοι χρόνοι καταγράφηκαν από ορισμένους χρήστες ενώ η ωριαία τιμή τους δεν είχε καθοριστεί. Χρησιμοποιήθηκε μια τιμή 0 %s ανά ώρα, αλλά αυτό μπορεί να οδηγήσει σε λανθασμένη εκτίμηση του χρόνου που δαπανήθηκε. WarningYourLoginWasModifiedPleaseLogin=Η σύνδεσή σας τροποποιήθηκε. Για λόγους ασφαλείας θα πρέπει να συνδεθείτε με τη νέα σας σύνδεση πριν από την επόμενη ενέργεια. +WarningYourPasswordWasModifiedPleaseLogin=Ο κωδικός πρόσβασης σας τροποποιήθηκε. Για λόγους ασφαλείας θα πρέπει να συνδεθείτε τώρα με τον νέο σας κωδικό πρόσβασης. WarningAnEntryAlreadyExistForTransKey=Υπάρχει ήδη μια καταχώριση για το κλειδί μετάφρασης για αυτήν τη γλώσσα WarningNumberOfRecipientIsRestrictedInMassAction=Προειδοποίηση, ο αριθμός διαφορετικών παραληπτών περιορίζεται σε %s όταν χρησιμοποιείτε τις μαζικές ενέργειες σε λίστες WarningDateOfLineMustBeInExpenseReportRange=Προειδοποίηση, η ημερομηνία γραμμής δεν είναι στο εύρος της αναφοράς εξόδων diff --git a/htdocs/langs/el_GR/eventorganization.lang b/htdocs/langs/el_GR/eventorganization.lang index 323f4f14049..1788d3d80bf 100644 --- a/htdocs/langs/el_GR/eventorganization.lang +++ b/htdocs/langs/el_GR/eventorganization.lang @@ -172,3 +172,5 @@ ErrorSeveralCompaniesWithEmailContactUs=Έχουν βρεθεί πολλές ε ErrorSeveralCompaniesWithNameContactUs=Έχουν βρεθεί πολλές εταιρείες με αυτό το όνομα, επομένως δεν μπορούμε να επικυρώσουμε αυτόματα την εγγραφή σας. Παρακαλώ επικοινωνήστε μαζί μας στο %s NoPublicActionsAllowedForThisEvent=Καμία δημόσια δράση δεν είναι ανοιχτή στο κοινό για αυτήν την εκδήλωση MaxNbOfAttendees=Μέγιστος αριθμός συμμετεχόντων +DateStartEvent=Ημερομηνία έναρξης εκδήλωσης +DateEndEvent=Ημερομηνία λήξης εκδήλωσης diff --git a/htdocs/langs/el_GR/holiday.lang b/htdocs/langs/el_GR/holiday.lang index 63b8a5d3c3b..5369f65d7b8 100644 --- a/htdocs/langs/el_GR/holiday.lang +++ b/htdocs/langs/el_GR/holiday.lang @@ -1,9 +1,11 @@ # Dolibarr language file - Source file is en_US - holiday HRM=HRM -Holidays=Αδεια +Holidays=Άδειες +Holiday=Άδεια CPTitreMenu=Αδεια MenuReportMonth=Μηνιαία αναφορά MenuAddCP=Νέα αίτηση άδειας +MenuCollectiveAddCP=Νέα αίτηση συλλογικής άδειας NotActiveModCP=Πρέπει να ενεργοποιήσετε την ενότητα Άδειες για να δείτε αυτήν τη σελίδα. AddCP=Κάντε αίτηση άδειας DateDebCP=Ημερ. έναρξης @@ -19,10 +21,10 @@ Leave=Αίτημα άδειας LeaveId=Αναγνωριστικό άδειας ReviewedByCP=Θα εγκριθεί από UserID=Αναγνωριστικό χρήστη -UserForApprovalID=Χρήστη για αναγνωριστικό έγκρισης -UserForApprovalFirstname=Όνομα του χρήστη της έγκρισης -UserForApprovalLastname=Επώνυμο του χρήστη της έγκρισης -UserForApprovalLogin=Σύνδεση χρήστη έγκρισης +UserForApprovalID=Αναγνωριστικό Χρήστη έγκρισης +UserForApprovalFirstname=Όνομα χρήστη έγκρισης +UserForApprovalLastname=Επώνυμο του χρήστη έγκρισης +UserForApprovalLogin=Όνομα σύνδεσης χρήστη έγκρισης DescCP=Περιγραφή SendRequestCP=Δημιουργία αιτήματος άδειας DelayToRequestCP=Τα αιτήματα αδείας πρέπει να υποβάλλονται τουλάχιστον %s ημέρα(ες) πριν από αυτές. @@ -56,6 +58,7 @@ ConfirmDeleteCP=Επιβεβαίωση διαγραφής αυτής της αί ErrorCantDeleteCP=Σφάλμα δεν έχετε το δικαίωμα να διαγράψετε αυτό το αίτημα άδειας. CantCreateCP=Δεν έχετε το δικαίωμα να κάνετε αιτήματα άδειας. InvalidValidatorCP=Πρέπει να επιλέξεις τον προϊστάμενο για την αίτηση άδειας σου. +InvalidValidator=Ο χρήστης που επιλέχθηκε δεν είναι υπεύθυνος έγκρισης. NoDateDebut=Πρέπει να επιλέξετε μια ημερομηνία έναρξης. NoDateFin=Πρέπει να επιλέξετε μια ημερομηνία λήξης. ErrorDureeCP=Η αίτηση άδειας δεν περιέχει εργάσιμες ημέρες @@ -73,12 +76,14 @@ DetailRefusCP=Λόγος για την απόρριψη DateRefusCP=Ημερομηνία απόρριψης DateCancelCP=Ημερομηνία ακύρωσης DefineEventUserCP=Αναθέστε μια έκτακτη άδεια για έναν χρήστη -addEventToUserCP=Αφήστε την ανάθεση +addEventToUserCP=Έγκριση άδειας NotTheAssignedApprover=Δεν είστε ο εκχωρημένος υπεύθυνος έγκρισης MotifCP=Λόγος UserCP=Χρήστης ErrorAddEventToUserCP=Παρουσιάστηκε σφάλμα κατά την προσθήκη τις έκτακτης άδειας. AddEventToUserOkCP=Η προσθήκη της έκτακτης άδειας έχει ολοκληρωθεί. +ErrorFieldRequiredUserOrGroup=Πρέπει να συμπληρωθεί το πεδίο "ομάδα" ή το πεδίο "χρήστης". +fusionGroupsUsers=Το πεδίο ομάδων και το πεδίο χρήστη θα συγχωνευθούν MenuLogCP=Εμφάνιση καταγραφής αλλαγών LogCP=Αρχείο καταγραφής όλων των ενημερώσεων που έγιναν στο "Υπόλοιπο άδειας" ActionByCP=Ενημερώθηκε από @@ -86,6 +91,13 @@ UserUpdateCP=Ενημερώθηκε για PrevSoldeCP=Προηγούμενο Υπόλοιπο NewSoldeCP=Νέο υπόλοιπο alreadyCPexist=Υπάρχει ήδη αίτηση άδειας για αυτήν τη περίοδο. +UseralreadyCPexist=Ένα αίτημα άδειας έχει ήδη γίνει σε αυτήν την περίοδο για το %s. +groups=Ομάδες +users=Χρήστες +AutoSendMail=Αυτόματη αποστολή αλληλογραφίας +NewHolidayForGroup=Νέο αίτημα συλλογικής άδειας +SendRequestCollectiveCP=Αποστολή αιτήματος συλλογικής άδειας +AutoValidationOnCreate=Αυτόματη επικύρωση FirstDayOfHoliday=Πρώτη μέρα άδειας LastDayOfHoliday=Τελευταία μέρα άδειας BoxTitleLastLeaveRequests=Τελευταία %sτροποποιημένα αιτήματα άδειας @@ -117,11 +129,11 @@ HolidaysToValidateBody=Παρακάτω είναι ένα αίτημα άδει HolidaysToValidateDelay=Αυτή η αίτηση άδειας θα πραγματοποιηθεί εντός περιόδου μικρότερης των %s ημερών. HolidaysToValidateAlertSolde=Ο χρήστης που έκανε αυτήν την αίτηση άδειας δεν έχει αρκετές διαθέσιμες ημέρες. HolidaysValidated=Επικυρωμένα αιτήματα άδειας -HolidaysValidatedBody=Η αίτηση αδείας %s στο %s έχει επικυρωθεί. +HolidaysValidatedBody=Το αίτημά σας για άδεια από %s έως %s έχει επικυρωθεί. HolidaysRefused=Το αίτημα απορρίφθηκε HolidaysRefusedBody=Το αίτημα άδειας για %s στο %s απορρίφθηκε για τον ακόλουθο λόγο: HolidaysCanceled=Ακυρωμένο αίτημα αδείας -HolidaysCanceledBody=Η αίτηση αδείας σας για %s στο %s έχει ακυρωθεί. +HolidaysCanceledBody=Το αίτημά σας για άδεια από %s έως %s ακυρώθηκε. FollowedByACounter=1: Αυτό το είδος άδειας πρέπει να ακολουθείται από μετρητή. Ο μετρητής αυξάνεται χειροκίνητα ή αυτόματα και όταν επικυρωθεί ένα αίτημα άδειας, ο μετρητής μειώνεται.
    0: Δεν ακολουθείται από μετρητή. NoLeaveWithCounterDefined=Δεν έχουν οριστεί τύποι άδειας που πρέπει να ακολουθούνται από μετρητή GoIntoDictionaryHolidayTypes=Πηγαίνετε στο Αρχικη - Ρυθμίσεις - Λεξικά - Τύπος άδειας για τη ρύθμιση των διαφορετικών τύπων αδειών. @@ -131,9 +143,16 @@ TemplatePDFHolidays=Πρότυπο PDF για αιτήματα άδειας FreeLegalTextOnHolidays=Ελεύθερο κείμενο σε pdf WatermarkOnDraftHolidayCards=Υδατογραφήματα σε προσχέδια αιτημάτων αδείας HolidaysToApprove=Διακοπές προς έγκριση -NobodyHasPermissionToValidateHolidays=Κανείς δεν έχει άδεια να επικυρώσει διακοπές -HolidayBalanceMonthlyUpdate=Μηνιαία ενημέρωση του υπολοιπου των εορτών +NobodyHasPermissionToValidateHolidays=Κανείς δεν έχει άδεια να επικυρώσει αιτήματα άδειας +HolidayBalanceMonthlyUpdate=Μηνιαία ενημέρωση υπολοίπου άδειας XIsAUsualNonWorkingDay=Η %s είναι συνήθως ΜΗ εργάσιμη ημέρα BlockHolidayIfNegative=Αποκλεισμός εάν το υπόλοιπο είναι αρνητικό LeaveRequestCreationBlockedBecauseBalanceIsNegative=Η δημιουργία αυτού του αιτήματος άδειας έχει αποκλειστεί επειδή το υπόλοιπό σας είναι αρνητικό ErrorLeaveRequestMustBeDraftCanceledOrRefusedToBeDeleted=Το αίτημα αδείας%s πρέπει να είναι προσχέδιο, ακυρωμένο ή απορριφθέν για να διαγράφει +IncreaseHolidays=Αύξηση του υπολοίπου άδειας +HolidayRecordsIncreased= Τα υπόλοιπα %s αδειών αυξήθηκαν +HolidayRecordIncreased=Το υπόλοιπο της άδειας αυξήθηκε +ConfirmMassIncreaseHoliday=Μαζική αύξηση των ημερών αδείας +NumberDayAddMass=Αριθμός ημέρας για προσθήκη στην επιλογή +ConfirmMassIncreaseHolidayQuestion=Είστε σίγουροι ότι θέλετε να αυξήσετε τις διακοπές των %s επιλεγμένων εγγραφών ; +HolidayQtyNotModified=Το υπόλοιπο των ημερών που απομένουν για το %s δεν έχει αλλάξει diff --git a/htdocs/langs/el_GR/hrm.lang b/htdocs/langs/el_GR/hrm.lang index e6eb6107843..0721140f6e8 100644 --- a/htdocs/langs/el_GR/hrm.lang +++ b/htdocs/langs/el_GR/hrm.lang @@ -2,7 +2,7 @@ # Admin -HRM_EMAIL_EXTERNAL_SERVICE=E-mail για αποτροπή εξωτερικών υπηρεσιών στο HRM +HRM_EMAIL_EXTERNAL_SERVICE=Email για την αποτροπή εξωτερικής υπηρεσίας HRM Establishments=Επιχειρήσεις Establishment=Επιχείρηση NewEstablishment=Νέα επιχείρηση @@ -26,8 +26,8 @@ HRM_DEFAULT_SKILL_DESCRIPTION=Προεπιλεγμένη περιγραφή τω deplacement=Ωράριο DateEval=Ημερομηνία αξιολόγησης JobCard=Καρτέλα θέσεων εργασίας -JobPosition=Θέση εργασίας -JobsPosition=Θέσεις εργασίας +JobPosition=Περιγραφή εργασίας +JobsPosition=Περιγραφές εργασιών NewSkill=Νέα Δεξιότητα SkillType=Τύπος δεξιότητας Skilldets=Λίστα βαθμών για αυτήν την δεξιότητα @@ -86,7 +86,7 @@ SaveAddSkill = Προσθήκη δεξιότητας(ων) SaveLevelSkill = Το επίπεδο δεξιοτήτων αποθηκεύτηκε DeleteSkill = Η δεξιότητα αφαιρέθηκε SkillsExtraFields=Συμπληρωματικά χαρακτηριστικά (Δεξιότητες) -JobsExtraFields=Συμπληρωματικά χαρακτηριστικά (Υπάλληλοι) +JobsExtraFields=Συμπληρωματικά χαρακτηριστικά (Προφίλ θέσης εργασίας) EvaluationsExtraFields=Συμπληρωματικά χαρακτηριστικά (Αξιολογήσεις) NeedBusinessTravels=Ανάγκη επαγγελματικών ταξιδιών NoDescription=Χωρίς περιγραφή diff --git a/htdocs/langs/el_GR/main.lang b/htdocs/langs/el_GR/main.lang index a254cdd4741..18f1f56ae44 100644 --- a/htdocs/langs/el_GR/main.lang +++ b/htdocs/langs/el_GR/main.lang @@ -7,7 +7,7 @@ DIRECTION=ltr # To read Chinese pdf with Linux: sudo apt-get install poppler-data # cid0jp is for Japanish # cid0kr is for Korean -# DejaVuSans is for some Eastern languages, greek, some Asian languages and some Arabic languages +# DejaVuSans is for some Eastern languages, some Asian languages and some Arabic languages # freemono is for ru_RU or uk_UA, uz_UZ # freeserif is for Tamil FONTFORPDF=DejaVuSans @@ -226,6 +226,7 @@ NoUserGroupDefined=Κανένας χρήστης δεν ορίζεται στη Password=Κωδικός πρόσβασης PasswordRetype=Επαναλάβετε τον κωδικό πρόσβασης σας NoteSomeFeaturesAreDisabled=Σημειώστε ότι πολλές δυνατότητες/ενότητες είναι απενεργοποιημένες σε αυτήν την επίδειξη. +YourUserFile=Το αρχείο χρήστη σας Name=Όνομα NameSlashCompany=Όνομα / Εταιρεία Person=Άτομο @@ -467,7 +468,7 @@ Ref=Αναφ. ExternalRef=εξωτερική Αναφ. RefSupplier=Αναφ. Προμηθευτή RefPayment=Αναφ. πληρωμής -CommercialProposalsShort=Εμπορικές προσφορές +CommercialProposalsShort=Προσφορές Comment=Σχόλιο Comments=Σχόλια ActionsToDo=Ενέργειες που πρέπει να γίνουν @@ -897,6 +898,9 @@ MassFilesArea=Τομέας αρχείων που δημιουργήθηκαν α ShowTempMassFilesArea=Εμφάνιση τομέα αρχείων που έχουν δημιουργηθεί με μαζικές ενέργειες ConfirmMassDeletion=Επιβεβαίωση μαζικής διαγραφής ConfirmMassDeletionQuestion=Είστε σίγουροι ότι θέλετε να διαγράψετε τις επιλεγμένες εγγραφές %s; +ConfirmMassClone=Επιβεβαίωση μαζικής κλωνοποίησης +ConfirmMassCloneQuestion=Επιλέξτε έργο για κλωνοποίηση +ConfirmMassCloneToOneProject=Κλωνοποίηση στο έργο %s RelatedObjects=Σχετικά Αντικείμενα ClassifyBilled=Ταξινόμηση ως τιμολογημένο ClassifyUnbilled=Ταξινόμηση ως μη τιμολογημένο @@ -912,8 +916,8 @@ ExportFilteredList=Εξαγωγή φιλτραρισμένης λίστας ExportList=Εξαγωγή λίστας ExportOptions=Επιλογές Εξαγωγής IncludeDocsAlreadyExported=Συμπεριλάβετε έγγραφα που έχουν ήδη εξαχθεί -ExportOfPiecesAlreadyExportedIsEnable=Η εξαγωγή τεμαχίων που έχουν ήδη εξαχθεί είναι δυνατή -ExportOfPiecesAlreadyExportedIsDisable=Η εξαγωγή τεμαχίων που έχουν ήδη εξαχθεί είναι απενεργοποιημένη +ExportOfPiecesAlreadyExportedIsEnable=Τα έγγραφα που έχουν ήδη εξαχθεί είναι ορατά και θα εξαχθούν ξανά +ExportOfPiecesAlreadyExportedIsDisable=Τα έγγραφα που έχουν ήδη εξαχθεί είναι κρυφά και δεν θα εξαχθούν ξανά AllExportedMovementsWereRecordedAsExported=Όλες οι εξαγόμενες κινήσεις καταγράφηκαν ως εξαγόμενες NotAllExportedMovementsCouldBeRecordedAsExported=Δεν ήταν δυνατή η καταγραφή όλων των εξαγόμενων κινήσεων Miscellaneous=Διάφορα @@ -1128,6 +1132,7 @@ DeleteFileText=Θέλετε πραγματικά να διαγράψετε αυ ShowOtherLanguages=Εμφάνιση άλλων γλωσσών SwitchInEditModeToAddTranslation=Μεταβείτε στη λειτουργία επεξεργασίας για να προσθέσετε μεταφράσεις για αυτήν τη γλώσσα NotUsedForThisCustomer=Δεν χρησιμοποιείται για αυτόν τον πελάτη +NotUsedForThisVendor=Δεν χρησιμοποιείται για αυτόν τον προμηθευτή AmountMustBePositive=Το ποσό πρέπει να είναι θετικό ByStatus=Κατά κατάσταση InformationMessage=Πληροφορία @@ -1148,18 +1153,18 @@ EventReminder=Υπενθύμιση συμβάντος UpdateForAllLines=Ενημέρωση για όλες τις γραμμές OnHold=Σε Αναμονή Civility=Ευγένεια -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Ορισμός επόπτη +AffectTag=Αντιστοιχίστε μια ετικέτα +AffectUser=Εκχώρηση σε χρήστη +SetSupervisor=Ορίστε τον επόπτη CreateExternalUser=Δημιουργία εξωτερικού χρήστη -ConfirmAffectTag=Bulk Tag Assignement -ConfirmAffectUser=Bulk User Assignement -ProjectRole=Ρόλος που ανατίθεται σε κάθε έργο -TasksRole=Ρόλος που ανατίθεται σε κάθε εργασία κάθε έργου +ConfirmAffectTag=Μαζική αντιστοίχιση ετικετών +ConfirmAffectUser=Μαζική εκχώρηση σε χρήστες +ProjectRole=Ρόλος έχει εκχωρηθεί σε κάθε έργο/ευκαιρία +TasksRole=Ρόλος που έχει εκχωρηθεί σε κάθε εργασία (εάν χρησιμοποιείται) ConfirmSetSupervisor=Μαζικός ορισμός Επόπτη ConfirmUpdatePrice=Επιλέξτε ένα ποσοστό αύξησης/μείωσης τιμής -ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? -ConfirmAffectUserQuestion=Are you sure you want to assign users to the %s selected record(s)? +ConfirmAffectTagQuestion=Είστε σίγουροι ότι θέλετε να αντιστοιχίσετε ετικέτες στις επιλεγμένες εγγραφές %s; +ConfirmAffectUserQuestion=Είστε σίγουροι ότι θέλετε να εκχωρήσετε χρήστες στις επιλεγμένες εγγραφές %s; ConfirmSetSupervisorQuestion=Είστε σίγουροι ότι θέλετε να ορίσετε τον επόπτη στις %s επιλεγμένες εγγραφές; ConfirmUpdatePriceQuestion=Είστε σίγουροι ότι θέλετε να ενημερώσετε την τιμή των %s επιλεγμένων εγγραφών ; CategTypeNotFound=Δεν βρέθηκε τύπος ετικέτας για τον τύπο των εγγραφών @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Δημιουργήθηκε από Δημόσια πύλη UserAgent=User Agent InternalUser=Εσωτερικός χρήστης ExternalUser=Εξωτερικός χρήστης +NoSpecificContactAddress=Δεν υπάρχει συγκεκριμένη επαφή ή διεύθυνση +NoSpecificContactAddressBis=Αυτή η καρτέλα είναι αφιερωμένη στην επιβολή συγκεκριμένων επαφών ή διευθύνσεων για το τρέχον αντικείμενο. Χρησιμοποιήστε το μόνο εάν θέλετε να ορίσετε μία ή περισσότερες συγκεκριμένες επαφές ή διευθύνσεις για το αντικείμενο όταν οι πληροφορίες του τρίτου μέρους δεν είναι αρκετές ή δεν είναι ακριβείς. +HideOnVCard=Απόκρυψη %s +AddToContacts=Προσθήκη διεύθυνσης στις επαφές μου +LastAccess=Τελευταία πρόσβαση +UploadAnImageToSeeAPhotoHere=Ανεβάστε μια εικόνα από την καρτέλα %s για να δείτε μια φωτογραφία εδώ +LastPasswordChangeDate=Ημερομηνία τελευταίας αλλαγής κωδικού πρόσβασης diff --git a/htdocs/langs/el_GR/mrp.lang b/htdocs/langs/el_GR/mrp.lang index 181ede5bfec..0359b01be9c 100644 --- a/htdocs/langs/el_GR/mrp.lang +++ b/htdocs/langs/el_GR/mrp.lang @@ -102,6 +102,7 @@ NbOperatorsRequired=Αριθμός απαιτούμενων χειριστών THMOperatorEstimated=Εκτιμώμενος χειριστής THM THMMachineEstimated=Εκτιμώμενο μηχάνημα THM WorkstationType=Τύπος σταθμού εργασίας +DefaultWorkstation=Προεπιλεγμένος σταθμός εργασίας Human=Άνθρωπος Machine=Μηχανή HumanMachine=Άνθρωπος / Μηχανή diff --git a/htdocs/langs/el_GR/orders.lang b/htdocs/langs/el_GR/orders.lang index ee15f50fb2f..6039f128126 100644 --- a/htdocs/langs/el_GR/orders.lang +++ b/htdocs/langs/el_GR/orders.lang @@ -96,6 +96,10 @@ OrdersStatisticsSuppliers=Στατιστικά παραγγελίας αγορά NumberOfOrdersByMonth=Αριθμός παραγγελιών ανά μήνα AmountOfOrdersByMonthHT=Ποσό παραγγελιών ανά μήνα (εκτός φόρου) ListOfOrders=Λίστα παραγγελιών +ListOrderLigne=Γραμμές παραγγελιών +productobuy=Προϊόντα για αγορά μόνο +productonly=Μόνο προϊόντα +disablelinefree=Χωρίς ελεύθερες γραμμές CloseOrder=Κλείσιμο Παραγγελίας ConfirmCloseOrder=Είστε σίγουροι ότι θέλετε να ορίσετε αυτήν την παραγγελία ως παραδομένη; Μόλις παραδοθεί μια παραγγελία, μπορεί να οριστεί ως τιμολογημένη. ConfirmDeleteOrder=Είστε σίγουροι ότι θέλετε να διαγράψετε αυτή την παραγγελία; @@ -106,7 +110,7 @@ ConfirmMakeOrder=Είστε σίγουροι ότι θέλετε να επιβε GenerateBill=Δημιουργία τιμολογίου ClassifyShipped=Ταξινόμηση ως παραδομένη PassedInShippedStatus=Ταξινόμηση ως παραδομένη -YouCantShipThis=Δεν μπορώ να το ταξινομήσω αυτό. Ελέγξτε τα δικαιώματα χρήστη +YouCantShipThis=Δεν ειναι δυνατή η ταξινόμηση. Ελέγξτε τα δικαιώματα χρήστη DraftOrders=Προσχέδια παραγγελιών DraftSuppliersOrders=Προσχέδια παραγγελιών αγοράς OnProcessOrders=Παραγγελίες σε εξέλιξη @@ -131,6 +135,7 @@ SupplierOrderClassifiedBilled=Η παραγγελία αγοράς %s έχει OtherOrders=Άλλες παραγγελίες SupplierOrderValidatedAndApproved=Η παραγγελία του προμηθευτή έχει επικυρωθεί και εγκριθεί: %s SupplierOrderValidated=Η παραγγελία του προμηθευτή είναι επικυρωμένη: %s +OrderShowDetail=Εμφάνιση λεπτομερειών παραγγελίας ##### Types de contacts ##### TypeContact_commande_internal_SALESREPFOLL=Εκπρόσωπος εξέλιξης εντολής πώλησης TypeContact_commande_internal_SHIPPING=Εκπρόσωπος εξέλιξης αποστολής @@ -152,8 +157,8 @@ OrderByEMail=Email OrderByWWW=Online OrderByPhone=Τηλέφωνο # Documents models -PDFEinsteinDescription=Ένα πλήρες μοντέλο παραγγελιών (παλιά εφαρμογή του προτύπου Eratosthene) -PDFEratostheneDescription=Ένα πλήρες μοντέλο παραγγελιών +PDFEinsteinDescription=Ένα πλήρες πρότυπο παραγγελιών (παλιά εφαρμογή του προτύπου Eratosthene) +PDFEratostheneDescription=Ένα πλήρες υπόδειγμα παραγγελιών PDFEdisonDescription=Ένα απλό πρότυπο παραγγελιών PDFProformaDescription=Ένα πλήρες πρότυπο προτιμολογίου (Proforma) CreateInvoiceForThisCustomer=Τιμολόγηση παραγγελιών @@ -199,3 +204,5 @@ StatusSupplierOrderApproved=Εγκρίθηκε StatusSupplierOrderRefused=Απορρίφθηκε StatusSupplierOrderReceivedPartially=Εν μέρει παραλήφθηκε StatusSupplierOrderReceivedAll=Όλα τα προϊόντα παραλήφθηκαν +NeedAtLeastOneInvoice = Πρέπει να υπάρχει τουλάχιστον ένα Τιμολόγιο +LineAlreadyDispatched = Η γραμμή παραγγελίας έχει ήδη παραληφθεί. diff --git a/htdocs/langs/el_GR/other.lang b/htdocs/langs/el_GR/other.lang index ef1066eb4d7..29fbaf8116c 100644 --- a/htdocs/langs/el_GR/other.lang +++ b/htdocs/langs/el_GR/other.lang @@ -199,7 +199,7 @@ NumberOfSupplierOrders=Αριθμός παραγγελιών αγοράς NumberOfSupplierInvoices=Αριθμός τιμολογίων προμηθευτή NumberOfContracts=Αριθμός συμβάσεων NumberOfMos=Αριθμός παραγγελιών παραγωγής -NumberOfUnitsProposals=Αριθμός μονάδων στις προτάσεις +NumberOfUnitsProposals=Αριθμός μονάδων στις προσφορές NumberOfUnitsCustomerOrders=Αριθμός μονάδων σε παραγγελίες πώλησης NumberOfUnitsCustomerInvoices=Αριθμός μονάδων σε τιμολόγια πελατών NumberOfUnitsSupplierProposals=Αριθμός μονάδων σε προσφορές προμηθευτών diff --git a/htdocs/langs/el_GR/products.lang b/htdocs/langs/el_GR/products.lang index ac8eac8a0da..0fd7581f1b9 100644 --- a/htdocs/langs/el_GR/products.lang +++ b/htdocs/langs/el_GR/products.lang @@ -20,7 +20,7 @@ NewService=Νέα Υπηρεσία ProductVatMassChange=Καθολική ενημέρωση ΦΠΑ ProductVatMassChangeDesc=Αυτό το εργαλείο ενημερώνει τον συντελεστή ΦΠΑ που ορίζεται σε ΟΛΑ προϊόντα και υπηρεσίες! MassBarcodeInit=Μαζική ενεργοποίηση barcode -MassBarcodeInitDesc=Αυτή η σελίδα μπορεί να χρησιμοποιηθεί για την ενεργοποίηση ενός barcode σε αντικείμενα που δεν έχουν καθορισμένο barcode. Ελέγξτε νωρίτερα ότι έχει ολοκληρωθεί η ρύθμιση της μονάδας barcode . +MassBarcodeInitDesc=Αυτή η σελίδα μπορεί να χρησιμοποιηθεί για την ενεργοποίηση ενός barcode σε αντικείμενα που δεν έχουν καθορισμένο barcode. Ελέγξτε νωρίτερα ότι έχει ολοκληρωθεί η ρύθμιση της ενότητας barcode . ProductAccountancyBuyCode=Λογιστικός Κωδικός (Αγορά) ProductAccountancyBuyIntraCode=Λογιστικός κωδικός (ενδοκοινοτική αγορά) ProductAccountancyBuyExportCode=Λογιστικός κωδικός (εισαγωγή αγοράς) @@ -75,7 +75,7 @@ SellingPriceTTC=Τιμή Πώλησης (με Φ.Π.Α) SellingMinPriceTTC=Ελάχιστη τιμή πώλησης (με Φ.Π.Α) CostPriceDescription=Αυτό το πεδίο τιμών (εκτός Φ.Π.Α) μπορεί να χρησιμοποιηθεί για την αποθήκευση του μέσου ποσού που το προϊόν αυτό κοστίζει στην εταιρεία σας. Μπορεί να είναι οποιαδήποτε τιμή εσείς υπολογίζετε, για παράδειγμα, από τη μέση τιμή αγοράς συν το μέσο κόστος παραγωγής και διανομής. CostPriceUsage=Αυτή η τιμή θα μπορούσε να χρησιμοποιηθεί για υπολογισμό περιθωρίου. -ManufacturingPrice=Τιμή κατασκευής +ManufacturingPrice=Τιμή παραγωγής SoldAmount=Ποσό που πουλήθηκε PurchasedAmount=Ποσό που αγοράστηκε NewPrice=Νέα Τιμή @@ -103,18 +103,18 @@ BarCode=Barcode BarcodeType=Τύπος Barcode SetDefaultBarcodeType=Ορισμός τύπου barcode BarcodeValue=Τιμή Barcode -NoteNotVisibleOnBill=Σημείωση (μη ορατή σε τιμολόγια, προτάσεις...) +NoteNotVisibleOnBill=Σημείωση (μη ορατή σε τιμολόγια, προσφορές...) ServiceLimitedDuration=Εάν το προϊόν είναι μια υπηρεσία με περιορισμένη διάρκεια: -FillWithLastServiceDates=Συμπληρώστε με ημερομηνίες τελευταίας γραμμής σέρβις +FillWithLastServiceDates=Συμπληρώστε με ημερομηνίες τελευταίας γραμμής υπηρεσίας MultiPricesAbility=Πολλαπλά τμήματα τιμών ανά προϊόν / υπηρεσία (κάθε πελάτης βρίσκεται σε ένα τμήμα τιμών) MultiPricesNumPrices=Αριθμός διαφορετικής τιμής -DefaultPriceType=Προκαθορισμένη βάση τιμών (συμπεριλαμβανομένου φόρου) κατά την προσθήκη νέων τιμών πώλησης +DefaultPriceType=Προκαθορισμένη βάση τιμών (με ή χωρίς Φ.Π.Α.) κατά την προσθήκη νέων τιμών πώλησης AssociatedProductsAbility=Ενεργοποίηση κιτ (σετ διαφόρων προϊόντων) VariantsAbility=Ενεργοποίηση παραλλαγών (παραλλαγές προϊόντων, για παράδειγμα χρώμα, μέγεθος) AssociatedProducts=Κιτ AssociatedProductsNumber=Αριθμός προϊόντων που συνθέτουν αυτό το κιτ ParentProductsNumber=Αριθμός γονικής συσκευασίας προϊόντος -ParentProducts=Μητρικά προϊόντα +ParentProducts=Γονικά προϊόντα IfZeroItIsNotAVirtualProduct=Αν 0, αυτό το προϊόν δεν είναι κιτ IfZeroItIsNotUsedByVirtualProduct= \nΑν 0, αυτό το προϊόν δεν είναι μέρος κάποιου κιτ KeywordFilter=Φίλτρο λέξης-κλειδιού @@ -124,7 +124,7 @@ NoMatchFound=Δεν βρέθηκε κατάλληλη εγγραφή ListOfProductsServices=Κατάλογος προϊόντων / υπηρεσιών ProductAssociationList=Κατάλογος προϊόντων/υπηρεσιών που αποτελούν μέρος(η) αυτού του κιτ ProductParentList=Λίστα των κιτ με αυτό το προϊόν ως παρελκόμενο -ErrorAssociationIsFatherOfThis=Ένα από τα προϊόντα που θα επιλεγούν είναι γονέας με την τρέχουσα προϊόν +ErrorAssociationIsFatherOfThis=Ένα από τα επιλεγμένα προϊόντα είναι γονικό του τρέχοντος προϊόντος DeleteProduct=Διαγραφή προϊόντος/υπηρεσίας ConfirmDeleteProduct=Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το προϊόν / υπηρεσία; ProductDeleted=Προϊόν / Υπηρεσία "%s"; διαγράφηκε από τη βάση δεδομένων. @@ -162,7 +162,7 @@ ConfirmCloneProduct=Είστε σίγουροι ότι θέλετε να κλω CloneContentProduct=Επαναχρησιμοποιήστε όλες τις κύριες πληροφορίες του προϊόντος/υπηρεσίας ClonePricesProduct=Επαναχρησιμοποιήστε τις τιμες CloneCategoriesProduct=Επαναχρησιμοποιήστε συνδεδεμένες ετικέτες/κατηγορίες -CloneCompositionProduct=Επαναχρησιμοποιήστε εικονικα προϊόντα/υπηρεσιες +CloneCompositionProduct=Αντιγραφή εικονικών προϊόντων/υπηρεσιών CloneCombinationsProduct=Επαναχρησιμοποιήστε τις παραλλαγές προϊόντων ProductIsUsed=Μεταχειρισμένο NewRefForClone=Αναφ. νέου προϊόντος/υπηρεσίας @@ -201,7 +201,7 @@ m3=m³ liter=Λίτρο l=Λίτρο unitP=Κομμάτι -unitSET=Σειρά +unitSET=Set unitS=Δευτερόλεπτο unitH=Ώρα unitD=Ημέρα @@ -246,8 +246,8 @@ PriceByQuantity=Διαφορετικές τιμές ανά ποσότητα DisablePriceByQty=Απενεργοποιήστε τις τιμές ανά ποσότητα PriceByQuantityRange=Εύρος ποσότητας MultipriceRules=Αυτόματες τιμές για το τμήμα -UseMultipriceRules=Χρησιμοποιήστε κανόνες για το τμήμα των τιμών (που ορίζονται στην εγκατάσταση μονάδας προϊόντος) για να υπολογίσετε αυτόματα τις τιμές όλων των άλλων τμημάτων σύμφωνα με τον πρώτο τομέα -PercentVariationOver=Παραλλαγή %% μέσω %s +UseMultipriceRules=Χρησιμοποιήστε κανόνες για το τμήμα των τιμών (που ορίζονται στην εγκατάσταση ενότητας προϊόντος) για να υπολογίσετε αυτόματα τις τιμές όλων των άλλων τμημάτων σύμφωνα με το πρώτο τμήμα +PercentVariationOver=%%Παραλλαγή μέσω %s PercentDiscountOver=%% έκπτωση πάνω από %s KeepEmptyForAutoCalculation=Κρατήστε κενό για να το υπολογίσετε αυτομάτως από το βάρος ή τον όγκο των προϊόντων VariantRefExample=Παραδείγματα: ΧΡΩΜΑ, ΜΕΓΕΘΟΣ @@ -256,8 +256,8 @@ VariantLabelExample=Παραδείγματα: Χρώμα, Μέγεθος Build=Παράγω ProductsMultiPrice=Προϊόντα και τιμές για κάθε τμήμα τιμών ProductsOrServiceMultiPrice=Τιμές πελατών (προϊόντων ή υπηρεσιών, πολλαπλές τιμές) -ProductSellByQuarterHT=Κύκλος εργασιών τριμηνιαία πριν από τη φορολογία -ServiceSellByQuarterHT=Κύκλος εργασιών ανά τρίμηνο προ φόρων +ProductSellByQuarterHT=Κύκλος εργασιών προϊόντων ανά τρίμηνο προ φόρων +ServiceSellByQuarterHT=Κύκλος εργασιών υπηρεσιών ανά τρίμηνο προ φόρων Quarter1=1ο. Τέταρτο Quarter2=2ο. Τέταρτο Quarter3=3η. Τέταρτο @@ -271,7 +271,7 @@ FillBarCodeTypeAndValueManually=Συμπληρώστε τον τύπο barcode FillBarCodeTypeAndValueFromProduct=Συμπληρώστε τον τύπο barcode και αξία από το barcode του προϊόντος. FillBarCodeTypeAndValueFromThirdParty=Συμπληρώστε τον τύπο και την τιμή του γραμμικού κώδικα από τον γραμμωτό κώδικα ενός τρίτου μέρους. DefinitionOfBarCodeForProductNotComplete=Ο ορισμός του τύπου ή της αξίας του γραμμικού κώδικα δεν έχει ολοκληρωθεί για το προϊόν %s. -DefinitionOfBarCodeForThirdpartyNotComplete=Ορισμός του τύπου ή της αξίας του μη ολοκληρωμένου γραμμικού κώδικα για το τρίτο μέρος %s. +DefinitionOfBarCodeForThirdpartyNotComplete=Ο ορισμός του τύπου ή της αξίας του γραμμικού κώδικα δεν έχει ολοκληρωθεί για το τρίτο μέρος %s. BarCodeDataForProduct=Πληροφορίες γραμμικού κώδικα του προϊόντος %s: BarCodeDataForThirdparty=Πληροφορίες γραμμικού κώδικα τρίτου μέρους %s: ResetBarcodeForAllRecords=Ορίστε την τιμή του γραμμικού κώδικα για όλες τις εγγραφές (αυτό επίσης θα επαναφέρει την τιμή του γραμμικού κώδικα που έχει ήδη καθοριστεί με νέες τιμές) @@ -280,38 +280,38 @@ PriceCatalogue=Μια ενιαία τιμή πώλησης ανά προϊόν / PricingRule=Κανόνες για τις τιμές πώλησης AddCustomerPrice=Προσθήκη τιμής ανά πελάτη ForceUpdateChildPriceSoc=Ορίστε την ίδια τιμή στις θυγατρικές του πελάτη -PriceByCustomerLog=Καταγραφή προηγούμενων τιμών πελατών +PriceByCustomerLog=Αρχείο καταγραφής προηγούμενων τιμών πελατών MinimumPriceLimit=Η ελάχιστη τιμή δεν μπορεί να είναι χαμηλότερη από %s MinimumRecommendedPrice=Η ελάχιστη προτεινόμενη τιμή είναι: %s PriceExpressionEditor=Επεξεργαστής συνάρτησης τιμών PriceExpressionSelected=Επιλεγμένη έκφραση τιμής PriceExpressionEditorHelp1="τιμή = 2 + 2" ή "2 + 2" για τον καθορισμό της τιμής. Χρησιμοποιήστε ; για να διαχωρίσετε τις εκφράσεις -PriceExpressionEditorHelp2=Μπορείτε να έχετε πρόσβαση σε ExtraFields με μεταβλητές όπως # extrafield_myextrafieldkey # και παγκόσμιες μεταβλητές με # global_mycode # -PriceExpressionEditorHelp3=Και στις δύο τιμές προϊόντων / υπηρεσιών και πωλητών υπάρχουν οι παρακάτω μεταβλητές:
    # tva_tx # # localtax1_tx # # localtax2_tx # # βάρος # # μήκος # # επιφάνεια # # price_min # -PriceExpressionEditorHelp4=Μόνο στην τιμή προϊόντος / υπηρεσίας: # provider_min_price #
    Μόνο στις τιμές πωλητών: # # προμηθευτής και # προμηθευτής_tva_tx # -PriceExpressionEditorHelp5=Διαθέσιμες συνολικές τιμές: +PriceExpressionEditorHelp2=Μπορείτε να αποκτήσετε πρόσβαση στα Επιπλέον πεδία με μεταβλητές όπως #extrafield_myextrafieldkey# και καθολικές μεταβλητές με #global_mycode# +PriceExpressionEditorHelp3=Στις τιμές προϊόντων / υπηρεσιών και πωλητών υπάρχουν οι παρακάτω μεταβλητές:
    # tva_tx # # localtax1_tx # # localtax2_tx # # βάρος # # μήκος # # επιφάνεια # # price_min # +PriceExpressionEditorHelp4=Μόνο σε τιμή προϊόντος/υπηρεσίας: #supplier_min_price#
    Μόνο σε τιμές προμηθευτή: #supplier_quantity# και #supplier_tva_tx# +PriceExpressionEditorHelp5=Διαθέσιμες καθολικές τιμές: PriceMode=Λειτουργία Τιμής PriceNumeric=Αριθμός DefaultPrice=Προεπιλεγμένη τιμή DefaultPriceLog=Αρχείο προηγούμενων προεπιλεγμένων τιμών -ComposedProductIncDecStock=Αύξηση/Μείωση αποθεμάτων στην μητρική -ComposedProduct=Child products +ComposedProductIncDecStock=Αύξηση/Μείωση αποθέματος κατά την αλλαγή του αρχικού προϊόντος +ComposedProduct=Υποπροϊόντα MinSupplierPrice=Ελάχιστη τιμή αγοράς MinCustomerPrice=Ελάχιστη τιμή πώλησης NoDynamicPrice=Χωρίς δυναμική τιμή DynamicPriceConfiguration=Διαμόρφωση δυναμικών τιμών DynamicPriceDesc=Μπορείτε να ορίσετε μαθηματικούς τύπους για τον υπολογισμό των τιμών των πελατών ή των προμηθευτών. Τέτοιοι τύποι μπορούν να χρησιμοποιήσουν όλους τους μαθηματικούς χειριστές, κάποιες σταθερές και μεταβλητές. Μπορείτε να ορίσετε εδώ τις μεταβλητές που θέλετε να χρησιμοποιήσετε. Αν η μεταβλητή χρειάζεται αυτόματη ενημέρωση, μπορείτε να ορίσετε την εξωτερική διεύθυνση URL ώστε να επιτρέψει στο Dolibarr να ενημερώσει αυτόματα την τιμή. AddVariable=Προσθήκη μεταβλητής -AddUpdater=Προσθήκη του Updater +AddUpdater=Προσθήκη URL ενημέρωσης GlobalVariables=Καθολικές μεταβλητές VariableToUpdate=Μεταβλητή για ενημέρωση GlobalVariableUpdaters=Εξωτερικές ενημερώσεις για μεταβλητές GlobalVariableUpdaterType0=Δεδομένα JSON GlobalVariableUpdaterHelp0=Αναλύει τα δεδομένα JSON από συγκεκριμένη διεύθυνση URL, το VALUE καθορίζει τη θέση της αντίστοιχης τιμής, -GlobalVariableUpdaterHelpFormat0=Μορφή αίτησης {"URL": "http://example.com/urlofjson", "VALUE": "array1, array2, targetvalue"} +GlobalVariableUpdaterHelpFormat0=Μορφή για αίτημα {"URL": "http://example.com/urlofjson", "VALUE": "array1,array2,targetvalue"} GlobalVariableUpdaterType1=Δεδομένα WebService -GlobalVariableUpdaterHelp1=Parses δεδομένα WebService από συγκεκριμένη διεύθυνση URL, NS προσδιορίζει το χώρο ονομάτων, VALUE καθορίζει τη θέση της σχετικής τιμής, τα δεδομένα πρέπει να περιέχουν τα δεδομένα για αποστολή και METHOD είναι η μέθοδος κλήσης WS -GlobalVariableUpdaterHelpFormat1=Η φόρμα για το αίτημα είναι {"URL": "http://example.com/urlofws", "VALUE": "array, targetvalue", "NS": "http://example.com/urlofns" : "myWSMethod", "DATA": {"your": "δεδομένα", "to": "αποστολή"}} +GlobalVariableUpdaterHelp1=Αναλύει δεδομένα WebService από καθορισμένο URL, το NS καθορίζει το namespace, το VALUE καθορίζει τη θέση της σχετικής τιμής, τα DATA πρέπει να περιέχουν τα δεδομένα προς αποστολή και το METHOD είναι η μέθοδος κλησης WS +GlobalVariableUpdaterHelpFormat1=Η μορφή αιτήματος είναι {"URL": "http://example.com/urlofws", "VALUE": "array,targetvalue", "NS": "http://example.com/urlofns", "METHOD" : "myWSMethod", "DATA": {"your": "data", "to": "send"}} UpdateInterval=Διάρκεια ενημέρωσης (λεπτά) LastUpdated=Τελευταία ενημέρωση CorrectlyUpdated=Ενημερώθηκε σωστά @@ -331,21 +331,21 @@ ProductWeight=Βάρος για 1 προϊόν ProductVolume=Όγκος για 1 προϊόν WeightUnits=Μονάδα βάρους VolumeUnits=Μονάδα όγκου -WidthUnits=Πλάτος -LengthUnits=Μήκος -HeightUnits=Ύψος +WidthUnits=Μονάδα πλάτους +LengthUnits=Μονάδα μήκους +HeightUnits=Μονάδα ύψους SurfaceUnits=Μονάδα επιφάνειας SizeUnits=Μονάδα μεγέθους DeleteProductBuyPrice=Διαγραφή τιμής αγοράς -ConfirmDeleteProductBuyPrice=Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την τιμή αγοράς; +ConfirmDeleteProductBuyPrice=Είστε σίγουροι ότι θέλετε να διαγράψετε αυτήν την τιμή αγοράς; SubProduct=Υποπροϊόν -ProductSheet=Φύλλο προϊόντος -ServiceSheet=Φύλλο εξυπηρέτησης +ProductSheet=Κατάσταση(Φύλλο) προϊόντων +ServiceSheet=Κατάσταση(Φύλλο) υπηρεσιών PossibleValues=Πιθανές τιμές -GoOnMenuToCreateVairants=Πηγαίνετε στο μενού %s - %s για να προετοιμάσετε παραλλαγές χαρακτηριστικών (όπως χρώματα, μέγεθος, ...) +GoOnMenuToCreateVairants=Μεταβείτε στο μενού %s - %s για να προετοιμάσετε παραλλαγές χαρακτηριστικών (όπως χρώματα, μέγεθος, ...) UseProductFournDesc=Προσθέστε μια δυνατότητα για να ορίσετε την περιγραφή του προϊόντος που ορίστηκε από τους προμηθευτές (για κάθε αναφορά προμηθευτή) επιπρόσθετα της περιγραφής για τους πελάτες ProductSupplierDescription=Περιγραφή προμηθευτή για το προϊόν -UseProductSupplierPackaging=Χρησιμοποιήστε τη συσκευασία στις τιμές προμηθευτή (επανυπολογίστε τις ποσότητες σύμφωνα με τη συσκευασία που καθορίζεται στην τιμή προμηθευτή κατά την προσθήκη / ενημέρωση της γραμμής στα έγγραφα προμηθευτών) +UseProductSupplierPackaging=Χρησιμοποιήστε την συσκευασία για τιμές στρογγυλοποιημένες σε πολλαπλές για τιμές αγοράς (υπολογίστε εκ νέου τις ποσότητες σύμφωνα με τα πολλαπλάσια που ορίζονται στις τιμές αγοράς κατά την προσθήκη/ενημέρωση γραμμής σε έγγραφα προμηθευτή) PackagingForThisProduct=Συσκευασία PackagingForThisProductDesc=Θα αγοράσετε αυτόματα ένα πολλαπλάσιο αυτής της ποσότητας. QtyRecalculatedWithPackaging=Η ποσότητα της γραμμής υπολογίστηκε εκ νέου σύμφωνα με τη συσκευασία του προμηθευτή @@ -355,12 +355,12 @@ VariantAttributes=Χαρακτηριστικά παραλλαγής ProductAttributes=Χαρακτηριστικά παραλλαγών για προϊόντα ProductAttributeName=Χαρακτηριστικό παραλλαγής %s ProductAttribute=Χαρακτηριστικό παραλλαγής -ProductAttributeDeleteDialog=Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το χαρακτηριστικό; Όλες οι τιμές θα διαγραφούν -ProductAttributeValueDeleteDialog=Είστε βέβαιοι ότι θέλετε να διαγράψετε την τιμή "%s" με αναφορά "%s" αυτού του χαρακτηριστικού; -ProductCombinationDeleteDialog=Είστε βέβαιοι ότι θέλετε να διαγράψετε την παραλλαγή του προϊόντος " %s "; +ProductAttributeDeleteDialog=Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το χαρακτηριστικό; Όλες οι τιμές θα διαγραφούν +ProductAttributeValueDeleteDialog=Είστε σίγουροι ότι θέλετε να διαγράψετε την τιμή "%s" με αναφορά "%s" αυτού του χαρακτηριστικού; +ProductCombinationDeleteDialog=Είστε σίγουροι ότι θέλετε να διαγράψετε την παραλλαγή του προϊόντος "%s "; ProductCombinationAlreadyUsed=Παρουσιάστηκε σφάλμα κατά τη διαγραφή της παραλλαγής. Ελέγξτε ότι δεν χρησιμοποιείται σε οποιοδήποτε αντικείμενο ProductCombinations=Παραλλαγές -PropagateVariant=Διαφορετικές παραλλαγές +PropagateVariant=Παραγωγή παραλλαγών HideProductCombinations=Απόκρυψη παραλλαγών προϊόντων στον επιλογέα προϊόντων ProductCombination=Παραλλαγή NewProductCombination=Νέα παραλλαγή @@ -370,36 +370,36 @@ EditProductCombinations=Επεξεργασία παραλλαγών SelectCombination=Επιλέξτε συνδυασμό ProductCombinationGenerator=Γεννήτρια παραλλαγών Features=Χαρακτηριστικά -PriceImpact=Επιπτώσεις στις τιμές +PriceImpact=Επίπτωση στην τιμή ImpactOnPriceLevel=Αντίκτυπος στο επίπεδο τιμών %s ApplyToAllPriceImpactLevel= Εφαρμογή σε όλα τα επίπεδα ApplyToAllPriceImpactLevelHelp=Κάνοντας κλικ εδώ, ορίζετε τον ίδιο αντίκτυπο στην τιμή σε όλα τα επίπεδα -WeightImpact=Επιπτώσεις στο βάρος +WeightImpact=Επίπτωση στο βάρος NewProductAttribute=Νέο χαρακτηριστικό NewProductAttributeValue=Νέα τιμή χαρακτηριστικού ErrorCreatingProductAttributeValue=Παρουσιάστηκε σφάλμα κατά τη δημιουργία της τιμής του χαρακτηριστικού. Θα μπορούσε να είναι επειδή υπάρχει ήδη μια υπάρχουσα τιμή με αυτή την αναφορά ProductCombinationGeneratorWarning=Εάν συνεχίσετε, πριν δημιουργήσετε νέες παραλλαγές, όλες οι προηγούμενες θα ΔΙΑΓΡΑΦΟΥΝ. Οι ήδη υπάρχουσες θα ενημερωθούν με τις νέες τιμές TooMuchCombinationsWarning=Η δημιουργία πολλών παραλλαγών μπορεί να έχει ως αποτέλεσμα υψηλή χρήση CPU και μνήμης με συνέπεια το Dolibarr να μην μπορεί να τις δημιουργήσει. Η ενεργοποίηση της επιλογής "%s" μπορεί να βοηθήσει στη μείωση της χρήσης μνήμης. DoNotRemovePreviousCombinations=Μην αφαιρείτε προηγούμενες παραλλαγές -UsePercentageVariations=Χρησιμοποιήστε ποσοστιαίες παραλλαγές -PercentageVariation=Ποσοστιαία μεταβολή +UsePercentageVariations=Ποσοστό χρήσης παραλλαγών +PercentageVariation=Ποσοστό παραλλαγής ErrorDeletingGeneratedProducts=Παρουσιάστηκε σφάλμα κατά την προσπάθεια διαγραφής των υπαρχουσών παραλλαγών προϊόντων NbOfDifferentValues=Αριθ. Διαφορετικών τιμών NbProducts=Αριθμός προϊόντων -ParentProduct=Το γονικό προϊόν +ParentProduct=Αρχικό προϊόν HideChildProducts=Απόκρυψη παραλλαγών προϊόντων ShowChildProducts=Εμφάνιση παραλλαγών προϊόντων -NoEditVariants=Μεταβείτε στην καρτέλα γονικής κάρτας προϊόντος και επεξεργαστείτε τις επιπτώσεις των τιμών των παραλλαγών στην καρτέλα παραλλαγών -ConfirmCloneProductCombinations=Θέλετε να αντιγράψετε όλες τις παραλλαγές προϊόντων στο άλλο γονικό προϊόν με τη δεδομένη αναφορά; -CloneDestinationReference=Παραπομπή προϊόντος προορισμού +NoEditVariants=Μεταβείτε στην καρτέλα του αρχικού προϊόντος και επεξεργαστείτε τις επιπτώσεις των τιμών των παραλλαγών στην καρτέλα παραλλαγών +ConfirmCloneProductCombinations=Θέλετε να αντιγράψετε όλες τις παραλλαγές προϊόντων στο άλλο αρχικό προϊόν με τη συγκεκριμένη αναφορά; +CloneDestinationReference=Αναφορά προϊόντος προορισμού ErrorCopyProductCombinations=Παρουσιάστηκε σφάλμα κατά την αντιγραφή των παραλλαγών του προϊόντος ErrorDestinationProductNotFound=Το προϊόν προορισμού δεν βρέθηκε ErrorProductCombinationNotFound=Η παραλλαγή προϊόντος δεν βρέθηκε ActionAvailableOnVariantProductOnly=Η ενέργεια είναι διαθέσιμη μόνο για την παραλλαγή του προϊόντος ProductsPricePerCustomer=Τιμές προϊόντων ανά πελάτη ProductSupplierExtraFields=Πρόσθετα χαρακτηριστικά (τιμές προμηθευτή) -DeleteLinkedProduct=Διαγράψτε το θυγατρικό προϊόν που συνδέεται με τον συνδυασμό -AmountUsedToUpdateWAP=Ποσό που θα χρησιμοποιηθεί για την ενημέρωση της σταθμισμένης μέσης τιμής +DeleteLinkedProduct=Διαγράψτε το υποπροϊόν που συνδέεται με τον συνδυασμό +AmountUsedToUpdateWAP=Ποσό μονάδας που θα χρησιμοποιηθεί για την ενημέρωση της σταθμισμένης μέσης τιμής PMPValue=Σταθμισμένη μέση τιμή PMPValueShort=WAP mandatoryperiod=Υποχρεωτικές περίοδοι @@ -407,7 +407,7 @@ mandatoryPeriodNeedTobeSet=Σημείωση: Πρέπει να καθοριστ mandatoryPeriodNeedTobeSetMsgValidate=Μια υπηρεσία απαιτεί περίοδο έναρξης και λήξης mandatoryHelper=Επιλέξτε αυτό εάν θέλετε ένα μήνυμα στον χρήστη κατά τη δημιουργία/επικύρωση τιμολογίου, εμπορικής πρότασης, παραγγελίας πώλησης χωρίς να εισάγετε ημερομηνία έναρξης και λήξης στις γραμμές αυτής της υπηρεσίας.
    Σημειώστε ότι το μήνυμα είναι μια προειδοποίηση και όχι ένα σφάλμα αποκλεισμού. DefaultBOM=Προεπιλεγμένο BOM -DefaultBOMDesc=Το προεπιλεγμένο BOM συνιστάται να χρησιμοποιείται για την κατασκευή αυτού του προϊόντος. Αυτό το πεδίο μπορεί να οριστεί μόνο εάν η φύση του προϊόντος είναι "%s". +DefaultBOMDesc=Το προεπιλεγμένο BOM που συνιστάται να χρησιμοποιείται για την κατασκευή αυτού του προϊόντος. Αυτό το πεδίο μπορεί να οριστεί μόνο εάν η φύση του προϊόντος είναι "%s". Rank=Κατάταξη MergeOriginProduct=Διπλότυπο προϊόν (προϊόν που θέλετε να διαγράψετε) MergeProducts=Συγχώνευση προϊόντων @@ -416,10 +416,11 @@ ProductsMergeSuccess=Τα προϊόντα έχουν συγχωνευθεί ErrorsProductsMerge=Σφάλματα κατά τη συγχώνευση προϊόντων SwitchOnSaleStatus=Ενεργοποίηση κατάστασης πώλησης SwitchOnPurchaseStatus=Ενεργοποίηση κατάσταση αγοράς -StockMouvementExtraFields= Extra Fields (κίνηση μετοχών) -InventoryExtraFields= Επιπλέον πεδία (απόθεμα) +UpdatePrice=Αύξηση/μείωση τιμής πελάτη +StockMouvementExtraFields= Επιπλέον πεδία (κίνηση αποθεμάτων) +InventoryExtraFields= Επιπλέον πεδία (απογραφή) ScanOrTypeOrCopyPasteYourBarCodes=Σαρώστε ή πληκτρολογήστε ή αντιγράψτε/επικολλήστε τους γραμμωτούς κώδικες σας -PuttingPricesUpToDate=Ενημερώστε τις τιμές με τις τρέχουσες γνωστές τιμές +PuttingPricesUpToDate=Ενημέρωση τιμών με τις τρέχουσες γνωστές τιμές PMPExpected=Αναμενόμενο PMP ExpectedValuation=Αναμενόμενη Αποτίμηση PMPReal=Πραγματικό PMP @@ -427,3 +428,4 @@ RealValuation=Πραγματική Αποτίμηση ConfirmEditExtrafield = Επιλέξτε το επιπλέον πεδίο που θέλετε να τροποποιήσετε ConfirmEditExtrafieldQuestion = Είστε σιγουροι ότι θέλετε να τροποποιήσετε αυτό το επιπλέον πεδίο; ModifyValueExtrafields = Τροποποίηση της τιμής ενός επιπλέον πεδίου +OrProductsWithCategories=Ή προϊόντα με ετικέτες/κατηγορίες diff --git a/htdocs/langs/el_GR/projects.lang b/htdocs/langs/el_GR/projects.lang index 7e7dbb4f0b2..4e12b625d84 100644 --- a/htdocs/langs/el_GR/projects.lang +++ b/htdocs/langs/el_GR/projects.lang @@ -169,7 +169,7 @@ OpportunityProbability=Πιθανότητα προοπτικής OpportunityProbabilityShort=Πιθαν. προοπτικής OpportunityAmount=Ποσό προοπτικής OpportunityAmountShort=Ποσό προοπτικής -OpportunityWeightedAmount=Amount of opportunity, weighted by probability +OpportunityWeightedAmount=Ποσό ευκαιρίας, σταθμισμένο με πιθανότητα OpportunityWeightedAmountShort=Σταθμισμένο ποσό ευκαιρίας OpportunityAmountAverageShort=Μέσο ποσό προοπτικής OpportunityAmountWeigthedShort=Σταθμισμένο ποσό προοπτικής @@ -259,6 +259,7 @@ RecordsClosed=%s κλειστά έργα SendProjectRef=Πληροφορίες έργου %s ModuleSalaryToDefineHourlyRateMustBeEnabled=Η ενότητα "Μισθοί" πρέπει να είναι ενεργοποιημένη για να καθορίζει την ωριαία τιμή του εργαζόμενου ώστε να έχει αξιοποιηθεί ο χρόνος που δαπανάται NewTaskRefSuggested=Η αναφορά εργασίας χρησιμοποιείται ήδη, απαιτείται νέα αναφορά εργασίας +NumberOfTasksCloned=%s κλωνοποιημένες εργασίες TimeSpentInvoiced=Τιμολογήθηκε ο χρόνος που δαπανήθηκε TimeSpentForIntervention=Χρόνος που δαπανήθηκε TimeSpentForInvoice=Ο χρόνος που δαπανήθηκε diff --git a/htdocs/langs/el_GR/propal.lang b/htdocs/langs/el_GR/propal.lang index d60cbe650d6..0f438a2e7fb 100644 --- a/htdocs/langs/el_GR/propal.lang +++ b/htdocs/langs/el_GR/propal.lang @@ -3,7 +3,7 @@ Proposals=Εμπορικές προσφορές Proposal=Εμπορική προσφορά ProposalShort=Προσφορά ProposalsDraft=Προσχέδιο προσφοράς -ProposalsOpened=Ανοιχτές εμπορικές προσφορές +ProposalsOpened=Ανοιχτές προσφορές CommercialProposal=Προσφορά PdfCommercialProposalTitle=Προσφορά ProposalCard=Καρτέλα Προσφοράς @@ -13,8 +13,8 @@ Prospect=Προοπτική DeleteProp=Διαγραφή Προσφοράς ValidateProp=Επικύρωση Προσφοράς AddProp=Δημιουργία προσφοράς -ConfirmDeleteProp=Είστε σίγουροι ότι θέλετε να διαγράψετε αυτήν την εμπορική προσφορά; -ConfirmValidateProp=Είστε σίγουροι ότι θέλετε να επικυρώσετε αυτήν την εμπορική προσφορά με το όνομα %s ; +ConfirmDeleteProp=Είστε σίγουροι ότι θέλετε να διαγράψετε αυτήν την προσφορά; +ConfirmValidateProp=Είστε σίγουροι ότι θέλετε να επικυρώσετε αυτήν την προσφορά με το όνομα %s ; LastPropals=Τελευταίες %s προσφορές LastModifiedProposals=Τελευταίες %s τροποποιημένες προσφορές AllPropals=Όλες οι Προσφορές @@ -39,7 +39,7 @@ PropalStatusSignedShort=Υπογεγραμμένη PropalStatusNotSignedShort=Δεν έχει υπογραφεί PropalStatusBilledShort=Τιμολογήθηκε PropalsToClose=Προσφορές προς κλείσιμο -PropalsToBill=Υπογεγραμμένες εμπορικές προσφορές προς τιμολόγηση +PropalsToBill=Υπογεγραμμένες προσφορές προς τιμολόγηση ListOfProposals=Λίστα Προσφορών ActionsOnPropal=Ενέργειες στην Προσφορά RefProposal=Αναφ. προσφοράς @@ -107,7 +107,7 @@ PropalAlreadyRefused=Η προσφορά έχει ήδη απορριφθεί PropalAlreadySigned=Η πρόσφορα ειναι ήδη αποδεκτή PropalRefused=Η προσφορά απορρίφθηκε PropalSigned=Πρόσφορα αποδεκτή -ProposalCustomerSignature=Γραπτή αποδοχή, σφραγίδα εταιρείας, ημερομηνία και υπογραφή +ProposalCustomerSignature=Για αποδοχή: σφραγίδα εταιρείας, ημερομηνία και υπογραφή ProposalsStatisticsSuppliers=Στατιστικά στοιχεία προσφορών προμηθευτών RefusePropal=Απόρριψη προσφοράς Sign=Υπογραφή diff --git a/htdocs/langs/el_GR/stripe.lang b/htdocs/langs/el_GR/stripe.lang index 8cd53bcd79e..6e926b238b0 100644 --- a/htdocs/langs/el_GR/stripe.lang +++ b/htdocs/langs/el_GR/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Webhook live key ONLINE_PAYMENT_WAREHOUSE=Απόθεμα προς χρήση για μείωση αποθεμάτων όταν πραγματοποιείται η ηλεκτρονική πληρωμή
    (TODO Όταν η επιλογή μείωσης αποθεμάτων γίνεται σε μια ενέργεια στο τιμολόγιο και η ηλεκτρονική πληρωμή δημιουργεί από μόνη της το τιμολόγιο;) StripeLiveEnabled=Η λειτουργία Stripe live είναι ενεργοποιημένη (διαφορετικά η λειτουργία test / sandbox) StripeImportPayment=Εισαγωγή πληρωμών Stripe -ExampleOfTestCreditCard=Παράδειγμα πιστωτικής κάρτας για δοκιμή: %s => έγκυρο, %s => σφάλμα CVC, %s => έληξε, %s => η χρέωση αποτυγχάνει +ExampleOfTestCreditCard=Παράδειγμα πιστωτικής κάρτας για δοκιμή SEPA: %s => έγκυρο, %s => σφάλμα CVC, %s => έληξε, %s => η χρέωση αποτυγχάνει +ExampleOfTestBankAcountForSEPA=Παράδειγμα BAN τραπεζικού λογαριασμού για δοκιμή πάγιας εντολής: %s StripeGateways=Stripe gateways OAUTH_STRIPE_TEST_ID=Το αναγνωριστικό πελάτη Stripe Connect (ca _...) OAUTH_STRIPE_LIVE_ID=Το αναγνωριστικό πελάτη Stripe Connect (ca _...) @@ -61,6 +62,7 @@ DeleteACard=Διαγραφή κάρτας ConfirmDeleteCard=Είστε σίγουροι ότι θέλετε να διαγράψετε αυτήν την πιστωτική ή χρεωστική κάρτα; CreateCustomerOnStripe=Δημιουργία πελάτη στο Stripe CreateCardOnStripe=Δημιουργία κάρτας στο Stripe +CreateBANOnStripe=Δημιουργία τράπεζας στο Stripe ShowInStripe=Εμφάνιση στο Stripe StripeUserAccountForActions=Λογαριασμός χρήστη που θα χρησιμοποιηθεί για την ειδοποίηση μέσω ηλεκτρονικού ταχυδρομείου ορισμένων ενεργειών Stripe (πληρωμές Stripe) StripePayoutList=Λίστα των πληρωμών Stripe @@ -69,4 +71,8 @@ ToOfferALinkForLiveWebhook=Σύνδεσμος για τη ρύθμιση του PaymentWillBeRecordedForNextPeriod=Η πληρωμή θα καταγραφεί για την επόμενη περίοδο. ClickHereToTryAgain=Κάντε κλικ εδώ για να δοκιμάσετε ξανά ... CreationOfPaymentModeMustBeDoneFromStripeInterface=Λόγω των κανόνων ισχυρού ελέγχου ταυτότητας πελατών, η δημιουργία κάρτας πρέπει να γίνει από την Stripe. Μπορείτε να κάνετε κλικ εδώ για να ενεργοποιήσετε την εγγραφή πελατών Stripe: %s -TERMINAL_LOCATION=Τοποθεσία (διεύθυνση) για τερματικά +STRIPE_CARD_PRESENT=Δώροκάρτα για τερματικά Stripe +TERMINAL_LOCATION=Τοποθεσία (διεύθυνση) για Stripe Terminals +RequestDirectDebitWithStripe=Άμεση Χρέωση με Stripe +STRIPE_SEPA_DIRECT_DEBIT=Ενεργοποιήστε τις πληρωμές άμεσης χρέωσης μέσω Stripe + diff --git a/htdocs/langs/el_GR/ticket.lang b/htdocs/langs/el_GR/ticket.lang index 9cdf84ef881..399e7de949b 100644 --- a/htdocs/langs/el_GR/ticket.lang +++ b/htdocs/langs/el_GR/ticket.lang @@ -26,6 +26,7 @@ Permission56002=Τροποποίηση tickets Permission56003=Διαγραφή tickets Permission56004=Διαχείριση tickets Permission56005=Δείτε τα tickets όλων των τρίτων (δεν ισχύει για εξωτερικούς χρήστες, πάντα περιορίζονται στο τρίτο μέρος από το οποίο εξαρτώνται) +Permission56006=Εξαγωγή των tickets Tickets=Tickets TicketDictType=Ticket - Τύποι @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=Εξωτερικός συνεργάτη OriginEmail=Email πελάτη που άνοιξε το ticket Notify_TICKET_SENTBYMAIL=Στείλτε μήνυμα ticket μέσω email +ExportDataset_ticket_1=Tickets + # Status Read=Έχει αναγνωστεί Assigned=Έχει ανατεθεί diff --git a/htdocs/langs/el_GR/users.lang b/htdocs/langs/el_GR/users.lang index 24f318bfb6e..ef21d43871c 100644 --- a/htdocs/langs/el_GR/users.lang +++ b/htdocs/langs/el_GR/users.lang @@ -47,7 +47,7 @@ RemoveFromGroup=Αφαίρεση από την ομάδα PasswordChangedAndSentTo=Ο κωδικός πρόσβασης άλλαξε και στάλθηκε στο %s . PasswordChangeRequest=Αίτημα αλλαγής κωδικού πρόσβασης για %s PasswordChangeRequestSent=Το αίτημα για αλλαγή κωδικού πρόσβασης για %s στάλθηκε στο %s . -IfLoginExistPasswordRequestSent=Εάν αυτή η σύνδεση αφορά έγκυρο λογαριασμό, έχει σταλεί ένα email για επαναφορά του κωδικού πρόσβασης. +IfLoginExistPasswordRequestSent=Εάν αυτή η σύνδεση είναι έγκυρος λογαριασμός (με έγκυρο email), έχει σταλεί ένα email για επαναφορά του κωδικού πρόσβασης. IfEmailExistPasswordRequestSent=Εάν αυτό το email είναι έγκυρος λογαριασμός, έχει σταλεί ένα email για επαναφορά του κωδικού πρόσβασης. ConfirmPasswordReset=Επιβεβαίωση της επαναφοράς κωδικού πρόσβασης MenuUsersAndGroups=Χρήστες και Ομάδες @@ -55,7 +55,7 @@ LastGroupsCreated=Οι τελευταίες %s ομάδες που δημιου LastUsersCreated=Τελευταίοι %s χρήστες που δημιουργήθηκαν ShowGroup=Εμφάνιση ομάδας ShowUser=Εμφάνιση χρήστη -NonAffectedUsers=Non affected users +NonAffectedUsers=Χρήστες χωρίς ανατεθειμένη εργασία UserModified=Ο χρήστης τροποποιήθηκε με επιτυχία PhotoFile=Αρχείο φωτογραφίας ListOfUsersInGroup=Λίστα χρηστών σε αυτήν την ομάδα @@ -66,11 +66,11 @@ LinkedToDolibarrUser=Σύνδεσμος προς χρήστη LinkedToDolibarrThirdParty=Σύνδεσμος προς τρίτο μέρος CreateDolibarrLogin=Δημιουργία ενός χρήστη CreateDolibarrThirdParty=Δημιουργία τρίτου μέρους -LoginAccountDisableInDolibarr=Ο λογαριασμός απενεργοποιήθηκε στο Dolibarr. -UsePersonalValue=Use personal value -InternalUser=Εσωτερικός χρήστης +LoginAccountDisableInDolibarr=Ο λογαριασμός απενεργοποιήθηκε στο Dolibarr +PASSWORDInDolibarr=Ο κωδικός έχει τροποποιηθεί στο Dolibarr +UsePersonalValue=Χρήση προσωπικής επιλογής ExportDataset_user_1=Οι χρήστες και οι ιδιότητές τους -DomainUser=Domain user %s +DomainUser=Χρήστης τομέα %s Reactivate=Επανενεργοποίηση CreateInternalUserDesc=Αυτή η φόρμα σάς επιτρέπει να δημιουργήσετε έναν εσωτερικό χρήστη στην εταιρεία/οργανισμό σας. Για να δημιουργήσετε έναν εξωτερικό χρήστη (πελάτη, προμηθευτή κ.λπ. ..), χρησιμοποιήστε το κουμπί "Δημιουργία χρήστη Dolibarr" από την κάρτα επικοινωνίας αυτού του τρίτου μέρους. InternalExternalDesc=Ένας εσωτερικός χρήστης είναι ένας χρήστης που ανήκει στην εταιρεία/οργανισμό σας ή είναι συνεργάτης χρήστης εκτός του οργανισμού σας που μπορεί να χρειάζεται να δει περισσότερα δεδομένα από τα δεδομένα που σχετίζονται με την εταιρεία του (το σύστημα δικαιωμάτων θα καθορίσει τι μπορεί ή τι δεν μπορεί να δει ή να κάνει).
    Ένας εξωτερικός χρήστης είναι ένας πελάτης, προμηθευτής ή άλλος που πρέπει να βλέπει ΜΟΝΟ δεδομένα που σχετίζονται με τον εαυτό του (Η δημιουργία εξωτερικού χρήστη για τρίτο μέρος μπορεί να γίνει από την εγγραφή επαφής του τρίτου μέρους).

    Και στις δύο περιπτώσεις, πρέπει να εκχωρήσετε δικαιώματα για τις δυνατότητες που χρειάζεται ο χρήστης. @@ -79,7 +79,7 @@ Inherited=Κληρονομήθηκε UserWillBe=Ο χρήστης που δημιουργήθηκε θα είναι UserWillBeInternalUser=Ο χρήστης που δημιουργήθηκε θα είναι εσωτερικός χρήστης (επειδή δεν συνδέεται με συγκεκριμένο τρίτο μέρος) UserWillBeExternalUser=Ο χρήστης που δημιουργήθηκε θα είναι εξωτερικός χρήστης (επειδή συνδέεται με ένα συγκεκριμένο τρίτο μέρος) -IdPhoneCaller=Id phone caller +IdPhoneCaller=Id καλούντος NewUserCreated=Ο χρήστης %s δημιουργήθηκε NewUserPassword=Αλλαγή κωδικού πρόσβασης για %s NewPasswordValidated=Ο νέος σας κωδικός έχει επικυρωθεί και πρέπει να χρησιμοποιηθεί τώρα για να συνδεθείτε. @@ -93,7 +93,7 @@ GroupDeleted=Η ομάδα %s καταργήθηκε ConfirmCreateContact=Είστε σίγουροι ότι θέλετε να δημιουργήσετε καινούριο λογαριασμό Dolibarr γι΄ αυτή την επαφή; ConfirmCreateLogin=Είστε σίγουροι ότι θέλετε να δημιουργήσετε καινούριο λογαριασμό Dolibarr γι΄ αυτό το μέλος; ConfirmCreateThirdParty=Είστε σίγουροι ότι θέλετε να δημιουργήσετε ένα τρίτο μέρος για αυτό το μέλος; -LoginToCreate=Login to create +LoginToCreate=Χρήστης σύνδεσης για δημιουργία NameToCreate=Όνομα τρίτου μέρους προς δημιουργία YourRole=Οι ρόλοι σας YourQuotaOfUsersIsReached=Συμπληρώθηκε το όριο ενεργών χρηστών σας! @@ -128,3 +128,8 @@ DateLastLogin=Ημερομηνία τελευταίας σύνδεσης DatePreviousLogin=Ημερομηνία προηγούμενης σύνδεσης IPLastLogin=IP τελευταίας σύνδεσης IPPreviousLogin=IP προηγούμενης σύνδεσης +ShowAllPerms=Εμφάνιση όλων των γραμμών δικαιωμάτων +HideAllPerms=Απόκρυψη όλων των γραμμών δικαιωμάτων +UserPublicPageDesc=Μπορείτε να ενεργοποιήσετε μια εικονική κάρτα για αυτόν τον χρήστη. Ένα url με το προφίλ χρήστη και έναν γραμμωτό κώδικα θα είναι διαθέσιμο για να επιτρέπεται σε οποιονδήποτε διαθέτει smartphone να το σαρώσει και να προσθέσει την επαφή σας στο βιβλίο διευθύνσεών του. +EnablePublicVirtualCard=Ενεργοποιήστε τη δημόσια εικονική κάρτα χρήστη +PublicVirtualCardUrl=Δημόσια εικονική κάρτα χρήστη diff --git a/htdocs/langs/el_GR/website.lang b/htdocs/langs/el_GR/website.lang index 5a801bdc195..f90c3118809 100644 --- a/htdocs/langs/el_GR/website.lang +++ b/htdocs/langs/el_GR/website.lang @@ -155,3 +155,5 @@ WebpageMustBeDisabled=Η ιστοσελίδα πρέπει να είναι σε SetWebsiteOnlineBefore=Όταν ο ιστότοπος είναι εκτός σύνδεσης, όλες οι σελίδες είναι εκτός σύνδεσης. Αλλάξτε την κατάσταση του ιστότοπου πρώτα. Booking=Κράτηση Reservation=Κράτηση +PagesViewedPreviousMonth=Σελίδες που προβλήθηκαν (προηγούμενος μήνας) +PagesViewedTotal=Σελίδες που προβλήθηκαν (σύνολο) diff --git a/htdocs/langs/en_AE/stripe.lang b/htdocs/langs/en_AE/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/en_AE/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/en_AU/stripe.lang b/htdocs/langs/en_AU/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/en_AU/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/en_CA/stripe.lang b/htdocs/langs/en_CA/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/en_CA/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/en_GB/accountancy.lang b/htdocs/langs/en_GB/accountancy.lang index b1f36ec14ad..ec24e4e1046 100644 --- a/htdocs/langs/en_GB/accountancy.lang +++ b/htdocs/langs/en_GB/accountancy.lang @@ -24,7 +24,6 @@ Addanaccount=Add a financial account AccountAccounting=Financial Account ShowAccountingAccount=Show finance account ShowAccountingJournal=Show finance journal -AccountAccountingSuggest=Suggested Financial Account MenuVatAccounts=VAT accounts ProductsBinding=Product accounts Binding=Link to accounts @@ -53,6 +52,7 @@ LabelAccount=Account name LabelOperation=Account operation NumPiece=Item number AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts AccountingAccountGroupsDesc=Here you can define some groups of financial accounts. They will be used for personalised accounting reports. ByPersonalizedAccountGroups=By personalised groups FeeAccountNotDefined=Account for fees not defined diff --git a/htdocs/langs/en_GB/stripe.lang b/htdocs/langs/en_GB/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/en_GB/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/en_IN/stripe.lang b/htdocs/langs/en_IN/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/en_IN/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/en_SG/stripe.lang b/htdocs/langs/en_SG/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/en_SG/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/en_ZA/stripe.lang b/htdocs/langs/en_ZA/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/en_ZA/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/es_AR/accountancy.lang b/htdocs/langs/es_AR/accountancy.lang index f2465f8da73..4d4d9531d99 100644 --- a/htdocs/langs/es_AR/accountancy.lang +++ b/htdocs/langs/es_AR/accountancy.lang @@ -8,13 +8,13 @@ ACCOUNTING_EXPORT_DEVISE=Exportar moneda Selectformat=Elegir el formato del archivo ACCOUNTING_EXPORT_FORMAT=Seleccione el formato para el archivo ACCOUNTING_EXPORT_PREFIX_SPEC=Especificar el prefijo para el nombre de archivo -DefaultForService=Predeterminado para servicio -DefaultForProduct=Predeterminado para producto AccountancySetupDoneFromAccountancyMenu=La mayor parte de la configuración de la contabilidad se hace desde el menú %s Journalization=Contabilización Journals=Diarios Contables JournalFinancial=Diarios Financieros AssignDedicatedAccountingAccount=Nueva cuenta para asignar InvoiceLabel=Etiqueta de la factura -MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s | Credit = %s +AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts +AccountingJournalType5=Informe de gastos ConfirmMassDeleteBookkeepingWriting=Confirmar Eliminar en Masa diff --git a/htdocs/langs/es_AR/main.lang b/htdocs/langs/es_AR/main.lang index cfff93840e7..9d96140997b 100644 --- a/htdocs/langs/es_AR/main.lang +++ b/htdocs/langs/es_AR/main.lang @@ -499,8 +499,6 @@ Exports=Exporta ExportFilteredList=Exportar lista filtrada ExportList=Exportar lista ExportOptions=Exportar Opciones -ExportOfPiecesAlreadyExportedIsEnable=Exportar piezas que ya fueron exportadas está habilitado -ExportOfPiecesAlreadyExportedIsDisable=Exportar piezas que ya fueron exportadas está deshabilitado AllExportedMovementsWereRecordedAsExported=Todos los movimientos de exportaciones fueron registrados como exportados NotAllExportedMovementsCouldBeRecordedAsExported=No todos los movimientos de exportados pueden registrarse como exportados Miscellaneous=Miscelanias @@ -581,4 +579,9 @@ CustomReports=Informes de clientes SelectYourGraphOptionsFirst=Elija sus opciones de gráfico para construir un gráfico XAxis=Eje-X YAxis=Eje-Y +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) Terminated=Terminado diff --git a/htdocs/langs/es_AR/stripe.lang b/htdocs/langs/es_AR/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/es_AR/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/es_AR/users.lang b/htdocs/langs/es_AR/users.lang index de855ed3819..7049c06cc60 100644 --- a/htdocs/langs/es_AR/users.lang +++ b/htdocs/langs/es_AR/users.lang @@ -42,7 +42,6 @@ LinkToCompanyContact=Enlazar a un tercero / contacto LinkedToDolibarrMember=Enlazar al miembro CreateDolibarrLogin=Crear un usuario CreateDolibarrThirdParty=Crea un tercero -LoginAccountDisableInDolibarr=Cuenta deshabilitada en Dolibarr. UsePersonalValue=Usar valor personal ExportDataset_user_1=Usuarios y sus propiedades DomainUser=Usuario de dominio %s diff --git a/htdocs/langs/es_BO/stripe.lang b/htdocs/langs/es_BO/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/es_BO/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/es_CL/accountancy.lang b/htdocs/langs/es_CL/accountancy.lang index b3f110ea367..ed300a37675 100644 --- a/htdocs/langs/es_CL/accountancy.lang +++ b/htdocs/langs/es_CL/accountancy.lang @@ -9,8 +9,6 @@ ACCOUNTING_EXPORT_DEVISE=Moneda de exportación Selectformat=Seleccione el formato para el archivo ACCOUNTING_EXPORT_FORMAT=Seleccione el formato para el archivo ACCOUNTING_EXPORT_PREFIX_SPEC=Especifíque el prefijo para el nombre de archivo -DefaultForService=Predeterminado para servicio -DefaultForProduct=Predeterminado para producto CantSuggest=No puedo sugerir AccountancySetupDoneFromAccountancyMenu=La mayoría de las configuraciones de la contabilidad se realizan desde el menú %s Journalization=Periodización @@ -105,6 +103,8 @@ LetteringCode=Codigo de letras JournalLabel=Etiqueta de revista NumPiece=Pieza número TransactionNumShort=Num. transacción +AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts AccountingAccountGroupsDesc=Puede definir aquí algunos grupos de cuentas contables. Se usarán para informes de contabilidad personalizados. DelYear=Año para borrar DelJournal=Diario para eliminar diff --git a/htdocs/langs/es_CL/main.lang b/htdocs/langs/es_CL/main.lang index fc98ae0954b..25b1b4408f8 100644 --- a/htdocs/langs/es_CL/main.lang +++ b/htdocs/langs/es_CL/main.lang @@ -448,8 +448,6 @@ ClassifyUnbilled=Clasificar sin facturar FrontOffice=Oficina frontal ExportFilteredList=Exportar lista filtrada ExportList=Lista de exportación -ExportOfPiecesAlreadyExportedIsEnable=Se habilita la exportación de piezas ya exportadas. -ExportOfPiecesAlreadyExportedIsDisable=La exportación de piezas ya exportadas está deshabilitada. AllExportedMovementsWereRecordedAsExported=Todos los movimientos exportados fueron registrados como exportados. NotAllExportedMovementsCouldBeRecordedAsExported=No todos los movimientos exportados pudieron registrarse como exportados Miscellaneous=Diverso @@ -532,3 +530,8 @@ ContactDefault_invoice_supplier=Factura del proveedor ContactDefault_propal=Cotización ContactDefault_supplier_proposal=Propuesta de proveedor ContactAddedAutomatically=Contacto agregado de roles de terceros de contacto +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) diff --git a/htdocs/langs/es_CL/stripe.lang b/htdocs/langs/es_CL/stripe.lang index 84e773250a6..81cdc4cac04 100644 --- a/htdocs/langs/es_CL/stripe.lang +++ b/htdocs/langs/es_CL/stripe.lang @@ -20,7 +20,7 @@ STRIPE_LIVE_SECRET_KEY=Clave secreta en vivo STRIPE_LIVE_PUBLISHABLE_KEY=Clave en vivo publicable StripeLiveEnabled=Stripe live enabled (de lo contrario, prueba / modo de espacio aislado) StripeImportPayment=Importar pagos en franja -ExampleOfTestCreditCard=Ejemplo de tarjeta de crédito para la prueba: %s => válido, %s => error CVC, %s => caducado, %s => cargo falla +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails StripeGateways=Pasarelas de banda BankAccountForBankTransfer=Cuenta bancaria para pagos de fondos StripeAccount=Cuenta de banda @@ -34,3 +34,4 @@ ShowInStripe=Mostrar en raya StripeUserAccountForActions=Cuenta de usuario para usar para la notificación por correo electrónico de algunos eventos de Stripe (pagos de Stripe) StripePayoutList=Lista de pagos de la raya ToOfferALinkForLiveWebhook=Enlace para configurar Stripe WebHook para llamar a la IPN (modo en vivo) +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/es_CL/users.lang b/htdocs/langs/es_CL/users.lang index e84167b6a69..c21d55dcd29 100644 --- a/htdocs/langs/es_CL/users.lang +++ b/htdocs/langs/es_CL/users.lang @@ -48,7 +48,6 @@ LinkToCompanyContact=Enlace a un tercero / contacto LinkedToDolibarrMember=Enlace al miembro CreateDolibarrLogin=Crear un usuario CreateDolibarrThirdParty=Crea un tercero -LoginAccountDisableInDolibarr=Cuenta desactivada en Dolibarr. UsePersonalValue=Use valor personal DomainUser=Usuario del dominio %s CreateInternalUserDesc=Este formulario le permite crear un usuario interno en su empresa / organización. Para crear un usuario externo (cliente, proveedor, etc.), use el botón "Crear usuario de Dolibarr" de la tarjeta de contacto de ese tercero. diff --git a/htdocs/langs/es_CO/accountancy.lang b/htdocs/langs/es_CO/accountancy.lang index 52afc52a574..64836ed84cd 100644 --- a/htdocs/langs/es_CO/accountancy.lang +++ b/htdocs/langs/es_CO/accountancy.lang @@ -9,8 +9,6 @@ ACCOUNTING_EXPORT_DEVISE=Moneda de exportación Selectformat=Selecciona el formato para el archivo. ACCOUNTING_EXPORT_FORMAT=Selecciona el formato para el archivo. ACCOUNTING_EXPORT_PREFIX_SPEC=Especifique el prefijo para el nombre del archivo. -DefaultForService=Por defecto para el servicio -DefaultForProduct=Predeterminado para producto CantSuggest=No puedo sugerir ConfigAccountingExpert=Configuración de la contabilidad del módulo (doble entrada) Journalization=Periodización @@ -138,7 +136,7 @@ Codejournal=diario JournalLabel=Etiqueta de diario NumPiece=Número de pieza TransactionNumShort=Num. transacción -AccountingCategory=Grupo personalizado de cuentas +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Agrupar por cuenta del libro mayor AccountingAccountGroupsDesc=Puede definir aquí algunos grupos de cuentas contables. Serán utilizados para informes contables personalizados. ByPredefinedAccountGroups=Por grupos predefinidos. @@ -175,12 +173,6 @@ PcgtypeDesc=Los grupos de cuentas se utilizan como criterios de 'filtro' y 'agru Reconcilable=Conciliable TotalVente=Rotación total antes de impuestos TotalMarge=Margen total de ventas -DescVentilCustomer=Consulta aquí la lista de líneas de factura de cliente vinculadas (o no) a una cuenta de producto desde plan de cuentas -DescVentilMore=En la mayoría de los casos, si usa productos o servicios predefinidos y configura la cuenta (desde el plan de cuentas) en la tarjeta de producto/servicio, la aplicación podrá realizar todos los enlaces entre sus líneas de factura y la cuenta contable de su plan. de cuentas, con solo un clic con el botón "%s" . Si la cuenta no se configuró en las tarjetas de productos/servicios o si todavía tiene algunas líneas no vinculadas a una cuenta, deberá realizar un enlace manual desde el menú " %s ". -DescVentilDoneCustomer=Consulta aquí el listado de las líneas de facturas clientes y su cuenta de producto desde plan de cuentas -DescVentilTodoCustomer=Enlazar líneas de factura que aún no están enlazadas con una cuenta de producto del plan de cuentas -ChangeAccount=Cambie la cuenta de producto/servicio (del plan de cuentas) para las líneas seleccionadas con la siguiente cuenta: -DescVentilSupplier=Consulte aquí la lista de líneas de factura de proveedor vinculadas o aún no vinculadas a una cuenta de producto del plan de cuentas (solo se ven los registros que aún no se han transferido en contabilidad) DescVentilDoneSupplier=Consulte aquí el listado de las líneas de facturas de proveedores y su cuenta contable DescVentilTodoExpenseReport=Líneas de informe de gastos de enlace no vinculadas con una cuenta contable de comisiones DescVentilExpenseReport=Consulte aquí la lista de líneas de informe de gastos vinculadas (o no) a una cuenta de contabilidad de comisiones. @@ -188,12 +180,11 @@ DescVentilExpenseReportMore=Si configura una cuenta contable según el tipo de l DescVentilDoneExpenseReport=Consulte aquí la lista de líneas de informes de gastos y sus cuentas contables. DescValidateMovements=Se prohíbe cualquier modificación o eliminación de la escritura, las letras y las eliminaciones. Todas las entradas para un ejercicio deben ser validadas, de lo contrario no será posible cerrar AutomaticBindingDone=Enlaces automáticos realizados (%s) - El enlace automático no es posible para algunos registros (%s) -ErrorAccountancyCodeIsAlreadyUse=Error, no puede eliminar o deshabilitar esta cuenta de plan de cuentas porque se usa +MvtNotCorrectlyBalanced=Movimiento no equilibrado correctamente. Débito = %s & Crédito = %s Balancing=Equilibrio FicheVentilation=Tarjeta de encuadernación GeneralLedgerIsWritten=Las transacciones están escritas en el libro mayor. GeneralLedgerSomeRecordWasNotRecorded=Algunas de las transacciones no pudieron ser periodizadas. Si no hay otro mensaje de error, probablemente sea porque ya estaban registrados. -ListOfProductsWithoutAccountingAccount=Lista de productos no vinculados a ninguna cuenta o plan de cuentas ChangeBinding=Cambiar el enlace Accounted=Contabilizado en libro mayor NotYetAccounted=Aún no transferido a contabilidad @@ -258,7 +249,6 @@ PredefinedGroups=Grupos predefinidos WithValidAccount=Con cuenta dedicada válida. ValueNotIntoChartOfAccount=Este valor de la cuenta contable no existe en el plan de cuentas. SaleEECWithVAT=Venta en EEC con IVA no nulo, por lo que suponemos que NO es una venta intracomunitaria y la cuenta sugerida es la cuenta estándar del producto. -SaleEECWithoutVATNumber=Venta en CEE sin IVA, pero no se define el ID de IVA del tercero. Recurrimos a la cuenta de producto para las ventas estándar. Puede corregir el ID de IVA del tercero o la cuenta del producto si es necesario. ForbiddenTransactionAlreadyExported=Prohibido: La transacción ha sido validada y/o exportada. ForbiddenTransactionAlreadyValidated=Prohibido: La transacción ha sido validada. LetteringAuto=conciliar automáticamente diff --git a/htdocs/langs/es_CO/admin.lang b/htdocs/langs/es_CO/admin.lang index 34e0d7f39ca..3a97bbd7d88 100644 --- a/htdocs/langs/es_CO/admin.lang +++ b/htdocs/langs/es_CO/admin.lang @@ -735,9 +735,6 @@ Permission2503=Presentar o borrar documentos Permission2515=Configurar directorios de documentos Permission2801=Usar el cliente FTP en modo de lectura (solo navegar y descargar) Permission2802=Usar el cliente FTP en modo de escritura (eliminar o cargar archivos) -Permission4021=Leer evaluaciones (tuyas y de tus subordinados) -Permission4022=Crear/modificar evaluaciones -Permission4033=Leer todas las evaluaciones (incluso las de usuarios no subordinados) Permission10001=Leer el contenido del sitio web Permission10002=Crear / modificar el contenido del sitio web (contenido html y javascript) Permission10003=Crear / modificar el contenido del sitio web (código php dinámico). Peligroso, debe reservarse para desarrolladores restringidos. @@ -1638,10 +1635,8 @@ ConfFileIsReadableOrWritableByAnyUsers=El archivo conf. puede ser leido y escrit MailToSendEventOrganization=Organización del evento MailToPartnership=Camaradería YouShouldDisablePHPFunctions=Debería deshabilitar las funciones de PHP -PHPFunctionsRequiredForCLI=Para fines de shell (como la copia de seguridad de trabajos programados o la ejecución de un programa antivirus), debe mantener las funciones de PHP NoWritableFilesFoundIntoRootDir=No se encontraron archivos o directorios grabables de los programas comunes en su directorio raíz (Perfect!) Recommended=Recomendado -ARestrictedPath=Algunas rutas restringidas para archivos de datos DatabasePasswordNotObfuscated=La contraseña de la base de datos NO está ofuscada en el archivo conf YouShouldSetThisToOff=Debes configurar esto en 0 o apagarlo InstallAndUpgradeLockedBy=La instalación y las actualizaciones están bloqueadas por el archivo %s diff --git a/htdocs/langs/es_CO/companies.lang b/htdocs/langs/es_CO/companies.lang index f1ccfe0423d..934d21de7ec 100644 --- a/htdocs/langs/es_CO/companies.lang +++ b/htdocs/langs/es_CO/companies.lang @@ -57,12 +57,11 @@ VATIntra=RUT VATIntraShort=RUT VATReturn=Devolución de IVA SupplierRelativeDiscount=Descuento relativo del proveedor -HasRelativeDiscountFromSupplier=Tiene un descuento predeterminado de %s%% de este proveedor -HasNoRelativeDiscountFromSupplier=Sin descuento relativo predeterminado de este proveedor +HasRelativeDiscountFromSupplier=You have a default discount of %s%% with this vendor +HasNoRelativeDiscountFromSupplier=No default relative discount with this vendor CompanyHasAbsoluteDiscount=Este cliente tiene descuentos disponibles (notas de crédito o anticipos) para %s %s CompanyHasDownPaymentOrCommercialDiscount=Este cliente tiene descuentos disponibles (comerciales, anticipos) para %s %s CompanyHasCreditNote=Este cliente tiene %s %s anticipos disponibles -HasNoAbsoluteDiscountFromSupplier=No hay descuento/crédito disponible de este proveedor HasAbsoluteDiscountFromSupplier=Tiene descuentos disponibles (notas de crédito o anticipos) para %s %s de este proveedor HasDownPaymentOrCommercialDiscountFromSupplier=Tiene descuentos disponibles (comerciales, anticipos) para %s %s de este proveedor HasCreditNoteFromSupplier=Tiene notas de crédito para %s %s de este proveedor @@ -129,3 +128,5 @@ PaymentTypeBoth=Tipo de pago - Cliente y proveedor MulticurrencyUsed=Usar multidivisa MulticurrencyCurrency=Moneda CurrentOutstandingBillLate=Factura por pagar: Atrasada +EmailAlreadyExistsPleaseRewriteYourCompanyName=el E-mail ya existe, vuelva a escribir el nombre de su empresa +TwoRecordsOfCompanyName=more than one record exists for this company, please contact us to complete your partnership request diff --git a/htdocs/langs/es_CO/eventorganization.lang b/htdocs/langs/es_CO/eventorganization.lang index e633590b492..fc0dddddc18 100644 --- a/htdocs/langs/es_CO/eventorganization.lang +++ b/htdocs/langs/es_CO/eventorganization.lang @@ -5,7 +5,6 @@ Settings=Ajustes EVENTORGANIZATION_TASK_LABELTooltip =When you validate an event to organize, some tasks can be automatically created in the project

    For example:
    Send Call for Conferences
    Send Call for Booths
    Validate suggestions of Conferences
    Validate application for Booths
    Open subscriptions to the event for attendees
    Enviar un recordatorio del evento a los oradores
    Enviar un recordatorio del evento a los anfitriones del stand
    Enviar un recordatorio del evento a los asistentes EVENTORGANIZATION_TEMPLATE_EMAIL_AFT_SUBS_EVENT =Plantilla de correo electrónico para enviar después de que se haya pagado la inscripción a un evento. EventOrganizationConfOrBooth=Conferencia o stand -EventOrganizationConfOrBoothes=Conferencias o Stands ManageOrganizeEvent =Gestionar la organización de un evento ConferenceOrBooth =Conferencia o stand ConferenceOrBoothTab =Conferencia o stand @@ -15,8 +14,6 @@ ToSpeakers=A los altavoces AllowUnknownPeopleSuggestConf=Permitir que las personas sugieran conferencias AllowUnknownPeopleSuggestBooth=Permitir que las personas soliciten un stand NbVotes=Numero de votos -ListOfSuggestedBooths=Stands sugeridos -ListOfConferencesOrBooths=Proyecto de conferencias o stands de evento RegistrationAndPaymentWereAlreadyRecorder=Ya se registró un registro y un pago para el correo electrónico %s EmailAttendee=Correo electrónico del asistente EmailCompanyForInvoice=Correo electrónico de la empresa (para la factura, si es diferente del correo electrónico del asistente) diff --git a/htdocs/langs/es_CO/main.lang b/htdocs/langs/es_CO/main.lang index 03ec062beaf..6e5376a6157 100644 --- a/htdocs/langs/es_CO/main.lang +++ b/htdocs/langs/es_CO/main.lang @@ -251,8 +251,6 @@ FrontOffice=Oficina frontal Exports=Las exportaciones ExportFilteredList=Exportar lista filtrada ExportList=Lista de exportación -ExportOfPiecesAlreadyExportedIsEnable=La exportación de piezas ya exportadas está habilitada. -ExportOfPiecesAlreadyExportedIsDisable=La exportación de piezas ya exportadas está deshabilitada. AllExportedMovementsWereRecordedAsExported=Todos los movimientos exportados se registraron como exportados NotAllExportedMovementsCouldBeRecordedAsExported=No todos los movimientos exportados se pueden registrar como exportados Miscellaneous=Diverso @@ -339,10 +337,11 @@ UpToDate=Al día OutOfDate=Vencido EventReminder=Recordatorio de evento Civility=Civilidad -AffectTag=Asignar etiqueta -AffectUser=Asignar usuario -ConfirmAffectTag=Asignación de etiquetas masivas -ConfirmAffectUser=Asignación masiva de usuarios +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ConfirmSetSupervisor=Conjunto de supervisor a granel ConfirmAffectTagQuestion=¿Está seguro de que desea asignar etiquetas a los %s registros seleccionados? ConfirmAffectUserQuestion=¿Está seguro de que desea asignar usuarios a los %s registros seleccionados? @@ -352,7 +351,6 @@ InformationOnLinkToContract=Esta cantidad es solo el total de todas las líneas ConfirmCancel=Estas seguro que quieres cancelar EmailMsgID=MsgID de correo electrónico EmailDate=Fecha de E-mail -SetToStatus=Establecer en el estado %s SetToEnabled=Establecer como habilitado SetToDisabled=Establecer como deshabilitado ConfirmMassEnablingQuestion=¿Está seguro de que desea habilitar los %s registro(s) seleccionado(s)? @@ -371,5 +369,4 @@ CanceledShown=Se muestra cancelada Terminate=Terminar Terminated=Terminado ConfirmAllocateCommercialQuestion=¿Está seguro de que desea asignar los %s registros seleccionados? -CommercialsAffected=Representantes de ventas asignados CommercialAffected=representante de ventas asignado diff --git a/htdocs/langs/es_CO/mrp.lang b/htdocs/langs/es_CO/mrp.lang index 2cfafcc346e..7f31aabc1af 100644 --- a/htdocs/langs/es_CO/mrp.lang +++ b/htdocs/langs/es_CO/mrp.lang @@ -5,7 +5,6 @@ LatestBOMModified=Último %s Listas de materiales modificadas LatestMOModified=Últimas órdenes de fabricación %s modificadas Bom=Facturas de material BOMsSetup=Configuración de la lista de materiales del módulo -ListOfBOMs=Listas de materiales - BOM ListOfManufacturingOrders=Órdenes de Fabricación BOMsNumberingModules=Plantillas de numeración de listas de materiales BOMsModelModule=Plantillas de documentos BOM diff --git a/htdocs/langs/es_CO/stripe.lang b/htdocs/langs/es_CO/stripe.lang index e4412f149cc..aaea5c1e0f1 100644 --- a/htdocs/langs/es_CO/stripe.lang +++ b/htdocs/langs/es_CO/stripe.lang @@ -20,7 +20,7 @@ STRIPE_LIVE_WEBHOOK_KEY=Clave en vivo de webhook ONLINE_PAYMENT_WAREHOUSE=Existencias a utilizar para la disminución de existencias cuando se realiza el pago en línea
    (TODO ¿Cuándo se realiza la opción para disminuir las existencias en una acción en la factura y el pago en línea genera la factura por sí mismo?) StripeLiveEnabled=Stripe live habilitado (de lo contrario, modo prueba / sandbox) StripeImportPayment=Importar pagos de Stripe -ExampleOfTestCreditCard=Ejemplo de tarjeta de crédito para prueba: %s => válido, %s => error CVC, %s => caducado, %s => falla de carga +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails StripeGateways=Pasarelas de banda OAUTH_STRIPE_TEST_ID=ID de cliente de Stripe Connect (ca _...) OAUTH_STRIPE_LIVE_ID=ID de cliente de Stripe Connect (ca _...) @@ -37,3 +37,4 @@ ToOfferALinkForTestWebhook=Enlace para configurar Stripe WebHook para llamar al ToOfferALinkForLiveWebhook=Enlace para configurar Stripe WebHook para llamar al IPN (modo en vivo) ClickHereToTryAgain= Haga clic aquí para volver a intentarlo ... CreationOfPaymentModeMustBeDoneFromStripeInterface=Debido a las reglas estrictas de autenticación de clientes, la creación de una tarjeta debe realizarse desde el backoffice de Stripe. Puede hacer clic aquí para activar el registro de cliente de Stripe: %s +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/es_CO/users.lang b/htdocs/langs/es_CO/users.lang index 7569c03c066..dc2ca31937e 100644 --- a/htdocs/langs/es_CO/users.lang +++ b/htdocs/langs/es_CO/users.lang @@ -46,7 +46,6 @@ LinkToCompanyContact=Enlace a un tercero / contacto LinkedToDolibarrMember=Enlace al miembro CreateDolibarrLogin=Crea un usuario CreateDolibarrThirdParty=Crea un tercero -LoginAccountDisableInDolibarr=Cuenta deshabilitada en Dolibarr. UsePersonalValue=Use valor personal ExportDataset_user_1=Usuarios y sus propiedades DomainUser=Usuario de dominio %s diff --git a/htdocs/langs/es_CR/accountancy.lang b/htdocs/langs/es_CR/accountancy.lang new file mode 100644 index 00000000000..cf74ffb05a8 --- /dev/null +++ b/htdocs/langs/es_CR/accountancy.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - accountancy +AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts diff --git a/htdocs/langs/es_CR/admin.lang b/htdocs/langs/es_CR/admin.lang index 52d3b029a72..485e2d7adf4 100644 --- a/htdocs/langs/es_CR/admin.lang +++ b/htdocs/langs/es_CR/admin.lang @@ -1,3 +1,8 @@ # Dolibarr language file - Source file is en_US - admin +BoldRefAndPeriodOnPDF=Imprimir en PDF referencia y período de producto +BoldLabelOnPDF=Imprimir etiqueta del producto en Negrita en el PDF +VersionProgram=Versión del programa +VersionLastInstall=Versión inicial instalada +VersionLastUpgrade=Actualizar a la versión más reciente OperationParamDesc=Define the rules to use to extract some data or set values to use for operation.

    Example to extract a company name from email subject into a temporary variable:
    tmp_var=EXTRACT:SUBJECT:Message from company ([^\n]*)

    Examples to set the properties of an object to create:
    objproperty1=SET:a hard coded value
    objproperty2=SET:__tmp_var__
    objproperty3=SETIFEMPTY:a value (value is set only if property is not already defined)
    objproperty4=EXTRACT:HEADER:X-Myheaderkey:\\s*([^\\s]*)
    options_myextrafield1=EXTRACT:SUBJECT:([^\n]*)
    object.objproperty5=EXTRACT:BODY:My company name is\\s([^\\s]*)

    Use a ; char as separator to extract or set several properties. EmailCollectorLoadThirdPartyHelp=You can use this action to use the email content to find and load an existing thirdparty in your database. The found (or created) thirdparty will be used for following actions that need it.
    For example, if you want to create a thirdparty with a name extracted from a string 'Name: name to find' present into the body, use the sender email as email, you can set the parameter field like this:
    'email=HEADER:^From:(.*);name=EXTRACT:BODY:Name:\\s([^\\s]*);client=SET:2;'
    diff --git a/htdocs/langs/es_CR/companies.lang b/htdocs/langs/es_CR/companies.lang new file mode 100644 index 00000000000..37c93f8f77d --- /dev/null +++ b/htdocs/langs/es_CR/companies.lang @@ -0,0 +1,4 @@ +# Dolibarr language file - Source file is en_US - companies +HasRelativeDiscountFromSupplier=You have a default discount of %s%% with this vendor +HasNoRelativeDiscountFromSupplier=No default relative discount with this vendor +TwoRecordsOfCompanyName=more than one record exists for this company, please contact us to complete your partnership request diff --git a/htdocs/langs/es_CR/stripe.lang b/htdocs/langs/es_CR/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/es_CR/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/es_DO/stripe.lang b/htdocs/langs/es_DO/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/es_DO/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/es_EC/accountancy.lang b/htdocs/langs/es_EC/accountancy.lang index a9c11f18148..a89937dc114 100644 --- a/htdocs/langs/es_EC/accountancy.lang +++ b/htdocs/langs/es_EC/accountancy.lang @@ -7,7 +7,6 @@ ACCOUNTING_EXPORT_LABEL=Etiqueta de exportación ACCOUNTING_EXPORT_AMOUNT=Cantidad de la exportación ACCOUNTING_EXPORT_DEVISE=Moneda de exportación ACCOUNTING_EXPORT_PREFIX_SPEC=Especifique el prefijo para el nombre de archivo -DefaultForService=Predeterminado para servicio CantSuggest=No puedo sugerir AccountancySetupDoneFromAccountancyMenu=La mayoría de la configuración de la contabilidad se realiza desde el menú%s Journals=Revistas @@ -104,6 +103,8 @@ LetteringCode=Codigo de letras Codejournal=diario NumPiece=Número de pieza TransactionNumShort=Num. transacción +AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts AccountingAccountGroupsDesc=Puede definir aquí algunos grupos de cuentas contables. Se usarán para informes de contabilidad personalizados. DelMonth=Mes para borrar DelJournal=Diario para borrar diff --git a/htdocs/langs/es_EC/main.lang b/htdocs/langs/es_EC/main.lang index 380410b1ba1..efe82c21ed2 100644 --- a/htdocs/langs/es_EC/main.lang +++ b/htdocs/langs/es_EC/main.lang @@ -477,8 +477,6 @@ ClassifyBilled=Clasificar facturas ClassifyUnbilled=Clasificar sin facturar ExportFilteredList=Exportar lista filtrada ExportList=Exportar lista -ExportOfPiecesAlreadyExportedIsEnable=La exportación de piezas ya exportadas está habilitada -ExportOfPiecesAlreadyExportedIsDisable=La exportación de piezas ya exportadas está desactivada AllExportedMovementsWereRecordedAsExported=Todos los movimientos exportados se registraron como exportados NotAllExportedMovementsCouldBeRecordedAsExported=No todos los movimientos exportados pueden registrarse como exportados Miscellaneous=Varios @@ -552,6 +550,11 @@ ContactDefault_order_supplier=Orden de compra ContactDefault_propal=Propuesta ContactDefault_supplier_proposal=Propuesta de proveedor ContactAddedAutomatically=Contacto agregado de roles de terceros de contacto +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ClientTZ=Zona horaria del cliente Terminate=Terminar Terminated=Terminado diff --git a/htdocs/langs/es_EC/stripe.lang b/htdocs/langs/es_EC/stripe.lang index 66061813b5a..7773d475ebf 100644 --- a/htdocs/langs/es_EC/stripe.lang +++ b/htdocs/langs/es_EC/stripe.lang @@ -18,7 +18,7 @@ STRIPE_LIVE_WEBHOOK_KEY=Webhook clave en vivo ONLINE_PAYMENT_WAREHOUSE=Stock para usar en la disminución de inventario cuando se realiza el pago en línea
    (TODO Cuando la opción para disminuir el inventario se realiza en una acción en la factura y el pago en línea se genera la factura?) StripeLiveEnabled=Stripe activado en vivo (de lo contrario modo prueba/sandbox) StripeImportPayment=Importar pagos en franja -ExampleOfTestCreditCard=Ejemplo de tarjeta de crédito para prueba: %s => válido, %s => error CVC, %s => vencido, %s => el cargo falla +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails StripeGateways=Gateways de Tripe BankAccountForBankTransfer=Cuenta bancaria para pagos de fondos StripeAccount=Cuenta de Stripe @@ -32,3 +32,4 @@ StripeUserAccountForActions=Cuenta de usuario para usar para la notificación po ToOfferALinkForTestWebhook=Enlace para configurar Stripe WebHook para llamar a IPN (modo de prueba) ToOfferALinkForLiveWebhook=Enlace para configurar Stripe WebHook para llamar a IPN (modo en vivo) ClickHereToTryAgain=Haga clic aquí para volver a intentarlo... +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/es_EC/users.lang b/htdocs/langs/es_EC/users.lang index b212c2d9aaa..28f9a6c1fab 100644 --- a/htdocs/langs/es_EC/users.lang +++ b/htdocs/langs/es_EC/users.lang @@ -44,7 +44,6 @@ ListOfGroupsForUser=Lista de grupos de este usuario LinkToCompanyContact=Enlace a un tercero / contacto LinkedToDolibarrMember=Enlace al miembro CreateDolibarrLogin=Crear un usuario -LoginAccountDisableInDolibarr=Cuenta desactivada en Dolibarr. UsePersonalValue=Usar valor personal DomainUser=Usuario del dominio %s CreateInternalUserDesc=Este formulario le permite crear un usuario interno en su empresa / organización. Para crear un usuario externo (cliente, proveedor, etc.), use el botón 'Crear usuario Dolibarr' de la tarjeta de contacto de ese tercero. diff --git a/htdocs/langs/es_ES/accountancy.lang b/htdocs/langs/es_ES/accountancy.lang index 23feaa1f9f3..c4411ff9984 100644 --- a/htdocs/langs/es_ES/accountancy.lang +++ b/htdocs/langs/es_ES/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Seleccione el tipo de retorno de carro ACCOUNTING_EXPORT_PREFIX_SPEC=Especifique el prefijo del nombre de archivo ThisService=Este servicio ThisProduct=Este producto -DefaultForService=Predeterminado para el servicio -DefaultForProduct=Predeterminado para el producto +DefaultForService=Predeterminado para servicios +DefaultForProduct=Predeterminado para productos ProductForThisThirdparty=Producto para este tercero ServiceForThisThirdparty=Servicio para este tercero CantSuggest=No se puede sugerir @@ -101,7 +101,8 @@ ShowAccountingAccount=Mostrar diario de cuentas ShowAccountingJournal=Mostrar diario contable ShowAccountingAccountInLedger=Mostrar cuenta contable en el libro mayor ShowAccountingAccountInJournals=Mostrar cuenta contable en diarios -AccountAccountingSuggest=Cuenta contable sugerida +DataUsedToSuggestAccount=Datos utilizados para sugerir la cuenta +AccountAccountingSuggest=Cuenta sugerida MenuDefaultAccounts=Cuentas contables por defecto MenuBankAccounts=Cuentas Bancarias MenuVatAccounts=Cuentas de IVA @@ -126,6 +127,7 @@ WriteBookKeeping=Registrar transacciones en contabilidad. Bookkeeping=Libro Mayor BookkeepingSubAccount=Libro mayor auxiliar AccountBalance=Saldo de la cuenta +AccountBalanceSubAccount=Saldo de subcuentas ObjectsRef=Referencia de objeto origen CAHTF=Total compras a proveedor antes de impuestos TotalExpenseReport=Total informe de gastos @@ -178,31 +180,32 @@ ACCOUNTING_RESULT_PROFIT=Cuenta contable de resultados (Ganancias) ACCOUNTING_RESULT_LOSS=Cuenta contable de resultados (Pérdidas) ACCOUNTING_CLOSURE_DEFAULT_JOURNAL=Diario de cierre -ACCOUNTING_ACCOUNT_TRANSFER_CASH=Account (from the Chart Of Account) to be used as the account for transitional bank transfers +ACCOUNTING_ACCOUNT_TRANSFER_CASH=Cuenta (del Plan Contable) que se utilizará como cuenta para transferencias bancarias transitorias TransitionalAccount=Cuenta de transferencia bancaria de transición -ACCOUNTING_ACCOUNT_SUSPENSE=Account (from the Chart Of Account) to be used as the account for unallocated funds either received or paid i.e. funds in "wait[ing]" -DONATION_ACCOUNTINGACCOUNT=Account (from the Chart Of Account) to be used to register donations (Donation module) -ADHERENT_SUBSCRIPTION_ACCOUNTINGACCOUNT=Account (from the Chart Of Account) to be used to register memberships subscriptions (Membership module - if membership recorded without invoice) +ACCOUNTING_ACCOUNT_SUSPENSE=Cuenta (del Plan Contable) que se utilizará como cuenta para fondos no asignados recibidos o pagados, es decir, fondos "en espera" +DONATION_ACCOUNTINGACCOUNT=Cuenta (del Plan Contable) que se utilizará para registrar donaciones (módulo de donaciones) +ADHERENT_SUBSCRIPTION_ACCOUNTINGACCOUNT=Cuenta (del Plan Contable) que se utilizará para registrar las suscripciones de membresía (módulo de membresía, si la membresía se registró sin factura) -ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be used as the default account to register customer deposit +ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Cuenta (del Plan Contable) que se utilizará como cuenta predeterminada para registrar el depósito del cliente UseAuxiliaryAccountOnCustomerDeposit=Almacene la cuenta del cliente como cuenta individual en el libro mayor auxiliar para las líneas de anticipos (si está deshabilitada, la cuenta individual para las líneas de anticipos permanecerá vacía) -ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default +ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Cuenta (del Plan Contable) que se utilizará como predeterminada UseAuxiliaryAccountOnSupplierDeposit=Almacene la cuenta del proveedor como cuenta individual en el libro mayor auxiliar para las líneas de anticipos (si está deshabilitada, la cuenta individual para las líneas de anticipos permanecerá vacía) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Cuenta contable por defecto para registrar la garantía retenida por el cliente -ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) -ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) -ACCOUNTING_PRODUCT_BUY_EXPORT_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased and imported from any other foreign country (used if not defined in the product sheet) -ACCOUNTING_PRODUCT_SOLD_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the sold products (used if not defined in the product sheet) -ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products sold from EEC to another EEC country (used if not defined in the product sheet) -ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products sold and exported to any other foreign country (used if not defined in the product sheet) +ACCOUNTING_PRODUCT_BUY_ACCOUNT=Cuenta (del Plan Contable) que se usará como cuenta predeterminada para los productos comprados dentro del mismo país (se usa si no está definida en la hoja del producto) +ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Cuenta (del Plan Contable) que se usará como cuenta predeterminada para los productos comprados de la UE a otro país de UE (se usa si no está definido en la hoja de producto) +ACCOUNTING_PRODUCT_BUY_EXPORT_ACCOUNT=Cuenta (del Plan Contable) que se utilizará como cuenta predeterminada para los productos comprados e importados de cualquier otro país extracomunitario (utilizada si no está definida en la ficha del producto) +ACCOUNTING_PRODUCT_SOLD_ACCOUNT=Cuenta (del Plan Contable) que se usará como cuenta predeterminada para los productos vendidos (se usa si no está definida en la hoja de producto) +ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT=Cuenta (del Plan Contable) que se utilizará como cuenta predeterminada para los productos vendidos desde la UE a otro país de la UE (utilizada si no está definida en la ficha del producto) +ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT=Cuenta (del Plan Contable) que se utilizará como cuenta predeterminada para los productos vendidos y exportados a cualquier otro país extracomunitario (utilizada si no está definida en la ficha del producto) -ACCOUNTING_SERVICE_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the services purchased within same country (used if not defined in the service sheet) -ACCOUNTING_SERVICE_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the services purchased from EEC to another EEC country (used if not defined in the service sheet) -ACCOUNTING_SERVICE_BUY_EXPORT_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the services purchased and imported from other foreign country (used if not defined in the service sheet) -ACCOUNTING_SERVICE_SOLD_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the sold services (used if not defined in the service sheet) -ACCOUNTING_SERVICE_SOLD_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the services sold from EEC to another EEC country (used if not defined in the service sheet) -ACCOUNTING_SERVICE_SOLD_EXPORT_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the services sold and exported to any other foreign country (used if not defined in the service sheet) +ACCOUNTING_SERVICE_BUY_ACCOUNT=Cuenta (del Plan Contable) que se usará como cuenta predeterminada para los servicios comprados dentro del mismo país (se usa si no está definida en la hoja de servicios) +ACCOUNTING_SERVICE_BUY_INTRA_ACCOUNT=Cuenta (del Plan Contable) que se usará como cuenta predeterminada para los servicios comprados de la UE a otro país de UE (se usa si no está definido en la hoja de servicio) +ACCOUNTING_SERVICE_BUY_EXPORT_ACCOUNT=Cuenta (del Plan Contable) que se usará como cuenta predeterminada para los servicios comprados e importados de otro país extracomunitario (se usa si no está definido en la hoja de servicios) +ACCOUNTING_SERVICE_SOLD_ACCOUNT=Cuenta (del Plan Contable) que se usará como cuenta predeterminada para los servicios vendidos (se usa si no está definida en la hoja de servicios) +ACCOUNTING_SERVICE_SOLD_INTRA_ACCOUNT=Cuenta (del Plan Contable) que se utilizará como cuenta predeterminada para los servicios vendidos desde la UE a otro país de la UE (utilizada si no está definida en la hoja de servicio) +ACCOUNTING_SERVICE_SOLD_EXPORT_ACCOUNT=Cuenta (del Plan Contable) que se usará como cuenta predeterminada para los servicios vendidos y exportados a cualquier otro país extracomunitario (se usa si no está definido en la hoja de servicios) Doctype=Tipo de documento Docdate=Fecha @@ -217,7 +220,8 @@ Codejournal=Diario JournalLabel=Etiqueta del diario NumPiece=Apunte TransactionNumShort=Núm. transacción -AccountingCategory=Custom group of accounts +AccountingCategory=Grupo personalizado de cuentas +AccountingCategories=Grupos de cuentas personalizados GroupByAccountAccounting=Agrupar por cuenta del Libro Mayor GroupBySubAccountAccounting=Agrupar por cuenta de libro mayor auxiliar AccountingAccountGroupsDesc=Puedes definir aquí algunos grupos de cuentas contables. Se usarán para informes de contabilidad personalizados. @@ -265,19 +269,20 @@ ShowSubtotalByGroup=Mostrar subtotal por nivel Pcgtype=Grupo de cuenta PcgtypeDesc=Los grupos de cuentas se utilizan como criterios predefinidos de "filtro" y "agrupación" para algunos informes contables. Por ejemplo, 'INGRESOS' o 'GASTOS' se utilizan como grupos para las cuentas contables de productos para construir el informe de gastos / ingresos. +AccountingCategoriesDesc=El grupo personalizado de cuentas se puede usar para agrupar cuentas contables en un solo nombre para facilitar el uso de filtros o la creación de informes personalizados. Reconcilable=Reconciliable TotalVente=Total facturación antes de impuestos TotalMarge=Total margen ventas -DescVentilCustomer=Consult here the list of customer invoice lines bound (or not) to a product account from chart of account -DescVentilMore=In most cases, if you use predefined products or services and you set the account (from chart of account) on the product/service card, the application will be able to make all the binding between your invoice lines and the accounting account of your chart of accounts, just in one click with the button "%s". If account was not set on product/service cards or if you still have some lines not bound to an account, you will have to make a manual binding from the menu "%s". -DescVentilDoneCustomer=Consult here the list of the lines of invoices customers and their product account from chart of account -DescVentilTodoCustomer=Bind invoice lines not already bound with a product account from chart of account -ChangeAccount=Change the product/service account (from chart of account) for the selected lines with the following account: +DescVentilCustomer=Consulta aquí la lista de líneas de factura de cliente vinculadas (o no) a una cuenta de producto desde plan de cuentas +DescVentilMore=En la mayoría de los casos, si usa productos o servicios predefinidos y configura la cuenta (desde el plan de cuentas) en la tarjeta de producto/servicio, la aplicación podrá realizar todos los enlaces entre sus líneas de factura y la cuenta contable de su plan. de cuentas, con solo un clic con el botón "%s" . Si la cuenta no se configuró en las tarjetas de productos/servicios o si todavía tiene algunas líneas no vinculadas a una cuenta, deberá realizar un enlace manual desde el menú " %s ". +DescVentilDoneCustomer=Consulta aquí el listado de las líneas de facturas clientes y su cuenta de producto desde plan de cuentas +DescVentilTodoCustomer=Enlazar líneas de factura que aún no están enlazadas con una cuenta de producto del plan de cuentas +ChangeAccount=Cambie la cuenta de producto/servicio (del plan de cuentas) para las líneas seleccionadas con la siguiente cuenta: Vide=- -DescVentilSupplier=Consult here the list of vendor invoice lines bound or not yet bound to a product account from chart of account (only record not already transfered in accountancy are visible) +DescVentilSupplier=Consulte aquí la lista de líneas de factura de proveedor vinculadas o aún no vinculadas a una cuenta de producto del plan de cuentas (solo se ven los registros que aún no se han transferido en contabilidad) DescVentilDoneSupplier=Consulte aquí las líneas de facturas de proveedores y sus cuentas contables DescVentilTodoExpenseReport=Contabilizar líneas de informes de gastos aún no contabilizadas con una cuenta contable de gastos DescVentilExpenseReport=Consulte aquí la lista de líneas de informes de gastos (o no) a una cuenta contable de gastos @@ -294,15 +299,16 @@ DescValidateMovements=Se prohíbe cualquier modificación o eliminación de regi ValidateHistory=Vincular automáticamente AutomaticBindingDone=Vinculaciones automáticas realizadas (%s) - La vinculación automática no es posible para algunos registros (%s) +DoManualBindingForFailedRecord=Tiene que hacer un enlace manual para las filas %s no enlazadas automáticamente. -ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used -MvtNotCorrectlyBalanced=Movimiento no equilibrado correctamente. Débito = %s & Crédito = %s +ErrorAccountancyCodeIsAlreadyUse=Error, no puede eliminar o deshabilitar esta cuenta de plan de cuentas porque se usa +MvtNotCorrectlyBalanced=Movimiento descuadrado. Débito = %s & Crédito = %s Balancing=Saldo FicheVentilation=Ficha contable GeneralLedgerIsWritten=Transacciones escritas en el Libro Mayor GeneralLedgerSomeRecordWasNotRecorded=Algunas de las operaciones no pueden contabilizarse. Si no hay otro mensaje de error, es probable que ya estén contabilizadas. NoNewRecordSaved=No más registros para transferir -ListOfProductsWithoutAccountingAccount=List of products not bound to any account of chart of account +ListOfProductsWithoutAccountingAccount=Lista de productos no vinculados a ninguna cuenta o plan de cuentas ChangeBinding=Cambiar la unión Accounted=Contabilizada en el Libro Mayor NotYetAccounted=Aún no contabilizado en el libro mayor @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Deshabilitar la vinculación y la transferen ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Deshabilitar la vinculación y transferencia en contabilidad en compras (las facturas de proveedores no se tendrán en cuenta en la contabilidad) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Desactive la vinculación y transferencia en contabilidad en informes de gastos (los informes de gastos no se tendrán en cuenta en la contabilidad) ACCOUNTING_ENABLE_LETTERING=Habilitar la función de letras en la contabilidad. +ACCOUNTING_ENABLE_AUTOLETTERING=Habilite las letras automáticas al transferir a contabilidad ## Export NotExportLettering=No exportar las letras al generar el archivo. NotifiedExportDate=Marcar las líneas exportadas como Exportadas (para modificar una línea, deberá eliminar toda la transacción y volver a transferirla a contabilidad) NotifiedValidationDate=Valide y bloquee las entradas exportadas (mismo efecto que la función "%s", la modificación y eliminación de las líneas DEFINITIVAMENTE no será posible) +NotifiedExportFull=¿Exportar documentos? DateValidationAndLock=Validación de fecha y bloqueo ConfirmExportFile=¿Confirmación de la generación del archivo de exportación contable? ExportDraftJournal=Exportar libro borrador @@ -398,7 +406,7 @@ SaleLocal=Venta local SaleExport=Venta de exportación SaleEEC=Venta en CEE SaleEECWithVAT=Venta en CEE con un IVA no nulo, por lo que suponemos que esto NO es una venta intracomunitaria y la cuenta sugerida es la cuenta de producto estándar. -SaleEECWithoutVATNumber=Venta en CEE sin IVA pero el ID de IVA de un tercero no está definido. Recurrimos a la cuenta del producto para ventas estándar. Puede corregir el ID de IVA de un tercero o la cuenta del producto si es necesario. +SaleEECWithoutVATNumber=Venta en CEE sin IVA pero no se define el ID de IVA de terceros. Recurrimos a la cuenta para las ventas estándar. Puede corregir el ID de IVA del tercero o cambiar la cuenta de producto sugerida para el enlace si es necesario. ForbiddenTransactionAlreadyExported=Prohibido: La transacción ha sido validada y / o exportada. ForbiddenTransactionAlreadyValidated=Prohibido: la transacción ha sido validada. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Discrepancia en el código de conciliación AccountancyErrorMismatchBalanceAmount=El saldo (%s) no es igual a 0 AccountancyErrorLetteringBookkeeping=Se han producido errores con respecto a las transacciones: %s ErrorAccountNumberAlreadyExists=El número de contabilidad %s ya existe +ErrorArchiveAddFile=No se puede poner el archivo "%s" en el archivo ## Import ImportAccountingEntries=Entradas contables @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Código multidivisa (Idevise) DateExport=Fecha de exportación WarningReportNotReliable=Advertencia, este informe no se basa en el Libro mayor, por lo que no contiene modificaciones manualmente modificadas en el Libro mayor.. Si su diario está actualizado, la vista contable es más precisa. ExpenseReportJournal=Informe de gastos diario +DocsAlreadyExportedAreExcluded=Los documentos ya exportados están excluidos +ClickToHideAlreadyExportedLines=Haga clic para ocultar líneas ya exportadas NAccounts=%s cuentas diff --git a/htdocs/langs/es_ES/admin.lang b/htdocs/langs/es_ES/admin.lang index 495988c089b..106fcde2207 100644 --- a/htdocs/langs/es_ES/admin.lang +++ b/htdocs/langs/es_ES/admin.lang @@ -645,6 +645,8 @@ Module2300Name=Tareas programadas Module2300Desc=Gestión del Trabajo programado (alias cron) Module2400Name=Eventos/Agenda Module2400Desc=Sigue los eventos o citas. Registra eventos automáticos a fin de realizar seguimiento o registra eventos manuales o reuniones. Este es el módulo más importante para una buena gestión de relaciones con clientes o proveedores. +Module2430Name=Sistema de calendario de reservas +Module2430Desc=Proporcione un calendario en línea para que cualquier persona pueda reservar citas, de acuerdo con rangos o disponibilidades predefinidos. Module2500Name=GED / SGD Module2500Desc=Sistema de Gestión de Documentos / Gestión Electrónica de Contenidos. Organización automática de sus documentos generados o almacenados. Compártalos cuando lo necesite. Module2600Name=API / Servicios web (servidor SOAP) @@ -660,6 +662,8 @@ Module2900Name=GeoIPMaxmind Module2900Desc=Capacidades de conversión GeoIP Maxmind Module3200Name=Archivos inalterables Module3200Desc=Activar el registro inalterable de eventos empresariales. Los eventos se archivan en tiempo real. El registro es una tabla de sucesos encadenados que se pueden leer y exportar. Este módulo puede ser obligatorio en algunos países. +Module3300Name=Constructor de módulos +Module3200Desc=Activar el registro inalterable de eventos empresariales. Los eventos se archivan en tiempo real. El registro es una tabla de sucesos encadenados que se pueden leer y exportar. Este módulo puede ser obligatorio en algunos países. Module3400Name=Redes sociales Module3400Desc=Habilita campos de Redes Sociales en terceros y direcciones (skype, twitter, facebook...). Module4000Name=RRHH @@ -974,14 +978,14 @@ Permission3301=Generar nuevos módulos Permission4001=Leer habilidad/trabajo/puesto Permission4002=Crear/modificar habilidad/trabajo/puesto Permission4003=Eliminar habilidad/trabajo/puesto -Permission4021=Read evaluations (yours and your subordinates) -Permission4022=Create/modify evaluations +Permission4021=Leer evaluaciones (tuyas y de tus subordinados) +Permission4022=Crear/modificar evaluaciones Permission4023=Validar evaluación Permission4025=Eliminar evaluación Permission4028=Ver menú de comparación Permission4031=Leer información personal Permission4032=escribir información personal -Permission4033=Read all evaluations (even those of user not subordinates) +Permission4033=Leer todas las evaluaciones (incluso las de usuarios no subordinados) Permission10001=Leer contenido del sitio web Permission10002=Crear modificar contenido del sitio web (contenido html y javascript) Permission10003=Crear/modificar contenido del sitio web (código php dinámico). Peligroso, debe reservarse a desarrolladores restringidos. @@ -1270,6 +1274,7 @@ TriggerActiveAsModuleActive=Triggers de este archivo activos ya que el módulo < GeneratedPasswordDesc=Elija el método que se utilizará para las contraseñas generadas automáticamente. DictionaryDesc=Inserte aquí los datos de referencia. Puede añadir sus datos a los predefinidos. ConstDesc=Esta página le permite editar (anular) parámetros que no están disponibles en otras páginas. Estos están reservados principalmente a desarrolladores o soluciones avanzadas. +MiscellaneousOptions=Opciones varias MiscellaneousDesc=Todos los otros parámetros relacionados con la seguridad se definen aquí. LimitsSetup=Configuración de límites y precisiones LimitsDesc=Puede definir aquí los límites y precisiones utilizados por Dolibarr @@ -1303,7 +1308,7 @@ YouMustRunCommandFromCommandLineAfterLoginToUser=Debe ejecutar el comando desde YourPHPDoesNotHaveSSLSupport=Funciones SSL no disponibles en su PHP DownloadMoreSkins=Más temas para descargar SimpleNumRefModelDesc=Devuelve el número de referencia en el formato %syymm-nnnn donde aa es el año, mm es el mes y nnnn es un número secuencial que se incrementa automáticamente sin reinicio. -SimpleRefNumRefModelDesc=Returns the reference number in the format n where n is a sequential auto-incrementing number with no reset +SimpleRefNumRefModelDesc=Devuelve el número de referencia en el formato n, donde n es un número de incremento automático secuencial sin restablecimiento AdvancedNumRefModelDesc=Devuelve el número de referencia en el formato %syymm-nnnn donde aa es el año, mm es el mes y nnnn es un número secuencial que se incrementa automáticamente sin reinicio. SimpleNumRefNoDateModelDesc=Devuelve el número de referencia en el formato %s-nnnn donde nnnn es un número secuencial que se incrementa automáticamente sin reinicio ShowProfIdInAddress=Mostrar el identificador profesional en las direcciones @@ -1491,7 +1496,7 @@ WatermarkOnDraftContractCards=Marca de agua en contratos (nada si está vacía) ##### Members ##### MembersSetup=Configuración del módulo Asociaciones MemberMainOptions=Opciones principales -MemberCodeChecker=Options for automatic generation of member codes +MemberCodeChecker=Opciones para la generación automática de códigos de miembros AdherentLoginRequired= Gestionar un login para cada miembro AdherentMailRequired=E-Mail obligatorio para crear un miembro nuevo MemberSendInformationByMailByDefault=Casilla de verificación para enviar el correo de confirmación (validación ó nueva cotización) a los miembros es por defecto "sí" @@ -1826,6 +1831,9 @@ AGENDA_USE_EVENT_TYPE=Usar tipos de evento (gestionados en el menú Configuraci AGENDA_USE_EVENT_TYPE_DEFAULT=Establecer automáticamente este valor por defecto para el tipo de evento en la creación de un evento AGENDA_DEFAULT_FILTER_TYPE=Establecer por defecto este tipo de evento en el filtro de búsqueda en la vista de la agenda AGENDA_DEFAULT_FILTER_STATUS=Establecer por defecto este estado de eventos en el filtro de búsqueda en la vista de la agenda +AGENDA_EVENT_PAST_COLOR=Color de eventos pasados +AGENDA_EVENT_CURRENT_COLOR=Color del evento actual +AGENDA_EVENT_FUTURE_COLOR=Color de evento futuro AGENDA_DEFAULT_VIEW=Establecer la vista por defecto al seleccionar el menú Agenda AGENDA_REMINDER_BROWSER=Habilitar el recordatorio de eventos en el navegador del usuario (Cuando se alcanza la fecha de recordatorio, el navegador muestra una ventana emergente. Cada usuario puede deshabilitar dichas notificaciones desde la configuración de notificaciones del navegador). AGENDA_REMINDER_BROWSER_SOUND=Activar sonido de notificación @@ -2129,6 +2137,7 @@ CodeLastResult=Resultado último código NbOfEmailsInInbox=Número de emails en el directorio fuente LoadThirdPartyFromName=Cargar terceros buscando en %s (solo carga) LoadThirdPartyFromNameOrCreate=Cargar terceros terceros buscando en %s (crear si no se encuentra) +LoadContactFromEmailOrCreate=Cargue la búsqueda de contactos en %s (crear si no se encuentra) AttachJoinedDocumentsToObject=Guarde los archivos adjuntos en los documentos del objeto si se encuentra una referencia de un objeto en el asunto del correo electrónico. WithDolTrackingID=Mensaje de una conversación iniciada por un primer e-mail enviado desde Dolibarr WithoutDolTrackingID=Mensaje de una conversación iniciada por un primer e-mail NO enviado desde Dolibarr @@ -2232,12 +2241,12 @@ MailToPartnership=Partner AGENDA_EVENT_DEFAULT_STATUS=Estado de evento predeterminado al crear un evento desde el formulario YouShouldDisablePHPFunctions=Deberías deshabilitar las funciones de PHP IfCLINotRequiredYouShouldDisablePHPFunctions=Excepto si necesita ejecutar comandos del sistema en código personalizado, debe deshabilitar las funciones PHP -PHPFunctionsRequiredForCLI=For shell purpose (like scheduled job backup or running an antivirus program), you must keep PHP functions +PHPFunctionsRequiredForCLI=Para fines de shell (como la copia de seguridad de trabajos programados o la ejecución de un programa antivirus), debe mantener las funciones de PHP NoWritableFilesFoundIntoRootDir=No se encontraron archivos o directorios grabables de los programas comunes en su directorio raíz (Bueno) RecommendedValueIs=Recomendado: %s Recommended=Recomendada NotRecommended=No recomendado -ARestrictedPath=Some restricted path for data files +ARestrictedPath=Algunas rutas restringidas para archivos de datos CheckForModuleUpdate=Compruebe si hay actualizaciones de módulos externos CheckForModuleUpdateHelp=Esta acción se conectará a los editores de módulos externos para comprobar si hay una nueva versión disponible. ModuleUpdateAvailable=Hay una actualización disponible @@ -2355,3 +2364,5 @@ AllowExternalDownload=Permitir descarga externa (sin inicio de sesión, usando u DeadlineDayVATSubmission=Fecha límite para la presentación de IVA en el próximo mes MaxNumberOfAttachementOnForms=Número máximo de archivos unidos en un formulario IfDefinedUseAValueBeetween=Si está definido, use un valor entre %s y %s +Reload=Recargar +ConfirmReload=Confirmar recarga de módulo diff --git a/htdocs/langs/es_ES/boxes.lang b/htdocs/langs/es_ES/boxes.lang index 5df1fa1126d..3109afd00fc 100644 --- a/htdocs/langs/es_ES/boxes.lang +++ b/htdocs/langs/es_ES/boxes.lang @@ -24,6 +24,7 @@ BoxFicheInter=Últimas intervenciones BoxCurrentAccounts=Balance de cuentas abiertas BoxTitleMemberNextBirthdays=Cumpleaños de este mes (miembros) BoxTitleMembersByType=Miembros por tipo y estado +BoxTitleMembersByTags=Miembros por etiquetas y estado BoxTitleMembersSubscriptionsByYear=Suscripciones de miembros por año BoxTitleLastRssInfos=Últimas %s noticias de %s BoxTitleLastProducts=Productos/Servicios: últimos %s modificados diff --git a/htdocs/langs/es_ES/companies.lang b/htdocs/langs/es_ES/companies.lang index e12c0e84e1f..64619107e23 100644 --- a/htdocs/langs/es_ES/companies.lang +++ b/htdocs/langs/es_ES/companies.lang @@ -312,12 +312,12 @@ CustomerRelativeDiscountShort=Descuento relativo CustomerAbsoluteDiscountShort=Descuento fijo CompanyHasRelativeDiscount=Este cliente tiene un descuento por defecto de %s%% CompanyHasNoRelativeDiscount=Este cliente no tiene descuentos relativos por defecto -HasRelativeDiscountFromSupplier=Tiene un descuento predeterminado de %s%% en este proveedor -HasNoRelativeDiscountFromSupplier=No tiene descuento relativo predeterminado en este proveedor +HasRelativeDiscountFromSupplier=Tiene un descuento predeterminado de %s%% con este proveedor +HasNoRelativeDiscountFromSupplier=Sin descuento relativo predeterminado con este proveedor CompanyHasAbsoluteDiscount=Este cliente tiene %s %s en descuentos (abonos o anticipos) disponibles CompanyHasDownPaymentOrCommercialDiscount=Este cliente tiene descuentos disponibles (anticipos, comerciales) para %s %s CompanyHasCreditNote=Este cliente tiene %s %s en anticipos disponibles -HasNoAbsoluteDiscountFromSupplier=No tiene crédito de descuento disponible en este proveedor +HasNoAbsoluteDiscountFromSupplier=No hay descuento/crédito disponible de este proveedor HasAbsoluteDiscountFromSupplier=Tiene descuentos disponibles (notas de créditos o anticipos) para %s %s en este proveedor HasDownPaymentOrCommercialDiscountFromSupplier=Tiene descuentos disponibles (comerciales, anticipos) para %s %s en este proveedor HasCreditNoteFromSupplier=Tiene abonos para %s %s en este proveedor @@ -444,7 +444,7 @@ AddAddress=Añadir dirección SupplierCategory=Categoría de proveedor JuridicalStatus200=Independiente DeleteFile=Eliminación de un archivo -ConfirmDeleteFile=¿Está seguro de querer eliminar este archivo? +ConfirmDeleteFile=¿Está seguro de que desea eliminar este archivo %s ? AllocateCommercial=Asignado a comercial Organization=Organismo FiscalYearInformation=Información del año fiscal @@ -498,3 +498,8 @@ RestOfEurope=Resto de Europa (CEE) OutOfEurope=Fuera de Europa (CEE) CurrentOutstandingBillLate=Factura actual pendiente con retraso BecarefullChangeThirdpartyBeforeAddProductToInvoice=Tenga cuidado, dependiendo de la configuración del precio de su producto, debe cambiar de tercero antes de agregar el producto al POS. +EmailAlreadyExistsPleaseRewriteYourCompanyName=el correo electrónico ya existe, vuelva a escribir el nombre de su empresa +TwoRecordsOfCompanyName=existe más de un registro para esta empresa, contáctenos para completar su solicitud de asociación +CompanySection=Sección de empresa +ShowSocialNetworks=Mostrar redes sociales +HideSocialNetworks=Ocultar redes sociales diff --git a/htdocs/langs/es_ES/errors.lang b/htdocs/langs/es_ES/errors.lang index 05b14db7725..452510379f0 100644 --- a/htdocs/langs/es_ES/errors.lang +++ b/htdocs/langs/es_ES/errors.lang @@ -303,6 +303,7 @@ ErrorValueForTooLow=El valor para %s es demasiado bajo ErrorValueCantBeNull=El valor para %s no puede ser nulo ErrorDateOfMovementLowerThanDateOfFileTransmission=La fecha de la transacción bancaria no puede ser anterior a la fecha de transmisión del archivo ErrorTooMuchFileInForm=Demasiados archivos en el formulario, el número máximo es %s archivo(s) +ErrorSessionInvalidatedAfterPasswordChange=La sesión ha sido invalidada tras un cambio de contraseña, estado o fechas de validez. Vuelva a iniciar sesión. # Warnings WarningParamUploadMaxFileSizeHigherThanPostMaxSize=El parámetro PHP upload_max_filesize (%s) es más alto que el parámetro PHP post_max_size (%s). Esta no es una configuración consistente. @@ -325,6 +326,7 @@ WarningPaymentDateLowerThanInvoiceDate=La fecha de pago (%s) es anterior a la fe WarningTooManyDataPleaseUseMoreFilters=Demasiados datos (más de %s líneas). Utilice más filtros o establezca la constante %s a un límite más alto. WarningSomeLinesWithNullHourlyRate=Algunas veces se realizaron registrod a usuarios, con su precio por hora sin definir. Se utilizó un valor de 0 %s por hora, esto puede dar lugar a la valoración incorrecta del tiempo invertido. WarningYourLoginWasModifiedPleaseLogin=Su cuenta de acceso ha sido modificada. Por razones de seguridad, tendrá que iniciar sesión con su nuevo acceso antes de la próxima acción. +WarningYourPasswordWasModifiedPleaseLogin=Su contraseña fue modificada. Por motivos de seguridad, tendrá que iniciar sesión ahora con su nueva contraseña. WarningAnEntryAlreadyExistForTransKey=Ya existe una entrada para la clave de traducción para este idioma WarningNumberOfRecipientIsRestrictedInMassAction=Atención, el número de destinatarios diferentes está limitado a %scuando se usan las acciones masivas en las listas WarningDateOfLineMustBeInExpenseReportRange=Advertencia, la fecha de la línea no está en el rango del informe de gastos diff --git a/htdocs/langs/es_ES/eventorganization.lang b/htdocs/langs/es_ES/eventorganization.lang index 09528daad51..a0748c54a8d 100644 --- a/htdocs/langs/es_ES/eventorganization.lang +++ b/htdocs/langs/es_ES/eventorganization.lang @@ -54,7 +54,7 @@ EVENTORGANIZATION_FILTERATTENDEES_TYPE = En el formulario para crear/agregar un # Object # EventOrganizationConfOrBooth= Conferencia o cabina -EventOrganizationConfOrBoothes=Conferences or Boothes +EventOrganizationConfOrBoothes=Conferencias o Stands ManageOrganizeEvent = Gestionar la organización de eventos ConferenceOrBooth = Conferencia o cabina ConferenceOrBoothTab = Conferencia o cabina @@ -115,8 +115,8 @@ EvntOrgRegistrationHelpMessage = Aquí puede votar por una conferencia o sugerir EvntOrgRegistrationConfHelpMessage = Aquí, puede sugerir una nueva conferencia para animar durante el evento. EvntOrgRegistrationBoothHelpMessage = Aquí, puede postularse para tener un stand durante el evento. ListOfSuggestedConferences = Lista de conferencias sugeridas -ListOfSuggestedBooths=Suggested booths -ListOfConferencesOrBooths=Conferences or booths of event project +ListOfSuggestedBooths=Stands sugeridos +ListOfConferencesOrBooths=Proyecto de conferencias o stands de evento SuggestConference = Sugerir una nueva conferencia SuggestBooth = Sugerir un stand ViewAndVote = Ver y votar eventos sugeridos @@ -172,3 +172,5 @@ ErrorSeveralCompaniesWithEmailContactUs=Se han encontrado varias empresas con es ErrorSeveralCompaniesWithNameContactUs=Se han encontrado varias empresas con este nombre por lo que no podemos validar automáticamente su registro. Póngase en contacto con nosotros en %s para una validación manual NoPublicActionsAllowedForThisEvent=No hay acciones públicas abiertas al público para este evento. MaxNbOfAttendees=Número máximo de asistentes +DateStartEvent=Fecha de inicio del evento +DateEndEvent=Fecha de finalización del evento diff --git a/htdocs/langs/es_ES/main.lang b/htdocs/langs/es_ES/main.lang index 74e2e5dbe69..2d313c230e8 100644 --- a/htdocs/langs/es_ES/main.lang +++ b/htdocs/langs/es_ES/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=No hay definido grupo de usuarios Password=Contraseña PasswordRetype=Repite tu contraseña NoteSomeFeaturesAreDisabled=Atención, sólo unos pocos módulos/funcionalidades han sido activados en esta demo. +YourUserFile=Tu ficha de usuario Name=Nombre NameSlashCompany=Nombre / Empresa Person=Persona @@ -897,6 +898,9 @@ MassFilesArea=Área de archivos generados por acciones masivas ShowTempMassFilesArea=Mostrar área de archivos generados por acciones masivas ConfirmMassDeletion=Confirmación de borrado en lote ConfirmMassDeletionQuestion=¿Estás seguro que quieres eliminar los %s registro(s) seleccionado(s)? +ConfirmMassClone=Confirmación de clonación masiva +ConfirmMassCloneQuestion=Seleccionar proyecto para clonar +ConfirmMassCloneToOneProject=Clonar al proyecto %s RelatedObjects=Objetos relacionados ClassifyBilled=Clasificar facturado ClassifyUnbilled=Clasificar no facturado @@ -912,8 +916,8 @@ ExportFilteredList=Listado filtrado de exportación ExportList=Listado de exportación ExportOptions=Opciones de exportación IncludeDocsAlreadyExported=Incluir documentos ya exportados -ExportOfPiecesAlreadyExportedIsEnable=Exportar piezas ya exportadas está activado -ExportOfPiecesAlreadyExportedIsDisable=Exportar piezas ya exportadas está desactivado +ExportOfPiecesAlreadyExportedIsEnable=Los documentos ya exportados son visibles y se exportarán +ExportOfPiecesAlreadyExportedIsDisable=Los documentos ya exportados están ocultos y no se exportarán AllExportedMovementsWereRecordedAsExported=Todos los movimientos exportados han sido registrados como exportados NotAllExportedMovementsCouldBeRecordedAsExported=No todos los movimientos exportados pueden ser registrados como exportados Miscellaneous=Miscelánea @@ -1128,6 +1132,7 @@ DeleteFileText=¿Realmente quieres eliminar este archivo? ShowOtherLanguages=Mostrar otros idiomas SwitchInEditModeToAddTranslation=Cambie al modo de edición para agregar traducciones para este idioma NotUsedForThisCustomer=No se utiliza para este cliente. +NotUsedForThisVendor=No se utiliza para este proveedor AmountMustBePositive=El importe debe ser positivo ByStatus=Por estado InformationMessage=Información @@ -1148,18 +1153,18 @@ EventReminder=Recordatorio evento UpdateForAllLines=Actualización para todas las líneas OnHold=En espera Civility=Título Cortesía -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Establecer supervisor +AffectTag=Asignar una etiqueta +AffectUser=Asignar un usuario +SetSupervisor=Establecer el supervisor CreateExternalUser=Crear usuario externo -ConfirmAffectTag=Bulk Tag Assignement -ConfirmAffectUser=Bulk User Assignement -ProjectRole=Rol asignado en cada proyecto -TasksRole=Rol asignado en cada tarea de cada proyecto +ConfirmAffectTag=Asignación de etiquetas masivas +ConfirmAffectUser=Asignación masiva de usuarios +ProjectRole=Rol asignado en cada proyecto/oportunidad +TasksRole=Rol asignado en cada tarea (si se usa) ConfirmSetSupervisor=Conjunto de supervisor masivo ConfirmUpdatePrice=Elija una tarifa de precio de aumento/disminución -ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? -ConfirmAffectUserQuestion=Are you sure you want to assign users to the %s selected record(s)? +ConfirmAffectTagQuestion=¿Está seguro de que desea asignar etiquetas a los registros seleccionados %s? +ConfirmAffectUserQuestion=¿Está seguro de que desea asignar usuarios a los registros seleccionados %s? ConfirmSetSupervisorQuestion=¿Está seguro de que desea configurar el supervisor para los %sregistros seleccionados? ConfirmUpdatePriceQuestion=¿Está seguro de que desea actualizar el precio de los %sregistros seleccionados? CategTypeNotFound=No se encontró ningún tipo de etiqueta para el tipo de registros @@ -1170,7 +1175,7 @@ InformationOnLinkToContract=Este importe es solo el total de todas las líneas d ConfirmCancel=Estás seguro que quieres cancelar EmailMsgID=MsgID de e-mail EmailDate=Fecha de correo electrónico -SetToStatus=Set to status %s +SetToStatus=Establecer en el estado %s SetToEnabled=Establecer como activado SetToDisabled=Establecer como desactivado ConfirmMassEnabling=confirmación de habilitación masiva @@ -1199,8 +1204,8 @@ Terminated=De baja AddLineOnPosition=Agregar línea en la posición (al final si está vacío) ConfirmAllocateCommercial=Asignar confirmación de representante de ventas ConfirmAllocateCommercialQuestion=¿Está seguro de que desea asignar los %sregistros seleccionados? -CommercialsAffected=Sales representatives assigned -CommercialAffected=Sales representative assigned +CommercialsAffected=Representantes de ventas asignados +CommercialAffected=Representante de ventas asignado YourMessage=Tu mensaje YourMessageHasBeenReceived=Tu mensaje ha sido recibido. Le responderemos o contactaremos con usted lo antes posible. UrlToCheck=URL para comprobar @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Creado desde el portal público UserAgent=Agente de usuario InternalUser=Usuario interno ExternalUser=Usuario externo +NoSpecificContactAddress=Sin contacto o dirección específica +NoSpecificContactAddressBis=Esta pestaña está dedicada a forzar contactos o direcciones específicas para el objeto actual. Úselo solo si desea definir uno o varios contactos o direcciones específicas para el objeto cuando la información sobre el tercero no es suficiente o no es precisa. +HideOnVCard=Ocultar %s +AddToContacts=Agregar dirección a mis contactos +LastAccess=Ultimo acceso +UploadAnImageToSeeAPhotoHere=Sube una imagen de la pestaña %s para ver una foto aquí +LastPasswordChangeDate=Última fecha de cambio de contraseña diff --git a/htdocs/langs/es_ES/mrp.lang b/htdocs/langs/es_ES/mrp.lang index 3ef082668bf..9acab0b9cf3 100644 --- a/htdocs/langs/es_ES/mrp.lang +++ b/htdocs/langs/es_ES/mrp.lang @@ -11,7 +11,7 @@ Bom=Lista de materiales BillOfMaterials=Lista de materiales BillOfMaterialsLines=Líneas de lista de materiales BOMsSetup=Configuración del módulo BOM -ListOfBOMs=Bills of material - BOM +ListOfBOMs=Listas de materiales - BOM ListOfManufacturingOrders=Órdenes de fabricación NewBOM=Nueva lista de materiales ProductBOMHelp=Producto para crear (o desmontar) con esta lista de materiales.
    Nota: Los productos con la propiedad 'Naturaleza del producto' = 'Materia prima' no están visibles en esta lista. @@ -102,6 +102,7 @@ NbOperatorsRequired=Número de operadores necesarios THMOperatorEstimated=THM estimado del operador THMMachineEstimated=THM estimado de la máquina WorkstationType=Tipo de estación de trabajo +DefaultWorkstation=Estación de trabajo predeterminada Human=Humano Machine=Máquina HumanMachine=Humano / Máquina @@ -116,5 +117,5 @@ ParentMo=MO Padre MOChild=MO Hijo BomCantAddChildBom=La nomenclatura %s ya está presente en el árbol que conduce a la nomenclatura %s BOMNetNeeds = Necesidades netas de la lista de materiales -BOMProductsList=BOM's products -BOMServicesList=BOM's services +BOMProductsList=Productos de BOM +BOMServicesList=Servicios de BOM diff --git a/htdocs/langs/es_ES/orders.lang b/htdocs/langs/es_ES/orders.lang index ca42b8cba96..8a5a494940a 100644 --- a/htdocs/langs/es_ES/orders.lang +++ b/htdocs/langs/es_ES/orders.lang @@ -96,6 +96,10 @@ OrdersStatisticsSuppliers=Estadísticas de pedidos a proveedores NumberOfOrdersByMonth=Número de pedidos por mes AmountOfOrdersByMonthHT=Importe total de pedidos por mes (sin IVA) ListOfOrders=Listado de pedidos +ListOrderLigne=Lineas de pedidos +productobuy=Productos para comprar solo +productonly=Solo productos +disablelinefree=Sin líneas libres CloseOrder=Cerrar pedido ConfirmCloseOrder=¿Está seguro de querer clasificar este pedido como enviado? Una vez enviado un pedido, solo podrá facturarse ConfirmDeleteOrder=¿Está seguro de querer eliminar este pedido? @@ -131,6 +135,7 @@ SupplierOrderClassifiedBilled=Pedido a proveedor %s clasificado como facturado OtherOrders=Otros pedidos SupplierOrderValidatedAndApproved=El pedido del proveedor está validado y aprobado: %s SupplierOrderValidated=El pedido del proveedor está validado: %s +OrderShowDetail=Mostrar detalle del pedido ##### Types de contacts ##### TypeContact_commande_internal_SALESREPFOLL=Responsable seguimiento pedido cliente TypeContact_commande_internal_SHIPPING=Responsable envío pedido cliente @@ -199,3 +204,5 @@ StatusSupplierOrderApproved=Aprobado StatusSupplierOrderRefused=Rechazado StatusSupplierOrderReceivedPartially=Recibido parcialmente StatusSupplierOrderReceivedAll=Todos los productos recibidos +NeedAtLeastOneInvoice = Tiene que haber al menos una Factura +LineAlreadyDispatched = La línea de pedido ya se recibió. diff --git a/htdocs/langs/es_ES/stripe.lang b/htdocs/langs/es_ES/stripe.lang index eccb8b77b3b..a463b543633 100644 --- a/htdocs/langs/es_ES/stripe.lang +++ b/htdocs/langs/es_ES/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Webhook live key ONLINE_PAYMENT_WAREHOUSE=Stock para usar para la disminución de stock cuando se realiza el pago en línea
    (TODO Cuando la opción para disminuir stock se realiza en una acción en la factura y el pago en línea se genera la factura?) StripeLiveEnabled=Stripe live activado (de lo contrario en modo test/sandbox) StripeImportPayment=Importar pagos Stripe -ExampleOfTestCreditCard=Ejemplo de tarjeta de crédito para pruebas: %s=> válida,%s => error CVC, %s => caducada, %s => la carga falla +ExampleOfTestCreditCard=Ejemplo de tarjeta de crédito para prueba SEPA: %s => válida, %s => error CVC, %s => caducada, %s => fallo en el cargo +ExampleOfTestBankAcountForSEPA=Ejemplo de cuenta bancaria IBAN para prueba de débito directo: %s StripeGateways=Pasarelas de Stripe OAUTH_STRIPE_TEST_ID=Stripe Connect Client ID (ca _...) OAUTH_STRIPE_LIVE_ID=Stripe Connect Client ID (ca _...) @@ -61,6 +62,7 @@ DeleteACard=Eliminar tarjeta ConfirmDeleteCard=¿Está seguro de querer eliminar esta tarjeta de crédito o débito? CreateCustomerOnStripe=Crear cliente en Stripe CreateCardOnStripe=Crea una tarjeta en Stripe +CreateBANOnStripe=Crear banco en Stripe ShowInStripe=Mostrar en Stripe StripeUserAccountForActions=Cuenta de usuario para usar en algunos e-mails de notificación de eventos Stripe (pagos de Stripe) StripePayoutList=Lista de pagos de Stripe @@ -69,4 +71,8 @@ ToOfferALinkForLiveWebhook=Enlace para configurar Stripe WebHook para llamar a l PaymentWillBeRecordedForNextPeriod=El pago se registrará para el próximo período. ClickHereToTryAgain=Haga clic aquí para volver a intentarlo ... CreationOfPaymentModeMustBeDoneFromStripeInterface=Debido a las fuertes reglas de autenticación del cliente, la creación de una tarjeta debe hacerse desde la oficina administrativa de Stripe. Puede hacer clic aquí para activar el registro de cliente de Stripe: %s -TERMINAL_LOCATION=Ubicación (dirección) para terminales +STRIPE_CARD_PRESENT=Tarjeta Presente para Terminales Stripe +TERMINAL_LOCATION=Ubicación (dirección) para terminales Stripe +RequestDirectDebitWithStripe=Solicitar Débito Directo con Stripe +STRIPE_SEPA_DIRECT_DEBIT=Habilitar los pagos de Débito Directo a través de Stripe + diff --git a/htdocs/langs/es_ES/ticket.lang b/htdocs/langs/es_ES/ticket.lang index c54e1bde536..9b731c8f1bd 100644 --- a/htdocs/langs/es_ES/ticket.lang +++ b/htdocs/langs/es_ES/ticket.lang @@ -26,6 +26,7 @@ Permission56002=Modificar tickets Permission56003=Eliminar tickets Permission56004=Administrar tickets Permission56005=Ver tickets de todos los terceros (no aplicable para usuarios externos, siempre estará limitada al tercero del que dependen) +Permission56006=Exportar tickets Tickets=Tickets TicketDictType=Tipo de tickets @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=Contribuidor externo OriginEmail=Email del emisor Notify_TICKET_SENTBYMAIL=Enviar mensaje de ticket por e-mail +ExportDataset_ticket_1=Tickets + # Status Read=Leido Assigned=Asignado diff --git a/htdocs/langs/es_ES/users.lang b/htdocs/langs/es_ES/users.lang index e6d8164287c..aa3901d511f 100644 --- a/htdocs/langs/es_ES/users.lang +++ b/htdocs/langs/es_ES/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Enlace al usuario LinkedToDolibarrThirdParty=Enlace a un tercero CreateDolibarrLogin=Crear una cuenta de usuario CreateDolibarrThirdParty=Crear un tercero -LoginAccountDisableInDolibarr=La cuenta está desactivada en Dolibarr +LoginAccountDisableInDolibarr=Cuenta deshabilitada en Dolibarr +PASSWORDInDolibarr=Contraseña modificada en Dolibarr UsePersonalValue=Utilizar valores personalizados ExportDataset_user_1=Usuarios y sus propiedades. DomainUser=Usuario de dominio @@ -129,3 +130,6 @@ IPLastLogin=IP último inicio de sesión IPPreviousLogin=IP inicio de sesión anterior ShowAllPerms=Mostrar todas las filas de permisos HideAllPerms=Ocultar todas las filas de permisos +UserPublicPageDesc=Puede habilitar una tarjeta virtual para este usuario. Una URL con el perfil de usuario y un código de barras estará disponible para permitir que cualquier persona con un teléfono inteligente lo escanee y agregue su contacto a su libreta de direcciones. +EnablePublicVirtualCard=Habilitar la tarjeta de usuario virtual pública +PublicVirtualCardUrl=Tarjeta de usuario virtual pública diff --git a/htdocs/langs/es_GT/stripe.lang b/htdocs/langs/es_GT/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/es_GT/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/es_HN/stripe.lang b/htdocs/langs/es_HN/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/es_HN/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/es_MX/accountancy.lang b/htdocs/langs/es_MX/accountancy.lang index 50e369435ae..30bd464f5a7 100644 --- a/htdocs/langs/es_MX/accountancy.lang +++ b/htdocs/langs/es_MX/accountancy.lang @@ -4,7 +4,6 @@ ACCOUNTING_EXPORT_DATE=Formato de fecha para el archivo de exportación ACCOUNTING_EXPORT_PIECE=Exportar el número de pieza ACCOUNTING_EXPORT_GLOBAL_ACCOUNT=Exportación con cuenta global ACCOUNTING_EXPORT_ENDLINE=Seleccione el estilo del salto de línea -DefaultForService=Predeterminado para servicio Chartofaccounts=Gráfico de cuentas CurrentDedicatedAccountingAccount=Cuenta actual dedicada  AssignDedicatedAccountingAccount=Nueva cuenta para asignar @@ -85,6 +84,8 @@ ACCOUNTING_RESULT_LOSS=Cuenta contable de resultados (Pérdida) ACCOUNTING_CLOSURE_DEFAULT_JOURNAL=Cierre Diario TransitionalAccount=Cuenta de transferencia bancaria transitoria LabelAccount=Descripción de la cuenta +AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts DelYear=Año a borrar DelJournal=Diario a borrar DescFinanceJournal=Diario financiero incluyendo todos los tipos de pagos por cuenta bancaria diff --git a/htdocs/langs/es_MX/stripe.lang b/htdocs/langs/es_MX/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/es_MX/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/es_PA/stripe.lang b/htdocs/langs/es_PA/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/es_PA/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/es_PE/accountancy.lang b/htdocs/langs/es_PE/accountancy.lang index a43c2546c0d..b7e61c4a997 100644 --- a/htdocs/langs/es_PE/accountancy.lang +++ b/htdocs/langs/es_PE/accountancy.lang @@ -9,8 +9,6 @@ ACCOUNTING_EXPORT_AMOUNT=Monto de exportación ACCOUNTING_EXPORT_DEVISE=Moneda de exportación ACCOUNTING_EXPORT_ENDLINE=Seleccionar el tipo de retorno de carro ACCOUNTING_EXPORT_PREFIX_SPEC=Especifique el prefijo del nombre del fichero -DefaultForService=Servicio por defecto -DefaultForProduct=Producto por defecto Journals=Revistas JournalFinancial=Revistas financieras BackToChartofaccounts=Retornar gráfico de cuentas @@ -37,5 +35,7 @@ ACCOUNTING_LENGTH_GACCOUNT=Longitud de las cuentas de contabilidad general (si e ACCOUNTING_EXPENSEREPORT_JOURNAL=Informe de Gastos Diario ACCOUNTING_SOCIAL_JOURNAL=Diario Social Codejournal=Periódico +AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts FinanceJournal=Periodo Financiero TotalMarge=Margen total de ventas diff --git a/htdocs/langs/es_PE/stripe.lang b/htdocs/langs/es_PE/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/es_PE/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/es_PY/stripe.lang b/htdocs/langs/es_PY/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/es_PY/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/es_US/stripe.lang b/htdocs/langs/es_US/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/es_US/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/es_UY/stripe.lang b/htdocs/langs/es_UY/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/es_UY/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/es_VE/accountancy.lang b/htdocs/langs/es_VE/accountancy.lang new file mode 100644 index 00000000000..cf74ffb05a8 --- /dev/null +++ b/htdocs/langs/es_VE/accountancy.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - accountancy +AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts diff --git a/htdocs/langs/es_VE/stripe.lang b/htdocs/langs/es_VE/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/es_VE/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/et_EE/users.lang b/htdocs/langs/et_EE/users.lang index 5a64e4c5b2a..06d8fde378a 100644 --- a/htdocs/langs/et_EE/users.lang +++ b/htdocs/langs/et_EE/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Link to user LinkedToDolibarrThirdParty=Link to third party CreateDolibarrLogin=Loo kasutaja CreateDolibarrThirdParty=Loo kolmas isi -LoginAccountDisableInDolibarr=Konto on Dolibarris blokeeritud. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Kasuta isikustatud väärtust ExportDataset_user_1=Users and their properties DomainUser=Domeeni kasutaja %s @@ -129,3 +130,6 @@ IPLastLogin=IP last login IPPreviousLogin=IP previous login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/fa_IR/accountancy.lang b/htdocs/langs/fa_IR/accountancy.lang index 5b47b8f01da..2d0970ce61f 100644 --- a/htdocs/langs/fa_IR/accountancy.lang +++ b/htdocs/langs/fa_IR/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=انتخاب نوع بازگشت محموله ACCOUNTING_EXPORT_PREFIX_SPEC=انتخاب پیش‌وند نام فایل ThisService=این خدمت ThisProduct=این محصول -DefaultForService=پیش‌فرض برای خدمات -DefaultForProduct=پیش‌فرض برای محصول +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Product for this thirdparty ServiceForThisThirdparty=Service for this thirdparty CantSuggest=امکان پیش‌نهاد نیست @@ -101,7 +101,8 @@ ShowAccountingAccount=نمایش حساب حساب‌داری ShowAccountingJournal=نمایش دفترنویسی حساب‌داری ShowAccountingAccountInLedger=Show accounting account in ledger ShowAccountingAccountInJournals=Show accounting account in journals -AccountAccountingSuggest=حساب حسابداری پیشنهاد شده +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=حساب‌های پیش‌فرض MenuBankAccounts=حسابهای بانکی MenuVatAccounts=حساب‌های مالیات بر ارزش افزوده @@ -126,6 +127,7 @@ WriteBookKeeping=Record transactions in accounting Bookkeeping=دفترکل BookkeepingSubAccount=Subledger AccountBalance=موجودی حساب +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=مرجع شیء منبع CAHTF=خرید کل تامین کننده قبل از مالیات TotalExpenseReport=گزارش هزینۀ کل @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=برچسب دفتر NumPiece=شمارۀ بخش TransactionNumShort=تعداد تراکنش‌ها AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Group by general ledger account GroupBySubAccountAccounting=Group by subledger account AccountingAccountGroupsDesc=در این قسمت می‌توانید گروه‌های متشکل از حساب‌حساب‌داری بسازید. این گروه‌ها برای گزارش‌های دل‌خواه حساب‌داری استفاده می‌شود. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Show subtotal by level Pcgtype=گروه حساب PcgtypeDesc=Group of account are used as predefined 'filter' and 'grouping' criteria for some accounting reports. For example, 'INCOME' or 'EXPENSE' are used as groups for accounting accounts of products to build the expense/income report. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Reconcilable @@ -294,6 +299,7 @@ DescValidateMovements=Any modification or deletion of writing, lettering and del ValidateHistory=بندکردن خودکار AutomaticBindingDone=Automatic bindings done (%s) - Automatic binding not possible for some record (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Disable binding & transfer in accountancy on ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Disable binding & transfer in accountancy on purchases (vendor invoices will not be taken into account in accounting) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Disable binding & transfer in accountancy on expense reports (expense reports will not be taken into account in accounting) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Flag exported lines as Exported (to modify a line, you will need to delete the whole transaction and re-transfert it into accounting) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=Date validation and lock ConfirmExportFile=Confirmation of the generation of the accounting export file ? ExportDraftJournal=صادرکردن پیش‌نویس دفتر @@ -398,7 +406,7 @@ SaleLocal=Local sale SaleExport=Export sale SaleEEC=Sale in EEC SaleEECWithVAT=Sale in EEC with a VAT not null, so we suppose this is NOT an intracommunautary sale and the suggested account is the standard product account. -SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fallback on the product account for standard sales. You can fix the VAT ID of thirdparty or the product account if needed. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Forbidden: The transaction has been validated and/or exported. ForbiddenTransactionAlreadyValidated=Forbidden: The transaction has been validated. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Mismatch in reconcile code AccountancyErrorMismatchBalanceAmount=The balance (%s) is not equal to 0 AccountancyErrorLetteringBookkeeping=Errors have occurred concerning the transactions: %s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=ورودی‌های حساب‌داری @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Multicurrency code (Idevise) DateExport=Date export WarningReportNotReliable=هشدار! این گزارش بر مبنای دفتر کل نمی‌باشد، بنابراین دربردارندۀ تراکنش‌هائی که به شکل دستی در دفترکل ویرایش شده‌اند نیست. در صورتی که دفترنویسی شما روزآمد باشد، نمای «دفترنویسی» دقیق‌تر است. ExpenseReportJournal=دفتر گزارش هزینه‌ها +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s accounts diff --git a/htdocs/langs/fa_IR/main.lang b/htdocs/langs/fa_IR/main.lang index 19e748d4087..1d818d1e42a 100644 --- a/htdocs/langs/fa_IR/main.lang +++ b/htdocs/langs/fa_IR/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=هیچ گروه‌کاربری تعریف نشده است Password=گذرواژه PasswordRetype=Repeat your password NoteSomeFeaturesAreDisabled=توجه داشته باشید بسیاری از قابلیت‌ها/واحدها در این نسخۀ نمایشی غیر فهال است +YourUserFile=Your user file Name=نام NameSlashCompany=نام / شرکت Person=شخص @@ -897,6 +898,9 @@ MassFilesArea=محل فایل‌های تولید شده توسط کنش‌ها ShowTempMassFilesArea=نمایش محل فایل‌های تولید شده با کنش‌های گروهی ConfirmMassDeletion=تائید حذف گروهی ConfirmMassDeletionQuestion=آیا مطمئنید می‌خواهید (%s) ردیف انتخاب شده را حذف کنید؟ +ConfirmMassClone=Bulk clone confirmation +ConfirmMassCloneQuestion=Select project to clone to +ConfirmMassCloneToOneProject=Clone to project %s RelatedObjects=اشیاء مربوطه ClassifyBilled=طبقه‌بندی صورت‌شده‌ها ClassifyUnbilled=طبقه‌بندی صورت‌نشده‌ها @@ -912,8 +916,8 @@ ExportFilteredList=فهرست گزینشی صادرا ExportList=فهرست صادرات ExportOptions=گزینه‌های صادرکردن IncludeDocsAlreadyExported=دربرگرفتن مستنداتی که قبلا صادر شده‌اند -ExportOfPiecesAlreadyExportedIsEnable=دربرگیری بخش‌هائی که قبلا صادر شده‌اند فعال است -ExportOfPiecesAlreadyExportedIsDisable=دربرگیری بخش‌هائی که قبلا صادر شده‌اند غیر فعال است +ExportOfPiecesAlreadyExportedIsEnable=Documents already exported are visible and will be exported +ExportOfPiecesAlreadyExportedIsDisable=Documents already exported are hidden and won't be exported AllExportedMovementsWereRecordedAsExported=همۀ جابه‌جائی‌های صادر شده به عنوان صادرشده ثبت شد NotAllExportedMovementsCouldBeRecordedAsExported=همۀ جابه‌جائی‌های صادرشده نمی‌توانند به‌عنوان صادرشده ثبت شوند Miscellaneous=متفرقه @@ -1128,6 +1132,7 @@ DeleteFileText=Do you really want delete this file? ShowOtherLanguages=Show other languages SwitchInEditModeToAddTranslation=Switch in edit mode to add translations for this language NotUsedForThisCustomer=Not used for this customer +NotUsedForThisVendor=Not used for this vendor AmountMustBePositive=Amount must be positive ByStatus=By status InformationMessage=اطلاعات @@ -1148,14 +1153,14 @@ EventReminder=Event Reminder UpdateForAllLines=Update for all lines OnHold=On hold Civility=Civility -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Set Supervisor +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor CreateExternalUser=Create external user ConfirmAffectTag=Bulk Tag Assignement ConfirmAffectUser=Bulk User Assignement -ProjectRole=Role assigned on each project -TasksRole=Role assigned on each task of each project +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ConfirmSetSupervisor=Bulk Supervisor Set ConfirmUpdatePrice=Choose a increase/decrease price rate ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Created from Public portal UserAgent=User Agent InternalUser=کاربر داخلی ExternalUser=کاربر خارجی +NoSpecificContactAddress=No specific contact or address +NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. +HideOnVCard=Hide %s +AddToContacts=Add address to my contacts +LastAccess=Last access +UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here +LastPasswordChangeDate=Last password change date diff --git a/htdocs/langs/fa_IR/ticket.lang b/htdocs/langs/fa_IR/ticket.lang index 82366e4da30..3224cdeccb6 100644 --- a/htdocs/langs/fa_IR/ticket.lang +++ b/htdocs/langs/fa_IR/ticket.lang @@ -26,6 +26,7 @@ Permission56002=ویرایش برگه‌ه Permission56003=حذف برگه‌ها Permission56004=مدیریت برگه‌ها Permission56005=نمایش همۀ برگه‌های مربوط به اشخاص سوم (برای کاربران خارجی مؤثر نیست و همواره به شخص‌سومی که به‌آن وصل است وابسته است) +Permission56006=Export tickets Tickets=برگه‌های پشتیبانی TicketDictType=برگه‌ها - انواع @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=مشارکت‌کنندۀ بیرونی OriginEmail=Reporter Email Notify_TICKET_SENTBYMAIL=ارسال پیام برگه با رایانامه +ExportDataset_ticket_1=برگه‌های پشتیبانی + # Status Read=خوانده‌شده Assigned=نسبت‌داده شده diff --git a/htdocs/langs/fa_IR/users.lang b/htdocs/langs/fa_IR/users.lang index 08839378ffa..eae16b0b173 100644 --- a/htdocs/langs/fa_IR/users.lang +++ b/htdocs/langs/fa_IR/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Link to user LinkedToDolibarrThirdParty=Link to third party CreateDolibarrLogin=ساختن یک کاربر CreateDolibarrThirdParty=ایجاد یک شخص‌سوم -LoginAccountDisableInDolibarr=حساب در Dolibarr غیرفعال است +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=استفاده از مقداردهی شخصی ExportDataset_user_1=کاربران و مشخصات آنها DomainUser=کاربر دامنه %s @@ -129,3 +130,6 @@ IPLastLogin=IP last login IPPreviousLogin=IP previous login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/fi_FI/accountancy.lang b/htdocs/langs/fi_FI/accountancy.lang index 0678ec04501..c74f9bf06b5 100644 --- a/htdocs/langs/fi_FI/accountancy.lang +++ b/htdocs/langs/fi_FI/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Select the carriage return type ACCOUNTING_EXPORT_PREFIX_SPEC=Määritä tiedostonimen etuliite ThisService=Tämä palvelu ThisProduct=Tämä tuote -DefaultForService=Oletusarvo palvelulle -DefaultForProduct=Oletusarvo tuotteelle +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Product for this thirdparty ServiceForThisThirdparty=Service for this thirdparty CantSuggest=Ei ehdotuksia @@ -101,7 +101,8 @@ ShowAccountingAccount=Show accounting account ShowAccountingJournal=Show accounting journal ShowAccountingAccountInLedger=Show accounting account in ledger ShowAccountingAccountInJournals=Show accounting account in journals -AccountAccountingSuggest=Ehdotettu kirjanpitotili +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=Oletustilit MenuBankAccounts=Pankkitilit MenuVatAccounts=Arvonlisäverotilit @@ -126,6 +127,7 @@ WriteBookKeeping=Record transactions in accounting Bookkeeping=Pääkirjanpito BookkeepingSubAccount=Subledger AccountBalance=Tilin saldo +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Source object ref CAHTF=Total purchase vendor before tax TotalExpenseReport=Total expense report @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=Journal label NumPiece=Piece number TransactionNumShort=Num. transaction AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Group by general ledger account GroupBySubAccountAccounting=Group by subledger account AccountingAccountGroupsDesc=You can define here some groups of accounting account. They will be used for personalized accounting reports. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Show subtotal by level Pcgtype=Group of account PcgtypeDesc=Group of account are used as predefined 'filter' and 'grouping' criteria for some accounting reports. For example, 'INCOME' or 'EXPENSE' are used as groups for accounting accounts of products to build the expense/income report. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Reconcilable @@ -294,6 +299,7 @@ DescValidateMovements=Any modification or deletion of writing, lettering and del ValidateHistory=Bind Automatically AutomaticBindingDone=Automatic bindings done (%s) - Automatic binding not possible for some record (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Disable binding & transfer in accountancy on ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Disable binding & transfer in accountancy on purchases (vendor invoices will not be taken into account in accounting) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Disable binding & transfer in accountancy on expense reports (expense reports will not be taken into account in accounting) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Flag exported lines as Exported (to modify a line, you will need to delete the whole transaction and re-transfert it into accounting) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=Date validation and lock ConfirmExportFile=Confirmation of the generation of the accounting export file ? ExportDraftJournal=Export draft journal @@ -398,7 +406,7 @@ SaleLocal=Local sale SaleExport=Export sale SaleEEC=Sale in EEC SaleEECWithVAT=Sale in EEC with a VAT not null, so we suppose this is NOT an intracommunautary sale and the suggested account is the standard product account. -SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fallback on the product account for standard sales. You can fix the VAT ID of thirdparty or the product account if needed. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Forbidden: The transaction has been validated and/or exported. ForbiddenTransactionAlreadyValidated=Forbidden: The transaction has been validated. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Mismatch in reconcile code AccountancyErrorMismatchBalanceAmount=The balance (%s) is not equal to 0 AccountancyErrorLetteringBookkeeping=Errors have occurred concerning the transactions: %s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Accounting entries @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Multicurrency code (Idevise) DateExport=Date export WarningReportNotReliable=Warning, this report is not based on the Ledger, so does not contains transaction modified manually in the Ledger. If your journalization is up to date, the bookkeeping view is more accurate. ExpenseReportJournal=Expense Report Journal +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s accounts diff --git a/htdocs/langs/fi_FI/ticket.lang b/htdocs/langs/fi_FI/ticket.lang index 426a643557d..8d8c3b74108 100644 --- a/htdocs/langs/fi_FI/ticket.lang +++ b/htdocs/langs/fi_FI/ticket.lang @@ -26,6 +26,7 @@ Permission56002=Modify tickets Permission56003=Poista tiketit Permission56004=Manage tickets Permission56005=See tickets of all third parties (not effective for external users, always be limited to the third party they depend on) +Permission56006=Export tickets Tickets=Tiketit TicketDictType=Ticket - Types @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=External contributor OriginEmail=Reporter Email Notify_TICKET_SENTBYMAIL=Send ticket message by email +ExportDataset_ticket_1=Tiketit + # Status Read=Luettu Assigned=Assigned diff --git a/htdocs/langs/fi_FI/users.lang b/htdocs/langs/fi_FI/users.lang index 00493d036ae..5b042db67d6 100644 --- a/htdocs/langs/fi_FI/users.lang +++ b/htdocs/langs/fi_FI/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Link to user LinkedToDolibarrThirdParty=Link to third party CreateDolibarrLogin=Luo Dolibarr huomioon CreateDolibarrThirdParty=Luo kolmasosaa osapuoli -LoginAccountDisableInDolibarr=Huomioon vammaisten Dolibarr. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Käytä henkilökohtaista arvo ExportDataset_user_1=Users and their properties DomainUser=Domain käyttäjän %s @@ -129,3 +130,6 @@ IPLastLogin=IP last login IPPreviousLogin=IP previous login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/fr_BE/stripe.lang b/htdocs/langs/fr_BE/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/fr_BE/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/fr_CA/accountancy.lang b/htdocs/langs/fr_CA/accountancy.lang index 19b2f9918d8..5d526c789eb 100644 --- a/htdocs/langs/fr_CA/accountancy.lang +++ b/htdocs/langs/fr_CA/accountancy.lang @@ -10,8 +10,6 @@ Selectformat=Sélectionner le format de date pour le fichier ACCOUNTING_EXPORT_FORMAT=Sélectionner le format de date pour le fichier ACCOUNTING_EXPORT_ENDLINE=Sélectionner le type de retour de chariot ACCOUNTING_EXPORT_PREFIX_SPEC=Spécifiez le préfixe du nom de fichier -DefaultForService=Par défaut pour le service -DefaultForProduct=Défaut pour le produit ProductForThisThirdparty=Produit pour ce tier ServiceForThisThirdparty=Service pour ce tier CantSuggest=Ne peut pas suggérer @@ -55,7 +53,6 @@ AccountancyAreaDescClosePeriod=ÉTAPE%s: Période de fermeture afin que nous ne Selectchartofaccounts=Sélectionnez le plan des comptes actif SubledgerAccountLabel=Étiquette de compte auxiliaire ShowAccountingJournal=Afficher le journal comptable -AccountAccountingSuggest=Compte comptable suggéré MenuTaxAccounts=Comptes d'impôts MenuExpenseReportAccounts=Comptes de comptes de dépenses MenuLoanAccounts=Comptes de prêts @@ -90,6 +87,8 @@ ACCOUNTING_LENGTH_DESCRIPTION_ACCOUNT=Tronquer le formulaire de description de c ACCOUNTING_LENGTH_GACCOUNT=Longueur des comptes comptables généraux (Si vous définissez la valeur à 6 ici, le compte '706' apparaîtra comme '706000' à l'écran) BANK_DISABLE_DIRECT_INPUT=Désactiver l'enregistrement direct de la transaction dans le compte bancaire ACCOUNTING_EXPENSEREPORT_JOURNAL=Note de frais +AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts NotMatch=Pas encore défini FinanceJournal=Journal des finances ExpenseReportsJournal=Journal des rapports de dépenses diff --git a/htdocs/langs/fr_CA/categories.lang b/htdocs/langs/fr_CA/categories.lang index 6357b823f41..df1c2447d89 100644 --- a/htdocs/langs/fr_CA/categories.lang +++ b/htdocs/langs/fr_CA/categories.lang @@ -15,7 +15,6 @@ ProductsCategoryShort=Tags/catégories de produits MembersCategoryShort=Tags/catégories de membres CustomersCategoriesShort=Tags/catégories de clients ProspectsCategoriesShort=Prospects tags/catégories -ProductsCategoriesShort=Tags/catégories de produits MembersCategoriesShort=Tags/catégories de membres AccountsCategoriesShort=Étiquettes / catégories de comptes ProjectsCategoriesShort=Projets Tags / catégories diff --git a/htdocs/langs/fr_CH/stripe.lang b/htdocs/langs/fr_CH/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/fr_CH/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/fr_CI/stripe.lang b/htdocs/langs/fr_CI/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/fr_CI/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/fr_CM/stripe.lang b/htdocs/langs/fr_CM/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/fr_CM/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/fr_FR/accountancy.lang b/htdocs/langs/fr_FR/accountancy.lang index 31b1ecc58f1..1657663dea8 100644 --- a/htdocs/langs/fr_FR/accountancy.lang +++ b/htdocs/langs/fr_FR/accountancy.lang @@ -101,7 +101,8 @@ ShowAccountingAccount=Afficher le compte comptable ShowAccountingJournal=Afficher le journal ShowAccountingAccountInLedger=Afficher le compte comptable dans le grand livre ShowAccountingAccountInJournals=Afficher le compte comptable dans les journaux -AccountAccountingSuggest=Code comptable suggéré +DataUsedToSuggestAccount=Données utilisées pour suggérer le compte comptable +AccountAccountingSuggest=Compte comptable suggéré MenuDefaultAccounts=Comptes par défaut MenuBankAccounts=Comptes bancaires MenuVatAccounts=Comptes TVA @@ -126,6 +127,7 @@ WriteBookKeeping=Enregistrer les transactions en comptabilité Bookkeeping=Grand livre BookkeepingSubAccount=Grand livre auxiliaire AccountBalance=Balance des comptes +AccountBalanceSubAccount=Balance des comptes de tiers ObjectsRef=Référence de l'objet source CAHTF=Total achat fournisseur HT TotalExpenseReport=Total note de frais @@ -167,9 +169,9 @@ ACCOUNTING_DEFAULT_PERIOD_ON_TRANSFER=Sur virement comptable, quelle est la pér ACCOUNTING_SELL_JOURNAL=Journal des ventes (ventes et retours) ACCOUNTING_PURCHASE_JOURNAL=Journal des achats (achats et retours) -ACCOUNTING_BANK_JOURNAL=Journal de caisse (encaissements et décaissements) +ACCOUNTING_BANK_JOURNAL=Journal de trésorerie (encaissements et décaissements) ACCOUNTING_EXPENSEREPORT_JOURNAL=Journal des notes de frais -ACCOUNTING_MISCELLANEOUS_JOURNAL=Journal général +ACCOUNTING_MISCELLANEOUS_JOURNAL=Journal des opérations diverses ACCOUNTING_HAS_NEW_JOURNAL=Journal des A-nouveaux ACCOUNTING_INVENTORY_JOURNAL=Journal d'inventaire ACCOUNTING_SOCIAL_JOURNAL=Journal de paie @@ -178,31 +180,32 @@ ACCOUNTING_RESULT_PROFIT=Compte de résultat (Profit) ACCOUNTING_RESULT_LOSS=Compte de résultat (perte) ACCOUNTING_CLOSURE_DEFAULT_JOURNAL=Journal de fermeture -ACCOUNTING_ACCOUNT_TRANSFER_CASH=Compte (du plan comptable) à utiliser comme compte pour les virements bancaires transitoires +ACCOUNTING_ACCOUNT_TRANSFER_CASH=Compte comptable de virement interne TransitionalAccount=Compte transitoire de virement bancaire -ACCOUNTING_ACCOUNT_SUSPENSE=Compte (du plan comptable) à utiliser comme compte pour les fonds non alloués reçus ou payés, c'est-à-dire les fonds en "attente" -DONATION_ACCOUNTINGACCOUNT=Compte (du plan comptable) à utiliser pour enregistrer les dons (module Donation) -ADHERENT_SUBSCRIPTION_ACCOUNTINGACCOUNT=Compte (du plan comptable) à utiliser pour enregistrer les souscriptions d'adhésions (module d'adhésion - si adhésion enregistrée sans facture) +ACCOUNTING_ACCOUNT_SUSPENSE=Compte comptable d'attente +DONATION_ACCOUNTINGACCOUNT=Compte comptable pour la comptabilisation des dons +ADHERENT_SUBSCRIPTION_ACCOUNTINGACCOUNT=Compte comptable pour la comptabilisation des adhésions des adhérents -ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Compte (du plan comptable) à utiliser comme compte par défaut pour enregistrer le dépôt du client +ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Compte (du plan comptable) à utiliser comme compte par défaut pour enregistrer les acomptes client UseAuxiliaryAccountOnCustomerDeposit=Enregistrer le compte client comme compte individuel dans le grand livre auxiliaire pour les lignes d'acompte (si désactivé, le compte individuel pour les lignes d'acompte restera vide) -ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Compte (du plan comptable) à utiliser par défaut -UseAuxiliaryAccountOnSupplierDeposit=Stocker le compte fournisseur comme compte individuel dans le grand livre auxiliaire pour les lignes d'acomptes (si désactivé, le compte individuel pour les lignes d'acompte restera vide) +ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Compte comptable par défaut pour enregistrer l'acompte fournisseur +UseAuxiliaryAccountOnSupplierDeposit=Utiliser le compte comptable auxiliaire fournisseur dans le grand livre auxiliaire pour les lignes d'acomptes fournisseurs (si désactivé, le compte comptable auxiliaire pour les lignes d'acompte restera vide) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Compte comptable par défaut pour l'enregistrement des retenues de garantie clients -ACCOUNTING_PRODUCT_BUY_ACCOUNT=Compte (du plan comptable) à utiliser comme compte par défaut pour les produits achetés dans le même pays (utilisé s'il n'est pas défini dans la fiche produit) -ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Compte (du plan comptable) à utiliser comme compte par défaut pour les produits achetés de la CEE vers un autre pays de la CEE (utilisé si non défini dans la fiche produit) -ACCOUNTING_PRODUCT_BUY_EXPORT_ACCOUNT=Compte (du plan comptable) à utiliser comme compte par défaut pour les produits achetés et importés de tout autre pays étranger (utilisé s'il n'est pas défini dans la fiche produit) -ACCOUNTING_PRODUCT_SOLD_ACCOUNT=Compte (du plan comptable) à utiliser comme compte par défaut pour les produits vendus (utilisé si non défini dans la fiche produit) -ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT=Compte (du Plan Comptable) à utiliser comme compte par défaut pour les produits vendus depuis la CEE vers un autre pays de la CEE (utilisé si non défini dans la fiche produit) -ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT=Compte (du plan comptable) à utiliser comme compte par défaut pour les produits vendus et exportés vers tout autre pays étranger (utilisé s'il n'est pas défini dans la fiche produit) +ACCOUNTING_PRODUCT_BUY_ACCOUNT=Compte comptable par défaut pour les produits achetés dans le même pays (utilisé si non défini dans la fiche produit) +ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Compte comptable par défaut pour les produits achetés dans la CEE (utilisé si non défini dans la fiche produit) +ACCOUNTING_PRODUCT_BUY_EXPORT_ACCOUNT=Compte comptable par défaut pour les produits achetés et importés hors de la CEE (utilisé si non défini dans la fiche produit) +ACCOUNTING_PRODUCT_SOLD_ACCOUNT=Compte comptable par défaut pour les produits vendus (utilisé si non défini dans la fiche produit) +ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT=Compte comptable par défaut pour les produits vendus dans la CEE (utilisé si non définie dans la fiche produit) +ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT=Compte comptable par défaut pour les produits vendus et exportés hors de la CEE (utilisé si non définie dans la fiche produit) -ACCOUNTING_SERVICE_BUY_ACCOUNT=Compte (du plan comptable) à utiliser comme compte par défaut pour les services achetés dans le même pays (utilisé s'il n'est pas défini dans la feuille de services) -ACCOUNTING_SERVICE_BUY_INTRA_ACCOUNT=Compte (du plan comptable) à utiliser comme compte par défaut pour les services achetés depuis la CEE vers un autre pays de la CEE (utilisé s'il n'est pas défini dans la feuille de services) -ACCOUNTING_SERVICE_BUY_EXPORT_ACCOUNT=Compte (du plan comptable) à utiliser comme compte par défaut pour les services achetés et importés d'un autre pays étranger (utilisé s'il n'est pas défini dans la feuille de service) -ACCOUNTING_SERVICE_SOLD_ACCOUNT=Compte (du plan comptable) à utiliser comme compte par défaut pour les services vendus (utilisé s'il n'est pas défini dans la feuille de services) -ACCOUNTING_SERVICE_SOLD_INTRA_ACCOUNT=Compte (du Plan Comptable) à utiliser comme compte par défaut pour les prestations vendues depuis la CEE vers un autre pays de la CEE (utilisé si non défini dans la fiche service) -ACCOUNTING_SERVICE_SOLD_EXPORT_ACCOUNT=Compte (du plan comptable) à utiliser comme compte par défaut pour les services vendus et exportés vers tout autre pays étranger (utilisé s'il n'est pas défini dans la feuille de service) +ACCOUNTING_SERVICE_BUY_ACCOUNT=Compte comptable par défaut pour les services achetés dans le pays (utilisé si non défini dans la fiche service) +ACCOUNTING_SERVICE_BUY_INTRA_ACCOUNT=Compte comptable par défaut pour les services achetés dans la CEE (utilisé si non défini dans la fiche service) +ACCOUNTING_SERVICE_BUY_EXPORT_ACCOUNT=Compte comptable par défaut pour les services achetés et importés hors de la CEE (utilisé si non défini dans la fiche service) +ACCOUNTING_SERVICE_SOLD_ACCOUNT=Compte comptable par défaut pour les services vendus (utilisé si non défini dans la fiche service) +ACCOUNTING_SERVICE_SOLD_INTRA_ACCOUNT=Compte comptable par défaut pour les services vendus dans la CEE (utilisé si non défini dans la fiche service) +ACCOUNTING_SERVICE_SOLD_EXPORT_ACCOUNT=Compte comptable par défaut pour les services vendus et exportés hors de la CEE (utilisé si non définie dans la fiche produit) Doctype=Type de documents Docdate=Date @@ -218,6 +221,7 @@ JournalLabel=Libellé journal NumPiece=Numéro de pièce TransactionNumShort=Num. transaction AccountingCategory=Groupe de comptes personnalisé +AccountingCategories=Groupes de comptes personnalisés GroupByAccountAccounting=Affichage par compte comptable GroupBySubAccountAccounting=Affichage par compte auxiliaire AccountingAccountGroupsDesc=Vous pouvez définir ici des groupes de comptes comptable. Il seront utilisés pour les reporting comptables personnalisés @@ -265,19 +269,20 @@ ShowSubtotalByGroup=Afficher le sous-total par niveau Pcgtype=Groupe de comptes comptables PcgtypeDesc=Les groupes de comptes sont utilisés comme critères de filtre et de regroupement prédéfinis pour certains rapports de comptabilité. Par exemple, «INCOME» ou «EXPENSE» sont utilisés en tant que groupes pour la comptabilité afin de générer le rapport dépenses / revenus. +AccountingCategoriesDesc=Un groupe de comptes personnalisé peut être utilisé pour regrouper les comptes comptables en un seul nom afin de faciliter l'utilisation du filtre ou la création de rapports personnalisés. Reconcilable=Rapprochable TotalVente=Total chiffre affaires hors taxe TotalMarge=Total marge -DescVentilCustomer=Consultez ici la liste des lignes de facture client liées (ou non) à un compte produit du plan comptable -DescVentilMore=Dans la plupart des cas, si vous utilisez des produits ou services prédéfinis et que vous paramétrez le compte (du plan comptable) sur la fiche produit/service, l'application pourra faire toute la liaison entre vos lignes de facture et le compte comptable de votre plan comptable des comptes, juste en un clic avec le bouton "%s" . Si le compte n'a pas été défini sur les fiches produits/services ou s'il vous reste des lignes non liées à un compte, vous devrez effectuer une liaison manuelle depuis le menu " %s ". -DescVentilDoneCustomer=Consultez ici la liste des lignes de factures clients et leur compte produit à partir du plan comptable -DescVentilTodoCustomer=Lier les lignes de facture qui ne sont pas déjà liées à un compte produit à partir d'un plan comptable -ChangeAccount=Modifiez le compte de produit/service (du plan comptable) pour les lignes sélectionnées avec le compte suivant : +DescVentilCustomer=Consultez ici la liste des lignes de facture client lié (ou non) à un compte comptable produit ou service +DescVentilMore=Dans la plupart des cas, si vous utilisez des produits ou services prédéfinis et que vous paramétrez le compte (du plan comptable) sur la fiche produit/service, l'application pourra faire toute la liaison entre vos lignes de facture et le compte comptable de votre plan comptable des comptes, juste en un clic avec le bouton "%s" . Si le compte n'a pas été défini sur les fiches produits/services ou s'il vous reste des lignes non liées à un compte, vous devrez effectuer une liaison manuelle depuis le menu "%s". +DescVentilDoneCustomer=Consultez ici la liste des lignes de factures clients et leur compte comptable produits +DescVentilTodoCustomer=Lier les lignes de factures non déjà liées à un compte comptable produit +ChangeAccount=Modifiez le compte comptable de produit/service pour les lignes sélectionnées avec le compte suivant : Vide=- -DescVentilSupplier=Consultez ici la liste des lignes de facture fournisseur liées ou non encore liées à un compte article du plan comptable (seuls les enregistrements non encore transférés en comptabilité sont visibles) +DescVentilSupplier=Consultez ici la liste des lignes de factures fournisseur liées ou pas encore liées à un compte comptable produit/service (seuls les enregistrements pas encore transférés en comptabilités sont visibles) DescVentilDoneSupplier=Consultez ici la liste des lignes de factures fournisseurs et leur compte comptable DescVentilTodoExpenseReport=Lier les lignes de note de frais par encore liées à un compte comptable DescVentilExpenseReport=Consultez ici la liste des lignes de notes de frais liées (ou non) à un compte comptable @@ -294,15 +299,16 @@ DescValidateMovements=Toute modification ou suppression d'écriture, de lettrage ValidateHistory=Lier automatiquement AutomaticBindingDone=Liaisons automatiques effectuées (%s) - Liaison automatique impossible pour certains enregistrements (%s) +DoManualBindingForFailedRecord=Vous devez réaliser un rapprochement manuel pour la/les %s ligne·s non rapproché·es automatiquement. -ErrorAccountancyCodeIsAlreadyUse=Erreur, vous ne pouvez pas supprimer ou désactiver ce compte de plan comptable car il est utilisé +ErrorAccountancyCodeIsAlreadyUse=Erreur, vous ne pouvez pas supprimer ou désactiver ce compte comptable car il est utilisé MvtNotCorrectlyBalanced=Mouvement non équilibré. Débit = %s & Crédit = %s Balancing=Équilibrage FicheVentilation=Fiche lien GeneralLedgerIsWritten=Les transactions sont enregistrées dans le grand livre GeneralLedgerSomeRecordWasNotRecorded=Certaines des opérations n'ont pu être journalisées. S'il n'y a pas d'autres messages, c'est probablement car elles sont déjà comptabilisées. NoNewRecordSaved=Aucune ligne à transférer -ListOfProductsWithoutAccountingAccount=Liste des produits non liés à un compte de plan comptable +ListOfProductsWithoutAccountingAccount=Liste des produits non liés à un compte comptable ChangeBinding=Changer les liens Accounted=En comptabilité NotYetAccounted=Pas encore transféré en comptabilité @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Désactiver la liaison et le transfert en co ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Désactiver la liaison et le transfert en comptabilité des factures d'achats (les factures fournisseurs ne seront pas prises en compte en comptabilité). ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Désactiver la liaison et le transfert en comptabilité des notes de frais (les notes de frais ne seront pas prises en compte en comptabilité). ACCOUNTING_ENABLE_LETTERING=Activer la fonction de lettrage dans la comptabilité +ACCOUNTING_ENABLE_AUTOLETTERING=Activer le lettrage automatique lors du transfert en comptabilité ## Export NotExportLettering=Ne pas exporter le lettrage lors de la génération du fichier NotifiedExportDate=Marquer les lignes exportées comme Exportées (pour modifier une ligne, vous devrez supprimer toute la transaction et la retransférer en comptabilité) NotifiedValidationDate=Validez et verrouillez les entrées exportées (même effet que la fonctionnalité "%s", la modification et la suppression des lignes ne seront définitivement plus possibles) +NotifiedExportFull=Exporter les documents sources ? DateValidationAndLock=Validation et verrouillage de la date ConfirmExportFile=Confirmation de la génération du fichier d'export comptable ? ExportDraftJournal=Exporter le journal brouillon @@ -398,7 +406,7 @@ SaleLocal=Vente locale SaleExport=Vente export SaleEEC=Vente dans la CEE SaleEECWithVAT=Vente dans la CEE avec un taux de TVA non nul, on considère qu'il s'agit d'une vente intracommunutaire à un assujetti à la TVA et le compte comptable suggéré est le compte comptable de vente classique. -SaleEECWithoutVATNumber=Vente dans la CEE avec un taux de TVA nul mais sans numéro de TVA intracommunutaire renseigné dans la fiche du tiers. Nous forçons ainsi le compte comptable de vente classique. Il est nécessaire de renseigner le numéro de TVA intracommunautaire dans la fiche du tiers ou changer le compte comptable de vente si nécessaire. +SaleEECWithoutVATNumber=Vente dans la CEE sans TVA, mais le N° de TVA du tiers n'est pas défini. On se rabat sur le compte pour les ventes normales. Vous pouvez corriger le N° de TVA du tiers , ou changer le compte de produit associé si nécessaire. ForbiddenTransactionAlreadyExported=Interdit : La transaction a été validée et/ou exportée. ForbiddenTransactionAlreadyValidated=Interdit : La transaction a été validée. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Non-concordance dans le code de réconciliati AccountancyErrorMismatchBalanceAmount=Le solde (%s) n'est pas égal à 0 AccountancyErrorLetteringBookkeeping=Des erreurs sont survenues concernant les transactions : %s ErrorAccountNumberAlreadyExists=Le code comptable %s existe déjà +ErrorArchiveAddFile=Impossible de mettre le fichier "%s" dans l'archive ## Import ImportAccountingEntries=Écritures comptables @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Code multidevise (Idevise) DateExport=Date d'export WarningReportNotReliable=Attention : ce rapport n'est pas basé sur le grand livre et ne contient donc pas les écritures manuelles qui lui ont été ajoutées. Si votre journalisation est à jour, la vue depuis le grand livre sera plus précise. ExpenseReportJournal=Journal des notes de frais +DocsAlreadyExportedAreExcluded=Les documents déjà exportés sont exclus +ClickToHideAlreadyExportedLines=Cliquer pour cacher les documents déjà exportés NAccounts=%s comptes diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang index 7bc99f56b19..ae53079b4a8 100644 --- a/htdocs/langs/fr_FR/admin.lang +++ b/htdocs/langs/fr_FR/admin.lang @@ -645,6 +645,8 @@ Module2300Name=Travaux planifiés Module2300Desc=Gestion des travaux planifiées (alias cron ou table chrono) Module2400Name=Événements/Agenda Module2400Desc=Gestion des événements. Laissez l'application tracer automatiquement les événements pour des besoins de suivi ou enregistrer manuellement des événements ou rendez-vous dans l'agenda. Ceci est le module le plus important pour une bonne Gestion de la Relation Client ou Fournisseur. +Module2430Name=Système de calendrier de réservation +Module2430Desc=Proposez un calendrier en ligne pour permettre à quiconque de réserver un rendez-vous, en fonction de plages et de disponibilités prédéfinies. Module2500Name=GED Module2500Desc=Gestion de documents (GED). Stockage automatic des documents générés ou stockés. Fonction de partage. Module2600Name=API / Web services (serveur SOAP) @@ -660,6 +662,8 @@ Module2900Name=GeoIPMaxmind Module2900Desc=Capacités de conversion GeoIP Maxmind Module3200Name=Archives/Logs Inaltérables Module3200Desc=Active la journalisation de certains événements métiers dans une log/archive inaltérable. Les événements sont archivés en temps réel. L'archive est une table d'événements chaînés qui peut être lu uniquement et exporté. Ce module permet d'être compatible avec les exigences des lois de certains pays (comme par exemple la loi Finance 2016 ou norme 525 en France). +Module3300Name=Module Builder +Module3200Desc=Active la journalisation de certains événements métiers dans une log/archive inaltérable. Les événements sont archivés en temps réel. L'archive est une table d'événements chaînés qui peut être lu uniquement et exporté. Ce module permet d'être compatible avec les exigences des lois de certains pays (comme par exemple la loi Finance 2016 ou norme 525 en France). Module3400Name=Réseaux sociaux Module3400Desc=Activez les champs de réseaux sociaux dans les tiers et les adresses (skype, twitter, facebook, ...). Module4000Name=GRH @@ -845,7 +849,7 @@ Permission286=Exporter les contacts Permission291=Consulter les tarifs Permission292=Définir les permissions sur les tarifs Permission293=Modifier les tarifs clients -Permission301=Générer le PDF du code barre +Permission301=Générer la planche PDF de code barres Permission304=Créer/modifier les codes-barres Permission305=Supprimer les codes-barres Permission311=Consulter les services @@ -974,7 +978,7 @@ Permission3301=Générer de nouveaux modules Permission4001=Lire compétence/emploi/poste Permission4002=Créer/modifier une compétence/un emploi/un poste Permission4003=Supprimer compétence/emploi/poste -Permission4021=Lire les évaluations (la vôtre et celle de vos subordonnés) +Permission4021=Lire les évaluations (les vôtres et celle de vos subordonnés) Permission4022=Créer/modifier des évaluations Permission4023=Valider l'évaluation Permission4025=Supprimer l'évaluation @@ -1246,7 +1250,7 @@ BrowserName=Nom du navigateur BrowserOS=OS du navigateur ListOfSecurityEvents=Liste des événements de sécurité Dolibarr SecurityEventsPurged=Evenement de sécurité purgés -TrackableSecurityEvents=événement de sécurité traçable +TrackableSecurityEvents=Evénement de sécurité traçable LogEventDesc=Vous pouvez activer ici l'historique des événements d'audit de sécurité. Cet historique est consultable par les administrateurs dans le menu %s - %s. Attention, cette fonctionnalité peut générer un gros volume de données. AreaForAdminOnly=Les paramètres d'installation ne peuvent être remplis que par les utilisateurs administrateurs uniquement. SystemInfoDesc=Les informations systèmes sont des informations techniques diverses accessibles en lecture seule aux administrateurs uniquement. @@ -1270,6 +1274,7 @@ TriggerActiveAsModuleActive=Déclencheurs de ce fichier actifs car le module GeneratedPasswordDesc=Définissez ici quelle règle vous voulez utiliser pour générer les mots de passe quand vous demandez à générer un nouveau mot de passe DictionaryDesc=Définissez ici les données de référence. Vous pouvez compléter/modifier les données prédéfinies avec les vôtres. ConstDesc=Cette page vous permet d'éditer (remplacer) des paramètres non disponibles dans d'autres pages. Il s'agit principalement de paramètres réservés pour les développeurs et dépannage avancé uniquement. Consultez ici la liste des options. +MiscellaneousOptions=Options diverses MiscellaneousDesc=Définissez ici les autres paramètres en rapport avec la sécurité. LimitsSetup=Configuration des limites et précisions LimitsDesc=Vous pouvez définir ici les limites, précisions et optimisations utilisées par Dolibarr @@ -1491,7 +1496,7 @@ WatermarkOnDraftContractCards=Filigrane sur les brouillons de contrats (aucun si ##### Members ##### MembersSetup=Configuration du module Adhérents MemberMainOptions=Options principales -MemberCodeChecker=Options de génération automatique des codes membres +MemberCodeChecker=Options de génération automatique des codes des adhérents AdherentLoginRequired= Gérer un identifiant pour chaque adhérent AdherentMailRequired=Email obligatoire pour créer un nouvel adhérent MemberSendInformationByMailByDefault=Case à cocher pour envoyer un email de confirmation (validation ou nouvelle cotisation) aux adhérents est à oui par défaut. @@ -1826,6 +1831,9 @@ AGENDA_USE_EVENT_TYPE=Utiliser les types d'événements (gérés dans le menu Co AGENDA_USE_EVENT_TYPE_DEFAULT=Configurez automatiquement cette valeur par défaut pour le type d'événement dans le formulaire de création d'événement. AGENDA_DEFAULT_FILTER_TYPE=Positionner automatiquement ce type d'événement dans le filtre de recherche de la vue agenda AGENDA_DEFAULT_FILTER_STATUS=Positionner automatiquement ce statut d'événement dans le filtre de recherche de la vue agenda +AGENDA_EVENT_PAST_COLOR=Couleur de l'événement précédent +AGENDA_EVENT_CURRENT_COLOR=Couleur de l'événement courant +AGENDA_EVENT_FUTURE_COLOR=Couleur du prochain événement AGENDA_DEFAULT_VIEW=Quel onglet voulez-vous voir ouvrir par défaut quand on choisit le menu Agenda AGENDA_REMINDER_BROWSER=Activer le rappel d'événement sur le navigateur de l'utilisateur (lorsque la date de l'événement est atteinte, une popup est affichée sur la navigateur. Chaque utilisateur peut désactiver de telles notification depuis la configuration des notifications de son navigateur) AGENDA_REMINDER_BROWSER_SOUND=Activer les notifications sonores. @@ -1853,7 +1861,7 @@ StockDecreaseForPointOfSaleDisabledbyBatch=La décrémentation de stock depuis c CashDeskYouDidNotDisableStockDecease=Vous n'avez pas désactivé la réduction de stock lors d'une vente depuis le Point de vente. Par conséquent, un entrepôt est nécessaire. CashDeskForceDecreaseStockLabel=La diminution des stocks de produits soumis à numéros de lots a été forcée. CashDeskForceDecreaseStockDesc=Diminuez d'abord par les dates de DMD/DLUO ou DLC les plus anciennes -CashDeskReaderKeyCodeForEnter=Code ASCII clé pour "Enter" défini dans le lecteur de code-barres (Exemple : 13) +CashDeskReaderKeyCodeForEnter=Code ASCII clé pour "Entrer" défini dans le lecteur de code-barres (Exemple : 13) ##### Bookmark ##### BookmarkSetup=Configuration du module Marque-pages BookmarkDesc=Ce module vous permet de gérer des liens et raccourcis. Il permet aussi d'ajouter n'importe quelle page de Dolibarr ou lien web dans le menu d'accès rapide sur la gauche. @@ -1943,7 +1951,7 @@ BackupZipWizard=Assistant pour générer l'archive du répertoire documents SomethingMakeInstallFromWebNotPossible=L'installation de module externe est impossible depuis l'interface web pour la raison suivante : SomethingMakeInstallFromWebNotPossible2=Pour cette raison, le processus de mise à jour décrit ici est une processus manuel que seul un utilisateur ayant des droits privilégiés peut réaliser. InstallModuleFromWebHasBeenDisabledContactUs=L'installation ou le développement de modules externes ou de sites Web dynamiques, à partir de l'application, est actuellement verrouillé pour des raisons de sécurité. Veuillez nous contacter si vous avez besoin d'activer cette fonctionnalité. -InstallModuleFromWebHasBeenDisabledByFile=L'installation de module externe depuis l'application a été désactivé par l'administrator. Vous devez lui demander de supprimer le fichier %s pour permettre cette fonctionnalité. +InstallModuleFromWebHasBeenDisabledByFile=L'installation de module externe depuis l'application a été désactivé par l'administrateur. Vous devez lui demander de supprimer le fichier %s pour permettre cette fonctionnalité. ConfFileMustContainCustom=Installer ou créer un module externe à partir de l'application nécessite de sauvegarder les fichiers du module dans le répertoire %s. Pour que ce répertoire soit reconnu par Dolibarr, vous devez paramétrer le fichier de configuration conf/conf.php en ajoutant les 2 lignes suivantes :
    $dolibarr_main_url_root_alt='/custom'
    $dolibarr_main_document_root_alt='%s/custom'; HighlightLinesOnMouseHover=Mettre en surbrillance les lignes de la table lorsque la souris passe au-dessus HighlightLinesColor=Couleur de la ligne de surbrillance lorsque la souris passe au-dessus (mettre 'ffffff' pour ne pas mettre en surbrillance) @@ -2070,8 +2078,8 @@ RemoveSpecialChars=Supprimer les caractères spéciaux COMPANY_AQUARIUM_CLEAN_REGEX=Filtre Regex pour nettoyer la valeur (COMPANY_AQUARIUM_CLEAN_REGEX) COMPANY_DIGITARIA_CLEAN_REGEX=Filtre de regex pour nettoyer la valeur (COMPANY_DIGITARIA_CLEAN_REGEX) COMPANY_DIGITARIA_UNIQUE_CODE=Doublons non autorisés -RemoveSpecialWords=Nettoyer certains mots lors de la génération de sous-comptes pour les clients ou les fournisseurs -RemoveSpecialWordsHelp=Précisez les mots à nettoyer avant de calculer le compte client ou fournisseur. Utiliser un ";" entre chaque mot +RemoveSpecialWords=Nettoyer certains mots lors de la génération des comptes comptables des tiers pour les clients ou les fournisseurs +RemoveSpecialWordsHelp=Précisez les mots à nettoyer avant de calculer le compte comptable des tiers client ou fournisseur. Utiliser un ";" entre chaque mot GDPRContact=Responsable de la protection des données (DPO ou contact RGPD) GDPRContactDesc=Si vous stockez des données personnelles dans votre système d'information, vous pouvez nommer ici le contact responsable du règlement général sur la protection des données HelpOnTooltip=Texte d'aide à afficher dans l'info-bulle @@ -2129,6 +2137,7 @@ CodeLastResult=Dernier code de retour NbOfEmailsInInbox=Nombre de courriels dans le répertoire source LoadThirdPartyFromName=Charger le Tiers en cherchant sur %s (chargement uniquement) LoadThirdPartyFromNameOrCreate=Charger le Tiers en cherchant sur %s (créer si non trouvé) +LoadContactFromEmailOrCreate=Charger le contact en recherchant %s (créer si introuvable) AttachJoinedDocumentsToObject=Enregistrez les fichiers joints dans des documents d'objet si la référence d'un objet est trouvée dans le sujet de l'e-mail. WithDolTrackingID=Message d'une conversation initiée par un premier mail envoyé depuis Dolibarr WithoutDolTrackingID=Message d'une conversation initiée par un premier e-mail NON envoyé depuis Dolibarr @@ -2355,3 +2364,5 @@ AllowExternalDownload=Autoriser le téléchargement externe (sans connexion, en DeadlineDayVATSubmission=Date limite pour la soumission de la TVA le mois suivant MaxNumberOfAttachementOnForms=Nombre maximum de fichiers joints dans un formulaire IfDefinedUseAValueBeetween=Si défini, utilisez une valeur entre %s et %s +Reload=Recharger +ConfirmReload=Confirmer le rechargement du module diff --git a/htdocs/langs/fr_FR/bills.lang b/htdocs/langs/fr_FR/bills.lang index 571c9316496..48e9bc5120e 100644 --- a/htdocs/langs/fr_FR/bills.lang +++ b/htdocs/langs/fr_FR/bills.lang @@ -629,5 +629,5 @@ BulkPaymentNotPossibleForInvoice=L'enregistrement de paiements en masse n'est p MentionVATDebitOptionIsOn=Option de paiement de taxe sur débits MentionCategoryOfOperations=Catégorie d'opérations MentionCategoryOfOperations0=Livraison de marchandises -MentionCategoryOfOperations1=Fourniture de services +MentionCategoryOfOperations1=Prestation de services MentionCategoryOfOperations2=Mixte - Livraison de biens & prestation de services diff --git a/htdocs/langs/fr_FR/boxes.lang b/htdocs/langs/fr_FR/boxes.lang index cb09a89023c..085026a0761 100644 --- a/htdocs/langs/fr_FR/boxes.lang +++ b/htdocs/langs/fr_FR/boxes.lang @@ -24,6 +24,7 @@ BoxFicheInter=Dernières interventions BoxCurrentAccounts=Balance des comptes ouverts BoxTitleMemberNextBirthdays=Anniversaires de ce mois (adhérents) BoxTitleMembersByType=Adhérents par type et par statut +BoxTitleMembersByTags=Adhérents par étiquette et état BoxTitleMembersSubscriptionsByYear=Cotisations des adhérents par année BoxTitleLastRssInfos=Les %s dernières informations de %s BoxTitleLastProducts=Les %s derniers produits/services modifiés diff --git a/htdocs/langs/fr_FR/categories.lang b/htdocs/langs/fr_FR/categories.lang index 235602b4600..9ec6102dc3b 100644 --- a/htdocs/langs/fr_FR/categories.lang +++ b/htdocs/langs/fr_FR/categories.lang @@ -1,5 +1,5 @@ # Dolibarr language file - Source file is en_US - categories -Rubrique=Tag/Catégorie +Rubrique=Tag/catégorie Rubriques=Tags/catégories RubriquesTransactions=Tags/catégories des transactions categories=tags/catégories @@ -54,26 +54,26 @@ SuppliersCategoryShort=Tag/catégorie de fournisseurs CustomersCategoryShort=Tag/catégorie de clients ProductsCategoryShort=Tag/catégorie de produits MembersCategoryShort=Tag/catégorie adhérents -SuppliersCategoriesShort=Tags fournisseurs -CustomersCategoriesShort=Tags clients -ProspectsCategoriesShort=Tags prospects -CustomersProspectsCategoriesShort=Tags clients/prosp. -ProductsCategoriesShort=Tags de produits -MembersCategoriesShort=Tags des adhérents -ContactCategoriesShort=Tags de contacts -AccountsCategoriesShort=Tags des comptes -ProjectsCategoriesShort=Tags de projets -UsersCategoriesShort=Tags utilisateurs +SuppliersCategoriesShort=Tags/catégories fournisseurs +CustomersCategoriesShort=Tags/catégories clients +ProspectsCategoriesShort=Tags/catégories prospects +CustomersProspectsCategoriesShort=Tags/catégories clients/prosp. +ProductsCategoriesShort=Tags/catégories de produits +MembersCategoriesShort=Tags/catégories des adhérents +ContactCategoriesShort=Tags/catégories de contacts +AccountsCategoriesShort=Tags/catégories des comptes +ProjectsCategoriesShort=Tags/catégories de projets +UsersCategoriesShort=Tags/catégories utilisateurs StockCategoriesShort=Tags/catégories d’entrepôt ThisCategoryHasNoItems=Cette catégorie ne contient aucun élément. CategId=ID du(de la) tag/catégorie -ParentCategory=Catégorie parente -ParentCategoryID=ID de la balise/catégorie parent +ParentCategory=Tag/catégorie parent +ParentCategoryID=ID du tag/catégorie parent ParentCategoryLabel=Libellé du tag/catégorie parent CatSupList=Liste des tags/catégories des fournisseurs CatCusList=Liste des tags/catégories des clients/prospects CatProdList=Liste des tags/catégories de produits/services -CatMemberList=Liste des tags/catégories de membres +CatMemberList=Liste des tags/catégories des adhérents CatContactList=Liste des tags/catégories des contacts CatProjectsList=Liste des tags/catégories des projets CatUsersList=Liste des tags/catégories des utilisateurs @@ -81,7 +81,7 @@ CatSupLinks=Liens entre fournisseurs et tags/catégories CatCusLinks=Liens entre clients/prospects et tags/catégories CatContactsLinks=Liens entre contacts/adresses et tags/catégories CatProdLinks=Liens entre produits/services et tags/catégories -CatMembersLinks=Liens entre membres et tags/catégories +CatMembersLinks=Liens entre adhérents et tags/catégories CatProjectsLinks=Liens entre projets et tags/catégories CatUsersLinks=Liaisons entre les utilisateurs et les tags/catégories DeleteFromCat=Enlever des tags/catégories diff --git a/htdocs/langs/fr_FR/companies.lang b/htdocs/langs/fr_FR/companies.lang index f66d2005c73..35f1050a1db 100644 --- a/htdocs/langs/fr_FR/companies.lang +++ b/htdocs/langs/fr_FR/companies.lang @@ -312,12 +312,12 @@ CustomerRelativeDiscountShort=Remise relative CustomerAbsoluteDiscountShort=Remise fixe CompanyHasRelativeDiscount=Ce client a une remise par défaut de %s%% CompanyHasNoRelativeDiscount=Ce client n'a pas de remise relative par défaut -HasRelativeDiscountFromSupplier=Vous avez une réduction par défaut de %s%% chez ce fournisseur -HasNoRelativeDiscountFromSupplier=Aucune remise relative par défaut de ce fournisseur +HasRelativeDiscountFromSupplier=Vous bénéficier d'une remise par défaut de %s%% avec ce vendeur. +HasNoRelativeDiscountFromSupplier=Aucune remise relative par défaut chez ce fournisseur CompanyHasAbsoluteDiscount=Ce client dispose de crédits disponibles (avoirs ou acomptes) pour un montant de %s %s CompanyHasDownPaymentOrCommercialDiscount=Ce client a une réduction disponible (commercial, acompte) pour %s%s CompanyHasCreditNote=Ce client a %s %s d'avoirs disponibles -HasNoAbsoluteDiscountFromSupplier=Aucun rabais/crédit disponible auprès de ce fournisseur +HasNoAbsoluteDiscountFromSupplier=Aucun rabais/crédit disponible chez ce fournisseur HasAbsoluteDiscountFromSupplier=Vous avez des crédits disponibles (avoirs ou acomptes) pour %s %s chez ce fournisseur HasDownPaymentOrCommercialDiscountFromSupplier=Vous avez des crédits disponibles (bon de réductions, acomptes) pour %s %s chez ce fournisseur HasCreditNoteFromSupplier=Vous avez des avoirs pour %s %s chez ce fournisseur @@ -499,4 +499,7 @@ OutOfEurope=Hors Union Européenne (UE) CurrentOutstandingBillLate=Montant impayé arrivé à échéance BecarefullChangeThirdpartyBeforeAddProductToInvoice=Attention : selon votre configuration des prix des produits/services, vous devriez changer le tiers avant d'ajouter le produit EmailAlreadyExistsPleaseRewriteYourCompanyName=l'e-mail existe déjà, veuillez réécrire le nom de votre entreprise -TwoRecordsOfCompanyName=plusieurs fiches existent pour cette entreprise merci de nous contacter pour compléter votre demande de partenariat" +TwoRecordsOfCompanyName=plus d'un enregistrement existe pour cette entreprise, veuillez nous contacter pour finaliser votre demande de partenariat +CompanySection=Section société +ShowSocialNetworks=Afficher les réseaux sociaux +HideSocialNetworks=Masquer les réseaux sociaux diff --git a/htdocs/langs/fr_FR/compta.lang b/htdocs/langs/fr_FR/compta.lang index 58b04bc67bd..7b039cba206 100644 --- a/htdocs/langs/fr_FR/compta.lang +++ b/htdocs/langs/fr_FR/compta.lang @@ -246,12 +246,12 @@ TurnoverPerProductInCommitmentAccountingNotRelevant=Le rapport de chiffre d'affa TurnoverPerSaleTaxRateInCommitmentAccountingNotRelevant=Le rapport de Chiffre d'affaires encaissé par taux de TVA n'est pas disponible. Ce rapport est uniquement disponible pour le chiffre d'affaires facturé. CalculationMode=Mode de calcul AccountancyJournal=Code journal comptable -ACCOUNTING_VAT_SOLD_ACCOUNT=Compte (du plan comptable) à utiliser comme compte par défaut pour la TVA sur les ventes (utilisé s'il n'est pas défini dans la configuration du dictionnaire TVA) -ACCOUNTING_VAT_BUY_ACCOUNT=Compte (du plan comptable) à utiliser comme compte par défaut pour la TVA sur les achats (utilisé s'il n'est pas défini dans la configuration du dictionnaire TVA) -ACCOUNTING_VAT_PAY_ACCOUNT=Compte (du plan comptable) à utiliser comme compte par défaut pour le paiement de la TVA -ACCOUNTING_ACCOUNT_CUSTOMER=Compte (du plan comptable) utilisé pour les tiers "clients" +ACCOUNTING_VAT_SOLD_ACCOUNT=Compte comptable à utiliser comme compte par défaut pour la TVA sur les ventes (utilisé s'il n'est pas défini dans la configuration du dictionnaire TVA) +ACCOUNTING_VAT_BUY_ACCOUNT=Compte comptable à utiliser comme compte par défaut pour la TVA sur les achats (utilisé s'il n'est pas défini dans la configuration du dictionnaire TVA) +ACCOUNTING_VAT_PAY_ACCOUNT=Compte comptable à utiliser comme compte par défaut pour le paiement de la TVA +ACCOUNTING_ACCOUNT_CUSTOMER=Compte comptable utilisé pour les tiers "clients" ACCOUNTING_ACCOUNT_CUSTOMER_Desc=Le compte comptable dédié défini sur la fiche tiers sera utilisé pour l'affectation du compte auxiliaire uniquement. Celui-ci sera utilisé pour la comptabilité générale et comme valeur par défaut de la comptabilité auxiliaire si le compte comptable client dédié du ties n'est pas défini. -ACCOUNTING_ACCOUNT_SUPPLIER=Compte (du Plan Comptable) utilisé pour les tiers "fournisseurs" +ACCOUNTING_ACCOUNT_SUPPLIER=Compte comptable utilisé pour les tiers "fournisseurs" ACCOUNTING_ACCOUNT_SUPPLIER_Desc=Le compte de comptabilité dédié défini sur la fiche Tiers sera utilisé pour la comptabilité auxiliaire uniquement. Celui-ci sera utilisé pour le grand livre et comme valeur par défaut de la comptabilité auxiliaire si le compte de comptabilité fournisseur dédié au tiers n'est pas défini. ConfirmCloneTax=Confirmer le clonage de la charge sociale/fiscale ConfirmCloneVAT=Confirmer le clonage d'une déclaration de TVA diff --git a/htdocs/langs/fr_FR/contracts.lang b/htdocs/langs/fr_FR/contracts.lang index 7d6bfc6f2e0..3aa7c41617a 100644 --- a/htdocs/langs/fr_FR/contracts.lang +++ b/htdocs/langs/fr_FR/contracts.lang @@ -101,7 +101,6 @@ TypeContact_contrat_external_BILLING=Contact client facturation contrat TypeContact_contrat_external_CUSTOMER=Contact client suivi contrat TypeContact_contrat_external_SALESREPSIGN=Contact client signataire contrat HideClosedServiceByDefault=Masquer les services fermés par défaut -AllowOnlineSign=Autoriser la signature en ligne ShowClosedServices=Afficher les services fermés HideClosedServices=Masquer les services fermés UserStartingService=Utilisateur démarrant le service diff --git a/htdocs/langs/fr_FR/errors.lang b/htdocs/langs/fr_FR/errors.lang index e38c4ee0bf4..397971c24c2 100644 --- a/htdocs/langs/fr_FR/errors.lang +++ b/htdocs/langs/fr_FR/errors.lang @@ -303,6 +303,7 @@ ErrorValueForTooLow=La valeur pour %s est trop faible ErrorValueCantBeNull=La valeur pour %s ne peut pas être nulle ErrorDateOfMovementLowerThanDateOfFileTransmission=La date de l'opération bancaire ne peut être inférieure à la date de transmission du fichier ErrorTooMuchFileInForm=Trop de fichiers dans le formulaire, le nombre maximum est de %s fichier(s) +ErrorSessionInvalidatedAfterPasswordChange=La session a été invalidée suite à un changement de mot de passe, d'état ou de dates de validité. Veuillez vous reconnecter. # Warnings WarningParamUploadMaxFileSizeHigherThanPostMaxSize=Votre paramètre PHP upload_max_filesize (%s) est supérieur au paramètre PHP post_max_size (%s). Ceci n'est pas une configuration cohérente. @@ -325,6 +326,7 @@ WarningPaymentDateLowerThanInvoiceDate=La date de paiement (%s) est inférieure WarningTooManyDataPleaseUseMoreFilters=Trop de données (plus de %s lignes). Utilisez davantage de filtres ou régler la constante %s pour augmenter la limite à une valeur plus élevée. WarningSomeLinesWithNullHourlyRate=Des temps ont été enregistrés par des utilisateurs lorsque leur taux horaire n'était défini. Une valeur de 0 %s a été utilisée, mais cela peut entraîner une mauvaise évaluation du temps passé. WarningYourLoginWasModifiedPleaseLogin=Votre identifiant a été modifié. Par sécurité, vous devrez vous identifier avec votre nouvel identifiant avant l'action suivante. +WarningYourPasswordWasModifiedPleaseLogin=Votre mot de passe a été modifié. Pour des raisons de sécurité, vous devez vous connecter maintenant avec votre nouveau mot de passe. WarningAnEntryAlreadyExistForTransKey=Une donnée identique existe déjà pour la traduction du code dans cette langue WarningNumberOfRecipientIsRestrictedInMassAction=Attention, le nombre de destinataires différents est limité à %s lorsque vous utilisez les actions en masse sur les listes WarningDateOfLineMustBeInExpenseReportRange=Attention, la date de la ligne n'est pas dans la plage de la note de frais diff --git a/htdocs/langs/fr_FR/eventorganization.lang b/htdocs/langs/fr_FR/eventorganization.lang index a428430c102..8caeb49c807 100644 --- a/htdocs/langs/fr_FR/eventorganization.lang +++ b/htdocs/langs/fr_FR/eventorganization.lang @@ -172,3 +172,5 @@ ErrorSeveralCompaniesWithEmailContactUs=Plusieurs entreprises avec cet email ont ErrorSeveralCompaniesWithNameContactUs=Plusieurs sociétés portant ce nom ont été trouvées, nous ne pouvons donc pas valider automatiquement votre inscription. Veuillez nous contacter à %s pour une validation manuelle NoPublicActionsAllowedForThisEvent=Aucune action publique n'est ouverte au public pour cet événement MaxNbOfAttendees=Nombre maximum de participants +DateStartEvent=Date de début de l'événement +DateEndEvent=Date de fin de l'événement diff --git a/htdocs/langs/fr_FR/holiday.lang b/htdocs/langs/fr_FR/holiday.lang index bca4ba1dd2d..642a67cb11c 100644 --- a/htdocs/langs/fr_FR/holiday.lang +++ b/htdocs/langs/fr_FR/holiday.lang @@ -149,10 +149,10 @@ XIsAUsualNonWorkingDay=%s est généralement un jour NON ouvrable BlockHolidayIfNegative=Bloqué lorsque le solde est négatif LeaveRequestCreationBlockedBecauseBalanceIsNegative=La création de cette demande de congé est bloquée car votre solde est négatif ErrorLeaveRequestMustBeDraftCanceledOrRefusedToBeDeleted=La demande de congé %s doit être brouillon, annulée ou refusée pour être supprimée -IncreaseHolidays=Augmenter le nombre de jours de vacances -HolidayRecordsIncreased= %s registres de vacances augmentés -HolidayRecordIncreased=Registre de vacances augmenté -ConfirmMassIncreaseHoliday=Augmentation en masse des vacances +IncreaseHolidays=Augmenter le solde des congés +HolidayRecordsIncreased= %s soldes de congés augmentés +HolidayRecordIncreased=Solde des congés augmenté +ConfirmMassIncreaseHoliday=Augmentation massive du solde des congés NumberDayAddMass=Nombre de jours à ajouter à la sélection ConfirmMassIncreaseHolidayQuestion=Êtes-vous sûr de vouloir augmenter les vacances du ou des enregistrement(s) sélectionnés %s ? HolidayQtyNotModified=Le solde des jours restants pour %s n'a pas été modifié diff --git a/htdocs/langs/fr_FR/languages.lang b/htdocs/langs/fr_FR/languages.lang index 168b938f1cd..db6594f3a46 100644 --- a/htdocs/langs/fr_FR/languages.lang +++ b/htdocs/langs/fr_FR/languages.lang @@ -24,7 +24,7 @@ Language_de_DE=Allemand Language_de_AT=Allemand (Autriche) Language_de_CH=Allemand (Suisse) Language_de_LU=Allemand (Luxembourg) -Language_el_GR=Grèque +Language_el_GR=Grec Language_el_CY=Grec (Chypre) Language_en_AE=Anglais (EAU) Language_en_AU=Anglais (Australie) diff --git a/htdocs/langs/fr_FR/loan.lang b/htdocs/langs/fr_FR/loan.lang index ba9e734d14c..8d71881dadf 100644 --- a/htdocs/langs/fr_FR/loan.lang +++ b/htdocs/langs/fr_FR/loan.lang @@ -28,7 +28,7 @@ CantUseScheduleWithLoanStartedToPaid = Impossible de générer un échéancier p CantModifyInterestIfScheduleIsUsed = Vous ne pouvez pas modifier l'intérêt si vous utilisez le calendrier # Admin ConfigLoan=Configuration du module Emprunt -LOAN_ACCOUNTING_ACCOUNT_CAPITAL=Compte (du plan comptable) à utiliser par défaut pour le capital (module Prêt) -LOAN_ACCOUNTING_ACCOUNT_INTEREST=Compte (du plan comptable) à utiliser par défaut pour les intérêts (module Prêt) -LOAN_ACCOUNTING_ACCOUNT_INSURANCE=Compte (du plan comptable) à utiliser par défaut pour l'assurance (module Prêt) +LOAN_ACCOUNTING_ACCOUNT_CAPITAL=Compte comptable à utiliser par défaut pour le capital (module emprunt) +LOAN_ACCOUNTING_ACCOUNT_INTEREST=Compte comptable à utiliser par défaut pour les intérêts (module emprunt) +LOAN_ACCOUNTING_ACCOUNT_INSURANCE=Compte comptable à utiliser par défaut pour l'assurance (module emprunt) CreateCalcSchedule=Créer / Modifier échéancier de prêt diff --git a/htdocs/langs/fr_FR/main.lang b/htdocs/langs/fr_FR/main.lang index f6062f39db3..d809f719a7b 100644 --- a/htdocs/langs/fr_FR/main.lang +++ b/htdocs/langs/fr_FR/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=Pas de groupe utilisateur défini Password=Mot de passe PasswordRetype=Ressaisir le mot de passe NoteSomeFeaturesAreDisabled=Notez que de nombreuses fonctionnalités ne sont pas activées sur le site de démonstration. +YourUserFile=Votre fiche utilisateur Name=Nom NameSlashCompany=Nom / Société Person=Personne @@ -322,7 +323,7 @@ DurationDays=jours Year=Année Month=Mois Week=Semaine -WeekShort=Semaine +WeekShort=Sem. Day=Jour Hour=Heure Minute=Minute @@ -897,6 +898,9 @@ MassFilesArea=Zone des fichiers générés en masse ShowTempMassFilesArea=Afficher la zone des fichiers générés en masse ConfirmMassDeletion=Confirmation de suppression en masse ConfirmMassDeletionQuestion=Êtes-vous sur de vouloir supprimer les %s enregistrement(s) sélectionné(s) ? +ConfirmMassClone=Confirmation de clonage en masse +ConfirmMassCloneQuestion=Sélectionner le projet vers lequel cloner +ConfirmMassCloneToOneProject=Cloner vers le projet %s RelatedObjects=Objets liés ClassifyBilled=Classer facturé ClassifyUnbilled=Classer non facturé @@ -912,8 +916,8 @@ ExportFilteredList=Exporter liste filtrée ExportList=Exporter liste ExportOptions=Options d'export IncludeDocsAlreadyExported=Inclure les documents déjà exportés -ExportOfPiecesAlreadyExportedIsEnable=L'exportation de pièces déjà exportées est activée -ExportOfPiecesAlreadyExportedIsDisable=L'exportation des pièces déjà exportées est désactivée +ExportOfPiecesAlreadyExportedIsEnable=Les documents déjà exportés sont visibles et seront exportés +ExportOfPiecesAlreadyExportedIsDisable=Les documents déjà exportés sont cachés et ne seront pas exportés AllExportedMovementsWereRecordedAsExported=Tous les mouvements exportés ont été enregistrés comme exportés NotAllExportedMovementsCouldBeRecordedAsExported=Tous les mouvements exportés n'ont pas pu être enregistrés comme exportés Miscellaneous=Divers @@ -1128,6 +1132,7 @@ DeleteFileText=Voulez-vous vraiment supprimer ce fichier? ShowOtherLanguages=Afficher les autres langues SwitchInEditModeToAddTranslation=Passer en mode édition pour ajouter des traductions pour cette langue NotUsedForThisCustomer=Non utilisé pour ce client +NotUsedForThisVendor=Non utilisé pour ce fournisseur AmountMustBePositive=Le montant doit être positif. ByStatus=Par statut InformationMessage=Information @@ -1149,16 +1154,16 @@ UpdateForAllLines=Mise à jour de toutes les lignes OnHold=En attente Civility=Civilité AffectTag=Affecter un tag/catégorie -AffectUser=Attribuer un utilisateur +AffectUser=Assigné un utilisateur SetSupervisor=Définir le responsable CreateExternalUser=Créer utilisateur externe -ConfirmAffectTag=Attribution de balises en masse +ConfirmAffectTag=Attribution de tags/catégories en masse ConfirmAffectUser=Affectation d'utilisateurs en masse -ProjectRole=Rôle attribué sur chaque projet -TasksRole=Rôle attribué sur chaque tâche de chaque projet +ProjectRole=Rôle affecté à chaque projet/opportunité +TasksRole=Rôle affecté à chaque tâche (si utilisés) ConfirmSetSupervisor=Ensemble de superviseur en vrac ConfirmUpdatePrice=Choisissez un taux de prix d'augmentation/diminution -ConfirmAffectTagQuestion=Voulez-vous vraiment attribuer des balises aux enregistrements sélectionnés %s ? +ConfirmAffectTagQuestion=Voulez-vous vraiment attribuer des tags/catégories aux enregistrements sélectionnés %s ? ConfirmAffectUserQuestion=Voulez-vous vraiment affecter des utilisateurs aux enregistrements sélectionnés %s ? ConfirmSetSupervisorQuestion=Êtes-vous sûr de vouloir définir le superviseur sur le ou les enregistrements sélectionnés %s ? ConfirmUpdatePriceQuestion=Voulez-vous vraiment mettre à jour le prix du ou des enregistrements %s sélectionnés ? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Créé à partir du portail public UserAgent=User Agent InternalUser=Utilisateur interne ExternalUser=Utilisateur externe +NoSpecificContactAddress=Pas de contact ou d'adresse spécifique +NoSpecificContactAddressBis=Cet onglet est spécialement prévu pour forcer des contacts ou adresses spécifiques pour l'objet courant. Ne l'utilisez que dans les cas où vous souhaitez définir des contacts ou adresses spécifiques pour l'objet parce que les informations du tiers est incomplète ou inexacte. +HideOnVCard=Cacher %s +AddToContacts=Ajouter l'adresse à mes contacts +LastAccess=Dernier accès +UploadAnImageToSeeAPhotoHere=Téléverser une image depuis l'onglet %s pour afficher une image ici +LastPasswordChangeDate=Date du dernier changement de mot de passe diff --git a/htdocs/langs/fr_FR/mrp.lang b/htdocs/langs/fr_FR/mrp.lang index 47e8dcf13d3..26942e14743 100644 --- a/htdocs/langs/fr_FR/mrp.lang +++ b/htdocs/langs/fr_FR/mrp.lang @@ -11,7 +11,7 @@ Bom=Nomenclatures produits (BOM) BillOfMaterials=Nomenclature BOM BillOfMaterialsLines=Lignes de nomenclature BOMsSetup=Configuration du module BOM -ListOfBOMs=Nomenclatures - Nomenclature +ListOfBOMs=Nomenclatures - BOM ListOfManufacturingOrders=Ordres Fabrication NewBOM=Nouveau BOM ProductBOMHelp=Produit à créer (ou désassembler) avec cette nomenclature.
    Remarque: les produits avec la propriété 'Nature de produit' = 'Matière première' ne sont pas visibles dans cette liste. @@ -82,7 +82,7 @@ ProductsToConsume=Produits à consommer ProductsToProduce=Produits à produire UnitCost=Coût unitaire TotalCost=Coût total -BOMTotalCost=Le coût de production de cette nomenclature basé sur chaque quantité et produit à consommer (utilise le cout de la sous BOM si existante, sinon le prix de revient du produit si défini, sinon le PMP si défini, sinon le meilleur prix d'achat) +BOMTotalCost=Le coût de production de cette nomenclature basé sur chaque quantité et produit à consommer (utilise le cout de la sous BOM si existante, sinon le prix de revient du produit si défini, sinon le PMP si défini, sinon le meilleur prix d'achat) BOMTotalCostService=Si le module "Poste de travail" est activé et qu'un poste de travail est défini par défaut sur la ligne, alors le calcul est "quantité (convertie en heures) x poste de travail ahr", sinon "quantité (convertie en heures) x prix de revient du service" GoOnTabProductionToProduceFirst=Vous devez avoir la production pour clôturer un Ordre de Fabrication (voir onglet '%s'). Mais vous pouvez l'annuler. ErrorAVirtualProductCantBeUsedIntoABomOrMo=Un kit ne peut pas être utilisé dans une Nomenclature ou un Ordre de fabrication. @@ -102,6 +102,7 @@ NbOperatorsRequired=Nombre d'opérateurs requis THMOperatorEstimated=THM estimé de l'opérateur THMMachineEstimated=THM machine estimé WorkstationType=Type de poste de travail +DefaultWorkstation=Poste de travail par défaut Human=Humain Machine=Machine HumanMachine=Humain/machine diff --git a/htdocs/langs/fr_FR/orders.lang b/htdocs/langs/fr_FR/orders.lang index 06c090a5f30..b58352c8c7b 100644 --- a/htdocs/langs/fr_FR/orders.lang +++ b/htdocs/langs/fr_FR/orders.lang @@ -96,6 +96,10 @@ OrdersStatisticsSuppliers=Statistiques des commandes fournisseurs NumberOfOrdersByMonth=Nombre de commandes par mois AmountOfOrdersByMonthHT=Montant total de commandes par mois (HT) ListOfOrders=Liste des commandes +ListOrderLigne=Lignes de commandes +productobuy=Produits à l'achat uniquement +productonly=Produits seulement +disablelinefree=Pas de ligne libre CloseOrder=Clôturer commande ConfirmCloseOrder=Êtes-vous sûr de vouloir classer cette commande à Délivrée ? Une fois une commande délivrée, elle peut aussi être passée à facturée. ConfirmDeleteOrder=Êtes-vous sûr de vouloir effacer cette commande ? @@ -131,6 +135,7 @@ SupplierOrderClassifiedBilled=Commande fournisseur %s classée facturée OtherOrders=Autres commandes SupplierOrderValidatedAndApproved=Commande fournisseur validée et approuvée : %s SupplierOrderValidated=Commande fournisseur validée : %s +OrderShowDetail=Afficher les détails de la commande ##### Types de contacts ##### TypeContact_commande_internal_SALESREPFOLL=Responsable suivi commande client TypeContact_commande_internal_SHIPPING=Responsable envoi commande client @@ -199,3 +204,5 @@ StatusSupplierOrderApproved=Approuvé StatusSupplierOrderRefused=Refusé StatusSupplierOrderReceivedPartially=Reçue partiellement StatusSupplierOrderReceivedAll=Tous les produits reçus +NeedAtLeastOneInvoice = Au moins une commande doit être présente +LineAlreadyDispatched = La ligne de commande a déjà été réceptionnée. diff --git a/htdocs/langs/fr_FR/products.lang b/htdocs/langs/fr_FR/products.lang index ed91bb7707e..0a5d3f3f8ad 100644 --- a/htdocs/langs/fr_FR/products.lang +++ b/htdocs/langs/fr_FR/products.lang @@ -315,7 +315,7 @@ GlobalVariableUpdaterHelpFormat1=Le format est {"URL": "http://example.com/urlof UpdateInterval=Intervale de mise à jour (minutes) LastUpdated=Dernière mise à jour CorrectlyUpdated=Mise à jour avec succès -PropalMergePdfProductActualFile=Fichiers utilisés pour l'ajout au PDF des devis sont +PropalMergePdfProductActualFile=Fichiers utilisés pour l'ajout au PDF Azur sont PropalMergePdfProductChooseFile=Sélectionnez les fichiers PDF IncludingProductWithTag=Comprenant des produits/services avec le tag/catégorie DefaultPriceRealPriceMayDependOnCustomer=Prix ​​par défaut, le prix réel peut dépendre du client diff --git a/htdocs/langs/fr_FR/projects.lang b/htdocs/langs/fr_FR/projects.lang index d3f7edb1e85..ba39ce47dc2 100644 --- a/htdocs/langs/fr_FR/projects.lang +++ b/htdocs/langs/fr_FR/projects.lang @@ -259,6 +259,7 @@ RecordsClosed=%s projet(s) fermé(s) SendProjectRef=A propos du projet %s ModuleSalaryToDefineHourlyRateMustBeEnabled=Le module 'Paiement des salaires des employés' doit être activé pour définir le taux horaire des employés afin de valoriser le temps passé NewTaskRefSuggested=Réf de tâche déjà utilisée, une nouvelle référence de tâche est requise +NumberOfTasksCloned=%s tâche·s clonées TimeSpentInvoiced=Temps passé facturé TimeSpentForIntervention=Temps consommé TimeSpentForInvoice=Temps consommés diff --git a/htdocs/langs/fr_FR/salaries.lang b/htdocs/langs/fr_FR/salaries.lang index 9b89cf2fb68..939f83f96c6 100644 --- a/htdocs/langs/fr_FR/salaries.lang +++ b/htdocs/langs/fr_FR/salaries.lang @@ -1,6 +1,6 @@ # Dolibarr language file - Source file is en_US - salaries -SALARIES_ACCOUNTING_ACCOUNT_PAYMENT=Compte (issu du Plan Comptable) utilisé par défaut pour les tiers "utilisateurs" -SALARIES_ACCOUNTING_ACCOUNT_PAYMENT_Desc=Le compte dédié défini sur la carte utilisateur sera utilisé uniquement pour la comptabilité Subledger. Celui-ci sera utilisé pour le grand livre et comme valeur par défaut de la comptabilité auxiliaire si le compte de comptabilité utilisateur dédié à l'utilisateur n'est pas défini. +SALARIES_ACCOUNTING_ACCOUNT_PAYMENT=Compte comptable utilisé par défaut pour les tiers "utilisateurs" +SALARIES_ACCOUNTING_ACCOUNT_PAYMENT_Desc=Le compte dédié défini sur la fiche utilisateur sera utilisé en tant que compte comptable de tiers (Compte auxiliaire). SALARIES_ACCOUNTING_ACCOUNT_CHARGE=Compte comptable par défaut pour les paiements de salaires CREATE_NEW_SALARY_WITHOUT_AUTO_PAYMENT=Par défaut, laissez vide l’option "Créer automatiquement un paiement complet" lors de la création d’un salaire Salary=Salaire diff --git a/htdocs/langs/fr_FR/stripe.lang b/htdocs/langs/fr_FR/stripe.lang index 07bacfaf054..629b3d16bea 100644 --- a/htdocs/langs/fr_FR/stripe.lang +++ b/htdocs/langs/fr_FR/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Clé live des Webhooks ONLINE_PAYMENT_WAREHOUSE=Stock à utiliser pour diminuer le stock lorsque le paiement en ligne est effectué
    (TODO Quand l'option de réduction de stock est effectuée sur une action sur facture et que le paiement en ligne génère lui-même la facture?) StripeLiveEnabled=Mode live activé (sinon mode test/bac a sable) StripeImportPayment=Importer paiements Stripe -ExampleOfTestCreditCard=Exemple de carte de crédit pour le test: %s => valide, %s => erreur CVC, %s => expiré, %s => paiement en échec +ExampleOfTestCreditCard=Exemple de carte de crédit pour le test SEPA : %s => valide, %s => erreur CVC, %s => expirée, %s => débit refusé +ExampleOfTestBankAcountForSEPA=Example de numéro de compte en banque (BAN) pour le test de débit direct : %s StripeGateways=Stripe gateways OAUTH_STRIPE_TEST_ID=Stripe Connect ID client (ca _...) OAUTH_STRIPE_LIVE_ID=Stripe Connect ID client (ca _...) @@ -70,5 +71,8 @@ ToOfferALinkForLiveWebhook=Lien pour la configuration de Stripe WebHook pour app PaymentWillBeRecordedForNextPeriod=Le paiement sera enregistré pour la prochaine période. ClickHereToTryAgain=Cliquez ici pour essayer à nouveau... CreationOfPaymentModeMustBeDoneFromStripeInterface=En raison des règles d'Authentification Client Forte, la création d'une carte doit être effectuée à partir du backoffice de Stripe. Vous pouvez cliquer ici pour basculer sur la fiche client Stripe: %s -TERMINAL_LOCATION=Emplacement (adresse) des terminaux +STRIPE_CARD_PRESENT=Carte présente pour les terminaux Stripe +TERMINAL_LOCATION=Localisation (adresse) pour les terminaux Stripe RequestDirectDebitWithStripe=Demander un prélèvement automatique avec Stripe +STRIPE_SEPA_DIRECT_DEBIT=Activer les paiements par débit direct avec Stripe + diff --git a/htdocs/langs/fr_FR/ticket.lang b/htdocs/langs/fr_FR/ticket.lang index e86f35a52ba..f33c00f2143 100644 --- a/htdocs/langs/fr_FR/ticket.lang +++ b/htdocs/langs/fr_FR/ticket.lang @@ -19,13 +19,14 @@ # Module56000Name=Gestionnaire de tickets -Module56000Desc=Gestionnaire de tickets d'assistance ou de gestion de demandes internes/clients/fournisseurs +Module56000Desc=Gestionnaire de tickets ou de gestion de demandes internes/clients/fournisseurs Permission56001=Voir tickets Permission56002=Modifier des tickets Permission56003=Supprimer tickets Permission56004=Gérer les tickets Permission56005=Voir les tickets de tous les tiers (non effectif pour les utilisateurs externes, toujours limité au tiers dont ils dépendent) +Permission56006=Exporter les tickets Tickets=Tickets TicketDictType=Ticket - Types @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=Contributeur externe OriginEmail=Email demandeur Notify_TICKET_SENTBYMAIL=Envoi d'un message du ticket par e-mail +ExportDataset_ticket_1=Tickets + # Status Read=Lu Assigned=Assigné diff --git a/htdocs/langs/fr_FR/users.lang b/htdocs/langs/fr_FR/users.lang index 1d2873de4d9..1f55490f476 100644 --- a/htdocs/langs/fr_FR/users.lang +++ b/htdocs/langs/fr_FR/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Lien vers l'utilisateur LinkedToDolibarrThirdParty=Lien vers le tiers CreateDolibarrLogin=Créer un compte utilisateur CreateDolibarrThirdParty=Créer un tiers -LoginAccountDisableInDolibarr=Le compte est désactivé sur Dolibarr. +LoginAccountDisableInDolibarr=Compte désactivé dans Dolibarr +PASSWORDInDolibarr=Mot de passe modifié dans Dolibarr UsePersonalValue=Utiliser valeur personnalisée ExportDataset_user_1=Utilisateurs et attributs DomainUser=Utilisateur du domaine %s @@ -129,3 +130,6 @@ IPLastLogin=IP dernière connexion IPPreviousLogin=Connexion précédente IP ShowAllPerms=Afficher toutes les lignes d'autorisation HideAllPerms=Masquer toutes les lignes d'autorisation +UserPublicPageDesc=Vous pouvez activer une carte virtuelle pour cet utilisateur. Une URL avec le profil utilisateur et un code barre sera disponible pour permettre à quiconque muni d'un smartphone de le scanner et d'ajouter le contact à son carnet d'adresse. +EnablePublicVirtualCard=Activer la fiche utilisateur virtuelle publique +PublicVirtualCardUrl=Fiche utilisateur virtuelle publique diff --git a/htdocs/langs/fr_FR/website.lang b/htdocs/langs/fr_FR/website.lang index da4c702a2cb..8732a9a49a9 100644 --- a/htdocs/langs/fr_FR/website.lang +++ b/htdocs/langs/fr_FR/website.lang @@ -155,3 +155,5 @@ WebpageMustBeDisabled=La page Web doit avoir le statut "%s" SetWebsiteOnlineBefore=Lorsque le site Web est hors ligne, toutes les pages sont hors ligne. Changez d'abord le statut du site Web. Booking=Réservation Reservation=Réservation +PagesViewedPreviousMonth=Pages vues (mois précédent) +PagesViewedTotal=Pages vues (total) diff --git a/htdocs/langs/fr_GA/stripe.lang b/htdocs/langs/fr_GA/stripe.lang new file mode 100644 index 00000000000..ae44362fd94 --- /dev/null +++ b/htdocs/langs/fr_GA/stripe.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +TERMINAL_LOCATION=Location (address) for Stripe Terminals diff --git a/htdocs/langs/gl_ES/accountancy.lang b/htdocs/langs/gl_ES/accountancy.lang index 1bcb5190340..52275ead14b 100644 --- a/htdocs/langs/gl_ES/accountancy.lang +++ b/htdocs/langs/gl_ES/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Seleccione o tipo de retorno de carro ACCOUNTING_EXPORT_PREFIX_SPEC=Especifique o prefixo do nome de ficheiro ThisService=Este servizo ThisProduct=Este produto -DefaultForService=Predeterminado para o servizo -DefaultForProduct=Predeterminado para o produto +DefaultForService=Predeterminado para os servizos +DefaultForProduct=Predeterminado para produtos ProductForThisThirdparty=Produto para este terceiro ServiceForThisThirdparty=Servizo para este terceiro CantSuggest=Non pode suxerirse @@ -101,6 +101,7 @@ ShowAccountingAccount=Amosar contabilidade ShowAccountingJournal=Amosar diario contable ShowAccountingAccountInLedger=Amosar a conta contable no libro maior ShowAccountingAccountInJournals=Amosar a conta contable nos diarios +DataUsedToSuggestAccount=Datos utilizados para suxerir conta AccountAccountingSuggest=Conta contable suxerida MenuDefaultAccounts=Contas contables por defecto MenuBankAccounts=Contas Bancarias @@ -126,6 +127,7 @@ WriteBookKeeping=Rexistrar movementos en contabilidade Bookkeeping=Libro Maior BookkeepingSubAccount=Librp maior auxiliar AccountBalance=Saldo da conta +AccountBalanceSubAccount=Saldo de subcontas ObjectsRef=Referencia de obxecto orixe CAHTF=Total compras a provedor antes de impostos TotalExpenseReport=Total informe de gastos @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Conta (do Plan Contable) que se utilizará c UseAuxiliaryAccountOnCustomerDeposit=Almacenar a conta do cliente como unha conta individual para as liñas de anicipo no Libro Maior subsidiario (se está desactivada, a conta individual para as liñas de anticipo permanecerá baleira) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Conta (do Plan Contable) que se utilizará como predeterminada UseAuxiliaryAccountOnSupplierDeposit=Almacenar a conta do provedor como unha conta individual no libro maior subsidiario para as liñas de anticipo (se está desactivada, a conta individual para as liñas de anticipo permanecerá baleira) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Conta contable por defecto para rexistrar a garantía establecida para o cliente ACCOUNTING_PRODUCT_BUY_ACCOUNT=Conta (do Plan Contable) que se utilizará como conta predeterminada para os produtos adquiridos no mesmo país (utilizada se non está definida na ficha do produto) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Conta (do Plan Contable) que se utilizará como conta predeterminada para os produtos comprados na CEE a outro país da CEE (utilizada se non está definida na ficha do produto) @@ -218,6 +221,7 @@ JournalLabel=Etiqueta diario NumPiece=Apunte TransactionNumShort=Núm. transacción AccountingCategory=Grupo de contas personalizado +AccountingCategories=Grupos de contas personalizados GroupByAccountAccounting=Agrupar por conta contable GroupBySubAccountAccounting=Agrupar por subconta contable AccountingAccountGroupsDesc=Pode definir aquí algúns grupos de contas contables. Serán usadas para informes de contabilidade persoalizados. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Amosar subtotal por nivel Pcgtype=Grupo de conta PcgtypeDesc=Grupo e subgrupo de conta utilízanse como criterios predefinidos de "filtro" e "agrupación" para algúns informes de contabilidade. Por exemplo, "INGRESOS" ou "GASTOS" usanse como grupos para contas contables de produtos para construir o informe de gastos/ingresos. +AccountingCategoriesDesc=O grupo de contas personalizado pódese usar para agrupar as contas de contabilidade nun só nome para facilitar o uso de filtros ou a creación de informes personalizados. Reconcilable=Reconciliable @@ -294,6 +299,7 @@ DescValidateMovements=Prohíbese calquera modificación ou eliminación de rexis ValidateHistory=Contabilizar automáticamente AutomaticBindingDone=Ligazóns automáticas finalizadas (%s) -A ligazón automática non é posible para algún rexistro (%s) +DoManualBindingForFailedRecord=Ten que facer unha ligazón manual para a(s) fila(s) %s non ligadas automaticamente. ErrorAccountancyCodeIsAlreadyUse=Produciuse un erro, non pode eliminar nin desactivar esta conta do plan contable porque está en uso MvtNotCorrectlyBalanced=Asento con balance contable incorrecto. Débito = %s e crédito = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Desactivar a ligazón e transferencia na con ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Desactivar a ligazón e transferencia na contabilidade das compras (as facturas do provedor non se terán en conta na contabilidade) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Desactivar a ligazón e transferencia na contabilidade dos informes de gastos (os informes de gastos non se terán en conta na contabilidade) ACCOUNTING_ENABLE_LETTERING=Activa a función de letras na contabilidade +ACCOUNTING_ENABLE_AUTOLETTERING=Activa a marcación automática ao transferir á contabilidade ## Export NotExportLettering=Non exporte as letras ao xerar o ficheiro NotifiedExportDate=Marcar as liñas exportadas como Exportadas (para modificar unha liña, terá que eliminar toda a transacción e transferila de novo á contabilidade) NotifiedValidationDate=Validar e bloquear as entradas exportadas (o mesmo efecto que a función "%s", a modificación e eliminación das liñas DEFINITIVAMENTE non será posible) +NotifiedExportFull=Exportar documentos? DateValidationAndLock=Data validación e bloqueo ConfirmExportFile=Confirmación da xeración do ficheiro de exportación contable? ExportDraftJournal=Exportar libro borrador @@ -398,7 +406,7 @@ SaleLocal=Venda local SaleExport=Venda de exportación SaleEEC=Venda na CEE SaleEECWithVAT=Vendas na CEE con IVE non nulo, polo que supoñemos que isto non é unha venda intracomunitaria e a conta suxerida é a conta estandar de produto. -SaleEECWithoutVATNumber=Venda na CEE sen IVE pero non se define o número de identificación do IVE de terceiros. Respondemos á conta do produto para as vendas estándar. Pode corrixir o ID de IVE de terceiros ou a conta do produto se é preciso. +SaleEECWithoutVATNumber=Venda na CEE sen IVE pero non se define o número de identificación do IVE do terceiro. Voltamos á conta das vendas estándar. Pode corrixir o número de identificación de IVE do terceiro ou cambiar a conta do produto suxerida se é preciso. ForbiddenTransactionAlreadyExported=Prohibido: a transacción foi validada e/ou exportada. ForbiddenTransactionAlreadyValidated=Prohibido: a transacción foi validada. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Erro no código de conciliación AccountancyErrorMismatchBalanceAmount=O saldo (%s) non é igual a 0 AccountancyErrorLetteringBookkeeping=Producíronse erros nas transaccións: %s ErrorAccountNumberAlreadyExists=O número contable %s xa existe +ErrorArchiveAddFile=Non se pode poñer o ficheiro "%s" no arquivo ## Import ImportAccountingEntries=Entradas contables @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Código multidivisa (Idivisa) DateExport=Data de exportación WarningReportNotReliable=Advertencia, este informe non está baseado no Libro Maior, polo que non contén modificacións manualmente realizadas no Libro Maior. Se o seu diario está actualizado, a vista contable é mais precisa. ExpenseReportJournal=Informe de gastos diario +DocsAlreadyExportedAreExcluded=Exclúense os documentos xa exportados +ClickToHideAlreadyExportedLines=Prema para ocultar as liñas xa exportadas NAccounts=%s contas diff --git a/htdocs/langs/gl_ES/admin.lang b/htdocs/langs/gl_ES/admin.lang index a45c5ed97ba..325d245ce24 100644 --- a/htdocs/langs/gl_ES/admin.lang +++ b/htdocs/langs/gl_ES/admin.lang @@ -645,6 +645,8 @@ Module2300Name=Tarefas programadas Module2300Desc=Xestión do traballo programado (alias cron ou chrono taboa) Module2400Name=Eventos/Axenda Module2400Desc=Siga os eventos ou citas. Deixe que Dolibarr rexistre eventos automáticos co fin de realizar seguimento ou rexistre eventos manuais ou xuntanzas. Este é o módulo principal para unha bona xestión de relacións cos clientes ou provedores. +Module2430Name=Sistema de calendario de reservas +Module2430Desc=Proporciona un calendario en liña para que calquera persoa poida reservar citas, segundo intervalos ou dispoñibilidades predefinidos. Module2500Name=GED / SGD Module2500Desc=Sistema de Xestión de Documentos / Xestión Electrónica de Contidos. Organización automática dos seus documentos xerados o almacenados. Compárta cando o precise. Module2600Name=API/Servizos web (servidor SOAP) @@ -660,6 +662,8 @@ Module2900Name=GeoIPMaxmind Module2900Desc=Capacidades de conversión GeoIP Maxmind Module3200Name=Ficheiros inalterables Module3200Desc=Activar o rexistro inalterable de eventos empresarais. Os eventos arquívanse en tempo real. O rexistro é unha taboa de sucesos encadeados que poden lerse e exportar. Este módulo pode ser obrigatorio nalgúns países. +Module3300Name=Diseñador de módulos +Module3200Desc=Activar o rexistro inalterable de eventos empresarais. Os eventos arquívanse en tempo real. O rexistro é unha taboa de sucesos encadeados que poden lerse e exportar. Este módulo pode ser obrigatorio nalgúns países. Module3400Name=Redes sociais Module3400Desc=Active os campos das redes sociais en terceiros e enderezos (skype, twitter, facebook, ...). Module4000Name=RRHH @@ -1270,6 +1274,7 @@ TriggerActiveAsModuleActive=Triggers deste ficheiro activos posto que o módulo GeneratedPasswordDesc=Indique aquí que norma quere utilizar para xerar as contrasinais cando precise xerar un novo contrasinal DictionaryDesc=Inserte aquí os datos de referencia. Pode engadir os seus datos aos predefinidos. ConstDesc=Esta páxina permítelle editar (substituír) parámetros non dispoñibles noutras páxinas. Estes son principalmente parámetros reservados só para desenvolvedores ou solución avanzadas de problemas. +MiscellaneousOptions=Opcións varias MiscellaneousDesc=Todos os outros parámetros relacionados coa seguridad definense aquí. LimitsSetup=Configuración de límites e precisións LimitsDesc=Pode definir aquí os límites e precisións utilizados por Dolibarr @@ -1826,6 +1831,9 @@ AGENDA_USE_EVENT_TYPE=Usar tipos de eventos (xestionados no menú Configuración AGENDA_USE_EVENT_TYPE_DEFAULT=Definir automaticamente este valor predeterminado para o tipo de evento no formulario de creación de eventos AGENDA_DEFAULT_FILTER_TYPE=Establecer automaticamente este tipo de eventos no filtro de busca da vista de axenda AGENDA_DEFAULT_FILTER_STATUS=Establecer automaticamente este estado para eventos no filtro de busca da vista de axenda +AGENDA_EVENT_PAST_COLOR=Cor do evento pasado +AGENDA_EVENT_CURRENT_COLOR=Cor do evento actual +AGENDA_EVENT_FUTURE_COLOR=Cor do evento futuro AGENDA_DEFAULT_VIEW=Cal vista desexa abrir de xeito predeterminado ao seleccionar o menú Axenda AGENDA_REMINDER_BROWSER=Activar a lembranza de eventos no navegador do usuario (Cando se alcanza a data de lembranza, o navegador amosa unha ventá emerxente. Cada usuario pode desactivar estas notificacións desde a configuración de notificacións do navegador). AGENDA_REMINDER_BROWSER_SOUND=Activar a notificación de son @@ -2129,6 +2137,7 @@ CodeLastResult=Código de resultado máis recente NbOfEmailsInInbox=Número de correos electrónicos no directorio de orixe LoadThirdPartyFromName=Cargar busca de terceiros en %s (só cargar) LoadThirdPartyFromNameOrCreate=Cargar a busca de terceiros en %s (crea se non se atopa) +LoadContactFromEmailOrCreate=Cargar contacto buscando en %s (crear se non se atopa) AttachJoinedDocumentsToObject=Garda os ficheiros axuntos en documentos de obxecto se se atopa unha referencia dun obxecto no asunto do correo electrónico. WithDolTrackingID=Mensaxe dunha conversa iniciada por un primeiro correo electrónico enviado desde Dolibarr WithoutDolTrackingID=Mensaxe dunha conversa iniciada por un primeiro correo electrónico NON enviado desde Dolibarr @@ -2355,3 +2364,5 @@ AllowExternalDownload=Permitir descarga externa (sen iniciar sesión, usando unh DeadlineDayVATSubmission=Día límite para a presentación de IVE no mes seguinte MaxNumberOfAttachementOnForms=Número máximo de ficheiros unidos nun formulario IfDefinedUseAValueBeetween=Se está definido, use un valor entre %s e %s +Reload=Recarga +ConfirmReload=Confirmar recarga do módulo diff --git a/htdocs/langs/gl_ES/boxes.lang b/htdocs/langs/gl_ES/boxes.lang index 3f7b5a246e8..31a4f631c89 100644 --- a/htdocs/langs/gl_ES/boxes.lang +++ b/htdocs/langs/gl_ES/boxes.lang @@ -24,6 +24,7 @@ BoxFicheInter=Últimas intervencións BoxCurrentAccounts=Balance de contas abertas BoxTitleMemberNextBirthdays=Cumpreanos neste mes (Membros) BoxTitleMembersByType=Membros por tipo e estado +BoxTitleMembersByTags=Membros por etiquetas e estado BoxTitleMembersSubscriptionsByYear=Subscricións de membros por ano BoxTitleLastRssInfos=Últimas %s novas de %s BoxTitleLastProducts=Produtos/Servizos: Últimos %s modificados diff --git a/htdocs/langs/gl_ES/companies.lang b/htdocs/langs/gl_ES/companies.lang index 8061a2900be..10518100b75 100644 --- a/htdocs/langs/gl_ES/companies.lang +++ b/htdocs/langs/gl_ES/companies.lang @@ -312,12 +312,12 @@ CustomerRelativeDiscountShort=Desconto relativo CustomerAbsoluteDiscountShort=Desconto fixo CompanyHasRelativeDiscount=Este cliente ten un desconto por defecto de %s%% CompanyHasNoRelativeDiscount=Este cliente non ten descontos relativos por defecto -HasRelativeDiscountFromSupplier=Ten un desconto predeterminado de %s%% neste provedor -HasNoRelativeDiscountFromSupplier=Non ten desconto relativo predeterminado neste provedor +HasRelativeDiscountFromSupplier=Ten un desconto predeterminado de %s%% con este provedor +HasNoRelativeDiscountFromSupplier=Non hai desconto relativo predeterminado neste provedor CompanyHasAbsoluteDiscount=Este cliente ten descontos (abonos ou anticipos) dispoñibles para %s %s CompanyHasDownPaymentOrCommercialDiscount=Este cliente ten descontos dispoñibles (anticipos, comerciais) para %s %s CompanyHasCreditNote=Este cliente ten anticipos dispoñibles en %s %s -HasNoAbsoluteDiscountFromSupplier=Non ten ningún crédito de desconto dispoñible neste provedor +HasNoAbsoluteDiscountFromSupplier=Non hai desconto/crédito dispoñible deste vendedor HasAbsoluteDiscountFromSupplier=Ten descontos dispoñibles (notas de créditos ou anticipos) para %s %s deste provedor HasDownPaymentOrCommercialDiscountFromSupplier=Ten descontos dispoñibles (comerciais, anticipos) para %s %s deste provedor HasCreditNoteFromSupplier=Ten abonos para %s %s deste provedor @@ -444,7 +444,7 @@ AddAddress=Engadir enderezo SupplierCategory=Categoría de provedor JuridicalStatus200=Independente DeleteFile=Eliminación dun ficheiro -ConfirmDeleteFile=¿Está certo de querer eliminar este ficheiro? +ConfirmDeleteFile=Está certo de querer eliminar este ficheiro %s ? AllocateCommercial=Asignado a comercial Organization=Organización FiscalYearInformation=Ano fiscal @@ -498,3 +498,8 @@ RestOfEurope=Resto de Europa (EEC) OutOfEurope=Fora de Europa (EEC) CurrentOutstandingBillLate=Factura actual pendente atrasada BecarefullChangeThirdpartyBeforeAddProductToInvoice=Ter coidado, dependendo da configuración do prezo do produto, debería mudarse o terceiro antes de engadir o produto ao TPV. +EmailAlreadyExistsPleaseRewriteYourCompanyName=o correo electrónico xa existe, reescriba o nome da súa empresa +TwoRecordsOfCompanyName=existe máis dun rexistro para esta empresa, póñase en contacto connosco para completar a súa solicitude de asociación +CompanySection=Sección empresa +ShowSocialNetworks=Amosar redes sociais +HideSocialNetworks=Ocultar redes sociais diff --git a/htdocs/langs/gl_ES/errors.lang b/htdocs/langs/gl_ES/errors.lang index 06f0cd7f434..a9add42b94d 100644 --- a/htdocs/langs/gl_ES/errors.lang +++ b/htdocs/langs/gl_ES/errors.lang @@ -303,6 +303,7 @@ ErrorValueForTooLow=O valor de %s é demasiado baixo ErrorValueCantBeNull=O valor para %s non pode ser nulo ErrorDateOfMovementLowerThanDateOfFileTransmission=A data da transacción bancaria non pode ser inferior á data de transmisión do ficheiro ErrorTooMuchFileInForm=Hai demasiados ficheiros no formulario, o número máximo é %s ficheiro(s) +ErrorSessionInvalidatedAfterPasswordChange=A sesión foi invalidada despois do cambio de contrasinal, estado ou datas de validez. Reinicie sesión. # Warnings WarningParamUploadMaxFileSizeHigherThanPostMaxSize=O seu parámetro PHP upload_max_filesize (%s) é superior ao parámetro PHP post_max_size (%s). Esta non é unha configuración consistente. @@ -325,6 +326,7 @@ WarningPaymentDateLowerThanInvoiceDate=A data de pagamento (%s) é anterior á d WarningTooManyDataPleaseUseMoreFilters=Datos de mais (máis de %s liñas). Utilice máis filtros ou estableza a constante %s nun límite máis alto. WarningSomeLinesWithNullHourlyRate=Algunhas veces algúns usuarios rexistráronse mentres a súa tarifa por hora non estaba definida. Utilizouse un valor do 0 %s por hora, pero isto pode resultar nunha avaliación incorrecta do tempo empregado. WarningYourLoginWasModifiedPleaseLogin=Modificouse o seu inicio de sesión. Por motivos de seguridade, terá que iniciar sesión co novo inicio de sesión antes da seguinte acción. +WarningYourPasswordWasModifiedPleaseLogin=O seu contrasinal foi modificado. Por motivos de seguridade, terá que iniciar sesión agora co seu novo contrasinal. WarningAnEntryAlreadyExistForTransKey=Xa existe unha entrada para a clave de tradución para este idioma WarningNumberOfRecipientIsRestrictedInMassAction=Aviso, o número de destinatarios diferentes está limitado a %s cando se usan as accións masivas nas listaxes WarningDateOfLineMustBeInExpenseReportRange=Aviso, a data da liña non está no rango do informe de gastos diff --git a/htdocs/langs/gl_ES/eventorganization.lang b/htdocs/langs/gl_ES/eventorganization.lang index 0899a9ef2aa..348a6227083 100644 --- a/htdocs/langs/gl_ES/eventorganization.lang +++ b/htdocs/langs/gl_ES/eventorganization.lang @@ -172,3 +172,5 @@ ErrorSeveralCompaniesWithEmailContactUs=Atopáronse varias empresas con este cor ErrorSeveralCompaniesWithNameContactUs=Atopáronse varias empresas con este nome polo que non podemos validar automaticamente a súa inscrición. Póñase en contacto connosco en %s para unha validación manual NoPublicActionsAllowedForThisEvent=Non hai accións públicas abertas ao público para este evento MaxNbOfAttendees=Número máximo de asistentes +DateStartEvent=Data de inicio do evento +DateEndEvent=Data de finalización do evento diff --git a/htdocs/langs/gl_ES/main.lang b/htdocs/langs/gl_ES/main.lang index 54f5b211c87..c36035f9294 100644 --- a/htdocs/langs/gl_ES/main.lang +++ b/htdocs/langs/gl_ES/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=Non hai definido grupo de usuarios Password=Contrasinal PasswordRetype=Repita o seu contrasinal NoteSomeFeaturesAreDisabled=Ten conta que moitos módulos/funcionalidades foron desactivados nesta demo. +YourUserFile=O seu ficheiro de usuario Name=Nome NameSlashCompany=Nome / Empresa Person=Persoa @@ -897,6 +898,9 @@ MassFilesArea=Área de ficheiros xerados por accións masivas ShowTempMassFilesArea=Amosar área de ficheiros xerados por accións masivas ConfirmMassDeletion=Confirmación borrado masivo ConfirmMassDeletionQuestion=¿Estás certo de querer eliminar os %s rexistro(s) seleccionado(s)? +ConfirmMassClone=Confirmación de clonación masiva +ConfirmMassCloneQuestion=Seleccione o proxecto para clonar a +ConfirmMassCloneToOneProject=Clonar o proxecto %s RelatedObjects=Obxectos relacionados ClassifyBilled=Clasificar facturado ClassifyUnbilled=Clasificar non facturado @@ -912,8 +916,8 @@ ExportFilteredList=Listaxe filtrado de exportación ExportList=Listaxe de exportación ExportOptions=Opcións de exportación IncludeDocsAlreadyExported=Incluir documentos xa exportados -ExportOfPiecesAlreadyExportedIsEnable=Exportar pezas xa exportadas está activado -ExportOfPiecesAlreadyExportedIsDisable=Exportar pezas xa exportadas está desactivado +ExportOfPiecesAlreadyExportedIsEnable=Os documentos xa exportados están visibles e exportaranse +ExportOfPiecesAlreadyExportedIsDisable=Os documentos xa exportados están ocultos e non se exportarán AllExportedMovementsWereRecordedAsExported=Todos os movementos exportados foron rexistrados como exportados NotAllExportedMovementsCouldBeRecordedAsExported=Non todos os movementos exportados poden ser rexistrados como exportados Miscellaneous=Miscelánea @@ -1128,6 +1132,7 @@ DeleteFileText=Está certo de querer borrar este ficheiro? ShowOtherLanguages=Amosar outras lingoas SwitchInEditModeToAddTranslation=Cambie ao modo de edición para engadir traduciáns a esta lingoa NotUsedForThisCustomer=Non usado neste cliente +NotUsedForThisVendor=Non usado para este provedor AmountMustBePositive=O importe ten que ser positivo ByStatus=By status InformationMessage=Información @@ -1148,14 +1153,14 @@ EventReminder=Recordatorio de evento UpdateForAllLines=Actualizar todas as liñas OnHold=Agardando Civility=Cortesía -AffectTag=Asignar etiqueta -AffectUser=Asignar usuario -SetSupervisor=Configurar Supervisor +AffectTag=Asignar unha etiqueta +AffectUser=Asignar un usuario +SetSupervisor=Establece o supervisor CreateExternalUser=Crear usuario externo ConfirmAffectTag=Asignación masiva de etiquetas ConfirmAffectUser=Asignación masiva de usuarios -ProjectRole=Papel asignado en cada proxecto -TasksRole=Papel asignado en cada tarefa de cada proxecto +ProjectRole=Papel asignado en cada proxecto/oportunidade +TasksRole=Papel asignado a cada tarefa (se se usa) ConfirmSetSupervisor=Configuración masiva de supervisores ConfirmUpdatePrice=Escolla un aumento/diminución da taxa de prezo ConfirmAffectTagQuestion=Está certo de querer asignar etiquetas aos rexistros seleccionados %s? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Creado a partir do portal público UserAgent=Axente de usuario InternalUser=Usuario interno ExternalUser=Usuario externo +NoSpecificContactAddress=Sen contacto nin enderezo específico +NoSpecificContactAddressBis=Esta lapela está dedicada a forzar contactos ou enderezos específicos para o obxecto actual. Utilíce só se quere definir un ou varios contactos ou enderezos específicos para o obxecto cando a información do terceiro non sexa suficiente ou non sexa precisa. +HideOnVCard=Ocultar %s +AddToContacts=Engadir enderezo aos meus contactos +LastAccess=Último acceso +UploadAnImageToSeeAPhotoHere=Cargue unha imaxe da pestana %s para ver unha foto aquí +LastPasswordChangeDate=Última data de modificación de contrasinal diff --git a/htdocs/langs/gl_ES/mrp.lang b/htdocs/langs/gl_ES/mrp.lang index 631d42bb8ee..71c2483e2aa 100644 --- a/htdocs/langs/gl_ES/mrp.lang +++ b/htdocs/langs/gl_ES/mrp.lang @@ -102,6 +102,7 @@ NbOperatorsRequired=Número de operadores precisos THMOperatorEstimated=THM estimada operador THMMachineEstimated=THM estimada máquina WorkstationType=Tipo de estación de traballo +DefaultWorkstation=Estación de traballo predeterminada Human=Humano Machine=Máquina HumanMachine=Humano/Máquina diff --git a/htdocs/langs/gl_ES/orders.lang b/htdocs/langs/gl_ES/orders.lang index 474de37aa95..ed2a1a9f74d 100644 --- a/htdocs/langs/gl_ES/orders.lang +++ b/htdocs/langs/gl_ES/orders.lang @@ -96,6 +96,10 @@ OrdersStatisticsSuppliers=Estatísticas de pedimentos a provedor NumberOfOrdersByMonth=Número de pedimentos por mes AmountOfOrdersByMonthHT=Importe total de pedimentos por mes (sen IVE) ListOfOrders=Listaxe de pedimentos +ListOrderLigne=Liñas de pedimentos +productobuy=Só produtos para mercar +productonly=Só produtos +disablelinefree=Sen liñas libres CloseOrder=Pechar pedimento ConfirmCloseOrder=¿Está certo de querer clasificar este pedimento como enviado? Una vez enviado un pedimento, solo podrá facturarse ConfirmDeleteOrder=¿Está certo de querer eliminar este pedimento? @@ -131,6 +135,7 @@ SupplierOrderClassifiedBilled=Pedimento a provedor %s facturado OtherOrders=Outros pedimentos SupplierOrderValidatedAndApproved=A orde do provedor está validada e aprobada: %s SupplierOrderValidated=A orde do provedor está validada: %s +OrderShowDetail=Amosar detalles do pedimento ##### Types de contacts ##### TypeContact_commande_internal_SALESREPFOLL=Responsable seguimento do pedimento cliente TypeContact_commande_internal_SHIPPING=Responsable envío pedimento cliente @@ -199,3 +204,5 @@ StatusSupplierOrderApproved=Aprobado StatusSupplierOrderRefused=Rexeitado StatusSupplierOrderReceivedPartially=Recibido parcialmente StatusSupplierOrderReceivedAll=Todos os produtos recibidos +NeedAtLeastOneInvoice = Ten que haber polo menos unha factura +LineAlreadyDispatched = A liña de pedimento xa está recibida. diff --git a/htdocs/langs/gl_ES/stripe.lang b/htdocs/langs/gl_ES/stripe.lang index a661bca00b4..aefbbeb8840 100644 --- a/htdocs/langs/gl_ES/stripe.lang +++ b/htdocs/langs/gl_ES/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Chave live de Webhook ONLINE_PAYMENT_WAREHOUSE=Stock que se usará para diminuír o stock cando se faga o pagamento en liña
    (TODO Cando se fai a opción de diminuír o stock nunha acción de factura e o pagamento en liña xera a factura?) StripeLiveEnabled=Stripe live activado (se non, proba modo sandbox) StripeImportPayment=Importar pagamentos de Stripe -ExampleOfTestCreditCard=Exemplo de tarxeta de crédito para a proba:%s => válido,%s => erro CVC,%s => caducado,%s => falla de carga +ExampleOfTestCreditCard=Exemplo de tarxeta de crédito para a proba SEPA: %s => válido, %s => erro CVC, %s => caducado, %s => fallo de carga +ExampleOfTestBankAcountForSEPA=Exemplo de conta bancaria BAN para a proba de domiciliación bancaria: %s StripeGateways=Pasarelas de Stripe OAUTH_STRIPE_TEST_ID=Id de cliente de Stripe Connect (ca _...) OAUTH_STRIPE_LIVE_ID=Id de cliente Stripe Connect (ca _...) @@ -61,6 +62,7 @@ DeleteACard=Eliminar tarxeta ConfirmDeleteCard=Este certo querer eliminar esta tarxeta de Crédito ou Débito? CreateCustomerOnStripe=Crear cliente en Stripe CreateCardOnStripe=Crear unha tarxeta en Stripe +CreateBANOnStripe=Crear un banco en Stripe ShowInStripe=Amosar en Stripe StripeUserAccountForActions=Conta de usuario a utilizar para a notificación por correo electrónico dalgúns eventos de Stripe (pagos de Stripe) StripePayoutList=Listaxe de pagamentos de Stripe @@ -69,4 +71,8 @@ ToOfferALinkForLiveWebhook=Ligazón para configurar Stripe WebHook para chamar a PaymentWillBeRecordedForNextPeriod=O pago será rexistrado para o seguinte período. ClickHereToTryAgain= Faga clic aquí para tentalo de novo ... CreationOfPaymentModeMustBeDoneFromStripeInterface=Debido a fortes regras de autenticación do cliente, a creación dunha tarxeta debe facerse desde o backoffice de Stripe. Pode facer clic aquí para activar o rexistro de cliente de Stripe:%s -TERMINAL_LOCATION=Localización (enderezo) dos terminais +STRIPE_CARD_PRESENT=Transacción de tarxeta presente para terminais Stripe +TERMINAL_LOCATION=Localización (enderezo) para terminais Stripe +RequestDirectDebitWithStripe=Solicite domiciliación bancaria con Stripe +STRIPE_SEPA_DIRECT_DEBIT=Activa os pagamentos por domiciliación bancaria a través de Stripe + diff --git a/htdocs/langs/gl_ES/ticket.lang b/htdocs/langs/gl_ES/ticket.lang index da768656b3d..85e093b9f1d 100644 --- a/htdocs/langs/gl_ES/ticket.lang +++ b/htdocs/langs/gl_ES/ticket.lang @@ -26,6 +26,7 @@ Permission56002=Modificar tickets Permission56003=Eliminar tickets Permission56004=Administrar tickets Permission56005=Ver tickets de todos os terceiros (non aplicable para usuarios externos, sempre estará limitado ao terceiro do que dependen) +Permission56006=Exportar tickets Tickets=Tickets TicketDictType=Tipo de tickets @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=Contribuidor externo OriginEmail=Correo electrónico do redactor Notify_TICKET_SENTBYMAIL=Enviar mensaxe de ticket por e-mail +ExportDataset_ticket_1=Tickets + # Status Read=Lido Assigned=Asignado diff --git a/htdocs/langs/gl_ES/users.lang b/htdocs/langs/gl_ES/users.lang index 54359db27a7..801c125e210 100644 --- a/htdocs/langs/gl_ES/users.lang +++ b/htdocs/langs/gl_ES/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Ligazón ao usuario LinkedToDolibarrThirdParty=Ligazón ao terceiro CreateDolibarrLogin=Crear un usuario CreateDolibarrThirdParty=Crear un terceiro -LoginAccountDisableInDolibarr=A conta está desactivada en Dolibarr +LoginAccountDisableInDolibarr=Conta desactivada en Dolibarr +PASSWORDInDolibarr=Contrasinal modificado en Dolibarr UsePersonalValue=Utilizar valores persoalizados ExportDataset_user_1=Usuarios e as súas propiedades. DomainUser=Usuario de dominio @@ -129,3 +130,6 @@ IPLastLogin=IP último inicio de sesión IPPreviousLogin=IP de inicio de sesión anterior ShowAllPerms=Mostra todas as filas de permisos HideAllPerms=Ocultar todas as filas de permisos +UserPublicPageDesc=Pode activar unha tarxeta virtual para este usuario. Haberá dispoñible un URL co perfil de usuario e un código de barras para que calquera persoa que teña un teléfono intelixente poida escaneala e engadir o seu contacto á súa axenda de enderezos. +EnablePublicVirtualCard=Activa a tarxeta de usuario virtual pública +PublicVirtualCardUrl=Tarxeta de usuario virtual pública diff --git a/htdocs/langs/hi_IN/accountancy.lang b/htdocs/langs/hi_IN/accountancy.lang index 13a1024d44e..358d35903bc 100644 --- a/htdocs/langs/hi_IN/accountancy.lang +++ b/htdocs/langs/hi_IN/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=परिवहन लागत वापसी प् ACCOUNTING_EXPORT_PREFIX_SPEC=फ़ाइल नाम के लिए उपसर्ग निर्दिष्ट करें ThisService=यह सेवा ThisProduct=यह उत्पाद -DefaultForService=सेवा के लिए डिफ़ॉल्ट -DefaultForProduct=उत्पाद के लिए डिफ़ॉल्ट +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Product for this thirdparty ServiceForThisThirdparty=Service for this thirdparty CantSuggest=सुझाव नहीं दे सकते @@ -48,8 +48,9 @@ CountriesNotInEEC=Countries not in EEC CountriesInEECExceptMe=Countries in EEC except %s CountriesExceptMe=All countries except %s AccountantFiles=Export source documents -ExportAccountingSourceDocHelp=With this tool, you can export the source events (list in CSV and PDFs) that are used to generate your accountancy. +ExportAccountingSourceDocHelp=With this tool, you can search and export the source events that are used to generate your accountancy.
    The exported ZIP file will contain the lists of requested items in CSV, as well as their attached files in their original format (PDF, ODT, DOCX...). ExportAccountingSourceDocHelp2=To export your journals, use the menu entry %s - %s. +ExportAccountingProjectHelp=Specify a project if you need an accounting report only for a specific project. Expense reports and loan payments are not included in project reports. VueByAccountAccounting=View by accounting account VueBySubAccountAccounting=View by accounting subaccount @@ -58,28 +59,29 @@ MainAccountForSuppliersNotDefined=Main accounting account for vendors not define MainAccountForUsersNotDefined=Main accounting account for users not defined in setup MainAccountForVatPaymentNotDefined=Main accounting account for VAT payment not defined in setup MainAccountForSubscriptionPaymentNotDefined=Main accounting account for subscription payment not defined in setup +UserAccountNotDefined=Accounting account for user not defined in setup AccountancyArea=लेखा क्षेत्र AccountancyAreaDescIntro=Usage of the accountancy module is done in several step: AccountancyAreaDescActionOnce=The following actions are usually executed one time only, or once per year... -AccountancyAreaDescActionOnceBis=Next steps should be done to save you time in future by suggesting you the correct default accounting account when making the journalization (writing record in Journals and General ledger) +AccountancyAreaDescActionOnceBis=Next steps should be done to save you time in future by suggesting you automaticaly the correct default accounting account when transferring data in accounting AccountancyAreaDescActionFreq=The following actions are usually executed every month, week or day for very large companies... -AccountancyAreaDescJournalSetup=STEP %s: Create or check content of your journal list from menu %s +AccountancyAreaDescJournalSetup=STEP %s: Check content of your journal list from menu %s AccountancyAreaDescChartModel=STEP %s: Check that a model of chart of account exists or create one from menu %s AccountancyAreaDescChart=STEP %s: Select and|or complete your chart of account from menu %s AccountancyAreaDescVat=STEP %s: Define accounting accounts for each VAT Rates. For this, use the menu entry %s. AccountancyAreaDescDefault=STEP %s: Define default accounting accounts. For this, use the menu entry %s. -AccountancyAreaDescExpenseReport=STEP %s: Define default accounting accounts for each type of expense report. For this, use the menu entry %s. +AccountancyAreaDescExpenseReport=STEP %s: Define default accounting accounts for each type of Expense report. For this, use the menu entry %s. AccountancyAreaDescSal=STEP %s: Define default accounting accounts for payment of salaries. For this, use the menu entry %s. -AccountancyAreaDescContrib=STEP %s: Define default accounting accounts for special expenses (miscellaneous taxes). For this, use the menu entry %s. +AccountancyAreaDescContrib=STEP %s: Define default accounting accounts for Taxes (special expenses). For this, use the menu entry %s. AccountancyAreaDescDonation=STEP %s: Define default accounting accounts for donation. For this, use the menu entry %s. AccountancyAreaDescSubscription=STEP %s: Define default accounting accounts for member subscription. For this, use the menu entry %s. AccountancyAreaDescMisc=STEP %s: Define mandatory default account and default accounting accounts for miscellaneous transactions. For this, use the menu entry %s. AccountancyAreaDescLoan=STEP %s: Define default accounting accounts for loans. For this, use the menu entry %s. AccountancyAreaDescBank=STEP %s: Define accounting accounts and journal code for each bank and financial accounts. For this, use the menu entry %s. -AccountancyAreaDescProd=STEP %s: Define accounting accounts on your products/services. For this, use the menu entry %s. +AccountancyAreaDescProd=STEP %s: Define accounting accounts on your Products/Services. For this, use the menu entry %s. AccountancyAreaDescBind=STEP %s: Check the binding between existing %s lines and accounting account is done, so application will be able to journalize transactions in Ledger in one click. Complete missing bindings. For this, use the menu entry %s. AccountancyAreaDescWriteRecords=STEP %s: Write transactions into the Ledger. For this, go into menu %s, and click into button %s. @@ -99,7 +101,8 @@ ShowAccountingAccount=Show accounting account ShowAccountingJournal=Show accounting journal ShowAccountingAccountInLedger=Show accounting account in ledger ShowAccountingAccountInJournals=Show accounting account in journals -AccountAccountingSuggest=Accounting account suggested +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=Default accounts MenuBankAccounts=Bank accounts MenuVatAccounts=Vat accounts @@ -112,7 +115,7 @@ MenuAccountancyClosure=Closure MenuAccountancyValidationMovements=Validate movements ProductsBinding=Products accounts TransferInAccounting=Transfer in accounting -RegistrationInAccounting=Registration in accounting +RegistrationInAccounting=Recording in accounting Binding=Binding to accounts CustomersVentilation=Customer invoice binding SuppliersVentilation=Vendor invoice binding @@ -120,10 +123,11 @@ ExpenseReportsVentilation=Expense report binding CreateMvts=Create new transaction UpdateMvts=Modification of a transaction ValidTransaction=Validate transaction -WriteBookKeeping=Register transactions in accounting +WriteBookKeeping=Record transactions in accounting Bookkeeping=Ledger BookkeepingSubAccount=Subledger AccountBalance=Account balance +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Source object ref CAHTF=Total purchase vendor before tax TotalExpenseReport=Total expense report @@ -161,41 +165,47 @@ BANK_DISABLE_DIRECT_INPUT=Disable direct recording of transaction in bank accoun ACCOUNTING_ENABLE_EXPORT_DRAFT_JOURNAL=Enable draft export on journal ACCOUNTANCY_COMBO_FOR_AUX=Enable combo list for subsidiary account (may be slow if you have a lot of third parties, break ability to search on a part of value) ACCOUNTING_DATE_START_BINDING=Define a date to start binding & transfer in accountancy. Below this date, the transactions will not be transferred to accounting. -ACCOUNTING_DEFAULT_PERIOD_ON_TRANSFER=On accountancy transfer, select period show by default +ACCOUNTING_DEFAULT_PERIOD_ON_TRANSFER=On accountancy transfer, what is the period selected by default -ACCOUNTING_SELL_JOURNAL=Sell journal -ACCOUNTING_PURCHASE_JOURNAL=Purchase journal -ACCOUNTING_MISCELLANEOUS_JOURNAL=Miscellaneous journal +ACCOUNTING_SELL_JOURNAL=Sales journal (sales and returns) +ACCOUNTING_PURCHASE_JOURNAL=Purchase journal (purchase and returns) +ACCOUNTING_BANK_JOURNAL=Cash journal (receipts and disbursements) ACCOUNTING_EXPENSEREPORT_JOURNAL=Expense report journal -ACCOUNTING_SOCIAL_JOURNAL=Social journal +ACCOUNTING_MISCELLANEOUS_JOURNAL=General journal ACCOUNTING_HAS_NEW_JOURNAL=Has new Journal +ACCOUNTING_INVENTORY_JOURNAL=Inventory journal +ACCOUNTING_SOCIAL_JOURNAL=Social journal ACCOUNTING_RESULT_PROFIT=Result accounting account (Profit) ACCOUNTING_RESULT_LOSS=Result accounting account (Loss) ACCOUNTING_CLOSURE_DEFAULT_JOURNAL=Journal of closure -ACCOUNTING_ACCOUNT_TRANSFER_CASH=Accounting account of transitional bank transfer +ACCOUNTING_ACCOUNT_TRANSFER_CASH=Account (from the Chart Of Account) to be used as the account for transitional bank transfers TransitionalAccount=Transitional bank transfer account -ACCOUNTING_ACCOUNT_SUSPENSE=Accounting account of wait -DONATION_ACCOUNTINGACCOUNT=Accounting account to register donations -ADHERENT_SUBSCRIPTION_ACCOUNTINGACCOUNT=Accounting account to register subscriptions +ACCOUNTING_ACCOUNT_SUSPENSE=Account (from the Chart Of Account) to be used as the account for unallocated funds either received or paid i.e. funds in "wait[ing]" +DONATION_ACCOUNTINGACCOUNT=Account (from the Chart Of Account) to be used to register donations (Donation module) +ADHERENT_SUBSCRIPTION_ACCOUNTINGACCOUNT=Account (from the Chart Of Account) to be used to register memberships subscriptions (Membership module - if membership recorded without invoice) -ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Accounting account by default to register customer deposit +ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be used as the default account to register customer deposit +UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default +UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty -ACCOUNTING_PRODUCT_BUY_ACCOUNT=Accounting account by default for the bought products (used if not defined in the product sheet) -ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Accounting account by default for the bought products in EEC (used if not defined in the product sheet) -ACCOUNTING_PRODUCT_BUY_EXPORT_ACCOUNT=Accounting account by default for the bought products and imported out of EEC (used if not defined in the product sheet) -ACCOUNTING_PRODUCT_SOLD_ACCOUNT=Accounting account by default for the sold products (used if not defined in the product sheet) -ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT=Accounting account by default for the products sold in EEC (used if not defined in the product sheet) -ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT=Accounting account by default for the products sold and exported out of EEC (used if not defined in the product sheet) +ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) +ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) +ACCOUNTING_PRODUCT_BUY_EXPORT_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased and imported from any other foreign country (used if not defined in the product sheet) +ACCOUNTING_PRODUCT_SOLD_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the sold products (used if not defined in the product sheet) +ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products sold from EEC to another EEC country (used if not defined in the product sheet) +ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products sold and exported to any other foreign country (used if not defined in the product sheet) -ACCOUNTING_SERVICE_BUY_ACCOUNT=Accounting account by default for the bought services (used if not defined in the service sheet) -ACCOUNTING_SERVICE_BUY_INTRA_ACCOUNT=Accounting account by default for the bought services in EEC (used if not defined in the service sheet) -ACCOUNTING_SERVICE_BUY_EXPORT_ACCOUNT=Accounting account by default for the bought services and imported out of EEC (used if not defined in the service sheet) -ACCOUNTING_SERVICE_SOLD_ACCOUNT=Accounting account by default for the sold services (used if not defined in the service sheet) -ACCOUNTING_SERVICE_SOLD_INTRA_ACCOUNT=Accounting account by default for the services sold in EEC (used if not defined in the service sheet) -ACCOUNTING_SERVICE_SOLD_EXPORT_ACCOUNT=Accounting account by default for the services sold and exported out of EEC (used if not defined in the service sheet) +ACCOUNTING_SERVICE_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the services purchased within same country (used if not defined in the service sheet) +ACCOUNTING_SERVICE_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the services purchased from EEC to another EEC country (used if not defined in the service sheet) +ACCOUNTING_SERVICE_BUY_EXPORT_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the services purchased and imported from other foreign country (used if not defined in the service sheet) +ACCOUNTING_SERVICE_SOLD_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the sold services (used if not defined in the service sheet) +ACCOUNTING_SERVICE_SOLD_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the services sold from EEC to another EEC country (used if not defined in the service sheet) +ACCOUNTING_SERVICE_SOLD_EXPORT_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the services sold and exported to any other foreign country (used if not defined in the service sheet) Doctype=Type of document Docdate=Date @@ -210,7 +220,8 @@ Codejournal=Journal JournalLabel=Journal label NumPiece=Piece number TransactionNumShort=Num. transaction -AccountingCategory=Custom group +AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Group by general ledger account GroupBySubAccountAccounting=Group by subledger account AccountingAccountGroupsDesc=You can define here some groups of accounting account. They will be used for personalized accounting reports. @@ -219,12 +230,12 @@ ByPredefinedAccountGroups=By predefined groups ByPersonalizedAccountGroups=By personalized groups ByYear=By year NotMatch=Not Set -DeleteMvt=Delete some operation lines from accounting +DeleteMvt=Delete some lines from accounting DelMonth=Month to delete DelYear=Year to delete DelJournal=Journal to delete -ConfirmDeleteMvt=This will delete all operation lines of the accounting for the year/month and/or for a specific journal (At least one criterion is required). You will have to reuse the feature '%s' to have the deleted record back in the ledger. -ConfirmDeleteMvtPartial=This will delete the transaction from the accounting (all operation lines related to the same transaction will be deleted) +ConfirmDeleteMvt=This will delete all lines in accountancy for the year/month and/or for a specific journal (At least one criterion is required). You will have to reuse the feature '%s' to have the deleted record back in the ledger. +ConfirmDeleteMvtPartial=This will delete the transaction from the accounting (all lines related to the same transaction will be deleted) FinanceJournal=Finance journal ExpenseReportsJournal=Expense reports journal DescFinanceJournal=Finance journal including all the types of payments by bank account @@ -258,19 +269,20 @@ ShowSubtotalByGroup=Show subtotal by level Pcgtype=Group of account PcgtypeDesc=Group of account are used as predefined 'filter' and 'grouping' criteria for some accounting reports. For example, 'INCOME' or 'EXPENSE' are used as groups for accounting accounts of products to build the expense/income report. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Reconcilable TotalVente=Total turnover before tax TotalMarge=Total sales margin -DescVentilCustomer=Consult here the list of customer invoice lines bound (or not) to a product accounting account -DescVentilMore=In most cases, if you use predefined products or services and you set the account number on the product/service card, the application will be able to make all the binding between your invoice lines and the accounting account of your chart of accounts, just in one click with the button "%s". If account was not set on product/service cards or if you still have some lines not bound to an account, you will have to make a manual binding from the menu "%s". -DescVentilDoneCustomer=Consult here the list of the lines of invoices customers and their product accounting account -DescVentilTodoCustomer=Bind invoice lines not already bound with a product accounting account -ChangeAccount=Change the product/service accounting account for selected lines with the following accounting account: +DescVentilCustomer=Consult here the list of customer invoice lines bound (or not) to a product account from chart of account +DescVentilMore=In most cases, if you use predefined products or services and you set the account (from chart of account) on the product/service card, the application will be able to make all the binding between your invoice lines and the accounting account of your chart of accounts, just in one click with the button "%s". If account was not set on product/service cards or if you still have some lines not bound to an account, you will have to make a manual binding from the menu "%s". +DescVentilDoneCustomer=Consult here the list of the lines of invoices customers and their product account from chart of account +DescVentilTodoCustomer=Bind invoice lines not already bound with a product account from chart of account +ChangeAccount=Change the product/service account (from chart of account) for the selected lines with the following account: Vide=- -DescVentilSupplier=Consult here the list of vendor invoice lines bound or not yet bound to a product accounting account (only record not already transfered in accountancy are visible) +DescVentilSupplier=Consult here the list of vendor invoice lines bound or not yet bound to a product account from chart of account (only record not already transfered in accountancy are visible) DescVentilDoneSupplier=Consult here the list of the lines of vendor invoices and their accounting account DescVentilTodoExpenseReport=Bind expense report lines not already bound with a fee accounting account DescVentilExpenseReport=Consult here the list of expense report lines bound (or not) to a fee accounting account @@ -278,30 +290,32 @@ DescVentilExpenseReportMore=If you setup accounting account on type of expense r DescVentilDoneExpenseReport=Consult here the list of the lines of expenses reports and their fees accounting account Closure=Annual closure -DescClosure=Consult here the number of movements by month who are not validated & fiscal years already open -OverviewOfMovementsNotValidated=Step 1/ Overview of movements not validated. (Necessary to close a fiscal year) -AllMovementsWereRecordedAsValidated=All movements were recorded as validated -NotAllMovementsCouldBeRecordedAsValidated=Not all movements could be recorded as validated -ValidateMovements=Validate movements +DescClosure=Consult here the number of movements by month not yet validated & locked +OverviewOfMovementsNotValidated=Overview of movements not validated and locked +AllMovementsWereRecordedAsValidated=All movements were recorded as validated and locked +NotAllMovementsCouldBeRecordedAsValidated=Not all movements could be recorded as validated and locked +ValidateMovements=Validate and lock movements... DescValidateMovements=Any modification or deletion of writing, lettering and deletes will be prohibited. All entries for an exercise must be validated otherwise closing will not be possible ValidateHistory=Bind Automatically AutomaticBindingDone=Automatic bindings done (%s) - Automatic binding not possible for some record (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. -ErrorAccountancyCodeIsAlreadyUse=Error, you cannot delete this accounting account because it is used -MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s | Credit = %s +ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used +MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s Balancing=Balancing FicheVentilation=Binding card GeneralLedgerIsWritten=Transactions are written in the Ledger GeneralLedgerSomeRecordWasNotRecorded=Some of the transactions could not be journalized. If there is no other error message, this is probably because they were already journalized. -NoNewRecordSaved=No more record to journalize -ListOfProductsWithoutAccountingAccount=List of products not bound to any accounting account +NoNewRecordSaved=No more record to transfer +ListOfProductsWithoutAccountingAccount=List of products not bound to any account of chart of account ChangeBinding=Change the binding Accounted=Accounted in ledger NotYetAccounted=Not yet transferred to accounting ShowTutorial=Show Tutorial NotReconciled=Not reconciled -WarningRecordWithoutSubledgerAreExcluded=Warning, all operations without subledger account defined are filtered and excluded from this view +WarningRecordWithoutSubledgerAreExcluded=Warning, all lines without subledger account defined are filtered and excluded from this view +AccountRemovedFromCurrentChartOfAccount=Accounting account that does not exist in the current chart of accounts ## Admin BindingOptions=Binding options @@ -317,9 +331,10 @@ AccountingJournalType1=Miscellaneous operations AccountingJournalType2=Sales AccountingJournalType3=Purchases AccountingJournalType4=Bank -AccountingJournalType5=Expenses report +AccountingJournalType5=Expense reports AccountingJournalType8=Inventory AccountingJournalType9=Has-new +GenerationOfAccountingEntries=Generation of accounting entries ErrorAccountingJournalIsAlreadyUse=This journal is already use AccountingAccountForSalesTaxAreDefinedInto=Note: Accounting account for Sales tax are defined into menu %s - %s NumberOfAccountancyEntries=Number of entries @@ -327,10 +342,15 @@ NumberOfAccountancyMovements=Number of movements ACCOUNTING_DISABLE_BINDING_ON_SALES=Disable binding & transfer in accountancy on sales (customer invoices will not be taken into account in accounting) ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Disable binding & transfer in accountancy on purchases (vendor invoices will not be taken into account in accounting) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Disable binding & transfer in accountancy on expense reports (expense reports will not be taken into account in accounting) +ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export -NotifiedExportDate=Flag exported lines as exported (modification of the lines will not be possible) -NotifiedValidationDate=Validate the exported entries (modification or deletion of the lines will not be possible) +NotExportLettering=Do not export the lettering when generating the file +NotifiedExportDate=Flag exported lines as Exported (to modify a line, you will need to delete the whole transaction and re-transfert it into accounting) +NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? +DateValidationAndLock=Date validation and lock ConfirmExportFile=Confirmation of the generation of the accounting export file ? ExportDraftJournal=Export draft journal Modelcsv=Model of export @@ -386,7 +406,7 @@ SaleLocal=Local sale SaleExport=Export sale SaleEEC=Sale in EEC SaleEECWithVAT=Sale in EEC with a VAT not null, so we suppose this is NOT an intracommunautary sale and the suggested account is the standard product account. -SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fallback on the product account for standard sales. You can fix the VAT ID of thirdparty or the product account if needed. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Forbidden: The transaction has been validated and/or exported. ForbiddenTransactionAlreadyValidated=Forbidden: The transaction has been validated. ## Dictionary @@ -394,6 +414,26 @@ Range=Range of accounting account Calculated=Calculated Formula=Formula +## Reconcile +LetteringAuto=Reconcile auto +LetteringManual=Reconcile manual +Unlettering=Unreconcile +UnletteringAuto=Unreconcile auto +UnletteringManual=Unreconcile manual +AccountancyNoLetteringModified=No reconcile modified +AccountancyOneLetteringModifiedSuccessfully=One reconcile successfully modified +AccountancyLetteringModifiedSuccessfully=%s reconcile successfully modified +AccountancyNoUnletteringModified=No unreconcile modified +AccountancyOneUnletteringModifiedSuccessfully=One unreconcile successfully modified +AccountancyUnletteringModifiedSuccessfully=%s unreconcile successfully modified + +## Confirm box +ConfirmMassUnletteringAuto=Bulk auto unreconcile confirmation +ConfirmMassUnletteringManual=Bulk manual unreconcile confirmation +ConfirmMassUnletteringQuestion=Are you sure you want to unreconcile the %s selected record(s)? +ConfirmMassDeleteBookkeepingWriting=Bulk Delete confirmation +ConfirmMassDeleteBookkeepingWritingQuestion=This will delete the transaction from the accounting (all lines related to the same transaction will be deleted) Are you sure you want to delete the %s selected record(s)? + ## Error SomeMandatoryStepsOfSetupWereNotDone=Some mandatory steps of setup was not done, please complete them ErrorNoAccountingCategoryForThisCountry=No accounting account group available for country %s (See Home - Setup - Dictionaries) @@ -406,6 +446,11 @@ Binded=Lines bound ToBind=Lines to bind UseMenuToSetBindindManualy=Lines not yet bound, use menu %s to make the binding manually SorryThisModuleIsNotCompatibleWithTheExperimentalFeatureOfSituationInvoices=Sorry this module is not compatible with the experimental feature of situation invoices +AccountancyErrorMismatchLetterCode=Mismatch in reconcile code +AccountancyErrorMismatchBalanceAmount=The balance (%s) is not equal to 0 +AccountancyErrorLetteringBookkeeping=Errors have occurred concerning the transactions: %s +ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Accounting entries @@ -432,6 +477,7 @@ FECFormatMulticurrencyCode=Multicurrency code (Idevise) DateExport=Date export WarningReportNotReliable=Warning, this report is not based on the Ledger, so does not contains transaction modified manually in the Ledger. If your journalization is up to date, the bookkeeping view is more accurate. ExpenseReportJournal=Expense Report Journal -InventoryJournal=Inventory Journal +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s accounts diff --git a/htdocs/langs/hr_HR/accountancy.lang b/htdocs/langs/hr_HR/accountancy.lang index 43afc7a404c..845a2f65e99 100644 --- a/htdocs/langs/hr_HR/accountancy.lang +++ b/htdocs/langs/hr_HR/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Select the carriage return type ACCOUNTING_EXPORT_PREFIX_SPEC=Specify the prefix for the file name ThisService=Ova usluga ThisProduct=Ovaj proizvod -DefaultForService=Predefinirano za uslugu -DefaultForProduct=Predefinirano za proizvod +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Proizvod za ovu treću stranu ServiceForThisThirdparty=Usluga za ovu treću stranu CantSuggest=Ne mogu predložiti @@ -101,7 +101,8 @@ ShowAccountingAccount=Prikaži računovodstveni račun ShowAccountingJournal=Prikaži računovodstveni dnevnik ShowAccountingAccountInLedger=Prikaži računovodstveni račun u knjizi ShowAccountingAccountInJournals=Show accounting account in journals -AccountAccountingSuggest=Accounting account suggested +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=Zadani računi MenuBankAccounts=Bankovni računi MenuVatAccounts=PDV računi @@ -126,6 +127,7 @@ WriteBookKeeping=Record transactions in accounting Bookkeeping=Knjiga BookkeepingSubAccount=Podknjiga AccountBalance=Stanje računa +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Source object ref CAHTF=Total purchase vendor before tax TotalExpenseReport=Izvješće o ukupnim troškovima @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=Journal label NumPiece=Broj komada TransactionNumShort=Broj prijenosa AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Group by general ledger account GroupBySubAccountAccounting=Group by subledger account AccountingAccountGroupsDesc=You can define here some groups of accounting account. They will be used for personalized accounting reports. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Prikaži međuzbroj po razini Pcgtype=Klasa računa PcgtypeDesc=Group of account are used as predefined 'filter' and 'grouping' criteria for some accounting reports. For example, 'INCOME' or 'EXPENSE' are used as groups for accounting accounts of products to build the expense/income report. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Za usklađivanje @@ -294,6 +299,7 @@ DescValidateMovements=Any modification or deletion of writing, lettering and del ValidateHistory=Vezati automatski AutomaticBindingDone=Automatic bindings done (%s) - Automatic binding not possible for some record (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Disable binding & transfer in accountancy on ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Disable binding & transfer in accountancy on purchases (vendor invoices will not be taken into account in accounting) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Disable binding & transfer in accountancy on expense reports (expense reports will not be taken into account in accounting) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Flag exported lines as Exported (to modify a line, you will need to delete the whole transaction and re-transfert it into accounting) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=Potvrda datuma i zaključavanje ConfirmExportFile=Potvrda generiranja datoteke za izvoz računovodstva? ExportDraftJournal=Export draft journal @@ -398,7 +406,7 @@ SaleLocal=Lokalna prodaja SaleExport=Izvozna prodaja SaleEEC=Prodaja u EEC SaleEECWithVAT=Sale in EEC with a VAT not null, so we suppose this is NOT an intracommunautary sale and the suggested account is the standard product account. -SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fallback on the product account for standard sales. You can fix the VAT ID of thirdparty or the product account if needed. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Zabranjeno: Transakcija je potvrđena i/ili izvezena. ForbiddenTransactionAlreadyValidated=Zabranjeno: Transakcija je potvrđena. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Mismatch in reconcile code AccountancyErrorMismatchBalanceAmount=The balance (%s) is not equal to 0 AccountancyErrorLetteringBookkeeping=Errors have occurred concerning the transactions: %s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Accounting entries @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Viševalutni kod (Idevise) DateExport=Datum izvoza WarningReportNotReliable=Warning, this report is not based on the Ledger, so does not contains transaction modified manually in the Ledger. If your journalization is up to date, the bookkeeping view is more accurate. ExpenseReportJournal=Dnevnik izvješća o troškovima +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s računi diff --git a/htdocs/langs/hr_HR/admin.lang b/htdocs/langs/hr_HR/admin.lang index 67b67267f44..9ee2f7d5163 100644 --- a/htdocs/langs/hr_HR/admin.lang +++ b/htdocs/langs/hr_HR/admin.lang @@ -5,7 +5,7 @@ Foundation=Zaklada Version=Inačica Publisher=Izdavač VersionProgram=Inačica programa -VersionLastInstall=Inicijalno instalirana verzija +VersionLastInstall=Prva postavljena inačica VersionLastUpgrade=Zadnja verzija nadogradnje VersionExperimental=Eksperimentalno VersionDevelopment=Razvoj @@ -208,7 +208,7 @@ AutoDetectLang=Automatski detektiraj (jezik web preglednika) FeatureDisabledInDemo=Mogućnost onemogućena u demo verziji FeatureAvailableOnlyOnStable=Značajka dostupna samo na službenim stabilnim verzijama BoxesDesc=Widgeti su komponente koje prikazuju neke informacije koje možete dodati da biste personalizirali neke stranice. Možete birati između prikazivanja widgeta ili ne tako da odaberete ciljnu stranicu i kliknete 'Aktiviraj' ili klikom na koš za smeće da ga onemogućite. -OnlyActiveElementsAreShown=Prikazani su samo elementi sa omogučenih modula +OnlyActiveElementsAreShown=Prikazani su samo elementi sa omogućenih modula ModulesDesc=Moduli/aplikacije određuju koje su značajke dostupne u softveru. Neki moduli zahtijevaju da se dozvole dodijele korisnicima nakon aktivacije modula. Kliknite gumb za uključivanje/isključivanje %s svakog modula kako biste omogućili ili onemogućili modul/aplikaciju. ModulesDesc2=Kliknite gumb kotačića %s da biste konfigurirali modul/aplikaciju. ModulesMarketPlaceDesc=Možete pronaći više modula za download na vanjskim internet web lokacijama @@ -645,6 +645,8 @@ Module2300Name=Planirani poslovi Module2300Desc=Upravljanje planiranim poslovima (alias cron ili chrono tablica) Module2400Name=Događaji/Raspored Module2400Desc=Pratite događaje. Zabilježite automatske događaje u svrhu praćenja ili zabilježite ručne događaje ili sastanke. Ovo je glavni modul za dobro upravljanje odnosima s kupcima ili dobavljačima. +Module2430Name=Booking Calendar System +Module2430Desc=Provide an online calendar to allow anyone to book rendez-vous, according to predefined ranges or availabilities. Module2500Name=DMS / ECM Module2500Desc=Sustav za upravljanje dokumentima / Upravljanje elektroničkim sadržajem. Automatska organizacija vaših generiranih ili pohranjenih dokumenata. Podijelite ih kada trebate. Module2600Name=API / Web services (SOAP server) @@ -660,6 +662,8 @@ Module2900Name=GeoIPMaxmind Module2900Desc=GeoIP Maxmind mogućnosti konverzije Module3200Name=Nepromjenjivi arhivi Module3200Desc=Omogućite nepromjenjivi zapisnik poslovnih događaja. Događaji se arhiviraju u stvarnom vremenu. Dnevnik je tablica samo za čitanje vezanih događaja koji se mogu izvesti. Ovaj modul može biti obavezan za neke zemlje. +Module3300Name=Module Builder +Module3200Desc=Omogućite nepromjenjivi zapisnik poslovnih događaja. Događaji se arhiviraju u stvarnom vremenu. Dnevnik je tablica samo za čitanje vezanih događaja koji se mogu izvesti. Ovaj modul može biti obavezan za neke zemlje. Module3400Name=Društvene mreže Module3400Desc=Omogućite polja društvenih mreža trećim stranama i adresama (skype, twitter, facebook, ...). Module4000Name=Djelatnici @@ -1188,7 +1192,7 @@ CompanyInfo=Tvrtka/Organizacija CompanyIds=Identiteti tvrtke/organizacije CompanyName=Naziv CompanyAddress=Adresa -CompanyZip=PBR +CompanyZip=Poštanski broj CompanyTown=Grad CompanyCountry=Zemlja CompanyCurrency=Glavna valuta @@ -1270,6 +1274,7 @@ TriggerActiveAsModuleActive=Okidači u ovoj datoteci su aktivni jer je modul GeneratedPasswordDesc=Odaberite metodu koja će se koristiti za automatski generirane lozinke. DictionaryDesc=Unesite sve referentne podatke. Možete postaviti svoje vrijednosti kao zadane. ConstDesc=Ova stranica vam omogućuje uređivanje (nadjačavanje) parametara koji nisu dostupni na drugim stranicama. Ovo su uglavnom rezervirani parametri samo za programere/napredno rješavanje problema. +MiscellaneousOptions=Miscellaneous options MiscellaneousDesc=Svi ostali sigurnosni parametri su definirani ovdje. LimitsSetup=Podešavanje limita/preciznosti LimitsDesc=Ovdje možete definirati ograničenja, preciznosti i optimizacije koje koristi Dolibarr @@ -1826,6 +1831,9 @@ AGENDA_USE_EVENT_TYPE=Use events types (managed in menu Setup -> Dictionaries -> AGENDA_USE_EVENT_TYPE_DEFAULT=Automatski postavite ovu zadanu vrijednost za vrstu događaja u obrascu za kreiranje događaja AGENDA_DEFAULT_FILTER_TYPE=Automatski postavite ovu vrstu događaja u filter pretraživanja prikaza dnevnog reda AGENDA_DEFAULT_FILTER_STATUS=Automatski postavite ovaj status za događaje u filteru pretraživanja prikaza dnevnog reda +AGENDA_EVENT_PAST_COLOR=Past event color +AGENDA_EVENT_CURRENT_COLOR=Current event color +AGENDA_EVENT_FUTURE_COLOR=Future event color AGENDA_DEFAULT_VIEW=Which view do you want to open by default when selecting menu Agenda AGENDA_REMINDER_BROWSER=Enable event reminder on user's browser (When remind date is reached, a popup is shown by the browser. Each user can disable such notifications from its browser notification setup). AGENDA_REMINDER_BROWSER_SOUND=Omogući zvučnu obavijest @@ -2129,6 +2137,7 @@ CodeLastResult=Najnoviji kod rezultata NbOfEmailsInInbox=Broj e-poruka u izvornom direktoriju LoadThirdPartyFromName=Učitaj traženje treće strane na %s (samo učitavanje) LoadThirdPartyFromNameOrCreate=Učitajte pretraživanje treće strane na %s (napravi ako nije pronađeno) +LoadContactFromEmailOrCreate=Load contact searching on %s (create if not found) AttachJoinedDocumentsToObject=Spremite priložene datoteke u objektne dokumente ako se referenca objekta pronađe u temi e-pošte. WithDolTrackingID=Poruka iz razgovora pokrenutog prvom e-poštom poslanom od Dolibarra WithoutDolTrackingID=Poruka iz razgovora pokrenutog prvom e-poštom NIJE poslanom od Dolibarra @@ -2355,3 +2364,5 @@ AllowExternalDownload=Allow external download (without login, using a shared lin DeadlineDayVATSubmission=Deadline day for vat submission on the next month MaxNumberOfAttachementOnForms=Max number of joinded files in a form IfDefinedUseAValueBeetween=If defined, use a value between %s and %s +Reload=Reload +ConfirmReload=Confirm module reload diff --git a/htdocs/langs/hr_HR/main.lang b/htdocs/langs/hr_HR/main.lang index 5672247a0b9..c7cc0152a0b 100644 --- a/htdocs/langs/hr_HR/main.lang +++ b/htdocs/langs/hr_HR/main.lang @@ -18,8 +18,8 @@ FormatDateShort=%d/%m/%Y FormatDateShortInput=%d/%m/%Y FormatDateShortJava=dd/MM/yyyy FormatDateShortJavaInput=dd/MM/yyyy -FormatDateShortJQuery=dd/mm/yyyy -FormatDateShortJQueryInput=dd/mm/yyyy +FormatDateShortJQuery=dd/mm/yy +FormatDateShortJQueryInput=dd/mm/yy FormatHourShortJQuery=HH:MI FormatHourShort=%I:%M %p FormatHourShortDuration=%H:%M @@ -226,6 +226,7 @@ NoUserGroupDefined=Grupa korisnika nije izrađena Password=Zaporka PasswordRetype=Repeat your password NoteSomeFeaturesAreDisabled=Uzmite u obzir da je dosta mogućnosti i modula onemogućeno u ovom izlaganju. +YourUserFile=Your user file Name=Ime NameSlashCompany=Ime / Tvrtka Person=Osoba @@ -897,6 +898,9 @@ MassFilesArea=Sučelje za datoteke izrađene masovnom radnjama ShowTempMassFilesArea=Prikaži sučelje datoteka stvorenih masovnom akcijom ConfirmMassDeletion=Potvrda skupnog brisanja ConfirmMassDeletionQuestion=Jeste li sigurni da želite izbrisati %s odabrane zapise? +ConfirmMassClone=Bulk clone confirmation +ConfirmMassCloneQuestion=Select project to clone to +ConfirmMassCloneToOneProject=Clone to project %s RelatedObjects=Povezani dokumenti ClassifyBilled=Označi kao zaračunato ClassifyUnbilled=Označi kao nezaračunato @@ -912,8 +916,8 @@ ExportFilteredList=Izvoz pročišćenog popisa ExportList=Spis izvoza ExportOptions=Opcije izvoza IncludeDocsAlreadyExported=Uključuje već izvezene dokumente -ExportOfPiecesAlreadyExportedIsEnable=Omogućen je izvoz već izvezenih komada -ExportOfPiecesAlreadyExportedIsDisable=Onemogućen je izvoz već izvezenih komada +ExportOfPiecesAlreadyExportedIsEnable=Documents already exported are visible and will be exported +ExportOfPiecesAlreadyExportedIsDisable=Documents already exported are hidden and won't be exported AllExportedMovementsWereRecordedAsExported=Sva izvezena kretanja evidentirana su kao izvezena NotAllExportedMovementsCouldBeRecordedAsExported=Nisu svi izvezeni pokreti mogli biti zabilježeni kao izvezeni Miscellaneous=Ostalo @@ -1128,6 +1132,7 @@ DeleteFileText=Jeste li sigurni da želite obrisati ovu datoteku? ShowOtherLanguages=Prikaži ostale jezike SwitchInEditModeToAddTranslation=Prijeđite u način uređivanja da biste dodali prijevode za ovaj jezik NotUsedForThisCustomer=Ne koristi se za ovog kupca +NotUsedForThisVendor=Not used for this vendor AmountMustBePositive=Iznos mora biti pozitivan ByStatus=Po statusu InformationMessage=Podatak @@ -1148,14 +1153,14 @@ EventReminder=Podsjetnik na događaj UpdateForAllLines=Ažuriranje za sve linije OnHold=Na čekanju Civility=Uljudnost -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Set Supervisor +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor CreateExternalUser=Stvorite vanjskog korisnika ConfirmAffectTag=Bulk Tag Assignement ConfirmAffectUser=Bulk User Assignement -ProjectRole=Role assigned on each project -TasksRole=Role assigned on each task of each project +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ConfirmSetSupervisor=Bulk Supervisor Set ConfirmUpdatePrice=Choose a increase/decrease price rate ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Created from Public portal UserAgent=User Agent InternalUser=Interni korisnik ExternalUser=Vanjski korisnik +NoSpecificContactAddress=No specific contact or address +NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. +HideOnVCard=Hide %s +AddToContacts=Add address to my contacts +LastAccess=Last access +UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here +LastPasswordChangeDate=Last password change date diff --git a/htdocs/langs/hr_HR/ticket.lang b/htdocs/langs/hr_HR/ticket.lang index e2eca0ca620..235ce683650 100644 --- a/htdocs/langs/hr_HR/ticket.lang +++ b/htdocs/langs/hr_HR/ticket.lang @@ -26,6 +26,7 @@ Permission56002=Izmijenite tikete Permission56003=Izbrišite tikete Permission56004=Upravljajte tiketima Permission56005=Pogledajte tikete svih trećih strana (nije na snazi za vanjske korisnike, uvijek su ograničene na treću stranu o kojoj ovise) +Permission56006=Export tickets Tickets=Tiketi TicketDictType=Tiketi - Vrste @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=Vanjski suradnik OriginEmail=Reporter Email Notify_TICKET_SENTBYMAIL=Pošaljite poruku o tiketu putem e-pošte +ExportDataset_ticket_1=Tiketi + # Status Read=Čitati Assigned=Dodijeljeno diff --git a/htdocs/langs/hr_HR/users.lang b/htdocs/langs/hr_HR/users.lang index 1d23fcb34d2..e84aee01882 100644 --- a/htdocs/langs/hr_HR/users.lang +++ b/htdocs/langs/hr_HR/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Poveži s korisnikom LinkedToDolibarrThirdParty=Link to third party CreateDolibarrLogin=Izradi korisnika CreateDolibarrThirdParty=Izradi treću osobu -LoginAccountDisableInDolibarr=Račun je onemogučen u Dolibarr-u. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Koristi osobnu vrijednost ExportDataset_user_1=Users and their properties DomainUser=Korisnik na domeni %s @@ -129,3 +130,6 @@ IPLastLogin=IP last login IPPreviousLogin=IP previous login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/hu_HU/accountancy.lang b/htdocs/langs/hu_HU/accountancy.lang index f0b8f7983f0..9b9ccc2575c 100644 --- a/htdocs/langs/hu_HU/accountancy.lang +++ b/htdocs/langs/hu_HU/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Válassza ki a kocsi-visszaküldésének típusát ACCOUNTING_EXPORT_PREFIX_SPEC=Adja meg a fájlnév előtagját ThisService=Ez a szolgáltatás ThisProduct=Ez a termék -DefaultForService=Alapértelmezett szolgáltatás -DefaultForProduct=Alapértelmezett termék +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Termék ennek a harmadik félnek ServiceForThisThirdparty=Szolgáltatás ennek a harmadik félnek CantSuggest=Nem tudok javasolni @@ -101,7 +101,8 @@ ShowAccountingAccount=Számviteli számla megjelenítése ShowAccountingJournal=Számviteli napló megjelenítése ShowAccountingAccountInLedger=Számviteli számla megjelenítése a főkönyvben ShowAccountingAccountInJournals=Számviteli számla megjelenítése a naplókban -AccountAccountingSuggest=Javasolt számviteli számla +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=Alapértelmezett számlák MenuBankAccounts=Bankszámlák MenuVatAccounts=Áfa-számlák @@ -126,6 +127,7 @@ WriteBookKeeping=Tranzakciók rögzítése a számvitelben Bookkeeping=Főkönyv BookkeepingSubAccount=Alkönyv AccountBalance=Számlaegyenleg +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Forrásobjektum ref CAHTF=Teljes beszerzési eladó adózás előtt TotalExpenseReport=Összköltségjelentés @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Tárolja az ügyfél számát egyéni számlaként a alkönyvben az előlegsorokhoz (ha le van tiltva, az előlegsorokhoz tartozó egyéni számla üres marad) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Tárolja a szállítói számlát egyéni számlaként a alkönyvben az előlegsorokhoz (letiltás esetén az előlegsorok egyéni számla üresen marad) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=Naplócímke NumPiece=Darabszám TransactionNumShort=Tranzakció száma AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Főkönyvi számla szerinti csoportosítás GroupBySubAccountAccounting=Alkönyvi számla szerinti csoportosítás AccountingAccountGroupsDesc=Itt meghatározhatja a számviteli számlák néhány csoportját. Személyre szabott számviteli jelentések készítésére szolgálnak majd. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Részösszeg megjelenítése szint szerint Pcgtype=Számla csoport PcgtypeDesc=A számlacsoport előre meghatározott "szűrő" és "csoportosítás" kritériumként használatos egyes számviteli jelentések esetében. Például a „BEVÉTEL” vagy „KIADÁS” csoportként használatos a termékek számviteli számláihoz a kiadás/bevétel jelentés összeállításához. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Kibékíthető @@ -294,6 +299,7 @@ DescValidateMovements=Az írások, betűk és törlések bármilyen módosítás ValidateHistory=Automatikus kötés AutomaticBindingDone=Automatikus összerendelés megtörtént (%s) - Az automatikus kötés bizonyos rekordokhoz (%s) nem lehetséges +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=A mozgás nem megfelelően kiegyensúlyozott. Terhelés = %s és jóváírás = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=A kötés és az átvitel letiltása az ért ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=A kötés és az átvitel letiltása a vásárlások könyvelésében (a szállítói számlák nem lesznek figyelembe véve a könyvelésben) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=A kötés és az átvitel letiltása a könyvelésben a költségjelentéseken (a költségjelentéseket nem veszik figyelembe a könyvelésben) ACCOUNTING_ENABLE_LETTERING=Engedélyezze a feliratozás funkciót a számvitelben +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Ne exportálja a betűket a fájl létrehozásakor NotifiedExportDate=Az exportált sorok megjelölése Exportáltként (egy sor módosításához törölnie kell a teljes tranzakciót, és újra át kell vinnie a könyvelésbe) NotifiedValidationDate=Érvényesítse és zárolja az exportált bejegyzéseket (ugyanaz a hatás, mint az "%s" funkciónál, a sorok módosítása és törlése BIZTOSAN nem lehetséges) +NotifiedExportFull=Export documents ? DateValidationAndLock=Dátumellenőrzés és zárolás ConfirmExportFile=A számviteli exportfájl létrehozásának megerősítése? ExportDraftJournal=Naplótervezet exportálása @@ -398,7 +406,7 @@ SaleLocal=Helyi értékesítés SaleExport=Export értékesítés SaleEEC=Eladó az EGK-ban SaleEECWithVAT=Az EGK-ban történő értékesítés áfával nem nulla, ezért feltételezzük, hogy ez NEM közösségen belüli értékesítés, és a javasolt számla a szabványos termékszámla. -SaleEECWithoutVATNumber=Az EGK-ban történő értékesítés áfa nélkül, de a harmadik fél áfaazonosítója nincs meghatározva. A szokásos értékesítéseknél a termékszámlát használjuk. Szükség esetén javíthatja a harmadik fél vagy a termékszámla áfaazonosítóját. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Tiltott: A tranzakciót ellenőrizték és/vagy exportálták. ForbiddenTransactionAlreadyValidated=Tiltott: A tranzakció érvényesítése megtörtént. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Nem egyezik az egyeztető kód AccountancyErrorMismatchBalanceAmount=Az egyenleg (%s) nem egyenlő 0-val AccountancyErrorLetteringBookkeeping=Hibák történtek a következő tranzakciókkal kapcsolatban: %s ErrorAccountNumberAlreadyExists=Az %s számviteli szám már létezik +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Számviteli bejegyzések @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Több pénznem kódja (ötlet) DateExport=Dátum exportálás WarningReportNotReliable=Figyelem, ez a jelentés nem a Főkönyvön alapul, így nem tartalmaz a Főkönyvben kézzel módosított tranzakciót. Ha a naplózás naprakész, a könyvelési nézet pontosabb. ExpenseReportJournal=Költségjelentési napló +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s számlák diff --git a/htdocs/langs/hu_HU/admin.lang b/htdocs/langs/hu_HU/admin.lang index 989bba0ff00..460c2ce847f 100644 --- a/htdocs/langs/hu_HU/admin.lang +++ b/htdocs/langs/hu_HU/admin.lang @@ -438,7 +438,7 @@ Unique=Egyedi Boolean=Logikai érték (egy jelölőnégyzet) ExtrafieldPhone = Telefon ExtrafieldPrice = Ár -ExtrafieldPriceWithCurrency=Price with currency +ExtrafieldPriceWithCurrency=Ár pénznemmel ExtrafieldMail = E-mail ExtrafieldUrl = Cím ExtrafieldIP = IP @@ -516,7 +516,7 @@ PageUrlForDefaultValuesCreate=
    Példa:
    Az új harmadik felet létrehozó PageUrlForDefaultValuesList=
    Példa:
    A harmadik feleket felsoroló oldal esetében ez a %s.
    Az egyéni könyvtárba telepített külső modulok URL-címe esetén ne használja az "egyéni/"-t, így használjon egy elérési utat, például mymodule/mypagelist.php, és ne custom/mymodule/mypagelist.php.
    Ha csak akkor szeretne alapértelmezett értéket, ha az url-nek van valamilyen paramétere, akkor használja a %s parancsot. AlsoDefaultValuesAreEffectiveForActionCreate=Azt is vegye figyelembe, hogy az űrlapkészítés alapértelmezett értékeinek felülírása csak a helyesen megtervezett oldalakon működik (vagyis a paraméter action=create vagy presend ...) EnableDefaultValues=Az alapértelmezett értékek testreszabásának engedélyezése -EnableOverwriteTranslation=Allow customization of translations +EnableOverwriteTranslation=A fordítások testreszabásának engedélyezése GoIntoTranslationMenuToChangeThis=A kódhoz tartozó kulcshoz fordítás található. Ezt az értéket a Kezdőlap-Beállítások-Fordítás menüben lehet megváltoztatni. WarningSettingSortOrder=Figyelem, az alapértelmezett rendezési sorrend beállítása technikai hibát okozhat, ha a listaoldalra lép, és egy mező ismeretlen. Ha ilyen hibát tapasztal, térjen vissza erre az oldalra az alapértelmezett rendezési sorrend eltávolításához és az alapértelmezett viselkedés visszaállításához. Field=Mező @@ -645,6 +645,8 @@ Module2300Name=Időzített feladatok Module2300Desc=Ütemezett feladatok kezelése (alias cron vagy chrono table) Module2400Name=Események/Naptár Module2400Desc=Események nyomonkövetése. Automatikus események naplózása nyomkövetési célokra, vagy a kézzel létrehozott események és találkozók rögzítése. Ez a fő modul a megfelelő ügyfél- vagy kereskedelmi kapcsolatkezeléshez. +Module2430Name=Foglaltsági naptár +Module2430Desc=Provide an online calendar to allow anyone to book rendez-vous, according to predefined ranges or availabilities. Module2500Name=DMS / ECM Module2500Desc=Dokumentumkezelő rendszer / elektronikus tartalomkezelés. A generált vagy tárolt dokumentumok automatikus szervezése. Ossza meg őket, amikor szükséges. Module2600Name=API / Web services (SOAP server) @@ -660,6 +662,8 @@ Module2900Name=GeoIPMaxmind Module2900Desc=GeoIP MaxMind konverziók képességek Module3200Name=Megváltoztathatatlan archívumok Module3200Desc=Az üzleti események megváltoztathatatlan naplójának engedélyezése. Az események valós időben archiválódnak. A napló a láncolt események csak olvasható táblázata, amely exportálható. Ez a modul bizonyos országokban kötelező lehet. +Module3300Name=Modul Készítő +Module3200Desc=Az üzleti események megváltoztathatatlan naplójának engedélyezése. Az események valós időben archiválódnak. A napló a láncolt események csak olvasható táblázata, amely exportálható. Ez a modul bizonyos országokban kötelező lehet. Module3400Name=Közösségi hálózatok Module3400Desc=Engedélyezze a közösségi hálózatok mezőit harmadik felek és címek számára (skype, twitter, facebook, ...). Module4000Name=HRM @@ -1044,7 +1048,7 @@ DictionaryCompanyType=Partnerek típusai DictionaryCompanyJuridicalType=Partner jogi képviselői DictionaryProspectLevel=Kilátás lehetséges szintje a vállalatok számára DictionaryProspectContactLevel=Tekintse meg a kapcsolatok potenciális szintjét -DictionaryCanton=Államok / Tartományok +DictionaryCanton=Államok / Tartományok / Vármegyék DictionaryRegion=Régiók DictionaryCountry=Országok DictionaryCurrency=Pénznemek @@ -1270,6 +1274,7 @@ TriggerActiveAsModuleActive=Triggerek ebben a fájlban vannak aktív %s m GeneratedPasswordDesc=Válassza ki a módszert a jelszavak automatikus létrehozásához. DictionaryDesc=Illessze be az összes referenciaadatot. Értékeit hozzáadhatja az alapértelmezett értékekhez. ConstDesc=Ezen az oldalon olyan paramétereket szerkeszthet (felülbírálhat), amelyek más oldalakon nem állnak rendelkezésre. Ezek többnyire csak a fejlesztők/haladó hibaelhárítás számára fenntartott paraméterek. +MiscellaneousOptions=Miscellaneous options MiscellaneousDesc=Az összes többi biztonsággal kapcsolatos paraméter itt kerül meghatározásra. LimitsSetup=Korlátok / Precision beállítás LimitsDesc=Itt meghatározhatja a Dolibarr által használt korlátokat, pontosságokat és optimalizációkat @@ -1826,6 +1831,9 @@ AGENDA_USE_EVENT_TYPE=Eseménytípusok használata (a Beállítás menüben -> S AGENDA_USE_EVENT_TYPE_DEFAULT=Automatikusan állítsa be ezt az alapértelmezett értéket az eseménytípushoz az esemény létrehozási űrlapon AGENDA_DEFAULT_FILTER_TYPE=Az ilyen típusú események automatikus beállítása a napirend nézet keresési szűrőjében AGENDA_DEFAULT_FILTER_STATUS=Automatikusan állítsa be ezt az állapotot az eseményekhez a napirendnézet keresőszűrőjében +AGENDA_EVENT_PAST_COLOR=Past event color +AGENDA_EVENT_CURRENT_COLOR=Current event color +AGENDA_EVENT_FUTURE_COLOR=Future event color AGENDA_DEFAULT_VIEW=Melyik nézetet szeretné alapértelmezés szerint megnyitni a Napirend menü kiválasztásakor AGENDA_REMINDER_BROWSER=Eseményemlékeztető engedélyezése a felhasználó böngészőjében (Az emlékeztető dátumának elérésekor a böngésző felugró ablakot jelenít meg. Minden felhasználó letilthatja az ilyen értesítéseket a böngésző értesítési beállításaiból). AGENDA_REMINDER_BROWSER_SOUND=Hangjelzés engedélyezése @@ -2129,6 +2137,7 @@ CodeLastResult=Legfrissebb eredménykód NbOfEmailsInInbox=E-mailek száma a forráskönyvtárban LoadThirdPartyFromName=Harmadik féltől származó keresés betöltése a következőn: %s (csak betöltés) LoadThirdPartyFromNameOrCreate=Harmadik féltől származó keresés betöltése a következőn: %s (létrehozás, ha nem található) +LoadContactFromEmailOrCreate=Load contact searching on %s (create if not found) AttachJoinedDocumentsToObject=Mentse el a csatolt fájlokat objektum dokumentumokba, ha egy objektum hivatkozása található az e-mail témakörben. WithDolTrackingID=Üzenet egy beszélgetésből, amelyet a Dolibarrtól küldött első e-mail indított WithoutDolTrackingID=Üzenet egy beszélgetésből, amelyet a Dolibarrtól NEM küldött első e-mail indított @@ -2355,3 +2364,5 @@ AllowExternalDownload=Allow external download (without login, using a shared lin DeadlineDayVATSubmission=Deadline day for vat submission on the next month MaxNumberOfAttachementOnForms=Max number of joinded files in a form IfDefinedUseAValueBeetween=If defined, use a value between %s and %s +Reload=Reload +ConfirmReload=Confirm module reload diff --git a/htdocs/langs/hu_HU/companies.lang b/htdocs/langs/hu_HU/companies.lang index c4de327829b..98415b9bd99 100644 --- a/htdocs/langs/hu_HU/companies.lang +++ b/htdocs/langs/hu_HU/companies.lang @@ -59,12 +59,12 @@ UserTitle=Cím NatureOfThirdParty=Harmadik fél természete NatureOfContact=A kapcsolattartás jellege Address=Cím -State=Állam / Tartomány +State=Állam / Tartomány / Vármegye StateId=Állami azonosító -StateCode=Állam/Tartomány kódja +StateCode=Állam/Tartomány/Vármegye kódja StateShort=Állam/Megye Region=Régió -Region-State=Régió - Állam +Region-State=Vármegye - Állam Country=Ország CountryCode=Az ország hívószáma CountryId=Országazonosító @@ -312,12 +312,12 @@ CustomerRelativeDiscountShort=Relatív kedvezmény CustomerAbsoluteDiscountShort=Abszolút kedvezmény CompanyHasRelativeDiscount=A vevő alapértelmezett kedvezménye %s%% CompanyHasNoRelativeDiscount=A vevő nem rendelkezik relatív kedvezménnyel alapértelmezésben -HasRelativeDiscountFromSupplier=Az alapértelmezett %s%% kedvezménye van ettől a szállítótól -HasNoRelativeDiscountFromSupplier=Nincs alapértelmezett relatív engedménye ettől a szállítótól +HasRelativeDiscountFromSupplier=You have a default discount of %s%% with this vendor +HasNoRelativeDiscountFromSupplier=No default relative discount with this vendor CompanyHasAbsoluteDiscount=Ennek az ügyfélnek kedvezményei vannak (jóváírás vagy előleg) a következőhöz: %s %s CompanyHasDownPaymentOrCommercialDiscount=Ennek az ügyfélnek kedvezményei vannak (kereskedelmi, előleg) a következőre: %s %s CompanyHasCreditNote=Ez a vevő még hitellel rendelkezik %s %s-ig -HasNoAbsoluteDiscountFromSupplier=Nincs kedvezményes jóváírása ennél a szállítónál +HasNoAbsoluteDiscountFromSupplier=No discount/credit available from this vendor HasAbsoluteDiscountFromSupplier=Kedvezményei vannak (jóváírások vagy előlegek) a következőhöz: %s %s ettől a szállítótól HasDownPaymentOrCommercialDiscountFromSupplier=Kereskedelmi kedvezmények, előlegek) a következőhöz: %s %s ettől a szállítótól HasCreditNoteFromSupplier=Önnek van jóváírása a következőhöz: %s %s ettől a szállítótól @@ -444,7 +444,7 @@ AddAddress=Cím hozzáadása SupplierCategory=Szállító kategória JuridicalStatus200=Független DeleteFile=Fájl törlése -ConfirmDeleteFile=Biztosan törölni akarja ezt a fájlt? +ConfirmDeleteFile=Biztosan törli ezt a fájlt%s? AllocateCommercial=Értékesítési képviselőhöz hozzárendelve Organization=Szervezet FiscalYearInformation=Fizális év @@ -498,3 +498,8 @@ RestOfEurope=Európa többi része (EGK) OutOfEurope=Európán kívül (EGK) CurrentOutstandingBillLate=A jelenlegi fennálló számla késik BecarefullChangeThirdpartyBeforeAddProductToInvoice=Legyen óvatos, a termék árbeállításaitól függően meg kell változtatnia a harmadik felet, mielőtt hozzáadná a terméket a POS-hoz. +EmailAlreadyExistsPleaseRewriteYourCompanyName=e-mail cím már létezik, kérjük írja át a cég nevét +TwoRecordsOfCompanyName=more than one record exists for this company, please contact us to complete your partnership request +CompanySection=Company section +ShowSocialNetworks=Show social networks +HideSocialNetworks=Hide social networks diff --git a/htdocs/langs/hu_HU/main.lang b/htdocs/langs/hu_HU/main.lang index d5d9d347d7d..79b246a6076 100644 --- a/htdocs/langs/hu_HU/main.lang +++ b/htdocs/langs/hu_HU/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=Nincs felhasználói csoport meghatározva Password=Jelszó PasswordRetype=Ismételje meg a jelszavát NoteSomeFeaturesAreDisabled=Megjegyzés: rengeteg modul/eszköz ki van kapcsolva ebben a demóban. +YourUserFile=Your user file Name=Név NameSlashCompany=Név / Cég Person=Személy @@ -897,6 +898,9 @@ MassFilesArea=Tömeges műveletek által létrehozott fájlok területe ShowTempMassFilesArea=A tömeges műveletek által létrehozott fájlok területének megjelenítése ConfirmMassDeletion=Tömeges törlés megerősítése ConfirmMassDeletionQuestion=Biztosan törölni szeretné a %s kiválasztott rekordo(ka)t? +ConfirmMassClone=Bulk clone confirmation +ConfirmMassCloneQuestion=Select project to clone to +ConfirmMassCloneToOneProject=Clone to project %s RelatedObjects=Kapcsolódó objektumok ClassifyBilled=Minősítse kiszámlázottként ClassifyUnbilled=Számlázatlan osztályozás @@ -912,8 +916,8 @@ ExportFilteredList=Szűrt lista exportálása ExportList=Lista exportálása ExportOptions=Exportálási beállítások IncludeDocsAlreadyExported=A már exportált dokumentumokat tartalmazza -ExportOfPiecesAlreadyExportedIsEnable=A már exportált darabok exportálása engedélyezett -ExportOfPiecesAlreadyExportedIsDisable=A már exportált darabok exportálása le van tiltva +ExportOfPiecesAlreadyExportedIsEnable=Documents already exported are visible and will be exported +ExportOfPiecesAlreadyExportedIsDisable=Documents already exported are hidden and won't be exported AllExportedMovementsWereRecordedAsExported=Minden exportált mozgás exportáltként lett rögzítve NotAllExportedMovementsCouldBeRecordedAsExported=Nem minden exportált mozgás rögzíthető exportáltként Miscellaneous=Vegyes @@ -1128,6 +1132,7 @@ DeleteFileText=Valóban törölni szeretné ezt a fájlt? ShowOtherLanguages=Más nyelvek megjelenítése SwitchInEditModeToAddTranslation=Váltson szerkesztési módba fordítások hozzáadásához ehhez a nyelvhez NotUsedForThisCustomer=Nem használt ennél az ügyfélnél +NotUsedForThisVendor=Not used for this vendor AmountMustBePositive=Az összegnek pozitívnak kell lennie ByStatus=Állapot szerint InformationMessage=Információ @@ -1148,14 +1153,14 @@ EventReminder=Esemény emlékeztető UpdateForAllLines=Frissítés minden vonalhoz OnHold=Tart Civility=Udvariasság -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Set Supervisor +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor CreateExternalUser=Külső felhasználó létrehozása ConfirmAffectTag=Bulk Tag Assignement ConfirmAffectUser=Bulk User Assignement -ProjectRole=Role assigned on each project -TasksRole=Role assigned on each task of each project +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ConfirmSetSupervisor=Bulk Supervisor Set ConfirmUpdatePrice=Choose a increase/decrease price rate ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Nyilvános portálról készült UserAgent=Felhasználói ügynök InternalUser=Belső felahsználó ExternalUser=Külső felhasználó +NoSpecificContactAddress=No specific contact or address +NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. +HideOnVCard=Hide %s +AddToContacts=Add address to my contacts +LastAccess=Last access +UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here +LastPasswordChangeDate=Last password change date diff --git a/htdocs/langs/hu_HU/projects.lang b/htdocs/langs/hu_HU/projects.lang index 2d6e5d04ec5..d652acf4a43 100644 --- a/htdocs/langs/hu_HU/projects.lang +++ b/htdocs/langs/hu_HU/projects.lang @@ -34,8 +34,8 @@ ConfirmDeleteAProject=Biztosan törölni szeretné ezt a projektet? ConfirmDeleteATask=Biztosan törölni szeretné ezt a feladatot? OpenedProjects=Nyitott projektek OpenedTasks=Nyitott feladatok -OpportunitiesStatusForOpenedProjects=A nyitott projektek számát állapot szerint vezeti -OpportunitiesStatusForProjects=A projektek számát állapot szerint vezeti +OpportunitiesStatusForOpenedProjects=A nyitott projektek előrehaladásának száma állapot szerint +OpportunitiesStatusForProjects=A projektek előrehaladásának száma állapot szerint ShowProject=Projekt megjelenítése ShowTask=Feladat megjelenítése SetThirdParty=Harmadik fél beállítása @@ -222,34 +222,34 @@ ProjectOppAmountOfProjectsByMonth=Az előrehaladások mennyisége havonta ProjectWeightedOppAmountOfProjectsByMonth=Az előrehaladások súlyozott mennyisége hónaponként ProjectOpenedProjectByOppStatus=Nyitott projekt | előrehaladás előrehaladási státusz szerint ProjectsStatistics=Statisztikák projektekről vagy előrehaladásokról -TasksStatistics=Statisztikák projektek vagy lehetőségek feladatairól +TasksStatistics=Statisztikák projektek vagy előrehaladások feladatairól TaskAssignedToEnterTime=Feladat hozzárendelve. Lehetővé kell tenni az idő megadását erre a feladatra. -IdTaskTime=Id feladat ideje +IdTaskTime=Azonosító feladat ideje YouCanCompleteRef=Ha a ref-et valamilyen utótaggal szeretné kiegészíteni, akkor javasolt egy - karakter hozzáadása az elválasztáshoz, így az automatikus számozás továbbra is megfelelően fog működni a következő projekteknél. Például %s-MYSUFFIX OpenedProjectsByThirdparties=Harmadik felek által nyitott projektek -OnlyOpportunitiesShort=Csak potenciális ügyfelek -OpenedOpportunitiesShort=Nyitott lehetőségek -NotOpenedOpportunitiesShort=Nem nyitott lehetőség -NotAnOpportunityShort=Nem vezető -OpportunityTotalAmount=A lehetőségek teljes mennyisége -OpportunityPonderatedAmount=A lehetőségek súlyozott mennyisége -OpportunityPonderatedAmountDesc=Valószínűséggel súlyozott leadek összege -OppStatusPROSP=Potenciális +OnlyOpportunitiesShort=Csak előrehaladások +OpenedOpportunitiesShort=Nyitott előrehaladások +NotOpenedOpportunitiesShort=Nem nyitott előrehaladás +NotAnOpportunityShort=Nem előrehaladás +OpportunityTotalAmount=Az előrehaladások teljes mennyisége +OpportunityPonderatedAmount=Az előrehaladások súlyozott mennyisége +OpportunityPonderatedAmountDesc=Az előrehaladások valószínűséggel súlyozott összege +OppStatusPROSP=Előrelátás OppStatusQUAL=Minősítés -OppStatusPROPO=Javaslat +OppStatusPROPO=Árajánlat OppStatusNEGO=Tárgyalás -OppStatusPENDING=Függőben -OppStatusWON=Nyert +OppStatusPENDING=Függőben levő +OppStatusWON=Megnyert OppStatusLOST=Elveszett Budget=Költségvetés -AllowToLinkFromOtherCompany=Allow to link an element with a project of other company

    Supported values:
    - Keep empty: Can link elements with any projects in the same company (default)
    - "all": Can link elements with any projects, even projects of other companies
    - A list of third-party ids separated by commas: can link elements with any projects of these third partys (Example: 123,4795,53)
    -LatestProjects=A legújabb %s projekt -LatestModifiedProjects=A legutóbbi %s módosított projekt +AllowToLinkFromOtherCompany=Lehetővé teszi egy elem összekapcsolását egy másik vállalat projektjével

    Támogatott értékek:
    - Hagyja üresen: Az elemeket összekapcsolhatja az azonos vállalat bármely projektjével (alapértelmezett)
    - "minden": Bármilyen projektekkel összekapcsolhatja az elemeket, akár más cégek projektjeivel is
    - Harmadik fél azonosítóinak vesszővel elválasztott listája: Összekapcsolhatja az elemeket ezen harmadik felek bármely projektjével (Példa: 123,4795,53)
    +LatestProjects=A legutóbbi %s projektek +LatestModifiedProjects=A legutóbbi %s módosított projektek OtherFilteredTasks=Egyéb szűrt feladatok NoAssignedTasks=Nem található hozzárendelt feladat (rendelje hozzá a projektet/feladatokat az aktuális felhasználóhoz a felső jelölőnégyzetből az idő megadásához) -ThirdPartyRequiredToGenerateInvoice=Harmadik félnek meg kell határoznia a projektet, hogy ki tudja számlázni. -ThirdPartyRequiredToGenerateInvoice=Harmadik félnek meg kell határoznia a projektet, hogy ki tudja számlázni. -ChooseANotYetAssignedTask=Válasszon egy olyan feladatot, amely még nincs hozzárendelve +ThirdPartyRequiredToGenerateInvoice=Egy harmadik félnek meg kell határoznia a projektet, hogy ki tudja számlázni. +ThirdPartyRequiredToGenerateInvoice=Egy harmadik félnek meg kell határoznia a projektet, hogy ki tudja számlázni. +ChooseANotYetAssignedTask=Válasszon egy olyan feladatot, amely még nincs hozzád rendelve # Comments trans AllowCommentOnTask=A felhasználók megjegyzéseinek engedélyezése a feladatokhoz AllowCommentOnProject=A felhasználók megjegyzéseinek engedélyezése a projektekhez @@ -259,6 +259,7 @@ RecordsClosed=%s projekt lezárva SendProjectRef=Információs projekt %s ModuleSalaryToDefineHourlyRateMustBeEnabled=A 'Bérek' modult engedélyezni kell az alkalmazotti órabér meghatározásához, hogy az eltöltött idő értékelhető legyen NewTaskRefSuggested=Feladat ref. már használt, új feladat ref szükséges +NumberOfTasksCloned=%s task(s) cloned TimeSpentInvoiced=Kiszámlázott idő TimeSpentForIntervention=Eltöltött idő TimeSpentForInvoice=Eltöltött idő diff --git a/htdocs/langs/hu_HU/sms.lang b/htdocs/langs/hu_HU/sms.lang index 26e69c3d78d..4b1465e7076 100644 --- a/htdocs/langs/hu_HU/sms.lang +++ b/htdocs/langs/hu_HU/sms.lang @@ -10,7 +10,7 @@ SmsRecipient=Cél SmsTitle=Leírás SmsFrom=Feladó SmsTo=Cél -SmsTopic=Téma SMS +SmsTopic=SMS témája SmsText=Üzenet SmsMessage=SMS-üzenet ShowSms=SMS megjelenítése diff --git a/htdocs/langs/hu_HU/stripe.lang b/htdocs/langs/hu_HU/stripe.lang index 1444c2bfd58..72835cc52b8 100644 --- a/htdocs/langs/hu_HU/stripe.lang +++ b/htdocs/langs/hu_HU/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Webhook élő kulcs ONLINE_PAYMENT_WAREHOUSE=A készlet csökkentésére használható készlet, amikor online fizetés megtörtént
    (TODO Amikor a készletcsökkentési lehetőség megtörténik egy számlán végzett műveletnél, és az online fizetés önmagában generálja a számlát?) StripeLiveEnabled=Stripe live engedélyezve (egyébként teszt/sandbox mód) StripeImportPayment=Stripe fizetések importálása -ExampleOfTestCreditCard=Példa hitelkártyára a teszteléshez: %s => érvényes, %s => CVC hiba, %s => lejárt, %s => terhelés sikertelen +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +ExampleOfTestBankAcountForSEPA=Example of bank account BAN for direct debit test: %s StripeGateways=Stripe átjárók OAUTH_STRIPE_TEST_ID=Stripe Connect kliensazonosító (ca_...) OAUTH_STRIPE_LIVE_ID=Stripe Connect kliensazonosító (ca_...) @@ -61,6 +62,7 @@ DeleteACard=Kártya törlése ConfirmDeleteCard=Biztosan törölni szeretné ezt a hitel- vagy betéti kártyát? CreateCustomerOnStripe=Ügyfél létrehozása a Stripe-on CreateCardOnStripe=Kártya létrehozása a Stripe-on +CreateBANOnStripe=Create bank on Stripe ShowInStripe=Stripe megjelenítés StripeUserAccountForActions=Felhasználói fiók, amely e-mailben értesíti egyes Stripe eseményekről (Stripe kifizetések) StripePayoutList=Stripe kifizetések listája @@ -69,4 +71,8 @@ ToOfferALinkForLiveWebhook=Link a Stripe WebHook beállításához az IPN hívá PaymentWillBeRecordedForNextPeriod=A fizetés a következő időszakra kerül rögzítésre. ClickHereToTryAgain=Kattintson ide az újrapróbálkozáshoz... CreationOfPaymentModeMustBeDoneFromStripeInterface=Az erős ügyfél-hitelesítési szabályok miatt a kártyát a Stripe backoffice-ból kell létrehozni. Ide kattintva bekapcsolhatja a Stripe ügyfélrekordot: %s -TERMINAL_LOCATION=A terminálok helye (címe). +STRIPE_CARD_PRESENT=Card Present for Stripe Terminals +TERMINAL_LOCATION=Location (address) for Stripe Terminals +RequestDirectDebitWithStripe=Request Direct Debit with Stripe +STRIPE_SEPA_DIRECT_DEBIT=Enable the Direct Debit payments through Stripe + diff --git a/htdocs/langs/hu_HU/ticket.lang b/htdocs/langs/hu_HU/ticket.lang index 431c2e7fafb..e398527a5a8 100644 --- a/htdocs/langs/hu_HU/ticket.lang +++ b/htdocs/langs/hu_HU/ticket.lang @@ -26,6 +26,7 @@ Permission56002=Jegyek módosítása Permission56003=Jegyek törlése Permission56004=Jegyek kezelése Permission56005=Minden harmadik fél jegyeinek megtekintése (külső felhasználókra nem érvényes, mindig csak arra a harmadik félre korlátozódjon, akitől függnek) +Permission56006=Export tickets Tickets=Jegyek TicketDictType=Jegy - típusok @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=Külső közreműködő OriginEmail=Jelentés e-mail Notify_TICKET_SENTBYMAIL=Jegy üzenet küldése e-mailben +ExportDataset_ticket_1=Jegyek + # Status Read=Olvasás Assigned=Hozzárendelve diff --git a/htdocs/langs/hu_HU/users.lang b/htdocs/langs/hu_HU/users.lang index 0ac9fc3a4b2..84825d582c3 100644 --- a/htdocs/langs/hu_HU/users.lang +++ b/htdocs/langs/hu_HU/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Link a felhasználóhoz LinkedToDolibarrThirdParty=Link harmadik félhez CreateDolibarrLogin=Felhasználó létrehozása CreateDolibarrThirdParty=Harmadik fél létrehozása -LoginAccountDisableInDolibarr=Fiók kiakapcsolva a Dolibarrban. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Személyes érték használata ExportDataset_user_1=Felhasználók és tulajdonságaik DomainUser=Domain felhasználók %s @@ -129,3 +130,6 @@ IPLastLogin=Utolsó bejelentkezés IP címe IPPreviousLogin=Előző bejelentkezés IP címe ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/id_ID/accountancy.lang b/htdocs/langs/id_ID/accountancy.lang index 285fde719c3..3bd57c6f8ad 100644 --- a/htdocs/langs/id_ID/accountancy.lang +++ b/htdocs/langs/id_ID/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Pilih jenis pengembalian angkutan ACCOUNTING_EXPORT_PREFIX_SPEC=Tentukan awalan untuk nama file ThisService=Layanan ini ThisProduct=Produk ini -DefaultForService=Standar untuk Layanan -DefaultForProduct=Standar untuk Produk +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Produk untuk pihak ketiga ini ServiceForThisThirdparty=Layanan untuk pihak ketiga ini CantSuggest=Tidak bisa menyarankan @@ -101,7 +101,8 @@ ShowAccountingAccount=Tampilkan akun akuntansi ShowAccountingJournal=Tampilkan jurnal akuntansi ShowAccountingAccountInLedger=Tampilkan akun akuntansi dalam buku besar ShowAccountingAccountInJournals=Tampilkan akun akuntansi di jurnal -AccountAccountingSuggest=Akun akuntansi yang disarankan +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=Akun standar MenuBankAccounts=Akun bank MenuVatAccounts=Akun PPN @@ -126,6 +127,7 @@ WriteBookKeeping=Record transactions in accounting Bookkeeping=Buku Besar BookkeepingSubAccount=Subledger AccountBalance=Saldo akun +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Referensi sumber objek CAHTF=Jumlah total pembelian vendor sebelum pajak TotalExpenseReport=Jumlah total laporan pengeluaran @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=Label jurnal NumPiece=Jumlah potongan TransactionNumShort=Tidak. transaksi AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Kelompokkan menurut akun buku besar GroupBySubAccountAccounting=Kelompokkan menurut akun subledger AccountingAccountGroupsDesc=Anda dapat mendefinisikan di sini beberapa grup akun akuntansi. Mereka akan digunakan untuk laporan akuntansi yang dipersonalisasi. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Tunjukkan subtotal menurut level Pcgtype=Grup akun PcgtypeDesc=Grup akun digunakan sebagai kriteria 'filter' dan 'pengelompokan' yang telah ditentukan sebelumnya untuk beberapa laporan akuntansi. Misalnya, 'PENGHASILAN' atau 'BEBAN' digunakan sebagai grup untuk akun akuntansi produk untuk membangun laporan pengeluaran / pendapatan. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Dapat didamaikan @@ -294,6 +299,7 @@ DescValidateMovements=Setiap modifikasi atau penghapusan tulisan, huruf dan peng ValidateHistory=Mengikat Secara Otomatis AutomaticBindingDone=Automatic bindings done (%s) - Automatic binding not possible for some record (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Nonaktifkan pengikatan & transfer akuntansi ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Nonaktifkan pengikatan & transfer akuntansi pada pembelian (faktur vendor tidak akan diperhitungkan dalam akuntansi) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Nonaktifkan pengikatan & transfer akuntansi pada laporan pengeluaran (laporan pengeluaran tidak akan diperhitungkan dalam akuntansi) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Flag exported lines as Exported (to modify a line, you will need to delete the whole transaction and re-transfert it into accounting) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=Date validation and lock ConfirmExportFile=Konfirmasi pembuatan file ekspor akuntansi? ExportDraftJournal=Ekspor draft jurnal @@ -398,7 +406,7 @@ SaleLocal=Penjualan lokal SaleExport=Penjualan ekspor SaleEEC=Dijual dalam EEC SaleEECWithVAT=Dijual dalam EEC dengan PPN bukan nol, jadi kami mengira ini BUKAN penjualan intracommunautary dan akun yang disarankan adalah akun produk standar. -SaleEECWithoutVATNumber=Dijual dalam EEC tanpa PPN tetapi ID PPN pihak ketiga tidak ditentukan. Kami mundur pada akun produk untuk penjualan standar. Anda dapat memperbaiki ID PPN pihak ketiga atau akun produk jika diperlukan. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Forbidden: The transaction has been validated and/or exported. ForbiddenTransactionAlreadyValidated=Forbidden: The transaction has been validated. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Mismatch in reconcile code AccountancyErrorMismatchBalanceAmount=The balance (%s) is not equal to 0 AccountancyErrorLetteringBookkeeping=Errors have occurred concerning the transactions: %s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Entri akuntansi @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Kode multi mata uang (Idevise) DateExport=Tanggal ekspor WarningReportNotReliable=Peringatan, laporan ini tidak didasarkan pada Buku Besar, jadi tidak mengandung transaksi yang dimodifikasi secara manual di Buku Besar. Jika jurnal Anda sudah mutakhir, tampilan pembukuan lebih akurat. ExpenseReportJournal=Jurnal Laporan Biaya +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=akun %s diff --git a/htdocs/langs/id_ID/main.lang b/htdocs/langs/id_ID/main.lang index fe79854e0be..c1561ca1878 100644 --- a/htdocs/langs/id_ID/main.lang +++ b/htdocs/langs/id_ID/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=Tidak ada grup pengguna yang ditentukan Password=Kata kunci PasswordRetype=Repeat your password NoteSomeFeaturesAreDisabled=Perhatikan bahwa banyak fitur / modul dinonaktifkan dalam demonstrasi ini. +YourUserFile=Your user file Name=Nama NameSlashCompany=Nama / Perusahaan Person=Orang @@ -897,6 +898,9 @@ MassFilesArea=Area untuk file yang dibangun oleh aksi massal ShowTempMassFilesArea=Tampilkan area file yang dibangun oleh aksi massal ConfirmMassDeletion=Konfirmasi Penghapusan Massal ConfirmMassDeletionQuestion=Anda yakin ingin menghapus catatan terpilih %s? +ConfirmMassClone=Bulk clone confirmation +ConfirmMassCloneQuestion=Select project to clone to +ConfirmMassCloneToOneProject=Clone to project %s RelatedObjects=Objek Terkait ClassifyBilled=Klasifikasi ditagih ClassifyUnbilled=Klasifikasi tidak ditagih @@ -912,8 +916,8 @@ ExportFilteredList=Ekspor daftar yang difilter ExportList=Daftar ekspor ExportOptions=Opsi Ekspor IncludeDocsAlreadyExported=Sertakan dokumen yang sudah diekspor -ExportOfPiecesAlreadyExportedIsEnable=Ekspor potongan yang sudah diekspor dimungkinkan -ExportOfPiecesAlreadyExportedIsDisable=Ekspor potongan yang sudah diekspor dinonaktifkan +ExportOfPiecesAlreadyExportedIsEnable=Documents already exported are visible and will be exported +ExportOfPiecesAlreadyExportedIsDisable=Documents already exported are hidden and won't be exported AllExportedMovementsWereRecordedAsExported=Semua pergerakan yang diekspor dicatat sebagai yang diekspor NotAllExportedMovementsCouldBeRecordedAsExported=Tidak semua pergerakan yang diekspor dapat dicatat sebagai yang diekspor Miscellaneous=Lain-lain @@ -1128,6 +1132,7 @@ DeleteFileText=Anda yakin ingin menghapus file ini? ShowOtherLanguages=Tampilkan bahasa lain SwitchInEditModeToAddTranslation=Alihkan dalam mode edit untuk menambahkan terjemahan untuk bahasa ini NotUsedForThisCustomer=Tidak digunakan untuk pelanggan ini +NotUsedForThisVendor=Not used for this vendor AmountMustBePositive=Jumlahnya harus positif ByStatus=Menurut status InformationMessage=Informasi @@ -1148,14 +1153,14 @@ EventReminder=Pengingat Acara UpdateForAllLines=Perbarui untuk semua lini OnHold=Tertahan Civility=Kesopanan -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Set Supervisor +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor CreateExternalUser=Buat pengguna eksternal ConfirmAffectTag=Bulk Tag Assignement ConfirmAffectUser=Bulk User Assignement -ProjectRole=Role assigned on each project -TasksRole=Role assigned on each task of each project +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ConfirmSetSupervisor=Bulk Supervisor Set ConfirmUpdatePrice=Choose a increase/decrease price rate ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Created from Public portal UserAgent=User Agent InternalUser=Pengguna internal ExternalUser=Pengguna eksternal +NoSpecificContactAddress=No specific contact or address +NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. +HideOnVCard=Hide %s +AddToContacts=Add address to my contacts +LastAccess=Last access +UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here +LastPasswordChangeDate=Last password change date diff --git a/htdocs/langs/id_ID/stripe.lang b/htdocs/langs/id_ID/stripe.lang index 6719ab69746..7bd6a28bd8e 100644 --- a/htdocs/langs/id_ID/stripe.lang +++ b/htdocs/langs/id_ID/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Kata kunci webhook live ONLINE_PAYMENT_WAREHOUSE=Stok yang akan digunakan untuk penurunan stok ketika pembayaran online dilakukan
    (TODO Kapan opsi untuk mengurangi stok dilakukan atas tindakan faktur dan pembayaran online menghasilkan sendiri faktur itu?) StripeLiveEnabled=Stripe langsung diaktifkan (jika tidak, uji / mode kotak pasir) StripeImportPayment=Impor pembayaran Stripe -ExampleOfTestCreditCard=Contoh kartu kredit untuk pengujian: %s => valid, %s => error CVC, %s => kedaluwarsa, %s => tagihan gagal +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +ExampleOfTestBankAcountForSEPA=Example of bank account BAN for direct debit test: %s StripeGateways=Gerbang gateway Stripe OAUTH_STRIPE_TEST_ID=Stripe Connect ID Klien (ca_...) OAUTH_STRIPE_LIVE_ID=Stripe Connect ID Klien (ca _...) @@ -61,6 +62,7 @@ DeleteACard=Hapus Kartu ConfirmDeleteCard=Anda yakin ingin menghapus kartu Kredit atau Debit ini? CreateCustomerOnStripe=Buat pelanggan di Stripe CreateCardOnStripe=Buat kartu di Stripe +CreateBANOnStripe=Create bank on Stripe ShowInStripe=Tunjukkan di Stripe StripeUserAccountForActions=Akun pengguna yang akan digunakan untuk pemberitahuan email tentang beberapa acara Stripe (pembayaran Stripe) StripePayoutList=Daftar pembayaran Stripe @@ -69,3 +71,8 @@ ToOfferALinkForLiveWebhook=Tautan ke setup Stripe WebHook untuk memanggil IPN (l PaymentWillBeRecordedForNextPeriod=Pembayaran akan dicatat untuk periode berikutnya. ClickHereToTryAgain= Klik di sini untuk mencoba lagi ... CreationOfPaymentModeMustBeDoneFromStripeInterface=Karena aturan Otentikasi Pelanggan yang Kuat, pembuatan kartu harus dilakukan dari Stripe backoffice. Anda dapat mengklik di sini untuk mengaktifkan catatan pelanggan Stripe: %s +STRIPE_CARD_PRESENT=Card Present for Stripe Terminals +TERMINAL_LOCATION=Location (address) for Stripe Terminals +RequestDirectDebitWithStripe=Request Direct Debit with Stripe +STRIPE_SEPA_DIRECT_DEBIT=Enable the Direct Debit payments through Stripe + diff --git a/htdocs/langs/id_ID/users.lang b/htdocs/langs/id_ID/users.lang index c46642b185f..6f688ab7e1b 100644 --- a/htdocs/langs/id_ID/users.lang +++ b/htdocs/langs/id_ID/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Tautan ke pengguna LinkedToDolibarrThirdParty=Tautan ke pihak ketiga CreateDolibarrLogin=Buat pengguna CreateDolibarrThirdParty=Buat pihak ketiga -LoginAccountDisableInDolibarr=Akun dinonaktifkan di Dolibarr. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Gunakan nilai pribadi ExportDataset_user_1=Pengguna dan propertinya DomainUser=Pengguna domain %s @@ -129,3 +130,6 @@ IPLastLogin=IP last login IPPreviousLogin=IP previous login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/is_IS/users.lang b/htdocs/langs/is_IS/users.lang index 7501d233740..3f02257d267 100644 --- a/htdocs/langs/is_IS/users.lang +++ b/htdocs/langs/is_IS/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Link to user LinkedToDolibarrThirdParty=Link to third party CreateDolibarrLogin=Búa til notanda CreateDolibarrThirdParty=Búa til þriðja aðila -LoginAccountDisableInDolibarr=Reikningur óvirkur í Dolibarr. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Nota persónulega gildi ExportDataset_user_1=Users and their properties DomainUser=Lén notanda %s @@ -129,3 +130,6 @@ IPLastLogin=IP last login IPPreviousLogin=IP previous login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/it_IT/accountancy.lang b/htdocs/langs/it_IT/accountancy.lang index dcb26040ba9..6426a252743 100644 --- a/htdocs/langs/it_IT/accountancy.lang +++ b/htdocs/langs/it_IT/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Seleziona il tipo di ritorno a capo ACCOUNTING_EXPORT_PREFIX_SPEC=Specificare il prefisso per il nome del file ThisService=Questo servizio ThisProduct=Questo prodotto -DefaultForService=Predefinito per servizio -DefaultForProduct=Predefinito per prodotto +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Prodotto per questa terza parte ServiceForThisThirdparty=Servizi per questo soggetto terzo CantSuggest=Non posso suggerire @@ -101,7 +101,8 @@ ShowAccountingAccount=Mostra conti di contabilità ShowAccountingJournal=Mostra giornale ShowAccountingAccountInLedger=Mostra conto contabile nel libro mastro ShowAccountingAccountInJournals=Mostra conto contabile nei giornali di registrazione -AccountAccountingSuggest=Conto suggerito per contabilità +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=Conti predefiniti MenuBankAccounts=Conti bancari MenuVatAccounts=Conti IVA @@ -126,6 +127,7 @@ WriteBookKeeping=Registra i movimenti in contabilità Bookkeeping=Libro contabile BookkeepingSubAccount=Conto secondario AccountBalance=Saldo +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Sorgente oggetto in riferimento CAHTF=Totale acquisto al lordo delle imposte TotalExpenseReport=Rapporto spese totale @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Memorizzare il conto cliente come conto individuale nel libro mastro sussidiario per le righe di acconto (se disabilitato, il conto individuale per le righe di acconto rimarrà vuoto) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Memorizzare il conto fornitore come conto individuale nel libro mastro sussidiario per le righe di acconto (se disabilitato, il conto individuale per le righe di acconto rimarrà vuoto) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=Etichetta del giornale NumPiece=Numero del pezzo TransactionNumShort=Num. movimento AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Raggruppa per conto di contabilità generale GroupBySubAccountAccounting=Raggruppa per conto secondario AccountingAccountGroupsDesc=Qui puoi definire alcuni gruppi di conti contabili. Saranno utilizzati per rapporti contabili personalizzati. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Mostra il totale parziale per livello Pcgtype=Gruppo di conto PcgtypeDesc=Il gruppo di conti viene utilizzato come criterio 'filtro' e 'raggruppamento' predefiniti per alcuni report contabili. Ad esempio, "RICAVO" o "COSTO" sono utilizzati come gruppi per la contabilità dei prodotti per creare il rapporto costi / ricavi. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=riconciliabile @@ -294,6 +299,7 @@ DescValidateMovements=Qualsiasi modifica o cancellazione di scrittura, lettura e ValidateHistory=Collega automaticamente AutomaticBindingDone=Associazioni automatiche eseguite (%s) - Associazioni automatiche non possibili per alcuni record (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movimento non correttamente bilanciato. Debito = %s e credito = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Disabilita vincolante e trasferimento in con ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Disabilita vincolante e trasferimento in contabilità sugli acquisti (le fatture fornitore non verranno prese in considerazione in contabilità) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Disabilita binding e trasferimento in contabilità sulle note spese (le note spese non verranno prese in considerazione in contabilità) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Contrassegna le righe esportate come Esportate (per modificare una riga è necessario eliminare l'intera transazione e ritrasferirla in contabilità) NotifiedValidationDate=Convalida e Blocca le voci esportate (stesso effetto della funzione "%s", la modifica e la cancellazione delle righe NON sarà SICURAMENTE possibile) +NotifiedExportFull=Export documents ? DateValidationAndLock=Convalida e blocco della data ConfirmExportFile=Conferma della generazione del file di esportazione contabile? ExportDraftJournal=Esporta giornale in bozza @@ -398,7 +406,7 @@ SaleLocal=Local sale SaleExport=Export sale SaleEEC=Vendite intracomunitarie (CEE) SaleEECWithVAT=Vendita in CEE con IVA non nulla, quindi supponiamo che questa NON sia una vendita intracomunitaria e l'account suggerito sia l'account standard del prodotto. -SaleEECWithoutVATNumber=La vendita nella CEE senza IVA ma la partita IVA di terzi non è definita. Eseguiamo il fallback sull'account del prodotto per le vendite standard. È possibile correggere l'ID IVA di terze parti o l'account del prodotto, se necessario. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Vietato: la transazione è stata convalidata e/o esportata. ForbiddenTransactionAlreadyValidated=Vietato: il movimento è stato convalidato. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Mancata corrispondenza nel codice di riconcil AccountancyErrorMismatchBalanceAmount=Il saldo (%s) non è uguale a 0 AccountancyErrorLetteringBookkeeping=Si sono verificati errori relativi alle transazioni: %s ErrorAccountNumberAlreadyExists=Il numero contabile %s esiste già +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Accounting entries @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Codice multivaluta (Idevise) DateExport=Data esportazione WarningReportNotReliable=Warning, this report is not based on the Ledger, so does not contains transaction modified manually in the Ledger. If your journalization is up to date, the bookkeeping view is more accurate. ExpenseReportJournal=Giornale note spese +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s account diff --git a/htdocs/langs/it_IT/admin.lang b/htdocs/langs/it_IT/admin.lang index c787126d4c5..f877e9ef1c2 100644 --- a/htdocs/langs/it_IT/admin.lang +++ b/htdocs/langs/it_IT/admin.lang @@ -292,7 +292,7 @@ MAIN_MAIL_SMTP_SERVER=Host SMTP / SMTPS (predefinito in php.ini: %s ) MAIN_MAIL_SMTP_PORT_NotAvailableOnLinuxLike=Porta SMTP / SMTPS (non definita in PHP su sistemi Unix-like) MAIN_MAIL_SMTP_SERVER_NotAvailableOnLinuxLike=Host SMTP / SMTPS (non definito in PHP su sistemi Unix-like) MAIN_MAIL_EMAIL_FROM=Indirizzo mittente per le email automatiche (predefinito in php.ini: %s ) -EMailHelpMsgSPFDKIM=To prevent Dolibarr emails to be classified as spam, make sure that the server is authorized to send e-mails from this address by SPF and DKIM configuration +EMailHelpMsgSPFDKIM=Per evitare che le email di Dolibarr vengano classificate come spam, assicurati che il server sia autorizzato a inviare e-mail da questo indirizzo tramite configurazione SPF e DKIM MAIN_MAIL_ERRORS_TO=Indirizzo a cui inviare eventuali errori (campi 'Errors-To' nelle email inviate) MAIN_MAIL_AUTOCOPY_TO= Indirizzo a cui inviare in copia Ccn tutte le mail in uscita MAIN_DISABLE_ALL_MAILS=Disabilita l'invio delle email (a scopo di test o demo) @@ -502,8 +502,8 @@ WarningPHPMail=ATTENZIONE: la configurazione per inviare e-mail dall'applicazion WarningPHPMailA=- L'utilizzo del server del provider di servizi di posta elettronica aumenta l'affidabilità della tua e-mail, quindi aumenta la consegna senza essere contrassegnato come SPAM WarningPHPMailB=- Alcuni provider di servizi di posta elettronica (come Yahoo) non consentono di inviare un'e-mail da un server diverso dal proprio server. La tua configurazione attuale utilizza il server dell'applicazione per inviare e-mail e non il server del tuo provider di posta elettronica, quindi alcuni destinatari (quello compatibile con il protocollo restrittivo DMARC), chiederanno al tuo provider di posta elettronica se possono accettare la tua posta e alcuni provider di posta elettronica (come Yahoo) potrebbe rispondere "no" perché il server non è il loro, quindi alcune delle tue email inviate potrebbero non essere accettate per la consegna (attenzione anche alla quota di invio del tuo provider di posta elettronica). WarningPHPMailC=- Anche l'utilizzo del server SMTP del tuo provider di servizi di posta elettronica per inviare e-mail è interessante, quindi tutte le e-mail inviate dall'applicazione verranno salvate anche nella directory "Inviati" della tua casella di posta. -WarningPHPMailD=It is therefore recommended to change the sending method of e-mails to the value "SMTP". -WarningPHPMailDbis=If you really want to keep the default "PHP" method to send emails, just ignore this warning, or remove it by %sclicking here%s. +WarningPHPMailD=Si consiglia pertanto di modificare il metodo di invio delle email al valore "SMTP". +WarningPHPMailDbis=Se vuoi davvero mantenere il metodo "PHP" predefinito per inviare e-mail, ignora questo avviso o rimuovilo con %s cliccando qui %s. WarningPHPMail2=If your email SMTP provider need to restrict email client to some IP addresses (very rare), this is the IP address of the mail user agent (MUA) for your ERP CRM application: %s. WarningPHPMailSPF=Se il nome a dominio dell'indirizzo email del tuo mittente è protetto da un record SPF (chiedi al tuo registar del nome a dominio), devi aggiungere i seguenti IP nel record SPF del DNS del tuo dominio: %s . ActualMailSPFRecordFound=Trovato record SPF effettivo (per e-mail %s): %s @@ -645,6 +645,8 @@ Module2300Name=Processi pianificati Module2300Desc=Gestione delle operazioni pianificate Module2400Name=Eventi/Agenda Module2400Desc=Gestione eventi/compiti e ordine del giorno. Registra manualmente eventi nell'agenda o consenti all'applicazione di registrare eventi automaticamente a scopo di monitoraggio. Questo è il modulo principale per una buona gestione delle relazioni con clienti e fornitori. +Module2430Name=Calendario Prenotazioni +Module2430Desc=Fornisce un calendario online per la prenotazione di riunioni in base a fasce predefinite o disponibilità. Module2500Name=DMS / ECM Module2500Desc=Sistema di gestione documentale / Gestione elettronica dei contenuti. Organizzazione automatica dei documenti generati o archiviati. Condivisione con chi ne ha bisogno. Module2600Name=API / Web services (server SOAP) @@ -660,6 +662,8 @@ Module2900Name=GeoIPMaxmind Module2900Desc=Localizzazione degli accessi tramite GeoIP Maxmind Module3200Name=Archivi inalterabili Module3200Desc=Abilita un registro inalterabile degli eventi aziendali. Gli eventi sono archiviati in tempo reale. Il registro è una tabella di sola lettura degli eventi concatenati che possono essere esportati. Questo modulo potrebbe essere obbligatorio per alcuni paesi. +Module3300Name=Costruttore di moduli +Module3200Desc=Abilita un registro inalterabile degli eventi aziendali. Gli eventi sono archiviati in tempo reale. Il registro è una tabella di sola lettura degli eventi concatenati che possono essere esportati. Questo modulo potrebbe essere obbligatorio per alcuni paesi. Module3400Name=Social Networks Module3400Desc=Abilita i campi Social Network in terze parti e indirizzi (skype, twitter, facebook, ...). Module4000Name=Risorse umane @@ -974,14 +978,14 @@ Permission3301=Genera nuovi moduli Permission4001=Leggi abilità/lavoro/posizione Permission4002=Crea/modifica abilità/lavoro/posizione Permission4003=Elimina abilità/lavoro/posizione -Permission4021=Read evaluations (yours and your subordinates) -Permission4022=Create/modify evaluations -Permission4023=Validate evaluation -Permission4025=Delete evaluation -Permission4028=See comparison menu +Permission4021=Leggere le valutazioni (tue e dei tuoi subordinati) +Permission4022=Crea/modifica valutazioni +Permission4023=Convalida la valutazione +Permission4025=Elimina valutazione +Permission4028=Guarda il menu di confronto Permission4031=Leggi le informazioni personali Permission4032=Scrivi informazioni personali -Permission4033=Read all evaluations (even those of user not subordinates) +Permission4033=Leggi tutte le valutazioni (anche quelle di utenti non subordinati) Permission10001=Read website content Permission10002=Create/modify website content (html and javascript content) Permission10003=Create/modify website content (dynamic php code). Dangerous, must be reserved to restricted developers. @@ -1252,7 +1256,7 @@ AreaForAdminOnly=I parametri di setup possono essere definiti solo da utenti di SystemInfoDesc=Le informazioni di sistema sono dati tecnici visibili in sola lettura e solo dagli amministratori. SystemAreaForAdminOnly=Questa area è disponibile solo per gli utenti amministratori. Le autorizzazioni utente Dolibarr non possono modificare questa limitazione. CompanyFundationDesc=Modifica le informazioni dell'azienda / fondazione. Fai clic sul pulsante "%s" nella parte inferiore della pagina. -MoreNetworksAvailableWithModule=More social networks may be available by enabling the module "Social networks". +MoreNetworksAvailableWithModule=Ulteriori social network potrebbero essere disponibili abilitando il modulo "Social network". AccountantDesc=Se hai un contabile / contabile esterno, puoi modificare qui le sue informazioni. AccountantFileNumber=Accountant code DisplayDesc=I parametri che influenzano l'aspetto e la presentazione dell'applicazione possono essere modificati qui. @@ -1270,6 +1274,7 @@ TriggerActiveAsModuleActive=I trigger in questo file sono attivi se il modulo - Category of operations: Delivery of goods
    - Category of operations: Provision of services
    - Category of operations: Mixed - Delivery of goods & provision of services -InvoiceOptionCategoryOfOperationsYes1=Yes, below the address block -InvoiceOptionCategoryOfOperationsYes2=Yes, in the lower left-hand corner +InvoiceOptionCategoryOfOperations=Visualizzare la citazione "categoria di operazioni" sulla fattura. +InvoiceOptionCategoryOfOperationsHelp=A seconda della situazione, la citazione apparirà nella forma:
    - Categoria di operazioni: Consegna di merci
    - Categoria di operazioni: Prestazione di servizi
    - Categoria di operazioni: Miste - Consegna di beni e prestazione di servizi +InvoiceOptionCategoryOfOperationsYes1=Sì, sotto il blocco indirizzo +InvoiceOptionCategoryOfOperationsYes2=Sì, nell'angolo in basso a sinistra ##### Proposals ##### PropalSetup=Impostazioni proposte commerciali ProposalsNumberingModules=Modelli di numerazione della proposta commerciale @@ -1491,12 +1496,12 @@ WatermarkOnDraftContractCards=Bozze dei contratti filigranate (nessuna filigrana ##### Members ##### MembersSetup=Impostazioni modulo membri MemberMainOptions=Opzioni principali -MemberCodeChecker=Options for automatic generation of member codes +MemberCodeChecker=Opzioni per la generazione automatica dei codici membro AdherentLoginRequired= Gestire un account di accesso per ogni membro AdherentMailRequired=Email required to create a new member MemberSendInformationByMailByDefault=Checkbox per inviare una mail di conferma per i membri (è attiva per impostazione predefinita) MemberCreateAnExternalUserForSubscriptionValidated=Crea un login utente esterno per ogni nuovo abbonamento membro convalidato -VisitorCanChooseItsPaymentMode=Visitor can choose from any available payment modes +VisitorCanChooseItsPaymentMode=Il visitatore può scegliere tra qualsiasi modalità di pagamento disponibile MEMBER_REMINDER_EMAIL=Enable automatic reminder by email of expired subscriptions. Note: Module %s must be enabled and correctly setup to send reminders. MembersDocModules=Modelli di documento per i documenti generati dal record del membro ##### LDAP setup ##### @@ -1758,8 +1763,8 @@ ActivateFCKeditor=Attiva editor avanzato per: FCKeditorForNotePublic=WYSIWIG creazione/edizione del campo "note pubbliche" di elementi FCKeditorForNotePrivate=WYSIWIG creazione/edizione del campo "note private" degli elementi FCKeditorForCompany=WYSIWIG creazione/modifica del campo descrizione degli elementi (esclusi prodotti/servizi) -FCKeditorForProductDetails=WYSIWIG creation/edition of products description or lines for objects (lines of proposals, orders, invoices, etc...). -FCKeditorForProductDetails2=Warning: Using this option for this case is seriously not recommended as it can create problems with special characters and page formatting when building PDF files. +FCKeditorForProductDetails=WYSIWIG creazione/modifica di descrizioni prodotti o linee per oggetti (linee di proposte, ordini, fatture, ecc...). +FCKeditorForProductDetails2=Attenzione: l'utilizzo di questa opzione per questo caso è seriamente sconsigliato in quanto può creare problemi con i caratteri speciali e la formattazione della pagina durante la creazione di file PDF. FCKeditorForMailing= Editor WYSIWIG per le email FCKeditorForUserSignature=WYSIWIG creazione/modifica della firma utente FCKeditorForMail=WYSIWIG creation/edition for all mail (except Tools->eMailing) @@ -1826,6 +1831,9 @@ AGENDA_USE_EVENT_TYPE=Use events types (managed in menu Setup -> Dictionaries -> AGENDA_USE_EVENT_TYPE_DEFAULT=Automatically set this default value for type of event in event create form AGENDA_DEFAULT_FILTER_TYPE=Automatically set this type of event in search filter of agenda view AGENDA_DEFAULT_FILTER_STATUS=Automatically set this status for events in search filter of agenda view +AGENDA_EVENT_PAST_COLOR=Colore dell'evento passato +AGENDA_EVENT_CURRENT_COLOR=Colore dell'evento corrente +AGENDA_EVENT_FUTURE_COLOR=Colore dell'evento futuro AGENDA_DEFAULT_VIEW=Quale vista si desidera aprire per impostazione predefinita quando si seleziona il menu Agenda AGENDA_REMINDER_BROWSER=Abilita promemoria eventi sul browser dell'utente (Quando viene raggiunta la data del promemoria, il browser mostra un popup. Ogni utente può disabilitare tali notifiche dalla configurazione delle notifiche del browser). AGENDA_REMINDER_BROWSER_SOUND=Attiva i suoni per le notifiche @@ -1853,7 +1861,7 @@ StockDecreaseForPointOfSaleDisabledbyBatch=Stock decrease in POS is not compatib CashDeskYouDidNotDisableStockDecease=You did not disable stock decrease when making a sale from Point of Sale. Hence a warehouse is required. CashDeskForceDecreaseStockLabel=La riduzione delle scorte per i prodotti batch è stata forzata. CashDeskForceDecreaseStockDesc=Diminuisci prima secondo le date più antiche di Eatby e Sellby. -CashDeskReaderKeyCodeForEnter=Key ASCII code for "Enter" defined in barcode reader (Example: 13) +CashDeskReaderKeyCodeForEnter=Chiave Codice ASCII per "Invio" definito nel lettore di codici a barre (Esempio: 13) ##### Bookmark ##### BookmarkSetup=Impostazioni modulo segnalibri BookmarkDesc=Questo modulo consente di gestire i segnalibri web. È possibile aggiungere collegamenti a pagine Dolibarr o a qualsiasi altro sito web esterno al menu di sinistra. @@ -1891,7 +1899,7 @@ SuppliersInvoiceNumberingModel=Modello per la numerazione delle fatture fornitor IfSetToYesDontForgetPermission=Se impostato su un valore non nullo, non dimenticare di fornire autorizzazioni a gruppi o utenti autorizzati per la seconda approvazione ##### GeoIPMaxmind ##### GeoIPMaxmindSetup=Impostazioni modulo GeoIP Maxmind -PathToGeoIPMaxmindCountryDataFile=Path to file containing Maxmind ip to country translation +PathToGeoIPMaxmindCountryDataFile=Percorso del file contenente l'ip Maxmind nella traduzione del paese NoteOnPathLocation=Nota bene: il file deve trovarsi in una directory leggibile da PHP. YouCanDownloadFreeDatFileTo=È disponibile una versione demo gratuita del 'Maxmind GeoIP country file' su %s. YouCanDownloadAdvancedDatFileTo=Altrimenti è disponibile una versione completa, con aggiornamenti al seguente indirizzo: %s @@ -1942,7 +1950,7 @@ BackupDumpWizard=Procedura guidata per creare file di backup del database (dump) BackupZipWizard=Procedura guidata per creare l'archivio della directory dei documenti SomethingMakeInstallFromWebNotPossible=Installation of external module is not possible from the web interface for the following reason: SomethingMakeInstallFromWebNotPossible2=For this reason, process to upgrade described here is a manual process only a privileged user may perform. -InstallModuleFromWebHasBeenDisabledContactUs=Install or development of external modules or dynamic websites, from the application, is currently locked for security purpose. Please contact us if you need to enable this feature. +InstallModuleFromWebHasBeenDisabledContactUs=L'installazione o lo sviluppo di moduli esterni o siti Web dinamici, dall'applicazione, è attualmente bloccato per motivi di sicurezza. Contattaci se hai bisogno di abilitare questa funzione. InstallModuleFromWebHasBeenDisabledByFile=Install of external module from application has been disabled by your administrator. You must ask him to remove the file %s to allow this feature. ConfFileMustContainCustom=Installing or building an external module from application need to save the module files into directory %s. To have this directory processed by Dolibarr, you must setup your conf/conf.php to add the 2 directive lines:
    $dolibarr_main_url_root_alt='/custom';
    $dolibarr_main_document_root_alt='%s/custom'; HighlightLinesOnMouseHover=Highlight table lines when mouse move passes over @@ -2070,8 +2078,8 @@ RemoveSpecialChars=Rimuovi caratteri speciali COMPANY_AQUARIUM_CLEAN_REGEX=Regex filter to clean value (COMPANY_AQUARIUM_CLEAN_REGEX) COMPANY_DIGITARIA_CLEAN_REGEX=Regex filter su clean value (COMPANY_DIGITARIA_CLEAN_REGEX) COMPANY_DIGITARIA_UNIQUE_CODE=Duplicazione non consentita -RemoveSpecialWords=Clean certain words when generating sub-accounts for customers or suppliers -RemoveSpecialWordsHelp=Specify the words to be cleaned before calculating the customer or supplier account. Use a ";" between each word +RemoveSpecialWords=Pulisci alcune parole durante la generazione di sottoconti per clienti o fornitori +RemoveSpecialWordsHelp=Specificare le parole da pulire prima di calcolare il conto cliente o fornitore. Usare un ";" tra ogni parola GDPRContact=DPO (Data Protection Officer) o in italiano RPD (Responsabile della Protezione dei Dati) GDPRContactDesc=Se memorizzi dati personali nel tuo Sistema Informativo, puoi nominare qui il contatto responsabile del Regolamento generale sulla protezione dei dati HelpOnTooltip=Testo di aiuto da mostrare come tooltip @@ -2129,6 +2137,7 @@ CodeLastResult=Ultimo codice risultato NbOfEmailsInInbox=Numero di e-mail nella directory di origine LoadThirdPartyFromName=Load third party searching on %s (load only) LoadThirdPartyFromNameOrCreate=Load third party searching on %s (create if not found) +LoadContactFromEmailOrCreate=Carica la ricerca dei contatti su %s (creare se non trovato) AttachJoinedDocumentsToObject=Salva i file allegati nei documenti oggetto se viene trovato un riferimento di un oggetto nell'argomento e-mail. WithDolTrackingID=Messaggio da una conversazione iniziata da una prima email inviata da Dolibarr WithoutDolTrackingID=Messaggio da una conversazione iniziata da una prima email NON inviata da Dolibarr @@ -2189,7 +2198,7 @@ EndPointFor=End point for %s : %s DeleteEmailCollector=Delete email collector ConfirmDeleteEmailCollector=Are you sure you want to delete this email collector? RecipientEmailsWillBeReplacedWithThisValue=Recipient emails will be always replaced with this value -AtLeastOneDefaultBankAccountMandatory=At least 1 default bank account must be defined +AtLeastOneDefaultBankAccountMandatory=Almeno 1 conto bancario di default deve essere definito RESTRICT_ON_IP=Consenti l'accesso API solo a determinati IP client (carattere jolly non consentito, usa lo spazio tra i valori). Vuoto significa che tutti i client possono accedere. IPListExample=127.0.0.1 192.168.0.2 [::1] BaseOnSabeDavVersion=Based on the library SabreDAV version @@ -2203,7 +2212,7 @@ ShowProjectLabel=Etichetta del progetto PDF_INCLUDE_ALIAS_IN_THIRDPARTY_NAME=Includi alias nel nome di terze parti THIRDPARTY_ALIAS=Nome terza parte - Alias terza parte ALIAS_THIRDPARTY=Alias terza parte - Nome terza parte -PDFIn2Languages=Show labels into PDF in 2 different languages +PDFIn2Languages=Mostra le etichette in PDF in 2 lingue diverse PDF_USE_ALSO_LANGUAGE_CODE=Se vuoi avere alcuni testi nel tuo PDF duplicato in 2 lingue diverse nello stesso PDF generato, devi impostare qui la seconda lingua in modo che il PDF generato contenga 2 lingue diverse nella stessa pagina, quella scelta durante la generazione del PDF e questa ( solo pochi modelli PDF supportano questa opzione). Mantieni vuoto per 1 lingua per PDF. PDF_USE_A=Genera documenti PDF in formato PDF/A anziché in formato PDF predefinito FafaIconSocialNetworksDesc=Inserisci qui il codice di un'icona FontAwesome. Se non sai cos'è FontAwesome, puoi utilizzare il valore generico fa-address-book. @@ -2232,12 +2241,12 @@ MailToPartnership=Collaborazione AGENDA_EVENT_DEFAULT_STATUS=Stato dell'evento predefinito durante la creazione di un evento dal modulo YouShouldDisablePHPFunctions=Dovresti disabilitare le funzioni PHP IfCLINotRequiredYouShouldDisablePHPFunctions=Tranne se è necessario eseguire i comandi di sistema nel codice personalizzato, è necessario disabilitare le funzioni PHP -PHPFunctionsRequiredForCLI=For shell purpose (like scheduled job backup or running an antivirus program), you must keep PHP functions +PHPFunctionsRequiredForCLI=Per scopi di shell (come il backup pianificato del lavoro o l'esecuzione di un programma antivirus), è necessario mantenere le funzioni PHP NoWritableFilesFoundIntoRootDir=Nessun file scrivibile o directory dei programmi comuni è stato trovato nella directory principale (buono) RecommendedValueIs=Consigliato: %s Recommended=Raccomandata NotRecommended=Non consigliato -ARestrictedPath=Some restricted path for data files +ARestrictedPath=Un percorso limitato per i file di dati CheckForModuleUpdate=Controlla gli aggiornamenti dei moduli esterni CheckForModuleUpdateHelp=Questa azione si collegherà agli editor di moduli esterni per verificare se è disponibile una nuova versione. ModuleUpdateAvailable=Un aggiornamento è disponibile @@ -2285,7 +2294,7 @@ LateWarningAfter=Avviso di "ritardo" dopo TemplateforBusinessCards=Modello per biglietto da visita di diverse dimensioni InventorySetup= Inventory Setup ExportUseLowMemoryMode=Utilizzare una modalità di memoria insufficiente -ExportUseLowMemoryModeHelp=Use the low memory mode to generate the dump file (compression is done through a pipe instead of into the PHP memory). This method does not allow to check that the file is complete and error message can't be reported if it fails. Use it if you experience not enough memory errors. +ExportUseLowMemoryModeHelp=Utilizzare la modalità di memoria minima per generare il file di dump (la compressione viene eseguita tramite una pipe anziché nella memoria PHP). Questo metodo non consente di verificare che il file sia completo e il messaggio di errore non può essere segnalato se fallisce. Usalo se riscontri errori di memoria insufficienti. ModuleWebhookName = Webhook ModuleWebhookDesc = Interfaccia per catturare i trigger di dolibarr e inviarlo a un URL @@ -2309,8 +2318,8 @@ IconOnly=Solo icona: solo testo nella descrizione comando INVOICE_ADD_ZATCA_QR_CODE=Mostra il codice QR ZATCA sulle fatture INVOICE_ADD_ZATCA_QR_CODEMore=Alcuni paesi arabi necessitano di questo codice QR sulle loro fatture INVOICE_ADD_SWISS_QR_CODE=Mostra il codice QR-Bill svizzero sulle fatture -INVOICE_SHOW_SHIPPING_ADDRESS=Show shipping address -INVOICE_SHOW_SHIPPING_ADDRESSMore=Compulsory mention for France +INVOICE_SHOW_SHIPPING_ADDRESS=Mostra l'indirizzo di spedizione +INVOICE_SHOW_SHIPPING_ADDRESSMore=Citazione obbligatoria per la Francia UrlSocialNetworksDesc=Link URL del social network. Utilizza {socialid} per la parte variabile che contiene l'ID del social network. IfThisCategoryIsChildOfAnother=Se questa categoria è figlia di un'altra DarkThemeMode=Modalità tema scuro @@ -2330,7 +2339,7 @@ UsePassword=Usa una password UseOauth=Usa un token OAUTH Images=Immagini MaxNumberOfImagesInGetPost=Numero massimo di immagini consentite in un campo HTML inviato in un modulo -MaxNumberOfPostOnPublicPagesByIP=Max number of posts on public pages with the same IP address in a month +MaxNumberOfPostOnPublicPagesByIP=Numero massimo di articoli su pagine pubbliche con lo stesso indirizzo IP in un mese CIDLookupURL=Il modulo porta un URL che può essere utilizzato da uno strumento esterno per ottenere il nome di una terza parte o un contatto dal suo numero di telefono. L'URL da utilizzare è: ScriptIsEmpty=Lo script è vuoto ShowHideTheNRequests=Mostra/nascondi le richieste SQL %s @@ -2346,12 +2355,14 @@ HelpCssOnViewDesc=Il Css utilizzato durante la visualizzazione del campo. HelpCssOnListDesc=Il Css utilizzato quando il campo si trova all'interno di una tabella elenco.
    Esempio: "tdoverflowmax200" RECEPTION_PDF_HIDE_ORDERED=Nascondi la quantità ordinata sui documenti generati per i ricevimenti MAIN_PDF_RECEPTION_DISPLAY_AMOUNT_HT=Mostra il prezzo sui documenti generati per i ricevimenti -WarningDisabled=Warning disabled -LimitsAndMitigation=Access limits and mitigation -DesktopsOnly=Desktops only -DesktopsAndSmartphones=Desktops et smartphones +WarningDisabled=Avviso disattivato +LimitsAndMitigation=Limiti di accesso e mitigazione +DesktopsOnly=Solo desktop +DesktopsAndSmartphones=Desktop e smartphone AllowOnlineSign=Consenti firma online -AllowExternalDownload=Allow external download (without login, using a shared link) -DeadlineDayVATSubmission=Deadline day for vat submission on the next month -MaxNumberOfAttachementOnForms=Max number of joinded files in a form -IfDefinedUseAValueBeetween=If defined, use a value between %s and %s +AllowExternalDownload=Consenti download esterno (senza accesso, utilizzando un collegamento condiviso) +DeadlineDayVATSubmission=Giorno di scadenza per la presentazione dell'IVA nel mese successivo +MaxNumberOfAttachementOnForms=Numero massimo di file uniti in un modulo +IfDefinedUseAValueBeetween=Se definito, utilizzare un valore compreso tra %s e %s +Reload=Ricaricare +ConfirmReload=Conferma il ricaricamento del modulo diff --git a/htdocs/langs/it_IT/companies.lang b/htdocs/langs/it_IT/companies.lang index 86f02c34c0c..a6ecd145e1c 100644 --- a/htdocs/langs/it_IT/companies.lang +++ b/htdocs/langs/it_IT/companies.lang @@ -312,12 +312,12 @@ CustomerRelativeDiscountShort=Sconto relativo CustomerAbsoluteDiscountShort=Sconto assoluto CompanyHasRelativeDiscount=Il cliente ha uno sconto del %s%% CompanyHasNoRelativeDiscount=Il cliente non ha alcuno sconto relativo impostato -HasRelativeDiscountFromSupplier=Hai uno sconto predefinito di %s%% da questo fornitore -HasNoRelativeDiscountFromSupplier=Non esistono sconti relativi predefiniti per questo fornitore\n +HasRelativeDiscountFromSupplier=You have a default discount of %s%% with this vendor +HasNoRelativeDiscountFromSupplier=No default relative discount with this vendor CompanyHasAbsoluteDiscount=Questo cliente ha degli sconti disponibili (note di credito o anticipi) per un totale di %s%s CompanyHasDownPaymentOrCommercialDiscount=Questo cliente ha uno sconto disponibile (commerciale, anticipi) per %s%s CompanyHasCreditNote=Il cliente ha ancora note di credito per %s %s -HasNoAbsoluteDiscountFromSupplier=Il fornitore non ha disponibile alcuno sconto assoluto per credito +HasNoAbsoluteDiscountFromSupplier=Nessuno sconto/credito disponibile da questo fornitore HasAbsoluteDiscountFromSupplier=You have discounts available (credits notes or down payments) for %s %s from this vendor HasDownPaymentOrCommercialDiscountFromSupplier=You have discounts available (commercial, down payments) for %s %s from this vendor HasCreditNoteFromSupplier=You have credit notes for %s %s from this vendor @@ -345,7 +345,7 @@ ContactByDefaultFor=Contatto / indirizzo predefinito per AddThirdParty=Crea soggetto terzo DeleteACompany=Elimina una società PersonalInformations=Dati personali -AccountancyCode=Account di contabilità +AccountancyCode=Conto di contabilità CustomerCode=Codice cliente SupplierCode=Codice fornitore CustomerCodeShort=Codice cliente @@ -444,7 +444,7 @@ AddAddress=Aggiungi un indirizzo SupplierCategory=Categoria fornitore JuridicalStatus200=Indipendente DeleteFile=Cancella il file -ConfirmDeleteFile=Are you sure you want to delete this file? +ConfirmDeleteFile=Sei sicuro di voler eliminare questo file %s ? AllocateCommercial=Assegna un commerciale Organization=Organizzazione FiscalYearInformation=Anno fiscale @@ -498,3 +498,8 @@ RestOfEurope=Resto d'Europa (CEE) OutOfEurope=Fuori dall'Europa (CEE) CurrentOutstandingBillLate=Fatture scadute in ritardo BecarefullChangeThirdpartyBeforeAddProductToInvoice=Fai attenzione, a seconda delle impostazioni del prezzo del prodotto, dovresti cambiare terze parti prima di aggiungere il prodotto al POS. +EmailAlreadyExistsPleaseRewriteYourCompanyName=l'email esiste già, controlla il nome della tua azienda +TwoRecordsOfCompanyName=more than one record exists for this company, please contact us to complete your partnership request +CompanySection=Company section +ShowSocialNetworks=Show social networks +HideSocialNetworks=Hide social networks diff --git a/htdocs/langs/it_IT/main.lang b/htdocs/langs/it_IT/main.lang index e3b5134df8a..817423e1bfa 100644 --- a/htdocs/langs/it_IT/main.lang +++ b/htdocs/langs/it_IT/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=Gruppo non definito Password=Password PasswordRetype=Ripeti la tua password NoteSomeFeaturesAreDisabled=Nota bene: In questo demo alcune funzionalità e alcuni moduli sono disabilitati. +YourUserFile=Your user file Name=Nome NameSlashCompany=Nome / Società Person=Persona @@ -897,6 +898,9 @@ MassFilesArea=File creati da azioni di massa ShowTempMassFilesArea=Mostra i file creati da azioni di massa ConfirmMassDeletion=Conferma eliminazione massiva ConfirmMassDeletionQuestion=Vuoi davvero eliminare %s record selezionati? +ConfirmMassClone=Bulk clone confirmation +ConfirmMassCloneQuestion=Select project to clone to +ConfirmMassCloneToOneProject=Clone to project %s RelatedObjects=Oggetti correlati ClassifyBilled=Classificare fatturata ClassifyUnbilled=Classifica non pagata @@ -912,8 +916,8 @@ ExportFilteredList=Esporta lista filtrata ExportList=Esporta lista ExportOptions=Opzioni di esportazione IncludeDocsAlreadyExported=Includi documenti già esportati -ExportOfPiecesAlreadyExportedIsEnable=Includi documenti già esportati abilitato -ExportOfPiecesAlreadyExportedIsDisable=Includi documenti già esportati disabilitato +ExportOfPiecesAlreadyExportedIsEnable=Documents already exported are visible and will be exported +ExportOfPiecesAlreadyExportedIsDisable=Documents already exported are hidden and won't be exported AllExportedMovementsWereRecordedAsExported=All exported movements were recorded as exported NotAllExportedMovementsCouldBeRecordedAsExported=Not all exported movements could be recorded as exported Miscellaneous=Varie @@ -1128,6 +1132,7 @@ DeleteFileText=Vuoi davvero eliminare questo file? ShowOtherLanguages=Mostra altre lingue SwitchInEditModeToAddTranslation=Passa alla modalità di modifica per aggiungere traduzioni per questa lingua NotUsedForThisCustomer=Non utilizzato per questo cliente +NotUsedForThisVendor=Not used for this vendor AmountMustBePositive=L'importo deve essere positivo ByStatus=Per stato InformationMessage=Informazioni @@ -1148,14 +1153,14 @@ EventReminder=Promemoria evento UpdateForAllLines=Aggiornamento per tutte le linee OnHold=In attesa Civility=Civiltà -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Imposta supervisore +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor CreateExternalUser=Crea utente esterno ConfirmAffectTag=Bulk Tag Assignement ConfirmAffectUser=Bulk User Assignement -ProjectRole=Role assigned on each project -TasksRole=Role assigned on each task of each project +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ConfirmSetSupervisor=Set supervisore in maniera massiva ConfirmUpdatePrice=Choose a increase/decrease price rate ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Creato dal portale pubblico UserAgent=User Agent InternalUser=Utente interno ExternalUser=Utente esterno +NoSpecificContactAddress=No specific contact or address +NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. +HideOnVCard=Hide %s +AddToContacts=Add address to my contacts +LastAccess=Last access +UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here +LastPasswordChangeDate=Last password change date diff --git a/htdocs/langs/it_IT/members.lang b/htdocs/langs/it_IT/members.lang index 7dd9b89ab53..7efb31bc8ac 100644 --- a/htdocs/langs/it_IT/members.lang +++ b/htdocs/langs/it_IT/members.lang @@ -15,7 +15,7 @@ ErrorMemberIsAlreadyLinkedToThisThirdParty=Un altro membro (nome: %s, log ErrorUserPermissionAllowsToLinksToItselfOnly=Per motivi di sicurezza, è necessario possedere permessi di modifica di tutti gli utenti per poter modificare un membro diverso da sé stessi. SetLinkToUser=Link a un utente Dolibarr SetLinkToThirdParty=Link ad un soggetto terzo -MemberCountersArePublic=Counters of valid members are public +MemberCountersArePublic=I contatori dei membri validi sono pubblici MembersCards=Generazione di tessere per i membri MembersList=Elenco dei membri MembersListToValid=Elenco dei membri del progetto (da convalidare) @@ -23,7 +23,7 @@ MembersListValid=Elenco dei membri validi MembersListUpToDate=Elenco dei membri validi con contributo aggiornato MembersListNotUpToDate=Elenco dei membri validi con contributo scaduto MembersListExcluded=Elenco dei membri esclusi -MembersListResiliated=List of terminated members +MembersListResiliated=Elenco dei membri cessati MembersListQualified=Elenco dei membri qualificati MenuMembersToValidate=Membri da convalidare MenuMembersValidated=Membri convalidati @@ -35,15 +35,15 @@ DateSubscription=Data di adesione DateEndSubscription=Data di fine adesione EndSubscription=Fine adesione SubscriptionId=ID contributo -WithoutSubscription=Without membership -WaitingSubscription=Membership pending +WithoutSubscription=Senza iscrizione +WaitingSubscription=Iscrizione in sospeso MemberId=ID membro -MemberRef=Membro Rif +MemberRef=Rif Membro NewMember=Nuovo membro MemberType=Tipo membro MemberTypeId=Id membro MemberTypeLabel=Etichetta tipo membro -MembersTypes=Tipi di membro +MembersTypes=Tipi di membri MemberStatusDraft=Bozza (deve essere convalidata) MemberStatusDraftShort=Bozza MemberStatusActive=Convalidato (in attesa di contributo) @@ -54,41 +54,41 @@ MemberStatusPaid=Adesione aggiornata MemberStatusPaidShort=Aggiornata MemberStatusExcluded=Membro escluso MemberStatusExcludedShort=Escluso -MemberStatusResiliated=Terminated member -MemberStatusResiliatedShort=Terminated +MemberStatusResiliated=Membro cessato +MemberStatusResiliatedShort=Cessato MembersStatusToValid=Membri da convalidare MembersStatusExcluded=Membri esclusi -MembersStatusResiliated=Terminated members +MembersStatusResiliated=Membri cessati MemberStatusNoSubscription=Convalidato (nessun contributo richiesto) -MemberStatusNoSubscriptionShort=convalidato +MemberStatusNoSubscriptionShort=Convalidato SubscriptionNotNeeded=Nessun contributo richiesto NewCotisation=Nuovo contributo PaymentSubscription=Nuovo contributo di pagamento SubscriptionEndDate=Termine ultimo per l'adesione MembersTypeSetup=Impostazioni tipi di membri -MemberTypeModified=Member type modified -DeleteAMemberType=Delete a member type -ConfirmDeleteMemberType=Are you sure you want to delete this member type? -MemberTypeDeleted=Member type deleted -MemberTypeCanNotBeDeleted=Member type can not be deleted +MemberTypeModified=Tipo membro modificato +DeleteAMemberType=Cancella un tipo di membro +ConfirmDeleteMemberType=Sei sicuro di voler cancellare questo tipo di membro? +MemberTypeDeleted=Tipo membro cancellato +MemberTypeCanNotBeDeleted=Il tipo di membro non può essere cancellato NewSubscription=Nuovo contributo -NewSubscriptionDesc=Questo modulo consente di registrare l'adesione di un nuovo membro alla fondazione. Per rinnovare l'adesione (se già iscritto), si prega di contattare la fondazione per email. +NewSubscriptionDesc=Questo modulo consente di registrare l'adesione di un nuovo membro alla fondazione. Per rinnovare l'adesione (se già iscritto), si prega di contattare la fondazione per email %s. Subscription=Contributo -AnyAmountWithAdvisedAmount=Any amount of your choice, recommended %s -AnyAmountWithoutAdvisedAmount=Any amount of your choice -CanEditAmountShort=Any amount -CanEditAmountShortForValues=recommended, any amount +AnyAmountWithAdvisedAmount=Qualsiasi importo a tua scelta, consigliato %s +AnyAmountWithoutAdvisedAmount=Qualsiasi importo a tua scelta +CanEditAmountShort=Qualsiasi importo +CanEditAmountShortForValues=consigliato, qualsiasi importo MembershipDuration=Durata -GetMembershipButtonLabel=Join +GetMembershipButtonLabel=Partecipa Subscriptions=Contributi SubscriptionLate=Ritardi SubscriptionNotReceived=Contributo mai ricevuto ListOfSubscriptions=Elenco dei contributi -SendCardByMail=Send card by email +SendCardByMail=Invia tessera per email AddMember=Crea membro -NoTypeDefinedGoToSetup=Nessun tipo di membro definito. Vai su impostazioni - Tipi di membro +NoTypeDefinedGoToSetup=Nessun tipo di membro definito. Vai su menu "Tipi di membri" NewMemberType=Nuovo tipo di membro -WelcomeEMail=Welcome email +WelcomeEMail=Email di benvenuto SubscriptionRequired=Contributo richiesto DeleteType=Elimina VoteAllowed=E' permesso il voto @@ -99,25 +99,25 @@ Reenable=Riabilitare ExcludeMember=Escludi un membro Exclude=Escludere ConfirmExcludeMember=Sei sicuro di voler escludere questo membro? -ResiliateMember=Terminate a member -ConfirmResiliateMember=Are you sure you want to terminate this member? +ResiliateMember=Cancella un membro +ConfirmResiliateMember=Sei sicuro di voler cancellare questo membro? DeleteMember=Elimina membro ConfirmDeleteMember=Sei sicuro di voler eliminare questo membro (l'eliminazione di un membro eliminerà tutti i suoi contributi)? DeleteSubscription=Cancella adesione ConfirmDeleteSubscription=Sei sicuro di voler eliminare questo contributo? Filehtpasswd=File htpasswd ValidateMember=Convalida un membro -ConfirmValidateMember=Are you sure you want to validate this member? -FollowingLinksArePublic=The following links are open pages not protected by any Dolibarr permission. They are not formatted pages, provided as example to show how to list members database. +ConfirmValidateMember=Sei sicuro di voler convalidare questo membro? +FollowingLinksArePublic=I seguenti collegamenti sono pagine aperte non protette da alcuna autorizzazione di Dolibarr. Non sono pagine formattate, fornite come esempio per mostrare come elencare il database dei membri. PublicMemberList=Elenco pubblico dei membri BlankSubscriptionForm=Modulo di autoregistrazione pubblica -BlankSubscriptionFormDesc=Dolibarr can provide you a public URL/website to allow external visitors to ask to subscribe to the foundation. If an online payment module is enabled, a payment form may also be automatically provided. +BlankSubscriptionFormDesc=Dolibarr può fornirti un URL/sito web pubblico per consentire ai visitatori esterni di chiedere di iscriversi alla fondazione. Se è abilitato un modulo di pagamento online, può essere fornito automaticamente anche un modulo di pagamento. EnablePublicSubscriptionForm=Abilita sito web pubblico con modulo di adesione -ForceMemberType=Force the member type +ForceMemberType=Forza il tipo di membro ExportDataset_member_1=Soci e contributi ImportDataset_member_1=Membri -LastMembersModified=ultimi %s membri modificati -LastSubscriptionsModified=Ultimi contributi %s modificati +LastMembersModified=Ultimi %s membri modificati +LastSubscriptionsModified=Ultimi %s contributi modificati String=Stringa Text=Testo Int=Intero @@ -127,35 +127,35 @@ SubscriptionNotRecorded=Contributo non registrato AddSubscription=Crea contributo ShowSubscription=Mostra contributo # Label of email templates -SendingAnEMailToMember=Sending information email to member -SendingEmailOnAutoSubscription=Sending email on auto registration -SendingEmailOnMemberValidation=Sending email on new member validation -SendingEmailOnNewSubscription=Invio email sul nuovo contributo +SendingAnEMailToMember=Invio di email informativa al membro +SendingEmailOnAutoSubscription=Invio email per la registrazione automatica +SendingEmailOnMemberValidation=Invio di email per la convalida del nuovo membro +SendingEmailOnNewSubscription=Invio email per il nuovo contributo SendingReminderForExpiredSubscription=Invio sollecito contributi scaduti -SendingEmailOnCancelation=Sending email on cancelation +SendingEmailOnCancelation=Invio email in caso di disdetta SendingReminderActionComm=Invio promemoria per evento in agenda # Topic of email templates -YourMembershipRequestWasReceived=Your membership was received. -YourMembershipWasValidated=Your membership was validated +YourMembershipRequestWasReceived=La tua iscrizione è stata ricevuta. +YourMembershipWasValidated=La tua iscrizione è stata convalidata YourSubscriptionWasRecorded=Il tuo nuovo contributo è stato registrato SubscriptionReminderEmail=promemoria del contributo -YourMembershipWasCanceled=Your membership was canceled +YourMembershipWasCanceled=La tua iscrizione è stata cancellata CardContent=Contenuto della scheda membro # Text of email templates -ThisIsContentOfYourMembershipRequestWasReceived=We want to let you know that your membership request was received.

    -ThisIsContentOfYourMembershipWasValidated=We want to let you know that your membership was validated with the following information:

    -ThisIsContentOfYourSubscriptionWasRecorded=We want to let you know that your new subscription was recorded. Please find your invoice here enclosed.

    -ThisIsContentOfSubscriptionReminderEmail=We want to let you know that your subscription is about to expire or has already expired (__MEMBER_LAST_SUBSCRIPTION_DATE_END__). We hope you will renew it.

    -ThisIsContentOfYourCard=This is a summary of the information we have about you. Please contact us if anything is incorrect.

    -DescADHERENT_AUTOREGISTER_NOTIF_MAIL_SUBJECT=Subject of the notification email received in case of auto-inscription of a guest -DescADHERENT_AUTOREGISTER_NOTIF_MAIL=Content of the notification email received in case of auto-inscription of a guest +ThisIsContentOfYourMembershipRequestWasReceived=Desideriamo informarti che la tua richiesta di adesione è stata ricevuta.

    +ThisIsContentOfYourMembershipWasValidated=Desideriamo informarti che la tua iscrizione è stata convalidata con le seguenti informazioni:

    +ThisIsContentOfYourSubscriptionWasRecorded=Desideriamo informarti che il tuo nuovo abbonamento è stato registrato. Trovi la fattura qui in allegato.

    +ThisIsContentOfSubscriptionReminderEmail=Desideriamo informarti che il tuo abbonamento sta per scadere o è già scaduto (__MEMBER_LAST_SUBSCRIPTION_DATE_END__). Speriamo che lo rinnoverai.

    +ThisIsContentOfYourCard=Questo è un riepilogo delle informazioni che abbiamo su di te. Vi preghiamo di contattarci se qualcosa non è corretto.

    +DescADHERENT_AUTOREGISTER_NOTIF_MAIL_SUBJECT=Oggetto dell' email di notifica ricevuta in caso di autoiscrizione di un ospite +DescADHERENT_AUTOREGISTER_NOTIF_MAIL=Contenuto dell' email di notifica ricevuta in caso di autoiscrizione di un ospite DescADHERENT_EMAIL_TEMPLATE_AUTOREGISTER=Modello e-mail da utilizzare per inviare e-mail a un membro durante la registrazione automatica dei membri -DescADHERENT_EMAIL_TEMPLATE_MEMBER_VALIDATION=Email template to use to send email to a member on member validation -DescADHERENT_EMAIL_TEMPLATE_SUBSCRIPTION=Modello e-mail da utilizzare per inviare e-mail a un membro sulla nuova registrazione del contributo -DescADHERENT_EMAIL_TEMPLATE_REMIND_EXPIRATION=Modello e-mail da utilizzare per inviare promemoria via e-mail quando il contributo sta per scadere -DescADHERENT_EMAIL_TEMPLATE_CANCELATION=Email template to use to send email to a member on member cancelation -DescADHERENT_EMAIL_TEMPLATE_EXCLUSION=Modello e-mail da utilizzare per inviare e-mail a un membro sull'esclusione dei membri -DescADHERENT_MAIL_FROM=Sender Email for automatic emails +DescADHERENT_EMAIL_TEMPLATE_MEMBER_VALIDATION=Modello email da utilizzare per inviare email ad un membro al momento della convalida del membro +DescADHERENT_EMAIL_TEMPLATE_SUBSCRIPTION=Modello email da utilizzare per inviare e-mail a un membro sulla nuova registrazione del contributo +DescADHERENT_EMAIL_TEMPLATE_REMIND_EXPIRATION=Modello email da utilizzare per inviare promemoria via e-mail quando il contributo sta per scadere +DescADHERENT_EMAIL_TEMPLATE_CANCELATION=Modello email da utilizzare per inviare email a un membro in caso di cancellazione del membro +DescADHERENT_EMAIL_TEMPLATE_EXCLUSION=Modello email da utilizzare per inviare e-mail a un membro sull'esclusione dei membri +DescADHERENT_MAIL_FROM=Email mittente per email automatiche DescADHERENT_ETIQUETTE_TYPE=Formato etichette DescADHERENT_ETIQUETTE_TEXT=Testo da stampare nel campo indirizzo di un membro DescADHERENT_CARD_TYPE=Tipo di formato della scheda membro @@ -163,20 +163,20 @@ DescADHERENT_CARD_HEADER_TEXT=Testo dell'intestazione della scheda membro DescADHERENT_CARD_TEXT=Testo della scheda membro DescADHERENT_CARD_TEXT_RIGHT=Testo della scheda membro (allineato a destra) DescADHERENT_CARD_FOOTER_TEXT=Testo del footer fondo della scheda membro -ShowTypeCard=Visualizza la scheda dei tipi -HTPasswordExport=Esporta htpassword +ShowTypeCard=Tipo di spettacolo '%s' +HTPasswordExport=Generazione file htpassword NoThirdPartyAssociatedToMember=Nessuna terza parte associata a questo membro MembersAndSubscriptions=Membri e contributi MoreActions=Azioni complementari alla registrazione MoreActionsOnSubscription=Azione complementare suggerita di default in sede di registrazione di un contributo, effettuata anche in automatico al momento del pagamento online di un contributo -MoreActionBankDirect=Create a direct entry on bank account -MoreActionBankViaInvoice=Create an invoice, and a payment on bank account +MoreActionBankDirect=Crea una registrazione diretta sul conto corrente bancario +MoreActionBankViaInvoice=Crea una fattura ed un pagamento sul conto bancario MoreActionInvoiceOnly=Creare una fattura senza pagamento LinkToGeneratedPages=Generazione di biglietti da visita o fogli di indirizzi LinkToGeneratedPagesDesc=Questa schermata permette di generare file PDF contenenti i biglietti da visita di tutti i membri o di un determinato membro. -DocForAllMembersCards=Genera schede per tutti i membri (formato di output impostato: %s) -DocForOneMemberCards=Genera scheda per un membro (formato di output impostato: %s) -DocForLabels=Genera etichette con indirizzi (formato di output impostato: %s) +DocForAllMembersCards=Genera biglietti da visita per tutti i membri +DocForOneMemberCards=Genera biglietti da visita per un particolare membro +DocForLabels=Genera etichette con indirizzo SubscriptionPayment=Pagamento del contributo LastSubscriptionDate=Data dell'ultimo versamento del contributo LastSubscriptionAmount=Importo dell'ultimo contributo @@ -207,28 +207,28 @@ NbOfSubscriptions=Numero di contributi AmountOfSubscriptions=Importo raccolto dai contributi TurnoverOrBudget=Giro d'affari (aziende) o Budget (fondazione) DefaultAmount=Importo predefinito del contributo -CanEditAmount=Subscription amount is free -CanEditAmountDetail=Visitor can choose/edit amount of its contribution regardless of the member type -AmountIsLowerToMinimumNotice=sur un dû total de %s -MEMBER_NEWFORM_PAYONLINE=After the online registration, switch automatically on the online payment page -ByProperties=By nature -MembersStatisticsByProperties=Members statistics by nature +CanEditAmount=L'importo dell'abbonamento è gratuito +CanEditAmountDetail=Il visitatore può scegliere/modificare l'importo del suo contributo indipendentemente dal tipo di membro +AmountIsLowerToMinimumNotice=su un totale dovuto di %s +MEMBER_NEWFORM_PAYONLINE=Dopo la registrazione online, passa automaticamente alla pagina di pagamento online +ByProperties=Per natura +MembersStatisticsByProperties=Statistiche dei membri per natura VATToUseForSubscriptions=Aliquota IVA da utilizzare per i contributi NoVatOnSubscription=Nessuna IVA per i contributi ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS=Prodotto utilizzato per riga contributi in fattura: %s -NameOrCompany=Name or company +NameOrCompany=Nome o Società SubscriptionRecorded=Contributo registrato -NoEmailSentToMember=No email sent to member -EmailSentToMember=Email sent to member at %s +NoEmailSentToMember=Nessuna email inviata al membro +EmailSentToMember=Email inviata al membro a %s SendReminderForExpiredSubscriptionTitle=Invia promemoria via e-mail per i contributi scaduti SendReminderForExpiredSubscription=Invia promemoria via e-mail ai membri quando il contributo sta per scadere (il parametro è il numero di giorni prima della fine dell'iscrizione per inviare il promemoria. Può essere un elenco di giorni separati da un punto e virgola, ad esempio '10;5;0;-5 ') MembershipPaid=Membership paid for current period (until %s) -YouMayFindYourInvoiceInThisEmail=You may find your invoice attached to this email -XMembersClosed=%s member(s) closed -XExternalUserCreated=%s utenti esterni creati +YouMayFindYourInvoiceInThisEmail=Potresti trovare la tua fattura allegata a questa email +XMembersClosed=%s membro(i) chiusi +XExternalUserCreated=%s utente(i) esterni creati ForceMemberNature=Natura del membro forzato (individuo o società) CreateDolibarrLoginDesc=La creazione di un login utente per i membri consente loro di connettersi all'applicazione. A seconda delle autorizzazioni concesse, potranno, ad esempio, consultare o modificare autonomamente il proprio fascicolo. CreateDolibarrThirdPartyDesc=Una terza parte è la persona giuridica che verrà utilizzata nella fattura se si decide di generare la fattura per ogni contributo. Potrai crearlo in seguito durante il processo di registrazione del contributo. MemberFirstname=Nome del membro MemberLastname=Cognome membro -MemberCodeDesc=Member Code, unique for all members +MemberCodeDesc=Codice Socio, unico per tutti i soci diff --git a/htdocs/langs/it_IT/productbatch.lang b/htdocs/langs/it_IT/productbatch.lang index 89144d3a587..cf56cc12698 100644 --- a/htdocs/langs/it_IT/productbatch.lang +++ b/htdocs/langs/it_IT/productbatch.lang @@ -17,8 +17,9 @@ printBatch=Lotto/numero di serie: %s printEatby=Consumare entro: %s printSellby=Da vendere entro: %s printQty=Quantità: %d +printPlannedWarehouse=Magazzino: %s AddDispatchBatchLine=Aggiungi una riga per la durata a scaffale -WhenProductBatchModuleOnOptionAreForced=When module Lot/Serial is on, automatic stock decrease is forced to 'Decrease real stocks on shipping validation' and automatic increase mode is forced to 'Increase real stocks on manual dispatching into warehouses' and can't be edited. Other options can be defined as you want. +WhenProductBatchModuleOnOptionAreForced=Quando il modulo Lotti di prodotto è attivo, la modalità di diminuzione delle scorte è forzata al valore "Diminuire le scorte fisiche/reali alla convalida della spedizione" e la modalità di incremento delle scorte è automaticamente forzata al valore "Aumentare le scorte reali alla ricezione manuale nel magazzino, dopo la ricezione della merce dall'ordine fornitore". Tali valori non possono essere modificati. Le altre opzioni possono essere definite come preferisci. ProductDoesNotUseBatchSerial=Questo prodotto non usa lotto/numero di serie ProductLotSetup=Configurazione del modulo lotto/numero di serie ShowCurrentStockOfLot=Mostra la scorta disponibile per la coppia prodotto/lotto diff --git a/htdocs/langs/it_IT/receptions.lang b/htdocs/langs/it_IT/receptions.lang index 8549d23a51e..e7c43fed2d1 100644 --- a/htdocs/langs/it_IT/receptions.lang +++ b/htdocs/langs/it_IT/receptions.lang @@ -1,54 +1,54 @@ # Dolibarr language file - Source file is en_US - receptions -ReceptionDescription=Gestione accoglienza fornitori (Crea documenti di accoglienza) -ReceptionsSetup=Configurazione della reception del fornitore -RefReception=Ref. reception -Reception=In ricezione -Receptions=Receptions -AllReceptions=All Receptions -Reception=In ricezione -Receptions=Receptions -ShowReception=Show Receptions -ReceptionsArea=Receptions area -ListOfReceptions=List of receptions -ReceptionMethod=Reception method +ReceptionDescription=Gestione ricezione prodotti (Crea documenti di ricezione) +ReceptionsSetup=Configurazione ricezione prodotti +RefReception=Rif. ricezione +Reception=Ricezione +Receptions=Ricezioni +AllReceptions=Tutte le ricezioni +Reception=Ricezione +Receptions=Ricezioni +ShowReception=Mostra Ricezioni +ReceptionsArea=Area ricezioni +ListOfReceptions=Lista ricezioni +ReceptionMethod=Modalità ricezione LastReceptions=Ultime %s ricezioni -StatisticsOfReceptions=Statistics for receptions +StatisticsOfReceptions=Statitiche ricezioni NbOfReceptions=Numero di ricezioni NumberOfReceptionsByMonth=Numero di ricezioni per mese -ReceptionCard=Reception card -NewReception=New reception -CreateReception=Create reception -QtyInOtherReceptions=Qty in other receptions -OtherReceptionsForSameOrder=Other receptions for this order +ReceptionCard=Ricezione prodotti +NewReception=Nuova ricezione +CreateReception=Crea ricezione +QtyInOtherReceptions=Qtà altre ricezioni +OtherReceptionsForSameOrder=Altre ricezioni per questo ordine ReceptionsAndReceivingForSameOrder=Ricezioni per questo ordine -ReceptionsToValidate=Receptions to validate +ReceptionsToValidate=Ricezioni da validare StatusReceptionCanceled=Annullata StatusReceptionDraft=Bozza StatusReceptionValidated=Convalidato (prodotti da ricevere o già ricevuti) StatusReceptionValidatedToReceive=Convalidato (prodotti da ricevere) StatusReceptionValidatedReceived=Convalidato (prodotti ricevuti) -StatusReceptionProcessed=Processato +StatusReceptionProcessed=Elaborato StatusReceptionDraftShort=Bozza StatusReceptionValidatedShort=Convalidato -StatusReceptionProcessedShort=Processato -ReceptionSheet=Reception sheet -ConfirmDeleteReception=Are you sure you want to delete this reception? -ConfirmValidateReception=Are you sure you want to validate this reception with reference %s? -ConfirmCancelReception=Are you sure you want to cancel this reception? -StatsOnReceptionsOnlyValidated=Statistics conducted on receptions only validated. Date used is date of validation of reception (planed delivery date is not always known). -SendReceptionByEMail=Send reception by email -SendReceptionRef=Submission of reception %s -ActionsOnReception=Events on reception +StatusReceptionProcessedShort=Elaborato +ReceptionSheet=Foglio ricezione +ValidateReception=Convalida ricezione +ConfirmDeleteReception=Confermi elminazione ricezione? +ConfirmValidateReception=Confermi validazione ricezione %s ? +ConfirmCancelReception=Confermi annullamento ricezione? +StatsOnReceptionsOnlyValidated=Statitiche solo per ricezioni validate. La data utilizzata è la data di convalida della ricezione (la data di consegna pianificata non è sempre nota). +SendReceptionByEMail=Invia ricezione via e-mail +SendReceptionRef=Invio della ricezione %s +ActionsOnReception=Azioni sulla ricezione ReceptionCreationIsDoneFromOrder=Per il momento, la creazione di una nuova ricezione avviene dall'Ordine di Acquisto. -ReceptionLine=Reception line +ReceptionLine=Riga ricezione ProductQtyInReceptionAlreadySent=Quantità del prodotto dall'ordine cliente aperto già inviato ProductQtyInSuppliersReceptionAlreadyRecevied=Quantità prodotto dall'ordine fornitore aperto già ricevuto -ValidateOrderFirstBeforeReception=You must first validate the order before being able to make receptions. -ReceptionsNumberingModules=Numbering module for receptions -ReceptionsReceiptModel=Document templates for receptions +ValidateOrderFirstBeforeReception=E' necessario validare l'ordine prima di poter creare ricezioni. +ReceptionsNumberingModules=Modulo per la generazione codici ricezione +ReceptionsReceiptModel=Modelli generazione documenti NoMorePredefinedProductToDispatch=Non ci sono più prodotti predefiniti da spedire -ReceptionExist=Esiste un ricevimento -ByingPrice=Prezzo di vendita -ReceptionBackToDraftInDolibarr=Ricevimento %s torna alla bozza -ReceptionClassifyClosedInDolibarr=Ricevimento %s classificato Chiuso -ReceptionUnClassifyCloseddInDolibarr=Ricevimento %s ri-aperto +ReceptionExist=Esiste una ricezione +ReceptionBackToDraftInDolibarr=Ricezione %s ritornato a bozza +ReceptionClassifyClosedInDolibarr=Ricezione %s classificato Chiusa +ReceptionUnClassifyCloseddInDolibarr=Ricezione %s ri-aperta diff --git a/htdocs/langs/it_IT/stocks.lang b/htdocs/langs/it_IT/stocks.lang index 5d1fa64bef9..b887f5a223e 100644 --- a/htdocs/langs/it_IT/stocks.lang +++ b/htdocs/langs/it_IT/stocks.lang @@ -74,17 +74,17 @@ QtyDispatched=Quantità ricevuta QtyDispatchedShort=Q.ta ricevuta QtyToDispatchShort=Q.ta da ricevere OrderDispatch=Ricezione prodotti -RuleForStockManagementDecrease=Choose Rule for automatic stock decrease (manual decrease is always possible, even if an automatic decrease rule is activated) -RuleForStockManagementIncrease=Choose Rule for automatic stock increase (manual increase is always possible, even if an automatic increase rule is activated) +RuleForStockManagementDecrease=Seleziona la regola per la diminuzione automatica delle scorte (la diminuzione manuale è sempre possibile, anche se la diminuzione automatica è attivata). +RuleForStockManagementIncrease=Seleziona la regola per l'incremento automatico delle scorte (l'incremento manuale è sempre possibile, anche se l'incremento automatico è attivato). DeStockOnBill=Diminuire le scorte fisiche/reali alla convalida della fattura attiva / nota di credito DeStockOnValidateOrder=Diminuire le scorte fisiche/reali alla convalida degli ordini cliente DeStockOnShipment=Diminuire le scorte fisiche/reali alla convalida della spedizione DeStockOnShipmentOnClosing=Diminuire le scorte fisiche/reali quando la spedizione viene chiusa. -ReStockOnBill=Increase real stocks on validation of vendor invoice/credit note +ReStockOnBill=Aumentare le scorte reali alla convalida delle fatture/note di credito fornitore ReStockOnValidateOrder=Aumenta scorte effettive all'approvazione dell'ordine fornitore ReStockOnDispatchOrder=Aumentare le scorte reali durante la ricezione manuale in magazzino, dopo il ricevimento della merce dell'ordine fornitore -StockOnReception=Increase real stocks on validation of reception -StockOnReceptionOnClosing=Increase real stocks when reception is set to closed +StockOnReception=Aumentare le scorte reali alla convalida della ricezione +StockOnReceptionOnClosing=Aumentare le scorte reali quando la ricezione viene chiusa OrderStatusNotReadyToDispatch=Lo stato dell'ordine non ne consente la spedizione dei prodotti a magazzino. StockDiffPhysicTeoric=Explanation for difference between physical and virtual stock NoPredefinedProductToDispatch=Per l'oggetto non ci sono prodotti predefiniti. Quindi non è necessario alterare le scorte. @@ -153,9 +153,9 @@ RecordMovements=Record stock movements ReceivingForSameOrder=Ricezioni per questo ordine StockMovementRecorded=Movimentazione di scorte registrata RuleForStockAvailability=Regole sulla fornitura delle scorte -StockMustBeEnoughForInvoice=Stock level must be enough to add product/service to invoice (check is done on current real stock when adding a line into invoice whatever the rule for automatic stock change) -StockMustBeEnoughForOrder=Stock level must be enough to add product/service to order (check is done on current real stock when adding a line into order whatever the rule for automatic stock change) -StockMustBeEnoughForShipment= Stock level must be enough to add product/service to shipment (check is done on current real stock when adding a line into shipment whatever the rule for automatic stock change) +StockMustBeEnoughForInvoice=Il livello delle scorte deve essere sufficiente per aggiungere prodotti/servizi alla fattura (il controllo viene eseguito sulle scorte reali correnti quando si aggiunge una riga alla fattura, qualunque sia la regola per il cambio automatico delle scorte) +StockMustBeEnoughForOrder=Il livello delle scorte deve essere sufficiente per aggiungere prodotti/servizi all'ordine (il controllo viene eseguito sulle scorte reali correnti quando si aggiunge una riga all'ordine, qualunque sia la regola per il cambio automatico delle scorte) +StockMustBeEnoughForShipment= Il livello delle scorte deve essere sufficiente per aggiungere prodotti/servizi alla spedizione (il controllo viene eseguito sulle scorte reali correnti quando si aggiunge una riga alla spedizione, qualunque sia la regola per il cambio automatico delle scorte) MovementLabel=Etichetta per lo spostamento di magazzino TypeMovement=Direzione del movimento DateMovement=Date of movement diff --git a/htdocs/langs/it_IT/stripe.lang b/htdocs/langs/it_IT/stripe.lang index 39246086656..ca8d10a6cc2 100644 --- a/htdocs/langs/it_IT/stripe.lang +++ b/htdocs/langs/it_IT/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Webhook live key ONLINE_PAYMENT_WAREHOUSE=Stock to use for stock decrease when online payment is done
    (TODO When option to decrease stock is done on an action on invoice and the online payment generate itself the invoice ?) StripeLiveEnabled=Stripe live enabled (otherwise test/sandbox mode) StripeImportPayment=Importa pagamenti Stripe -ExampleOfTestCreditCard=Example of credit card for test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +ExampleOfTestBankAcountForSEPA=Example of bank account BAN for direct debit test: %s StripeGateways=Stripe gateways OAUTH_STRIPE_TEST_ID=Stripe Connect Client ID (ca_...) OAUTH_STRIPE_LIVE_ID=Stripe Connect Client ID (ca_...) @@ -70,5 +71,8 @@ ToOfferALinkForLiveWebhook=Link to setup Stripe WebHook to call the IPN (live mo PaymentWillBeRecordedForNextPeriod=Payment will be recorded for the next period. ClickHereToTryAgain=Clicca qui per riprovare... CreationOfPaymentModeMustBeDoneFromStripeInterface=A causa delle forti regole di autenticazione del cliente, la creazione di una carta deve essere effettuata dal backoffice di Stripe. È possibile fare clic qui per attivare il record cliente Stripe: %s -TERMINAL_LOCATION=Location (address) for terminals +STRIPE_CARD_PRESENT=Card Present for Stripe Terminals +TERMINAL_LOCATION=Location (address) for Stripe Terminals RequestDirectDebitWithStripe=Request Direct Debit with Stripe +STRIPE_SEPA_DIRECT_DEBIT=Enable the Direct Debit payments through Stripe + diff --git a/htdocs/langs/it_IT/users.lang b/htdocs/langs/it_IT/users.lang index bc2975754e9..0862cfc82c8 100644 --- a/htdocs/langs/it_IT/users.lang +++ b/htdocs/langs/it_IT/users.lang @@ -47,7 +47,7 @@ RemoveFromGroup=Rimuovi dal gruppo PasswordChangedAndSentTo=Password cambiata ed inviata a %s PasswordChangeRequest=Richiesta di modifica della password per %s PasswordChangeRequestSent=Richiesta di cambio password per %s da inviare a %s. -IfLoginExistPasswordRequestSent=Se questo accesso è un account valido, è stata inviata un'e-mail per reimpostare la password. +IfLoginExistPasswordRequestSent=If this login is a valid account (with a valid email), an email to reset password has been sent. IfEmailExistPasswordRequestSent=Se questa e-mail è un account valido, è stata inviata un'e-mail per reimpostare la password. ConfirmPasswordReset=Conferma la reimpostazione della password MenuUsersAndGroups=Utenti e gruppi @@ -66,9 +66,9 @@ LinkedToDolibarrUser=Collegamento all'utente LinkedToDolibarrThirdParty=Collegamento a terze parti CreateDolibarrLogin=Crea accesso a Dolibarr CreateDolibarrThirdParty=Crea soggetto terzo -LoginAccountDisableInDolibarr=Account disattivato in Dolibarr +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Usa valore personalizzato -InternalUser=Utente interno ExportDataset_user_1=Utenti e dettagli DomainUser=Utente di dominio %s Reactivate=Riattiva @@ -128,3 +128,8 @@ DateLastLogin=Data ultimo accesso DatePreviousLogin=Data di accesso precedente IPLastLogin=IP ultimo accesso IPPreviousLogin=IP di accesso precedente +ShowAllPerms=Show all permission rows +HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/ja_JP/accountancy.lang b/htdocs/langs/ja_JP/accountancy.lang index 8642dc56164..58b090cb9a0 100644 --- a/htdocs/langs/ja_JP/accountancy.lang +++ b/htdocs/langs/ja_JP/accountancy.lang @@ -101,7 +101,8 @@ ShowAccountingAccount=勘定科目を表示 ShowAccountingJournal=仕訳日記帳を表示 ShowAccountingAccountInLedger=元帳で勘定科目を表示 ShowAccountingAccountInJournals=日記帳で勘定科目を表示 -AccountAccountingSuggest=示唆された勘定科目 +DataUsedToSuggestAccount=アカウントの提案に使用されるデータ +AccountAccountingSuggest=アカウントが提案された MenuDefaultAccounts=規定の科目 MenuBankAccounts=銀行口座 MenuVatAccounts=消費税科目 @@ -126,6 +127,7 @@ WriteBookKeeping=会計での取引の記録 Bookkeeping=元帳 BookkeepingSubAccount=補助元帳 AccountBalance=勘定残高 +AccountBalanceSubAccount=サブアカウントの残高 ObjectsRef=ソースオブジェクト参照 CAHTF=税引前の合計購入ベンダー TotalExpenseReport=総経費報告書 @@ -160,8 +162,8 @@ ACCOUNTING_LENGTH_GACCOUNT=一般勘定科目の長さ(ここで値を6に設定 ACCOUNTING_LENGTH_AACCOUNT=取引先の勘定科目の長さ(ここで値を6に設定すると、科目「401」は画面に「401000」のように表示される) ACCOUNTING_MANAGE_ZERO=勘定科目の最後に異なる数のゼロを管理できるようにする。一部の国(スイスなど)で必要。オフ(デフォルト)に設定すると、次の2つのパラメーターを設定して、アプリケーションに仮想ゼロを追加するように要求できる。 BANK_DISABLE_DIRECT_INPUT=銀行口座での取引の直接記録を無効にする -ACCOUNTING_ENABLE_EXPORT_DRAFT_JOURNAL=仕訳帳で下書きエクスポートを有効にする -ACCOUNTANCY_COMBO_FOR_AUX=子会社アカウントのコンボリストを有効にする (取引先が多数あると遅くなるだろうし、値の一部検索機能は壊れる) +ACCOUNTING_ENABLE_EXPORT_DRAFT_JOURNAL=仕訳帳で下書きエクスポートを有効化 +ACCOUNTANCY_COMBO_FOR_AUX=子会社アカウントのコンボリストを有効化 (取引先が多数あると遅くなるだろうし、値の一部検索機能は壊れる) ACCOUNTING_DATE_START_BINDING=会計で結合と転記を開始する日付を定義する。この日付を下回ると、取引は会計に転記されない。 ACCOUNTING_DEFAULT_PERIOD_ON_TRANSFER=会計転送では、デフォルトで選択される期間は何か @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=顧客預金を登録するためのデフ UseAuxiliaryAccountOnCustomerDeposit=顧客アカウントを頭金ラインの補助元帳に個人アカウントとして保存する(無効にした場合、頭金ラインの個人アカウントは空のままになる) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=デフォルトとして使用される勘定科目 (勘定科目表から) UseAuxiliaryAccountOnSupplierDeposit=仕入先勘定を、前払明細の補助元帳に個別勘定として保管する (無効にすると、前払明細の個別勘定は空のままになる)。 +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=顧客保有保証を登録するためのデフォルトのアカウンティング アカウント ACCOUNTING_PRODUCT_BUY_ACCOUNT=同じ国内で購入された製品のデフォルト アカウントとして使用されるアカウント (アカウント チャートから) (製品シートで定義されていない場合に使用) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=EEC から別の EEC 国に購入された製品のデフォルト アカウントとして使用されるアカウント (アカウント チャートから) (製品シートで定義されていない場合に使用) @@ -218,6 +221,7 @@ JournalLabel=仕訳帳ラベル NumPiece=個数番号 TransactionNumShort=数トランザクション AccountingCategory=アカウントのカスタム グループ +AccountingCategories=アカウントのカスタム グループ GroupByAccountAccounting=総勘定元帳勘定によるグループ化 GroupBySubAccountAccounting=補助元帳アカウントでグループ化 AccountingAccountGroupsDesc=ここで、勘定科目のいくつかのグループを定義できる。それらは、パーソナライズされた会計報告書sに使用される。 @@ -265,6 +269,7 @@ ShowSubtotalByGroup=レベルごとに小計を表示 Pcgtype=勘定科目のグループ PcgtypeDesc=科目のグループは、一部の会計報告書sの事前定義された「フィルタ」および「グループ化」基準として使用される。たとえば、「INCOME」または「EXPENSE」は、費用/収入報告書sを作成するための製品の勘定科目のグループとして使用される。 +AccountingCategoriesDesc=アカウントのカスタム グループを使用して、会計アカウントを 1 つの名前にグループ化し、フィルターの使用やカスタム レポートの作成を容易にすることができる。 Reconcilable=調整可能 @@ -294,6 +299,7 @@ DescValidateMovements=書き込み、レタリング、削除の変更または ValidateHistory=自動的に結合 AutomaticBindingDone=自動結合が実行された(%s)-一部のレコードでは自動結合不可(%s) +DoManualBindingForFailedRecord=自動的にリンクされない %s 行(s)を手動でリンクする必要がある。 ErrorAccountancyCodeIsAlreadyUse=エラー、この勘定科目表は使用されているため、削除または無効化できない MvtNotCorrectlyBalanced=動きのバランスが正しくない。借方=%s&貸方= %s @@ -336,12 +342,14 @@ NumberOfAccountancyMovements=楽章の数 ACCOUNTING_DISABLE_BINDING_ON_SALES=販売の会計における結合と転記を無効にする(顧客の請求書は会計に考慮されない) ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=購入時の会計における結合と転記を無効にする(ベンダーの請求書は会計で考慮されない) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=経費報告書sの会計における結合と転記を無効にする(経費報告書sは会計で考慮されない) -ACCOUNTING_ENABLE_LETTERING=会計でレタリング機能を有効にする +ACCOUNTING_ENABLE_LETTERING=会計でレタリング機能を有効化 +ACCOUNTING_ENABLE_AUTOLETTERING=会計への転送時に自動レタリングを有効化 ## Export NotExportLettering=ファイルの生成時にレタリングをエクスポートしない NotifiedExportDate=エクスポートされた行にエクスポート済みのフラグを付ける(行を変更するには、トランザクション全体を削除して、会計に再転送する必要がある) NotifiedValidationDate=エクスポートされたエントリを検証してロックする(「%s」機能と同じ効果、行の変更と削除は絶対に不可) +NotifiedExportFull=ドキュメントをエクスポートするか? DateValidationAndLock=日付の検証とロック ConfirmExportFile=会計エクスポートファイルの生成を確定するか? ExportDraftJournal=下書き仕訳帳のエクスポート @@ -398,7 +406,7 @@ SaleLocal=ローカルセール SaleExport=エクスポート販売 SaleEEC=EECでの販売 SaleEECWithVAT=VATがnullではないEECでの販売。したがって、これは域内販売ではなく、提案された科目は標準の製品科目であると想定する。 -SaleEECWithoutVATNumber=VATなしのEECでの販売 が、取引先のVATIDは定義されていない。標準販売の製品科目にフォールバックする。必要に応じて、取引先または製品科目のVATIDを修正できる。 +SaleEECWithoutVATNumber=VAT なしの EEC での販売ですが、サードパーティの VAT ID は定義されていない。標準販売のアカウントにフォールバックする。必要に応じて、サードパーティの VAT ID を修正するか、バインディング用に提案された製品アカウントを変更できる。 ForbiddenTransactionAlreadyExported=禁止:トランザクションは検証済 かつ/または エクスポート済。 ForbiddenTransactionAlreadyValidated=禁止:トランザクションは検証済。 ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=調整コードの不一致 AccountancyErrorMismatchBalanceAmount=残高(%s)が0に等しくない AccountancyErrorLetteringBookkeeping=トランザクションに関してエラーが発生しました:%s ErrorAccountNumberAlreadyExists=会計番号%sはすでに存在する +ErrorArchiveAddFile=「%s」ファイルをアーカイブに入れることができない ## Import ImportAccountingEntries=会計仕訳 @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=他通貨 コード (Idevise) DateExport=日付のエクスポート WarningReportNotReliable=警告、この報告書は元帳に基づいていないため、元帳で手動で変更されたトランザクションは含まれていない。仕訳帳化が最新の場合、簿記ビューはより正確。 ExpenseReportJournal=経費報告仕訳帳 +DocsAlreadyExportedAreExcluded=すでにエクスポートされたドキュメントは除外される +ClickToHideAlreadyExportedLines=クリックして、すでにエクスポートされた行を非表示にする NAccounts=%sアカウント diff --git a/htdocs/langs/ja_JP/admin.lang b/htdocs/langs/ja_JP/admin.lang index 58b770f7e93..aa27c33f9fc 100644 --- a/htdocs/langs/ja_JP/admin.lang +++ b/htdocs/langs/ja_JP/admin.lang @@ -48,8 +48,8 @@ DBSortingCharset=データソート用のデータベース·キャラセット HostCharset=ホストのキャラセット ClientCharset=クライアントのキャラセット ClientSortingCharset=クライアントの文字照合則 -WarningModuleNotActive=モジュール%sを有効にする必要がある -WarningOnlyPermissionOfActivatedModules=ここには、有効化されたモジュールに関連する権限のみが表示される。ホーム->設定->モジュール ページで他のモジュールを有効化できる。 +WarningModuleNotActive=モジュール%sを有効化する必要がある +WarningOnlyPermissionOfActivatedModules=ここには、活性化済モジュールに関連する権限のみが表示される。ホーム->設定->モジュール ページで他のモジュールを活性化できる。 DolibarrSetup=Dolibarrインストールまたはアップグレード InternalUsers=内部ユーザ ExternalUsers=外部ユーザ @@ -58,7 +58,7 @@ GUISetup=表示 SetupArea=設定 UploadNewTemplate=新規テンプレート(s)をアップロード FormToTestFileUploadForm=ファイルのアップロードをテストするために形成する ( 設定に応じて ) -ModuleMustBeEnabled=モジュール/アプリケーション%sを有効にする必要がある +ModuleMustBeEnabled=モジュール/アプリケーション%sを有効化する必要がある ModuleIsEnabled=モジュール/アプリケーション%sが有効になった IfModuleEnabled=注:【はい】が利用可能なのは、モジュール%sの有効時のみ RemoveLock=ファイル%s が存在する場合、それを削除/改名することで、更新/インストール のツールが使用可能になる。 @@ -235,9 +235,9 @@ DevelopYourModuleDesc=独自のモジュールを開発するためのいくつ URL=URL RelativeURL=相対URL BoxesAvailable=利用可能ウィジェット -BoxesActivated=有効化済ウィジェット -ActivateOn=で有効化 -ActiveOn=で有効化済 +BoxesActivated=活性化済ウィジェット +ActivateOn=で活性化 +ActiveOn=で活性化済 ActivatableOn=でアクティブ化可能 SourceFile=ソースファイル AvailableOnlyIfJavascriptAndAjaxNotDisabled=JavaScriptが無効になっていない場合にのみ使用可能 @@ -245,8 +245,8 @@ Required=必須 UsedOnlyWithTypeOption=一部の議題オプションでのみ使用 Security=セキュリティー Passwords=パスワード -DoNotStoreClearPassword=データベースに保存されているパスワードを暗号化する ( プレーンテキストとしてではない ) 。このオプションを有効化することを強くお勧めする。 -MainDbPasswordFileConfEncrypted=conf.phpに保存されているデータベースパスワードを暗号化する。このオプションを有効化することを強くお勧めする。 +DoNotStoreClearPassword=データベースに保存されているパスワードを暗号化する ( プレーンテキストとしてではない ) 。このオプションを活性化することを強くお勧めする。 +MainDbPasswordFileConfEncrypted=conf.phpに保存されているデータベースパスワードを暗号化する。このオプションを活性化することを強くお勧めする。 InstrucToEncodePass=パスワードをconf.php ファイルにエンコードするには、行
    $ dolibarr_main_db_pass = "..."を置き換える。
    by
    $ dolibarr_main_db_pass = "crypted:%s"; InstrucToClearPass=パスワードをconf.php ファイルにデコード ( クリア ) するには、行
    $ dolibarr_main_db_pass = "crypted:...";を置き換える。
    by
    $ dolibarr_main_db_pass = "%s"; ProtectAndEncryptPdfFiles=生成されたPDFファイルを保護する。大量のPDF生成が中断されるため、これはお勧めしない。 @@ -400,7 +400,7 @@ ThemeDir=スキンディレクトリ ConnectionTimeout=接続タイムアウト ResponseTimeout=応答タイムアウト SmsTestMessage=_人のPHONEFROM__から__までのテストメッセージPHONETO__ -ModuleMustBeEnabledFirst=この機能が必要な場合は、モジュール %sを最初に有効にする必要がある。 +ModuleMustBeEnabledFirst=この機能が必要な場合は、モジュール %sを最初に有効化する必要がある。 SecurityToken=セキュリティで保護されたURLへの鍵 NoSmsEngine=利用可能なSMS送信者マネージャーはない。 SMS送信者マネージャーは、外部仕入先に依存しているため、デフォルトのディストリビューションではインストールされないが、%sで見つけることができる。 PDF=PDF @@ -483,7 +483,7 @@ EraseAllCurrentBarCode=現在のバーコード値をすべて消去する ConfirmEraseAllCurrentBarCode=現在のバーコード値をすべて消去してもよいか? AllBarcodeReset=全バーコード値が削除された NoBarcodeNumberingTemplateDefined=バーコードモジュールの設定で採番バーコードテンプレートが有効でない。 -EnableFileCache=ファイルキャッシュを有効にする +EnableFileCache=ファイルキャッシュを有効化 ShowDetailsInPDFPageFoot=法人の住所やマネージャーの名前 ( 職業分類IDに加えて、法人の資本金、VAT番号 ) などの詳細をフッターに追加する。 NoDetails=フッターに追加の詳細はない DisplayCompanyInfo=法人の住所を表示する @@ -515,7 +515,7 @@ PageUrlForDefaultValues=ページURLの相対パスを入力する必要があ PageUrlForDefaultValuesCreate=
    例:
    新規取引先を作成するフォームの場合、 %s
    カスタムディレクトリにインストールされた外部モジュールのURLには、「custom /」を含めないため、custom/mymodule/mypage.phpではなく、 mymodule/mypage.phpのようなパスを使用する。
    URLに何らかのパラメータがある場合にのみデフォルト値が必要な場合は、 %sを使用できる。 PageUrlForDefaultValuesList=
    例:
    取引先を一覧表示するページの場合、 %s
    カスタムディレクトリにインストールされた外部モジュールのURLには、「custom /」を含めないため、custom/mymodule/mypagelist.phpではなくmymodule/mypagelist.phpのようなパスを使用する。
    URLに何らかのパラメータがある場合にのみデフォルト値が必要な場合は、 %sを使用できる。 AlsoDefaultValuesAreEffectiveForActionCreate=また、フォーム作成のデフォルト値の上書きは、正しく設計されたページに対してのみ機能することに注意すること ( したがって、パラメーターaction = createまたはpresend ...を使用 ) 。 -EnableDefaultValues=デフォルト値のカスタマイズを有効にする +EnableDefaultValues=デフォルト値のカスタマイズを有効化 EnableOverwriteTranslation=翻訳のカスタマイズを許可する GoIntoTranslationMenuToChangeThis=このコードのキーの翻訳が見つかりました。この値を変更するには、Home-Setup-translationから編集する必要がある。 WarningSettingSortOrder=警告、デフォルトのソート順を設定すると、フィールドが不明なフィールドの場合、リストページに移動するときに技術エラーが発生する可能性がある。このようなエラーが発生した場合は、このページに戻ってデフォルトの並べ替え順序を削除し、デフォルトの動作を復元すること。 @@ -531,11 +531,11 @@ FilesAttachedToEmail=ファイルを添付する SendEmailsReminders=メールで議題のリマインダーを送信する davDescription=WebDAVサーバーを設定する DAVSetup=モジュールDAVの設定 -DAV_ALLOW_PRIVATE_DIR=汎用非公開ディレクトリを有効にする ( 「private」という名前のWebDAV専用ディレクトリ-ログインが必要 ) +DAV_ALLOW_PRIVATE_DIR=汎用非公開ディレクトリを有効化 ( 「private」という名前のWebDAV専用ディレクトリ-ログインが必要 ) DAV_ALLOW_PRIVATE_DIRTooltip=汎用非公開ディレクトリは、アプリケーションのログイン/パスを使用して誰でもアクセスできるWebDAVディレクトリ。 -DAV_ALLOW_PUBLIC_DIR=汎用公開ディレクトリを有効にする ( 「public」という名前のWebDAV専用ディレクトリ-ログインは不要 ) +DAV_ALLOW_PUBLIC_DIR=汎用公開ディレクトリを有効化 ( 「public」という名前のWebDAV専用ディレクトリ-ログインは不要 ) DAV_ALLOW_PUBLIC_DIRTooltip=汎用公開ディレクトリは、誰でも ( 読取りおよび書き込みモードで ) アクセスできるWebDAVディレクトリであり、認証は必要ない ( ログイン/パスワードアカウント ) 。 -DAV_ALLOW_ECM_DIR=DMS / ECM非公開ディレクトリを有効にする ( DMS / ECMモジュールのルートディレクトリ-ログインが必要 ) +DAV_ALLOW_ECM_DIR=DMS / ECM非公開ディレクトリを有効化 ( DMS / ECMモジュールのルートディレクトリ-ログインが必要 ) DAV_ALLOW_ECM_DIRTooltip=DMS / ECMモジュールの使用時に全ファイルが手動でアップロードされるルートディレクトリ。同様に、Webインターフェイスからのアクセスと同様に、アクセスするには、適切な権限を持つ有効なログイン/パスワードが必要。 # Modules Module0Name=ユーザとグループ @@ -645,21 +645,25 @@ Module2300Name=スケジュールされたジョブ Module2300Desc=スケジュールされたジョブ管理 ( 別名cronまたはクロノテーブル ) Module2400Name=イベント/議題 Module2400Desc=トラック競技。追跡目的で自動イベントをログに記録するか、手動のイベントまたは会議を記録する。これは、優れた顧客または仕入先関係管理の主要なモジュール。 +Module2430Name=予約カレンダーシステム +Module2430Desc=事前に定義された範囲または空き状況に応じて、誰でもランデブーを予約できるオンライン カレンダーを提供する。 Module2500Name=DMS / ECM Module2500Desc=ドキュメント管理システム/電子コンテンツ管理。生成または保存されたドキュメントの自動編成。必要なときに共有すること。 Module2600Name=API・Webサービス(SOAPサーバー) -Module2600Desc=APIサービスを提供するDolibarrSOAPサーバーを有効にする +Module2600Desc=APIサービスを提供するDolibarrSOAPサーバーを有効化 Module2610Name=API / Web サービス (REST サーバー) -Module2610Desc=APIサービスを提供するDolibarrRESTサーバーを有効にする +Module2610Desc=APIサービスを提供するDolibarrRESTサーバーを有効化 Module2660Name=Webサービスの呼び出し ( SOAPクライアント ) -Module2660Desc=Dolibarr Webサービスクライアントを有効にする ( データ/要求を外部サーバーにプッシュするために使用できる。現在サポートされているのは購買発注のみ ) 。 +Module2660Desc=Dolibarr Webサービスクライアントを有効化 ( データ/要求を外部サーバーにプッシュするために使用できる。現在サポートされているのは購買発注のみ ) 。 Module2700Name=グラバター Module2700Desc=オンラインのGravatarサービス (www.gravatar.com) を使用して、ユーザ/構成員の写真を表示する ( メールに記載されている ) 。インターネットアクセスが必要 Module2800Desc=FTPクライアント Module2900Name=GeoIPMaxmind Module2900Desc=のGeoIP Maxmindの変換機能 Module3200Name=変更不可能なアーカイブ -Module3200Desc=ビジネスイベントの変更不可能なログを有効にする。イベントはリアルタイムでアーカイブされる。ログは、エクスポート可能な連鎖イベントの読取り専用テーブル。このモジュールは、国によっては必須の場合がある。 +Module3200Desc=ビジネスイベントの変更不可能なログを有効化。イベントはリアルタイムでアーカイブされる。ログは、エクスポート可能な連鎖イベントの読取り専用テーブル。このモジュールは、国によっては必須の場合がある。 +Module3300Name=モジュールビルダー +Module3200Desc=ビジネスイベントの変更不可能なログを有効化。イベントはリアルタイムでアーカイブされる。ログは、エクスポート可能な連鎖イベントの読取り専用テーブル。このモジュールは、国によっては必須の場合がある。 Module3400Name=ソーシャルネットワーク Module3400Desc=ソーシャルネットワークフィールドを取引先とアドレス(skype、twitter、facebookなど)に対して有効化する。 Module4000Name=HRM @@ -783,7 +787,7 @@ Permission153=口座振替の支払注文の送信/送信 Permission154=口座振替の支払注文のクレジット/拒否を記録する Permission161=契約/サブスクリプションを読込む Permission162=契約/サブスクリプションを作成/変更する -Permission163=契約のサービス/サブスクリプションを有効化する +Permission163=契約のサービス/サブスクリプションを活性化する Permission164=契約のサービス/サブスクリプションを無効にする Permission165=契約/サブスクリプションを削除する Permission167=契約をエクスポート @@ -811,7 +815,7 @@ Permission205=接続を管理する Permission206=接続を読込む Permission211=テレフォニーを読込む Permission212=注文明細行 -Permission213=ラインを有効化する +Permission213=ラインを活性化する Permission214=設定テレフォニー Permission215=設定·プロバイダー Permission221=emailingsを読込む @@ -1182,7 +1186,7 @@ LoginPage=ログインページ BackgroundImageLogin=背景画像 PermanentLeftSearchForm=左側のメニューの恒久的な検索フォーム DefaultLanguage=既定の言語 -EnableMultilangInterface=顧客または仕入先との関係に対する多言語サポートを有効にする +EnableMultilangInterface=顧客または仕入先との関係に対する多言語サポートを有効化 EnableShowLogo=メニューに法人のロゴを表示する CompanyInfo=法人/組織 CompanyIds=法人/組織のアイデンティティ @@ -1214,7 +1218,7 @@ Delays_MAIN_DELAY_ORDERS_TO_PROCESS=注文は処理されない Delays_MAIN_DELAY_SUPPLIER_ORDERS_TO_PROCESS=購買発注は処理されない Delays_MAIN_DELAY_PROPALS_TO_CLOSE=提案はクローズされていない Delays_MAIN_DELAY_PROPALS_TO_BILL=提案は請求されない -Delays_MAIN_DELAY_NOT_ACTIVATED_SERVICES=有効化するサービス +Delays_MAIN_DELAY_NOT_ACTIVATED_SERVICES=活性化するサービス Delays_MAIN_DELAY_RUNNING_SERVICES=期限切れのサービス Delays_MAIN_DELAY_SUPPLIER_BILLS_TO_PAY=未払いの仕入先の請求書 Delays_MAIN_DELAY_CUSTOMER_BILLS_UNPAYED=未払いの顧客請求書 @@ -1247,29 +1251,30 @@ BrowserOS=ブラウザOS ListOfSecurityEvents=Dolibarrセキュリティイベントのリスト SecurityEventsPurged=セキュリティイベントのパージ TrackableSecurityEvents=追跡可能なセキュリティ イベント -LogEventDesc=特定のセキュリティイベントのログを有効にする。管理者はメニュー%s-%sを介してログを記録する。警告、この機能はデータベースに大量のデータを生成する可能性がある。 +LogEventDesc=特定のセキュリティイベントのログを有効化。管理者はメニュー%s-%sを介してログを記録する。警告、この機能はデータベースに大量のデータを生成する可能性がある。 AreaForAdminOnly=設定パラメータは、管理者ユーザのみが設定できる。 SystemInfoDesc=システム情報では、読取り専用モードでのみ管理者の目に見える得るその他の技術情報。 SystemAreaForAdminOnly=この領域は、管理者ユーザのみが使用できる。 Dolibarrのユーザ権限は、この制限を変更できない。 CompanyFundationDesc=あなたの法人/組織の情報を編集する。完了したら、ページの下部にある「%s」ボタンをクリックする。 -MoreNetworksAvailableWithModule=「ソーシャル ネットワーク」モジュールを有効にすると、より多くのソーシャル ネットワークを利用できる場合がある。 +MoreNetworksAvailableWithModule=「ソーシャル ネットワーク」モジュールを有効化と、より多くのソーシャル ネットワークを利用できる場合がある。 AccountantDesc=外部の会計士/簿記係がいる場合は、ここでその情報を編集できる。 AccountantFileNumber=会計士コード DisplayDesc=アプリケーションの外観と表示に影響を与えるパラメータは、ここで変更できる。 AvailableModules=利用可能なアプリ/モジュール -ToActivateModule=モジュールを有効化するには、設定エリア ( ホーム - >設定 - >モジュール ) に行く。 +ToActivateModule=モジュールを活性化するには、設定エリア ( ホーム - >設定 - >モジュール ) に行く。 SessionTimeOut=セッションのタイムアウト SessionExplanation=この数値は、セッションクリーナーが内部PHPセッションクリーナーによって実行された場合 ( および他に何も実行されない場合 ) 、この遅延の前にセッションが期限切れにならないことを保証する。内部PHPセッションクリーナーは、この遅延後にセッションが期限切れになることを保証しない。この遅延の後、セッションクリーナーが実行されると期限切れになるので、全 %s / %s アクセス、他のセッションによるアクセス中のみ ( 値が0なら、セッションのクリアは外部処理によってのみ行われることを意味する ) 。
    注:外部セッションクリーニングメカニズム ( debianのcron、ubuntu ... ) を備えた一部のサーバーでは、ここに入力した値に関係なく、外部設定で定義された期間が経過するとセッションが破棄される可能性がある。 SessionsPurgedByExternalSystem=このサーバー上のセッションは、外部メカニズム ( debianの下のcron、ubuntu ... ) 、おそらく %s 秒 ( =パラメーターセッションの値changeing the value so.gc_maxlifetime a09a4b739f17f8 ) によってクリーンアップされているもよう。サーバー管理者にセッション遅延の変更を依頼する必要がある。 TriggersAvailable=使用可能なトリガ -TriggersDesc=トリガーは、ディレクトリ htdocs / core / triggersにコピーされるとDolibarrワークフローの動作を変更するファイル。それらは、Dolibarrイベントで有効化された新規アクション ( 新規法人の作成、請求書の検証など ) を実現する。 +TriggersDesc=トリガーは、ディレクトリ htdocs / core / triggersにコピーされるとDolibarrワークフローの動作を変更するファイル。それらは、新規アクション、Dolibarrイベントで活性化済 ( 新規法人の作成、請求書の検証など ) を実現する。 TriggerDisabledByName=このファイル内のトリガはその名前に-NORUNサフィックスは無効になっている。 TriggerDisabledAsModuleDisabled=モジュール%sが無効になっているとして、このファイル内のトリガーが無効になっている。 -TriggerAlwaysActive=このファイル内のトリガーは常に有効、有効化済Dolibarrモジュールであれば何でも。 +TriggerAlwaysActive=このファイル内のトリガーは常に有効、活性化済Dolibarrモジュールであれば何でも。 TriggerActiveAsModuleActive=モジュール%sが有効になっているとして、このファイル内のトリガーがアクティブになる。 GeneratedPasswordDesc=自動生成されたパスワードに使用する方法を選択する。 DictionaryDesc=全参照データを挿入する。デフォルトに値を追加できる。 ConstDesc=このページでは、他のページでは使用できないパラメーターを編集 ( オーバーライド ) できる。これらは主に、開発者/高度なトラブルシューティング専用の予約済パラメーター。 +MiscellaneousOptions=その他のオプション MiscellaneousDesc=他の全セキュリティ関連パラメータはここで定義される。 LimitsSetup=制限/精密設定 LimitsDesc=Dolibarrが使用する制限、精度、最適化をここで定義できる @@ -1293,7 +1298,7 @@ RestoreDesc=Dolibarrバックアップを復元するには、2つの手順が RestoreDesc2=「documents」ディレクトリのバックアップファイル ( zipファイルなど ) を新規Dolibarrインストールまたはこの現在のdocumentsディレクトリ ( %s ) に復元する。 RestoreDesc3=データベース構造とデータをバックアップダンプファイルから、新規Dolibarrインストールのデータベースまたはこの現在のインストールのデータベース ( %s ) に復元する。警告、復元が完了したら、バックアップ時間/インストールから存在したログイン/パスワードを使用して再度接続する必要がある。
    バックアップデータベースをこの現在のインストールに復元するには、このアシスタントに従うことができる。 RestoreMySQL=MySQLのインポート -ForcedToByAModule=このルールが有効化済モジュールによって%sに強制される。 +ForcedToByAModule=このルールが活性化済モジュールによって%sに強制される。 ValueIsForcedBySystem=この値はシステムによって強制される。変更することはできない。 PreviousDumpFiles=既存のバックアップファイル PreviousArchiveFiles=既存のアーカイブファイル @@ -1358,10 +1363,10 @@ WarningAtLeastKeyOrTranslationRequired=少なくともキーまたは翻訳文 NewTranslationStringToShow=表示する新規翻訳文字列 OriginalValueWas=元の翻訳は上書きされる。元の値は次のとおり。

    %s TransKeyWithoutOriginalValue=どの言語ファイルにも存在しない翻訳キー ' %s'の新規翻訳を強制した -TitleNumberOfActivatedModules=有効化されたモジュール -TotalNumberOfActivatedModules=有効化済モジュール: %s / %s -YouMustEnableOneModule=少なくとも1つのモジュールを有効にする必要がある -YouMustEnableTranslationOverwriteBefore=翻訳を置き換えることができるようにするには、最初に翻訳の上書きを有効にする必要がある +TitleNumberOfActivatedModules=活性化済モジュール +TotalNumberOfActivatedModules=活性化済モジュール: %s / %s +YouMustEnableOneModule=少なくとも1つのモジュールを有効化する必要がある +YouMustEnableTranslationOverwriteBefore=翻訳を置き換えることができるようにするには、最初に翻訳の上書きを有効化する必要がある ClassNotFoundIntoPathWarning=クラス%sがPHPパスに見つからない YesInSummer=はい夏に OnlyFollowingModulesAreOpenedToExternalUsers=次のモジュールのみが ( そのようなユーザのアクセス許可に関係なく ) 外部ユーザが使用でき、アクセス許可が付与されている場合にのみ使用できることに注意すること:
    @@ -1417,7 +1422,7 @@ NotificationsDescGlobal=*または、モジュールの設定ページでグロ ModelModules=ドキュメントテンプレート DocumentModelOdt=OpenDocumentテンプレートからドキュメントを生成する ( LibreOffice、OpenOffice、KOffice、TextEditなどの.ODT / .ODSファイル ) WatermarkOnDraft=下書き文書に透かし -JSOnPaimentBill=支払フォームの支払明細を自動入力する機能を有効化する +JSOnPaimentBill=支払フォームの支払明細を自動入力する機能を活性化する CompanyIdProfChecker=職業分類IDのルール MustBeUnique=ユニークでなければならないか? MustBeMandatory=取引先の作成が必須 ( VAT番号または法人の種類が定義されている場合 ) ? @@ -1497,7 +1502,7 @@ AdherentMailRequired=新規構成員を作成するにはメールが必要 MemberSendInformationByMailByDefault=構成員 ( 検証や新規サブスクリプション ) にメールの確定を送信するチェックボックスはデフォルトでオンになっている MemberCreateAnExternalUserForSubscriptionValidated=検証済新規構成員サブスクリプションごとに外部ユーザログインを作成する VisitorCanChooseItsPaymentMode=訪問者は、利用可能な支払いモードから選択できる -MEMBER_REMINDER_EMAIL=期限切れのサブスクリプションの電子メール
    によって自動リマインダーを有効にする。注:モジュール %s を有効にして、リマインダーを送信するように正しく設定する必要がある。 +MEMBER_REMINDER_EMAIL=期限切れのサブスクリプションの電子メールによって自動リマインダーを有効化。注:モジュール %s を有効にして、リマインダーを送信するように正しく設定する必要がある。 MembersDocModules=構成員レコードから生成されたドキュメント用のドキュメントテンプレート ##### LDAP setup ##### LDAPSetup=LDAPの設定 @@ -1537,11 +1542,11 @@ LDAPServerDnExample=完全なDN ( 例:DC =会社、dc = comなど ) LDAPDnSynchroActive=ユーザとグループの同期 LDAPDnSynchroActiveExample=LDAP同期にDolibarrまたはDolibarrへのLDAP LDAPDnContactActive=連絡先の同期 -LDAPDnContactActiveExample=有効化/無効化の同期 +LDAPDnContactActiveExample=活性化済/不活化済の同期 LDAPDnMemberActive=構成員の同期 -LDAPDnMemberActiveExample=有効化/無効化の同期 +LDAPDnMemberActiveExample=活性化済/不活化済の同期 LDAPDnMemberTypeActive=構成員種別の同期 -LDAPDnMemberTypeActiveExample=有効化/不活性の同期 +LDAPDnMemberTypeActiveExample=活性化済/不活化済の同期 LDAPContactDn=Dolibarrの連絡先のDN LDAPContactDnExample=完全なDN ( 例:OU =連絡先、DC =社会、dc = comなど ) LDAPMemberDn=Dolibarr構成員のDN @@ -1678,7 +1683,7 @@ OnProductSelectAddProductDesc=ドキュメントの行として製品追加す AutoFillFormFieldBeforeSubmit=説明入力フィールドに製品説明を自動入力する DoNotAutofillButAutoConcat=入力フィールドに製品説明を自動入力しない。製品説明は、入力された説明に自動的に連結される。 DoNotUseDescriptionOfProdut=製品説明が文書の行の説明に含まれることはない -MergePropalProductCard=製品/サービスが提案に含まれている場合、製品/サービスの【添付ファイル】タブで、製品のPDFドキュメントを提案のPDF azurにマージするオプションを有効化する +MergePropalProductCard=製品/サービスが提案に含まれている場合、製品/サービスの【添付ファイル】タブで、製品のPDFドキュメントを提案のPDF azurにマージするオプションを活性化する ViewProductDescInThirdpartyLanguageAbility=フォームでは製品説明を取引先の言語(それ以外の場合はユーザの言語)で表示 UseSearchToSelectProductTooltip=また、製品の数が多い ( > 100 000 ) 場合は、【設定】-> 【その他】で定数PRODUCT_DONOTSEARCH_ANYWHEREを1に設定することで速度を上げることができる。その後、検索は文字列の先頭に限定される。 UseSearchToSelectProduct=キーを押すまで待ってから、製品コンボリストのコンテンツをロードすること ( これにより、製品の数が多い場合にパフォーマンスが向上する可能性があるが、あまり便利ではない ) @@ -1745,7 +1750,7 @@ SendingsSetup=出荷モジュールの設定 SendingsReceiptModel=領収書のモデルを送信する SendingsNumberingModules=発信採番モジュール SendingsAbility=顧客への配送用の出荷シートをサポートする -NoNeedForDeliveryReceipts=ほとんどの場合、出荷用シートは、顧客への配送用のシート ( 送信する製品のリスト ) と、顧客が受け取って署名するシートの両方として使用される。したがって、製品入庫受領書は重複した機能であり、有効化されることはめったにない。 +NoNeedForDeliveryReceipts=ほとんどの場合、出荷用シートは、顧客への配送用のシート ( 送信する製品のリスト ) と、顧客が受け取って署名するシートの両方として使用される。したがって、製品入庫受領書は重複した機能であり、活性化されることはめったにない。 FreeLegalTextOnShippings=出荷に関するフリーテキスト ##### Deliveries ##### DeliveryOrderNumberingModules=製品発送受領採番モジュール @@ -1754,7 +1759,7 @@ DeliveriesOrderAbility=サポート製品の納入の領収書 FreeLegalTextOnDeliveryReceipts=配達のレシートにフリーテキスト ##### FCKeditor ##### AdvancedEditor=高度なエディタ -ActivateFCKeditor=高度なエディタを有効化: +ActivateFCKeditor=高度なエディタを活性化: FCKeditorForNotePublic=要素の「パブリックノート」フィールドのWYSIWIG作成/編集 FCKeditorForNotePrivate=要素の「プライベートノート」フィールドのWYSIWIG作成/編集 FCKeditorForCompany=要素のフィールド記述のWYSIWIG作成/エディション(製品/サービスを除く) @@ -1826,10 +1831,13 @@ AGENDA_USE_EVENT_TYPE=イベント種別を使用する ( メニューの【設 AGENDA_USE_EVENT_TYPE_DEFAULT=イベント作成フォームでイベントの種別にこのデフォルト値を自動的に設定する AGENDA_DEFAULT_FILTER_TYPE=アジェンダビューの検索フィルタでこの種別のイベントを自動的に設定する AGENDA_DEFAULT_FILTER_STATUS=アジェンダビューの検索フィルタでイベントのこの状態を自動的に設定する +AGENDA_EVENT_PAST_COLOR=過去のイベントカラー +AGENDA_EVENT_CURRENT_COLOR=現在のイベントの色 +AGENDA_EVENT_FUTURE_COLOR=今後のイベントカラー AGENDA_DEFAULT_VIEW=メニューの議題を選択するときに、デフォルトでどのビューを開くか -AGENDA_REMINDER_BROWSER=ユーザのブラウザでイベントリマインダーを有効にする(リマインダーの日付に達すると、ブラウザにポップアップが表示される。各ユーザは、ブラウザの通知設定からそのような通知を無効にできる)。 -AGENDA_REMINDER_BROWSER_SOUND=音声通知を有効にする -AGENDA_REMINDER_EMAIL=電子メールでイベントリマインダーを有効にする(リマインダーオプション/遅延は各イベントで定義できる)。 +AGENDA_REMINDER_BROWSER=ユーザのブラウザでイベントリマインダーを有効化(リマインダーの日付に達すると、ブラウザにポップアップが表示される。各ユーザは、ブラウザの通知設定からそのような通知を無効にできる)。 +AGENDA_REMINDER_BROWSER_SOUND=音声通知を有効化 +AGENDA_REMINDER_EMAIL=電子メールでイベントリマインダーを有効化(リマインダーオプション/遅延は各イベントで定義できる)。 AGENDA_REMINDER_EMAIL_NOTE=注:スケジュールされたジョブ%sの頻度は、リマインダーが正しいタイミングで送信されることを確認するのに十分であること。 AGENDA_SHOW_LINKED_OBJECT=リンクされたオブジェクトを議題ビューに表示する ##### Clicktodial ##### @@ -1860,17 +1868,17 @@ BookmarkDesc=このモジュールを使用すると、ブックマークを管 NbOfBoomarkToShow=左側のメニューに表示するブックマークの最大数 ##### WebServices ##### WebServicesSetup=ウェブサービスモジュールの設定 -WebServicesDesc=このモジュールを有効にすることによって、Dolibarrでは、その他のウェブサービスを提供するWebサービスのサーバーになる。 +WebServicesDesc=このモジュールの有効化によって、Dolibarrでは、その他のウェブサービスを提供するWebサービスのサーバーになる。 WSDLCanBeDownloadedHere=提供されるサービスのWSDL記述子ファイルはここからダウンロードできる。 EndPointIs=SOAPクライアントは、URLで入手可能なDolibarrエンドポイントに要求を送信する必要がある ##### API #### ApiSetup=APIモジュールの設定 -ApiDesc=このモジュールを有効にすることで、DolibarrはさまざまなWebサービスを提供するRESTサーバーになる。 -ApiProductionMode=本番モードを有効化する ( これにより、サービス管理のためのキャッシュの使用が有効化する ) +ApiDesc=このモジュールを有効化することで、DolibarrはさまざまなWebサービスを提供するRESTサーバーになる。 +ApiProductionMode=本番モードを活性化する ( これにより、サービス管理のためのキャッシュの使用が活性化する ) ApiExporerIs=URLでAPIを調べてテストできる OnlyActiveElementsAreExposed=有効なモジュールの要素のみが公開される ApiKey=APIのキー -WarningAPIExplorerDisabled=APIエクスプローラーが無効になっている。 APIサービスを提供するためにAPIエクスプローラーは必要ない。これは、開発者がRESTAPIを検索/テストするためのツール。このツールが必要な場合は、モジュールAPIRESTの設定に移動して有効化する。 +WarningAPIExplorerDisabled=APIエクスプローラーが無効になっている。 APIサービスを提供するためにAPIエクスプローラーは必要ない。これは、開発者がRESTAPIを検索/テストするためのツール。このツールが必要な場合は、モジュールAPIRESTの設定に移動して活性化する。 ##### Bank ##### BankSetupModule=銀行のモジュールの設定 FreeLegalTextOnChequeReceipts=小切手領収書のフリーテキスト @@ -1929,7 +1937,7 @@ ExpenseReportsSetup=モジュール経費報告書sの設定 TemplatePDFExpenseReports=経費報告書ドキュメントを生成するためのドキュメントテンプレート ExpenseReportsRulesSetup=モジュール経費報告書sの設定-ルール ExpenseReportNumberingModules=経費報告書s採番モジュール -NoModueToManageStockIncrease=自動在庫増加を管理できるモジュールは有効化されていない。在庫増加は手動入力のみで行われる。 +NoModueToManageStockIncrease=自動在庫増加を管理できるモジュールは活性化されていない。在庫増加は手動入力のみで行われる。 YouMayFindNotificationsFeaturesIntoModuleNotification=モジュール「通知」を有効にして構成することにより、電子メール通知のオプションを見つけることができる。 TemplatesForNotifications=通知用のテンプレート ListOfNotificationsPerUser=ユーザごとの自動通知のリスト* @@ -1942,7 +1950,7 @@ BackupDumpWizard=データベースダンプファイルを作成するウィザ BackupZipWizard=ドキュメントディレクトリのアーカイブを構築するウィザード SomethingMakeInstallFromWebNotPossible=次の理由により、Webインターフェイスから外部モジュールをインストールすることはできない。 SomethingMakeInstallFromWebNotPossible2=このため、ここで説明するアップグレードプロセスは、特権ユーザのみが実行できる手動プロセス。 -InstallModuleFromWebHasBeenDisabledContactUs=アプリケーションからの外部モジュールまたは動的 Web サイトのインストールまたは開発は、現在、セキュリティ上の目的でロックされています。この機能を有効にする必要がある場合は、お問い合わせください。 +InstallModuleFromWebHasBeenDisabledContactUs=アプリケーションからの外部モジュールまたは動的 Web サイトのインストールまたは開発は、現在、セキュリティ上の目的でロックされています。この機能を有効化する必要がある場合は、お問い合わせください。 InstallModuleFromWebHasBeenDisabledByFile=アプリケーションからの外部モジュールのインストールが管理者によって無効にされている。この機能を許可するには、ファイル %sを削除するように彼に依頼する必要がある。 ConfFileMustContainCustom=アプリケーションから外部モジュールをインストールまたはビルドするには、モジュールファイルをディレクトリ %sに保存する必要がある。このディレクトリをDolibarrで処理するには、 conf / conf.php を設定して、2つのディレクティブ行を追加する必要がある。
    $ dolibarr_main_url_root_alt = '/ custom';
    $ dolibarr_main_document_root_alt = '%s / custom'; HighlightLinesOnMouseHover=マウスの動きが通過したときにテーブルの行を強調表示する @@ -1953,7 +1961,7 @@ BtnActionColor=アクションボタンの色 TextBtnActionColor=アクションボタンのテキストの色 TextTitleColor=ページタイトルのテキストの色 LinkColor=リンクの色 -PressF5AfterChangingThis=キーボードのCTRL + F5を押すか、この値を変更して有効にするためにブラウザのキャッシュをクリアする +PressF5AfterChangingThis=キーボードのCTRL + F5を押すか、この値を変更して有効化するためにブラウザのキャッシュをクリアする NotSupportedByAllThemes=コアテーマで動作するが、外部テーマではサポートされていない可能性がある BackgroundColor=背景色 TopMenuBackgroundColor=トップメニューの背景色 @@ -2040,12 +2048,12 @@ activateModuleDependNotSatisfied=モジュール「%s」はモジュール「%s CommandIsNotInsideAllowedCommands=実行しようとしているコマンドは、 conf.phpファイルのパラメーター $ dolibarr_main_restrict_os_commandsで定義されている許可されたコマンドのリストにない。 LandingPage=ランディングページ SamePriceAlsoForSharedCompanies=複数の法人のモジュールを使用し、「単一価格」を選択した場合、製品が環境間で共有されていれば、価格も全法人で同じになる -ModuleEnabledAdminMustCheckRights=モジュールが有効化された。有効化されたモジュール(s)のアクセス許可は、管理者ユーザにのみ付与された。必要に応じて、他のユーザまたはグループに手動でアクセス許可を付与する必要がある場合がある。 +ModuleEnabledAdminMustCheckRights=モジュールが活性化済。活性化済モジュール(s)のアクセス許可は、管理者ユーザにのみ付与された。必要に応じて、他のユーザまたはグループに手動でアクセス許可を付与する必要がある場合がある。 UserHasNoPermissions=このユーザには権限が定義されていない TypeCdr=支払期間の日付が請求書の日付に日数のデルタを加えたものである場合は「なし」を使用する ( デルタはフィールド「%s」 )
    デルタの後、日付を増やして終了する必要がある場合は、「月末」を使用する月の ( +オプションの「%s」 ( 日数 ) )
    「現在/次」を使用して、支払期間の日付をデルタの後の月の最初のN番目にする ( デルタはフィールド「%s」、Nはフィールド「%s」に格納される ) BaseCurrency=法人の参照通貨 ( これを変更するには、法人の設定に入る ) WarningNoteModuleInvoiceForFrenchLaw=このモジュール%sは、フランスの法律 ( Loi Finance 2016 ) に準拠している。 -WarningNoteModulePOSForFrenchLaw=このモジュール%sは、モジュールNon Reversible Logsが自動的に有効化されるため、フランスの法律 ( Loi Finance 2016 ) に準拠している。 +WarningNoteModulePOSForFrenchLaw=このモジュール%sは、モジュールNon Reversible Logsが自動的に活性化されるため、フランスの法律 ( Loi Finance 2016 ) に準拠している。 WarningInstallationMayBecomeNotCompliantWithLaw=外部モジュールであるモジュール%sをインストールしようとしている。外部モジュールをアクティブ化すると、そのモジュールの発行元を信頼し、このモジュールがアプリケーションの動作に悪影響を与えず、国の法律 ( %s ) に準拠していることを確認できる。モジュールが違法な機能を導入した場合、違法なソフトウェアの使用について責任を負うことになる。 MAIN_PDF_MARGIN_LEFT=PDFの左マージン MAIN_PDF_MARGIN_RIGHT=PDFの右マージン @@ -2079,7 +2087,7 @@ HelpOnTooltipDesc=このフィールドがフォームに表示されたとき YouCanDeleteFileOnServerWith=次のコマンドラインを使用して、サーバー上のこのファイルを削除できる:
    %s ChartLoaded=ロードされた勘定科目表 SocialNetworkSetup=モジュールソーシャルネットワークの設定 -EnableFeatureFor= %sの機能を有効にする +EnableFeatureFor= %sの機能を有効化 VATIsUsedIsOff=注:消費税またはVATを使用するオプションは、メニュー%s-%sで Off に設定されているため、消費税または使用される付加価値税は常に0になる。 SwapSenderAndRecipientOnPDF=PDFドキュメントの送信者と受信者のアドレス位置を入れ替える FeatureSupportedOnTextFieldsOnly=警告、機能性はテキストフィールドとコンボリストでのみサポートされる。また、この機能性を引き出すには、URLパラメータ action=create または action=edit を設定するか、ページ名が 'new.php' で終わる必要がある。 @@ -2106,18 +2114,18 @@ DateLastCollectResult=最新の取得試行の日付 DateLastcollectResultOk=最新の取得成功の日付 LastResult=最新の結果 EmailCollectorHideMailHeaders=収集された電子メールの保存されたコンテンツに電子メールヘッダーのコンテンツを含めないこと -EmailCollectorHideMailHeadersHelp=有効にすると、アジェンダイベントとして保存される電子メールコンテンツの最後に電子メールヘッダーは追加されない。 +EmailCollectorHideMailHeadersHelp=有効化と、アジェンダイベントとして保存される電子メールコンテンツの最後に電子メールヘッダーは追加されない。 EmailCollectorConfirmCollectTitle=メール収集確定 EmailCollectorConfirmCollect=このコレクタを今すぐ実行するか? -EmailCollectorExampleToCollectTicketRequestsDesc=いくつかのルールに一致する電子メールを収集し、電子メール情報を含むチケットを自動的に作成する(モジュールチケットを有効化する必要がある)。電子メールでサポートを提供する場合は、このコレクタを使用できるため、チケット要求が自動的に生成される。 Collect_Responsesも有効化して、チケットビューで直接クライアントの回答を収集する(Dolibarrから返信する必要がある)。 +EmailCollectorExampleToCollectTicketRequestsDesc=いくつかのルールに一致する電子メールを収集し、電子メール情報を含むチケットを自動的に作成する(モジュールチケットを活性化する必要がある)。電子メールでサポートを提供する場合は、このコレクタを使用できるため、チケット要求が自動的に生成される。 Collect_Responsesも活性化して、チケットビューで直接クライアントの回答を収集する(Dolibarrから返信する必要がある)。 EmailCollectorExampleToCollectTicketRequests=チケット要求の収集例(最初のメッセージのみ) EmailCollectorExampleToCollectAnswersFromExternalEmailSoftwareDesc=メールボックスの「送信済み」ディレクトリをスキャンして、Dolibarrからではなく、電子メールソフトウェアから直接別の電子メールの応答として送信された電子メールを見つけます。そのような電子メールが見つかった場合、回答のイベントはDolibarrに記録される EmailCollectorExampleToCollectAnswersFromExternalEmailSoftware=外部の電子メールソフトウェアから送信された電子メールの回答を収集する例 -EmailCollectorExampleToCollectDolibarrAnswersDesc=アプリケーションから送信された電子メールの回答であるすべての電子メールを収集する。電子メール応答を含むイベント(モジュールアジェンダを有効にする必要があ)は、適切な場所に記録される。たとえば、アプリケーションから電子メールでチケットの商取引提案、注文、請求書、またはメッセージを送信し、受信者が電子メールに応答すると、システムは自動的に応答をキャッチしてERPに追加する。 +EmailCollectorExampleToCollectDolibarrAnswersDesc=アプリケーションから送信された電子メールの回答であるすべての電子メールを収集する。電子メール応答を含むイベント(モジュールアジェンダを有効化する必要があ)は、適切な場所に記録される。たとえば、アプリケーションから電子メールでチケットの商取引提案、注文、請求書、またはメッセージを送信し、受信者が電子メールに応答すると、システムは自動的に応答をキャッチしてERPに追加する。 EmailCollectorExampleToCollectDolibarrAnswers=Dolibarrから送信されたメッセージへの回答である全受信メッセージを収集する例 -EmailCollectorExampleToCollectLeadsDesc=いくつかのルールに一致する電子メールを収集し、電子メール情報を使用してリードを自動的に作成する(モジュールプロジェクトを有効にする必要がある)。モジュールプロジェクト(1リード= 1プロジェクト)を使用してリードをフォローする場合は、このコレクタを使用できる。これにより、リードが自動的に生成される。コレクタのCollect_Responsesも有効になっている場合、リード、プロポーザル、またはその他のオブジェクトから電子メールを送信すると、アプリケーションに直接顧客またはパートナーの回答が表示される場合がある。
    注:この最初の例では、リードのタイトルが電子メールを含めて生成される。サードパーティがデータベース(新規顧客)で見つからない場合、リードはID1のサードパーティに接続される。 +EmailCollectorExampleToCollectLeadsDesc=いくつかのルールに一致する電子メールを収集し、電子メール情報を使用してリードを自動的に作成する(モジュールプロジェクトを有効化する必要がある)。モジュールプロジェクト(1リード= 1プロジェクト)を使用してリードをフォローする場合は、このコレクタを使用できる。これにより、リードが自動的に生成される。コレクタのCollect_Responsesも有効になっている場合、リード、プロポーザル、またはその他のオブジェクトから電子メールを送信すると、アプリケーションに直接顧客またはパートナーの回答が表示される場合がある。
    注:この最初の例では、リードのタイトルが電子メールを含めて生成される。サードパーティがデータベース(新規顧客)で見つからない場合、リードはID1のサードパーティに接続される。 EmailCollectorExampleToCollectLeads=リードの収集例 -EmailCollectorExampleToCollectJobCandidaturesDesc=求人に応募するメールを収集する(モジュール採用を有効にする必要がある)。ジョブ要求の候補を自動的に作成する場合は、このコレクタを完成させることができる。注:この最初の例では、候補者のタイトルが電子メールを含めて生成される。 +EmailCollectorExampleToCollectJobCandidaturesDesc=求人に応募するメールを収集する(モジュール採用を有効化する必要がある)。ジョブ要求の候補を自動的に作成する場合は、このコレクタを完成させることができる。注:この最初の例では、候補者のタイトルが電子メールを含めて生成される。 EmailCollectorExampleToCollectJobCandidatures=電子メールで受け取った求職者の収集例 NoNewEmailToProcess=処理する新規電子メール ( 一致するフィルタ ) はない NothingProcessed=何もしていない @@ -2129,6 +2137,7 @@ CodeLastResult=最新の結果コード NbOfEmailsInInbox=ソースディレクトリ内の電子メールの数 LoadThirdPartyFromName=%sで検索している取引先をロードする ( ロードのみ ) LoadThirdPartyFromNameOrCreate=%sで検索している取引先をロードする ( 見つからない場合は作成する ) +LoadContactFromEmailOrCreate=%s で連絡先検索をロードする (見つからない場合は作成する) AttachJoinedDocumentsToObject=メールトピックにオブジェクトの参照が見つかった場合は、添付ファイルをオブジェクトドキュメントに保存する。 WithDolTrackingID=Dolibarrから送信された最初の電子メールによって開始された会話からのメッセージ WithoutDolTrackingID=Dolibarrから送信されていない最初の電子メールによって開始された会話からのメッセージ @@ -2150,9 +2159,9 @@ ConfirmUnactivation=モジュールのリセットを確定する OnMobileOnly=小画面 ( スマートフォン ) のみ DisableProspectCustomerType=「見込み客+顧客」の取引先種別を無効にする ( したがって、取引先は「見込み客」または「顧客」である必要があるが、両方にすることはできない ) MAIN_OPTIMIZEFORTEXTBROWSER=目の不自由な人のためのインターフェースを簡素化する -MAIN_OPTIMIZEFORTEXTBROWSERDesc=目の不自由な方、またはLynxやLinksなどのテキストブラウザからアプリケーションを使用する場合は、このオプションを有効にすること。 +MAIN_OPTIMIZEFORTEXTBROWSERDesc=目の不自由な方、またはLynxやLinksなどのテキストブラウザからアプリケーションを使用する場合は、このオプションを有効化すること。 MAIN_OPTIMIZEFORCOLORBLIND=色覚異常の人のインターフェースの色を変更する -MAIN_OPTIMIZEFORCOLORBLINDDesc=色覚異常の人の場合は、このオプションを有効にする。場合によっては、インターフェイスによって色の設定が変更され、コントラストが向上する。 +MAIN_OPTIMIZEFORCOLORBLINDDesc=色覚異常の人の場合は、このオプションを有効化。場合によっては、インターフェイスによって色の設定が変更され、コントラストが向上する。 Protanopia=1型2色覚赤色盲 Deuteranopes=2型2色覚緑色盲 Tritanopes=3型2色覚青色盲 @@ -2169,9 +2178,9 @@ LogsLinesNumber=【ログ】タブに表示する行数 UseDebugBar=デバッグバーを使用する DEBUGBAR_LOGS_LINES_NUMBER=コンソールに保持する最後のログ行の数 WarningValueHigherSlowsDramaticalyOutput=警告、値を大きくすると出力が劇的に遅くなる -ModuleActivated=モジュール%sが有効化され、インターフェイスの速度が低下する -ModuleActivatedWithTooHighLogLevel=モジュール%sが高すぎるロギングレベルで有効化されている(パフォーマンスとセキュリティを向上させるために、より低いレベルを使用してみること) -ModuleSyslogActivatedButLevelNotTooVerbose=モジュール%sが有効化され、ログレベル(%s)が正しい(冗長すぎない) +ModuleActivated=モジュール%sが活性化され、インターフェイスの速度が低下する +ModuleActivatedWithTooHighLogLevel=モジュール%sが高すぎるロギングレベルで活性化されている(パフォーマンスとセキュリティを向上させるために、より低いレベルを使用してみること) +ModuleSyslogActivatedButLevelNotTooVerbose=モジュール%sが活性化され、ログレベル(%s)が正しい(冗長すぎない) IfYouAreOnAProductionSetThis=実稼働環境を使用している場合は、このプロパティを%sに設定する必要がある。 AntivirusEnabledOnUpload=アップロードされたファイルでウイルス対策が有効になっている SomeFilesOrDirInRootAreWritable=一部のファイルやディレクトリが読取り専用モードになっていない @@ -2207,7 +2216,7 @@ PDFIn2Languages=ラベルを 2 つの異なる言語で PDF に表示 PDF_USE_ALSO_LANGUAGE_CODE=PDF内の一部のテキストを同じ生成PDFで2つの異なる言語で複製する場合は、ここでこの2番目の言語を設定して、生成されたPDFに同じページに2つの異なる言語が含まれるようにする必要がある。1つはPDFの生成時に選択され、もう1つは ( これをサポートしているPDFテンプレートはごくわずか ) 。 PDFごとに1つの言語を空のままにする。 PDF_USE_A=デフォルト形式のPDFではなくPDF / A形式のPDFドキュメントを生成する FafaIconSocialNetworksDesc=FontAwesomeアイコンのコードをここに入力する。 FontAwesomeとは何かわからない場合は、一般的な値fa-address-bookを使用できる。 -RssNote=注:各RSSフィード定義は、ダッシュボードで使用できるようにするために有効にする必要があるウィジェットを提供する +RssNote=注:各RSSフィード定義は、ダッシュボードで使用できるようにするために有効化の必要があるウィジェットを提供する JumpToBoxes=【設定】-> 【ウィジェット】にジャンプする MeasuringUnitTypeDesc=ここでは、「サイズ」、「表面」、「体積」、「重量」、「時間」などの値を使用する MeasuringScaleDesc=スケールは、デフォルトの参照単位に一致するように小数部を移動する必要がある場所の数。 「時間」単位種別の場合、秒数。 80〜99の値は予約値。 @@ -2266,13 +2275,13 @@ DashboardDisableBlockBank=銀行のサムネを無効にする DashboardDisableBlockAdherent=成員資格のサムネを無効にする DashboardDisableBlockExpenseReport=経費報告書sのサムネを無効にする DashboardDisableBlockHoliday=葉のサムネを無効にする -EnabledCondition=フィールドを有効にする条件(有効にしない場合、可視性は常にオフになる) -IfYouUseASecondTaxYouMustSetYouUseTheMainTax=2番目の税金を使用する場合は、最初の消費税も有効にする必要がある -IfYouUseAThirdTaxYouMustSetYouUseTheMainTax=3番目の税金を使用する場合は、最初の消費税も有効にする必要がある +EnabledCondition=フィールドの有効化条件(有効にしない場合、可視性は常にオフになる) +IfYouUseASecondTaxYouMustSetYouUseTheMainTax=2番目の税金を使用する場合は、最初の消費税も有効化の必要がある +IfYouUseAThirdTaxYouMustSetYouUseTheMainTax=3番目の税金を使用する場合は、最初の消費税も有効化の必要がある LanguageAndPresentation=言語とプレゼンテーション SkinAndColors=肌と色 -IfYouUseASecondTaxYouMustSetYouUseTheMainTax=2番目の税金を使用する場合は、最初の消費税も有効にする必要がある -IfYouUseAThirdTaxYouMustSetYouUseTheMainTax=3番目の税金を使用する場合は、最初の消費税も有効にする必要がある +IfYouUseASecondTaxYouMustSetYouUseTheMainTax=2番目の税金を使用する場合は、最初の消費税も有効化の必要がある +IfYouUseAThirdTaxYouMustSetYouUseTheMainTax=3番目の税金を使用する場合は、最初の消費税も有効化の必要がある PDF_USE_1A=PDF / A-1b形式でPDFを生成する MissingTranslationForConfKey = %sの翻訳がない NativeModules=ネイティブモジュール @@ -2355,3 +2364,5 @@ AllowExternalDownload=外部ダウンロードを許可する (ログインな DeadlineDayVATSubmission=翌月のVAT提出締切日 MaxNumberOfAttachementOnForms=フォーム内の結合ファイルの最大数 IfDefinedUseAValueBeetween=定義されている場合は、%s と %s の間の値を使用する +Reload=リロード +ConfirmReload=モジュールのリロードを確定 diff --git a/htdocs/langs/ja_JP/boxes.lang b/htdocs/langs/ja_JP/boxes.lang index debf3f7b177..096c0447144 100644 --- a/htdocs/langs/ja_JP/boxes.lang +++ b/htdocs/langs/ja_JP/boxes.lang @@ -24,6 +24,7 @@ BoxFicheInter=最新の介入 BoxCurrentAccounts=口座残高 BoxTitleMemberNextBirthdays=今月の誕生日(構成員) BoxTitleMembersByType=タイプと状態別の構成員 +BoxTitleMembersByTags=タグとステータス別のメンバー BoxTitleMembersSubscriptionsByYear=年ごとの構成員サブスクリプション BoxTitleLastRssInfos=%sからの最新の%sニュース BoxTitleLastProducts=製品/サービス:最後に変更された%s diff --git a/htdocs/langs/ja_JP/companies.lang b/htdocs/langs/ja_JP/companies.lang index d6f1e81f0d8..6802aa4b416 100644 --- a/htdocs/langs/ja_JP/companies.lang +++ b/htdocs/langs/ja_JP/companies.lang @@ -312,12 +312,12 @@ CustomerRelativeDiscountShort=相対的割引 CustomerAbsoluteDiscountShort=絶対的割引 CompanyHasRelativeDiscount=この顧客のデフォルトでの割引は%sの%% CompanyHasNoRelativeDiscount=この顧客は、デフォルトでの相対割引は無し -HasRelativeDiscountFromSupplier=この仕入先からのデフォルトでの割引は %s%% -HasNoRelativeDiscountFromSupplier=この仕入先からのデフォルトでの相対割引は無し +HasRelativeDiscountFromSupplier=この仕入先のデフォルト割引は %s%% +HasNoRelativeDiscountFromSupplier=この仕入先のデフォルトの相対割引はなし CompanyHasAbsoluteDiscount=この顧客への割引可能額(返金確認 または 頭金充当)は %s %s CompanyHasDownPaymentOrCommercialDiscount=この顧客への割引可能額(値引取引 または 頭金充当)は %s %s CompanyHasCreditNote=この顧客はまだ%s %sのために貸方票を持っている -HasNoAbsoluteDiscountFromSupplier=この仕入先から利用できる割引割戻は無し +HasNoAbsoluteDiscountFromSupplier=この仕入先からの割引/クレジットは不可 HasAbsoluteDiscountFromSupplier=この仕入先から、%s %s 相当の割引が可能 (返金確約または頭金充当) HasDownPaymentOrCommercialDiscountFromSupplier=この仕入先から、 %s %s 相当の割引が可能 (現金値引、頭金充当) HasCreditNoteFromSupplier=この仕入先から、%s %s相当の返金確約があり @@ -444,7 +444,7 @@ AddAddress=アドレスを追加する。 SupplierCategory=仕入先範疇 JuridicalStatus200=独立系 DeleteFile=ファイルを削除 -ConfirmDeleteFile=このファイルを削除してもよいか? +ConfirmDeleteFile=このファイル %s を削除してもよいか? AllocateCommercial=販売担当者に任命 Organization=組織 FiscalYearInformation=会計年度 @@ -498,3 +498,8 @@ RestOfEurope=その他欧州 (EEC) OutOfEurope=欧州域外 (EEC) CurrentOutstandingBillLate=現在の遅延中未払い勘定 BecarefullChangeThirdpartyBeforeAddProductToInvoice=製品の価格設定によっては、POSに製品を追加する前に取引先を変更する必要があることに注意。 +EmailAlreadyExistsPleaseRewriteYourCompanyName=電子メールは既に存在する 法人名を書き直すこと +TwoRecordsOfCompanyName=この法人には複数のレコードが存在する。パートナーシップリクエストを完了するため問い合わせを願う +CompanySection=法人セクション +ShowSocialNetworks=ソーシャルネットワークを表示 +HideSocialNetworks=ソーシャル ネットワークを非表示にする diff --git a/htdocs/langs/ja_JP/errors.lang b/htdocs/langs/ja_JP/errors.lang index d1385a11b4e..d9297d36b88 100644 --- a/htdocs/langs/ja_JP/errors.lang +++ b/htdocs/langs/ja_JP/errors.lang @@ -57,7 +57,7 @@ ErrorSubjectIsRequired=メールの件名が必要 ErrorFailedToCreateDir=ディレクトリの作成に失敗した。そのWebサーバのユーザがDolibarrのドキュメントディレクトリに書き込む権限を持って確認すること。パラメータ のsafe_modeがこのPHPが有効になっている場合、Dolibarr PHPファイルは、Webサーバーのユーザ(またはグループ)に所有していることを確認すること。 ErrorNoMailDefinedForThisUser=このユーザに定義されたメールはない ErrorSetupOfEmailsNotComplete=メールの設定が完了していない -ErrorFeatureNeedJavascript=この機能が動作するように有効化するjavascriptをする必要がある。設定でこれを変更 - 表示される。 +ErrorFeatureNeedJavascript=この機能は javascript が動作するよう活性化させる必要がある。設定でこれを変更 - 表示。 ErrorTopMenuMustHaveAParentWithId0=タイプは 'top'のメニューが親メニューを持つことはできない。親メニューに0を置くか、または型 "左"のメニューを選択する。 ErrorLeftMenuMustHaveAParentId=タイプ "左"のメニューは、親IDを持つ必要がある。 ErrorFileNotFound=ファイル%sが見つからない (不良パス、不正権限、アクセス拒否など、PHP openbasedir または セーフモードパラメータ による) @@ -80,7 +80,7 @@ ErrorBadFormatValueList=リスト値に複数のコンマを含めることは ErrorFieldCanNotContainSpecialCharacters=フィールド%sに特殊文字を含めることはできない。 ErrorFieldCanNotContainSpecialNorUpperCharacters=フィールド %s には、特殊文字や大文字を含めてはならず、アルファベット文字 (a ~ z) で開始する必要がある。 ErrorFieldMustHaveXChar=フィールド%s には、少なくとも%s文字が必要だ。 -ErrorNoAccountancyModuleLoaded=有効化済会計モジュールなし +ErrorNoAccountancyModuleLoaded=活性化済会計モジュールなし ErrorExportDuplicateProfil=このプロファイル名は、このエクスポートセットに既に存在する。 ErrorLDAPSetupNotComplete=Dolibarr-LDAPのマッチングは完全ではない。 ErrorLDAPMakeManualTest=.ldifファイルは、ディレクトリ%sで生成された。エラーの詳細情報を持つようにコマンドラインから手動でそれをロードしようとする。 @@ -100,7 +100,7 @@ ErrorFieldRefNotIn=フィールド%s : ' %s' は存在する ErrorMultipleRecordFoundFromRef=ref %s から検索すると、いくつかのレコードが見つかった。使用する ID を知る方法はない。 ErrorsOnXLines=%sエラーが見つかった ErrorFileIsInfectedWithAVirus=ウイルス対策プログラムがファイルを検証ことができなかった(ファイルがウイルスに感染されるかもしれない) -ErrorNumRefModel=参照は、データベース(%s)に存在し、この発番規則と互換性がない。このモジュールを有効化するため、レコードを削除するか、参照を変更すること。 +ErrorNumRefModel=参照は、データベース(%s)に存在し、この発番規則と互換性がない。このモジュールを活性化するため、レコードを削除するか、参照を変更すること。 ErrorQtyTooLowForThisSupplier=このベンダーの数量が少なすぎるか、このベンダーのこの製品に価格が定義されていない ErrorOrdersNotCreatedQtyTooLow=数量が少なすぎるため、一部の注文が作成されていない ErrorModuleSetupNotComplete=モジュール%sの設定が完了していないようだ。ホーム-設定-モジュールに移動して完了する。 @@ -136,7 +136,7 @@ ErrorLinesCantBeNegativeForOneVATRate=行の合計(税控除後)は、特定のn ErrorLinesCantBeNegativeOnDeposits=入金でラインがマイナスになることはない。あなたがそうするならば、あなたが最終的な請求書で入金を消費する必要があるとき、あなたは問題に直面するだろう。 ErrorQtyForCustomerInvoiceCantBeNegative=顧客の請求書への明細の数量をマイナスにすることはできない ErrorWebServerUserHasNotPermission=Webサーバを実行するユーザアカウントを使用%sそのための権限を持っていない -ErrorNoActivatedBarcode=有効化済バーコード·タイプがない +ErrorNoActivatedBarcode=活性化済バーコード·タイプなし ErrUnzipFails=ZipArchiveで%sを解凍できなかった ErrNoZipEngine=このPHPで%sファイルをzip / unzipするエンジンはない ErrorFileMustBeADolibarrPackage=ファイル%sはDolibarrzipパッケージである必要がある @@ -241,7 +241,7 @@ ErrorNewRefIsAlreadyUsed=エラー、新規参照は既に使用されている ErrorDeletePaymentLinkedToAClosedInvoiceNotPossible=エラー、クローズされた請求書にリンクされた支払を削除することはできない。 ErrorSearchCriteriaTooSmall=検索条件が小さすぎる。 ErrorObjectMustHaveStatusActiveToBeDisabled=無効にするには、オブジェクトの状態が "アクティブ" である必要がある -ErrorObjectMustHaveStatusDraftOrDisabledToBeActivated=オブジェクトを有効にするには、状態が "下書き" または "無効" である必要がある +ErrorObjectMustHaveStatusDraftOrDisabledToBeActivated=オブジェクトを有効化には、状態が "下書き" または "無効" である必要がある ErrorNoFieldWithAttributeShowoncombobox=オブジェクト '%s'の定義にプロパティ 'showoncombobox'を持つフィールドはない。コンボリストを表示する方法はない。 ErrorFieldRequiredForProduct=製品%sには、フィールド '%s'が必要だ。 AlreadyTooMuchPostOnThisIPAdress=あなたはすでにこの IP アドレスに過剰な投稿をしている。 @@ -303,21 +303,22 @@ ErrorValueForTooLow= %s の値が低すぎる ErrorValueCantBeNull= %s の値は null 不可 ErrorDateOfMovementLowerThanDateOfFileTransmission=銀行取引の日付は、ファイル送信の日付より前にすることはできない ErrorTooMuchFileInForm=フォーム内のファイルが多すぎる。最大数は %s ファイル (s) +ErrorSessionInvalidatedAfterPasswordChange=パスワード、ステータス、または有効期限が変更されたため、セッションが無効になった。再ログインすること。 # Warnings WarningParamUploadMaxFileSizeHigherThanPostMaxSize=PHPパラメータ upload_max_filesize(%s)は、PHPパラメータ post_max_size(%s)よりも大きくなっている。これは一貫した設定ではない。 WarningPasswordSetWithNoAccount=この構成員にパスワードが設定された。ただし、ユーザアカウントは作成されなかった。したがって、このパスワードは保存されるが、Dolibarrへのログインには使用できない。外部モジュール/インターフェースで使用できるが、構成員のログインやパスワードを定義する必要がない場合は、構成員モジュールの設定から "各構成員のログインを管理する" オプションを無効にすることができる。ログインを管理する必要があるがパスワードは必要ない場合は、このフィールドを空のままにして、この警告を回避できる。注:構成員がユーザにリンクされている場合は、電子メールをログインとして使用することもできる。 WarningMandatorySetupNotComplete=主なパラメータの設定はこちら -WarningEnableYourModulesApplications=モジュールとアプリケーションを有効にするには、ここをクリックすること +WarningEnableYourModulesApplications=モジュールとアプリケーションの有効化には、ここをクリックすること WarningSafeModeOnCheckExecDir=警告、PHPのオプションセーフモードは、PHPのパラメータ safe_mode_exec_dirの宣言されたディレクトリ内に格納する必要があるので、コマンドにある。 WarningBookmarkAlreadyExists=この職種またはこのターゲットを使用して、ブックマーク(URL)が既に存在している。 WarningPassIsEmpty=警告は、データベースのパスワードは空だ。これはセキュリティホールだ。あなたのデータベースにパスワードを追加し、これを反映するようにconf.phpファイルを変更する必要がある。 WarningConfFileMustBeReadOnly=警告、設定ファイル (htdocs/conf/conf.php) はWebサーバーによって上書きされうる。これは重大なセキュリティホールだ。 Webサーバーで使用されるオペレーティング·システム·ユーザのために読取り専用モードになるようにファイルのパーミッションを変更すること。あなたのディスクにWindowsとFATフォーマットを使用すると、このファイルシステムはファイルのパーミッションを追加することはできず、完全な安全を得られないことを知っている必要がある。 WarningsOnXLines=%sソース行に関する警告 -WarningNoDocumentModelActivated=ドキュメント生成用のモデルは有効化されていない。モジュールの設定を確認するまで、デフォルトでモデルが選択される。 +WarningNoDocumentModelActivated=ドキュメント生成用のモデルは活性化されていない。モジュールの設定を確認するまで、デフォルトでモデルが選択される。 WarningLockFileDoesNotExists=警告、設定が完了したら、ファイル install.lockをディレクトリ%s に追加して、インストール/移行ツールを無効にする必要がある。このファイルの作成を省略すると、重大なセキュリティリスクが発生する。 WarningUntilDirRemoved=このセキュリティ警告は、脆弱性が存在する限りアクティブなまま 。 -WarningCloseAlways=警告、ソース要素とターゲット要素の間で量が異なっていても、クローズは行われる。この機能は注意して有効にすること。 +WarningCloseAlways=警告、ソース要素とターゲット要素の間で量が異なっていても、クローズは行われる。この機能は注意して有効化すること。 WarningUsingThisBoxSlowDown=警告、このボックスを使用すると、ボックスを表示している全ページの速度が大幅に低下する。 WarningClickToDialUserSetupNotComplete=ユーザのClickToDial情報の設定が完了していない(ユーザカードのClickToDialタブを参照)。 WarningFeatureDisabledWithDisplayOptimizedForBlindNoJs=表示設定が視覚障害者またはテキストブラウザ用に最適化されている場合、機能は無効になる。 @@ -325,6 +326,7 @@ WarningPaymentDateLowerThanInvoiceDate=請求書%sの支払日(%s)が請求日(% WarningTooManyDataPleaseUseMoreFilters=データが多すぎる(%s行を超えている)。より多くのフィルタを使用するか、定数%sをより高い制限に設定すること。 WarningSomeLinesWithNullHourlyRate=時間料金が定義されていないときに、一部のユーザによって記録された時間もある。 1時間あたり0%sの値が使用されたが、これにより、費やされた時間の誤った評価が発生する可能性がある。 WarningYourLoginWasModifiedPleaseLogin=ログインが変更された。セキュリティ上の理由から、次のアクションの前に新規ログインでログインする必要がある。 +WarningYourPasswordWasModifiedPleaseLogin=パスワードが変更された。セキュリティ上の理由から、新しいパスワードで今すぐログインする必要がある。 WarningAnEntryAlreadyExistForTransKey=この言語の翻訳キーのエントリは既に存在する WarningNumberOfRecipientIsRestrictedInMassAction=警告、リストで一括アクションを使用する場合、異なる受信者の数は %sに制限される WarningDateOfLineMustBeInExpenseReportRange=警告、行の日付が経費報告書の範囲内にない diff --git a/htdocs/langs/ja_JP/eventorganization.lang b/htdocs/langs/ja_JP/eventorganization.lang index 7784a727c7f..737fd0e5663 100644 --- a/htdocs/langs/ja_JP/eventorganization.lang +++ b/htdocs/langs/ja_JP/eventorganization.lang @@ -172,3 +172,5 @@ ErrorSeveralCompaniesWithEmailContactUs=このメールを使用している会 ErrorSeveralCompaniesWithNameContactUs=この名前の会社がいくつか見つかったため、登録を自動的に検証ことはできない。手動検証については、%sまで問い合わせること。 NoPublicActionsAllowedForThisEvent=このイベントの公開アクションは公開されていない MaxNbOfAttendees=参加者の最大数 +DateStartEvent=イベント開始日 +DateEndEvent=イベント終了日 diff --git a/htdocs/langs/ja_JP/main.lang b/htdocs/langs/ja_JP/main.lang index fae378255eb..027ed62262d 100644 --- a/htdocs/langs/ja_JP/main.lang +++ b/htdocs/langs/ja_JP/main.lang @@ -151,8 +151,8 @@ Period=期間 PeriodEndDate=期間の終了日 SelectedPeriod=選択した期間 PreviousPeriod=前回の期間 -Activate=有効化 -Activated=有効化済 +Activate=活性化 +Activated=活性化済 Closed=閉じた Closed2=閉じた NotClosed=未閉鎖 @@ -226,6 +226,7 @@ NoUserGroupDefined=ユーザグループが定義されていない Password=パスワード PasswordRetype=パスワードを繰り返す NoteSomeFeaturesAreDisabled=機能/モジュールの多くは、このデモで無効になっていることに注意すること。 +YourUserFile=ユーザーファイル Name=名 NameSlashCompany=名前/法人 Person=人 @@ -897,6 +898,9 @@ MassFilesArea=大量アクションによって作成されたファイルの領 ShowTempMassFilesArea=大量アクションによって作成されたファイルの領域を表示する ConfirmMassDeletion=一括削除確定 ConfirmMassDeletionQuestion=選択した%sレコード(s)を削除してもよいか? +ConfirmMassClone=バルククローンの確認 +ConfirmMassCloneQuestion=クローン先のプロジェクトを選択 +ConfirmMassCloneToOneProject=プロジェクト %s へのクローン RelatedObjects=関連オブジェクト ClassifyBilled=請求分類 ClassifyUnbilled=未請求を分類する @@ -912,8 +916,8 @@ ExportFilteredList=フィルタリングされたリストをエクスポート ExportList=エクスポートリスト ExportOptions=エクスポートオプション IncludeDocsAlreadyExported=既にエクスポートされたドキュメントを含める -ExportOfPiecesAlreadyExportedIsEnable=既にエクスポートされたピースのエクスポートが有効になる -ExportOfPiecesAlreadyExportedIsDisable=既にエクスポートされたピースのエクスポートは無効になっている +ExportOfPiecesAlreadyExportedIsEnable=すでにエクスポートされたドキュメントが表示され、エクスポートされる +ExportOfPiecesAlreadyExportedIsDisable=すでにエクスポートされたドキュメントは非表示になり、エクスポートされない AllExportedMovementsWereRecordedAsExported=エクスポートされた全動きは、エクスポートされたものとして記録された NotAllExportedMovementsCouldBeRecordedAsExported=エクスポートされた全動きをエクスポート済として記録できるわけではない Miscellaneous=その他 @@ -1128,6 +1132,7 @@ DeleteFileText=本当にこのファイルを削除するか? ShowOtherLanguages=他の言語を表示する SwitchInEditModeToAddTranslation=この言語の翻訳を追加するには、編集モードに切り替える NotUsedForThisCustomer=この顧客には使用されていない +NotUsedForThisVendor=この仕入先には不使用 AmountMustBePositive=金額は正でなければならない ByStatus=状態別 InformationMessage=情報 @@ -1148,14 +1153,14 @@ EventReminder=イベントリマインダー UpdateForAllLines=全行を更新 OnHold=保留 Civility=敬称 -AffectTag=タグの割り当て -AffectUser=ユーザの割り当て -SetSupervisor=スーパーバイザを設定 +AffectTag=タグを割り当てる +AffectUser=ユーザーを割り当てる +SetSupervisor=スーパーバイザを設定する CreateExternalUser=外部ユーザを作成する ConfirmAffectTag=タグの一括割り当て ConfirmAffectUser=一括ユーザ割り当て -ProjectRole=各プロジェクトに割り当てられた役割 -TasksRole=各プロジェクトの各タスクに割り当てられた役割 +ProjectRole=各プロジェクト/機会に割り当てられた役割 +TasksRole=各タスクに割り当てられた役割 (使用されてれば) ConfirmSetSupervisor=バルク スーパーバイザ 設定 ConfirmUpdatePrice=値上げ/値下げ率を選択 ConfirmAffectTagQuestion=選択したレコード(s) %s にタグを割り当ててもよいか? @@ -1174,7 +1179,7 @@ SetToStatus=ステータス %s に設定 SetToEnabled=有効に設定 SetToDisabled=無効に設定 ConfirmMassEnabling=一括有効化の確定 -ConfirmMassEnablingQuestion=選択した%sレコード(s)を有効にするか? +ConfirmMassEnablingQuestion=選択した%sレコード(s)を有効化するか? ConfirmMassDisabling=一括無効化の確定 ConfirmMassDisablingQuestion=選択した%sレコード(s)を無効にしてもよいか? RecordsEnabled=%sレコード(s)が有効 @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=公開ポータルから作成 UserAgent=ユーザエージェント InternalUser=内部ユーザ ExternalUser=外部ユーザ +NoSpecificContactAddress=特定の連絡先や住所なし +NoSpecificContactAddressBis=このタブは、現在のオブジェクトの特定の連絡先またはアドレスを強制するためのもの。サードパーティに関する情報が十分でないか正確でない場合に、オブジェクトに対して 1 つまたは複数の特定の連絡先またはアドレスを定義する場合にのみ使用すること。 +HideOnVCard=%s を隠す +AddToContacts=連絡先にアドレスを追加 +LastAccess=最終アクセス +UploadAnImageToSeeAPhotoHere=タブ %s から画像をアップロードし、ここに写真を表示する +LastPasswordChangeDate=パスワードの最終変更日 diff --git a/htdocs/langs/ja_JP/mrp.lang b/htdocs/langs/ja_JP/mrp.lang index 62c5695ccfd..c27c4161eb4 100644 --- a/htdocs/langs/ja_JP/mrp.lang +++ b/htdocs/langs/ja_JP/mrp.lang @@ -83,7 +83,7 @@ ProductsToProduce=生産する製品 UnitCost=単価 TotalCost=総費用 BOMTotalCost=消費する各数量と製品のコストに基づいてこのBOMを生成するためのコスト(定義されている場合は原価、定義されている場合は平均加重価格、それ以外の場合は最良の購入価格を使用) -BOMTotalCostService=「ワークステーション」モジュールがアクティブ化され、ワークステーションがデフォルトでライン上に定義されている場合、計算は「数量 (時間に変換) x ワークステーション ahr」、それ以外の場合は「数量 (時間に変換) x サービスの原価」。 +BOMTotalCostService=「ワークステーション」モジュールが活性化され、ワークステーションがデフォルトでライン上に定義されている場合、計算は「数量 (時間に変換) x ワークステーション ahr」、それ以外の場合は「数量 (時間に変換) x サービスの原価」。 GoOnTabProductionToProduceFirst=製造指図を閉じるには、最初に製造を開始しておく必要がある(タブ '%s'を参照)。ただし、キャンセルすることはできる。 ErrorAVirtualProductCantBeUsedIntoABomOrMo=キットをBOMまたはMOに使用することはできない Workstation=ワークステーション @@ -93,8 +93,8 @@ WorkstationSetup = ワークステーションの設定 WorkstationSetupPage = ワークステーションの設定ページ WorkstationList=ワークステーションリスト WorkstationCreate=新しいワークステーションを追加する -ConfirmEnableWorkstation=ワークステーション%s を有効にするか? -EnableAWorkstation=ワークステーションを有効にする +ConfirmEnableWorkstation=ワークステーション%s を有効化するか? +EnableAWorkstation=ワークステーションを有効化 ConfirmDisableWorkstation=ワークステーション%s を無効にしてもよいか? DisableAWorkstation=ワークステーションを無効にする DeleteWorkstation=削除 @@ -102,6 +102,7 @@ NbOperatorsRequired=必要なオペレーターの数 THMOperatorEstimated=推定オペレーターTHM THMMachineEstimated=推定マシンTHM WorkstationType=ワークステーションタイプ +DefaultWorkstation=デフォルトのワークステーション Human=人間 Machine=機械 HumanMachine=人間/機械 diff --git a/htdocs/langs/ja_JP/orders.lang b/htdocs/langs/ja_JP/orders.lang index 79d1c47c9d9..ecd36add00e 100644 --- a/htdocs/langs/ja_JP/orders.lang +++ b/htdocs/langs/ja_JP/orders.lang @@ -96,6 +96,10 @@ OrdersStatisticsSuppliers=購買発注の統計 NumberOfOrdersByMonth=月別受注数 AmountOfOrdersByMonthHT=月別のご注文金額(税込) ListOfOrders=注文の一覧 +ListOrderLigne=注文明細 +productobuy=購買のみの製品 +productonly=製品のみ +disablelinefree=無料回線なし CloseOrder=密集隊形 ConfirmCloseOrder=この注文を配信済に設定してもよいか?注文が配信されると、請求に設定できる。 ConfirmDeleteOrder=この注文を削除してもよいか? @@ -131,6 +135,7 @@ SupplierOrderClassifiedBilled=購買発注%sセットの請求 OtherOrders=他の注文 SupplierOrderValidatedAndApproved=サプライヤーの注文は検証済および承認されている:%s SupplierOrderValidated=サプライヤーの注文が検証済される:%s +OrderShowDetail=注文の詳細を表示 ##### Types de contacts ##### TypeContact_commande_internal_SALESREPFOLL=代表的なフォローアップ受注 TypeContact_commande_internal_SHIPPING=代表的なフォローアップ出荷 @@ -199,3 +204,5 @@ StatusSupplierOrderApproved=承認された StatusSupplierOrderRefused=拒否 StatusSupplierOrderReceivedPartially=部分的に受け StatusSupplierOrderReceivedAll=受け取った全製品 +NeedAtLeastOneInvoice = 少なくとも 1 つの請求書が必要 +LineAlreadyDispatched = 受注明細はすでに受領されている。 diff --git a/htdocs/langs/ja_JP/stripe.lang b/htdocs/langs/ja_JP/stripe.lang index 68a15282dee..12186cdef71 100644 --- a/htdocs/langs/ja_JP/stripe.lang +++ b/htdocs/langs/ja_JP/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Webhookライブキー ONLINE_PAYMENT_WAREHOUSE=オンライン支払が行われるときに在庫減少に使用する在庫
    (TODO請求書のアクションで在庫を減らすオプションが実行され、オンライン支払がそれ自体で請求書を生成する場合?) StripeLiveEnabled=Stripe ライブが有効(それ以外の場合はテスト/サンドボックスモード) StripeImportPayment=Stripe 支払のインポート -ExampleOfTestCreditCard=テスト用のクレジットカードの例:%s =>有効、%s =>エラーCVC、%s =>期限切れ、%s =>充電に失敗 +ExampleOfTestCreditCard=SEPA テストのクレジット カードの例: %s => 有効、%s => エラー CVC、%s => 有効期限切れ、%s => 請求失敗 +ExampleOfTestBankAcountForSEPA=口座振替テストの銀行口座 BAN の例: %s StripeGateways=Stripe ゲートウェイ OAUTH_STRIPE_TEST_ID=Stripe ConnectクライアントID(ca _...) OAUTH_STRIPE_LIVE_ID=Stripe ConnectクライアントID(ca _...) @@ -61,6 +62,7 @@ DeleteACard=カードを削除 ConfirmDeleteCard=このクレジットカードまたはデビットカードを削除してもよいか? CreateCustomerOnStripe=Stripeで顧客を作成する CreateCardOnStripe=Stripeでカードを作成する +CreateBANOnStripe=Stripe で銀行を作成する ShowInStripe=Stripe で表示 StripeUserAccountForActions=一部のStripeイベントの電子メール通知に使用するユーザアカウント(Stripeペイアウト) StripePayoutList=Stripe ペイアウトのリスト @@ -69,4 +71,8 @@ ToOfferALinkForLiveWebhook=IPNを呼び出すためのStripeWebHookの設定へ PaymentWillBeRecordedForNextPeriod=支払は次の期間に記録される。 ClickHereToTryAgain= ここをクリックして再試行すること... CreationOfPaymentModeMustBeDoneFromStripeInterface=強力な顧客認証ルールにより、カードの作成はStripeバックオフィスから行う必要がある。 Stripeの顧客レコードをオンにするには、ここをクリックすること:%s -TERMINAL_LOCATION=端末の場所(住所) +STRIPE_CARD_PRESENT=ストライプ端末のカードプレゼント +TERMINAL_LOCATION=Stripe 端末の場所 (アドレス) +RequestDirectDebitWithStripe=Stripe で口座振替をリクエストする +STRIPE_SEPA_DIRECT_DEBIT=Stripe による口座振替の支払いを有効にする + diff --git a/htdocs/langs/ja_JP/ticket.lang b/htdocs/langs/ja_JP/ticket.lang index 12e00a0866b..e7ae49dac9f 100644 --- a/htdocs/langs/ja_JP/ticket.lang +++ b/htdocs/langs/ja_JP/ticket.lang @@ -26,6 +26,7 @@ Permission56002=チケットを変更する Permission56003=チケットを削除する Permission56004=チケットを管理する Permission56005=全取引先のチケットを参照すること(外部ユーザには有効ではなく、常に依存している取引先に限定される) +Permission56006=チケットのエクスポート Tickets=切符売場 TicketDictType=チケット-タイプ @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=外部寄稿者 OriginEmail=レポーターのメール Notify_TICKET_SENTBYMAIL=メールでチケットメッセージを送信する +ExportDataset_ticket_1=切符売場 + # Status Read=読む Assigned=割り当て済 @@ -113,21 +116,21 @@ TicketPublicInterfaceTopicHelp=このテキストは、公開インターフェ TicketPublicInterfaceTextHelpMessageLabelAdmin=メッセージエントリへのヘルプテキスト TicketPublicInterfaceTextHelpMessageHelpAdmin=このテキストは、ユーザのメッセージ入力領域の上に表示される。 ExtraFieldsTicket=追加の属性 -TicketCkEditorEmailNotActivated=HTMLエディタが有効化されていない。 FCKEDITOR_ENABLE_MAILのコンテンツを1に設定して取得すること。 +TicketCkEditorEmailNotActivated=HTMLエディタが活性化されていない。 FCKEDITOR_ENABLE_MAILのコンテンツを1に設定して取得すること。 TicketsDisableEmail=チケットの作成やメッセージの記録のためにメールを送信しないこと -TicketsDisableEmailHelp=デフォルトでは、新規チケットまたはメッセージが作成されたときに電子メールが送信される。このオプションを有効にすると、*全*電子メール通知が無効になる -TicketsLogEnableEmail=メールでログを有効にする +TicketsDisableEmailHelp=デフォルトでは、新規チケットまたはメッセージが作成されたときに電子メールが送信される。このオプションを有効化すると、*全*電子メール通知が無効になる +TicketsLogEnableEmail=メールでログを有効化 TicketsLogEnableEmailHelp=変更のたびに、チケットに関連付けられた**各連絡先**にメールが送信される。 TicketParams=パラメータ TicketsShowModuleLogo=公開インターフェイスにモジュールのロゴを表示する -TicketsShowModuleLogoHelp=このオプションを有効にすると、公開インターフェイスのページでロゴモジュールが非表示になる +TicketsShowModuleLogoHelp=このオプションを有効化と、公開インターフェイスのページでロゴモジュールが非表示になる TicketsShowCompanyLogo=公開インターフェイスに法人のロゴを表示する -TicketsShowCompanyLogoHelp=このオプションを有効にすると、公開インターフェイスのページで主要法人のロゴが非表示になる。 +TicketsShowCompanyLogoHelp=このオプションを有効化すると、公開インターフェイスのページで主法人のロゴが非表示になる。 TicketsEmailAlsoSendToMainAddress=また、メインの電子メールアドレスに通知を送信する -TicketsEmailAlsoSendToMainAddressHelp=このオプションを有効にすると、設定「%s」で定義されたアドレスにも電子メールが送信される(タブ「%s」を参照)。 +TicketsEmailAlsoSendToMainAddressHelp=このオプションを有効化と、設定「%s」で定義されたアドレスにも電子メールが送信される(タブ「%s」を参照)。 TicketsLimitViewAssignedOnly=現在のユーザに割り当てられたチケットに表示を制限する(外部ユーザには無効で、常に依存している取引先に制限される) TicketsLimitViewAssignedOnlyHelp=現在のユーザに割り当てられているチケットのみが表示される。チケット管理権を持つユーザには適用されない。 -TicketsActivatePublicInterface=公開インターフェイスを有効化する +TicketsActivatePublicInterface=公開インターフェイスを活性化する TicketsActivatePublicInterfaceHelp=公開インターフェイスにより、全訪問者がチケットを作成できる。 TicketsAutoAssignTicket=チケットを作成したユーザを自動的に割り当てる TicketsAutoAssignTicketHelp=チケットを作成するときに、ユーザを自動的にチケットに割り当てることができる。 diff --git a/htdocs/langs/ja_JP/users.lang b/htdocs/langs/ja_JP/users.lang index addeadd1116..70a62efac33 100644 --- a/htdocs/langs/ja_JP/users.lang +++ b/htdocs/langs/ja_JP/users.lang @@ -18,13 +18,13 @@ DisableUser=無効にする DisableAUser=ユーザを無効にする DeleteUser=削除 DeleteAUser=ユーザを削除する -EnableAUser=ユーザを有効にする。 +EnableAUser=ユーザを有効化。 DeleteGroup=削除する DeleteAGroup=グループを削除する ConfirmDisableUser=ユーザ%s を無効にしてもよいか? ConfirmDeleteUser=ユーザ%s を削除してもよいか? ConfirmDeleteGroup=グループ%s を削除してもよいか? -ConfirmEnableUser=ユーザ%s を有効にするか? +ConfirmEnableUser=ユーザ%s を有効化するか? ConfirmReinitPassword=ユーザ%s の新規パスワードを生成してもよいか? ConfirmSendNewPassword=ユーザ%s の新規パスワードを生成して送信してもよいか? NewUser=新規ユーザ @@ -66,11 +66,12 @@ LinkedToDolibarrUser=ユーザへのリンク LinkedToDolibarrThirdParty=取引先へのリンク CreateDolibarrLogin=ユーザを作成する CreateDolibarrThirdParty=取引先を作成する。 -LoginAccountDisableInDolibarr=Dolibarrでアカウントを無効にする。 +LoginAccountDisableInDolibarr=Dolibarr で無効になっているアカウント +PASSWORDInDolibarr=Dolibarr で変更されたパスワード UsePersonalValue=個人的な値を使用 ExportDataset_user_1=ユーザとそのプロパティ DomainUser=ドメインユーザ%s -Reactivate=再有効化 +Reactivate=再活性化 CreateInternalUserDesc=このフォームを使用すると、法人/組織に内部ユーザを作成できる。外部ユーザ(顧客、仕入先など)を作成するには、その取引先の連絡先カードから Dolibarrユーザの作成 ボタンを使用する。 InternalExternalDesc=内部ユーザは、法人/組織の一部であるユーザ、または法人に関連するデータよりも多くのデータを表示する必要がある組織外のパートナーユーザ(許可システムは、彼が見るまたは実行することの可・不可を定義)。
    外部ユーザは、自分に関連するデータのみを表示する必要がある顧客、仕入先、またはその他のユーザ(取引先の外部ユーザの作成は、取引先の連絡先レコードから実行できる)。

    どちらの場合も、ユーザが必要とする機能に対するアクセス許可を付与する必要がある。 PermissionInheritedFromAGroup=ユーザのグループのいずれかから継承されたので、許可が付与される。 @@ -84,7 +85,7 @@ NewUserPassword=%s用パスワードの変更 NewPasswordValidated=新規パスワードは検証済であり、ログインするには今すぐ使用する必要がある。 EventUserModified=ユーザの%sは変更 UserDisabled=ユーザの%sが無効になって -UserEnabled=ユーザ%sは、有効化済 +UserEnabled=ユーザ%sは、活性化済 UserDeleted=ユーザ%sは削除され NewGroupCreated=グループ%sが作成 GroupModified=グループ%sが変更された @@ -129,3 +130,6 @@ IPLastLogin=IP最終ログイン IPPreviousLogin=IP前回ログイン ShowAllPerms=すべての権限行を表示 HideAllPerms=すべての許可行を非表示 +UserPublicPageDesc=このユーザーの仮想カードを有効化可能。ユーザー プロファイルとバーコードを含む URL が利用可能になり、スマートフォンを持っている人なら誰でもそれをスキャンしてアドレス帳に連絡先を追加できる。 +EnablePublicVirtualCard=パブリック仮想ユーザー カードを有効化 +PublicVirtualCardUrl=パブリック仮想ユーザー カード diff --git a/htdocs/langs/kk_KZ/accountancy.lang b/htdocs/langs/kk_KZ/accountancy.lang index 4c8e26da44d..23a349ad40c 100644 --- a/htdocs/langs/kk_KZ/accountancy.lang +++ b/htdocs/langs/kk_KZ/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Артқа қайту түрін таңдаңыз ACCOUNTING_EXPORT_PREFIX_SPEC=Файл атауының префиксін көрсетіңіз ThisService=Бұл қызмет ThisProduct=Бұл өнім -DefaultForService=Қызметтің әдепкі мәні -DefaultForProduct=Өнімнің әдепкі мәні +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Бұл үшінші тарапқа арналған өнім ServiceForThisThirdparty=Бұл үшінші тарапқа қызмет көрсету CantSuggest=Ұсыну мүмкін емес @@ -101,7 +101,8 @@ ShowAccountingAccount=Бухгалтерлік есепті көрсету ShowAccountingJournal=Бухгалтерлік журналды көрсету ShowAccountingAccountInLedger=Бухгалтерлік есепті бухгалтерлік есепте көрсету ShowAccountingAccountInJournals=Журналдарда бухгалтерлік есепті көрсетіңіз -AccountAccountingSuggest=Бухгалтерлік есеп ұсынылды +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=Әдепкі есептік жазбалар MenuBankAccounts=Банктік шоттар MenuVatAccounts=ҚҚС шоттары @@ -126,6 +127,7 @@ WriteBookKeeping=Record transactions in accounting Bookkeeping=Кітап BookkeepingSubAccount=Қосалқы кітап AccountBalance=Шоттың қалдығы +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Бастапқы объект реф CAHTF=Сатып алушылардың жалпы сомасы салыққа дейін TotalExpenseReport=Жалпы шығындар есебі @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=Журнал белгісі NumPiece=Бөлшектің нөмірі TransactionNumShort=Сан транзакция AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Бас бухгалтерлік есеп бойынша топтастыру GroupBySubAccountAccounting=Қосалқы шот бойынша топтастыру AccountingAccountGroupsDesc=Мұнда сіз бухгалтерлік есептің кейбір топтарын анықтай аласыз. Олар дербестендірілген бухгалтерлік есептер үшін пайдаланылады. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Деңгей бойынша қосалқы жиынтығы Pcgtype=Есеп тобы PcgtypeDesc=Есептер тобы кейбір бухгалтерлік есептер үшін алдын ала анықталған «сүзгі» және «топтастыру» критерийлері ретінде қолданылады. Мысалы, «КІРІС» немесе «ШЫҒЫНДАР» шығыстар/кірістер туралы есепті құру үшін өнімнің бухгалтерлік есеп шоттары үшін топ ретінде қолданылады. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Келісімді @@ -294,6 +299,7 @@ DescValidateMovements=Жазуды, жазуды және жоюды кез ке ValidateHistory=Автоматты түрде байлау AutomaticBindingDone=Automatic bindings done (%s) - Automatic binding not possible for some record (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Сату кезінде бухгалтерл ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Сатып алу кезінде бухгалтерлік есепте байланыстыруды және аударуды өшіру (жеткізушілердің шот -фактуралары бухгалтерлік есепке алынбайды) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Бухгалтерлік есепте міндеттемелер мен аударымдарды өшіру (шығындар туралы есептер бухгалтерлік есепке алынбайды) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Flag exported lines as Exported (to modify a line, you will need to delete the whole transaction and re-transfert it into accounting) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=Date validation and lock ConfirmExportFile=Бухгалтерлік экспорттық файлдың генерациясын растау? ExportDraftJournal=Журналдың жобасын экспорттау @@ -398,7 +406,7 @@ SaleLocal=Жергілікті сату SaleExport=Экспорттық сату SaleEEC=ЕЭК -те сату SaleEECWithVAT=ЕЭК -те ҚҚС -мен сату нөлге тең емес, сондықтан біздің ойымызша бұл сатылымнан тыс сату емес және ұсынылған шот - бұл өнімнің стандартты шоты. -SaleEECWithoutVATNumber=ЕЭК -те ҚҚС жоқ сату, бірақ үшінші тараптың ҚҚС идентификаторы анықталмаған. Біз стандартты сату бойынша өнім шотынан бас тартамыз. Қажет болса, үшінші тараптың ҚҚС идентификаторын немесе өнім шотын түзетуге болады. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Forbidden: The transaction has been validated and/or exported. ForbiddenTransactionAlreadyValidated=Forbidden: The transaction has been validated. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Mismatch in reconcile code AccountancyErrorMismatchBalanceAmount=The balance (%s) is not equal to 0 AccountancyErrorLetteringBookkeeping=Errors have occurred concerning the transactions: %s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Бухгалтерлік жазбалар @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Көп валюталық код (Idevise) DateExport=Күнді экспорттау WarningReportNotReliable=Ескерту, бұл есеп кітапқа негізделмеген, сондықтан кітапта қолмен өзгертілген транзакцияны қамтымайды. Егер сіздің журналистика жаңартылған болса, онда бухгалтерлік есеп дәлірек болады. ExpenseReportJournal=Шығындар туралы есеп журналы +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s есептік жазбалары diff --git a/htdocs/langs/kk_KZ/main.lang b/htdocs/langs/kk_KZ/main.lang index d1aed3017b1..c8c71ea1157 100644 --- a/htdocs/langs/kk_KZ/main.lang +++ b/htdocs/langs/kk_KZ/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=Пайдаланушылар тобы анықталмаға Password=Құпия сөз PasswordRetype=Repeat your password NoteSomeFeaturesAreDisabled=Бұл демонстрацияда көптеген мүмкіндіктер/модульдер өшірілгенін ескеріңіз. +YourUserFile=Your user file Name=Аты NameSlashCompany=Аты / Компания Person=Адам @@ -897,6 +898,9 @@ MassFilesArea=Жаппай әрекеттермен салынған файлд ShowTempMassFilesArea=Жаппай әрекеттермен салынған файлдар аймағын көрсету ConfirmMassDeletion=Жаппай жоюды растау ConfirmMassDeletionQuestion=%s таңдалған жазбаларды жойғыңыз келетініне сенімдісіз бе? +ConfirmMassClone=Bulk clone confirmation +ConfirmMassCloneQuestion=Select project to clone to +ConfirmMassCloneToOneProject=Clone to project %s RelatedObjects=Қатысты объектілер ClassifyBilled=Есепшотты жіктеу ClassifyUnbilled=Есепсіз жіктеу @@ -912,8 +916,8 @@ ExportFilteredList=Сүзілген тізімді экспорттау ExportList=Экспорттау тізімі ExportOptions=Экспорттау параметрлері IncludeDocsAlreadyExported=Қазірдің өзінде экспортталған құжаттарды қосыңыз -ExportOfPiecesAlreadyExportedIsEnable=Экспортталған бөлшектерді экспорттау мүмкіндігі қосылған -ExportOfPiecesAlreadyExportedIsDisable=Экспортталған бөлшектерді экспорттау өшірілген +ExportOfPiecesAlreadyExportedIsEnable=Documents already exported are visible and will be exported +ExportOfPiecesAlreadyExportedIsDisable=Documents already exported are hidden and won't be exported AllExportedMovementsWereRecordedAsExported=Барлық экспортталған қозғалыстар экспорттық ретінде тіркелді NotAllExportedMovementsCouldBeRecordedAsExported=Экспортталған қозғалыстардың барлығын экспорт ретінде жазу мүмкін емес Miscellaneous=Әр түрлі @@ -1128,6 +1132,7 @@ DeleteFileText=Бұл файлды шынымен жойғыңыз келе ме ShowOtherLanguages=Басқа тілдерді көрсету SwitchInEditModeToAddTranslation=Бұл тілге аударма қосу үшін өңдеу режиміне ауысыңыз NotUsedForThisCustomer=Бұл тұтынушы үшін қолданылмайды +NotUsedForThisVendor=Not used for this vendor AmountMustBePositive=Саны оң болуы керек ByStatus=Мәртебесі бойынша InformationMessage=ақпарат @@ -1148,14 +1153,14 @@ EventReminder=Оқиғаны еске салғыш UpdateForAllLines=Барлық жолдар үшін жаңарту OnHold=Күтуде Civility=Азаматтық -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Set Supervisor +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor CreateExternalUser=Сыртқы пайдаланушыны құру ConfirmAffectTag=Bulk Tag Assignement ConfirmAffectUser=Bulk User Assignement -ProjectRole=Role assigned on each project -TasksRole=Role assigned on each task of each project +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ConfirmSetSupervisor=Bulk Supervisor Set ConfirmUpdatePrice=Choose a increase/decrease price rate ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Created from Public portal UserAgent=User Agent InternalUser=Internal user ExternalUser=External user +NoSpecificContactAddress=No specific contact or address +NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. +HideOnVCard=Hide %s +AddToContacts=Add address to my contacts +LastAccess=Last access +UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here +LastPasswordChangeDate=Last password change date diff --git a/htdocs/langs/kk_KZ/stripe.lang b/htdocs/langs/kk_KZ/stripe.lang index 26444a93d5a..d4e578af492 100644 --- a/htdocs/langs/kk_KZ/stripe.lang +++ b/htdocs/langs/kk_KZ/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Webhook тірі кілті ONLINE_PAYMENT_WAREHOUSE=
    (TODO) Акцияны төмендету опциясы шот -фактура бойынша жасалса және онлайн төлем өзі шот -фактураны шығаратын болса, акцияның төмендеуі үшін пайдаланылатын акция. StripeLiveEnabled=Stripe live қосылған (әйтпесе тест/құм жәшігі режимі) StripeImportPayment=Stripe төлемдерін импорттау -ExampleOfTestCreditCard=Сынақ үшін несие картасының мысалы: %s => жарамды, %s => CVC қатесі, %s => мерзімі өтіп кетті, %s => заряд сәтсіз +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +ExampleOfTestBankAcountForSEPA=Example of bank account BAN for direct debit test: %s StripeGateways=Жолақты шлюздер OAUTH_STRIPE_TEST_ID=Stripe Connect клиент идентификаторы (шамамен _...) OAUTH_STRIPE_LIVE_ID=Stripe Connect клиент идентификаторы (шамамен _...) @@ -61,6 +62,7 @@ DeleteACard=Картаны жою ConfirmDeleteCard=Бұл несиелік немесе дебеттік картаны шынымен жойғыңыз келе ме? CreateCustomerOnStripe=Stripe -де тұтынушы жасаңыз CreateCardOnStripe=Stripe картасын жасаңыз +CreateBANOnStripe=Create bank on Stripe ShowInStripe=Stripe -те көрсету StripeUserAccountForActions=Кейбір Stripe оқиғалары туралы электрондық пошта арқылы хабарландыру үшін қолданылатын пайдаланушы тіркелгісі (Stripe төлемдері) StripePayoutList=Stripe төлемдерінің тізімі @@ -69,3 +71,8 @@ ToOfferALinkForLiveWebhook=IPN -ге қоңырау шалу үшін Stripe Web PaymentWillBeRecordedForNextPeriod=Төлем келесі кезеңге жазылады. ClickHereToTryAgain= Қайталап көру үшін мына жерді басыңыз ... CreationOfPaymentModeMustBeDoneFromStripeInterface=Клиенттердің аутентификациясының күшті ережелеріне байланысты картаны Stripe backoffice -тен жасау керек. Stripe тұтынушылар жазбасын қосу үшін мына жерді басуға болады: %s +STRIPE_CARD_PRESENT=Card Present for Stripe Terminals +TERMINAL_LOCATION=Location (address) for Stripe Terminals +RequestDirectDebitWithStripe=Request Direct Debit with Stripe +STRIPE_SEPA_DIRECT_DEBIT=Enable the Direct Debit payments through Stripe + diff --git a/htdocs/langs/kk_KZ/users.lang b/htdocs/langs/kk_KZ/users.lang index a6510d87401..6d39793595f 100644 --- a/htdocs/langs/kk_KZ/users.lang +++ b/htdocs/langs/kk_KZ/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Link to user LinkedToDolibarrThirdParty=Link to third party CreateDolibarrLogin=Пайдаланушы жасаңыз CreateDolibarrThirdParty=Үшінші тарап құру -LoginAccountDisableInDolibarr=Dolibarr есептік жазбасы өшірілген. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Жеке құндылықты қолданыңыз ExportDataset_user_1=Қолданушылар және олардың қасиеттері DomainUser=%s домен қолданушысы @@ -129,3 +130,6 @@ IPLastLogin=IP last login IPPreviousLogin=IP previous login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/lo_LA/accountancy.lang b/htdocs/langs/lo_LA/accountancy.lang index 9fcd2de4073..ae76b7d205e 100644 --- a/htdocs/langs/lo_LA/accountancy.lang +++ b/htdocs/langs/lo_LA/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=ເລືອກປະເພດການຂົນສົ ACCOUNTING_EXPORT_PREFIX_SPEC=Specify the prefix for the file name ThisService=ການບໍລິການນີ້ ThisProduct=ຜະລິດຕະພັນນີ້ -DefaultForService=ຄ່າເລີ່ມຕົ້ນ ສຳ ລັບການບໍລິການ -DefaultForProduct=ຄ່າເລີ່ມຕົ້ນ ສຳ ລັບຜະລິດຕະພັນ +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=ຜະລິດຕະພັນສໍາລັບພາກສ່ວນທີສາມນີ້ ServiceForThisThirdparty=ບໍລິການ ສຳ ລັບພາກສ່ວນທີສາມນີ້ CantSuggest=ບໍ່ສາມາດແນະ ນຳ ໄດ້ @@ -101,7 +101,8 @@ ShowAccountingAccount=ສະແດງບັນຊີບັນຊີ ShowAccountingJournal=ສະແດງວາລະສານບັນຊີ ShowAccountingAccountInLedger=ສະແດງບັນຊີການບັນຊີຢູ່ໃນບັນຊີແຍກປະເພດ ShowAccountingAccountInJournals=ສະແດງບັນຊີບັນຊີຢູ່ໃນວາລະສານ -AccountAccountingSuggest=ບັນຊີບັນຊີແນະນໍາ +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=ບັນຊີເລີ່ມຕົ້ນ MenuBankAccounts=ບັນຊີທະນາຄານ MenuVatAccounts=ບັນຊີອາກອນ @@ -126,6 +127,7 @@ WriteBookKeeping=Record transactions in accounting Bookkeeping=ປື້ມບັນຊີ BookkeepingSubAccount=Subledger AccountBalance=ຍອດເງິນໃນບັນຊີ +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=ແຫຼ່ງຂໍ້ມູນອ້າງອີງ CAHTF=ຜູ້ຂາຍທັງpurchaseົດທີ່ຊື້ກ່ອນອາກອນ TotalExpenseReport=ລາຍງານລາຍຈ່າຍທັງົດ @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=ປ້າຍວາລະສານ NumPiece=ຈໍານວນສິ້ນ TransactionNumShort=ຕົວເລກ. ທຸລະກໍາ AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=ຈັດກຸ່ມຕາມບັນຊີແຍກປະເພດທົ່ວໄປ GroupBySubAccountAccounting=ຈັດກຸ່ມຕາມບັນຊີ subledger AccountingAccountGroupsDesc=ເຈົ້າສາມາດ ກຳ ນົດທີ່ນີ້ບາງກຸ່ມບັນຊີບັນຊີ. ພວກມັນຈະຖືກນໍາໃຊ້ສໍາລັບບົດລາຍງານການບັນຊີສ່ວນບຸກຄົນ. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=ສະແດງຜົນຮວມຍ່ອຍຕາມລະ Pcgtype=ກຸ່ມບັນຊີ PcgtypeDesc=ກຸ່ມບັນຊີໄດ້ຖືກນໍາໃຊ້ເປັນເກນທີ່ໄດ້ກໍານົດໄວ້ລ່ວງ ໜ້າ 'ຕົວກັ່ນຕອງ' ແລະ 'ການຈັດກຸ່ມ' ສໍາລັບບົດລາຍງານການບັນຊີບາງອັນ. ຕົວຢ່າງ, 'ລາຍຮັບ' ຫຼື 'ລາຍຈ່າຍ' ຖືກໃຊ້ເປັນກຸ່ມສໍາລັບບັນຊີບັນຊີຂອງຜະລິດຕະພັນເພື່ອສ້າງລາຍງານລາຍຈ່າຍ/ລາຍຮັບ. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=ເຂົ້າກັນໄດ້ @@ -294,6 +299,7 @@ DescValidateMovements=ການດັດແກ້ຫຼືການລຶບລ ValidateHistory=ຜູກມັດອັດຕະໂນມັດ AutomaticBindingDone=Automatic bindings done (%s) - Automatic binding not possible for some record (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=ປິດໃຊ້ງານການຜູ ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=ປິດໃຊ້ງານການຜູກມັດແລະການໂອນບັນຊີຢູ່ໃນການຊື້ (ໃບເກັບເງິນຂອງຜູ້ຂາຍຈະບໍ່ຖືກເອົາເຂົ້າໃນບັນຊີ) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=ປິດໃຊ້ງານການຜູກມັດແລະການໂອນບັນຊີຢູ່ໃນລາຍງານລາຍຈ່າຍ (ບົດລາຍງານຄ່າໃຊ້ຈ່າຍຈະບໍ່ຖືກເອົາເຂົ້າໃນບັນຊີ) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Flag exported lines as Exported (to modify a line, you will need to delete the whole transaction and re-transfert it into accounting) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=Date validation and lock ConfirmExportFile=ການຢືນຢັນການສ້າງເອກະສານການສົ່ງອອກບັນຊີບໍ? ExportDraftJournal=ສົ່ງອອກວາລະສານຮ່າງ @@ -398,7 +406,7 @@ SaleLocal=ການຂາຍໃນທ້ອງຖິ່ນ SaleExport=ຂາຍສົ່ງອອກ SaleEEC=ຂາຍໃນ EEC SaleEECWithVAT=ການຂາຍໃນ EEC ດ້ວຍອາກອນມູນຄ່າເພີ່ມບໍ່ແມ່ນ null, ດັ່ງນັ້ນພວກເຮົາຄິດວ່າອັນນີ້ບໍ່ແມ່ນການຂາຍພາຍໃນລະບົບສື່ສານແລະບັນຊີທີ່ແນະນໍາແມ່ນບັນຊີຜະລິດຕະພັນມາດຕະຖານ. -SaleEECWithoutVATNumber=ຂາຍໃນ EEC ໂດຍບໍ່ມີ VAT ແຕ່ ID VAT ຂອງພາກສ່ວນທີສາມບໍ່ໄດ້ລະບຸ. ພວກເຮົາຕົກຢູ່ໃນບັນຊີຜະລິດຕະພັນສໍາລັບການຂາຍມາດຕະຖານ. ເຈົ້າສາມາດແກ້ໄຂ VAT ID ຂອງພາກສ່ວນທີສາມຫຼືບັນຊີຜະລິດຕະພັນຖ້າຈໍາເປັນ. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Forbidden: The transaction has been validated and/or exported. ForbiddenTransactionAlreadyValidated=Forbidden: The transaction has been validated. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Mismatch in reconcile code AccountancyErrorMismatchBalanceAmount=The balance (%s) is not equal to 0 AccountancyErrorLetteringBookkeeping=Errors have occurred concerning the transactions: %s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=ລາຍການບັນຊີ @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=ລະຫັດຫຼາຍສະກຸນເງິ DateExport=ວັນທີສົ່ງອອກ WarningReportNotReliable=ຄຳ ເຕືອນ, ບົດລາຍງານນີ້ບໍ່ໄດ້ອີງໃສ່ປຶ້ມບັນຊີ, ສະນັ້ນບໍ່ມີການເຮັດທຸລະ ກຳ ທີ່ດັດແກ້ດ້ວຍຕົນເອງຢູ່ໃນປຶ້ມບັນຊີ. ຖ້າວາລະສານຂອງເຈົ້າໃis່ຫຼ້າສຸດ, ມຸມມອງການເຮັດບັນຊີແມ່ນຖືກຕ້ອງກວ່າ. ExpenseReportJournal=ວາລະສານລາຍງານລາຍຈ່າຍ +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s ບັນຊີ diff --git a/htdocs/langs/lo_LA/main.lang b/htdocs/langs/lo_LA/main.lang index 04c00c0ec87..ed0fdea00e4 100644 --- a/htdocs/langs/lo_LA/main.lang +++ b/htdocs/langs/lo_LA/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=ບໍ່ໄດ້ ກຳ ນົດກຸ່ມຜູ້ໃ Password=ລະຫັດຜ່ານ PasswordRetype=Repeat your password NoteSomeFeaturesAreDisabled=ໃຫ້ສັງເກດວ່າຫຼາຍລັກສະນະ/ໂມດູນຖືກປິດໃຊ້ງານຢູ່ໃນການສາທິດນີ້. +YourUserFile=Your user file Name=ຊື່ NameSlashCompany=ຊື່ / ບໍລິສັດ Person=ບຸກຄົນ @@ -897,6 +898,9 @@ MassFilesArea=ພື້ນທີ່ສໍາລັບໄຟລ built ທີ່ ShowTempMassFilesArea=ສະແດງພື້ນທີ່ຂອງໄຟລ built ທີ່ສ້າງຂຶ້ນໂດຍການກະ ທຳ ຂອງມວນຊົນ ConfirmMassDeletion=ການຢືນຢັນການລຶບ ຈຳ ນວນຫຼາຍ ConfirmMassDeletionQuestion=ເຈົ້າແນ່ໃຈບໍ່ວ່າເຈົ້າຕ້ອງການລຶບບັນທຶກທີ່ເລືອກ %s? +ConfirmMassClone=Bulk clone confirmation +ConfirmMassCloneQuestion=Select project to clone to +ConfirmMassCloneToOneProject=Clone to project %s RelatedObjects=ຈຸດປະສົງທີ່ກ່ຽວຂ້ອງ ClassifyBilled=ຈັດປະເພດໃບບິນ ClassifyUnbilled=ຈັດປະເພດບໍ່ໄດ້ຮຽກເກັບເງິນ @@ -912,8 +916,8 @@ ExportFilteredList=ສົ່ງອອກລາຍການທີ່ກັ່ນ ExportList=ລາຍການສົ່ງອອກ ExportOptions=ຕົວເລືອກການສົ່ງອອກ IncludeDocsAlreadyExported=ຮວມເອົາເອກະສານທີ່ສົ່ງອອກແລ້ວ -ExportOfPiecesAlreadyExportedIsEnable=ເປີດໃຊ້ການສົ່ງອອກຊິ້ນສ່ວນທີ່ໄດ້ສົ່ງອອກໄປແລ້ວ -ExportOfPiecesAlreadyExportedIsDisable=ການສົ່ງອອກຊິ້ນສ່ວນທີ່ສົ່ງອອກໄປແລ້ວແມ່ນຖືກປິດການ ນຳ ໃຊ້ +ExportOfPiecesAlreadyExportedIsEnable=Documents already exported are visible and will be exported +ExportOfPiecesAlreadyExportedIsDisable=Documents already exported are hidden and won't be exported AllExportedMovementsWereRecordedAsExported=ການເຄື່ອນໄຫວສົ່ງອອກທັງwereົດຖືກບັນທຶກເປັນການສົ່ງອອກ NotAllExportedMovementsCouldBeRecordedAsExported=ບໍ່ແມ່ນທຸກການເຄື່ອນໄຫວສົ່ງອອກສາມາດຖືກບັນທຶກເປັນການສົ່ງອອກໄດ້ Miscellaneous=ອື່ນisc @@ -1128,6 +1132,7 @@ DeleteFileText=ເຈົ້າຕ້ອງການລຶບໄຟລນີ້ ShowOtherLanguages=ສະແດງພາສາອື່ນ SwitchInEditModeToAddTranslation=ສະຫຼັບໃນໂeditດແກ້ໄຂເພື່ອເພີ່ມການແປພາສານີ້ NotUsedForThisCustomer=ບໍ່ໄດ້ໃຊ້ສໍາລັບລູກຄ້ານີ້ +NotUsedForThisVendor=Not used for this vendor AmountMustBePositive=ຈຳ ນວນຕ້ອງເປັນຄ່າບວກ ByStatus=ໂດຍສະຖານະພາບ InformationMessage=ຂໍ້ມູນຂ່າວສານ @@ -1148,14 +1153,14 @@ EventReminder=ການເຕືອນເຫດການ UpdateForAllLines=ອັບເດດທຸກສາຍ OnHold=ພັກໄວ້ Civility=ຄວາມສຸພາບ -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Set Supervisor +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor CreateExternalUser=ສ້າງຜູ້ໃຊ້ພາຍນອກ ConfirmAffectTag=Bulk Tag Assignement ConfirmAffectUser=Bulk User Assignement -ProjectRole=Role assigned on each project -TasksRole=Role assigned on each task of each project +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ConfirmSetSupervisor=Bulk Supervisor Set ConfirmUpdatePrice=Choose a increase/decrease price rate ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Created from Public portal UserAgent=User Agent InternalUser=Internal user ExternalUser=External user +NoSpecificContactAddress=No specific contact or address +NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. +HideOnVCard=Hide %s +AddToContacts=Add address to my contacts +LastAccess=Last access +UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here +LastPasswordChangeDate=Last password change date diff --git a/htdocs/langs/lo_LA/stripe.lang b/htdocs/langs/lo_LA/stripe.lang index 7db1270b5f0..f873d7ff8c7 100644 --- a/htdocs/langs/lo_LA/stripe.lang +++ b/htdocs/langs/lo_LA/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=ກະແຈສົດຂອງ Webhook ONLINE_PAYMENT_WAREHOUSE=ຫຼັກຊັບທີ່ຈະນໍາໃຊ້ສໍາລັບການຫຼຸດລົງຫຼັກຊັບໃນເວລາທີ່ການຊໍາລະເງິນອອນໄລນ done ໄດ້ຖືກເຮັດໄດ້
    (TODO ໃນເວລາທີ່ທາງເລືອກທີ່ຈະຫຼຸດລົງຫຼັກຊັບແມ່ນເຮັດໄດ້ໃນການດໍາເນີນການກ່ຽວກັບໃບເກັບເງິນແລະການຊໍາລະອອນໄລນ generate ສ້າງຕົວມັນເອງໃບແຈ້ງຫນີ້? StripeLiveEnabled=ເປີດໃຊ້ງານ Stripe live (ບໍ່ດັ່ງນັ້ນທົດສອບ/ໂsandດ sandbox) StripeImportPayment=ນຳ ເຂົ້າການຈ່າຍເງິນ Stripe -ExampleOfTestCreditCard=ຕົວຢ່າງຂອງບັດເຄຣດິດສໍາລັບການທົດສອບ: %s => ຖືກຕ້ອງ, %s => ຜິດພາດ CVC, %s => iredົດອາຍຸ, %s => ເກັບເງິນບໍ່ສໍາເລັດ +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +ExampleOfTestBankAcountForSEPA=Example of bank account BAN for direct debit test: %s StripeGateways=ປະຕູເສັ້ນດ່າງ OAUTH_STRIPE_TEST_ID=Stripe Connect Client ID (ca _... ) OAUTH_STRIPE_LIVE_ID=Stripe Connect Client ID (ca _... ) @@ -61,6 +62,7 @@ DeleteACard=ລຶບບັດ ConfirmDeleteCard=ເຈົ້າແນ່ໃຈບໍວ່າເຈົ້າຕ້ອງການລຶບບັດເຄຣດິດຫຼືເດບິດນີ້? CreateCustomerOnStripe=ສ້າງລູກຄ້າໃນ Stripe CreateCardOnStripe=ສ້າງບັດໃນ Stripe +CreateBANOnStripe=Create bank on Stripe ShowInStripe=ສະແດງໃນ Stripe StripeUserAccountForActions=ບັນຊີຜູ້ໃຊ້ເພື່ອໃຊ້ສໍາລັບການແຈ້ງເຕືອນທາງອີເມລ events ຂອງບາງເຫດການ Stripe (ການຈ່າຍເງິນ Stripe) StripePayoutList=ລາຍຊື່ການຈ່າຍເງິນ Stripe @@ -69,3 +71,8 @@ ToOfferALinkForLiveWebhook=ເຊື່ອມຕໍ່ກັບການຕິ PaymentWillBeRecordedForNextPeriod=ການຊໍາລະຈະຖືກບັນທຶກໄວ້ໃນງວດຕໍ່ໄປ. ClickHereToTryAgain= ຄລິກທີ່ນີ້ເພື່ອລອງອີກຄັ້ງ ... CreationOfPaymentModeMustBeDoneFromStripeInterface=ເນື່ອງຈາກກົດລະບຽບການກວດສອບຄວາມຖືກຕ້ອງຂອງລູກຄ້າເຂັ້ມແຂງ, ການສ້າງບັດຕ້ອງເຮັດຈາກສະຖາບັນ Stripe backoffice. ເຈົ້າສາມາດຄລິກທີ່ນີ້ເພື່ອສະຫຼັບກັບບັນທຶກລູກຄ້າ Stripe: %s +STRIPE_CARD_PRESENT=Card Present for Stripe Terminals +TERMINAL_LOCATION=Location (address) for Stripe Terminals +RequestDirectDebitWithStripe=Request Direct Debit with Stripe +STRIPE_SEPA_DIRECT_DEBIT=Enable the Direct Debit payments through Stripe + diff --git a/htdocs/langs/lo_LA/users.lang b/htdocs/langs/lo_LA/users.lang index e4f54f932b1..c6689817162 100644 --- a/htdocs/langs/lo_LA/users.lang +++ b/htdocs/langs/lo_LA/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Link to user LinkedToDolibarrThirdParty=Link to third party CreateDolibarrLogin=ສ້າງຜູ້ໃຊ້ CreateDolibarrThirdParty=ສ້າງພາກສ່ວນທີສາມ -LoginAccountDisableInDolibarr=ບັນຊີຖືກປິດການ ນຳ ໃຊ້ໃນ Dolibarr. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=ໃຊ້ຄຸນຄ່າສ່ວນຕົວ ExportDataset_user_1=ຜູ້ໃຊ້ແລະຄຸນສົມບັດຂອງເຂົາເຈົ້າ DomainUser=ຜູ້ໃຊ້ໂດເມນ %s @@ -129,3 +130,6 @@ IPLastLogin=IP last login IPPreviousLogin=IP previous login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/lt_LT/accountancy.lang b/htdocs/langs/lt_LT/accountancy.lang index ca41006a026..27d0053cefc 100644 --- a/htdocs/langs/lt_LT/accountancy.lang +++ b/htdocs/langs/lt_LT/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Pasirinkite vežimėlio grąžinimo tipą ACCOUNTING_EXPORT_PREFIX_SPEC=Specify the prefix for the file name ThisService=Ši paslauga ThisProduct=Ši prekė -DefaultForService=Numatyta paslauga -DefaultForProduct=Numatyta prekė +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Product for this thirdparty ServiceForThisThirdparty=Service for this thirdparty CantSuggest=Pasiūlyti negalima @@ -101,7 +101,8 @@ ShowAccountingAccount=Rodyti apskaitos sąskaitą ShowAccountingJournal=Rodyti apskaitos žurnalą ShowAccountingAccountInLedger=Show accounting account in ledger ShowAccountingAccountInJournals=Show accounting account in journals -AccountAccountingSuggest=Siūloma apskaitos sąskaita +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=Numatytosios sąskaitos MenuBankAccounts=Banko sąskaitos MenuVatAccounts=PVM sąskaitos @@ -126,6 +127,7 @@ WriteBookKeeping=Record transactions in accounting Bookkeeping=Didžioji knyga BookkeepingSubAccount=Subledger AccountBalance=Sąskaitos balansas +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Šaltinio objekto nuoroda CAHTF=Total purchase vendor before tax TotalExpenseReport=Bendra išlaidų ataskaita @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=Journal label NumPiece=Piece number TransactionNumShort=Num. transaction AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Group by general ledger account GroupBySubAccountAccounting=Group by subledger account AccountingAccountGroupsDesc=You can define here some groups of accounting account. They will be used for personalized accounting reports. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Show subtotal by level Pcgtype=Group of account PcgtypeDesc=Group of account are used as predefined 'filter' and 'grouping' criteria for some accounting reports. For example, 'INCOME' or 'EXPENSE' are used as groups for accounting accounts of products to build the expense/income report. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Reconcilable @@ -294,6 +299,7 @@ DescValidateMovements=Any modification or deletion of writing, lettering and del ValidateHistory=Bind Automatically AutomaticBindingDone=Automatic bindings done (%s) - Automatic binding not possible for some record (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Disable binding & transfer in accountancy on ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Disable binding & transfer in accountancy on purchases (vendor invoices will not be taken into account in accounting) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Disable binding & transfer in accountancy on expense reports (expense reports will not be taken into account in accounting) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Flag exported lines as Exported (to modify a line, you will need to delete the whole transaction and re-transfert it into accounting) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=Date validation and lock ConfirmExportFile=Confirmation of the generation of the accounting export file ? ExportDraftJournal=Eksportuoti žurnalo projektą @@ -398,7 +406,7 @@ SaleLocal=Local sale SaleExport=Export sale SaleEEC=Sale in EEC SaleEECWithVAT=Sale in EEC with a VAT not null, so we suppose this is NOT an intracommunautary sale and the suggested account is the standard product account. -SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fallback on the product account for standard sales. You can fix the VAT ID of thirdparty or the product account if needed. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Forbidden: The transaction has been validated and/or exported. ForbiddenTransactionAlreadyValidated=Forbidden: The transaction has been validated. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Mismatch in reconcile code AccountancyErrorMismatchBalanceAmount=The balance (%s) is not equal to 0 AccountancyErrorLetteringBookkeeping=Errors have occurred concerning the transactions: %s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Accounting entries @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Multicurrency code (Idevise) DateExport=Date export WarningReportNotReliable=Warning, this report is not based on the Ledger, so does not contains transaction modified manually in the Ledger. If your journalization is up to date, the bookkeeping view is more accurate. ExpenseReportJournal=Išlaidų ataskaitos žurnalas +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s accounts diff --git a/htdocs/langs/lt_LT/users.lang b/htdocs/langs/lt_LT/users.lang index 3ad915e79bb..ab3f9017c47 100644 --- a/htdocs/langs/lt_LT/users.lang +++ b/htdocs/langs/lt_LT/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Link to user LinkedToDolibarrThirdParty=Link to third party CreateDolibarrLogin=Sukurti vartotoją CreateDolibarrThirdParty=Sukurti trečiąją šalį -LoginAccountDisableInDolibarr=Sąskaita Dolibarr išjungta +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Naudoti asmeninę reikšmę ExportDataset_user_1=Users and their properties DomainUser=Domeno Vartotojas %s @@ -129,3 +130,6 @@ IPLastLogin=IP last login IPPreviousLogin=IP previous login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/lv_LV/accountancy.lang b/htdocs/langs/lv_LV/accountancy.lang index 5b3d88ad48a..cdc2fef581a 100644 --- a/htdocs/langs/lv_LV/accountancy.lang +++ b/htdocs/langs/lv_LV/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Izvēlieties vagonu atgriešanas veidu ACCOUNTING_EXPORT_PREFIX_SPEC=Norādiet faila nosaukuma prefiksu ThisService=Šis pakalpojums ThisProduct=Šis produkts -DefaultForService=Noklusējums pakalpojumam -DefaultForProduct=Noklusējums produktam +DefaultForService=Noklusējums pakalpojumiem +DefaultForProduct=Noklusējums produktiem ProductForThisThirdparty=Produkts šai trešajai pusei ServiceForThisThirdparty=Pakalpojums šai trešajai pusei CantSuggest=Nevar ieteikt @@ -101,7 +101,8 @@ ShowAccountingAccount=Rādīt grāmatvedības kontu ShowAccountingJournal=Rādīt grāmatvedības žurnālu ShowAccountingAccountInLedger=Rādīt grāmatvedības kontu virsgrāmatā ShowAccountingAccountInJournals=Parādīt grāmatvedības kontu žurnālos -AccountAccountingSuggest=Ieteicamais grāmatvedības konts +DataUsedToSuggestAccount=Dati, kas izmantoti, lai ieteiktu kontu +AccountAccountingSuggest=Ieteikts konts MenuDefaultAccounts=Noklusētie konti MenuBankAccounts=Bankas konti MenuVatAccounts=PVN konti @@ -126,6 +127,7 @@ WriteBookKeeping=Ierakstīt darījumus grāmatvedībā Bookkeeping=Grāmatvedis BookkeepingSubAccount=Zemesgrāmata AccountBalance=Konta bilance +AccountBalanceSubAccount=Apakškontu atlikums ObjectsRef=Avota objekta ref CAHTF=Kopējais pirkuma pārdevējs pirms nodokļu nomaksas TotalExpenseReport=Kopējais izdevumu pārskats @@ -178,31 +180,32 @@ ACCOUNTING_RESULT_PROFIT=Rezultātu uzskaites konts (peļņa) ACCOUNTING_RESULT_LOSS=Rezultātu uzskaites konts (zaudējumi) ACCOUNTING_CLOSURE_DEFAULT_JOURNAL=Noslēguma žurnāls -ACCOUNTING_ACCOUNT_TRANSFER_CASH=Account (from the Chart Of Account) to be used as the account for transitional bank transfers +ACCOUNTING_ACCOUNT_TRANSFER_CASH=Konts (no konta plāna), kas jāizmanto kā pārejas bankas pārvedumu konts TransitionalAccount=Pārejas bankas konta pārejas konts -ACCOUNTING_ACCOUNT_SUSPENSE=Account (from the Chart Of Account) to be used as the account for unallocated funds either received or paid i.e. funds in "wait[ing]" -DONATION_ACCOUNTINGACCOUNT=Account (from the Chart Of Account) to be used to register donations (Donation module) -ADHERENT_SUBSCRIPTION_ACCOUNTINGACCOUNT=Account (from the Chart Of Account) to be used to register memberships subscriptions (Membership module - if membership recorded without invoice) +ACCOUNTING_ACCOUNT_SUSPENSE=Konts (no konta plāna), kas jāizmanto kā konts nesadalītajiem līdzekļiem, kas saņemti vai izmaksāti, t.i., līdzekļiem, kas atrodas gaidīšanas režīmā. +DONATION_ACCOUNTINGACCOUNT=Konts (no konta plāna), kas jāizmanto ziedojumu reģistrēšanai (Ziedojumu modulis) +ADHERENT_SUBSCRIPTION_ACCOUNTINGACCOUNT=Konts (no konta plāna), kas jāizmanto, lai reģistrētu dalības abonementus (Dalības modulis - ja dalība reģistrēta bez rēķina) -ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be used as the default account to register customer deposit +ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Konts (no konta plāna), kas jāizmanto kā noklusējuma konts klienta depozīta reģistrēšanai UseAuxiliaryAccountOnCustomerDeposit=Saglabājiet klienta kontu kā individuālu kontu meitas virsgrāmatā pirmo iemaksu rindām (ja tas ir atspējots, individuālais konts pirmās iemaksas rindām paliks tukšs) -ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default +ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Konts (no konta plāna), kas jāizmanto kā noklusējuma konts UseAuxiliaryAccountOnSupplierDeposit=Saglabājiet piegādātāja kontu kā individuālo kontu meitas virsgrāmatā pirmās iemaksas rindām (ja tas ir atspējots, individuālais konts pirmās iemaksas rindām paliks tukšs) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Grāmatvedības konts pēc noklusējuma, lai reģistrētu klienta saglabāto garantiju -ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) -ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) -ACCOUNTING_PRODUCT_BUY_EXPORT_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased and imported from any other foreign country (used if not defined in the product sheet) -ACCOUNTING_PRODUCT_SOLD_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the sold products (used if not defined in the product sheet) -ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products sold from EEC to another EEC country (used if not defined in the product sheet) -ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products sold and exported to any other foreign country (used if not defined in the product sheet) +ACCOUNTING_PRODUCT_BUY_ACCOUNT=Konts (no konta plāna), kas jāizmanto kā noklusējuma konts produktiem, kas iegādāti tajā pašā valstī (izmanto, ja tas nav definēts produkta lapā) +ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Konts (no konta plāna), kas jāizmanto kā noklusējuma konts produktiem, kas iegādāti no EEK citā EEK valstī (izmanto, ja tas nav definēts produkta lapā) +ACCOUNTING_PRODUCT_BUY_EXPORT_ACCOUNT=Konts (no konta plāna), kas jāizmanto kā noklusējuma konts produktiem, kas iegādāti un importēti no jebkuras citas ārvalsts (izmanto, ja nav norādīts produkta lapā) +ACCOUNTING_PRODUCT_SOLD_ACCOUNT=Konts (no konta plāna), kas jāizmanto kā noklusējuma konts pārdotajām precēm (izmanto, ja tas nav definēts produkta lapā) +ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT=Konts (no konta plāna), kas jāizmanto kā noklusējuma konts produktiem, kas tiek pārdoti no EEK uz citu EEK valsti (izmanto, ja tas nav definēts produkta lapā) +ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT=Konts (no konta plāna), kas jāizmanto kā noklusējuma konts produktiem, kas tiek pārdoti un eksportēti uz jebkuru citu valsti (izmanto, ja tas nav definēts produkta lapā) -ACCOUNTING_SERVICE_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the services purchased within same country (used if not defined in the service sheet) -ACCOUNTING_SERVICE_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the services purchased from EEC to another EEC country (used if not defined in the service sheet) -ACCOUNTING_SERVICE_BUY_EXPORT_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the services purchased and imported from other foreign country (used if not defined in the service sheet) -ACCOUNTING_SERVICE_SOLD_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the sold services (used if not defined in the service sheet) -ACCOUNTING_SERVICE_SOLD_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the services sold from EEC to another EEC country (used if not defined in the service sheet) -ACCOUNTING_SERVICE_SOLD_EXPORT_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the services sold and exported to any other foreign country (used if not defined in the service sheet) +ACCOUNTING_SERVICE_BUY_ACCOUNT=Konts (no konta plāna), kas jāizmanto kā noklusējuma konts tajā pašā valstī iegādātajiem pakalpojumiem (izmanto, ja tas nav definēts pakalpojuma lapā) +ACCOUNTING_SERVICE_BUY_INTRA_ACCOUNT=Konts (no konta plāna), kas jāizmanto kā noklusējuma konts pakalpojumiem, kas iegādāti no EEK uz citu EEK valsti (izmanto, ja pakalpojumu lapā nav definēts) +ACCOUNTING_SERVICE_BUY_EXPORT_ACCOUNT=Konts (no konta plāna), kas jāizmanto kā noklusējuma konts pakalpojumiem, kas iegādāti un importēti no citas ārvalsts (izmanto, ja pakalpojumu lapā nav noteikts) +ACCOUNTING_SERVICE_SOLD_ACCOUNT=Konts (no konta plāna), kas jāizmanto kā noklusējuma konts pārdotajiem pakalpojumiem (izmanto, ja tas nav definēts pakalpojumu lapā) +ACCOUNTING_SERVICE_SOLD_INTRA_ACCOUNT=Konts (no konta plāna), kas jāizmanto kā noklusējuma konts pakalpojumiem, kas tiek pārdoti no EEK uz citu EEK valsti (izmanto, ja pakalpojumu lapā nav definēts) +ACCOUNTING_SERVICE_SOLD_EXPORT_ACCOUNT=Konts (no konta plāna), kas jāizmanto kā noklusējuma konts pakalpojumiem, kas pārdoti un eksportēti uz jebkuru citu valsti (izmanto, ja pakalpojumu lapā nav definēts) Doctype=Dokumenta veids Docdate=Datums @@ -217,7 +220,8 @@ Codejournal=Žurnāls JournalLabel=Žurnāla etiķete NumPiece=Gabala numurs TransactionNumShort=Num. darījums -AccountingCategory=Custom group of accounts +AccountingCategory=Pielāgota kontu grupa +AccountingCategories=Pielāgotas kontu grupas GroupByAccountAccounting=Grupēt pēc galvenās grāmatas konta GroupBySubAccountAccounting=Grupēt pēc apakšzinēja konta AccountingAccountGroupsDesc=Šeit jūs varat definēt dažas grāmatvedības kontu grupas. Tie tiks izmantoti personificētiem grāmatvedības pārskatiem. @@ -265,19 +269,20 @@ ShowSubtotalByGroup=Rādīt starpsummu pēc līmeņa Pcgtype=Kontu grupa PcgtypeDesc=Kontu grupa tiek izmantota kā iepriekš definēti “filtra” un “grupēšanas” kritēriji dažiem grāmatvedības pārskatiem. Piemēram, “IENĀKUMS” vai “IZDEVUMI” tiek izmantoti kā produktu uzskaites kontu grupas, lai izveidotu izdevumu / ienākumu pārskatu. +AccountingCategoriesDesc=Pielāgotu kontu grupu var izmantot, lai grupētu grāmatvedības kontus vienā nosaukumā, lai atvieglotu filtra lietošanu vai pielāgotu pārskatu veidošanu. Reconcilable=Samierināms TotalVente=Kopējais apgrozījums pirms nodokļu nomaksas TotalMarge=Kopējā pārdošanas starpība -DescVentilCustomer=Consult here the list of customer invoice lines bound (or not) to a product account from chart of account -DescVentilMore=In most cases, if you use predefined products or services and you set the account (from chart of account) on the product/service card, the application will be able to make all the binding between your invoice lines and the accounting account of your chart of accounts, just in one click with the button "%s". If account was not set on product/service cards or if you still have some lines not bound to an account, you will have to make a manual binding from the menu "%s". -DescVentilDoneCustomer=Consult here the list of the lines of invoices customers and their product account from chart of account -DescVentilTodoCustomer=Bind invoice lines not already bound with a product account from chart of account -ChangeAccount=Change the product/service account (from chart of account) for the selected lines with the following account: +DescVentilCustomer=Skatiet šeit to klientu rēķinu rindu sarakstu, kas ir piesaistītas (vai nav) ar produkta kontu no konta plāna +DescVentilMore=Vairumā gadījumu, ja izmantojat iepriekš definētus produktus vai pakalpojumus un iestatāt kontu (no konta plāna) produkta/pakalpojuma kartē, lietojumprogramma varēs veikt visas saistības starp jūsu rēķina rindām un jūsu diagrammas grāmatvedības kontu. kontu, ar vienu klikšķi ar pogu "%s" . Ja konts nav iestatīts produktu/pakalpojumu kartēs vai ja jums joprojām ir dažas rindas, kas nav saistītas ar kontu, jums būs jāveic manuāla saistīšana no izvēlnes " %s ". +DescVentilDoneCustomer=Šeit skatiet klientu rēķinu rindu sarakstu un viņu produktu kontu no kontu plāna +DescVentilTodoCustomer=Saistīt rēķina rindas, kas vēl nav saistītas ar produkta kontu, no kontu plāna +ChangeAccount=Mainiet produkta/pakalpojuma kontu (no konta plāna) atlasītajām rindām ar šādu kontu: Vide=- -DescVentilSupplier=Consult here the list of vendor invoice lines bound or not yet bound to a product account from chart of account (only record not already transfered in accountancy are visible) +DescVentilSupplier=Skatiet šeit to piegādātāja rēķinu rindu sarakstu, kas ir piesaistītas vai vēl nav saistītas ar produkta kontu no konta plāna (ir redzami tikai ieraksti, kas vēl nav pārsūtīti grāmatvedībā) DescVentilDoneSupplier=Šeit skatiet piegādātāju rēķinu un to grāmatvedības kontu sarakstu DescVentilTodoExpenseReport=Bind expense report lines, kas jau nav saistītas ar maksu grāmatvedības kontu DescVentilExpenseReport=Konsultējieties šeit ar izdevumu pārskatu rindiņu sarakstu, kas ir saistoši (vai nē) ar maksu grāmatvedības kontu @@ -294,15 +299,16 @@ DescValidateMovements=Jebkādas rakstīšanas, burtu un izdzēsto tekstu izmaiņ ValidateHistory=Piesaistiet automātiski AutomaticBindingDone=Automātiskā saistīšana ir pabeigta (%s) — dažiem ierakstiem automātiskā saistīšana nav iespējama (%s) +DoManualBindingForFailedRecord=Jums ir jāizveido manuāla saite rindai %s, kas nav saistīta automātiski. -ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used +ErrorAccountancyCodeIsAlreadyUse=Kļūda. Šo kontu plāna kontu nevar noņemt vai atspējot, jo tas tiek izmantots MvtNotCorrectlyBalanced=Kustības nav pareizi līdzsvarotas. Debets = %s & kredīts = %s Balancing=Līdzsvarošana FicheVentilation=Iesiešanas kartiņa GeneralLedgerIsWritten=Darījumi ir rakstīti grāmatvedībā GeneralLedgerSomeRecordWasNotRecorded=Daži darījumi nevarēja tikt publicēti žurnālā. Ja nav citas kļūdas ziņojuma, iespējams, ka tie jau tika publicēti. NoNewRecordSaved=Vairs nav pārsūtāmu ierakstu -ListOfProductsWithoutAccountingAccount=List of products not bound to any account of chart of account +ListOfProductsWithoutAccountingAccount=Produktu saraksts, kas nav piesaistīti nevienam konta plāna kontam ChangeBinding=Mainiet saites Accounted=Uzskaitīts virsgrāmatā NotYetAccounted=Vēl nav pārnests uz grāmatvedību @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Atspējot saistīšanu un pārskaitīšanu p ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Atspējot saistīšanu un pārsūtīšanu pirkumu grāmatvedībā (pārdevēja rēķini netiks ņemti vērā grāmatvedībā) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Atspējojiet grāmatvedībā iesiešanu un pārskaitīšanu izdevumu pārskatos (grāmatvedībā netiks ņemti vērā izdevumu pārskati) ACCOUNTING_ENABLE_LETTERING=Grāmatvedībā iespējot burtu funkciju +ACCOUNTING_ENABLE_AUTOLETTERING=Iespējot automātisko burtu rakstīšanu, pārejot uz grāmatvedību ## Export NotExportLettering=Veidojot failu, neeksportējiet burtus NotifiedExportDate=Atzīmējiet eksportētās rindas kā Eksportētas (lai mainītu rindu, jums būs jāizdzēš viss darījums un atkārtoti jāpārsūta uz grāmatvedību) NotifiedValidationDate=Apstipriniet un bloķējiet eksportētos ierakstus (tāds pats efekts kā funkcijai "%s", rindu modifikācija un dzēšana NOTEIKTI nebūs iespējama) +NotifiedExportFull=Eksportēt dokumentus? DateValidationAndLock=Datuma apstiprināšana un bloķēšana ConfirmExportFile=Apstiprinājums par grāmatvedības eksporta faila ģenerēšanu? ExportDraftJournal=Eksporta žurnāla projekts @@ -398,7 +406,7 @@ SaleLocal=Vietējā pārdošana SaleExport=Eksporta pārdošana SaleEEC=Pārdošana EEK SaleEECWithVAT=Pārdošana EEK ar PVN nav spēkā, tāpēc domājams, ka tā NAV iekšējā tirdzniecība, un ieteiktais konts ir standarta produkta konts. -SaleEECWithoutVATNumber=Pārdošana EEK bez PVN, bet trešās puses PVN ID nav definēts. Mēs atteicamies no standarta produkta standarta konta. Ja nepieciešams, varat salabot trešās personas PVN ID vai produkta kontu. +SaleEECWithoutVATNumber=Pārdošana EEK bez PVN, bet nav noteikts trešās puses PVN ID. Mēs atgriežamies pie standarta pārdošanas konta. Varat labot trešās puses PVN ID vai mainīt produkta kontu, kas ieteikts saistīšanai, ja nepieciešams. ForbiddenTransactionAlreadyExported=Aizliegts: darījums ir apstiprināts un/vai eksportēts. ForbiddenTransactionAlreadyValidated=Aizliegts: darījums ir apstiprināts. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Saskaņošanas koda neatbilstība AccountancyErrorMismatchBalanceAmount=Atlikums (%s) nav vienāds ar 0 AccountancyErrorLetteringBookkeeping=Ir radušās kļūdas saistībā ar darījumiem: %s ErrorAccountNumberAlreadyExists=Grāmatvedības numurs %s jau pastāv +ErrorArchiveAddFile=Arhīvā nevar ievietot failu "%s". ## Import ImportAccountingEntries=Grāmatvedības ieraksti @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Daudzvalūtu kods (Idevise) DateExport=Eksporta datums WarningReportNotReliable=Brīdinājums. Šis pārskats nav balstīts uz grāmatvedi, tādēļ tajā nav darījumu, kas Manuāli ir manuāli modificēts. Ja žurnāls ir atjaunināts, grāmatvedības skats ir precīzāks. ExpenseReportJournal=Izdevumu atskaites žurnāls +DocsAlreadyExportedAreExcluded=Jau eksportētie dokumenti tiek izslēgti +ClickToHideAlreadyExportedLines=Noklikšķiniet, lai paslēptu jau eksportētās līnijas NAccounts=%s konti diff --git a/htdocs/langs/lv_LV/admin.lang b/htdocs/langs/lv_LV/admin.lang index 08ec9f2dfc2..54f557e18ed 100644 --- a/htdocs/langs/lv_LV/admin.lang +++ b/htdocs/langs/lv_LV/admin.lang @@ -406,7 +406,7 @@ NoSmsEngine=Nav pieejams neviens SMS sūtītāja pārvaldnieks. SMS sūtītāja PDF=PDF PDFDesc=Globālās iespējas PDF ģenerēšanai PDFOtherDesc=PDF opcija, kas raksturīga dažiem moduļiem -PDFAddressForging=Noteikumi par adreses sadaļu +PDFAddressForging=Noteikumi adreses sadaļai HideAnyVATInformationOnPDF=Slēpt visu informāciju, kas saistīta ar pārdošanas nodokli / PVN PDFRulesForSalesTax=Pārdošanas nodokļa / PVN noteikumi PDFLocaltax=Noteikumi par %s @@ -645,6 +645,8 @@ Module2300Name=Plānotie darbi Module2300Desc=Plānotais darbavietu vadība (alias cron vai chrono galds) Module2400Name=Pasākumi / darba kārtība Module2400Desc=Sekojiet notikumiem. Reģistrējiet automātiskos notikumus izsekošanas nolūkos vai ierakstiet manuālos notikumus vai sanāksmes. Tas ir galvenais modulis labam klientu vai pārdevēju attiecību pārvaldībai. +Module2430Name=Rezervācijas kalendāra sistēma +Module2430Desc=Nodrošiniet tiešsaistes kalendāru, lai ikviens varētu rezervēt tikšanās vietas atbilstoši iepriekš noteiktam diapazonam vai pieejamībai. Module2500Name=DMS / ECM Module2500Desc=Dokumentu vadības sistēma / elektroniskā satura vadība. Jūsu radīto vai saglabāto dokumentu automātiska organizēšana. Kopīgojiet tos pēc vajadzības. Module2600Name=API/tīmekļa pakalpojumi (SOAP serveris) @@ -660,6 +662,8 @@ Module2900Name=GeoIPMaxmind Module2900Desc=GeoIP MaxMind pārveidošanu iespējas Module3200Name=Nemainīgi arhīvi Module3200Desc=Iespējojiet nemainīgu biznesa notikumu žurnālu. Notikumi tiek arhivēti reāllaikā. Žurnāls ir tikai lasāmu tabulu ķēdes notikumus, kurus var eksportēt. Šis modulis dažās valstīs var būt obligāts. +Module3300Name=Moduļu veidotājs +Module3200Desc=Iespējojiet nemainīgu biznesa notikumu žurnālu. Notikumi tiek arhivēti reāllaikā. Žurnāls ir tikai lasāmu tabulu ķēdes notikumus, kurus var eksportēt. Šis modulis dažās valstīs var būt obligāts. Module3400Name=Sociālie tīkli Module3400Desc=Iespējojiet sociālo tīklu laukus trešajām pusēm un adresēm (skype, twitter, facebook, ...). Module4000Name=HRM @@ -700,7 +704,7 @@ Module62000Name=Inkoterms Module62000Desc=Pievienojiet funkcijas, lai pārvaldītu Incoterms Module63000Name=Resursi Module63000Desc=Pārvaldiet resursus (printerus, automašīnas, telpas, ...), lai piešķirtu notikumiem -Module94160Name=Receptions +Module94160Name=Pieņemšanas Permission11=Lasīt klientu rēķinus Permission12=Izveidot / mainīt klientu rēķinus Permission13=Nederīgi klientu rēķini @@ -974,14 +978,14 @@ Permission3301=Ģenerējiet jaunus moduļus Permission4001=Izlasiet prasmes/darbu/amatu Permission4002=Izveidot/mainīt prasmes/darbu/amatu Permission4003=Dzēst prasmi/darbu/amatu -Permission4021=Read evaluations (yours and your subordinates) -Permission4022=Create/modify evaluations -Permission4023=Validate evaluation -Permission4025=Delete evaluation -Permission4028=See comparison menu +Permission4021=Lasīt vērtējumus (jūsu un jūsu padoto) +Permission4022=Izveidot/mainīt novērtējumus +Permission4023=Apstipriniet novērtējumu +Permission4025=Dzēst novērtējumu +Permission4028=Skatiet salīdzināšanas izvēlni Permission4031=Izlasiet personisko informāciju Permission4032=Uzrakstiet personisko informāciju -Permission4033=Read all evaluations (even those of user not subordinates) +Permission4033=Lasīt visus vērtējumus (arī tos, kas attiecas uz lietotāju, nevis padotajiem) Permission10001=Lasīt tīmekļa vietnes saturu Permission10002=Izveidot / mainīt vietnes saturu (html un javascript saturu) Permission10003=Izveidojiet / modificējiet vietnes saturu (dinamisko php kodu). Bīstami, tie ir jārezervē ierobežotiem izstrādātājiem. @@ -1270,6 +1274,7 @@ TriggerActiveAsModuleActive=Trigeri Šajā failā ir aktīvs kā modulis %s- Category of operations: Delivery of goods
    - Category of operations: Provision of services
    - Category of operations: Mixed - Delivery of goods & provision of services -InvoiceOptionCategoryOfOperationsYes1=Yes, below the address block -InvoiceOptionCategoryOfOperationsYes2=Yes, in the lower left-hand corner +InvoiceOptionCategoryOfOperations=Rēķinā parādiet norādi "operāciju kategorija". +InvoiceOptionCategoryOfOperationsHelp=Atkarībā no situācijas minējums tiks parādīts šādā formā:
    - Darbību kategorija: Preču piegāde
    - Darbību kategorija: Pakalpojumu sniegšana
    - Darbību kategorija: Jaukts - Preču piegāde un pakalpojumi +InvoiceOptionCategoryOfOperationsYes1=Jā, zem adreses bloka +InvoiceOptionCategoryOfOperationsYes2=Jā, apakšējā kreisajā stūrī ##### Proposals ##### PropalSetup=Commercial priekšlikumi modulis uzstādīšana ProposalsNumberingModules=Komerciālie priekšlikumu numerācijas modeļi @@ -1491,7 +1496,7 @@ WatermarkOnDraftContractCards=Ūdenszīme uz līgumu projektiem (nav, ja tukšs ##### Members ##### MembersSetup=Dalībnieku moduļa uzstādīšana MemberMainOptions=Galvenās iespējas -MemberCodeChecker=Options for automatic generation of member codes +MemberCodeChecker=Iespējas automātiskai dalībnieku kodu ģenerēšanai AdherentLoginRequired= Pārvaldīt Pieteikšanos katram dalībniekam AdherentMailRequired=Lai izveidotu jaunu dalībnieku, nepieciešams e-pasts MemberSendInformationByMailByDefault=Rūtiņu, lai nosūtītu pasta apstiprinājums locekļiem (validāciju vai jauns abonements) ir ieslēgts pēc noklusējuma @@ -1826,6 +1831,9 @@ AGENDA_USE_EVENT_TYPE=Izmantojiet notikumu tipus (tiek pārvaldīti izvēlnē Ie AGENDA_USE_EVENT_TYPE_DEFAULT=Veidojot notikuma veidlapu, automātiski iestatiet šo noklusējuma vērtību AGENDA_DEFAULT_FILTER_TYPE=Šādu pasākumu automātiski iestatīt darba kārtības skatā meklēšanas filtūrā AGENDA_DEFAULT_FILTER_STATUS=Automātiski iestatīt šo statusu notikumu skatīšanai darba filtru meklēšanas filtūrā +AGENDA_EVENT_PAST_COLOR=Pagājušā pasākuma krāsa +AGENDA_EVENT_CURRENT_COLOR=Pašreizējā pasākuma krāsa +AGENDA_EVENT_FUTURE_COLOR=Nākotnes pasākuma krāsa AGENDA_DEFAULT_VIEW=Kuru skatu vēlaties atvērt pēc noklusējuma, izvēloties izvēlni Agenda AGENDA_REMINDER_BROWSER=Iespējojiet notikuma atgādinājumu lietotāja pārlūkprogrammā (Kad ir atgādinājuma datums, pārlūkprogramma parāda uznirstošo logu. Katrs lietotājs var atspējot šādus paziņojumus pārlūka paziņojumu iestatījumos). AGENDA_REMINDER_BROWSER_SOUND=Iespējot skaņas paziņojumu @@ -2129,6 +2137,7 @@ CodeLastResult=Jaunākais rezultātu kods NbOfEmailsInInbox=E-pasta ziņojumu skaits avota direktorijā LoadThirdPartyFromName=Ielādējiet trešo personu meklēšanu pakalpojumā %s (tikai ielāde) LoadThirdPartyFromNameOrCreate=Ielādējiet trešo personu meklēšanu pakalpojumā %s (izveidojiet, ja nav atrasts) +LoadContactFromEmailOrCreate=Ielādēt kontaktpersonu meklēšanu vietnē %s (izveidot, ja nav atrasts) AttachJoinedDocumentsToObject=Saglabājiet pievienotos failus objektu dokumentos, ja e-pasta tēmā tiek atrasta objekta atsauce. WithDolTrackingID=Ziņojums no sarunas, kuru aizsāka pirmais e-pasts, kas nosūtīts no Dolibarr WithoutDolTrackingID=Ziņojums no sarunas, kuru aizsāka pirmais e-pasts, kuru NAV nosūtīts no Dolibarr @@ -2232,12 +2241,12 @@ MailToPartnership=Partnerība AGENDA_EVENT_DEFAULT_STATUS=Noklusējuma notikuma statuss, veidojot notikumu no formas YouShouldDisablePHPFunctions=Jums vajadzētu atspējot PHP funkcijas IfCLINotRequiredYouShouldDisablePHPFunctions=PHP funkcijas ir jāatspējo, izņemot gadījumus, kad sistēmas komandas ir jāpalaiž pielāgotā kodā -PHPFunctionsRequiredForCLI=For shell purpose (like scheduled job backup or running an antivirus program), you must keep PHP functions +PHPFunctionsRequiredForCLI=Apvalka vajadzībām (piemēram, ieplānota darba dublēšana vai pretvīrusu programmas palaišana), jums ir jāsaglabā PHP funkcijas NoWritableFilesFoundIntoRootDir=Jūsu saknes direktorijā netika atrasti ierasto failu vai direktoriju kopējās programmas (labi) RecommendedValueIs=Ieteicams: %s Recommended=Ieteicams NotRecommended=Nav ieteicams -ARestrictedPath=Some restricted path for data files +ARestrictedPath=Datu failiem ir ierobežots ceļš CheckForModuleUpdate=Pārbaudiet, vai nav atjaunināti ārējie moduļi CheckForModuleUpdateHelp=Šī darbība izveidos savienojumu ar ārējo moduļu redaktoriem, lai pārbaudītu, vai ir pieejama jauna versija. ModuleUpdateAvailable=Ir pieejams atjauninājums @@ -2353,5 +2362,7 @@ DesktopsAndSmartphones=Galddatori un viedtālruņi AllowOnlineSign=Atļaut tiešsaistes parakstīšanu AllowExternalDownload=Atļaut ārēju lejupielādi (bez pieteikšanās, izmantojot koplietotu saiti) DeadlineDayVATSubmission=PVN iesniegšanas termiņš nākamajā mēnesī -MaxNumberOfAttachementOnForms=Max number of joinded files in a form -IfDefinedUseAValueBeetween=If defined, use a value between %s and %s +MaxNumberOfAttachementOnForms=Maksimālais savienoto failu skaits veidlapā +IfDefinedUseAValueBeetween=Ja definēts, izmantojiet vērtību no %s līdz %s +Reload=Pārlādēt +ConfirmReload=Apstipriniet moduļa atkārtotu ielādi diff --git a/htdocs/langs/lv_LV/agenda.lang b/htdocs/langs/lv_LV/agenda.lang index 3ab5820a015..3935082a9e3 100644 --- a/htdocs/langs/lv_LV/agenda.lang +++ b/htdocs/langs/lv_LV/agenda.lang @@ -68,7 +68,7 @@ ShipmentBackToDraftInDolibarr=Sūtījums %s dodas atpakaļ uz melnraksta statusu ShipmentDeletedInDolibarr=Sūtījums %s dzēsts ShipmentCanceledInDolibarr=Sūtījums %s atcelts ReceptionValidatedInDolibarr=Reģistrācija %s validēta -ReceptionDeletedInDolibarr=Reception %s deleted +ReceptionDeletedInDolibarr=Reģistratūra %s izdzēsta ReceptionClassifyClosedInDolibarr=Reģistratūra %s klasificēta kā slēgta OrderCreatedInDolibarr=Pasūtījums %s izveidots OrderValidatedInDolibarr=Pasūtījums %s pārbaudīts diff --git a/htdocs/langs/lv_LV/bills.lang b/htdocs/langs/lv_LV/bills.lang index 08766f5db6d..5784a1c2b0f 100644 --- a/htdocs/langs/lv_LV/bills.lang +++ b/htdocs/langs/lv_LV/bills.lang @@ -627,7 +627,7 @@ SendEmailsRemindersOnInvoiceDueDate=Nosūtiet atgādinājumu pa e-pastu par neap MakePaymentAndClassifyPayed=Ierakstiet maksājumu BulkPaymentNotPossibleForInvoice=Lielapjoma maksājums nav iespējams par rēķinu %s (slikts veids vai statuss) MentionVATDebitOptionIsOn=Iespēja maksāt nodokli, pamatojoties uz debetu -MentionCategoryOfOperations=Category of operations -MentionCategoryOfOperations0=Delivery of goods -MentionCategoryOfOperations1=Provision of services -MentionCategoryOfOperations2=Mixed - Delivery of goods & provision of services +MentionCategoryOfOperations=Operāciju kategorija +MentionCategoryOfOperations0=Preču piegāde +MentionCategoryOfOperations1=Pakalpojumu sniegšana +MentionCategoryOfOperations2=Jaukts - Preču piegāde un pakalpojumu sniegšana diff --git a/htdocs/langs/lv_LV/boxes.lang b/htdocs/langs/lv_LV/boxes.lang index 2fdb12864c5..dce2438c4c0 100644 --- a/htdocs/langs/lv_LV/boxes.lang +++ b/htdocs/langs/lv_LV/boxes.lang @@ -24,6 +24,7 @@ BoxFicheInter=Jaunākās intervences BoxCurrentAccounts=Atvērto kontu atlikums BoxTitleMemberNextBirthdays=Šī mēneša dzimšanas dienas (dalībnieki) BoxTitleMembersByType=Dalībnieki pēc veida un statusa +BoxTitleMembersByTags=Dalībnieki pēc tagiem un statusa BoxTitleMembersSubscriptionsByYear=Dalībnieku abonēšana pēc gada BoxTitleLastRssInfos=Jaunākās %s ziņas no %s BoxTitleLastProducts=Produkti / Pakalpojumi: pēdējais %s modificēts @@ -44,10 +45,10 @@ BoxTitleSupplierOrdersAwaitingReception=Piegādātāju pasūtījumi, kas gaida s BoxTitleLastModifiedContacts=Kontakti/adreses: pēdējie %s labotie BoxMyLastBookmarks=Grāmatzīmes: jaunākās %s BoxOldestExpiredServices=Vecākais aktīvais beidzies pakalpojums -BoxOldestActions=Oldest events to do +BoxOldestActions=Vecākie notikumi BoxLastExpiredServices=Jaunākie %s vecākie kontakti ar aktīviem derīguma termiņa beigām BoxTitleLastActionsToDo=Jaunākās %s darbības, ko darīt -BoxTitleOldestActionsToDo=Oldest %s events to do, not completed +BoxTitleOldestActionsToDo=Vecākie veicamie %s notikumi, kas nav pabeigti BoxTitleLastContracts=Jaunākie %s līgumi, kas tika mainīti BoxTitleLastModifiedDonations=Jaunākie %s ziedojumi, kas tika mainīti BoxTitleLastModifiedExpenses=Jaunākie %s izdevumu pārskati, kas tika mainīti diff --git a/htdocs/langs/lv_LV/companies.lang b/htdocs/langs/lv_LV/companies.lang index 97e724b6359..cf2c435216c 100644 --- a/htdocs/langs/lv_LV/companies.lang +++ b/htdocs/langs/lv_LV/companies.lang @@ -312,8 +312,8 @@ CustomerRelativeDiscountShort=Relatīvā atlaide CustomerAbsoluteDiscountShort=Absolūtā atlaide CompanyHasRelativeDiscount=Šim klientam ir pastāvīgā atlaide %s%% CompanyHasNoRelativeDiscount=Šim klientam nav relatīvā atlaide pēc noklusējuma -HasRelativeDiscountFromSupplier=Šī pārdevēja noklusējuma atlaide ir %s%% -HasNoRelativeDiscountFromSupplier=No šī pārdevēja nav noklusējuma relatīvās atlaides +HasRelativeDiscountFromSupplier=Pie šī pārdevēja jums ir noklusējuma atlaide %s%% +HasNoRelativeDiscountFromSupplier=Šim pārdevējam nav noklusējuma relatīvās atlaides CompanyHasAbsoluteDiscount=Šim klientam ir pieejamas atlaides (kredītpiezīmes vai maksājumi) par %s%s CompanyHasDownPaymentOrCommercialDiscount=Šim klientam ir pieejamas atlaides (komerciālie, iemaksātie maksājumi) par %s %s CompanyHasCreditNote=Šim klientam joprojām ir kredīta piezīmes %s %s @@ -499,4 +499,7 @@ OutOfEurope=Ārpus Eiropas (EEK) CurrentOutstandingBillLate=Pašreizējais nesamaksātais rēķins ir nokavēts BecarefullChangeThirdpartyBeforeAddProductToInvoice=Esiet piesardzīgs, atkarībā no produkta cenas iestatījumiem, pirms produkta pievienošanas POS, jums jāmaina trešā puse. EmailAlreadyExistsPleaseRewriteYourCompanyName=e-pasts jau pastāv, lūdzu, pārrakstiet sava uzņēmuma nosaukumu -TwoRecordsOfCompanyName=šim uzņēmumam ir vairāk nekā viens ieraksts, lūdzu, sazinieties ar mums, lai pabeigtu savu partnerības pieprasījumu" +TwoRecordsOfCompanyName=šim uzņēmumam ir vairāk nekā viens ieraksts, lūdzu, sazinieties ar mums, lai pabeigtu savu partnerības pieprasījumu +CompanySection=Uzņēmuma sadaļa +ShowSocialNetworks=Rādīt sociālos tīklus +HideSocialNetworks=Slēpt sociālos tīklus diff --git a/htdocs/langs/lv_LV/compta.lang b/htdocs/langs/lv_LV/compta.lang index 6f949a3985f..fe0d86b625d 100644 --- a/htdocs/langs/lv_LV/compta.lang +++ b/htdocs/langs/lv_LV/compta.lang @@ -246,12 +246,12 @@ TurnoverPerProductInCommitmentAccountingNotRelevant=Apgrozījuma pārskats, kas TurnoverPerSaleTaxRateInCommitmentAccountingNotRelevant=Apgrozījuma pārskats, kas iegūts no pārdošanas nodokļa likmes, nav pieejams. Šis pārskats ir pieejams tikai apgrozījumam rēķinā. CalculationMode=Aprēķinu režīms AccountancyJournal=Grāmatvedības kodu žurnāls -ACCOUNTING_VAT_SOLD_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for VAT on sales (used if not defined on VAT dictionary setup) -ACCOUNTING_VAT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for VAT on purchases (used if not defined on VAT dictionary setup) -ACCOUNTING_VAT_PAY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for paying VAT -ACCOUNTING_ACCOUNT_CUSTOMER=Account (from the Chart Of Account) used for "customer" third parties +ACCOUNTING_VAT_SOLD_ACCOUNT=Konts (no konta plāna), kas jāizmanto kā noklusējuma konts pārdošanas PVN aplikšanai (izmanto, ja tas nav definēts PVN vārdnīcas iestatījumos) +ACCOUNTING_VAT_BUY_ACCOUNT=Konts (no konta plāna), kas jāizmanto kā noklusējuma konts PVN par pirkumiem (izmanto, ja tas nav definēts PVN vārdnīcas iestatījumos) +ACCOUNTING_VAT_PAY_ACCOUNT=Konts (no konta plāna), kas jāizmanto kā noklusējuma konts PVN maksāšanai +ACCOUNTING_ACCOUNT_CUSTOMER=Konts (no konta plāna), ko izmanto "klientu" trešajām pusēm ACCOUNTING_ACCOUNT_CUSTOMER_Desc=Īpašais grāmatvedības konts, kas noteikts trešās personas kartē, tiks izmantots tikai pakārtotajam grāmatvedim. Šis tiek izmantots General Ledger un noklusējuma vērtība Subledged grāmatvedībai, ja trešās personas īpašais klientu grāmatvedības konts nav definēts. -ACCOUNTING_ACCOUNT_SUPPLIER=Account (from the Chart of Account) used for the "vendor" third parties +ACCOUNTING_ACCOUNT_SUPPLIER=Konts (no kontu plāna), ko izmanto "pārdevēja" trešajām pusēm ACCOUNTING_ACCOUNT_SUPPLIER_Desc=Trešās puses kartē noteiktais īpašais grāmatvedības konts tiks izmantots tikai Subledger grāmatvedībai. Tas tiks izmantots galvenajai grāmatai un Subledger grāmatvedības noklusējuma vērtība, ja nav definēts īpašs pārdevēja grāmatvedības konts trešajā pusē. ConfirmCloneTax=Apstipriniet sociālā / fiskālā nodokļa klonu ConfirmCloneVAT=Apstipriniet PVN deklarācijas klonu diff --git a/htdocs/langs/lv_LV/errors.lang b/htdocs/langs/lv_LV/errors.lang index 789b4521b87..c261b3fe71b 100644 --- a/htdocs/langs/lv_LV/errors.lang +++ b/htdocs/langs/lv_LV/errors.lang @@ -303,6 +303,7 @@ ErrorValueForTooLow= %s vērtība ir pārāk zema ErrorValueCantBeNull= %s vērtība nevar būt nulle ErrorDateOfMovementLowerThanDateOfFileTransmission=Bankas darījuma datums nedrīkst būt mazāks par faila pārsūtīšanas datumu ErrorTooMuchFileInForm=Pārāk daudz failu formā, maksimālais skaits ir %s fails(-i) +ErrorSessionInvalidatedAfterPasswordChange=Sesija tika anulēta pēc paroles, statusa vai derīguma datuma maiņas. Lūdzu, piesakieties atkārtoti. # Warnings WarningParamUploadMaxFileSizeHigherThanPostMaxSize=Jūsu PHP parametrs upload_max_filesize (%s) ir augstāks nekā PHP parametrs post_max_size (%s). Šī nav konsekventa iestatīšana. @@ -325,6 +326,7 @@ WarningPaymentDateLowerThanInvoiceDate=Apmaksas datums (%s) ir agrāks par rēķ WarningTooManyDataPleaseUseMoreFilters=Too many data (more than %s lines). Please use more filters or set the constant %s to a higher limit. WarningSomeLinesWithNullHourlyRate=Daži lietotāji dažreiz ierakstīja, bet viņu stundas likme netika definēta. Tika izmantota vērtība 0 %s stundā, taču tas var novest pie nepareiza pavadītā laika vērtējuma. WarningYourLoginWasModifiedPleaseLogin=Jūsu pieteikšanās tika mainīta. Drošības nolūkos pirms nākamās darbības jums būs jāpiesakās ar jauno pieteikumvārdu. +WarningYourPasswordWasModifiedPleaseLogin=Jūsu parole tika mainīta. Drošības nolūkos jums tagad būs jāpiesakās ar savu jauno paroli. WarningAnEntryAlreadyExistForTransKey=Šīs valodas tulkošanas taustiņam jau ir ieraksts WarningNumberOfRecipientIsRestrictedInMassAction=Brīdinājums, ja izmantojat masveida darbību sarakstos, saņēmēju skaits ir ierobežots %s WarningDateOfLineMustBeInExpenseReportRange=Brīdinājums, rindas datums nav izdevumu pārskata diapazonā diff --git a/htdocs/langs/lv_LV/eventorganization.lang b/htdocs/langs/lv_LV/eventorganization.lang index d37ec669631..6545b566da2 100644 --- a/htdocs/langs/lv_LV/eventorganization.lang +++ b/htdocs/langs/lv_LV/eventorganization.lang @@ -54,7 +54,7 @@ EVENTORGANIZATION_FILTERATTENDEES_TYPE = Dalībnieka izveides/pievienošanas vei # Object # EventOrganizationConfOrBooth= Konference vai stends -EventOrganizationConfOrBoothes=Conferences or Boothes +EventOrganizationConfOrBoothes=Konferences vai stendi ManageOrganizeEvent = Pārvaldiet pasākuma organizēšanu ConferenceOrBooth = Konference vai stends ConferenceOrBoothTab = Konference vai stends @@ -115,8 +115,8 @@ EvntOrgRegistrationHelpMessage = Šeit varat balsot par konferenci vai ieteikt j EvntOrgRegistrationConfHelpMessage = Šeit varat ieteikt jaunu konferenci, ko animēt pasākuma laikā. EvntOrgRegistrationBoothHelpMessage = Šeit jūs varat pieteikties stendam pasākuma laikā. ListOfSuggestedConferences = Ieteicamo konferenču saraksts -ListOfSuggestedBooths=Suggested booths -ListOfConferencesOrBooths=Conferences or booths of event project +ListOfSuggestedBooths=Ieteiktās kabīnes +ListOfConferencesOrBooths=Konferenču vai pasākumu projektu kabīnes SuggestConference = Ieteikt jaunu konferenci SuggestBooth = Ieteikt stendu ViewAndVote = Skatiet ierosinātos pasākumus un balsojiet par tiem @@ -172,3 +172,5 @@ ErrorSeveralCompaniesWithEmailContactUs=Ir atrasti vairāki uzņēmumi ar šo e ErrorSeveralCompaniesWithNameContactUs=Ir atrasti vairāki uzņēmumi ar šo nosaukumu, tāpēc mēs nevaram automātiski apstiprināt jūsu reģistrāciju. Lūdzu, sazinieties ar mums pa e -pastu %s, lai manuāli apstiprinātu NoPublicActionsAllowedForThisEvent=Šajā pasākumā neviena publiska darbība nav pieejama sabiedrībai MaxNbOfAttendees=Maksimālais dalībnieku skaits +DateStartEvent=Pasākuma sākuma datums +DateEndEvent=Pasākuma beigu datums diff --git a/htdocs/langs/lv_LV/holiday.lang b/htdocs/langs/lv_LV/holiday.lang index 480d77f4526..913d38f8cd3 100644 --- a/htdocs/langs/lv_LV/holiday.lang +++ b/htdocs/langs/lv_LV/holiday.lang @@ -143,16 +143,16 @@ TemplatePDFHolidays=PDF veidne atvaļinājumu pieprasīšanai FreeLegalTextOnHolidays=Brīvs teksts PDF WatermarkOnDraftHolidayCards=Ūdenszīmes uz atvaļinājuma pieprasījumiem HolidaysToApprove=Brīvdienas, kas jāapstiprina -NobodyHasPermissionToValidateHolidays=Nevienam nav atļaujas apstiprināt brīvdienas -HolidayBalanceMonthlyUpdate=Ikmēneša brīvdienu bilances atjauninājums +NobodyHasPermissionToValidateHolidays=Nevienam nav atļaujas apstiprināt atvaļinājuma pieprasījumus +HolidayBalanceMonthlyUpdate=Ikmēneša atvaļinājuma atlikuma atjauninājums XIsAUsualNonWorkingDay=%s parasti ir NAV darba diena BlockHolidayIfNegative=Bloķēt, ja atlikums ir negatīvs LeaveRequestCreationBlockedBecauseBalanceIsNegative=Šī atvaļinājuma pieprasījuma izveide ir bloķēta, jo jūsu bilance ir negatīva ErrorLeaveRequestMustBeDraftCanceledOrRefusedToBeDeleted=Atstāšanas pieprasījumam %s jābūt melnrakstam, tas ir jāatceļ vai jāatsakās dzēst -IncreaseHolidays=Palieliniet brīvdienas -HolidayRecordsIncreased= %s svētku ieraksti palielinājās -HolidayRecordIncreased=Pieaudzis svētku rekords -ConfirmMassIncreaseHoliday=Lielapjoma brīvdienu palielināšana +IncreaseHolidays=Palieliniet atvaļinājuma atlikumu +HolidayRecordsIncreased= %s atvaļinājumu atlikumi palielinājās +HolidayRecordIncreased=Palielināts atvaļinājumu atlikums +ConfirmMassIncreaseHoliday=Lielapjoma atvaļinājuma atlikuma palielināšana NumberDayAddMass=Dienu skaits, kas jāpievieno atlasei ConfirmMassIncreaseHolidayQuestion=Vai tiešām vēlaties palielināt %s atlasītā(-u) ieraksta(-u) brīvdienu? HolidayQtyNotModified=Atlikušo dienu atlikums %s nav mainīts diff --git a/htdocs/langs/lv_LV/hrm.lang b/htdocs/langs/lv_LV/hrm.lang index 4c121d33c98..0829659809c 100644 --- a/htdocs/langs/lv_LV/hrm.lang +++ b/htdocs/langs/lv_LV/hrm.lang @@ -86,7 +86,7 @@ SaveAddSkill = Pievienotas prasmes SaveLevelSkill = Prasmju līmenis ir saglabāts DeleteSkill = Prasme noņemta SkillsExtraFields=Attributs supplémentaires (kompetences) -JobsExtraFields=Attributs supplémentaires (Emplois) +JobsExtraFields=Attributs supplémentaires (darba profils) EvaluationsExtraFields=Atribūti supplémentaires (novērtējumi) NeedBusinessTravels=Nepieciešami biznesa ceļojumi NoDescription=Nav apraksta diff --git a/htdocs/langs/lv_LV/interventions.lang b/htdocs/langs/lv_LV/interventions.lang index c1526af527d..ce6de8b0c78 100644 --- a/htdocs/langs/lv_LV/interventions.lang +++ b/htdocs/langs/lv_LV/interventions.lang @@ -69,4 +69,4 @@ GenerateInter=Ģenerēt iejaukšanos FichinterNoContractLinked=Intervence %s ir izveidota bez saistīta līguma. ErrorFicheinterCompanyDoesNotExist=Uzņēmums neeksistē. Intervence nav izveidota. NextDateToIntervention=Nākamās intervences paaudzes datums -NoIntervention=No intervention +NoIntervention=Bez iejaukšanās diff --git a/htdocs/langs/lv_LV/loan.lang b/htdocs/langs/lv_LV/loan.lang index b32d48f8413..120b093bf4b 100644 --- a/htdocs/langs/lv_LV/loan.lang +++ b/htdocs/langs/lv_LV/loan.lang @@ -28,7 +28,7 @@ CantUseScheduleWithLoanStartedToPaid = Nevar ģenerēt laika grafiku aizdevumam CantModifyInterestIfScheduleIsUsed = Jūs nevarat mainīt interesi, ja izmantojat grafiku # Admin ConfigLoan=Configuration of the module loan -LOAN_ACCOUNTING_ACCOUNT_CAPITAL=Account (from the Chart Of Account) to be used by default for capital (Loan module) -LOAN_ACCOUNTING_ACCOUNT_INTEREST=Account (from the Chart Of Account) to be used by default for interest (Loan module) -LOAN_ACCOUNTING_ACCOUNT_INSURANCE=Account (from the Chart Of Account) to be used by default for insurance (Loan module) +LOAN_ACCOUNTING_ACCOUNT_CAPITAL=Konts (no konta plāna), kas pēc noklusējuma jāizmanto kapitālam (aizdevuma modulis) +LOAN_ACCOUNTING_ACCOUNT_INTEREST=Konts (no konta plāna), kas pēc noklusējuma jāizmanto procentiem (aizdevuma modulis) +LOAN_ACCOUNTING_ACCOUNT_INSURANCE=Konts (no konta plāna), kas pēc noklusējuma jāizmanto apdrošināšanai (aizdevuma modulis) CreateCalcSchedule=Rediģēt finansiālās saistības diff --git a/htdocs/langs/lv_LV/main.lang b/htdocs/langs/lv_LV/main.lang index 932a87c1285..665d3da303d 100644 --- a/htdocs/langs/lv_LV/main.lang +++ b/htdocs/langs/lv_LV/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=Nav definēta neviena lietotāju grupa Password=Parole PasswordRetype=Atkārtojiet savu paroli NoteSomeFeaturesAreDisabled=Ņemiet vērā, ka funkcijas / modules daudz ir invalīdi šajā demonstrācijā. +YourUserFile=Jūsu lietotāja fails Name=Nosaukums NameSlashCompany=Nosaukums/uzņēmums Person=Persona @@ -897,6 +898,9 @@ MassFilesArea=Platība failiem, kurus izveido masveida darbības ShowTempMassFilesArea=Show area of files built by mass actions ConfirmMassDeletion=Bulk Delete apstiprinājums ConfirmMassDeletionQuestion=Vai tiešām vēlaties dzēst atlasīto(-s) ierakstu(-s) %s? +ConfirmMassClone=Lielapjoma klona apstiprināšana +ConfirmMassCloneQuestion=Atlasiet projektu, uz kuru vēlaties klonēt +ConfirmMassCloneToOneProject=Klonēt uz projektu %s RelatedObjects=Saistītie objekti ClassifyBilled=Klasificēt apmaksāts ClassifyUnbilled=Klasificēt neapmaksāts @@ -912,8 +916,8 @@ ExportFilteredList=Eksportēt atlasīto sarakstu ExportList=Eksporta saraksts ExportOptions=Eksportēšanas iespējas IncludeDocsAlreadyExported=Iekļaut jau eksportētos dokumentus -ExportOfPiecesAlreadyExportedIsEnable=Eksportēt jau eksportētos gabalus -ExportOfPiecesAlreadyExportedIsDisable=Eksportēto gabalu eksports ir atspējots +ExportOfPiecesAlreadyExportedIsEnable=Jau eksportētie dokumenti ir redzami un tiks eksportēti +ExportOfPiecesAlreadyExportedIsDisable=Jau eksportētie dokumenti ir paslēpti un netiks eksportēti AllExportedMovementsWereRecordedAsExported=Visas eksportētās kustības tika reģistrētas kā eksportētas NotAllExportedMovementsCouldBeRecordedAsExported=Ne visas eksportētās kustības var ierakstīt kā eksportētas Miscellaneous=Dažādi @@ -1128,6 +1132,7 @@ DeleteFileText=Vai tiešām vēlaties izdzēst šo failu? ShowOtherLanguages=Rādīt citas valodas SwitchInEditModeToAddTranslation=Pārslēdzieties rediģēšanas režīmā, lai šai valodai pievienotu tulkojumus NotUsedForThisCustomer=Nav izmantots šim klientam +NotUsedForThisVendor=Nav izmantots šim pārdevējam AmountMustBePositive=Summai jābūt pozitīvai ByStatus=Pēc statusa InformationMessage=Informācija @@ -1148,18 +1153,18 @@ EventReminder=Atgādinājums par notikumu UpdateForAllLines=Atjauninājums visām līnijām OnHold=On hold Civility=Laipnība -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Iestatīt Supervisor +AffectTag=Piešķiriet tagu +AffectUser=Piešķirt lietotāju +SetSupervisor=Iestatiet vadītāju CreateExternalUser=Izveidot ārēju lietotāju -ConfirmAffectTag=Bulk Tag Assignement -ConfirmAffectUser=Bulk User Assignement -ProjectRole=Katram projektam piešķirta loma -TasksRole=Katra projekta uzdevumam piešķirta loma +ConfirmAffectTag=Lielapjoma tagu piešķiršana +ConfirmAffectUser=Lielapjoma lietotāju piešķiršana +ProjectRole=Katram projektam/iespējai piešķirta loma +TasksRole=Katram uzdevumam piešķirtā loma (ja tiek izmantota) ConfirmSetSupervisor=Lielapjoma uzrauga komplekts ConfirmUpdatePrice=Izvēlieties cenas palielināšanas/samazināšanās likmi -ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? -ConfirmAffectUserQuestion=Are you sure you want to assign users to the %s selected record(s)? +ConfirmAffectTagQuestion=Vai tiešām vēlaties piešķirt atzīmes %s atlasītajam(-iem) ierakstam(-iem)? +ConfirmAffectUserQuestion=Vai tiešām vēlaties piešķirt lietotājus %s atlasītajam(-iem) ierakstam(-iem)? ConfirmSetSupervisorQuestion=Vai tiešām vēlaties iestatīt uzraugu %s atlasītajam(-iem) ierakstam(-iem)? ConfirmUpdatePriceQuestion=Vai tiešām vēlaties atjaunināt %s atlasītā(-u) ieraksta(-u) cenu? CategTypeNotFound=Ierakstu veidam nav atrasts neviens tagu tips @@ -1170,7 +1175,7 @@ InformationOnLinkToContract=Šī summa ir tikai visu līguma rindu kopsumma. Lai ConfirmCancel=Vai tiešām vēlaties atcelt EmailMsgID=Nosūtīt e-pastu MsgID EmailDate=E-pasta datums -SetToStatus=Set to status %s +SetToStatus=Iestatīt statusu %s SetToEnabled=Iestatīt kā iespējotu SetToDisabled=Iestatīts kā atspējots ConfirmMassEnabling=masu, kas ļauj apstiprināt @@ -1199,8 +1204,8 @@ Terminated=Izbeigta AddLineOnPosition=Pievienot rindiņu pozīcijai (beigās, ja tukša) ConfirmAllocateCommercial=Piešķiriet tirdzniecības pārstāvja apstiprinājumu ConfirmAllocateCommercialQuestion=Vai tiešām vēlaties piešķirt %s atlasītos ierakstus? -CommercialsAffected=Sales representatives assigned -CommercialAffected=Sales representative assigned +CommercialsAffected=Norīkoti tirdzniecības pārstāvji +CommercialAffected=Norīkots tirdzniecības pārstāvis YourMessage=Tava ziņa YourMessageHasBeenReceived=Jūsu ziņojums ir saņemts. Mēs atbildēsim vai sazināsimies ar jums pēc iespējas ātrāk. UrlToCheck=Pārbaudāmais URL @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Izveidots no publiskā portāla UserAgent=Lietotāja aģents InternalUser=Iekšējais lietotājs ExternalUser=Ārējais lietotājs +NoSpecificContactAddress=Nav konkrētas kontaktpersonas vai adreses +NoSpecificContactAddressBis=Šī cilne ir paredzēta konkrētu kontaktpersonu vai adrešu piespiedu noteikšanai pašreizējam objektam. Izmantojiet to tikai tad, ja vēlaties objektam definēt vienu vai vairākas konkrētas kontaktpersonas vai adreses, kad trešās puses informācija nav pietiekama vai nav precīza. +HideOnVCard=Slēpt %s +AddToContacts=Pievienot adresi maniem kontaktiem +LastAccess=Pēdējā piekļuve +UploadAnImageToSeeAPhotoHere=Augšupielādējiet attēlu no cilnes %s, lai skatītu fotoattēlu šeit +LastPasswordChangeDate=Pēdējās paroles maiņas datums diff --git a/htdocs/langs/lv_LV/members.lang b/htdocs/langs/lv_LV/members.lang index c7f2fccb790..7fceb4fdd04 100644 --- a/htdocs/langs/lv_LV/members.lang +++ b/htdocs/langs/lv_LV/members.lang @@ -231,4 +231,4 @@ CreateDolibarrLoginDesc=Izveidojot lietotājvārdu dalībniekiem, viņi var izve CreateDolibarrThirdPartyDesc=Trešā puse ir juridiska persona, kas tiks izmantota rēķinā, ja jūs nolemjat ģenerēt rēķinu par katru ieguldījumu. To varēsit izveidot vēlāk, ieguldījuma ierakstīšanas procesa laikā. MemberFirstname=Dalībnieka vārds MemberLastname=Dalībnieka uzvārds -MemberCodeDesc=Member Code, unique for all members +MemberCodeDesc=Dalībnieka kods, unikāls visiem dalībniekiem diff --git a/htdocs/langs/lv_LV/mrp.lang b/htdocs/langs/lv_LV/mrp.lang index d5d88fc8fd2..664d85fa17d 100644 --- a/htdocs/langs/lv_LV/mrp.lang +++ b/htdocs/langs/lv_LV/mrp.lang @@ -11,7 +11,7 @@ Bom=Materiālu rēķini BillOfMaterials=Materiālu rēķins BillOfMaterialsLines=Materiālu rēķina līnijas BOMsSetup=Moduļa BOM iestatīšana -ListOfBOMs=Bills of material - BOM +ListOfBOMs=Materiālu pavadzīmes - BOM ListOfManufacturingOrders=Ražošanas pasūtījumi NewBOM=Jauns materiālu saraksts ProductBOMHelp=Produkts, kuru izveidot (vai izjaukt) ar šo BOM.
    Piezīme: Produkti ar īpašību 'Produkta veids' = 'Izejvielas' šajā sarakstā nav redzami. @@ -102,6 +102,7 @@ NbOperatorsRequired=Nepieciešamo operatoru skaits THMOperatorEstimated=Paredzamais operators THM THMMachineEstimated=Paredzētā mašīna THM WorkstationType=Darbstacijas tips +DefaultWorkstation=Noklusējuma darbstacija Human=Cilvēks Machine=Mašīna HumanMachine=Cilvēks / Mašīna @@ -116,5 +117,5 @@ ParentMo=MO Vecāks MOChild=MO bērns BomCantAddChildBom=Nomenklatūra %s jau atrodas kokā, kas ved uz nomenklatūru %s BOMNetNeeds = BOM neto vajadzības -BOMProductsList=BOM's products -BOMServicesList=BOM's services +BOMProductsList=BOM produkti +BOMServicesList=BOM pakalpojumi diff --git a/htdocs/langs/lv_LV/orders.lang b/htdocs/langs/lv_LV/orders.lang index 6f8c400775c..6698b6faed2 100644 --- a/htdocs/langs/lv_LV/orders.lang +++ b/htdocs/langs/lv_LV/orders.lang @@ -96,6 +96,10 @@ OrdersStatisticsSuppliers=Pirkuma pasūtījumu statistika NumberOfOrdersByMonth=Pasūtījumu skaits pa mēnešiem AmountOfOrdersByMonthHT=Pasūtījumu apjoms mēnesī (bez nodokļiem) ListOfOrders=Pasūtījumu saraksts +ListOrderLigne=Pasūtījumu rindas +productobuy=Produkti, kas jāiegādājas tikai +productonly=Tikai produkti +disablelinefree=Nav brīvu rindu CloseOrder=Aizvērt kārtība ConfirmCloseOrder=Vai tiešām vēlaties iestatīt šo pasūtījumu kā piegādātu? Kad pasūtījums ir piegādāts, to var iestatīt kā rēķinu. ConfirmDeleteOrder=Vai tiešām vēlaties dzēst šo pasūtījumu? @@ -131,6 +135,7 @@ SupplierOrderClassifiedBilled=Pirkuma pasūtījums %s, kas ir iekasēts OtherOrders=Citi pasūtījumi SupplierOrderValidatedAndApproved=Piegādātāja pasūtījums ir apstiprināts un apstiprināts: %s SupplierOrderValidated=Piegādātāja pasūtījums ir apstiprināts: %s +OrderShowDetail=Rādīt detalizētu informāciju par pasūtījumu ##### Types de contacts ##### TypeContact_commande_internal_SALESREPFOLL=Pārstāvju pārdošanas pasūtījuma pārstāvis TypeContact_commande_internal_SHIPPING=Pārstāvis turpinot darboties kuģniecības @@ -199,3 +204,5 @@ StatusSupplierOrderApproved=Apstiprināts StatusSupplierOrderRefused=Atteikts StatusSupplierOrderReceivedPartially=Daļēji saņemts StatusSupplierOrderReceivedAll=Visi produkti saņemti +NeedAtLeastOneInvoice = Ir jābūt vismaz vienam rēķinam +LineAlreadyDispatched = Pasūtījuma rinda jau ir saņemta. diff --git a/htdocs/langs/lv_LV/other.lang b/htdocs/langs/lv_LV/other.lang index c671d722390..e232ed1b840 100644 --- a/htdocs/langs/lv_LV/other.lang +++ b/htdocs/langs/lv_LV/other.lang @@ -46,9 +46,9 @@ Notify_ORDER_SUPPLIER_APPROVE=Pirkuma pasūtījums apstiprināts Notify_ORDER_SUPPLIER_REFUSE=Pirkuma pasūtījums noraidīts Notify_PROPAL_VALIDATE=Klientu priekšlikums apstiprināts Notify_PROPAL_CLOSE_SIGNED=Klienta piedāvājums ir noslēgts parakstīts -Notify_PROPAL_CLOSE_SIGNED_WEB=Customer proposal closed signed on portal page +Notify_PROPAL_CLOSE_SIGNED_WEB=Klienta piedāvājums aizvērts, parakstīts portāla lapā Notify_PROPAL_CLOSE_REFUSED=Klienta iesniegtais piedāvājums ir noraidīts -Notify_PROPAL_CLOSE_REFUSED_WEB=Customer proposal closed refused on portal page +Notify_PROPAL_CLOSE_REFUSED_WEB=Klienta piedāvājums slēgts portāla lapā noraidīts Notify_PROPAL_SENTBYMAIL=Commercial priekšlikums nosūtīts pa pastu Notify_WITHDRAW_TRANSMIT=Pārraides atsaukšana Notify_WITHDRAW_CREDIT=Kredīta izņemšana @@ -213,9 +213,9 @@ EMailTextInvoiceValidated=Rēķins %s ir apstiprināts. EMailTextInvoicePayed=Rēķins %s ir samaksāts. EMailTextProposalValidated=Priekšlikums %s ir apstiprināts. EMailTextProposalClosedSigned=Priekšlikums %s ir slēgts. -EMailTextProposalClosedSignedWeb=Proposal %s has been closed signed on portal page. -EMailTextProposalClosedRefused=Proposal %s has been closed refused. -EMailTextProposalClosedRefusedWeb=Proposal %s has been closed refuse on portal page. +EMailTextProposalClosedSignedWeb=Priekšlikums %s ir slēgts, parakstīts portāla lapā. +EMailTextProposalClosedRefused=Priekšlikums %s ir slēgts, noraidīts. +EMailTextProposalClosedRefusedWeb=Priekšlikums %s ir slēgts, noraidīt portāla lapā. EMailTextOrderValidated=Pasūtījums %s ir apstiprināts. EMailTextOrderApproved=Pasūtījums %s ir apstiprināts. EMailTextOrderValidatedBy=Pasūtījums %s ir reģistrēts ar %s. diff --git a/htdocs/langs/lv_LV/projects.lang b/htdocs/langs/lv_LV/projects.lang index dafe30d0ea7..b49871842ac 100644 --- a/htdocs/langs/lv_LV/projects.lang +++ b/htdocs/langs/lv_LV/projects.lang @@ -125,8 +125,8 @@ ValidateProject=Apstiprināt projektu ConfirmValidateProject=Vai jūs tiešām vēlaties apstiprināt šo projektu? CloseAProject=Aizvērt projektu ConfirmCloseAProject=Vai tiešām vēlaties aizvērt šo projektu? -AlsoCloseAProject=Also close project -AlsoCloseAProjectTooltip=Keep it open if you still need to follow production tasks on it +AlsoCloseAProject=Arī slēgt projektu +AlsoCloseAProjectTooltip=Saglabājiet to atvērtu, ja jums joprojām ir jāseko tajā esošajiem ražošanas uzdevumiem ReOpenAProject=Atvērt projektu ConfirmReOpenAProject=Vai tiešām vēlaties atvērt šo projektu vēlreiz? ProjectContact=Projekta kontakti @@ -169,7 +169,7 @@ OpportunityProbability=Svina varbūtība OpportunityProbabilityShort=Svina probabs. OpportunityAmount=Svina daudzums OpportunityAmountShort=Svina summa -OpportunityWeightedAmount=Amount of opportunity, weighted by probability +OpportunityWeightedAmount=Iespējas apjoms, svērts ar varbūtību OpportunityWeightedAmountShort=Opp. svērtā summa OpportunityAmountAverageShort=Vidējā svina summa OpportunityAmountWeigthedShort=Svērtā svina summa @@ -259,6 +259,7 @@ RecordsClosed=%s projekts (-i) slēgts SendProjectRef=Informācijas projekts %s ModuleSalaryToDefineHourlyRateMustBeEnabled=Modulam „Algas” ir jābūt iespējai noteikt darbinieku stundas likmi, lai varētu izmantot laiku NewTaskRefSuggested=Jau izmantotais uzdevums ir nepieciešams jauns uzdevums +NumberOfTasksCloned=%s uzdevums(-i) ir klonēti TimeSpentInvoiced=Norēķinātais laiks TimeSpentForIntervention=Laiks, kas patērēts TimeSpentForInvoice=Laiks, kas patērēts diff --git a/htdocs/langs/lv_LV/salaries.lang b/htdocs/langs/lv_LV/salaries.lang index 85a3291dcfb..fc725cf2cbb 100644 --- a/htdocs/langs/lv_LV/salaries.lang +++ b/htdocs/langs/lv_LV/salaries.lang @@ -1,6 +1,6 @@ # Dolibarr language file - Source file is en_US - salaries -SALARIES_ACCOUNTING_ACCOUNT_PAYMENT=Account (from the Chart of Account) used by default for "user" third parties -SALARIES_ACCOUNTING_ACCOUNT_PAYMENT_Desc=The dedicated account defined on user card will be used for Subledger accounting only. This one will be used for General Ledger and as default value of Subledger accounting if dedicated user accounting account on user is not defined. +SALARIES_ACCOUNTING_ACCOUNT_PAYMENT=Konts (no kontu plāna), ko pēc noklusējuma izmanto "lietotāja" trešajām pusēm +SALARIES_ACCOUNTING_ACCOUNT_PAYMENT_Desc=Lietotāja kartē norādītais speciālais konts tiks izmantots tikai Apakšgrāmatas uzskaitei. Šis tiks izmantots Virsgrāmatai un kā apakšvirsgrāmatas uzskaites noklusējuma vērtība, ja lietotājam nav definēts īpašs lietotāja uzskaites konts. SALARIES_ACCOUNTING_ACCOUNT_CHARGE=Grāmatvedības konts pēc noklusējuma algu maksājumiem CREATE_NEW_SALARY_WITHOUT_AUTO_PAYMENT=Pēc noklusējuma, veidojot algu, atstājiet tukšu opciju "Automātiski izveidot kopējo maksājumu" Salary=Alga diff --git a/htdocs/langs/lv_LV/stripe.lang b/htdocs/langs/lv_LV/stripe.lang index 3cb4db99268..d272c1902ed 100644 --- a/htdocs/langs/lv_LV/stripe.lang +++ b/htdocs/langs/lv_LV/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Webhokas tiešraides atslēga ONLINE_PAYMENT_WAREHOUSE=Krājums, ko izmanto, lai krājumu samazinātu, kad tiek veikts tiešsaistes maksājums
    (TODO Kad iespēja samazināt akciju tiek veikta, veicot darbību rēķinā, un tiešsaistes maksājums pats par sevi sagatavo rēķinu?) StripeLiveEnabled=Ieslēgta josla dzīvot (citādi tests / smilškastē režīms) StripeImportPayment=Importēšanas joslas maksājumi -ExampleOfTestCreditCard=Kredītkartes paraugs testam: %s => derīgs, %s => kļūda CVC, %s => beidzies, %s => maksa neizdodas +ExampleOfTestCreditCard=Kredītkartes piemērs SEPA pārbaudei: %s => derīga, %s => kļūda CVC, %s => beidzies derīguma termiņš, %s => maksājums neizdodas +ExampleOfTestBankAcountForSEPA=Bankas konta BAN piemērs tiešā debeta pārbaudei: %s StripeGateways=Joslas vārti OAUTH_STRIPE_TEST_ID=Stripe Connect klienta ID (ca _...) OAUTH_STRIPE_LIVE_ID=Stripe Connect klienta ID (ca _...) @@ -70,5 +71,8 @@ ToOfferALinkForLiveWebhook=Saite uz iestatījumu Stripe WebHook, lai izsauktu IP PaymentWillBeRecordedForNextPeriod=Maksājums tiks reģistrēts par nākamo periodu. ClickHereToTryAgain=Noklikšķiniet šeit, lai mēģinātu vēlreiz ... CreationOfPaymentModeMustBeDoneFromStripeInterface=Stingro klientu autentifikācijas noteikumu dēļ karte jāizveido no Stripe biroja. Jūs varat noklikšķināt šeit, lai ieslēgtu Stripe klientu ierakstu: %s -TERMINAL_LOCATION=Termināļu atrašanās vieta (adrese). +STRIPE_CARD_PRESENT=Stripe termināļiem paredzēta karte +TERMINAL_LOCATION=Stripe Terminals atrašanās vieta (adrese). RequestDirectDebitWithStripe=Pieprasiet tiešo debetu, izmantojot Stripe +STRIPE_SEPA_DIRECT_DEBIT=Iespējojiet tiešā debeta maksājumus, izmantojot Stripe + diff --git a/htdocs/langs/lv_LV/ticket.lang b/htdocs/langs/lv_LV/ticket.lang index 73bf0ff7ab4..a6e66acef68 100644 --- a/htdocs/langs/lv_LV/ticket.lang +++ b/htdocs/langs/lv_LV/ticket.lang @@ -26,6 +26,7 @@ Permission56002=Labot pieteikumus Permission56003=Dzēst pieteikumus Permission56004=Pieteikumu pārvaldīšana Permission56005=Skatīt visu trešo pušu biļetes (nav efektīvas ārējiem lietotājiem, vienmēr aprobežojas ar trešajām personām, no kurām tie ir atkarīgi) +Permission56006=Eksporta biļetes Tickets=Pieteikumi TicketDictType=Pieteikumu veids @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=Ārējais ieguldītājs OriginEmail=Reportiera e-pasts Notify_TICKET_SENTBYMAIL=Sūtīt biļeti pa e-pastu +ExportDataset_ticket_1=Pieteikumi + # Status Read=Lasīt Assigned=Piešķirts diff --git a/htdocs/langs/lv_LV/users.lang b/htdocs/langs/lv_LV/users.lang index 91892cf79ba..8bf8a4dccc5 100644 --- a/htdocs/langs/lv_LV/users.lang +++ b/htdocs/langs/lv_LV/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Saite uz lietotāju LinkedToDolibarrThirdParty=Saite uz trešo pusi CreateDolibarrLogin=Izveidot lietotāju CreateDolibarrThirdParty=Izveidot trešo pusi -LoginAccountDisableInDolibarr=Konts bloķēts Dolibarr. +LoginAccountDisableInDolibarr=Konts ir atspējots Dolibarr +PASSWORDInDolibarr=Parole mainīta programmā Dolibarr UsePersonalValue=Izmantot personisko vērtību ExportDataset_user_1=Lietotāji un to īpašības DomainUser=Domēna lietotājs %s @@ -129,3 +130,6 @@ IPLastLogin=IP pēdējā pieteikšanās IPPreviousLogin=IP iepriekšējā pieteikšanās ShowAllPerms=Rādīt visas atļauju rindas HideAllPerms=Slēpt visas atļauju rindas +UserPublicPageDesc=Šim lietotājam varat iespējot virtuālo karti. Būs pieejams URL ar lietotāja profilu un svītrkodu, lai ikviens, kam ir viedtālrunis, varētu to skenēt un pievienot jūsu kontaktpersonu savai adrešu grāmatai. +EnablePublicVirtualCard=Iespējot publisko virtuālo lietotāja karti +PublicVirtualCardUrl=Publiskā virtuālā lietotāja karte diff --git a/htdocs/langs/lv_LV/website.lang b/htdocs/langs/lv_LV/website.lang index 5f8211db2d1..1311dd77ad3 100644 --- a/htdocs/langs/lv_LV/website.lang +++ b/htdocs/langs/lv_LV/website.lang @@ -155,3 +155,5 @@ WebpageMustBeDisabled=Tīmekļa lapai ir jābūt statusam "%s" SetWebsiteOnlineBefore=Kad vietne ir bezsaistē, visas lapas ir bezsaistē. Vispirms mainiet vietnes statusu. Booking=Rezervēšana Reservation=Rezervācija +PagesViewedPreviousMonth=Skatītās lapas (iepriekšējā mēnesī) +PagesViewedTotal=Apskatītās lapas (kopā) diff --git a/htdocs/langs/lv_LV/withdrawals.lang b/htdocs/langs/lv_LV/withdrawals.lang index 7b15cbab87b..0ac7f442968 100644 --- a/htdocs/langs/lv_LV/withdrawals.lang +++ b/htdocs/langs/lv_LV/withdrawals.lang @@ -33,7 +33,7 @@ InvoiceWaitingPaymentByBankTransfer=Rēķins gaida pārskaitījumu AmountToWithdraw=Summa atsaukt AmountToTransfer=Pārskaitāmā summa NoInvoiceToWithdraw=Par “%s” nav atvērts rēķins. Dodieties uz rēķina kartes cilni '%s', lai iesniegtu pieprasījumu. -NoSupplierInvoiceToWithdraw=No supplier invoice with open '%s' is waiting. Go on tab '%s' on invoice card to make a request. +NoSupplierInvoiceToWithdraw=Negaida neviens piegādātāja rēķins ar atvērtu “%s”. Rēķina kartē atveriet cilni “%s”, lai iesniegtu pieprasījumu. ResponsibleUser=Lietotājs ir atbildīgs WithdrawalsSetup=Tiešā debeta maksājuma iestatīšana CreditTransferSetup=Kredīta pārveduma iestatīšana diff --git a/htdocs/langs/mk_MK/accountancy.lang b/htdocs/langs/mk_MK/accountancy.lang index 28796600183..99c230dcd11 100644 --- a/htdocs/langs/mk_MK/accountancy.lang +++ b/htdocs/langs/mk_MK/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Изберете го типот на кодот за ACCOUNTING_EXPORT_PREFIX_SPEC=Наведете го префиксот за името на датотеката ThisService=Оваа услуга ThisProduct=Овој производ -DefaultForService=Стандардно за услугата -DefaultForProduct=Стандардно за производот +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Product for this thirdparty ServiceForThisThirdparty=Service for this thirdparty CantSuggest=Без предлози @@ -101,7 +101,8 @@ ShowAccountingAccount=Show accounting account ShowAccountingJournal=Show accounting journal ShowAccountingAccountInLedger=Show accounting account in ledger ShowAccountingAccountInJournals=Show accounting account in journals -AccountAccountingSuggest=Accounting account suggested +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=Default accounts MenuBankAccounts=Bank accounts MenuVatAccounts=Vat accounts @@ -126,6 +127,7 @@ WriteBookKeeping=Record transactions in accounting Bookkeeping=Ledger BookkeepingSubAccount=Subledger AccountBalance=Account balance +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Source object ref CAHTF=Total purchase vendor before tax TotalExpenseReport=Total expense report @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=Journal label NumPiece=Piece number TransactionNumShort=Num. transaction AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Group by general ledger account GroupBySubAccountAccounting=Group by subledger account AccountingAccountGroupsDesc=You can define here some groups of accounting account. They will be used for personalized accounting reports. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Show subtotal by level Pcgtype=Group of account PcgtypeDesc=Group of account are used as predefined 'filter' and 'grouping' criteria for some accounting reports. For example, 'INCOME' or 'EXPENSE' are used as groups for accounting accounts of products to build the expense/income report. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Reconcilable @@ -294,6 +299,7 @@ DescValidateMovements=Any modification or deletion of writing, lettering and del ValidateHistory=Bind Automatically AutomaticBindingDone=Automatic bindings done (%s) - Automatic binding not possible for some record (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Disable binding & transfer in accountancy on ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Disable binding & transfer in accountancy on purchases (vendor invoices will not be taken into account in accounting) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Disable binding & transfer in accountancy on expense reports (expense reports will not be taken into account in accounting) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Flag exported lines as Exported (to modify a line, you will need to delete the whole transaction and re-transfert it into accounting) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=Date validation and lock ConfirmExportFile=Confirmation of the generation of the accounting export file ? ExportDraftJournal=Export draft journal @@ -398,7 +406,7 @@ SaleLocal=Local sale SaleExport=Export sale SaleEEC=Sale in EEC SaleEECWithVAT=Sale in EEC with a VAT not null, so we suppose this is NOT an intracommunautary sale and the suggested account is the standard product account. -SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fallback on the product account for standard sales. You can fix the VAT ID of thirdparty or the product account if needed. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Forbidden: The transaction has been validated and/or exported. ForbiddenTransactionAlreadyValidated=Forbidden: The transaction has been validated. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Mismatch in reconcile code AccountancyErrorMismatchBalanceAmount=The balance (%s) is not equal to 0 AccountancyErrorLetteringBookkeeping=Errors have occurred concerning the transactions: %s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Accounting entries @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Multicurrency code (Idevise) DateExport=Date export WarningReportNotReliable=Warning, this report is not based on the Ledger, so does not contains transaction modified manually in the Ledger. If your journalization is up to date, the bookkeeping view is more accurate. ExpenseReportJournal=Expense Report Journal +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s accounts diff --git a/htdocs/langs/nb_NO/accountancy.lang b/htdocs/langs/nb_NO/accountancy.lang index c023b1bfdd9..7afcf08cde8 100644 --- a/htdocs/langs/nb_NO/accountancy.lang +++ b/htdocs/langs/nb_NO/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Velg vognreturtypen ACCOUNTING_EXPORT_PREFIX_SPEC=Velg prefiks for filnavnet ThisService=Denne tjenesten ThisProduct=Denne varen -DefaultForService=Standard for tjeneste -DefaultForProduct=Standard for vare +DefaultForService=Standard for tjenester +DefaultForProduct=Standard for varer ProductForThisThirdparty=Vare for denne tredjeparten ServiceForThisThirdparty=Tjeneste for denne tredjeparten CantSuggest=Kan ikke foreslå @@ -101,7 +101,8 @@ ShowAccountingAccount=Vis regnskapskonto ShowAccountingJournal=Vis regnskapsjournal ShowAccountingAccountInLedger=Vis regnskapskonto i hovedbok ShowAccountingAccountInJournals=Vis regnskapskonto i journaler -AccountAccountingSuggest=Foreslått regnskapskonto +DataUsedToSuggestAccount=Data brukt til å foreslå konto +AccountAccountingSuggest=Foreslått konto MenuDefaultAccounts=Standard kontoer MenuBankAccounts=Bankkonti MenuVatAccounts=MVA-kontoer @@ -126,6 +127,7 @@ WriteBookKeeping=Registrere transaksjoner i regnskapet Bookkeeping=Hovedbok BookkeepingSubAccount=Sub-Hovedbok AccountBalance=Kontobalanse +AccountBalanceSubAccount=Underkonto-saldo ObjectsRef=Kildeobjekt ref CAHTF=Samlet leverandørkjøp før skatt TotalExpenseReport=Total utgiftsrapport @@ -178,31 +180,32 @@ ACCOUNTING_RESULT_PROFIT=Resultatregnskapskonto (fortjeneste) ACCOUNTING_RESULT_LOSS=Resultatregnskapskonto (tap) ACCOUNTING_CLOSURE_DEFAULT_JOURNAL=Avslutningsjournal -ACCOUNTING_ACCOUNT_TRANSFER_CASH=Account (from the Chart Of Account) to be used as the account for transitional bank transfers +ACCOUNTING_ACCOUNT_TRANSFER_CASH=Konto (fra kontoplanen) som skal brukes som konto for overgangs-bankoverføringer TransitionalAccount=Overgangsbasert bankoverføringskonto -ACCOUNTING_ACCOUNT_SUSPENSE=Account (from the Chart Of Account) to be used as the account for unallocated funds either received or paid i.e. funds in "wait[ing]" -DONATION_ACCOUNTINGACCOUNT=Account (from the Chart Of Account) to be used to register donations (Donation module) -ADHERENT_SUBSCRIPTION_ACCOUNTINGACCOUNT=Account (from the Chart Of Account) to be used to register memberships subscriptions (Membership module - if membership recorded without invoice) +ACCOUNTING_ACCOUNT_SUSPENSE=Konto (fra kontoplanen) som skal brukes som konto for ikke-allokerte midler enten mottatt eller betalt, dvs. midler i "venter" +DONATION_ACCOUNTINGACCOUNT=Konto (fra kontoplanen) som skal brukes til å registrere donasjoner (donasjonsmodul) +ADHERENT_SUBSCRIPTION_ACCOUNTINGACCOUNT=Konto (fra kontoplanen) som skal brukes til å registrere medlemskapsabonnementer (Medlemsmodul - hvis medlemskap er registrert uten faktura) -ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be used as the default account to register customer deposit +ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Konto (fra kontoplanen) som skal brukes som standardkonto for å registrere kundeinnskudd UseAuxiliaryAccountOnCustomerDeposit=Lagre kundekonto som individuell konto i hovedbok for linjer med forskuddsbetalinger (hvis den er deaktivert, vil individuell konto for forskuddsbetalingslinjer forbli tom) -ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default +ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Konto (fra kontoplanen) som skal brukes som standard UseAuxiliaryAccountOnSupplierDeposit=Lagre leverandørkonto som individuell konto i hovedbok for linjer med forskuddsbetalinger (hvis den er deaktivert, vil individuell konto for forskuddslinjer forbli tom) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Regnskapskonto som standard for å registrere garantibeløp -ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) -ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) -ACCOUNTING_PRODUCT_BUY_EXPORT_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased and imported from any other foreign country (used if not defined in the product sheet) -ACCOUNTING_PRODUCT_SOLD_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the sold products (used if not defined in the product sheet) -ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products sold from EEC to another EEC country (used if not defined in the product sheet) -ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products sold and exported to any other foreign country (used if not defined in the product sheet) +ACCOUNTING_PRODUCT_BUY_ACCOUNT=Konto (fra kontoplanen) som skal brukes som standardkonto for varer kjøpt i samme land (brukes hvis det ikke er definert i varearket) +ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Konto (fra kontoplanen) som skal brukes som standardkonto for varer kjøpt fra EEC til et annet EEC-land (brukes hvis det ikke er definert i varearket) +ACCOUNTING_PRODUCT_BUY_EXPORT_ACCOUNT=Konto (fra kontoplanen) som skal brukes som standardkonto for varer som er kjøpt og importert fra andre land (brukes hvis det ikke er definert i produktarket) +ACCOUNTING_PRODUCT_SOLD_ACCOUNT=Konto (fra kontoplanen) som skal brukes som standardkonto for de solgte produktene (brukes hvis det ikke er definert i varearket) +ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT=Konto (fra kontoplanen) som skal brukes som standardkonto for varer som selges fra EEC til et annet EEC-land (brukes hvis det ikke er definert i varearket) +ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT=Konto (fra kontoplanen) som skal brukes som standardkonto for varer som selges og eksporteres til et hvilket som helst annet land (brukes hvis det ikke er definert i produktarket) -ACCOUNTING_SERVICE_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the services purchased within same country (used if not defined in the service sheet) -ACCOUNTING_SERVICE_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the services purchased from EEC to another EEC country (used if not defined in the service sheet) -ACCOUNTING_SERVICE_BUY_EXPORT_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the services purchased and imported from other foreign country (used if not defined in the service sheet) -ACCOUNTING_SERVICE_SOLD_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the sold services (used if not defined in the service sheet) -ACCOUNTING_SERVICE_SOLD_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the services sold from EEC to another EEC country (used if not defined in the service sheet) -ACCOUNTING_SERVICE_SOLD_EXPORT_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the services sold and exported to any other foreign country (used if not defined in the service sheet) +ACCOUNTING_SERVICE_BUY_ACCOUNT=Konto (fra kontoplanen) som skal brukes som standardkonto for tjenester kjøpt i samme land (brukes hvis det ikke er definert i tjenestearket) +ACCOUNTING_SERVICE_BUY_INTRA_ACCOUNT=Konto (fra kontoplanen) som skal brukes som standardkonto for tjenestene kjøpt fra EEC til et annet EEC-land (brukes hvis det ikke er definert i tjenestearket) +ACCOUNTING_SERVICE_BUY_EXPORT_ACCOUNT=Konto (fra kontoplanen) som skal brukes som standardkonto for tjenestene kjøpt og importert fra andre land (brukes hvis det ikke er definert i tjenestearket) +ACCOUNTING_SERVICE_SOLD_ACCOUNT=Konto (fra kontoplanen) som skal brukes som standardkonto for de solgte tjenestene (brukes hvis det ikke er definert i servicearket) +ACCOUNTING_SERVICE_SOLD_INTRA_ACCOUNT=Konto (fra kontoplanen) som skal brukes som standardkonto for tjenestene som selges fra EEC til et annet EEC-land (brukes hvis det ikke er definert i tjenestearket) +ACCOUNTING_SERVICE_SOLD_EXPORT_ACCOUNT=Konto (fra kontoplanen) som skal brukes som standardkonto for tjenestene som selges og eksporteres til et hvilket som helst annet land (brukes hvis det ikke er definert i tjenestearket) Doctype=Dokumenttype Docdate=Dato @@ -217,7 +220,8 @@ Codejournal=Journal JournalLabel=Journaletikett NumPiece=Del nummer TransactionNumShort=Transaksjonsnummer -AccountingCategory=Custom group of accounts +AccountingCategory=Egendefinert gruppe med kontoer +AccountingCategories=Egendefinerte grupper av kontoer GroupByAccountAccounting=Gruppere etter hovedbokskonto GroupBySubAccountAccounting=Gruppere etter sub-hovedbokskonto AccountingAccountGroupsDesc=Her kan du definere noen grupper regnskapskonti. De vil bli brukt til personlige regnskapsrapporter. @@ -265,19 +269,20 @@ ShowSubtotalByGroup=Vis subtotal etter nivå Pcgtype=Kontogruppe PcgtypeDesc=Kontogruppe brukes som forhåndsdefinerte 'filter' og 'gruppering' kriterier for noen regnskapsrapporter. For eksempel blir 'INNTEKT' eller 'UTGIFT' brukt som grupper for regnskapsføring av varer for å lage utgifts-/inntektsrapporten. +AccountingCategoriesDesc=Egendefinert gruppe med kontoer kan brukes til å gruppere regnskapskontoer i ett navn for å lette filterbruk eller bygging av tilpassede rapporter. Reconcilable=Kan avstemmes TotalVente=Total omsetning før skatt TotalMarge=Total salgsmargin -DescVentilCustomer=Consult here the list of customer invoice lines bound (or not) to a product account from chart of account -DescVentilMore=In most cases, if you use predefined products or services and you set the account (from chart of account) on the product/service card, the application will be able to make all the binding between your invoice lines and the accounting account of your chart of accounts, just in one click with the button "%s". If account was not set on product/service cards or if you still have some lines not bound to an account, you will have to make a manual binding from the menu "%s". -DescVentilDoneCustomer=Consult here the list of the lines of invoices customers and their product account from chart of account -DescVentilTodoCustomer=Bind invoice lines not already bound with a product account from chart of account -ChangeAccount=Change the product/service account (from chart of account) for the selected lines with the following account: +DescVentilCustomer=Liste over kundefakturalinjer bundet (eller ikke) til en produktkonto fra kontoplan +DescVentilMore=I de fleste tilfeller, hvis du bruker forhåndsdefinerte produkter eller tjenester og du setter kontoen (fra kontoplan) på produkt-/tjenestekortet, vil applikasjonen kunne gjøre all bindingen mellom dine fakturalinjer og regnskapskontoen til dine kontoer, bare med ett klikk med knappen "%s" . Hvis konto ikke ble satt på vare-/tjenestekort eller hvis du fortsatt har noen linjer som ikke er bundet til en konto, må du gjøre en manuell binding fra menyen " %s ". +DescVentilDoneCustomer=Liste over linjene med fakturakunder og deres produktkonto fra kontoplan +DescVentilTodoCustomer=Bind fakturalinjer som ikke allerede er bundet til en varekonto fra kontoplan +ChangeAccount=Endre vare-/tjenestekontoen (fra kontoplanen) for de valgte linjene med følgende konto: Vide=- -DescVentilSupplier=Consult here the list of vendor invoice lines bound or not yet bound to a product account from chart of account (only record not already transfered in accountancy are visible) +DescVentilSupplier=Liste over leverandørfakturalinjer som er bundet eller ennå ikke bundet til en produktkonto fra kontoplan (bare post som ikke allerede er overført i regnskap er synlig) DescVentilDoneSupplier=Liste over linjene med leverandørfakturaer og deres regnskapskonto DescVentilTodoExpenseReport=Bind utgiftsrapport-linjer til en gebyr-regnskapskonto DescVentilExpenseReport=Liste over utgiftsrapport-linjer bundet (eller ikke) til en gebyr-regnskapskonto @@ -294,15 +299,16 @@ DescValidateMovements=Enhver modifisering eller fjerning av skriving, bokstaver ValidateHistory=Bind automatisk AutomaticBindingDone=Automatiske bindinger utført (%s) - Automatisk binding er ikke mulig for enkelte poster (%s) +DoManualBindingForFailedRecord=Du må gjøre en manuell kobling for %s rad(er) som ikke kobles automatisk. -ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used +ErrorAccountancyCodeIsAlreadyUse=Feil, du kan ikke fjerne eller deaktivere denne kontoplanen fordi den er i bruk MvtNotCorrectlyBalanced=Bevegelsen er ikke riktig balansert. Debet = %s & kreditt = %s Balancing=Balansering FicheVentilation=Binding-kort GeneralLedgerIsWritten=Transaksjoner blir skrevet inn i hovedboken GeneralLedgerSomeRecordWasNotRecorded=Noen av transaksjonene kunne ikke journalføres. Hvis det ikke er noen annen feilmelding, er dette trolig fordi de allerede var journalført. NoNewRecordSaved=Ingen flere poster å overføre -ListOfProductsWithoutAccountingAccount=List of products not bound to any account of chart of account +ListOfProductsWithoutAccountingAccount=Liste over varer som ikke er bundet til noen konto eller kontoplan ChangeBinding=Endre bindingen Accounted=Regnskapsført i hovedbok NotYetAccounted=Foreløpig ikke overført til regnskap @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Deaktiver binding og overføring til regnska ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Deaktiver binding og overføring til regnskap ved kjøp (leverandørfakturaer blir ikke tatt med i regnskapet) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Deaktiver binding og overføring til regnskap på utgiftsrapporter (utgiftsrapporter blir ikke tatt med i regnskapet) ACCOUNTING_ENABLE_LETTERING=Aktiver bokstavfunksjonen i regnskapet +ACCOUNTING_ENABLE_AUTOLETTERING=Aktiver automatisk skriving ved overføring til regnskap ## Export NotExportLettering=Ikke eksporter bokstaver når du genererer filen NotifiedExportDate=Flagg eksporterte linjer som eksportert (for å endre en linje, må du slette hele transaksjonen og overføre den til regnskapet på nytt) NotifiedValidationDate=Valider og lås de eksporterte oppføringene (samme effekt som "%s"-funksjonen, modifikasjon og sletting av linjene vil DEFINITIVT ikke være mulig) +NotifiedExportFull=Eksportere dokumenter? DateValidationAndLock=Datovalidering og lås ConfirmExportFile=Bekreftelse på generering av regnskapseksportfilen ? ExportDraftJournal=Eksporter utkastjournal @@ -398,7 +406,7 @@ SaleLocal=Lokalt salg SaleExport=Eksportsalg SaleEEC=Salg i EU SaleEECWithVAT=Salg i EU med mva som ikke er null, så vi antar at dette IKKE er et intra-EU salg og den foreslåtte kontoen er standard produktkonto. -SaleEECWithoutVATNumber=Salg i EU uten mva, men mva-ID for tredjepart er ikke definert. Vi faller tilbake på produktkontoen for standard salg. Du kan fikse mva-ID for tredjepart eller produktkonto om nødvendig. +SaleEECWithoutVATNumber=Salg i EEC uten MVA, men MVA-ID-en til tredjepart er ikke definert. Vi faller tilbake på kontoen for standardsalg. Du kan fikse MVA-ID-en til tredjeparten, eller endre produktkontoen som foreslås for binding om nødvendig. ForbiddenTransactionAlreadyExported=Ikke tillatt: Transaksjonen er validert og/eller eksportert. ForbiddenTransactionAlreadyValidated=Ikke tillatt: Transaksjonen er validert. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Uoverensstemmelse i avstemmingskode AccountancyErrorMismatchBalanceAmount=Saldoen (%s) er ikke lik 0 AccountancyErrorLetteringBookkeeping=Det har oppstått feil angående transaksjonene: %s ErrorAccountNumberAlreadyExists=Kontonummeret %s eksisterer allerede +ErrorArchiveAddFile=Kan ikke legge "%s"-filen i arkivet ## Import ImportAccountingEntries=Regnskapsposter @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Flervalutakode (Idevise) DateExport=Dato eksport WarningReportNotReliable=Advarsel, denne rapporten er ikke basert på hovedboken, så den inneholder ikke transaksjoner endret manuelt i hovedboken. Hvis journaliseringen din er oppdatert, er bokføringsvisningen mer nøyaktig. ExpenseReportJournal=Utgiftsrapport-journal +DocsAlreadyExportedAreExcluded=Dokumenter som allerede er eksportert, er ekskludert +ClickToHideAlreadyExportedLines=Klikk for å skjule allerede eksporterte linjer NAccounts=%s kontoer diff --git a/htdocs/langs/nb_NO/admin.lang b/htdocs/langs/nb_NO/admin.lang index 629a1110623..cd5f19e37ed 100644 --- a/htdocs/langs/nb_NO/admin.lang +++ b/htdocs/langs/nb_NO/admin.lang @@ -645,6 +645,8 @@ Module2300Name=Planlagte jobber Module2300Desc=Planlagt jobbadministrasjon (alias cron- eller chronotabell) Module2400Name=Hendelser/Agenda Module2400Desc=Spor hendelser. Logg automatisk hendelser for sporingsformål eller registrer manuelle hendelser eller møter. Dette er hovedmodulen for håndtering av gode kunde- eller leverandørforhold. +Module2430Name=Bestilling kalendersystem +Module2430Desc=Gi en online-kalender slik at alle kan bestille treff, i henhold til forhåndsdefinerte områder eller tilgjengeligheter. Module2500Name=DMS / ECM Module2500Desc=Dokumenthåndteringssystem / Elektronisk innholdshåndtering. Automatisk organisering av dine genererte eller lagrede dokumenter. Del dem når du trenger det. Module2600Name=API / webtjenester (SOAP-server) @@ -660,6 +662,8 @@ Module2900Name=GeoIPMaxmind Module2900Desc=GeoIP Maxmind konverteringsegenskaper Module3200Name=Uforanderlige arkiver Module3200Desc=Aktiver en uforanderlig logg over forretningshendelser. Hendelser arkiveres i sanntid. Loggen er en skrivebeskyttet tabell med kjedede hendelser som kan eksporteres. Denne modulen kan være obligatorisk for enkelte land. +Module3300Name=Modulbygger +Module3200Desc=Aktiver en uforanderlig logg over forretningshendelser. Hendelser arkiveres i sanntid. Loggen er en skrivebeskyttet tabell med kjedede hendelser som kan eksporteres. Denne modulen kan være obligatorisk for enkelte land. Module3400Name=Sosiale nettverk Module3400Desc=Aktiver felt for sosiale nettverk i tredjeparter og adresser (skype, twitter, facebook, ...). Module4000Name=HRM @@ -974,14 +978,14 @@ Permission3301=Generer nye moduler Permission4001=Les ferdighet/jobb/stilling Permission4002=Opprett/endre ferdigheter/jobb/stilling Permission4003=Slett ferdighet/jobb/stilling -Permission4021=Read evaluations (yours and your subordinates) -Permission4022=Create/modify evaluations +Permission4021=Les evalueringer (dine og dine underordnede) +Permission4022=Opprette/endre evalueringer Permission4023=Valider evaluering Permission4025=Slett evaluering Permission4028=Se sammenligningsmeny Permission4031=Les personlig informasjon Permission4032=Skriv personlig informasjon -Permission4033=Read all evaluations (even those of user not subordinates) +Permission4033=Les alle evalueringer (selv de av brukere som ikke er underordnede) Permission10001=Les nettstedsinnhold Permission10002=Opprett/endre innhold på nettstedet (html og javascript innhold) Permission10003=Opprett/endre nettstedsinnhold (dynamisk PHP-kode). Farlig, må reserveres for erfarne utviklere. @@ -1270,6 +1274,7 @@ TriggerActiveAsModuleActive=Utløserne i denne filen er slått på ettersom modu GeneratedPasswordDesc=Velg metoden som skal brukes til automatisk genererte passord. DictionaryDesc=Sett alle referansedata. Du kan legge til dine verdier som standard. ConstDesc=Denne siden lar deg redigere (overstyre) parametere som ikke er tilgjengelige på andre sider. Dette er for det meste reserverte parametere for utviklere/avansert feilsøking. +MiscellaneousOptions=Diverse alternativer MiscellaneousDesc=Alle andre sikkerhetsrelaterte parametre er definert her. LimitsSetup=Grenser/presisjon LimitsDesc=Her angir du grenser og presisjon som skal brukes i programmet @@ -1303,7 +1308,7 @@ YouMustRunCommandFromCommandLineAfterLoginToUser=Du må kjøre denne kommandoen YourPHPDoesNotHaveSSLSupport=SSL funksjoner ikke tilgjengelige i din PHP DownloadMoreSkins=Flere skins å laste ned SimpleNumRefModelDesc=Returnerer referansenummeret i formatet %syymm-nnnn der yy er året, mm er måneden og nnnn er et sekvensielt automatisk økende nummer uten nullstilling -SimpleRefNumRefModelDesc=Returns the reference number in the format n where n is a sequential auto-incrementing number with no reset +SimpleRefNumRefModelDesc=Returnerer referansenummeret i formatet n der n er et sekvensielt automatisk økende tall uten tilbakestilling AdvancedNumRefModelDesc=Returnerer referansenummeret i formatet %syymm-nnnn der yy er året, mm er måneden og nnnn er et sekvensielt automatisk økende nummer uten nullstilling SimpleNumRefNoDateModelDesc=Returnerer referansenummeret i formatet %s-nnnn der nnnn er et sekvensielt automatisk økende tall uten tilbakestilling ShowProfIdInAddress=Vis profesjonell ID med adresser @@ -1391,7 +1396,7 @@ GetBarCode=Hent strekkode NumberingModules=Nummereringsmodeller DocumentModules=Dokumentmodeller ##### Module password generation -PasswordGenerationStandard=Return a password generated according to internal Dolibarr algorithm: %s characters containing shared numbers and characters. +PasswordGenerationStandard=Returner et passord generert i henhold til intern Dolibarr-algoritme: %s tegn som inneholder både tall og tegn. PasswordGenerationNone=Ikke foreslå å generere passord. Passord må legges inn manuelt. PasswordGenerationPerso=Returner et passord i følge din personlige konfigurasjon SetupPerso=I følge din konfigurasjon @@ -1445,10 +1450,10 @@ SuppliersPayment=Leverandørbetalinger SupplierPaymentSetup=Oppsett av leverandørbetaling InvoiceCheckPosteriorDate=Sjekk fakturadato før validering InvoiceCheckPosteriorDateHelp=Validering av en faktura vil være forbudt hvis datoen er foran datoen for siste faktura av samme type. -InvoiceOptionCategoryOfOperations=Display the mention "category of operations" on the invoice. -InvoiceOptionCategoryOfOperationsHelp=Depending on the situation, the mention will appear in the form:
    - Category of operations: Delivery of goods
    - Category of operations: Provision of services
    - Category of operations: Mixed - Delivery of goods & provision of services -InvoiceOptionCategoryOfOperationsYes1=Yes, below the address block -InvoiceOptionCategoryOfOperationsYes2=Yes, in the lower left-hand corner +InvoiceOptionCategoryOfOperations=Vis omtale "kategori av operasjoner" på fakturaen. +InvoiceOptionCategoryOfOperationsHelp=Avhengig av situasjonen vil omtalen vises i formen:
    - Driftskategori: Varelevering
    - Driftskategori: Tjenester
    - Driftskategori: Blandet og levering av tjenester +InvoiceOptionCategoryOfOperationsYes1=Ja, under adresseblokken +InvoiceOptionCategoryOfOperationsYes2=Ja, i nedre venstre hjørne ##### Proposals ##### PropalSetup=Oppsett av modulen Tilbud ProposalsNumberingModules=Nummereringsmodul for tilbud @@ -1491,12 +1496,12 @@ WatermarkOnDraftContractCards=Vannmerke på kontraktkladder (ingen hvis tom) ##### Members ##### MembersSetup=Oppsett av medlemsmodul MemberMainOptions=Hovedinnstillinger -MemberCodeChecker=Options for automatic generation of member codes +MemberCodeChecker=Alternativer for automatisk generering av medlemskoder AdherentLoginRequired= Opprett innlogging for hvert medlem AdherentMailRequired=E-post kreves for å lage et nytt medlem MemberSendInformationByMailByDefault=Valg for å sende e-postbekreftelse til medlemmer (validering eller nytt abonnement) er krysset av som standard MemberCreateAnExternalUserForSubscriptionValidated=Opprett en ekstern brukerpålogging for hvert nytt medlemsabonnement som valideres -VisitorCanChooseItsPaymentMode=Visitor can choose from any available payment modes +VisitorCanChooseItsPaymentMode=Besøkende kan velge mellom alle tilgjengelige betalingsmåter MEMBER_REMINDER_EMAIL=Aktiver automatisk påminnelse via e-post av utløpte abonnementer. Merk: Modul %s må være aktivert og riktig oppsatt for å sende påminnelser. MembersDocModules=Dokumentmaler for dokumenter generert fra medlemsregister ##### LDAP setup ##### @@ -1826,6 +1831,9 @@ AGENDA_USE_EVENT_TYPE=Bruk hendelsestyper (administrert i menyoppsett -> Ordbøk AGENDA_USE_EVENT_TYPE_DEFAULT=Angi denne standardverdien automatisk for type hendelse i skjema for hendelsesoppretting AGENDA_DEFAULT_FILTER_TYPE=Still inn denne typen hendelse automatisk i søkefilter i agendavisning AGENDA_DEFAULT_FILTER_STATUS=Angi denne status automatisk for hendelser i søkefilter i agendavisning +AGENDA_EVENT_PAST_COLOR=Farge på tidligere hendelser +AGENDA_EVENT_CURRENT_COLOR=Gjeldende hendelsesfarge +AGENDA_EVENT_FUTURE_COLOR=Farge på fremtiden AGENDA_DEFAULT_VIEW=Hvilken visning vil du åpne som standard når du velger menyen Agenda AGENDA_REMINDER_BROWSER=Aktiver påminnelse om hendelse i brukerens nettleser (Når påminnelsesdato er nådd, vises en popup i nettleseren. Hver bruker kan deaktivere slike varsler i nettleseren). AGENDA_REMINDER_BROWSER_SOUND=Aktiver lydvarsler @@ -2129,6 +2137,7 @@ CodeLastResult=Siste resultatkode NbOfEmailsInInbox=Antall e-poster i kildemappen LoadThirdPartyFromName=Legg inn tredjepartsøk på %s (bare innlasting) LoadThirdPartyFromNameOrCreate=Legg inn tredjepartsøk på %s (opprett hvis ikke funnet) +LoadContactFromEmailOrCreate=Last inn kontaktsøk på %s (opprett hvis ikke funnet) AttachJoinedDocumentsToObject=Lagre vedlagte filer i objektdokumenter hvis en ref for et objekt blir funnet i e-postemne. WithDolTrackingID=Melding fra en samtale initiert av en første e-post sendt fra Dolibarr WithoutDolTrackingID=Melding fra en samtale initiert av en første e-post IKKE sendt fra Dolibarr @@ -2232,12 +2241,12 @@ MailToPartnership=Partnerskap AGENDA_EVENT_DEFAULT_STATUS=Standard hendelsesstatus når du oppretter en hendelse fra skjemaet YouShouldDisablePHPFunctions=Du bør deaktivere PHP-funksjoner IfCLINotRequiredYouShouldDisablePHPFunctions=Bortsett fra hvis du trenger å kjøre systemkommandoer i tilpasset kode, bør du deaktivere PHP-funksjoner -PHPFunctionsRequiredForCLI=For shell purpose (like scheduled job backup or running an antivirus program), you must keep PHP functions +PHPFunctionsRequiredForCLI=For skallformål (som planlagt jobbsikkerhetskopiering eller å kjøre et antivirusprogram), må du beholde PHP-funksjoner NoWritableFilesFoundIntoRootDir=Ingen skrivbare filer eller kataloger for de vanlige programmene ble funnet i rotkatalogen din (Bra) RecommendedValueIs=Anbefalt: %s Recommended=Anbefalt NotRecommended=Ikke anbefalt -ARestrictedPath=Some restricted path for data files +ARestrictedPath=Noen begrenset bane for datafiler CheckForModuleUpdate=Se etter oppdateringer for eksterne moduler CheckForModuleUpdateHelp=Denne handlingen kobles til editorer for eksterne moduler for å sjekke om en ny versjon er tilgjengelig. ModuleUpdateAvailable=En oppdatering er tilgjengelig @@ -2353,5 +2362,7 @@ DesktopsAndSmartphones=Stasjonære datamaskiner og smarttelefoner AllowOnlineSign=Tillat nettsignering AllowExternalDownload=Tillat ekstern nedlasting (uten pålogging, ved hjelp av en delt lenke) DeadlineDayVATSubmission=Frist for innbetaling av MVA neste måned -MaxNumberOfAttachementOnForms=Max number of joinded files in a form -IfDefinedUseAValueBeetween=If defined, use a value between %s and %s +MaxNumberOfAttachementOnForms=Maks antall sammenføyde filer i et skjema +IfDefinedUseAValueBeetween=Hvis definert, bruk en verdi mellom %s og %s +Reload=Last inn på nytt +ConfirmReload=Bekreft modulinnlasting diff --git a/htdocs/langs/nb_NO/agenda.lang b/htdocs/langs/nb_NO/agenda.lang index 50a33ea54ae..be3715279f4 100644 --- a/htdocs/langs/nb_NO/agenda.lang +++ b/htdocs/langs/nb_NO/agenda.lang @@ -68,7 +68,7 @@ ShipmentBackToDraftInDolibarr=Sett levering %s tilbake til utkaststatus ShipmentDeletedInDolibarr=Leveranse %s slettet ShipmentCanceledInDolibarr=Forsendelse %s kansellert ReceptionValidatedInDolibarr=Mottak %s validert -ReceptionDeletedInDolibarr=Reception %s deleted +ReceptionDeletedInDolibarr=Mottak %s slettet ReceptionClassifyClosedInDolibarr=Mottaket %s klassifisert stengt OrderCreatedInDolibarr=Ordre %s opprettet OrderValidatedInDolibarr=Ordre %s validert diff --git a/htdocs/langs/nb_NO/bills.lang b/htdocs/langs/nb_NO/bills.lang index d6f6fc1dfde..174b0f5b1fd 100644 --- a/htdocs/langs/nb_NO/bills.lang +++ b/htdocs/langs/nb_NO/bills.lang @@ -627,7 +627,7 @@ SendEmailsRemindersOnInvoiceDueDate=Send påminnelse på epost for ubetalte fakt MakePaymentAndClassifyPayed=Registrer betaling BulkPaymentNotPossibleForInvoice=Massebetaling er ikke mulig for faktura %s (feil type eller status) MentionVATDebitOptionIsOn=Mulighet for å betale skatt basert på debet -MentionCategoryOfOperations=Category of operations -MentionCategoryOfOperations0=Delivery of goods -MentionCategoryOfOperations1=Provision of services -MentionCategoryOfOperations2=Mixed - Delivery of goods & provision of services +MentionCategoryOfOperations=Kategori av operasjoner +MentionCategoryOfOperations0=Varelevering +MentionCategoryOfOperations1=Levering av tjenester +MentionCategoryOfOperations2=Blandet - Levering av varer og levering av tjenester diff --git a/htdocs/langs/nb_NO/boxes.lang b/htdocs/langs/nb_NO/boxes.lang index 43a1dccd065..bc746e7a8be 100644 --- a/htdocs/langs/nb_NO/boxes.lang +++ b/htdocs/langs/nb_NO/boxes.lang @@ -24,6 +24,7 @@ BoxFicheInter=Siste intervensjoner BoxCurrentAccounts=Åpne kontobalanse BoxTitleMemberNextBirthdays=Fødselsdager denne måneden (medlemmer) BoxTitleMembersByType=Medlemmer etter type og status +BoxTitleMembersByTags=Medlemmer etter merker og status BoxTitleMembersSubscriptionsByYear=Medlemsabonnement etter år BoxTitleLastRssInfos=Siste %s nyheter fra %s BoxTitleLastProducts=Varer/Tjenester: siste %s endret @@ -44,10 +45,10 @@ BoxTitleSupplierOrdersAwaitingReception=Leverandørordre avventer mottak BoxTitleLastModifiedContacts=Kontakter/Adresser: Siste %s endret BoxMyLastBookmarks=Bokmerker: siste %s BoxOldestExpiredServices=Eldste aktive utløpte tjenester -BoxOldestActions=Oldest events to do +BoxOldestActions=Eldste arrangementer å utføre BoxLastExpiredServices=Siste %s eldste kontakter med aktive, utgåtte tjenseter BoxTitleLastActionsToDo=Siste %s handlinger å utføre -BoxTitleOldestActionsToDo=Oldest %s events to do, not completed +BoxTitleOldestActionsToDo=Eldste %s hendelser å utføre, ikke fullført BoxTitleLastContracts=Siste %s kontrakter som ble endret BoxTitleLastModifiedDonations=Siste %s donasjoner som ble endret BoxTitleLastModifiedExpenses=Siste %s utgiftsrapporter som ble endret diff --git a/htdocs/langs/nb_NO/companies.lang b/htdocs/langs/nb_NO/companies.lang index 6e92a231b3f..52a29d445af 100644 --- a/htdocs/langs/nb_NO/companies.lang +++ b/htdocs/langs/nb_NO/companies.lang @@ -47,33 +47,33 @@ Subsidiaries=Datterselskaper ReportByMonth=Rapport per måned ReportByCustomers=Rapport per kunde ReportByThirdparties=Rapporter per tredjepart -ReportByQuarter=Report per rate +ReportByQuarter=Rapport per takst CivilityCode=Civility code (ikke i Norge) RegisteredOffice=Registered office (ikke i Norge) Lastname=Etternavn Firstname=Fornavn RefEmployee=Ansatt referanse -NationalRegistrationNumber=National registration number +NationalRegistrationNumber=Nasjonalt registreringsnummer PostOrFunction=Stilling UserTitle=Tittel NatureOfThirdParty=Tredjeparts art NatureOfContact=Kontaktens art Address=Adresse State=Fylke(delstat) -StateId=State ID +StateId=Stats-ID StateCode=Stat-/provinskode StateShort=Stat Region=Region Region-State=Region - Stat Country=Land CountryCode=Landskode -CountryId=Country ID +CountryId=Land-ID Phone=Telefon PhoneShort=Telefon Skype=Skype Call=Ring Chat=Chat -PhonePro=Bus. phone +PhonePro=Firmatelefon PhonePerso=Tlf. privat PhoneMobile=Tlf. mobil No_Email=Avvis masse-e-post @@ -162,16 +162,16 @@ ProfId3CL=- ProfId4CL=- ProfId5CL=- ProfId6CL=- -ProfId1CM=Id. prof. 1 (Trade Register) -ProfId2CM=Id. prof. 2 (Taxpayer No.) -ProfId3CM=Id. prof. 3 (No. of creation decree) -ProfId4CM=Id. prof. 4 (Deposit certificate No.) -ProfId5CM=Id. prof. 5 (Others) +ProfId1CM=ID. prof. 1 (handelsregister) +ProfId2CM=ID. prof. 2 (skattyter nr.) +ProfId3CM=ID. prof. 3 (Nr. opprettelsesdekret) +ProfId4CM=ID. prof. 4 (Innskuddsbevis nr.) +ProfId5CM=ID. prof. 5 (Annet) ProfId6CM=- ProfId1ShortCM=Handelsregister -ProfId2ShortCM=Taxpayer No. -ProfId3ShortCM=No. of creation decree -ProfId4ShortCM=Deposit certificate No. +ProfId2ShortCM=Skattebetaler nr. +ProfId3ShortCM=Ant. opprettelsesdekret +ProfId4ShortCM=Innskuddsbevis nr. ProfId5ShortCM=Andre ProfId6ShortCM=- ProfId1CO=Prof ID 1 (RUT) @@ -291,7 +291,7 @@ ProfId6RU=- ProfId1UA=Prof Id 1 (EDRPOU) ProfId2UA=Prof Id 2 (DRFO) ProfId3UA=Prof Id 3 (INN) -ProfId4UA=Prof Id 4 (Certificate) +ProfId4UA=Prof Id 4 (sertifikat) ProfId5UA=Prof Id 5 (RNOKPP) ProfId6UA=Prof Id 6 (TRDPAU) ProfId1DZ=RC @@ -312,12 +312,12 @@ CustomerRelativeDiscountShort=Relativ rabatt CustomerAbsoluteDiscountShort=Absolutt rabatt CompanyHasRelativeDiscount=Denne kunden har en rabatt på %s%% CompanyHasNoRelativeDiscount=Denne kunden har ingen relative rabatter angitt -HasRelativeDiscountFromSupplier=Du har en standardrabatt på %s%% fra denne leverandøren -HasNoRelativeDiscountFromSupplier=Du har ingen standard relativ rabatt fra denne leverandøren +HasRelativeDiscountFromSupplier=Du har en standardrabatt på %s%% hos denne leverandøren +HasNoRelativeDiscountFromSupplier=Ingen standard relativ rabatt hos denne leverandøren CompanyHasAbsoluteDiscount=Denne kunden har rabatter tilgjengelig (kreditnotaer eller nedbetalinger) for %s %s CompanyHasDownPaymentOrCommercialDiscount=Denne kunden har rabatt tilgjengelig (tilbud, nedbetalinger) for %s%s CompanyHasCreditNote=Denne kunden har fortsatt kreditnotaer for %s %s -HasNoAbsoluteDiscountFromSupplier=Du har ingen rabatt tilgjengelig fra denne leverandøren +HasNoAbsoluteDiscountFromSupplier=Ingen rabatt/kreditt tilgjengelig fra denne leverandøren HasAbsoluteDiscountFromSupplier=Du har rabatter tilgjengelig (kreditnotaer eller nedbetalinger) for %s %s fra denne leverandøren HasDownPaymentOrCommercialDiscountFromSupplier=Du har rabatter tilgjengelig (kommersielle, nedbetalinger) for %s %s fra denne leverandøren HasCreditNoteFromSupplier=Du har kreditnotater for %s %s fra denne leverandøren @@ -444,7 +444,7 @@ AddAddress=Legg til adresse SupplierCategory=Leverandør kategori JuridicalStatus200=Uavhengig DeleteFile=Slett fil -ConfirmDeleteFile=Er du sikker på at du vil slette denne filen? +ConfirmDeleteFile=Er du sikker på at du vil slette denne filen %s ? AllocateCommercial=Tildelt salgsrepresentant Organization=Organisasjon FiscalYearInformation=Regnskapsår @@ -498,3 +498,8 @@ RestOfEurope=Resten av Europa (EU) OutOfEurope=Ut av Europa (EU) CurrentOutstandingBillLate=Nåværende utestående regning sen BecarefullChangeThirdpartyBeforeAddProductToInvoice=Vær forsiktig, avhengig av varepris-innstillingene dine, bør du endre tredjepart før du legger produktet til POS. +EmailAlreadyExistsPleaseRewriteYourCompanyName=epost eksisterer allerede, skriv om firmanavnet ditt +TwoRecordsOfCompanyName=Det finnes mer enn én post for dette selskapet, vennligst kontakt oss for å fullføre partnerskapsforespørselen din +CompanySection=Selskapsseksjon +ShowSocialNetworks=Vis sosiale nettverk +HideSocialNetworks=Skjul sosiale nettverk diff --git a/htdocs/langs/nb_NO/compta.lang b/htdocs/langs/nb_NO/compta.lang index a1bcfe315fe..a3bb0f6e765 100644 --- a/htdocs/langs/nb_NO/compta.lang +++ b/htdocs/langs/nb_NO/compta.lang @@ -246,12 +246,12 @@ TurnoverPerProductInCommitmentAccountingNotRelevant=Rapporten om omsetning samle TurnoverPerSaleTaxRateInCommitmentAccountingNotRelevant=Rapporten om omsetning samlet per MVA-sats er ikke tilgjengelig. Denne rapporten er kun tilgjengelig for omsetning fakturert. CalculationMode=Kalkuleringsmodus AccountancyJournal=Regnskapskode journal -ACCOUNTING_VAT_SOLD_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for VAT on sales (used if not defined on VAT dictionary setup) -ACCOUNTING_VAT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for VAT on purchases (used if not defined on VAT dictionary setup) -ACCOUNTING_VAT_PAY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for paying VAT -ACCOUNTING_ACCOUNT_CUSTOMER=Account (from the Chart Of Account) used for "customer" third parties +ACCOUNTING_VAT_SOLD_ACCOUNT=Konto (fra kontoplanen) som skal brukes som standardkonto for MVA på salg (brukes hvis det ikke er definert i MVA-ordbokoppsettet) +ACCOUNTING_VAT_BUY_ACCOUNT=Konto (fra kontoplanen) som skal brukes som standardkonto for MVA på kjøp (brukes hvis det ikke er definert i MVA-ordbokoppsettet) +ACCOUNTING_VAT_PAY_ACCOUNT=Konto (fra kontoplanen) som skal brukes som standardkonto for betaling av MVA +ACCOUNTING_ACCOUNT_CUSTOMER=Konto (fra kontoplanen) brukt for "kunde" tredjeparter ACCOUNTING_ACCOUNT_CUSTOMER_Desc=Den dedikerte regnskapskontoen som er definert på tredjepartskort, vil kun bli brukt til subledger. Denne vil bli brukt til hovedboken og som standardverdi av Subledger-regnskap hvis dedikert kundekonto på tredjepart ikke er definert. -ACCOUNTING_ACCOUNT_SUPPLIER=Account (from the Chart of Account) used for the "vendor" third parties +ACCOUNTING_ACCOUNT_SUPPLIER=Konto (fra kontoplanen) brukt for "leverandørens" tredjeparter ACCOUNTING_ACCOUNT_SUPPLIER_Desc=Den dedikerte regnskapskonto som er definert på tredjepartskort, vil kun bli brukt til subledger. Denne vil bli brukt til hovedboken og som standardverdi for Subledger-regnskap hvis dedikert leverandørkonto på tredjepart ikke er definert. ConfirmCloneTax=Bekreft kloning av skatt/avgiftsbetaling ConfirmCloneVAT=Bekreft kloning av MVA-deklarasjon diff --git a/htdocs/langs/nb_NO/errors.lang b/htdocs/langs/nb_NO/errors.lang index 660ade0e83c..42d4270db4a 100644 --- a/htdocs/langs/nb_NO/errors.lang +++ b/htdocs/langs/nb_NO/errors.lang @@ -303,6 +303,7 @@ ErrorValueForTooLow=Verdien for %s er for lav ErrorValueCantBeNull=Verdien for %s kan ikke være null ErrorDateOfMovementLowerThanDateOfFileTransmission=Datoen for banktransaksjonen kan ikke være lavere enn datoen for filoverføringen ErrorTooMuchFileInForm=For mange filer i skjemaet, maksimalt antall er %s fil(er) +ErrorSessionInvalidatedAfterPasswordChange=Økten ble ugyldig etter endring av passord, status eller gyldighetsdato. Logg på på nytt. # Warnings WarningParamUploadMaxFileSizeHigherThanPostMaxSize=PHP-parameteren upload_max_filesize (%s) er høyere enn PHP-parameteren post_max_size (%s). Dette er ikke et konsistent oppsett. @@ -325,6 +326,7 @@ WarningPaymentDateLowerThanInvoiceDate=Betalingsdato (%s) er tidligere enn faktu WarningTooManyDataPleaseUseMoreFilters=For mange data (mer enn %s linjer). Bruk flere filtre eller sett konstanten %s til en høyere grense. WarningSomeLinesWithNullHourlyRate=Noen tider ble registrert av noen brukere mens deres timepris ikke var definert. En verdi på 0 %s pr. time ble brukt, men dette kan føre til feil verdivurdering av tidsbruk. WarningYourLoginWasModifiedPleaseLogin=Din innlogging er blitt endret. Av sikkerhetsgrunner må du logge inn på nytt før du kan gjøre noe. +WarningYourPasswordWasModifiedPleaseLogin=Passordet ditt ble endret. Av sikkerhetshensyn må du logge på nå med ditt nye passord. WarningAnEntryAlreadyExistForTransKey=En oppføring eksisterer allerede for oversettelsesnøkkel for dette språket WarningNumberOfRecipientIsRestrictedInMassAction=Advarsel, antall forskjellige mottakere er begrenset til %s ved bruk av massehandlinger på lister WarningDateOfLineMustBeInExpenseReportRange=Advarsel, datoen for linjen ligger utenfor tiden til utgiftsrapporten diff --git a/htdocs/langs/nb_NO/eventorganization.lang b/htdocs/langs/nb_NO/eventorganization.lang index e7a0c21eca0..c0eb25d529c 100644 --- a/htdocs/langs/nb_NO/eventorganization.lang +++ b/htdocs/langs/nb_NO/eventorganization.lang @@ -54,7 +54,7 @@ EVENTORGANIZATION_FILTERATTENDEES_TYPE = I skjemaet for å opprette/legge til en # Object # EventOrganizationConfOrBooth= Konferanse eller messe -EventOrganizationConfOrBoothes=Conferences or Boothes +EventOrganizationConfOrBoothes=Konferanser eller stander ManageOrganizeEvent = Administrer organiseringen av et arrangement ConferenceOrBooth = Konferanse eller messe ConferenceOrBoothTab = Konferanse eller messe @@ -115,8 +115,8 @@ EvntOrgRegistrationHelpMessage = Her kan du stemme på en konferanse eller fores EvntOrgRegistrationConfHelpMessage = Her kan du foreslå en ny konferanse under arrangementet. EvntOrgRegistrationBoothHelpMessage = Her kan du søke om å få stand under arrangementet. ListOfSuggestedConferences = Liste over foreslåtte konferanser -ListOfSuggestedBooths=Suggested booths -ListOfConferencesOrBooths=Conferences or booths of event project +ListOfSuggestedBooths=Foreslåtte boder +ListOfConferencesOrBooths=Konferanser eller stander av arrangementsprosjektet SuggestConference = Foreslå en ny konferanse SuggestBooth = Foreslå en stand ViewAndVote = Se og stem på foreslåtte arrangementer @@ -172,3 +172,5 @@ ErrorSeveralCompaniesWithEmailContactUs=Flere selskaper med denne epostadressen ErrorSeveralCompaniesWithNameContactUs=Flere selskaper med dette navnet er funnet, så vi kan ikke automatisk validere registreringen din. Vennligst kontakt oss på %s for en manuell validering NoPublicActionsAllowedForThisEvent=Ingen offentlige handlinger er åpne for offentligheten for dette arrangementet MaxNbOfAttendees=Maks antall deltakere +DateStartEvent=Startdato for arrangementet +DateEndEvent=Sluttdato for arrangementet diff --git a/htdocs/langs/nb_NO/holiday.lang b/htdocs/langs/nb_NO/holiday.lang index b4ac01e4d7f..aef204eb218 100644 --- a/htdocs/langs/nb_NO/holiday.lang +++ b/htdocs/langs/nb_NO/holiday.lang @@ -143,16 +143,16 @@ TemplatePDFHolidays=PDF-mal for permisjonsforespørsler FreeLegalTextOnHolidays=Fritekst på PDF WatermarkOnDraftHolidayCards=Vannmerke på permisjonsutkast  HolidaysToApprove=Ferier til godkjenning -NobodyHasPermissionToValidateHolidays=Ingen har tillatelse til å validere ferier -HolidayBalanceMonthlyUpdate=Månedlig oppdatering av feriesaldo +NobodyHasPermissionToValidateHolidays=Ingen har tillatelse til å validere permisjonsforespørsler +HolidayBalanceMonthlyUpdate=Månedlig oppdatering av permisjonsaldo XIsAUsualNonWorkingDay=%s er vanligvis en IKKE-arbeidsdag BlockHolidayIfNegative=Blokker hvis saldoen er negativ LeaveRequestCreationBlockedBecauseBalanceIsNegative=Opprettelsen av denne permisjonsforespørselen er blokkert fordi saldoen din er negativ ErrorLeaveRequestMustBeDraftCanceledOrRefusedToBeDeleted=Permisjonsforespørsel %s må være utkast, kansellert eller nektet å bli slettet -IncreaseHolidays=Øk ferie -HolidayRecordsIncreased= %s feriereposter økt -HolidayRecordIncreased=Ferierekorden øket -ConfirmMassIncreaseHoliday=Masse ferieøkning +IncreaseHolidays=Øk permisjonsbalansen +HolidayRecordsIncreased= %s permisjonsaldoer økte +HolidayRecordIncreased=Permisjonsbalansen økt +ConfirmMassIncreaseHoliday=Masseøkning av permisjonsbalanse NumberDayAddMass=Antall dager å legge til utvalget ConfirmMassIncreaseHolidayQuestion=Er du sikker på at du vil øke ferien for den(e) %s valgte posten(e)? HolidayQtyNotModified=Saldo av gjenværende dager for %s er ikke endret diff --git a/htdocs/langs/nb_NO/hrm.lang b/htdocs/langs/nb_NO/hrm.lang index 2d214e6d142..5e045842afb 100644 --- a/htdocs/langs/nb_NO/hrm.lang +++ b/htdocs/langs/nb_NO/hrm.lang @@ -12,7 +12,7 @@ OpenEtablishment=Åpne firma CloseEtablishment=Lukk firma # Dictionary DictionaryPublicHolidays=Permisjon - helligdager -DictionaryDepartment=HRM - Organizational Unit +DictionaryDepartment=HRM - Organisasjonsenhet DictionaryFunction=HRM - Jobbstillinger # Module Employees=Ansatte @@ -26,8 +26,8 @@ HRM_DEFAULT_SKILL_DESCRIPTION=Standard beskrivelse av rangeringer når ferdighet deplacement=Skift DateEval=Evalueringsdato JobCard=Jobbkort -JobPosition=Jobb -JobsPosition=Jobber +JobPosition=Jobbprofil +JobsPosition=Jobbprofiler NewSkill=Ny ferdighet SkillType=Ferdighetstype Skilldets=Liste over rangeringer for denne ferdigheten @@ -55,14 +55,14 @@ group1ToCompare=Brukergruppe å analysere group2ToCompare=Andre brukergruppe for sammenligning OrJobToCompare=Sammenlign med krav til jobbkompetanse difference=Forskjell -CompetenceAcquiredByOneOrMore=Competence acquired by one or more users but not requested by the second comparator +CompetenceAcquiredByOneOrMore=Kompetanse ervervet av en eller flere brukere, men ikke etterspurt av den andre komparatoren MaxlevelGreaterThan=Maksnivå høyere enn det forespurte MaxLevelEqualTo=Maks nivå er lik kravet MaxLevelLowerThan=Maksnivå lavere enn dette kravet -MaxlevelGreaterThanShort=Employee level greater than the one requested -MaxLevelEqualToShort=Employee level equals to that demand -MaxLevelLowerThanShort=Employee level lower than that demand -SkillNotAcquired=Skill not acquired by all users and requested by the second comparator +MaxlevelGreaterThanShort=Ansattnivå høyere enn det forespurte +MaxLevelEqualToShort=Ansattnivå tilsvarer denne etterspørselen +MaxLevelLowerThanShort=Ansattnivå lavere enn etterspørselen +SkillNotAcquired=Ferdigheter ikke ervervet av alle brukere og etterspurt av den andre komparatoren legend=Historikk TypeSkill=Ferdighetstype AddSkill=Legg ferdigheter til jobben @@ -71,21 +71,22 @@ UserRank=Brukerrangering SkillList=Ferdighetsliste SaveRank=Lagre rangering TypeKnowHow=Know how -TypeHowToBe=How to be +TypeHowToBe=Hvordan være TypeKnowledge=Kunnskap -AbandonmentComment=Abandonment comment -DateLastEval=Date last evaluation +AbandonmentComment=Forlatelseskommentar +DateLastEval=Dato for siste evaluering NoEval=Ingen evaluering gjort for denne ansatte -HowManyUserWithThisMaxNote=Number of users with this rank +HowManyUserWithThisMaxNote=Antall brukere med denne rangeringen HighestRank=Høyeste rangering -SkillComparison=Skill comparison -ActionsOnJob=Events on this job -VacantPosition=job vacancy -VacantCheckboxHelper=Checking this option will show unfilled positions (job vacancy) -SaveAddSkill = Skill(s) added -SaveLevelSkill = Skill(s) level saved -DeleteSkill = Skill removed -SkillsExtraFields=Attributs supplémentaires (Compétences) -JobsExtraFields=Attributs supplémentaires (Emplois) -EvaluationsExtraFields=Attributs supplémentaires (Evaluations) -NeedBusinessTravels=Need business travels +SkillComparison=Sammenligning av ferdigheter +ActionsOnJob=Hendelser på denne jobben +VacantPosition=ledig stilling +VacantCheckboxHelper=Hvis du merker av for dette alternativet, vises ubesatte stillinger (ledig stilling) +SaveAddSkill = Ferdighet(er) lagt til +SaveLevelSkill = Ferdighetsnivået er lagret +DeleteSkill = Ferdighet fjernet +SkillsExtraFields=Tilleggsattributter (kompetanser) +JobsExtraFields=Tilleggsattributter (Jobbprofil) +EvaluationsExtraFields=Tilleggsattributter (evalueringer) +NeedBusinessTravels=Trenger forretningsreiser +NoDescription=ingen beskrivelse diff --git a/htdocs/langs/nb_NO/interventions.lang b/htdocs/langs/nb_NO/interventions.lang index 55b66b4de9f..0f53c6533d8 100644 --- a/htdocs/langs/nb_NO/interventions.lang +++ b/htdocs/langs/nb_NO/interventions.lang @@ -69,4 +69,4 @@ GenerateInter=Generer intervensjon FichinterNoContractLinked=Intervensjon %s er opprettet uten en tilknyttet kontrakt. ErrorFicheinterCompanyDoesNotExist=Selskapet eksisterer ikke. Intervensjon er ikke opprettet. NextDateToIntervention=Dato for neste generering av intervensjoner -NoIntervention=No intervention +NoIntervention=Ingen intervensjon diff --git a/htdocs/langs/nb_NO/loan.lang b/htdocs/langs/nb_NO/loan.lang index e189b92952a..a64c0427cb0 100644 --- a/htdocs/langs/nb_NO/loan.lang +++ b/htdocs/langs/nb_NO/loan.lang @@ -28,7 +28,7 @@ CantUseScheduleWithLoanStartedToPaid = Kan ikke generere en tidslinje for et lå CantModifyInterestIfScheduleIsUsed = Du kan ikke endre rente hvis du bruker tidsplan # Admin ConfigLoan=Oppset av lån-modulen -LOAN_ACCOUNTING_ACCOUNT_CAPITAL=Account (from the Chart Of Account) to be used by default for capital (Loan module) -LOAN_ACCOUNTING_ACCOUNT_INTEREST=Account (from the Chart Of Account) to be used by default for interest (Loan module) -LOAN_ACCOUNTING_ACCOUNT_INSURANCE=Account (from the Chart Of Account) to be used by default for insurance (Loan module) +LOAN_ACCOUNTING_ACCOUNT_CAPITAL=Konto (fra kontoplanen) som skal brukes som standard for kapital (Lånmodul) +LOAN_ACCOUNTING_ACCOUNT_INTEREST=Konto (fra kontoplanen) som skal brukes som standard for renter (Lånmodul) +LOAN_ACCOUNTING_ACCOUNT_INSURANCE=Konto (fra kontoplanen) brukes som standard for forsikring (Lånmodul) CreateCalcSchedule=Rediger økonomisk forpliktelse diff --git a/htdocs/langs/nb_NO/main.lang b/htdocs/langs/nb_NO/main.lang index 587be153543..e6b80ec284c 100644 --- a/htdocs/langs/nb_NO/main.lang +++ b/htdocs/langs/nb_NO/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=Ingen brukergrupper er definert Password=Passord PasswordRetype=Gjenta passordet ditt NoteSomeFeaturesAreDisabled=Mange av egenskapene/modulene er deaktivert i denne demonstrasjonen. +YourUserFile=Din brukerfil Name=Navn NameSlashCompany=Navn/Firma Person=Person @@ -897,6 +898,9 @@ MassFilesArea= Filområde bygget av massehandlinger ShowTempMassFilesArea=Vis filområde bygget av massehandlinger ConfirmMassDeletion=Bekreft massesletting ConfirmMassDeletionQuestion=Er du sikker på at du vil slette de %s valgte postene? +ConfirmMassClone=Bekreftelse av bulk-kloning +ConfirmMassCloneQuestion=Velg prosjektet du vil klone til +ConfirmMassCloneToOneProject=Klon til prosjekt %s RelatedObjects=Relaterte objekter ClassifyBilled=Klassifisert fakturert ClassifyUnbilled=Klassifiser ufakturert @@ -912,8 +916,8 @@ ExportFilteredList=Eksporter filtrert liste ExportList=Eksportliste ExportOptions=Eksportinnstillinger IncludeDocsAlreadyExported=Inkluder dokumenter som allerede er eksportert -ExportOfPiecesAlreadyExportedIsEnable=Eksport av deler som allerede er eksportert, er aktivert -ExportOfPiecesAlreadyExportedIsDisable=Eksport av deler som allerede er eksportert, er deaktivert +ExportOfPiecesAlreadyExportedIsEnable=Dokumenter som allerede er eksportert er synlige og vil bli eksportert +ExportOfPiecesAlreadyExportedIsDisable=Dokumenter som allerede er eksportert er skjult og vil ikke bli eksportert AllExportedMovementsWereRecordedAsExported=Alle eksporterte bevegelser ble registrert som eksportert NotAllExportedMovementsCouldBeRecordedAsExported=Ikke alle eksporterte bevegelser kunne registreres som eksportert Miscellaneous=Diverse @@ -1128,6 +1132,7 @@ DeleteFileText=Vil du slette denne filen? ShowOtherLanguages=Vis andre språk SwitchInEditModeToAddTranslation=Bytt i redigeringsmodus for å legge til oversettelser for dette språket NotUsedForThisCustomer=Ikke brukt for denne kunden +NotUsedForThisVendor=Ikke brukt for denne leverandøren AmountMustBePositive=Beløpet må være positivt ByStatus=Etter status InformationMessage=Informasjon @@ -1148,18 +1153,18 @@ EventReminder=Påminnelse om hendelse UpdateForAllLines=Oppdatering for alle linjer OnHold=Venter Civility=Tiltale -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Sett supervisor +AffectTag=Tilordne et merke +AffectUser=Tilordne en bruker +SetSupervisor=Velg supervisor CreateExternalUser=Opprett ekstern bruker -ConfirmAffectTag=Bulk Tag Assignement -ConfirmAffectUser=Bulk User Assignement -ProjectRole=Rolle tildelt på hvert prosjekt -TasksRole=Rolle tildelt hver oppgave i hvert prosjekt +ConfirmAffectTag=Masse Merke-tilordning +ConfirmAffectUser=Masse brukertilordning +ProjectRole=Rolle tildelt på hvert prosjekt/mulighet +TasksRole=Rolle tildelt hver oppgave (hvis brukt) ConfirmSetSupervisor=Sett Bulk Supervisor ConfirmUpdatePrice=Velg en øknings-/reduksjonssats -ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? -ConfirmAffectUserQuestion=Are you sure you want to assign users to the %s selected record(s)? +ConfirmAffectTagQuestion=Er du sikker på at du vil tilordne merker til %s valgte post(er)? +ConfirmAffectUserQuestion=Er du sikker på at du vil tilordne brukere til %s valgte post(er)? ConfirmSetSupervisorQuestion=Er du sikker på at du vil sette supervisor til %s valgte post(er)? ConfirmUpdatePriceQuestion=Er du sikker på at du vil oppdatere prisen på %s valgte post(er)? CategTypeNotFound=Ingen merketype funnet for denne post-typen @@ -1170,7 +1175,7 @@ InformationOnLinkToContract=Dette beløpet er bare summen av alle linjene i kont ConfirmCancel=Er du sikker på at du vil avbryte EmailMsgID=E-post MsgID EmailDate=E-post dato -SetToStatus=Set to status %s +SetToStatus=Sett til status %s SetToEnabled=Sett til aktivert SetToDisabled=Sett til deaktivert ConfirmMassEnabling=bekreftelse av masseaktivering @@ -1199,8 +1204,8 @@ Terminated=Terminert AddLineOnPosition=Legg til linje på posisjon (på slutten hvis tom) ConfirmAllocateCommercial=Tildel salgsrepresentant bekreftelse ConfirmAllocateCommercialQuestion=Er du sikker på at du vil tilordne %s valgte post(er)? -CommercialsAffected=Sales representatives assigned -CommercialAffected=Sales representative assigned +CommercialsAffected=Tildelt salgsrepresentanter +CommercialAffected=Tildelt salgsrepresentant YourMessage=Din beskjed YourMessageHasBeenReceived=Meldingen din er mottatt. Vi vil svare eller kontakte deg så snart som mulig. UrlToCheck=URL for å sjekke @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Laget fra offentlig portal UserAgent=Brukeragent InternalUser=Intern bruker ExternalUser=Ekstern bruker +NoSpecificContactAddress=Ingen spesifikk kontakt eller adresse +NoSpecificContactAddressBis=Denne kategorien er dedikert til å tvinge frem spesifikke kontakter eller adresser for gjeldende objekt. Bruk den bare hvis du ønsker å definere en eller flere spesifikke kontakter eller adresser for objektet når informasjonen om tredjeparten ikke er nok eller ikke nøyaktig. +HideOnVCard=Skjul %s +AddToContacts=Legg til adresse i kontaktene mine +LastAccess=Siste tilgang +UploadAnImageToSeeAPhotoHere=Last opp et bilde fra fanen %s for å se et bilde her +LastPasswordChangeDate=Dato for siste endring av passord diff --git a/htdocs/langs/nb_NO/members.lang b/htdocs/langs/nb_NO/members.lang index 92a0d669a39..07da6648c7b 100644 --- a/htdocs/langs/nb_NO/members.lang +++ b/htdocs/langs/nb_NO/members.lang @@ -74,12 +74,12 @@ MemberTypeCanNotBeDeleted=Medlemstype kan ikke slettes NewSubscription=Nytt bidrag NewSubscriptionDesc=Med dette skjemaet kan du ta opp abonnement som nytt medlem av organisasjonen. Hvis du ønsker å fornye abonnementet (hvis du allerede er medlem), vennligst kontakt organisasjonsstyret i stedet ved e-post %s. Subscription=Bidrag -AnyAmountWithAdvisedAmount=Any amount of your choice, recommended %s -AnyAmountWithoutAdvisedAmount=Any amount of your choice +AnyAmountWithAdvisedAmount=Enhver mengde du ønsker, anbefalt %s +AnyAmountWithoutAdvisedAmount=Valgfritt beløp CanEditAmountShort=Hvilket som helst beløp CanEditAmountShortForValues=anbefales, uansett beløp MembershipDuration=Varighet -GetMembershipButtonLabel=Join +GetMembershipButtonLabel=Bli med Subscriptions=Bidrag SubscriptionLate=Forsinket SubscriptionNotReceived=Bidrag aldri mottatt @@ -207,10 +207,10 @@ NbOfSubscriptions=Antall bidrag AmountOfSubscriptions=Beløp samlet inn fra bidrag TurnoverOrBudget=Omsetning (for et selskap) eller Budsjett (for en organisasjon) DefaultAmount=Standard bidragsbeløp -CanEditAmount=Subscription amount is free +CanEditAmount=Abonnementsbeløpet er gratis CanEditAmountDetail=Besøkende kan velge/redigere beløpet for sitt bidrag uavhengig av medlemstype AmountIsLowerToMinimumNotice=Totalt forfall på %s -MEMBER_NEWFORM_PAYONLINE=After the online registration, switch automatically on the online payment page +MEMBER_NEWFORM_PAYONLINE=Etter den elektroniske registreringen bytter du automatisk til betalingssiden på nett ByProperties=Etter egenskap MembersStatisticsByProperties=Medlemsstatistikk etter egenskap VATToUseForSubscriptions=MVA-sats til bruk for bidrag @@ -231,4 +231,4 @@ CreateDolibarrLoginDesc=Opprettelsen av en brukerpålogging for medlemmer lar de CreateDolibarrThirdPartyDesc=En tredjepart er den juridiske enheten som vil bli brukt på fakturaen hvis du bestemmer deg for å generere faktura for hvert bidrag. Du vil kunne opprette den senere under prosessen med å registrere bidraget. MemberFirstname=Medlemmets fornavn MemberLastname=Medlemmets etternavn -MemberCodeDesc=Member Code, unique for all members +MemberCodeDesc=Medlemskode, unik for alle medlemmer diff --git a/htdocs/langs/nb_NO/mrp.lang b/htdocs/langs/nb_NO/mrp.lang index c3948610887..2bf5efc0b96 100644 --- a/htdocs/langs/nb_NO/mrp.lang +++ b/htdocs/langs/nb_NO/mrp.lang @@ -11,7 +11,7 @@ Bom=Materialkostnader (BOM) BillOfMaterials=Materialkostnader (BOM) BillOfMaterialsLines=Stykkliste-linjer BOMsSetup=Oppsett av BOM-modulen  -ListOfBOMs=Bills of material - BOM +ListOfBOMs=Stykklister - BOM ListOfManufacturingOrders=Produksjonsordrer NewBOM=Ny BOM ProductBOMHelp=Vare å produsere (eller demontere) med denne stykklisten.
    Merk: Produkter med egenskapen 'Varensart' = 'Råvarer' er ikke synlige i denne listen. @@ -27,7 +27,7 @@ ConfirmCloneBillOfMaterials=Er du sikker på at du vil klone BOM%s? ConfirmCloneMo=Er du sikker på at du vil klone produksjonsordren %s? ManufacturingEfficiency=Produksjonseffektivitet ConsumptionEfficiency=Forbrukseffektivitet -Consumption=Consumption +Consumption=Forbruk ValueOfMeansLoss=Verdi på 0,95 betyr et gjennomsnitt på 5%% tap under produksjonen eller demonteringen ValueOfMeansLossForProductProduced=Verdi på 0,95 betyr et gjennomsnitt på 5%% tap av produsert produkt DeleteBillOfMaterials=Slett BOM @@ -102,6 +102,7 @@ NbOperatorsRequired=Antall operatører som kreves THMOperatorEstimated=Anslått operatør THM THMMachineEstimated=Anslått maskin THM WorkstationType=Arbeidsstasjonstype +DefaultWorkstation=Standard arbeidsstasjon Human=Menneskelig Machine=Maskin HumanMachine=Menneske/maskin @@ -116,5 +117,5 @@ ParentMo=Overordnet MO MOChild=Underordnet MO BomCantAddChildBom=Nomenklaturen %s er allerede til stede i treet som fører til nomenklaturen %s BOMNetNeeds = BOM Netto behov -BOMProductsList=BOM's products -BOMServicesList=BOM's services +BOMProductsList=BOM's varer +BOMServicesList=BOM's tjenester diff --git a/htdocs/langs/nb_NO/orders.lang b/htdocs/langs/nb_NO/orders.lang index 1d15cb60c15..55fbf0afff6 100644 --- a/htdocs/langs/nb_NO/orders.lang +++ b/htdocs/langs/nb_NO/orders.lang @@ -96,6 +96,10 @@ OrdersStatisticsSuppliers=Innkjøpsordrestatistikk NumberOfOrdersByMonth=Antall ordre pr måned AmountOfOrdersByMonthHT=Beløp på ordrer etter måned (ekskl. MVA) ListOfOrders=Ordreliste +ListOrderLigne=Ordrelinjer +productobuy=Varer kun for kjøp +productonly=Kun varer +disablelinefree=Ingen linjer ledig CloseOrder=Lukk ordre ConfirmCloseOrder=Er du sikker på at du vil sette denne ordren som levert? Når en ordre er levert, kan den settes til "betalt" ConfirmDeleteOrder=Er du sikker på at du vil slette denne ordren? @@ -131,6 +135,7 @@ SupplierOrderClassifiedBilled=Innkjøpsordre %s satt til fakturert OtherOrders=Andre ordre SupplierOrderValidatedAndApproved=Leverandørbestilling er validert og godkjent: %s SupplierOrderValidated=Leverandørbestilling er validert: %s +OrderShowDetail=Vis ordredetaljer ##### Types de contacts ##### TypeContact_commande_internal_SALESREPFOLL=Representant for oppfølging av salgsordre TypeContact_commande_internal_SHIPPING=Representant for oppfølging av levering @@ -199,3 +204,5 @@ StatusSupplierOrderApproved=Godkjent StatusSupplierOrderRefused=Avvist StatusSupplierOrderReceivedPartially=Delvis mottatt StatusSupplierOrderReceivedAll=Alle varer mottatt +NeedAtLeastOneInvoice = Det må være minst én faktura +LineAlreadyDispatched = Ordrelinjen er allerede mottatt. diff --git a/htdocs/langs/nb_NO/other.lang b/htdocs/langs/nb_NO/other.lang index c797e66b27f..0c3e6805c81 100644 --- a/htdocs/langs/nb_NO/other.lang +++ b/htdocs/langs/nb_NO/other.lang @@ -35,9 +35,9 @@ OnlyOneFieldForXAxisIsPossible=Bare ett felt er for øyeblikket mulig som X-Akse AtLeastOneMeasureIsRequired=Det kreves minst ett felt for mål AtLeastOneXAxisIsRequired=Minst ett felt for X-akse er påkrevd LatestBlogPosts=Siste blogginnlegg -notiftouser=To users -notiftofixedemail=To fixed mail -notiftouserandtofixedemail=To user and fixed mail +notiftouser=Til brukere +notiftofixedemail=Til fast post +notiftouserandtofixedemail=Til bruker og fast post Notify_ORDER_VALIDATE=Salgsordre validert Notify_ORDER_SENTBYMAIL=Salgsordre sendt via epost Notify_ORDER_SUPPLIER_SENTBYMAIL=Innkjøpsordre sendt via e-post @@ -46,7 +46,9 @@ Notify_ORDER_SUPPLIER_APPROVE=Innkjøpsordre godkjent Notify_ORDER_SUPPLIER_REFUSE=Innkjøpsordre avvist Notify_PROPAL_VALIDATE=Kundetilbud validert Notify_PROPAL_CLOSE_SIGNED=Kundetilbud lukket signert +Notify_PROPAL_CLOSE_SIGNED_WEB=Kundetilbud lukket signert på portalside Notify_PROPAL_CLOSE_REFUSED=Kundetilbud lukket avvist +Notify_PROPAL_CLOSE_REFUSED_WEB=Kundetilbud stengt avvist på portalsiden Notify_PROPAL_SENTBYMAIL=Tilbud sendt med post Notify_WITHDRAW_TRANSMIT=Overføring avbrudt Notify_WITHDRAW_CREDIT=Kreditt tilbaketrekning @@ -110,7 +112,7 @@ ChooseYourDemoProfilMore=... eller bygg din egen profil
    (manuell utvelgelse a DemoFundation=Håndtere medlemmer i en organisasjon DemoFundation2=Håndtere medlemmer og bankkonti i en organisasjon DemoCompanyServiceOnly=Firma som kun selger tjenester -DemoCompanyShopWithCashDesk=Manage a shop with a cash box +DemoCompanyShopWithCashDesk=Administrer en butikk med en pengekasse DemoCompanyProductAndStocks=Handle varer med Point Of Sales DemoCompanyManufacturing=Selskapets varer DemoCompanyAll=Firma med mange aktiviteter (alle hovedmoduler) @@ -181,13 +183,14 @@ SizeUnitfoot=fot SizeUnitpoint=punkt BugTracker=Feilsporing (bugtracker) SendNewPasswordDesc=Dette skjemaet lar deg be om et nytt passord. Det vil bli sendt til din e-postadresse.
    Endring skjer når du klikker på bekreftelseslinken i e-posten.
    Sjekk innboksen din. +EnterNewPasswordHere=Skriv inn ditt nye passord her BackToLoginPage=Tilbake til innloggingssiden AuthenticationDoesNotAllowSendNewPassword=Autensitering er satt til %s.
    Det betyr at Dolibarr ikke kan vite eller endre passordet ditt.
    Kontakt systemadministrator hvis du vil endre passordet ditt. EnableGDLibraryDesc=Installer eller aktiver GD-bibliotek i din PHP-installasjon for å bruke denne opsjonen. ProfIdShortDesc=Prof-ID %s er avhengig av tredjepartens land.
    For eksempel er det for %s, koden %s. DolibarrDemo=Dolibarr ERP/CRM demo StatsByNumberOfUnits=Statistikk over summen av produkter/tjenester -StatsByNumberOfEntities=Statistics for number of referring entities (no. of invoices, or orders...) +StatsByNumberOfEntities=Statistikk for antall henvisende enheter (antall fakturaer, eller bestillinger...) NumberOfProposals=Antall tilbud NumberOfCustomerOrders=Antall salgsordre NumberOfCustomerInvoices=Antall kundefakturaer @@ -210,6 +213,9 @@ EMailTextInvoiceValidated=Faktura %s er validert. EMailTextInvoicePayed=Faktura %s er betalt. EMailTextProposalValidated=Tilbud %s er validert. EMailTextProposalClosedSigned=Tilbud %s er lukket, signert. +EMailTextProposalClosedSignedWeb=Tilbud %s er stengt signert på portalside. +EMailTextProposalClosedRefused=Tilbud %s er lukket avvist. +EMailTextProposalClosedRefusedWeb=Tilbud %s har blitt stengt avvist på portalside. EMailTextOrderValidated=Ordre %s er validert. EMailTextOrderApproved=Ordre %s er godkjent. EMailTextOrderValidatedBy=Ordre %s har blitt registrert av %s. @@ -258,10 +264,10 @@ PassEncoding=Passordkoding PermissionsAdd=Tillatelser lagt til PermissionsDelete=Tillatelser fjernet YourPasswordMustHaveAtLeastXChars=Passordet ditt må ha minst %s tegn -PasswordNeedAtLeastXUpperCaseChars=The password need at least %s upper case chars -PasswordNeedAtLeastXDigitChars=The password need at least %s numeric chars -PasswordNeedAtLeastXSpecialChars=The password need at least %s special chars -PasswordNeedNoXConsecutiveChars=The password must not have %s consecutive similar chars +PasswordNeedAtLeastXUpperCaseChars=Passordet trenger minst %s store bokstaver +PasswordNeedAtLeastXDigitChars=Passordet trenger minst %s numeriske tegn +PasswordNeedAtLeastXSpecialChars=Passordet trenger minst %s spesialtegn +PasswordNeedNoXConsecutiveChars=Passordet må ikke ha %s påfølgende tegn YourPasswordHasBeenReset=Ditt passord er tilbakestilt ApplicantIpAddress=IP-adresse til søkeren SMSSentTo=SMS sendt til %s @@ -272,7 +278,7 @@ ProjectCreatedByEmailCollector=Prosjekt opprettet av e-post samler fra e-post MS TicketCreatedByEmailCollector=Supportseddel opprettet av e-post samler fra e-post MSGID %s OpeningHoursFormatDesc=Bruk en bindestrek for å skille åpning og stengetid.
    Bruk et mellomrom for å angi forskjellige områder.
    Eksempel: 8-12 14-18 SuffixSessionName=Suffiks for øktnavn -LoginWith=Login with %s +LoginWith=Logg på med %s ##### Export ##### ExportsArea=Eksportområde @@ -298,12 +304,12 @@ PopuProp=Varer/tjenester etter popularitet i tilbud PopuCom=Varer/tjenester etter popularitet i ordre ProductStatistics=Varer/Tjenestestatistikk NbOfQtyInOrders=Antall i ordre -SelectTheTypeOfObjectToAnalyze=Select an object to view its statistics... +SelectTheTypeOfObjectToAnalyze=Velg et objekt for å se dets statistikk... -ConfirmBtnCommonContent = Are you sure you want to "%s" ? -ConfirmBtnCommonTitle = Confirm your action +ConfirmBtnCommonContent = Er du sikker på at du vil "%s"? +ConfirmBtnCommonTitle = Bekreft handlingen din CloseDialog = Lukk -Autofill = Autofill +Autofill = Autofyll # externalsite ExternalSiteSetup=Oppsett av lenke til ekstern nettside @@ -311,10 +317,10 @@ ExternalSiteURL=URL for eksternt nettsted for HTML iframe-innhold ExternalSiteModuleNotComplete=Modulen Ekstern Side ble ikke riktig konfigurert. ExampleMyMenuEntry=Meny overskrift -# FTP +# ftp FTPClientSetup=Modul for oppsett av FTP- eller SFTP-klient -NewFTPClient=Nytt FTP / FTPS-tilkoblingsoppsett -FTPArea=FTP/FTPS-område +NewFTPClient=Nytt oppsett av FTP/SFTP-tilkobling +FTPArea=FTP/SFTP-område FTPAreaDesc=Dette skjermbildet viser en FTP et SFTP-server. SetupOfFTPClientModuleNotComplete=Installasjonen av FTP- eller SFTP-klientmodulen ser ut til å være ufullstendig FTPFeatureNotSupportedByYourPHP=Din PHP støtter ikke FTP- eller SFTP-funksjoner @@ -325,3 +331,9 @@ FTPFailedToRemoveDir=Kunne ikke fjerne katalogen %s : Kontroller tillate FTPPassiveMode=Passiv modus ChooseAFTPEntryIntoMenu=Velg et FTP/SFTP-nettsted fra menyen ... FailedToGetFile=Kunne ikke hente filene %s +ErrorFTPNodisconnect=Feil ved frakobling av FTP/SFTP-server +FileWasUpload=Fil %s ble lastet opp +FTPFailedToUploadFile=Kunne ikke laste opp filen %s . +AddFolder=Lag mappe +FileWasCreateFolder=Mappe %s er opprettet +FTPFailedToCreateFolder=Kunne ikke opprette mappen %s . diff --git a/htdocs/langs/nb_NO/projects.lang b/htdocs/langs/nb_NO/projects.lang index 4c8575492ff..b5c099b9ed4 100644 --- a/htdocs/langs/nb_NO/projects.lang +++ b/htdocs/langs/nb_NO/projects.lang @@ -23,7 +23,7 @@ TasksPublicDesc=Denne visningen presenterer alle prosjekter og oppgaver du har l TasksDesc=Denne visningen presenterer alle prosjekter og oppgaver (dine brukertillatelser gir deg tillatelse til å vise alt). AllTaskVisibleButEditIfYouAreAssigned=Alle oppgaver for kvalifiserte prosjekter er synlige, men du kan bare angi tid for oppgave som er tildelt til valgt bruker. Tilordne oppgave hvis du trenger å skrive inn tid på den. OnlyYourTaskAreVisible=Bare oppgaver som er tildelt deg er synlige. Hvis du trenger å legge inn tid på en oppgave og oppgaven ikke er synlig her, må du tilordne oppgaven til deg selv. -ImportDatasetProjects=Projects or opportunities +ImportDatasetProjects=Prosjekter eller muligheter ImportDatasetTasks=Oppgaver fra prosjekter ProjectCategories=Prosjekt etiketter/kategorier NewProject=Nytt prosjekt @@ -125,8 +125,8 @@ ValidateProject=Valider prosjekt ConfirmValidateProject=Er du sikker på at du vil validere dette prosjektet? CloseAProject=Lukk prosjektet ConfirmCloseAProject=Er du sikker på at du vil lukke dette prosjektet? -AlsoCloseAProject=Also close project -AlsoCloseAProjectTooltip=Keep it open if you still need to follow production tasks on it +AlsoCloseAProject=Lukk prosjekt også +AlsoCloseAProjectTooltip=Hold den åpen hvis du fortsatt trenger å følge produksjonsoppgaver på den ReOpenAProject=Åpne prosjekt ConfirmReOpenAProject=Er du sikker på at du vil gjenåpne dette prosjektet? ProjectContact=Kontaktpersoner for prosjektet @@ -169,7 +169,7 @@ OpportunityProbability=Lead sannsynlighet OpportunityProbabilityShort=Lead sansyn. OpportunityAmount=Lead beløp OpportunityAmountShort=Lead beløp -OpportunityWeightedAmount=Amount of opportunity, weighted by probability +OpportunityWeightedAmount=Beløp på mulighet, vektet etter sannsynlighet OpportunityWeightedAmountShort=Muligh. vektet beløp OpportunityAmountAverageShort=Gjennomsnittlig lead beløp OpportunityAmountWeigthedShort=Vektet lead beløp @@ -259,6 +259,7 @@ RecordsClosed=%s prosjekt(er) lukket SendProjectRef=Informasjon prosjekt %s ModuleSalaryToDefineHourlyRateMustBeEnabled=Modul 'Lønn' må være aktivert for å definere ansattes timepris for å få tidsbruk verdsatt NewTaskRefSuggested=Oppgavereferanse allerede brukt, en ny oppgavereferanse er nødvendig +NumberOfTasksCloned=%s oppgave(r) klonet TimeSpentInvoiced=Tidsbruk fakturert TimeSpentForIntervention=Tid brukt TimeSpentForInvoice=Tid brukt diff --git a/htdocs/langs/nb_NO/salaries.lang b/htdocs/langs/nb_NO/salaries.lang index bb698ea40d8..b7ea89c743d 100644 --- a/htdocs/langs/nb_NO/salaries.lang +++ b/htdocs/langs/nb_NO/salaries.lang @@ -1,6 +1,6 @@ # Dolibarr language file - Source file is en_US - salaries -SALARIES_ACCOUNTING_ACCOUNT_PAYMENT=Account (from the Chart of Account) used by default for "user" third parties -SALARIES_ACCOUNTING_ACCOUNT_PAYMENT_Desc=The dedicated account defined on user card will be used for Subledger accounting only. This one will be used for General Ledger and as default value of Subledger accounting if dedicated user accounting account on user is not defined. +SALARIES_ACCOUNTING_ACCOUNT_PAYMENT=Konto (fra kontoplanen) brukes som standard for "bruker" tredjeparter +SALARIES_ACCOUNTING_ACCOUNT_PAYMENT_Desc=Den dedikerte kontoen som er definert på brukerkortet, vil kun brukes til underreskontro. Denne vil bli brukt for hovedbok og som standardverdi for underreskontro hvis dedikert brukerkonto for bruker ikke er definert. SALARIES_ACCOUNTING_ACCOUNT_CHARGE=Regnskapskonto som standard for lønnsutbetalinger CREATE_NEW_SALARY_WITHOUT_AUTO_PAYMENT=La som standard alternativet "Opprett automatisk en total betaling" være tomt når du oppretter lønn Salary=Lønn diff --git a/htdocs/langs/nb_NO/stripe.lang b/htdocs/langs/nb_NO/stripe.lang index 8094f39ad1f..48eefed34c5 100644 --- a/htdocs/langs/nb_NO/stripe.lang +++ b/htdocs/langs/nb_NO/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Webhook-nøkkel ONLINE_PAYMENT_WAREHOUSE=Lager som skal brukes for lagernedskrivning når nettbasert betaling er utført
    (TODO Når alternativet for å redusere lagerbeholdningen gjøres på en faktura handling, og online betaling genererer fakturaen?) StripeLiveEnabled=Stripe live aktivert (ellers test/sandbox modus) StripeImportPayment=Importer Stripe-betalinger -ExampleOfTestCreditCard=Eksempel på kredittkort for test: %s => gyldig, %s => feil CVC, %s => utløpt, %s => belastning mislykket +ExampleOfTestCreditCard=Eksempel på kredittkort for SEPA-test: %s => gyldig, %s => feil CVC, %s => utløpt, %s => belastning mislykkes +ExampleOfTestBankAcountForSEPA=Eksempel på bankkonto BAN for test av direkte belastning: %s StripeGateways=Stripe gateways OAUTH_STRIPE_TEST_ID=Stripe Connect Client ID (ca. _...) OAUTH_STRIPE_LIVE_ID=Stripe Connect Client ID (ca. _...) @@ -70,5 +71,8 @@ ToOfferALinkForLiveWebhook=Link til oppsett av Stripe WebHook for oppkall av IPN PaymentWillBeRecordedForNextPeriod=Betalingen blir registrert for neste periode. ClickHereToTryAgain=Klikk her for å prøve igjen ... CreationOfPaymentModeMustBeDoneFromStripeInterface=På grunn av sterke regler for godkjenning av kunder, må opprettelse av et kort gjøres fra Stripe backoffice. Du kan klikke her for å slå på Stripe kundeoppføring: %s -TERMINAL_LOCATION=Plassering (adresse) for terminaler +STRIPE_CARD_PRESENT=Kort til stede for Stripe-terminaler +TERMINAL_LOCATION=Plassering (adresse) for Stripe Terminaler RequestDirectDebitWithStripe=Be om direktedebet med Stripe +STRIPE_SEPA_DIRECT_DEBIT=Aktiver direktedebet gjennom Stripe + diff --git a/htdocs/langs/nb_NO/ticket.lang b/htdocs/langs/nb_NO/ticket.lang index f3aefbb6a07..47d71678984 100644 --- a/htdocs/langs/nb_NO/ticket.lang +++ b/htdocs/langs/nb_NO/ticket.lang @@ -26,6 +26,7 @@ Permission56002=Endre supportsedler Permission56003=Slett supportsedler Permission56004=Administrer supportsedler Permission56005=Se billetter til alle tredjeparter (ikke effektive for eksterne brukere, alltid begrenset til tredjepart de er avhengige av) +Permission56006=Eksporter billetter Tickets=Supportsedler TicketDictType=Billett - Typer @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=Ekstern bidragsyter OriginEmail=Rapport-epost Notify_TICKET_SENTBYMAIL=Send billettmelding via e-post +ExportDataset_ticket_1=Supportsedler + # Status Read=Les Assigned=Tildelt diff --git a/htdocs/langs/nb_NO/users.lang b/htdocs/langs/nb_NO/users.lang index b78cbc27184..a81039928db 100644 --- a/htdocs/langs/nb_NO/users.lang +++ b/htdocs/langs/nb_NO/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Link til bruker LinkedToDolibarrThirdParty=Link til tredjepart CreateDolibarrLogin=Lag Dolibarrkonto CreateDolibarrThirdParty=Lag en tredjepart -LoginAccountDisableInDolibarr=Kontoen er deaktivert i Dolibarr. +LoginAccountDisableInDolibarr=Konto deaktivert i Dolibarr +PASSWORDInDolibarr=Passord endret i Dolibarr UsePersonalValue=Bruk personlig verdi ExportDataset_user_1=Brukere og deres egenskaper DomainUser=Domenebruker %s @@ -129,3 +130,6 @@ IPLastLogin=IP siste pålogging IPPreviousLogin=IP forrige pålogging ShowAllPerms=Vis alle tillatelsesrader HideAllPerms=Skjul alle tillatelsesrader +UserPublicPageDesc=Du kan aktivere et virtuelt kort for denne brukeren. En url med brukerprofilen og en strekkode vil være tilgjengelig slik at alle med en smarttelefon kan skanne den og legge til kontakten din i adresseboken. +EnablePublicVirtualCard=Aktiver det offentlige virtuelle brukerkortet +PublicVirtualCardUrl=Offentlig virtuelt brukerkort diff --git a/htdocs/langs/nb_NO/website.lang b/htdocs/langs/nb_NO/website.lang index 608da77e606..c1f69b5a7dc 100644 --- a/htdocs/langs/nb_NO/website.lang +++ b/htdocs/langs/nb_NO/website.lang @@ -155,3 +155,5 @@ WebpageMustBeDisabled=Nettsiden må ha statusen "%s" SetWebsiteOnlineBefore=Når nettstedet er frakoblet, er alle sidene offline. Endre status på nettstedet først. Booking=Bestilling Reservation=Reservasjon +PagesViewedPreviousMonth=Sider vist (forrige måned) +PagesViewedTotal=Viste sider (totalt) diff --git a/htdocs/langs/nb_NO/withdrawals.lang b/htdocs/langs/nb_NO/withdrawals.lang index 0a206ba4e9e..d2d34607bf1 100644 --- a/htdocs/langs/nb_NO/withdrawals.lang +++ b/htdocs/langs/nb_NO/withdrawals.lang @@ -33,7 +33,7 @@ InvoiceWaitingPaymentByBankTransfer=Faktura venter på kreditoverføring AmountToWithdraw=Beløp å tilbakekalle AmountToTransfer=Beløp som skal overføres NoInvoiceToWithdraw=Ingen faktura åpen for '%s' venter. Gå til fanen '%s' på fakturakortet for å gjøre en forespørsel. -NoSupplierInvoiceToWithdraw=No supplier invoice with open '%s' is waiting. Go on tab '%s' on invoice card to make a request. +NoSupplierInvoiceToWithdraw=Ingen leverandørfaktura med åpen '%s' venter. Gå til fanen '%s' på fakturakortet for å gjøre en forespørsel. ResponsibleUser=Brukeransvarlig WithdrawalsSetup=Oppsett av direktedebetsbetalinger CreditTransferSetup=Oppsett av kredittoverføring diff --git a/htdocs/langs/nl_BE/accountancy.lang b/htdocs/langs/nl_BE/accountancy.lang index 3a8fd558aca..bf0668f6ad0 100644 --- a/htdocs/langs/nl_BE/accountancy.lang +++ b/htdocs/langs/nl_BE/accountancy.lang @@ -12,7 +12,6 @@ Selectchartofaccounts=Selecteer actieve grafieken van accounts Addanaccount=Voeg een boekhoudkundige rekening toe AccountAccounting=Boekhoudkundige rekening AccountAccountingShort=Rekening -AccountAccountingSuggest=Voorgesteld boekhoudkundige rekening CreateMvts=Nieuwe transactie maken UpdateMvts=Wijzigen van een transactie Processing=Verwerken diff --git a/htdocs/langs/nl_NL/accountancy.lang b/htdocs/langs/nl_NL/accountancy.lang index 6afef8eca53..a7da8ab21a4 100644 --- a/htdocs/langs/nl_NL/accountancy.lang +++ b/htdocs/langs/nl_NL/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Selecteer het nieuwe regel type ACCOUNTING_EXPORT_PREFIX_SPEC=Specificeer de prefix voor de bestandsnaam ThisService=Deze dienst ThisProduct=Dit product -DefaultForService=Standaard bij dienst -DefaultForProduct=Standaard bij product +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Product voor deze relatie ServiceForThisThirdparty=Service voor deze relatie CantSuggest=Geen suggestie @@ -101,7 +101,8 @@ ShowAccountingAccount=Toon grootboekrekening ShowAccountingJournal=Toon dagboek ShowAccountingAccountInLedger=Grootboekrekening in grootboek ShowAccountingAccountInJournals=Laat grootboekrekening zien in journaals -AccountAccountingSuggest=Voorgestelde rekening +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=Standaard GB-rekeningen MenuBankAccounts=Bankrekeningen MenuVatAccounts=BTW rekeningen @@ -126,6 +127,7 @@ WriteBookKeeping=Boek transacties in de boekhouding Bookkeeping=Grootboek BookkeepingSubAccount=Sub-grootboek AccountBalance=Balans +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Ref. bron-object CAHTF=Totaal inkoop leverancier excl. BTW TotalExpenseReport=Totaal resultaatrekening kosten @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Klantrekening opslaan als individuele rekening in subgrootboek voor vooruitbetalingsregels (indien uitgeschakeld, blijft individuele rekening voor vooruitbetalingsregels leeg) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Leveranciersrekening opslaan als individuele rekening in subgrootboek voor vooruitbetalingsregels (indien uitgeschakeld, blijft individuele rekening voor vooruitbetalingsregels leeg) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=Journaal label NumPiece=Boekingstuk TransactionNumShort=Transactienummer AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Groeperen op grootboekrekening GroupBySubAccountAccounting=Groepeer op subgrootboekrekening AccountingAccountGroupsDesc=Hier kunt u enkele grootboekrekening-groepen definiëren. Deze worden gebruikt voor gepersonaliseerde boekhoudrapporten. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Toon subtotaal op niveau Pcgtype=Rekening hoofdgroep PcgtypeDesc=Cluster grootboekrekeningen welke gebruikt worden als vooraf gedefinieerde 'filter'- en' groepeer'-criteria voor sommige boekhoudrapporten. 'INKOMEN' of 'UITGAVEN' worden bijvoorbeeld gebruikt als groepen voor boekhoudrekeningen van producten om het kosten- / inkomstenrapport samen te stellen. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Samentrekken @@ -294,6 +299,7 @@ DescValidateMovements=Elke wijziging of verwijdering van inboeken, afletteren en ValidateHistory=Automatisch afstemmen AutomaticBindingDone=Automatische bindings uitgevoerd (%s) - Automatische binding was niet mogelijk voor record (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Beweging niet correct gebalanceerd. Debet = %s & Credit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Schakel het koppelen en doorboeken naar de b ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Schakel het koppelen en doorboeken naar de boekhouding van inkopen uit (facturen van leveranciers worden niet doorgeboekt in de boekhouding) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Schakel het koppelen en doorboeken naar de boekhouding van onkostendeclaraties uit (met onkostendeclaraties wordt geen rekening gehouden in de boekhouding) ACCOUNTING_ENABLE_LETTERING=Schakel de afletteren functie in de boekhouding in +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Exporteer het afletteren niet bij het genereren van het bestand NotifiedExportDate=Geëxporteerde regels markeren als geëxporteerd (om een regel te wijzigen, moet u de hele transactie verwijderen en opnieuw in de boekhouding opnemen) NotifiedValidationDate=Valideer en vergrendel de geëxporteerde items (hetzelfde effect als de functie "%s", wijziging en verwijdering van de regels is ZEKER niet mogelijk) +NotifiedExportFull=Export documents ? DateValidationAndLock=Datum validatie en vergrendelen ConfirmExportFile=Bevestiging van het genereren van het boekhoudkundige exportbestand ? ExportDraftJournal=Journaal exporteren @@ -398,7 +406,7 @@ SaleLocal=Lokale verkoop SaleExport=Verkoop buitenland SaleEEC=Verkoop binnen de EU SaleEECWithVAT=Verkoop binnen de EU met een btw die niet nul is, dus we veronderstellen dat dit GEEN intracommunautaire verkoop is en de voorgestelde grootboekrekening het standaardproductaccount is. -SaleEECWithoutVATNumber=Verkoop binnen de EU zonder btw, maar het btw-nummer van een derde partij is niet gedefinieerd. Voor standaardverkoop vallen we terug op het product-grootboekrekening. U kunt indien nodig het btw-nummer van een derde partij of het productaccount aanpassen. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Niet toegestaan: De transactie is gevalideerd en/of geëxporteerd. ForbiddenTransactionAlreadyValidated=Niet toegestaan: De transactie is gevalideerd. ## Dictionary @@ -434,14 +442,15 @@ ErrorInvoiceContainsLinesNotYetBoundedShort=Sommige regels op de factuur zijn ni ExportNotSupported=Het ingestelde exportformaat wordt niet ondersteund op deze pagina BookeppingLineAlreayExists=Reeds doorgeboekte regels NoJournalDefined=Geen dagboek ingesteld -Binded=Geboekte regels -ToBind=Te boeken regels -UseMenuToSetBindindManualy=Regels die nog niet zijn gebonden, gebruik het menu %s om de binding handmatig te maken +Binded=Gekoppelde regels +ToBind=Te koppelen regels +UseMenuToSetBindindManualy=Regels die nog niet zijn gekoppeld, gebruik het menu %s om de koppeling handmatig te maken SorryThisModuleIsNotCompatibleWithTheExperimentalFeatureOfSituationInvoices=Sorry, deze module is niet compatibel met de experimentele functie van situatiefacturen AccountancyErrorMismatchLetterCode=Mismatch in afstemmingscode AccountancyErrorMismatchBalanceAmount=Het saldo (%s) is niet gelijk aan 0 AccountancyErrorLetteringBookkeeping=Er zijn fouten opgetreden met betrekking tot de transacties: %s ErrorAccountNumberAlreadyExists=Het boekhoudnummer %s bestaat al +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Boekingen @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Multivalutacode (Idevise) DateExport=Exportdatum WarningReportNotReliable=Waarschuwing, dit rapport is niet gebaseerd op het grootboek, dus bevat het niet de transactie die handmatig in het grootboek is gewijzigd. Als uw journalisatie up-to-date is, is de weergave van de boekhouding nauwkeuriger. ExpenseReportJournal=Kostenoverzicht +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s accounts diff --git a/htdocs/langs/nl_NL/main.lang b/htdocs/langs/nl_NL/main.lang index 86decb8d6fb..870b6d040b6 100644 --- a/htdocs/langs/nl_NL/main.lang +++ b/htdocs/langs/nl_NL/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=Geen gebruikersgroep gedefinieerd Password=Wachtwoord PasswordRetype=Repeat your password NoteSomeFeaturesAreDisabled=Let op, veel functionaliteiten / modules zijn uitgeschakeld in deze demonstratie. +YourUserFile=Your user file Name=Naam NameSlashCompany=Naam / Bedrijf Person=Persoon @@ -897,6 +898,9 @@ MassFilesArea=Omgeving voor bestanden die zijn gebouwd met massa-acties ShowTempMassFilesArea=Toon gebied van bestanden gebouwd door massale acties ConfirmMassDeletion=Bevestiging bulk verwijdering ConfirmMassDeletionQuestion=Weet u zeker dat u de %s geselecteerde record (s) wilt verwijderen? +ConfirmMassClone=Bulk clone confirmation +ConfirmMassCloneQuestion=Select project to clone to +ConfirmMassCloneToOneProject=Clone to project %s RelatedObjects=Gerelateerde objecten ClassifyBilled=Classificeer als gefactureerd ClassifyUnbilled=Classificeer ongevuld @@ -912,8 +916,8 @@ ExportFilteredList=Exporteren gefilterde lijst ExportList=Exporteer lijst ExportOptions=Exporteeropties IncludeDocsAlreadyExported=Inclusief reeds geëxporteerde documenten -ExportOfPiecesAlreadyExportedIsEnable=Export van reeds geëxporteerde stukken is mogelijk -ExportOfPiecesAlreadyExportedIsDisable=Export van reeds geëxporteerde stukken is uitgeschakeld +ExportOfPiecesAlreadyExportedIsEnable=Documents already exported are visible and will be exported +ExportOfPiecesAlreadyExportedIsDisable=Documents already exported are hidden and won't be exported AllExportedMovementsWereRecordedAsExported=Alle geëxporteerde bewegingen werden geregistreerd als geëxporteerd NotAllExportedMovementsCouldBeRecordedAsExported=Niet alle geëxporteerde bewerkingen kunnen worden geregistreerd als geëxporteerd Miscellaneous=Diversen @@ -1128,6 +1132,7 @@ DeleteFileText=Weet u zeker dat u dit bestand wilt verwijderen? ShowOtherLanguages=Toon andere talen SwitchInEditModeToAddTranslation=Schakel in de bewerkingsmodus om vertalingen voor deze taal toe te voegen NotUsedForThisCustomer=Niet gebruikt voor deze klant +NotUsedForThisVendor=Not used for this vendor AmountMustBePositive=Bedrag moet positief zijn ByStatus=Op status InformationMessage=Informatie @@ -1148,14 +1153,14 @@ EventReminder=Herinnering voor evenement UpdateForAllLines=Update voor alle lijnen OnHold=In de wacht Civility=Beleefdheid -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Set Supervisor +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor CreateExternalUser=Externe gebruiker aanmaken ConfirmAffectTag=Bulk Tag Assignement ConfirmAffectUser=Bulk User Assignement -ProjectRole=Role assigned on each project -TasksRole=Role assigned on each task of each project +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ConfirmSetSupervisor=Bulk Supervisor Set ConfirmUpdatePrice=Choose a increase/decrease price rate ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Created from Public portal UserAgent=User Agent InternalUser=Interne gebruiker ExternalUser=Externe gebruiker +NoSpecificContactAddress=No specific contact or address +NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. +HideOnVCard=Hide %s +AddToContacts=Add address to my contacts +LastAccess=Last access +UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here +LastPasswordChangeDate=Last password change date diff --git a/htdocs/langs/nl_NL/stripe.lang b/htdocs/langs/nl_NL/stripe.lang index 907a444c058..ed0186b5d82 100644 --- a/htdocs/langs/nl_NL/stripe.lang +++ b/htdocs/langs/nl_NL/stripe.lang @@ -1,6 +1,6 @@ # Dolibarr language file - Source file is en_US - stripe StripeSetup=Stripe-module instellen -StripeDesc=Offer your customers an online payment page for payments with credit/debit cards via Stripe. This can be used to allow your customers to make ad-hoc payments or for payments related to a particular Dolibarr object (invoice, order, ...) +StripeDesc=Bied uw klanten een online betaalpagina voor betalingen met creditcards/betaalkaarten via Stripe . Dit kan worden gebruikt om uw klanten ad-hoc betalingen te laten doen of voor betalingen met betrekking tot een bepaald Dolibarr-object (factuur, bestelling, ...) StripeOrCBDoPayment=Betaal met creditcard of Stripe FollowingUrlAreAvailableToMakePayments=De volgende URL's zijn beschikbaar om een pagina te bieden aan afnemers voor het doen van een betaling van Dolibarr objecten PaymentForm=Betalingsformulier @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Webhook live sleutel ONLINE_PAYMENT_WAREHOUSE=Voorraad voor voorraadafname wanneer online betaling is voltooid
    (TODO Wanneer optie om voorraad te verminderen wordt gedaan op een actie op factuur en de online betaling zelf de factuur genereert?) StripeLiveEnabled=Stripe live ingeschakeld (anders test / sandbox-modus) StripeImportPayment=Streepbetalingen importeren -ExampleOfTestCreditCard=Voorbeeld van creditcard voor test: %s => geldig, %s => error CVC, %s => verlopen, %s => belasten mislukt +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +ExampleOfTestBankAcountForSEPA=Example of bank account BAN for direct debit test: %s StripeGateways=Stripe gateways OAUTH_STRIPE_TEST_ID=Stripe Connect-client-ID (ca _...) OAUTH_STRIPE_LIVE_ID=Stripe Connect-client-ID (ca _...) @@ -61,6 +62,7 @@ DeleteACard=Kaart verwijderen ConfirmDeleteCard=Weet u zeker dat u deze creditcard of betaalpas wilt verwijderen? CreateCustomerOnStripe=Creëer klant op Stripe CreateCardOnStripe=Maak een kaart op Stripe +CreateBANOnStripe=Create bank on Stripe ShowInStripe=Toon in streep StripeUserAccountForActions=Gebruikersaccount om te gebruiken voor e-mailmeldingen van sommige Stripe-evenementen (Stripe-uitbetalingen) StripePayoutList=Lijst met Stripe uitbetalingen @@ -69,3 +71,8 @@ ToOfferALinkForLiveWebhook=Link om Stripe WebHook in te stellen om de IPN te bel PaymentWillBeRecordedForNextPeriod=De betaling wordt geregistreerd voor de volgende periode. ClickHereToTryAgain=Klik hier om het opnieuw te proberen ... CreationOfPaymentModeMustBeDoneFromStripeInterface=Vanwege de strenge regels voor klantauthenticatie moet het aanmaken van een kaart worden gedaan vanuit Stripe backoffice. U kunt hier klikken om Stripe-klantrecord in te schakelen: %s +STRIPE_CARD_PRESENT=Card Present for Stripe Terminals +TERMINAL_LOCATION=Location (address) for Stripe Terminals +RequestDirectDebitWithStripe=Request Direct Debit with Stripe +STRIPE_SEPA_DIRECT_DEBIT=Enable the Direct Debit payments through Stripe + diff --git a/htdocs/langs/nl_NL/ticket.lang b/htdocs/langs/nl_NL/ticket.lang index 644874336a5..8dbed0b7a00 100644 --- a/htdocs/langs/nl_NL/ticket.lang +++ b/htdocs/langs/nl_NL/ticket.lang @@ -26,6 +26,7 @@ Permission56002=Aanpassen tickets Permission56003=Verwijder tickets Permission56004=Beheer tickets Permission56005=Bekijk tickets van alle derde partijen (niet van toepassing voor externe gebruikers, altijd beperkt tot de derde partij waarvan ze afhankelijk zijn) +Permission56006=Export tickets Tickets=Tickets TicketDictType=Ticket - Types @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=Externe bijdrager OriginEmail=E-mail van de melder Notify_TICKET_SENTBYMAIL=Verzend ticketbericht per e-mail +ExportDataset_ticket_1=Tickets + # Status Read=Gelezen Assigned=Toegekend diff --git a/htdocs/langs/nl_NL/users.lang b/htdocs/langs/nl_NL/users.lang index d49b9b1dfa4..6f4b2c626f0 100644 --- a/htdocs/langs/nl_NL/users.lang +++ b/htdocs/langs/nl_NL/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Link naar gebruiker LinkedToDolibarrThirdParty=Link naar relatie CreateDolibarrLogin=Maak Dolibarr account CreateDolibarrThirdParty=Creëer nieuwe klant -LoginAccountDisableInDolibarr=Account uitgeschakeld in Dolibarr. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Gebruik persoonlijke waarde ExportDataset_user_1=Gebruikers en hun eigenschappen DomainUser=Domeingebruikersaccount %s @@ -129,3 +130,6 @@ IPLastLogin=IP laatste login IPPreviousLogin=IP vorige login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/pl_PL/accountancy.lang b/htdocs/langs/pl_PL/accountancy.lang index 0ef6acabde7..6937e9f5584 100644 --- a/htdocs/langs/pl_PL/accountancy.lang +++ b/htdocs/langs/pl_PL/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Wybierz typ powrotu karetki ACCOUNTING_EXPORT_PREFIX_SPEC=Przedrostek w nazwie pliku ThisService=Ta usługa ThisProduct=Ten produkt -DefaultForService=Domyślny dla usługi -DefaultForProduct=Domyślny dla produktu +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Produkt dla tego kontrahenta ServiceForThisThirdparty=Usługa dla tego kontrahenta CantSuggest=Nie mogę zasugerować @@ -101,7 +101,8 @@ ShowAccountingAccount=Wyświetl konta księgowe ShowAccountingJournal=Wyświetl dziennik konta księgowego ShowAccountingAccountInLedger=Pokaż konto księgowe w księdze ShowAccountingAccountInJournals=Pokaż konto księgowe w dziennikach -AccountAccountingSuggest=Zalecane konto rachunkowe +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=Domyślne konta MenuBankAccounts=Konta bankowe MenuVatAccounts=Konta VAT @@ -126,6 +127,7 @@ WriteBookKeeping=Record transactions in accounting Bookkeeping=Księga główna BookkeepingSubAccount=Subledger AccountBalance=Bilans konta +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Obiekt źródłowy ref CAHTF=Łącznie sprzedawca przed opodatkowaniem TotalExpenseReport=Raport z całkowitych wydatków @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=Etykieta czasopisma NumPiece=ilość sztuk TransactionNumShort=Numer transakcji AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Grupuj według konta księgi głównej GroupBySubAccountAccounting=Grupuj według konta księgi podrzędnej AccountingAccountGroupsDesc=Możesz tutaj zdefiniować kilka grup rachunków księgowych. Będą wykorzystywane do tworzenia spersonalizowanych raportów księgowych. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Pokaż sumę częściową według poziomu Pcgtype=Grupa konta PcgtypeDesc=Grupa kont jest używana jako predefiniowane kryteria „filtru” i „grupowania” w niektórych raportach księgowych. Na przykład „DOCHÓD” lub „WYDATEK” są używane jako grupy dla kont księgowych produktów w celu utworzenia raportu kosztów / dochodów. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Do pogodzenia @@ -294,6 +299,7 @@ DescValidateMovements=Jakakolwiek modyfikacja lub usunięcie pisma, napisów i u ValidateHistory=Dowiąż automatycznie AutomaticBindingDone=Automatic bindings done (%s) - Automatic binding not possible for some record (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Wyłącz powiązanie i przeniesienie w księ ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Wyłącz powiązanie i przeniesienie w księgowości zakupów (faktury dostawcy nie będą brane pod uwagę w księgowości) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Wyłącz powiązanie i przeniesienie w księgowości na zestawieniach wydatków (zestawienia wydatków nie będą brane pod uwagę w księgowości) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Flag exported lines as Exported (to modify a line, you will need to delete the whole transaction and re-transfert it into accounting) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=Date validation and lock ConfirmExportFile=Potwierdzenie wygenerowania pliku eksportu księgowości ? ExportDraftJournal=Export dziennika projektu @@ -398,7 +406,7 @@ SaleLocal=Sprzedaż lokalna SaleExport=Sprzedaż eksportowa SaleEEC=Sprzedaż w EWG SaleEECWithVAT=Sprzedaż w EWG z podatkiem VAT niezerowym, więc przypuszczamy, że NIE jest to sprzedaż wewnątrzwspólnotowa, a sugerowane konto to standardowe konto produktu. -SaleEECWithoutVATNumber=Sprzedaż w EWG bez podatku VAT, ale identyfikator VAT strony trzeciej nie jest zdefiniowany. Wracamy na konto produktu dla sprzedaży standardowej. W razie potrzeby możesz poprawić identyfikator VAT strony trzeciej lub konto produktu. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Forbidden: The transaction has been validated and/or exported. ForbiddenTransactionAlreadyValidated=Forbidden: The transaction has been validated. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Mismatch in reconcile code AccountancyErrorMismatchBalanceAmount=The balance (%s) is not equal to 0 AccountancyErrorLetteringBookkeeping=Errors have occurred concerning the transactions: %s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Zapisy księgowe @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Kod wielowalutowy (Idevise) DateExport=Eksport daty WarningReportNotReliable=Ostrzeżenie, ten raport nie jest oparty na księdze, więc nie zawiera transakcji zmodyfikowanych ręcznie w księdze. Jeśli dziennikarstwo jest aktualne, widok księgowości jest dokładniejszy. ExpenseReportJournal=Dziennik wydatków +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s kont diff --git a/htdocs/langs/pl_PL/main.lang b/htdocs/langs/pl_PL/main.lang index 5599bd29939..a2d532e708f 100644 --- a/htdocs/langs/pl_PL/main.lang +++ b/htdocs/langs/pl_PL/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=Niezdefiniowano grup użytkowników Password=Hasło PasswordRetype=Repeat your password NoteSomeFeaturesAreDisabled=Należy pamiętać, że wiele funkcji/modułów jest wyłączonych w tej demonstracji. +YourUserFile=Your user file Name=Nazwa NameSlashCompany=Nazwa / Firma Person=Osoba @@ -897,6 +898,9 @@ MassFilesArea=Obszar plików zbudowanych masowo ShowTempMassFilesArea=Wyświetl obszar plików zbudowanych masowo ConfirmMassDeletion=Potwierdzenie usuwania zbiorczego ConfirmMassDeletionQuestion=Czy na pewno chcesz usunąć wybrane rekordy %s? +ConfirmMassClone=Bulk clone confirmation +ConfirmMassCloneQuestion=Select project to clone to +ConfirmMassCloneToOneProject=Clone to project %s RelatedObjects=Powiązane obiekty ClassifyBilled=Oznacz jako zafakturowana ClassifyUnbilled=Klasyfikuj niezafakturowane @@ -912,8 +916,8 @@ ExportFilteredList=Eksportuj przefiltrowaną listę ExportList=Eksportuj listę ExportOptions=Opcje eksportu IncludeDocsAlreadyExported=Uwzględnij dokumenty już wyeksportowane -ExportOfPiecesAlreadyExportedIsEnable=Eksport już wyeksportowanych elementów jest włączony -ExportOfPiecesAlreadyExportedIsDisable=Eksport już wyeksportowanych elementów jest wyłączony +ExportOfPiecesAlreadyExportedIsEnable=Documents already exported are visible and will be exported +ExportOfPiecesAlreadyExportedIsDisable=Documents already exported are hidden and won't be exported AllExportedMovementsWereRecordedAsExported=Wszystkie eksportowane przemieszczenia były rejestrowane jako eksportowane NotAllExportedMovementsCouldBeRecordedAsExported=Nie wszystkie wyeksportowane przepływy można było zarejestrować jako wyeksportowane Miscellaneous=Różne @@ -1128,6 +1132,7 @@ DeleteFileText=Czy na pewno chcesz usunąć ten plik? ShowOtherLanguages=Pokaż inne języki SwitchInEditModeToAddTranslation=Przełącz się w tryb edycji, aby dodać tłumaczenia dla tego języka NotUsedForThisCustomer=Nieużywany dla tego klienta +NotUsedForThisVendor=Not used for this vendor AmountMustBePositive=Kwota musi być dodatnia ByStatus=Według statusu InformationMessage=Informacja @@ -1148,14 +1153,14 @@ EventReminder=Przypomnienie o wydarzeniu UpdateForAllLines=Aktualizacja dla wszystkich linii OnHold=Wstrzymany Civility=Grzeczność -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Set Supervisor +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor CreateExternalUser=Utwórz użytkownika zewnętrznego ConfirmAffectTag=Bulk Tag Assignement ConfirmAffectUser=Bulk User Assignement -ProjectRole=Role assigned on each project -TasksRole=Role assigned on each task of each project +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ConfirmSetSupervisor=Bulk Supervisor Set ConfirmUpdatePrice=Choose a increase/decrease price rate ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Created from Public portal UserAgent=User Agent InternalUser=Wewnętrzny użytkownik ExternalUser=Zewnętrzny użytkownik +NoSpecificContactAddress=No specific contact or address +NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. +HideOnVCard=Hide %s +AddToContacts=Add address to my contacts +LastAccess=Last access +UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here +LastPasswordChangeDate=Last password change date diff --git a/htdocs/langs/pl_PL/stripe.lang b/htdocs/langs/pl_PL/stripe.lang index b0de9e9fa15..c57eb260635 100644 --- a/htdocs/langs/pl_PL/stripe.lang +++ b/htdocs/langs/pl_PL/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Aktywny klucz webhooka ONLINE_PAYMENT_WAREHOUSE=Zapasy do wykorzystania w celu zmniejszenia zapasów po dokonaniu płatności online
    (DO ZROBIENIA Kiedy opcja zmniejszenia zapasów jest realizowana na podstawie faktury i płatność online generuje fakturę?) StripeLiveEnabled=Stripe na żywo włączony (w przeciwnym razie tryb testowy / piaskownicy) StripeImportPayment=Importuj płatności Stripe -ExampleOfTestCreditCard=Przykład karty kredytowej do testu: %s => ważna, %s => błąd CVC, %s => wygasła, %s => opłata nie powiodła się +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +ExampleOfTestBankAcountForSEPA=Example of bank account BAN for direct debit test: %s StripeGateways=Bramy Stripe OAUTH_STRIPE_TEST_ID=Identyfikator klienta Stripe Connect (ca _...) OAUTH_STRIPE_LIVE_ID=Identyfikator klienta Stripe Connect (ca _...) @@ -61,6 +62,7 @@ DeleteACard=Usuń kartę ConfirmDeleteCard=Czy na pewno chcesz usunąć tę kartę kredytową lub debetową? CreateCustomerOnStripe=Utwórz klienta w Stripe CreateCardOnStripe=Utwórz kartę w Stripe +CreateBANOnStripe=Create bank on Stripe ShowInStripe=Pokaż w Stripe StripeUserAccountForActions=Konto użytkownika używane do powiadamiania e-mailem o niektórych wydarzeniach Stripe (wypłaty Stripe) StripePayoutList=Lista wypłat Stripe @@ -69,3 +71,8 @@ ToOfferALinkForLiveWebhook=Łącze do konfiguracji Stripe WebHook w celu wywoła PaymentWillBeRecordedForNextPeriod=Płatność zostanie zarejestrowana za następny okres. ClickHereToTryAgain= Kliknij tutaj, aby spróbować ponownie ... CreationOfPaymentModeMustBeDoneFromStripeInterface=Ze względu na zasady silnego uwierzytelniania klienta, karta musi zostać utworzona z backoffice Stripe. Możesz kliknąć tutaj, aby włączyć rekord klienta Stripe: %s +STRIPE_CARD_PRESENT=Card Present for Stripe Terminals +TERMINAL_LOCATION=Location (address) for Stripe Terminals +RequestDirectDebitWithStripe=Request Direct Debit with Stripe +STRIPE_SEPA_DIRECT_DEBIT=Enable the Direct Debit payments through Stripe + diff --git a/htdocs/langs/pl_PL/ticket.lang b/htdocs/langs/pl_PL/ticket.lang index 7adef728a31..8cdbeb6c627 100644 --- a/htdocs/langs/pl_PL/ticket.lang +++ b/htdocs/langs/pl_PL/ticket.lang @@ -26,6 +26,7 @@ Permission56002=Modyfikuj bilety Permission56003=Usuwaj bilety Permission56004=Zarządzaj biletami Permission56005=Zobacz bilety wszystkich stron trzecich (nie dotyczy użytkowników zewnętrznych, zawsze ograniczaj się do strony trzeciej, od której są zależni) +Permission56006=Export tickets Tickets=Bilety TicketDictType=Bilet - Typ @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=Współpracownik zewnętrzny OriginEmail=E-mail reportera Notify_TICKET_SENTBYMAIL=Wyślij wiadomość e-mail z biletem +ExportDataset_ticket_1=Bilety + # Status Read=Czytać Assigned=Przydzielony diff --git a/htdocs/langs/pl_PL/users.lang b/htdocs/langs/pl_PL/users.lang index ca34b92052d..ec003f63610 100644 --- a/htdocs/langs/pl_PL/users.lang +++ b/htdocs/langs/pl_PL/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Link to user LinkedToDolibarrThirdParty=Link to third party CreateDolibarrLogin=Utwórz użytkownika CreateDolibarrThirdParty=Utwórz kontrahenta -LoginAccountDisableInDolibarr=Konto wyłączone w Dolibarr. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Użyj wartości osobowych ExportDataset_user_1=Użytkownicy i ich właściwości DomainUser=Domena użytkownika %s @@ -129,3 +130,6 @@ IPLastLogin=IP last login IPPreviousLogin=IP previous login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/pt_AO/companies.lang b/htdocs/langs/pt_AO/companies.lang new file mode 100644 index 00000000000..68a71bb368e --- /dev/null +++ b/htdocs/langs/pt_AO/companies.lang @@ -0,0 +1,3 @@ +# Dolibarr language file - Source file is en_US - companies +HasRelativeDiscountFromSupplier=You have a default discount of %s%% with this vendor +HasNoRelativeDiscountFromSupplier=No default relative discount with this vendor diff --git a/htdocs/langs/pt_AO/stripe.lang b/htdocs/langs/pt_AO/stripe.lang new file mode 100644 index 00000000000..14335fc610b --- /dev/null +++ b/htdocs/langs/pt_AO/stripe.lang @@ -0,0 +1,2 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails diff --git a/htdocs/langs/pt_BR/accountancy.lang b/htdocs/langs/pt_BR/accountancy.lang index d07989be671..e310bf86af9 100644 --- a/htdocs/langs/pt_BR/accountancy.lang +++ b/htdocs/langs/pt_BR/accountancy.lang @@ -10,7 +10,6 @@ Selectformat=Selecione o formato do arquivo ACCOUNTING_EXPORT_FORMAT=Selecione o formato do arquivo ACCOUNTING_EXPORT_ENDLINE=Selecione o tipo de retorno do frete ACCOUNTING_EXPORT_PREFIX_SPEC=Especifique o prefixo do nome do arquivo -DefaultForService=Padrão para serviço ProductForThisThirdparty=Produto para este terceiro ServiceForThisThirdparty=Serviço para este terceiro CantSuggest=Não posso sugerir @@ -56,7 +55,6 @@ SubledgerAccount=Conta Subledger SubledgerAccountLabel=Rótulo da conta de subconta ShowAccountingAccount=Mostrar conta contábil ShowAccountingJournal=Mostrar contabilidade -AccountAccountingSuggest=Sugerir Conta de Contabilidade MenuBankAccounts=Contas bancárias MenuVatAccounts=Contas de Impostos sobre valor agregado MenuLoanAccounts=Contas de empréstimos @@ -196,7 +194,6 @@ SaleLocal=Venda local SaleExport=Venda de exportação SaleEEC=Venda na CEE SaleEECWithVAT=A venda na CEE com um IVA não nulo; portanto, supomos que essa NÃO seja uma venda intracomunitária e a conta sugerida é a conta padrão do produto. -SaleEECWithoutVATNumber=Venda na CEE sem IVA, mas o ID do IVA de terceiros não está definido. Recorremos à conta do produto para vendas padrão. Você pode corrigir o ID do IVA de terceiros ou a conta do produto, se necessário. Range=Faixa da conta da Contabilidade ConfirmMassDeleteBookkeepingWriting=Confirmação exclusão em massa SomeMandatoryStepsOfSetupWereNotDone=Algumas etapas obrigatórias de configuração não foram feitas, preencha-as diff --git a/htdocs/langs/pt_BR/main.lang b/htdocs/langs/pt_BR/main.lang index 3f2e6fa8a94..d38b4871ea8 100644 --- a/htdocs/langs/pt_BR/main.lang +++ b/htdocs/langs/pt_BR/main.lang @@ -477,8 +477,6 @@ BackOffice=Fundo do escritório View=Visão Exports=Exportações IncludeDocsAlreadyExported=Incluir documentos já exportados -ExportOfPiecesAlreadyExportedIsEnable=A exportação de peças já exportadas está habilitada -ExportOfPiecesAlreadyExportedIsDisable=A exportação de peças já exportadas está desabilitada AllExportedMovementsWereRecordedAsExported=Todos as movimentações exportadas foram salvos como exportadas NotAllExportedMovementsCouldBeRecordedAsExported=Nem todos as movimentações exportadas puderam ser salvas como exportadas Miscellaneous=Variados diff --git a/htdocs/langs/pt_BR/stripe.lang b/htdocs/langs/pt_BR/stripe.lang index 84661452168..6a94248de2b 100644 --- a/htdocs/langs/pt_BR/stripe.lang +++ b/htdocs/langs/pt_BR/stripe.lang @@ -22,7 +22,7 @@ STRIPE_LIVE_SECRET_KEY=Chave ao vivo secreta STRIPE_LIVE_PUBLISHABLE_KEY=Chave editável StripeLiveEnabled=Boleto ativado (caso contrário teste / modo cx) StripeImportPayment=Importação de pagamentos de franquia -ExampleOfTestCreditCard=Exemplo de cartão de crédito para teste: %s => válido, %s => error CVC, %s => expired, %s => charge fails +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails StripeAccount=Conta Stripe StripeTransactionList=Lista de transações Stripe LocalID=ID local diff --git a/htdocs/langs/pt_BR/users.lang b/htdocs/langs/pt_BR/users.lang index 4c47e51f0bd..1bbf7404fed 100644 --- a/htdocs/langs/pt_BR/users.lang +++ b/htdocs/langs/pt_BR/users.lang @@ -39,7 +39,6 @@ CreateGroup=Criar grupo PasswordChangedAndSentTo=Senha alterada e enviada a %s. PasswordChangeRequest=Pedido para alterar a senha para %s PasswordChangeRequestSent=Solicitação para alterar a senha para %s enviada a %s. -IfLoginExistPasswordRequestSent=Se este login for uma conta válida, um e-mail para redefinir a senha foi enviado. IfEmailExistPasswordRequestSent=Se este e-mail for uma conta válida, um e-mail para redefinir a senha foi enviado. ConfirmPasswordReset=Confirmar restauração da senha MenuUsersAndGroups=Usuários e Grupos @@ -58,7 +57,6 @@ LinkedToDolibarrUser=Link para o usuário LinkedToDolibarrThirdParty=Link para terceiro CreateDolibarrLogin=Criar uma usuário CreateDolibarrThirdParty=Criar um fornecedor -LoginAccountDisableInDolibarr=A conta está desativada no Dolibarr ExportDataset_user_1=Usuários e suas propriedades DomainUser=Usuário de Domínio CreateInternalUserDesc=Este formulário permite que você crie um usuário interno em sua empresa / organização. Para criar um usuário externo (cliente, fornecedor, etc.), use o botão 'Criar usuário Dolibarr' do cartão de contato de terceiros. @@ -96,6 +94,7 @@ UserAccountancyCode=Código de contabilidade do usuário UserLogoff=Usuário desconetado UserLogged=Usuário Conectado DateOfEmployment=Data de emprego +DateEmploymentStart=Data de Início do Emprego DateEmploymentEnd=Data de término do emprego CantDisableYourself=Você não pode desativar seu próprio registro de usuário ForceUserExpenseValidator=Forçar validação do relatório de despesas @@ -104,3 +103,4 @@ ValidatorIsSupervisorByDefault=Por padrão, a validação é feita pelo supervis UserPersonalEmail=E-mail pessoal UserPersonalMobile=Celular pessoal WarningNotLangOfInterface=Atenção, este é o idioma principal do usuário, não o idioma da interface que ele escolheu ver. Para alterar o idioma da interface visível por este usuário, vá na guia %s +DateLastLogin=Data do último acesso diff --git a/htdocs/langs/pt_MZ/accountancy.lang b/htdocs/langs/pt_MZ/accountancy.lang index 3aee8edcbad..56cefc50397 100644 --- a/htdocs/langs/pt_MZ/accountancy.lang +++ b/htdocs/langs/pt_MZ/accountancy.lang @@ -10,7 +10,6 @@ Selectformat=Selecione o formato do arquivo ACCOUNTING_EXPORT_FORMAT=Selecione o formato do arquivo ACCOUNTING_EXPORT_ENDLINE=Selecione o tipo de retorno do frete ACCOUNTING_EXPORT_PREFIX_SPEC=Especifique o prefixo do nome do arquivo -DefaultForService=Padrão para serviço ProductForThisThirdparty=Produto para este terceiro ServiceForThisThirdparty=Serviço para este terceiro CantSuggest=Não posso sugerir @@ -56,7 +55,6 @@ SubledgerAccount=Conta Subledger SubledgerAccountLabel=Rótulo da conta de subconta ShowAccountingAccount=Mostrar conta contábil ShowAccountingJournal=Mostrar contabilidade -AccountAccountingSuggest=Sugerir Conta de Contabilidade MenuBankAccounts=Contas bancárias MenuVatAccounts=Contas de Impostos sobre valor agregado MenuLoanAccounts=Contas de empréstimos @@ -197,7 +195,6 @@ SaleLocal=Venda local SaleExport=Venda de exportação SaleEEC=Venda na CEE SaleEECWithVAT=A venda na CEE com um IVA não nulo; portanto, supomos que essa NÃO seja uma venda intracomunitária e a conta sugerida é a conta padrão do produto. -SaleEECWithoutVATNumber=Venda na CEE sem IVA, mas o ID do IVA de terceiros não está definido. Recorremos à conta do produto para vendas padrão. Você pode corrigir o ID do IVA de terceiros ou a conta do produto, se necessário. Range=Faixa da conta da Contabilidade ConfirmMassDeleteBookkeepingWriting=Confirmação exclusão em massa SomeMandatoryStepsOfSetupWereNotDone=Algumas etapas obrigatórias de configuração não foram feitas, preencha-as diff --git a/htdocs/langs/pt_MZ/main.lang b/htdocs/langs/pt_MZ/main.lang index 60e6ab46245..13b20a305eb 100644 --- a/htdocs/langs/pt_MZ/main.lang +++ b/htdocs/langs/pt_MZ/main.lang @@ -134,7 +134,6 @@ Recenter=Recolocar no centro User=Usuário Users=Usuário NoUserGroupDefined=Nenhum grupo definido pelo usuário -PasswordRetype=Repetir Senha NoteSomeFeaturesAreDisabled=Antenção, só poucos módulos/funcionalidade foram ativados nesta demo NameSlashCompany=Nome / Companhia PersonalValue=Valor Personalizado @@ -471,8 +470,6 @@ BackOffice=Fundo do escritório View=Visão Exports=Exportações IncludeDocsAlreadyExported=Incluir documentos já exportados -ExportOfPiecesAlreadyExportedIsEnable=A exportação de peças já exportadas está habilitada -ExportOfPiecesAlreadyExportedIsDisable=A exportação de peças já exportadas está desabilitada AllExportedMovementsWereRecordedAsExported=Todos as movimentações exportadas foram salvos como exportadas NotAllExportedMovementsCouldBeRecordedAsExported=Nem todos as movimentações exportadas puderam ser salvas como exportadas Miscellaneous=Variados @@ -575,3 +572,5 @@ DateOfBirth=Data de nascimento OnHold=Em espera ClientTZ=Fuso Horário do cliente (usuário) Terminate=Concluir +InternalUser=Usuário Interno +ExternalUser=Usuário Externo diff --git a/htdocs/langs/pt_MZ/stripe.lang b/htdocs/langs/pt_MZ/stripe.lang new file mode 100644 index 00000000000..14335fc610b --- /dev/null +++ b/htdocs/langs/pt_MZ/stripe.lang @@ -0,0 +1,2 @@ +# Dolibarr language file - Source file is en_US - stripe +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails diff --git a/htdocs/langs/pt_PT/accountancy.lang b/htdocs/langs/pt_PT/accountancy.lang index b66888e673e..c8e0c0f4c72 100644 --- a/htdocs/langs/pt_PT/accountancy.lang +++ b/htdocs/langs/pt_PT/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Selecione o tipo de retorno de carro ACCOUNTING_EXPORT_PREFIX_SPEC=Especifique o prefixo para o nome de ficheiro ThisService=Este serviço ThisProduct=Este produto -DefaultForService=Padrão para o serviço -DefaultForProduct=Padrão para o produto +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Product for this thirdparty ServiceForThisThirdparty=Service for this thirdparty CantSuggest=Não pode sugerir @@ -101,7 +101,8 @@ ShowAccountingAccount=Mostrar conta contabilística ShowAccountingJournal=Mostrar diário contabilistico ShowAccountingAccountInLedger=Show accounting account in ledger ShowAccountingAccountInJournals=Show accounting account in journals -AccountAccountingSuggest=Conta contabilística sugerida +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=Contas padrão MenuBankAccounts=Contas Bancárias MenuVatAccounts=Contas de IVA @@ -126,6 +127,7 @@ WriteBookKeeping=Record transactions in accounting Bookkeeping=Livro Razão BookkeepingSubAccount=Subledger AccountBalance=Saldo da conta +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Ref de objeto de origem CAHTF=Total purchase vendor before tax TotalExpenseReport=Relatório da despesa total @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=Journal label NumPiece=Número da peça TransactionNumShort=Núm. de transação AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Group by general ledger account GroupBySubAccountAccounting=Group by subledger account AccountingAccountGroupsDesc=Você pode definir aqui alguns grupos de conta contábil. Eles serão usados ​​para relatórios contábeis personalizados. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Show subtotal by level Pcgtype=Grupo de conta PcgtypeDesc=Group of account are used as predefined 'filter' and 'grouping' criteria for some accounting reports. For example, 'INCOME' or 'EXPENSE' are used as groups for accounting accounts of products to build the expense/income report. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Reconcilable @@ -294,6 +299,7 @@ DescValidateMovements=Any modification or deletion of writing, lettering and del ValidateHistory=Vincular automaticamente AutomaticBindingDone=Automatic bindings done (%s) - Automatic binding not possible for some record (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Disable binding & transfer in accountancy on ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Disable binding & transfer in accountancy on purchases (vendor invoices will not be taken into account in accounting) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Disable binding & transfer in accountancy on expense reports (expense reports will not be taken into account in accounting) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Flag exported lines as Exported (to modify a line, you will need to delete the whole transaction and re-transfert it into accounting) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=Date validation and lock ConfirmExportFile=Confirmation of the generation of the accounting export file ? ExportDraftJournal=Exportar o diário rascunho @@ -398,7 +406,7 @@ SaleLocal=Local sale SaleExport=Export sale SaleEEC=Sale in EEC SaleEECWithVAT=Sale in EEC with a VAT not null, so we suppose this is NOT an intracommunautary sale and the suggested account is the standard product account. -SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fallback on the product account for standard sales. You can fix the VAT ID of thirdparty or the product account if needed. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Forbidden: The transaction has been validated and/or exported. ForbiddenTransactionAlreadyValidated=Forbidden: The transaction has been validated. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Mismatch in reconcile code AccountancyErrorMismatchBalanceAmount=The balance (%s) is not equal to 0 AccountancyErrorLetteringBookkeeping=Errors have occurred concerning the transactions: %s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Entradas contábeis @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Multicurrency code (Idevise) DateExport=Date export WarningReportNotReliable=Atenção, este relatório não é baseado no Ledger, portanto, não contém transações modificadas manualmente no Ledger. Se a sua periodização estiver atualizada, a visão da contabilidade será mais precisa. ExpenseReportJournal=Diário de relatórios de despesas +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s accounts diff --git a/htdocs/langs/pt_PT/main.lang b/htdocs/langs/pt_PT/main.lang index cf05de9fc7e..36f1e6a4894 100644 --- a/htdocs/langs/pt_PT/main.lang +++ b/htdocs/langs/pt_PT/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=Nenhum grupo de utilizador definido Password=Senha PasswordRetype=Repeat your password NoteSomeFeaturesAreDisabled=Note que estão desativados muitos módulos/funções nesta demonstração. +YourUserFile=Your user file Name=Nome NameSlashCompany=Nome / Empresa Person=Pessoa @@ -897,6 +898,9 @@ MassFilesArea=Área para os ficheiros criados através de ações em massa ShowTempMassFilesArea=Mostrar área para os ficheiros criados através de ações em massa ConfirmMassDeletion=Confirmação de Múltiplas Eliminações ConfirmMassDeletionQuestion=Tem a certeza de que quer apagar os %s registo(s) seleccionado(s)? +ConfirmMassClone=Bulk clone confirmation +ConfirmMassCloneQuestion=Select project to clone to +ConfirmMassCloneToOneProject=Clone to project %s RelatedObjects=Objetos relacionados ClassifyBilled=Classificar como faturado ClassifyUnbilled=Classificar como não faturado @@ -912,8 +916,8 @@ ExportFilteredList=Exportar lista filtrada ExportList=Exportar lista ExportOptions=Opções de exportação IncludeDocsAlreadyExported=Os documentos incluídos já foram exportados -ExportOfPiecesAlreadyExportedIsEnable=A exportação de pedaços já exportados está activada -ExportOfPiecesAlreadyExportedIsDisable=A exportação de pedaços já exportados está desactivada. +ExportOfPiecesAlreadyExportedIsEnable=Documents already exported are visible and will be exported +ExportOfPiecesAlreadyExportedIsDisable=Documents already exported are hidden and won't be exported AllExportedMovementsWereRecordedAsExported=Todos os movimentos exportados foram marcados como exportados NotAllExportedMovementsCouldBeRecordedAsExported=Nem todos os movimentos exportados foram marcados como exportados Miscellaneous=Diversos @@ -1128,6 +1132,7 @@ DeleteFileText=Tem a certeza de que quer eliminar este ficheiro? ShowOtherLanguages=Mostrar outros idiomas SwitchInEditModeToAddTranslation=Mude para o modo de edição para adicionar traduções para este idioma NotUsedForThisCustomer=Não utilizado para este cliente +NotUsedForThisVendor=Not used for this vendor AmountMustBePositive=Total deve ser positivo ByStatus=Por estado InformationMessage=Informação @@ -1148,14 +1153,14 @@ EventReminder=Lembrete de evento UpdateForAllLines=Update for all lines OnHold=On hold Civility=Civility -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Set Supervisor +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor CreateExternalUser=Create external user ConfirmAffectTag=Bulk Tag Assignement ConfirmAffectUser=Bulk User Assignement -ProjectRole=Role assigned on each project -TasksRole=Role assigned on each task of each project +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ConfirmSetSupervisor=Bulk Supervisor Set ConfirmUpdatePrice=Choose a increase/decrease price rate ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Created from Public portal UserAgent=User Agent InternalUser=Utilizador interno ExternalUser=Utilizador externo +NoSpecificContactAddress=No specific contact or address +NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. +HideOnVCard=Hide %s +AddToContacts=Add address to my contacts +LastAccess=Last access +UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here +LastPasswordChangeDate=Last password change date diff --git a/htdocs/langs/pt_PT/ticket.lang b/htdocs/langs/pt_PT/ticket.lang index 64492af80b7..fa2991bdc0f 100644 --- a/htdocs/langs/pt_PT/ticket.lang +++ b/htdocs/langs/pt_PT/ticket.lang @@ -26,6 +26,7 @@ Permission56002=Modificar tickets Permission56003=Eliminar tickets Permission56004=Gerir tickets Permission56005=See tickets of all third parties (not effective for external users, always be limited to the third party they depend on) +Permission56006=Export tickets Tickets=Tickets TicketDictType=Ticket - Types @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=Colaborador externo OriginEmail=Reporter Email Notify_TICKET_SENTBYMAIL=Send ticket message by email +ExportDataset_ticket_1=Tickets + # Status Read=Ler Assigned=Atribuído diff --git a/htdocs/langs/pt_PT/users.lang b/htdocs/langs/pt_PT/users.lang index f09f2d94239..da670f226f7 100644 --- a/htdocs/langs/pt_PT/users.lang +++ b/htdocs/langs/pt_PT/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Link to user LinkedToDolibarrThirdParty=Link to third party CreateDolibarrLogin=Criar um Utilizador CreateDolibarrThirdParty=Criar um Terceiro -LoginAccountDisableInDolibarr=A conta está desativada no Dolibarr. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Utilizar valores personalizados ExportDataset_user_1=Users and their properties DomainUser=Utilizador de Domínio %s @@ -129,3 +130,6 @@ IPLastLogin=IP last login IPPreviousLogin=IP previous login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/ro_RO/accountancy.lang b/htdocs/langs/ro_RO/accountancy.lang index 90cb7896f1f..cb7df2b80e1 100644 --- a/htdocs/langs/ro_RO/accountancy.lang +++ b/htdocs/langs/ro_RO/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Selectați tipul de linie nouă ACCOUNTING_EXPORT_PREFIX_SPEC=Specificati prefixul pentru numele fisierului ThisService=Acest serviciu ThisProduct=Acest produs -DefaultForService=Implicit pentru serviciu -DefaultForProduct=Implicit pentru produs +DefaultForService=Implicit pentru servicii +DefaultForProduct=Implicit pentru produse ProductForThisThirdparty=Produs pentru acest terţ ServiceForThisThirdparty=Serviciu pentru acest terţ CantSuggest=Nu pot sugera @@ -101,7 +101,8 @@ ShowAccountingAccount=Afișați contul contabil ShowAccountingJournal=Afişare jurnal contabil ShowAccountingAccountInLedger=Afişare cont contabil în registrul jurnal ShowAccountingAccountInJournals=Afişează conturile contabile în jurnale -AccountAccountingSuggest=Conturi contabile sugerate +DataUsedToSuggestAccount=Date utilizate pentru sugerarea unui cont +AccountAccountingSuggest=Cont sugerat MenuDefaultAccounts=Conturi implicite MenuBankAccounts=Conturi bancare MenuVatAccounts=Conturi de TVA @@ -126,6 +127,7 @@ WriteBookKeeping=Înregistrează tranzacţiile în contabilitate Bookkeeping=Registru jurnal BookkeepingSubAccount=Registru jurnal secundar AccountBalance=Sold cont +AccountBalanceSubAccount=Balanță conturi analitice ObjectsRef=Referinţă obiect sursă CAHTF=Total achiziţii de la furnizor înainte de taxare TotalExpenseReport=Total deconturi de cheltuieli @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Contul contabil (din Planul de Conturi) va f UseAuxiliaryAccountOnCustomerDeposit=Stochează contul de client ca și cont contabil individual în registrul subsidiar pentru liniile de avans (dacă este dezactivat, contul individual pentru liniile de avans va rămâne gol) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Contul contabil (din Planul de Conturi) care va fi folosit în mod implicit UseAuxiliaryAccountOnSupplierDeposit=Stocare cont furnizor ca și cont individual în registrul subsidiar pentru liniile de avans (dacă este dezactivat, contul individual pentru liniile de avans va rămâne gol)  +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Cont contabil implicit pentru înregistrarea garanției reținute de la client ACCOUNTING_PRODUCT_BUY_ACCOUNT=Cont contabil (din Planul de Conturi) care va fi utilizat ca și cont implicit pentru produsele achiziționate din aceeași țară (utilizat dacă nu este definit în fișa de produs) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Cont contabil (din Planul de Conturi) care va fi utilizat ca și cont implicit pentru produsele achiziționate din CEE către o altă țară CEE (utilizat dacă nu este definit în fișa de produs) @@ -218,6 +221,7 @@ JournalLabel=Eticheta jurnalului NumPiece=Număr notă contabilă TransactionNumShort=Nr. tranzacţie AccountingCategory=Grupă personalizată de conturi +AccountingCategories=Grupă personalizată de conturi GroupByAccountAccounting=Grupare după cont din registrul jurnal GroupBySubAccountAccounting=Grupare după cont de jurnal secundar AccountingAccountGroupsDesc=Puteți defini aici câteva grupe de conturi contabile. Acestea vor fi utilizate pentru rapoarte contabile personalizate. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Afișează subtotalul după nivel Pcgtype=Grupă de conturi PcgtypeDesc=Grupele de conturi sunt utilizate ca criterii predefinite de 'filtrare' și 'grupare' pentru unele rapoarte contabile. De exemplu, 'VENITURI' sau 'CHELTUIELI' sunt utilizate ca grupe pentru conturile contabile ale produselor pentru a construi raportul de cheltuieli/venituri. +AccountingCategoriesDesc=Grupa personalizată de conturi poate fi utilizată pentru a grupa conturile contabile sub un singur nume, pentru a ușura utilizarea filtrului sau crearea de rapoarte personalizate. Reconcilable=Compensabil @@ -294,6 +299,7 @@ DescValidateMovements= Orice modificare sau ștergere a înregistrărilor va fi ValidateHistory=Asociază automat AutomaticBindingDone=Asicierea automată a fost efectuată (%s) - Asocierea automată nu este posibilă pentru unele înregistrări (%s) +DoManualBindingForFailedRecord=Trebuie să faci o asociere manuală pentru lin(iile) %s care nu sunt legate automat. ErrorAccountancyCodeIsAlreadyUse=Eroare, nu poți elimina sau dezactiva acest cont contabil pentru că este utilizat MvtNotCorrectlyBalanced=Mișcarea nu este echilibrată corect. Debit = %s & Credit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Dezactivați legarea și transferul în cont ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Dezactivați legarea și transferul în contabilitate pentru achiziții (facturile furnizor nu vor fi luate în considerare în contabilitate) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Dezactivați legarea și transferul în contabilitate pentru rapoartele de cheltuieli (rapoartele de cheltuieli nu vor fi luate în considerare în contabilitate) ACCOUNTING_ENABLE_LETTERING=Activare funcție de numerotare în contabilitate +ACCOUNTING_ENABLE_AUTOLETTERING=Activare numerotare automată la transferul în contabilitate ## Export NotExportLettering=Nu exporta numerotările atunci când se generează fișierul NotifiedExportDate=Marcare linii exportate ca Exportate (pentru a modifica o linie, va trebui să ștergi întreaga tranzacție și să o retransferi în contabilitate) NotifiedValidationDate=Validare și blocare intrări exportate (același efect ca și caracteristica "%s", modificarea și ștergerea liniilor NU vor mai fi posibile) +NotifiedExportFull=Export documente ? DateValidationAndLock=Dată de validare şi blocare ConfirmExportFile=Confirmare generare fișier de export contabil? ExportDraftJournal=Export jurnal schiţă @@ -398,7 +406,7 @@ SaleLocal=Vânzare locală SaleExport=Vânzare la export SaleEEC=Vânzări în CEE SaleEECWithVAT=Vânzarea în CEE cu cota TVA diferită de zero, deci presupunem că aceasta NU este o vânzare intracomunitară, iar contul contabil este cel standard al produsului. -SaleEECWithoutVATNumber=Vânzare în CEE fără TVA, dar codul TVA al terțului nu este definit. Se va utiliza contul contabil de produs pentru vânzările standard. Completaţi codul de TVA al terțului sau contul contabil aferent produsului. +SaleEECWithoutVATNumber=Vânzare în CEE fără TVA, dar codul de TVA al terților nu este definit. Revenim la contul vânzărilor standard. Poți remedia codul de TVA al terțului sau poți modifica contul de produs sugerat pentru asociere, dacă este necesar. ForbiddenTransactionAlreadyExported=Interzis: Tranzacţia a fost validată şi/sau exportată. ForbiddenTransactionAlreadyValidated=Interzis: Tranzacţia a fost validată. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Nepotrivire cod de reconciliere AccountancyErrorMismatchBalanceAmount=Soldul (%s) nu este egal cu 0 AccountancyErrorLetteringBookkeeping=Au apărut erori cu privire la tranzacții: %s ErrorAccountNumberAlreadyExists=Numărul de cont contabil %s există deja +ErrorArchiveAddFile=Nu se poate adăuga fișierul "%s" în arhivă ## Import ImportAccountingEntries=Intrări contabile @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Cod multi-monedă (Idevise) DateExport=Dată export WarningReportNotReliable=Atenție, acest raport nu se bazează pe registrul jurnal contabil, deci nu conține o tranzacție modificată manual în registrul contabil. Dacă jurnalele sunt actualizate, vizualizarea contabilă este mai precisă. ExpenseReportJournal=Jurnalul raportului de cheltuieli +DocsAlreadyExportedAreExcluded=Documentele deja exportate sunt excluse +ClickToHideAlreadyExportedLines=Clic pentru a ascunde liniile deja exportate NAccounts=%s conturi diff --git a/htdocs/langs/ro_RO/admin.lang b/htdocs/langs/ro_RO/admin.lang index 176a71551dd..4d36c0d27c3 100644 --- a/htdocs/langs/ro_RO/admin.lang +++ b/htdocs/langs/ro_RO/admin.lang @@ -645,6 +645,8 @@ Module2300Name=Joburi de sistem programate Module2300Desc=Gestionarea planificată a joburilor de sistem (alias cron sau chrono) Module2400Name=Evenimente/Agendă Module2400Desc=Urmăriți evenimentele. Înregistrați evenimente automate sau manual pentru a nota activităţi sau întâlniri. Acesta este modulul principal pentru o bună gestionare a relațiilor cu clienții sau furnizorii. +Module2430Name=Sistem calendar de rezervări +Module2430Desc=Furnizează un calendar online pentru a permite oricui să rezerve întâlniri, conform intervalelor sau disponibilităților predefinite. Module2500Name=DMS / ECM Module2500Desc=Sistemul de management al documentelor / Gestiunea conținutului electronic. Organizarea automată a documentelor tale generate sau stocate. Le poţi partaja dacă este necesar. Module2600Name=API / Servicii web (Server SOAP) @@ -660,6 +662,8 @@ Module2900Name=GeoIPMaxmind Module2900Desc=Capabilităţi de conversie GeoIP Maxmind Module3200Name=Jurnale Nealterabile Module3200Desc=Activează un jurnal inalterabil al evenimentelor de afaceri. Evenimentele sunt arhivate în timp real. Jurnalul este o tabelă cu functie doar de citire a evenimentelor în lanț care pot fi exportate. Acest modul poate fi obligatoriu pentru unele țări. +Module3300Name=Dezvoltator de module +Module3200Desc=Activează un jurnal inalterabil al evenimentelor de afaceri. Evenimentele sunt arhivate în timp real. Jurnalul este o tabelă cu functie doar de citire a evenimentelor în lanț care pot fi exportate. Acest modul poate fi obligatoriu pentru unele țări. Module3400Name=Reţele sociale Module3400Desc=Activați câmpurile Rețele sociale la terți și adrese (skype, twitter, facebook, ...). Module4000Name=HRM @@ -1270,6 +1274,7 @@ TriggerActiveAsModuleActive=Trigger-ele din acest fişier sunt active pe măsur GeneratedPasswordDesc=Alegeți metoda care va fi utilizată pentru parolele auto-generate. DictionaryDesc=Introduceți toate datele de referință. Poţii adăuga valorile tale la valorile implicite. ConstDesc=Această pagină vă permite să editați (să suprascrieţi) parametrii care nu sunt disponibili în alte pagini. Aceștia sunt în mare parte parametri rezervați doar pentru dezvoltatori/soluționare avansată a problemelor. +MiscellaneousOptions=Opțiuni diverse MiscellaneousDesc=Toți ceilalți parametri legați de securitate sunt definiți aici. LimitsSetup=Limite/Precizii LimitsDesc=Puteți defini limite, precizii şi optimizări utilizate de sistem aici @@ -1826,6 +1831,9 @@ AGENDA_USE_EVENT_TYPE=Utilizați tipuri de evenimente (gestionate în menu Setă AGENDA_USE_EVENT_TYPE_DEFAULT=Setează automat această valoare implicită pentru tipul de eveniment în formularul de creare a evenimentului AGENDA_DEFAULT_FILTER_TYPE=Puneți automat acest tip de eveniment în filtrul de căutare al vizualizării agendei AGENDA_DEFAULT_FILTER_STATUS=Puneți automat această stare pentru evenimentele din filtrul de căutare din vizualizarea agendei +AGENDA_EVENT_PAST_COLOR=Culoarea evenimentului trecut +AGENDA_EVENT_CURRENT_COLOR=Culoarea evenimentului curent +AGENDA_EVENT_FUTURE_COLOR=Culoarea evenimentului viitor AGENDA_DEFAULT_VIEW=Ce vizualizare doriți să deschideți implicit atunci când selectați meniul Agenda AGENDA_REMINDER_BROWSER=Activați memento-uri evenimente în browserul utilizatorului (Când este atinsă data de reamintire, browserul afișează un popup. Fiecare utilizator poate dezactiva astfel de notificări din configurarea sa de notificări browser). AGENDA_REMINDER_BROWSER_SOUND=Activați notificarea sonoră @@ -2129,6 +2137,7 @@ CodeLastResult=Ultimul cod rezultat NbOfEmailsInInbox=Numărul de email-uri în directorul sursă LoadThirdPartyFromName=Încărcați un terţ căutând în %s (doar încărcare) LoadThirdPartyFromNameOrCreate=Încărcați un terţ căutând în %s (creare dacă nu este găsit) +LoadContactFromEmailOrCreate=Încărcare contact căutând în %s (creare dacă nu este găsit) AttachJoinedDocumentsToObject=Salvare fișiere atașate în documente obiect dacă o referință a unui obiect este găsită în subiectul email-ului. WithDolTrackingID=Mesaj dintr-o conversație inițiată de un prim e-mail trimis de la sistem WithoutDolTrackingID=Mesaj dintr-o conversație inițiată de un prim e-mail NU trimis din sistem @@ -2355,3 +2364,5 @@ AllowExternalDownload=Permite descărcarea externă (fără autentificare, folos DeadlineDayVATSubmission=Ziua limită pentru depunerea TVA în luna următoare MaxNumberOfAttachementOnForms=Numărul maxim de fișiere unite într-un formular IfDefinedUseAValueBeetween=Dacă este definită, utilizează o valoare între %s și %s +Reload=Reîncărcare +ConfirmReload=Confirmare reîncărcare modul diff --git a/htdocs/langs/ro_RO/boxes.lang b/htdocs/langs/ro_RO/boxes.lang index efcbad031b6..2a0166e3f9a 100644 --- a/htdocs/langs/ro_RO/boxes.lang +++ b/htdocs/langs/ro_RO/boxes.lang @@ -24,6 +24,7 @@ BoxFicheInter=Ultimele intervenţii BoxCurrentAccounts=Sold conturi deschise BoxTitleMemberNextBirthdays=Aniversări în această lună (membri) BoxTitleMembersByType=Membri după tip şi status +BoxTitleMembersByTags=Membri după tag-uri și status BoxTitleMembersSubscriptionsByYear=Adeziuni membri după an BoxTitleLastRssInfos=Ultimele %s noutăţi de la %s BoxTitleLastProducts=Produse/Servicii: ultimele %s modificate diff --git a/htdocs/langs/ro_RO/companies.lang b/htdocs/langs/ro_RO/companies.lang index 765ee3631d5..0bf5f8b932d 100644 --- a/htdocs/langs/ro_RO/companies.lang +++ b/htdocs/langs/ro_RO/companies.lang @@ -312,12 +312,12 @@ CustomerRelativeDiscountShort=Discount relativ CustomerAbsoluteDiscountShort=Discount absolut CompanyHasRelativeDiscount=Acest client are un discount de %s%% CompanyHasNoRelativeDiscount=Acest client nu are nici un discount relativ implicit -HasRelativeDiscountFromSupplier=Aveți un discount implicit de %s%% de la acest furnizor -HasNoRelativeDiscountFromSupplier=Nu aveți nici un discount relativ implicit de la acest furnizor +HasRelativeDiscountFromSupplier=Aveți o reducere implicită de %s%% de la acest furnizor +HasNoRelativeDiscountFromSupplier=Niciun discount relativ implicit la acest furnizor  CompanyHasAbsoluteDiscount=Acest client are discount-uri disponibile (note de credit sau plăți în avans) pentru %s %s CompanyHasDownPaymentOrCommercialDiscount=Acest client are discount-uri disponibile (comerciale, plăți în avans) pentru %s %s CompanyHasCreditNote=Acest client are încă note de credit pentru %s %s -HasNoAbsoluteDiscountFromSupplier=Nu aveți credit disponibil de discount de la acest furnizor +HasNoAbsoluteDiscountFromSupplier=Nu există reduceri/credite disponibile de la acest furnizor HasAbsoluteDiscountFromSupplier=Aveți discount-uri disponibile (note de credit sau plăți în avans) pentru %s %s de la acest furnizor HasDownPaymentOrCommercialDiscountFromSupplier=Aveți discount-uri disponibile (comerciale, plăți în avans) pentru %s %s de la acest furnizor HasCreditNoteFromSupplier=Aveți note de credit pentru %s %s de la acest furnizor @@ -444,7 +444,7 @@ AddAddress=Adaugă adresă SupplierCategory=Categorie furnizor JuridicalStatus200=Freelancer DeleteFile=Şterge fişier -ConfirmDeleteFile=Sigur doriţi să ştergeţi acest fişier? +ConfirmDeleteFile=Sigur vrei să ștergi acest fișier %s? AllocateCommercial=Asociat la reprezentant vânzări Organization=Organizaţie FiscalYearInformation=An fiscal @@ -498,3 +498,8 @@ RestOfEurope=Restul Europei (CEE) OutOfEurope=În afara Europei (CEE) CurrentOutstandingBillLate=Factura curentă restantă este întârziată BecarefullChangeThirdpartyBeforeAddProductToInvoice=Aveți grijă, în funcție de setările de preț ale produsului, ar trebui să schimbați terțul înainte de a adăuga produsul la POS. +EmailAlreadyExistsPleaseRewriteYourCompanyName=e-mailul există deja, vă rugăm să rescrieți numele companiei dvs +TwoRecordsOfCompanyName=există mai mult de o înregistrare pentru această companie, contactați-ne pentru a finaliza solicitarea ta de parteneriat +CompanySection=Secțiune companie +ShowSocialNetworks=Afișează rețele sociale +HideSocialNetworks=Ascunde rețele sociale diff --git a/htdocs/langs/ro_RO/errors.lang b/htdocs/langs/ro_RO/errors.lang index 48ed91acc81..3ffcfd9637d 100644 --- a/htdocs/langs/ro_RO/errors.lang +++ b/htdocs/langs/ro_RO/errors.lang @@ -303,6 +303,7 @@ ErrorValueForTooLow=Valoarea pentru %s este prea mică ErrorValueCantBeNull=Valoarea pentru %s nu poate fi nulă ErrorDateOfMovementLowerThanDateOfFileTransmission=Data tranzacției bancare nu poate fi anterioară datei de transmitere a fișierului ErrorTooMuchFileInForm=Prea multe fișiere în formular, numărul maxim de fișier(e) este %s +ErrorSessionInvalidatedAfterPasswordChange=Sesiunea a fost invalidată în urma unei modificări a parolei, a stării sau a datelor de valabilitate. Reconectează-te. # Warnings WarningParamUploadMaxFileSizeHigherThanPostMaxSize=Parametrul tău PHP upload_max_filesize (%s) este mai mare decât paramentrul PHP post_max_size (%s). Aceasta nu este o configuraţie consistentă. @@ -325,6 +326,7 @@ WarningPaymentDateLowerThanInvoiceDate=Data plăţii(%s) este anterioară datei WarningTooManyDataPleaseUseMoreFilters= Prea multe date (mai mult de %s linii). Folosiți mai multe filtre sau setați constanta %s la o limită superioară. WarningSomeLinesWithNullHourlyRate=Unele perioade de timp consumat au fost înregistrate de unii utilizatori care nu aveau tariful orar definit. A fost utilizată valoarea 0 %s pe oră, dar acest lucru poate duce la o evaluare financiară greșită a timpului consumat. WarningYourLoginWasModifiedPleaseLogin=Utilizatorul-ul a fost modificat. Din motive de securitate, va trebui să vă conectați cu noul dvs. utilizator înainte de următoarea acțiune. +WarningYourPasswordWasModifiedPleaseLogin=Parola ta a fost modificată. Din motive de securitate, va trebui să te autentifici acum cu noua parolă. WarningAnEntryAlreadyExistForTransKey=Există deja o intrare pe cheia de traducere pentru această limbă WarningNumberOfRecipientIsRestrictedInMassAction=Avertisment, numărul de destinatari diferiţi este limitat la %s când se utilizează acțiunile de masă din liste WarningDateOfLineMustBeInExpenseReportRange=Atenţie, data liniei nu este în intervalul raportului de cheltuieli diff --git a/htdocs/langs/ro_RO/eventorganization.lang b/htdocs/langs/ro_RO/eventorganization.lang index 652129e1eed..f97feca5b70 100644 --- a/htdocs/langs/ro_RO/eventorganization.lang +++ b/htdocs/langs/ro_RO/eventorganization.lang @@ -172,3 +172,5 @@ ErrorSeveralCompaniesWithEmailContactUs=Au fost găsite mai multe companii cu ac ErrorSeveralCompaniesWithNameContactUs=Au fost găsite mai multe companii cu acest nume, nu putem valida automat înregistrarea dumneavoastră. Vă rugăm să ne contactați la %s pentru o validare manuală NoPublicActionsAllowedForThisEvent=Nu sunt acțiuni publice deschise pentru acest eveniment MaxNbOfAttendees=Număr maxim de participanți +DateStartEvent=Dată start eveniment +DateEndEvent=Dată sfârșit eveniment diff --git a/htdocs/langs/ro_RO/main.lang b/htdocs/langs/ro_RO/main.lang index bb39633e547..cb697ae5b02 100644 --- a/htdocs/langs/ro_RO/main.lang +++ b/htdocs/langs/ro_RO/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=Niciun grup de utilizatori definit Password=Parola PasswordRetype=Repetare parolă NoteSomeFeaturesAreDisabled=Atenţie, o mulţime de funcţionalităţi/module sunt dezactivate în această instanţă demonstrativă. +YourUserFile=Fișierul tău de utilizator Name=Nume NameSlashCompany=Nume/Companie Person=Persoană @@ -897,6 +898,9 @@ MassFilesArea=Zona pentru fişiere generate prin acţiuni în masă ShowTempMassFilesArea=Afişează zona pentru fişiere generate prin acţiuni în masă ConfirmMassDeletion=Confirmare ştergere în bloc ConfirmMassDeletionQuestion=Sigur doriți să ștergeți %s înregistrările(înregistrarea) selectate? +ConfirmMassClone=Confirmare clonare în masă +ConfirmMassCloneQuestion=Selectează proiectul în care să clonezi +ConfirmMassCloneToOneProject=Clonare la proiectul %s RelatedObjects=Obiecte asociate ClassifyBilled=Clasează facturată ClassifyUnbilled=Clasează nefacturată @@ -912,8 +916,8 @@ ExportFilteredList=Export listă filtrată ExportList=Export listă ExportOptions=Opţiuni export IncludeDocsAlreadyExported=Include documentele deja exportate -ExportOfPiecesAlreadyExportedIsEnable=Exportul elementelor deja exportate este activat -ExportOfPiecesAlreadyExportedIsDisable=Exportul elementelor deja exportate este dezactivat +ExportOfPiecesAlreadyExportedIsEnable=Documentele deja exportate sunt vizibile și vor fi exportate +ExportOfPiecesAlreadyExportedIsDisable=Documentele deja exportate sunt ascunse și nu vor fi exportate AllExportedMovementsWereRecordedAsExported=Toate mişcările exportate au fost înegistrate ca exportate NotAllExportedMovementsCouldBeRecordedAsExported=Nu toate mişcările exportate au putut fi înregistrate ca exportate Miscellaneous=Diverse @@ -1128,6 +1132,7 @@ DeleteFileText=Eşti sigur că vrei să ştergi acest fişier? ShowOtherLanguages=Afişare alte limbi SwitchInEditModeToAddTranslation=Comută în modul editare pentru a adăuga traduceri pentru această limbă NotUsedForThisCustomer=Neutilizat pentru acest client +NotUsedForThisVendor=Nu este folosit pentru acest furnizor AmountMustBePositive=Suma trebuie să fie pozitivă ByStatus=După status InformationMessage=Informaţie @@ -1148,14 +1153,14 @@ EventReminder=Memento eveniment UpdateForAllLines=Actualizare pentru toate liniile OnHold=În aşteptare Civility=Formulă de adresare -AffectTag=Asignare Tag -AffectUser=Asignare utilizator +AffectTag=Asignare tag +AffectUser=Atribuie un utilizator SetSupervisor=Setare supervizor CreateExternalUser=Creare utilizator extern ConfirmAffectTag=Atribuire Tag în masă ConfirmAffectUser=Asignare utilizator în masă -ProjectRole=Rol atribuit pe fiecare proiect -TasksRole=Rol atribuit pentru fiecare task al fiecărui proiect +ProjectRole=Rol atribuit pentru fiecare proiect/oportunitate +TasksRole= Rol atribuit fiecărui task (dacă este utilizat) ConfirmSetSupervisor=Setare supervizor în masă ConfirmUpdatePrice=Alege un procent de creștere/scădere a prețului ConfirmAffectTagQuestion=Sigur vrei să atribui tag-urile înregistrăr(ilor) selectate %s ? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Creat din Portalul public UserAgent=User Agent InternalUser=Utilizator intern ExternalUser=Utilizator extern +NoSpecificContactAddress=Fără contact sau adresă specificată +NoSpecificContactAddressBis=Această filă este dedicată pentru a forța anumite contacte sau adrese pentru obiectul curent. Utilizează numai dacă dorești să definești unul sau mai multe contacte sau adrese specifice pentru obiect atunci când informațiile despre terț nu sunt suficiente sau nu sunt exacte. +HideOnVCard=Ascunde %s +AddToContacts=Adaugă adresă la contactele mele +LastAccess=Ultima accesare +UploadAnImageToSeeAPhotoHere=Încarcă o imagine din fila %s pentru a vedea o fotografie aici +LastPasswordChangeDate= Data ultimei modificări a parolei diff --git a/htdocs/langs/ro_RO/mrp.lang b/htdocs/langs/ro_RO/mrp.lang index e188236cbcc..e268c9f7540 100644 --- a/htdocs/langs/ro_RO/mrp.lang +++ b/htdocs/langs/ro_RO/mrp.lang @@ -102,6 +102,7 @@ NbOperatorsRequired=Nr. de operatori necesar THMOperatorEstimated=Total ore minute estimat per operator THMMachineEstimated=Total ore minute estimat per maşină WorkstationType=Tip staţie de lucru +DefaultWorkstation=Stație de lucru implicită Human=Personal uman Machine=Maşină HumanMachine=Personal / Maşină diff --git a/htdocs/langs/ro_RO/orders.lang b/htdocs/langs/ro_RO/orders.lang index 3931bfaec96..d9dfbd0559c 100644 --- a/htdocs/langs/ro_RO/orders.lang +++ b/htdocs/langs/ro_RO/orders.lang @@ -96,6 +96,10 @@ OrdersStatisticsSuppliers=Statistici privind comenzile de achiziție NumberOfOrdersByMonth=Număr comenzi pe luni AmountOfOrdersByMonthHT=Suma comenzilor pe lună (fără taxe) ListOfOrders=Listă comenzi +ListOrderLigne=Linii de comadă +productobuy=Doar produse de vânzare +productonly=Doar produse +disablelinefree=Fără linii cu text liber CloseOrder=Închidere comandă ConfirmCloseOrder=Sigur doriți să setați această comandă pentru a fi livrată? Odată ce o comandă este livrată, ea poate fi setată ca facturabilă. ConfirmDeleteOrder=Sigur doriți să ștergeți această comandă? @@ -131,6 +135,7 @@ SupplierOrderClassifiedBilled=Comanda de achiziţie %s a fost setată ca factura OtherOrders=Alte comenzi SupplierOrderValidatedAndApproved=Comanda de achiziţie este validată şi aprobată : %s SupplierOrderValidated=Comanda de achiziţie este validată : %s +OrderShowDetail=Afișare detalii comandă ##### Types de contacts ##### TypeContact_commande_internal_SALESREPFOLL=Reprezentant urmărire comandă de vânzări TypeContact_commande_internal_SHIPPING=Responsabil urmărire livrare comandă client @@ -199,3 +204,5 @@ StatusSupplierOrderApproved=Aprobat StatusSupplierOrderRefused=Refuzat StatusSupplierOrderReceivedPartially=Parţial recepţionată StatusSupplierOrderReceivedAll=Toate produsele primite +NeedAtLeastOneInvoice = Trebuie să existe cel puțin o factură +LineAlreadyDispatched = Linia de comandă este deja primită. diff --git a/htdocs/langs/ro_RO/stripe.lang b/htdocs/langs/ro_RO/stripe.lang index 6c4bca336c9..2132a4768cf 100644 --- a/htdocs/langs/ro_RO/stripe.lang +++ b/htdocs/langs/ro_RO/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Cheie live Webhook ONLINE_PAYMENT_WAREHOUSE=Stoc de utilizat pentru scădere atunci când se efectuează plata online
    (TODO Când opțiunea de a reduce stocul se face printr-o acțiune pe factură, iar plata online generează factura?) StripeLiveEnabled=Stripe live activat (altfel test/modul sandbox) StripeImportPayment=Import plată Stripe -ExampleOfTestCreditCard=Exemplu de card de credit pentru test: %s=> valid,%s => eroare CVC, %s=> expirat, %s=> retragere eşuată +ExampleOfTestCreditCard=Exemplu de card de credit pentru testul SEPA: %s => valid, %s => eroare CVC, %s => expirat, %s => taxare eșuată +ExampleOfTestBankAcountForSEPA=Exemplu de cont bancar BAN pentru testul de debit direct: %s StripeGateways=Gateway-uri Stripe OAUTH_STRIPE_TEST_ID=ID-ul de conectare Stripe a clientului (ca _...) OAUTH_STRIPE_LIVE_ID=ID-ul de conectare Stripe a clientului (ca _...) @@ -61,6 +62,7 @@ DeleteACard=Șterge cardul ConfirmDeleteCard=Sigur doriți să ștergeți acest card de credit sau de debit? CreateCustomerOnStripe=Creați un client pe Stripe CreateCardOnStripe=Creați un card pe Stripe +CreateBANOnStripe=Creare cont bancar în Stripe ShowInStripe=Arată în Stripe StripeUserAccountForActions=Cont utilizator pe care să îl utilizați pentru notificarea prin email a anumitor evenimente Stripe (plăți Stripe) StripePayoutList=Listă de plăți Stripe @@ -69,4 +71,8 @@ ToOfferALinkForLiveWebhook=Link de configurare Stripe WebHook pentru a apel IPN PaymentWillBeRecordedForNextPeriod=Plata va fi înregistrată pentru perioada următoare. ClickHereToTryAgain=Clic aici pentru a încerca din nou... CreationOfPaymentModeMustBeDoneFromStripeInterface=Datorită regulilor de autentificare securizată a clienților, crearea unui card trebuie făcută din backoffice-ul Stripe. Puteți face clic aici pentru a activa înregistrarea clienților Stripe: %s -TERMINAL_LOCATION=Locație (adresă) pentru terminale +STRIPE_CARD_PRESENT=Card prezent pentru terminalele Stripe +TERMINAL_LOCATION=Locația (adresa) pentru Stripe Terminals +RequestDirectDebitWithStripe=Ordin de debitare directă cu Stripe +STRIPE_SEPA_DIRECT_DEBIT=Activare plăți prin debit direct prin Stripe + diff --git a/htdocs/langs/ro_RO/ticket.lang b/htdocs/langs/ro_RO/ticket.lang index 47c8377219d..0acad8b4e16 100644 --- a/htdocs/langs/ro_RO/ticket.lang +++ b/htdocs/langs/ro_RO/ticket.lang @@ -26,6 +26,7 @@ Permission56002=Modifică tichete Permission56003=Șterge tichete Permission56004=Gestionați tichetele Permission56005=Vedeți tichetele tuturor terților (nu este efectiv pentru utilizatorii externi, întotdeauna se limitează la terțul de care depind) +Permission56006=Export tichete Tickets=Tichete de suport TicketDictType=Tipuri de tichete @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=Contributor extern OriginEmail=Email raportor Notify_TICKET_SENTBYMAIL=Trimite mesaj tichet pe email +ExportDataset_ticket_1=Tichete de suport + # Status Read=Citit Assigned=Atribuit diff --git a/htdocs/langs/ro_RO/users.lang b/htdocs/langs/ro_RO/users.lang index 32422bcf97c..e6334179bfd 100644 --- a/htdocs/langs/ro_RO/users.lang +++ b/htdocs/langs/ro_RO/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Asociere la utilizator LinkedToDolibarrThirdParty=Asociere la terţ CreateDolibarrLogin=Creare utilizator CreateDolibarrThirdParty=Creare terţ -LoginAccountDisableInDolibarr=Cont dezactivat în sistem. +LoginAccountDisableInDolibarr=Cont dezactivat în Dolibarr +PASSWORDInDolibarr=Parolă modificată în Dolibarr UsePersonalValue=Utilizare setări personalizate ExportDataset_user_1=Utilizatori și proprietățile acestora DomainUser=Utilizator de domeniu %s @@ -129,3 +130,6 @@ IPLastLogin=IP ultima autentificare IPPreviousLogin=IP autentificare anterioară ShowAllPerms=Afișează toate rândurile de permisiuni HideAllPerms=Ascunde toate rândurile de permisiuni +UserPublicPageDesc=Poți activa un card virtual pentru acest utilizator. O adresă URL cu profilul utilizatorului și un cod de bare vor fi disponibile pentru a permite oricui are un smartphone să îl scaneze și să adauge persoana de contact în agenda sa. +EnablePublicVirtualCard=Activare publică card virtual de utilizator +PublicVirtualCardUrl=Card virtual public de utilizator diff --git a/htdocs/langs/ru_RU/accountancy.lang b/htdocs/langs/ru_RU/accountancy.lang index 8de02a36f59..4bc65b27e17 100644 --- a/htdocs/langs/ru_RU/accountancy.lang +++ b/htdocs/langs/ru_RU/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Выберите тип возврата каретк ACCOUNTING_EXPORT_PREFIX_SPEC=Укажите префикс для имени файла ThisService=Эта услуга ThisProduct=Этот продукт -DefaultForService=По умолчанию для услуги -DefaultForProduct=По умолчанию для товара +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Продукт для этой третьей стороны ServiceForThisThirdparty=Сервис для этой третьей стороны CantSuggest=Не могу предложить @@ -101,7 +101,8 @@ ShowAccountingAccount=Показать учетную запись ShowAccountingJournal=Показать бухгалтерский журнал ShowAccountingAccountInLedger=Показать счет в бухгалтерской книге ShowAccountingAccountInJournals=Показать учетную запись в журналах -AccountAccountingSuggest=Учетный счет +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=Учетные записи по умолчанию MenuBankAccounts=Банковские счета MenuVatAccounts=Счета НДС @@ -126,6 +127,7 @@ WriteBookKeeping=Зафиксировать операции в бухгалте Bookkeeping=Бухгалтерская книга BookkeepingSubAccount=Вспомогательная книга AccountBalance=Баланс +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Ссылка на исходный объект CAHTF=Итого закупка продавца до налогообложения TotalExpenseReport=Отчет об общих расходах @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=Этикетка журнала NumPiece=Количество штук TransactionNumShort=№ проводки AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Группировать по счету главной книги GroupBySubAccountAccounting=Группировка по счету вспомогательной книги AccountingAccountGroupsDesc=Здесь вы можете определить несколько групп бухгалтерского учета. Они будут использоваться для персонализированной бухгалтерской отчетности. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Показать промежуточный итог по у Pcgtype=Группа счетов PcgtypeDesc=Группа счетов используется в качестве предопределенных критериев «фильтра» и «группировки» для некоторых бухгалтерских отчетов. Например, «ДОХОД» или «РАСХОДЫ» используются в качестве групп для бухгалтерских счетов продуктов для построения отчета о расходах/доходах. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Примиримый @@ -294,6 +299,7 @@ DescValidateMovements=Любое изменение или удаление на ValidateHistory=Связывать автоматически AutomaticBindingDone=Выполнено автоматическое связывание (%s) — автоматическое связывание невозможно для некоторых записей (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Движение неправильно сбалансировано. Дебет = %s и кредит = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Отключить привязку и пе ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Отключить привязку и перенос в бухгалтерии по закупкам (счета поставщика не будут учитываться в бухгалтерии) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Отключить привязку и перенос в бухгалтерском учете в отчетах о расходах (отчеты о расходах не будут учитываться в бухгалтерском учете) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Отметить экспортированные строки как Экспортированные (чтобы изменить строку, вам нужно будет удалить всю транзакцию и заново перенести ее в учет) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=Проверка даты и блокировка ConfirmExportFile=Подтверждение генерации файла экспорта бухгалтерского учета? ExportDraftJournal=Экспорт черновика журнала @@ -398,7 +406,7 @@ SaleLocal=Местная продажа SaleExport=Продажа на экспорт SaleEEC=Продажа в ЕЭС SaleEECWithVAT=Продажа в ЕЭС с ненулевым НДС, поэтому мы предполагаем, что это НЕ внутриобщинная продажа, а предлагаемая учетная запись является стандартной учетной записью продукта. -SaleEECWithoutVATNumber=Продажа в ЕЭС без НДС, но идентификатор плательщика НДС третьей стороны не определен. Мы возвращаемся к учетной записи продукта для стандартных продаж. При необходимости вы можете исправить идентификатор плательщика НДС третьей стороны или учетную запись продукта. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Запрещено: транзакция проверена и/или экспортирована. ForbiddenTransactionAlreadyValidated=Запрещено: Транзакция подтверждена. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Несоответствие в коде со AccountancyErrorMismatchBalanceAmount=Баланс (%s) не равен 0 AccountancyErrorLetteringBookkeeping=Произошли ошибки, связанные с транзакциями: %s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Бухгалтерские записи @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Мультивалютный код (Idevise) DateExport=Дата экспорта WarningReportNotReliable=Предупреждение, этот отчет не основан на главной книге, поэтому не содержит проводки, измененных вручную в главной книге. Если ваша журнализация актуальна, бухгалтерский учет будет более точным. ExpenseReportJournal=Журнал отчетов о затратах +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s счета diff --git a/htdocs/langs/ru_RU/main.lang b/htdocs/langs/ru_RU/main.lang index 07f6556f3d8..38fa6c53ff8 100644 --- a/htdocs/langs/ru_RU/main.lang +++ b/htdocs/langs/ru_RU/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=Не задана группа для пользовател Password=Пароль PasswordRetype=Repeat your password NoteSomeFeaturesAreDisabled=Обратите внимание, что многие функции/модули отключены в этой демонстрации. +YourUserFile=Your user file Name=Имя NameSlashCompany=Имя / Компания Person=Персона @@ -897,6 +898,9 @@ MassFilesArea=Пространство для пакетных действий ShowTempMassFilesArea=Показать область для пакетных действий с файлами ConfirmMassDeletion=Подтверждение пакетного удаления ConfirmMassDeletionQuestion=Вы уверены, что хотите удалить %s выбранных записей? +ConfirmMassClone=Bulk clone confirmation +ConfirmMassCloneQuestion=Select project to clone to +ConfirmMassCloneToOneProject=Clone to project %s RelatedObjects=Связанные объекты ClassifyBilled=Классифицировать выставленные счета ClassifyUnbilled=Классифицировать невыполненные счета @@ -912,8 +916,8 @@ ExportFilteredList=Экспорт отфильтрованного списка ExportList=Экспорт списка ExportOptions=Настройки экспорта IncludeDocsAlreadyExported=Включенные документы уже экспортированы -ExportOfPiecesAlreadyExportedIsEnable=Экспорт уже экспортированных частей включен -ExportOfPiecesAlreadyExportedIsDisable=Экспорт уже экспортированных частей отключен +ExportOfPiecesAlreadyExportedIsEnable=Documents already exported are visible and will be exported +ExportOfPiecesAlreadyExportedIsDisable=Documents already exported are hidden and won't be exported AllExportedMovementsWereRecordedAsExported=Все экспортированные движения были зарегистрированы как экспортировано NotAllExportedMovementsCouldBeRecordedAsExported=Не все экспортированные движения могут быть зарегистрированы как экспортировано Miscellaneous=Разное @@ -1128,6 +1132,7 @@ DeleteFileText=Вы действительно хотите удалить эт ShowOtherLanguages=Показать другие языки SwitchInEditModeToAddTranslation=Переключитесь в режим редактирования, чтобы добавить переводы для этого языка NotUsedForThisCustomer=Не используется для этого клиента +NotUsedForThisVendor=Not used for this vendor AmountMustBePositive=Сумма должна быть положительной ByStatus=По статусу InformationMessage=Информация @@ -1148,14 +1153,14 @@ EventReminder=Напоминание о мероприятии UpdateForAllLines=Обновление для всех линий OnHold=На удерживании Civility=Вежливость -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Set Supervisor +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor CreateExternalUser=Создать внешнего пользователя ConfirmAffectTag=Bulk Tag Assignement ConfirmAffectUser=Bulk User Assignement -ProjectRole=Role assigned on each project -TasksRole=Role assigned on each task of each project +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ConfirmSetSupervisor=Bulk Supervisor Set ConfirmUpdatePrice=Choose a increase/decrease price rate ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Created from Public portal UserAgent=User Agent InternalUser=Внутренний пользователь ExternalUser=Внешний пользователь +NoSpecificContactAddress=No specific contact or address +NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. +HideOnVCard=Hide %s +AddToContacts=Add address to my contacts +LastAccess=Last access +UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here +LastPasswordChangeDate=Last password change date diff --git a/htdocs/langs/ru_RU/stripe.lang b/htdocs/langs/ru_RU/stripe.lang index 25db139165e..2b40f0c165e 100644 --- a/htdocs/langs/ru_RU/stripe.lang +++ b/htdocs/langs/ru_RU/stripe.lang @@ -1,6 +1,6 @@ # Dolibarr language file - Source file is en_US - stripe StripeSetup=Настройка модуля Stripe -StripeDesc=Offer your customers an online payment page for payments with credit/debit cards via Stripe. This can be used to allow your customers to make ad-hoc payments or for payments related to a particular Dolibarr object (invoice, order, ...) +StripeDesc=Предложите своим клиентам страницу онлайн-платежей для платежей кредитными/дебетовыми картами через Stripe . Это можно использовать, чтобы позволить вашим клиентам совершать разовые платежи или платежи, связанные с конкретным объектом Dolibarr (счет, заказ, ...) StripeOrCBDoPayment=Оплата кредитной картой или Stripe FollowingUrlAreAvailableToMakePayments=После URL, можно предложить страницу к клиенту сделать платеж по Dolibarr объектов PaymentForm=Форма оплаты @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Живой ключ Webhook ONLINE_PAYMENT_WAREHOUSE=Запасы, используемые для уменьшения запасов при онлайн-оплате
    (TODO Когда опция уменьшения запасов выполняется для действия со счетом-фактурой, и онлайн-платеж генерирует счет-фактуру самостоятельно?) StripeLiveEnabled=Полоса в реальном времени включена (в противном случае тестовый режим / режим песочницы) StripeImportPayment=Платежи Import Stripe -ExampleOfTestCreditCard=Пример кредитной карты для тестирования: %s => действителен, %s => ошибка CVC, %s => истек срок действия, %s => заряд не производится +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +ExampleOfTestBankAcountForSEPA=Example of bank account BAN for direct debit test: %s StripeGateways=Stripe-шлюзы OAUTH_STRIPE_TEST_ID=Идентификатор клиента Stripe Connect (ca _...) OAUTH_STRIPE_LIVE_ID=Идентификатор клиента Stripe Connect (ca _...) @@ -61,6 +62,7 @@ DeleteACard=Удалить карту ConfirmDeleteCard=Вы действительно хотите удалить эту кредитную или дебетовую карту? CreateCustomerOnStripe=Создать клиента на Stripe CreateCardOnStripe=Создать карту на Stripe +CreateBANOnStripe=Create bank on Stripe ShowInStripe=Показать в полосе StripeUserAccountForActions=Учетная запись пользователя, используемая для уведомления по электронной почте о некоторых событиях Stripe (выплаты Stripe) StripePayoutList=Список выплат Stripe @@ -69,3 +71,8 @@ ToOfferALinkForLiveWebhook=Ссылка на настройку Stripe WebHook PaymentWillBeRecordedForNextPeriod=Выплата будет записана за следующий период. ClickHereToTryAgain= Нажмите здесь, чтобы попробовать еще раз ... CreationOfPaymentModeMustBeDoneFromStripeInterface=Из-за правил строгой аутентификации клиентов создание карты должно производиться из бэк-офиса Stripe. Вы можете щелкнуть здесь, чтобы включить запись клиента Stripe: %s +STRIPE_CARD_PRESENT=Card Present for Stripe Terminals +TERMINAL_LOCATION=Location (address) for Stripe Terminals +RequestDirectDebitWithStripe=Request Direct Debit with Stripe +STRIPE_SEPA_DIRECT_DEBIT=Enable the Direct Debit payments through Stripe + diff --git a/htdocs/langs/ru_RU/ticket.lang b/htdocs/langs/ru_RU/ticket.lang index 2f50e52ba40..6cc771a9a6f 100644 --- a/htdocs/langs/ru_RU/ticket.lang +++ b/htdocs/langs/ru_RU/ticket.lang @@ -26,6 +26,7 @@ Permission56002=Изменить тикеты Permission56003=Удалить тикеты Permission56004=Управлять тикетами Permission56005=Просмотр тикетов всех третьих лиц (не действует для внешних пользователей, всегда ограничивается третьей стороной, от которой они зависят) +Permission56006=Export tickets Tickets=Тикеты TicketDictType=Тикет - Типы @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=Внешний участник OriginEmail=Электронная почта репортера Notify_TICKET_SENTBYMAIL=Отправить сообщение тикета по электронной почте +ExportDataset_ticket_1=Тикеты + # Status Read=Читать Assigned=Ответственный diff --git a/htdocs/langs/ru_RU/users.lang b/htdocs/langs/ru_RU/users.lang index 9e824aa31b2..964f1b2f05f 100644 --- a/htdocs/langs/ru_RU/users.lang +++ b/htdocs/langs/ru_RU/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Ссылка на пользователя LinkedToDolibarrThirdParty=Ссылка на третью сторону CreateDolibarrLogin=Создать аккаунт Dolibarr CreateDolibarrThirdParty=Создание третьей стороной -LoginAccountDisableInDolibarr=Счет-инвалидов в Dolibarr. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Использовать личные предпочтения ExportDataset_user_1=Пользователи и их свойства DomainUser=Домен пользователя %s @@ -129,3 +130,6 @@ IPLastLogin=IP последний логин IPPreviousLogin=IP предыдущий логин ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/sk_SK/accountancy.lang b/htdocs/langs/sk_SK/accountancy.lang index 82c7e55e81d..0a075099ae0 100644 --- a/htdocs/langs/sk_SK/accountancy.lang +++ b/htdocs/langs/sk_SK/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Select the carriage return type ACCOUNTING_EXPORT_PREFIX_SPEC=Zadajte predponu pre názov súboru ThisService=This service ThisProduct=This product -DefaultForService=Default for service -DefaultForProduct=Default for product +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Product for this thirdparty ServiceForThisThirdparty=Service for this thirdparty CantSuggest=Can't suggest @@ -101,7 +101,8 @@ ShowAccountingAccount=Show accounting account ShowAccountingJournal=Show accounting journal ShowAccountingAccountInLedger=Show accounting account in ledger ShowAccountingAccountInJournals=Show accounting account in journals -AccountAccountingSuggest=Účtovný účet bol navrhnutý +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=Predvolené účty MenuBankAccounts=Bankové účty MenuVatAccounts=Vat accounts @@ -126,6 +127,7 @@ WriteBookKeeping=Record transactions in accounting Bookkeeping=Hlavná kniha BookkeepingSubAccount=Subledger AccountBalance=Stav účtu +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Source object ref CAHTF=Total purchase vendor before tax TotalExpenseReport=Total expense report @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=Journal label NumPiece=Číslo kusu TransactionNumShort=Num. transakcie AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Group by general ledger account GroupBySubAccountAccounting=Group by subledger account AccountingAccountGroupsDesc=You can define here some groups of accounting account. They will be used for personalized accounting reports. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Show subtotal by level Pcgtype=Group of account PcgtypeDesc=Group of account are used as predefined 'filter' and 'grouping' criteria for some accounting reports. For example, 'INCOME' or 'EXPENSE' are used as groups for accounting accounts of products to build the expense/income report. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Reconcilable @@ -294,6 +299,7 @@ DescValidateMovements=Any modification or deletion of writing, lettering and del ValidateHistory=Priradzovať automaticky AutomaticBindingDone=Automatic bindings done (%s) - Automatic binding not possible for some record (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Disable binding & transfer in accountancy on ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Disable binding & transfer in accountancy on purchases (vendor invoices will not be taken into account in accounting) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Disable binding & transfer in accountancy on expense reports (expense reports will not be taken into account in accounting) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Flag exported lines as Exported (to modify a line, you will need to delete the whole transaction and re-transfert it into accounting) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=Date validation and lock ConfirmExportFile=Confirmation of the generation of the accounting export file ? ExportDraftJournal=Export draft journal @@ -398,7 +406,7 @@ SaleLocal=Local sale SaleExport=Export sale SaleEEC=Sale in EEC SaleEECWithVAT=Sale in EEC with a VAT not null, so we suppose this is NOT an intracommunautary sale and the suggested account is the standard product account. -SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fallback on the product account for standard sales. You can fix the VAT ID of thirdparty or the product account if needed. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Forbidden: The transaction has been validated and/or exported. ForbiddenTransactionAlreadyValidated=Forbidden: The transaction has been validated. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Mismatch in reconcile code AccountancyErrorMismatchBalanceAmount=The balance (%s) is not equal to 0 AccountancyErrorLetteringBookkeeping=Errors have occurred concerning the transactions: %s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Accounting entries @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Multicurrency code (Idevise) DateExport=Date export WarningReportNotReliable=Warning, this report is not based on the Ledger, so does not contains transaction modified manually in the Ledger. If your journalization is up to date, the bookkeeping view is more accurate. ExpenseReportJournal=Expense Report Journal +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s accounts diff --git a/htdocs/langs/sk_SK/users.lang b/htdocs/langs/sk_SK/users.lang index 6b89df8d1de..4cef7513e36 100644 --- a/htdocs/langs/sk_SK/users.lang +++ b/htdocs/langs/sk_SK/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Link to user LinkedToDolibarrThirdParty=Link to third party CreateDolibarrLogin=Vytvoriť používateľa CreateDolibarrThirdParty=Vytvorte tretiu stranu -LoginAccountDisableInDolibarr=Účet bol zakázaný v Dolibarr. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Používajte osobnú hodnotu ExportDataset_user_1=Users and their properties DomainUser=Užívateľ domény %s @@ -129,3 +130,6 @@ IPLastLogin=IP last login IPPreviousLogin=IP previous login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/sl_SI/accountancy.lang b/htdocs/langs/sl_SI/accountancy.lang index b49f317d976..ad90ac9c932 100644 --- a/htdocs/langs/sl_SI/accountancy.lang +++ b/htdocs/langs/sl_SI/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Izberite vrsto vrnitve v začetek ACCOUNTING_EXPORT_PREFIX_SPEC=Specify the prefix for the file name ThisService=Ta storitev ThisProduct=Ta izdelek -DefaultForService=Privzeto za storitev -DefaultForProduct=Privzeto za izdelek +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Izdelek za tega partnerja ServiceForThisThirdparty=Storitev za tega partnerja CantSuggest=Ne morem predlagati @@ -101,7 +101,8 @@ ShowAccountingAccount=Pokaži računovodski račun ShowAccountingJournal=Prikaži knjigovodski dnevnik ShowAccountingAccountInLedger=Pokaži računovodski račun v knjigi ShowAccountingAccountInJournals=Pokaži računovodski račun v dnevnikih -AccountAccountingSuggest=Priporočen računovodski račun +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=Privzeti računi MenuBankAccounts=Bančni računi MenuVatAccounts=DDV računi @@ -126,6 +127,7 @@ WriteBookKeeping=Evidentirajte transakcije v računovodstvu Bookkeeping=Ledger BookkeepingSubAccount=Podknjiga AccountBalance=Stanje na računu +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Izvorni objekt ref CAHTF=Skupni nakup pred obdavčitvijo TotalExpenseReport=Poročilo o skupnih stroških @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Shranjevanje računa stranke kot posameznega računa v pomožni knjigi za vrstice predplačil (če je onemogočeno, bo posamezni račun za vrstice predplačil ostal prazen) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Shranite račun dobavitelja kot posamezni račun v pomožni knjigi za vrstice predplačil (če je onemogočeno, bo posamezni račun za vrstice predplačil ostal prazen) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=Oznaka dnevnika NumPiece=Številka kosa TransactionNumShort=št. transakcija AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Združi po kontu glavne knjige GroupBySubAccountAccounting=Združi po kontu podknjižbe AccountingAccountGroupsDesc=Tu lahko določite nekaj skupin računovodskih kontov. Uporabljali se bodo za personalizirana računovodska poročila. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Prikaži vmesni seštevek po stopnjah Pcgtype=Skupina računov PcgtypeDesc=Skupine kontov se uporabljajo kot vnaprej določena merila 'filtra' in 'združevanja' za nekatera računovodska poročila. Na primer, 'PRIHODEK' ali 'STROŠEK' se uporabljata kot skupini za računovodske račune izdelkov za izdelavo poročila o stroških/prihodkih. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Spravljivo @@ -294,6 +299,7 @@ DescValidateMovements=Prepovedano je kakršno koli spreminjanje ali brisanje zap ValidateHistory=Samodejno vezanje AutomaticBindingDone=Samodejne vezave opravljene (%s) - Samodejna vezava ni mogoča za nekatere zapise (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Gibanje ni pravilno uravnoteženo. Debet = %s & kredit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Onemogočanje vezave in prenosa v računovod ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Onemogočanje vezave in prenosa v računovodstvu pri nakupih (računi dobaviteljev se ne bodo upoštevali v računovodstvu) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Onemogoči vezavo in prenos v računovodstvu na poročilih o stroških (poročila o stroških ne bodo upoštevana v računovodstvu) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Označi izvožene vrstice kot izvožene (če želite spremeniti vrstico, boste morali izbrisati celotno transakcijo in jo znova prenesti v računovodstvo) NotifiedValidationDate=Potrdi in zakleni izvožene vnose (isti učinek kot funkcija "%s", spreminjanje in brisanje vrstic DEFINITIVNO ne bo mogoče) +NotifiedExportFull=Export documents ? DateValidationAndLock=Preverjanje datuma in zaklepanje ConfirmExportFile=Potrditev generiranja računovodske izvozne datoteke? ExportDraftJournal=Izvozi osnutek dnevnika @@ -398,7 +406,7 @@ SaleLocal=Lokalna prodaja SaleExport=Izvozna prodaja SaleEEC=Prodaja v EGS SaleEECWithVAT=Prodaja v EGS z DDV ni ničelna, zato predpostavljamo, da to NI prodaja znotraj skupnosti in da je predlagani račun standardni račun izdelka. -SaleEECWithoutVATNumber=Prodaja v EGS brez DDV, vendar ID za DDV partnerja ni opredeljen. Za standardno prodajo uporabljamo nadomestni račun izdelka. Po potrebi lahko popravite ID za DDV partnerja ali račun izdelka. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Prepovedano: transakcija je bila potrjena in/ali izvožena. ForbiddenTransactionAlreadyValidated=Prepovedano: transakcija je bila potrjena. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Neujemanje v kodi za usklajevanje AccountancyErrorMismatchBalanceAmount=Stanje (%s) ni enako 0 AccountancyErrorLetteringBookkeeping=Prišlo je do napak v zvezi s transakcijami: %s ErrorAccountNumberAlreadyExists=Knjigovodska številka %s že obstaja +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Računovodske knjižbe @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Koda za več valut (Idevise) DateExport=Izvoz datuma WarningReportNotReliable=Opozorilo, to poročilo ne temelji na knjigi, zato ne vsebuje transakcij, ki so bile ročno spremenjene v knjigi. Če je vaša dnevnika ažurna, je knjigovodski pogled natančnejši. ExpenseReportJournal=Dnevnik poročil o stroških +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=računi %s diff --git a/htdocs/langs/sl_SI/companies.lang b/htdocs/langs/sl_SI/companies.lang index f3f446280b3..2f09375b50f 100644 --- a/htdocs/langs/sl_SI/companies.lang +++ b/htdocs/langs/sl_SI/companies.lang @@ -1,112 +1,112 @@ # Dolibarr language file - Source file is en_US - companies -ErrorCompanyNameAlreadyExists=Ime podjetja %s že obstaja. Izberite drugačno ime. +ErrorCompanyNameAlreadyExists=Naziv podjetja %s že obstaja. Izberite drug naziv. ErrorSetACountryFirst=Najprej izberite državo SelectThirdParty=Izberite partnerja -ConfirmDeleteCompany=Are you sure you want to delete this company and all related information? -DeleteContact=Izbrišite kontakt -ConfirmDeleteContact=Are you sure you want to delete this contact and all related information? -MenuNewThirdParty=New Third Party -MenuNewCustomer=New Customer -MenuNewProspect=New Prospect -MenuNewSupplier=New Vendor -MenuNewPrivateIndividual=Nov posameznik -NewCompany=New company (prospect, customer, vendor) -NewThirdParty=New Third Party (prospect, customer, vendor) -CreateDolibarrThirdPartySupplier=Create a third party (vendor) +ConfirmDeleteCompany=Ali ste prepričani, da želite izbrisati podjetje in vse povezane informacije? +DeleteContact=Izbrišite stik +ConfirmDeleteContact=Ali ste prepričani, da želite izbrisati stik in vse povezane informacije? +MenuNewThirdParty=Nov partner +MenuNewCustomer=Nov kupec +MenuNewProspect=Nov potencialni kupec +MenuNewSupplier=Nov dobavitelj +MenuNewPrivateIndividual=Nova fizična oseba +NewCompany=Novo podjetje (potencialni kupec, kupec, dobavitelj) +NewThirdParty=Nov partner (potencialni kupec, kupec, dobavitelj) +CreateDolibarrThirdPartySupplier=Ustvari partnerja (dobavitelj) CreateThirdPartyOnly=Ustvari partnerja -CreateThirdPartyAndContact=Create a third party + a child contact -ProspectionArea=Področje možnih strank -IdThirdParty=ID partnerja -IdCompany=ID podjetja -IdContact=ID kontakta -ThirdPartyAddress=Third-party address -ThirdPartyContacts=Third-party contacts -ThirdPartyContact=Third-party contact/address +CreateThirdPartyAndContact=Ustvarite partnerja + pripadajoč stik +ProspectionArea=Potencialni kupci +IdThirdParty=Partner ID +IdCompany=Podjetje ID +IdContact=Stik ID +ThirdPartyAddress=Naslov partnerja +ThirdPartyContacts=Stiki +ThirdPartyContact=Stik Company=Podjetje -CompanyName=Ime podjetja -AliasNames=Drugo ime (komercialno, blagovna znamka, ...) -AliasNameShort=Alias Name +CompanyName=Naziv podjetja +AliasNames=Vzdevek (skrajšan naziv, blagovna znamka, ...) +AliasNameShort=Vzdevek naziv Companies=Podjetja -CountryIsInEEC=Country is inside the European Economic Community -PriceFormatInCurrentLanguage=Price display format in the current language and currency -ThirdPartyName=Third-party name -ThirdPartyEmail=Third-party email -ThirdParty=Third-party -ThirdParties=Third-parties -ThirdPartyProspects=Možne stranke -ThirdPartyProspectsStats=Možne stranke +CountryIsInEEC=Država je znotraj Evropske gospodarske skupnosti +PriceFormatInCurrentLanguage=Prikazana cene v trenutnem jeziku in valuti +ThirdPartyName=Naziv +ThirdPartyEmail=E-pošta +ThirdParty=Partner +ThirdParties=Partnerji +ThirdPartyProspects=Potencialni kupci +ThirdPartyProspectsStats=Potencialni kupci ThirdPartyCustomers=Kupci ThirdPartyCustomersStats=Kupci ThirdPartyCustomersWithIdProf12=Kupci z %s ali %s -ThirdPartySuppliers=Vendors -ThirdPartyType=Third-party type -Individual=Posameznik -ToCreateContactWithSameName=Will automatically create a contact/address with same information as the third party under the third party. In most cases, even if your third party is a physical person, creating a third party alone is enough. -ParentCompany=Lastniško podjetje +ThirdPartySuppliers=Dobavitelji +ThirdPartyType=Vrsta partnerja +Individual=Fizična oseba +ToCreateContactWithSameName=Samodejno bo ustvaril stik/naslov z enakimi informacijami kot nadrejeni partner. V večini primerov, tudi če je partner fizična oseba, zadostuje samo ustvarjanje partnerja. +ParentCompany=Nadrejeno podjetje Subsidiaries=Podružnice -ReportByMonth=Report per month -ReportByCustomers=Report per customer -ReportByThirdparties=Report per thirdparty -ReportByQuarter=Report per rate +ReportByMonth=Poročilo - mesec +ReportByCustomers=Poročilo - kupci +ReportByThirdparties=Poročilo - partnerji +ReportByQuarter=Poročilo - tečajnica CivilityCode=Vljudnostni naziv RegisteredOffice=Registrirana poslovalnica Lastname=Priimek Firstname=Ime -RefEmployee=Employee reference -NationalRegistrationNumber=National registration number -PostOrFunction=Job position +RefEmployee=Referenca zaposlenega +NationalRegistrationNumber=Državna registrska številka +PostOrFunction=Delovno mesto UserTitle=Naziv -NatureOfThirdParty=Nature of Third party -NatureOfContact=Nature of Contact +NatureOfThirdParty=Narava partnerja +NatureOfContact=Narava stika Address=Naslov State=Dežela/Provinca -StateId=State ID -StateCode=State/Province code +StateId=Osebna izkaznica +StateCode=Koda države StateShort=Država Region=Regija -Region-State=Region - State +Region-State=Regija - Država Country=Država CountryCode=Koda države -CountryId=Country ID +CountryId=Država ID Phone=Telefon PhoneShort=Telefon Skype=Skype Call=Kliči Chat=Klepetaj -PhonePro=Bus. phone +PhonePro=Poslovni telefon PhonePerso=Osebni telefon PhoneMobile=Mobilni telefon -No_Email=Refuse bulk emailings +No_Email=Zavrnite množično pošiljanje e-pošte Fax=Faks Zip=Poštna številka Town=Mesto Web=Spletna stran Poste= Položaj -DefaultLang=Default language -VATIsUsed=Sales tax used -VATIsUsedWhenSelling=This defines if this third party includes a sales tax or not when it makes an invoice to its own customers -VATIsNotUsed=Sales tax is not used -CopyAddressFromSoc=Copy address from third-party details -ThirdpartyNotCustomerNotSupplierSoNoRef=Third party neither customer nor vendor, no available referring objects -ThirdpartyIsNeitherCustomerNorClientSoCannotHaveDiscounts=Third party neither customer nor vendor, discounts are not available -PaymentBankAccount=Payment bank account +DefaultLang=Privzeti jezik +VATIsUsed=Davčni zavezanec +VATIsUsedWhenSelling=Davčni zavezanec na računu +VATIsNotUsed=Ni davčni zavezanec +CopyAddressFromSoc=Kopiraj naslov iz podatkov partnerja +ThirdpartyNotCustomerNotSupplierSoNoRef=Partner ni opredeljen kot kupec ali dobavitelj, ni razpoložljivih informacij +ThirdpartyIsNeitherCustomerNorClientSoCannotHaveDiscounts=Partner ni opredeljen kot kupec ali dobavitelj, popusti niso na voljo +PaymentBankAccount=Plačilni bančni račun OverAllProposals=Ponudbe OverAllOrders=Naročila OverAllInvoices=Računi -OverAllSupplierProposals=Price requests +OverAllSupplierProposals=Zahteve po ceni ##### Local Taxes ##### -LocalTax1IsUsed=Uporabi drugi davek +LocalTax1IsUsed=Znižana davčna stopnja LocalTax1IsUsedES= RE je uporabljen LocalTax1IsNotUsedES= RE ni uporabljen -LocalTax2IsUsed=Uporabi tretji davek +LocalTax2IsUsed=Alternativni davek LocalTax2IsUsedES= IRPF je uporabljen LocalTax2IsNotUsedES= IRPF ni uporabljen -WrongCustomerCode=Napačna koda kupca -WrongSupplierCode=Vendor code invalid +WrongCustomerCode=Neveljavna koda kupca +WrongSupplierCode=Neveljavna koda dobavitelja CustomerCodeModel=Model kode kupca -SupplierCodeModel=Vendor code model +SupplierCodeModel=Model kode dobavitelja Gencod=Črtna koda -GencodBuyPrice=Barcode of price ref +GencodBuyPrice=Črtna koda za referenčne cene ##### Professional ID ##### ProfId1Short=Mat. št. ProfId2Short=Reg. sodišče @@ -130,7 +130,7 @@ ProfId1AT=Prof Id 1 (USt.-IdNr) ProfId2AT=Prof Id 2 (USt.-Nr) ProfId3AT=Prof Id 3 (Handelsregister-Nr.) ProfId4AT=- -ProfId5AT=EORI number +ProfId5AT=številko EORI ProfId6AT=- ProfId1AU=Prof Id 1 (ABN) ProfId2AU=- @@ -142,19 +142,19 @@ ProfId1BE=Prof Id 1 (Professional number) ProfId2BE=- ProfId3BE=- ProfId4BE=- -ProfId5BE=EORI number +ProfId5BE=Številka EORI ProfId6BE=- ProfId1BR=- ProfId2BR=IE() -ProfId3BR=IM() +ProfId3BR=OB(Občina) ProfId4BR=CPF #ProfId5BR=CNAE #ProfId6BR=INSS -ProfId1CH=UID-Nummer +ProfId1CH=UID-Številka ProfId2CH=- ProfId3CH=Prof Id 1 (Federal number) ProfId4CH=Prof Id 2 (Commercial Record number) -ProfId5CH=EORI number +ProfId5CH=Številka EORI ProfId6CH=- ProfId1CL== ProfId2CL== @@ -162,16 +162,16 @@ ProfId3CL== ProfId4CL== ProfId5CL== ProfId6CL=- -ProfId1CM=Id. prof. 1 (Trade Register) -ProfId2CM=Id. prof. 2 (Taxpayer No.) -ProfId3CM=Id. prof. 3 (No. of creation decree) -ProfId4CM=Id. prof. 4 (Deposit certificate No.) -ProfId5CM=Id. prof. 5 (Others) +ProfId1CM=Id. prof. 1 (poslovni register) +ProfId2CM=Id. prof. 2 (Št. zavezanca) +ProfId3CM=Id. prof. 3 (št. odloka o ustanovitvi) +ProfId4CM=Id. prof. 4 (potrdilo o vlogi št.) +ProfId5CM=Id. prof. 5 (drugo) ProfId6CM=- -ProfId1ShortCM=Trade Register -ProfId2ShortCM=Taxpayer No. -ProfId3ShortCM=No. of creation decree -ProfId4ShortCM=Deposit certificate No. +ProfId1ShortCM=Trgovski register +ProfId2ShortCM=ID za DDV +ProfId3ShortCM=Št. odloka o ustanovitvi +ProfId4ShortCM=Potrdilo o depozitu št. ProfId5ShortCM=Ostali ProfId6ShortCM=- ProfId1CO== @@ -184,21 +184,21 @@ ProfId1DE=Prof Id 1 (USt.-IdNr) ProfId2DE=Prof Id 2 (USt.-Nr) ProfId3DE=Prof Id 3 (Handelsregister-Nr.) ProfId4DE=- -ProfId5DE=EORI number +ProfId5DE=številko EORI ProfId6DE=- ProfId1ES=(CNAE) ProfId2ES=(Social security number) ProfId3ES=(IAE) ProfId4ES=(Collegiate number) -ProfId5ES=Prof Id 5 (EORI number) +ProfId5ES=Prof Id 5 (številka EORI) ProfId6ES=- ProfId1FR=Prof Id 1 (SIREN) ProfId2FR=Prof Id 2 (SIRET) ProfId3FR=Prof Id 3 (NAF, old APE) ProfId4FR=Prof Id 4 (RCS/RM) -ProfId5FR=Prof Id 5 (numéro EORI) +ProfId5FR=Prof Id 5 (številka EORI) ProfId6FR=- -ProfId1ShortFR=SIREN +ProfId1ShortFR=SIRENA ProfId2ShortFR=SIRET ProfId3ShortFR=NAF ProfId4ShortFR=RCS @@ -226,13 +226,13 @@ ProfId1IT=- ProfId2IT=- ProfId3IT=- ProfId4IT=- -ProfId5IT=EORI number +ProfId5IT=številko EORI ProfId6IT=- ProfId1LU=Id. prof. 1 (R.C.S. Luxemburg) ProfId2LU=Id. prof. 2 (Dovoljenje za poslovanje) ProfId3LU=- ProfId4LU=- -ProfId5LU=EORI number +ProfId5LU=številko EORI ProfId6LU=- ProfId1MA== ProfId2MA== @@ -250,13 +250,13 @@ ProfId1NL=KVK nummer ProfId2NL=- ProfId3NL=- ProfId4NL=- -ProfId5NL=EORI number +ProfId5NL=številko EORI ProfId6NL=- ProfId1PT=Prof Id 1 (NIPC) ProfId2PT=Prof Id 2 (Social security number) ProfId3PT=Prof Id 3 (Commercial Record number) ProfId4PT=Prof Id 4 (Conservatory) -ProfId5PT=Prof Id 5 (EORI number) +ProfId5PT=Prof Id 5 (številka EORI) ProfId6PT=- ProfId1SN== ProfId2SN== @@ -270,17 +270,17 @@ ProfId3TN=Prof Id 3 (Douane code) ProfId4TN=Prof Id 4 (BAN) ProfId5TN== ProfId6TN=- -ProfId1US=Prof Id (FEIN) +ProfId1US=Id prof. (FEIN) ProfId2US=- ProfId3US=- ProfId4US=- ProfId5US=- ProfId6US=- -ProfId1RO=Prof Id 1 (CUI) +ProfId1RO=Prof ID 1 (CUI) ProfId2RO=Prof Id 2 (Nr. Înmatriculare) ProfId3RO=Prof Id 3 (CAEN) ProfId4RO=Prof Id 5 (EUID) -ProfId5RO=Prof Id 5 (EORI number) +ProfId5RO=Prof Id 5 (številka EORI) ProfId6RO=- ProfId1RU=Prof ID 1 (OGRN) ProfId2RU=Prof Id 2 (INN) @@ -291,120 +291,120 @@ ProfId6RU=- ProfId1UA=Prof Id 1 (EDRPOU) ProfId2UA=Prof Id 2 (DRFO) ProfId3UA=Prof Id 3 (INN) -ProfId4UA=Prof Id 4 (Certificate) +ProfId4UA=Prof Id 4 (Certifikat) ProfId5UA=Prof Id 5 (RNOKPP) ProfId6UA=Prof Id 6 (TRDPAU) ProfId1DZ== -ProfId2DZ=Art. +ProfId2DZ=Umetnost. ProfId3DZ=NIF ProfId4DZ=NIS -VATIntra=VAT ID -VATIntraShort=VAT ID +VATIntra=ID za DDV +VATIntraShort=ID za DDV VATIntraSyntaxIsValid=Ime zavezanca veljavno -VATReturn=VAT return +VATReturn=obračun DDV ProspectCustomer=Možna stranka / kupec Prospect=Možna stranka CustomerCard=Kartica kupca Customer=Kupec -CustomerRelativeDiscount=Relativni popust za kupca -SupplierRelativeDiscount=Relative vendor discount +CustomerRelativeDiscount=Popust za kupca +SupplierRelativeDiscount=Popust pri dobavitelju CustomerRelativeDiscountShort=Relativni popust CustomerAbsoluteDiscountShort=Absolutni popust CompanyHasRelativeDiscount=Temu kupcu pripada popust v višini %s%% CompanyHasNoRelativeDiscount=Ta kupec nima odobrenega relativnega popusta -HasRelativeDiscountFromSupplier=You have a default discount of %s%% from this vendor -HasNoRelativeDiscountFromSupplier=You have no default relative discount from this vendor -CompanyHasAbsoluteDiscount=This customer has discounts available (credits notes or down payments) for %s %s -CompanyHasDownPaymentOrCommercialDiscount=This customer has discounts available (commercial, down payments) for %s %s +HasRelativeDiscountFromSupplier=You have a default discount of %s%% with this vendor +HasNoRelativeDiscountFromSupplier=No default relative discount with this vendor +CompanyHasAbsoluteDiscount=Ta stranka ima na voljo popuste (dobropise ali predplačila) za %s %s +CompanyHasDownPaymentOrCommercialDiscount=Ta stranka ima na voljo popuste (komercialne, predplačila) za %s %s CompanyHasCreditNote=Ta kupec ima dobropis ali depozit v višini %s %s -HasNoAbsoluteDiscountFromSupplier=You have no discount credit available from this vendor -HasAbsoluteDiscountFromSupplier=You have discounts available (credits notes or down payments) for %s %s from this vendor -HasDownPaymentOrCommercialDiscountFromSupplier=You have discounts available (commercial, down payments) for %s %s from this vendor -HasCreditNoteFromSupplier=You have credit notes for %s %s from this vendor +HasNoAbsoluteDiscountFromSupplier=Pri dobavitelju ni popusta/kredita +HasAbsoluteDiscountFromSupplier=Na voljo imate popuste (dobropise ali predplačila) za %s %s pri tem dobavitelju +HasDownPaymentOrCommercialDiscountFromSupplier=Na voljo imate popuste (komercialne, predplačila) za %s %s pri tem dobavitelju +HasCreditNoteFromSupplier=Imate dobropise za %s %s tega dobavitelja CompanyHasNoAbsoluteDiscount=Ta kupec nima diskontnega kredita -CustomerAbsoluteDiscountAllUsers=Absolute customer discounts (granted by all users) -CustomerAbsoluteDiscountMy=Absolute customer discounts (granted by yourself) -SupplierAbsoluteDiscountAllUsers=Absolute vendor discounts (entered by all users) -SupplierAbsoluteDiscountMy=Absolute vendor discounts (entered by yourself) +CustomerAbsoluteDiscountAllUsers=Absolutni popusti za kupce (ki jih odobrijo vsi uporabniki) +CustomerAbsoluteDiscountMy=Absolutni popusti za stranke (dodelite jih sami) +SupplierAbsoluteDiscountAllUsers=Absolutni popusti dobavitelja (vnesejo vsi uporabniki) +SupplierAbsoluteDiscountMy=Absolutni popusti dobavitelja (vnesete sami) DiscountNone=Brez popusta -Vendor=Vendor -Supplier=Vendor -AddContact=Ustvari kntakt +Vendor=Dobavitelj +Supplier=Dobavitelj +AddContact=Ustvari stik AddContactAddress=Ustvari naslov -EditContact=Uredi osebo / naslov -EditContactAddress=Uredi kontakt/naslov -Contact=Contact/Address -Contacts=Kontakti -ContactId=Contact id -ContactsAddresses=Kontakti/naslovi -FromContactName=Name: -NoContactDefinedForThirdParty=Pri tem partnerju ni definiranega kontakta -NoContactDefined=Pri tem partnerju ni definiranega kontakta -DefaultContact=Privzeti kontakt -ContactByDefaultFor=Default contact/address for +EditContact=Uredi stik +EditContactAddress=Uredi stik/naslov +Contact=Stik/Naslov +Contacts=Stik/Naslovi +ContactId=ID stika +ContactsAddresses=Stik/Naslovi +FromContactName=Ime: +NoContactDefinedForThirdParty=Pri tem partnerju ni definiranega stika +NoContactDefined=Stik ni določen +DefaultContact=Privzeti stik +ContactByDefaultFor=Privzeti stik/naslov za AddThirdParty=Ustvari partnerja DeleteACompany=Izbriši podjetje PersonalInformations=Osebni podatki -AccountancyCode=Računovodstvo račun -CustomerCode=Customer Code -SupplierCode=Vendor Code -CustomerCodeShort=Customer Code -SupplierCodeShort=Vendor Code -CustomerCodeDesc=Customer Code, unique for all customers -SupplierCodeDesc=Vendor Code, unique for all vendors -RequiredIfCustomer=Obvezno, če je partner kupec ali možna stranka -RequiredIfSupplier=Required if third party is a vendor -ValidityControledByModule=Validity controlled by the module -ThisIsModuleRules=Rules for this module -ProspectToContact=Možna stranka v kontakt -CompanyDeleted=Podjetje "%s" izbrisano iz baze. -ListOfContacts=Seznam kontaktov -ListOfContactsAddresses=Seznam kontaktov -ListOfThirdParties=List of Third Parties -ShowCompany=Third Party -ShowContact=Contact-Address +AccountancyCode=Računovodski račun +CustomerCode=Koda kupca +SupplierCode=Koda dobavitelja +CustomerCodeShort=Koda partnerja +SupplierCodeShort=Koda dobavitelja +CustomerCodeDesc=Enolična koda za vse partnerje +SupplierCodeDesc=Enolična koda za vse dobavitelje +RequiredIfCustomer=Obvezno, če je partner kupec ali potencialni kupec +RequiredIfSupplier=Zahtevano za dobavitelje +ValidityControledByModule=Veljavnost nadzira modul +ThisIsModuleRules=Pravila za ta modul +ProspectToContact=Potencialni kupec v stiku +CompanyDeleted=Podjetje "%s" izbrisano iz podatkovnega skladišča. +ListOfContacts=Seznam stikov/naslovov +ListOfContactsAddresses=Seznam stikov/naslovov +ListOfThirdParties=Seznam partnerjev +ShowCompany=Partner +ShowContact=Stik-Naslov ContactsAllShort=Vsi (brez filtra) -ContactType=Contact role -ContactForOrders=Kontakt za naročilo -ContactForOrdersOrShipments=Kontakt za naročilo ali pošiljanje -ContactForProposals=Kontakt za ponudbo -ContactForContracts=Kontakt za pogodbo -ContactForInvoices=Kontakt za račun -NoContactForAnyOrder=Ta kontakt ni pravi za naročila -NoContactForAnyOrderOrShipments=Ta kontakt ni pravi za naročilo ali pošiljanje +ContactType=Vloga stika +ContactForOrders=Stikova naročila +ContactForOrdersOrShipments=Stik za pošiljanje naročil +ContactForProposals=Stik za ponudbe +ContactForContracts=Stik za pogodbe +ContactForInvoices=Stik za račune +NoContactForAnyOrder=Za naročila stik ni pravilen +NoContactForAnyOrderOrShipments=Za pošiljanje naročil stik ni pravilen NoContactForAnyProposal=Ta kontakt ni pravi za komercialne ponudbe NoContactForAnyContract=Ta kontakt ni pravi za pogodbe NoContactForAnyInvoice=Ta kontakt ni pravi za račune -NewContact=Nov kontakt -NewContactAddress=New Contact/Address -MyContacts=Moji kontakti +NewContact=Nov stik +NewContactAddress=Nov Stik/Naslov +MyContacts=Moji stiki Capital=Kapital CapitalOf=Kapital %s EditCompany=Uredi podjetje -ThisUserIsNot=This user is not a prospect, customer or vendor +ThisUserIsNot=Ta uporabnik ni potencialni kupec, kupec ali dobavitelj VATIntraCheck=Kontrola -VATIntraCheckDesc=The VAT ID must include the country prefix. The link %s uses the European VAT checker service (VIES) which requires internet access from the Dolibarr server. +VATIntraCheckDesc=ID za DDV mora vsebovati predpono države. Povezava %s uporablja evropsko storitev preverjanja DDV (VIES), ki zahteva dostop do interneta s strežnika Dolibarr. VATIntraCheckURL=http://ec.europa.eu/taxation_customs/vies/vieshome.do -VATIntraCheckableOnEUSite=Check the intra-Community VAT ID on the European Commission website -VATIntraManualCheck=You can also check manually on the European Commission website %s +VATIntraCheckableOnEUSite=Preverite ID za DDV znotraj Skupnosti na spletni strani Evropske komisije +VATIntraManualCheck=Preverite lahko tudi ročno na spletni strani Evropske komisije %s ErrorVATCheckMS_UNAVAILABLE=Kontrola ni možna. Država članica ne zagotavlja storitve poizvedbe (%s). -NorProspectNorCustomer=Not prospect, nor customer -JuridicalStatus=Business entity type -Workforce=Workforce -Staff=Employees +NorProspectNorCustomer=Ni potencialni kupec ali kupec +JuridicalStatus=Vrsta poslovnega subjekta +Workforce=Delovna sila +Staff=Zaposleni ProspectLevelShort=Potencial -ProspectLevel=Potencial možne stranke +ProspectLevel=Potencial kupca ContactPrivate=Zasebni ContactPublic=V skupni rabi -ContactVisibility=Vidljivost +ContactVisibility=Viden ContactOthers=Ostalo OthersNotLinkedToThirdParty=Ostali, brez povezave s partnerjem -ProspectStatus=Status možne stranke -PL_NONE=Ni potenciala +ProspectStatus=Status potencialnega kupca +PL_NONE=brez PL_UNKNOWN=Neznan -PL_LOW=Majhen potencial -PL_MEDIUM=Srednji potencial -PL_HIGH=Visok potencial +PL_LOW=Nizka +PL_MEDIUM=Srednja +PL_HIGH=Visoka TE_UNKNOWN=- TE_STARTUP=Novo podjetje TE_GROUP=Veliko podjetje @@ -412,89 +412,94 @@ TE_MEDIUM=Srednje podjetje TE_ADMIN=Državno podjetje TE_SMALL=Majhno podjetje TE_RETAIL=Maloprodaja -TE_WHOLE=Wholesaler +TE_WHOLE=Veletrgovec TE_PRIVATE=Samostojni podjetnik TE_OTHER=Ostalo StatusProspect-1=Ne kontaktirati StatusProspect0=Še ni bil kontaktiran -StatusProspect1=To be contacted +StatusProspect1=Za stik StatusProspect2=Kontaktiranje v teku StatusProspect3=Kontakt izveden ChangeDoNotContact=Spremeni status v 'Ne kontaktirati' ChangeNeverContacted=Spremeni status v 'Še ni bil kontaktiran' -ChangeToContact=Change status to 'To be contacted' +ChangeToContact=Spremenite status v »V stik« ChangeContactInProcess=Spremeni status v 'Kontaktiranje v teku' ChangeContactDone=Spremeni status v 'Kontakt izveden' ProspectsByStatus=Možne stranke po statusu NoParentCompany=Brez ExportCardToFormat=Izvoz podatkov v formatu ContactNotLinkedToCompany=Kontakt ni povezan z nobenim partnerjem -DolibarrLogin=Uporabniško ime za Dolibarr -NoDolibarrAccess=Nima dostopa v Dolibarr -ExportDataset_company_1=Third-parties (companies/foundations/physical people) and their properties -ExportDataset_company_2=Contacts and their properties -ImportDataset_company_1=Third-parties and their properties -ImportDataset_company_2=Third-parties additional contacts/addresses and attributes -ImportDataset_company_3=Third-parties Bank accounts -ImportDataset_company_4=Third-parties Sales representatives (assign sales representatives/users to companies) -PriceLevel=Price Level -PriceLevelLabels=Price Level Labels +DolibarrLogin=Uporabniško ime +NoDolibarrAccess=Nima dostopa +ExportDataset_company_1=Partnerji (podjetja/fundacije/fizične osebe) in njihova lastnina +ExportDataset_company_2=Stiki in njihove lastnosti +ImportDataset_company_1=Partnerji in njihove lastnosti +ImportDataset_company_2=Dodatni stiki/naslovi in atributi partnerjev +ImportDataset_company_3=Bančni računi partnerjev +ImportDataset_company_4=Prodajni zastopniki partnerjev (dodelite prodajne zastopnike/uporabnike podjetjem) +PriceLevel=Raven cene +PriceLevelLabels=Oznake ravni cen DeliveryAddress=Naslov za dostavo AddAddress=Dodaj naslov -SupplierCategory=Vendor category -JuridicalStatus200=Independent +SupplierCategory=Skupina dobavitelja +JuridicalStatus200=Neodvisen DeleteFile=Izbriši datoteko -ConfirmDeleteFile=Ali zares želite izbrisati to datoteko? -AllocateCommercial=Assigned to sales representative +ConfirmDeleteFile=Ali ste prepričani, da želite izbrisati to datoteko %s ? +AllocateCommercial=Dodeljen prodajnemu zastopniku Organization=Organizacija -FiscalYearInformation=Fiscal Year +FiscalYearInformation=Poslovno leto FiscalMonthStart=Začetni mesec fiskalnega leta -SocialNetworksInformation=Social networks +SocialNetworksInformation=Socialna omrežja SocialNetworksFacebookURL=Facebook URL SocialNetworksTwitterURL=Twitter URL SocialNetworksLinkedinURL=Linkedin URL SocialNetworksInstagramURL=Instagram URL SocialNetworksYoutubeURL=Youtube URL SocialNetworksGithubURL=Github URL -YouMustAssignUserMailFirst=You must create an email for this user prior to being able to add an email notification. -YouMustCreateContactFirst=To be able to add email notifications, you must first define contacts with valid emails for the third party -ListSuppliersShort=List of Vendors -ListProspectsShort=List of Prospects -ListCustomersShort=List of Customers -ThirdPartiesArea=Third Parties/Contacts -LastModifiedThirdParties=Latest %s Third Parties which were modified -UniqueThirdParties=Total number of Third Parties +YouMustAssignUserMailFirst=Preden lahko dodate e-poštno obvestilo, morate za tega uporabnika ustvariti e-poštno sporočilo. +YouMustCreateContactFirst=Če želite dodati e-poštna obvestila, morate najprej določiti stike z veljavnimi e-poštnimi naslovi partnerja +ListSuppliersShort=Seznam dobaviteljev +ListProspectsShort=Seznam potencialnih kupcev +ListCustomersShort=Seznam strank +ThirdPartiesArea=Partnerji/stiki +LastModifiedThirdParties=Zadnjih %s spremenjenih partnerjev +UniqueThirdParties=Skupno število partnerjev InActivity=Odprt ActivityCeased=Neaktiven -ThirdPartyIsClosed=Third party is closed -ProductsIntoElements=List of products/services mapped to %s +ThirdPartyIsClosed=Partner je zaprt +ProductsIntoElements=Seznam izdelkov/storitev, preslikanih v %s CurrentOutstandingBill=Trenutni neplačan račun OutstandingBill=Max. za neplačan račun -OutstandingBillReached=Max. for outstanding bill reached -OrderMinAmount=Minimum amount for order -MonkeyNumRefModelDesc=Return a number in the format %syymm-nnnn for the customer code and %syymm-nnnn for the vendor code where yy is year, mm is month and nnnn is a sequencial auto-incrementing number with no break and no return to 0. +OutstandingBillReached=Maks. za dosežen neporavnani račun +OrderMinAmount=Minimalni znesek za naročilo +MonkeyNumRefModelDesc=Vrni številko v obliki %sllmm-nnnn za kodo kupca in %sllmm-nnnn za kodo dobavitelja, kjer je ll leto, mm je mesec in nnnn je zaporedno samodejno naraščajoče število brez prekinitve in vrnitve na 0. LeopardNumRefModelDesc=Koda kupca / dobavitelja po želji. Lahko jo kadarkoli spremenite. ManagingDirectors=Ime direktorja(ev) (CEO, direktor, predsednik...) MergeOriginThirdparty=Podvojen partner (partner, ki ga želite zbrisati) MergeThirdparties=Združi partnerje -ConfirmMergeThirdparties=Are you sure you want to merge the chosen third party with the current one? All linked objects (invoices, orders, ...) will be moved to the current third party, after which the chosen third party will be deleted. -ThirdpartiesMergeSuccess=Third parties have been merged -SaleRepresentativeLogin=Login of sales representative -SaleRepresentativeFirstname=First name of sales representative -SaleRepresentativeLastname=Last name of sales representative -ErrorThirdpartiesMerge=There was an error when deleting the third parties. Please check the log. Changes have been reverted. -NewCustomerSupplierCodeProposed=Customer or Vendor code already used, a new code is suggested -KeepEmptyIfGenericAddress=Keep this field empty if this address is a generic address +ConfirmMergeThirdparties=Ali ste prepričani, da želite združiti izbranega partnerja s trenutno? Vsi povezani objekti (računi, naročila, ...) bodo prestavljeni na trenutnega partnerja, nato pa bo izbrana partner izbrisan. +ThirdpartiesMergeSuccess=Partnerji so bili združeni +SaleRepresentativeLogin=Prijava prodajnega predstavnika +SaleRepresentativeFirstname=Ime prodajnega predstavnika +SaleRepresentativeLastname=Priimek prodajnega predstavnika +ErrorThirdpartiesMerge=Pri brisanju partnerjev je prišlo do napake. Preverite dnevnik. Spremembe so bile razveljavljene. +NewCustomerSupplierCodeProposed=Koda kupca ali dobavitelja je že uporabljena, predlaga se nova koda +KeepEmptyIfGenericAddress=Če je ta naslov splošni naslov, naj bo to polje prazno #Imports -PaymentTypeCustomer=Payment Type - Customer -PaymentTermsCustomer=Payment Terms - Customer -PaymentTypeSupplier=Payment Type - Vendor -PaymentTermsSupplier=Payment Term - Vendor -PaymentTypeBoth=Payment Type - Customer and Vendor -MulticurrencyUsed=Use Multicurrency +PaymentTypeCustomer=Vrsta plačila - Kupec +PaymentTermsCustomer=Plačilni pogoji - Kupec +PaymentTypeSupplier=Vrsta plačila - dobavitelj +PaymentTermsSupplier=Plačilni rok - dobavitelj +PaymentTypeBoth=Vrsta plačila - Dobavitelj in Kupec +MulticurrencyUsed=Uporabite več valut MulticurrencyCurrency=Valuta -InEEC=Europe (EEC) -RestOfEurope=Rest of Europe (EEC) -OutOfEurope=Out of Europe (EEC) -CurrentOutstandingBillLate=Current outstanding bill late -BecarefullChangeThirdpartyBeforeAddProductToInvoice=Be carefull, depending on your product price settings, you should change thirdparty before adding product to POS. +InEEC=Evropa (EGS) +RestOfEurope=Preostala Evropa (EGS) +OutOfEurope=Izven Evrope (EGS) +CurrentOutstandingBillLate=Trenutni neplačani račun zamuja +BecarefullChangeThirdpartyBeforeAddProductToInvoice=Bodite previdni, odvisno od nastavitev cene izdelka morate zamenjati partnerja, preden izdelek dodate na POS. +EmailAlreadyExistsPleaseRewriteYourCompanyName=e-pošta že obstaja, prosimo, prepišite ime vašega podjetja +TwoRecordsOfCompanyName=more than one record exists for this company, please contact us to complete your partnership request +CompanySection=Company section +ShowSocialNetworks=Show social networks +HideSocialNetworks=Hide social networks diff --git a/htdocs/langs/sl_SI/main.lang b/htdocs/langs/sl_SI/main.lang index 604cbcc3f12..417b4eaf22c 100644 --- a/htdocs/langs/sl_SI/main.lang +++ b/htdocs/langs/sl_SI/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=Nobena skupina uporabnikov ni definirana Password=Geslo PasswordRetype=Ponovite svoje geslo NoteSomeFeaturesAreDisabled=Upoštevajte, da je veliko funkcij/modulov v tej demonstraciji onemogočenih. +YourUserFile=Your user file Name=Priimek NameSlashCompany=Ime / Podjetje Person=Oseba @@ -897,6 +898,9 @@ MassFilesArea=Območje za datoteke, zgrajene z množičnimi akcijami ShowTempMassFilesArea=Pokaži območje datotek, ustvarjenih z množičnimi dejanji ConfirmMassDeletion=Potrditev množičnega brisanja ConfirmMassDeletionQuestion=Ali ste prepričani, da želite izbrisati izbrane zapise %s? +ConfirmMassClone=Bulk clone confirmation +ConfirmMassCloneQuestion=Select project to clone to +ConfirmMassCloneToOneProject=Clone to project %s RelatedObjects=Sorodni predmeti ClassifyBilled=Klasificiraj kot fakturirano ClassifyUnbilled=Razvrsti neobračunano @@ -912,8 +916,8 @@ ExportFilteredList=Izvoz filtriranega seznama ExportList=Izvozni seznam ExportOptions=Izvozne opcije IncludeDocsAlreadyExported=Vključi že izvožene dokumente -ExportOfPiecesAlreadyExportedIsEnable=Omogočen je izvoz že izvoženih kosov -ExportOfPiecesAlreadyExportedIsDisable=Izvoz že izvoženih kosov je onemogočen +ExportOfPiecesAlreadyExportedIsEnable=Documents already exported are visible and will be exported +ExportOfPiecesAlreadyExportedIsDisable=Documents already exported are hidden and won't be exported AllExportedMovementsWereRecordedAsExported=Vsi izvoženi premiki so bili zabeleženi kot izvoženi NotAllExportedMovementsCouldBeRecordedAsExported=Vseh izvoženih gibanj ni bilo mogoče zabeležiti kot izvožene Miscellaneous=Razno @@ -1128,6 +1132,7 @@ DeleteFileText=Ali res želite izbrisati to datoteko? ShowOtherLanguages=Pokaži druge jezike SwitchInEditModeToAddTranslation=Preklopite v način urejanja, da dodate prevode za ta jezik NotUsedForThisCustomer=Ni uporabljeno za to stranko +NotUsedForThisVendor=Not used for this vendor AmountMustBePositive=Znesek mora biti pozitiven ByStatus=Po statusu InformationMessage=Informacija @@ -1148,14 +1153,14 @@ EventReminder=Opomnik dogodka UpdateForAllLines=Posodobitev za vse linije OnHold=Ustavljeno Civility=Vljudnost -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Nastavi nadzornika +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor CreateExternalUser=Ustvari zunanjega uporabnika ConfirmAffectTag=Bulk Tag Assignement ConfirmAffectUser=Bulk User Assignement -ProjectRole=Role assigned on each project -TasksRole=Role assigned on each task of each project +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ConfirmSetSupervisor=Paketna nastavitev nadzornika ConfirmUpdatePrice=Choose a increase/decrease price rate ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Ustvarjeno iz javnega portala UserAgent=Uporabniški agent InternalUser=Interni uporabnik ExternalUser=Zunanji uporabnik +NoSpecificContactAddress=No specific contact or address +NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. +HideOnVCard=Hide %s +AddToContacts=Add address to my contacts +LastAccess=Last access +UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here +LastPasswordChangeDate=Last password change date diff --git a/htdocs/langs/sl_SI/stripe.lang b/htdocs/langs/sl_SI/stripe.lang index a234f59f96c..a466078985c 100644 --- a/htdocs/langs/sl_SI/stripe.lang +++ b/htdocs/langs/sl_SI/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Ključ v živo Webhook ONLINE_PAYMENT_WAREHOUSE=Zaloga, ki se uporabi za zmanjšanje zaloge, ko je opravljeno spletno plačilo
    (TODO Ko se izvede možnost zmanjšanja zaloge za dejanje na računu in spletno plačilo samo ustvari račun?) StripeLiveEnabled=Stripe v živo omogočen (sicer preskusni/peskovniški način) StripeImportPayment=Uvozite plačila Stripe -ExampleOfTestCreditCard=Primer kreditne kartice za preizkus: %s => veljavna, %s => napaka CVC, %s => potekla, %s => bremenitev ni uspela +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +ExampleOfTestBankAcountForSEPA=Example of bank account BAN for direct debit test: %s StripeGateways=Stripe prehodi OAUTH_STRIPE_TEST_ID=ID odjemalca Stripe Connect (ca_...) OAUTH_STRIPE_LIVE_ID=ID odjemalca Stripe Connect (ca_...) @@ -70,5 +71,8 @@ ToOfferALinkForLiveWebhook=Povezava za nastavitev Stripe WebHook za klic IPN (na PaymentWillBeRecordedForNextPeriod=Plačilo bo evidentirano za naslednje obdobje. ClickHereToTryAgain= Kliknite tukaj, če želite poskusiti znova ... CreationOfPaymentModeMustBeDoneFromStripeInterface=Zaradi pravil stroge avtentikacije strank je treba kartico ustvariti v zaledni pisarni Stripe. Tukaj lahko kliknete, da vklopite evidenco strank Stripe: %s -TERMINAL_LOCATION=Lokacija (naslov) za terminale +STRIPE_CARD_PRESENT=Card Present for Stripe Terminals +TERMINAL_LOCATION=Location (address) for Stripe Terminals RequestDirectDebitWithStripe=Zahtevajte direktno bremenitev s Stripe +STRIPE_SEPA_DIRECT_DEBIT=Enable the Direct Debit payments through Stripe + diff --git a/htdocs/langs/sl_SI/ticket.lang b/htdocs/langs/sl_SI/ticket.lang index 5c24e13f2d0..90ecd5b1ec8 100644 --- a/htdocs/langs/sl_SI/ticket.lang +++ b/htdocs/langs/sl_SI/ticket.lang @@ -26,6 +26,7 @@ Permission56002=Sprememba zahtevkov Permission56003=Izbriši zahtevke Permission56004=Upravljanje zahtevkov Permission56005=Pogled zahtevkov vseh partnerjev (ne velja za zunanje uporabnike, vedno bodite pozorni na pomebne partnerje) +Permission56006=Export tickets Tickets=Vstopnice TicketDictType=Zahtevki - vrste @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=Zunanji sodelavec OriginEmail=Poročavalec e-pošta Notify_TICKET_SENTBYMAIL=Pošljite sporočilo po e-pošti +ExportDataset_ticket_1=Vstopnice + # Status Read=Preberite Assigned=Dodeljeno diff --git a/htdocs/langs/sl_SI/users.lang b/htdocs/langs/sl_SI/users.lang index 8d72c453249..734ae34fdd5 100644 --- a/htdocs/langs/sl_SI/users.lang +++ b/htdocs/langs/sl_SI/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Povezava do uporabnika LinkedToDolibarrThirdParty=Povezava do partnerja CreateDolibarrLogin=Kreiraj Dolibarr uporabnika CreateDolibarrThirdParty=Kreiraj partnerja -LoginAccountDisableInDolibarr=Račun v Dolibarrju onemogočen. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Uporabi osebne podatke ExportDataset_user_1=Uporabniki in njihove lastnosti DomainUser=Uporabnik domene %s @@ -129,3 +130,6 @@ IPLastLogin=IP zadnja prijava IPPreviousLogin=IP prejšnja prijava ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/sr_RS/users.lang b/htdocs/langs/sr_RS/users.lang index f41e2ad1fb1..9c7d0e37565 100644 --- a/htdocs/langs/sr_RS/users.lang +++ b/htdocs/langs/sr_RS/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Link to user LinkedToDolibarrThirdParty=Link to third party CreateDolibarrLogin=Kreiraj korisnika CreateDolibarrThirdParty=Kreiraj subjekat -LoginAccountDisableInDolibarr=Nalog je deaktiviran u Dolibarr-u +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Upotrebi lićnu vrednost ExportDataset_user_1=Users and their properties DomainUser=Korisnik domena %s @@ -129,3 +130,6 @@ IPLastLogin=IP last login IPPreviousLogin=IP previous login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/sv_SE/accountancy.lang b/htdocs/langs/sv_SE/accountancy.lang index 02599ca892e..cdc97249343 100644 --- a/htdocs/langs/sv_SE/accountancy.lang +++ b/htdocs/langs/sv_SE/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Välj vagnens returtyp ACCOUNTING_EXPORT_PREFIX_SPEC=Ange prefix för filnamnet ThisService=Denna tjänst ThisProduct=Denna produkt -DefaultForService=Standard för tjänst -DefaultForProduct=Standard för produkt +DefaultForService=Standard för tjänster +DefaultForProduct=Standard för produkter ProductForThisThirdparty=Produkt för denna tredjepart ServiceForThisThirdparty=Tjänst för denna tredjepart CantSuggest=Kan inte föreslå @@ -101,7 +101,8 @@ ShowAccountingAccount=Visa bokföringskonto ShowAccountingJournal=Visa loggböcker ShowAccountingAccountInLedger=Visa redovisningskonto i huvudbok ShowAccountingAccountInJournals=Visa redovisningskonto i tidskrifter -AccountAccountingSuggest=Redovisningskonto föreslås +DataUsedToSuggestAccount=Data som används för att föreslå konto +AccountAccountingSuggest=Konto föreslaget MenuDefaultAccounts=Standardkonton MenuBankAccounts=Bankkonton MenuVatAccounts=Vat konton @@ -126,6 +127,7 @@ WriteBookKeeping=Registrera transaktioner i bokföringen Bookkeeping=Huvudbok BookkeepingSubAccount=Underledger AccountBalance=Kontobalans +AccountBalanceSubAccount=Saldo på underkonton ObjectsRef=Källobjekt ref CAHTF=Totalt köpleverantör före skatt TotalExpenseReport=Totalkostnadsrapport @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Konto (från kontoplanen) som ska användas UseAuxiliaryAccountOnCustomerDeposit=Lagra kundkonto som individuellt konto i huvudboken för rader med förskottsbetalningar (om det är inaktiverat förblir individuellt konto för förskottsrader tomt) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Konto (från kontoplanen) som ska användas som standard UseAuxiliaryAccountOnSupplierDeposit=Lagra leverantörskonto som individuellt konto i huvudboken för rader med förskottsbetalningar (om det är inaktiverat förblir individuellt konto för förskottsrader tomt) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Bokföringskonto som standard för att registrera kundbehållen garanti ACCOUNTING_PRODUCT_BUY_ACCOUNT=Konto (från kontoplanen) som ska användas som standardkonto för produkter köpta inom samma land (används om det inte definieras i produktbladet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Konto (från kontoplanen) som ska användas som standardkonto för de produkter som köpts från EEC till ett annat EEC-land (används om det inte anges i produktbladet) @@ -218,6 +221,7 @@ JournalLabel=Loggboksetikett NumPiece=Stycke nummer TransactionNumShort=Num. transaktion AccountingCategory=Anpassad grupp av konton +AccountingCategories=Anpassade grupper av konton GroupByAccountAccounting=Gruppera efter huvudbokskonto GroupBySubAccountAccounting=Gruppera efter underkontokonto AccountingAccountGroupsDesc=Här kan du definiera vissa grupper av bokföringskonto. De kommer att användas för personliga redovisningsrapporter. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Visa delsumma efter nivå Pcgtype=Grupp av konto PcgtypeDesc=Kontogrupp används som fördefinierade kriterier för 'filter' och 'gruppering' för vissa redovisningsrapporter. Till exempel används 'INKOMST' eller 'KOSTNAD' som grupper för redovisning av produkter för att skapa en kostnads- / inkomstrapport. +AccountingCategoriesDesc=Anpassad grupp av konton kan användas för att gruppera redovisningskonton i ett namn för att underlätta filteranvändning eller skapa anpassade rapporter. Reconcilable=Förenlig @@ -294,6 +299,7 @@ DescValidateMovements=Alla ändringar eller raderingar av skrift, bokstäver och ValidateHistory=Förbind automatiskt AutomaticBindingDone=Automatiska bindningar gjorda (%s) - Automatisk bindning är inte möjlig för vissa poster (%s) +DoManualBindingForFailedRecord=Du måste göra en manuell länk för %s rad(er) som inte länkas automatiskt. ErrorAccountancyCodeIsAlreadyUse=Fel, du kan inte ta bort eller inaktivera det här kontoplanen eftersom det används MvtNotCorrectlyBalanced=Rörelse inte korrekt balanserad. Debet = %s & kredit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Inaktivera bindning och överföring av bokf ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Inaktivera bindning och överföring av bokföring vid köp (leverantörsfakturor kommer inte att beaktas vid redovisning) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Inaktivera bindning och överföring i bokföring på kostnadsrapporter (kostnadsrapporter kommer inte att beaktas vid redovisning) ACCOUNTING_ENABLE_LETTERING=Aktivera bokstäverfunktionen i bokföringen +ACCOUNTING_ENABLE_AUTOLETTERING=Aktivera den automatiska bokstäverna vid överföring till bokföring ## Export NotExportLettering=Exportera inte bokstäverna när filen genereras NotifiedExportDate=Flagga exporterade rader som exporterade (för att ändra en rad måste du radera hela transaktionen och överföra den till bokföringen igen) NotifiedValidationDate=Validera och lås de exporterade posterna (samma effekt som "%s"-funktionen, modifiering och radering av raderna kommer DEFINITIVT inte att vara möjligt) +NotifiedExportFull=Exportera dokument? DateValidationAndLock=Datumvalidering och lås ConfirmExportFile=Bekräftelse på generering av bokföringsexportfilen? ExportDraftJournal=Exportera utkast till loggbok @@ -398,7 +406,7 @@ SaleLocal=Lokal försäljning SaleExport=Exportförsäljning SaleEEC=Försäljning i EEG SaleEECWithVAT=Försäljning i EEG med moms som inte är null, så vi antar att detta INTE är en försäljning inom gemenskapen och det föreslagna kontot är standardproduktkontot. -SaleEECWithoutVATNumber=Försäljning i EEG utan moms men tredjeparts moms-ID definieras inte. Vi återgår till produktkontot för standardförsäljning. Du kan fastställa tredjeparts moms-ID eller produktkonto om det behövs. +SaleEECWithoutVATNumber=Försäljning i EEC utan moms men tredje parts momsregistreringsnummer är inte definierat. Vi faller tillbaka på kontot för standardförsäljning. Du kan fixa tredje parts momsregistreringsnummer eller ändra produktkontot som föreslås för bindning om det behövs. ForbiddenTransactionAlreadyExported=Förbjudet: Transaktionen har validerats och/eller exporterats. ForbiddenTransactionAlreadyValidated=Förbjudet: Transaktionen har validerats. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Missmatch i avstämningskod AccountancyErrorMismatchBalanceAmount=Saldot (%s) är inte lika med 0 AccountancyErrorLetteringBookkeeping=Fel har uppstått angående transaktionerna: %s ErrorAccountNumberAlreadyExists=Kontonumret %s finns redan +ErrorArchiveAddFile=Kan inte lägga "%s"-filen i arkivet ## Import ImportAccountingEntries=Redovisningsposter @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Flervalskod (Idevise) DateExport=Datum export WarningReportNotReliable=Varning, den här rapporten är inte baserad på huvudboken-modulen, så den innehåller inte transaktioner modifierad manuellt i huvudboken. Om din bokföring är uppdaterad är bokföringsvisningen mer exakt. ExpenseReportJournal=Kostnadsrapportsloggbok +DocsAlreadyExportedAreExcluded=Dokument som redan har exporterats exkluderas +ClickToHideAlreadyExportedLines=Klicka för att dölja redan exporterade rader NAccounts=%s-konton diff --git a/htdocs/langs/sv_SE/admin.lang b/htdocs/langs/sv_SE/admin.lang index aab53f3f92e..d4f9ce90625 100644 --- a/htdocs/langs/sv_SE/admin.lang +++ b/htdocs/langs/sv_SE/admin.lang @@ -645,6 +645,8 @@ Module2300Name=Schemalagda jobb Module2300Desc=Hantering av schemalagda jobb (cron eller chrono-tabell) Module2400Name=Händelser/dagordning Module2400Desc=Registrera händelser. Logga automatiska händelser för spårningsändamål eller registrera händelser eller möten manuellt. Detta är huvudmodulen för bra kund- eller leverantörsrelation! +Module2430Name=Bokningskalendersystem +Module2430Desc=Tillhandahåll en onlinekalender så att vem som helst kan boka möten, enligt fördefinierade intervall eller tillgänglighet. Module2500Name=DMS/ECM Module2500Desc=Dokumenthanteringssystem/elektronisk innehållshantering. Automatisk organisering av dina skapade eller lagrade dokument. Dela dem när du behöver. Module2600Name=API/webbtjänster (SOAP-server) @@ -660,6 +662,8 @@ Module2900Name=GeoIPMaxmind Module2900Desc=GeoIP Maxmind konverteringskapacitet Module3200Name=Oföränderliga arkiv Module3200Desc=Aktivera en oföränderlig logg över affärshändelser. Händelser arkiveras i realtid. Loggen är en skrivskyddad tabell med händelser som kan exporteras. Denna modul kan vara obligatorisk i vissa länder. +Module3300Name=Modulbyggare +Module3200Desc=Aktivera en oföränderlig logg över affärshändelser. Händelser arkiveras i realtid. Loggen är en skrivskyddad tabell med händelser som kan exporteras. Denna modul kan vara obligatorisk i vissa länder. Module3400Name=Sociala nätverk Module3400Desc=Aktivera fält för sociala nätverks i tredjeparter och adresser (Skype, Twitter, Facebook, ...). Module4000Name=HRM @@ -1270,6 +1274,7 @@ TriggerActiveAsModuleActive=Utlösare i denna fil är aktiva då modulen %s AGENDA_USE_EVENT_TYPE_DEFAULT=Ställ in det här standardvärdet för typ av händelse automatiskt i händelse skapa formulär AGENDA_DEFAULT_FILTER_TYPE=Ställ in denna typ av händelse automatiskt i sökfiltret i kalendervy AGENDA_DEFAULT_FILTER_STATUS=Ställ in denna status automatiskt för händelser i sökfilter i dagordning +AGENDA_EVENT_PAST_COLOR=Tidigare händelsefärg +AGENDA_EVENT_CURRENT_COLOR=Aktuell händelsefärg +AGENDA_EVENT_FUTURE_COLOR=Framtida händelsefärg AGENDA_DEFAULT_VIEW=Vilken vy vill du öppna som standard när du väljer menyn Agenda AGENDA_REMINDER_BROWSER=Aktivera händelsepåminnelse i användarens webbläsare (När påminnelsedatum har uppnåtts visas en popup i webbläsaren. Varje användare kan inaktivera sådana aviseringar från sin webbläsarinställning). AGENDA_REMINDER_BROWSER_SOUND=Aktivera ljudanmälan @@ -2129,6 +2137,7 @@ CodeLastResult=Senaste resultatkoden NbOfEmailsInInbox=Antal e-postmeddelanden i källkatalogen LoadThirdPartyFromName=Ladda tredjepartsökning på %s (endast belastning) LoadThirdPartyFromNameOrCreate=Ladda tredjepartsökning på %s (skapa om ej hittad) +LoadContactFromEmailOrCreate=Ladda kontaktsökning på %s (skapa om den inte hittas) AttachJoinedDocumentsToObject=Spara bifogade filer i objektdokument om en ref för ett objekt hittas i e-postämnet. WithDolTrackingID=Meddelande från en konversation initierad av ett första e-postmeddelande skickat från Dolibarr WithoutDolTrackingID=Meddelande från en konversation initierad av ett första e-postmeddelande som INTE skickades från Dolibarr @@ -2355,3 +2364,5 @@ AllowExternalDownload=Tillåt extern nedladdning (utan inloggning, med en delad DeadlineDayVATSubmission=Sista dag för momsinlämning nästa månad MaxNumberOfAttachementOnForms=Max antal sammanfogade filer i ett formulär IfDefinedUseAValueBeetween=Om angiven, använd ett värde mellan %soch %s +Reload=Ladda om +ConfirmReload=Bekräfta omladdning av modulen diff --git a/htdocs/langs/sv_SE/boxes.lang b/htdocs/langs/sv_SE/boxes.lang index 3a114393c78..cca4fd1907f 100644 --- a/htdocs/langs/sv_SE/boxes.lang +++ b/htdocs/langs/sv_SE/boxes.lang @@ -24,6 +24,7 @@ BoxFicheInter=Senaste interventioner BoxCurrentAccounts=Öppna kontobalanser BoxTitleMemberNextBirthdays=Födelsedagar denna månad (medlemmar) BoxTitleMembersByType=Medlemmar efter typ och status +BoxTitleMembersByTags=Medlemmar efter taggar och status BoxTitleMembersSubscriptionsByYear=Prenumerationer per år BoxTitleLastRssInfos=Senaste %s nyheter från %s BoxTitleLastProducts=Produkter/tjänster: senaste %s ändrade diff --git a/htdocs/langs/sv_SE/companies.lang b/htdocs/langs/sv_SE/companies.lang index ebee840f1ed..49cdcc48cc7 100644 --- a/htdocs/langs/sv_SE/companies.lang +++ b/htdocs/langs/sv_SE/companies.lang @@ -313,7 +313,7 @@ CustomerAbsoluteDiscountShort=Absolut rabatt CompanyHasRelativeDiscount=Denna kund har en standardrabatt på %s%% CompanyHasNoRelativeDiscount=Denna kund har ingen standardrabatt HasRelativeDiscountFromSupplier=Du har en standardrabatt på %s%% hos denna leverantör -HasNoRelativeDiscountFromSupplier=Ingen standard rabatt hos denna leverantör +HasNoRelativeDiscountFromSupplier=Ingen standard relativ rabatt hos denna leverantör CompanyHasAbsoluteDiscount=Den här kunden har rabatter tillgängliga (krediter eller nedbetalningar) för %s %s CompanyHasDownPaymentOrCommercialDiscount=Denna kund har rabatter tillgängliga (kommersiella, förskott) på %s %s CompanyHasCreditNote=Denna kund har fortfarande kreditnotor på %s %s @@ -499,4 +499,7 @@ OutOfEurope=Utanför Europa (EEG) CurrentOutstandingBillLate=Faktura försenad BecarefullChangeThirdpartyBeforeAddProductToInvoice=Beroende på dina inställningar för produktpris så bör du ändra tredjepart innan du lägger till produkten i kassan. EmailAlreadyExistsPleaseRewriteYourCompanyName=E-postadressen finns redan, vänligen skriv ditt företagsnamn -TwoRecordsOfCompanyName=det finns mer än en post för detta företag, kontakta oss för att slutföra din partnerskapsförfrågan" +TwoRecordsOfCompanyName=det finns mer än en post för detta företag, kontakta oss för att slutföra din partnerskapsförfrågan +CompanySection=Företagssektionen +ShowSocialNetworks=Visa sociala nätverk +HideSocialNetworks=Dölj sociala nätverk diff --git a/htdocs/langs/sv_SE/errors.lang b/htdocs/langs/sv_SE/errors.lang index f64c8d9d52b..e49a78d4d53 100644 --- a/htdocs/langs/sv_SE/errors.lang +++ b/htdocs/langs/sv_SE/errors.lang @@ -303,6 +303,7 @@ ErrorValueForTooLow=Värdet för %s är för lågt ErrorValueCantBeNull=Värdet för %s kan inte vara null ErrorDateOfMovementLowerThanDateOfFileTransmission=Datumet för banktransaktionen får inte vara tidigare än datumet för filöverföringen ErrorTooMuchFileInForm=För många filer i formuläret, det maximala antalet är %s fil(er) +ErrorSessionInvalidatedAfterPasswordChange=Sessionen ogiltigförklarades efter byte av lösenord, status eller giltighetsdatum. Vänligen logga in igen. # Warnings WarningParamUploadMaxFileSizeHigherThanPostMaxSize=Din PHP-parameter upload_max_filesize (%s) är högre än PHP-parameter post_max_size (%s). Detta är inte en konsekvent installation. @@ -325,6 +326,7 @@ WarningPaymentDateLowerThanInvoiceDate=Betalningsdag (%s) är tidigare än faktu WarningTooManyDataPleaseUseMoreFilters=För många data (mer än %s linjer). Vänligen använd fler filter eller sätt konstanten %s till en högre gräns. WarningSomeLinesWithNullHourlyRate=En del gånger registrerades av vissa användare medan deras timpris inte definierades. Ett värde på 0 %s per timme användes men det kan leda till felaktig värdering av tiden. WarningYourLoginWasModifiedPleaseLogin=Din inloggning har ändrats. För säkerhetsändamål måste du logga in med din nya inloggning innan nästa åtgärd. +WarningYourPasswordWasModifiedPleaseLogin=Ditt lösenord har ändrats. Av säkerhetsskäl måste du logga in nu med ditt nya lösenord. WarningAnEntryAlreadyExistForTransKey=Det finns redan en post för översättningsnyckeln för det här språket WarningNumberOfRecipientIsRestrictedInMassAction=Varning, antalet olika mottagare är begränsat till %s vid användning av massåtgärder på listor WarningDateOfLineMustBeInExpenseReportRange=Varning, datumet för raden ligger inte inom kostnadsberäkningsområdet diff --git a/htdocs/langs/sv_SE/eventorganization.lang b/htdocs/langs/sv_SE/eventorganization.lang index 5f8426b3080..ff8932926a6 100644 --- a/htdocs/langs/sv_SE/eventorganization.lang +++ b/htdocs/langs/sv_SE/eventorganization.lang @@ -172,3 +172,5 @@ ErrorSeveralCompaniesWithEmailContactUs=Flera företag med denna e-postadress ha ErrorSeveralCompaniesWithNameContactUs=Flera företag med detta namn har hittats så vi kan inte validera din registrering automatiskt. Kontakta oss på %s för en manuell validering NoPublicActionsAllowedForThisEvent=Det finns inga åtgärder som är öppna för allmänheten för detta evenemang MaxNbOfAttendees=Max antal deltagare +DateStartEvent=Eventets startdatum +DateEndEvent=Eventets slutdatum diff --git a/htdocs/langs/sv_SE/main.lang b/htdocs/langs/sv_SE/main.lang index 55d059c60ec..3df909136a6 100644 --- a/htdocs/langs/sv_SE/main.lang +++ b/htdocs/langs/sv_SE/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=Ingen användargrupp är angiven Password=Lösenord PasswordRetype=Repetera lösenordet NoteSomeFeaturesAreDisabled=Observera att en hel del funktioner/moduler är inaktiverade i denna demonstration. +YourUserFile=Din användarfil Name=Namn NameSlashCompany=Namn/företag Person=Person @@ -897,6 +898,9 @@ MassFilesArea=Område för filer som skapats via bulkåtgärder ShowTempMassFilesArea=Visa område med filer som skapats via bulkåtgärder ConfirmMassDeletion=Bekräftelse för bulkradering ConfirmMassDeletionQuestion=Är du säker på att du vill ta bort %s markerade post(er)? +ConfirmMassClone=Bekräftelse av bulkklon +ConfirmMassCloneQuestion=Välj projekt att klona till +ConfirmMassCloneToOneProject=Klona för att projektera %s RelatedObjects=Relaterade objekt ClassifyBilled=Märk fakturerad ClassifyUnbilled=Märk ofakturerad @@ -912,8 +916,8 @@ ExportFilteredList=Exportera filtrerad lista ExportList=Exportera lista ExportOptions=Exportalternativ IncludeDocsAlreadyExported=Inkludera dokument som redan har exporterats -ExportOfPiecesAlreadyExportedIsEnable=Export av redan exporterade bitar är aktiverad -ExportOfPiecesAlreadyExportedIsDisable=Export av redan exporterade bitar är inaktiverad +ExportOfPiecesAlreadyExportedIsEnable=Dokument som redan exporterats är synliga och kommer att exporteras +ExportOfPiecesAlreadyExportedIsDisable=Dokument som redan exporterats är dolda och kommer inte att exporteras AllExportedMovementsWereRecordedAsExported=Alla exporterade förflyttningar har registrerats som exporterade NotAllExportedMovementsCouldBeRecordedAsExported=Inte alla exporterade förflyttningar kunde registreras som exporterade Miscellaneous=Diverse @@ -1128,6 +1132,7 @@ DeleteFileText=Vill du verkligen radera den här filen? ShowOtherLanguages=Visa andra språk SwitchInEditModeToAddTranslation=Växla i redigeringsläge för att lägga till översättningar för detta språk NotUsedForThisCustomer=Används inte för den här kunden +NotUsedForThisVendor=Används inte för denna leverantör AmountMustBePositive=Beloppet måste vara positivt ByStatus=Efter status InformationMessage=Information @@ -1148,14 +1153,14 @@ EventReminder=Händelsepåminnelse UpdateForAllLines=Uppdatering för alla rader OnHold=Pausad Civility=Tilltal -AffectTag=Tilldela tagg -AffectUser=Tilldela användare -SetSupervisor=Ange överordnad +AffectTag=Tilldela en tagg +AffectUser=Tilldela en användare +SetSupervisor=Ställ in handledaren CreateExternalUser=Skapa extern användare ConfirmAffectTag=Tilldela tagg i bulk ConfirmAffectUser=Tilldela användare i bulk -ProjectRole=Roll tilldelad på varje projekt -TasksRole=Roll tilldelad för varje uppgift i varje projekt +ProjectRole=Roll tilldelad på varje projekt/tillfälle +TasksRole=Roll tilldelad för varje uppgift (om sådan används) ConfirmSetSupervisor=Ange överordnad i bulk ConfirmUpdatePrice=Välj kurs för att öka/minska pris ConfirmAffectTagQuestion=Är du säker på att du vill tilldela taggen till %s valda poster? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Skapad i portalen UserAgent=Webbläsare InternalUser=Intern användare ExternalUser=Extern användare +NoSpecificContactAddress=Ingen specifik kontakt eller adress +NoSpecificContactAddressBis=Den här fliken är avsedd att tvinga fram specifika kontakter eller adresser för det aktuella objektet. Använd den endast om du vill definiera en eller flera specifika kontakter eller adresser för objektet när informationen om tredje part inte räcker till eller inte är korrekt. +HideOnVCard=Dölj %s +AddToContacts=Lägg till adress till mina kontakter +LastAccess=Senaste åtkomst +UploadAnImageToSeeAPhotoHere=Ladda upp en bild från fliken %s för att se ett foto här +LastPasswordChangeDate=Datum för senaste lösenordsändring diff --git a/htdocs/langs/sv_SE/mrp.lang b/htdocs/langs/sv_SE/mrp.lang index aef6f852aa7..50130de7aea 100644 --- a/htdocs/langs/sv_SE/mrp.lang +++ b/htdocs/langs/sv_SE/mrp.lang @@ -102,6 +102,7 @@ NbOperatorsRequired=Antal operatörer som krävs THMOperatorEstimated=Uppskattad operatör THM THMMachineEstimated=Beräknad maskin THM WorkstationType=Arbetsstationstyp +DefaultWorkstation=Standard arbetsstation Human=Mänsklig Machine=Maskin HumanMachine=Människa / maskin diff --git a/htdocs/langs/sv_SE/orders.lang b/htdocs/langs/sv_SE/orders.lang index 83e567e6154..756721294c5 100644 --- a/htdocs/langs/sv_SE/orders.lang +++ b/htdocs/langs/sv_SE/orders.lang @@ -96,6 +96,10 @@ OrdersStatisticsSuppliers=Inköpsorderstatistik NumberOfOrdersByMonth=Antal ordrar per månad AmountOfOrdersByMonthHT=Antal order per månad (exkl. Skatt) ListOfOrders=Lista över ordrar +ListOrderLigne=Orderrader +productobuy=Endast produkter att köpa +productonly=Endast produkter +disablelinefree=Inga linjer lediga CloseOrder=Stäng order ConfirmCloseOrder=Är du säker på att du vill ändra den här order till levererad? När en order har levererats kan den fakturas. ConfirmDeleteOrder=Är du säker på att du vill radera den här beställningen? @@ -131,6 +135,7 @@ SupplierOrderClassifiedBilled=Beställningsorder %s set fakturerad OtherOrders=Övriga beställningar SupplierOrderValidatedAndApproved=Leverantörsorder är validerad och godkänd: %s SupplierOrderValidated=Leverantörsorder är validerad: %s +OrderShowDetail=Visa beställningsdetaljer ##### Types de contacts ##### TypeContact_commande_internal_SALESREPFOLL=Representativ uppföljningsordern TypeContact_commande_internal_SHIPPING=Representanten uppföljning sjöfart @@ -199,3 +204,5 @@ StatusSupplierOrderApproved=Godkänd StatusSupplierOrderRefused=Refused StatusSupplierOrderReceivedPartially=Delvis fått StatusSupplierOrderReceivedAll=Alla produkter mottagna +NeedAtLeastOneInvoice = Det måste finnas minst en faktura +LineAlreadyDispatched = Orderraden är redan mottagen. diff --git a/htdocs/langs/sv_SE/products.lang b/htdocs/langs/sv_SE/products.lang index 82884c9b5cd..84300b73c5e 100644 --- a/htdocs/langs/sv_SE/products.lang +++ b/htdocs/langs/sv_SE/products.lang @@ -414,8 +414,8 @@ MergeProducts=Slå ihop produkter ConfirmMergeProducts=Är du säker på att du vill slå samman den valda produkten med den nuvarande? Alla länkade objekt (fakturor, beställningar, ...) kommer att flyttas till den aktuella produkten, varefter den valda produkten raderas. ProductsMergeSuccess=Produkterna har slagits samman ErrorsProductsMerge=Fel vid produkt sammanslagning -SwitchOnSaleStatus=Slå på försäljningsstatus -SwitchOnPurchaseStatus=Slå på köpstatus +SwitchOnSaleStatus=Ändra försäljningsstatus +SwitchOnPurchaseStatus=Ändra köpstatus UpdatePrice=Öka/minska kundpriset StockMouvementExtraFields= Extra fält (lagerrörelse) InventoryExtraFields= Extra fält (inventering) diff --git a/htdocs/langs/sv_SE/stripe.lang b/htdocs/langs/sv_SE/stripe.lang index 35d559d99a1..58e6a840aba 100644 --- a/htdocs/langs/sv_SE/stripe.lang +++ b/htdocs/langs/sv_SE/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Webhook levande nyckel ONLINE_PAYMENT_WAREHOUSE=Lager som ska användas för lagerminskning när online betalning görs
    (TODO När alternativet att minska lagret görs på en fakturahandling och online betalning genererar fakturaen?) StripeLiveEnabled=Stripe live enabled (annars test / sandbox-läge) StripeImportPayment=Importera Stripe betalningar -ExampleOfTestCreditCard=Exempel på kreditkort för test: %s => valid, %s => error CVC, %s => expired, %s => debitering misslyckas +ExampleOfTestCreditCard=Exempel på kreditkort för SEPA-test: %s => giltigt, %s => fel CVC, %s => löpt ut, %s => laddning misslyckas +ExampleOfTestBankAcountForSEPA=Exempel på bankkonto BAN för autogirotest: %s StripeGateways=Stripe gateways OAUTH_STRIPE_TEST_ID=Stripe Connect Client ID (ca _...) OAUTH_STRIPE_LIVE_ID=Stripe Connect Client ID (ca _...) @@ -70,5 +71,8 @@ ToOfferALinkForLiveWebhook=Länk till installation Stripe WebHook för att ringa PaymentWillBeRecordedForNextPeriod=Betalning kommer att registreras för nästa period. ClickHereToTryAgain= Klicka här för att försöka igen ... CreationOfPaymentModeMustBeDoneFromStripeInterface=På grund av starka regler för kundautentisering måste ett kort skapas från Stripe backoffice. Du kan klicka här för att slå på Stripes kundregister: %s -TERMINAL_LOCATION=Plats (adress) för terminaler +STRIPE_CARD_PRESENT=Presentkort för Stripe-terminaler +TERMINAL_LOCATION=Plats (adress) för Stripe Terminals RequestDirectDebitWithStripe=Begär autogiro med Stripe +STRIPE_SEPA_DIRECT_DEBIT=Aktivera autogirobetalningar genom Stripe + diff --git a/htdocs/langs/sv_SE/ticket.lang b/htdocs/langs/sv_SE/ticket.lang index 81b60716c19..d8b99e4c8df 100644 --- a/htdocs/langs/sv_SE/ticket.lang +++ b/htdocs/langs/sv_SE/ticket.lang @@ -26,6 +26,7 @@ Permission56002=Ändra ärenden Permission56003=Radera ärenden Permission56004=Hantera ärenden Permission56005=Se ärenden till alla tredje parter (inte effektiva för externa användare, alltid begränsad till tredje part som de är beroende av) +Permission56006=Exportera ärenden Tickets=Ärenden TicketDictType=Ärende - Typer @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=Extern bidragsyter OriginEmail=Reporter E-post Notify_TICKET_SENTBYMAIL=Skicka ärrendemeddelande via e-post +ExportDataset_ticket_1=Ärenden + # Status Read=Läsa Assigned=Tilldelad diff --git a/htdocs/langs/sv_SE/users.lang b/htdocs/langs/sv_SE/users.lang index 1fa6d43de6f..87e8edc08f0 100644 --- a/htdocs/langs/sv_SE/users.lang +++ b/htdocs/langs/sv_SE/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Länk till användare LinkedToDolibarrThirdParty=Länk till tredjepart CreateDolibarrLogin=Skapa användare CreateDolibarrThirdParty=Skapa tredjepart -LoginAccountDisableInDolibarr=Konto inaktiverat. +LoginAccountDisableInDolibarr=Kontot inaktiverat i Dolibarr +PASSWORDInDolibarr=Lösenordet ändrat i Dolibarr UsePersonalValue=Använd personligt värde ExportDataset_user_1=Användare och egenskaper DomainUser=Domänanvändare %s @@ -129,3 +130,6 @@ IPLastLogin=IP senaste inloggning IPPreviousLogin=IP föregående inloggning ShowAllPerms=Visa alla rättighetsrader HideAllPerms=Dölj alla rättighetsrader +UserPublicPageDesc=Du kan aktivera ett virtuellt kort för den här användaren. En url med användarprofilen och en streckkod kommer att finnas tillgänglig så att alla med en smartphone kan skanna den och lägga till din kontakt i adressboken. +EnablePublicVirtualCard=Aktivera det offentliga virtuella användarkortet +PublicVirtualCardUrl=Offentligt virtuellt användarkort diff --git a/htdocs/langs/ta_IN/accountancy.lang b/htdocs/langs/ta_IN/accountancy.lang index b6f96fe04bd..1e318d0aeab 100644 --- a/htdocs/langs/ta_IN/accountancy.lang +++ b/htdocs/langs/ta_IN/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=வண்டி திரும்பும் வக ACCOUNTING_EXPORT_PREFIX_SPEC=கோப்பு பெயருக்கான முன்னொட்டைக் குறிப்பிடவும் ThisService=இந்த சேவை ThisProduct=இந்த தயாரிப்பு -DefaultForService=சேவைக்கான இயல்புநிலை -DefaultForProduct=தயாரிப்புக்கான இயல்புநிலை +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=இந்த மூன்றாம் தரப்பினருக்கான தயாரிப்பு ServiceForThisThirdparty=இந்த மூன்றாம் தரப்பினருக்கான சேவை CantSuggest=பரிந்துரைக்க முடியாது @@ -101,7 +101,8 @@ ShowAccountingAccount=கணக்கியல் கணக்கைக் க ShowAccountingJournal=கணக்கியல் பத்திரிகையைக் காட்டு ShowAccountingAccountInLedger=லெட்ஜரில் கணக்கியல் கணக்கைக் காட்டு ShowAccountingAccountInJournals=பத்திரிகைகளில் கணக்கியல் கணக்கைக் காட்டு -AccountAccountingSuggest=கணக்கியல் கணக்கு பரிந்துரைக்கப்பட்டது +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=இயல்புநிலை கணக்குகள் MenuBankAccounts=வங்கி கணக்குகள் MenuVatAccounts=வாட் கணக்குகள் @@ -126,6 +127,7 @@ WriteBookKeeping=Record transactions in accounting Bookkeeping=பேரேடு BookkeepingSubAccount=சப்லெட்ஜர் AccountBalance=கணக்கு இருப்பு +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=மூல பொருள் குறிப்பு CAHTF=வரிக்கு முன் மொத்த கொள்முதல் விற்பனையாளர் TotalExpenseReport=மொத்த செலவு அறிக்கை @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=ஜர்னல் லேபிள் NumPiece=துண்டு எண் TransactionNumShort=எண் பரிவர்த்தனை AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=பொதுப் பேரேடு கணக்கின்படி குழுவாக்கவும் GroupBySubAccountAccounting=சப்லெட்ஜர் கணக்கு மூலம் குழு AccountingAccountGroupsDesc=கணக்கியல் கணக்கின் சில குழுக்களை நீங்கள் இங்கே வரையறுக்கலாம். தனிப்பயனாக்கப்பட்ட கணக்கியல் அறிக்கைகளுக்கு அவை பயன்படுத்தப்படும். @@ -265,6 +269,7 @@ ShowSubtotalByGroup=துணைத்தொகையை நிலை வார Pcgtype=கணக்கு குழு PcgtypeDesc=கணக்கின் குழு சில கணக்கியல் அறிக்கைகளுக்கு முன் வரையறுக்கப்பட்ட 'வடிகட்டி' மற்றும் 'குழுப்படுத்துதல்' அளவுகோல்களாகப் பயன்படுத்தப்படுகிறது. எடுத்துக்காட்டாக, 'வருமானம்' அல்லது 'செலவு' என்பது செலவு/வருமான அறிக்கையை உருவாக்க தயாரிப்புகளின் கணக்கு கணக்குகளுக்கு குழுக்களாகப் பயன்படுத்தப்படுகிறது. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=சமரசம் செய்யக்கூடியது @@ -294,6 +299,7 @@ DescValidateMovements=எழுதுதல், எழுதுதல் மற ValidateHistory=தானாக பிணைக்கவும் AutomaticBindingDone=தானியங்கி பிணைப்புகள் செய்யப்பட்டன (%s) - சில பதிவுகளுக்கு தானியங்கு பிணைப்பு சாத்தியமில்லை (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=விற்பனையில் கணக ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=வாங்குதல்களில் கணக்கியலில் பிணைப்பு & பரிமாற்றத்தை முடக்கு (கணக்கில் விற்பனையாளர் இன்வாய்ஸ்கள் கணக்கில் எடுத்துக்கொள்ளப்படாது) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=செலவு அறிக்கைகள் மீதான கணக்கியலில் பிணைப்பு மற்றும் பரிமாற்றத்தை முடக்கு (கணக்கில் செலவு அறிக்கைகள் கணக்கில் எடுத்துக்கொள்ளப்படாது) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Flag exported lines as Exported (to modify a line, you will need to delete the whole transaction and re-transfert it into accounting) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=Date validation and lock ConfirmExportFile=கணக்கியல் ஏற்றுமதி கோப்பின் தலைமுறையை உறுதிப்படுத்தவா? ExportDraftJournal=ஏற்றுமதி வரைவு இதழ் @@ -398,7 +406,7 @@ SaleLocal=உள்ளூர் விற்பனை SaleExport=ஏற்றுமதி விற்பனை SaleEEC=EEC இல் விற்பனை SaleEECWithVAT=EEC இல் VAT இல் விற்பனையானது பூஜ்யமாக இல்லை, எனவே இது ஒரு உள்நாடு விற்பனை அல்ல, மேலும் பரிந்துரைக்கப்பட்ட கணக்கு நிலையான தயாரிப்புக் கணக்காகும். -SaleEECWithoutVATNumber=VAT இல்லா EEC இல் விற்பனை ஆனால் மூன்றாம் தரப்பினரின் VAT ஐடி வரையறுக்கப்படவில்லை. நிலையான விற்பனைக்கான தயாரிப்புக் கணக்கில் நாங்கள் திரும்புவோம். தேவைப்பட்டால் மூன்றாம் தரப்பினரின் VAT ஐடி அல்லது தயாரிப்பு கணக்கை நீங்கள் சரிசெய்யலாம். +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=தடைசெய்யப்பட்டது: பரிவர்த்தனை சரிபார்க்கப்பட்டது மற்றும்/அல்லது ஏற்றுமதி செய்யப்பட்டது. ForbiddenTransactionAlreadyValidated=தடைசெய்யப்பட்டது: பரிவர்த்தனை சரிபார்க்கப்பட்டது. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Mismatch in reconcile code AccountancyErrorMismatchBalanceAmount=The balance (%s) is not equal to 0 AccountancyErrorLetteringBookkeeping=Errors have occurred concerning the transactions: %s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=கணக்கு பதிவுகள் @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=மல்டிகரன்சி குறியீ DateExport=தேதி ஏற்றுமதி WarningReportNotReliable=எச்சரிக்கை, இந்த அறிக்கை லெட்ஜரை அடிப்படையாகக் கொண்டது அல்ல, எனவே லெட்ஜரில் கைமுறையாக மாற்றப்பட்ட பரிவர்த்தனை இல்லை. உங்கள் ஜர்னலைசேஷன் புதுப்பித்த நிலையில் இருந்தால், புத்தக பராமரிப்பு பார்வை மிகவும் துல்லியமாக இருக்கும். ExpenseReportJournal=செலவு அறிக்கை இதழ் +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s கணக்குகள் diff --git a/htdocs/langs/ta_IN/main.lang b/htdocs/langs/ta_IN/main.lang index e83a90ca339..7611ca56db5 100644 --- a/htdocs/langs/ta_IN/main.lang +++ b/htdocs/langs/ta_IN/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=பயனர் குழு வரையறுக்கப Password=கடவுச்சொல் PasswordRetype=Repeat your password NoteSomeFeaturesAreDisabled=இந்த ஆர்ப்பாட்டத்தில் நிறைய அம்சங்கள்/தொகுதிகள் முடக்கப்பட்டுள்ளன என்பதை நினைவில் கொள்ளவும். +YourUserFile=Your user file Name=பெயர் NameSlashCompany=பெயர் / நிறுவனம் Person=நபர் @@ -897,6 +898,9 @@ MassFilesArea=வெகுஜன செயல்களால் உருவா ShowTempMassFilesArea=வெகுஜன செயல்களால் உருவாக்கப்பட்ட கோப்புகளின் பகுதியைக் காட்டு ConfirmMassDeletion=மொத்தமாக நீக்குதல் உறுதிப்படுத்தல் ConfirmMassDeletionQuestion=தேர்ந்தெடுத்த %s பதிவை(களை) நிச்சயமாக நீக்க விரும்புகிறீர்களா? +ConfirmMassClone=Bulk clone confirmation +ConfirmMassCloneQuestion=Select project to clone to +ConfirmMassCloneToOneProject=Clone to project %s RelatedObjects=தொடர்புடைய பொருள்கள் ClassifyBilled=கட்டணத்தை வகைப்படுத்தவும் ClassifyUnbilled=பில் செய்யப்படாததை வகைப்படுத்தவும் @@ -912,8 +916,8 @@ ExportFilteredList=வடிகட்டப்பட்ட பட்டியல ExportList=ஏற்றுமதி பட்டியல் ExportOptions=ஏற்றுமதி விருப்பங்கள் IncludeDocsAlreadyExported=ஏற்கனவே ஏற்றுமதி செய்யப்பட்ட ஆவணங்களைச் சேர்க்கவும் -ExportOfPiecesAlreadyExportedIsEnable=ஏற்கனவே ஏற்றுமதி செய்யப்பட்ட துண்டுகளின் ஏற்றுமதி இயக்கப்பட்டது -ExportOfPiecesAlreadyExportedIsDisable=ஏற்கனவே ஏற்றுமதி செய்யப்பட்ட துண்டுகளின் ஏற்றுமதி முடக்கப்பட்டுள்ளது +ExportOfPiecesAlreadyExportedIsEnable=Documents already exported are visible and will be exported +ExportOfPiecesAlreadyExportedIsDisable=Documents already exported are hidden and won't be exported AllExportedMovementsWereRecordedAsExported=ஏற்றுமதி செய்யப்பட்ட அனைத்து இயக்கங்களும் ஏற்றுமதி செய்யப்பட்டதாக பதிவு செய்யப்பட்டன NotAllExportedMovementsCouldBeRecordedAsExported=ஏற்றுமதி செய்யப்பட்ட அனைத்து இயக்கங்களும் ஏற்றுமதி செய்யப்பட்டதாக பதிவு செய்ய முடியாது Miscellaneous=இதர @@ -1128,6 +1132,7 @@ DeleteFileText=இந்தக் கோப்பை உண்மையில் ShowOtherLanguages=பிற மொழிகளைக் காட்டு SwitchInEditModeToAddTranslation=இந்த மொழிக்கான மொழிபெயர்ப்புகளைச் சேர்க்க எடிட் பயன்முறையில் மாறவும் NotUsedForThisCustomer=இந்த வாடிக்கையாளருக்குப் பயன்படுத்தப்படவில்லை +NotUsedForThisVendor=Not used for this vendor AmountMustBePositive=தொகை நேர்மறையாக இருக்க வேண்டும் ByStatus=நிலை மூலம் InformationMessage=தகவல் @@ -1148,14 +1153,14 @@ EventReminder=நிகழ்வு நினைவூட்டல் UpdateForAllLines=அனைத்து வரிகளுக்கும் புதுப்பிக்கவும் OnHold=நிறுத்தி வைக்கப்பட்டுள்ளது Civility=நாகரீகம் -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Set Supervisor +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor CreateExternalUser=வெளிப்புற பயனரை உருவாக்கவும் ConfirmAffectTag=Bulk Tag Assignement ConfirmAffectUser=Bulk User Assignement -ProjectRole=Role assigned on each project -TasksRole=Role assigned on each task of each project +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ConfirmSetSupervisor=Bulk Supervisor Set ConfirmUpdatePrice=Choose a increase/decrease price rate ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Created from Public portal UserAgent=User Agent InternalUser=Internal user ExternalUser=External user +NoSpecificContactAddress=No specific contact or address +NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. +HideOnVCard=Hide %s +AddToContacts=Add address to my contacts +LastAccess=Last access +UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here +LastPasswordChangeDate=Last password change date diff --git a/htdocs/langs/ta_IN/stripe.lang b/htdocs/langs/ta_IN/stripe.lang index ad4e0943249..4b61ec6f46c 100644 --- a/htdocs/langs/ta_IN/stripe.lang +++ b/htdocs/langs/ta_IN/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Webhook நேரலை விசை ONLINE_PAYMENT_WAREHOUSE=ஆன்லைனில் பணம் செலுத்தும் போது பங்கு குறைவதற்குப் பயன்படுத்த வேண்டிய பங்கு
    (TODO பங்குகளைக் குறைப்பதற்கான விருப்பம் விலைப்பட்டியல் மீது செய்யப்படும் மற்றும் ஆன்லைன் கட்டணம் தானே விலைப்பட்டியல் உருவாக்கப்படும்?) StripeLiveEnabled=ஸ்ட்ரைப் லைவ் இயக்கப்பட்டது (இல்லையெனில் சோதனை/சாண்ட்பாக்ஸ் பயன்முறை) StripeImportPayment=வரி செலுத்துதல்களை இறக்குமதி செய்யவும் -ExampleOfTestCreditCard=சோதனைக்கான கிரெடிட் கார்டின் எடுத்துக்காட்டு: %s => செல்லுபடியாகும், %s => பிழை CVC, %s => காலாவதியானது, %s => கட்டணம் தோல்வி +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +ExampleOfTestBankAcountForSEPA=Example of bank account BAN for direct debit test: %s StripeGateways=கோடு நுழைவாயில்கள் OAUTH_STRIPE_TEST_ID=ஸ்ட்ரைப் கனெக்ட் கிளையண்ட் ஐடி (ca_...) OAUTH_STRIPE_LIVE_ID=ஸ்ட்ரைப் கனெக்ட் கிளையண்ட் ஐடி (ca_...) @@ -61,6 +62,7 @@ DeleteACard=அட்டையை நீக்கு ConfirmDeleteCard=இந்த கிரெடிட் அல்லது டெபிட் கார்டை நிச்சயமாக நீக்க விரும்புகிறீர்களா? CreateCustomerOnStripe=ஸ்ட்ரைப்பில் வாடிக்கையாளரை உருவாக்கவும் CreateCardOnStripe=ஸ்ட்ரைப்பில் அட்டையை உருவாக்கவும் +CreateBANOnStripe=Create bank on Stripe ShowInStripe=கோட்டில் காட்டு StripeUserAccountForActions=சில ஸ்ட்ரைப் நிகழ்வுகளின் மின்னஞ்சல் அறிவிப்புக்காகப் பயன்படுத்த வேண்டிய பயனர் கணக்கு (ஸ்ட்ரைப் பேஅவுட்கள்) StripePayoutList=ஸ்ட்ரைப் பேஅவுட்களின் பட்டியல் @@ -69,3 +71,8 @@ ToOfferALinkForLiveWebhook=IPN (நேரடி பயன்முறை) ஐ PaymentWillBeRecordedForNextPeriod=கட்டணம் அடுத்த காலத்திற்கு பதிவு செய்யப்படும். ClickHereToTryAgain= மீண்டும் முயற்சிக்க இங்கே கிளிக் செய்யவும்... CreationOfPaymentModeMustBeDoneFromStripeInterface=வலுவான வாடிக்கையாளர் அங்கீகார விதிகளின் காரணமாக, ஸ்ட்ரைப் பேக் ஆபீஸில் இருந்து கார்டை உருவாக்க வேண்டும். ஸ்ட்ரைப் வாடிக்கையாளர் பதிவை இயக்க நீங்கள் இங்கே கிளிக் செய்யலாம்: %s +STRIPE_CARD_PRESENT=Card Present for Stripe Terminals +TERMINAL_LOCATION=Location (address) for Stripe Terminals +RequestDirectDebitWithStripe=Request Direct Debit with Stripe +STRIPE_SEPA_DIRECT_DEBIT=Enable the Direct Debit payments through Stripe + diff --git a/htdocs/langs/ta_IN/users.lang b/htdocs/langs/ta_IN/users.lang index edd2c6bde2b..62c5a941b79 100644 --- a/htdocs/langs/ta_IN/users.lang +++ b/htdocs/langs/ta_IN/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=பயனருக்கான இணைப்பு LinkedToDolibarrThirdParty=மூன்றாம் தரப்பினருக்கான இணைப்பு CreateDolibarrLogin=ஒரு பயனரை உருவாக்கவும் CreateDolibarrThirdParty=மூன்றாம் தரப்பை உருவாக்கவும் -LoginAccountDisableInDolibarr=Dolibarr இல் கணக்கு முடக்கப்பட்டது. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=தனிப்பட்ட மதிப்பைப் பயன்படுத்தவும் ExportDataset_user_1=பயனர்கள் மற்றும் அவர்களின் பண்புகள் DomainUser=டொமைன் பயனர் %s @@ -129,3 +130,6 @@ IPLastLogin=IP last login IPPreviousLogin=IP previous login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/tg_TJ/accountancy.lang b/htdocs/langs/tg_TJ/accountancy.lang index 4470fcfc624..11a93979849 100644 --- a/htdocs/langs/tg_TJ/accountancy.lang +++ b/htdocs/langs/tg_TJ/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Навъи бозгашти вагонро интих ACCOUNTING_EXPORT_PREFIX_SPEC=Префикси номи файлро муайян кунед ThisService=Ин хидмат ThisProduct=Ин маҳсулот -DefaultForService=Пешфарз барои хидмат -DefaultForProduct=Пешфарз барои маҳсулот +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Маҳсулот барои ин тарафи сеюм ServiceForThisThirdparty=Хидмат барои ин шахси сеюм CantSuggest=Тавсия дода наметавонад @@ -101,7 +101,8 @@ ShowAccountingAccount=Нишон додани ҳисоби баҳисобгир ShowAccountingJournal=Нишон додани маҷаллаи баҳисобгирӣ ShowAccountingAccountInLedger=Ҳисобгирии муҳосибиро дар дафтар нишон диҳед ShowAccountingAccountInJournals=Нишон додани ҳисоби баҳисобгирӣ дар маҷаллаҳо -AccountAccountingSuggest=Ҳисоби баҳисобгирӣ пешниҳод карда мешавад +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=Ҳисобҳои пешфарз MenuBankAccounts=Ҳисобҳои бонкӣ MenuVatAccounts=Ҳисобҳои андоз аз арзиши иловашуда @@ -126,6 +127,7 @@ WriteBookKeeping=Record transactions in accounting Bookkeeping=Китоб BookkeepingSubAccount=Подшоҳ AccountBalance=Тавозуни суратҳисоб +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Манбаи объекти истинод CAHTF=Фурӯшандаи умумии харид пеш аз андоз TotalExpenseReport=Ҳисоботи умумии хароҷот @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=Нишони рӯзнома NumPiece=Рақами дона TransactionNumShort=Адад муомилот AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Гурӯҳбандӣ аз рӯи ҳисоби китоби умумӣ GroupBySubAccountAccounting=Гурӯҳбандӣ аз рӯи ҳисоби зерпардохт AccountingAccountGroupsDesc=Шумо метавонед дар ин ҷо баъзе гурӯҳҳои баҳисобгирии муҳосибиро муайян кунед. Онҳо барои ҳисоботи шахсии баҳисобгирӣ истифода мешаванд. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Нишон додани маҷмӯа аз рӯи сатҳ Pcgtype=Гурӯҳи ҳисоб PcgtypeDesc=Гурӯҳи ҳисобҳо ҳамчун меъёрҳои пешакӣ муайяншудаи 'филтр' ва 'гурӯҳбандӣ' барои баъзе ҳисоботҳои баҳисобгирӣ истифода мешаванд. Масалан, 'ДАРОМАД' ё 'ХАРОҶО' ҳамчун гурӯҳҳо барои ҳисобҳои баҳисобгирии маҳсулот барои таҳияи гузориши хароҷот/даромад истифода мешаванд. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Оштӣ @@ -294,6 +299,7 @@ DescValidateMovements=Ҳама гуна тағир ё нест кардани н ValidateHistory=Ба таври худкор пайваст кунед AutomaticBindingDone=Automatic bindings done (%s) - Automatic binding not possible for some record (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Ҳатмӣ ва интиқол дар муҳ ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Ҳатмӣ ва интиқол дар муҳосибот ҳангоми харидро хомӯш кунед (фактураҳои фурӯшанда ҳангоми баҳисобгирӣ ба назар гирифта намешаванд) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Ҳатмӣ ва интиқол дар муҳосибот дар ҳисоботи хароҷотро хомӯш кунед (ҳисоботи хароҷот ҳангоми баҳисобгирӣ ба назар гирифта намешаванд) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Flag exported lines as Exported (to modify a line, you will need to delete the whole transaction and re-transfert it into accounting) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=Date validation and lock ConfirmExportFile=Тасдиқи тавлиди файли содироти баҳисобгирӣ? ExportDraftJournal=Содироти маҷаллаи лоиҳа @@ -398,7 +406,7 @@ SaleLocal=Фурӯши маҳаллӣ SaleExport=Фурӯши содирот SaleEEC=Фурӯш дар EEC SaleEECWithVAT=Фурӯш дар ИАА бо арзиши иловашуда бо арзиши иловашуда бекор нест, бинобар ин мо фикр мекунем, ки ин фурӯши дохилиидоравӣ нест ва ҳисоби пешниҳодшуда ҳисоби стандартии маҳсулот аст. -SaleEECWithoutVATNumber=Фурӯш дар ЕЭК бидуни андоз аз арзиши иловашуда, аммо ID -и ААИ аз тарафи сеюм муайян карда нашудааст. Мо аз ҳисоби маҳсулот барои фурӯши стандартӣ бармегардем. Агар лозим бошад, шумо метавонед ID ААИ -и тарафи сеюм ё ҳисоби маҳсулотро ислоҳ кунед. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Forbidden: The transaction has been validated and/or exported. ForbiddenTransactionAlreadyValidated=Forbidden: The transaction has been validated. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Mismatch in reconcile code AccountancyErrorMismatchBalanceAmount=The balance (%s) is not equal to 0 AccountancyErrorLetteringBookkeeping=Errors have occurred concerning the transactions: %s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Сабтҳои баҳисобгирӣ @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Рамзи бисёрҷониба (Idevise) DateExport=Содироти сана WarningReportNotReliable=Огоҳӣ, ин гузориш ба дафтарча асос наёфтааст, аз ин рӯ амалиётеро, ки дар дафтар ба таври дастӣ тағир дода шудааст, дар бар намегирад. Агар рӯзноманигории шумо нав бошад, назари ҳисобдорӣ дақиқтар аст. ExpenseReportJournal=Ҳисоботи хароҷоти рӯзнома +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=ҳисобҳои %s diff --git a/htdocs/langs/tg_TJ/main.lang b/htdocs/langs/tg_TJ/main.lang index fab00674f6b..c198cbf6600 100644 --- a/htdocs/langs/tg_TJ/main.lang +++ b/htdocs/langs/tg_TJ/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=Ягон гурӯҳи корбарон муайян нашу Password=Рамз PasswordRetype=Repeat your password NoteSomeFeaturesAreDisabled=Дар хотир доред, ки дар ин намоиш бисёр хусусиятҳо/модулҳо хомӯш карда шудаанд. +YourUserFile=Your user file Name=Ном NameSlashCompany=Ном / ширкат Person=Шахсе @@ -897,6 +898,9 @@ MassFilesArea=Минтақаи файлҳое, ки бо амалҳои омма ShowTempMassFilesArea=Нишон додани майдони файлҳое, ки бо амалҳои оммавӣ сохта шудаанд ConfirmMassDeletion=Тасдиқи маҷмӯӣ Нест кардан ConfirmMassDeletionQuestion=Шумо мутмаин ҳастед, ки сабт (ҳо) -и интихобшударо %s нест кардан мехоҳед? +ConfirmMassClone=Bulk clone confirmation +ConfirmMassCloneQuestion=Select project to clone to +ConfirmMassCloneToOneProject=Clone to project %s RelatedObjects=Объектҳои марбут ClassifyBilled=Таснифшуда ҳисоб карда мешавад ClassifyUnbilled=Тасниф карда нашудааст @@ -912,8 +916,8 @@ ExportFilteredList=Рӯйхати филтршударо содир кунед ExportList=Рӯйхати содирот ExportOptions=Имконоти содирот IncludeDocsAlreadyExported=Ҳуҷҷатҳои аллакай содиршударо дохил кунед -ExportOfPiecesAlreadyExportedIsEnable=Содироти қисмҳои аллакай содиршуда фаъол аст -ExportOfPiecesAlreadyExportedIsDisable=Содироти қисмҳои аллакай содиршуда ғайрифаъол аст +ExportOfPiecesAlreadyExportedIsEnable=Documents already exported are visible and will be exported +ExportOfPiecesAlreadyExportedIsDisable=Documents already exported are hidden and won't be exported AllExportedMovementsWereRecordedAsExported=Ҳама ҳаракатҳои содиршуда ҳамчун содирот сабт карда шуданд NotAllExportedMovementsCouldBeRecordedAsExported=На ҳама ҳаракатҳои содиршударо метавон ҳамчун содирот сабт кард Miscellaneous=Гуногун @@ -1128,6 +1132,7 @@ DeleteFileText=Оё шумо дар ҳақиқат мехоҳед ин файл ShowOtherLanguages=Забонҳои дигарро нишон диҳед SwitchInEditModeToAddTranslation=Барои илова кардани тарҷумаҳо ба ин забон ба ҳолати таҳрир гузаред NotUsedForThisCustomer=Барои ин муштарӣ истифода намешавад +NotUsedForThisVendor=Not used for this vendor AmountMustBePositive=Маблағ бояд мусбат бошад ByStatus=Аз рӯи мақом InformationMessage=Маълумот @@ -1148,14 +1153,14 @@ EventReminder=Ёддошти ҳодиса UpdateForAllLines=Навсозӣ барои ҳама сатрҳо OnHold=Барои нигоҳдорӣ Civility=Шаҳрвандӣ -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Set Supervisor +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor CreateExternalUser=Эҷоди корбари беруна ConfirmAffectTag=Bulk Tag Assignement ConfirmAffectUser=Bulk User Assignement -ProjectRole=Role assigned on each project -TasksRole=Role assigned on each task of each project +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ConfirmSetSupervisor=Bulk Supervisor Set ConfirmUpdatePrice=Choose a increase/decrease price rate ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Created from Public portal UserAgent=User Agent InternalUser=Internal user ExternalUser=External user +NoSpecificContactAddress=No specific contact or address +NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. +HideOnVCard=Hide %s +AddToContacts=Add address to my contacts +LastAccess=Last access +UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here +LastPasswordChangeDate=Last password change date diff --git a/htdocs/langs/tg_TJ/stripe.lang b/htdocs/langs/tg_TJ/stripe.lang index 603a5ec47c1..4bb52b86399 100644 --- a/htdocs/langs/tg_TJ/stripe.lang +++ b/htdocs/langs/tg_TJ/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Калиди зинда дар Webhook ONLINE_PAYMENT_WAREHOUSE=Ҳангоме ки пардохти онлайн анҷом дода мешавад, саҳмияҳо барои коҳиш додани саҳмия истифода мешаванд
    (TODO Вақте ки имкони коҳиш додани саҳмия дар асоси амали суратҳисоб сурат мегирад ва пардохти онлайн ҳисобнома -фактураро тавлид мекунад?) StripeLiveEnabled=Stripe live фаъол аст (дар акси ҳол ҳолати санҷиш/қуттии қуттиҳо) StripeImportPayment=Пардохтҳои Stripe воридотӣ -ExampleOfTestCreditCard=Намунаи корти кредитӣ барои санҷиш: %s => дуруст, %s => хатои CVC, %s => гузашт, %s => пардохт ноком шуд +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +ExampleOfTestBankAcountForSEPA=Example of bank account BAN for direct debit test: %s StripeGateways=Дарвозаҳои рахӣ OAUTH_STRIPE_TEST_ID=ID муштарии Stripe Connect (тақрибан _...) OAUTH_STRIPE_LIVE_ID=ID муштарии Stripe Connect (тақрибан _...) @@ -61,6 +62,7 @@ DeleteACard=Кортро нест кунед ConfirmDeleteCard=Шумо мутмаин ҳастед, ки ин корти кредитӣ ё дебетиро нест кардан мехоҳед? CreateCustomerOnStripe=Дар Stripe муштарӣ эҷод кунед CreateCardOnStripe=Дар Stripe корт эҷод кунед +CreateBANOnStripe=Create bank on Stripe ShowInStripe=Дар Stripe нишон диҳед StripeUserAccountForActions=Ҳисоби корбаре, ки барои почтаи электронӣ дар бораи баъзе чорабиниҳои Stripe истифода мешавад (пардохтҳои Stripe) StripePayoutList=Рӯйхати пардохтҳои Stripe @@ -69,3 +71,8 @@ ToOfferALinkForLiveWebhook=Истинод барои насб кардани Str PaymentWillBeRecordedForNextPeriod=Пардохт барои давраи оянда сабт карда мешавад. ClickHereToTryAgain= Барои дубора кӯшиш кардан ин ҷо клик кунед ... CreationOfPaymentModeMustBeDoneFromStripeInterface=Бо назардошти қоидаҳои қавии аутентификатсияи муштариён, сохтани корт бояд аз backoffice Stripe анҷом дода шавад. Шумо метавонед ин ҷо клик кунед, то сабти муштариёни Stripe -ро фаъол созед: %s +STRIPE_CARD_PRESENT=Card Present for Stripe Terminals +TERMINAL_LOCATION=Location (address) for Stripe Terminals +RequestDirectDebitWithStripe=Request Direct Debit with Stripe +STRIPE_SEPA_DIRECT_DEBIT=Enable the Direct Debit payments through Stripe + diff --git a/htdocs/langs/tg_TJ/users.lang b/htdocs/langs/tg_TJ/users.lang index 1147a06d8cb..7df85aa9491 100644 --- a/htdocs/langs/tg_TJ/users.lang +++ b/htdocs/langs/tg_TJ/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Link to user LinkedToDolibarrThirdParty=Link to third party CreateDolibarrLogin=Истифодабаранда эҷод кунед CreateDolibarrThirdParty=Эҷоди як шахси сеюм -LoginAccountDisableInDolibarr=Ҳисоб дар Dolibarr хомӯш карда шудааст. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Арзиши шахсиро истифода баред ExportDataset_user_1=Истифодабарандагон ва хосиятҳои онҳо DomainUser=Истифодабарандаи домен %s @@ -129,3 +130,6 @@ IPLastLogin=IP last login IPPreviousLogin=IP previous login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/th_TH/users.lang b/htdocs/langs/th_TH/users.lang index 1655cd05555..12dd28d1d2a 100644 --- a/htdocs/langs/th_TH/users.lang +++ b/htdocs/langs/th_TH/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Link to user LinkedToDolibarrThirdParty=Link to third party CreateDolibarrLogin=สร้างผู้ใช้ CreateDolibarrThirdParty=สร้างของบุคคลที่สาม -LoginAccountDisableInDolibarr=บัญชีปิดใช้งานใน Dolibarr +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=ใช้ค่าส่วนบุคคล ExportDataset_user_1=Users and their properties DomainUser=โดเมนของผู้ใช้% s @@ -129,3 +130,6 @@ IPLastLogin=IP last login IPPreviousLogin=IP previous login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/tr_TR/accountancy.lang b/htdocs/langs/tr_TR/accountancy.lang index 94fee86beb9..0584f7999b5 100644 --- a/htdocs/langs/tr_TR/accountancy.lang +++ b/htdocs/langs/tr_TR/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Taşıyıcı dönüş türünü seçin ACCOUNTING_EXPORT_PREFIX_SPEC=Dosya adı için öneki belirtin ThisService=Bu hizmet ThisProduct=Bu ürün -DefaultForService=Hizmet için varsayılan -DefaultForProduct=Ürün için varsayılan +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Product for this thirdparty ServiceForThisThirdparty=Service for this thirdparty CantSuggest=Öneri yok @@ -101,7 +101,8 @@ ShowAccountingAccount=Muhasebe hesabını göster ShowAccountingJournal=Muhasebe günlüğünü göster ShowAccountingAccountInLedger=Show accounting account in ledger ShowAccountingAccountInJournals=Show accounting account in journals -AccountAccountingSuggest=Önerilen muhasebe hesabı +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=Varsayılan hesaplar MenuBankAccounts=Banka hesapları MenuVatAccounts=KDV hesapları @@ -126,6 +127,7 @@ WriteBookKeeping=Record transactions in accounting Bookkeeping=Büyük Defter BookkeepingSubAccount=Subledger AccountBalance=Hesap bakiyesi +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Source object ref CAHTF=Total purchase vendor before tax TotalExpenseReport=Toplam gider raporu @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=Journal label NumPiece=Parça sayısı TransactionNumShort=Num. transaction AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Group by general ledger account GroupBySubAccountAccounting=Group by subledger account AccountingAccountGroupsDesc=You can define here some groups of accounting account. They will be used for personalized accounting reports. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Show subtotal by level Pcgtype=Hesap grubu PcgtypeDesc=Group of account are used as predefined 'filter' and 'grouping' criteria for some accounting reports. For example, 'INCOME' or 'EXPENSE' are used as groups for accounting accounts of products to build the expense/income report. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Reconcilable @@ -294,6 +299,7 @@ DescValidateMovements=Any modification or deletion of writing, lettering and del ValidateHistory=Otomatik Olarak Bağla AutomaticBindingDone=Automatic bindings done (%s) - Automatic binding not possible for some record (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Disable binding & transfer in accountancy on ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Disable binding & transfer in accountancy on purchases (vendor invoices will not be taken into account in accounting) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Disable binding & transfer in accountancy on expense reports (expense reports will not be taken into account in accounting) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Flag exported lines as Exported (to modify a line, you will need to delete the whole transaction and re-transfert it into accounting) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=Date validation and lock ConfirmExportFile=Confirmation of the generation of the accounting export file ? ExportDraftJournal=Export draft journal @@ -398,7 +406,7 @@ SaleLocal=Local sale SaleExport=Export sale SaleEEC=Sale in EEC SaleEECWithVAT=Sale in EEC with a VAT not null, so we suppose this is NOT an intracommunautary sale and the suggested account is the standard product account. -SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fallback on the product account for standard sales. You can fix the VAT ID of thirdparty or the product account if needed. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Forbidden: The transaction has been validated and/or exported. ForbiddenTransactionAlreadyValidated=Forbidden: The transaction has been validated. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Mismatch in reconcile code AccountancyErrorMismatchBalanceAmount=The balance (%s) is not equal to 0 AccountancyErrorLetteringBookkeeping=Errors have occurred concerning the transactions: %s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Muhasebe girişleri @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Multicurrency code (Idevise) DateExport=Date export WarningReportNotReliable=Warning, this report is not based on the Ledger, so does not contains transaction modified manually in the Ledger. If your journalization is up to date, the bookkeeping view is more accurate. ExpenseReportJournal=Expense Report Journal +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s accounts diff --git a/htdocs/langs/tr_TR/ticket.lang b/htdocs/langs/tr_TR/ticket.lang index 453a58dd926..590a0e90841 100644 --- a/htdocs/langs/tr_TR/ticket.lang +++ b/htdocs/langs/tr_TR/ticket.lang @@ -26,6 +26,7 @@ Permission56002=Destek bildirimini değiştir Permission56003=Destek bildirimlerini sil Permission56004=Destek bildirimlerini yönet Permission56005=See tickets of all third parties (not effective for external users, always be limited to the third party they depend on) +Permission56006=Export tickets Tickets=Destek Bildirimleri TicketDictType=Destek Bildirimi - Türler @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=Dış iştirakçi OriginEmail=Reporter Email Notify_TICKET_SENTBYMAIL=Destek bildirimini e-posta ile gönderil +ExportDataset_ticket_1=Destek Bildirimleri + # Status Read=Okundu Assigned=Atanan diff --git a/htdocs/langs/tr_TR/users.lang b/htdocs/langs/tr_TR/users.lang index d298ce917bb..fe0e40767ca 100644 --- a/htdocs/langs/tr_TR/users.lang +++ b/htdocs/langs/tr_TR/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Link to user LinkedToDolibarrThirdParty=Link to third party CreateDolibarrLogin=Bir kullanıcı oluştur CreateDolibarrThirdParty=Bir üçüncü parti oluştur -LoginAccountDisableInDolibarr=Dolibarr’da hesap engelli. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Kişisel değer kullanın ExportDataset_user_1=Kullanıcılar ve özellikleri DomainUser=Etki alanı kullanıcısı %s @@ -129,3 +130,6 @@ IPLastLogin=IP last login IPPreviousLogin=IP previous login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/uk_UA/accountancy.lang b/htdocs/langs/uk_UA/accountancy.lang index d5411f8801e..6a7705786ac 100644 --- a/htdocs/langs/uk_UA/accountancy.lang +++ b/htdocs/langs/uk_UA/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Виберіть тип перенесення ряд ACCOUNTING_EXPORT_PREFIX_SPEC=Задати префікс для назви файлу ThisService=Ця послуга ThisProduct=Цей товар -DefaultForService=За замовчуванням для обслуговування -DefaultForProduct=За замовчуванням для продукту +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Продукт для цієї третьої сторони ServiceForThisThirdparty=Сервіс для цієї третьої сторони CantSuggest=Не можу запропонувати @@ -101,7 +101,8 @@ ShowAccountingAccount=Показати бухгалтерський рахуно ShowAccountingJournal=Показати бухгалтерський журнал ShowAccountingAccountInLedger=Показати бухгалтерський рахунок у книзі ShowAccountingAccountInJournals=Показати бухгалтерський облік у журналах -AccountAccountingSuggest=Запропоновано бухгалтерський рахунок +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=Облікові записи за замовчуванням MenuBankAccounts=Банківські рахунки MenuVatAccounts=ПДВ рахунки @@ -126,6 +127,7 @@ WriteBookKeeping=Записати операції в бухгалтерсько Bookkeeping=Головна книга BookkeepingSubAccount=Підкнига AccountBalance=Баланс +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Посилання на вихідний об'єкт CAHTF=Загальна сума закупівлі постачальника до оподаткування TotalExpenseReport=Звіт про загальні витрати @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=Етикетка журналу NumPiece=Номер штуки TransactionNumShort=Кількість транзакції AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Групувати за рахунками Головної книги GroupBySubAccountAccounting=Групувати за рахунками підкниги AccountingAccountGroupsDesc=Тут можна визначити кілька груп облікових рахунків. Вони будуть використовуватися для персоніфікованих бухгалтерських звітів. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Показати проміжний підсумок за р Pcgtype=Група рахунку PcgtypeDesc=Групи облікових записів використовуються як попередньо визначені критерії «фільтра» та «групування» для деяких бухгалтерських звітів. Наприклад, «ДОХОД» або «ВИТРАТ» використовуються як групи для обліку рахунків продуктів для побудови звіту про витрати/доходи. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Примирений @@ -294,6 +299,7 @@ DescValidateMovements=Будь-яка зміна чи видалення зап ValidateHistory=Прив’язувати автоматично AutomaticBindingDone=Автоматичне прив’язування виконано (%s) – Автоматичне прив’язування неможливе для деяких записів (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Вимкнути прив'язку та пе ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Вимкнути прив'язку та переказ в обліку закупівель (рахунки постачальника не будуть враховуватися в обліку) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Вимкнути прив'язку та перенесення в бухгалтерії у звітах про витрати (звіти про витрати не враховуватимуться в бухгалтерії) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Позначте експортовані рядки як експортовані (щоб змінити рядок, вам потрібно буде видалити всю транзакцію та повторно перенести її в облік) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=Перевірка дати та блокування ConfirmExportFile=Підтвердження створення файлу експорту бухгалтерського обліку? ExportDraftJournal=Експортувати чернетку журналу @@ -398,7 +406,7 @@ SaleLocal=Місцевий розпродаж SaleExport=Продаж на експорт SaleEEC=Продаж в ЄЕС SaleEECWithVAT=Продаж в ЄЕС з ПДВ не є нульовим, тому ми припускаємо, що це НЕ внутрішньокомунальний продаж, а запропонований обліковий запис є стандартним рахунком продукту. -SaleEECWithoutVATNumber=Продаж в ЄЕС без ПДВ, але ідентифікаційний номер платника ПДВ третьої сторони не визначений. Ми повертаємось до облікового запису продукту для стандартних продажів. За потреби ви можете виправити ідентифікаційний номер платника ПДВ третьої сторони або обліковий запис продукту. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Заборонено: трансакцію підтверджено та/або експортовано. ForbiddenTransactionAlreadyValidated=Заборонено: трансакцію підтверджено. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Невідповідність коду уз AccountancyErrorMismatchBalanceAmount=Залишок (%s) не дорівнює 0 AccountancyErrorLetteringBookkeeping=Сталися помилки щодо транзакцій: %s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Бухгалтерські проводки @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Мультивалютний код (Idevise) DateExport=Експорт дати WarningReportNotReliable=Попередження, цей звіт не базується на Книзі, тому не містить транзакції, змінені вручну в Книзі. Якщо ваша журнальність оновлена, бухгалтерський облік буде точнішим. ExpenseReportJournal=Журнал звітів про витрати +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s облікові записи diff --git a/htdocs/langs/uk_UA/main.lang b/htdocs/langs/uk_UA/main.lang index ba5adc74e53..8595f4c269b 100644 --- a/htdocs/langs/uk_UA/main.lang +++ b/htdocs/langs/uk_UA/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=Група користувачів не визначена Password=Пароль PasswordRetype=Repeat your password NoteSomeFeaturesAreDisabled=Зауважте, що багато функцій/модулів вимкнено в цій демонстрації. +YourUserFile=Your user file Name=Ім'я NameSlashCompany=Назва / Компанія Person=Особа @@ -897,6 +898,9 @@ MassFilesArea=Область для файлів, створених за доп ShowTempMassFilesArea=Показати область файлів, створених масовими діями ConfirmMassDeletion=Підтвердження масового видалення ConfirmMassDeletionQuestion=Ви впевнені, що хочете видалити %s вибраний запис(и)? +ConfirmMassClone=Bulk clone confirmation +ConfirmMassCloneQuestion=Select project to clone to +ConfirmMassCloneToOneProject=Clone to project %s RelatedObjects=Пов'язані об'єкти ClassifyBilled=Класифікувати виставлений рахунок ClassifyUnbilled=Класифікувати без рахунків @@ -912,8 +916,8 @@ ExportFilteredList=Експортувати відфільтрований сп ExportList=Список експорту ExportOptions=Параметри експорту IncludeDocsAlreadyExported=Включити вже експортовані документи -ExportOfPiecesAlreadyExportedIsEnable=Експорт уже експортованих елементів увімкнено -ExportOfPiecesAlreadyExportedIsDisable=Експорт уже експортованих частин вимкнено +ExportOfPiecesAlreadyExportedIsEnable=Documents already exported are visible and will be exported +ExportOfPiecesAlreadyExportedIsDisable=Documents already exported are hidden and won't be exported AllExportedMovementsWereRecordedAsExported=Усі експортовані переміщення були записані як експортовані NotAllExportedMovementsCouldBeRecordedAsExported=Не всі експортовані переміщення можна записати як експортовані Miscellaneous=Різне @@ -1128,6 +1132,7 @@ DeleteFileText=Ви дійсно хочете видалити цей файл? ShowOtherLanguages=Показати інші мови SwitchInEditModeToAddTranslation=Перейдіть у режим редагування, щоб додати переклади для цієї мови NotUsedForThisCustomer=Не використовується для цього клієнта +NotUsedForThisVendor=Not used for this vendor AmountMustBePositive=Сума має бути додатною ByStatus=За статусом InformationMessage=Інформація @@ -1148,14 +1153,14 @@ EventReminder=Нагадування про подію UpdateForAllLines=Оновлення для всіх ліній OnHold=На утриманні Civility=Цивілізованість -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Set Supervisor +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor CreateExternalUser=Створити зовнішнього користувача ConfirmAffectTag=Bulk Tag Assignement ConfirmAffectUser=Bulk User Assignement -ProjectRole=Role assigned on each project -TasksRole=Role assigned on each task of each project +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ConfirmSetSupervisor=Bulk Supervisor Set ConfirmUpdatePrice=Choose a increase/decrease price rate ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Created from Public portal UserAgent=User Agent InternalUser=Внутрішній користувач ExternalUser=Зовнішній користувач +NoSpecificContactAddress=No specific contact or address +NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. +HideOnVCard=Hide %s +AddToContacts=Add address to my contacts +LastAccess=Last access +UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here +LastPasswordChangeDate=Last password change date diff --git a/htdocs/langs/uk_UA/stripe.lang b/htdocs/langs/uk_UA/stripe.lang index a8f9176d83a..8d79eb35634 100644 --- a/htdocs/langs/uk_UA/stripe.lang +++ b/htdocs/langs/uk_UA/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Живий ключ Webhook ONLINE_PAYMENT_WAREHOUSE=Запас, який буде використовуватися для зменшення запасу, коли здійснюється онлайн-оплата
    (TODO Коли опція зменшення запасу виконується за дією на рахунку-фактурі, а онлайн-платеж сам створює рахунок?) StripeLiveEnabled=Stripe live увімкнено (інакше тестовий режим/режим пісочниці) StripeImportPayment=Імпортні платежі Stripe -ExampleOfTestCreditCard=Приклад кредитної картки для тесту: %s => дійсний, %s => помилка CVC, %s => термін дії закінчився, %s => платіж не виконується +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +ExampleOfTestBankAcountForSEPA=Example of bank account BAN for direct debit test: %s StripeGateways=Смугові шлюзи OAUTH_STRIPE_TEST_ID=Ідентифікатор клієнта Stripe Connect (ca_...) OAUTH_STRIPE_LIVE_ID=Ідентифікатор клієнта Stripe Connect (ca_...) @@ -61,6 +62,7 @@ DeleteACard=Видалити картку ConfirmDeleteCard=Ви впевнені, що хочете видалити цю кредитну або дебетову картку? CreateCustomerOnStripe=Створіть клієнта на Stripe CreateCardOnStripe=Створіть картку на Stripe +CreateBANOnStripe=Create bank on Stripe ShowInStripe=Показати в Stripe StripeUserAccountForActions=Обліковий запис користувача для сповіщень електронною поштою про деякі події Stripe (виплати Stripe) StripePayoutList=Список виплат Stripe @@ -69,3 +71,8 @@ ToOfferALinkForLiveWebhook=Посилання на налаштування Stri PaymentWillBeRecordedForNextPeriod=Оплата буде зафіксована на наступний період. ClickHereToTryAgain= Натисніть тут, щоб спробувати ще раз... CreationOfPaymentModeMustBeDoneFromStripeInterface=У зв’язку зі строгими правилами автентифікації клієнтів створення картки має здійснюватися з бек-офісу Stripe. Ви можете натиснути тут, щоб увімкнути запис клієнта Stripe: %s +STRIPE_CARD_PRESENT=Card Present for Stripe Terminals +TERMINAL_LOCATION=Location (address) for Stripe Terminals +RequestDirectDebitWithStripe=Request Direct Debit with Stripe +STRIPE_SEPA_DIRECT_DEBIT=Enable the Direct Debit payments through Stripe + diff --git a/htdocs/langs/uk_UA/ticket.lang b/htdocs/langs/uk_UA/ticket.lang index d88d27762ff..d0fcbb730a1 100644 --- a/htdocs/langs/uk_UA/ticket.lang +++ b/htdocs/langs/uk_UA/ticket.lang @@ -26,6 +26,7 @@ Permission56002=Редагувати заявки Permission56003=Видалити заявки Permission56004=Управління заявками Permission56005=Перегляньте заявки всіх контрагентів (не діє для зовнішніх користувачів, завжди обмежуйтеся третьою стороною, від якої вони залежать) +Permission56006=Export tickets Tickets=Заявки TicketDictType=Заявка - Типи @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=Зовнішній учасник OriginEmail=Електронна пошта репортера Notify_TICKET_SENTBYMAIL=Надішліть повідомлення про квиток електронною поштою +ExportDataset_ticket_1=Заявки + # Status Read=Прочитані Assigned=Призначений diff --git a/htdocs/langs/uk_UA/users.lang b/htdocs/langs/uk_UA/users.lang index 1f58e8b8106..d5db35b5ae2 100644 --- a/htdocs/langs/uk_UA/users.lang +++ b/htdocs/langs/uk_UA/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Посилання на користувача LinkedToDolibarrThirdParty=Посилання на третю сторону CreateDolibarrLogin=Створити користувача CreateDolibarrThirdParty=Створіть третю сторону -LoginAccountDisableInDolibarr=Обліковий запис вимкнено в Dolibarr. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Використовуйте особисту цінність ExportDataset_user_1=Користувачі та їх властивості DomainUser=Користувач домену %s @@ -129,3 +130,6 @@ IPLastLogin=IP останній вхід IPPreviousLogin=IP попередній вхід ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/ur_PK/accountancy.lang b/htdocs/langs/ur_PK/accountancy.lang index c6d3ff12bb5..69f1111e627 100644 --- a/htdocs/langs/ur_PK/accountancy.lang +++ b/htdocs/langs/ur_PK/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=گاڑی کی واپسی کی قسم منتخب کری ACCOUNTING_EXPORT_PREFIX_SPEC=فائل کے نام کے لیے سابقہ کی وضاحت کریں۔ ThisService=یہ سروس ThisProduct=یہ مصنوعات -DefaultForService=سروس کے لیے ڈیفالٹ -DefaultForProduct=پروڈکٹ کے لیے ڈیفالٹ +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=اس تھرڈ پارٹی کے لیے پروڈکٹ ServiceForThisThirdparty=اس تھرڈ پارٹی کے لیے سروس CantSuggest=تجویز نہیں کر سکتے @@ -101,7 +101,8 @@ ShowAccountingAccount=حساب کتاب دکھائیں۔ ShowAccountingJournal=اکاؤنٹنگ جرنل دکھائیں۔ ShowAccountingAccountInLedger=لیجر میں حساب کتاب دکھائیں۔ ShowAccountingAccountInJournals=جرائد میں حساب کتاب دکھائیں۔ -AccountAccountingSuggest=اکاؤنٹنگ اکاؤنٹ تجویز کیا گیا۔ +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=ڈیفالٹ اکاؤنٹس MenuBankAccounts=بینک اکاؤنٹ MenuVatAccounts=واٹ اکاؤنٹس @@ -126,6 +127,7 @@ WriteBookKeeping=Record transactions in accounting Bookkeeping=لیجر BookkeepingSubAccount=ذیلی AccountBalance=اکاؤنٹ بیلنس +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=ماخذ آبجیکٹ ریف CAHTF=ٹیکس سے پہلے کل خرید فروش TotalExpenseReport=کل اخراجات کی رپورٹ @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=جرنل لیبل NumPiece=ٹکڑا نمبر TransactionNumShort=نمبر لین دین AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=عام لیجر اکاؤنٹ کے لحاظ سے گروپ کریں۔ GroupBySubAccountAccounting=سبلیجر اکاؤنٹ کے لحاظ سے گروپ کریں۔ AccountingAccountGroupsDesc=آپ یہاں اکاؤنٹنگ اکاؤنٹ کے کچھ گروپس کی وضاحت کر سکتے ہیں۔ وہ ذاتی اکاؤنٹنگ رپورٹس کے لیے استعمال کیے جائیں گے۔ @@ -265,6 +269,7 @@ ShowSubtotalByGroup=سطح کے لحاظ سے ذیلی کل دکھائیں۔ Pcgtype=اکاؤنٹ کا گروپ PcgtypeDesc=اکاؤنٹ کے گروپ کو کچھ اکاؤنٹنگ رپورٹس کے لیے پہلے سے طے شدہ 'فلٹر' اور 'گروپنگ' کے معیار کے طور پر استعمال کیا جاتا ہے۔ مثال کے طور پر، 'انکم' یا 'خرچ' کو اخراجات/آمدنی کی رپورٹ بنانے کے لیے مصنوعات کے اکاؤنٹنگ اکاؤنٹس کے لیے بطور گروپ استعمال کیا جاتا ہے۔ +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=قابلِ مصالحت @@ -294,6 +299,7 @@ DescValidateMovements=تحریر، حروف اور حذف میں کسی قسم ValidateHistory=خودکار طور پر باندھیں۔ AutomaticBindingDone=خودکار بائنڈنگ ہو گئی (%s) - کچھ ریکارڈ کے لیے خودکار بائنڈنگ ممکن نہیں ہے (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=سیلز پر اکاؤنٹنسی میں با ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=خریداری پر اکاؤنٹنسی میں بائنڈنگ اور ٹرانسفر کو غیر فعال کریں (وینڈر انوائس کو اکاؤنٹنگ میں مدنظر نہیں رکھا جائے گا) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=اخراجات کی رپورٹوں پر اکاؤنٹنسی میں بائنڈنگ اور ٹرانسفر کو غیر فعال کریں (اکاؤنٹنگ میں اخراجات کی رپورٹوں کو مدنظر نہیں رکھا جائے گا) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Flag exported lines as Exported (to modify a line, you will need to delete the whole transaction and re-transfert it into accounting) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=Date validation and lock ConfirmExportFile=اکاؤنٹنگ برآمد فائل کی نسل کی تصدیق؟ ExportDraftJournal=ڈرافٹ جرنل برآمد کریں۔ @@ -398,7 +406,7 @@ SaleLocal=مقامی فروخت SaleExport=برآمد کی فروخت SaleEEC=ای ای سی میں فروخت SaleEECWithVAT=VAT کے ساتھ EEC میں فروخت کالعدم نہیں، لہذا ہم سمجھتے ہیں کہ یہ انٹرا کمیونٹری سیل نہیں ہے اور تجویز کردہ اکاؤنٹ معیاری پروڈکٹ اکاؤنٹ ہے۔ -SaleEECWithoutVATNumber=بغیر VAT کے EEC میں فروخت لیکن تیسرے فریق کی VAT ID کی وضاحت نہیں کی گئی ہے۔ ہم معیاری فروخت کے لیے پروڈکٹ اکاؤنٹ پر فال بیک کرتے ہیں۔ اگر ضرورت ہو تو آپ فریق ثالث کی VAT ID یا پروڈکٹ اکاؤنٹ کو ٹھیک کر سکتے ہیں۔ +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=ممنوع: لین دین کی توثیق اور/یا برآمد کی گئی ہے۔ ForbiddenTransactionAlreadyValidated=ممنوع: لین دین کی توثیق کر دی گئی ہے۔ ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Mismatch in reconcile code AccountancyErrorMismatchBalanceAmount=The balance (%s) is not equal to 0 AccountancyErrorLetteringBookkeeping=Errors have occurred concerning the transactions: %s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=اکاؤنٹنگ اندراجات @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=ملٹی کرنسی کوڈ (آئیڈیوائز) DateExport=تاریخ برآمد WarningReportNotReliable=انتباہ، یہ رپورٹ لیجر پر مبنی نہیں ہے، لہذا اس میں لیجر میں دستی طور پر ترمیم شدہ لین دین شامل نہیں ہے۔ اگر آپ کی جرنلائزیشن اپ ٹو ڈیٹ ہے، تو بک کیپنگ کا نظریہ زیادہ درست ہے۔ ExpenseReportJournal=اخراجات کی رپورٹ جرنل +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s اکاؤنٹس diff --git a/htdocs/langs/ur_PK/main.lang b/htdocs/langs/ur_PK/main.lang index 4ab620c3cd0..6959eaf5a6a 100644 --- a/htdocs/langs/ur_PK/main.lang +++ b/htdocs/langs/ur_PK/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=کسی صارف گروپ کی وضاحت نہیں کی گئی Password=پاس ورڈ PasswordRetype=Repeat your password NoteSomeFeaturesAreDisabled=نوٹ کریں کہ اس مظاہرے میں بہت ساری خصوصیات/ماڈیولز غیر فعال ہیں۔ +YourUserFile=Your user file Name=نام NameSlashCompany=نام / کمپنی Person=شخص @@ -897,6 +898,9 @@ MassFilesArea=بڑے پیمانے پر کارروائیوں کے ذریعے بن ShowTempMassFilesArea=بڑے پیمانے پر کارروائیوں سے بنی فائلوں کا علاقہ دکھائیں۔ ConfirmMassDeletion=بلک ڈیلیٹ کی تصدیق ConfirmMassDeletionQuestion=کیا آپ واقعی %s منتخب کردہ ریکارڈ (ریکارڈز) کو حذف کرنا چاہتے ہیں؟ +ConfirmMassClone=Bulk clone confirmation +ConfirmMassCloneQuestion=Select project to clone to +ConfirmMassCloneToOneProject=Clone to project %s RelatedObjects=متعلقہ اشیاء ClassifyBilled=بل کی درجہ بندی کریں۔ ClassifyUnbilled=بغیر بل کی درجہ بندی کریں۔ @@ -912,8 +916,8 @@ ExportFilteredList=فلٹر شدہ فہرست برآمد کریں۔ ExportList=برآمد کی فہرست ExportOptions=برآمد کے اختیارات IncludeDocsAlreadyExported=پہلے سے برآمد شدہ دستاویزات شامل کریں۔ -ExportOfPiecesAlreadyExportedIsEnable=پہلے سے برآمد شدہ ٹکڑوں کی برآمد قابل ہے۔ -ExportOfPiecesAlreadyExportedIsDisable=پہلے سے برآمد شدہ ٹکڑوں کی برآمد غیر فعال ہے۔ +ExportOfPiecesAlreadyExportedIsEnable=Documents already exported are visible and will be exported +ExportOfPiecesAlreadyExportedIsDisable=Documents already exported are hidden and won't be exported AllExportedMovementsWereRecordedAsExported=تمام برآمد شدہ نقل و حرکت بطور برآمد ریکارڈ کی گئیں۔ NotAllExportedMovementsCouldBeRecordedAsExported=تمام برآمد شدہ نقل و حرکت کو برآمد کے طور پر ریکارڈ نہیں کیا جا سکتا Miscellaneous=متفرق @@ -1128,6 +1132,7 @@ DeleteFileText=کیا آپ واقعی اس فائل کو حذف کرنا چاہ ShowOtherLanguages=دوسری زبانیں دکھائیں۔ SwitchInEditModeToAddTranslation=اس زبان کے لیے ترجمے شامل کرنے کے لیے ترمیم کے موڈ میں جائیں۔ NotUsedForThisCustomer=اس گاہک کے لیے استعمال نہیں کیا گیا۔ +NotUsedForThisVendor=Not used for this vendor AmountMustBePositive=رقم مثبت ہونی چاہیے۔ ByStatus=حیثیت سے InformationMessage=معلومات @@ -1148,14 +1153,14 @@ EventReminder=واقعہ کی یاد دہانی UpdateForAllLines=تمام لائنوں کے لیے اپ ڈیٹ کریں۔ OnHold=ہولڈ پر Civility=تہذیب -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Set Supervisor +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor CreateExternalUser=بیرونی صارف بنائیں ConfirmAffectTag=Bulk Tag Assignement ConfirmAffectUser=Bulk User Assignement -ProjectRole=Role assigned on each project -TasksRole=Role assigned on each task of each project +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ConfirmSetSupervisor=Bulk Supervisor Set ConfirmUpdatePrice=Choose a increase/decrease price rate ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Created from Public portal UserAgent=User Agent InternalUser=Internal user ExternalUser=External user +NoSpecificContactAddress=No specific contact or address +NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. +HideOnVCard=Hide %s +AddToContacts=Add address to my contacts +LastAccess=Last access +UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here +LastPasswordChangeDate=Last password change date diff --git a/htdocs/langs/ur_PK/stripe.lang b/htdocs/langs/ur_PK/stripe.lang index 0c93b87f81c..8c750d656f8 100644 --- a/htdocs/langs/ur_PK/stripe.lang +++ b/htdocs/langs/ur_PK/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=ویب ہُک لائیو کلید ONLINE_PAYMENT_WAREHOUSE=جب آن لائن ادائیگی کی جاتی ہے تو اسٹاک کو کم کرنے کے لیے استعمال کیا جائے گا StripeLiveEnabled=اسٹرائپ لائیو فعال (بصورت دیگر ٹیسٹ/سینڈ باکس موڈ) StripeImportPayment=پٹی کی ادائیگی درآمد کریں۔ -ExampleOfTestCreditCard=ٹیسٹ کے لیے کریڈٹ کارڈ کی مثال: %s => درست، %s => غلطی CVC، %s => میعاد ختم، %s => چارج ناکام +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +ExampleOfTestBankAcountForSEPA=Example of bank account BAN for direct debit test: %s StripeGateways=پٹی والے دروازے OAUTH_STRIPE_TEST_ID=اسٹرائپ کنیکٹ کلائنٹ آئی ڈی (ca_...) OAUTH_STRIPE_LIVE_ID=اسٹرائپ کنیکٹ کلائنٹ آئی ڈی (ca_...) @@ -61,6 +62,7 @@ DeleteACard=کارڈ حذف کریں۔ ConfirmDeleteCard=کیا آپ واقعی اس کریڈٹ یا ڈیبٹ کارڈ کو حذف کرنا چاہتے ہیں؟ CreateCustomerOnStripe=پٹی پر گاہک بنائیں CreateCardOnStripe=پٹی پر کارڈ بنائیں +CreateBANOnStripe=Create bank on Stripe ShowInStripe=پٹی میں دکھائیں۔ StripeUserAccountForActions=کچھ اسٹرائپ ایونٹس کی ای میل اطلاع کے لیے استعمال کرنے والا صارف اکاؤنٹ (سٹرائپ ادائیگی) StripePayoutList=پٹی کی ادائیگیوں کی فہرست @@ -69,3 +71,8 @@ ToOfferALinkForLiveWebhook=IPN (لائیو موڈ) کو کال کرنے کے ل PaymentWillBeRecordedForNextPeriod=ادائیگی اگلی مدت کے لیے ریکارڈ کی جائے گی۔ ClickHereToTryAgain= دوبارہ کوشش کرنے کے لیے یہاں کلک کریں... CreationOfPaymentModeMustBeDoneFromStripeInterface=مضبوط کسٹمر تصدیقی اصولوں کی وجہ سے، کارڈ کی تخلیق اسٹرائپ بیک آفس سے ہونی چاہیے۔ آپ اسٹرائپ کسٹمر ریکارڈ پر سوئچ کرنے کے لیے یہاں کلک کر سکتے ہیں: %s +STRIPE_CARD_PRESENT=Card Present for Stripe Terminals +TERMINAL_LOCATION=Location (address) for Stripe Terminals +RequestDirectDebitWithStripe=Request Direct Debit with Stripe +STRIPE_SEPA_DIRECT_DEBIT=Enable the Direct Debit payments through Stripe + diff --git a/htdocs/langs/ur_PK/users.lang b/htdocs/langs/ur_PK/users.lang index e14eaf1e067..31e30c51062 100644 --- a/htdocs/langs/ur_PK/users.lang +++ b/htdocs/langs/ur_PK/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=صارف سے لنک کریں۔ LinkedToDolibarrThirdParty=تیسرے فریق سے لنک کریں۔ CreateDolibarrLogin=ایک صارف بنائیں CreateDolibarrThirdParty=تیسری پارٹی بنائیں -LoginAccountDisableInDolibarr=Dolibarr میں اکاؤنٹ کو غیر فعال کر دیا گیا ہے۔ +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=ذاتی قدر استعمال کریں۔ ExportDataset_user_1=صارفین اور ان کی خصوصیات DomainUser=ڈومین صارف %s @@ -129,3 +130,6 @@ IPLastLogin=IP last login IPPreviousLogin=IP previous login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/uz_UZ/accountancy.lang b/htdocs/langs/uz_UZ/accountancy.lang index d1e47ddef53..9f5abafab80 100644 --- a/htdocs/langs/uz_UZ/accountancy.lang +++ b/htdocs/langs/uz_UZ/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Vagonni qaytarish turini tanlang ACCOUNTING_EXPORT_PREFIX_SPEC=Specify the prefix for the file name ThisService=Ushbu xizmat ThisProduct=Ushbu mahsulot -DefaultForService=Xizmat uchun standart -DefaultForProduct=Mahsulot uchun standart +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Ushbu uchinchi tomon uchun mahsulot ServiceForThisThirdparty=Ushbu uchinchi tomon uchun xizmat CantSuggest=Taklif qila olmayman @@ -101,7 +101,8 @@ ShowAccountingAccount=Buxgalteriya hisobini ko'rsatish ShowAccountingJournal=Buxgalteriya jurnalini ko'rsatish ShowAccountingAccountInLedger=Buxgalteriya hisobini daftarda ko'rsatish ShowAccountingAccountInJournals=Buxgalteriya hisobini jurnallarda ko'rsatish -AccountAccountingSuggest=Buxgalteriya hisobi tavsiya etildi +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=Standart hisoblar MenuBankAccounts=Bank hisobvaraqlari MenuVatAccounts=QQS hisob-kitoblari @@ -126,6 +127,7 @@ WriteBookKeeping=Buxgalteriya hisobida operatsiyalarni qayd etish Bookkeeping=Kitob BookkeepingSubAccount=Subledger AccountBalance=Hisob balansi +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Manba ob'ekti ref CAHTF=Soliqqa qadar jami sotib olish sotuvchisi TotalExpenseReport=Jami xarajatlar hisoboti @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=Jurnal yorlig'i NumPiece=Parcha raqami TransactionNumShort=Raqam bitim AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Bosh kitob schyoti bo'yicha guruhlash GroupBySubAccountAccounting=Subledger schyoti bo'yicha guruhlash AccountingAccountGroupsDesc=Siz bu erda buxgalteriya hisobining ayrim guruhlarini belgilashingiz mumkin. Ular shaxsiylashtirilgan buxgalteriya hisobotlari uchun ishlatiladi. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Subtotalni daraja bo'yicha ko'rsatish Pcgtype=Hisob guruhi PcgtypeDesc=Hisob-kitoblar guruhi ba'zi buxgalteriya hisobotlari uchun oldindan belgilangan "filtr" va "guruhlash" mezonlari sifatida ishlatiladi. Masalan, "KIRISh" yoki "XARAJATLAR" xarajatlar / daromadlar to'g'risidagi hisobotni tuzish uchun mahsulotlarning buxgalteriya hisobi guruhlari sifatida ishlatiladi. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Yarashtiriladigan @@ -294,6 +299,7 @@ DescValidateMovements=Yozishni, xatlarni va o'chirishni har qanday o'zgartirish ValidateHistory=Avtomatik bog'lash AutomaticBindingDone=Avtomatik ulanishlar bajarildi (%s) - Ba'zi yozuvlar uchun avtomatik bog'lash mumkin emas (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Harakat to'g'ri muvozanatlanmagan. Debet = %s & Kredit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Sotish bo'yicha buxgalteriyada majburiy va o ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Xaridlar bo'yicha buxgalteriyada majburiy va o'tkazishni o'chirib qo'ying (sotuvchi hisob-kitoblari buxgalteriya hisobida hisobga olinmaydi) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Xarajatlar hisobotlari bo'yicha buxgalteriyada majburiy va o'tkazishni o'chirib qo'ying (xarajatlar hisoboti buxgalteriya hisobida hisobga olinmaydi) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Eksport qilingan qatorlarni eksport qilingan deb belgilash (chiziqni o‘zgartirish uchun siz butun tranzaksiyani o‘chirib tashlashingiz va uni buxgalteriya hisobiga qayta o‘tkazishingiz kerak) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=Sanani tekshirish va qulflash ConfirmExportFile=Buxgalteriya eksporti faylini yaratishni tasdiqlashmi? ExportDraftJournal=Jurnal jurnalini eksport qiling @@ -398,7 +406,7 @@ SaleLocal=Mahalliy sotuv SaleExport=Eksportni sotish SaleEEC=EECda sotish SaleEECWithVAT=EECda QQS bilan sotish bekor bo'lmaydi, shuning uchun bu kommunal ichki savdo emas va taklif qilingan hisob standart mahsulot hisobvarag'i. -SaleEECWithoutVATNumber=EECda QQSsiz sotish, lekin uchinchi tomonning QQS identifikatori aniqlanmagan. Biz standart sotuvlar uchun mahsulot hisobiga tushamiz. Agar kerak bo'lsa, siz uchinchi tomonning QQS identifikatorini yoki mahsulot hisobini tuzatishingiz mumkin. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Taqiqlangan: tranzaktsiya tasdiqlangan va/yoki eksport qilingan. ForbiddenTransactionAlreadyValidated=Taqiqlangan: tranzaksiya tasdiqlangan. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Kelishuv kodidagi nomuvofiqlik AccountancyErrorMismatchBalanceAmount=Balans (%s) 0 ga teng emas AccountancyErrorLetteringBookkeeping=Tranzaktsiyalarda xatoliklar yuz berdi: %s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Buxgalteriya yozuvlari @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Ko'p valyuta kodi (Idevise) DateExport=Sana eksporti WarningReportNotReliable=Diqqat, ushbu hisobot daftarga asoslanmagan, shuning uchun daftarda qo'lda o'zgartirilgan bitimni o'z ichiga olmaydi. Agar sizning jurnalizatsiya dolzarb bo'lsa, buxgalteriya hisobi yanada aniqroq bo'ladi. ExpenseReportJournal=Xarajatlar bo'yicha hisobot jurnali +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s hisob qaydnomalari diff --git a/htdocs/langs/uz_UZ/main.lang b/htdocs/langs/uz_UZ/main.lang index 88629c28785..91ca7aeebca 100644 --- a/htdocs/langs/uz_UZ/main.lang +++ b/htdocs/langs/uz_UZ/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=Hech qanday foydalanuvchi guruhi aniqlanmagan Password=Parol PasswordRetype=Repeat your password NoteSomeFeaturesAreDisabled=Ushbu namoyishda ko'plab funktsiyalar / modullar o'chirilganligini unutmang. +YourUserFile=Your user file Name=Ism NameSlashCompany=Ism / kompaniya Person=Shaxs @@ -897,6 +898,9 @@ MassFilesArea=Ommaviy harakatlar bilan qurilgan fayllar maydoni ShowTempMassFilesArea=Ommaviy harakatlar bilan qurilgan fayllar maydonini ko'rsating ConfirmMassDeletion=Ommaviy o'chirishni tasdiqlash ConfirmMassDeletionQuestion=Siz tanlagan %s yozuvlarini o'chirishni xohlaysizmi? +ConfirmMassClone=Bulk clone confirmation +ConfirmMassCloneQuestion=Select project to clone to +ConfirmMassCloneToOneProject=Clone to project %s RelatedObjects=Tegishli ob'ektlar ClassifyBilled=Hisob-kitoblarni tasniflang ClassifyUnbilled=Hisob-kitob qilinmaganlarni tasniflang @@ -912,8 +916,8 @@ ExportFilteredList=Filtrlangan ro'yxatni eksport qilish ExportList=Eksport ro'yxati ExportOptions=Eksport parametrlari IncludeDocsAlreadyExported=Allaqachon eksport qilingan hujjatlarni qo'shib qo'ying -ExportOfPiecesAlreadyExportedIsEnable=Oldindan eksport qilingan qismlarni eksport qilish imkoniyati mavjud -ExportOfPiecesAlreadyExportedIsDisable=Oldindan eksport qilingan qismlarni eksport qilish o'chirilgan +ExportOfPiecesAlreadyExportedIsEnable=Documents already exported are visible and will be exported +ExportOfPiecesAlreadyExportedIsDisable=Documents already exported are hidden and won't be exported AllExportedMovementsWereRecordedAsExported=Eksport qilingan barcha harakatlar eksport sifatida qayd etildi NotAllExportedMovementsCouldBeRecordedAsExported=Barcha eksport qilingan harakatlarni eksport sifatida qayd etish mumkin emas Miscellaneous=Turli xil @@ -1128,6 +1132,7 @@ DeleteFileText=Haqiqatan ham ushbu faylni o'chirishni xohlaysizmi? ShowOtherLanguages=Boshqa tillarni ko'rsatish SwitchInEditModeToAddTranslation=Ushbu til uchun tarjimalarni qo'shish uchun tahrirlash rejimiga o'ting NotUsedForThisCustomer=Ushbu mijoz uchun ishlatilmaydi +NotUsedForThisVendor=Not used for this vendor AmountMustBePositive=Miqdor ijobiy bo'lishi kerak ByStatus=Holati bo'yicha InformationMessage=Ma `lumot @@ -1148,14 +1153,14 @@ EventReminder=Voqealar to'g'risida eslatma UpdateForAllLines=Barcha satrlar uchun yangilash OnHold=Ushlab qolingan Civility=Fuqarolik -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Set Supervisor +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor CreateExternalUser=Tashqi foydalanuvchini yarating ConfirmAffectTag=Bulk Tag Assignement ConfirmAffectUser=Bulk User Assignement -ProjectRole=Role assigned on each project -TasksRole=Role assigned on each task of each project +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ConfirmSetSupervisor=Bulk Supervisor Set ConfirmUpdatePrice=Choose a increase/decrease price rate ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Created from Public portal UserAgent=User Agent InternalUser=Internal user ExternalUser=External user +NoSpecificContactAddress=No specific contact or address +NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. +HideOnVCard=Hide %s +AddToContacts=Add address to my contacts +LastAccess=Last access +UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here +LastPasswordChangeDate=Last password change date diff --git a/htdocs/langs/uz_UZ/stripe.lang b/htdocs/langs/uz_UZ/stripe.lang index aef85d4fbb6..36795c6075c 100644 --- a/htdocs/langs/uz_UZ/stripe.lang +++ b/htdocs/langs/uz_UZ/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Webhook jonli kaliti ONLINE_PAYMENT_WAREHOUSE=Onlayn to'lov amalga oshirilganda aktsiyalarni pasaytirish uchun foydalaniladigan zaxiralar StripeLiveEnabled=Stripe jonli yoqilgan (aks holda sinov / sandbox rejimi) StripeImportPayment=Stripe to'lovlarini import qilish -ExampleOfTestCreditCard=Sinov uchun kredit karta misoli: %s => valid, %s => error CVC, %s => muddati o'tgan, %s => zaryad ishlamayapti +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +ExampleOfTestBankAcountForSEPA=Example of bank account BAN for direct debit test: %s StripeGateways=Stripe shlyuzlari OAUTH_STRIPE_TEST_ID=Stripe Connect mijoz identifikatori (taxminan _...) OAUTH_STRIPE_LIVE_ID=Stripe Connect mijoz identifikatori (taxminan _...) @@ -61,6 +62,7 @@ DeleteACard=Kartani o'chirish ConfirmDeleteCard=Ushbu Kredit yoki Debet kartani o'chirishni xohlaysizmi? CreateCustomerOnStripe=Stripe-da mijoz yarating CreateCardOnStripe=Stripe-da karta yarating +CreateBANOnStripe=Create bank on Stripe ShowInStripe=Stripe-da ko'rsatish StripeUserAccountForActions=Stripe voqealari (Stripe to'lovlari) haqida elektron pochta orqali xabar berish uchun foydalanuvchi hisob qaydnomasi StripePayoutList=Stripe to'lovlari ro'yxati @@ -69,3 +71,8 @@ ToOfferALinkForLiveWebhook=IPH-ga qo'ng'iroq qilish uchun Stripe WebHook-ni sozl PaymentWillBeRecordedForNextPeriod=To'lov keyingi davr uchun qayd etiladi. ClickHereToTryAgain= Qayta urinish uchun shu erni bosing ... CreationOfPaymentModeMustBeDoneFromStripeInterface=Mijozlarni kuchli autentifikatsiya qilish qoidalari tufayli kartani yaratish Stripe backoffice-da amalga oshirilishi kerak. Stripe mijozlar yozuvini yoqish uchun bu erni bosishingiz mumkin: %s +STRIPE_CARD_PRESENT=Card Present for Stripe Terminals +TERMINAL_LOCATION=Location (address) for Stripe Terminals +RequestDirectDebitWithStripe=Request Direct Debit with Stripe +STRIPE_SEPA_DIRECT_DEBIT=Enable the Direct Debit payments through Stripe + diff --git a/htdocs/langs/uz_UZ/users.lang b/htdocs/langs/uz_UZ/users.lang index c4de2d64306..316a54bd16c 100644 --- a/htdocs/langs/uz_UZ/users.lang +++ b/htdocs/langs/uz_UZ/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Foydalanuvchiga havola LinkedToDolibarrThirdParty=Uchinchi tomonga havola CreateDolibarrLogin=Foydalanuvchini yarating CreateDolibarrThirdParty=Uchinchi tomonni yarating -LoginAccountDisableInDolibarr=Dolibarr-da hisob o'chirilgan. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Shaxsiy qiymatdan foydalaning ExportDataset_user_1=Foydalanuvchilar va ularning xususiyatlari DomainUser=Domen foydalanuvchisi %s @@ -129,3 +130,6 @@ IPLastLogin=IP oxirgi kirish IPPreviousLogin=IP oldingi kirish ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/vi_VN/accountancy.lang b/htdocs/langs/vi_VN/accountancy.lang index 08fafdcd27f..eb1e8334fc9 100644 --- a/htdocs/langs/vi_VN/accountancy.lang +++ b/htdocs/langs/vi_VN/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=Chọn kiểu trả về ACCOUNTING_EXPORT_PREFIX_SPEC=Chỉ định tiền tố cho tên tệp ThisService=Dịch vụ này ThisProduct=Sản phẩm này -DefaultForService=Mặc định cho dịch vụ -DefaultForProduct=Mặc định cho sản phẩm +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Product for this thirdparty ServiceForThisThirdparty=Service for this thirdparty CantSuggest=Không thể gợi ý @@ -101,7 +101,8 @@ ShowAccountingAccount=Hiển thị tài khoản kế toán ShowAccountingJournal=Hiển thị nhật ký kế toán ShowAccountingAccountInLedger=Show accounting account in ledger ShowAccountingAccountInJournals=Show accounting account in journals -AccountAccountingSuggest=Đề xuất tài khoản kế toán +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=Tài khoản mặc định MenuBankAccounts=Tài khoản ngân hàng MenuVatAccounts=Tài khoản VAT @@ -126,6 +127,7 @@ WriteBookKeeping=Record transactions in accounting Bookkeeping=Sổ cái BookkeepingSubAccount=Subledger AccountBalance=Số dư tài khoản +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=Tham chiếu đối tượng nguồn CAHTF=Tổng số mua từ nhà cung cấp trước thuế TotalExpenseReport=Tổng báo cáo chi phí @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=Mã nhật ký NumPiece=Số lượng cái TransactionNumShort=Số Giao dịch AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Group by general ledger account GroupBySubAccountAccounting=Group by subledger account AccountingAccountGroupsDesc=Bạn có thể định nghĩa ở đây một số nhóm tài khoản kế toán. Chúng sẽ được sử dụng cho các báo cáo kế toán đã cá nhân hóa. @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Show subtotal by level Pcgtype=Nhóm tài khoản PcgtypeDesc=Nhóm tài khoản được sử dụng làm tiêu chí 'bộ lọc' và 'nhóm' được xác định trước cho một số báo cáo kế toán. Ví dụ: 'THU NHẬP' hoặc 'CHI PHÍ' được sử dụng làm nhóm cho tài khoản kế toán của các sản phẩm để xây dựng báo cáo chi phí / thu nhập. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Đối soát lại @@ -294,6 +299,7 @@ DescValidateMovements=Bất kỳ sửa đổi hoặc xóa viết, chữ và xóa ValidateHistory=Tự động ràng buộc AutomaticBindingDone=Automatic bindings done (%s) - Automatic binding not possible for some record (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Disable binding & transfer in accountancy on ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Disable binding & transfer in accountancy on purchases (vendor invoices will not be taken into account in accounting) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Disable binding & transfer in accountancy on expense reports (expense reports will not be taken into account in accounting) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Flag exported lines as Exported (to modify a line, you will need to delete the whole transaction and re-transfert it into accounting) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=Date validation and lock ConfirmExportFile=Confirmation of the generation of the accounting export file ? ExportDraftJournal=Xuất dữ liệu bản nháp nhật ký @@ -398,7 +406,7 @@ SaleLocal=Bán địa phương SaleExport=Bán hàng xuất khẩu SaleEEC=Bán trong EEC SaleEECWithVAT=Bán trong EEC với VAT không phải là null, vì vậy chúng tôi cho rằng đây KHÔNG phải là bán hàng nội bộ và tài khoản được đề xuất là tài khoản sản phẩm tiêu chuẩn. -SaleEECWithoutVATNumber=Bán trong EEC không có VAT nhưng ID VAT của bên thứ ba không được xác định. Chúng tôi dự phòng tài khoản sản phẩm để bán hàng tiêu chuẩn. Bạn có thể sửa ID VAT của bên thứ ba hoặc tài khoản sản phẩm nếu cần. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Forbidden: The transaction has been validated and/or exported. ForbiddenTransactionAlreadyValidated=Forbidden: The transaction has been validated. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Mismatch in reconcile code AccountancyErrorMismatchBalanceAmount=The balance (%s) is not equal to 0 AccountancyErrorLetteringBookkeeping=Errors have occurred concerning the transactions: %s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=Ghi sổ kế toán @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Multicurrency code (Idevise) DateExport=Ngày xuất WarningReportNotReliable=Cảnh báo, báo cáo này không dựa trên Sổ Cái, do đó không chứa giao dịch được sửa đổi thủ công trong Sổ Cái. Nếu nhật ký của bạn được cập nhật, chế độ xem sổ sách chính xác hơn. ExpenseReportJournal=Nhật ký báo cáo chi phí +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s accounts diff --git a/htdocs/langs/vi_VN/main.lang b/htdocs/langs/vi_VN/main.lang index 3f4045837d0..cdb05fbebf4 100644 --- a/htdocs/langs/vi_VN/main.lang +++ b/htdocs/langs/vi_VN/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=Không có nhóm người dùng được xác định Password=Mật khẩu PasswordRetype=Repeat your password NoteSomeFeaturesAreDisabled=Lưu ý rằng rất nhiều tính năng/modules bị vô hiệu hóa trong trình diễn này. +YourUserFile=Your user file Name=Tên NameSlashCompany=Tên / Công ty Person=Cá nhân @@ -897,6 +898,9 @@ MassFilesArea=Khu vực tạo các tệp bằng hành động hàng loạt ShowTempMassFilesArea=Hiển thị khu vực tạo các tệp bằng hành động hàng loạt ConfirmMassDeletion=Xác nhận xóa hàng loạt ConfirmMassDeletionQuestion=Bạn có chắc chắn muốn xóa (các) bản ghi đã chọn %s không? +ConfirmMassClone=Bulk clone confirmation +ConfirmMassCloneQuestion=Select project to clone to +ConfirmMassCloneToOneProject=Clone to project %s RelatedObjects=Đối tượng liên quan ClassifyBilled=Xác định đã ra hóa đơn ClassifyUnbilled=Phân loại không có hóa đơn @@ -912,8 +916,8 @@ ExportFilteredList=Xuất danh sách đã lọc ExportList=Danh sách xuất ExportOptions=Tùy chọn xuất dữ liệu IncludeDocsAlreadyExported=Bao gồm các tài liệu đã được xuất -ExportOfPiecesAlreadyExportedIsEnable=Xuất dữ liệu các phần đã được xuất sẽ kích hoạt -ExportOfPiecesAlreadyExportedIsDisable=Xuất dữ liệu các phần đã được xuất sẽ vô hiệu +ExportOfPiecesAlreadyExportedIsEnable=Documents already exported are visible and will be exported +ExportOfPiecesAlreadyExportedIsDisable=Documents already exported are hidden and won't be exported AllExportedMovementsWereRecordedAsExported=Tất cả các dịch chuyển đã xuất đã được ghi là đã xuất NotAllExportedMovementsCouldBeRecordedAsExported=Không phải tất cả các dịch chuyển đã xuất có thể được ghi là đã xuất Miscellaneous=Linh tinh @@ -1128,6 +1132,7 @@ DeleteFileText=Bạn có chắc muốn xoá file này? ShowOtherLanguages=Xem ngôn ngữ khác SwitchInEditModeToAddTranslation=Mở sang chế độ chỉnh sửa và thêm bản dịch khác cho ngôn ngữ này NotUsedForThisCustomer=Không sử dụng cho khách hàng này +NotUsedForThisVendor=Not used for this vendor AmountMustBePositive=Amount must be positive ByStatus=By status InformationMessage=Thông tin @@ -1148,14 +1153,14 @@ EventReminder=Event Reminder UpdateForAllLines=Update for all lines OnHold=On hold Civility=Civility -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=Set Supervisor +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor CreateExternalUser=Create external user ConfirmAffectTag=Bulk Tag Assignement ConfirmAffectUser=Bulk User Assignement -ProjectRole=Role assigned on each project -TasksRole=Role assigned on each task of each project +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ConfirmSetSupervisor=Bulk Supervisor Set ConfirmUpdatePrice=Choose a increase/decrease price rate ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Created from Public portal UserAgent=User Agent InternalUser=Người dùng bên trong ExternalUser=Người dùng bên ngoài +NoSpecificContactAddress=No specific contact or address +NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. +HideOnVCard=Hide %s +AddToContacts=Add address to my contacts +LastAccess=Last access +UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here +LastPasswordChangeDate=Last password change date diff --git a/htdocs/langs/vi_VN/stripe.lang b/htdocs/langs/vi_VN/stripe.lang index 3996aa89a2a..11a6b7c8515 100644 --- a/htdocs/langs/vi_VN/stripe.lang +++ b/htdocs/langs/vi_VN/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Khóa trực tiếp trên web ONLINE_PAYMENT_WAREHOUSE=Tồn kho để sử dụng để giảm tồn kho khi thanh toán trực tuyến được thực hiện
    (TODO Khi tùy chọn giảm tồn kho được thực hiện trên một hành động trên hóa đơn và thanh toán trực tuyến tự tạo hóa đơn?) StripeLiveEnabled=Stripe trực tiếp được kích hoạt (nếu không là chế độ kiểm tra / hộp cát) StripeImportPayment=Nhập dữ liệu thanh toán Stripe -ExampleOfTestCreditCard=Ví dụ về thẻ tín dụng để kiểm tra: %s => hợp lệ, %s => lỗi CVC, %s => đã hết hạn, %s => thu phí không thành công +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +ExampleOfTestBankAcountForSEPA=Example of bank account BAN for direct debit test: %s StripeGateways=Cổng Stripe OAUTH_STRIPE_TEST_ID=ID khách hàng kết nối Stripe (ca _...) OAUTH_STRIPE_LIVE_ID=ID khách hàng kết nối Stripe (ca _...) @@ -61,6 +62,7 @@ DeleteACard=Xóa thẻ ConfirmDeleteCard=Bạn có chắc chắn muốn xóa thẻ Tín dụng hoặc Thẻ ghi nợ này không? CreateCustomerOnStripe=Tạo khách hàng trên Stripe CreateCardOnStripe=Tạo thẻ trên Stripe +CreateBANOnStripe=Create bank on Stripe ShowInStripe=Hiển thị trong Stripe StripeUserAccountForActions=Tài khoản người dùng sử dụng để thông báo qua email về một số sự kiện Stripe (Xuất chi Stripe) StripePayoutList=Danh sách các khoản xuất chi của Stripe @@ -69,3 +71,8 @@ ToOfferALinkForLiveWebhook=Liên kết để thiết lập Stripe WebHook để PaymentWillBeRecordedForNextPeriod=Thanh toán sẽ được ghi lại cho giai đoạn tiếp theo. ClickHereToTryAgain=Bấm vào đây để thử lại... CreationOfPaymentModeMustBeDoneFromStripeInterface=Due to Strong Customer Authentication rules, creation of a card must be done from Stripe backoffice. You can click here to switch on Stripe customer record: %s +STRIPE_CARD_PRESENT=Card Present for Stripe Terminals +TERMINAL_LOCATION=Location (address) for Stripe Terminals +RequestDirectDebitWithStripe=Request Direct Debit with Stripe +STRIPE_SEPA_DIRECT_DEBIT=Enable the Direct Debit payments through Stripe + diff --git a/htdocs/langs/vi_VN/ticket.lang b/htdocs/langs/vi_VN/ticket.lang index 14f78dccfb5..b60bcda3869 100644 --- a/htdocs/langs/vi_VN/ticket.lang +++ b/htdocs/langs/vi_VN/ticket.lang @@ -26,6 +26,7 @@ Permission56002=Sửa đổi vé Permission56003=Xóa vé Permission56004=Quản lý vé Permission56005=Xem vé của tất cả các bên thứ ba (không hiệu quả đối với người dùng bên ngoài, luôn bị giới hạn ở bên thứ ba mà họ phụ thuộc) +Permission56006=Export tickets Tickets=Vé TicketDictType=Vé - Các loại @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=Người cộng tác bên ngoài OriginEmail=Reporter Email Notify_TICKET_SENTBYMAIL=Gửi tin nhắn vé qua email +ExportDataset_ticket_1=Vé + # Status Read=Đọc Assigned=Phân công diff --git a/htdocs/langs/vi_VN/users.lang b/htdocs/langs/vi_VN/users.lang index 4e89c22d5b8..f5687a68f5f 100644 --- a/htdocs/langs/vi_VN/users.lang +++ b/htdocs/langs/vi_VN/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Link to user LinkedToDolibarrThirdParty=Link to third party CreateDolibarrLogin=Tạo một người dùng CreateDolibarrThirdParty=Tạo một bên thứ ba -LoginAccountDisableInDolibarr=Tài khoản bị vô hiệu hóa trong Dolibarr. +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=Dùng giá trị cá nhân ExportDataset_user_1=Người dùng và các tính chất của họ DomainUser=Domain người dùng %s @@ -129,3 +130,6 @@ IPLastLogin=IP last login IPPreviousLogin=IP previous login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/zh_CN/accountancy.lang b/htdocs/langs/zh_CN/accountancy.lang index 8510eefe75b..c9155162364 100644 --- a/htdocs/langs/zh_CN/accountancy.lang +++ b/htdocs/langs/zh_CN/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=选择运费类型 ACCOUNTING_EXPORT_PREFIX_SPEC=指定文件名前缀 ThisService=这项服务 ThisProduct=这个产品 -DefaultForService=默认服务 -DefaultForProduct=默认产品 +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=Product for this thirdparty ServiceForThisThirdparty=Service for this thirdparty CantSuggest=无法建议 @@ -101,7 +101,8 @@ ShowAccountingAccount=显示会计科目 ShowAccountingJournal=显示会计日常报表 ShowAccountingAccountInLedger=Show accounting account in ledger ShowAccountingAccountInJournals=Show accounting account in journals -AccountAccountingSuggest=建议会计科目 +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=默认帐户 MenuBankAccounts=银行帐户 MenuVatAccounts=增值税账户 @@ -126,6 +127,7 @@ WriteBookKeeping=Record transactions in accounting Bookkeeping=分类帐 BookkeepingSubAccount=Subledger AccountBalance=账目平衡 +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=源对象引用 CAHTF=Total purchase vendor before tax TotalExpenseReport=总费用报告 @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=Journal label NumPiece=件数 TransactionNumShort=Num. transaction AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=Group by general ledger account GroupBySubAccountAccounting=Group by subledger account AccountingAccountGroupsDesc=您可以在此处定义一些会计科目组。它们将用于会计分类报告。 @@ -265,6 +269,7 @@ ShowSubtotalByGroup=Show subtotal by level Pcgtype=帐户组 PcgtypeDesc=Group of account are used as predefined 'filter' and 'grouping' criteria for some accounting reports. For example, 'INCOME' or 'EXPENSE' are used as groups for accounting accounts of products to build the expense/income report. +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=Reconcilable @@ -294,6 +299,7 @@ DescValidateMovements=Any modification or deletion of writing, lettering and del ValidateHistory=自动绑定 AutomaticBindingDone=Automatic bindings done (%s) - Automatic binding not possible for some record (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=Disable binding & transfer in accountancy on ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Disable binding & transfer in accountancy on purchases (vendor invoices will not be taken into account in accounting) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Disable binding & transfer in accountancy on expense reports (expense reports will not be taken into account in accounting) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Flag exported lines as Exported (to modify a line, you will need to delete the whole transaction and re-transfert it into accounting) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=Date validation and lock ConfirmExportFile=Confirmation of the generation of the accounting export file ? ExportDraftJournal=导出日常报表草稿 @@ -398,7 +406,7 @@ SaleLocal=Local sale SaleExport=Export sale SaleEEC=Sale in EEC SaleEECWithVAT=Sale in EEC with a VAT not null, so we suppose this is NOT an intracommunautary sale and the suggested account is the standard product account. -SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fallback on the product account for standard sales. You can fix the VAT ID of thirdparty or the product account if needed. +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=Forbidden: The transaction has been validated and/or exported. ForbiddenTransactionAlreadyValidated=Forbidden: The transaction has been validated. ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=Mismatch in reconcile code AccountancyErrorMismatchBalanceAmount=The balance (%s) is not equal to 0 AccountancyErrorLetteringBookkeeping=Errors have occurred concerning the transactions: %s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=会计分录 @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=Multicurrency code (Idevise) DateExport=Date export WarningReportNotReliable=Warning, this report is not based on the Ledger, so does not contains transaction modified manually in the Ledger. If your journalization is up to date, the bookkeeping view is more accurate. ExpenseReportJournal=费用报告日常报表 +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s accounts diff --git a/htdocs/langs/zh_CN/ticket.lang b/htdocs/langs/zh_CN/ticket.lang index 5126ad8236d..068b620dd89 100644 --- a/htdocs/langs/zh_CN/ticket.lang +++ b/htdocs/langs/zh_CN/ticket.lang @@ -26,6 +26,7 @@ Permission56002=修改票证 Permission56003=删除票据 Permission56004=管理票据 Permission56005=See tickets of all third parties (not effective for external users, always be limited to the third party they depend on) +Permission56006=Export tickets Tickets=工单 TicketDictType=Ticket - Types @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=外部贡献者 OriginEmail=Reporter Email Notify_TICKET_SENTBYMAIL=Send ticket message by email +ExportDataset_ticket_1=工单 + # Status Read=阅读 Assigned=分配 diff --git a/htdocs/langs/zh_CN/users.lang b/htdocs/langs/zh_CN/users.lang index 38faecdafd0..24ec2a2f3af 100644 --- a/htdocs/langs/zh_CN/users.lang +++ b/htdocs/langs/zh_CN/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=Link to user LinkedToDolibarrThirdParty=Link to third party CreateDolibarrLogin=创建用户 CreateDolibarrThirdParty=创建合伙人 -LoginAccountDisableInDolibarr=停用帐户 +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=使用自定义值 ExportDataset_user_1=用户及属性 DomainUser=域用户%s @@ -129,3 +130,6 @@ IPLastLogin=IP last login IPPreviousLogin=IP previous login ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card diff --git a/htdocs/langs/zh_TW/accountancy.lang b/htdocs/langs/zh_TW/accountancy.lang index 2e30e85acf7..e790ccb78db 100644 --- a/htdocs/langs/zh_TW/accountancy.lang +++ b/htdocs/langs/zh_TW/accountancy.lang @@ -14,8 +14,8 @@ ACCOUNTING_EXPORT_ENDLINE=選擇退回類型 ACCOUNTING_EXPORT_PREFIX_SPEC=指定檔案名稱的前綴字元 ThisService=此服務 ThisProduct=此產品 -DefaultForService=服務的預設 -DefaultForProduct=產品的預設 +DefaultForService=Default for services +DefaultForProduct=Default for products ProductForThisThirdparty=此合作方的產品 ServiceForThisThirdparty=此合作方的服務 CantSuggest=無法建議 @@ -101,7 +101,8 @@ ShowAccountingAccount=顯示會計項目 ShowAccountingJournal=顯示會計日記帳 ShowAccountingAccountInLedger=在分類帳中顯示會計科目 ShowAccountingAccountInJournals=在日記帳中顯示會計科目 -AccountAccountingSuggest=建議的會計項目 +DataUsedToSuggestAccount=Data used to suggest account +AccountAccountingSuggest=Account suggested MenuDefaultAccounts=預設會計項目 MenuBankAccounts=銀行帳戶 MenuVatAccounts=營業稅帳戶 @@ -126,6 +127,7 @@ WriteBookKeeping=在會計中記錄交易 Bookkeeping=總帳 BookkeepingSubAccount=子分類帳 AccountBalance=帳戶餘額 +AccountBalanceSubAccount=Sub-accounts balance ObjectsRef=參考的來源物件 CAHTF=稅前總採購供應商 TotalExpenseReport=總費用報表 @@ -189,6 +191,7 @@ ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be us UseAuxiliaryAccountOnCustomerDeposit=Store customer account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty) +ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_PRODUCT_BUY_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased within same country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) @@ -218,6 +221,7 @@ JournalLabel=日記帳標籤 NumPiece=件數 TransactionNumShort=交易編號 AccountingCategory=Custom group of accounts +AccountingCategories=Custom groups of accounts GroupByAccountAccounting=依總分類帳帳戶的群組 GroupBySubAccountAccounting=依子分類帳帳戶的群組 AccountingAccountGroupsDesc=您可定義某些會計科目大類。他們可以在個人化會計報表中使用。 @@ -265,6 +269,7 @@ ShowSubtotalByGroup=依級別顯示小計 Pcgtype=會計項目大類 PcgtypeDesc=用作某些會計報告的預定義“過濾器”和“分組”標準的科目組。例如“ INCOME”或“ EXPENSE”用作產品的會計科目組,以建立費用/收入報告。 +AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. Reconcilable=可和解 @@ -294,6 +299,7 @@ DescValidateMovements=禁止修改,刪除任何文字內容。所有條目都 ValidateHistory=自動關聯 AutomaticBindingDone=自動綁定完成 (%s) - 某些記錄無法自動綁定 (%s) +DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. ErrorAccountancyCodeIsAlreadyUse=Error, you cannot remove or disable this account of chart of account because it is used MvtNotCorrectlyBalanced=Movement not correctly balanced. Debit = %s & Credit = %s @@ -337,11 +343,13 @@ ACCOUNTING_DISABLE_BINDING_ON_SALES=停用銷售中的會計綁定和轉移( ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=停用採購中的會計綁定和轉移(會計中不考慮供應商發票) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=停用費用報表中的會計綁定和轉移(會計中不考慮費用報表) ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting +ACCOUNTING_ENABLE_AUTOLETTERING=Enable the automatic lettering when transferring to accounting ## Export NotExportLettering=Do not export the lettering when generating the file NotifiedExportDate=Flag exported lines as Exported (to modify a line, you will need to delete the whole transaction and re-transfert it into accounting) NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible) +NotifiedExportFull=Export documents ? DateValidationAndLock=驗證與鎖定的日期 ConfirmExportFile=確定要產生會計匯出檔案 ? ExportDraftJournal=匯出日記帳草稿 @@ -398,7 +406,7 @@ SaleLocal=本地銷售 SaleExport=出口銷售 SaleEEC=在歐盟銷售 SaleEECWithVAT=在EEC中具有營業稅的銷售不為空,因此我們認為這不是內部銷售,建議的帳戶是標準產品帳戶。 -SaleEECWithoutVATNumber=在EEC中銷售沒有營業稅但合作方的營業稅ID未定義。我們退回標準銷售的產品帳戶。您可以根據需要修改合作方或產品帳戶的營業稅ID。 +SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. ForbiddenTransactionAlreadyExported=禁止:交易已被驗證和/或匯出。 ForbiddenTransactionAlreadyValidated=禁止:交易已被驗證。 ## Dictionary @@ -442,6 +450,7 @@ AccountancyErrorMismatchLetterCode=協調代碼不匹配 AccountancyErrorMismatchBalanceAmount=餘額(%s)不等於0 AccountancyErrorLetteringBookkeeping=交易發生錯誤:%s ErrorAccountNumberAlreadyExists=The accounting number %s already exists +ErrorArchiveAddFile=Can't put "%s" file in archive ## Import ImportAccountingEntries=會計條目 @@ -468,5 +477,7 @@ FECFormatMulticurrencyCode=多國幣別代碼(Idevise) DateExport=日期輸出 WarningReportNotReliable=警告,此報表非依總帳製作的,所以不含總帳中人工修改的交易。若您日記簿是最新的日期,則記帳檢視會比較準確。 ExpenseReportJournal=費用報表日記帳 +DocsAlreadyExportedAreExcluded=Docs already exported are excluded +ClickToHideAlreadyExportedLines=Click to hide already exported lines NAccounts=%s 個帳戶 diff --git a/htdocs/langs/zh_TW/admin.lang b/htdocs/langs/zh_TW/admin.lang index b20e87b40be..78c3c9ba4c9 100644 --- a/htdocs/langs/zh_TW/admin.lang +++ b/htdocs/langs/zh_TW/admin.lang @@ -645,6 +645,8 @@ Module2300Name=排程工作 Module2300Desc=排程工作管理(連到 cron 或是 chrono table) Module2400Name=事件/應辦事項 Module2400Desc=追蹤事件。記錄自動事件以進行追踪或記錄手動事件或會議。這是良好的客戶或供應商關係管理的主要模組。 +Module2430Name=日曆預約系統 +Module2430Desc=Provide an online calendar to allow anyone to book rendez-vous, according to predefined ranges or availabilities. Module2500Name=檔案管理系統(DMS) / 電子控制管理(ECM) Module2500Desc=文件管理系統 / 電子內容管理。您產生或是儲存的文件會自動整理組織。當您有需要就分享吧。 Module2600Name=API / 網頁伺服器(SOAP 伺服器) @@ -660,6 +662,8 @@ Module2900Name=GeoIPMaxmind Module2900Desc=GeoIP Maxmind轉換功能 Module3200Name=不可改變的檔案 Module3200Desc=啟用不可更改的商業事件日誌。事件是即時存檔的。日誌是可以匯出的鍊式事件的唯讀表格。在某些國家/地區,此模組可能是必需的。 +Module3300Name=模組產生器 +Module3200Desc=啟用不可更改的商業事件日誌。事件是即時存檔的。日誌是可以匯出的鍊式事件的唯讀表格。在某些國家/地區,此模組可能是必需的。 Module3400Name=社群網路 Module3400Desc=啟用合作方與地址的社群網路欄位 (skype, twitter, facebook, ...). Module4000Name=人資 @@ -975,7 +979,7 @@ Permission4001=讀取技能/工作/職位 Permission4002=建立/修改技能/工作/職位 Permission4003=刪除技能/工作/職位 Permission4021=Read evaluations (yours and your subordinates) -Permission4022=Create/modify evaluations +Permission4022=建立/修改評估 Permission4023=驗證評估 Permission4025=刪除評價 Permission4028=查看比較選單 @@ -1270,6 +1274,7 @@ TriggerActiveAsModuleActive=當模組%s啟用時,此檔案中的觸發 GeneratedPasswordDesc=選擇用於自動產生密碼的方法。 DictionaryDesc=插入全部參考資料。您可加入您的預設值。 ConstDesc=此頁面允許您編輯(覆蓋)其他頁面中不可用的參數。這些大多是保留的參數,僅供開發人員/進階故障排除。 +MiscellaneousOptions=Miscellaneous options MiscellaneousDesc=在此定義所有其他與安全有關的參數。 LimitsSetup=限制/精準度設定 LimitsDesc=您可以在此處定義Dolibarr使用的限制,精度和優化 @@ -1826,6 +1831,9 @@ AGENDA_USE_EVENT_TYPE=使用事件類型(在選單設定->分類->應辦事項 AGENDA_USE_EVENT_TYPE_DEFAULT=在事件建立表單中自動為事件類型設定此預設值 AGENDA_DEFAULT_FILTER_TYPE=在應辦事項視圖的搜索過濾器中自動設定此類事件 AGENDA_DEFAULT_FILTER_STATUS=在應辦事項視圖的搜索過濾器中自動為事件設定此狀態 +AGENDA_EVENT_PAST_COLOR=Past event color +AGENDA_EVENT_CURRENT_COLOR=Current event color +AGENDA_EVENT_FUTURE_COLOR=Future event color AGENDA_DEFAULT_VIEW=當選擇應辦事項選單時預設要打開的分頁 AGENDA_REMINDER_BROWSER=在用戶的瀏覽器上啟用事件提醒(到達事件日期時,瀏覽器會跳出提醒視窗.每個用戶都可以從瀏覽器提醒設定中停用此提醒) AGENDA_REMINDER_BROWSER_SOUND=啟用音效警告 @@ -2129,6 +2137,7 @@ CodeLastResult=最新結果代碼 NbOfEmailsInInbox=來源資料夾中的電子郵件數量 LoadThirdPartyFromName=在%s載入合作方搜尋 (僅載入) LoadThirdPartyFromNameOrCreate= 在%s載入合作方搜尋 (如果找不到就建立) +LoadContactFromEmailOrCreate=Load contact searching on %s (create if not found) AttachJoinedDocumentsToObject=如果在電子郵件主題中找到項目的引用,則將附件保存到項目文件中。 WithDolTrackingID=來自Dolibarr寄送的第一封電子郵件發起的對話訊息 WithoutDolTrackingID=來自第一封電子郵件發起的對話的訊息不是從 Dolibarr 發送的 @@ -2355,3 +2364,5 @@ AllowExternalDownload=允許外部下載(無需登入,使用共享連結) DeadlineDayVATSubmission=Deadline day for vat submission on the next month MaxNumberOfAttachementOnForms=表單中最大合併文件數 IfDefinedUseAValueBeetween=如果已定義,則使用 %s 和 %s 之間的值 +Reload=Reload +ConfirmReload=Confirm module reload diff --git a/htdocs/langs/zh_TW/companies.lang b/htdocs/langs/zh_TW/companies.lang index f9e71c6bd97..2de41283014 100644 --- a/htdocs/langs/zh_TW/companies.lang +++ b/htdocs/langs/zh_TW/companies.lang @@ -312,8 +312,8 @@ CustomerRelativeDiscountShort=相對折扣 CustomerAbsoluteDiscountShort=無條件折扣 CompanyHasRelativeDiscount=此客戶有預設的%s%%的折扣 CompanyHasNoRelativeDiscount=此客戶預設沒有相對的折扣 -HasRelativeDiscountFromSupplier=您有此供應商的預設折扣%s%% -HasNoRelativeDiscountFromSupplier=您沒有該供應商的預設相對折扣 +HasRelativeDiscountFromSupplier=You have a default discount of %s%% with this vendor +HasNoRelativeDiscountFromSupplier=No default relative discount with this vendor CompanyHasAbsoluteDiscount=在%s%s此客戶有折扣(信用票據或預付款) CompanyHasDownPaymentOrCommercialDiscount=在 %s%s 此客戶有折扣(商業預付款) CompanyHasCreditNote=在%s%s情況下,此客戶仍然有信用票據 @@ -499,4 +499,7 @@ OutOfEurope=歐洲以外(EEC) CurrentOutstandingBillLate=目前拖欠帳單 BecarefullChangeThirdpartyBeforeAddProductToInvoice=請注意,根據您的產品價格設定,應在將產品增加到POS之前更改合作方。 EmailAlreadyExistsPleaseRewriteYourCompanyName=電子郵件已存在,請重新輸入您的公司名稱 -TwoRecordsOfCompanyName=該公司存在多個記錄,請聯繫我們以完成您的合作請求” +TwoRecordsOfCompanyName=more than one record exists for this company, please contact us to complete your partnership request +CompanySection=Company section +ShowSocialNetworks=Show social networks +HideSocialNetworks=Hide social networks diff --git a/htdocs/langs/zh_TW/main.lang b/htdocs/langs/zh_TW/main.lang index a85591c3c84..13a1532d842 100644 --- a/htdocs/langs/zh_TW/main.lang +++ b/htdocs/langs/zh_TW/main.lang @@ -226,6 +226,7 @@ NoUserGroupDefined=未定義用戶群組 Password=密碼 PasswordRetype=重新輸入您的密碼 NoteSomeFeaturesAreDisabled=請注意在這個示範中多項功能/模組已關閉。 +YourUserFile=Your user file Name=名稱 NameSlashCompany=姓名/公司 Person=人員 @@ -897,6 +898,9 @@ MassFilesArea=批次檔案建立區域 ShowTempMassFilesArea=顯示批次檔案建立區域 ConfirmMassDeletion=批次刪除確認 ConfirmMassDeletionQuestion=您確定要刪除%s已選記錄嗎? +ConfirmMassClone=Bulk clone confirmation +ConfirmMassCloneQuestion=Select project to clone to +ConfirmMassCloneToOneProject=Clone to project %s RelatedObjects=相關項目 ClassifyBilled=分類已開票 ClassifyUnbilled=分類未開票 @@ -912,8 +916,8 @@ ExportFilteredList=匯出已篩選清單 ExportList=匯出清單 ExportOptions=匯出選項 IncludeDocsAlreadyExported=包含的文件已輸出 -ExportOfPiecesAlreadyExportedIsEnable=啟用已匯出出口件 -ExportOfPiecesAlreadyExportedIsDisable=已停用已匯出出口件 +ExportOfPiecesAlreadyExportedIsEnable=Documents already exported are visible and will be exported +ExportOfPiecesAlreadyExportedIsDisable=Documents already exported are hidden and won't be exported AllExportedMovementsWereRecordedAsExported=所有匯出動作均記錄為已匯出 NotAllExportedMovementsCouldBeRecordedAsExported=並非所有匯出動作都可以記錄為已匯出 Miscellaneous=雜項 @@ -1128,6 +1132,7 @@ DeleteFileText=您確定要刪除檔案嗎? ShowOtherLanguages=顯示其他語言 SwitchInEditModeToAddTranslation=切換到編輯模式以添加該語言的翻譯 NotUsedForThisCustomer=未用於此客戶 +NotUsedForThisVendor=Not used for this vendor AmountMustBePositive=金額必須為正 ByStatus=依狀態 InformationMessage=資訊 @@ -1148,14 +1153,14 @@ EventReminder=事件提醒 UpdateForAllLines=更新所有行 OnHold=On hold Civility=稱謂或頭銜 -AffectTag=Assign Tag -AffectUser=Assign User -SetSupervisor=設定主管 +AffectTag=Assign a Tag +AffectUser=Assign a User +SetSupervisor=Set the supervisor CreateExternalUser=建立外部用戶 ConfirmAffectTag=Bulk Tag Assignement ConfirmAffectUser=Bulk User Assignement -ProjectRole=Role assigned on each project -TasksRole=Role assigned on each task of each project +ProjectRole=Role assigned on each project/opportunity +TasksRole=Role assigned on each task (if used) ConfirmSetSupervisor=批量設定主管 ConfirmUpdatePrice=Choose a increase/decrease price rate ConfirmAffectTagQuestion=Are you sure you want to assign tags to the %s selected record(s)? @@ -1210,3 +1215,10 @@ CreatedByPublicPortal=Created from Public portal UserAgent=User Agent InternalUser=內部用戶 ExternalUser=外部用戶 +NoSpecificContactAddress=No specific contact or address +NoSpecificContactAddressBis=This tab is dedicated to force specific contacts or addresses for the current object. Use it only if you want to define one or several specific contacts or addresses for the object when the information on the thirdparty is not enough or not accurate. +HideOnVCard=Hide %s +AddToContacts=Add address to my contacts +LastAccess=Last access +UploadAnImageToSeeAPhotoHere=Upload an image from the tab %s to see a photo here +LastPasswordChangeDate=Last password change date diff --git a/htdocs/langs/zh_TW/stripe.lang b/htdocs/langs/zh_TW/stripe.lang index 3e6691b8381..6b3597352d5 100644 --- a/htdocs/langs/zh_TW/stripe.lang +++ b/htdocs/langs/zh_TW/stripe.lang @@ -41,7 +41,8 @@ STRIPE_LIVE_WEBHOOK_KEY=Webhook live金鑰 ONLINE_PAYMENT_WAREHOUSE=完成線上支付時用於減少庫存的庫存
    (待辦事項 如果針對發票操作完成了減少庫存的選項,線上支付也同時產生發票?) StripeLiveEnabled=啟用Stripe live模式(否則為測試/沙盒模式) StripeImportPayment=匯入Stripe付款 -ExampleOfTestCreditCard=用於信用卡測試的範例:%s =>有效,%s =>錯誤CVC,%s =>已過期,%s =>加值失敗 +ExampleOfTestCreditCard=Example of credit card for SEPA test: %s => valid, %s => error CVC, %s => expired, %s => charge fails +ExampleOfTestBankAcountForSEPA=Example of bank account BAN for direct debit test: %s StripeGateways=Stripe閘道 OAUTH_STRIPE_TEST_ID=Stripe Connect客戶端ID(ca _...) OAUTH_STRIPE_LIVE_ID=Stripe Connect客戶端ID(ca _...) @@ -61,6 +62,7 @@ DeleteACard=刪除卡片 ConfirmDeleteCard=您確定要刪除此信用卡或金融信用卡嗎? CreateCustomerOnStripe=在Stripe上建立客戶 CreateCardOnStripe=在Stripe上建立卡片 +CreateBANOnStripe=Create bank on Stripe ShowInStripe=在Stripe上顯示 StripeUserAccountForActions=用於某些Stripe事件的電子郵件通知用戶帳戶(Stripe支出) StripePayoutList=Stripe支出清單 @@ -69,3 +71,8 @@ ToOfferALinkForLiveWebhook=連結到Stripe WebHook設定以呼叫IPN(live模 PaymentWillBeRecordedForNextPeriod=付款將記錄在下一個期間。 ClickHereToTryAgain=點擊此處重試... CreationOfPaymentModeMustBeDoneFromStripeInterface=由於嚴格的客戶身份驗證規則,必須在Stripe後台進行卡的建立。您可以點擊此處打開Stripe客戶記錄:%s +STRIPE_CARD_PRESENT=Card Present for Stripe Terminals +TERMINAL_LOCATION=Location (address) for Stripe Terminals +RequestDirectDebitWithStripe=Request Direct Debit with Stripe +STRIPE_SEPA_DIRECT_DEBIT=Enable the Direct Debit payments through Stripe + diff --git a/htdocs/langs/zh_TW/suppliers.lang b/htdocs/langs/zh_TW/suppliers.lang index 1c8d77181c5..c3977ac0623 100644 --- a/htdocs/langs/zh_TW/suppliers.lang +++ b/htdocs/langs/zh_TW/suppliers.lang @@ -4,6 +4,7 @@ SuppliersInvoice=供應商發票 SupplierInvoices=供應商發票 ShowSupplierInvoice=顯示供應商發票 NewSupplier=新供應商 +NewSupplierInvoice = 新供應商發票 History=歷史紀錄 ListOfSuppliers=供應商名單 ShowSupplier=顯示供應商 @@ -47,3 +48,10 @@ BuyerName=買家名稱 AllProductServicePrices=所有產品/服務價格 AllProductReferencesOfSupplier=供應商的所有參考 BuyingPriceNumShort=供應商價格 +RepeatableSupplierInvoice=供應商發票模板 +RepeatableSupplierInvoices=供應商發票模板 +RepeatableSupplierInvoicesList=供應商發票模板 +RecurringSupplierInvoices=經常性供應商發票 +ToCreateAPredefinedSupplierInvoice=為了建立供應商發票模板,您必須建立一個標準發票,然後在不驗證它的情況下點擊"%s"按鈕 +GeneratedFromSupplierTemplate=已從供應商發票模板 %s 產生 +SupplierInvoiceGeneratedFromTemplate=供應商發票 %s 已從供應商發票模板 %s 產生 diff --git a/htdocs/langs/zh_TW/ticket.lang b/htdocs/langs/zh_TW/ticket.lang index c045124c766..f348b5ae9aa 100644 --- a/htdocs/langs/zh_TW/ticket.lang +++ b/htdocs/langs/zh_TW/ticket.lang @@ -26,6 +26,7 @@ Permission56002=修改服務單 Permission56003=刪除服務單 Permission56004=管理服務單 Permission56005=查看所有合作方的服務單(對外部用戶無效,始終僅限於他們所依賴的合作方) +Permission56006=匯出服務單 Tickets=服務單 TicketDictType=服務單-類型 @@ -61,6 +62,8 @@ TypeContact_ticket_external_CONTRIBUTOR=外部合作者 OriginEmail=填寫人Email Notify_TICKET_SENTBYMAIL=以電子郵件發送服務單訊息 +ExportDataset_ticket_1=服務單 + # Status Read=已讀取 Assigned=已分配 diff --git a/htdocs/langs/zh_TW/users.lang b/htdocs/langs/zh_TW/users.lang index 010735d8c63..c0b619b0fbb 100644 --- a/htdocs/langs/zh_TW/users.lang +++ b/htdocs/langs/zh_TW/users.lang @@ -66,7 +66,8 @@ LinkedToDolibarrUser=連結到用戶 LinkedToDolibarrThirdParty=連結到合作方 CreateDolibarrLogin=建立一位用戶 CreateDolibarrThirdParty=建立一位合作方(客戶/供應商) -LoginAccountDisableInDolibarr=在 Dolibarr 中帳戶已關閉。 +LoginAccountDisableInDolibarr=Account disabled in Dolibarr +PASSWORDInDolibarr=Password modified in Dolibarr UsePersonalValue=使用個人設定值 ExportDataset_user_1=用戶及其屬性 DomainUser=網域用戶%s @@ -129,3 +130,6 @@ IPLastLogin=上次登入的IP IPPreviousLogin=以前登入的IP ShowAllPerms=Show all permission rows HideAllPerms=Hide all permission rows +UserPublicPageDesc=You can enable a virtual card for this user. An url with the user profile and a barcode will be available to allow anybody with a smartphone to scan it and add your contact to its address book. +EnablePublicVirtualCard=Enable the public virtual user card +PublicVirtualCardUrl=Public virtual user card
    '; $searchpicto = $form->showFilterButtons('left'); print $searchpicto; @@ -604,7 +604,7 @@ print $hookmanager->resPrint; print ''; $searchpicto = $form->showFilterButtons(); print $searchpicto; @@ -618,7 +618,7 @@ $totalarray['nbfield'] = 0; // Fields title label // -------------------------------------------------------------------- print '
    '; if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined $selected = 0; @@ -773,7 +773,7 @@ while ($i < $imaxinloop) { print ''.$obj->anotherfield.''; if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined $selected = 0; diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index 620a520d7ce..32192114a4c 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -210,7 +210,7 @@ $arrayfields['s.nom'] = array('label'=>$langs->trans("ThirdParty"), 'checked'=>1 $arrayfields['s.name_alias'] = array('label'=>"AliasNameShort", 'checked'=>0, 'position'=>22); $arrayfields['commercial'] = array('label'=>$langs->trans("SaleRepresentativesOfThirdParty"), 'checked'=>0, 'position'=>23); $arrayfields['c.assigned'] = array('label'=>$langs->trans("AssignedTo"), 'checked'=>1, 'position'=>120); -$arrayfields['opp_weighted_amount'] = array('label'=>$langs->trans('OpportunityWeightedAmountShort'), 'checked'=>0, 'position'=> 116, 'enabled'=>(empty($conf->global->PROJECT_USE_OPPORTUNITIES) ? 0 : 1), 'position'=>106); +$arrayfields['opp_weighted_amount'] = array('label'=>$langs->trans('OpportunityWeightedAmountShort'), 'checked'=>0, 'enabled'=>(empty($conf->global->PROJECT_USE_OPPORTUNITIES) ? 0 : 1), 'position'=>106); $arrayfields['u.login'] = array('label'=>"Author", 'checked'=>-1, 'position'=>165); // Force some fields according to search_usage filter... if (GETPOST('search_usage_opportunity')) { @@ -1187,14 +1187,13 @@ if (!empty($arrayfields['p.import_key']['checked'])) { print ''; + print ''; $arrayofstatus = array(); foreach ($object->statuts_short as $key => $val) { $arrayofstatus[$key] = $langs->trans($val); } $arrayofstatus['99'] = $langs->trans("NotClosed").' ('.$langs->trans('Draft').' + '.$langs->trans('Opened').')'; - print $form->selectarray('search_status', $arrayofstatus, $search_status, 1, 0, 0, '', 0, 0, 0, '', 'minwidth75imp maxwidth125 selectarrowonleft onrightofpage'); - print ajax_combobox('search_status'); + print $form->selectarray('search_status', $arrayofstatus, $search_status, 1, 0, 0, '', 0, 0, 0, '', 'search_status width100 onrightofpage', 1); print ''.$object->getLibStatut(5).''.$object->getLibStatut(5).'
    '.$langs->trans("Budget").''; - if (strcmp($object->budget_amount, '')) { + if (!is_null($object->budget_amount) && strcmp($object->budget_amount, '')) { print ''.price($object->budget_amount, 0, $langs, 1, 0, 0, $conf->currency).''; } print '
    '.$langs->trans("Budget").''; -if (strcmp($object->budget_amount, '')) { +if (!is_null($object->budget_amount) && strcmp($object->budget_amount, '')) { print price($object->budget_amount, '', $langs, 1, 0, 0, $conf->currency); } print '
    '.$langs->trans("Budget").''; - if (strcmp($object->budget_amount, '')) { + if (!is_null($object->budget_amount) && strcmp($object->budget_amount, '')) { print ''.price($object->budget_amount, '', $langs, 0, 0, 0, $conf->currency).''; } print '
    '.$langs->trans("OpportunityProbability").''; - if (strcmp($object->opp_percent, '')) { + if (!is_null($object->opp_percent) && strcmp($object->opp_percent, '')) { print price($object->opp_percent, '', $langs, 1, 0).' %'; } print '
    '.$langs->trans("OpportunityAmount").''; - if (strcmp($object->opp_amount, '')) { + if (!is_null($object->opp_amount) && strcmp($object->opp_amount, '')) { print ''.price($object->opp_amount, '', $langs, 1, 0, 0, $conf->currency).''; if (strcmp($object->opp_percent, '')) { print '       '.$langs->trans("Weighted").': '.price($object->opp_amount * $object->opp_percent / 100, 0, $langs, 1, 0, -1, $conf->currency).''; @@ -309,7 +309,7 @@ if (!empty($conf->global->PROJECT_USE_OPPORTUNITIES)) { // Budget print '
    '.$langs->trans("Budget").''; -if (strcmp($object->budget_amount, '')) { +if (!is_null($object->budget_amount) && strcmp($object->budget_amount, '')) { print ''.price($object->budget_amount, '', $langs, 1, 0, 0, $conf->currency).''; } print '
    '.$langs->trans("Budget").''; - if (strcmp($object->budget_amount, '')) { + if (!is_null($object->budget_amount) && strcmp($object->budget_amount, '')) { print price($object->budget_amount, '', $langs, 1, 0, 0, $conf->currency); } print '
    '.$langs->trans("Budget").''; - if (strcmp($object->budget_amount, '')) { + if (!is_null($object->budget_amount) && strcmp($object->budget_amount, '')) { print ''.price($object->budget_amount, '', $langs, 1, 0, 0, $conf->currency).''; } print '
    '.$langs->trans("Budget").''; - if (strcmp($object->budget_amount, '')) { + if (!is_null($object->budget_amount) && strcmp($object->budget_amount, '')) { print ''.price($object->budget_amount, 0, $langs, 1, 0, 0, $conf->currency).''; } print '
    '.$langs->trans("Budget").''; - if (strcmp($projectstatic->budget_amount, '')) { + if (!is_null($projectstatic->budget_amount) && strcmp($projectstatic->budget_amount, '')) { print ''.price($projectstatic->budget_amount, '', $langs, 1, 0, 0, $conf->currency).''; } print '