diff --git a/.travis.yml b/.travis.yml index d660f89e79d..b4621de8a81 100644 --- a/.travis.yml +++ b/.travis.yml @@ -342,6 +342,9 @@ script: php upgrade.php 8.0.0 9.0.0 ignoredbversion > $TRAVIS_BUILD_DIR/upgrade800900.log php upgrade2.php 8.0.0 9.0.0 > $TRAVIS_BUILD_DIR/upgrade800900-2.log php step5.php 8.0.0 9.0.0 > $TRAVIS_BUILD_DIR/upgrade800900-3.log + php upgrade.php 9.0.0 10.0.0 ignoredbversion > $TRAVIS_BUILD_DIR/upgrade9001000.log + php upgrade2.php 9.0.0 10.0.0 > $TRAVIS_BUILD_DIR/upgrade9001000-2.log + php step5.php 9.0.0 10.0.0 > $TRAVIS_BUILD_DIR/upgrade9001000-3.log cd - set +e echo diff --git a/README.md b/README.md index c38d0ca7dd1..bcff409035f 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,9 @@ ![Downloads per day](https://img.shields.io/sourceforge/dm/dolibarr.svg) [![Reviewed by Hound](https://img.shields.io/badge/Reviewed_by-Hound-8E64B0.svg)](https://houndci.com) -|6|7|8|develop| -|----------|----------|----------|----------| -|![Build status](https://img.shields.io/travis/Dolibarr/dolibarr/6.0.svg)|![Build status](https://img.shields.io/travis/Dolibarr/dolibarr/7.0.svg)|![Build status](https://img.shields.io/travis/Dolibarr/dolibarr/8.0.svg)|![Build status](https://img.shields.io/travis/Dolibarr/dolibarr/develop.svg)| +|6|7|8|9|develop| +|----------|----------|----------|----------|----------| +|![Build status](https://img.shields.io/travis/Dolibarr/dolibarr/6.0.svg)|![Build status](https://img.shields.io/travis/Dolibarr/dolibarr/7.0.svg)|![Build status](https://img.shields.io/travis/Dolibarr/dolibarr/8.0.svg)|![Build status](https://img.shields.io/travis/Dolibarr/dolibarr/9.0.svg)|![Build status](https://img.shields.io/travis/Dolibarr/dolibarr/develop.svg)| Dolibarr ERP & CRM is a modern software package to manage your organization's activity (contacts, suppliers, invoices, orders, stocks, agenda…). diff --git a/build/debian/source/include-binaries b/build/debian/source/include-binaries new file mode 100644 index 00000000000..401eae93712 --- /dev/null +++ b/build/debian/source/include-binaries @@ -0,0 +1 @@ +htdocs/install/doctemplates/websites/website_template-corporate.zip \ No newline at end of file diff --git a/dev/resources/dbmodel/dolibarr.uml b/dev/resources/dbmodel/dolibarr.uml deleted file mode 100644 index 57078d6668b..00000000000 --- a/dev/resources/dbmodel/dolibarr.uml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/dev/resources/dbmodel/dolibarr.umldi b/dev/resources/dbmodel/dolibarr.umldi deleted file mode 100644 index ff97a2a25b1..00000000000 --- a/dev/resources/dbmodel/dolibarr.umldi +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dev/resources/dbmodel/dolibarr_schema.mwb b/dev/resources/dbmodel/dolibarr_schema.mwb index aec0f2d2299..27bc4ab2403 100644 Binary files a/dev/resources/dbmodel/dolibarr_schema.mwb and b/dev/resources/dbmodel/dolibarr_schema.mwb differ diff --git a/dev/tools/snakeCaseToCamelCase.sh b/dev/tools/snakeCaseToCamelCase.sh new file mode 100755 index 00000000000..9196c130755 --- /dev/null +++ b/dev/tools/snakeCaseToCamelCase.sh @@ -0,0 +1,130 @@ +#!/bin/bash + +## Need "rpl" package +RPL_INSTALLED=$(dpkg -s rpl) +if [[ -z ${RPL_INSTALLED} ]]; then + echo "This bash need rpl command, you can install it with: sudo apt install rpl" +fi + +DIR_HTDOCS=$( cd "$( dirname "${BASH_SOURCE[0]}" )/../../htdocs" >/dev/null && pwd ) + +PATTERN="" +if [[ -f $1 ]]; then + TFile=("$1") # specific file +elif [[ -n $1 ]]; then + PATTERN=$1 # name of a particular file or pattern (ex: societe.class.php) +else + PATTERN="*.class.php" # *.lib.php +fi + +if [[ -n ${PATTERN} ]]; then + TCLASSFILE=$(find "${DIR_HTDOCS}" -name "${PATTERN}" | grep -v "/custom/" | grep -v "/includes/" | grep -v -F -f "${DIR_HTDOCS}/../.gitignore") + TFile=() + I=0 + for f in ${TCLASSFILE}; do + TFile[${I}]="${f}" + ((I++)) + done +fi + + +REGEX_FNC_W='^([[:blank:]]*)(public|private|protected)?[ \t]*(static)?[ \t]*[^\$\(]function[ \t]*([a-zA-Z0-9\-\_]*)[\(](.*)[\)][ \t]*([\{]?)$' +INDENT=" " + +for f in ${TFile[@]}; do +# echo ${f} + + IFS=$'\n' + TLine=($(cat "${f}" | grep -E "${REGEX_FNC_W}")) + + for LINE in ${TLine[@]}; do + + if [[ ${LINE} =~ ^${REGEX_FNC_W}$ ]]; then + FIRST_INDENT=${BASH_REMATCH[1]} # seem not work + FNC_TYPE=${BASH_REMATCH[2]} + STATIC=${BASH_REMATCH[3]} + FNC_NAME=${BASH_REMATCH[4]} + PARAMETERS_ORIGIN=${BASH_REMATCH[5]} + BRACKET_END=${BASH_REMATCH[6]} + + if [[ ${LINE} =~ ^([[:blank:]]*) ]]; then # but this seems work to get indentation + FIRST_INDENT=${BASH_REMATCH[1]} + fi + + [[ ${FNC_NAME} =~ ^__ ]] && continue # skip magic function + + CAMEL_CASE=$(echo "${FNC_NAME}" | sed -r 's/(_)([a-zA-Z0-9])/\U\2/g') + [[ ${CAMEL_CASE} = ${FNC_NAME} ]] && continue # skip if no difference + +#echo A: ${#FIRST_INDENT} +#printf "${FIRST_INDENT}TEST INDENT\n" +#echo B: ${FNC_TYPE} +#echo C: ${STATIC} +#echo D: ${FNC_NAME} +#echo D: ${CAMEL_CASE} +#echo E: ${PARAMETERS_ORIGIN} +#echo F: ${BRACKET_END} +#exit + + [[ -n $(cat "${f}" | grep -i "function[[:blank:]]*${CAMEL_CASE}") ]] && continue # skip if already exists + + TCommentLine=() + J=1 + while :; do + COMMENT=$(cat ${f} | grep -B ${J} ${LINE/\$/\\$} | head -n1 | grep -P '^[\t\ ]*(/\*\*|\*[^/]?|\*/)') + if [[ -n ${COMMENT} ]]; then + TCommentLine[${J}]="${COMMENT}" + ((J++)) + else + break + fi + done + + COMMENT_ORIGIN="" + COMMENT_ORIGIN_WITH_DEPRECATED="" + COMMENT_DUPLICATE="" + if [[ ${#TCommentLine[@]} -gt 0 ]]; then + for (( idx=${#TCommentLine[@]} ; idx>0 ; idx-- )) ; do + COMMENT_ORIGIN="${COMMENT_ORIGIN}\n${TCommentLine[idx]}" + done + + COMMENT_DUPLICATE=${COMMENT_ORIGIN} + + COMMENT_ORIGIN_WITH_DEPRECATED=$(echo "${COMMENT_ORIGIN%?} @deprecated\n${FIRST_INDENT} * @see ${CAMEL_CASE}\n${FIRST_INDENT} */") + fi + + PARAMETERS=${PARAMETERS_ORIGIN} + TParam=() + I=0 + while [[ ${PARAMETERS} =~ (\$[a-zA-Z0-9\_\-]+) ]]; do + TParam[${I}]=${BASH_REMATCH[1]} + PARAMETERS=${PARAMETERS#*"${BASH_REMATCH[1]}"} + ((I++)) + done + + PARAMS_STR=$(printf ", %s" "${TParam[@]}") + PARAMS_STR=${PARAMS_STR:2} + + REPLACE=${LINE} + [[ -z ${BRACKET_END} ]] && REPLACE="${LINE}\n${FIRST_INDENT}{\n${FIRST_INDENT}${INDENT}" || REPLACE="${LINE}\n${FIRST_INDENT}${INDENT}" + [[ -n ${STATIC} ]] && REPLACE="${REPLACE}return self::" || REPLACE="${REPLACE}return \$this->" + REPLACE="${REPLACE}${CAMEL_CASE}(${PARAMS_STR});\n${FIRST_INDENT}}\n\n" + REPLACE="${REPLACE}${FIRST_INDENT}${COMMENT_ORIGIN}\n${FIRST_INDENT}" + [[ -n ${STATIC} ]] && REPLACE="${REPLACE}${STATIC} " + [[ -n ${FNC_TYPE} ]] && REPLACE="${REPLACE}${FNC_TYPE} " + REPLACE="${REPLACE}function ${CAMEL_CASE}(${PARAMETERS_ORIGIN})" + [[ -n ${BRACKET_END} ]] && REPLACE="${REPLACE}\n${FIRST_INDENT}{" + + echo " ${FNC_NAME} -> ${CAMEL_CASE}" + + if [[ -n ${COMMENT_ORIGIN_WITH_DEPRECATED} ]]; then + rpl -e --quiet "${COMMENT_ORIGIN}" ${COMMENT_ORIGIN_WITH_DEPRECATED} "${f}" + fi + rpl -e --quiet "${LINE}" ${REPLACE} "${f}" + + fi + + done +done + + diff --git a/doc/install/README b/doc/install/README index 83bc6484cea..0c7341b196c 100644 --- a/doc/install/README +++ b/doc/install/README @@ -7,12 +7,12 @@ Download -------------------------------- * Dolibarr ERP/CRM can be downloaded at sourceforge: -http://sourceforge.net/projects/dolibarr/files -or from Dolibarr official web site: -http://www.dolibarr.org + https://sourceforge.net/projects/dolibarr/files + or from Dolibarr official web site: + https://www.dolibarr.org * Most external modules are only available on DoliStore: -http://www.dolistore.org + https://www.dolistore.com -------------------------------- @@ -22,4 +22,4 @@ Install * For a Quick guide, take a look at README file into root directory. * More complete documentations are also available on line on the Dolibarr Wiki: -http://wiki.dolibarr.org + https://wiki.dolibarr.org diff --git a/doc/install/README-DE b/doc/install/README-DE new file mode 100644 index 00000000000..c7ece3891f3 --- /dev/null +++ b/doc/install/README-DE @@ -0,0 +1,33 @@ +README (deutsch / german / allemand) +-------------------------------- + + +-------------------------------- +Download / Herunterladen +-------------------------------- + +* Dolibarr ERP/CRM kann man über die offizielle Dolibarr Website + https://www.dolibarr.org/downloads + oder direkt von Sourceforge + https://sourceforge.net/projects/dolibarr/files/ + herunterladen. + + + +* Die meisten externen Module/Themens sind über den DoliStore verfügbar: + https://www.dolistore.com/de/ + + +-------------------------------- +Installation +-------------------------------- + +* Für eine kurze Einleitung, schau auf die README Datei im Hauptverzeichnis. + +* Umfangreiche Dokumentationen sind im Dolibarr Wiki zu finden: + https://wiki.dolibarr.org/index.php/Hauptseite + +* eine Deutsche Community bietet der Dolibarr e.V. unter + https://www.dolibarr.de/ + + diff --git a/htdocs/accountancy/admin/card.php b/htdocs/accountancy/admin/card.php index 33fdb675ac0..a2ec757b212 100644 --- a/htdocs/accountancy/admin/card.php +++ b/htdocs/accountancy/admin/card.php @@ -18,9 +18,9 @@ */ /** - * \file htdocs/accountancy/admin/card.php - * \ingroup Advanced accountancy - * \brief Card of accounting account + * \file htdocs/accountancy/admin/card.php + * \ingroup Advanced accountancy + * \brief Card of accounting account */ require '../../main.inc.php'; @@ -388,13 +388,13 @@ else if ($id > 0 || $ref) { if (! empty($user->rights->accounting->chartofaccount)) { print '' . $langs->trans('Modify') . ''; } else { - print '' . $langs->trans('Modify') . ''; + print '' . $langs->trans('Modify') . ''; } if (! empty($user->rights->accounting->chartofaccount)) { print '' . $langs->trans('Delete') . ''; } else { - print '' . $langs->trans('Delete') . ''; + print '' . $langs->trans('Delete') . ''; } print ''; diff --git a/htdocs/accountancy/admin/fiscalyear.php b/htdocs/accountancy/admin/fiscalyear.php index 62eda456fe7..1c5e036c78b 100644 --- a/htdocs/accountancy/admin/fiscalyear.php +++ b/htdocs/accountancy/admin/fiscalyear.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2013-2018 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,9 +16,9 @@ */ /** - * \file htdocs/accountancy/admin/fiscalyear.php - * \ingroup Advanced accountancy - * \brief Setup page to configure fiscal year + * \file htdocs/accountancy/admin/fiscalyear.php + * \ingroup Advanced accountancy + * \brief Setup page to configure fiscal year */ require '../../main.inc.php'; @@ -45,8 +45,8 @@ $langs->loadLangs(array("admin","compta")); // Security check if ($user->societe_id > 0) accessforbidden(); -if (! $user->rights->accounting->fiscalyear) // If we can read accounting records, we shoul be able to see fiscal year. - accessforbidden(); +if (! $user->rights->accounting->fiscalyear) // If we can read accounting records, we should be able to see fiscal year. + accessforbidden(); $error = 0; @@ -113,23 +113,26 @@ if ($result) if (! empty($user->rights->accounting->fiscalyear)) { - $addbutton = '' . $langs->trans("NewFiscalYear") . ''; + $addbutton = '' . $langs->trans("NewFiscalYear") .''; } else { - $addbutton = '' . $langs->trans("NewFiscalYear") . ''; + $addbutton = '' . $langs->trans("NewFiscalYear") .''; } $title = $langs->trans('AccountingPeriods'); print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $params, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_accountancy', 0, $addbutton, '', $limit, 1); // Load attribute_label - print ''; + print '
'; + print '
'; print ''; print ''; print ''; print ''; print ''; + print ''; + print ''; print ''; print ''; @@ -144,6 +147,8 @@ if ($result) print ''; print ''; print ''; + print ''; + print ''; print ''; print ''; $i++; @@ -152,6 +157,7 @@ if ($result) print ''; } print '
' . $langs->trans("Ref") . '' . $langs->trans("Label") . '' . $langs->trans("DateStart") . '' . $langs->trans("DateEnd") . '' . $langs->trans("NumberOfAccountancyEntries") . '' . $langs->trans("NumberOfAccountancyMovements") . '' . $langs->trans("Statut") . '
' . $obj->label . '' . dol_print_date($db->jdate($obj->date_start), 'day') . '' . dol_print_date($db->jdate($obj->date_end), 'day') . '' . $object->getAccountancyEntriesByFiscalYear($obj->date_start, $obj->date_end) . '' . $object->getAccountancyMovementsByFiscalYear($obj->date_start, $obj->date_end) . '' . $fiscalyearstatic->LibStatut($obj->statut, 5) . '
' . $langs->trans("None") . '
'; + print ''; } else { dol_print_error($db); } diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php index 5613e42b4c4..c8df00f6cdc 100644 --- a/htdocs/accountancy/bookkeeping/list.php +++ b/htdocs/accountancy/bookkeeping/list.php @@ -641,7 +641,6 @@ if ($num > 0) $object->id = $line->id; $object->piece_num = $line->piece_num; print $object->getNomUrl(1,'',0,'',1); - //print '' . $line->piece_num . ''; print ''; if (! $i) $totalarray['nbfield']++; } diff --git a/htdocs/accountancy/customer/card.php b/htdocs/accountancy/customer/card.php index 677bc627c80..7d506c6c72c 100644 --- a/htdocs/accountancy/customer/card.php +++ b/htdocs/accountancy/customer/card.php @@ -94,7 +94,7 @@ $facture_static = new Facture($db); $formaccounting = new FormAccounting($db); if (! empty($id)) { - $sql = "SELECT f.facnumber, f.rowid as facid, l.fk_product, l.description, l.price,"; + $sql = "SELECT f.ref, f.rowid as facid, l.fk_product, l.description, l.price,"; $sql .= " l.qty, l.rowid, l.tva_tx, l.remise_percent, l.subprice, p.accountancy_code_sell as code_sell,"; $sql .= " l.fk_code_ventilation, aa.account_number, aa.label"; $sql .= " FROM " . MAIN_DB_PREFIX . "facturedet as l"; @@ -102,7 +102,7 @@ if (! empty($id)) { $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accounting_account as aa ON l.fk_code_ventilation = aa.rowid"; $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "facture as f ON f.rowid = l.fk_facture"; $sql .= " WHERE f.fk_statut > 0 AND l.rowid = " . $id; - $sql .= " AND f.entity IN (" . getEntity('facture', 0) . ")"; // We don't share object for accountancy + $sql .= " AND f.entity IN (" . getEntity('invoice', 0) . ")"; // We don't share object for accountancy dol_syslog("/accounting/customer/card.php sql=" . $sql, LOG_DEBUG); $result = $db->query($sql); @@ -128,7 +128,7 @@ if (! empty($id)) { // Ref facture print '' . $langs->trans("Invoice") . ''; - $facture_static->ref = $objp->facnumber; + $facture_static->ref = $objp->ref; $facture_static->id = $objp->facid; print '' . $facture_static->getNomUrl(1) . ''; print ''; diff --git a/htdocs/accountancy/customer/index.php b/htdocs/accountancy/customer/index.php index 4f4932fe08f..ca75aaac15e 100644 --- a/htdocs/accountancy/customer/index.php +++ b/htdocs/accountancy/customer/index.php @@ -180,7 +180,7 @@ $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accounting_account as aa ON aa.rowid $sql .= " WHERE f.datef >= '" . $db->idate($search_date_start) . "'"; $sql .= " AND f.datef <= '" . $db->idate($search_date_end) . "'"; $sql .= " AND f.fk_statut > 0"; -$sql .= " AND f.entity IN (" . getEntity('facture', 0) . ")"; // We don't share object for accountancy +$sql .= " AND f.entity IN (" . getEntity('invoice', 0) . ")"; // We don't share object for accountancy $sql .= " AND aa.account_number IS NULL"; if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) { $sql .= " AND f.type IN (" . Facture::TYPE_STANDARD . "," . Facture::TYPE_REPLACEMENT . "," . Facture::TYPE_CREDIT_NOTE . "," . Facture::TYPE_SITUATION . ")"; @@ -255,7 +255,7 @@ $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "facture as f ON f.rowid = fd.fk_factu $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accounting_account as aa ON aa.rowid = fd.fk_code_ventilation"; $sql .= " WHERE f.datef >= '" . $db->idate($search_date_start) . "'"; $sql .= " AND f.datef <= '" . $db->idate($search_date_end) . "'"; -$sql .= " AND f.entity IN (" . getEntity('facture', 0) . ")"; // We don't share object for accountancy +$sql .= " AND f.entity IN (" . getEntity('invoice', 0) . ")"; // We don't share object for accountancy $sql .= " AND f.fk_statut > 0"; if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) { $sql .= " AND f.type IN (" . Facture::TYPE_STANDARD . "," . Facture::TYPE_REPLACEMENT . "," . Facture::TYPE_CREDIT_NOTE . "," . Facture::TYPE_SITUATION . ")"; @@ -332,7 +332,7 @@ if ($conf->global->MAIN_FEATURES_LEVEL > 0) // This part of code looks strange. $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "facture as f ON f.rowid = fd.fk_facture"; $sql .= " WHERE f.datef >= '" . $db->idate($search_date_start) . "'"; $sql .= " AND f.datef <= '" . $db->idate($search_date_end) . "'"; - $sql .= " AND f.entity IN (" . getEntity('facture', 0) . ")"; // We don't share object for accountancy + $sql .= " AND f.entity IN (" . getEntity('invoice', 0) . ")"; // We don't share object for accountancy $sql .= " AND f.fk_statut > 0"; if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) { $sql .= " AND f.type IN (" . Facture::TYPE_STANDARD . "," . Facture::TYPE_REPLACEMENT . "," . Facture::TYPE_CREDIT_NOTE . "," . Facture::TYPE_SITUATION . ")"; @@ -384,7 +384,7 @@ if ($conf->global->MAIN_FEATURES_LEVEL > 0) // This part of code looks strange. $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "facture as f ON f.rowid = fd.fk_facture"; $sql .= " WHERE f.datef >= '" . $db->idate($search_date_start) . "'"; $sql .= " AND f.datef <= '" . $db->idate($search_date_end) . "'"; - $sql .= " AND f.entity IN (" . getEntity('facture', 0) . ")"; // We don't share object for accountancy + $sql .= " AND f.entity IN (" . getEntity('invoice', 0) . ")"; // We don't share object for accountancy $sql .= " AND f.fk_statut > 0"; if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) { $sql .= " AND f.type IN (" . Facture::TYPE_STANDARD . "," . Facture::TYPE_REPLACEMENT . "," . Facture::TYPE_CREDIT_NOTE . "," . Facture::TYPE_SITUATION . ")"; diff --git a/htdocs/accountancy/customer/lines.php b/htdocs/accountancy/customer/lines.php index 7d8599b683c..f13344c936b 100644 --- a/htdocs/accountancy/customer/lines.php +++ b/htdocs/accountancy/customer/lines.php @@ -64,7 +64,7 @@ $pageprev = $page - 1; $pagenext = $page + 1; $offset = $limit * $page; if (! $sortfield) - $sortfield = "f.datef, f.facnumber, fd.rowid"; + $sortfield = "f.datef, f.ref, fd.rowid"; if (! $sortorder) { if ($conf->global->ACCOUNTING_LIST_SORT_VENTILATION_DONE > 0) { $sortorder = "DESC"; @@ -167,7 +167,7 @@ print ''."\n"; + } + print load_fiche_titre($langs->trans("DoPayment")); print '
'; @@ -298,7 +312,12 @@ if ($action == 'create' || empty($action)) if ($sumpaid < $objp->total_ttc) { $namef = "amount_".$objp->id; - print ''; + $nameRemain = "remain_".$objp->id; // autofill remainder amount + if (!empty($conf->use_javascript_ajax)) // autofill remainder amount + print img_picto("Auto fill",'rightarrow', "class='AutoFillAmount' data-rowid='".$namef."' data-value='".($objp->total_ttc - $sumpaid)."'"); // autofill remainder amount + $remaintopay=$objp->total_ttc - $sumpaid; // autofill remainder amount + print ''; // autofill remainder amount + print ''; } else { diff --git a/htdocs/exports/export.php b/htdocs/exports/export.php index 7cb69ee9a3f..bdead78017c 100644 --- a/htdocs/exports/export.php +++ b/htdocs/exports/export.php @@ -67,6 +67,8 @@ $entitytoicon = array( 'category' => 'category', 'shipment' => 'sending', 'shipment_line'=> 'sending', + 'reception'=> 'sending', + 'reception_line'=> 'sending', 'expensereport'=> 'trip', 'expensereport_line'=> 'trip', 'holiday' => 'holiday', @@ -623,11 +625,11 @@ if ($step == 2 && $datatoexport) } if (! empty($objexport->array_export_examplevalues[0][$code])) { - $htmltext.=$langs->trans("SourceExample").': '.$objexport->array_export_examplevalues[0][$code].'
'; + $htmltext.=''.$langs->trans("SourceExample").': '.$objexport->array_export_examplevalues[0][$code].'
'; } if (! empty($objexport->array_export_TypeFields[0][$code])) { - $htmltext.=$langs->trans("Type").': '.$objexport->array_export_TypeFields[0][$code].'
'; + $htmltext.=''.$langs->trans("Type").': '.$objexport->array_export_TypeFields[0][$code].'
'; } if (isset($array_selected[$code]) && $array_selected[$code]) @@ -678,7 +680,7 @@ if ($step == 2 && $datatoexport) } else { - print ''.$langs->trans("NextStep").''; + print ''.$langs->trans("NextStep").''; } print ''; diff --git a/htdocs/externalsite/frames.php b/htdocs/externalsite/frames.php index 611e84fe9c3..c7f92142381 100644 --- a/htdocs/externalsite/frames.php +++ b/htdocs/externalsite/frames.php @@ -21,8 +21,9 @@ * \ingroup externalsite * \brief Page that build two frames: One for menu, the other for the target page to show * Usage: - * mydomain.com/externalsite/frames.php to show URL set into setup - * mydomain.com/externalsite/frames.php?keyforcontent to show content defined into conf->global->$keyforcontent + * /externalsite/frames.php to show URL set into setup + * /externalsite/frames.php?keyforcontent=EXTERNAL_SITE_CONTENT_abc to show html text defined into $conf->global->EXTERNAL_SITE_CONTENT_abc + * /externalsite/frames.php?keyforcontent=EXTERNAL_SITE_URL_abc to show URL defined into $conf->global->EXTERNAL_SITE_URL_abc */ require '../main.inc.php'; @@ -56,19 +57,58 @@ if (! empty($keyforcontent)) print '
'; - if (! preg_match('/EXTERNAL_SITE_CONTENT_/', $keyforcontent)) + if (! preg_match('/EXTERNAL_SITE_CONTENT_/', $keyforcontent) + && ! preg_match('/EXTERNAL_SITE_URL_/', $keyforcontent)) { $langs->load("errors"); - print $langs->trans("Variablekeyforcontentmustbenamed", 'EXTERNAL_SITE_CONTENT_'); + print $langs->trans("ErrorBadSyntaxForParamKeyForContent", 'EXTERNAL_SITE_CONTENT_', 'EXTERNAL_SITE_URL_'); } else if (empty($conf->global->$keyforcontent)) { $langs->load("errors"); - print $langs->trans("ErrorNoContentDefinedIntoVar", $keyforcontent); + print $langs->trans("ErrorVariableKeyForContentMustBeSet", 'EXTERNAL_SITE_CONTENT_'.$keyforcontent, 'EXTERNAL_SITE_URL_'.$keyforcontent); } else { - print $conf->global->$keyforcontent; + if (preg_match('/EXTERNAL_SITE_CONTENT_/', $keyforcontent)) + { + print $conf->global->$keyforcontent; + } + elseif (preg_match('/EXTERNAL_SITE_URL_/', $keyforcontent)) + { + /*print " + + + Dolibarr frame for external web site + + + global->MAIN_MENU_INVERT)?"rows":"cols")."=\"".$heightforframes.",*\" border=0 framespacing=0 frameborder=0> + + "; + print ''; + print " + + <body> + + </body> + + + + + <body> + <br><div class=\"center\"> + Sorry, your browser is too old or not correctly configured to view this area.<br> + Your browser must support frames.<br> + </div> + </body> + + + + ";*/ + print ''; + } } print '
'; diff --git a/htdocs/fichinter/card.php b/htdocs/fichinter/card.php index 756613d6a8f..6158848ceed 100644 --- a/htdocs/fichinter/card.php +++ b/htdocs/fichinter/card.php @@ -1644,7 +1644,7 @@ else if ($id > 0 || ! empty($ref)) { print ''; } - else print ''; + else print ''; } // create intervention model @@ -1663,7 +1663,7 @@ else if ($id > 0 || ! empty($ref)) if ($object->statut < Fichinter::STATUS_BILLED) { if ($user->rights->propal->creer) print ''; - else print ''; + else print ''; } } @@ -1674,7 +1674,7 @@ else if ($id > 0 || ! empty($ref)) if ($object->statut < Fichinter::STATUS_BILLED) { if ($user->rights->facture->creer) print ''; - else print ''; + else print ''; } if (! empty($conf->global->FICHINTER_CLASSIFY_BILLED)) // Option deprecated. In a future, billed must be managed with a dedicated field to 0 or 1 diff --git a/htdocs/fichinter/list.php b/htdocs/fichinter/list.php index c26e642a651..85f92f55f85 100644 --- a/htdocs/fichinter/list.php +++ b/htdocs/fichinter/list.php @@ -269,6 +269,7 @@ if ($resql) // List of mass actions available $arrayofmassactions = array( + 'generate_doc'=>$langs->trans("Generate"), //'presend'=>$langs->trans("SendByMail"), 'builddoc'=>$langs->trans("PDFMerge"), ); diff --git a/htdocs/fourn/card.php b/htdocs/fourn/card.php index 235a3c85396..f017cce90ab 100644 --- a/htdocs/fourn/card.php +++ b/htdocs/fourn/card.php @@ -780,7 +780,7 @@ if ($object->id > 0) { if ($object->status != 1) { - print ''; + print ''; } if ($conf->supplier_proposal->enabled && $user->rights->supplier_proposal->creer) @@ -792,7 +792,7 @@ if ($object->id > 0) } else { - print ''.$langs->trans("AddSupplierProposal").''; + print ''.$langs->trans("AddSupplierProposal").''; } } @@ -805,7 +805,7 @@ if ($object->id > 0) } else { - print ''.$langs->trans("AddOrder").''; + print ''.$langs->trans("AddOrder").''; } } @@ -818,7 +818,7 @@ if ($object->id > 0) } else { - print ''.$langs->trans("AddBill").''; + print ''.$langs->trans("AddBill").''; } } @@ -832,10 +832,10 @@ if ($object->id > 0) } else { - print ''; + print ''; } } - else print ''; + else print ''; } // Add action diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index 9f17e9afdf2..8dc10d82b3b 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -3146,6 +3146,54 @@ class CommandeFournisseur extends CommonOrder } return 0; } + + /** + * Load array this->receptions of lines of shipments with nb of products sent for each order line + * Note: For a dedicated shipment, the fetch_lines can be used to load the qty_asked and qty_shipped. This function is use to return qty_shipped cumulated for the order + * + * @param int $filtre_statut Filter on shipment status + * @return int <0 if KO, Nb of lines found if OK + */ + function loadReceptions($filtre_statut=-1) + { + $this->receptions = array(); + + $sql = 'SELECT cd.rowid, cd.fk_product,'; + $sql.= ' sum(cfd.qty) as qty'; + $sql.= ' FROM '.MAIN_DB_PREFIX.'commande_fournisseur_dispatch as cfd,'; + if ($filtre_statut >= 0) $sql.= ' '.MAIN_DB_PREFIX.'reception as e,'; + $sql.= ' '.MAIN_DB_PREFIX.'commande_fournisseurdet as cd'; + $sql.= ' WHERE'; + if ($filtre_statut >= 0) $sql.= ' cfd.fk_reception = e.rowid AND'; + $sql.= ' cfd.fk_commandefourndet = cd.rowid'; + $sql.= ' AND cd.fk_commande =' .$this->id; + if ($this->fk_product > 0) $sql.= ' AND cd.fk_product = '.$this->fk_product; + if ($filtre_statut >= 0) $sql.=' AND e.fk_statut >= '.$filtre_statut; + $sql.= ' GROUP BY cd.rowid, cd.fk_product'; + + + dol_syslog(get_class($this)."::loadReceptions", LOG_DEBUG); + $result = $this->db->query($sql); + if ($result) + { + $num = $this->db->num_rows($result); + $i = 0; + while ($i < $num) + { + $obj = $this->db->fetch_object($result); + empty($this->receptions[$obj->rowid])?$this->receptions[$obj->rowid] = $obj->qty:$this->receptions[$obj->rowid] += $obj->qty; + $i++; + } + $this->db->free(); + + return $num; + } + else + { + $this->error=$this->db->lasterror(); + return -1; + } + } } diff --git a/htdocs/fourn/class/fournisseur.commande.dispatch.class.php b/htdocs/fourn/class/fournisseur.commande.dispatch.class.php index c7b5d00c797..12e19e3315d 100644 --- a/htdocs/fourn/class/fournisseur.commande.dispatch.class.php +++ b/htdocs/fourn/class/fournisseur.commande.dispatch.class.php @@ -25,6 +25,7 @@ // Put here all includes required by your class file require_once DOL_DOCUMENT_ROOT."/core/class/commonobject.class.php"; +require_once DOL_DOCUMENT_ROOT."/reception/class/reception.class.php"; //require_once DOL_DOCUMENT_ROOT."/societe/class/societe.class.php"; //require_once DOL_DOCUMENT_ROOT."/product/class/product.class.php"; @@ -136,7 +137,7 @@ class CommandeFournisseurDispatch extends CommonObject */ function create($user, $notrigger=0) { - global $conf, $langs; + global $conf, $langs, $hookmanager; $error=0; // Clean parameters @@ -150,6 +151,8 @@ class CommandeFournisseurDispatch extends CommonObject if (isset($this->comment)) $this->comment=trim($this->comment); if (isset($this->status)) $this->status=trim($this->status); if (isset($this->batch)) $this->batch=trim($this->batch); + if(empty($this->datec)) $this->datec = dol_now(); + // Check parameters // Put here code to add control on parameters values @@ -167,7 +170,10 @@ class CommandeFournisseurDispatch extends CommonObject $sql.= "status,"; $sql.= "batch,"; $sql.= "eatby,"; - $sql.= "sellby"; + $sql.= "sellby,"; + $sql.= "fk_reception"; + + $sql.= ") VALUES ("; $sql.= " ".(! isset($this->fk_commande)?'NULL':"'".$this->db->escape($this->fk_commande)."'").","; $sql.= " ".(! isset($this->fk_product)?'NULL':"'".$this->db->escape($this->fk_product)."'").","; @@ -180,9 +186,10 @@ class CommandeFournisseurDispatch extends CommonObject $sql.= " ".(! isset($this->status)?'NULL':"'".$this->db->escape($this->status)."'").","; $sql.= " ".(! isset($this->batch)?'NULL':"'".$this->db->escape($this->batch)."'").","; $sql.= " ".(! isset($this->eatby) || dol_strlen($this->eatby)==0?'NULL':"'".$this->db->idate($this->eatby)."'").","; - $sql.= " ".(! isset($this->sellby) || dol_strlen($this->sellby)==0?'NULL':"'".$this->db->idate($this->sellby)."'").""; + $sql.= " ".(! isset($this->sellby) || dol_strlen($this->sellby)==0?'NULL':"'".$this->db->idate($this->sellby)."'").","; + $sql.= " ".(! isset($this->fk_reception)?'NULL':"'".$this->fk_reception."'").""; $sql.= ")"; - + $this->db->begin(); dol_syslog(__METHOD__, LOG_DEBUG); @@ -204,6 +211,24 @@ class CommandeFournisseurDispatch extends CommonObject //// End call triggers } } + + // Actions on extra fields (by external module or standard code) + // TODO le hook fait double emploi avec le trigger !! + $hookmanager->initHooks(array('commandefournisseurdispatchdao')); + $parameters=array('id'=>$this->id); + $reshook=$hookmanager->executeHooks('insertExtraFields',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks + if (empty($reshook)) + { + if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used + { + $result=$this->insertExtraFields(); + + if ($result < 0) + { + $error++; + } + } + } // Commit or rollback if ($error) @@ -249,7 +274,8 @@ class CommandeFournisseurDispatch extends CommonObject $sql.= " t.tms,"; $sql.= " t.batch,"; $sql.= " t.eatby,"; - $sql.= " t.sellby"; + $sql.= " t.sellby,"; + $sql.= " t.fk_reception"; $sql.= " FROM ".MAIN_DB_PREFIX.$this->table_element." as t"; @@ -349,14 +375,21 @@ class CommandeFournisseurDispatch extends CommonObject if (! $error) { + if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used + { + if(empty($this->id) && !empty($this->rowid))$this->id=$this->rowid; + $result=$this->insertExtraFields(); + if ($result < 0) + { + $error++; + } + } + if (! $notrigger) { // Uncomment this and change MYOBJECT to your own tag if you - // want this action calls a trigger. - - //// Call triggers - //$result=$this->call_trigger('MYOBJECT_MODIFY',$user); - //if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail} + $result=$this->call_trigger('LINERECEPTION_UPDATE',$user); + if ($result < 0) $error++; //// End call triggers } } diff --git a/htdocs/fourn/class/fournisseur.facture.class.php b/htdocs/fourn/class/fournisseur.facture.class.php index a4b89edff42..42189a30380 100644 --- a/htdocs/fourn/class/fournisseur.facture.class.php +++ b/htdocs/fourn/class/fournisseur.facture.class.php @@ -2902,6 +2902,8 @@ class SupplierInvoiceLine extends CommonObjectLine } } + $this->deleteObjectLinked(); + if (!$error) { // Supprime ligne $sql = 'DELETE FROM '.MAIN_DB_PREFIX.'facture_fourn_det '; @@ -3125,10 +3127,10 @@ class SupplierInvoiceLine extends CommonObjectLine $sql.= " ".$this->product_type.","; $sql.= " ".price2num($this->remise_percent).","; $sql.= " ".price2num($this->subprice).","; - $sql.= " ".price2num($this->total_ttc/$this->qty).","; + $sql.= " ".(! empty($this->qty)?price2num($this->total_ttc / $this->qty):price2num($this->total_ttc)).","; $sql.= " ".(! empty($this->date_start)?"'".$this->db->idate($this->date_start)."'":"null").","; $sql.= " ".(! empty($this->date_end)?"'".$this->db->idate($this->date_end)."'":"null").","; - $sql.= ' '.(!empty($this->fk_code_ventilation)?$this->fk_code_ventilation:0).','; + $sql.= ' '.(! empty($this->fk_code_ventilation)?$this->fk_code_ventilation:0).','; $sql.= ' '.$this->rang.','; $sql.= ' '.$this->special_code.','; $sql.= " '".$this->db->escape($this->info_bits)."',"; diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index 8098946b186..c60b2dc2cbd 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -404,7 +404,7 @@ if (empty($reshook)) $desc = $productsupplier->desc_supplier; } else $desc = $productsupplier->description; - if (trim($product_desc) != trim($desc)) $desc = dol_concatdesc($desc, $product_desc); + if (trim($product_desc) != trim($desc)) $desc = dol_concatdesc($desc, $product_desc, '', !empty($conf->global->CHANGE_ORDER_CONCAT_DESCRIPTION)); $type = $productsupplier->type; $price_base_type = ($productsupplier->fourn_price_base_type?$productsupplier->fourn_price_base_type:'HT'); @@ -1579,7 +1579,7 @@ if ($action=='create') if (! empty($conf->multicurrency->enabled)) { print ''; - print ''.fieldLabel('Currency','multicurrency_code').''; + print ''.$form->editfieldkey('Currency', 'multicurrency_code', '', $object, 0).''; print ''; print $form->selectMultiCurrency($currency_code, 'multicurrency_code'); print ''; @@ -1964,7 +1964,7 @@ elseif (! empty($object->id)) print ''; print ''; print ''; if ($action != 'editmulticurrencycode' && ! empty($object->brouillon)) print ''; @@ -1981,7 +1981,7 @@ elseif (! empty($object->id)) print ''; print '
'; - print fieldLabel('Currency','multicurrency_code'); + print $form->editfieldkey('Currency', 'multicurrency_code', '', $object, 0); print 'id . '">' . img_edit($langs->transnoentitiesnoconv('SetMultiCurrencyCode'), 1) . '
'; print ''; if ($action != 'editmulticurrencyrate' && ! empty($object->brouillon) && $object->multicurrency_code && $object->multicurrency_code != $conf->currency) print ''; @@ -2097,17 +2097,17 @@ elseif (! empty($object->id)) if (!empty($conf->multicurrency->enabled)) { // Multicurrency Amount HT - print ''; + print ''; print ''; print ''; // Multicurrency Amount VAT - print ''; + print ''; print ''; print ''; // Multicurrency Amount TTC - print ''; + print ''; print ''; print ''; } @@ -2275,7 +2275,7 @@ elseif (! empty($object->id)) { if (! empty($conf->global->SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED) && $conf->global->MAIN_FEATURES_LEVEL > 0 && $object->total_ht >= $conf->global->SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED && ! empty($object->user_approve_id)) { - print ''.$langs->trans("ApproveOrder").''; + print ''.$langs->trans("ApproveOrder").''; } else { @@ -2284,7 +2284,7 @@ elseif (! empty($object->id)) } else { - print ''.$langs->trans("ApproveOrder").''; + print ''.$langs->trans("ApproveOrder").''; } } @@ -2297,7 +2297,7 @@ elseif (! empty($object->id)) { if (! empty($object->user_approve_id2)) { - print ''.$langs->trans("Approve2Order").''; + print ''.$langs->trans("Approve2Order").''; } else { @@ -2306,7 +2306,7 @@ elseif (! empty($object->id)) } else { - print ''.$langs->trans("Approve2Order").''; + print ''.$langs->trans("Approve2Order").''; } } } @@ -2320,7 +2320,7 @@ elseif (! empty($object->id)) } else { - print ''.$langs->trans("RefuseOrder").''; + print ''.$langs->trans("RefuseOrder").''; } } @@ -2364,13 +2364,14 @@ elseif (! empty($object->id)) } // Ship - if (! empty($conf->stock->enabled) && ! empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER)) + + if (! empty($conf->stock->enabled) && (! empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER) || !empty($conf->global->STOCK_CALCULATE_ON_RECEPTION) || !empty($conf->global->STOCK_CALCULATE_ON_RECEPTION_CLOSE))) { if (in_array($object->statut, array(3,4,5))) { if ($conf->fournisseur->enabled && $user->rights->fournisseur->commande->receptionner) { print ''; } else { - print ''; + print ''; } } } @@ -2383,7 +2384,7 @@ elseif (! empty($object->id)) } else { - print ''; + print ''; } } diff --git a/htdocs/fourn/commande/dispatch.php b/htdocs/fourn/commande/dispatch.php index 5b5ae13f86b..931942debb7 100644 --- a/htdocs/fourn/commande/dispatch.php +++ b/htdocs/fourn/commande/dispatch.php @@ -41,7 +41,7 @@ if (! empty($conf->projet->enabled)) require_once DOL_DOCUMENT_ROOT . '/projet/class/project.class.php'; // Load translation files required by the page -$langs->loadLangs(array("bills", "orders", "sendings", "companies", "deliveries", "products", "stocks")); +$langs->loadLangs(array("bills", "orders", "sendings", "companies", "deliveries", "products", "stocks","receptions")); if (! empty($conf->productbatch->enabled)) $langs->load('productbatch'); @@ -459,9 +459,12 @@ if ($id > 0 || ! empty($ref)) { $entrepot = new Entrepot($db); $listwarehouses = $entrepot->list_array(1); - print ''; + if(empty($conf->reception->enabled))print ''; + else print ''; + print ''; - print ''; + if(empty($conf->reception->enabled))print ''; + else print ''; print '
'; print '
'; - print fieldLabel('CurrencyRate','multicurrency_tx'); + print $form->editfieldkey('CurrencyRate', 'multicurrency_tx', '', $object, 0); print 'id . '">' . img_edit($langs->transnoentitiesnoconv('SetMultiCurrencyCode'), 1) . '
' . fieldLabel('MulticurrencyAmountHT','multicurrency_total_ht') . '
' . $form->editfieldkey('MulticurrencyAmountHT', 'multicurrency_total_ht', '', $object, 0) . '' . price($object->multicurrency_total_ht, '', $langs, 0, - 1, - 1, (!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency)) . '
' . fieldLabel('MulticurrencyAmountVAT','multicurrency_total_tva') . '
' . $form->editfieldkey('MulticurrencyAmountVAT', 'multicurrency_total_tva', '', $object, 0) . '' . price($object->multicurrency_total_tva, '', $langs, 0, - 1, - 1, (!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency)) . '
' . fieldLabel('MulticurrencyAmountTTC','multicurrency_total_ttc') . '
' . $form->editfieldkey('MulticurrencyAmountTTC', 'multicurrency_total_ttc', '', $object, 0) . '' . price($object->multicurrency_total_ttc, '', $langs, 0, - 1, - 1, (!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency)) . '
'; @@ -723,6 +726,7 @@ if ($id > 0 || ! empty($ref)) { // modified by hook if (empty($reshook)) { + if(empty($conf->reception->enabled)){ print $langs->trans("Comment").' : '; print 'trans("DispatchSupplierOrder", $object->ref); @@ -730,8 +734,10 @@ if ($id > 0 || ! empty($ref)) { print '" class="flat">
'; print ' '.$checkboxlabel; + } + empty($conf->reception->enabled)?$dispatchBt=$langs->trans("DispatchVerb"):$dispatchBt=$langs->trans("Receive"); - print '
'; @@ -757,9 +763,11 @@ if ($id > 0 || ! empty($ref)) { $sql = "SELECT p.ref, p.label,"; $sql .= " e.rowid as warehouse_id, e.ref as entrepot,"; $sql .= " cfd.rowid as dispatchlineid, cfd.fk_product, cfd.qty, cfd.eatby, cfd.sellby, cfd.batch, cfd.comment, cfd.status, cfd.datec"; + if($conf->reception->enabled)$sql.=" ,cfd.fk_reception, r.date_delivery"; $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"; + if($conf->reception->enabled)$sql.=" LEFT JOIN " . MAIN_DB_PREFIX . "reception as r ON cfd.fk_reception = r.rowid"; $sql .= " WHERE cfd.fk_commande = " . $object->id; $sql .= " AND cfd.fk_product = p.rowid"; $sql .= " ORDER BY cfd.rowid ASC"; @@ -778,7 +786,11 @@ if ($id > 0 || ! empty($ref)) { print '
'; print ''; + if($conf->reception->enabled)print ''; + print ''; + print ''; + print ''; if (! empty($conf->productbatch->enabled)) { print ''; print ''; @@ -788,19 +800,34 @@ if ($id > 0 || ! empty($ref)) { print ''; print ''; print ''; - if (! empty($conf->global->SUPPLIER_ORDER_USE_DISPATCH_STATUS)) + if (! empty($conf->global->SUPPLIER_ORDER_USE_DISPATCH_STATUS) || !empty($conf->reception->enabled)) print ''; - print ''; + print "\n"; while ( $i < $num ) { $objp = $db->fetch_object($resql); print ""; + + if(!empty($conf->reception->enabled) ){ + print '"; + } + print '\n"; + print ''; + print ''; if (! empty($conf->productbatch->enabled)) { print ''; @@ -820,10 +847,10 @@ if ($id > 0 || ! empty($ref)) { print ''; // Comment - print ''; + print ''; // Status - if (! empty($conf->global->SUPPLIER_ORDER_USE_DISPATCH_STATUS)) { + if (! empty($conf->global->SUPPLIER_ORDER_USE_DISPATCH_STATUS) && empty($reception->rowid)) { print ''; + }else if(!empty($conf->reception->enabled)){ + print ''; + print ''; + print ''; + + print "\n"; diff --git a/htdocs/fourn/commande/info.php b/htdocs/fourn/commande/info.php index 5d6664347b7..feab3fcb1bc 100644 --- a/htdocs/fourn/commande/info.php +++ b/htdocs/fourn/commande/info.php @@ -187,7 +187,7 @@ if (! empty($conf->agenda->enabled)) } else { - print ''.$langs->trans("AddAction").''; + print ''.$langs->trans("AddAction").''; } } diff --git a/htdocs/fourn/commande/list.php b/htdocs/fourn/commande/list.php index 729899a8ff2..b4892d3d89f 100644 --- a/htdocs/fourn/commande/list.php +++ b/htdocs/fourn/commande/list.php @@ -6,7 +6,8 @@ * Copyright (C) 2014 Marcos García * Copyright (C) 2014 Juanjo Menent * Copyright (C) 2016 Ferran Marcet - * Copyright (C) 2018 Frédéric France + * Copyright (C) 2018 Frédéric France + * Copyright (C) 2018 Charlene Benke * * 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 @@ -25,7 +26,7 @@ /** * \file htdocs/fourn/commande/list.php * \ingroup fournisseur - * \brief List of vendor orders + * \brief List of purchase orders */ require '../../main.inc.php'; @@ -519,42 +520,13 @@ if ($search_company) $sql .= natural_search('s.nom', $search_company); if ($search_request_author) $sql.=natural_search(array('u.lastname','u.firstname','u.login'), $search_request_author) ; if ($search_billed != '' && $search_billed >= 0) $sql .= " AND cf.billed = ".$db->escape($search_billed); if ($search_product_category > 0) $sql.= " AND cp.fk_categorie = ".$search_product_category; - //Required triple check because statut=0 means draft filter if (GETPOST('statut', 'intcomma') !== '') -{ $sql .= " AND cf.fk_statut IN (".$db->escape($db->escape(GETPOST('statut', 'intcomma'))).")"; -} if ($search_status != '' && $search_status >= 0) -{ $sql.=" AND cf.fk_statut IN (".$db->escape($search_status).")"; -} -if ($search_ordermonth > 0) -{ - if ($search_orderyear > 0 && empty($search_orderday)) - $sql.= " AND cf.date_commande BETWEEN '".$db->idate(dol_get_first_day($search_orderyear,$search_ordermonth,false))."' AND '".$db->idate(dol_get_last_day($search_orderyear,$search_ordermonth,false))."'"; - else if ($search_orderyear > 0 && ! empty($search_orderday)) - $sql.= " AND cf.date_commande BETWEEN '".$db->idate(dol_mktime(0, 0, 0, $search_ordermonth, $search_orderday, $search_orderyear))."' AND '".$db->idate(dol_mktime(23, 59, 59, $search_ordermonth, $search_orderday, $search_orderyear))."'"; - else - $sql.= " AND date_format(cf.date_commande, '%m') = '".$db->escape($search_ordermonth)."'"; -} -else if ($search_orderyear > 0) -{ - $sql.= " AND cf.date_commande BETWEEN '".$db->idate(dol_get_first_day($search_orderyear,1,false))."' AND '".$db->idate(dol_get_last_day($search_orderyear,12,false))."'"; -} -if ($search_deliverymonth > 0) -{ - if ($search_deliveryyear > 0 && empty($search_deliveryday)) - $sql.= " AND cf.date_livraison BETWEEN '".$db->idate(dol_get_first_day($search_deliveryyear,$search_deliverymonth,false))."' AND '".$db->idate(dol_get_last_day($search_deliveryyear,$search_deliverymonth,false))."'"; - else if ($search_deliveryyear > 0 && ! empty($search_deliveryday)) - $sql.= " AND cf.date_livraison BETWEEN '".$db->idate(dol_mktime(0, 0, 0, $search_eliverymonth, $search_deliveryday, $search_deliveryyear))."' AND '".$db->idate(dol_mktime(23, 59, 59, $search_deliverymonth, $search_deliveryday, $search_deliveryyear))."'"; - else - $sql.= " AND date_format(cf.date_livraison, '%m') = '".$db->escape($search_deliverymonth)."'"; -} -else if ($search_deliveryyear > 0) -{ - $sql.= " AND cf.date_livraison BETWEEN '".$db->idate(dol_get_first_day($search_deliveryyear,1,false))."' AND '".$db->idate(dol_get_last_day($search_deliveryyear,12,false))."'"; -} +$sql.= dolSqlDateFilter("cf.date_commande", $search_orderday, $search_ordermonth, $search_orderyear); +$sql.= dolSqlDateFilter("cf.date_livraison", $search_deliveryday, $search_deliverymonth, $search_deliveryyear); 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); @@ -647,6 +619,7 @@ if ($resql) // List of mass actions available $arrayofmassactions = array( + 'generate_doc'=>$langs->trans("Generate"), 'presend'=>$langs->trans("SendByMail"), 'builddoc'=>$langs->trans("PDFMerge"), ); diff --git a/htdocs/fourn/commande/orderstoinvoice.php b/htdocs/fourn/commande/orderstoinvoice.php index 9c32c39c2b4..09381e40488 100644 --- a/htdocs/fourn/commande/orderstoinvoice.php +++ b/htdocs/fourn/commande/orderstoinvoice.php @@ -307,7 +307,7 @@ if ($action == 'create' && !$error) { print ''; print ''; print '' . "\n"; - print ''; + print ''; print ''; print ''; print ''; diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index 4f40b0cae36..67ae1dc623a 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -41,8 +41,9 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/discount.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/fourn.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; -if (!empty($conf->produit->enabled)) +if (!empty($conf->produit->enabled)) { require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; +} if (!empty($conf->projet->enabled)) { require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php'; @@ -516,7 +517,7 @@ if (empty($reshook)) $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_paiement as c ON p.fk_paiement = c.id AND c.entity IN (' . getEntity('c_paiement') . ')'; $sql.= ' WHERE pf.fk_facturefourn = '.$object->id; $sql.= ' AND pf.fk_paiementfourn = p.rowid'; - $sql.= ' AND p.entity IN (' . getEntity('facture').')'; + $sql.= ' AND p.entity IN (' . getEntity('invoice').')'; $resql = $db->query($sql); if (! $resql) dol_print_error($db); @@ -862,6 +863,27 @@ if (empty($reshook)) $object->origin = GETPOST('origin'); $object->origin_id = GETPOST('originid'); + + require_once DOL_DOCUMENT_ROOT.'/'.$element.'/class/'.$subelement.'.class.php'; + $classname = ucfirst($subelement); + if ($classname == 'Fournisseur.commande') $classname='CommandeFournisseur'; + $objectsrc = new $classname($db); + $objectsrc->fetch($originid); + $objectsrc->fetch_thirdparty(); + + if ($object->origin == 'reception') + { + $objectsrc->fetchObjectLinked(); + + if (count($objectsrc->linkedObjectsIds['order_supplier']) > 0) + { + foreach ($objectsrc->linkedObjectsIds['order_supplier'] as $key => $value) + { + $object->linked_objects['order_supplier'] = $value; + } + } + } + $id = $object->create($user); // Add lines @@ -925,7 +947,9 @@ if (empty($reshook)) 0, $lines[$i]->array_options, $lines[$i]->fk_unit, - $lines[$i]->id + $lines[$i]->id, + 0, + $lines[$i]->ref_supplier ); if ($result < 0) @@ -1222,7 +1246,7 @@ if (empty($reshook)) $desc = $productsupplier->desc_supplier; } else $desc = $productsupplier->description; - if (trim($product_desc) != trim($desc)) $desc = dol_concatdesc($desc, $product_desc); + if (trim($product_desc) != trim($desc)) $desc = dol_concatdesc($desc, $product_desc, '', !empty($conf->global->CHANGE_ORDER_CONCAT_DESCRIPTION)); $type = $productsupplier->type; $price_base_type = ($productsupplier->fourn_price_base_type?$productsupplier->fourn_price_base_type:'HT'); @@ -1629,8 +1653,7 @@ if ($action == 'create') $projectid = $originid; $element = 'projet'; } - else if (in_array($element,array('order_supplier'))) - { + // For compatibility if ($element == 'order') { $element = $subelement = 'commande'; @@ -1677,7 +1700,6 @@ if ($action == 'create') // Replicate extrafields $objectsrc->fetch_optionals($originid); $object->array_options = $objectsrc->array_options; - } } else { @@ -1738,7 +1760,7 @@ if ($action == 'create') print ''; // Ref supplier - print ''; + print ''; print ''; // Type invoice @@ -1990,7 +2012,7 @@ if ($action == 'create') if (! empty($conf->multicurrency->enabled)) { print ''; - print ''; + print ''; print ''; @@ -2021,6 +2043,7 @@ if ($action == 'create') print ''; print ''; @@ -2031,6 +2054,8 @@ if ($action == 'create') print ''; print ''; @@ -2519,7 +2544,7 @@ else print ''; print '
' . $langs->trans("Reception") . '' . $langs->trans("Product") . '' . $langs->trans("DateCreation") . '' . $langs->trans("DateDeliveryPlanned") . '' . $langs->trans("batch_number") . '' . $langs->trans("EatByDate") . '' . $langs->trans("Warehouse") . '' . $langs->trans("Comment") . '' . $langs->trans("Status") . '' . $langs->trans("Date") . '
'; + if (!empty($objp->fk_reception)){ + + $reception = new Reception($db); + $reception->fetch($objp->fk_reception); + print $reception->getNomUrl(1); + } + + print "'; print '' . img_object($langs->trans("ShowProduct"), 'product') . ' ' . $objp->ref . ''; print ' - ' . $objp->label; print "'.dol_print_date($db->jdate($objp->datec),'day').''.dol_print_date($db->jdate($objp->date_delivery),'day').'' . $objp->batch . '' . $objp->comment . '' . $objp->comment . ''; $supplierorderdispatch->status = (empty($objp->status) ? 0 : $objp->status); // print $supplierorderdispatch->status; @@ -859,9 +886,17 @@ if ($id > 0 || ! empty($ref)) { } } print ''; + if(!empty($reception->id)){ + print $reception->getLibStatut(5); + } } - // date - print '' . dol_print_date($objp->datec, "dayhour") . ''; + print '
'.$langs->trans('RefSupplier').'
'.$langs->trans('RefSupplier').'
'.fieldLabel('Currency','multicurrency_code').''.$form->editfieldkey('Currency', 'multicurrency_code', '', $object, 0).''; print $form->selectMultiCurrency($currency_code, 'multicurrency_code'); print '
'.$langs->trans('NotePublic').''; $note_public = $object->getDefaultCreateValueFor('note_public'); + if(empty($note_public))$note_public = $objectsrc->note_public; $doleditor = new DolEditor('note_public', $note_public, '', 80, 'dolibarr_notes', 'In', 0, false, true, ROWS_3, '90%'); print $doleditor->Create(1); print '
'.$langs->trans('NotePrivate').''; $note_private = $object->getDefaultCreateValueFor('note_private'); + if(empty($note_private))$note_private = $objectsrc->note_private; + $doleditor = new DolEditor('note_private', $note_private, '', 80, 'dolibarr_notes', 'In', 0, false, true, ROWS_3, '90%'); print $doleditor->Create(1); print '
'; print ''; if ($action != 'editmulticurrencycode' && ! empty($object->brouillon)) print ''; @@ -2536,7 +2561,7 @@ else print ''; print '
'; - print fieldLabel('Currency','multicurrency_code'); + print $form->editfieldkey('Currency', 'multicurrency_code', '', $object, 0); print 'id . '">' . img_edit($langs->transnoentitiesnoconv('SetMultiCurrencyCode'), 1) . '
'; print ''; if ($action != 'editmulticurrencyrate' && ! empty($object->brouillon) && $object->multicurrency_code && $object->multicurrency_code != $conf->currency) print ''; @@ -2614,17 +2639,17 @@ else if (!empty($conf->multicurrency->enabled) && ($object->multicurrency_code != $conf->currency)) { // Multicurrency Amount HT - print ''; + print ''; print ''; print ''; // Multicurrency Amount VAT - print ''; + print ''; print ''; print ''; // Multicurrency Amount TTC - print ''; + print ''; print ''; print ''; } @@ -3021,9 +3046,9 @@ else else { if ($user->rights->fournisseur->facture->creer) { - print '
'.$langs->trans('ReOpen').'
'; + print '
'.$langs->trans('ReOpen').'
'; } elseif (empty($conf->global->MAIN_BUTTON_HIDE_UNAUTHORIZED)) { - print '
'.$langs->trans('ReOpen').'
'; + print '
'.$langs->trans('ReOpen').'
'; } } } @@ -3035,7 +3060,7 @@ else { print ''; } - else print '
'.$langs->trans('SendMail').'
'; + else print '
'.$langs->trans('SendMail').'
'; } // Make payments @@ -3060,7 +3085,7 @@ else { if ($resteapayer == 0) { - print '
'.$langs->trans('DoPaymentBack').'
'; + print '
'.$langs->trans('DoPaymentBack').'
'; } else { @@ -3097,7 +3122,7 @@ else } else { - print ''; } } @@ -3130,20 +3155,20 @@ else { //var_dump($isErasable); if ($isErasable == -4) { - print ''; + print ''; } elseif ($isErasable == -3) { // Should never happen with supplier invoice - print ''; + print ''; } elseif ($isErasable == -2) { // Should never happen with supplier invoice - print ''; + print ''; } elseif ($isErasable == -1) { - print ''; + print ''; } elseif ($isErasable <= 0) // Any other cases { - print ''; + print ''; } else { diff --git a/htdocs/fourn/facture/list.php b/htdocs/fourn/facture/list.php index 9a53b31c8a1..9286c038507 100644 --- a/htdocs/fourn/facture/list.php +++ b/htdocs/fourn/facture/list.php @@ -10,7 +10,8 @@ * Copyright (C) 2015 Abbes Bahfir * Copyright (C) 2015-2016 Ferran Marcet * Copyright (C) 2017 Josep Lluís Amador - * Copyright (C) 2018 Frédéric France + * Copyright (C) 2018 Charlene Benke + * Copyright (C) 2018 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 @@ -329,32 +330,8 @@ if ($search_montant_localtax2 != '') $sql.= natural_search('f.localtax2', $searc if ($search_montant_ttc != '') $sql.= natural_search('f.total_ttc', $search_montant_ttc, 1); if ($search_status != '' && $search_status >= 0) $sql.= " AND f.fk_statut = ".$db->escape($search_status); if ($search_paymentmode > 0) $sql .= " AND f.fk_mode_reglement = ".$search_paymentmode.""; -if ($month > 0) -{ - if ($year > 0 && empty($day)) - $sql.= " AND f.datef BETWEEN '".$db->idate(dol_get_first_day($year,$month,false))."' AND '".$db->idate(dol_get_last_day($year,$month,false))."'"; - else if ($year > 0 && ! empty($day)) - $sql.= " AND f.datef BETWEEN '".$db->idate(dol_mktime(0, 0, 0, $month, $day, $year))."' AND '".$db->idate(dol_mktime(23, 59, 59, $month, $day, $year))."'"; - else - $sql.= " AND date_format(f.datef, '%m') = '".$month."'"; -} -else if ($year > 0) -{ - $sql.= " AND f.datef BETWEEN '".$db->idate(dol_get_first_day($year,1,false))."' AND '".$db->idate(dol_get_last_day($year,12,false))."'"; -} -if ($month_lim > 0) -{ - if ($year_lim > 0 && empty($day_lim)) - $sql.= " AND f.date_lim_reglement BETWEEN '".$db->idate(dol_get_first_day($year_lim,$month_lim,false))."' AND '".$db->idate(dol_get_last_day($year_lim,$month_lim,false))."'"; - else if ($year_lim > 0 && ! empty($day_lim)) - $sql.= " AND f.date_lim_reglement BETWEEN '".$db->idate(dol_mktime(0, 0, 0, $month_lim, $day_lim, $year_lim))."' AND '".$db->idate(dol_mktime(23, 59, 59, $month_lim, $day_lim, $year_lim))."'"; - else - $sql.= " AND date_format(f.date_lim_reglement, '%m') = '".$db->escape($month_lim)."'"; -} -else if ($year_lim > 0) -{ - $sql.= " AND f.date_lim_reglement BETWEEN '".$db->idate(dol_get_first_day($year_lim,1,false))."' AND '".$db->idate(dol_get_last_day($year_lim,12,false))."'"; -} +$sql.= dolSqlDateFilter( "f.datef", $day, $month, $year); +$sql.= dolSqlDateFilter( "f.date_lim_reglement", $day_lim, $month_lim, $year_lim); if ($option == 'late') $sql.=" AND f.date_lim_reglement < '".$db->idate(dol_now() - $conf->facture->fournisseur->warning_delay)."'"; if ($search_label) $sql .= natural_search('f.libelle', $search_label); if ($search_status != '' && $search_status >= 0) @@ -477,6 +454,7 @@ if ($resql) // List of mass actions available $arrayofmassactions = array( 'validate'=>$langs->trans("Validate"), + 'generate_doc'=>$langs->trans("Generate"), //'presend'=>$langs->trans("SendByMail"), //'builddoc'=>$langs->trans("PDFMerge"), ); diff --git a/htdocs/fourn/paiement/card.php b/htdocs/fourn/paiement/card.php index bd957503b94..5f720175b69 100644 --- a/htdocs/fourn/paiement/card.php +++ b/htdocs/fourn/paiement/card.php @@ -356,7 +356,7 @@ if ($result > 0) } else { - print ''.$langs->trans('Delete').''; + print ''.$langs->trans('Delete').''; } } } diff --git a/htdocs/fourn/product/list.php b/htdocs/fourn/product/list.php index 16ed559814d..7a623e2cba2 100644 --- a/htdocs/fourn/product/list.php +++ b/htdocs/fourn/product/list.php @@ -117,6 +117,7 @@ if ($fourn_id) $arrayofmassactions = array( + 'generate_doc'=>$langs->trans("Generate"), 'presend'=>$langs->trans("SendByMail"), 'builddoc'=>$langs->trans("PDFMerge"), ); diff --git a/htdocs/holiday/card.php b/htdocs/holiday/card.php index 0028367cd3d..0f22e07245b 100644 --- a/htdocs/holiday/card.php +++ b/htdocs/holiday/card.php @@ -1326,14 +1326,14 @@ else } else { - print ''.$langs->trans("Approve").''; - print ''.$langs->trans("ActionRefuseCP").''; + print ''.$langs->trans("Approve").''; + print ''.$langs->trans("ActionRefuseCP").''; } } if (($user->id == $object->fk_validator || in_array($object->fk_user, $childids) || ! empty($user->rights->holiday->write_all)) && ($object->statut == 2 || $object->statut == 3)) // Status validated or approved { if (($object->date_debut > dol_now()) || $user->admin) print ''.$langs->trans("ActionCancelCP").''; - else print ''.$langs->trans("ActionCancelCP").''; + else print ''.$langs->trans("ActionCancelCP").''; } if ($cancreate && $object->statut == Holiday::STATUS_CANCELED) { diff --git a/htdocs/holiday/list.php b/htdocs/holiday/list.php index a2bdcb2a5b3..1cb76abf4ec 100644 --- a/htdocs/holiday/list.php +++ b/htdocs/holiday/list.php @@ -1,7 +1,8 @@ * Copyright (C) 2013-2018 Laurent Destailleur - * Copyright (C) 2012-2016 Regis Houssin + * Copyright (C) 2012-2016 Regis Houssin + * Copyright (C) 2018 Charlene Benke * * 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 @@ -188,67 +189,24 @@ if(!empty($search_ref)) { $filter.= " AND cp.rowid = ".(int) $db->escape($search_ref); } - // Start date -if($search_year_start > 0) { - if($search_month_start > 0) { - $filter .= " AND (cp.date_debut BETWEEN '".$db->idate(dol_get_first_day($search_year_start,$search_month_start,1))."' AND '".$db->idate(dol_get_last_day($search_year_start,$search_month_start,1))."')"; - //$filter.= " AND date_format(cp.date_debut, '%Y-%m') = '$search_year_start-$search_month_start'"; - } else { - $filter .= " AND (cp.date_debut BETWEEN '".$db->idate(dol_get_first_day($search_year_start,1,1))."' AND '".$db->idate(dol_get_last_day($search_year_start,12,1))."')"; - //$filter.= " AND date_format(cp.date_debut, '%Y') = '$search_year_start'"; - } -} else { - if($search_month_start > 0) { - $filter.= " AND date_format(cp.date_debut, '%m') = '".$db->escape($search_month_start)."'"; - } -} - +$filter.= dolSqlDateFilter("cp.date_debut", $search_day_start, $search_month_start, $search_year_start); // End date -if($search_year_end > 0) { - if($search_month_end > 0) { - $filter .= " AND (cp.date_fin BETWEEN '".$db->idate(dol_get_first_day($search_year_end,$search_month_end,1))."' AND '".$db->idate(dol_get_last_day($search_year_end,$search_month_end,1))."')"; - //$filter.= " AND date_format(cp.date_fin, '%Y-%m') = '$search_year_end-$search_month_end'"; - } else { - $filter .= " AND (cp.date_fin BETWEEN '".$db->idate(dol_get_first_day($search_year_end,1,1))."' AND '".$db->idate(dol_get_last_day($search_year_end,12,1))."')"; - //$filter.= " AND date_format(cp.date_fin, '%Y') = '$search_year_end'"; - } -} else { - if($search_month_end > 0) { - $filter.= " AND date_format(cp.date_fin, '%m') = '".$db->escape($search_month_end)."'"; - } -} - +$filter.= dolSqlDateFilter("cp.date_fin", $search_day_end, $search_month_end, $search_year_end); // Create date -if($search_year_create > 0) { - if($search_month_create > 0) { - $filter .= " AND (cp.date_create BETWEEN '".$db->idate(dol_get_first_day($search_year_create,$search_month_create,1))."' AND '".$db->idate(dol_get_last_day($search_year_create,$search_month_create,1))."')"; - //$filter.= " AND date_format(cp.date_create, '%Y-%m') = '$search_year_create-$search_month_create'"; - } else { - $filter .= " AND (cp.date_create BETWEEN '".$db->idate(dol_get_first_day($search_year_create,1,1))."' AND '".$db->idate(dol_get_last_day($search_year_create,12,1))."')"; - //$filter.= " AND date_format(cp.date_create, '%Y') = '$search_year_create'"; - } -} else { - if($search_month_create > 0) { - $filter.= " AND date_format(cp.date_create, '%m') = '".$db->escape($search_month_create)."'"; - } -} - +$filter.= dolSqlDateFilter("cp.date_create", $search_day_create, $search_month_create, $search_year_create); // Employee if(!empty($search_employee) && $search_employee != -1) { $filter.= " AND cp.fk_user = '".$db->escape($search_employee)."'\n"; } - // Validator if(!empty($search_valideur) && $search_valideur != -1) { $filter.= " AND cp.fk_validator = '".$db->escape($search_valideur)."'\n"; } - // Type if (!empty($search_type) && $search_type != -1) { $filter.= ' AND cp.fk_type IN ('.$db->escape($search_type).')'; } - // Status if(!empty($search_statut) && $search_statut != -1) { $filter.= " AND cp.statut = '".$db->escape($search_statut)."'\n"; diff --git a/htdocs/hrm/establishment/card.php b/htdocs/hrm/establishment/card.php index d7f591da027..77126100068 100644 --- a/htdocs/hrm/establishment/card.php +++ b/htdocs/hrm/establishment/card.php @@ -185,11 +185,14 @@ if ($action == 'create') print '
'; - print fieldLabel('CurrencyRate','multicurrency_tx'); + print $form->editfieldkey('CurrencyRate', 'multicurrency_tx', '', $object, 0); print 'id . '">' . img_edit($langs->transnoentitiesnoconv('SetMultiCurrencyCode'), 1) . '
' . fieldLabel('MulticurrencyAmountHT','multicurrency_total_ht') . '
' . $form->editfieldkey('MulticurrencyAmountHT', 'multicurrency_total_ht', '', $object, 0) . '' . price($object->multicurrency_total_ht, '', $langs, 0, - 1, - 1, (!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency)) . '
' . fieldLabel('MulticurrencyAmountVAT','multicurrency_total_tva') . '
' . $form->editfieldkey('MulticurrencyAmountVAT', 'multicurrency_total_tva', '', $object, 0) . '' . price($object->multicurrency_total_tva, '', $langs, 0, - 1, - 1, (!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency)) . '
' . fieldLabel('MulticurrencyAmountTTC','multicurrency_total_ttc') . '
' . $form->editfieldkey('MulticurrencyAmountTTC', 'multicurrency_total_ttc', '', $object, 0) . '' . price($object->multicurrency_total_ttc, '', $langs, 0, - 1, - 1, (!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency)) . '
'; // Name - print ''; + print ''; + print ''; + print ''; + print ''; // Address print ''; - print ''; + print ''; print ''; @@ -197,18 +200,23 @@ if ($action == 'create') // Zipcode print ''; - print ''; + print ''; print ''; print ''; // Town print ''; - print ''; + print ''; print ''; - print ''; + print ''; print ''; - print ''; + print ''; print ''; @@ -272,30 +280,30 @@ if (($id || $ref) && $action == 'edit') print ''; // Name - print ''; // Address - print ''; + print ''; print ''; // Zipcode / Town - print ''; - print ''; // Country - print ''; + print ''; print ''; // Status - print ''; diff --git a/htdocs/imports/import.php b/htdocs/imports/import.php index 5e69a01bcaf..2e4ae5da357 100644 --- a/htdocs/imports/import.php +++ b/htdocs/imports/import.php @@ -1091,7 +1091,7 @@ if ($step == 4 && $datatoimport) } else { - print ''.$langs->trans("NextStep").''; + print ''.$langs->trans("NextStep").''; } } @@ -1436,7 +1436,7 @@ if ($step == 5 && $datatoimport) } else { - print ''.$langs->trans("RunSimulateImportFile").''; + print ''.$langs->trans("RunSimulateImportFile").''; } print ''; } @@ -1596,14 +1596,14 @@ if ($step == 5 && $datatoimport) { //print ''; - print ''.$langs->trans("RunImportFile").''; + print ''.$langs->trans("RunImportFile").''; } } else { - print ''.$langs->trans("RunSimulateImportFile").''; + print ''.$langs->trans("RunSimulateImportFile").''; - print ''.$langs->trans("RunImportFile").''; + print ''.$langs->trans("RunImportFile").''; } print ''; } diff --git a/htdocs/imports/index.php b/htdocs/imports/index.php index b1852a3de4f..2c1905d9db4 100644 --- a/htdocs/imports/index.php +++ b/htdocs/imports/index.php @@ -96,7 +96,7 @@ if (count($import->array_import_code)) //} //else //{ - // print ''.$langs->trans("NewImport").''; + // print ''.$langs->trans("NewImport").''; //} } print ''; diff --git a/htdocs/install/check.php b/htdocs/install/check.php index 15806c38a1b..34379975828 100644 --- a/htdocs/install/check.php +++ b/htdocs/install/check.php @@ -437,7 +437,8 @@ else array('from'=>'5.0.0', 'to'=>'6.0.0'), array('from'=>'6.0.0', 'to'=>'7.0.0'), array('from'=>'7.0.0', 'to'=>'8.0.0'), - array('from'=>'8.0.0', 'to'=>'9.0.0') + array('from'=>'8.0.0', 'to'=>'9.0.0'), + array('from'=>'9.0.0', 'to'=>'10.0.0') ); $count=0; diff --git a/htdocs/install/mysql/data/llx_c_action_trigger.sql b/htdocs/install/mysql/data/llx_c_action_trigger.sql index 143e30e8fb7..d8123d3ca8f 100644 --- a/htdocs/install/mysql/data/llx_c_action_trigger.sql +++ b/htdocs/install/mysql/data/llx_c_action_trigger.sql @@ -81,6 +81,8 @@ insert into llx_c_action_trigger (code,label,description,elementtype,rang) value insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('SHIPPING_VALIDATE','Shipping validated','Executed when a shipping is validated','shipping',20); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('SHIPPING_SENTBYMAIL','Shipping sent by mail','Executed when a shipping is sent by mail','shipping',21); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('SHIPPING_DELETE','Shipping sent is deleted','Executed when a shipping is deleted','shipping',21); +insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('RECEPTION_VALIDATE','Reception validated','Executed when a reception is validated','reception',22); +insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('RECEPTION_SENTBYMAIL','Reception sent by mail','Executed when a reception is sent by mail','reception',22); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MEMBER_VALIDATE','Member validated','Executed when a member is validated','member',22); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MEMBER_SENTBYMAIL','Mails sent from member card','Executed when you send email from member card','member',23); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MEMBER_SUBSCRIPTION_CREATE','Member subscribtion recorded','Executed when a member subscribtion is deleted','member',24); @@ -105,6 +107,9 @@ insert into llx_c_action_trigger (code,label,description,elementtype,rang) value insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_APPROVE','Expense report approved','Executed when an expense report is approved','expensereport',203); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROJECT_VALIDATE','Project validation','Executed when a project is validated','project',141); 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 ('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_DELETE','Ticket deleted','Executed when a ticket is deleted','ticket',164); -- actions not enabled by default (no constant created for that) when we enable module agenda insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PRODUCT_MODIFY','Product or service modified','Executed when a product or sevice is modified','product',41); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MEMBER_MODIFY','Member modified','Executed when a member is modified','member',23); diff --git a/htdocs/install/mysql/migration/7.0.0-8.0.0.sql b/htdocs/install/mysql/migration/7.0.0-8.0.0.sql index 1a7cfd58410..cee3a17e061 100644 --- a/htdocs/install/mysql/migration/7.0.0-8.0.0.sql +++ b/htdocs/install/mysql/migration/7.0.0-8.0.0.sql @@ -218,7 +218,9 @@ UPDATE llx_societe_rib set type = 'ban' where type = '' OR type IS NULL; -- VMYSQL4.3 ALTER TABLE llx_societe_rib MODIFY COLUMN type varchar(32) NOT NULL; -- VPGSQL8.2 ALTER TABLE llx_societe_rib ALTER COLUMN type SET NOT NULL; - + +ALTER TABLE llx_ticket_msg DROP FOREIGN KEY fk_ticket_msg_fk_track_id; + -- Module ticket CREATE TABLE llx_ticket ( @@ -265,17 +267,6 @@ CREATE TABLE llx_ticket_msg ALTER TABLE llx_ticket_msg ADD CONSTRAINT fk_ticket_msg_fk_track_id FOREIGN KEY (fk_track_id) REFERENCES llx_ticket (track_id); -CREATE TABLE llx_ticket_logs -( - rowid integer AUTO_INCREMENT PRIMARY KEY, - entity integer DEFAULT 1, - fk_track_id varchar(128), - fk_user_create integer, - datec datetime, - message text -)ENGINE=innodb; - -ALTER TABLE llx_ticket_logs ADD CONSTRAINT fk_ticket_logs_fk_track_id FOREIGN KEY (fk_track_id) REFERENCES llx_ticket (track_id); CREATE TABLE llx_ticket_extrafields ( @@ -568,3 +559,4 @@ ALTER TABLE llx_advtargetemailing ADD COLUMN type_element varchar(180) NOT NULL; UPDATE llx_advtargetemailing SET fk_element = fk_mailing, type_element='mailing'; ALTER TABLE llx_advtargetemailing DROP COLUMN fk_mailing; +DROP TABLE llx_ticket_logs; diff --git a/htdocs/install/mysql/migration/8.0.0-9.0.0.sql b/htdocs/install/mysql/migration/8.0.0-9.0.0.sql index 040739e8ce7..381f3626c77 100644 --- a/htdocs/install/mysql/migration/8.0.0-9.0.0.sql +++ b/htdocs/install/mysql/migration/8.0.0-9.0.0.sql @@ -147,6 +147,7 @@ CREATE TABLE llx_takepos_floor_tables( UPDATE llx_c_payment_term SET decalage = nbjour, nbjour = 0 where decalage IS NULL AND type_cdr = 2; + UPDATE llx_holiday SET ref = rowid WHERE ref IS NULL; diff --git a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql new file mode 100644 index 00000000000..0bf41b5af10 --- /dev/null +++ b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql @@ -0,0 +1,59 @@ +-- +-- Be carefull to requests order. +-- This file must be loaded by calling /install/index.php page +-- when current version is 10.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 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. + +-- Missing in 9.0 + + + +-- For 10.0 + +ALTER TABLE llx_loan ADD COLUMN insurance_amount double(24,8) DEFAULT 0; + +ALTER TABLE llx_facture DROP INDEX idx_facture_uk_facnumber; +ALTER TABLE llx_facture CHANGE facnumber ref VARCHAR(30) NOT NULL; +ALTER TABLE llx_facture ADD UNIQUE INDEX uk_facture_ref (ref, entity); + +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_DELETE','Ticket deleted','Executed when a ticket is deleted','ticket',164); + +create table llx_mailing_unsubscribe +( + rowid integer AUTO_INCREMENT PRIMARY KEY, + entity integer DEFAULT 1 NOT NULL, -- multi company id + email varchar(255), + unsubscribegroup varchar(128) DEFAULT '', + ip varchar(128), + date_creat datetime, -- creation date + tms timestamp +)ENGINE=innodb; + +ALTER TABLE llx_mailing_unsubscribe ADD UNIQUE uk_mailing_unsubscribe(email, entity, unsubscribegroup); + +ALTER TABLE llx_adherent ADD gender VARCHAR(10); diff --git a/htdocs/install/mysql/migration/repair.sql b/htdocs/install/mysql/migration/repair.sql index 22409441eac..f54523d2230 100755 --- a/htdocs/install/mysql/migration/repair.sql +++ b/htdocs/install/mysql/migration/repair.sql @@ -77,14 +77,14 @@ ALTER TABLE llx_propal DROP FOREIGN KEY fk_propal_fk_currency; ALTER TABLE llx_commande DROP FOREIGN KEY fk_commande_fk_currency; ALTER TABLE llx_facture DROP FOREIGN KEY fk_facture_fk_currency; -delete from llx_facturedet where fk_facture in (select rowid from llx_facture where facnumber in ('(PROV)','ErrorBadMask')); -delete from llx_facture where facnumber in ('(PROV)','ErrorBadMask'); +delete from llx_facturedet where fk_facture in (select rowid from llx_facture where ref in ('(PROV)','ErrorBadMask')); +delete from llx_facture where ref in ('(PROV)','ErrorBadMask'); delete from llx_commandedet where fk_commande in (select rowid from llx_commande where ref in ('(PROV)','ErrorBadMask')); delete from llx_commande where ref in ('(PROV)','ErrorBadMask'); delete from llx_propaldet where fk_propal in (select rowid from llx_propal where ref in ('(PROV)','ErrorBadMask')); delete from llx_propal where ref in ('(PROV)','ErrorBadMask'); -delete from llx_facturedet where fk_facture in (select rowid from llx_facture where facnumber = ''); -delete from llx_facture where facnumber = ''; +delete from llx_facturedet where fk_facture in (select rowid from llx_facture where ref = ''); +delete from llx_facture where ref = ''; delete from llx_commandedet where fk_commande in (select rowid from llx_commande where ref = ''); delete from llx_commande where ref = ''; delete from llx_propaldet where fk_propal in (select rowid from llx_propal where ref = ''); diff --git a/htdocs/install/mysql/tables/llx_adherent.sql b/htdocs/install/mysql/tables/llx_adherent.sql index 96da4ffb326..ede4de2e487 100644 --- a/htdocs/install/mysql/tables/llx_adherent.sql +++ b/htdocs/install/mysql/tables/llx_adherent.sql @@ -30,6 +30,7 @@ create table llx_adherent entity integer DEFAULT 1 NOT NULL, -- multi company id ref_ext varchar(128), -- reference into an external system (not used by dolibarr) + gender varchar(10), civility varchar(6), lastname varchar(50), firstname varchar(50), diff --git a/htdocs/install/mysql/tables/llx_commande_fournisseur_dispatch.key.sql b/htdocs/install/mysql/tables/llx_commande_fournisseur_dispatch.key.sql index ba7c02280ec..369a25f2b32 100644 --- a/htdocs/install/mysql/tables/llx_commande_fournisseur_dispatch.key.sql +++ b/htdocs/install/mysql/tables/llx_commande_fournisseur_dispatch.key.sql @@ -16,4 +16,6 @@ -- -- =================================================================== -ALTER TABLE llx_commande_fournisseur_dispatch ADD INDEX idx_commande_fournisseur_dispatch_fk_commande (fk_commande); \ No newline at end of file +ALTER TABLE llx_commande_fournisseur_dispatch ADD INDEX idx_commande_fournisseur_dispatch_fk_commande (fk_commande); +ALTER TABLE llx_commande_fournisseur_dispatch ADD INDEX idx_commande_fournisseur_dispatch_fk_reception (fk_reception); +ALTER TABLE llx_commande_fournisseur_dispatch ADD CONSTRAINT fk_commande_fournisseur_dispatch_fk_reception FOREIGN KEY (fk_reception) REFERENCES llx_reception (rowid); \ No newline at end of file diff --git a/htdocs/install/mysql/tables/llx_commande_fournisseur_dispatch.sql b/htdocs/install/mysql/tables/llx_commande_fournisseur_dispatch.sql index 789ec3e7a9b..9a6e05d1af1 100644 --- a/htdocs/install/mysql/tables/llx_commande_fournisseur_dispatch.sql +++ b/htdocs/install/mysql/tables/llx_commande_fournisseur_dispatch.sql @@ -25,6 +25,8 @@ create table llx_commande_fournisseur_dispatch fk_commande integer, fk_product integer, fk_commandefourndet integer, + fk_projet integer DEFAULT NULL, + fk_reception integer DEFAULT NULL, qty float, -- qty fk_entrepot integer, fk_user integer, diff --git a/htdocs/install/mysql/tables/llx_commande_fournisseur_dispatch_extrafields.key.sql b/htdocs/install/mysql/tables/llx_commande_fournisseur_dispatch_extrafields.key.sql new file mode 100644 index 00000000000..c836fbaea6a --- /dev/null +++ b/htdocs/install/mysql/tables/llx_commande_fournisseur_dispatch_extrafields.key.sql @@ -0,0 +1,20 @@ +-- =================================================================== +-- Copyright (C) 2015 Claudio Aschieri +-- +-- 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 . +-- +-- =================================================================== + + +ALTER TABLE llx_commande_fournisseur_dispatch_extrafields ADD INDEX idx_commande_fournisseur_dispatch_extrafields (fk_object); diff --git a/htdocs/install/mysql/tables/llx_commande_fournisseur_dispatch_extrafields.sql b/htdocs/install/mysql/tables/llx_commande_fournisseur_dispatch_extrafields.sql new file mode 100644 index 00000000000..f00eabf42fa --- /dev/null +++ b/htdocs/install/mysql/tables/llx_commande_fournisseur_dispatch_extrafields.sql @@ -0,0 +1,25 @@ +-- =================================================================== +-- Copyright (C) 2015 Claudio Aschieri +-- +-- 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 . +-- +-- =================================================================== + +create table llx_commande_fournisseur_dispatch_extrafields +( + rowid integer AUTO_INCREMENT PRIMARY KEY, + tms timestamp, + fk_object integer NOT NULL, -- object id + import_key varchar(14) -- import key +)ENGINE=innodb; diff --git a/htdocs/install/mysql/tables/llx_facture.key.sql b/htdocs/install/mysql/tables/llx_facture.key.sql index 0a2710c86ac..caed51240d7 100644 --- a/htdocs/install/mysql/tables/llx_facture.key.sql +++ b/htdocs/install/mysql/tables/llx_facture.key.sql @@ -19,7 +19,7 @@ -- ============================================================================ -ALTER TABLE llx_facture ADD UNIQUE INDEX idx_facture_uk_facnumber (facnumber, entity); +ALTER TABLE llx_facture ADD UNIQUE INDEX uk_facture_ref (ref, entity); ALTER TABLE llx_facture ADD INDEX idx_facture_fk_soc (fk_soc); ALTER TABLE llx_facture ADD INDEX idx_facture_fk_user_author (fk_user_author); diff --git a/htdocs/install/mysql/tables/llx_facture.sql b/htdocs/install/mysql/tables/llx_facture.sql index 51f322b69ee..8e9ceb48d04 100644 --- a/htdocs/install/mysql/tables/llx_facture.sql +++ b/htdocs/install/mysql/tables/llx_facture.sql @@ -26,7 +26,7 @@ create table llx_facture ( rowid integer AUTO_INCREMENT PRIMARY KEY, - facnumber varchar(30) NOT NULL, -- invoice reference number + ref varchar(30) NOT NULL, -- invoice reference number entity integer DEFAULT 1 NOT NULL, -- multi company id ref_ext varchar(255), -- reference into an external system (not used by dolibarr) diff --git a/htdocs/install/mysql/tables/llx_links.sql b/htdocs/install/mysql/tables/llx_links.sql index 4d4ab401ba4..7e9fba8e2c5 100644 --- a/htdocs/install/mysql/tables/llx_links.sql +++ b/htdocs/install/mysql/tables/llx_links.sql @@ -15,7 +15,7 @@ -- along with this program. If not, see . -- -- --- Actions commerciales +-- Table to store external URL links to documents -- ======================================================================== create table llx_links diff --git a/htdocs/install/mysql/tables/llx_loan.sql b/htdocs/install/mysql/tables/llx_loan.sql index 7277fa85d47..f153e25dd22 100644 --- a/htdocs/install/mysql/tables/llx_loan.sql +++ b/htdocs/install/mysql/tables/llx_loan.sql @@ -27,7 +27,9 @@ create table llx_loan label varchar(80) NOT NULL, fk_bank integer, - capital double(24,8) default 0 NOT NULL, + capital double(24,8) DEFAULT 0 NOT NULL, + insurance_amount double(24,8) DEFAULT 0, + datestart date, dateend date, nbterm real, @@ -36,9 +38,9 @@ create table llx_loan note_private text, note_public text, - capital_position double(24,8) default 0, -- If not a new loan, just have the position of capital + capital_position double(24,8) DEFAULT 0, -- If not a new loan, just have the position of capital date_position date, - + paid smallint default 0 NOT NULL, accountancy_account_capital varchar(32), diff --git a/htdocs/install/mysql/tables/llx_mailing_unsubscribe.key.sql b/htdocs/install/mysql/tables/llx_mailing_unsubscribe.key.sql new file mode 100644 index 00000000000..baa74a4d133 --- /dev/null +++ b/htdocs/install/mysql/tables/llx_mailing_unsubscribe.key.sql @@ -0,0 +1,20 @@ +-- =================================================================== +-- Copyright (C) 2018 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 +-- 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 . +-- +-- =================================================================== + + +ALTER TABLE llx_mailing_unsubscribe ADD UNIQUE uk_mailing_unsubscribe(email, entity, unsubscribegroup); \ No newline at end of file diff --git a/htdocs/install/mysql/tables/llx_mailing_unsubscribe.sql b/htdocs/install/mysql/tables/llx_mailing_unsubscribe.sql new file mode 100644 index 00000000000..743e6ba1220 --- /dev/null +++ b/htdocs/install/mysql/tables/llx_mailing_unsubscribe.sql @@ -0,0 +1,30 @@ +-- ======================================================================== +-- Copyright (C) 2005 Rodolphe Quiedeville +-- Copyright (C) 2005-2012 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 . +-- +-- ======================================================================== + + +create table llx_mailing_unsubscribe +( + rowid integer AUTO_INCREMENT PRIMARY KEY, + entity integer DEFAULT 1 NOT NULL, -- multi company id + email varchar(255), + unsubscribegroup varchar(128) DEFAULT '', + ip varchar(128), + date_creat datetime, -- creation date + tms timestamp +)ENGINE=innodb; diff --git a/htdocs/install/mysql/tables/llx_reception.key.sql b/htdocs/install/mysql/tables/llx_reception.key.sql new file mode 100644 index 00000000000..a107c2a7d12 --- /dev/null +++ b/htdocs/install/mysql/tables/llx_reception.key.sql @@ -0,0 +1,31 @@ +-- =================================================================== +-- Copyright (C) 2005 Laurent Destailleur +-- Copyright (C) 2008-2010 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 . +-- +-- =================================================================== + + +ALTER TABLE llx_reception ADD UNIQUE INDEX idx_reception_uk_ref (ref, entity); + +ALTER TABLE llx_reception ADD INDEX idx_reception_fk_soc (fk_soc); +ALTER TABLE llx_reception ADD INDEX idx_reception_fk_user_author (fk_user_author); +ALTER TABLE llx_reception ADD INDEX idx_reception_fk_user_valid (fk_user_valid); +ALTER TABLE llx_reception ADD INDEX idx_reception_fk_shipping_method (fk_shipping_method); + +ALTER TABLE llx_reception ADD CONSTRAINT fk_reception_fk_soc FOREIGN KEY (fk_soc) REFERENCES llx_societe (rowid); +ALTER TABLE llx_reception ADD CONSTRAINT fk_reception_fk_user_author FOREIGN KEY (fk_user_author) REFERENCES llx_user (rowid); +ALTER TABLE llx_reception ADD CONSTRAINT fk_reception_fk_user_valid FOREIGN KEY (fk_user_valid) REFERENCES llx_user (rowid); +ALTER TABLE llx_reception ADD CONSTRAINT fk_reception_fk_shipping_method FOREIGN KEY (fk_shipping_method) REFERENCES llx_c_shipment_mode (rowid); diff --git a/htdocs/install/mysql/tables/llx_reception.sql b/htdocs/install/mysql/tables/llx_reception.sql new file mode 100644 index 00000000000..34565f7f29a --- /dev/null +++ b/htdocs/install/mysql/tables/llx_reception.sql @@ -0,0 +1,61 @@ +-- =================================================================== +-- Copyright (C) 2003-2010 Rodolphe Quiedeville +-- Copyright (C) 2008-2010 Regis Houssin +-- Copyright (C) 2011-2012 Laurent Destailleur +-- Copyright (C) 2012 Juanjo Menent +-- +-- 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 . +-- +-- =================================================================== + +create table llx_reception +( + rowid integer AUTO_INCREMENT PRIMARY KEY, + tms timestamp, + ref varchar(30) NOT NULL, + entity integer DEFAULT 1 NOT NULL, -- multi company id + fk_soc integer NOT NULL, + fk_projet integer DEFAULT NULL, + + ref_ext varchar(30), -- reference into an external system (not used by dolibarr) + ref_int varchar(30), -- reference into an internal system (used by dolibarr to store extern id like paypal info) + ref_supplier varchar(30), -- customer number + + date_creation datetime, -- date de creation + fk_user_author integer, -- author of creation + fk_user_modif integer, -- author of last change + date_valid datetime, -- date de validation + fk_user_valid integer, -- valideur + date_delivery datetime DEFAULT NULL, -- date planned of delivery + date_reception datetime, + fk_shipping_method integer, + tracking_number varchar(50), + fk_statut smallint DEFAULT 0, -- 0 = draft, 1 = validated, 2 = billed or closed depending on WORKFLOW_BILL_ON_SHIPMENT option + billed smallint DEFAULT 0, + + height float, -- height + width float, -- with + size_units integer, -- unit of all sizes (height, width, depth) + size float, -- depth + weight_units integer, -- unit of weight + weight float, -- weight + note_private text, + note_public text, + model_pdf varchar(255), + fk_incoterms integer, -- for incoterms + location_incoterms varchar(255), -- for incoterms + + import_key varchar(14), + extraparams varchar(255) -- for other parameters with json format +)ENGINE=innodb; diff --git a/htdocs/install/mysql/tables/llx_reception_extrafields.key.sql b/htdocs/install/mysql/tables/llx_reception_extrafields.key.sql new file mode 100644 index 00000000000..f3a35acd8a3 --- /dev/null +++ b/htdocs/install/mysql/tables/llx_reception_extrafields.key.sql @@ -0,0 +1,20 @@ +-- =================================================================== +-- Copyright (C) 2015 Claudio Aschieri +-- +-- 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 . +-- +-- =================================================================== + + +ALTER TABLE llx_reception_extrafields ADD INDEX idx_reception_extrafields (fk_object); diff --git a/htdocs/install/mysql/tables/llx_reception_extrafields.sql b/htdocs/install/mysql/tables/llx_reception_extrafields.sql new file mode 100644 index 00000000000..7a3126b2015 --- /dev/null +++ b/htdocs/install/mysql/tables/llx_reception_extrafields.sql @@ -0,0 +1,26 @@ +-- ======================================================================== +-- Copyright (C) 2015 Claudio Aschieri +-- +-- 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 . +-- +-- ======================================================================== + +create table llx_reception_extrafields +( + rowid integer AUTO_INCREMENT PRIMARY KEY, + tms timestamp, + fk_object integer NOT NULL, + import_key varchar(14) -- import key +) ENGINE=innodb; + diff --git a/htdocs/install/mysql/tables/llx_socpeople.sql b/htdocs/install/mysql/tables/llx_socpeople.sql index 94cf869543d..00456e3ece6 100644 --- a/htdocs/install/mysql/tables/llx_socpeople.sql +++ b/htdocs/install/mysql/tables/llx_socpeople.sql @@ -53,7 +53,7 @@ create table llx_socpeople whatsapp varchar(255), -- photo varchar(255), - no_email smallint NOT NULL DEFAULT 0, + no_email smallint NOT NULL DEFAULT 0, -- deprecated. Use table llx_mailing_unsubscribe instead priv smallint NOT NULL DEFAULT 0, fk_user_creat integer DEFAULT 0, -- user qui a creel'enregistrement fk_user_modif integer, diff --git a/htdocs/install/mysql/tables/llx_ticket_logs.key.sql b/htdocs/install/mysql/tables/llx_ticket_logs.key.sql deleted file mode 100755 index 16bf0d9d977..00000000000 --- a/htdocs/install/mysql/tables/llx_ticket_logs.key.sql +++ /dev/null @@ -1,17 +0,0 @@ --- SQL definition for module ticket --- Copyright (C) 2013 Jean-François FERRY --- --- 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 . - -ALTER TABLE llx_ticket_logs ADD CONSTRAINT fk_ticket_logs_fk_track_id FOREIGN KEY (fk_track_id) REFERENCES llx_ticket (track_id); diff --git a/htdocs/install/mysql/tables/llx_ticket_logs.sql b/htdocs/install/mysql/tables/llx_ticket_logs.sql deleted file mode 100755 index 6efbb779f40..00000000000 --- a/htdocs/install/mysql/tables/llx_ticket_logs.sql +++ /dev/null @@ -1,25 +0,0 @@ --- SQL definition for module ticket --- Copyright (C) 2013 Jean-François FERRY --- --- 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 . - -CREATE TABLE llx_ticket_logs -( - rowid integer AUTO_INCREMENT PRIMARY KEY, - entity integer DEFAULT 1, - fk_track_id varchar(128), - fk_user_create integer, - datec datetime, - message text -)ENGINE=innodb; diff --git a/htdocs/install/upgrade2.php b/htdocs/install/upgrade2.php index bbdc82b1b8b..6e3da609683 100644 --- a/htdocs/install/upgrade2.php +++ b/htdocs/install/upgrade2.php @@ -2922,9 +2922,9 @@ function migrate_project_task_actors($db,$langs,$conf) * @param Conf $conf Object conf * @param string $table Table name * @param int $fk_source Id of element source - * @param type $sourcetype Type of element source + * @param string $sourcetype Type of element source * @param int $fk_target Id of element target - * @param type $targettype Type of element target + * @param string $targettype Type of element target * @return void */ function migrate_relationship_tables($db,$langs,$conf,$table,$fk_source,$sourcetype,$fk_target,$targettype) @@ -4403,7 +4403,7 @@ function migrate_usergroup_rights_entity($db,$langs,$conf) * @param string $newname New name (relative to DOL_DATA_ROOT) * @return void */ -function migrate_rename_directories($db,$langs,$conf,$oldname,$newname) +function migrate_rename_directories($db, $langs, $conf, $oldname, $newname) { dolibarr_install_syslog("upgrade2::migrate_rename_directories"); @@ -4423,70 +4423,65 @@ function migrate_rename_directories($db,$langs,$conf,$oldname,$newname) * @param Conf $conf Object conf * @return void */ -function migrate_delete_old_files($db,$langs,$conf) +function migrate_delete_old_files($db, $langs, $conf) { - $result=true; + $result = true; - dolibarr_install_syslog("upgrade2::migrate_delete_old_files"); + dolibarr_install_syslog("upgrade2::migrate_delete_old_files"); - // List of files to delete - $filetodeletearray=array( - DOL_DOCUMENT_ROOT.'/core/triggers/interface_demo.class.php', - DOL_DOCUMENT_ROOT.'/core/menus/barre_left/default.php', - DOL_DOCUMENT_ROOT.'/core/menus/barre_top/default.php', - DOL_DOCUMENT_ROOT.'/core/modules/modComptabiliteExpert.class.php', - DOL_DOCUMENT_ROOT.'/core/modules/modCommercial.class.php', - DOL_DOCUMENT_ROOT.'/core/modules/modProduit.class.php', - DOL_DOCUMENT_ROOT.'/core/modules/modSkype.class.php', - DOL_DOCUMENT_ROOT.'/phenix/inc/triggers/interface_modPhenix_Phenixsynchro.class.php', - DOL_DOCUMENT_ROOT.'/webcalendar/inc/triggers/interface_modWebcalendar_webcalsynchro.class.php', - DOL_DOCUMENT_ROOT.'/core/triggers/interface_modWebcalendar_Webcalsynchro.class.php', - DOL_DOCUMENT_ROOT.'/core/triggers/interface_modCommande_Ecotax.class.php', - DOL_DOCUMENT_ROOT.'/core/triggers/interface_modCommande_fraisport.class.php', - DOL_DOCUMENT_ROOT.'/core/triggers/interface_modPropale_PropalWorkflow.class.php', - DOL_DOCUMENT_ROOT.'/core/menus/smartphone/iphone.lib.php', - DOL_DOCUMENT_ROOT.'/core/menus/smartphone/iphone_backoffice.php', - DOL_DOCUMENT_ROOT.'/core/menus/smartphone/iphone_frontoffice.php', - DOL_DOCUMENT_ROOT.'/core/menus/standard/auguria_backoffice.php', - DOL_DOCUMENT_ROOT.'/core/menus/standard/auguria_frontoffice.php', - DOL_DOCUMENT_ROOT.'/core/menus/standard/eldy_backoffice.php', - DOL_DOCUMENT_ROOT.'/core/menus/standard/eldy_frontoffice.php', - DOL_DOCUMENT_ROOT.'/core/modules/mailings/contacts2.modules.php', - DOL_DOCUMENT_ROOT.'/core/modules/mailings/contacts3.modules.php', - DOL_DOCUMENT_ROOT.'/core/modules/mailings/contacts4.modules.php', - DOL_DOCUMENT_ROOT.'/core/modules/mailings/framboise.modules.php', - DOL_DOCUMENT_ROOT.'/core/modules/mailings/dolibarr_services_expired.modules.php', - DOL_DOCUMENT_ROOT.'/core/modules/mailings/peche.modules.php', - DOL_DOCUMENT_ROOT.'/core/modules/mailings/poire.modules.php', - DOL_DOCUMENT_ROOT.'/core/modules/mailings/kiwi.modules.php', - DOL_DOCUMENT_ROOT.'/core/modules/facture/pdf_crabe.modules.php', - DOL_DOCUMENT_ROOT.'/core/modules/facture/pdf_oursin.modules.php', + // List of files to delete + $filetodeletearray = array( + '/core/triggers/interface_demo.class.php', + '/core/menus/barre_left/default.php', + '/core/menus/barre_top/default.php', + '/core/modules/modComptabiliteExpert.class.php', + '/core/modules/modCommercial.class.php', + '/core/modules/modProduit.class.php', + '/core/modules/modSkype.class.php', + '/phenix/inc/triggers/interface_modPhenix_Phenixsynchro.class.php', + '/webcalendar/inc/triggers/interface_modWebcalendar_webcalsynchro.class.php', + '/core/triggers/interface_modWebcalendar_Webcalsynchro.class.php', + '/core/triggers/interface_modCommande_Ecotax.class.php', + '/core/triggers/interface_modCommande_fraisport.class.php', + '/core/triggers/interface_modPropale_PropalWorkflow.class.php', + '/core/menus/smartphone/iphone.lib.php', + '/core/menus/smartphone/iphone_backoffice.php', + '/core/menus/smartphone/iphone_frontoffice.php', + '/core/menus/standard/auguria_backoffice.php', + '/core/menus/standard/auguria_frontoffice.php', + '/core/menus/standard/eldy_backoffice.php', + '/core/menus/standard/eldy_frontoffice.php', + '/core/modules/mailings/contacts2.modules.php', + '/core/modules/mailings/contacts3.modules.php', + '/core/modules/mailings/contacts4.modules.php', + '/core/modules/mailings/framboise.modules.php', + '/core/modules/mailings/dolibarr_services_expired.modules.php', + '/core/modules/mailings/peche.modules.php', + '/core/modules/mailings/poire.modules.php', + '/core/modules/mailings/kiwi.modules.php', + '/core/modules/facture/pdf_crabe.modules.php', + '/core/modules/facture/pdf_oursin.modules.php', - DOL_DOCUMENT_ROOT.'/compta/facture/class/api_invoice.class.php', - DOL_DOCUMENT_ROOT.'/commande/class/api_commande.class.php', - DOL_DOCUMENT_ROOT.'/user/class/api_user.class.php', - DOL_DOCUMENT_ROOT.'/product/class/api_product.class.php', - DOL_DOCUMENT_ROOT.'/societe/class/api_contact.class.php', - DOL_DOCUMENT_ROOT.'/societe/class/api_thirdparty.class.php', - DOL_DOCUMENT_ROOT.'/support/online.php' + '/compta/facture/class/api_invoice.class.php', + '/commande/class/api_commande.class.php', + '/user/class/api_user.class.php', + '/product/class/api_product.class.php', + '/societe/class/api_contact.class.php', + '/societe/class/api_thirdparty.class.php', + '/support/online.php', ); - foreach ($filetodeletearray as $filetodelete) - { - //print ''.$filetodelete."
\n"; - $result=1; - if (file_exists($filetodelete)) - { - $result=dol_delete_file($filetodelete,0,0,0,null,true); - if (! $result) - { + foreach ($filetodeletearray as $filetodelete) { + //print ''DOL_DOCUMENT_ROOT.$filetodelete."
\n"; + $result = 1; + if (file_exists(DOL_DOCUMENT_ROOT.$filetodelete)) { + $result = dol_delete_file(DOL_DOCUMENT_ROOT.$filetodelete, 0, 0, 0, null, true, false); + if (! $result) { $langs->load("errors"); - print '
'.$langs->trans("Error").': '.$langs->trans("ErrorFailToDeleteFile",$filetodelete); + print '
'.$langs->trans("Error").': '.$langs->trans("ErrorFailToDeleteFile", DOL_DOCUMENT_ROOT . $filetodelete); print ' '.$langs->trans("RemoveItManuallyAndPressF5ToContinue").'
'; - } - else - { - //print $langs->trans("FileWasRemoved",$filetodelete); + } else { + //print $langs->trans("FileWasRemoved", $filetodelete).'
'; } } } @@ -4501,27 +4496,24 @@ function migrate_delete_old_files($db,$langs,$conf) * @param Conf $conf Object conf * @return void */ -function migrate_delete_old_dir($db,$langs,$conf) +function migrate_delete_old_dir($db, $langs, $conf) { - $result=true; + $result = true; dolibarr_install_syslog("upgrade2::migrate_delete_old_dir"); // List of files to delete $filetodeletearray=array( - DOL_DOCUMENT_ROOT.'/core/modules/facture/terre', - DOL_DOCUMENT_ROOT.'/core/modules/facture/mercure' + DOL_DOCUMENT_ROOT.'/core/modules/facture/terre', + DOL_DOCUMENT_ROOT.'/core/modules/facture/mercure', ); - foreach ($filetodeletearray as $filetodelete) - { + foreach ($filetodeletearray as $filetodelete) { //print ''.$filetodelete."
\n"; - if (file_exists($filetodelete)) - { - $result=dol_delete_dir_recursive($filetodelete); + if (file_exists($filetodelete)) { + $result = dol_delete_dir_recursive($filetodelete); } - if (! $result) - { + if (! $result) { $langs->load("errors"); print '
'.$langs->trans("Error").': '.$langs->trans("ErrorFailToDeleteDir",$filetodelete); print ' '.$langs->trans("RemoveItManuallyAndPressF5ToContinue").'
'; @@ -4833,7 +4825,7 @@ function migrate_reload_menu($db,$langs,$conf,$versionto) */ function migrate_user_photospath() { - global $conf, $db, $langs; + global $conf, $db, $langs, $user; print '
'; + // insurance amount + print ''; + // Project if (! empty($conf->projet->enabled)) { @@ -495,6 +499,18 @@ if ($id > 0) { print ''; } + + // Insurance + if ($action == 'edit') + { + print ''; + print ''; + } + else + { + print ''; + } // Date start print '"; @@ -771,7 +787,7 @@ if ($id > 0) // Edit if ($object->paid == 0 && $user->rights->loan->write) { - print ''.$langs->trans('CreateCalcSchedule').''; + // print ''.$langs->trans('CreateCalcSchedule').''; print ''.$langs->trans("Modify").''; } @@ -779,7 +795,7 @@ if ($id > 0) // Emit payment if ($object->paid == 0 && ((price2num($object->capital) > 0 && round($staytopay) < 0) || (price2num($object->capital) > 0 && round($staytopay) > 0)) && $user->rights->loan->write) { - print ''.$langs->trans("DoPayment").''; + print ''.$langs->trans("DoPayment").''; } // Classify 'paid' diff --git a/htdocs/loan/class/loan.class.php b/htdocs/loan/class/loan.class.php index 0e4542b1d20..3805704fbb9 100644 --- a/htdocs/loan/class/loan.class.php +++ b/htdocs/loan/class/loan.class.php @@ -66,6 +66,8 @@ class Loan extends CommonObject public $date_creation; public $date_modification; public $date_validation; + + public $insurance_amount; /** * @var int Bank ID @@ -106,7 +108,7 @@ class Loan extends CommonObject */ function fetch($id) { - $sql = "SELECT l.rowid, l.label, l.capital, l.datestart, l.dateend, l.nbterm, l.rate, l.note_private, l.note_public,"; + $sql = "SELECT l.rowid, l.label, l.capital, l.datestart, l.dateend, l.nbterm, l.rate, l.note_private, l.note_public, l.insurance_amount,"; $sql.= " l.paid, l.accountancy_account_capital, l.accountancy_account_insurance, l.accountancy_account_interest, l.fk_projet as fk_project"; $sql.= " FROM ".MAIN_DB_PREFIX."loan as l"; $sql.= " WHERE l.rowid = ".$id; @@ -129,6 +131,7 @@ class Loan extends CommonObject $this->rate = $obj->rate; $this->note_private = $obj->note_private; $this->note_public = $obj->note_public; + $this->insurance_amount = $obj->insurance_amount; $this->paid = $obj->paid; $this->account_capital = $obj->accountancy_account_capital; @@ -169,6 +172,8 @@ class Loan extends CommonObject // clean parameters $newcapital=price2num($this->capital,'MT'); + if (empty($this->insurance_amount)) $this->insurance_amount = 0; + $newinsuranceamount=price2num($this->insurance_amount, 'MT'); if (isset($this->note_private)) $this->note_private = trim($this->note_private); if (isset($this->note_public)) $this->note_public = trim($this->note_public); if (isset($this->account_capital)) $this->account_capital = trim($this->account_capital); @@ -205,7 +210,7 @@ class Loan extends CommonObject $sql = "INSERT INTO ".MAIN_DB_PREFIX."loan (label, fk_bank, capital, datestart, dateend, nbterm, rate, note_private, note_public,"; $sql.= " accountancy_account_capital, accountancy_account_insurance, accountancy_account_interest, entity,"; - $sql.= " datec, fk_projet, fk_user_author)"; + $sql.= " datec, fk_projet, fk_user_author, insurance_amount)"; $sql.= " VALUES ('".$this->db->escape($this->label)."',"; $sql.= " '".$this->db->escape($this->fk_bank)."',"; $sql.= " '".price2num($newcapital)."',"; @@ -221,7 +226,8 @@ class Loan extends CommonObject $sql.= " ".$conf->entity.","; $sql.= " '".$this->db->idate($now)."',"; $sql.= " ".(empty($this->fk_project)?'NULL':$this->fk_project).","; - $sql.= " ".$user->id; + $sql.= " ".$user->id.","; + $sql.= " '".price2num($newinsuranceamount)."'"; $sql.= ")"; dol_syslog(get_class($this)."::create", LOG_DEBUG); @@ -339,7 +345,8 @@ class Loan extends CommonObject $sql.= " accountancy_account_insurance = '".$this->db->escape($this->account_insurance)."',"; $sql.= " accountancy_account_interest = '".$this->db->escape($this->account_interest)."',"; $sql.= " fk_projet=".(empty($this->fk_project)?'NULL':$this->fk_project).","; - $sql.= " fk_user_modif = ".$user->id; + $sql.= " fk_user_modif = ".$user->id.","; + $sql.= " insurance_amount = '".price2num($this->db->escape($this->insurance_amount))."'"; $sql.= " WHERE rowid=".$this->id; dol_syslog(get_class($this)."::update", LOG_DEBUG); @@ -549,7 +556,6 @@ class Loan extends CommonObject { $sql = 'SELECT l.rowid, l.datec, l.fk_user_author, l.fk_user_modif,'; $sql.= ' l.tms'; - $sql.= ' FROM '.MAIN_DB_PREFIX.'loan as l'; $sql.= ' WHERE l.rowid = '.$id; dol_syslog(get_class($this).'::info', LOG_DEBUG); diff --git a/htdocs/loan/class/paymentloan.class.php b/htdocs/loan/class/paymentloan.class.php index cb1ec021dda..b9cbe0d6b58 100644 --- a/htdocs/loan/class/paymentloan.class.php +++ b/htdocs/loan/class/paymentloan.class.php @@ -529,6 +529,7 @@ class PaymentLoan extends CommonObject $result = $this->db->query($sql); if ($result) { + $this->fk_bank = $id_bank; return 1; } else diff --git a/htdocs/loan/createschedule.php b/htdocs/loan/createschedule.php index 7cfd54ab998..7a68d3e38a8 100644 --- a/htdocs/loan/createschedule.php +++ b/htdocs/loan/createschedule.php @@ -35,7 +35,7 @@ $object = new Loan($db); $object->fetch($loanid); // Load translation files required by the page -$langs->loadLangs(array("loan")); +$langs->loadLangs(array("compta","bills","loan")); if ($action == 'createecheancier') { @@ -45,6 +45,7 @@ if ($action == 'createecheancier') { $date = GETPOST('hi_date'.$i,'int'); $mens = GETPOST('mens'.$i); $int = GETPOST('hi_interets'.$i); + $insurance = GETPOST('hi_insurance'.$i); $echeance = new LoanSchedule($db); @@ -53,10 +54,10 @@ if ($action == 'createecheancier') { $echeance->tms = dol_now(); $echeance->datep = $date; $echeance->amount_capital = $mens-$int; - $echeance->amount_insurance = 0; + $echeance->amount_insurance = $insurance; $echeance->amount_interest = $int; $echeance->fk_typepayment = 3; - $echeance->fk_bank = 1; + $echeance->fk_bank = 0; $echeance->fk_user_creat = $user->id; $echeance->fk_user_modif = $user->id; $result=$echeance->create($user); @@ -75,11 +76,13 @@ if ($action == 'updateecheancier') { $mens = GETPOST('mens'.$i); $int = GETPOST('hi_interets'.$i); $id = GETPOST('hi_rowid'.$i); + $insurance = GETPOST('hi_insurance'.$i); + $echeance = new LoanSchedule($db); $echeance->fetch($id); $echeance->tms = dol_now(); $echeance->amount_capital = $mens-$int; - $echeance->amount_insurance = 0; + $echeance->amount_insurance = $insurance; $echeance->amount_interest = $int; $echeance->fk_user_modif = $user->id; $result= $echeance->update($user,0); @@ -143,26 +146,33 @@ if(count($echeance->lines)>0) } print '
'. fieldLabel('Name','name',1).'
'. $form->editfieldkey('Name', 'name', '', $object, 0, 'string', '', 1).'
'.fieldLabel('Address','address',0).''.$form->editfieldkey('Address', 'address', '', $object, 0).''; print ''; print '
'.fieldLabel('Zip','zipcode',0).''.$form->editfieldkey('Zip', 'zipcode', '', $object, 0).''; - print $formcompany->select_ziptown(GETPOST('zipcode', 'alpha'), 'zipcode', array ( + print $formcompany->select_ziptown( + GETPOST('zipcode', 'alpha'), + 'zipcode', + array ( 'town', 'selectcountry_id' - ), 6); + ), + 6 + ); print '
'.fieldLabel('Town','town',0).''.$form->editfieldkey('Town', 'town', '', $object, 0).''; print $formcompany->select_ziptown(GETPOST('town', 'alpha'), 'town', array ( 'zipcode', @@ -219,7 +227,7 @@ if ($action == 'create') // Country print '
'.fieldLabel('Country','selectcountry_id',0).''.$form->editfieldkey('Country', 'selectcountry_id', '', $object, 0).''; print $form->select_country(GETPOST('country_id','int')>0?GETPOST('country_id','int'):$mysoc->country_id,'country_id'); if ($user->admin) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1); @@ -228,7 +236,7 @@ if ($action == 'create') // Status print '
'.fieldLabel('Status','status',1).''.$form->editfieldkey('Status', 'status', '', $object, 0, 'string', '', 1).''; print $form->selectarray('status',$status2label,GETPOST('status','alpha')); print '
'.fieldLabel('Name','name',1).''; + print '
'.$form->editfieldkey('Name', 'name', '', $object, 0, 'string', '', 1).''; print ''; print '
'.fieldLabel('Address','address',0).'
'.$form->editfieldkey('Address', 'address', '', $object, 0).''; print ''; print '
'.fieldLabel('Zip','zipcode',0).''; + print '
'.$form->editfieldkey('Zip', 'zipcode', '', $object, 0).''; print $formcompany->select_ziptown($object->zip, 'zipcode', array ( 'town', 'selectcountry_id' ), 6) . '
'.fieldLabel('Town','town',0).''; + print '
'.$form->editfieldkey('Town', 'town', '', $object, 0).''; print $formcompany->select_ziptown($object->town, 'town', array ( 'zipcode', 'selectcountry_id' )) . '
'.fieldLabel('Country','selectcountry_id',0).'
'.$form->editfieldkey('Country', 'selectcountry_id', '', $object, 0).''; print $form->select_country($object->fk_country,'country_id'); if ($user->admin) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1); @@ -303,7 +311,7 @@ if (($id || $ref) && $action == 'edit') print '
'.fieldLabel('Status','status',1).''; + print '
'.$form->editfieldkey('Status', 'status', '', $object, 0, 'string', '', 1).''; print $form->selectarray('status',$status2label,$object->status); print '
'; @@ -4842,14 +4834,14 @@ function migrate_user_photospath() include_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php'; $fuser = new User($db); + if (! is_object($user)) $user = $fuser; // To avoid error during migration + $sql = "SELECT rowid as uid from ".MAIN_DB_PREFIX."user"; // Get list of all users $resql = $db->query($sql); if ($resql) { while ($obj = $db->fetch_object($resql)) { - print '.'; - $fuser->fetch($obj->uid); //echo '
'.$fuser->id.' -> '.$fuser->entity; $entity = (empty($fuser->entity) ? 1 : $fuser->entity); @@ -4858,47 +4850,61 @@ function migrate_user_photospath() } else { $dir = $conf->user->multidir_output[$entity]; // $conf->user->multidir_output[] for each entity is construct by the multicompany module } + if ($dir) { - $origin = $dir .'/'. get_exdir($fuser->id,2,0,0,$fuser,'user'); - $destin = $dir .'/'. $fuser->id; + //print "Process user id ".$fuser->id."
\n"; + $origin = $dir .'/'. get_exdir($fuser->id,2,0,1,$fuser,'user'); // Use old behaviour to get x/y path + $destin = $dir .'/'. $fuser->id; - $error = 0; + $origin_osencoded=dol_osencode($origin); - $origin_osencoded=dol_osencode($origin); - $destin_osencoded=dol_osencode($destin); - dol_mkdir($destin); - //echo '
'.$origin.' -> '.$destin; - if (dol_is_dir($origin)) - { - $handle=opendir($origin_osencoded); - if (is_resource($handle)) - { - while (($file = readdir($handle)) !== false) - { - if ($file != '.' && $file != '..' && is_dir($origin_osencoded.'/'.$file)) - { - $thumbs = opendir($origin_osencoded.'/'.$file); - if (is_resource($thumbs)) - { - dol_mkdir($destin.'/'.$file); - while (($thumb = readdir($thumbs)) !== false) - { - dol_move($origin.'/'.$file.'/'.$thumb, $destin.'/'.$file.'/'.$thumb); - } - // dol_delete_dir($origin.'/'.$file); - } - } - else - { - if (dol_is_file($origin.'/'.$file) ) - { - dol_move($origin.'/'.$file, $destin.'/'.$file); - } - } - } - } - } + dol_mkdir($destin); + + //echo '
'.$origin.' -> '.$destin; + if (dol_is_dir($origin)) + { + $handle=opendir($origin_osencoded); + if (is_resource($handle)) + { + while (($file = readdir($handle)) !== false) + { + if ($file == '.' || $file == '..') continue; + + if (dol_is_dir($origin.'/'.$file)) // it is a dir (like 'thumbs') + { + $thumbs = opendir($origin_osencoded.'/'.$file); + if (is_resource($thumbs)) + { + dol_mkdir($destin.'/'.$file); + while (($thumb = readdir($thumbs)) !== false) + { + if (! dol_is_file($destin.'/'.$file.'/'.$thumb)) + { + if ($thumb == '.' || $thumb == '..') continue; + + //print $origin.'/'.$file.'/'.$thumb.' -> '.$destin.'/'.$file.'/'.$thumb.'
'."\n"; + print '.'; + dol_copy($origin.'/'.$file.'/'.$thumb, $destin.'/'.$file.'/'.$thumb, 0, 0); + //var_dump('aaa');exit; + } + } + // dol_delete_dir($origin.'/'.$file); + } + } + else // it is a file + { + if (! dol_is_file($destin.'/'.$file)) + { + //print $origin.'/'.$file.' -> '.$destin.'/'.$file.'
'."\n"; + print '.'; + dol_copy($origin.'/'.$file, $destin.'/'.$file, 0, 0); + //var_dump('eee');exit; + } + } + } + } + } } } } diff --git a/htdocs/langs/ar_SA/other.lang b/htdocs/langs/ar_SA/other.lang index 55a27196753..f3338b68cdd 100644 --- a/htdocs/langs/ar_SA/other.lang +++ b/htdocs/langs/ar_SA/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/ar_SA/projects.lang b/htdocs/langs/ar_SA/projects.lang index 9dcfcae03a3..af686c9ff23 100644 --- a/htdocs/langs/ar_SA/projects.lang +++ b/htdocs/langs/ar_SA/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=ربط طرف ثالث آخر TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=الوقت الذي يقضيه فارغة ThisWillAlsoRemoveTasks=وهذا العمل أيضا حذف كافة مهام المشروع (%s المهام في الوقت الحاضر) وجميع المدخلات من الوقت الذي تستغرقه. -IfNeedToUseOhterObjectKeepEmpty=إذا كانت بعض الكائنات (فاتورة، والنظام، ...)، الذين ينتمون إلى طرف ثالث آخر، يجب أن تكون مرتبطة بمشروع لإنشاء، والحفاظ على هذا فارغة لديها مشروع كونها متعددة الأطراف الثالثة. +IfNeedToUseOtherObjectKeepEmpty=إذا كانت بعض الكائنات (فاتورة، والنظام، ...)، الذين ينتمون إلى طرف ثالث آخر، يجب أن تكون مرتبطة بمشروع لإنشاء، والحفاظ على هذا فارغة لديها مشروع كونها متعددة الأطراف الثالثة. CloneProject=استنساخ المشروع CloneTasks=استنساخ المهام CloneContacts=الاتصالات استنساخ diff --git a/htdocs/langs/bg_BG/other.lang b/htdocs/langs/bg_BG/other.lang index 6558f3277a6..a49e2bdc2dc 100644 --- a/htdocs/langs/bg_BG/other.lang +++ b/htdocs/langs/bg_BG/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/bn_BD/other.lang b/htdocs/langs/bn_BD/other.lang index ec0315b94cd..021bfe65985 100644 --- a/htdocs/langs/bn_BD/other.lang +++ b/htdocs/langs/bn_BD/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/bn_BD/projects.lang b/htdocs/langs/bn_BD/projects.lang index aadd8b446df..d895f477bd4 100644 --- a/htdocs/langs/bn_BD/projects.lang +++ b/htdocs/langs/bn_BD/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Linked to other third party TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Time spent is empty ThisWillAlsoRemoveTasks=This action will also delete all tasks of project (%s tasks at the moment) and all inputs of time spent. -IfNeedToUseOhterObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. +IfNeedToUseOtherObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. CloneProject=Clone project CloneTasks=Clone tasks CloneContacts=Clone contacts diff --git a/htdocs/langs/bs_BA/other.lang b/htdocs/langs/bs_BA/other.lang index 329e6b0ab2c..f8f63550fb2 100644 --- a/htdocs/langs/bs_BA/other.lang +++ b/htdocs/langs/bs_BA/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/bs_BA/projects.lang b/htdocs/langs/bs_BA/projects.lang index b3d99096625..214986151d9 100644 --- a/htdocs/langs/bs_BA/projects.lang +++ b/htdocs/langs/bs_BA/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=U vezi sa drugim subjektom TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Vrijeme provedeno je prazno ThisWillAlsoRemoveTasks=Ova akcija će također izbrisati sve zadatke projekta (%s zadataka u ovom trenutku) i sve unose provedenog vremena. -IfNeedToUseOhterObjectKeepEmpty=Ako neki objekti (faktura, narudžbe, ...), pripadaju drugom subjektu, mora biti u vezi sa projektom za kreiranje, ostavite ovo prazno da bi imali projekat što više subjekata. +IfNeedToUseOtherObjectKeepEmpty=Ako neki objekti (faktura, narudžbe, ...), pripadaju drugom subjektu, mora biti u vezi sa projektom za kreiranje, ostavite ovo prazno da bi imali projekat što više subjekata. CloneProject=Kloniraj projekat CloneTasks=Kloniraj zadatke CloneContacts=Kloniraj kontakte diff --git a/htdocs/langs/ca_ES/other.lang b/htdocs/langs/ca_ES/other.lang index 5b044952637..2a9b21a0672 100644 --- a/htdocs/langs/ca_ES/other.lang +++ b/htdocs/langs/ca_ES/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__ (Sincerely) __\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__ (Sincerely) __\n\n__USER_SIGNATURE__ PredefinedMailContentLink=Podeu fer clic a l'enllaç següent per fer el pagament si encara no està fet.\n\n%s\n\n DemoDesc=Dolibarr és un ERP/CRM per a la gestió de negocis (professionals o associacions), compost de mòduls funcionals independents i opcionals. Una demostració que incloga tots aquests mòduls no té sentit perquè no utilitzarà tots els mòduls al mateix temps. Per això, hi han disponibles diferents tipus de perfils de demostració. diff --git a/htdocs/langs/ca_ES/projects.lang b/htdocs/langs/ca_ES/projects.lang index ca92a5f125b..17a60031ef1 100644 --- a/htdocs/langs/ca_ES/projects.lang +++ b/htdocs/langs/ca_ES/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Enllaçat a una altra empresa TaskIsNotAssignedToUser=Tasca no assignada a l'usuari. Utilitza el botó '%s' per assignar una tasca ara. ErrorTimeSpentIsEmpty=El temps dedicat està buit ThisWillAlsoRemoveTasks=Aquesta operació també destruirà les tasques del projecte (%s tasques en aquest moment) i tots els seus temps dedicats. -IfNeedToUseOhterObjectKeepEmpty=Si els elements (factura, comanda, ...) pertanyen a un tercer que no és el seleccionat, havent aquests estar lligats al projecte a crear, deixeu buit per permetre el projecte a multi-tercers. +IfNeedToUseOtherObjectKeepEmpty=Si els elements (factura, comanda, ...) pertanyen a un tercer que no és el seleccionat, havent aquests estar lligats al projecte a crear, deixeu buit per permetre el projecte a multi-tercers. CloneProject=Clonar el projecte CloneTasks=Clonar les tasques CloneContacts=Clonar els contactes diff --git a/htdocs/langs/cs_CZ/other.lang b/htdocs/langs/cs_CZ/other.lang index e2c32ee9e0f..fad89925f19 100644 --- a/htdocs/langs/cs_CZ/other.lang +++ b/htdocs/langs/cs_CZ/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr je kompaktní ERP/CRM systém, který se skládá z více funkčních modulů. Demo, které obsahuje všechny moduly vám nepředstaví všechny možnosti, protože v reálné situaci všechny moduly najednou používat nebudete. Pro lepší a snadnější seznámení s celým systémem máte k dispozici několik demo profilů lépe vystihujících vaše požadavky. diff --git a/htdocs/langs/cs_CZ/projects.lang b/htdocs/langs/cs_CZ/projects.lang index a4af7858917..a3f37512d6e 100644 --- a/htdocs/langs/cs_CZ/projects.lang +++ b/htdocs/langs/cs_CZ/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Připojené k jiné třetí straně TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Čas strávený je prázdný ThisWillAlsoRemoveTasks=Tato akce rovněž odstraní všechny úkoly projektu (%s úkolů v tuto chvíli) a všechny strávené časy vstupující do projektu. -IfNeedToUseOhterObjectKeepEmpty=Pokud je k projektu třeba připojit některé objekty jiných třetích stran (faktury, objednávky, ...), ponechte toto prázdné (projekt bude moci obsahovat více třetích stran) +IfNeedToUseOtherObjectKeepEmpty=Pokud je k projektu třeba připojit některé objekty jiných třetích stran (faktury, objednávky, ...), ponechte toto prázdné (projekt bude moci obsahovat více třetích stran) CloneProject=Duplikovat projekt CloneTasks=Duplikovat úkoly CloneContacts=Duplikovat kontakty diff --git a/htdocs/langs/da_DK/other.lang b/htdocs/langs/da_DK/other.lang index a1753ae741a..e6c9d78ccd5 100644 --- a/htdocs/langs/da_DK/other.lang +++ b/htdocs/langs/da_DK/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hej)__\n\nVenligst find vedlagte fak PredefinedMailContentSendShipping=__(Hej)__\n\nSe venligst vedhæftet fragt __REF__\n\n\n__ (Sincerely) __\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hej)__\n\nVenligst find vedhæftet intervention __REF__\n\n\n__ (Sincerely) __\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hej)__\n\n\n__ (Sincerely) __\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hej)__\n\n\n__ (Sincerely) __\n\n__USER_SIGNATURE__ PredefinedMailContentLink=Du kan klikke på linket herunder for at foretage din betaling, hvis den ikke allerede er færdig.\n\n%s\n\n DemoDesc=Dolibarr er en kompakt ERP / CRM, der understøtter flere forretningsmoduler. En demo, der viser alle moduler, giver ingen mening, da dette scenario aldrig forekommer (flere hundrede tilgængelige). Så flere demo profiler er tilgængelige. diff --git a/htdocs/langs/da_DK/projects.lang b/htdocs/langs/da_DK/projects.lang index e703d7719c4..2d25aecbcc7 100644 --- a/htdocs/langs/da_DK/projects.lang +++ b/htdocs/langs/da_DK/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Knyttet til tredjemand TaskIsNotAssignedToUser=Opgave ikke tildelt brugeren. Brug knappen ' %s ' for at tildele opgaven nu. ErrorTimeSpentIsEmpty=Tilbragte Tiden er tom ThisWillAlsoRemoveTasks=Denne handling vil også slette alle opgaver i projektet (%s opgaver i øjeblikket), og alle indgange af tid. -IfNeedToUseOhterObjectKeepEmpty=Hvis nogle objekter (faktura, ordre, ...), der tilhører en anden tredjepart, skal knyttet til projektet for at skabe, holde denne tomme for at få projektet er flere tredjeparter. +IfNeedToUseOtherObjectKeepEmpty=Hvis nogle objekter (faktura, ordre, ...), der tilhører en anden tredjepart, skal knyttet til projektet for at skabe, holde denne tomme for at få projektet er flere tredjeparter. CloneProject=Klonprojekt CloneTasks=Klonopgaver CloneContacts=Klon kontakter diff --git a/htdocs/langs/de_DE/other.lang b/htdocs/langs/de_DE/other.lang index a1cfc329ecd..d4cfa4feab6 100644 --- a/htdocs/langs/de_DE/other.lang +++ b/htdocs/langs/de_DE/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=Sie können den folgenden Link anklicken um die Zahlung auszuführen, falls sie noch nicht getätigt wurde.\n\n%s\n\n DemoDesc=Dolibarr ist eine Management-Software die mehrere Business-Module anbietet. Eine Demo, die alle Module beinhaltet ist nicht sinnvoll , weil der Fall nie existiert (Hunderte von verfügbaren Module). Es stehen auch einige Demo-Profile Typen zur Verfügung. diff --git a/htdocs/langs/de_DE/projects.lang b/htdocs/langs/de_DE/projects.lang index 0fd5978082b..9143f765c89 100644 --- a/htdocs/langs/de_DE/projects.lang +++ b/htdocs/langs/de_DE/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Mit Partner verknüpft TaskIsNotAssignedToUser=Aufgabe ist keinem Benutzer zugeteilt. Verwenden Sie den Knopf '%s' um die Aufgabe jetzt zuzuweisen. ErrorTimeSpentIsEmpty=Zeitaufwand ist leer ThisWillAlsoRemoveTasks=Diese Aktion löscht ebenfalls alle Aufgaben zum Projekt (%s aktuelle Aufgaben) und alle Zeitaufwände. -IfNeedToUseOhterObjectKeepEmpty=Wenn einige Zuordnungen (Rechnung, Bestellung, ...), einem Dritten gehören, müssen Sie erst alle mit dem Projekt verbinden, damit das Projekt auch Dritten zugänglich ist . +IfNeedToUseOtherObjectKeepEmpty=Wenn einige Zuordnungen (Rechnung, Bestellung, ...), einem Dritten gehören, müssen Sie erst alle mit dem Projekt verbinden, damit das Projekt auch Dritten zugänglich ist . CloneProject=Dupliziere Projekt CloneTasks=Dupliziere Aufgaben CloneContacts=Dupliziere Kontakte diff --git a/htdocs/langs/el_GR/projects.lang b/htdocs/langs/el_GR/projects.lang index 1c73ca5d1a8..5347965bff4 100644 --- a/htdocs/langs/el_GR/projects.lang +++ b/htdocs/langs/el_GR/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Συνδέεται με άλλο τρίτο μέρος TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Χρόνος που δαπανάται είναι άδειο ThisWillAlsoRemoveTasks=Αυτή η ενέργεια θα διαγράψει επίσης όλα τα καθήκοντα του έργου (%s καθηκόντων προς το παρόν) και όλες οι είσοδοι του χρόνου. -IfNeedToUseOhterObjectKeepEmpty=Εάν ορισμένα αντικείμενα (τιμολόγιο, προκειμένου, ...), που ανήκουν σε άλλο τρίτο μέρος, πρέπει να συνδέεται με το έργο να δημιουργήσει, διατηρήσει αυτό το κενό να έχει το έργο να είναι πολλαπλών τρίτους. +IfNeedToUseOtherObjectKeepEmpty=Εάν ορισμένα αντικείμενα (τιμολόγιο, προκειμένου, ...), που ανήκουν σε άλλο τρίτο μέρος, πρέπει να συνδέεται με το έργο να δημιουργήσει, διατηρήσει αυτό το κενό να έχει το έργο να είναι πολλαπλών τρίτους. CloneProject=Clone project CloneTasks=Clone tasks CloneContacts=Clone contacts diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang index e2f6083e6a6..6986f549759 100644 --- a/htdocs/langs/en_US/accountancy.lang +++ b/htdocs/langs/en_US/accountancy.lang @@ -30,7 +30,7 @@ OverviewOfAmountOfLinesNotBound=Overview of amount of lines not bound to an acco OverviewOfAmountOfLinesBound=Overview of amount of lines already bound to an accounting account OtherInfo=Other information DeleteCptCategory=Remove accounting account from group -ConfirmDeleteCptCategory=Are you sure you want to remove this accounting account from the accounting account group ? +ConfirmDeleteCptCategory=Are you sure you want to remove this accounting account from the accounting account group? JournalizationInLedgerStatus=Status of journalization AlreadyInGeneralLedger=Already journalized in ledgers NotYetInGeneralLedger=Not yet journalized in ledgers @@ -104,7 +104,7 @@ WriteBookKeeping=Journalize transactions in Ledger Bookkeeping=Ledger AccountBalance=Account balance ObjectsRef=Source object ref -CAHTF=Total purchase supplier before tax +CAHTF=Total purchase vendor before tax TotalExpenseReport=Total expense report InvoiceLines=Lines of invoices to bind InvoiceLinesDone=Bound lines of invoices @@ -126,15 +126,15 @@ NotVentilatedinAccount=Not bound to the accounting account XLineSuccessfullyBinded=%s products/services successfully bound to an accounting account XLineFailedToBeBinded=%s products/services were not bound to any accounting account -ACCOUNTING_LIMIT_LIST_VENTILATION=Number of elements to bind shown by page (maximum recommended : 50) +ACCOUNTING_LIMIT_LIST_VENTILATION=Number of elements to bind shown by page (maximum recommended: 50) ACCOUNTING_LIST_SORT_VENTILATION_TODO=Begin the sorting of the page "Binding to do" by the most recent elements ACCOUNTING_LIST_SORT_VENTILATION_DONE=Begin the sorting of the page "Binding done" by the most recent elements ACCOUNTING_LENGTH_DESCRIPTION=Truncate product & services description in listings after x chars (Best = 50) ACCOUNTING_LENGTH_DESCRIPTION_ACCOUNT=Truncate product & services account description form in listings after x chars (Best = 50) ACCOUNTING_LENGTH_GACCOUNT=Length of the general accounting accounts (If you set value to 6 here, the account '706' will appear like '706000' on screen) -ACCOUNTING_LENGTH_AACCOUNT=Length of the third party accounting accounts (If you set value to 6 here, the account '401' will appear like '401000' on screen) -ACCOUNTING_MANAGE_ZERO=Allow to manage different number of zero at the end of an accounting account. Needed by some countries (like switzerland). If keep to off (default), you can set the 2 following parameters to ask application to add virtual zero. +ACCOUNTING_LENGTH_AACCOUNT=Length of the third-party accounting accounts (If you set value to 6 here, the account '401' will appear like '401000' on screen) +ACCOUNTING_MANAGE_ZERO=Allow to manage different number of zeros at the end of an accounting account. Needed by some countries (like Switzerland). If set to off (default), you can set the following two parameters to ask the application to add virtual zeros. BANK_DISABLE_DIRECT_INPUT=Disable direct recording of transaction in bank account ACCOUNTING_ENABLE_EXPORT_DRAFT_JOURNAL=Enable draft export on journal @@ -175,7 +175,7 @@ NotMatch=Not Set DeleteMvt=Delete Ledger lines DelYear=Year to delete DelJournal=Journal to delete -ConfirmDeleteMvt=This will delete all lines of the Ledger for year and/or from a specific journal. At least one criteria is required. +ConfirmDeleteMvt=This will delete all lines of the Ledger for year and/or from a specific journal. At least one criterion is required. ConfirmDeleteMvtPartial=This will delete the transaction from the Ledger (all lines related to same transaction will be deleted) FinanceJournal=Finance journal ExpenseReportsJournal=Expense reports journal @@ -187,18 +187,18 @@ ProductAccountNotDefined=Account for product not defined FeeAccountNotDefined=Account for fee not defined BankAccountNotDefined=Account for bank not defined CustomerInvoicePayment=Payment of invoice customer -ThirdPartyAccount=Third party account +ThirdPartyAccount=Third-party account NewAccountingMvt=New transaction NumMvts=Numero of transaction ListeMvts=List of movements ErrorDebitCredit=Debit and Credit cannot have a value at the same time AddCompteFromBK=Add accounting accounts to the group -ReportThirdParty=List third party account -DescThirdPartyReport=Consult here the list of the third party customers and vendors and their accounting accounts +ReportThirdParty=List third-party account +DescThirdPartyReport=Consult here the list of third-party customers and vendors and their accounting accounts ListAccounts=List of the accounting accounts -UnknownAccountForThirdparty=Unknown third party account. We will use %s -UnknownAccountForThirdpartyBlocking=Unknown third party account. Blocking error -UnknownAccountForThirdpartyAndWaitingAccountNotDefinedBlocking=Unknown third party account and waiting account not defined. Blocking error +UnknownAccountForThirdparty=Unknown third-party account. We will use %s +UnknownAccountForThirdpartyBlocking=Unknown third-party account. Blocking error +UnknownAccountForThirdpartyAndWaitingAccountNotDefinedBlocking=Unknown third-party account and waiting account not defined. Blocking error PaymentsNotLinkedToProduct=Payment not linked to any product / service Pcgtype=Group of account @@ -215,7 +215,7 @@ DescVentilTodoCustomer=Bind invoice lines not already bound with a product accou ChangeAccount=Change the product/service accounting account for selected lines with the following accounting account: Vide=- DescVentilSupplier=Consult here the list of vendor invoice lines bound or not yet bound to a product accounting account -DescVentilDoneSupplier=Consult here the list of the lines of invoices vendors and their accounting account +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 DescVentilExpenseReportMore=If you setup accounting account on type of expense report lines, the application will be able to make all the binding between your expense report lines and the accounting account of your chart of accounts, just in one click with the button "%s". If account was not set on fees dictionary or if you still have some lines not bound to any account, you will have to make a manual binding from the menu "%s". @@ -254,20 +254,22 @@ AccountingJournalType8=Inventory AccountingJournalType9=Has-new ErrorAccountingJournalIsAlreadyUse=This journal is already use AccountingAccountForSalesTaxAreDefinedInto=Note: Accounting account for Sales tax are defined into menu %s - %s +NumberOfAccountancyEntries=Number of entries +NumberOfAccountancyMovements=Number of movements ## Export ExportDraftJournal=Export draft journal Modelcsv=Model of export Selectmodelcsv=Select a model of export Modelcsv_normal=Classic export -Modelcsv_CEGID=Export towards CEGID Expert Comptabilité -Modelcsv_COALA=Export towards Sage Coala -Modelcsv_bob50=Export towards Sage BOB 50 -Modelcsv_ciel=Export towards Sage Ciel Compta or Compta Evolution -Modelcsv_quadratus=Export towards Quadratus QuadraCompta -Modelcsv_ebp=Export towards EBP -Modelcsv_cogilog=Export towards Cogilog -Modelcsv_agiris=Export towards Agiris +Modelcsv_CEGID=Export for CEGID Expert Comptabilité +Modelcsv_COALA=Export for Sage Coala +Modelcsv_bob50=Export for Sage BOB 50 +Modelcsv_ciel=Export for Sage Ciel Compta or Compta Evolution +Modelcsv_quadratus=Export for Quadratus QuadraCompta +Modelcsv_ebp=Export for EBP +Modelcsv_cogilog=Export for Cogilog +Modelcsv_agiris=Export for Agiris Modelcsv_configurable=Export CSV Configurable Modelcsv_FEC=Export FEC (Art. L47 A) (Test) ChartofaccountsId=Chart of accounts Id diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 8d6e8e39b04..3e430c9a4a5 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -23,7 +23,7 @@ FilesUpdated=Updated Files FilesModified=Modified Files FilesAdded=Added Files FileCheckDolibarr=Check integrity of application files -AvailableOnlyOnPackagedVersions=The local file for integrity checking is only available when application is installed from an official package +AvailableOnlyOnPackagedVersions=The local file for integrity checking is only available when the application is installed from an official package XmlNotFound=Xml Integrity File of application not found SessionId=Session ID SessionSaveHandler=Handler to save sessions @@ -130,7 +130,7 @@ YouCanEditPHPTZ=To set a different PHP timezone (not required), you can try to a HoursOnThisPageAreOnServerTZ=Warning, in contrary of other screens, hours on this page are not in your local timezone, but of the timezone of the server. Box=Widget Boxes=Widgets -MaxNbOfLinesForBoxes=Max number of lines for widgets +MaxNbOfLinesForBoxes=Max. number of lines for widgets AllWidgetsWereEnabled=All available widgets are enabled PositionByDefault=Default order Position=Position @@ -229,7 +229,7 @@ DoNotStoreClearPassword=Do no store clear passwords in database but store only e MainDbPasswordFileConfEncrypted=Database password encrypted in conf.php (Activated recommended) InstrucToEncodePass=To have password encoded into the conf.php file, replace the line
$dolibarr_main_db_pass="...";
by
$dolibarr_main_db_pass="crypted:%s"; InstrucToClearPass=To have password decoded (clear) into the conf.php file, replace the line
$dolibarr_main_db_pass="crypted:...";
by
$dolibarr_main_db_pass="%s"; -ProtectAndEncryptPdfFiles=Protection of generated PDF files NOT recommended (breaks mass PDF generation) +ProtectAndEncryptPdfFiles=Protection of generated PDF files is NOT recommended (breaks bulk PDF generation) ProtectAndEncryptPdfFilesDesc=Protection of a PDF document keeps it available to read and print with any PDF browser. However, editing and copying is not possible anymore. Note that using this feature makes building of a global merged PDFs not working. Feature=Feature DolibarrLicense=License @@ -288,16 +288,16 @@ MAIN_SMS_SENDMODE=Method to use to send SMS MAIN_MAIL_SMS_FROM=Default sender phone number for SMS sending MAIN_MAIL_DEFAULT_FROMTYPE=Default sender email for manual sending (User email or Company email) UserEmail=User email -CompanyEmail=Company email +CompanyEmail=Company Email FeatureNotAvailableOnLinux=Feature not available on Unix like systems. Test your sendmail program locally. -SubmitTranslation=If translation for this language is not complete or you find errors, you can correct this by editing files in directory langs/%s and submit your change to www.transifex.com/dolibarr-association/dolibarr/ +SubmitTranslation=If the translation for this language is not complete or you find errors, you can correct this by editing files in directory langs/%s and submit your change to www.transifex.com/dolibarr-association/dolibarr/ SubmitTranslationENUS=If translation for this language is not complete or you find errors, you can correct this by editing files into directory langs/%s and submit modified files on dolibarr.org/forum or for developers on github.com/Dolibarr/dolibarr. ModuleSetup=Module setup ModulesSetup=Modules/Application setup ModuleFamilyBase=System -ModuleFamilyCrm=Customer Relation Management (CRM) -ModuleFamilySrm=Vendor Relation Management (VRM) -ModuleFamilyProducts=Products Management (PM) +ModuleFamilyCrm=Customer Relationship Management (CRM) +ModuleFamilySrm=Vendor Relationship Management (VRM) +ModuleFamilyProducts=Product Management (PM) ModuleFamilyHr=Human Resource Management (HR) ModuleFamilyProjects=Projects/Collaborative work ModuleFamilyOther=Other @@ -313,7 +313,7 @@ DoNotUseInProduction=Do not use in production ThisIsProcessToFollow=This is steps to process: ThisIsAlternativeProcessToFollow=This is an alternative setup to process manually: StepNb=Step %s -FindPackageFromWebSite=Find a package that provides features you want (for example on official web site %s). +FindPackageFromWebSite=Find a package that provides features you want (for example on the official web site %s). DownloadPackageFromWebSite=Download package (for example from official web site %s). UnpackPackageInDolibarrRoot=Unpack/unzip the packaged files into the server directory dedicated to Dolibarr: %s UnpackPackageInModulesRoot=To deploy/install an external module, unpack/unzip the packaged files into the server directory dedicated to external modules:
%s @@ -367,14 +367,14 @@ FirstnameNamePosition=Position of Name/Lastname DescWeather=The following pictures will be shown on dashboard when number of late actions reach the following values: KeyForWebServicesAccess=Key to use Web Services (parameter "dolibarrkey" in webservices) TestSubmitForm=Input test form -ThisForceAlsoTheme=Using this menu manager will also use its own theme whatever is user choice. Also this menu manager specialized for smartphones does not works on all smartphone. Use another menu manager if you experience problems on yours. +ThisForceAlsoTheme=Using this menu manager will also use its own theme whatever the user choice. Also this menu manager specialized for smartphones does not work on all smartphone. Use another menu manager if you experience problems with yours. ThemeDir=Skins directory ConnectionTimeout=Connection timeout ResponseTimeout=Response timeout SmsTestMessage=Test message from __PHONEFROM__ to __PHONETO__ ModuleMustBeEnabledFirst=Module %s must be enabled first if you need this feature. SecurityToken=Key to secure URLs -NoSmsEngine=No SMS sender manager available. A SMS sender manager is not installed with the default distribution because they depend on an external supplier, but you can find some on %s +NoSmsEngine=No SMS sender manager available. A SMS sender manager is not installed with the default distribution because they depend on an external vendor, but you can find some on %s PDF=PDF PDFDesc=You can set each global option related to the PDF generation PDFAddressForging=Rules to forge address boxes @@ -395,7 +395,7 @@ ButtonHideUnauthorized=Hide buttons for non-admin users for unauthorized actions OldVATRates=Old VAT rate NewVATRates=New VAT rate PriceBaseTypeToChange=Modify on prices with base reference value defined on -MassConvert=Launch mass convert +MassConvert=Launch bulk conversion String=String TextLong=Long text HtmlText=Html text @@ -417,16 +417,16 @@ ExtrafieldCheckBox=Checkboxes ExtrafieldCheckBoxFromList=Checkboxes from table ExtrafieldLink=Link to an object ComputedFormula=Computed field -ComputedFormulaDesc=You can enter here a formula using other properties of object or any PHP coding to get a dynamic computed value. You can use any PHP compatible formulas including the "?" condition operator, and following global object: $db, $conf, $langs, $mysoc, $user, $object.
WARNING: Only some properties of $object may be available. If you need a properties not loaded, just fetch yourself the object into your formula like in the second example.
Using a computed field means you can't enter yourself any value from interface. Also, if there is a syntax error, the formula may return nothing.

Example of formula:
$object->id < 10 ? round($object->id / 2, 2) : ($object->id + 2 * $user->id) * (int) substr($mysoc->zip, 1, 2)

Example to reload object
(($reloadedobj = new Societe($db)) && ($reloadedobj->fetch($obj->id ? $obj->id : ($obj->rowid ? $obj->rowid : $object->id)) > 0)) ? $reloadedobj->array_options['options_extrafieldkey'] * $reloadedobj->capital / 5 : '-1'

Other example of formula to force load of object and its parent object:
(($reloadedobj = new Task($db)) && ($reloadedobj->fetch($object->id) > 0) && ($secondloadedobj = new Project($db)) && ($secondloadedobj->fetch($reloadedobj->fk_project) > 0)) ? $secondloadedobj->ref : 'Parent project not found' +ComputedFormulaDesc=You can enter here a formula using other properties of object or any PHP coding to get a dynamic computed value. You can use any PHP compatible formulas including the "?" condition operator, and following global object: $db, $conf, $langs, $mysoc, $user, $object.
WARNING: Only some properties of $object may be available. If you need a properties not loaded, just fetch yourself the object into your formula like in the second example.
Using a computed field means you can't enter yourself any value from interface. Also, if there is a syntax error, the formula may return nothing.

Example of formula:
$object->id < 10 ? round($object->id / 2, 2): ($object->id + 2 * $user->id) * (int) substr($mysoc->zip, 1, 2)

Example to reload object
(($reloadedobj = new Societe($db)) && ($reloadedobj->fetch($obj->id ? $obj->id: ($obj->rowid ? $obj->rowid: $object->id)) > 0)) ? $reloadedobj->array_options['options_extrafieldkey'] * $reloadedobj->capital / 5: '-1'

Other example of formula to force load of object and its parent object:
(($reloadedobj = new Task($db)) && ($reloadedobj->fetch($object->id) > 0) && ($secondloadedobj = new Project($db)) && ($secondloadedobj->fetch($reloadedobj->fk_project) > 0)) ? $secondloadedobj->ref: 'Parent project not found' ExtrafieldParamHelpPassword=Leaving this field blank means this value will be stored without encryption (field must be only hidden with star on screen).
Set 'auto' to use the default encryption rule to save password into database (then value read will be the hash only, no way to retrieve original value) -ExtrafieldParamHelpselect=List of values must be lines with format key,value (where key can't be '0')

for example :
1,value1
2,value2
code3,value3
...

In order to have the list depending on another complementary attribute list :
1,value1|options_parent_list_code:parent_key
2,value2|options_parent_list_code:parent_key

In order to have the list depending on another list :
1,value1|parent_list_code:parent_key
2,value2|parent_list_code:parent_key -ExtrafieldParamHelpcheckbox=List of values must be lines with format key,value (where key can't be '0')

for example :
1,value1
2,value2
3,value3
... -ExtrafieldParamHelpradio=List of values must be lines with format key,value (where key can't be '0')

for example :
1,value1
2,value2
3,value3
... -ExtrafieldParamHelpsellist=List of values comes from a table
Syntax : table_name:label_field:id_field::filter
Example : c_typent:libelle:id::filter

- idfilter is necessarly a primary int key
- filter can be a simple test (eg active=1) to display only active value
You can also use $ID$ in filter witch is the current id of current object
To do a SELECT in filter use $SEL$
if you want to filter on extrafields use syntax extra.fieldcode=... (where field code is the code of extrafield)

In order to have the list depending on another complementary attribute list:
c_typent:libelle:id:options_parent_list_code|parent_column:filter

In order to have the list depending on another list:
c_typent:libelle:id:parent_list_code|parent_column:filter -ExtrafieldParamHelpchkbxlst=List of values comes from a table
Syntax : table_name:label_field:id_field::filter
Example : c_typent:libelle:id::filter

filter can be a simple test (eg active=1) to display only active value
You can also use $ID$ in filter witch is the current id of current object
To do a SELECT in filter use $SEL$
if you want to filter on extrafields use syntax extra.fieldcode=... (where field code is the code of extrafield)

In order to have the list depending on another complementary attribute list :
c_typent:libelle:id:options_parent_list_code|parent_column:filter

In order to have the list depending on another list:
c_typent:libelle:id:parent_list_code|parent_column:filter -ExtrafieldParamHelplink=Parameters must be ObjectName:Classpath
Syntax : ObjectName:Classpath
Examples :
Societe:societe/class/societe.class.php
Contact:contact/class/contact.class.php +ExtrafieldParamHelpselect=List of values must be lines with format key,value (where key can't be '0')

for example:
1,value1
2,value2
code3,value3
...

In order to have the list depending on another complementary attribute list:
1,value1|options_parent_list_code:parent_key
2,value2|options_parent_list_code:parent_key

In order to have the list depending on another list:
1,value1|parent_list_code:parent_key
2,value2|parent_list_code:parent_key +ExtrafieldParamHelpcheckbox=List of values must be lines with format key,value (where key can't be '0')

for example:
1,value1
2,value2
3,value3
... +ExtrafieldParamHelpradio=List of values must be lines with format key,value (where key can't be '0')

for example:
1,value1
2,value2
3,value3
... +ExtrafieldParamHelpsellist=List of values comes from a table
Syntax: table_name:label_field:id_field::filter
Example: c_typent:libelle:id::filter

- idfilter is necessarly a primary int key
- filter can be a simple test (eg active=1) to display only active value
You can also use $ID$ in filter witch is the current id of current object
To do a SELECT in filter use $SEL$
if you want to filter on extrafields use syntax extra.fieldcode=... (where field code is the code of extrafield)

In order to have the list depending on another complementary attribute list:
c_typent:libelle:id:options_parent_list_code|parent_column:filter

In order to have the list depending on another list:
c_typent:libelle:id:parent_list_code|parent_column:filter +ExtrafieldParamHelpchkbxlst=List of values comes from a table
Syntax: table_name:label_field:id_field::filter
Example: c_typent:libelle:id::filter

filter can be a simple test (eg active=1) to display only active value
You can also use $ID$ in filter witch is the current id of current object
To do a SELECT in filter use $SEL$
if you want to filter on extrafields use syntax extra.fieldcode=... (where field code is the code of extrafield)

In order to have the list depending on another complementary attribute list:
c_typent:libelle:id:options_parent_list_code|parent_column:filter

In order to have the list depending on another list:
c_typent:libelle:id:parent_list_code|parent_column:filter +ExtrafieldParamHelplink=Parameters must be ObjectName:Classpath
Syntax: ObjectName:Classpath
Examples:
Societe:societe/class/societe.class.php
Contact:contact/class/contact.class.php LibraryToBuildPDF=Library used for PDF generation -LocalTaxDesc=Some countries apply 2 or 3 taxes on each invoice line. If this is the case, choose type for second and third tax and its rate. Possible type are:
1 : local tax apply on products and services without vat (localtax is calculated on amount without tax)
2 : local tax apply on products and services including vat (localtax is calculated on amount + main tax)
3 : local tax apply on products without vat (localtax is calculated on amount without tax)
4 : local tax apply on products including vat (localtax is calculated on amount + main vat)
5 : local tax apply on services without vat (localtax is calculated on amount without tax)
6 : local tax apply on services including vat (localtax is calculated on amount + tax) +LocalTaxDesc=Some countries may apply two or three taxes on each invoice line. If this is the case, choose the type for the second and third tax and its rate. Possible type are:
1: local tax apply on products and services without vat (localtax is calculated on amount without tax)
2: local tax apply on products and services including vat (localtax is calculated on amount + main tax)
3: local tax apply on products without vat (localtax is calculated on amount without tax)
4: local tax apply on products including vat (localtax is calculated on amount + main vat)
5: local tax apply on services without vat (localtax is calculated on amount without tax)
6: local tax apply on services including vat (localtax is calculated on amount + tax) SMS=SMS LinkToTestClickToDial=Enter a phone number to call to show a link to test the ClickToDial url for user %s RefreshPhoneLink=Refresh link @@ -443,7 +443,7 @@ InitEmptyBarCode=Init value for next %s empty records EraseAllCurrentBarCode=Erase all current barcode values ConfirmEraseAllCurrentBarCode=Are you sure you want to erase all current barcode values? AllBarcodeReset=All barcode values have been removed -NoBarcodeNumberingTemplateDefined=No numbering barcode template enabled in the barcode module setup. +NoBarcodeNumberingTemplateDefined=No numbering barcode template enabled in the Barcode module setup. EnableFileCache=Enable file cache ShowDetailsInPDFPageFoot=Add more details into footer of PDF files, like your company address, or manager names (to complete professional ids, company capital and VAT number). NoDetails=No more details in footer @@ -452,20 +452,20 @@ DisplayCompanyManagers=Display manager names DisplayCompanyInfoAndManagers=Display company address and manager names EnableAndSetupModuleCron=If you want to have this recurring invoice generated automatically, module *%s* must be enabled and correctly setup. Otherwise, generation of invoices must be done manually from this template using the *Create* button. Note that even if you enabled automatic generation, you can still safely launch manual generation. Generation of duplicates for the same period is not possible. ModuleCompanyCodeCustomerAquarium=%s followed by customer code for a customer accounting code -ModuleCompanyCodeSupplierAquarium=%s followed by supplier code for a supplier accounting code +ModuleCompanyCodeSupplierAquarium=%s followed by vendor code for a vendor accounting code ModuleCompanyCodePanicum=Return an empty accounting code. -ModuleCompanyCodeDigitaria=Accounting code depends on third party code. The code is composed of the character "C" in the first position followed by the first 5 characters of the third party code. +ModuleCompanyCodeDigitaria=Accounting code depends on third-party code. The code is composed of the character "C" in the first position followed by the first 5 characters of the third-party code. Use3StepsApproval=By default, Purchase Orders need to be created and approved by 2 different users (one step/user to create and one step/user to approve. Note that if user has both permission to create and approve, one step/user will be enough). You can ask with this option to introduce a third step/user approval, if amount is higher than a dedicated value (so 3 steps will be necessary: 1=validation, 2=first approval and 3=second approval if amount is enough).
Set this to empty if one approval (2 steps) is enough, set it to a very low value (0.1) if a second approval (3 steps) is always required. UseDoubleApproval=Use a 3 steps approval when amount (without tax) is higher than... -WarningPHPMail=WARNING: It is often better to setup outgoing emails to use the email server of your provider instead of the default setup. Some email providers (like Yahoo) do not allow you to send an email from another server than their own server. Your current setup uses the server of the application to send email and not the server of your email provider, so some recipients (the one compatible with the restrictive DMARC protocol), will ask your email provider if they can accept your email and some email providers (like Yahoo) may respond "no" because the server is not their, so few of your sent Emails may not be accepted (be careful also of your email provider's sending quota).
If your Email provider (like Yahoo) has this restriction, you must change Email setup to choose the other method "SMTP server" and enter the SMTP server and credentials provided by your Email provider (ask your Email provider to get SMTP credentials for your account). +WarningPHPMail=WARNING: It is often better to setup outgoing emails to use the email server of your provider instead of the default setup. Some email providers (like Yahoo) do not allow you to send an email from another server than their own server. Your current setup uses the server of the application to send email and not the server of your email provider, so some recipients (the one compatible with the restrictive DMARC protocol), will ask your email provider if they can accept your email and some email providers (like Yahoo) may respond "no" because the server is not theirs, so few of your sent Emails may not be accepted (be careful also of your email provider's sending quota).
If your Email provider (like Yahoo) has this restriction, you must change Email setup to choose the other method "SMTP server" and enter the SMTP server and credentials provided by your Email provider. 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. ClickToShowDescription=Click to show description DependsOn=This module needs the module(s) RequiredBy=This module is required by module(s) TheKeyIsTheNameOfHtmlField=This is the name of the HTML field. Technical knowledge is required to read the content of the HTML page to get the key name of a field. -PageUrlForDefaultValues=You must enter the relative path of the page in URL. If you include parameters in URL, the default values will be effective if all parameters are set to same value. -PageUrlForDefaultValuesCreate=
Example:
For the form to create a new thirdparty, it is %s.
For URL of external modules installed into custom directory, do not include the "custom/", so use path like mymodule/mypage.php and not custom/mymodule/mypage.php.
If you want default value only if url has some parameter, you can use %s -PageUrlForDefaultValuesList=
Example:
For the page that list third-parties, it is %s.
For URL of external modules installed into custom directory, do not include the "custom/" so use path like mymodule/mypagelist.php and not custom/mymodule/mypagelist.php.
If you want default value only if url has some parameter, you can use %s +PageUrlForDefaultValues=You must enter the relative path of the page URL. If you include parameters in URL, the default values will be effective if all parameters are set to same value. +PageUrlForDefaultValuesCreate=
Example:
For the form to create a new third party, it is %s.
For URL of external modules installed into custom directory, do not include the "custom/", so use path like mymodule/mypage.php and not custom/mymodule/mypage.php.
If you want default value only if url has some parameter, you can use %s +PageUrlForDefaultValuesList=
Example:
For the page that lists third parties, it is %s.
For URL of external modules installed into custom directory, do not include the "custom/" so use a path like mymodule/mypagelist.php and not custom/mymodule/mypagelist.php.
If you want default value only if url has some parameter, you can use %s EnableDefaultValues=Enable usage of personalized default values EnableOverwriteTranslation=Enable usage of overwritten translation GoIntoTranslationMenuToChangeThis=A translation has been found for the key with this code. To change this value, you must edit it from Home-Setup-translation. @@ -477,12 +477,12 @@ WatermarkOnDraftExpenseReports=Watermark on draft expense reports AttachMainDocByDefault=Set this to 1 if you want to attach main document to email by default (if applicable) FilesAttachedToEmail=Attach file SendEmailsReminders=Send agenda reminders by emails -davDescription=Add a component to be a DAV server +davDescription=Setup a WebDAV server DAVSetup=Setup of module DAV -DAV_ALLOW_PUBLIC_DIR=Enable the public directory (WebDav directory with no login required) -DAV_ALLOW_PUBLIC_DIRTooltip=The WebDav public directory is a WebDAV directory everybody can access (in read and write mode), with no need to have/use an existing login/password account. -DAV_ALLOW_ECM_DIR=Enable the root directy of DMS/ECM module (login required) -DAV_ALLOW_ECM_DIRTooltip=The root directory where all files are manually uploaded when using the DMS/ECM module. Like for the feature from the web interface, you will need a valid login/password with granted permissions to access it. +DAV_ALLOW_PUBLIC_DIR=Enable the public directory (WebDAV directory - no login required) +DAV_ALLOW_PUBLIC_DIRTooltip=The WebDAV public directory is a WebDAV directory anybody can access (in read and write mode), with no authorization required (login/password account). +DAV_ALLOW_ECM_DIR=Enable the private directory (root directory of the DMS/ECM module - login required) +DAV_ALLOW_ECM_DIRTooltip=The root directory where all files are manually uploaded when using the DMS/ECM module. Similarly as access from the web interface, you will need a valid login/password with adecuate permissions to access it. # Modules Module0Name=Users & Groups Module0Desc=Users / Employees and Groups management @@ -494,35 +494,35 @@ Module10Name=Accounting Module10Desc=Simple accounting reports (journals, turnover) based on database content. Does not use any ledger table. Module20Name=Proposals Module20Desc=Commercial proposal management -Module22Name=Mass E-mailings -Module22Desc=Mass E-mailing management +Module22Name=Mass Emailings +Module22Desc=Manage bulk emailing Module23Name=Energy Module23Desc=Monitoring the consumption of energies Module25Name=Customer Orders Module25Desc=Customer order management Module30Name=Invoices Module30Desc=Management of invoices and credit notes for customers. Management of invoices and credit notes for suppliers -Module40Name=Suppliers -Module40Desc=Suppliers and purchase management (purchase orders and billing) +Module40Name=Vendors +Module40Desc=Vendors and purchase management (purchase orders and billing) Module42Name=Debug Logs Module42Desc=Logging facilities (file, syslog, ...). Such logs are for technical/debug purposes. Module49Name=Editors Module49Desc=Editor management Module50Name=Products -Module50Desc=Product management +Module50Desc=Management of Products Module51Name=Mass mailings Module51Desc=Mass paper mailing management Module52Name=Stocks -Module52Desc=Stock management (products) +Module52Desc=Stock management (for products only) Module53Name=Services -Module53Desc=Service management +Module53Desc=Management of Services Module54Name=Contracts/Subscriptions Module54Desc=Management of contracts (services or recurring subscriptions) Module55Name=Barcodes Module55Desc=Barcode management Module56Name=Telephony Module56Desc=Telephony integration -Module57Name=Direct bank payment orders +Module57Name=Bank Direct Debit payments Module57Desc=Management of Direct Debit payment orders. It includes generation of SEPA file for European countries. Module58Name=ClickToDial Module58Desc=Integration of a ClickToDial system (Asterisk, ...) @@ -533,8 +533,8 @@ Module70Desc=Intervention management Module75Name=Expense and trip notes Module75Desc=Expense and trip notes management Module80Name=Shipments -Module80Desc=Shipments and delivery order management -Module85Name=Banks and Cash +Module80Desc=Shipments and delivery note management +Module85Name=Banks & Cash Module85Desc=Management of bank or cash accounts Module100Name=External Site Module100Desc=Add external website link into Dolibarr menus to view it in a Dolibarr frame @@ -545,50 +545,50 @@ Module200Desc=LDAP directory synchronization Module210Name=PostNuke Module210Desc=PostNuke integration Module240Name=Data exports -Module240Desc=Tool to export Dolibarr data (with assistance) +Module240Desc=Tool to export Dolibarr data (with assistants) Module250Name=Data imports -Module250Desc=Tool to import data into Dolibarr (with assistance) +Module250Desc=Tool to import data into Dolibarr (with assistants) Module310Name=Members Module310Desc=Foundation members management Module320Name=RSS Feed -Module320Desc=Add RSS feed inside Dolibarr screen pages +Module320Desc=Add a RSS feed to Dolibarr pages Module330Name=Bookmarks and shortcuts -Module330Desc=Create shortcuts, always accessible, to the internal or external pages to which you frequently access +Module330Desc=Create admin menu shortcuts to internal/external pages Module400Name=Projects or Leads Module400Desc=Management of projects, leads/opportunities and/or tasks. You can also assign any element (invoice, order, proposal, intervention, ...) to a project and get a transversal view from the project view. Module410Name=Webcalendar Module410Desc=Webcalendar integration -Module500Name=Taxes and Special expenses +Module500Name=Taxes & Special Expenses Module500Desc=Management of other expenses (sale taxes, social or fiscal taxes, dividends, ...) -Module510Name=Payment of employee wages +Module510Name=Salaries Module510Desc=Record and track employee payments -Module520Name=Loan +Module520Name=Loans Module520Desc=Management of loans -Module600Name=Notifications on business events -Module600Desc=Send email notifications triggered by a business event, for users (setup defined on each user), third-party contacts (setup defined on each third party) or to defined emails -Module600Long=Note that this module sends emails in real-time when a specific business event occurs. If you are looking for a feature to send email reminders of agenda events, go into the setup of module Agenda. +Module600Name=Notifications +Module600Desc=Send email notifications triggered by a business event: per user (setup defined on each user), per third-party contacts (setup defined on each third party) or by specific emails +Module600Long=Note that this module sends emails in real-time when a specific business event occurs. If you are looking for a feature to send email reminders for agenda events, go into the setup of module Agenda. Module610Name=Product Variants Module610Desc=Creation of product variants (color, size etc.) Module700Name=Donations Module700Desc=Donation management -Module770Name=Expense reports -Module770Desc=Manage and claim expense reports (transportation, meal, ...) -Module1120Name=Vendor commercial proposal +Module770Name=Expense Reports +Module770Desc=Manage expense reports claims (transportation, meal, ...) +Module1120Name=Vendor Commercial Proposals Module1120Desc=Request vendor commercial proposal and prices Module1200Name=Mantis Module1200Desc=Mantis integration Module1520Name=Document Generation -Module1520Desc=Mass mail document generation +Module1520Desc=Mass email document generation Module1780Name=Tags/Categories -Module1780Desc=Create tags/category (products, customers, vendors, contacts or members) +Module1780Desc=Create tags/category (products, customers, suppliers, contacts or members) Module2000Name=WYSIWYG editor -Module2000Desc=Allow text fields to be edited using CKEditor +Module2000Desc=Allow text fields to be edited/formatted using CKEditor (html) Module2200Name=Dynamic Prices -Module2200Desc=Enable the usage of math expressions for prices +Module2200Desc=Use maths expressions for auto-generation of prices Module2300Name=Scheduled jobs Module2300Desc=Scheduled jobs management (alias cron or chrono table) Module2400Name=Events/Agenda -Module2400Desc=Track events. Let Dolibarr log automatic events for tracking purposes or record manual events or meetings. This is the main module for good Customer or Supplier Relationship Management. +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. 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) @@ -596,14 +596,14 @@ Module2600Desc=Enable the Dolibarr SOAP server providing API services Module2610Name=API/Web services (REST server) Module2610Desc=Enable the Dolibarr REST server providing API services Module2660Name=Call WebServices (SOAP client) -Module2660Desc=Enable the Dolibarr web services client (Can be used to push data/requests to external servers. Only Supplier orders currently supported.) +Module2660Desc=Enable the Dolibarr web services client (Can be used to push data/requests to external servers. Only Vendor orders are currently supported.) Module2700Name=Gravatar Module2700Desc=Use online Gravatar service (www.gravatar.com) to show photo of users/members (found with their emails). Needs Internet access Module2800Desc=FTP Client Module2900Name=GeoIPMaxmind Module2900Desc=GeoIP Maxmind conversions capabilities Module3100Name=Skype -Module3100Desc=Add a Skype button into users / third parties / contacts / members cards +Module3100Desc=Add a Skype button to cards for users/third parties/contacts/members Module3200Name=Unalterable Archives Module3200Desc=Enable an unalterable log of business events. Events are archived in real-time. The log is a read-only table of chained events that can be exported. This module may be mandatory for some countries. Module4000Name=HRM @@ -613,27 +613,29 @@ Module5000Desc=Allows you to manage multiple companies Module6000Name=Workflow Module6000Desc=Workflow management (automatic creation of object and/or automatic status change) Module10000Name=Websites -Module10000Desc=Create public websites with a WYSIWG editor. Just setup your web server (Apache, Nginx, ...) to point to the dedicated Dolibarr directory to have it online on the Internet with your own domain name. -Module20000Name=Leave Requests management -Module20000Desc=Declare and track employees leave requests -Module39000Name=Products lots -Module39000Desc=Lot or serial number, eat-by and sell-by date management on products +Module10000Desc=Create websites (public) with a WYSIWYG editor. Just setup your web server (Apache, Nginx, ...) to point to the dedicated Dolibarr directory to have it online on the internet with your own domain name. +Module20000Name=Leave Request Management +Module20000Desc=Define and track employee leave requests +Module39000Name=Product Lots +Module39000Desc=Lots, serial numbers, eat-by/sell-by date management for products Module40000Name=Multicurrency Module40000Desc=Use alternative currencies in prices and documents Module50000Name=PayBox -Module50000Desc=Offer customers a PayBox online payment page (credit/debit cards). This can be used to allow your customers to make free payments or for a payment on a particular Dolibarr object (invoice, order, ...) -Module50100Name=Point of sales -Module50100Desc=Point of sales module (POS). -Module50150Name=Point of sales -Module50150Desc=Point of sales module (Touch screen POS). +Module50000Desc=Offer customers a PayBox online payment page (credit/debit cards). This can be used to allow your customers to make ad-hoc payments or payments related to a specific Dolibarr object (invoice, order etc...) +Module50100Name=POS +Module50100Desc=Point of Sale module (POS). +Module50150Name=Point of Sale +Module50150Desc=Point of Sale module (Touch screen POS). Module50200Name=Paypal -Module50200Desc=Offer customers a PayPal online payment page (PayPal account or credit/debit cards). This can be used to allow your customers to make free payments or for a payment on a particular Dolibarr object (invoice, order, ...) +Module50200Desc=Offer customers a PayPal online payment page (PayPal account or credit/debit cards). This can be used to allow your customers to make ad-hoc payments or payments related to a specific Dolibarr object (invoice, order etc...) +Module50300Name=Stripe +Module50300Desc=Offer customers a Stripe online payment page (credit/debit cards). This can be used to allow your customers to make ad-hoc payments or payments related to a specific Dolibarr object (invoice, order etc...) Module50400Name=Accounting (advanced) Module50400Desc=Accounting management (double entries, support general and auxiliary ledgers). Export the ledger in several other accounting software formats. Module54000Name=PrintIPP Module54000Desc=Direct print (without opening the documents) using Cups IPP interface (Printer must be visible from server, and CUPS must be installed on server). Module55000Name=Poll, Survey or Vote -Module55000Desc=Module to create online polls, surveys or votes (like Doodle, Studs, Rdvz, ...) +Module55000Desc=Create online polls, surveys or votes (like Doodle, Studs, RDVz etc...) Module59000Name=Margins Module59000Desc=Module to manage margins Module60000Name=Commissions @@ -641,7 +643,7 @@ Module60000Desc=Module to manage commissions Module62000Name=Incoterms Module62000Desc=Add features to manage Incoterms Module63000Name=Resources -Module63000Desc=Manage resources (printers, cars, room, ...) you can then share into events +Module63000Desc=Manage resources (printers, cars, rooms, ...) for allocating to events Permission11=Read customer invoices Permission12=Create/modify customer invoices Permission13=Unvalidate customer invoices @@ -699,13 +701,13 @@ Permission113=Setup financial accounts (create, manage categories) Permission114=Reconcile transactions Permission115=Export transactions and account statements Permission116=Transfers between accounts -Permission117=Manage cheques dispatching +Permission117=Manage checks dispatching Permission121=Read third parties linked to user Permission122=Create/modify third parties linked to user Permission125=Delete third parties linked to user Permission126=Export third parties -Permission141=Read all projects and tasks (also private projects I am not a contact for) -Permission142=Create/modify all projects and tasks (also private projects I am not a contact for) +Permission141=Read all projects and tasks (also private projects for which I am not a contact) +Permission142=Create/modify all projects and tasks (also private projects for which I am not a contact) Permission144=Delete all projects and tasks (also private projects i am not contact for) Permission146=Read providers Permission147=Read stats @@ -725,14 +727,14 @@ Permission173=Delete trips and expenses Permission174=Read all trips and expenses Permission178=Export trips and expenses Permission180=Read suppliers -Permission181=Read supplier orders -Permission182=Create/modify supplier orders -Permission183=Validate supplier orders -Permission184=Approve supplier orders -Permission185=Order or cancel supplier orders -Permission186=Receive supplier orders -Permission187=Close supplier orders -Permission188=Cancel supplier orders +Permission181=Read purchase orders +Permission182=Create/modify purchase orders +Permission183=Validate purchase orders +Permission184=Approve purchase orders +Permission185=Order or cancel purchase orders +Permission186=Receive purchase orders +Permission187=Close purchase orders +Permission188=Cancel purchase orders Permission192=Create lines Permission193=Cancel lines Permission194=Read the bandwidth lines @@ -765,7 +767,7 @@ PermissionAdvanced253=Create/modify internal/external users and permissions Permission254=Create/modify external users only Permission255=Modify other users password Permission256=Delete or disable other users -Permission262=Extend access to all third parties (not only third parties that user is a sale representative for).
Not effective for external users (always limited to themselves for proposals, orders, invoices, contracts, etc.).
Not effective for projects (only rules on project permissions, visibility and assignment matters). +Permission262=Extend access to all third parties (not only third parties for which that user is a sale representative).
Not effective for external users (always limited to themselves for proposals, orders, invoices, contracts, etc.).
Not effective for projects (only rules on project permissions, visibility and assignment matters). Permission271=Read CA Permission272=Read invoices Permission273=Issue invoices @@ -775,10 +777,10 @@ Permission283=Delete contacts Permission286=Export contacts Permission291=Read tariffs Permission292=Set permissions on the tariffs -Permission293=Modify customers tariffs -Permission300=Read bar codes -Permission301=Create/modify bar codes -Permission302=Delete bar codes +Permission293=Modify customer's tariffs +Permission300=Read barcodes +Permission301=Create/modify barcodes +Permission302=Delete barcodes Permission311=Read services Permission312=Assign service/subscription to contract Permission331=Read bookmarks @@ -831,29 +833,29 @@ Permission1102=Create/modify delivery orders Permission1104=Validate delivery orders Permission1109=Delete delivery orders Permission1181=Read suppliers -Permission1182=Read supplier orders -Permission1183=Create/modify supplier orders -Permission1184=Validate supplier orders -Permission1185=Approve supplier orders -Permission1186=Order supplier orders -Permission1187=Acknowledge receipt of supplier orders -Permission1188=Delete supplier orders -Permission1190=Approve (second approval) supplier orders +Permission1182=Read purchase orders +Permission1183=Create/modify purchase orders +Permission1184=Validate purchase orders +Permission1185=Approve purchase orders +Permission1186=Order purchase orders +Permission1187=Acknowledge receipt of purchase orders +Permission1188=Delete purchase orders +Permission1190=Approve (second approval) purchase orders Permission1201=Get result of an export Permission1202=Create/Modify an export -Permission1231=Read supplier invoices -Permission1232=Create/modify supplier invoices -Permission1233=Validate supplier invoices -Permission1234=Delete supplier invoices -Permission1235=Send supplier invoices by email -Permission1236=Export supplier invoices, attributes and payments -Permission1237=Export supplier orders and their details +Permission1231=Read vendor invoices +Permission1232=Create/modify vendor invoices +Permission1233=Validate vendor invoices +Permission1234=Delete vendor invoices +Permission1235=Send vendor invoices by email +Permission1236=Export vendor invoices, attributes and payments +Permission1237=Export purchase orders and their details Permission1251=Run mass imports of external data into database (data load) Permission1321=Export customer invoices, attributes and payments Permission1322=Reopen a paid bill Permission1421=Export customer orders and attributes -Permission20001=Read leave requests (your leave and that of your subordinates) -Permission20002=Create/modify your leave requests (your leave and that of your subordinates) +Permission20001=Read leave requests (your leave and those of your subordinates) +Permission20002=Create/modify your leave requests (your leave and those of your subordinates) Permission20003=Delete leave requests Permission20004=Read all leave requests (even of user not subordinates) Permission20005=Create/modify leave requests for everybody (even of user not subordinates) @@ -875,7 +877,7 @@ Permission2503=Submit or delete documents Permission2515=Setup documents directories Permission2801=Use FTP client in read mode (browse and download only) Permission2802=Use FTP client in write mode (delete or upload files) -Permission50101=Use Point of sales +Permission50101=Use Point of Sale Permission50201=Read transactions Permission50202=Import transactions Permission54001=Print @@ -888,28 +890,28 @@ Permission63001=Read resources Permission63002=Create/modify resources Permission63003=Delete resources Permission63004=Link resources to agenda events -DictionaryCompanyType=Types of third-parties -DictionaryCompanyJuridicalType=Legal forms of third-parties -DictionaryProspectLevel=Prospect potential level -DictionaryCanton=State/Province +DictionaryCompanyType=Third-Party Types +DictionaryCompanyJuridicalType=Third-Party Legal Entities +DictionaryProspectLevel=Prospect potential +DictionaryCanton=States/Provinces DictionaryRegion=Regions DictionaryCountry=Countries DictionaryCurrency=Currencies -DictionaryCivility=Personal and professional titles +DictionaryCivility=Honorifics DictionaryActions=Types of agenda events -DictionarySocialContributions=Social or fiscal taxes types +DictionarySocialContributions=Types of social or fiscal taxes DictionaryVAT=VAT Rates or Sales Tax Rates DictionaryRevenueStamp=Amount of tax stamps -DictionaryPaymentConditions=Payment terms -DictionaryPaymentModes=Payment modes -DictionaryTypeContact=Contacts/addresses types +DictionaryPaymentConditions=Payment Terms +DictionaryPaymentModes=Payment Modes +DictionaryTypeContact=Contact/Address types DictionaryTypeOfContainer=Type of website pages/containers DictionaryEcotaxe=Ecotax (WEEE) DictionaryPaperFormat=Paper formats -DictionaryFormatCards=Cards formats +DictionaryFormatCards=Card formats DictionaryFees=Expense report - Types of expense report lines DictionarySendingMethods=Shipping methods -DictionaryStaff=Staff +DictionaryStaff=No. of Employees DictionaryAvailability=Delivery delay DictionaryOrderMethods=Ordering methods DictionarySource=Origin of proposals/orders @@ -918,21 +920,21 @@ DictionaryAccountancysystem=Models for chart of accounts DictionaryAccountancyJournal=Accounting journals DictionaryEMailTemplates=Email Templates DictionaryUnits=Units -DictionaryProspectStatus=Prospection status +DictionaryProspectStatus=Prospect status DictionaryHolidayTypes=Types of leave DictionaryOpportunityStatus=Lead status for project/lead DictionaryExpenseTaxCat=Expense report - Transportation categories DictionaryExpenseTaxRange=Expense report - Range by transportation category SetupSaved=Setup saved SetupNotSaved=Setup not saved -BackToModuleList=Back to modules list -BackToDictionaryList=Back to list of Dictionaries +BackToModuleList=Back to Module list +BackToDictionaryList=Back to Dictionaries list TypeOfRevenueStamp=Type of tax stamp -VATManagement=Sale Tax Management -VATIsUsedDesc=By default when creating prospects, invoices, orders etc. the Sale Tax rate follows the active standard rule:
If the seller is not subject to Sale tax, then Sale tax defaults to 0. End of rule.
If the (seller's country = buyer's country), then the Sale tax by default equals the Sale tax of the product in the seller's country. End of rule.
If the seller and buyer are both in the European Community and goods are transport-related products (haulage, shipping, airline), the default Sale tax is 0. This rule is dependant on the seller's country - please consult with your accountant. The Sale tax should be paid by the buyer to their customs office in their country and not to the seller. End of rule.
If the seller and buyer are both in the European Community and the buyer is not a company (with a registered intra-Community Sale tax number) then the Sale tax by defaults to the Sale tax of the seller's country. End of rule.
If the seller and buyer are both in the European Community and the buyer is a company (with a registered intra-Community Sale tax number), then the Sale tax is 0 by default. End of rule.
In any other case the proposed default is Sale tax=0. End of rule. -VATIsNotUsedDesc=By default the proposed Sale tax is 0 which can be used for cases like associations, individuals or small companies. -VATIsUsedExampleFR=In France, it means companies or organizations having a real fiscal system (Simplified real or normal real). A system in which Sale tax is declared. -VATIsNotUsedExampleFR=In France, it means associations that are non Sale tax declared or companies, organizations or liberal professions that have chosen the micro enterprise fiscal system (Sale tax in franchise) and paid a franchise Sale tax without any Sale tax declaration. This choice will display the reference "Non applicable Sale tax - art-293B of CGI" on invoices. +VATManagement=Sales Tax Management +VATIsUsedDesc=By default when creating prospects, invoices, orders etc. the Sales Tax rate follows the active standard rule:
If the seller is not subject to Sales tax, then Sales tax defaults to 0. End of rule.
If the (seller's country = buyer's country), then the Sales tax by default equals the Sales tax of the product in the seller's country. End of rule.
If the seller and buyer are both in the European Community and goods are transport-related products (haulage, shipping, airline), the default VAT is 0. This rule is dependant on the seller's country - please consult with your accountant. The VAT should be paid by the buyer to the customs office in their country and not to the seller. End of rule.
If the seller and buyer are both in the European Community and the buyer is not a company (with a registered intra-Community VAT number) then the VAT defaults to the VAT rate of the seller's country. End of rule.
If the seller and buyer are both in the European Community and the buyer is a company (with a registered intra-Community VAT number), then the VAT is 0 by default. End of rule.
In any other case the proposed default is Sales tax=0. End of rule. +VATIsNotUsedDesc=By default the proposed Sales tax is 0 which can be used for cases like associations, individuals or small companies. +VATIsUsedExampleFR=In France, it means companies or organizations having a real fiscal system (Simplified real or normal real). A system in which VAT is declared. +VATIsNotUsedExampleFR=In France, it means associations that are non Sales tax declared or companies, organizations or liberal professions that have chosen the micro enterprise fiscal system (Sales tax in franchise) and paid a franchise Sales tax without any Sales tax declaration. This choice will display the reference "Non applicable Sales tax - art-293B of CGI" on invoices. ##### Local Taxes ##### LTRate=Rate LocalTax1IsNotUsed=Do not use second tax @@ -1042,19 +1044,19 @@ Delays_MAIN_DELAY_PROPALS_TO_CLOSE=Delay (in days) before alert on proposals to Delays_MAIN_DELAY_PROPALS_TO_BILL=Delay (in days) before alert on proposals not billed Delays_MAIN_DELAY_NOT_ACTIVATED_SERVICES=Delay (in days) before alert on services to activate Delays_MAIN_DELAY_RUNNING_SERVICES=Delay (in days) before alert on expired services -Delays_MAIN_DELAY_SUPPLIER_BILLS_TO_PAY=Delay (in days) before alert on unpaid supplier invoices +Delays_MAIN_DELAY_SUPPLIER_BILLS_TO_PAY=Delay (in days) before alert on unpaid vendor invoices Delays_MAIN_DELAY_CUSTOMER_BILLS_UNPAYED=Delay (in days) before alert on unpaid client invoices Delays_MAIN_DELAY_TRANSACTIONS_TO_CONCILIATE=Delay (in days) before alert on pending bank reconciliation Delays_MAIN_DELAY_MEMBERS=Delay (in days) before alert on delayed membership fee -Delays_MAIN_DELAY_CHEQUES_TO_DEPOSIT=Delay (in days) before alert for cheque deposit to do +Delays_MAIN_DELAY_CHEQUES_TO_DEPOSIT=Delay (in days) before alert for check deposit to do Delays_MAIN_DELAY_EXPENSEREPORTS=Delay (in days) before alert for expense reports to approve SetupDescription1=Before starting to use Dolibarr some initial parameters must be defined and modules enabled/configured. -SetupDescription2=The mandatory setup steps are the 2 first steps in the Setup menu, namely : +SetupDescription2=The following two sections are mandatory (the two first entries in the Setup menu): SetupDescription3=%s -> %s
Basic parameters used to customize the default behavior of Dolibarr (e.g for country-related features). SetupDescription4=%s -> %s
Dolibarr ERP/CRM is a collection of many modules/applications, all more or less independent. The modules relevant to your needs must be enabled and configured. New items/options are added to menus with the activation of a module. -SetupDescription5=Other Setup menu entries provides optional parameters. +SetupDescription5=Other Setup menu entries manage optional parameters. LogEvents=Security audit events -Audit=Security events +Audit=Audit InfoDolibarr=About Dolibarr InfoBrowser=About Browser InfoOS=About OS @@ -1066,7 +1068,7 @@ BrowserName=Browser name BrowserOS=Browser OS ListOfSecurityEvents=List of Dolibarr security events SecurityEventsPurged=Security events purged -LogEventDesc=You can enable here the logging for security events. Administrators can then see its content via menu %s - %s. Warning, this feature can consume a large amount of data in database. +LogEventDesc=You can enable here the logging for security events. Administrators can then see its content via menu %s - %s. Warning, this feature can generate a large amount of data in the database. AreaForAdminOnly=Setup parameters can be set by administrator users only. SystemInfoDesc=System information is miscellaneous technical information you get in read only mode and visible for administrators only. SystemAreaForAdminOnly=This area is available for administrator users only. None of the Dolibarr permissions can reduce this limit. @@ -1086,7 +1088,7 @@ TriggerAlwaysActive=Triggers in this file are always active, whatever are the ac TriggerActiveAsModuleActive=Triggers in this file are active as module %s is enabled. GeneratedPasswordDesc=Define here which rule you want to use to generate new password if you ask to have auto generated password DictionaryDesc=Insert all reference data. You can add your values to the default. -ConstDesc=This page allows you to edit all other parameters not available in previous pages. These are mostly reserved parameters for developers or advanced troubleshooting. For a list of options check here. +ConstDesc=This page allows you to edit (override) parameters not available in other pages. These are mostly reserved parameters for developers/advanced troubleshooting. For a full list of the parameters available see here. 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 @@ -1095,7 +1097,7 @@ MAIN_MAX_DECIMALS_TOT=Max decimals for total prices MAIN_MAX_DECIMALS_SHOWN=Max decimals for prices shown on screen (Add ... after this number if you want to see ... when number is truncated when shown on screen) MAIN_ROUNDING_RULE_TOT=Step of rounding range (for countries where rounding is done on something else than base 10. For example, put 0.05 if rounding is done by 0.05 steps) UnitPriceOfProduct=Net unit price of a product -TotalPriceAfterRounding=Total price (net/vat/incl tax) after rounding +TotalPriceAfterRounding=Total price (excl/vat/incl tax) after rounding ParameterActiveForNextInputOnly=Parameter effective for next input only NoEventOrNoAuditSetup=No security event has been recorded yet. This can be normal if audit has not been enabled on "Setup - Security - Events" page. NoEventFoundWithCriteria=No security event has been found for this search criteria. @@ -1112,12 +1114,12 @@ RestoreDesc3=Restore the data, from a backup dump file, into the database of the RestoreMySQL=MySQL import ForcedToByAModule= This rule is forced to %s by an activated module PreviousDumpFiles=Generated database backup files -WeekStartOnDay=First day of week +WeekStartOnDay=First day of the week RunningUpdateProcessMayBeRequired=Running the upgrade process seems to be required (Programs version %s differs from database version %s) YouMustRunCommandFromCommandLineAfterLoginToUser=You must run this command from command line after login to a shell with user %s or you must add -W option at end of command line to provide %s password. YourPHPDoesNotHaveSSLSupport=SSL functions not available in your PHP DownloadMoreSkins=More skins to download -SimpleNumRefModelDesc=Returns the reference number with format %syymm-nnnn where yy is year, mm is month and nnnn is a sequence without hole and with no reset +SimpleNumRefModelDesc=Returns the reference number with format %syymm-nnnn where yy is year, mm is month and nnnn is sequential with no reset ShowProfIdInAddress=Show professional id with addresses on documents ShowVATIntaInAddress=Hide intra-Community VAT number with addresses on documents TranslationUncomplete=Partial translation @@ -1135,13 +1137,13 @@ MAIN_PROXY_HOST=Name/Address of proxy server MAIN_PROXY_PORT=Port of proxy server MAIN_PROXY_USER=Login to use the proxy server MAIN_PROXY_PASS=Password to use the proxy server -DefineHereComplementaryAttributes=Define any attributes not already available by default, that you want to be supported for %s here. +DefineHereComplementaryAttributes=Define here any additional/custom attributes that you want to be included for: %s ExtraFields=Complementary attributes ExtraFieldsLines=Complementary attributes (lines) ExtraFieldsLinesRec=Complementary attributes (templates invoices lines) ExtraFieldsSupplierOrdersLines=Complementary attributes (order lines) ExtraFieldsSupplierInvoicesLines=Complementary attributes (invoice lines) -ExtraFieldsThirdParties=Complementary attributes (thirdparty) +ExtraFieldsThirdParties=Complementary attributes (third party) ExtraFieldsContacts=Complementary attributes (contacts/address) ExtraFieldsMember=Complementary attributes (member) ExtraFieldsMemberType=Complementary attributes (member type) @@ -1160,7 +1162,7 @@ SendmailOptionMayHurtBuggedMTA=Feature to send mails using method "PHP mail dire TranslationSetup=Setup of translation TranslationKeySearch=Search a translation key or string TranslationOverwriteKey=Overwrite a translation string -TranslationDesc=How to set displayed application language :
* Systemwide: menu Home - Setup - Display
* Per user: Use the User display setup tab on user card (click on username at the top of the screen). +TranslationDesc=How to set displayed application language:
* Systemwide: menu Home - Setup - Display
* Per user: Use the User display setup tab on user card (click on username at the top of the screen). TranslationOverwriteDesc=You can also override strings filling the following table. Choose your language from "%s" dropdown, insert the translation key string into "%s" and your new translation into "%s" TranslationOverwriteDesc2=You can use the other tab to help you know which translation key to use TranslationString=Translation string @@ -1176,7 +1178,7 @@ YesInSummer=Yes in summer OnlyFollowingModulesAreOpenedToExternalUsers=Note, only the following modules are opened to external users (whatever the permissions of such users) and only if permissions are granted: SuhosinSessionEncrypt=Session storage encrypted by Suhosin ConditionIsCurrently=Condition is currently %s -YouUseBestDriver=You use driver %s which is the best driver available currently. +YouUseBestDriver=You use driver %s which is the best driver currently available. YouDoNotUseBestDriver=You use driver %s but driver %s is recommended. NbOfProductIsLowerThanNoPb=You have only %s products/services in the database. This does not require any particular optimization. SearchOptim=Search optimization @@ -1185,8 +1187,8 @@ BrowserIsOK=You are using the %s web browser. This browser is ok for security an BrowserIsKO=You are using the %s web browser. This browser is known to be a bad choice for security, performance and reliability. We recommend using Firefox, Chrome, Opera or Safari. XDebugInstalled=XDebug is loaded. XCacheInstalled=XCache is loaded. -AddRefInList=Display Customer/Supplier ref. info list (select list or combobox) and most of hyperlink.
Third Parties will appear with a name format of "CC12345 - SC45678 - The Big Company corp." instead of "The Big Company corp". -AddAdressInList=Display Customer/Supplier adress info list (select list or combobox)
Third Parties will appear with a name format of "The Big Company corp. - 21 jump street 123456 Big town - USA" instead of "The Big Company corp". +AddRefInList=Display Customer/Vendor ref. info list (select list or combobox) and most of hyperlink.
Third Parties will appear with a name format of "CC12345 - SC45678 - The Big Company corp." instead of "The Big Company corp". +AddAdressInList=Display Customer/Vendor adress info list (select list or combobox)
Third Parties will appear with a name format of "The Big Company corp. - 21 jump street 123456 Big town - USA" instead of "The Big Company corp". AskForPreferredShippingMethod=Ask for preferred shipping method for Third Parties. FieldEdition=Edition of field %s FillThisOnlyIfRequired=Example: +2 (fill only if timezone offset problems are experienced) @@ -1201,16 +1203,16 @@ PasswordPatternDesc=Password pattern description RuleForGeneratedPasswords=Rule to generate suggested passwords or validate passwords DisableForgetPasswordLinkOnLogonPage=Do not show the link "Forget password" on login page UsersSetup=Users module setup -UserMailRequired=EMail required to create a new user +UserMailRequired=Email required to create a new user ##### HRM setup ##### HRMSetup=HRM module setup ##### Company setup ##### CompanySetup=Companies module setup -CompanyCodeChecker=Options for automatic generation of customer / vendor codes -AccountCodeManager=Options for automatic generation of customer / vendor accounting codes -NotificationsDesc=EMails notifications feature allows you to silently send automatic mail, for some Dolibarr events. Targets of notifications can be defined: -NotificationsDescUser=* per users, one user at time. -NotificationsDescContact=* per third parties contacts (customers or vendors), one contact at time. +CompanyCodeChecker=Options for automatic generation of customer/vendor codes +AccountCodeManager=Options for automatic generation of customer/vendor accounting codes +NotificationsDesc=EMais notification feature allows you to silently send automatic mails for some Dolibarr events. Recipients of notifications can be defined: +NotificationsDescUser=* per user, one user at time. +NotificationsDescContact=* per third parties contacts (customers or suppliers), one contact at time. NotificationsDescGlobal=* or by setting global target emails in module setup page. ModelModules=Document Templates DocumentModelOdt=Generate documents from OpenDocument templates (.ODT / .ODS files from LibreOffice, OpenOffice, KOffice, TextEdit,...) @@ -1218,12 +1220,12 @@ WatermarkOnDraft=Watermark on draft document JSOnPaimentBill=Activate feature to autofill payment lines on payment form CompanyIdProfChecker=Rules for Professional IDs MustBeUnique=Must be unique? -MustBeMandatory=Mandatory to create third parties (if vat number or type of company defined) ? +MustBeMandatory=Mandatory to create third parties (if VAT number or type of company defined) ? MustBeInvoiceMandatory=Mandatory to validate invoices? TechnicalServicesProvided=Technical services provided #####DAV ##### -WebDAVSetupDesc=This is the links to access the WebDAV directory. It contains a "public" dir open to any user knowing the URL (if public directory access allowed) and a "private" directory that need an existing login account/password to access. -WebDavServer=Root URL of %s server : %s +WebDAVSetupDesc=This is the link to access the WebDAV directory. It contains a "public" dir open to any user knowing the URL (if public directory access allowed) and a "private" directory that needs an existing login account/password for access. +WebDavServer=Root URL of %s server: %s ##### Webcal setup ##### WebCalUrlForVCalExport=An export link to %s format is available at following link: %s ##### Invoices ##### @@ -1236,13 +1238,13 @@ CreditNote=Credit note CreditNotes=Credit notes ForceInvoiceDate=Force invoice date to validation date SuggestedPaymentModesIfNotDefinedInInvoice=Suggested payments mode on invoice by default if not defined for invoice -SuggestPaymentByRIBOnAccount=Suggest payment by withdraw on account -SuggestPaymentByChequeToAddress=Suggest payment by cheque to +SuggestPaymentByRIBOnAccount=Suggest payment by withdrawal on account +SuggestPaymentByChequeToAddress=Suggest payment by check to FreeLegalTextOnInvoices=Free text on invoices WatermarkOnDraftInvoices=Watermark on draft invoices (none if empty) PaymentsNumberingModule=Payments numbering model -SuppliersPayment=Suppliers payments -SupplierPaymentSetup=Suppliers payments setup +SuppliersPayment=Vendors payments +SupplierPaymentSetup=Vendors payments setup ##### Proposals ##### PropalSetup=Commercial proposals module setup ProposalsNumberingModules=Commercial proposal numbering models @@ -1251,11 +1253,11 @@ FreeLegalTextOnProposal=Free text on commercial proposals WatermarkOnDraftProposal=Watermark on draft commercial proposals (none if empty) BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL=Ask for bank account destination of proposal ##### SupplierProposal ##### -SupplierProposalSetup=Price requests vendors module setup -SupplierProposalNumberingModules=Price requests vendors numbering models -SupplierProposalPDFModules=Price requests vendors documents models -FreeLegalTextOnSupplierProposal=Free text on price requests vendors -WatermarkOnDraftSupplierProposal=Watermark on draft price requests vendors (none if empty) +SupplierProposalSetup=Price requests suppliers module setup +SupplierProposalNumberingModules=Price requests suppliers numbering models +SupplierProposalPDFModules=Price requests suppliers documents models +FreeLegalTextOnSupplierProposal=Free text on price requests suppliers +WatermarkOnDraftSupplierProposal=Watermark on draft price requests suppliers (none if empty) BANK_ASK_PAYMENT_BANK_DURING_SUPPLIER_PROPOSAL=Ask for bank account destination of price request WAREHOUSE_ASK_WAREHOUSE_DURING_ORDER=Ask for Warehouse Source for order ##### Suppliers Orders ##### @@ -1284,10 +1286,10 @@ WatermarkOnDraftContractCards=Watermark on draft contracts (none if empty) MembersSetup=Members module setup MemberMainOptions=Main options AdherentLoginRequired= Manage a Login for each member -AdherentMailRequired=EMail required to create a new 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 -VisitorCanChooseItsPaymentMode=Visitor can choose among available payment modes -MEMBER_REMINDER_EMAIL=Enable automatic reminder by emails of expired subscriptions. Note: Module %s must be enabled and correctly setup to have reminder sent. +VisitorCanChooseItsPaymentMode=Visitor can choose from available payment modes +MEMBER_REMINDER_EMAIL=Enable automatic reminder by email of expired subscriptions. Note: Module %s must be enabled and correctly setup to send reminders. ##### LDAP setup ##### LDAPSetup=LDAP Setup LDAPGlobalParameters=Global parameters @@ -1309,7 +1311,7 @@ LDAPSynchronizeMembersTypes=Organization of foundation's members types in LDAP LDAPPrimaryServer=Primary server LDAPSecondaryServer=Secondary server LDAPServerPort=Server port -LDAPServerPortExample=Default port : 389 +LDAPServerPortExample=Default port: 389 LDAPServerProtocolVersion=Protocol version LDAPServerUseTLS=Use TLS LDAPServerUseTLSExample=Your LDAP server use TLS @@ -1366,49 +1368,49 @@ LDAPSetupForVersion2=LDAP server configured for version 2 LDAPDolibarrMapping=Dolibarr Mapping LDAPLdapMapping=LDAP Mapping LDAPFieldLoginUnix=Login (unix) -LDAPFieldLoginExample=Example : uid +LDAPFieldLoginExample=Example: uid LDAPFilterConnection=Search filter -LDAPFilterConnectionExample=Example : &(objectClass=inetOrgPerson) +LDAPFilterConnectionExample=Example: &(objectClass=inetOrgPerson) LDAPFieldLoginSamba=Login (samba, activedirectory) -LDAPFieldLoginSambaExample=Example : samaccountname +LDAPFieldLoginSambaExample=Example: samaccountname LDAPFieldFullname=Full name -LDAPFieldFullnameExample=Example : cn +LDAPFieldFullnameExample=Example: cn LDAPFieldPasswordNotCrypted=Password not encrypted LDAPFieldPasswordCrypted=Password encrypted -LDAPFieldPasswordExample=Example : userPassword -LDAPFieldCommonNameExample=Example : cn +LDAPFieldPasswordExample=Example: userPassword +LDAPFieldCommonNameExample=Example: cn LDAPFieldName=Name -LDAPFieldNameExample=Example : sn +LDAPFieldNameExample=Example: sn LDAPFieldFirstName=First name -LDAPFieldFirstNameExample=Example : givenName +LDAPFieldFirstNameExample=Example: givenName LDAPFieldMail=Email address -LDAPFieldMailExample=Example : mail +LDAPFieldMailExample=Example: mail LDAPFieldPhone=Professional phone number -LDAPFieldPhoneExample=Example : telephonenumber +LDAPFieldPhoneExample=Example: telephonenumber LDAPFieldHomePhone=Personal phone number -LDAPFieldHomePhoneExample=Example : homephone +LDAPFieldHomePhoneExample=Example: homephone LDAPFieldMobile=Cellular phone -LDAPFieldMobileExample=Example : mobile +LDAPFieldMobileExample=Example: mobile LDAPFieldFax=Fax number -LDAPFieldFaxExample=Example : facsimiletelephonenumber +LDAPFieldFaxExample=Example: facsimiletelephonenumber LDAPFieldAddress=Street -LDAPFieldAddressExample=Example : street +LDAPFieldAddressExample=Example: street LDAPFieldZip=Zip -LDAPFieldZipExample=Example : postalcode +LDAPFieldZipExample=Example: postalcode LDAPFieldTown=Town -LDAPFieldTownExample=Example : l +LDAPFieldTownExample=Example: l LDAPFieldCountry=Country LDAPFieldDescription=Description -LDAPFieldDescriptionExample=Example : description +LDAPFieldDescriptionExample=Example: description LDAPFieldNotePublic=Public Note -LDAPFieldNotePublicExample=Example : publicnote +LDAPFieldNotePublicExample=Example: publicnote LDAPFieldGroupMembers= Group members -LDAPFieldGroupMembersExample= Example : uniqueMember +LDAPFieldGroupMembersExample= Example: uniqueMember LDAPFieldBirthdate=Birthdate LDAPFieldCompany=Company -LDAPFieldCompanyExample=Example : o +LDAPFieldCompanyExample=Example: o LDAPFieldSid=SID -LDAPFieldSidExample=Example : objectsid +LDAPFieldSidExample=Example: objectsid LDAPFieldEndLastSubscription=Date of subscription end LDAPFieldTitle=Job position LDAPFieldTitleExample=Example: title @@ -1441,8 +1443,8 @@ CacheByClient=Cache by browser CompressionOfResources=Compression of HTTP responses CompressionOfResourcesDesc=For example using the Apache directive "AddOutputFilterByType DEFLATE" TestNotPossibleWithCurrentBrowsers=Such an automatic detection is not possible with current browsers -DefaultValuesDesc=Here you can define/force the default value you want to have when you create a new record, and/or default filters or sort order when your list records. -DefaultCreateForm=Default values (to create on forms) +DefaultValuesDesc=Here you may define the default value you wish to use when creating a new record, and/or default filters or the sort order when you list records. +DefaultCreateForm=Default values (to use on forms) DefaultSearchFilters=Default search filters DefaultSortOrder=Default sort orders DefaultFocus=Default focus fields @@ -1451,8 +1453,8 @@ DefaultMandatory=Mandatory form fields ProductSetup=Products module setup ServiceSetup=Services module setup ProductServiceSetup=Products and Services modules setup -NumberOfProductShowInSelect=Max number of products in combos select lists (0=no limit) -ViewProductDescInFormAbility=Display product descriptions in forms (otherwise as popup tooltip) +NumberOfProductShowInSelect=Maximum number of products to show in combo select lists (0=no limit) +ViewProductDescInFormAbility=Display product descriptions in forms (otherwise shown in a tooltip popup) MergePropalProductCard=Activate in product/service Attached Files tab an option to merge product PDF document to proposal PDF azur if product/service is in the proposal ViewProductDescInThirdpartyLanguageAbility=Display products descriptions in the language of the third party UseSearchToSelectProductTooltip=Also if you have a large number of products (> 100 000), you can increase speed by setting constant PRODUCT_DONOTSEARCH_ANYWHERE to 1 in Setup->Other. Search will then be limited to start of string. @@ -1497,7 +1499,7 @@ GenbarcodeLocation=Bar code generation command line tool (used by internal engin BarcodeInternalEngine=Internal engine BarCodeNumberManager=Manager to auto define barcode numbers ##### Prelevements ##### -WithdrawalsSetup=Setup of module Direct debit payment orders +WithdrawalsSetup=Setup of module Direct Debit payments ##### ExternalRSS ##### ExternalRSSSetup=External RSS imports setup NewRSS=New RSS Feed @@ -1505,13 +1507,13 @@ RSSUrl=RSS URL RSSUrlExample=An interesting RSS feed ##### Mailing ##### MailingSetup=EMailing module setup -MailingEMailFrom=Sender EMail (From) for emails sent by emailing module -MailingEMailError=Return EMail (Errors-to) for emails with errors +MailingEMailFrom=Sender email (From) for emails sent by emailing module +MailingEMailError=Return Email (Errors-to) for emails with errors MailingDelay=Seconds to wait after sending next message ##### Notification ##### -NotificationSetup=EMail notification module setup -NotificationEMailFrom=Sender EMail (From) for emails sent for notifications -FixedEmailTarget=Fixed email target +NotificationSetup=Email Notification module setup +NotificationEMailFrom=Sender email (From) for emails sent by Notifications module +FixedEmailTarget=Recipient ##### Sendings ##### SendingsSetup=Sending module setup SendingsReceiptModel=Sending receipt model @@ -1606,15 +1608,15 @@ AGENDA_SHOW_LINKED_OBJECT=Show linked object into agenda view ##### Clicktodial ##### ClickToDialSetup=Click To Dial module setup ClickToDialUrlDesc=Url called when a click on phone picto is done. In URL, you can use tags
__PHONETO__ that will be replaced with the phone number of person to call
__PHONEFROM__ that will be replaced with phone number of calling person (yours)
__LOGIN__ that will be replaced with clicktodial login (defined on user card)
__PASS__ that will be replaced with clicktodial password (defined on user card). -ClickToDialDesc=This module allows to make phone numbers clickable. A click on this icon will call make your phone call the phone number. This can be used to call a call center system from Dolibarr that can call the phone number on a SIP system for example. +ClickToDialDesc=This module makea phone numbers clickable links. A click on the icon will make your phone call the number. This can be used to call a call-center system from Dolibarr that can call the phone number on a SIP system for example. ClickToDialUseTelLink=Use just a link "tel:" on phone numbers ClickToDialUseTelLinkDesc=Use this method if your users have a softphone or a software interface installed on the same computer as the browser, and called when you click on a link in your browser that starts with "tel:". If you need a full server solution (no need of local software installation), you must set this to "No" and fill next field. -##### Point Of Sales (CashDesk) ##### -CashDesk=Point of sales -CashDeskSetup=Point of sales module setup +##### Point Of Sale (CashDesk) ##### +CashDesk=Point of Sale +CashDeskSetup=Point of Sales module setup CashDeskThirdPartyForSell=Default generic third party to use for sales CashDeskBankAccountForSell=Default account to use to receive cash payments -CashDeskBankAccountForCheque= Default account to use to receive payments by cheque +CashDeskBankAccountForCheque= Default account to use to receive payments by check CashDeskBankAccountForCB= Default account to use to receive payments by credit cards CashDeskDoNotDecreaseStock=Disable stock decrease when a sale is done from Point of Sale (if "no", stock decrease is done for each sale done from POS, irrespective of the option set in module Stock). CashDeskIdWareHouse=Force and restrict warehouse to use for stock decrease @@ -1640,20 +1642,20 @@ ApiKey=Key for API WarningAPIExplorerDisabled=The API explorer has been disabled. API explorer is not required to provide API services. It is a tool for developer to find/test REST APIs. If you need this tool, go into setup of module API REST to activate it. ##### Bank ##### BankSetupModule=Bank module setup -FreeLegalTextOnChequeReceipts=Free text on cheque receipts +FreeLegalTextOnChequeReceipts=Free text on check receipts BankOrderShow=Display order of bank accounts for countries using "detailed bank number" BankOrderGlobal=General BankOrderGlobalDesc=General display order BankOrderES=Spanish BankOrderESDesc=Spanish display order -ChequeReceiptsNumberingModule=Cheque Receipts Numbering module +ChequeReceiptsNumberingModule=Check Receipts Numbering Module ##### Multicompany ##### MultiCompanySetup=Multi-company module setup ##### Suppliers ##### -SuppliersSetup=Supplier module setup +SuppliersSetup=Vendor module setup SuppliersCommandModel=Complete template of purchase order (logo...) SuppliersInvoiceModel=Complete template of vendor invoice (logo...) -SuppliersInvoiceNumberingModel=Supplier invoices numbering models +SuppliersInvoiceNumberingModel=Vendor invoices numbering models IfSetToYesDontForgetPermission=If set to yes, don't forget to provide permissions to groups or users allowed for the second approval ##### GeoIPMaxmind ##### GeoIPMaxmindSetup=GeoIP Maxmind module setup @@ -1689,7 +1691,7 @@ NoAmbiCaracAutoGeneration=Do not use ambiguous characters ("1","l","i","|","0"," SalariesSetup=Setup of module salaries SortOrder=Sort order Format=Format -TypePaymentDesc=0:Customer payment type, 1:Vendor payment type, 2:Both customers and vendors payment type +TypePaymentDesc=0:Customer payment type, 1:Vendor payment type, 2:Both customers and suppliers payment type IncludePath=Include path (defined into variable %s) ExpenseReportsSetup=Setup of module Expense Reports TemplatePDFExpenseReports=Document templates to generate expense report document @@ -1697,16 +1699,16 @@ ExpenseReportsIkSetup=Setup of module Expense Reports - Milles index ExpenseReportsRulesSetup=Setup of module Expense Reports - Rules ExpenseReportNumberingModules=Expense reports numbering module NoModueToManageStockIncrease=No module able to manage automatic stock increase has been activated. Stock increase will be done on manual input only. -YouMayFindNotificationsFeaturesIntoModuleNotification=You may find options for EMail notifications by enabling and configuring the module "Notification". +YouMayFindNotificationsFeaturesIntoModuleNotification=You may find options for email notifications by enabling and configuring the module "Notification". ListOfNotificationsPerUser=List of notifications per user* ListOfNotificationsPerUserOrContact=List of notifications per user* or per contact** -ListOfFixedNotifications=List of fixed notifications +ListOfFixedNotifications=List of Fixed Notifications GoOntoUserCardToAddMore=Go to the tab "Notifications" of a user to add or remove notifications for users GoOntoContactCardToAddMore=Go on the tab "Notifications" of a third party to add or remove notifications for contacts/addresses Threshold=Threshold BackupDumpWizard=Wizard to build database backup dump file 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 only manual steps a privileged user can do. +SomethingMakeInstallFromWebNotPossible2=For this reason, process to upgrade described here is a manual process only a privileged user may perform. InstallModuleFromWebHasBeenDisabledByFile=Install of external module from application has been disabled by your administrator. You must ask him to remove the file %s to allow this feature. 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 @@ -1732,8 +1734,8 @@ ColorFormat=The RGB color is in HEX format, eg: FF0000 PositionIntoComboList=Position of line into combo lists SellTaxRate=Sale tax rate RecuperableOnly=Yes for VAT "Not Perceived but Recoverable" dedicated for some state in France. Keep value to "No" in all other cases. -UrlTrackingDesc=If the provider or transport service offer a page or web site to check status of your shipping, you can enter it here. You can use the key {TRACKID} into URL parameters so the system will replace it with value of tracking number user entered into shipment card. -OpportunityPercent=When you create a lead, you will define an estimated amount of project/lead. According to status of lead, this amount may be multiplied by this rate to evaluate global amount all your opportunities may generate. Value is percent (between 0 and 100). +UrlTrackingDesc=If the provider or transport service offers a page or web site to check the status of your shipments, you may enter it here. You can use the key {TRACKID} in the URL parameters so the system will replace it with the tracking number the user entered into the shipment card. +OpportunityPercent=When you create a lead, you will define an estimated amount of project/lead. According to status of the lead, this amount may be multiplied by this rate to evaluate a total amount all your leads may generate. Value is a percentage (between 0 and 100). TemplateForElement=This template record is dedicated to which element TypeOfTemplate=Type of template TemplateIsVisibleByOwnerOnly=Template is visible to owner only @@ -1762,10 +1764,10 @@ YouUseLastStableVersion=You use the latest stable version TitleExampleForMajorRelease=Example of message you can use to announce this major release (feel free to use it on your web sites) TitleExampleForMaintenanceRelease=Example of message you can use to announce this maintenance release (feel free to use it on your web sites) ExampleOfNewsMessageForMajorRelease=Dolibarr ERP & CRM %s is available. Version %s is a major release with a lot of new features for both users and developers. You can download it from the download area of https://www.dolibarr.org portal (subdirectory Stable versions). You can read ChangeLog for complete list of changes. -ExampleOfNewsMessageForMaintenanceRelease=Dolibarr ERP & CRM %s is available. Version %s is a maintenance version, so it contains only fixes of bugs. We recommend everybody using an older version to upgrade to this one. As any maintenance release, no new features or data structure change is present in this version. You can download it from the download area of https://www.dolibarr.org portal (subdirectory Stable versions). You can read ChangeLog for complete list of changes. -MultiPriceRuleDesc=When option "Several level of prices per product/service" is on, you can define different prices (one per price level) for each product. To save you time, here you can enter a rule to have a price for each level autocalculated according to the price of first level, so you will have to only enter a price for the first level on each product. This page is here to save you time and can be useful only if your prices for each level are relative to first level. You can ignore this page in most cases. +ExampleOfNewsMessageForMaintenanceRelease=Dolibarr ERP & CRM %s is available. Version %s is a maintenance version, so contains only bug fixes. We recommend all users to upgrade to this version. A maintenance release does not introduce new features or changes to the database. You may download it from the download area of https://www.dolibarr.org portal (subdirectory Stable versions). You can read the ChangeLog for complete list of changes. +MultiPriceRuleDesc=When option "Several levels of prices per product/service" is enabled, you can define different prices (one per price level) for each product. To save you time, here you may enter a rule to autocalculate a price for each level based on the price of the first level, so you will have to only enter a price for the first level for each product. This page is designed to save you time but ia useful only if your prices for each level are relative to first level. You can ignore this page in most cases. ModelModulesProduct=Templates for product documents -ToGenerateCodeDefineAutomaticRuleFirst=To be able to generate codes automatically, you must first define a manager to auto define barcode number. +ToGenerateCodeDefineAutomaticRuleFirst=To be able to generate codes automatically, you must first define a manager to auto-define the barcode number. SeeSubstitutionVars=See * note for list of possible substitution variables SeeChangeLog=See ChangeLog file (english only) AllPublishers=All publishers @@ -1803,25 +1805,25 @@ MAIN_PDF_MARGIN_LEFT=Left margin on PDF MAIN_PDF_MARGIN_RIGHT=Right margin on PDF MAIN_PDF_MARGIN_TOP=Top margin on PDF MAIN_PDF_MARGIN_BOTTOM=Bottom margin on PDF -NothingToSetup=There is no specific setup to do for this module. +NothingToSetup=There is no specific setup required for this module. SetToYesIfGroupIsComputationOfOtherGroups=Set this to yes if this group is a computation of other groups EnterCalculationRuleIfPreviousFieldIsYes=Enter calculation rule if previous field was set to Yes (For example 'CODEGRP1+CODEGRP2') SeveralLangugeVariatFound=Several language variants found COMPANY_AQUARIUM_REMOVE_SPECIAL=Remove special characters COMPANY_AQUARIUM_CLEAN_REGEX=Regex filter to clean value (COMPANY_AQUARIUM_CLEAN_REGEX) GDPRContact=Data Protection Officer (DPO, Data Privacy or GDPR contact) -GDPRContactDesc=If you store data about European companies/citizen, you can store the contact who is responsible for the General Data Protection Regulation here +GDPRContactDesc=If you store data about European companies/citizens, you can name the contact who is responsible for the General Data Protection Regulation here HelpOnTooltip=Help text to show on tooltip -HelpOnTooltipDesc=Put text or a translation key here for the text to show on a tooltip when this field appears in a form -YouCanDeleteFileOnServerWith=You can delete this file on server with Command Line:
%s +HelpOnTooltipDesc=Put text or a translation key here for the text to show in a tooltip when this field appears in a form +YouCanDeleteFileOnServerWith=You can delete this file on the server with Command Line:
%s ChartLoaded=Chart of account loaded SocialNetworkSetup=Setup of module Social Networks EnableFeatureFor=Enable features for %s -VATIsUsedIsOff=Note: The option to use sales Tax or VAT has been set to Off in the menu %s - %s, so Sale tax or Vat used will always be 0 for sales. +VATIsUsedIsOff=Note: The option to use Sales Tax or VAT has been set to Off in the menu %s - %s, so Sales tax or Vat used will always be 0 for sales. SwapSenderAndRecipientOnPDF=Swap sender and recipient address on PDF FeatureSupportedOnTextFieldsOnly=Warning, feature supported on text fields only EmailCollector=Email collector -EmailCollectorDescription=Add a scheduled job and a setup page to scan regularly email boxes (using IMAP protocol) and record emails received into your application, at the right place and/or create some record automatically (like leads). +EmailCollectorDescription=Add a scheduled job and a setup page to scan regularly email boxes (using IMAP protocol) and record emails received into your application, at the right place and/or create some records automatically (like leads). NewEmailCollector=New Email Collector EMailHost=Host of email IMAP server MailboxSourceDirectory=Mailbox source directory @@ -1831,21 +1833,22 @@ CollectNow=Collect now DateLastResult=Date last collect LastResult=Last result EmailCollectorConfirmCollectTitle=Email collect confirmation -EmailCollectorConfirmCollect=Do you want to run the collect for this collector now ? +EmailCollectorConfirmCollect=Do you want to run the collection for this collector now ? NoNewEmailToProcess=No new email (matching filters) to process NothingProcessed=Nothing done -XEmailsDoneYActionsDone=%s emails qualified, %s emails successfuly processed (for %s record/actions done) by collector +XEmailsDoneYActionsDone=%s emails qualified, %s emails successfully processed (for %s record/actions done) by collector RecordEvent=Record email event -CreateLeadAndThirdParty=Create lead (and thirdparty if necessary) +CreateLeadAndThirdParty=Create lead (and third party if necessary) CodeLastResult=Result code of last collect NbOfEmailsInInbox=Number of email in source directory -LoadThirdPartyFromName=Load thirdparty from name (load only) -LoadThirdPartyFromNameOrCreate=Load thirdparty from name (create if not found) +LoadThirdPartyFromName=Load third party from name (load only) +LoadThirdPartyFromNameOrCreate=Load third party from name (create if not found) WithDolTrackingID=Dolibarr Tracking ID found WithoutDolTrackingID=Dolibarr Tracking ID not found FormatZip=Zip +MainMenuCode=Menu entry code (mainmenu) ##### Resource #### -ResourceSetup=Configuration du module Resource +ResourceSetup=Configuration of Resource module UseSearchToSelectResource=Use a search form to choose a resource (rather than a drop-down list). DisabledResourceLinkUser=Disable feature to link a resource to users DisabledResourceLinkContact=Disable feature to link a resource to contacts diff --git a/htdocs/langs/en_US/agenda.lang b/htdocs/langs/en_US/agenda.lang index cd39a43abe8..119f3fb20f8 100644 --- a/htdocs/langs/en_US/agenda.lang +++ b/htdocs/langs/en_US/agenda.lang @@ -31,8 +31,8 @@ ViewWeek=Week view ViewPerUser=Per user view ViewPerType=Per type view AutoActions= Automatic filling -AgendaAutoActionDesc= Here you can define events which you want Dolibarr to create automatically in Agenda. If nothing is checked, only manual actions will be included in logs and displayed in Agenda. Automatic tracking of business actions done on objects (validation, status change) will not be saved. -AgendaSetupOtherDesc= This page provides options to allow exports of your Dolibarr events into an external calendar (thunderbird, google calendar, ...) +AgendaAutoActionDesc= Here you may define events which you want Dolibarr to create automatically in Agenda. If nothing is checked, only manual actions will be included in logs and displayed in Agenda. Automatic tracking of business actions done on objects (validation, status change) will not be saved. +AgendaSetupOtherDesc= This page provides options to allow the export of your Dolibarr events into an external calendar (Thunderbird, Google Calendar etc...) AgendaExtSitesDesc=This page allows to declare external sources of calendars to see their events into Dolibarr agenda. ActionsEvents=Events for which Dolibarr will create an action in agenda automatically EventRemindersByEmailNotEnabled=Event reminders by email was not enabled into %s module setup. @@ -60,6 +60,7 @@ MemberSubscriptionDeletedInDolibarr=Subscription %s for member %s deleted ShipmentValidatedInDolibarr=Shipment %s validated ShipmentClassifyClosedInDolibarr=Shipment %s classified billed ShipmentUnClassifyCloseddInDolibarr=Shipment %s classified reopened +ShipmentBackToDraftInDolibarr=Shipment %s go back to draft status ShipmentDeletedInDolibarr=Shipment %s deleted OrderCreatedInDolibarr=Order %s created OrderValidatedInDolibarr=Order %s validated @@ -69,15 +70,15 @@ OrderBilledInDolibarr=Order %s classified billed OrderApprovedInDolibarr=Order %s approved OrderRefusedInDolibarr=Order %s refused OrderBackToDraftInDolibarr=Order %s go back to draft status -ProposalSentByEMail=Commercial proposal %s sent by EMail -ContractSentByEMail=Contract %s sent by EMail -OrderSentByEMail=Customer order %s sent by EMail -InvoiceSentByEMail=Customer invoice %s sent by EMail -SupplierOrderSentByEMail=Supplier order %s sent by EMail -SupplierInvoiceSentByEMail=Supplier invoice %s sent by EMail -ShippingSentByEMail=Shipment %s sent by EMail +ProposalSentByEMail=Commercial proposal %s sent by email +ContractSentByEMail=Contract %s sent by email +OrderSentByEMail=Customer order %s sent by email +InvoiceSentByEMail=Customer invoice %s sent by email +SupplierOrderSentByEMail=Vendor order %s sent by email +SupplierInvoiceSentByEMail=Vendor invoice %s sent by email +ShippingSentByEMail=Shipment %s sent by email ShippingValidated= Shipment %s validated -InterventionSentByEMail=Intervention %s sent by EMail +InterventionSentByEMail=Intervention %s sent by email ProposalDeleted=Proposal deleted OrderDeleted=Order deleted InvoiceDeleted=Invoice deleted @@ -92,6 +93,9 @@ EXPENSE_REPORT_REFUSEDInDolibarr=Expense report %s refused PROJECT_CREATEInDolibarr=Project %s created PROJECT_MODIFYInDolibarr=Project %s modified PROJECT_DELETEInDolibarr=Project %s deleted +TICKET_CREATEInDolibarr=Ticket %s created +TICKET_MODIFYInDolibarr=Ticket %s modified +TICKET_DELETEInDolibarr=Ticket %s deleted ##### End agenda events ##### AgendaModelModule=Document templates for event DateActionStart=Start date diff --git a/htdocs/langs/en_US/assets.lang b/htdocs/langs/en_US/assets.lang index b780fb6fcba..6fb40755fdb 100644 --- a/htdocs/langs/en_US/assets.lang +++ b/htdocs/langs/en_US/assets.lang @@ -22,7 +22,7 @@ AccountancyCodeAsset = Accounting code (asset) AccountancyCodeDepreciationAsset = Accounting code (depreciation asset account) AccountancyCodeDepreciationExpense = Accounting code (depreciation expense account) NewAssetType=New asset type -AssetsTypeSetup=Assets type setup +AssetsTypeSetup=Asset type setup AssetTypeModified=Asset type modified AssetType=Asset type AssetsLines=Assets @@ -42,7 +42,7 @@ ModuleAssetsDesc = Assets description AssetsSetup = Assets setup Settings = Settings AssetsSetupPage = Assets setup page -ExtraFieldsAssetsType = Complementary attributes (Assets type) +ExtraFieldsAssetsType = Complementary attributes (Asset type) AssetsType=Asset type AssetsTypeId=Asset type id AssetsTypeLabel=Asset type label diff --git a/htdocs/langs/en_US/banks.lang b/htdocs/langs/en_US/banks.lang index 5bc061f31f3..84f011ea35e 100644 --- a/htdocs/langs/en_US/banks.lang +++ b/htdocs/langs/en_US/banks.lang @@ -7,7 +7,7 @@ BankName=Bank name FinancialAccount=Account BankAccount=Bank account BankAccounts=Bank accounts -BankAccountsAndGateways=Bank | Gateways +BankAccountsAndGateways=Bank accounts | Gateways ShowAccount=Show Account AccountRef=Financial account ref AccountLabel=Financial account label @@ -30,7 +30,7 @@ AllTime=From start Reconciliation=Reconciliation RIB=Bank Account Number IBAN=IBAN number -BIC=BIC/SWIFT number +BIC=BIC/SWIFT code SwiftValid=BIC/SWIFT valid SwiftVNotalid=BIC/SWIFT not valid IbanValid=BAN valid @@ -42,11 +42,11 @@ AccountStatementShort=Statement AccountStatements=Account statements LastAccountStatements=Last account statements IOMonthlyReporting=Monthly reporting -BankAccountDomiciliation=Account address +BankAccountDomiciliation=Bank address BankAccountCountry=Account country BankAccountOwner=Account owner name BankAccountOwnerAddress=Account owner address -RIBControlError=Integrity check of values fails. This means the information for this account number is incomplete or incorrect (check country, numbers and IBAN). +RIBControlError=Integrity check of values failed. This means the information for this account number is not complete or is incorrect (check country, numbers and IBAN). CreateAccount=Create account NewBankAccount=New account NewFinancialAccount=New financial account @@ -98,14 +98,14 @@ BankLineConciliated=Entry reconciled Reconciled=Reconciled NotReconciled=Not reconciled CustomerInvoicePayment=Customer payment -SupplierInvoicePayment=Supplier payment +SupplierInvoicePayment=Vendor payment SubscriptionPayment=Subscription payment WithdrawalPayment=Withdrawal payment SocialContributionPayment=Social/fiscal tax payment BankTransfer=Bank transfer BankTransfers=Bank transfers MenuBankInternalTransfer=Internal transfer -TransferDesc=Transfer from one account to another one, Dolibarr will write two records (a debit in source account and a credit in target account). The same amount (except sign), label and date will be used for this transaction) +TransferDesc=Transfer from one account to another, Dolibarr will write two records (a debit in source account and a credit in target account). The same amount (except sign), label and date will be used for this transaction) TransferFrom=From TransferTo=To TransferFromToDone=A transfer from %s to %s of %s %s has been recorded. @@ -136,7 +136,7 @@ BankTransactionLine=Bank entry AllAccounts=All bank and cash accounts BackToAccount=Back to account ShowAllAccounts=Show for all accounts -FutureTransaction=Transaction in future. No way to reconcile. +FutureTransaction=Future transaction. Unable to reconcile. SelectChequeTransactionAndGenerate=Select/filter checks to include in the check deposit receipt and click on "Create". InputReceiptNumber=Choose the bank statement related with the conciliation. Use a sortable numeric value: YYYYMM or YYYYMMDD EventualyAddCategory=Eventually, specify a category in which to classify the records @@ -164,4 +164,4 @@ AddVariousPayment=Add miscellaneous payments SEPAMandate=SEPA mandate YourSEPAMandate=Your SEPA mandate FindYourSEPAMandate=This is your SEPA mandate to authorize our company to make direct debit order to your bank. Return it signed (scan of the signed document) or send it by mail to -AutoReportLastAccountStatement=Automaticaly fill the field 'numero of bank statement' with last statement numero when making reconciliation +AutoReportLastAccountStatement=Automatically fill the field 'number of bank statement' with last statement number when making reconciliation diff --git a/htdocs/langs/en_US/bills.lang b/htdocs/langs/en_US/bills.lang index ed988d580e2..1d870ced25b 100644 --- a/htdocs/langs/en_US/bills.lang +++ b/htdocs/langs/en_US/bills.lang @@ -3,14 +3,14 @@ Bill=Invoice Bills=Invoices BillsCustomers=Customer invoices BillsCustomer=Customer invoice -BillsSuppliers=Supplier invoices +BillsSuppliers=Vendor invoices BillsCustomersUnpaid=Unpaid customer invoices BillsCustomersUnpaidForCompany=Unpaid customer invoices for %s -BillsSuppliersUnpaid=Unpaid supplier invoices -BillsSuppliersUnpaidForCompany=Unpaid supplier invoices for %s +BillsSuppliersUnpaid=Unpaid vendor invoices +BillsSuppliersUnpaidForCompany=Unpaid vendors invoices for %s BillsLate=Late payments BillsStatistics=Customers invoices statistics -BillsStatisticsSuppliers=Suppliers invoices statistics +BillsStatisticsSuppliers=Vendors invoices statistics DisabledBecauseDispatchedInBookkeeping=Disabled because invoice was dispatched into bookkeeping DisabledBecauseNotLastInvoice=Disabled because invoice is not erasable. Some invoices were recorded after this one and it will create holes in the counter. DisabledBecauseNotErasable=Disabled because cannot be erased @@ -28,7 +28,7 @@ InvoiceReplacementAsk=Replacement invoice for invoice InvoiceReplacementDesc=Replacement invoice is used to cancel and completely replace an invoice with no payment already received.

Note: Only invoices with no payment on it can be replaced. If the invoice you replace is not yet closed, it will be automatically closed to 'abandoned'. InvoiceAvoir=Credit note InvoiceAvoirAsk=Credit note to correct invoice -InvoiceAvoirDesc=The credit note is a negative invoice used to correct the fact that an invoice has an amount that differs from the amount really paid (eg customer paid too much by mistake, or will not pay completely since he returned some products). +InvoiceAvoirDesc=The credit note is a negative invoice used to correct the fact that an invoice shows an amount that differs from the amount actually paid (eg the customer paid too much by mistake, or will not pay the complete amount since some products were returned). invoiceAvoirWithLines=Create Credit Note with lines from the origin invoice invoiceAvoirWithPaymentRestAmount=Create Credit Note with remaining unpaid of origin invoice invoiceAvoirLineWithPaymentRestAmount=Credit Note for remaining unpaid amount @@ -41,7 +41,7 @@ CorrectionInvoice=Correction invoice UsedByInvoice=Used to pay invoice %s ConsumedBy=Consumed by NotConsumed=Not consumed -NoReplacableInvoice=No replacable invoices +NoReplacableInvoice=No replaceable invoices NoInvoiceToCorrect=No invoice to correct InvoiceHasAvoir=Was source of one or several credit notes CardBill=Invoice card @@ -53,9 +53,9 @@ InvoiceLine=Invoice line InvoiceCustomer=Customer invoice CustomerInvoice=Customer invoice CustomersInvoices=Customers invoices -SupplierInvoice=Supplier invoice -SuppliersInvoices=Suppliers invoices -SupplierBill=Supplier invoice +SupplierInvoice=Vendor invoice +SuppliersInvoices=Vendors invoices +SupplierBill=Vendor invoice SupplierBills=suppliers invoices Payment=Payment PaymentBack=Payment back @@ -67,27 +67,27 @@ PaidBack=Paid back DeletePayment=Delete payment ConfirmDeletePayment=Are you sure you want to delete this payment? ConfirmConvertToReduc=Do you want to convert this %s into an absolute discount?
The amount will be saved among all discounts and could be used as a discount for a current or a future invoice for this customer. -ConfirmConvertToReducSupplier=Do you want to convert this %s into an absolute discount?
The amount will be saved among all discounts and could be used as a discount for a current or a future invoice for this supplier. -SupplierPayments=Suppliers payments +ConfirmConvertToReducSupplier=Do you want to convert this %s into an absolute discount?
The amount will be saved among all discounts and could be used as a discount for a current or a future invoice for this vendor. +SupplierPayments=Vendor payments ReceivedPayments=Received payments ReceivedCustomersPayments=Payments received from customers -PayedSuppliersPayments=Payments paid to suppliers +PayedSuppliersPayments=Payments paid to vendors ReceivedCustomersPaymentsToValid=Received customers payments to validate PaymentsReportsForYear=Payments reports for %s PaymentsReports=Payments reports PaymentsAlreadyDone=Payments already done PaymentsBackAlreadyDone=Payments back already done PaymentRule=Payment rule -PaymentMode=Payment type +PaymentMode=Payment Type PaymentTypeDC=Debit/Credit Card PaymentTypePP=PayPal -IdPaymentMode=Payment type (id) -CodePaymentMode=Payment type (code) -LabelPaymentMode=Payment type (label) -PaymentModeShort=Payment type -PaymentTerm=Payment term -PaymentConditions=Payment terms -PaymentConditionsShort=Payment terms +IdPaymentMode=Payment Type (id) +CodePaymentMode=Payment Type (code) +LabelPaymentMode=Payment Type (label) +PaymentModeShort=Payment Type +PaymentTerm=Payment Term +PaymentConditions=Payment Terms +PaymentConditionsShort=Payment Terms PaymentAmount=Payment amount ValidatePayment=Validate payment PaymentHigherThanReminderToPay=Payment higher than reminder to pay @@ -104,9 +104,9 @@ AddBill=Create invoice or credit note AddToDraftInvoices=Add to draft invoice DeleteBill=Delete invoice SearchACustomerInvoice=Search for a customer invoice -SearchASupplierInvoice=Search for a supplier invoice +SearchASupplierInvoice=Search for a vendor invoice CancelBill=Cancel an invoice -SendRemindByMail=Send reminder by EMail +SendRemindByMail=Send reminder by email DoPayment=Enter payment DoPaymentBack=Enter refund ConvertToReduc=Mark as credit available @@ -143,8 +143,8 @@ BillShortStatusClosedUnpaid=Closed BillShortStatusClosedPaidPartially=Paid (partially) PaymentStatusToValidShort=To validate ErrorVATIntraNotConfigured=Intra-Community VAT number not yet defined -ErrorNoPaiementModeConfigured=No default payment mode defined. Go to Invoice module setup to fix this. -ErrorCreateBankAccount=Create a bank account, then go to Setup panel of Invoice module to define payment modes +ErrorNoPaiementModeConfigured=No default payment type defined. Go to Invoice module setup to fix this. +ErrorCreateBankAccount=Create a bank account, then go to Setup panel of Invoice module to define payment types ErrorBillNotFound=Invoice %s does not exist ErrorInvoiceAlreadyReplaced=Error, you tried to validate an invoice to replace invoice %s. But this one has already been replaced by invoice %s. ErrorDiscountAlreadyUsed=Error, discount already used @@ -163,15 +163,15 @@ NewBill=New invoice LastBills=Latest %s invoices LatestTemplateInvoices=Latest %s template invoices LatestCustomerTemplateInvoices=Latest %s customer template invoices -LatestSupplierTemplateInvoices=Latest %s supplier template invoices +LatestSupplierTemplateInvoices=Latest %s vendor template invoices LastCustomersBills=Latest %s customer invoices -LastSuppliersBills=Latest %s supplier invoices +LastSuppliersBills=Latest %s vendor invoices AllBills=All invoices AllCustomerTemplateInvoices=All template invoices OtherBills=Other invoices DraftBills=Draft invoices CustomersDraftInvoices=Customer draft invoices -SuppliersDraftInvoices=Supplier draft invoices +SuppliersDraftInvoices=Vendor draft invoices Unpaid=Unpaid ConfirmDeleteBill=Are you sure you want to delete this invoice? ConfirmValidateBill=Are you sure you want to validate this invoice with reference %s? @@ -180,7 +180,7 @@ ConfirmClassifyPaidBill=Are you sure you want to change invoice %s to sta ConfirmCancelBill=Are you sure you want to cancel invoice %s? ConfirmCancelBillQuestion=Why do you want to classify this invoice 'abandoned'? ConfirmClassifyPaidPartially=Are you sure you want to change invoice %s to status paid? -ConfirmClassifyPaidPartiallyQuestion=This invoice has not been paid completely. What is the reason/s for you closing this invoice? +ConfirmClassifyPaidPartiallyQuestion=This invoice has not been paid completely. What is the reason for closing this invoice? ConfirmClassifyPaidPartiallyReasonAvoir=Remaining unpaid (%s %s) is a discount granted because payment was made before term. I regularize the VAT with a credit note. ConfirmClassifyPaidPartiallyReasonDiscount=Remaining unpaid (%s %s) is a discount granted because payment was made before term. ConfirmClassifyPaidPartiallyReasonDiscountNoVat=Remaining unpaid (%s %s) is a discount granted because payment was made before term. I accept to lose the VAT on this discount. @@ -247,11 +247,11 @@ DateInvoice=Invoice date DatePointOfTax=Point of tax NoInvoice=No invoice ClassifyBill=Classify invoice -SupplierBillsToPay=Unpaid supplier invoices +SupplierBillsToPay=Unpaid vendor invoices CustomerBillsUnpaid=Unpaid customer invoices NonPercuRecuperable=Non-recoverable -SetConditions=Set payment terms -SetMode=Set payment mode +SetConditions=Set Payment Terms +SetMode=Set Payment Type SetRevenuStamp=Set revenue stamp Billed=Billed RecurringInvoices=Recurring invoices @@ -268,9 +268,9 @@ ExportDataset_invoice_1=Customer invoices and invoice details ExportDataset_invoice_2=Customer invoices and payments ProformaBill=Proforma Bill: Reduction=Reduction -ReductionShort=Reduc. +ReductionShort=Disc. Reductions=Reductions -ReductionsShort=Reduc. +ReductionsShort=Disc. Discounts=Discounts AddDiscount=Create discount AddRelativeDiscount=Create relative discount @@ -323,17 +323,17 @@ InvoiceNotChecked=No invoice selected CloneInvoice=Clone invoice ConfirmCloneInvoice=Are you sure you want to clone this invoice %s? DisabledBecauseReplacedInvoice=Action disabled because invoice has been replaced -DescTaxAndDividendsArea=This area presents a summary of all payments made for special expenses. Only records with payment during the fixed year are included here. +DescTaxAndDividendsArea=This area presents a summary of all payments made for special expenses. Only records with payments during the fixed year are included here. NbOfPayments=No. of payments SplitDiscount=Split discount in two -ConfirmSplitDiscount=Are you sure you want to split this discount of %s %s into 2 smaller discounts? +ConfirmSplitDiscount=Are you sure you want to split this discount of %s %s into two smaller discounts? TypeAmountOfEachNewDiscount=Input amount for each of two parts: -TotalOfTwoDiscountMustEqualsOriginal=Total of two new discounts must be equal to original discount amount. +TotalOfTwoDiscountMustEqualsOriginal=The total of the two new discounts must be equal to the original discount amount. ConfirmRemoveDiscount=Are you sure you want to remove this discount? RelatedBill=Related invoice RelatedBills=Related invoices RelatedCustomerInvoices=Related customer invoices -RelatedSupplierInvoices=Related supplier invoices +RelatedSupplierInvoices=Related vendor invoices LatestRelatedBill=Latest related invoice WarningBillExist=Warning, one or more invoices already exist MergingPDFTool=Merging PDF tool @@ -357,7 +357,7 @@ NextDateToExecution=Date for next invoice generation NextDateToExecutionShort=Date next gen. DateLastGeneration=Date of latest generation DateLastGenerationShort=Date latest gen. -MaxPeriodNumber=Max number of invoice generation +MaxPeriodNumber=Max. number of invoice generation NbOfGenerationDone=Number of invoice generation already done NbOfGenerationDoneShort=Number of generation done MaxGenerationReached=Maximum number of generations reached @@ -394,7 +394,7 @@ PaymentConditionShort14D=14 days PaymentCondition14D=14 days PaymentConditionShort14DENDMONTH=14 days of month-end PaymentCondition14DENDMONTH=Within 14 days following the end of the month -FixAmount=Fix amount +FixAmount=Fixed amount VarAmount=Variable amount (%% tot.) VarAmountOneLine=Variable amount (%% tot.) - 1 line with label '%s' # PaymentType @@ -418,14 +418,14 @@ PaymentTypeFAC=Factor PaymentTypeShortFAC=Factor BankDetails=Bank details BankCode=Bank code -DeskCode=Office code +DeskCode=Branch code BankAccountNumber=Account number -BankAccountNumberKey=Check digits -Residence=Direct debit -IBANNumber=IBAN complete account number +BankAccountNumberKey=Checksum +Residence=Address +IBANNumber=IBAN account number IBAN=IBAN BIC=BIC/SWIFT -BICNumber=BIC/SWIFT number +BICNumber=BIC/SWIFT code ExtraInfos=Extra infos RegulatedOn=Regulated on ChequeNumber=Check N° @@ -439,11 +439,11 @@ PhoneNumber=Tel FullPhoneNumber=Telephone TeleFax=Fax PrettyLittleSentence=Accept the amount of payments due by checks issued in my name as a Member of an accounting association approved by the Fiscal Administration. -IntracommunityVATNumber=Intracommunity number of VAT -PaymentByChequeOrderedTo=Check payment (including tax) are payable to %s send to -PaymentByChequeOrderedToShort=Check payment (including tax) are payable to +IntracommunityVATNumber=Intra-Community VAT ID +PaymentByChequeOrderedTo=Check payments (including tax) are payable to %s, send to +PaymentByChequeOrderedToShort=Check payments (incl. tax) are payable to SendTo=sent to -PaymentByTransferOnThisBankAccount=Payment by transfer on the following bank account +PaymentByTransferOnThisBankAccount=Payment by transfer to the following bank account VATIsNotUsedForInvoice=* Non applicable VAT art-293B of CGI LawApplicationPart1=By application of the law 80.335 of 12/05/80 LawApplicationPart2=the goods remain the property of @@ -465,7 +465,7 @@ Cheques=Checks DepositId=Id deposit NbCheque=Number of checks CreditNoteConvertedIntoDiscount=This %s has been converted into %s -UsBillingContactAsIncoiveRecipientIfExist=Use contact/address with type 'billing contact' instead of third party address as recipient for invoices +UsBillingContactAsIncoiveRecipientIfExist=Use contact/address with type 'billing contact' instead of third-party address as recipient for invoices ShowUnpaidAll=Show all unpaid invoices ShowUnpaidLateOnly=Show late unpaid invoices only PaymentInvoiceRef=Payment invoice %s @@ -478,17 +478,17 @@ CantRemovePaymentWithOneInvoicePaid=Can't remove payment since there is at least ExpectedToPay=Expected payment CantRemoveConciliatedPayment=Can't remove reconciled payment PayedByThisPayment=Paid by this payment -ClosePaidInvoicesAutomatically=Classify "Paid" all standard, down payment or replacement invoices paid entirely. +ClosePaidInvoicesAutomatically=Classify "Paid" all standard, down-payment or replacement invoices paid entirely. ClosePaidCreditNotesAutomatically=Classify "Paid" all credit notes entirely paid back. ClosePaidContributionsAutomatically=Classify "Paid" all social or fiscal contributions paid entirely. -AllCompletelyPayedInvoiceWillBeClosed=All invoice with no remainder to pay will be automatically closed with status "Paid". +AllCompletelyPayedInvoiceWillBeClosed=All invoices with no remainder to pay will be automatically closed with status "Paid". ToMakePayment=Pay ToMakePaymentBack=Pay back ListOfYourUnpaidInvoices=List of unpaid invoices NoteListOfYourUnpaidInvoices=Note: This list contains only invoices for third parties you are linked to as a sale representative. RevenueStamp=Revenue stamp -YouMustCreateInvoiceFromThird=This option is only available when creating invoices from tab "customer" of third party -YouMustCreateInvoiceFromSupplierThird=This option is only available when creating invoices from tab "supplier" of third party +YouMustCreateInvoiceFromThird=This option is only available when creating an invoice from tab "Customer" of third party +YouMustCreateInvoiceFromSupplierThird=This option is only available when creating an invoice from tab "Vendor" of third party YouMustCreateStandardInvoiceFirstDesc=You have to create a standard invoice first and convert it to "template" to create a new template invoice PDFCrabeDescription=Invoice PDF template Crabe. A complete invoice template (recommended Template) PDFSpongeDescription=Invoice PDF template Sponge. A complete invoice template @@ -502,10 +502,10 @@ TypeContact_facture_internal_SALESREPFOLL=Representative following-up customer i TypeContact_facture_external_BILLING=Customer invoice contact TypeContact_facture_external_SHIPPING=Customer shipping contact TypeContact_facture_external_SERVICE=Customer service contact -TypeContact_invoice_supplier_internal_SALESREPFOLL=Representative following-up supplier invoice -TypeContact_invoice_supplier_external_BILLING=Supplier invoice contact -TypeContact_invoice_supplier_external_SHIPPING=Supplier shipping contact -TypeContact_invoice_supplier_external_SERVICE=Supplier service contact +TypeContact_invoice_supplier_internal_SALESREPFOLL=Representative following-up vendor invoice +TypeContact_invoice_supplier_external_BILLING=Vendor invoice contact +TypeContact_invoice_supplier_external_SHIPPING=Vendor shipping contact +TypeContact_invoice_supplier_external_SERVICE=Vendor service contact # Situation invoices InvoiceFirstSituationAsk=First situation invoice InvoiceFirstSituationDesc=The situation invoices are tied to situations related to a progression, for example the progression of a construction. Each situation is tied to an invoice. @@ -530,13 +530,13 @@ InvoiceSituationLast=Final and general invoice PDFCrevetteSituationNumber=Situation N°%s PDFCrevetteSituationInvoiceLineDecompte=Situation invoice - COUNT PDFCrevetteSituationInvoiceTitle=Situation invoice -PDFCrevetteSituationInvoiceLine=Situation N°%s : Inv. N°%s on %s +PDFCrevetteSituationInvoiceLine=Situation N°%s: Inv. N°%s on %s TotalSituationInvoice=Total situation invoiceLineProgressError=Invoice line progress can't be greater than or equal to the next invoice line -updatePriceNextInvoiceErrorUpdateline=Error : update price on invoice line : %s +updatePriceNextInvoiceErrorUpdateline=Error: update price on invoice line: %s ToCreateARecurringInvoice=To create a recurring invoice for this contract, first create this draft invoice, then convert it into an invoice template and define the frequency for generation of future invoices. ToCreateARecurringInvoiceGene=To generate future invoices regularly and manually, just go on menu %s - %s - %s. -ToCreateARecurringInvoiceGeneAuto=If you need to have such invoices generated automatically, ask your administrator to enable and setup module %s. Note that both method (manual and automatic) can be used together with no risk of duplication. +ToCreateARecurringInvoiceGeneAuto=If you need to have such invoices generated automatically, ask your administrator to enable and setup module %s. Note that both methods (manual and automatic) can be used together with no risk of duplication. DeleteRepeatableInvoice=Delete template invoice ConfirmDeleteRepeatableInvoice=Are your sure you want to delete the template invoice? CreateOneBillByThird=Create one invoice per third party (otherwise, one invoice per order) diff --git a/htdocs/langs/en_US/bookmarks.lang b/htdocs/langs/en_US/bookmarks.lang index 9d2003f34d3..5330ab6e87c 100644 --- a/htdocs/langs/en_US/bookmarks.lang +++ b/htdocs/langs/en_US/bookmarks.lang @@ -6,15 +6,15 @@ ListOfBookmarks=List of bookmarks EditBookmarks=List/edit bookmarks NewBookmark=New bookmark ShowBookmark=Show bookmark -OpenANewWindow=Open a new window -ReplaceWindow=Replace current window -BookmarkTargetNewWindowShort=New window -BookmarkTargetReplaceWindowShort=Current window -BookmarkTitle=Bookmark title +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 title for the bookmark -UseAnExternalHttpLinkOrRelativeDolibarrLink=Use an external http URL or a relative Dolibarr URL -ChooseIfANewWindowMustBeOpenedOnClickOnBookmark=Choose if linked page must open in new window or not +SetHereATitleForLink=Set a name for the bookmark +UseAnExternalHttpLinkOrRelativeDolibarrLink=Use an external/absolute link (https://URL) or an internal/relative link (/DOLIBARR_ROOT/htdocs/...) +ChooseIfANewWindowMustBeOpenedOnClickOnBookmark=Choose if the linked page should open in the current tab or a new tab BookmarksManagement=Bookmarks management diff --git a/htdocs/langs/en_US/boxes.lang b/htdocs/langs/en_US/boxes.lang index 8a519879ac3..31e3dfbbe08 100644 --- a/htdocs/langs/en_US/boxes.lang +++ b/htdocs/langs/en_US/boxes.lang @@ -4,10 +4,10 @@ BoxLastRssInfos=Rss information BoxLastProducts=Latest %s products/services BoxProductsAlertStock=Stock alerts for products BoxLastProductsInContract=Latest %s contracted products/services -BoxLastSupplierBills=Latest supplier invoices +BoxLastSupplierBills=Latest vendor invoices BoxLastCustomerBills=Latest customer invoices BoxOldestUnpaidCustomerBills=Oldest unpaid customer invoices -BoxOldestUnpaidSupplierBills=Oldest unpaid supplier invoices +BoxOldestUnpaidSupplierBills=Oldest unpaid vendor invoices BoxLastProposals=Latest commercial proposals BoxLastProspects=Latest modified prospects BoxLastCustomers=Latest modified customers @@ -20,22 +20,22 @@ BoxLastMembers=Latest members BoxFicheInter=Latest interventions BoxCurrentAccounts=Open accounts balance BoxTitleLastRssInfos=Latest %s news from %s -BoxTitleLastProducts=Products/Services: latest %s modified +BoxTitleLastProducts=Products/Services: last %s modified BoxTitleProductsAlertStock=Products: stock alert BoxTitleLastSuppliers=Latest %s recorded suppliers -BoxTitleLastModifiedSuppliers=Latest %s modified vendors -BoxTitleLastModifiedCustomers=Latest %s modified customers +BoxTitleLastModifiedSuppliers=Vendors: last %s modified +BoxTitleLastModifiedCustomers=Customers: last %s modified BoxTitleLastCustomersOrProspects=Latest %s customers or prospects -BoxTitleLastCustomerBills=Latest %s modified customer invoices -BoxTitleLastSupplierBills=Latest %s modified vendor invoices -BoxTitleLastModifiedProspects=Latest %s modified prospects -BoxTitleLastModifiedMembers=Latest %s modified members +BoxTitleLastCustomerBills=Latest %s customer invoices +BoxTitleLastSupplierBills=Latest %s vendor invoices +BoxTitleLastModifiedProspects=Prospects: last %s modified +BoxTitleLastModifiedMembers=Latest %s members BoxTitleLastFicheInter=Latest %s modified interventions BoxTitleOldestUnpaidCustomerBills=Customer Invoices: oldest %s unpaid -BoxTitleOldestUnpaidSupplierBills=Supplier Invoices: oldest %s unpaid +BoxTitleOldestUnpaidSupplierBills=Vendor Invoices: oldest %s unpaid BoxTitleCurrentAccounts=Open Accounts: balances -BoxTitleLastModifiedContacts=Contacts/Addresses: latest %s modified -BoxMyLastBookmarks=Bookmarks: latest %s modified +BoxTitleLastModifiedContacts=Contacts/Addresses: last %s modified +BoxMyLastBookmarks=Bookmarks: last %s BoxOldestExpiredServices=Oldest active expired services BoxLastExpiredServices=Latest %s oldest contacts with active expired services BoxTitleLastActionsToDo=Latest %s actions to do @@ -56,31 +56,31 @@ NoRecordedOrders=No recorded customer orders NoRecordedProposals=No recorded proposals NoRecordedInvoices=No recorded customer invoices NoUnpaidCustomerBills=No unpaid customer invoices -NoUnpaidSupplierBills=No unpaid supplier invoices -NoModifiedSupplierBills=No recorded supplier invoices +NoUnpaidSupplierBills=No unpaid vendor invoices +NoModifiedSupplierBills=No recorded vendor invoices NoRecordedProducts=No recorded products/services NoRecordedProspects=No recorded prospects NoContractedProducts=No products/services contracted NoRecordedContracts=No recorded contracts NoRecordedInterventions=No recorded interventions -BoxLatestSupplierOrders=Latest supplier orders -NoSupplierOrder=No recorded supplier order +BoxLatestSupplierOrders=Latest purchase orders +NoSupplierOrder=No recorded purchase order BoxCustomersInvoicesPerMonth=Customer Invoices per month -BoxSuppliersInvoicesPerMonth=Supplier Invoices per month +BoxSuppliersInvoicesPerMonth=Vendor Invoices per month BoxCustomersOrdersPerMonth=Customer Orders per month -BoxSuppliersOrdersPerMonth=Supplier Orders per month +BoxSuppliersOrdersPerMonth=Vendor Orders per month BoxProposalsPerMonth=Proposals per month NoTooLowStockProducts=No products are under the low stock limit BoxProductDistribution=Products/Services Distribution BoxProductDistributionFor=Distribution of %s by %s -BoxTitleLastModifiedSupplierBills=Latest %s modified vendors invoices -BoxTitleLatestModifiedSupplierOrders=Last %s modified purchase orders -BoxTitleLastModifiedCustomerBills=Latest %s modified customers invoices -BoxTitleLastModifiedCustomerOrders=Latest %s modified customer orders +BoxTitleLastModifiedSupplierBills=Vendor Invoices: last %s modified +BoxTitleLatestModifiedSupplierOrders=Vendor Orders: last %s modified +BoxTitleLastModifiedCustomerBills=Customer Invoices: last %s modified +BoxTitleLastModifiedCustomerOrders=Customer Orders: last %s modified BoxTitleLastModifiedPropals=Latest %s modified proposals ForCustomersInvoices=Customers invoices ForCustomersOrders=Customers orders ForProposals=Proposals LastXMonthRolling=The latest %s month rolling ChooseBoxToAdd=Add widget to your dashboard -BoxAdded=Widget was added in your dashboard +BoxAdded=Widget was added in your dashboard \ No newline at end of file diff --git a/htdocs/langs/en_US/cashdesk.lang b/htdocs/langs/en_US/cashdesk.lang index 353c4ee93ab..442b5f9b907 100644 --- a/htdocs/langs/en_US/cashdesk.lang +++ b/htdocs/langs/en_US/cashdesk.lang @@ -32,7 +32,7 @@ DeleteArticle=Click to remove this article FilterRefOrLabelOrBC=Search (Ref/Label) UserNeedPermissionToEditStockToUsePos=You ask to decrease stock on invoice creation, so user that uses POS needs to have permission to edit stock. DolibarrReceiptPrinter=Dolibarr Receipt Printer -PointOfSale=Point of sales +PointOfSale=Point of Sale PointOfSaleShort=POS CloseBill=Close Bill Floors=Floors diff --git a/htdocs/langs/en_US/categories.lang b/htdocs/langs/en_US/categories.lang index cef3eaa2815..eb34e302cad 100644 --- a/htdocs/langs/en_US/categories.lang +++ b/htdocs/langs/en_US/categories.lang @@ -10,7 +10,7 @@ modify=modify Classify=Classify CategoriesArea=Tags/Categories area ProductsCategoriesArea=Products/Services tags/categories area -SuppliersCategoriesArea=Suppliers tags/categories area +SuppliersCategoriesArea=Vendors tags/categories area CustomersCategoriesArea=Customers tags/categories area MembersCategoriesArea=Members tags/categories area ContactsCategoriesArea=Contacts tags/categories area @@ -32,7 +32,7 @@ WasAddedSuccessfully=%s was added successfully. ObjectAlreadyLinkedToCategory=Element is already linked to this tag/category. ProductIsInCategories=Product/service is linked to following tags/categories CompanyIsInCustomersCategories=This third party is linked to following customers/prospects tags/categories -CompanyIsInSuppliersCategories=This third party is linked to following suppliers tags/categories +CompanyIsInSuppliersCategories=This third party is linked to following vendors tags/categories MemberIsInCategories=This member is linked to following members tags/categories ContactIsInCategories=This contact is linked to following contacts tags/categories ProductHasNoCategory=This product/service is not in any tags/categories @@ -48,11 +48,11 @@ ContentsNotVisibleByAllShort=Contents not visible by all DeleteCategory=Delete tag/category ConfirmDeleteCategory=Are you sure you want to delete this tag/category? NoCategoriesDefined=No tag/category defined -SuppliersCategoryShort=Suppliers tag/category +SuppliersCategoryShort=Vendors tag/category CustomersCategoryShort=Customers tag/category ProductsCategoryShort=Products tag/category MembersCategoryShort=Members tag/category -SuppliersCategoriesShort=Suppliers tags/categories +SuppliersCategoriesShort=Vendors tags/categories CustomersCategoriesShort=Customers tags/categories ProspectsCategoriesShort=Prospects tags/categories CustomersProspectsCategoriesShort=Cust./Prosp. tags/categories @@ -63,14 +63,14 @@ AccountsCategoriesShort=Accounts tags/categories ProjectsCategoriesShort=Projects tags/categories UsersCategoriesShort=Users tags/categories ThisCategoryHasNoProduct=This category does not contain any product. -ThisCategoryHasNoSupplier=This category does not contain any supplier. +ThisCategoryHasNoSupplier=This category does not contain any vendor. ThisCategoryHasNoCustomer=This category does not contain any customer. ThisCategoryHasNoMember=This category does not contain any member. ThisCategoryHasNoContact=This category does not contain any contact. ThisCategoryHasNoAccount=This category does not contain any account. ThisCategoryHasNoProject=This category does not contain any project. CategId=Tag/category id -CatSupList=List of supplier tags/categories +CatSupList=List of vendor tags/categories CatCusList=List of customer/prospect tags/categories CatProdList=List of products tags/categories CatMemberList=List of members tags/categories diff --git a/htdocs/langs/en_US/companies.lang b/htdocs/langs/en_US/companies.lang index e5de5614886..a60e2e3adfa 100644 --- a/htdocs/langs/en_US/companies.lang +++ b/htdocs/langs/en_US/companies.lang @@ -20,16 +20,16 @@ IdThirdParty=Id third party IdCompany=Company Id IdContact=Contact Id Contacts=Contacts/Addresses -ThirdPartyContacts=Third party contacts -ThirdPartyContact=Third party contact/address +ThirdPartyContacts=Third-party contacts +ThirdPartyContact=Third-party contact/address Company=Company CompanyName=Company name AliasNames=Alias name (commercial, trademark, ...) AliasNameShort=Alias Name Companies=Companies CountryIsInEEC=Country is inside the European Economic Community -ThirdPartyName=Third Party Name -ThirdPartyEmail=Third party email +ThirdPartyName=Third-Party Name +ThirdPartyEmail=Third-party Email ThirdParty=Third Party ThirdParties=Third Parties ThirdPartyProspects=Prospects @@ -38,9 +38,9 @@ ThirdPartyCustomers=Customers ThirdPartyCustomersStats=Customers ThirdPartyCustomersWithIdProf12=Customers with %s or %s ThirdPartySuppliers=Vendors -ThirdPartyType=Type of company +ThirdPartyType=Third-Party Type Individual=Private individual -ToCreateContactWithSameName=Will create a Third Party and a linked Contact/Address with same information as the Third Party. In most cases, even if your Third Party is a physical person, creating a Third Party alone is enough. +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=Parent company Subsidiaries=Subsidiaries ReportByMonth=Report by month @@ -69,7 +69,7 @@ Chat=Chat PhonePro=Prof. phone PhonePerso=Pers. phone PhoneMobile=Mobile -No_Email=Refuse mass e-mailings +No_Email=Refuse bulk emailings Fax=Fax Zip=Zip Code Town=City @@ -79,9 +79,9 @@ DefaultLang=Language default VATIsUsed=Sales tax used VATIsUsedWhenSelling=This defines if this third party includes a sale tax or not when it makes an invoice to its own customers VATIsNotUsed=Sales tax is not used -CopyAddressFromSoc=Fill address with third party address +CopyAddressFromSoc=Copy address from Third-Party details ThirdpartyNotCustomerNotSupplierSoNoRef=Third party neither customer nor vendor, no available referring objects -ThirdpartyIsNeitherCustomerNorClientSoCannotHaveDiscounts=Third party neither customer nor supplier, discounts are not available +ThirdpartyIsNeitherCustomerNorClientSoCannotHaveDiscounts=Third party neither customer nor vendor, discounts are not available PaymentBankAccount=Payment bank account OverAllProposals=Proposals OverAllOrders=Orders @@ -102,7 +102,7 @@ WrongCustomerCode=Customer code invalid WrongSupplierCode=Vendor code invalid CustomerCodeModel=Customer code model SupplierCodeModel=Vendor code model -Gencod=Bar code +Gencod=Barcode ##### Professional ID ##### ProfId1Short=Prof. id 1 ProfId2Short=Prof. id 2 @@ -258,8 +258,8 @@ ProfId1DZ=RC ProfId2DZ=Art. ProfId3DZ=NIF ProfId4DZ=NIS -VATIntra=Sales Tax/VAT ID -VATIntraShort=Tax ID +VATIntra=Intra-Community VAT ID +VATIntraShort=EU VAT ID VATIntraSyntaxIsValid=Syntax is valid VATReturn=VAT return ProspectCustomer=Prospect / Customer @@ -272,22 +272,22 @@ 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 supplier -HasNoRelativeDiscountFromSupplier=You have no default relative discount from this supplier +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 CompanyHasCreditNote=This customer still has credit notes for %s %s -HasNoAbsoluteDiscountFromSupplier=You have no discount credit available from this supplier -HasAbsoluteDiscountFromSupplier=You have discounts available (credits notes or down payments) for %s %s from this supplier -HasDownPaymentOrCommercialDiscountFromSupplier=You have discounts available (commercial, down payments) for %s %s from this supplier -HasCreditNoteFromSupplier=You have credit notes for %s %s from this supplier +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 CompanyHasNoAbsoluteDiscount=This customer has no discount credit available 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) DiscountNone=None -Supplier=Vendor +Vendor=Vendor AddContact=Create contact AddContactAddress=Create contact/address EditContact=Edit contact @@ -338,16 +338,16 @@ MyContacts=My contacts Capital=Capital CapitalOf=Capital of %s EditCompany=Edit company -ThisUserIsNot=This user is not a prospect, customer or vendor +ThisUserIsNot=This user is not a prospect, customer nor vendor VATIntraCheck=Check -VATIntraCheckDesc=The link %s uses the European VAT checker service (VIES). An external internet access from server is required for this service to work. +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. VATIntraCheckURL=http://ec.europa.eu/taxation_customs/vies/vieshome.do -VATIntraCheckableOnEUSite=Check intra-Community VAT on the European Commission website +VATIntraCheckableOnEUSite=Check the intra-Community VAT ID on the European Commission website VATIntraManualCheck=You can also check manually on the European Commission website %s ErrorVATCheckMS_UNAVAILABLE=Check not possible. Check service is not provided by the member state (%s). -NorProspectNorCustomer=Not prospect, or customer +NorProspectNorCustomer=Not prospect, nor customer JuridicalStatus=Legal Entity Type -Staff=Staff +Staff=Employees ProspectLevelShort=Potential ProspectLevel=Prospect potential ContactPrivate=Private @@ -368,7 +368,7 @@ TE_MEDIUM=Medium company TE_ADMIN=Governmental TE_SMALL=Small company TE_RETAIL=Retailer -TE_WHOLE=Wholetailer +TE_WHOLE=Wholesaler TE_PRIVATE=Private individual TE_OTHER=Other StatusProspect-1=Do not contact @@ -389,11 +389,12 @@ DolibarrLogin=Dolibarr login NoDolibarrAccess=No Dolibarr access ExportDataset_company_1=Third Parties (companies/foundations/physical people) and their properties ExportDataset_company_2=Contacts and their properties -ImportDataset_company_1=Third Parties (companies/foundations/physical people) and their properties -ImportDataset_company_2=Contacts/Addresses and attributes -ImportDataset_company_3=Bank accounts of Third Parties -ImportDataset_company_4=Third Parties - sales representatives (assign sales representatives/users to companies) -PriceLevel=Price level +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 DeliveryAddress=Delivery address AddAddress=Add address SupplierCategory=Vendor category @@ -431,4 +432,4 @@ 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 +NewCustomerSupplierCodeProposed=Customer or Vendor code already used, a new code is suggested diff --git a/htdocs/langs/en_US/compta.lang b/htdocs/langs/en_US/compta.lang index 6ad5e357b35..95fda9d3255 100644 --- a/htdocs/langs/en_US/compta.lang +++ b/htdocs/langs/en_US/compta.lang @@ -11,7 +11,7 @@ FeatureIsSupportedInInOutModeOnly=Feature only available in CREDITS-DEBTS accoun VATReportBuildWithOptionDefinedInModule=Amounts shown here are calculated using rules defined by Tax module setup. LTReportBuildWithOptionDefinedInModule=Amounts shown here are calculated using rules defined by Company setup. Param=Setup -RemainingAmountPayment=Amount payment remaining : +RemainingAmountPayment=Amount payment remaining: Account=Account Accountparent=Parent account Accountsparent=Parent accounts @@ -82,7 +82,7 @@ AccountancyTreasuryArea=Billing and payment area NewPayment=New payment Payments=Payments PaymentCustomerInvoice=Customer invoice payment -PaymentSupplierInvoice=Vendor invoice payment +PaymentSupplierInvoice=vendor invoice payment PaymentSocialContribution=Social/fiscal tax payment PaymentVat=VAT payment ListPayment=List of payments @@ -113,7 +113,7 @@ ShowVatPayment=Show VAT payment TotalToPay=Total to pay BalanceVisibilityDependsOnSortAndFilters=Balance is visible in this list only if table is sorted ascending on %s and filtered for 1 bank account CustomerAccountancyCode=Customer accounting code -SupplierAccountancyCode=Vendor accounting code +SupplierAccountancyCode=vendor accounting code CustomerAccountancyCodeShort=Cust. account. code SupplierAccountancyCodeShort=Sup. account. code AccountNumber=Account number @@ -220,7 +220,7 @@ LinkedOrder=Link to order Mode1=Method 1 Mode2=Method 2 CalculationRuleDesc=To calculate total VAT, there is two methods:
Method 1 is rounding vat on each line, then summing them.
Method 2 is summing all vat on each line, then rounding result.
Final result may differs from few cents. Default mode is mode %s. -CalculationRuleDescSupplier=According to supplier, choose appropriate method to apply same calculation rule and get same result expected by your supplier. +CalculationRuleDescSupplier=According to vendor, choose appropriate method to apply same calculation rule and get same result expected by your vendor. TurnoverPerProductInCommitmentAccountingNotRelevant=The report of Turnover collected per product is not available. This report is only available for turnover invoiced. TurnoverPerSaleTaxRateInCommitmentAccountingNotRelevant=The report of Turnover collected per sale tax rate is not available. This report is only available for turnover invoiced. CalculationMode=Calculation mode @@ -231,7 +231,7 @@ ACCOUNTING_VAT_PAY_ACCOUNT=Accounting account by default for paying VAT ACCOUNTING_ACCOUNT_CUSTOMER=Accounting account used for customer third parties ACCOUNTING_ACCOUNT_CUSTOMER_Desc=The dedicated accounting account defined on third party 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 customer accounting account on third party is not defined. ACCOUNTING_ACCOUNT_SUPPLIER=Accounting account used for vendor third parties -ACCOUNTING_ACCOUNT_SUPPLIER_Desc=The dedicated accounting account defined on third party 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 supplier accounting account on third party is not defined. +ACCOUNTING_ACCOUNT_SUPPLIER_Desc=The dedicated accounting account defined on third party 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 vendor accounting account on third party is not defined. CloneTax=Clone a social/fiscal tax ConfirmCloneTax=Confirm the clone of a social/fiscal tax CloneTaxForNextMonth=Clone it for next month @@ -256,4 +256,4 @@ PaidDuringThisPeriod=Paid during this period ByVatRate=By sale tax rate TurnoverbyVatrate=Turnover invoiced by sale tax rate TurnoverCollectedbyVatrate=Turnover collected by sale tax rate -PurchasebyVatrate=Purchase by sale tax rate +PurchasebyVatrate=Purchase by sale tax rate \ No newline at end of file diff --git a/htdocs/langs/en_US/cron.lang b/htdocs/langs/en_US/cron.lang index 63d56feca61..26e125c820b 100644 --- a/htdocs/langs/en_US/cron.lang +++ b/htdocs/langs/en_US/cron.lang @@ -43,7 +43,7 @@ CronNoJobs=No jobs registered CronPriority=Priority CronLabel=Label CronNbRun=No. launches -CronMaxRun=Max number launch +CronMaxRun=Maximum number of launches CronEach=Every JobFinished=Job launched and finished #Page card diff --git a/htdocs/langs/en_US/deliveries.lang b/htdocs/langs/en_US/deliveries.lang index 0d432c3f426..778cb3332ad 100644 --- a/htdocs/langs/en_US/deliveries.lang +++ b/htdocs/langs/en_US/deliveries.lang @@ -18,14 +18,14 @@ StatusDeliveryCanceled=Canceled StatusDeliveryDraft=Draft StatusDeliveryValidated=Received # merou PDF model -NameAndSignature=Name and Signature : +NameAndSignature=Name and Signature: ToAndDate=To___________________________________ on ____/_____/__________ GoodStatusDeclaration=Have received the goods above in good condition, -Deliverer=Deliverer : +Deliverer=Deliverer: Sender=Sender Recipient=Recipient ErrorStockIsNotEnough=There's not enough stock Shippable=Shippable NonShippable=Not Shippable ShowReceiving=Show delivery receipt -NonExistentOrder=Non-existent order +NonExistentOrder=Nonexistent order diff --git a/htdocs/langs/en_US/ecm.lang b/htdocs/langs/en_US/ecm.lang index 43ddd3bf36f..369ac6dfdfa 100644 --- a/htdocs/langs/en_US/ecm.lang +++ b/htdocs/langs/en_US/ecm.lang @@ -35,7 +35,7 @@ ECMDocsByUsers=Documents linked to users ECMDocsByInterventions=Documents linked to interventions ECMDocsByExpenseReports=Documents linked to expense reports ECMDocsByHolidays=Documents linked to holidays -ECMDocsBySupplierProposals=Documents linked to supplier proposals +ECMDocsBySupplierProposals=Documents linked to vendor proposals ECMNoDirectoryYet=No directory created ShowECMSection=Show directory DeleteSection=Remove directory diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang index a5555f85c82..b869847efb6 100644 --- a/htdocs/langs/en_US/errors.lang +++ b/htdocs/langs/en_US/errors.lang @@ -4,7 +4,7 @@ NoErrorCommitIsDone=No error, we commit # Errors ErrorButCommitIsDone=Errors found but we validate despite this -ErrorBadEMail=EMail %s is wrong +ErrorBadEMail=Email %s is wrong ErrorBadUrl=Url %s is wrong ErrorBadValueForParamNotAString=Bad value for your parameter. It appends generally when translation is missing. ErrorLoginAlreadyExists=Login %s already exists. @@ -23,14 +23,14 @@ ErrorFailToGenerateFile=Failed to generate file '%s'. ErrorThisContactIsAlreadyDefinedAsThisType=This contact is already defined as contact for this type. ErrorCashAccountAcceptsOnlyCashMoney=This bank account is a cash account, so it accepts payments of type cash only. ErrorFromToAccountsMustDiffers=Source and targets bank accounts must be different. -ErrorBadThirdPartyName=Bad value for third party name +ErrorBadThirdPartyName=Bad value for third-party name ErrorProdIdIsMandatory=The %s is mandatory ErrorBadCustomerCodeSyntax=Bad syntax for customer code -ErrorBadBarCodeSyntax=Bad syntax for bar code. May be you set a bad barcode type or you defined a barcode mask for numbering that does not match value scanned. +ErrorBadBarCodeSyntax=Bad syntax for barcode. May be you set a bad barcode type or you defined a barcode mask for numbering that does not match value scanned. ErrorCustomerCodeRequired=Customer code required -ErrorBarCodeRequired=Bar code required +ErrorBarCodeRequired=Barcode required ErrorCustomerCodeAlreadyUsed=Customer code already used -ErrorBarCodeAlreadyUsed=Bar code already used +ErrorBarCodeAlreadyUsed=Barcode already used ErrorPrefixRequired=Prefix required ErrorBadSupplierCodeSyntax=Bad syntax for vendor code ErrorSupplierCodeRequired=Vendor code required @@ -81,20 +81,20 @@ ErrorRecordIsUsedCantDelete=Can't delete record. It is already used or included ErrorModuleRequireJavascript=Javascript must not be disabled to have this feature working. To enable/disable Javascript, go to menu Home->Setup->Display. ErrorPasswordsMustMatch=Both typed passwords must match each other ErrorContactEMail=A technical error occured. Please, contact administrator to following email %s and provide the error code %s in your message, or add a screen copy of this page. -ErrorWrongValueForField=Wrong value for field number %s (value '%s' does not match regex rule %s) -ErrorFieldValueNotIn=Wrong value for field number %s (value '%s' is not a value available into field %s of table %s) -ErrorFieldRefNotIn=Wrong value for field number %s (value '%s' is not a %s existing ref) -ErrorsOnXLines=Errors on %s source record(s) +ErrorWrongValueForField=Field %s: '%s' does not match regex rule %s +ErrorFieldValueNotIn=Field %s: '%s' is not a value found in field %s of %s +ErrorFieldRefNotIn=Field %s: '%s' is not a %s existing ref +ErrorsOnXLines=%s errors found ErrorFileIsInfectedWithAVirus=The antivirus program was not able to validate the file (file might be infected by a virus) ErrorSpecialCharNotAllowedForField=Special characters are not allowed for field "%s" ErrorNumRefModel=A reference exists into database (%s) and is not compatible with this numbering rule. Remove record or renamed reference to activate this module. -ErrorQtyTooLowForThisSupplier=Quantity too low for this vendor or no price defined on this product for this supplier -ErrorOrdersNotCreatedQtyTooLow=Some orders haven't been created beacuse of too low quantity +ErrorQtyTooLowForThisSupplier=Quantity too low for this vendor or no price defined on this product for this vendor +ErrorOrdersNotCreatedQtyTooLow=Some orders haven't been created because of too-low quantities ErrorModuleSetupNotComplete=Setup of module looks to be uncomplete. Go on Home - Setup - Modules to complete. ErrorBadMask=Error on mask ErrorBadMaskFailedToLocatePosOfSequence=Error, mask without sequence number ErrorBadMaskBadRazMonth=Error, bad reset value -ErrorMaxNumberReachForThisMask=Max number reach for this mask +ErrorMaxNumberReachForThisMask=Maximum number reached for this mask ErrorCounterMustHaveMoreThan3Digits=Counter must have more than 3 digits ErrorSelectAtLeastOne=Error. Select at least one entry. ErrorDeleteNotPossibleLineIsConsolidated=Delete not possible because record is linked to a bank transaction that is conciliated @@ -117,7 +117,7 @@ ErrorLoginDoesNotExists=User with login %s could not be found. ErrorLoginHasNoEmail=This user has no email address. Process aborted. ErrorBadValueForCode=Bad value for security code. Try again with new value... ErrorBothFieldCantBeNegative=Fields %s and %s can't be both negative -ErrorFieldCantBeNegativeOnInvoice=Field %s can't be negative on such type of invoice. If you want to add a discount line, just create the discount first with link %s on screen and apply it to invoice. You can also ask your admin to set option FACTURE_ENABLE_NEGATIVE_LINES to 1 to restore old behaviour. +ErrorFieldCantBeNegativeOnInvoice=Field %s cannot be negative on this type of invoice. If you want to add a discount line, just create the discount first with link %s on screen and apply it to the invoice. You can also ask your admin to set option FACTURE_ENABLE_NEGATIVE_LINES to 1 to allow the old behaviour. ErrorQtyForCustomerInvoiceCantBeNegative=Quantity for line into customer invoices can't be negative ErrorWebServerUserHasNotPermission=User account %s used to execute web server has no permission for that ErrorNoActivatedBarcode=No barcode type activated @@ -174,7 +174,7 @@ ErrorGlobalVariableUpdater4=SOAP client failed with error '%s' ErrorGlobalVariableUpdater5=No global variable selected ErrorFieldMustBeANumeric=Field %s must be a numeric value ErrorMandatoryParametersNotProvided=Mandatory parameter(s) not provided -ErrorOppStatusRequiredIfAmount=You set an estimated amount for this lead. So you must also enter its status +ErrorOppStatusRequiredIfAmount=You set an estimated amount for this lead. So you must also enter it's status. ErrorFailedToLoadModuleDescriptorForXXX=Failed to load module descriptor class for %s ErrorBadDefinitionOfMenuArrayInModuleDescriptor=Bad Definition Of Menu Array In Module Descriptor (bad value for key fk_menu) ErrorSavingChanges=An error has occurred when saving the changes @@ -212,7 +212,9 @@ ErrorProductBarCodeAlreadyExists=The product barcode %s already exists on anothe ErrorNoteAlsoThatSubProductCantBeFollowedByLot=Note also that using virtual product to have auto increase/decrease of subproducts is not possible when at least one subproduct (or subproduct of subproducts) needs a serial/lot number. ErrorDescRequiredForFreeProductLines=Description is mandatory for lines with free product ErrorAPageWithThisNameOrAliasAlreadyExists=The page/container %s has the same name or alternative alias that the one your try to use -ErrorDuringChartLoad=Error when loading chart of account. If few accounts were not loaded, you can still enter them manually. +ErrorDuringChartLoad=Error when loading chart of accounts. If few accounts were not loaded, you can still enter them manually. +ErrorBadSyntaxForParamKeyForContent=Bad syntax for param keyforcontent. Must have a value starting with %s or %s +ErrorVariableKeyForContentMustBeSet=Error, the constant with name %s (with text content to show) or %s (with external url to show) must be set. # Warnings WarningPasswordSetWithNoAccount=A password was set for this member. However, no user account was created. So this password is stored but can't be used to login to Dolibarr. It may be used by an external module/interface but if you don't need to define any login nor password for a member, you can disable option "Manage a login for each member" from Member module setup. If you need to manage a login but don't need any password, you can keep this field empty to avoid this warning. Note: Email can also be used as a login if the member is linked to a user. WarningMandatorySetupNotComplete=Mandatory setup parameters are not yet defined @@ -222,7 +224,7 @@ WarningPassIsEmpty=Warning, database password is empty. This is a security hole. WarningConfFileMustBeReadOnly=Warning, your config file (htdocs/conf/conf.php) can be overwritten by the web server. This is a serious security hole. Modify permissions on file to be in read only mode for operating system user used by Web server. If you use Windows and FAT format for your disk, you must know that this file system does not allow to add permissions on file, so can't be completely safe. WarningsOnXLines=Warnings on %s source record(s) WarningNoDocumentModelActivated=No model, for document generation, has been activated. A model will be chosen by default until you check your module setup. -WarningLockFileDoesNotExists=Warning, once setup is finished, you must disable install/migrate tools by adding a file install.lock into directory %s. Missing this file is a security hole. +WarningLockFileDoesNotExists=Warning, once setup is finished, you must disable the installation/migration tools by adding a file install.lock into directory %s. Omitting the creation of this file is a grave security risk. WarningUntilDirRemoved=All security warnings (visible by admin users only) will remain active as long as the vulnerability is present (or that constant MAIN_REMOVE_INSTALL_WARNING is added in Setup->Other Setup). WarningCloseAlways=Warning, closing is done even if amount differs between source and target elements. Enable this feature with caution. WarningUsingThisBoxSlowDown=Warning, using this box slow down seriously all pages showing the box. @@ -235,3 +237,4 @@ WarningYourLoginWasModifiedPleaseLogin=Your login was modified. For security pur 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 +WarningProjectClosed=Project is closed. You must re-open it first. \ No newline at end of file diff --git a/htdocs/langs/en_US/exports.lang b/htdocs/langs/en_US/exports.lang index 179556ddb19..2ee374ee670 100644 --- a/htdocs/langs/en_US/exports.lang +++ b/htdocs/langs/en_US/exports.lang @@ -44,7 +44,7 @@ LineDescription=Description of line LineUnitPrice=Unit price of line LineVATRate=VAT Rate of line LineQty=Quantity for line -LineTotalHT=Amount net of tax for line +LineTotalHT=Amount excl. tax for line LineTotalTTC=Amount with tax for line LineTotalVAT=Amount of VAT for line TypeOfLineServiceOrProduct=Type of line (0=product, 1=service) @@ -68,7 +68,7 @@ FieldsTarget=Targeted fields FieldTarget=Targeted field FieldSource=Source field NbOfSourceLines=Number of lines in source file -NowClickToTestTheImport=Check the import setup you defined (check if you must omit the header lines, or these will be flagged as errors in the following simulation).
Click on the "%s" button to run a check of the file structure/contents and simulate the import process.
No data will be changed in your database. +NowClickToTestTheImport=Check that the file format (field and string delimiters) of your file matches the options shown and that you have omitted the header line, or these will be flagged as errors in the following simulation.
Click on the "%s" button to run a check of the file structure/contents and simulate the import process.
No data will be changed in your database. RunSimulateImportFile=Run Import Simulation FieldNeedSource=This field requires data from the source file SomeMandatoryFieldHaveNoSource=Some mandatory fields have no source from data file @@ -78,7 +78,7 @@ SelectAtLeastOneField=Switch at least one source field in the column of fields t SelectFormat=Choose this import file format RunImportFile=Import Data NowClickToRunTheImport=Check the results of the import simulation. Correct any errors and re-test.
When the simulation reports no errors you may proceed to import the data into the database. -DataLoadedWithId=All data will be loaded with the following import id: %s to enable a search on this set of data in case of discovering problems in the future. +DataLoadedWithId=The imported data will have an additional field in each database table with this import id: %s, to allow it to be searchable in the case of investigating a problem related to this import. ErrorMissingMandatoryValue=Mandatory data is empty in the source file for field %s. TooMuchErrors=There are still %s other source lines with errors but output has been limited. TooMuchWarnings=There are still %s other source lines with warnings but output has been limited. @@ -109,14 +109,14 @@ Separator=Field Separator Enclosure=String Delimiter SpecialCode=Special code ExportStringFilter=%% allows replacing one or more characters in the text -ExportDateFilter=YYYY, YYYYMM, YYYYMMDD : filters by one year/month/day
YYYY+YYYY, YYYYMM+YYYYMM, YYYYMMDD+YYYYMMDD : filters over a range of years/months/days
> YYYY, > YYYYMM, > YYYYMMDD : filters on all following years/months/days
< YYYY, < YYYYMM, < YYYYMMDD : filters on all previous years/months/days +ExportDateFilter=YYYY, YYYYMM, YYYYMMDD: filters by one year/month/day
YYYY+YYYY, YYYYMM+YYYYMM, YYYYMMDD+YYYYMMDD: filters over a range of years/months/days
> YYYY, > YYYYMM, > YYYYMMDD: filters on all following years/months/days
< YYYY, < YYYYMM, < YYYYMMDD: filters on all previous years/months/days ExportNumericFilter=NNNNN filters by one value
NNNNN+NNNNN filters over a range of values
< NNNNN filters by lower values
> NNNNN filters by higher values ImportFromLine=Import starting from line number EndAtLineNb=End at line number -ImportFromToLine=Limit range (from - to) eg. to omit header line -SetThisValueTo2ToExcludeFirstLine=For example, set this value to 3 to exclude the 2 first lines -KeepEmptyToGoToEndOfFile=Keep this field empty to go up to the end of file -SelectPrimaryColumnsForUpdateAttempt=Select column(s) to use as primary key for update attempt +ImportFromToLine=Limit range (From - To) eg. to omit header line(s) +SetThisValueTo2ToExcludeFirstLine=For example, set this value to 3 to exclude the 2 first lines.
If the header lines are NOT omitted, this will result in multiple errors in the Import Simulation. +KeepEmptyToGoToEndOfFile=Keep this field empty to process all lines to the end of the file. +SelectPrimaryColumnsForUpdateAttempt=Select column(s) to use as primary key for an UPDATE import UpdateNotYetSupportedForThisImport=Update is not supported for this type of import (only insert) NoUpdateAttempt=No update attempt was performed, only insert ImportDataset_user_1=Users (employees or not) and properties @@ -130,4 +130,4 @@ FormatControlRule=Format control rule KeysToUseForUpdates=Key (column) to use for updating existing data NbInsert=Number of inserted lines: %s NbUpdate=Number of updated lines: %s -MultipleRecordFoundWithTheseFilters=Multiple records have been found with these filters: %s +MultipleRecordFoundWithTheseFilters=Multiple records have been found with these filters: %s \ No newline at end of file diff --git a/htdocs/langs/en_US/ftp.lang b/htdocs/langs/en_US/ftp.lang index 8ecb0c55cad..c4136be7bff 100644 --- a/htdocs/langs/en_US/ftp.lang +++ b/htdocs/langs/en_US/ftp.lang @@ -2,13 +2,13 @@ FTPClientSetup=FTP Client module setup NewFTPClient=New FTP connection setup FTPArea=FTP Area -FTPAreaDesc=This screen show you content of a FTP server view -SetupOfFTPClientModuleNotComplete=Setup of FTP client module seems to be not complete +FTPAreaDesc=This screen shows content of a FTP server view +SetupOfFTPClientModuleNotComplete=The setup of the FTP client module seems to be incomplete FTPFeatureNotSupportedByYourPHP=Your PHP does not support FTP functions FailedToConnectToFTPServer=Failed to connect to FTP server (server %s, port %s) FailedToConnectToFTPServerWithCredentials=Failed to login to FTP server with defined login/password FTPFailedToRemoveFile=Failed to remove file %s. -FTPFailedToRemoveDir=Failed to remove directory %s (Check permissions and that directory is empty). +FTPFailedToRemoveDir=Failed to remove directory %s (Check permissions and that the directory is empty). FTPPassiveMode=Passive mode ChooseAFTPEntryIntoMenu=Choose a FTP entry into menu... -FailedToGetFile=Failed to get files %s +FailedToGetFile=Failed to get files %s \ No newline at end of file diff --git a/htdocs/langs/en_US/help.lang b/htdocs/langs/en_US/help.lang index da776683a6a..048de16d3c0 100644 --- a/htdocs/langs/en_US/help.lang +++ b/htdocs/langs/en_US/help.lang @@ -1,10 +1,10 @@ # Dolibarr language file - Source file is en_US - help CommunitySupport=Forum/Wiki support EMailSupport=Emails support -RemoteControlSupport=Online real time / remote support +RemoteControlSupport=Online real-time / remote support OtherSupport=Other support ToSeeListOfAvailableRessources=To contact/see available resources: -HelpCenter=Help center +HelpCenter=Help Center DolibarrHelpCenter=Dolibarr Help and Support Center ToGoBackToDolibarr=Otherwise, click here to continue to use Dolibarr. TypeOfSupport=Type of support diff --git a/htdocs/langs/en_US/holiday.lang b/htdocs/langs/en_US/holiday.lang index 2fad3d02a7f..b3084a7557c 100644 --- a/htdocs/langs/en_US/holiday.lang +++ b/htdocs/langs/en_US/holiday.lang @@ -116,7 +116,7 @@ HolidaysToValidateAlertSolde=The user who made this leave request does not have HolidaysValidated=Validated leave requests HolidaysValidatedBody=Your leave request for %s to %s has been validated. HolidaysRefused=Request denied -HolidaysRefusedBody=Your leave request for %s to %s has been denied for the following reason : +HolidaysRefusedBody=Your leave request for %s to %s has been denied for the following reason: HolidaysCanceled=Canceled leaved request HolidaysCanceledBody=Your leave request for %s to %s has been canceled. FollowedByACounter=1: This type of leave need to be followed by a counter. Counter is incremented manually or automatically and when a leave request is validated, counter is decremented.
0: Not followed by a counter. diff --git a/htdocs/langs/en_US/install.lang b/htdocs/langs/en_US/install.lang index c92d83988ff..bf382a32d62 100644 --- a/htdocs/langs/en_US/install.lang +++ b/htdocs/langs/en_US/install.lang @@ -192,7 +192,7 @@ MigrationProjectTaskActors=Data migration for table llx_projet_task_actors MigrationProjectUserResp=Data migration field fk_user_resp of llx_projet to llx_element_contact MigrationProjectTaskTime=Update time spent in seconds MigrationActioncommElement=Update data on actions -MigrationPaymentMode=Data migration for payment mode +MigrationPaymentMode=Data migration for payment type MigrationCategorieAssociation=Migration of categories MigrationEvents=Migration of events to add event owner into assignment table MigrationEventsContact=Migration of events to add event contact into assignment table diff --git a/htdocs/langs/en_US/interventions.lang b/htdocs/langs/en_US/interventions.lang index a130367b14f..2025fb03181 100644 --- a/htdocs/langs/en_US/interventions.lang +++ b/htdocs/langs/en_US/interventions.lang @@ -21,8 +21,8 @@ ConfirmValidateIntervention=Are you sure you want to validate this intervention ConfirmModifyIntervention=Are you sure you want to modify this intervention? ConfirmDeleteInterventionLine=Are you sure you want to delete this intervention line? ConfirmCloneIntervention=Are you sure you want to clone this intervention? -NameAndSignatureOfInternalContact=Name and signature of intervening : -NameAndSignatureOfExternalContact=Name and signature of customer : +NameAndSignatureOfInternalContact=Name and signature of intervening: +NameAndSignatureOfExternalContact=Name and signature of customer: DocumentModelStandard=Standard document model for interventions InterventionCardsAndInterventionLines=Interventions and lines of interventions InterventionClassifyBilled=Classify "Billed" @@ -30,13 +30,13 @@ InterventionClassifyUnBilled=Classify "Unbilled" InterventionClassifyDone=Classify "Done" StatusInterInvoiced=Billed SendInterventionRef=Submission of intervention %s -SendInterventionByMail=Send intervention by Email +SendInterventionByMail=Send intervention by email InterventionCreatedInDolibarr=Intervention %s created InterventionValidatedInDolibarr=Intervention %s validated InterventionModifiedInDolibarr=Intervention %s modified InterventionClassifiedBilledInDolibarr=Intervention %s set as billed InterventionClassifiedUnbilledInDolibarr=Intervention %s set as unbilled -InterventionSentByEMail=Intervention %s sent by EMail +InterventionSentByEMail=Intervention %s sent by email InterventionDeletedInDolibarr=Intervention %s deleted InterventionsArea=Interventions area DraftFichinter=Draft interventions diff --git a/htdocs/langs/en_US/ldap.lang b/htdocs/langs/en_US/ldap.lang index abe11602147..8b6f0864215 100644 --- a/htdocs/langs/en_US/ldap.lang +++ b/htdocs/langs/en_US/ldap.lang @@ -16,7 +16,7 @@ LDAPFieldFirstSubscriptionAmount=First subscription amount LDAPFieldLastSubscriptionDate=Latest subscription date LDAPFieldLastSubscriptionAmount=Latest subscription amount LDAPFieldSkype=Skype id -LDAPFieldSkypeExample=Example : skypeName +LDAPFieldSkypeExample=Example: skypeName UserSynchronized=User synchronized GroupSynchronized=Group synchronized MemberSynchronized=Member synchronized diff --git a/htdocs/langs/en_US/mails.lang b/htdocs/langs/en_US/mails.lang index d4f835874e7..b055b38268a 100644 --- a/htdocs/langs/en_US/mails.lang +++ b/htdocs/langs/en_US/mails.lang @@ -15,10 +15,10 @@ MailToUsers=To user(s) MailCC=Copy to MailToCCUsers=Copy to users(s) MailCCC=Cached copy to -MailTopic=EMail topic +MailTopic=Email topic MailText=Message MailFile=Attached files -MailMessage=EMail body +MailMessage=Email body ShowEMailing=Show emailing ListOfEMailings=List of emailings NewMailing=New emailing @@ -45,7 +45,7 @@ MailingStatusReadAndUnsubscribe=Read and unsubscribe ErrorMailRecipientIsEmpty=Email recipient is empty WarningNoEMailsAdded=No new Email to add to recipient's list. ConfirmValidMailing=Are you sure you want to validate this emailing? -ConfirmResetMailing=Warning, by re-initializing emailing %s , you will allow resending this email in a mass mailing. Are you sure you want to do this? +ConfirmResetMailing=Warning, by re-initializing emailing %s, you will allow the re-sending this email in a bulk mailing. Are you sure you want to do this? ConfirmDeleteMailing=Are you sure you want to delete this emailing? NbOfUniqueEMails=No. of unique emails NbOfEMails=No. of EMails @@ -57,7 +57,7 @@ YouCanAddYourOwnPredefindedListHere=To create your email selector module, see ht EMailTestSubstitutionReplacedByGenericValues=When using test mode, substitutions variables are replaced by generic values MailingAddFile=Attach this file NoAttachedFiles=No attached files -BadEMail=Bad value for EMail +BadEMail=Bad value for Email CloneEMailing=Clone Emailing ConfirmCloneEMailing=Are you sure you want to clone this emailing? CloneContent=Clone message @@ -68,22 +68,22 @@ SentTo=Sent to %s MailingStatusRead=Read YourMailUnsubcribeOK=The email %s is correctly unsubscribe from mailing list ActivateCheckReadKey=Key used to encrypt URL used for "Read Receipt" and "Unsubscribe" feature -EMailSentToNRecipients=EMail sent to %s recipients. -EMailSentForNElements=EMail sent for %s elements. +EMailSentToNRecipients=Email sent to %s recipients. +EMailSentForNElements=Email sent for %s elements. XTargetsAdded=%s recipients added into target list OnlyPDFattachmentSupported=If the PDF documents were already generated for the objects to send, they will be attached to email. If not, no email will be sent (also, note that only pdf documents are supported as attachments in mass sending in this version). AllRecipientSelected=The recipients of the %s record selected (if their email is known). GroupEmails=Group emails OneEmailPerRecipient=One email per recipient (by default, one email per record selected) WarningIfYouCheckOneRecipientPerEmail=Warning, if you check this box, it means only one email will be sent for several different record selected, so, if your message contains substitution variables that refers to data of a record, it becomes not possible to replace them. -ResultOfMailSending=Result of mass EMail sending +ResultOfMailSending=Result of mass Email sending NbSelected=No. selected NbIgnored=No. ignored NbSent=No. sent SentXXXmessages=%s message(s) sent. ConfirmUnvalidateEmailing=Are you sure you want to change email %s to draft status? MailingModuleDescContactsWithThirdpartyFilter=Contact with customer filters -MailingModuleDescContactsByCompanyCategory=Contacts by third party category +MailingModuleDescContactsByCompanyCategory=Contacts by third-party category MailingModuleDescContactsByCategory=Contacts by categories MailingModuleDescContactsByFunction=Contacts by position MailingModuleDescEmailsFromFile=Emails from file @@ -119,8 +119,8 @@ YouCanUseCommaSeparatorForSeveralRecipients=You can use the comma separat TagCheckMail=Track mail opening TagUnsubscribe=Unsubscribe link TagSignature=Signature of sending user -EMailRecipient=Recipient EMail -TagMailtoEmail=Recipient EMail (including html "mailto:" link) +EMailRecipient=Recipient Email +TagMailtoEmail=Recipient Email (including html "mailto:" link) NoEmailSentBadSenderOrRecipientEmail=No email sent. Bad sender or recipient email. Verify user profile. # Module Notifications Notifications=Notifications @@ -146,7 +146,7 @@ AdvTgtMaxVal=Maximum value AdvTgtSearchDtHelp=Use interval to select date value AdvTgtStartDt=Start dt. AdvTgtEndDt=End dt. -AdvTgtTypeOfIncudeHelp=Target Email of third party and email of contact of the third party, or just third party email or just contact email +AdvTgtTypeOfIncudeHelp=Target Email of third party and email of contact of the third party, or just third-party email or just contact email AdvTgtTypeOfIncude=Type of targeted email AdvTgtContactHelp=Use only if you target contact into "Type of targeted email" AddAll=Add all @@ -166,4 +166,4 @@ InGoingEmailSetup=Incoming email setup OutGoingEmailSetupForEmailing=Outgoing email setup (for mass emailing) DefaultOutgoingEmailSetup=Default outgoing email setup Information=Information -ContactsWithThirdpartyFilter=Contacts with third party filter +ContactsWithThirdpartyFilter=Contacts with third-party filter diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index b3ea678aea0..d8a57e8dbc6 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -58,13 +58,13 @@ ErrorNoRequestInError=No request in error ErrorServiceUnavailableTryLater=Service not available at the moment. Try again later. ErrorDuplicateField=Duplicate value in a unique field ErrorSomeErrorWereFoundRollbackIsDone=Some errors were found. Changes have been rolled back. -ErrorConfigParameterNotDefined=Parameter %s is not defined in Dolibarr config file conf.php. +ErrorConfigParameterNotDefined=Parameter %s is not defined in the Dolibarr config file conf.php. ErrorCantLoadUserFromDolibarrDatabase=Failed to find user %s in Dolibarr database. ErrorNoVATRateDefinedForSellerCountry=Error, no vat rates defined for country '%s'. ErrorNoSocialContributionForSellerCountry=Error, no social/fiscal taxes type defined for country '%s'. ErrorFailedToSaveFile=Error, failed to save file. -ErrorCannotAddThisParentWarehouse=You are trying to add a parent warehouse which is already a child of a current one -MaxNbOfRecordPerPage=Max number of records per page +ErrorCannotAddThisParentWarehouse=You are trying to add a parent warehouse which is already a child of a existing warehouse +MaxNbOfRecordPerPage=Max. number of records per page NotAuthorized=You are not authorized to do that. SetDate=Set date SelectDate=Select a date @@ -86,6 +86,7 @@ GoToWikiHelpPage=Read online help (Internet access needed) GoToHelpPage=Read help RecordSaved=Record saved RecordDeleted=Record deleted +RecordGenerated=Record generated LevelOfFeature=Level of features NotDefined=Not defined DolibarrInHttpAuthenticationSoPasswordUseless=Dolibarr authentication mode is set to %s in configuration file conf.php.
This means that the password database is external to Dolibarr, so changing this field may have no effect. @@ -169,7 +170,7 @@ Save=Save SaveAs=Save As TestConnection=Test connection ToClone=Clone -ConfirmClone=Choose data you want to clone : +ConfirmClone=Choose data you want to clone: NoCloneOptionsSpecified=No data to clone defined. Of=of Go=Go @@ -184,7 +185,7 @@ Valid=Valid Approve=Approve Disapprove=Disapprove ReOpen=Re-Open -Upload=Send file +Upload=Upload ToLink=Link Select=Select Choose=Choose @@ -332,8 +333,8 @@ DefaultValues=Default values/filters/sorting Price=Price PriceCurrency=Price (currency) UnitPrice=Unit price -UnitPriceHT=Unit price (net) -UnitPriceHTCurrency=Unit price (net) (currency) +UnitPriceHT=Unit price (excl.) +UnitPriceHTCurrency=Unit price (excl.) (currency) UnitPriceTTC=Unit price PriceU=U.P. PriceUHT=U.P. (net) @@ -343,15 +344,15 @@ Amount=Amount AmountInvoice=Invoice amount AmountInvoiced=Amount invoiced AmountPayment=Payment amount -AmountHTShort=Amount (net) +AmountHTShort=Amount (excl.) AmountTTCShort=Amount (inc. tax) -AmountHT=Amount (net of tax) +AmountHT=Amount (excl. tax) AmountTTC=Amount (inc. tax) AmountVAT=Amount tax MulticurrencyAlreadyPaid=Already paid, original currency MulticurrencyRemainderToPay=Remain to pay, original currency MulticurrencyPaymentAmount=Payment amount, original currency -MulticurrencyAmountHT=Amount (net of tax), original currency +MulticurrencyAmountHT=Amount (excl. tax), original currency MulticurrencyAmountTTC=Amount (inc. of tax), original currency MulticurrencyAmountVAT=Amount tax, original currency AmountLT1=Amount tax 2 @@ -360,16 +361,16 @@ AmountLT1ES=Amount RE AmountLT2ES=Amount IRPF AmountTotal=Total amount AmountAverage=Average amount -PriceQtyMinHT=Price quantity min. (net of tax) -PriceQtyMinHTCurrency=Price quantity min. (net of tax) (currency) +PriceQtyMinHT=Price quantity min. (excl. tax) +PriceQtyMinHTCurrency=Price quantity min. (excl. tax) (currency) Percentage=Percentage Total=Total SubTotal=Subtotal -TotalHTShort=Total (net) -TotalHTShortCurrency=Total (net in currency) +TotalHTShort=Total (excl.) +TotalHTShortCurrency=Total (excl. in currency) TotalTTCShort=Total (inc. tax) -TotalHT=Total (net of tax) -TotalHTforthispage=Total (net of tax) for this page +TotalHT=Total (excl. tax) +TotalHTforthispage=Total (excl. tax) for this page Totalforthispage=Total for this page TotalTTC=Total (inc. tax) TotalTTCToYourCredit=Total (inc. tax) to your credit @@ -381,7 +382,7 @@ TotalLT1ES=Total RE TotalLT2ES=Total IRPF TotalLT1IN=Total CGST TotalLT2IN=Total SGST -HT=Net of tax +HT=Excl. tax TTC=Inc. tax INCVATONLY=Inc. VAT INCT=Inc. all taxes @@ -436,8 +437,8 @@ Accountant=Accountant ContactsForCompany=Contacts for this third party ContactsAddressesForCompany=Contacts/addresses for this third party AddressesForCompany=Addresses for this third party -ActionsOnCompany=Events about this third party -ActionsOnContact=Events about this contact/address +ActionsOnCompany=Events for this third party +ActionsOnContact=Events for this contact/address ActionsOnMember=Events about this member ActionsOnProduct=Events about this product NActionsLate=%s late @@ -508,7 +509,7 @@ None=None NoneF=None NoneOrSeveral=None or several Late=Late -LateDesc=The delay to define if a record is late or not depends on your setup. Ask your admin to change the delay from menu Home - Setup - Alerts. +LateDesc=An item is defined as Delayed as per the system configuration in menu Home - Setup - Alerts. NoItemLate=No late item Photo=Picture Photos=Pictures @@ -628,15 +629,15 @@ FeatureNotYetSupported=Feature not yet supported CloseWindow=Close window Response=Response Priority=Priority -SendByMail=Send by EMail +SendByMail=Send by email MailSentBy=Email sent by TextUsedInTheMessageBody=Email body SendAcknowledgementByMail=Send confirmation email SendMail=Send email -EMail=E-mail +Email=Email NoEMail=No email Email=Email -AlreadyRead=Alreay read +AlreadyRead=Already read NotRead=Not read NoMobilePhone=No mobile phone Owner=Owner @@ -652,6 +653,7 @@ RecordCreatedSuccessfully=Record created successfully RecordModifiedSuccessfully=Record modified successfully RecordsModified=%s record modified RecordsDeleted=%s record deleted +RecordsGenerated=%s record generated AutomaticCode=Automatic code FeatureDisabled=Feature disabled MoveBox=Move widget @@ -701,14 +703,14 @@ Notes=Notes AddNewLine=Add new line AddFile=Add file FreeZone=Not a predefined product/service -FreeLineOfType=Not a predefined entry of type +FreeLineOfType=Free-text item, type: CloneMainAttributes=Clone object with its main attributes PDFMerge=PDF Merge Merge=Merge DocumentModelStandardPDF=Standard PDF template PrintContentArea=Show page to print main content area MenuManager=Menu manager -WarningYouAreInMaintenanceMode=Warning, you are in maintenance mode, so only login %s is allowed to use the application at this time. +WarningYouAreInMaintenanceMode=Warning, you are in maintenance mode: only login %s is allowed to use the application in this mode. CoreErrorTitle=System error CoreErrorMessage=Sorry, an error occurred. Contact your system administrator to check the logs or disable $dolibarr_main_prod=1 to get more information. CreditCard=Credit card @@ -745,9 +747,9 @@ LinkToProposal=Link to proposal LinkToOrder=Link to order LinkToInvoice=Link to invoice LinkToTemplateInvoice=Link to template invoice -LinkToSupplierOrder=Link to supplier order -LinkToSupplierProposal=Link to supplier proposal -LinkToSupplierInvoice=Link to supplier invoice +LinkToSupplierOrder=Link to purchase order +LinkToSupplierProposal=Link to vendor proposal +LinkToSupplierInvoice=Link to vendor invoice LinkToContract=Link to contract LinkToIntervention=Link to intervention CreateDraft=Create draft @@ -818,8 +820,8 @@ TooManyRecordForMassAction=Too many records selected for mass action. The action NoRecordSelected=No record selected MassFilesArea=Area for files built by mass actions ShowTempMassFilesArea=Show area of files built by mass actions -ConfirmMassDeletion=Mass delete confirmation -ConfirmMassDeletionQuestion=Are you sure you want to delete the %s selected record? +ConfirmMassDeletion=Bulk Delete confirmation +ConfirmMassDeletionQuestion=Are you sure you want to delete the %s selected record(s)? RelatedObjects=Related Objects ClassifyBilled=Classify billed ClassifyUnbilled=Classify unbilled @@ -875,7 +877,7 @@ Rights=Permissions LineNb=Line no. IncotermLabel=Incoterms TabLetteringCustomer=Customer lettering -TabLetteringSupplier=Supplier lettering +TabLetteringSupplier=Vendor lettering # Week day Monday=Monday Tuesday=Tuesday diff --git a/htdocs/langs/en_US/margins.lang b/htdocs/langs/en_US/margins.lang index 167e316703c..d4545b8e75f 100644 --- a/htdocs/langs/en_US/margins.lang +++ b/htdocs/langs/en_US/margins.lang @@ -31,7 +31,7 @@ MARGIN_TYPE=Buying/Cost price suggested by default for margin calculation MargeType1=Margin on Best vendor price MargeType2=Margin on Weighted Average Price (WAP) MargeType3=Margin on Cost Price -MarginTypeDesc=* Margin on best buying price = Selling price - Best vendor price defined on product card
* Margin on Weighted Average Price (WAP) = Selling price - Product Weighted Average Price (WAP) or best supplier price if WAP not yet defined
* Margin on Cost price = Selling price - Cost price defined on product card or WAP if cost price not defined, or best supplier price if WAP not yet defined +MarginTypeDesc=* Margin on best buying price = Selling price - Best vendor price defined on product card
* Margin on Weighted Average Price (WAP) = Selling price - Product Weighted Average Price (WAP) or best vendor price if WAP not yet defined
* Margin on Cost price = Selling price - Cost price defined on product card or WAP if cost price not defined, or best vendor price if WAP not yet defined CostPrice=Cost price UnitCharges=Unit charges Charges=Charges diff --git a/htdocs/langs/en_US/members.lang b/htdocs/langs/en_US/members.lang index e28f242d964..d93d329ab23 100644 --- a/htdocs/langs/en_US/members.lang +++ b/htdocs/langs/en_US/members.lang @@ -6,7 +6,7 @@ Member=Member Members=Members ShowMember=Show member card UserNotLinkedToMember=User not linked to a member -ThirdpartyNotLinkedToMember=Third-party not linked to a member +ThirdpartyNotLinkedToMember=Third party not linked to a member MembersTickets=Members Tickets FundationMembers=Foundation members ListOfValidatedPublicMembers=List of validated public members @@ -67,11 +67,11 @@ Subscriptions=Subscriptions SubscriptionLate=Late SubscriptionNotReceived=Subscription never received ListOfSubscriptions=List of subscriptions -SendCardByMail=Send card by Email +SendCardByMail=Send card by email AddMember=Create member NoTypeDefinedGoToSetup=No member types defined. Go to menu "Members types" NewMemberType=New member type -WelcomeEMail=Welcome e-mail +WelcomeEMail=Welcome email SubscriptionRequired=Subscription required DeleteType=Delete VoteAllowed=Vote allowed @@ -124,16 +124,16 @@ CardContent=Content of your member card 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.

-ThisIsContentOfSubscriptionReminderEmail=We want to let you know that your subscription is about to expire or is already expired (__MEMBER_LAST_SUBSCRIPTION_DATE_END__). We hope you can make a renewal of it.

-ThisIsContentOfYourCard=This is a remind of the information we get about you. Feel free to contact us if something looks wrong.

-DescADHERENT_AUTOREGISTER_NOTIF_MAIL_SUBJECT=Subject of the e-mail received in case of auto-inscription of a guest -DescADHERENT_AUTOREGISTER_NOTIF_MAIL=E-mail received in case of auto-inscription of a guest -DescADHERENT_EMAIL_TEMPLATE_AUTOREGISTER=Template Email to use to send email to a member on member autosubscription -DescADHERENT_EMAIL_TEMPLATE_MEMBER_VALIDATION=Template EMail to use to send email to a member on member validation -DescADHERENT_EMAIL_TEMPLATE_SUBSCRIPTION=Template Email to use to send email to a member on new subscription recording -DescADHERENT_EMAIL_TEMPLATE_REMIND_EXPIRATION=Template Email to use to send email remind when subscription is about to expire -DescADHERENT_EMAIL_TEMPLATE_CANCELATION=Template Email to use to send email to a member on member cancelation -DescADHERENT_MAIL_FROM=Sender EMail for automatic emails +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 email received in case of auto-inscription of a guest +DescADHERENT_AUTOREGISTER_NOTIF_MAIL=Email received in case of auto-inscription of a guest +DescADHERENT_EMAIL_TEMPLATE_AUTOREGISTER=Email template to use to send email to a member on member autosubscription +DescADHERENT_EMAIL_TEMPLATE_MEMBER_VALIDATION=Email template to use to send email to a member on member validation +DescADHERENT_EMAIL_TEMPLATE_SUBSCRIPTION=Email template to use to send email to a member on new subscription recording +DescADHERENT_EMAIL_TEMPLATE_REMIND_EXPIRATION=Email template to use to send email reminder when subscription is about to expire +DescADHERENT_EMAIL_TEMPLATE_CANCELATION=Email template to use to send email to a member on member cancelation +DescADHERENT_MAIL_FROM=Sender Email for automatic emails DescADHERENT_ETIQUETTE_TYPE=Format of labels page DescADHERENT_ETIQUETTE_TEXT=Text printed on member address sheets DescADHERENT_CARD_TYPE=Format of cards page diff --git a/htdocs/langs/en_US/opensurvey.lang b/htdocs/langs/en_US/opensurvey.lang index 906de8c2f37..c4554a7a76c 100644 --- a/htdocs/langs/en_US/opensurvey.lang +++ b/htdocs/langs/en_US/opensurvey.lang @@ -49,7 +49,7 @@ votes=vote(s) NoCommentYet=No comments have been posted for this poll yet CanComment=Voters can comment in the poll CanSeeOthersVote=Voters can see other people's vote -SelectDayDesc=For each selected day, you can choose, or not, meeting hours in the following format :
- empty,
- "8h", "8H" or "8:00" to give a meeting's start hour,
- "8-11", "8h-11h", "8H-11H" or "8:00-11:00" to give a meeting's start and end hour,
- "8h15-11h15", "8H15-11H15" or "8:15-11:15" for the same thing but with minutes. +SelectDayDesc=For each selected day, you can choose, or not, meeting hours in the following format:
- empty,
- "8h", "8H" or "8:00" to give a meeting's start hour,
- "8-11", "8h-11h", "8H-11H" or "8:00-11:00" to give a meeting's start and end hour,
- "8h15-11h15", "8H15-11H15" or "8:15-11:15" for the same thing but with minutes. BackToCurrentMonth=Back to current month ErrorOpenSurveyFillFirstSection=You haven't filled the first section of the poll creation ErrorOpenSurveyOneChoice=Enter at least one choice diff --git a/htdocs/langs/en_US/orders.lang b/htdocs/langs/en_US/orders.lang index 66073b8f0c9..642f50d57c0 100644 --- a/htdocs/langs/en_US/orders.lang +++ b/htdocs/langs/en_US/orders.lang @@ -85,7 +85,7 @@ NbOfOrders=Number of orders OrdersStatistics=Order's statistics OrdersStatisticsSuppliers=Purchase order statistics NumberOfOrdersByMonth=Number of orders by month -AmountOfOrdersByMonthHT=Amount of orders by month (net of tax) +AmountOfOrdersByMonthHT=Amount of orders by month (excl. tax) ListOfOrders=List 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. @@ -112,7 +112,7 @@ UserWithApproveOrderGrant=Users granted with "approve orders" permission. PaymentOrderRef=Payment of order %s CloneOrder=Clone order ConfirmCloneOrder=Are you sure you want to clone this order %s? -DispatchSupplierOrder=Receiving supplier order %s +DispatchSupplierOrder=Receiving purchase order %s FirstApprovalAlreadyDone=First approval already done SecondApprovalAlreadyDone=Second approval already done SupplierOrderReceivedInDolibarr=Purchase Order %s received %s @@ -136,7 +136,7 @@ Error_OrderNotChecked=No orders to invoice selected # Order modes (how we receive order). Not the "why" are keys stored into dict.lang OrderByMail=Mail OrderByFax=Fax -OrderByEMail=EMail +OrderByEMail=Email OrderByWWW=Online OrderByPhone=Phone # Documents models diff --git a/htdocs/langs/en_US/other.lang b/htdocs/langs/en_US/other.lang index ec0315b94cd..3e2a8970668 100644 --- a/htdocs/langs/en_US/other.lang +++ b/htdocs/langs/en_US/other.lang @@ -20,8 +20,8 @@ ZipFileGeneratedInto=Zip file generated into %s. DocFileGeneratedInto=Doc file generated into %s. JumpToLogin=Disconnected. Go to login page... MessageForm=Message on online payment form -MessageOK=Message on validated payment return page -MessageKO=Message on canceled payment return page +MessageOK=Message on the return page for a validated payment +MessageKO=Message on the return page for a canceled payment ContentOfDirectoryIsNotEmpty=Content of this directory is not empty. DeleteAlsoContentRecursively=Check to delete all content recursively @@ -33,10 +33,10 @@ DateNextInvoiceAfterGen=Date of next invoice (after generation) Notify_ORDER_VALIDATE=Customer order validated Notify_ORDER_SENTBYMAIL=Customer order sent by mail -Notify_ORDER_SUPPLIER_SENTBYMAIL=Supplier order sent by mail -Notify_ORDER_SUPPLIER_VALIDATE=Supplier order recorded -Notify_ORDER_SUPPLIER_APPROVE=Supplier order approved -Notify_ORDER_SUPPLIER_REFUSE=Supplier order refused +Notify_ORDER_SUPPLIER_SENTBYMAIL=Vendor order sent by mail +Notify_ORDER_SUPPLIER_VALIDATE=Vendor order recorded +Notify_ORDER_SUPPLIER_APPROVE=Vendor order approved +Notify_ORDER_SUPPLIER_REFUSE=Vendor order refused Notify_PROPAL_VALIDATE=Customer proposal validated Notify_PROPAL_CLOSE_SIGNED=Customer proposal closed signed Notify_PROPAL_CLOSE_REFUSED=Customer proposal closed refused @@ -51,10 +51,10 @@ Notify_BILL_UNVALIDATE=Customer invoice unvalidated Notify_BILL_PAYED=Customer invoice paid Notify_BILL_CANCEL=Customer invoice canceled Notify_BILL_SENTBYMAIL=Customer invoice sent by mail -Notify_BILL_SUPPLIER_VALIDATE=Supplier invoice validated -Notify_BILL_SUPPLIER_PAYED=Supplier invoice paid -Notify_BILL_SUPPLIER_SENTBYMAIL=Supplier invoice sent by mail -Notify_BILL_SUPPLIER_CANCELED=Supplier invoice cancelled +Notify_BILL_SUPPLIER_VALIDATE=Vendor invoice validated +Notify_BILL_SUPPLIER_PAYED=Vendor invoice paid +Notify_BILL_SUPPLIER_SENTBYMAIL=Vendor invoice sent by mail +Notify_BILL_SUPPLIER_CANCELED=Vendor invoice cancelled Notify_CONTRACT_VALIDATE=Contract validated Notify_FICHEINTER_VALIDATE=Intervention validated Notify_FICHINTER_ADD_CONTACT=Added contact to Intervention @@ -84,16 +84,17 @@ NbOfActiveNotifications=Number of notifications (no. of recipient emails) PredefinedMailTest=__(Hello)__\nThis is a test mail sent to __EMAIL__.\nThe two lines are separated by a carriage return.\n\n__USER_SIGNATURE__ PredefinedMailTestHtml=__(Hello)__\nThis is a test mail (the word test must be in bold).
The two lines are separated by a carriage return.

__USER_SIGNATURE__ PredefinedMailContentContract=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ -PredefinedMailContentSendInvoice=__(Hello)__\n\nPlease find attached invoice __REF__\n\n__ONLINE_PAYMENT_TEXT_AND_URL__\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ -PredefinedMailContentSendInvoiceReminder=__(Hello)__\n\nWe would like to warn you that the invoice __REF__ seems to have not been paid. The invoice is attached, as a reminder.\n\n__ONLINE_PAYMENT_TEXT_AND_URL__\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ -PredefinedMailContentSendProposal=__(Hello)__\n\nPlease find attached commercial proposal __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ -PredefinedMailContentSendSupplierProposal=__(Hello)__\n\nPlease find attached price request __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ -PredefinedMailContentSendOrder=__(Hello)__\n\nPlease find attached order __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ -PredefinedMailContentSendSupplierOrder=__(Hello)__\n\nPlease find attached our order __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ -PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached invoice __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ -PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ -PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentSendInvoice=__(Hello)__\n\nPlease find invoice __REF__ attached \n\n__ONLINE_PAYMENT_TEXT_AND_URL__\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentSendInvoiceReminder=__(Hello)__\n\nWe would like to remind you that the invoice __REF__ seems to have not been paid. A copy of the invoice is attached as a reminder.\n\n__ONLINE_PAYMENT_TEXT_AND_URL__\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentSendProposal=__(Hello)__\n\nPlease find commercial proposal __REF__ attached \n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentSendSupplierProposal=__(Hello)__\n\nPlease find price request __REF__ attached\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentSendOrder=__(Hello)__\n\nPlease find order __REF__ attached\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentSendSupplierOrder=__(Hello)__\n\nPlease find our order __REF__ attached\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find invoice __REF__ attached\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find shipping __REF__ attached\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find intervention __REF__ attached\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. @@ -180,32 +181,32 @@ StatsByNumberOfEntities=Statistics in number of referring entities (no. of invoi NumberOfProposals=Number of proposals NumberOfCustomerOrders=Number of customer orders NumberOfCustomerInvoices=Number of customer invoices -NumberOfSupplierProposals=Number of supplier proposals -NumberOfSupplierOrders=Number of supplier orders -NumberOfSupplierInvoices=Number of supplier invoices +NumberOfSupplierProposals=Number of vendor proposals +NumberOfSupplierOrders=Number of purchase orders +NumberOfSupplierInvoices=Number of vendor invoices NumberOfUnitsProposals=Number of units on proposals NumberOfUnitsCustomerOrders=Number of units on customer orders NumberOfUnitsCustomerInvoices=Number of units on customer invoices -NumberOfUnitsSupplierProposals=Number of units on supplier proposals -NumberOfUnitsSupplierOrders=Number of units on supplier orders -NumberOfUnitsSupplierInvoices=Number of units on supplier invoices +NumberOfUnitsSupplierProposals=Number of units on vendor proposals +NumberOfUnitsSupplierOrders=Number of units on purchase orders +NumberOfUnitsSupplierInvoices=Number of units on vendor invoices EMailTextInterventionAddedContact=A new intervention %s has been assigned to you. EMailTextInterventionValidated=The intervention %s has been validated. -EMailTextInvoiceValidated=The invoice %s has been validated. -EMailTextInvoicePayed=The invoice %s has been paid. -EMailTextProposalValidated=The proposal %s has been validated. -EMailTextProposalClosedSigned=The proposal %s has been closed signed. -EMailTextOrderValidated=The order %s has been validated. -EMailTextOrderApproved=The order %s has been approved. -EMailTextOrderValidatedBy=The order %s has been recorded by %s. -EMailTextOrderApprovedBy=The order %s has been approved by %s. -EMailTextOrderRefused=The order %s has been refused. -EMailTextOrderRefusedBy=The order %s has been refused by %s. -EMailTextExpeditionValidated=The shipping %s has been validated. -EMailTextExpenseReportValidated=The expense report %s has been validated. -EMailTextExpenseReportApproved=The expensereport %s has been approved. -EMailTextHolidayValidated=The leave request %s has been validated. -EMailTextHolidayApproved=The leave request %s has been approved. +EMailTextInvoiceValidated=Invoice %s has been validated. +EMailTextInvoicePayed=Invoice %s has been paid. +EMailTextProposalValidated=Proposal %s has been validated. +EMailTextProposalClosedSigned=Proposal %s has been closed signed. +EMailTextOrderValidated=Order %s has been validated. +EMailTextOrderApproved=Order %s has been approved. +EMailTextOrderValidatedBy=Order %s has been recorded by %s. +EMailTextOrderApprovedBy=Order %s has been approved by %s. +EMailTextOrderRefused=Order %s has been refused. +EMailTextOrderRefusedBy=Order %s has been refused by %s. +EMailTextExpeditionValidated=Shipping %s has been validated. +EMailTextExpenseReportValidated=Expense report %s has been validated. +EMailTextExpenseReportApproved=Expense report %s has been approved. +EMailTextHolidayValidated=Leave request %s has been validated. +EMailTextHolidayApproved=Leave request %s has been approved. ImportedWithSet=Importation data set DolibarrNotification=Automatic notification ResizeDesc=Enter new width OR new height. Ratio will be kept during resizing... diff --git a/htdocs/langs/en_US/paybox.lang b/htdocs/langs/en_US/paybox.lang index 0d35ac440fa..4f2fd7e6288 100644 --- a/htdocs/langs/en_US/paybox.lang +++ b/htdocs/langs/en_US/paybox.lang @@ -20,7 +20,7 @@ ToOfferALinkForOnlinePaymentOnInvoice=URL to offer a %s online payment user inte ToOfferALinkForOnlinePaymentOnContractLine=URL to offer a %s online payment user interface for a contract line ToOfferALinkForOnlinePaymentOnFreeAmount=URL to offer a %s online payment user interface for a free amount ToOfferALinkForOnlinePaymentOnMemberSubscription=URL to offer a %s online payment user interface for a member subscription -ToOfferALinkForOnlinePaymentOnDonation=URL to offer a %s online payment user interface for payment of donation +ToOfferALinkForOnlinePaymentOnDonation=URL to offer a %s online payment, user interface for payment of donation YouCanAddTagOnUrl=You can also add url parameter &tag=value to any of those URL (required only for free payment) to add your own payment comment tag. SetupPayBoxToHavePaymentCreatedAutomatically=Setup your Paybox with url %s to have payment created automatically when validated by Paybox. YourPaymentHasBeenRecorded=This page confirms that your payment has been recorded. Thank you. @@ -33,7 +33,7 @@ VendorName=Name of vendor CSSUrlForPaymentForm=CSS style sheet url for payment form NewPayboxPaymentReceived=New Paybox payment received NewPayboxPaymentFailed=New Paybox payment tried but failed -PAYBOX_PAYONLINE_SENDEMAIL=EMail to warn after a payment (success or failed) +PAYBOX_PAYONLINE_SENDEMAIL=Email notification after payment attempt (success or fail) PAYBOX_PBX_SITE=Value for PBX SITE PAYBOX_PBX_RANG=Value for PBX Rang PAYBOX_PBX_IDENTIFIANT=Value for PBX ID diff --git a/htdocs/langs/en_US/paypal.lang b/htdocs/langs/en_US/paypal.lang index d34bb4baf18..51e98ccc8a2 100644 --- a/htdocs/langs/en_US/paypal.lang +++ b/htdocs/langs/en_US/paypal.lang @@ -1,6 +1,6 @@ # Dolibarr language file - Source file is en_US - paypal PaypalSetup=PayPal module setup -PaypalDesc=This module allows payment on PayPal by customers. This can be used for a free payment or for a payment on a particular Dolibarr object (invoice, order, ...) +PaypalDesc=This module allows payment by customers via PayPal. This can be used for a ad-hoc payment or for a payment related to a Dolibarr object (invoice, order, ...) PaypalOrCBDoPayment=Pay with PayPal (Credit Card or PayPal) PaypalDoPayment=Pay with PayPal PAYPAL_API_SANDBOX=Mode test/sandbox @@ -8,15 +8,16 @@ PAYPAL_API_USER=API username PAYPAL_API_PASSWORD=API password PAYPAL_API_SIGNATURE=API signature PAYPAL_SSLVERSION=Curl SSL Version -PAYPAL_API_INTEGRAL_OR_PAYPALONLY=Offer payment "integral" (Credit card+PayPal) or "PayPal" only +PAYPAL_API_INTEGRAL_OR_PAYPALONLY=Offer "integral" payment (Credit card+PayPal) or "PayPal" only PaypalModeIntegral=Integral PaypalModeOnlyPaypal=PayPal only ONLINE_PAYMENT_CSS_URL=Optional URL of CSS stylesheet on online payment page ThisIsTransactionId=This is id of transaction: %s -PAYPAL_ADD_PAYMENT_URL=Add the url of PayPal payment when you send a document by mail +PAYPAL_ADD_PAYMENT_URL=Include the PayPal payment url when you send a document by email +YouAreCurrentlyInSandboxMode=You are currently in the %s "sandbox" mode NewOnlinePaymentReceived=New online payment received NewOnlinePaymentFailed=New online payment tried but failed -ONLINE_PAYMENT_SENDEMAIL=EMail to warn after a payment (success or not) +ONLINE_PAYMENT_SENDEMAIL=Email address for notifications after each payment attempt (for success and fail) ReturnURLAfterPayment=Return URL after payment ValidationOfOnlinePaymentFailed=Validation of online payment failed PaymentSystemConfirmPaymentPageWasCalledButFailed=Payment confirmation page was called by payment system returned an error @@ -27,7 +28,7 @@ ShortErrorMessage=Short Error Message ErrorCode=Error Code ErrorSeverityCode=Error Severity Code OnlinePaymentSystem=Online payment system -PaypalLiveEnabled=PayPal live enabled (otherwise test/sandbox mode) +PaypalLiveEnabled=PayPal "live" mode enabled (otherwise test/sandbox mode) PaypalImportPayment=Import PayPal payments PostActionAfterPayment=Post actions after payments ARollbackWasPerformedOnPostActions=A rollback was performed on all Post actions. You must complete post actions manually if they are necessary. diff --git a/htdocs/langs/en_US/products.lang b/htdocs/langs/en_US/products.lang index 95b93aba4e9..5c1242a4181 100644 --- a/htdocs/langs/en_US/products.lang +++ b/htdocs/langs/en_US/products.lang @@ -16,8 +16,8 @@ Create=Create Reference=Reference NewProduct=New product NewService=New service -ProductVatMassChange=Mass VAT change -ProductVatMassChangeDesc=This page can be used to modify a VAT rate defined on products or services from one value to another. Warning, this change is global/done on all database. +ProductVatMassChange=Global VAT Update +ProductVatMassChangeDesc=This tool updates the VAT rate defined on ALL products and services! MassBarcodeInit=Mass barcode init MassBarcodeInitDesc=This page can be used to initialize a barcode on objects that does not have barcode defined. Check before that setup of module barcode is complete. ProductAccountancyBuyCode=Accounting code (purchase) @@ -36,16 +36,16 @@ ServicesOnSaleOnly=Services for sale only ServicesOnPurchaseOnly=Services for purchase only ServicesNotOnSell=Services not for sale and not for purchase ServicesOnSellAndOnBuy=Services for sale and for purchase -LastModifiedProductsAndServices=Latest %s modified products/services +LastModifiedProductsAndServices=Last %s modified products/services LastRecordedProducts=Latest %s recorded products LastRecordedServices=Latest %s recorded services CardProduct0=Product card CardProduct1=Service card Stock=Stock -Stocks=Stocks +Stocks=Stocks and location (warehouse) of products Movements=Movements -Sell=Sales -Buy=Purchases +Sell=Sell +Buy=Purchase OnSell=For sale OnBuy=For purchase NotOnSell=Not for sale @@ -60,16 +60,16 @@ ProductStatusNotOnBuyShort=Not for purchase UpdateVAT=Update vat UpdateDefaultPrice=Update default price UpdateLevelPrices=Update prices for each level -AppliedPricesFrom=Applied prices from +AppliedPricesFrom=Applied from SellingPrice=Selling price -SellingPriceHT=Selling price (net of tax) +SellingPriceHT=Selling price (excl. tax) SellingPriceTTC=Selling price (inc. tax) -CostPriceDescription=This price (net of tax) can be used to store the average amount this product cost to your company. It may be any price you calculate yourself, for example from the average buying price plus average production and distribution cost. +CostPriceDescription=This price field (excl. tax) can be used to store the average amount this product costs to your company. It may be any price you calculate yourself, for example from the average buying price plus average production and distribution cost. CostPriceUsage=This value could be used for margin calculation. SoldAmount=Sold amount PurchasedAmount=Purchased amount NewPrice=New price -MinPrice=Min. selling price +MinPrice=Min. sell price EditSellingPriceLabel=Edit selling price label CantBeLessThanMinPrice=The selling price can't be lower than minimum allowed for this product (%s without tax). This message can also appears if you type a too important discount. ContractStatusClosed=Closed @@ -77,8 +77,8 @@ ErrorProductAlreadyExists=A product with reference %s already exists. ErrorProductBadRefOrLabel=Wrong value for reference or label. ErrorProductClone=There was a problem while trying to clone the product or service. ErrorPriceCantBeLowerThanMinPrice=Error, price can't be lower than minimum price. -Suppliers=Suppliers -SupplierRef=Supplier's product ref. +Suppliers=Vendors +SupplierRef=Vendor SKU ShowProduct=Show product ShowService=Show service ProductsAndServicesArea=Product and Services area @@ -87,7 +87,7 @@ ServicesArea=Services area ListOfStockMovements=List of stock movements BuyingPrice=Buying price PriceForEachProduct=Products with specific prices -SupplierCard=Supplier card +SupplierCard=Vendor card PriceRemoved=Price removed BarCode=Barcode BarcodeType=Barcode type @@ -95,7 +95,7 @@ SetDefaultBarcodeType=Set barcode type BarcodeValue=Barcode value NoteNotVisibleOnBill=Note (not visible on invoices, proposals...) ServiceLimitedDuration=If product is a service with limited duration: -MultiPricesAbility=Several segment of prices per product/service (each customer is in one segment) +MultiPricesAbility=Multiple price segments per product/service (each customer is in one price segment) MultiPricesNumPrices=Number of prices AssociatedProductsAbility=Activate virtual products (kits) AssociatedProducts=Virtual products @@ -109,7 +109,7 @@ CategoryFilter=Category filter ProductToAddSearch=Search product to add NoMatchFound=No match found ListOfProductsServices=List of products/services -ProductAssociationList=List of products/services that are component of this virtual product/package +ProductAssociationList=List of products/services that are component(s) of this virtual product/kit ProductParentList=List of virtual products/services with this product as a component ErrorAssociationIsFatherOfThis=One of selected product is parent with current product DeleteProduct=Delete a product/service @@ -122,15 +122,15 @@ ImportDataset_service_1=Services DeleteProductLine=Delete product line ConfirmDeleteProductLine=Are you sure you want to delete this product line? ProductSpecial=Special -QtyMin=Minimum Qty -PriceQtyMin=Price for this min. qty (w/o discount) -PriceQtyMinCurrency=Price for this min. qty (w/o discount) (currency) -VATRateForSupplierProduct=VAT Rate (for this supplier/product) -DiscountQtyMin=Default discount for qty -NoPriceDefinedForThisSupplier=No price/qty defined for this supplier/product -NoSupplierPriceDefinedForThisProduct=No supplier price/qty defined for this product -PredefinedProductsToSell=Predefined products to sell -PredefinedServicesToSell=Predefined services to sell +QtyMin=Min. purchase quantity +PriceQtyMin=Equivalent/calculated price +PriceQtyMinCurrency=Price (currency) for this qty. (no discount) +VATRateForSupplierProduct=VAT Rate (for this vendor/product) +DiscountQtyMin=Discount for this qty. +NoPriceDefinedForThisSupplier=No price/qty defined for this vendor/product +NoSupplierPriceDefinedForThisProduct=No vendor price/qty defined for this product +PredefinedProductsToSell=Predefined Product +PredefinedServicesToSell=Predefined Service PredefinedProductsAndServicesToSell=Predefined products/services to sell PredefinedProductsToPurchase=Predefined product to purchase PredefinedServicesToPurchase=Predefined services to purchase @@ -154,11 +154,11 @@ NewRefForClone=Ref. of new product/service SellingPrices=Selling prices BuyingPrices=Buying prices CustomerPrices=Customer prices -SuppliersPrices=Supplier prices -SuppliersPricesOfProductsOrServices=Supplier prices (of products or services) +SuppliersPrices=Vendor prices +SuppliersPricesOfProductsOrServices=Vendor prices (of products or services) CustomCode=Customs / Commodity / HS code CountryOrigin=Origin country -Nature=Nature +Nature=Product Type (material/finished) ShortLabel=Short label Unit=Unit p=u. @@ -218,18 +218,18 @@ Quarter1=1st. Quarter Quarter2=2nd. Quarter Quarter3=3rd. Quarter Quarter4=4th. Quarter -BarCodePrintsheet=Print bar code -PageToGenerateBarCodeSheets=With this tool, you can print sheets of bar code stickers. Choose format of your sticker page, type of barcode and value of barcode, then click on button %s. +BarCodePrintsheet=Print barcode +PageToGenerateBarCodeSheets=With this tool, you can print sheets of barcode stickers. Choose format of your sticker page, type of barcode and value of barcode, then click on button %s. NumberOfStickers=Number of stickers to print on page PrintsheetForOneBarCode=Print several stickers for one barcode BuildPageToPrint=Generate page to print FillBarCodeTypeAndValueManually=Fill barcode type and value manually. FillBarCodeTypeAndValueFromProduct=Fill barcode type and value from barcode of a product. FillBarCodeTypeAndValueFromThirdParty=Fill barcode type and value from barcode of a third party. -DefinitionOfBarCodeForProductNotComplete=Definition of type or value of bar code not complete for product %s. -DefinitionOfBarCodeForThirdpartyNotComplete=Definition of type or value of bar code non complete for third party %s. -BarCodeDataForProduct=Barcode information of product %s : -BarCodeDataForThirdparty=Barcode information of third party %s : +DefinitionOfBarCodeForProductNotComplete=Definition of type or value of barcode not complete for product %s. +DefinitionOfBarCodeForThirdpartyNotComplete=Definition of type or value of barcode non complete for third party %s. +BarCodeDataForProduct=Barcode information of product %s: +BarCodeDataForThirdparty=Barcode information of third party %s: ResetBarcodeForAllRecords=Define barcode value for all record (this will also reset barcode value already defined with new values) PriceByCustomer=Different prices for each customer PriceCatalogue=A single sell price per product/service @@ -238,23 +238,23 @@ AddCustomerPrice=Add price by customer ForceUpdateChildPriceSoc=Set same price on customer subsidiaries PriceByCustomerLog=Log of previous customer prices MinimumPriceLimit=Minimum price can't be lower then %s -MinimumRecommendedPrice=Minimum recommended price is : %s +MinimumRecommendedPrice=Minimum recommended price is: %s PriceExpressionEditor=Price expression editor PriceExpressionSelected=Selected price expression PriceExpressionEditorHelp1="price = 2 + 2" or "2 + 2" for setting the price. Use ; to separate expressions PriceExpressionEditorHelp2=You can access ExtraFields with variables like #extrafield_myextrafieldkey# and global variables with #global_mycode# -PriceExpressionEditorHelp3=In both product/service and supplier prices there are these variables available:
#tva_tx# #localtax1_tx# #localtax2_tx# #weight# #length# #surface# #price_min# -PriceExpressionEditorHelp4=In product/service price only: #supplier_min_price#
In supplier prices only: #supplier_quantity# and #supplier_tva_tx# +PriceExpressionEditorHelp3=In both product/service and vendor prices there are these variables available:
#tva_tx# #localtax1_tx# #localtax2_tx# #weight# #length# #surface# #price_min# +PriceExpressionEditorHelp4=In product/service price only: #supplier_min_price#
In vendor prices only: #supplier_quantity# and #supplier_tva_tx# PriceExpressionEditorHelp5=Available global values: PriceMode=Price mode PriceNumeric=Number DefaultPrice=Default price ComposedProductIncDecStock=Increase/Decrease stock on parent change -ComposedProduct=Sub-product +ComposedProduct=Child products MinSupplierPrice=Minimum buying price MinCustomerPrice=Minimum selling price DynamicPriceConfiguration=Dynamic price configuration -DynamicPriceDesc=On product card, with this module enabled, you should be able to set mathematic functions to calculate Customer or Supplier prices. Such function can use all mathematic operators, some constants and variables. You can set here the variables you want to be able to use and if the variable need an automatic update, the external URL to use to ask Dolibarr to update the value automatically. +DynamicPriceDesc=You may define mathematical formulae to calculate Customer or Vendor prices. Such formulas can use all mathematical operators, some constants and variables. You can define here the variables you wish to use. If the variable needs an automatic update, you may define the external URL to allow Dolibarr to update the value automatically. AddVariable=Add Variable AddUpdater=Add Updater GlobalVariables=Global variables @@ -277,7 +277,7 @@ WarningSelectOneDocument=Please select at least one document DefaultUnitToShow=Unit NbOfQtyInProposals=Qty in proposals ClinkOnALinkOfColumn=Click on a link of column %s to get a detailed view... -ProductsOrServicesTranslations=Products or services translation +ProductsOrServicesTranslations=Products/Services translations TranslatedLabel=Translated label TranslatedDescription=Translated description TranslatedNote=Translated notes @@ -293,8 +293,8 @@ ProductSheet=Product sheet ServiceSheet=Service sheet PossibleValues=Possible values GoOnMenuToCreateVairants=Go on menu %s - %s to prepare attribute variants (like colors, size, ...) -UseProductFournDesc=Use supplier descriptions of products in supplier documents -ProductSupplierDescription=Supplier description for the product +UseProductFournDesc=Use vendor descriptions of products in vendor documents +ProductSupplierDescription=Vendor description for the product #Attributes VariantAttributes=Variant attributes ProductAttributes=Variant attributes for products diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang index 12333c0de9d..32658dcc56a 100644 --- a/htdocs/langs/en_US/projects.lang +++ b/htdocs/langs/en_US/projects.lang @@ -7,7 +7,7 @@ ProjectsArea=Projects Area ProjectStatus=Project status SharedProject=Everybody PrivateProject=Project contacts -ProjectsImContactFor=Projects I'm explicitely a contact of +ProjectsImContactFor=Projects for I am explicitly a contact AllAllowedProjects=All project I can read (mine + public) AllProjects=All projects MyProjectsDesc=This view is limited to projects you are a contact for @@ -84,8 +84,8 @@ ListProposalsAssociatedProject=List of the commercial proposals related to the p ListOrdersAssociatedProject=List of customer orders related to the project ListInvoicesAssociatedProject=List of customer invoices related to the project ListPredefinedInvoicesAssociatedProject=List of customer template invoices related to the project -ListSupplierOrdersAssociatedProject=List of supplier orders related to the project -ListSupplierInvoicesAssociatedProject=List of supplier invoices related to the project +ListSupplierOrdersAssociatedProject=List of purchase orders related to the project +ListSupplierInvoicesAssociatedProject=List of vendor invoices related to the project ListContractAssociatedProject=List of contracts related to the project ListShippingAssociatedProject=List of shippings related to the project ListFichinterAssociatedProject=List of interventions related to the project @@ -130,7 +130,7 @@ LinkedToAnotherCompany=Linked to other third party TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Time spent is empty ThisWillAlsoRemoveTasks=This action will also delete all tasks of project (%s tasks at the moment) and all inputs of time spent. -IfNeedToUseOhterObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. +IfNeedToUseOtherObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. CloneProject=Clone project CloneTasks=Clone tasks CloneContacts=Clone contacts @@ -149,13 +149,13 @@ TaskCreatedInDolibarr=Task %s created TaskModifiedInDolibarr=Task %s modified TaskDeletedInDolibarr=Task %s deleted OpportunityStatus=Lead status -OpportunityStatusShort=Opp. status +OpportunityStatusShort=Lead status OpportunityProbability=Lead probability -OpportunityProbabilityShort=Opp. probab. +OpportunityProbabilityShort=Lead probab. OpportunityAmount=Lead amount -OpportunityAmountShort=Opp. amount -OpportunityAmountAverageShort=Average Opp. amount -OpportunityAmountWeigthedShort=Weighted Opp. amount +OpportunityAmountShort=Lead amount +OpportunityAmountAverageShort=Average lead amount +OpportunityAmountWeigthedShort=Weighted lead amount WonLostExcluded=Won/Lost excluded ##### Types de contacts ##### TypeContact_project_internal_PROJECTLEADER=Project leader @@ -221,11 +221,11 @@ OppStatusPENDING=Pending OppStatusWON=Won OppStatusLOST=Lost Budget=Budget -AllowToLinkFromOtherCompany=Allow to link project from other company

Supported values :
- Keep empty: Can link any project of the company (default)
- "all" : Can link any projects, even project of other companies
- A list of thirdparty id separated with commas : Can link all projects of these thirdparty defined (Example : 123,4795,53)
+AllowToLinkFromOtherCompany=Allow to link project from other company

Supported values:
- Keep empty: Can link any project of the company (default)
- "all": Can link any projects, even projects of other companies
- A list of third-party ids separated by commas: can link all projects of these third partys (Example: 123,4795,53)
LatestProjects=Latest %s projects LatestModifiedProjects=Latest %s modified projects OtherFilteredTasks=Other filtered tasks -NoAssignedTasks=No assigned tasks (assign project/tasks the current user from the top select box to enter time on it) +NoAssignedTasks=No assigned tasks found (assign project/tasks to the current user from the top select box to enter time on it) # Comments trans AllowCommentOnTask=Allow user comments on tasks AllowCommentOnProject=Allow user comments on projects @@ -234,4 +234,4 @@ DontHaveTheValidateStatus=The project %s must be open to be closed RecordsClosed=%s project(s) closed SendProjectRef=Information project %s ModuleSalaryToDefineHourlyRateMustBeEnabled=Module 'Payment of employee wages' must be enabled to define employee hourly rate to have time spent valorized -NewTaskRefSuggested=Task ref already used, a new task ref is suggested \ No newline at end of file +NewTaskRefSuggested=Task ref already used, a new task ref is required diff --git a/htdocs/langs/en_US/propal.lang b/htdocs/langs/en_US/propal.lang index c258381ea85..44da81357ef 100644 --- a/htdocs/langs/en_US/propal.lang +++ b/htdocs/langs/en_US/propal.lang @@ -22,7 +22,7 @@ SearchAProposal=Search a proposal NoProposal=No proposal ProposalsStatistics=Commercial proposal's statistics NumberOfProposalsByMonth=Number by month -AmountOfProposalsByMonthHT=Amount by month (net of tax) +AmountOfProposalsByMonthHT=Amount by month (excl. tax) NbOfProposals=Number of commercial proposals ShowPropal=Show proposal PropalsDraft=Drafts @@ -83,4 +83,4 @@ DefaultModelPropalCreate=Default model creation DefaultModelPropalToBill=Default template when closing a business proposal (to be invoiced) DefaultModelPropalClosed=Default template when closing a business proposal (unbilled) ProposalCustomerSignature=Written acceptance, company stamp, date and signature -ProposalsStatisticsSuppliers=Supplier proposals statistics +ProposalsStatisticsSuppliers=Vendor proposals statistics diff --git a/htdocs/langs/en_US/receptions.lang b/htdocs/langs/en_US/receptions.lang new file mode 100644 index 00000000000..87cf954fea8 --- /dev/null +++ b/htdocs/langs/en_US/receptions.lang @@ -0,0 +1,70 @@ +# Dolibarr language file - Source file is en_US - receptions +RefReception=Ref. reception +Reception=Reception +Receptions=Receptions +AllReceptions=All Receptions +Reception=Reception +Receptions=Receptions +ShowReception=Show Receptions +Receivings=Delivery Receipts +ReceptionsArea=Receptions area +ListOfReceptions=List of receptions +ReceptionMethod=Reception method +LastReceptions=Latest %s receptions +StatisticsOfReceptions=Statistics for receptions +NbOfReceptions=Number of receptions +NumberOfReceptionsByMonth=Number of receptions by month +ReceptionCard=Reception card +NewReception=New reception +CreateReception=Create reception +QtyShipped=Qty shipped +QtyPreparedOrShipped=Qty prepared or shipped +QtyToShip=Qty to ship +QtyReceived=Qty received +QtyInOtherReceptions=Qty in other receptions +KeepToShip=Remain to ship +OtherReceptionsForSameOrder=Other receptions for this order +ReceptionsAndReceivingForSameOrder=Receptions and receipts for this order +ReceptionsToValidate=Receptions to validate +StatusReceptionCanceled=Canceled +StatusReceptionDraft=Draft +StatusReceptionValidated=Validated (products to ship or already shipped) +StatusReceptionProcessed=Processed +StatusReceptionDraftShort=Draft +StatusReceptionValidatedShort=Validated +StatusReceptionProcessedShort=Processed +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? +DocumentModelMerou=Merou A5 model +WarningNoQtyLeftToSend=Warning, no products waiting to be shipped. +StatsOnReceptionsOnlyValidated=Statistics conducted on receptions only validated. Date used is date of validation of reception (planed delivery date is not always known). +DateDeliveryPlanned=Planned date of delivery +RefDeliveryReceipt=Ref delivery receipt +StatusReceipt=Status delivery receipt +DateReceived=Date delivery received +SendReceptionByEMail=Send reception by EMail +SendReceptionRef=Submission of reception %s +ActionsOnReception=Events on reception +LinkToTrackYourPackage=Link to track your package +ReceptionCreationIsDoneFromOrder=For the moment, creation of a new reception is done from the order card. +ReceptionLine=Reception line +ProductQtyInCustomersOrdersRunning=Product quantity into open customers orders +ProductQtyInSuppliersOrdersRunning=Product quantity into open suppliers orders +ProductQtyInReceptionAlreadySent=Product quantity from open customer order already sent +ProductQtyInSuppliersReceptionAlreadyRecevied=Product quantity from open supplier order already received +NoProductToShipFoundIntoStock=No product to ship found into warehouse %s. Correct stock or go back to choose another warehouse. +WeightVolShort=Weight/Vol. +ValidateOrderFirstBeforeReception=You must first validate the order before being able to make receptions. + +# Reception methods +# ModelDocument +DocumentModelTyphon=More complete document model for delivery receipts (logo...) +Error_EXPEDITION_ADDON_NUMBER_NotDefined=Constant EXPEDITION_ADDON_NUMBER not defined +SumOfProductVolumes=Sum of product volumes +SumOfProductWeights=Sum of product weights + +# warehouse details +DetailWarehouseNumber= Warehouse details +DetailWarehouseFormat= W:%s (Qty : %d) diff --git a/htdocs/langs/en_US/salaries.lang b/htdocs/langs/en_US/salaries.lang index 620517b5324..1e3607ce7cc 100644 --- a/htdocs/langs/en_US/salaries.lang +++ b/htdocs/langs/en_US/salaries.lang @@ -12,8 +12,8 @@ ShowSalaryPayment=Show salary payment THM=Average hourly rate TJM=Average daily rate CurrentSalary=Current salary -THMDescription=This value may be used to calculate cost of time consumed on a project entered by users if module project is used -TJMDescription=This value is currently as information only and is not used for any calculation +THMDescription=This value may be used to calculate the cost of time consumed on a project entered by users if module project is used +TJMDescription=This value is currently for information only and is not used for any calculation LastSalaries=Latest %s salary payments AllSalaries=All salary payments SalariesStatistics=Salary statistics diff --git a/htdocs/langs/en_US/sendings.lang b/htdocs/langs/en_US/sendings.lang index 2b46ada5ee9..bdfa1df9d36 100644 --- a/htdocs/langs/en_US/sendings.lang +++ b/htdocs/langs/en_US/sendings.lang @@ -46,7 +46,7 @@ DateDeliveryPlanned=Planned date of delivery RefDeliveryReceipt=Ref delivery receipt StatusReceipt=Status delivery receipt DateReceived=Date delivery received -SendShippingByEMail=Send shipment by EMail +SendShippingByEMail=Send shipment by email SendShippingRef=Submission of shipment %s ActionsOnShipping=Events on shipment LinkToTrackYourPackage=Link to track your package @@ -55,7 +55,7 @@ ShipmentLine=Shipment line ProductQtyInCustomersOrdersRunning=Product quantity into open customer orders ProductQtyInSuppliersOrdersRunning=Product quantity into open purchase orders ProductQtyInShipmentAlreadySent=Product quantity from open customer order already sent -ProductQtyInSuppliersShipmentAlreadyRecevied=Product quantity from open supplier order already received +ProductQtyInSuppliersShipmentAlreadyRecevied=Product quantity from open purchase order already received NoProductToShipFoundIntoStock=No product to ship found in warehouse %s. Correct stock or go back to choose another warehouse. WeightVolShort=Weight/Vol. ValidateOrderFirstBeforeShipment=You must first validate the order before being able to make shipments. @@ -69,4 +69,4 @@ SumOfProductWeights=Sum of product weights # warehouse details DetailWarehouseNumber= Warehouse details -DetailWarehouseFormat= W:%s (Qty : %d) +DetailWarehouseFormat= W:%s (Qty: %d) diff --git a/htdocs/langs/en_US/sms.lang b/htdocs/langs/en_US/sms.lang index 79bd8827198..055085eb16a 100644 --- a/htdocs/langs/en_US/sms.lang +++ b/htdocs/langs/en_US/sms.lang @@ -44,7 +44,7 @@ NbOfSms=No. of phone numbers ThisIsATestMessage=This is a test message SendSms=Send SMS SmsInfoCharRemain=No. of remaining characters -SmsInfoNumero= (international format ie : +33899701761) +SmsInfoNumero= (international format i.e.: +33899701761) DelayBeforeSending=Delay before sending (minutes) SmsNoPossibleSenderFound=No sender available. Check setup of your SMS provider. SmsNoPossibleRecipientFound=No target available. Check setup of your SMS provider. diff --git a/htdocs/langs/en_US/stocks.lang b/htdocs/langs/en_US/stocks.lang index fbbc00887aa..dc1c72f3a3e 100644 --- a/htdocs/langs/en_US/stocks.lang +++ b/htdocs/langs/en_US/stocks.lang @@ -5,7 +5,7 @@ Warehouses=Warehouses ParentWarehouse=Parent warehouse NewWarehouse=New warehouse / Stock area WarehouseEdit=Modify warehouse -MenuNewWarehouse=New warehouse +MenuNewWarehouse=New Warehouse WarehouseSource=Source warehouse WarehouseSourceNotDefined=No warehouse defined, AddWarehouse=Create warehouse @@ -65,9 +65,9 @@ DeStockOnBill=Decrease real stocks on validation of customer invoice/credit note DeStockOnValidateOrder=Decrease real stocks on validation of customer order DeStockOnShipment=Decrease real stocks on shipping validation DeStockOnShipmentOnClosing=Decrease real stocks on shipping classification closed -ReStockOnBill=Increase real stocks on validation of supplier invoice/credit note +ReStockOnBill=Increase real stocks on validation of vendor invoice/credit note ReStockOnValidateOrder=Increase real stocks on purchase order approval -ReStockOnDispatchOrder=Increase real stocks on manual dispatching into warehouse, after supplier order receipt of goods +ReStockOnDispatchOrder=Increase real stocks on manual dispatching into warehouse, after purchase order receipt of goods OrderStatusNotReadyToDispatch=Order has not yet or no more a status that allows dispatching of products in stock warehouses. StockDiffPhysicTeoric=Explanation for difference between physical and virtual stock NoPredefinedProductToDispatch=No predefined products for this object. So no dispatching in stock is required. @@ -75,12 +75,12 @@ DispatchVerb=Dispatch StockLimitShort=Limit for alert StockLimit=Stock limit for alert StockLimitDesc=(empty) means no warning.
0 can be used for a warning as soon as stock is empty. -PhysicalStock=Physical stock +PhysicalStock=Physical Stock RealStock=Real Stock -RealStockDesc=Physical or real stock is the stock you currently have into your internal warehouses/emplacements. -RealStockWillAutomaticallyWhen=The real stock will automatically change according to this rules (see stock module setup to change this): +RealStockDesc=Physical/real stock is the stock currently in the warehouses. +RealStockWillAutomaticallyWhen=The real stock will be modified according to this rule (as defined in the Stock module): VirtualStock=Virtual stock -VirtualStockDesc=Virtual stock is the stock you will get once all open pending actions that affect stocks will be closed (supplier order received, customer order shipped, ...) +VirtualStockDesc=Virtual stock is the calculated stock available once all open/pending actions (that affect stocks) are closed (purchase orders received, customer orders shipped etc.) IdWarehouse=Id warehouse DescWareHouse=Description warehouse LieuWareHouse=Localisation warehouse @@ -100,7 +100,7 @@ ThisWarehouseIsPersonalStock=This warehouse represents personal stock of %s %s SelectWarehouseForStockDecrease=Choose warehouse to use for stock decrease SelectWarehouseForStockIncrease=Choose warehouse to use for stock increase NoStockAction=No stock action -DesiredStock=Desired optimal stock +DesiredStock=Desired Stock DesiredStockDesc=This stock amount will be the value used to fill the stock by replenishment feature. StockToBuy=To order Replenishment=Replenishment @@ -113,13 +113,13 @@ CurentSelectionMode=Current selection mode CurentlyUsingVirtualStock=Virtual stock CurentlyUsingPhysicalStock=Physical stock RuleForStockReplenishment=Rule for stocks replenishment -SelectProductWithNotNullQty=Select at least one product with a qty not null and a supplier +SelectProductWithNotNullQty=Select at least one product with a qty not null and a vendor AlertOnly= Alerts only WarehouseForStockDecrease=The warehouse %s will be used for stock decrease WarehouseForStockIncrease=The warehouse %s will be used for stock increase ForThisWarehouse=For this warehouse -ReplenishmentStatusDesc=This is a list of all products with a stock lower than desired stock (or lower than alert value if checkbox "alert only" is checked). Using the checkbox, you can create supplier orders to fill the difference. -ReplenishmentOrdersDesc=This is a list of all open supplier orders including predefined products. Only open orders with predefined products, so orders that may affect stocks, are visible here. +ReplenishmentStatusDesc=This is a list of all products with a stock lower than desired stock (or lower than alert value if checkbox "alert only" is checked). Using the checkbox, you can create purchase orders to fill the difference. +ReplenishmentOrdersDesc=This is a list of all open purchase orders including predefined products. Only open orders with predefined products, so orders that may affect stocks, are visible here. Replenishments=Replenishments NbOfProductBeforePeriod=Quantity of product %s in stock before selected period (< %s) NbOfProductAfterPeriod=Quantity of product %s in stock after selected period (> %s) @@ -143,11 +143,11 @@ ShowWarehouse=Show warehouse MovementCorrectStock=Stock correction for product %s MovementTransferStock=Stock transfer of product %s into another warehouse InventoryCodeShort=Inv./Mov. code -NoPendingReceptionOnSupplierOrder=No pending reception due to open supplier order +NoPendingReceptionOnSupplierOrder=No pending reception due to open purchase order ThisSerialAlreadyExistWithDifferentDate=This lot/serial number (%s) already exists but with different eatby or sellby date (found %s but you enter %s). OpenAll=Open for all actions OpenInternal=Open only for internal actions -UseDispatchStatus=Use a dispatch status (approve/refuse) for product lines on supplier order reception +UseDispatchStatus=Use a dispatch status (approve/refuse) for product lines on purchase order reception OptionMULTIPRICESIsOn=Option "several prices per segment" is on. It means a product has several selling price so value for sell can't be calculated ProductStockWarehouseCreated=Stock limit for alert and desired optimal stock correctly created ProductStockWarehouseUpdated=Stock limit for alert and desired optimal stock correctly updated @@ -171,16 +171,16 @@ inventoryValidate=Validated inventoryDraft=Running inventorySelectWarehouse=Warehouse choice inventoryConfirmCreate=Create -inventoryOfWarehouse=Inventory for warehouse : %s -inventoryErrorQtyAdd=Error : one quantity is less than zero +inventoryOfWarehouse=Inventory for warehouse: %s +inventoryErrorQtyAdd=Error: one quantity is less than zero inventoryMvtStock=By inventory inventoryWarningProductAlreadyExists=This product is already into list SelectCategory=Category filter -SelectFournisseur=Supplier filter +SelectFournisseur=Vendor filter inventoryOnDate=Inventory -INVENTORY_DISABLE_VIRTUAL=Allow to not destock child product from a kit on inventory +INVENTORY_DISABLE_VIRTUAL=Virtual product (kit): do not decrement stock of a child product INVENTORY_USE_MIN_PA_IF_NO_LAST_PA=Use the buy price if no last buy price can be found -INVENTORY_USE_INVENTORY_DATE_FROM_DATEMVT=Stock movement have date of inventory +INVENTORY_USE_INVENTORY_DATE_FROM_DATEMVT=Stock movement has date of inventory inventoryChangePMPPermission=Allow to change PMP value for a product ColumnNewPMP=New unit PMP OnlyProdsInStock=Do not add product without stock @@ -202,7 +202,7 @@ inventoryDeleteLine=Delete line RegulateStock=Regulate Stock ListInventory=List StockSupportServices=Stock management supports Services -StockSupportServicesDesc=By default, you can stock only product with type "product". If on, and if module service is on, you can also stock a product with type "service" +StockSupportServicesDesc=By default, you can stock only products of type "product". You may also stock a product of type "service" if both module Services and this option are enabled. ReceiveProducts=Receive items StockIncreaseAfterCorrectTransfer=Increase by correction/transfer StockDecreaseAfterCorrectTransfer=Decrease by correction/transfer diff --git a/htdocs/langs/en_US/stripe.lang b/htdocs/langs/en_US/stripe.lang index ed3d24f4370..2bf1fb00849 100644 --- a/htdocs/langs/en_US/stripe.lang +++ b/htdocs/langs/en_US/stripe.lang @@ -1,6 +1,6 @@ # Dolibarr language file - Source file is en_US - stripe StripeSetup=Stripe module setup -StripeDesc=Module to offer an online payment page accepting payments with Credit/Debit card via Stripe. This can be used to allow your customers to make free payments or for a payment on a particular Dolibarr object (invoice, order, ...) +StripeDesc=Offer customers a Stripe online payment page for payments with credit/cebit 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, ...) StripeOrCBDoPayment=Pay with credit card or Stripe FollowingUrlAreAvailableToMakePayments=Following URLs are available to offer a page to a customer to make a payment on Dolibarr objects PaymentForm=Payment form @@ -9,7 +9,7 @@ ThisScreenAllowsYouToPay=This screen allow you to make an online payment to %s. ThisIsInformationOnPayment=This is information on payment to do ToComplete=To complete YourEMail=Email to receive payment confirmation -STRIPE_PAYONLINE_SENDEMAIL=EMail to warn after a payment (success or not) +STRIPE_PAYONLINE_SENDEMAIL=Email notification after a payment attempt (success or fail) Creditor=Creditor PaymentCode=Payment code StripeDoPayment=Pay with Credit or Debit Card (Stripe) @@ -61,4 +61,4 @@ ConfirmDeleteCard=Are you sure you want to delete this Credit or Debit card? CreateCustomerOnStripe=Create customer on Stripe CreateCardOnStripe=Create card on Stripe ShowInStripe=Show in Stripe -StripeUserAccountForActions=User account to use for some emails notification of Stripe events (Stripe payouts) +StripeUserAccountForActions=User account to use for email notification of some Stripe events (Stripe payouts) diff --git a/htdocs/langs/en_US/supplier_proposal.lang b/htdocs/langs/en_US/supplier_proposal.lang index ef2e7242e31..501b6d907e3 100644 --- a/htdocs/langs/en_US/supplier_proposal.lang +++ b/htdocs/langs/en_US/supplier_proposal.lang @@ -1,6 +1,6 @@ # Dolibarr language file - Source file is en_US - supplier_proposal SupplierProposal=Vendor commercial proposals -supplier_proposalDESC=Manage price requests to vendors +supplier_proposalDESC=Manage price requests to suppliers SupplierProposalNew=New price request CommRequest=Price request CommRequests=Price requests diff --git a/htdocs/langs/en_US/suppliers.lang b/htdocs/langs/en_US/suppliers.lang index ac5102323d9..b69b11272b4 100644 --- a/htdocs/langs/en_US/suppliers.lang +++ b/htdocs/langs/en_US/suppliers.lang @@ -1,4 +1,4 @@ -# Dolibarr language file - Source file is en_US - suppliers +# Dolibarr language file - Source file is en_US - vendors Suppliers=Vendors SuppliersInvoice=Vendor invoice ShowSupplierInvoice=Show Vendor Invoice @@ -15,7 +15,7 @@ SomeSubProductHaveNoPrices=Some sub-products have no price defined AddSupplierPrice=Add buying price ChangeSupplierPrice=Change buying price SupplierPrices=Vendor prices -ReferenceSupplierIsAlreadyAssociatedWithAProduct=This reference supplier is already associated with a reference: %s +ReferenceSupplierIsAlreadyAssociatedWithAProduct=This vendor reference is already associated with a product: %s NoRecordedSuppliers=No vendor recorded SupplierPayment=Vendor payment SuppliersArea=Vendor area @@ -35,13 +35,13 @@ ListOfSupplierProductForSupplier=List of products and prices for vendor %sTicket has just been created with ID #%s, see informations :

+TicketNewEmailBodyAdmin=

Ticket has just been created with ID #%s, see information:

SeeThisTicketIntomanagementInterface=See ticket in management interface -TicketPublicInterfaceForbidden=Access for this area : forbidden +TicketPublicInterfaceForbidden=Access for this area: forbidden # notifications TicketNotificationEmailSubject=Ticket %s updated @@ -274,8 +274,9 @@ TicketNotificationEmailBody=This is an automatic message to notify you that tick TicketNotificationRecipient=Notification recipient TicketNotificationLogMessage=Log message TicketNotificationEmailBodyInfosTrackUrlinternal=View ticket into interface -TicketNotificationNumberEmailSent=Notification email sent : %s +TicketNotificationNumberEmailSent=Notification email sent: %s +ActionsOnTicket=Events on ticket # # Boxes diff --git a/htdocs/langs/en_US/users.lang b/htdocs/langs/en_US/users.lang index 68fffde3bb0..33ebaa66edd 100644 --- a/htdocs/langs/en_US/users.lang +++ b/htdocs/langs/en_US/users.lang @@ -69,8 +69,8 @@ InternalUser=Internal user ExportDataset_user_1=Users and their properties DomainUser=Domain user %s Reactivate=Reactivate -CreateInternalUserDesc=This form allows you to create an user internal to your company/organization. To create an external user (customer, supplier, ...), use the button 'Create Dolibarr user' from third party's contact card. -InternalExternalDesc=An internal user is a user that is part of your company/organization.
An external user is a customer, supplier or other.

In both cases, permissions defines rights on Dolibarr, also external user can have a different menu manager than internal user (See Home - Setup - Display) +CreateInternalUserDesc=This form allows you to create an user internal to your company/organization. To create an external user (customer, vendor, ...), use the button 'Create Dolibarr user' from third-party's contact card. +InternalExternalDesc=An internal user is a user that is part of your company/organization.
An external user is a customer, vendor or other.

In both cases, permissions defines rights on Dolibarr, also external user can have a different menu manager than internal user (See Home - Setup - Display) PermissionInheritedFromAGroup=Permission granted because inherited from one of a user's group. Inherited=Inherited UserWillBeInternalUser=Created user will be an internal user (because not linked to a particular third party) diff --git a/htdocs/langs/en_US/website.lang b/htdocs/langs/en_US/website.lang index d96f2bfb1cb..94922827a91 100644 --- a/htdocs/langs/en_US/website.lang +++ b/htdocs/langs/en_US/website.lang @@ -76,9 +76,9 @@ DisableSiteFirst=Disable website first MyContainerTitle=My web site title AnotherContainer=Another container WEBSITE_USE_WEBSITE_ACCOUNTS=Enable the web site account table -WEBSITE_USE_WEBSITE_ACCOUNTSTooltip=Enable the table to store web site accounts (login/pass) for each website / thirdparty +WEBSITE_USE_WEBSITE_ACCOUNTSTooltip=Enable the table to store web site accounts (login/pass) for each website / third party YouMustDefineTheHomePage=You must first define the default Home page -OnlyEditionOfSourceForGrabbedContentFuture=Warning: Creating a web page by importing an external web page is reserved to experienced user. Depending on the complexity of source page, the result of importation may differs once imported from original. Also if the source page use common CSS style or not compatible javascript, it may break the look or features of the Website editor when working on this page. This method is faster way to have a page but it is recommanded to create your new page from scratch or from a suggested page template.
Note also that only edition of HTML source will be possible when a page content has been initialized by grabbing it from an external page ("Online" editor will NOT be available) +OnlyEditionOfSourceForGrabbedContentFuture=Warning: Creating a web page by importing an external web page is reserved for experienced users. Depending on the complexity of source page, the result of importation may differ from the original. Also if the source page uses common CSS styles or conflicting javascript, it may break the look or features of the Website editor when working on this page. This method is a quicker way to create a page but it is recommended to create your new page from scratch or from a suggested page template.
Note also that edits of HTML source will be possible when page content has been initialized by grabbing it from an external page ("Online" editor will NOT be available) OnlyEditionOfSourceForGrabbedContent=Only edition of HTML source is possible when content was grabbed from an external site GrabImagesInto=Grab also images found into css and page. ImagesShouldBeSavedInto=Images should be saved into directory @@ -91,5 +91,5 @@ ExternalURLMustStartWithHttp=External URL must start with http:// or https:// ZipOfWebsitePackageToImport=Zip file of website package ShowSubcontainers=Include dynamic content InternalURLOfPage=Internal URL of page -ThisPageIsTranslationOf=This page/container is translation of +ThisPageIsTranslationOf=This page/container is a translation of ThisPageHasTranslationPages=This page/container has translation \ No newline at end of file diff --git a/htdocs/langs/en_US/withdrawals.lang b/htdocs/langs/en_US/withdrawals.lang index c2c384793c4..bdfe8130d2b 100644 --- a/htdocs/langs/en_US/withdrawals.lang +++ b/htdocs/langs/en_US/withdrawals.lang @@ -18,14 +18,14 @@ InvoiceWaitingWithdraw=Invoice waiting for direct debit AmountToWithdraw=Amount to withdraw WithdrawsRefused=Direct debit refused NoInvoiceToWithdraw=No customer invoice with open 'Direct debit requests' is waiting. Go on tab '%s' on invoice card to make a request. -ResponsibleUser=Responsible user +ResponsibleUser=User Responsible WithdrawalsSetup=Direct debit payment setup WithdrawStatistics=Direct debit payment statistics WithdrawRejectStatistics=Direct debit payment reject statistics LastWithdrawalReceipt=Latest %s direct debit receipts MakeWithdrawRequest=Make a direct debit payment request WithdrawRequestsDone=%s direct debit payment requests recorded -ThirdPartyBankCode=Third party bank code +ThirdPartyBankCode=Third-party bank code NoInvoiceCouldBeWithdrawed=No invoice debited successfully. Check that invoices are on companies with a valid IBAN and that IBAN has a UMR (Unique Mandate Reference) with mode %s. ClassCredited=Classify credited ClassCreditedConfirm=Are you sure you want to classify this withdrawal receipt as credited on your bank account? @@ -66,7 +66,7 @@ NotifyCredit=Withdrawal Credit NumeroNationalEmetter=National Transmitter Number WithBankUsingRIB=For bank accounts using RIB WithBankUsingBANBIC=For bank accounts using IBAN/BIC/SWIFT -BankToReceiveWithdraw=Bank account to receive direct debit +BankToReceiveWithdraw=Receiving Bank Account CreditDate=Credit on WithdrawalFileNotCapable=Unable to generate withdrawal receipt file for your country %s (Your country is not supported) ShowWithdraw=Show Withdraw @@ -78,7 +78,7 @@ ThisWillAlsoAddPaymentOnInvoice=This will also record payments to invoices and w StatisticsByLineStatus=Statistics by status of lines RUM=UMR RUMLong=Unique Mandate Reference -RUMWillBeGenerated=If empty, UMR number will be generated once bank account information are saved +RUMWillBeGenerated=If empty, a UMR (Unique Mandate Reference) will be generated once the bank account information is saved. WithdrawMode=Direct debit mode (FRST or RECUR) WithdrawRequestAmount=Amount of Direct debit request: WithdrawRequestErrorNilAmount=Unable to create direct debit request for empty amount. @@ -87,13 +87,13 @@ SepaMandateShort=SEPA Mandate PleaseReturnMandate=Please return this mandate form by email to %s or by mail to SEPALegalText=By signing this mandate form, you authorize (A) %s to send instructions to your bank to debit your account and (B) your bank to debit your account in accordance with the instructions from %s. As part of your rights, you are entitled to a refund from your bank under the terms and conditions of your agreement with your bank. A refund must be claimed within 8 weeks starting from the date on which your account was debited. Your rights regarding the above mandate are explained in a statement that you can obtain from your bank. CreditorIdentifier=Creditor Identifier -CreditorName=Creditor’s Name +CreditorName=Creditor Name SEPAFillForm=(B) Please complete all the fields marked * SEPAFormYourName=Your name SEPAFormYourBAN=Your Bank Account Name (IBAN) SEPAFormYourBIC=Your Bank Identifier Code (BIC) SEPAFrstOrRecur=Type of payment -ModeRECUR=Reccurent payment +ModeRECUR=Recurring payment ModeFRST=One-off payment PleaseCheckOne=Please check one only DirectDebitOrderCreated=Direct debit order %s created diff --git a/htdocs/langs/en_US/workflow.lang b/htdocs/langs/en_US/workflow.lang index c16caf44765..1e59d2ff564 100644 --- a/htdocs/langs/en_US/workflow.lang +++ b/htdocs/langs/en_US/workflow.lang @@ -13,7 +13,7 @@ descWORKFLOW_INVOICE_CLASSIFY_BILLED_PROPAL=Classify linked source proposal as b descWORKFLOW_INVOICE_AMOUNT_CLASSIFY_BILLED_ORDER=Classify linked source customer order as billed when customer invoice is validated (and if the amount of the invoice is the same as the total amount of the linked order) descWORKFLOW_INVOICE_CLASSIFY_BILLED_ORDER=Classify linked source customer order as billed when customer invoice is set to paid (and if the amount of the invoice is the same as the total amount of the linked order) descWORKFLOW_ORDER_CLASSIFY_SHIPPED_SHIPPING=Classify linked source customer order as shipped when a shipment is validated (and if the quantity shipped by all shipments is the same as in the order to update) -# Autoclassify supplier order +# Autoclassify purchase order descWORKFLOW_ORDER_CLASSIFY_BILLED_SUPPLIER_PROPOSAL=Classify linked source vendor proposal as billed when vendor invoice is validated (and if the amount of the invoice is the same as the total amount of the linked proposal) descWORKFLOW_INVOICE_AMOUNT_CLASSIFY_BILLED_SUPPLIER_ORDER=Classify linked source purchase order as billed when vendor invoice is validated (and if the amount of the invoice is the same as the total amount of the linked order) AutomaticCreation=Automatic creation diff --git a/htdocs/langs/es_CL/projects.lang b/htdocs/langs/es_CL/projects.lang index 38a931d2b48..2bc8138e1b8 100644 --- a/htdocs/langs/es_CL/projects.lang +++ b/htdocs/langs/es_CL/projects.lang @@ -75,7 +75,7 @@ LinkedToAnotherCompany=Vinculado a otro tercero TaskIsNotAssignedToUser=Tarea no asignada al usuario. Use el botón '%s' para asignar la tarea ahora. ErrorTimeSpentIsEmpty=El tiempo pasado está vacío ThisWillAlsoRemoveTasks=Esta acción también borrara todo las tareas del proyecto (%s tareas al momento) y todas las entradas de tiempo consumido. -IfNeedToUseOhterObjectKeepEmpty=Si algunos objetos (factura, orden, ...), pertenecen a otro tercero, deben estar vinculados al proyecto para crear, manténgalos vacíos para que el proyecto sea de varios terceros. +IfNeedToUseOtherObjectKeepEmpty=Si algunos objetos (factura, orden, ...), pertenecen a otro tercero, deben estar vinculados al proyecto para crear, manténgalos vacíos para que el proyecto sea de varios terceros. CloneProject=Proyecto clon CloneTasks=Clonar tareas CloneContacts=Clon contactos diff --git a/htdocs/langs/es_ES/other.lang b/htdocs/langs/es_ES/other.lang index fd13746007a..d7579c98fc6 100644 --- a/htdocs/langs/es_ES/other.lang +++ b/htdocs/langs/es_ES/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nNos ponemos en contacto PredefinedMailContentSendShipping=__(Hello)__\n\nNos ponemos en contacto con usted para facilitarle el presupuesto __PREF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nNos ponemos en contacto con usted para facilitarle el presupuesto __PREF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hola)__\n\n\n__(Sinceramente)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hola)__\n\n\n__(Sinceramente)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=Puede hacer clic en el siguiente enlace para realizar su pago, si aún no lo ha hecho.\n\n%s\n\n DemoDesc=Dolibarr es un ERP/CRM para la gestión de negocios (profesionales o asociaciones), compuesto de módulos funcionales independientes y opcionales. Una demostración que incluya todos estos módulos no tiene sentido porque no utilizará todos los módulos. Además, tiene disponibles varios tipos de perfiles de demostración. diff --git a/htdocs/langs/es_ES/projects.lang b/htdocs/langs/es_ES/projects.lang index 16c361ac5e6..6f6d19a6ac2 100644 --- a/htdocs/langs/es_ES/projects.lang +++ b/htdocs/langs/es_ES/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Enlazado a otra empresa TaskIsNotAssignedToUser=Tarea no asignada al usuario. Use el botón '%s' para asignar la tarea. ErrorTimeSpentIsEmpty=No se ha establecido el tiempo consumido ThisWillAlsoRemoveTasks=Esta operación también destruirá las tareas del proyecto (%s tareas) y sus tiempos dedicados. -IfNeedToUseOhterObjectKeepEmpty=Si los elementos (factura, pedido, ...) pertenecen a un tercero que no és el seleccionado, debiendo estos estar ligados al proyecto a crear, déjelo vacío para permitir el proyecto a multi-terceros. +IfNeedToUseOtherObjectKeepEmpty=Si los elementos (factura, pedido, ...) pertenecen a un tercero que no és el seleccionado, debiendo estos estar ligados al proyecto a crear, déjelo vacío para permitir el proyecto a multi-terceros. CloneProject=Clonar el proyecto CloneTasks=Clonar las tareas CloneContacts=Clonar los contactos diff --git a/htdocs/langs/et_EE/other.lang b/htdocs/langs/et_EE/other.lang index 71ac2bca2a0..ae98e6e4940 100644 --- a/htdocs/langs/et_EE/other.lang +++ b/htdocs/langs/et_EE/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/et_EE/projects.lang b/htdocs/langs/et_EE/projects.lang index 1827ba74ab3..06c1a964580 100644 --- a/htdocs/langs/et_EE/projects.lang +++ b/htdocs/langs/et_EE/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Seotud muu kolmanda isikuga TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Kulutatud aeg on tüh ThisWillAlsoRemoveTasks=See kustutab ka kõik projekti ülesanded (hetkel %s ülesannet) ja kõik kulutatud aja sisestused. -IfNeedToUseOhterObjectKeepEmpty=Kui mingid projekti loomiseks vajalikud objektid (arve, tellimus jne) kuuluvad mõnele muule kolmandale isikule, siis jäta see tühjaks, et oleks projekti võimalik siduda mitme kolmanda isikuga. +IfNeedToUseOtherObjectKeepEmpty=Kui mingid projekti loomiseks vajalikud objektid (arve, tellimus jne) kuuluvad mõnele muule kolmandale isikule, siis jäta see tühjaks, et oleks projekti võimalik siduda mitme kolmanda isikuga. CloneProject=Klooni projekt CloneTasks=Klooni ülesanded CloneContacts=Klooni kontaktid diff --git a/htdocs/langs/eu_ES/other.lang b/htdocs/langs/eu_ES/other.lang index 1401e5f2d96..82abec228c5 100644 --- a/htdocs/langs/eu_ES/other.lang +++ b/htdocs/langs/eu_ES/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/eu_ES/projects.lang b/htdocs/langs/eu_ES/projects.lang index ce5b98ccc70..3297258089d 100644 --- a/htdocs/langs/eu_ES/projects.lang +++ b/htdocs/langs/eu_ES/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Linked to other third party TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Time spent is empty ThisWillAlsoRemoveTasks=This action will also delete all tasks of project (%s tasks at the moment) and all inputs of time spent. -IfNeedToUseOhterObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. +IfNeedToUseOtherObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. CloneProject=Clone project CloneTasks=Clone tasks CloneContacts=Clone contacts diff --git a/htdocs/langs/fa_IR/projects.lang b/htdocs/langs/fa_IR/projects.lang index 42efd456040..164e6aae16b 100644 --- a/htdocs/langs/fa_IR/projects.lang +++ b/htdocs/langs/fa_IR/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=لینک به دیگر شخص ثالث TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=مدت زمان صرف شده خالی است ThisWillAlsoRemoveTasks=این کار همچنین تمام کارهای پروژه (وظایف٪ s در حال حاضر) حذف و تمام ورودی ها از زمان صرف شده. -IfNeedToUseOhterObjectKeepEmpty=اگر برخی از اشیاء (فاکتور، سفارش، ...)، متعلق به شخص ثالث دیگری، باید به این پروژه برای ایجاد، نگه داشتن این خالی به این پروژه که احزاب چند سوم مرتبط است. +IfNeedToUseOtherObjectKeepEmpty=اگر برخی از اشیاء (فاکتور، سفارش، ...)، متعلق به شخص ثالث دیگری، باید به این پروژه برای ایجاد، نگه داشتن این خالی به این پروژه که احزاب چند سوم مرتبط است. CloneProject=پروژه کلون CloneTasks=وظایف کلون CloneContacts=تماس با کلون diff --git a/htdocs/langs/fi_FI/other.lang b/htdocs/langs/fi_FI/other.lang index 027dedfb83e..bf459454ba0 100644 --- a/htdocs/langs/fi_FI/other.lang +++ b/htdocs/langs/fi_FI/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/fi_FI/projects.lang b/htdocs/langs/fi_FI/projects.lang index 1b2149fe3ef..720a7a4b65d 100644 --- a/htdocs/langs/fi_FI/projects.lang +++ b/htdocs/langs/fi_FI/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Liittyy muihin kolmannen osapuolen TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Käytetty aika on tyhjä ThisWillAlsoRemoveTasks=Tämä toiminto poistaa myös kaikki tehtävät projektin (%s tehtävät tällä hetkellä) ja kaikki panokset käytetty aika. -IfNeedToUseOhterObjectKeepEmpty=Jos jotkin esineet (lasku, tilaus, ...), jotka kuuluvat toiselle kolmannelle osapuolelle, on liityttävä hankkeeseen luoda, pitää tämä tyhjä saada hanke on multi kolmansille osapuolille. +IfNeedToUseOtherObjectKeepEmpty=Jos jotkin esineet (lasku, tilaus, ...), jotka kuuluvat toiselle kolmannelle osapuolelle, on liityttävä hankkeeseen luoda, pitää tämä tyhjä saada hanke on multi kolmansille osapuolille. CloneProject=Clone project CloneTasks=Clone tasks CloneContacts=Clone contacts diff --git a/htdocs/langs/fr_CA/projects.lang b/htdocs/langs/fr_CA/projects.lang index 1e448ea512a..446c31cf269 100644 --- a/htdocs/langs/fr_CA/projects.lang +++ b/htdocs/langs/fr_CA/projects.lang @@ -72,7 +72,7 @@ LinkedToAnotherCompany=Lié à d'autres tiers TaskIsNotAssignedToUser=Tâche non assignée à l'utilisateur. Utilisez le bouton '%s' pour attribuer la tâche maintenant. ErrorTimeSpentIsEmpty=Le temps passé est vide ThisWillAlsoRemoveTasks=Cette action supprimera également toutes les tâches du projet (%s tâches en ce moment) et toutes les entrées du temps passé. -IfNeedToUseOhterObjectKeepEmpty=Si certains objets (facture, commande, ...), appartenant à un autre tiers, doivent être liés au projet à créer, conservez ce vide pour que le projet soit multi tiers. +IfNeedToUseOtherObjectKeepEmpty=Si certains objets (facture, commande, ...), appartenant à un autre tiers, doivent être liés au projet à créer, conservez ce vide pour que le projet soit multi tiers. CloneProject=Projet Clone CloneTasks=Tâches de clonage CloneProjectFiles=Le projet Clone a joint les fichiers diff --git a/htdocs/langs/fr_FR/accountancy.lang b/htdocs/langs/fr_FR/accountancy.lang index 62263b0597d..b6d065edfa9 100644 --- a/htdocs/langs/fr_FR/accountancy.lang +++ b/htdocs/langs/fr_FR/accountancy.lang @@ -235,6 +235,7 @@ ListOfProductsWithoutAccountingAccount=Liste des produits non liés à un compte ChangeBinding=Changer les liens Accounted=Comptabilisé NotYetAccounted=Pas encore comptabilisé +AccountantFiles = Justificatifs comptablilité ## Admin ApplyMassCategories=Application en masse des catégories diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang index ad93ef9427b..17e6c09a776 100644 --- a/htdocs/langs/fr_FR/admin.lang +++ b/htdocs/langs/fr_FR/admin.lang @@ -1519,6 +1519,11 @@ SendingsNumberingModules=Modèles de numérotation des expéditions SendingsAbility=Prise en charge des bons d'expédition pour les livraisons clients NoNeedForDeliveryReceipts=Dans le plupart des cas, la fiche expédition est utilisée en tant que bon d'expédition (liste des produits expédiés) et bon de livraison (signée par le client). Le bon de réception est un doublon de fonctionnalité et est rarement utilisé. FreeLegalTextOnShippings=Mention complémentaire sur les expéditions +##### Reception ##### +ReceptionsSetup=Configuration du module Réception +ReceptionsReceiptModel=Modèles de bordereau de réception +ReceptionsNumberingModules=Modèles de numérotation des réceptions +FreeLegalTextOnShippings=Mention complémentaire sur les réceptions ##### Deliveries ##### DeliveryOrderNumberingModules=Modèle de numérotation des bons de réception client DeliveryOrderModel=Modèle de bon de réception client @@ -1753,6 +1758,7 @@ MailToSendSupplierRequestForQuotation=Demande de devis MailToSendSupplierOrder=Commandes fournisseurs MailToSendSupplierInvoice=Factures fournisseur MailToSendContract=Contrats +MailToSendReception=Réceptions fournisseurs MailToThirdparty=Tiers MailToMember=Adhérents MailToUser=Utilisateurs diff --git a/htdocs/langs/fr_FR/agenda.lang b/htdocs/langs/fr_FR/agenda.lang index 6cd0dd2e74c..f6ef3cc6d9d 100644 --- a/htdocs/langs/fr_FR/agenda.lang +++ b/htdocs/langs/fr_FR/agenda.lang @@ -60,7 +60,13 @@ MemberSubscriptionDeletedInDolibarr=Abonnement %s pour l'adhérent %s supprimé ShipmentValidatedInDolibarr=Expédition %s validée ShipmentClassifyClosedInDolibarr=Expédition %s classée payée ShipmentUnClassifyCloseddInDolibarr=Expédition %s réouverte +ShipmentBackToDraftInDolibarr=Expédition %s repassée en brouillon ShipmentDeletedInDolibarr=Expédition %s supprimée +ReceptionValidatedInDolibarr=Réception %s validée +ReceptionClassifyClosedInDolibarr=Réception %s classée payée +ReceptionUnClassifyCloseddInDolibarr=Réception %s réouverte +ReceptionBackToDraftInDolibarr=Réception %s repassée en brouillon +ReceptionDeletedInDolibarr=Réception %s supprimée OrderCreatedInDolibarr=Commande %s créée OrderValidatedInDolibarr=Commande %s validée OrderDeliveredInDolibarr=Commande %s classée Livrée @@ -77,6 +83,8 @@ SupplierOrderSentByEMail=Commande fournisseur %s envoyée par email SupplierInvoiceSentByEMail=Facture fournisseur %s envoyée par email ShippingSentByEMail=Bon d'expédition %s envoyé par email ShippingValidated= Expédition %s validée +ReceptionSentByEMail=Réception %s envoyée par email +ReceptionValidated= Réception %s validée InterventionSentByEMail=Intervention %s envoyée par email ProposalDeleted=Proposition commerciale supprimée OrderDeleted=Commande supprimée diff --git a/htdocs/langs/fr_FR/orders.lang b/htdocs/langs/fr_FR/orders.lang index 6b24934922b..158c566ca30 100644 --- a/htdocs/langs/fr_FR/orders.lang +++ b/htdocs/langs/fr_FR/orders.lang @@ -25,6 +25,7 @@ OrdersToBill=Commandes clients à délivrer OrdersInProcess=Commandes clients en traitement OrdersToProcess=Commandes clients à traiter SuppliersOrdersToProcess=Commandes fournisseurs à traiter +SuppliersOrdersInProcess=Commandes fournisseurs en traitement StatusOrderCanceledShort=Annulée StatusOrderDraftShort=Brouillon StatusOrderValidatedShort=Validée diff --git a/htdocs/langs/fr_FR/other.lang b/htdocs/langs/fr_FR/other.lang index ebb13aca043..fb34215d9b2 100644 --- a/htdocs/langs/fr_FR/other.lang +++ b/htdocs/langs/fr_FR/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nVeuillez trouver la fact PredefinedMailContentSendShipping=__(Hello)__\n\nVeuillez trouver ci-joint l'expédition __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nVeuillez trouver l'intervention ci-jointe __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=Vous pouvez cliquer sur le lien ci-dessous pour effectuer votre paiement si ce n'est déjà fait.\n\n%s\n\n DemoDesc=Dolibarr est un logiciel de gestion proposant plusieurs modules métiers. Une démonstration qui inclut tous ces modules n'a pas de sens car ce cas n'existe jamais (plusieurs centaines de modules disponibles). Aussi, quelques profils type de démo sont disponibles. diff --git a/htdocs/langs/fr_FR/products.lang b/htdocs/langs/fr_FR/products.lang index 3c66c355246..571376ebeb0 100644 --- a/htdocs/langs/fr_FR/products.lang +++ b/htdocs/langs/fr_FR/products.lang @@ -281,7 +281,7 @@ ProductsOrServicesTranslations=Traduction des produits ou des services TranslatedLabel=Titre traduit TranslatedDescription=Description traduite TranslatedNote=Notes traduites -ProductWeight=Poids pour 1 articlejavascript:; +ProductWeight=Poids pour 1 article ProductVolume=Volume pour 1 article WeightUnits=Unité de poids VolumeUnits=Unité de volume diff --git a/htdocs/langs/fr_FR/projects.lang b/htdocs/langs/fr_FR/projects.lang index e279650cf37..f364b6410dd 100644 --- a/htdocs/langs/fr_FR/projects.lang +++ b/htdocs/langs/fr_FR/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Liés à autre société TaskIsNotAssignedToUser=Tâche non assignée à l'utilisateur. Utilisez le bouton '%s' pour assigner la tâche maintenant. ErrorTimeSpentIsEmpty=Le temps consommé n'est pas renseigné ThisWillAlsoRemoveTasks=Cette opération détruira également les tâches du projet (%s tâches actuellement) et le suivi des consommés. -IfNeedToUseOhterObjectKeepEmpty=Si des objets (facture, commande, ...), appartenant à un autre tiers que celui choisi, doivent être liés au projet à créer, laisser vide afin de laisser le projet multi-tiers. +IfNeedToUseOtherObjectKeepEmpty=Si des objets (facture, commande, ...), appartenant à un autre tiers que celui choisi, doivent être liés au projet à créer, laisser vide afin de laisser le projet multi-tiers. CloneProject=Cloner le projet CloneTasks=Cloner les tâches CloneContacts=Cloner les contacts diff --git a/htdocs/langs/fr_FR/receptions.lang b/htdocs/langs/fr_FR/receptions.lang new file mode 100644 index 00000000000..8e766344d94 --- /dev/null +++ b/htdocs/langs/fr_FR/receptions.lang @@ -0,0 +1,83 @@ +# Dolibarr language file - Source file is en_US - receptions +RefReception=Réf. réception +Reception=Réception +reception=Réception +reception_line=Ligne de réception +Receptions=Réceptions +AllReceptions=Toutes les réceptions +Reception=Réception +Receptions=Réceptions +ShowReception=Afficher Réceptions +Receivings=Bons de réceptions +ReceptionsArea=Espace réceptions +ListOfReceptions=Liste des réceptions +ReceptionMethod=Mode de transport +LastReceptions=Les %s dernières réceptions +StatisticsOfReceptions=Statistiques des réceptions +NbOfReceptions=Nombre de réceptions +NumberOfReceptionsByMonth=Nombre de réceptions par mois +ReceptionCard=Fiche réception +NewReception=Nouvelle réception +CreateReception=Créer réception +QtyShipped=Qté. expédiée +QtyPreparedOrShipped=Quantité préparée ou envoyée +QtyToReceive=Qté. à recevoir +QtyReceived=Qté. reçue +QtyInOtherReceptions=Qté dans les autres réceptions +KeepToShip=Reste à expédier +OtherReceptionsForSameOrder=Autres réceptions pour cette commande +ReceptionsAndReceivingForSameOrder=Réceptions et réceptions pour cette commande +ReceptionsToValidate=Réceptions à valider +StatusReceptionCanceled=Annulée +StatusReceptionDraft=Brouillon +StatusReceptionValidated=Validée +StatusReceptionProcessed=Traitée +StatusReceptionDraftShort=Brouillon +StatusReceptionValidatedShort=Validée +StatusReceptionProcessedShort=Traitée +ReceptionSheet=Fiche réception +ConfirmDeleteReception=Êtes-vous sûr de vouloir supprimer cette réception ? +ConfirmValidateReception=Êtes-vous sûr de vouloir valider cette réception sous la référence %s? +ConfirmCancelReception=Êtes-vous sûr de vouloir annuler cette réception ? +DocumentModelMerou=Modèle Merou A5 +WarningNoQtyLeftToSend=Alerte, aucun produit en attente de réception. +StatsOnReceptionsOnlyValidated=Statistiques effectuées sur les réceptions validées uniquement. La date prise en compte est la date de validation (la date de prévision de livraison n'étant pas toujours renseignée). +DateDeliveryPlanned=Date prévue de livraison +RefDeliveryReceipt=Ref bon de réception +StatusReceipt=Status du bon de réception +DateReceived=Date de réception réelle +SendReceptionByEMail=Envoyer bon de réception par email +SendReceptionRef=Envoi du bordereau de réception %s +ActionsOnReception=Événements sur l'réception +LinkToTrackYourPackage=Lien pour le suivi de votre colis +ReceptionCreationIsDoneFromOrder=Pour le moment, la création d'une nouvelle réception se fait depuis la fiche commande fournisseur. +ReceptionLine=Ligne de réception +RefSupplierOrder=Ref. Commande fournisseur +ProductQtyInCustomersOrdersRunning=Quantité de produit en commandes client ouvertes +ProductQtyInSuppliersOrdersRunning=Quantité de produit en commandes fournisseur ouvertes +ProductQtyInReceptionAlreadySent=Quantité de produit en commande client ouverte déjà expédiée +ProductQtyInSuppliersReceptionAlreadyRecevied=Quantité de produit déjà reçu en commandes fournisseur ouvertes +NoProductToShipFoundIntoStock=Aucun produit à expédier n'a été trouver dans l'entrepôt %s. Corrigez l'inventaire ou retourner choisir un autre entrepôt. +WeightVolShort=Poids/vol. +ValidateOrderFirstBeforeReception=Vous devez d'abord valider la commande pour pouvoir créer une réception. +CreateInvoiceForThisSupplier=Facturer réceptions +ErrorRefAlreadyExists = La référence fournisseur existe déjà + +# Reception methods +# ModelDocument +DocumentModelTyphon=Modèle de bon de réception/livraison complet (logo…) +Error_EXPEDITION_ADDON_NUMBER_NotDefined=Constante EXPEDITION_ADDON_NUMBER non définie +SumOfProductVolumes=Somme des volumes des produits +SumOfProductWeights=Somme des poids des produits + +# warehouse details +DetailWarehouseNumber= Détail de l'entrepôt +DetailWarehouseFormat= W:%s (Qté : %d) + +Billed=Facturé +ClassifyUnbilled=Classer non facturé + +DateInvoice=Date de facturation +CreateOneBillByThird=Créer une facture par tiers (sinon une par réception) +ValidateInvoices=Factures validées +StatusMustBeValidate=La réception %s doit être au statut 'Validée' diff --git a/htdocs/langs/fr_FR/stocks.lang b/htdocs/langs/fr_FR/stocks.lang index 8cd53d0aed4..02800c3a8ac 100644 --- a/htdocs/langs/fr_FR/stocks.lang +++ b/htdocs/langs/fr_FR/stocks.lang @@ -63,11 +63,13 @@ RuleForStockManagementDecrease=Choisissez Règle pour la réduction automatique RuleForStockManagementIncrease=Choisissez Règle pour augmentation de stock automatique (une augmentation manuelle est toujours possible, même si une règle d’augmentation automatique est activée) DeStockOnBill=Diminution des stocks réels lors de la validation de la facture client / note de crédit DeStockOnValidateOrder=Diminuer les stocks réels lors de la validation de la commande client -DeStockOnShipment=Décrémenter les stocks physiques sur validation des expéditions -DeStockOnShipmentOnClosing=Décrémenter les stocks physiques au classement "clôturée" de l'expédition +DeStockOnShipment=Réduire les stocks physiques sur validation des expéditions +DeStockOnShipmentOnClosing=Réduire les stocks physiques au classement "clôturée" de l'expédition ReStockOnBill=Augmenter les stocks réels lors de la validation de la facture fournisseur / de la note de crédit ReStockOnValidateOrder=Augmenter les stocks réels lors de l'approbation des bons de commande ReStockOnDispatchOrder=Augmenter les stocks réels lors de l'expédition manuelle dans l'entrepôt, après la réception de la commande fournisseur +StockOnReception=Augmenter les stocks physiques sur validation des réceptions +StockOnReceptionOnClosing=Augmenter les stocks réels au classement "clôturée" de la réception OrderStatusNotReadyToDispatch=La commande n'a pas encore ou n'a plus un statut permettant une ventilation en stock. StockDiffPhysicTeoric=Explication de l'écart stock physique-virtuel NoPredefinedProductToDispatch=Pas de produits prédéfinis dans cet objet. Aucune ventilation en stock n'est donc à faire. diff --git a/htdocs/langs/fr_FR/workflow.lang b/htdocs/langs/fr_FR/workflow.lang index 154d1aaf3d7..a3dbe4cb07e 100644 --- a/htdocs/langs/fr_FR/workflow.lang +++ b/htdocs/langs/fr_FR/workflow.lang @@ -16,5 +16,6 @@ descWORKFLOW_ORDER_CLASSIFY_SHIPPED_SHIPPING=Classer la commande source à expé # Autoclassify supplier order descWORKFLOW_ORDER_CLASSIFY_BILLED_SUPPLIER_PROPOSAL=Classer la ou les proposition(s) commerciale(s) fournisseur sources facturées quand une facture fournisseur est validée (et si le montant de la facture est le même que le total des propositions sources liées) descWORKFLOW_INVOICE_AMOUNT_CLASSIFY_BILLED_SUPPLIER_ORDER=Classer la ou les commande(s) fournisseur(s) de source(s) à facturée(s) lorsque la facture fournisseur est validée (et si le montant de la facture est le même que le montant total des commandes liées) +descWORKFLOW_BILL_ON_RECEPTION=Classer la/les réception(s) facturée(s) à la validation d'une facture fournisseur AutomaticCreation=Création automatique AutomaticClassification=Classification automatique diff --git a/htdocs/langs/he_IL/other.lang b/htdocs/langs/he_IL/other.lang index 5e993be5133..4a8162a8557 100644 --- a/htdocs/langs/he_IL/other.lang +++ b/htdocs/langs/he_IL/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/he_IL/projects.lang b/htdocs/langs/he_IL/projects.lang index 66a3928ecfb..ca03b7598ba 100644 --- a/htdocs/langs/he_IL/projects.lang +++ b/htdocs/langs/he_IL/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Linked to other third party TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Time spent is empty ThisWillAlsoRemoveTasks=This action will also delete all tasks of project (%s tasks at the moment) and all inputs of time spent. -IfNeedToUseOhterObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. +IfNeedToUseOtherObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. CloneProject=Clone project CloneTasks=Clone tasks CloneContacts=Clone contacts diff --git a/htdocs/langs/hr_HR/other.lang b/htdocs/langs/hr_HR/other.lang index f4ff3ea6d8e..419d7ff1c39 100644 --- a/htdocs/langs/hr_HR/other.lang +++ b/htdocs/langs/hr_HR/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/hr_HR/projects.lang b/htdocs/langs/hr_HR/projects.lang index 33b2496c8ef..b14f1b20221 100644 --- a/htdocs/langs/hr_HR/projects.lang +++ b/htdocs/langs/hr_HR/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Povezano s drugim komitentom TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Utrošeno vrijeme je prazno ThisWillAlsoRemoveTasks=Ova akcija će također obrisati sve zadatke projekta (%s zadataka u ovom trenutku) i sve unose utrošenog vremena. -IfNeedToUseOhterObjectKeepEmpty=Ako neki objekti (računi, narudžbe,...), pripadaju drugom komitentu, moraju biti povezani s projektom koji se kreira, ostavite prazno da bi projekt bio za više komitenata. +IfNeedToUseOtherObjectKeepEmpty=Ako neki objekti (računi, narudžbe,...), pripadaju drugom komitentu, moraju biti povezani s projektom koji se kreira, ostavite prazno da bi projekt bio za više komitenata. CloneProject=Kloniraj projekt CloneTasks=Kloniraj zadatke CloneContacts=Kloniraj kontakte diff --git a/htdocs/langs/hu_HU/other.lang b/htdocs/langs/hu_HU/other.lang index d00f6b9f0c6..da4f9c1e000 100644 --- a/htdocs/langs/hu_HU/other.lang +++ b/htdocs/langs/hu_HU/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/hu_HU/projects.lang b/htdocs/langs/hu_HU/projects.lang index a5467f856bb..a2114c55627 100644 --- a/htdocs/langs/hu_HU/projects.lang +++ b/htdocs/langs/hu_HU/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Harmadik félhez kapcsolva TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Töltött idő üres ThisWillAlsoRemoveTasks=Ez a művelet is törli az összes feladatot a projekt (%s feladatokat a pillanatban), és az összes bemenet eltöltött idő. -IfNeedToUseOhterObjectKeepEmpty=Ha egyes tárgyakat (számla, megrendelés, ...), amelyek egy másik harmadik félnek kell kapcsolódniuk a projekt létrehozásához, tartsa ezt az üres, hogy a projekt, hogy több harmadik fél. +IfNeedToUseOtherObjectKeepEmpty=Ha egyes tárgyakat (számla, megrendelés, ...), amelyek egy másik harmadik félnek kell kapcsolódniuk a projekt létrehozásához, tartsa ezt az üres, hogy a projekt, hogy több harmadik fél. CloneProject=Clone project CloneTasks=Clone tasks CloneContacts=Clone contacts diff --git a/htdocs/langs/id_ID/other.lang b/htdocs/langs/id_ID/other.lang index db3a88b9c1a..47f4a5e72d9 100644 --- a/htdocs/langs/id_ID/other.lang +++ b/htdocs/langs/id_ID/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/id_ID/projects.lang b/htdocs/langs/id_ID/projects.lang index 93d21cb2958..a82a8d62fe3 100644 --- a/htdocs/langs/id_ID/projects.lang +++ b/htdocs/langs/id_ID/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Linked to other third party TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Time spent is empty ThisWillAlsoRemoveTasks=This action will also delete all tasks of project (%s tasks at the moment) and all inputs of time spent. -IfNeedToUseOhterObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. +IfNeedToUseOtherObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. CloneProject=Clone project CloneTasks=Clone tasks CloneContacts=Clone contacts diff --git a/htdocs/langs/is_IS/other.lang b/htdocs/langs/is_IS/other.lang index 247ddedc5af..de8a3def77e 100644 --- a/htdocs/langs/is_IS/other.lang +++ b/htdocs/langs/is_IS/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/is_IS/projects.lang b/htdocs/langs/is_IS/projects.lang index 5aa240aab47..24f1a432acf 100644 --- a/htdocs/langs/is_IS/projects.lang +++ b/htdocs/langs/is_IS/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Tengjast öðrum þriðja aðila TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Tími er tómur ThisWillAlsoRemoveTasks=Þessi aðgerð mun einnig eyða öllum verkefnum verkefnisins (%s verkefni í augnablikinu) og allt inntak tíma varið. -IfNeedToUseOhterObjectKeepEmpty=Ef sumir hlutir (nótum röð ...), sem tilheyra öðrum þriðja aðila, verður að vera í tengslum við verkefnið til að búa til, halda þessu tóm til að hafa verkefni verði fjölnota þriðja aðila. +IfNeedToUseOtherObjectKeepEmpty=Ef sumir hlutir (nótum röð ...), sem tilheyra öðrum þriðja aðila, verður að vera í tengslum við verkefnið til að búa til, halda þessu tóm til að hafa verkefni verði fjölnota þriðja aðila. CloneProject=Clone project CloneTasks=Clone tasks CloneContacts=Clone contacts diff --git a/htdocs/langs/it_IT/other.lang b/htdocs/langs/it_IT/other.lang index 72b1331fba4..74b9e7a1cbf 100644 --- a/htdocs/langs/it_IT/other.lang +++ b/htdocs/langs/it_IT/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr è un ERP/CRM compatto composto di diversi moduli funzionali. Un demo comprendente tutti i moduli non ha alcun senso, perché un caso simile non esiste nella realtà. Sono dunque disponibili diversi profili demo. diff --git a/htdocs/langs/it_IT/projects.lang b/htdocs/langs/it_IT/projects.lang index 107a9ba7ce1..f2827d3c8a1 100644 --- a/htdocs/langs/it_IT/projects.lang +++ b/htdocs/langs/it_IT/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Collegato ad un altro soggetto terzo TaskIsNotAssignedToUser=Attività non assegnata all'utente. Usa il bottone '%s' per assegnare l'attività ora. ErrorTimeSpentIsEmpty=Il campo tempo lavorato è vuoto ThisWillAlsoRemoveTasks=Questa azione eliminerà anche tutti i compiti del progetto (al momento ci sono %s compiti) e tutto il tempo lavorato già inserito. -IfNeedToUseOhterObjectKeepEmpty=Se qualche elemento (fattura, ordine, ...), appartenente ad un altro soggetto terzo deve essere collegato al progetto da creare, non compilare il campo per assegnare il progetto a più di un soggetto terzo. +IfNeedToUseOtherObjectKeepEmpty=Se qualche elemento (fattura, ordine, ...), appartenente ad un altro soggetto terzo deve essere collegato al progetto da creare, non compilare il campo per assegnare il progetto a più di un soggetto terzo. CloneProject=Clona progetto CloneTasks=Clona compiti CloneContacts=Clona contatti diff --git a/htdocs/langs/ja_JP/other.lang b/htdocs/langs/ja_JP/other.lang index d9e958e64c3..88f729df532 100644 --- a/htdocs/langs/ja_JP/other.lang +++ b/htdocs/langs/ja_JP/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/ja_JP/projects.lang b/htdocs/langs/ja_JP/projects.lang index c0a5d1d2686..8622ca543ed 100644 --- a/htdocs/langs/ja_JP/projects.lang +++ b/htdocs/langs/ja_JP/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=他の第三者へのリンク TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=費やした時間は空です ThisWillAlsoRemoveTasks=このアクションは、プロジェクトのすべてのタスク(現時点では%sタスク)と過ごした時間のすべての入力を削除します。 -IfNeedToUseOhterObjectKeepEmpty=いくつかのオブジェクト(請求書、注文、...)、別の第三者に属するが、作成するプロジェクトにリンクする必要がある場合は、複数のサードパーティ中のプロジェクトを持っているこの空を保持します。 +IfNeedToUseOtherObjectKeepEmpty=いくつかのオブジェクト(請求書、注文、...)、別の第三者に属するが、作成するプロジェクトにリンクする必要がある場合は、複数のサードパーティ中のプロジェクトを持っているこの空を保持します。 CloneProject=Clone project CloneTasks=Clone tasks CloneContacts=Clone contacts diff --git a/htdocs/langs/ka_GE/other.lang b/htdocs/langs/ka_GE/other.lang index ec0315b94cd..021bfe65985 100644 --- a/htdocs/langs/ka_GE/other.lang +++ b/htdocs/langs/ka_GE/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/ka_GE/projects.lang b/htdocs/langs/ka_GE/projects.lang index aadd8b446df..d895f477bd4 100644 --- a/htdocs/langs/ka_GE/projects.lang +++ b/htdocs/langs/ka_GE/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Linked to other third party TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Time spent is empty ThisWillAlsoRemoveTasks=This action will also delete all tasks of project (%s tasks at the moment) and all inputs of time spent. -IfNeedToUseOhterObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. +IfNeedToUseOtherObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. CloneProject=Clone project CloneTasks=Clone tasks CloneContacts=Clone contacts diff --git a/htdocs/langs/kn_IN/other.lang b/htdocs/langs/kn_IN/other.lang index 53af6c5beec..593eee74131 100644 --- a/htdocs/langs/kn_IN/other.lang +++ b/htdocs/langs/kn_IN/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/kn_IN/projects.lang b/htdocs/langs/kn_IN/projects.lang index aadd8b446df..d895f477bd4 100644 --- a/htdocs/langs/kn_IN/projects.lang +++ b/htdocs/langs/kn_IN/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Linked to other third party TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Time spent is empty ThisWillAlsoRemoveTasks=This action will also delete all tasks of project (%s tasks at the moment) and all inputs of time spent. -IfNeedToUseOhterObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. +IfNeedToUseOtherObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. CloneProject=Clone project CloneTasks=Clone tasks CloneContacts=Clone contacts diff --git a/htdocs/langs/ko_KR/other.lang b/htdocs/langs/ko_KR/other.lang index 2c071cefa30..e2ab9513e39 100644 --- a/htdocs/langs/ko_KR/other.lang +++ b/htdocs/langs/ko_KR/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/ko_KR/projects.lang b/htdocs/langs/ko_KR/projects.lang index 53fa214f0b8..c313a9473e9 100644 --- a/htdocs/langs/ko_KR/projects.lang +++ b/htdocs/langs/ko_KR/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Linked to other third party TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Time spent is empty ThisWillAlsoRemoveTasks=This action will also delete all tasks of project (%s tasks at the moment) and all inputs of time spent. -IfNeedToUseOhterObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. +IfNeedToUseOtherObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. CloneProject=Clone project CloneTasks=Clone tasks CloneContacts=Clone contacts diff --git a/htdocs/langs/lo_LA/other.lang b/htdocs/langs/lo_LA/other.lang index 363bfed21af..15ef5b3e164 100644 --- a/htdocs/langs/lo_LA/other.lang +++ b/htdocs/langs/lo_LA/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/lo_LA/projects.lang b/htdocs/langs/lo_LA/projects.lang index 42e374dacf6..f1553dac7f4 100644 --- a/htdocs/langs/lo_LA/projects.lang +++ b/htdocs/langs/lo_LA/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Linked to other third party TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Time spent is empty ThisWillAlsoRemoveTasks=This action will also delete all tasks of project (%s tasks at the moment) and all inputs of time spent. -IfNeedToUseOhterObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. +IfNeedToUseOtherObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. CloneProject=Clone project CloneTasks=Clone tasks CloneContacts=Clone contacts diff --git a/htdocs/langs/lt_LT/other.lang b/htdocs/langs/lt_LT/other.lang index 1aecb06a3e0..ac3a2e397ef 100644 --- a/htdocs/langs/lt_LT/other.lang +++ b/htdocs/langs/lt_LT/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/lt_LT/projects.lang b/htdocs/langs/lt_LT/projects.lang index f648ed87870..281126f5b19 100644 --- a/htdocs/langs/lt_LT/projects.lang +++ b/htdocs/langs/lt_LT/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Susijęs su kita trečiąja šalimi TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Praleistas laikas yra tuščias ThisWillAlsoRemoveTasks=Šis veiksmas taip pat ištrins visas projekto užduotis (%s užduotis šiuo metu) ir visus praleisto laiko įvestus duomenis. -IfNeedToUseOhterObjectKeepEmpty=Jei kai kurie objektai (sąskaitos-faktūros, užsakymai, ...), priklausantys kitai trečiąjai šaliai, turi būti susiję su kuriamu projektu, laikykite šitą tuščią, kad projektas būtų kelių trečiųjų šalių (multi). +IfNeedToUseOtherObjectKeepEmpty=Jei kai kurie objektai (sąskaitos-faktūros, užsakymai, ...), priklausantys kitai trečiąjai šaliai, turi būti susiję su kuriamu projektu, laikykite šitą tuščią, kad projektas būtų kelių trečiųjų šalių (multi). CloneProject=Klonuoti projektą CloneTasks=Klonuoti užduotis CloneContacts=Klonuoti kontaktus diff --git a/htdocs/langs/lv_LV/other.lang b/htdocs/langs/lv_LV/other.lang index 9a735b24f8c..0e98d2bcba3 100644 --- a/htdocs/langs/lv_LV/other.lang +++ b/htdocs/langs/lv_LV/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Labdien)__\n\nLūdzu, pievienojiet r PredefinedMailContentSendShipping=__(Labdien)__\n\nLūdzu, pievienojiet piegādi __REF__\n\n\n__ (Ar cieņu) __\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Labdien)__\n\nLūdzu, pievienojiet intervenci __REF__\n\n\n__ (Ar cieņu) __\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Sveiki)__\n\n\n__ (Ar cieņu) __\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Labdien,)__\n\n\n__ (Ar cieņu) __\n\n__USER_SIGNATURE__ PredefinedMailContentLink=Jūs varat noklikšķināt uz zemāk esošās saites, lai veiktu maksājumu, ja tas vēl nav izdarīts.\n\n%s\n\n DemoDesc=Dolibarr ir kompakts ERP / CRM, kas atbalsta vairākus biznesa moduļus. Demonstrācija, kas demonstrē visus moduļus, nav jēga, jo šis scenārijs nekad nenotiek (pieejami vairāki simti). Tātad, ir pieejami vairāki demo profili. diff --git a/htdocs/langs/lv_LV/projects.lang b/htdocs/langs/lv_LV/projects.lang index 6125a2800db..d28e48a8234 100644 --- a/htdocs/langs/lv_LV/projects.lang +++ b/htdocs/langs/lv_LV/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Saistīts ar citām trešajām personām TaskIsNotAssignedToUser=Uzdevums nav piešķirts lietotājam. Izmantojiet pogu "%s", lai uzdevumu piešķirtu. ErrorTimeSpentIsEmpty=Pavadīts laiks ir tukšs ThisWillAlsoRemoveTasks=Šī darbība arī izdzēst visus uzdevumus projekta (%s uzdevumi brīdī) un visu laiku ieguldījumiem pavadīts. -IfNeedToUseOhterObjectKeepEmpty=Ja daži objekti (rēķinu, pasūtījumu, ...), kas pieder citai trešai personai, ir saistītas ar projektu, lai izveidotu, saglabāt šo tukšo, lai būtu projektam, multi trešajām personām. +IfNeedToUseOtherObjectKeepEmpty=Ja daži objekti (rēķinu, pasūtījumu, ...), kas pieder citai trešai personai, ir saistītas ar projektu, lai izveidotu, saglabāt šo tukšo, lai būtu projektam, multi trešajām personām. CloneProject=Klonēt projektu CloneTasks=Klonēt uzdevumus CloneContacts=Klonēt kontaktus diff --git a/htdocs/langs/mk_MK/other.lang b/htdocs/langs/mk_MK/other.lang index ec0315b94cd..021bfe65985 100644 --- a/htdocs/langs/mk_MK/other.lang +++ b/htdocs/langs/mk_MK/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/mk_MK/projects.lang b/htdocs/langs/mk_MK/projects.lang index aadd8b446df..d895f477bd4 100644 --- a/htdocs/langs/mk_MK/projects.lang +++ b/htdocs/langs/mk_MK/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Linked to other third party TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Time spent is empty ThisWillAlsoRemoveTasks=This action will also delete all tasks of project (%s tasks at the moment) and all inputs of time spent. -IfNeedToUseOhterObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. +IfNeedToUseOtherObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. CloneProject=Clone project CloneTasks=Clone tasks CloneContacts=Clone contacts diff --git a/htdocs/langs/mn_MN/other.lang b/htdocs/langs/mn_MN/other.lang index ec0315b94cd..021bfe65985 100644 --- a/htdocs/langs/mn_MN/other.lang +++ b/htdocs/langs/mn_MN/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/mn_MN/projects.lang b/htdocs/langs/mn_MN/projects.lang index aadd8b446df..d895f477bd4 100644 --- a/htdocs/langs/mn_MN/projects.lang +++ b/htdocs/langs/mn_MN/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Linked to other third party TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Time spent is empty ThisWillAlsoRemoveTasks=This action will also delete all tasks of project (%s tasks at the moment) and all inputs of time spent. -IfNeedToUseOhterObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. +IfNeedToUseOtherObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. CloneProject=Clone project CloneTasks=Clone tasks CloneContacts=Clone contacts diff --git a/htdocs/langs/nb_NO/other.lang b/htdocs/langs/nb_NO/other.lang index 36a55eeebfc..796a7678b61 100644 --- a/htdocs/langs/nb_NO/other.lang +++ b/htdocs/langs/nb_NO/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hei)__\n\n\n__(Vennlig hilsen)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hei)__\n\n\n__(Vennlig hilsen)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=Du kan klikke på linken under for å utføre betalingen din, hvis det ikke allerede er gjort.\n\n%s\n\n DemoDesc=Dolibarr er en kompakt ERP/CRM med støtte for flere forretningsmoduler. En demo som viser alle moduler gir ingen mening da dette scenariet aldri skjer (flere hundre tilgjengelig). Derforer flere demoprofiler er tilgjengelig. diff --git a/htdocs/langs/nb_NO/projects.lang b/htdocs/langs/nb_NO/projects.lang index 259045027e5..f4b1ebecb4a 100644 --- a/htdocs/langs/nb_NO/projects.lang +++ b/htdocs/langs/nb_NO/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Knyttet opp til annen tredjepart TaskIsNotAssignedToUser=Oppgave ikke tildelt bruker. Bruk knappen ' %s' for å tilordne oppgaven nå. ErrorTimeSpentIsEmpty=Tidsbruk er tom ThisWillAlsoRemoveTasks=Denne handlingen vil også slette alle oppgaver i prosjektet (%s oppgaver for øyeblikket), og all tidsregistrering slettes -IfNeedToUseOhterObjectKeepEmpty=Dersom noen objekter (faktura, ordre, ...), tilhørende en annen tredjepart, må tilknyttes prosjektet, behold denne tom. Prosjektet kan da knyttes til flere tredjeparter. +IfNeedToUseOtherObjectKeepEmpty=Dersom noen objekter (faktura, ordre, ...), tilhørende en annen tredjepart, må tilknyttes prosjektet, behold denne tom. Prosjektet kan da knyttes til flere tredjeparter. CloneProject=Klon prosjekt CloneTasks=Klon oppgaver CloneContacts=Klon kontakter diff --git a/htdocs/langs/nl_NL/other.lang b/htdocs/langs/nl_NL/other.lang index 6f5ba9fb0e6..15a23f1cdbb 100644 --- a/htdocs/langs/nl_NL/other.lang +++ b/htdocs/langs/nl_NL/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/nl_NL/projects.lang b/htdocs/langs/nl_NL/projects.lang index 37063ab4235..5d32432e03f 100644 --- a/htdocs/langs/nl_NL/projects.lang +++ b/htdocs/langs/nl_NL/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Gekoppeld aan een andere derde partij TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Gespendeerde tijd is leeg ThisWillAlsoRemoveTasks=Deze actie zal ook alle taken van het project (%s taken op het moment) en alle ingangen van de tijd doorgebracht. -IfNeedToUseOhterObjectKeepEmpty=Als sommige objecten (factuur, order, ...), die behoren tot een andere derde, moet worden gekoppeld aan het project te maken, houden deze leeg naar het project dat met meerdere derden. +IfNeedToUseOtherObjectKeepEmpty=Als sommige objecten (factuur, order, ...), die behoren tot een andere derde, moet worden gekoppeld aan het project te maken, houden deze leeg naar het project dat met meerdere derden. CloneProject=Kloon project CloneTasks=Kloon taken CloneContacts=Kloon contacten diff --git a/htdocs/langs/pl_PL/other.lang b/htdocs/langs/pl_PL/other.lang index 810e900d0f8..9dc9f35266f 100644 --- a/htdocs/langs/pl_PL/other.lang +++ b/htdocs/langs/pl_PL/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/pl_PL/projects.lang b/htdocs/langs/pl_PL/projects.lang index 1c85219e122..f9eccfd9a2e 100644 --- a/htdocs/langs/pl_PL/projects.lang +++ b/htdocs/langs/pl_PL/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Powiązane z innymą częścią trzecią TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Czas spędzony jest pusty ThisWillAlsoRemoveTasks=To działanie także usunie wszystkie zadania projektu (%s zadania w tej chwili) i wszystkie dane wejścia czasu spędzonego. -IfNeedToUseOhterObjectKeepEmpty=Jeżeli pewne obiekty (faktura, zamówienie, ...), należące do innej części trzeciej, muszą być związane z projektem tworzenia, zachowaj to puste by projekt był wielowątkowy -(wiele części trzecich). +IfNeedToUseOtherObjectKeepEmpty=Jeżeli pewne obiekty (faktura, zamówienie, ...), należące do innej części trzeciej, muszą być związane z projektem tworzenia, zachowaj to puste by projekt był wielowątkowy -(wiele części trzecich). CloneProject=Sklonuj projekt CloneTasks=Sklonuj zadania CloneContacts=Sklonuj kontakty diff --git a/htdocs/langs/pt_BR/projects.lang b/htdocs/langs/pt_BR/projects.lang index 933376d889b..cafcce387a3 100644 --- a/htdocs/langs/pt_BR/projects.lang +++ b/htdocs/langs/pt_BR/projects.lang @@ -64,7 +64,7 @@ NoTasks=Não há tarefas para este projeto LinkedToAnotherCompany=Ligado a outros terceiros ErrorTimeSpentIsEmpty=O dispêndio de tempo está em branco ThisWillAlsoRemoveTasks=Esta ação também vai apagar todas as tarefas do projeto (tarefas% s no momento) e todas as entradas de tempo gasto. -IfNeedToUseOhterObjectKeepEmpty=Se alguns objetos (nota fiscal, ordem, ...), pertencentes a um terceiro, deve estar vinculado ao projeto de criar, manter este vazio para que o projeto de vários fornecedores. +IfNeedToUseOtherObjectKeepEmpty=Se alguns objetos (nota fiscal, ordem, ...), pertencentes a um terceiro, deve estar vinculado ao projeto de criar, manter este vazio para que o projeto de vários fornecedores. CloneContacts=Copiar contatos CloneNotes=Copiar notas CloneProjectFiles=Copiar arquivos do projetos diff --git a/htdocs/langs/pt_PT/other.lang b/htdocs/langs/pt_PT/other.lang index 742f34e0abc..c3fd507e4e9 100644 --- a/htdocs/langs/pt_PT/other.lang +++ b/htdocs/langs/pt_PT/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Olá)__\n\nPor favor, encontre a fat PredefinedMailContentSendShipping=__(Olá)__\n\nPor favor, encontrar o envio em anexo __REF__\n\n\n__(Atenciosamente)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Olá)__\n\nPor favor encontre a intervenção em anexo __REF__\n\n\n__(Atenciosamente)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Olá)__\n\n\n__(Atenciosamente)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Olá)__\n\n\n__(Atenciosamente)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=Você pode clicar no link abaixo para fazer seu pagamento, se ainda não estiver pronto.\n\n%s\n\n DemoDesc=O Dolibarr é um ERP/CRM compacto que suporta vários módulos de negócios. Uma demonstração mostrando todos os módulos não faz sentido porque esse cenário nunca ocorre (várias centenas disponíveis). Assim, vários perfis de demonstração estão disponíveis. diff --git a/htdocs/langs/pt_PT/projects.lang b/htdocs/langs/pt_PT/projects.lang index 32d0adc75c6..b27120ec443 100644 --- a/htdocs/langs/pt_PT/projects.lang +++ b/htdocs/langs/pt_PT/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Vinculado a Terceiros TaskIsNotAssignedToUser=Tarefa não atribuída ao usuário. Use o botão ' %s ' para atribuir tarefa agora. ErrorTimeSpentIsEmpty=Tempo dispensado está vazio ThisWillAlsoRemoveTasks=Esta ação também vai excluir todas as tarefas do projeto (%s tarefas no momento) e todas as entradas de tempo dispensadas. -IfNeedToUseOhterObjectKeepEmpty=Caso alguns objetos (fatura, encomenda, ...), pertencentes a um terceiro, deve estar vinculado ao projeto para criar, manter este vazio para ter o projeto sendo multi-terceiros. +IfNeedToUseOtherObjectKeepEmpty=Caso alguns objetos (fatura, encomenda, ...), pertencentes a um terceiro, deve estar vinculado ao projeto para criar, manter este vazio para ter o projeto sendo multi-terceiros. CloneProject=Clonar projeto CloneTasks=Clonar tarefas CloneContacts=Clonar contactos diff --git a/htdocs/langs/ro_RO/other.lang b/htdocs/langs/ro_RO/other.lang index d423e560227..f468b7d5d6e 100644 --- a/htdocs/langs/ro_RO/other.lang +++ b/htdocs/langs/ro_RO/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/ro_RO/projects.lang b/htdocs/langs/ro_RO/projects.lang index cb3ce2e9bb8..e1580006381 100644 --- a/htdocs/langs/ro_RO/projects.lang +++ b/htdocs/langs/ro_RO/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Legat de terţe părţi, alta TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Timpul consumat nu este completat ThisWillAlsoRemoveTasks=Această acţiune va şterge, de asemenea, toate taskurile proiectului (%s ) la acest moment şitoţi timpii petrecuţi. -IfNeedToUseOhterObjectKeepEmpty=Dacă unele obiecte (facturi, comenzi, ...), care aparţin altui terţ, trebuie să fie legate de proiect, pentru creare, menţine acest gol pentru a avea proiectul fiind multiterţi. +IfNeedToUseOtherObjectKeepEmpty=Dacă unele obiecte (facturi, comenzi, ...), care aparţin altui terţ, trebuie să fie legate de proiect, pentru creare, menţine acest gol pentru a avea proiectul fiind multiterţi. CloneProject=Clonează proiect CloneTasks=Clonează taskuri CloneContacts=Clonează contacte diff --git a/htdocs/langs/ru_RU/projects.lang b/htdocs/langs/ru_RU/projects.lang index 30ed942bfaf..bf2b47d026f 100644 --- a/htdocs/langs/ru_RU/projects.lang +++ b/htdocs/langs/ru_RU/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Связь с другими третий участни TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Время, проведенное пуста ThisWillAlsoRemoveTasks=Это действие приведет к удалению всех задач проекта (%s задач на данный момент), и все входы затраченного времени. -IfNeedToUseOhterObjectKeepEmpty=Если некоторые объекты (счет-фактура, заказ, ...), принадлежащей другому третьему лицу, должна быть увязана с проектом по созданию, держать этот пустой иметь проект, несколько третьих лиц. +IfNeedToUseOtherObjectKeepEmpty=Если некоторые объекты (счет-фактура, заказ, ...), принадлежащей другому третьему лицу, должна быть увязана с проектом по созданию, держать этот пустой иметь проект, несколько третьих лиц. CloneProject=Дублировать Проект CloneTasks=Дублировать задачи CloneContacts=Дублировать контакты diff --git a/htdocs/langs/sk_SK/other.lang b/htdocs/langs/sk_SK/other.lang index 88907452830..c8c42fc5c11 100644 --- a/htdocs/langs/sk_SK/other.lang +++ b/htdocs/langs/sk_SK/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/sk_SK/projects.lang b/htdocs/langs/sk_SK/projects.lang index 1808a80e71b..491170ecbe1 100644 --- a/htdocs/langs/sk_SK/projects.lang +++ b/htdocs/langs/sk_SK/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Súvisí s tretej strane TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Čas strávený je prázdny ThisWillAlsoRemoveTasks=Táto akcia bude tiež odstrániť všetky úlohy projektu (%s úlohy v túto chvíľu) a všetky vstupy času stráveného. -IfNeedToUseOhterObjectKeepEmpty=Ak sú niektoré predmety (faktúra, objednávka, ...), ktoré patria do inej tretej osobe, musí byť spojené s projektom, vytvoriť, aby bol tento prázdny mať projekt bytia multi tretej strany. +IfNeedToUseOtherObjectKeepEmpty=Ak sú niektoré predmety (faktúra, objednávka, ...), ktoré patria do inej tretej osobe, musí byť spojené s projektom, vytvoriť, aby bol tento prázdny mať projekt bytia multi tretej strany. CloneProject=Clone projekt CloneTasks=Clone úlohy CloneContacts=Clone kontakty diff --git a/htdocs/langs/sl_SI/other.lang b/htdocs/langs/sl_SI/other.lang index c5549ded0a1..01b564a6d4d 100644 --- a/htdocs/langs/sl_SI/other.lang +++ b/htdocs/langs/sl_SI/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/sl_SI/projects.lang b/htdocs/langs/sl_SI/projects.lang index 6ffd6e33875..5161b5a647e 100644 --- a/htdocs/langs/sl_SI/projects.lang +++ b/htdocs/langs/sl_SI/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Povezane z drugimi partnerji TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Ni porabljenega časa ThisWillAlsoRemoveTasks=Ta aktivnost bo tudi izbrisala vse naloge projekta (%s trenutne naloge) in vse vnose porabljenega časa. -IfNeedToUseOhterObjectKeepEmpty=Če nekateri objekti (računi, naročila, ...), ki pripadajo drugemu partnerju, morajo biti vezani na projekt, ki se kreira, pustite polje prazno, da je projekt lahko vezan na več partnerjev. +IfNeedToUseOtherObjectKeepEmpty=Če nekateri objekti (računi, naročila, ...), ki pripadajo drugemu partnerju, morajo biti vezani na projekt, ki se kreira, pustite polje prazno, da je projekt lahko vezan na več partnerjev. CloneProject=Kloniraj projekt CloneTasks=Kloniraj naloge CloneContacts=Kloniraj kontakte diff --git a/htdocs/langs/sq_AL/other.lang b/htdocs/langs/sq_AL/other.lang index 4e628e0a3b3..c349aa6a2c6 100644 --- a/htdocs/langs/sq_AL/other.lang +++ b/htdocs/langs/sq_AL/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/sq_AL/projects.lang b/htdocs/langs/sq_AL/projects.lang index 35f8d333985..ce64c2819dd 100644 --- a/htdocs/langs/sq_AL/projects.lang +++ b/htdocs/langs/sq_AL/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Linked to other third party TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Time spent is empty ThisWillAlsoRemoveTasks=This action will also delete all tasks of project (%s tasks at the moment) and all inputs of time spent. -IfNeedToUseOhterObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. +IfNeedToUseOtherObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. CloneProject=Clone project CloneTasks=Clone tasks CloneContacts=Clone contacts diff --git a/htdocs/langs/sr_RS/other.lang b/htdocs/langs/sr_RS/other.lang index 417f29264f4..1f46e34c73d 100644 --- a/htdocs/langs/sr_RS/other.lang +++ b/htdocs/langs/sr_RS/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/sr_RS/projects.lang b/htdocs/langs/sr_RS/projects.lang index 815c76e60ab..b9cfb6ef19b 100644 --- a/htdocs/langs/sr_RS/projects.lang +++ b/htdocs/langs/sr_RS/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Subjekti vezani za ovaj projekat TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Provedeno vreme nije uneto ThisWillAlsoRemoveTasks=Ova akcija će obrisati sve zadatke ovog projekta (%s zadataka u ovom trenutku) i sve unose utrošenog vremena. -IfNeedToUseOhterObjectKeepEmpty=Ukoliko neki objekti (fakture, narudžbine, ...) pripadaju drugom subjektu, oni moraju biti povezani projektu koji se kreira. Ostavite ovu opciju praznu da bi projekat mogao da bude povezan sa više subjekata. +IfNeedToUseOtherObjectKeepEmpty=Ukoliko neki objekti (fakture, narudžbine, ...) pripadaju drugom subjektu, oni moraju biti povezani projektu koji se kreira. Ostavite ovu opciju praznu da bi projekat mogao da bude povezan sa više subjekata. CloneProject=Dupliraj projekat CloneTasks=Dupiraj zadatke CloneContacts=Dupliraj kontakte diff --git a/htdocs/langs/sv_SE/other.lang b/htdocs/langs/sv_SE/other.lang index 7bb42882bab..d97e72ede13 100644 --- a/htdocs/langs/sv_SE/other.lang +++ b/htdocs/langs/sv_SE/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/sv_SE/projects.lang b/htdocs/langs/sv_SE/projects.lang index c6c08153f1a..4859567ee70 100644 --- a/htdocs/langs/sv_SE/projects.lang +++ b/htdocs/langs/sv_SE/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Kopplat till annan tredje part TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Tid är tom ThisWillAlsoRemoveTasks=Denna åtgärd kommer också att ta bort alla aktiviteter av projekt (%s uppgifter på för tillfället) och alla ingångar för nedlagd tid. -IfNeedToUseOhterObjectKeepEmpty=Om vissa objekt (faktura, order, ...), som tillhör en annan tredje part, måste kopplas till projektet för att skapa, hålla denna tomt för att få projektet att flera tredje part. +IfNeedToUseOtherObjectKeepEmpty=Om vissa objekt (faktura, order, ...), som tillhör en annan tredje part, måste kopplas till projektet för att skapa, hålla denna tomt för att få projektet att flera tredje part. CloneProject=Klon projekt CloneTasks=Klon uppgifter CloneContacts=Klon kontakter diff --git a/htdocs/langs/sw_SW/other.lang b/htdocs/langs/sw_SW/other.lang index ec0315b94cd..021bfe65985 100644 --- a/htdocs/langs/sw_SW/other.lang +++ b/htdocs/langs/sw_SW/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/sw_SW/projects.lang b/htdocs/langs/sw_SW/projects.lang index aadd8b446df..d895f477bd4 100644 --- a/htdocs/langs/sw_SW/projects.lang +++ b/htdocs/langs/sw_SW/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Linked to other third party TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Time spent is empty ThisWillAlsoRemoveTasks=This action will also delete all tasks of project (%s tasks at the moment) and all inputs of time spent. -IfNeedToUseOhterObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. +IfNeedToUseOtherObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. CloneProject=Clone project CloneTasks=Clone tasks CloneContacts=Clone contacts diff --git a/htdocs/langs/th_TH/other.lang b/htdocs/langs/th_TH/other.lang index f2ff406f446..b05d7b86655 100644 --- a/htdocs/langs/th_TH/other.lang +++ b/htdocs/langs/th_TH/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/th_TH/projects.lang b/htdocs/langs/th_TH/projects.lang index feb3391e6de..e4e419099dd 100644 --- a/htdocs/langs/th_TH/projects.lang +++ b/htdocs/langs/th_TH/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=เชื่อมโยงไปยังบุคคล TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=เวลาที่ใช้เป็นที่ว่างเปล่า ThisWillAlsoRemoveTasks=การดำเนินการนี้จะลบงานทั้งหมดของโครงการ (% s งานในขณะนี้) และปัจจัยการผลิตทั้งหมดของเวลาที่ใช้ -IfNeedToUseOhterObjectKeepEmpty=หากวัตถ​​ุบางอย่าง (ใบแจ้งหนี้การสั่งซื้อ ... ) เป็นของอีกบุคคลที่สามจะต้องเชื่อมโยงกับโครงการที่จะสร้างให้ที่ว่างเปล่านี้จะมีโครงการที่เป็นบุคคลที่สามหลาย +IfNeedToUseOtherObjectKeepEmpty=หากวัตถ​​ุบางอย่าง (ใบแจ้งหนี้การสั่งซื้อ ... ) เป็นของอีกบุคคลที่สามจะต้องเชื่อมโยงกับโครงการที่จะสร้างให้ที่ว่างเปล่านี้จะมีโครงการที่เป็นบุคคลที่สามหลาย CloneProject=โครงการโคลน CloneTasks=งานโคลน CloneContacts=รายชื่อโคลน diff --git a/htdocs/langs/tr_TR/other.lang b/htdocs/langs/tr_TR/other.lang index 2907be72ffa..a495eb02583 100644 --- a/htdocs/langs/tr_TR/other.lang +++ b/htdocs/langs/tr_TR/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr, çeşitli iş modüllerini destekleyen kompakt bir ERP/CRM çözümüdür. Tüm modüllerin sergilendiği bir demonun mantığı yoktur, çünkü böyle bir senaryo asla gerçekleşmez (birkaç yüz adet mevcut). Bu nedenle birkaç demo profili vardır. diff --git a/htdocs/langs/tr_TR/projects.lang b/htdocs/langs/tr_TR/projects.lang index 7391f601bb3..eb562ae6765 100644 --- a/htdocs/langs/tr_TR/projects.lang +++ b/htdocs/langs/tr_TR/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Diğer üçüncü partiye bağlantılı TaskIsNotAssignedToUser=Görev kullanıcıya atanmadı. Görevi şimdi atamak için '%s' düğmesini kullanın. ErrorTimeSpentIsEmpty=Harcanan süre boş ThisWillAlsoRemoveTasks=Bu eylem aynı zamanda projenin tüm görevlerini (şu andaki %s görevleri) ve tüm harcanan süre girişlernii siler . -IfNeedToUseOhterObjectKeepEmpty=Eğer bazı nesneler başka bir üçüncü partiye aitse (fatura, sipariş, ...), oluşturulması için bu projeye bağlanmalıdır, projenin birden çok üçüncü partiye bağlı olması için bunu boş bırakın. +IfNeedToUseOtherObjectKeepEmpty=Eğer bazı nesneler başka bir üçüncü partiye aitse (fatura, sipariş, ...), oluşturulması için bu projeye bağlanmalıdır, projenin birden çok üçüncü partiye bağlı olması için bunu boş bırakın. CloneProject=Proje klonla CloneTasks=Görev klonla CloneContacts=Kişi klonla diff --git a/htdocs/langs/uk_UA/other.lang b/htdocs/langs/uk_UA/other.lang index ec0315b94cd..021bfe65985 100644 --- a/htdocs/langs/uk_UA/other.lang +++ b/htdocs/langs/uk_UA/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/uk_UA/projects.lang b/htdocs/langs/uk_UA/projects.lang index 8f48af60f74..1210ea29243 100644 --- a/htdocs/langs/uk_UA/projects.lang +++ b/htdocs/langs/uk_UA/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Linked to other third party TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Time spent is empty ThisWillAlsoRemoveTasks=This action will also delete all tasks of project (%s tasks at the moment) and all inputs of time spent. -IfNeedToUseOhterObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. +IfNeedToUseOtherObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. CloneProject=Clone project CloneTasks=Clone tasks CloneContacts=Clone contacts diff --git a/htdocs/langs/uz_UZ/other.lang b/htdocs/langs/uz_UZ/other.lang index ec0315b94cd..021bfe65985 100644 --- a/htdocs/langs/uz_UZ/other.lang +++ b/htdocs/langs/uz_UZ/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/uz_UZ/projects.lang b/htdocs/langs/uz_UZ/projects.lang index aadd8b446df..d895f477bd4 100644 --- a/htdocs/langs/uz_UZ/projects.lang +++ b/htdocs/langs/uz_UZ/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Linked to other third party TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Time spent is empty ThisWillAlsoRemoveTasks=This action will also delete all tasks of project (%s tasks at the moment) and all inputs of time spent. -IfNeedToUseOhterObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. +IfNeedToUseOtherObjectKeepEmpty=If some objects (invoice, order, ...), belonging to another third party, must be linked to the project to create, keep this empty to have the project being multi third parties. CloneProject=Clone project CloneTasks=Clone tasks CloneContacts=Clone contacts diff --git a/htdocs/langs/vi_VN/other.lang b/htdocs/langs/vi_VN/other.lang index ba88771511a..aadf0444a54 100644 --- a/htdocs/langs/vi_VN/other.lang +++ b/htdocs/langs/vi_VN/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/vi_VN/projects.lang b/htdocs/langs/vi_VN/projects.lang index 41731c3ac2b..79c801631b8 100644 --- a/htdocs/langs/vi_VN/projects.lang +++ b/htdocs/langs/vi_VN/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=Được liên kết đến các bên thứ ba TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=Thời gian đã qua đang trống ThisWillAlsoRemoveTasks=Thao tác này sẽ xóa toàn bộ các tác vụ của dự án (%s các tác vụ ở thời điểm hiện tại) và toàn bộ dữ liệu đã nhập vào trong suốt thời gian vừa qua. -IfNeedToUseOhterObjectKeepEmpty=Nếu một số đối tượng (hóa đơn, đơn hàng, ...), thuộc về một bên thứ ba khác, phải có liên kết đến dự án để tạo, giữ phần này trống để dự án có sự tham gia của nhiều bên thứ ba khác +IfNeedToUseOtherObjectKeepEmpty=Nếu một số đối tượng (hóa đơn, đơn hàng, ...), thuộc về một bên thứ ba khác, phải có liên kết đến dự án để tạo, giữ phần này trống để dự án có sự tham gia của nhiều bên thứ ba khác CloneProject=Nhân bản dự án CloneTasks=Nhân bản tác vụ CloneContacts=Nhân bản liên lạc diff --git a/htdocs/langs/zh_TW/other.lang b/htdocs/langs/zh_TW/other.lang index 5a8219c5986..90c42c2ec4a 100644 --- a/htdocs/langs/zh_TW/other.lang +++ b/htdocs/langs/zh_TW/other.lang @@ -94,6 +94,7 @@ PredefinedMailContentSendSupplierInvoice=__(Hello)__\n\nPlease find attached inv PredefinedMailContentSendShipping=__(Hello)__\n\nPlease find attached shipping __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentSendFichInter=__(Hello)__\n\nPlease find attached intervention __REF__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentThirdparty=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ +PredefinedMailContentContact=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentUser=__(Hello)__\n\n\n__(Sincerely)__\n\n__USER_SIGNATURE__ PredefinedMailContentLink=You can click on the link below to make your payment if it is not already done.\n\n%s\n\n DemoDesc=Dolibarr is a compact ERP/CRM supporting several business modules. A demo showcasing all modules makes no sense as this scenario never occurs (several hundred available). So, several demo profiles are available. diff --git a/htdocs/langs/zh_TW/projects.lang b/htdocs/langs/zh_TW/projects.lang index f8704cea387..b9404a028dc 100644 --- a/htdocs/langs/zh_TW/projects.lang +++ b/htdocs/langs/zh_TW/projects.lang @@ -129,7 +129,7 @@ LinkedToAnotherCompany=鏈接到其他第三方 TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now. ErrorTimeSpentIsEmpty=所花費的時間是空的 ThisWillAlsoRemoveTasks=這一行動也將刪除所有項目任務(%s任務的時刻),花全部的時間都投入。 -IfNeedToUseOhterObjectKeepEmpty=如果某些對象(發票,訂單,...),屬於其他第三方,必須與該項目以創建,保持這個空項目多的第三方。 +IfNeedToUseOtherObjectKeepEmpty=如果某些對象(發票,訂單,...),屬於其他第三方,必須與該項目以創建,保持這個空項目多的第三方。 CloneProject=Clone project CloneTasks=Clone tasks CloneContacts=Clone contacts diff --git a/htdocs/loan/card.php b/htdocs/loan/card.php index 242472aff0a..cec094ef04d 100644 --- a/htdocs/loan/card.php +++ b/htdocs/loan/card.php @@ -135,6 +135,7 @@ if (empty($reshook)) $object->note_private = GETPOST('note_private','none'); $object->note_public = GETPOST('note_public','none'); $object->fk_project = GETPOST('projectid','int'); + $object->insurance_amount = GETPOST('insurance_amount', 'int'); $accountancy_account_capital = GETPOST('accountancy_account_capital'); $accountancy_account_insurance = GETPOST('accountancy_account_insurance'); @@ -148,7 +149,7 @@ if (empty($reshook)) if ($id <= 0) { $error++; - setEventMessages($object->error, $object->errors, 'errors'); + setEventMessages($object->db->lastqueryerror, $object->errors, 'errors'); $action = 'create'; } } @@ -301,6 +302,9 @@ if ($action == 'create') // Rate print '
'.$langs->trans("Rate").' %
'.$langs->trans("Insurance").'
'.$langs->trans("LoanCapital").''.price($object->capital,0,$outputlangs,1,-1,-1,$conf->currency).'
'.$langs->trans("Insurance").''; + print '
'.$langs->trans("Insurance").''.price($object->insurance_amount,0,$outputlangs,1,-1,-1,$conf->currency).'
'.$langs->trans("DateStart")."
'; print ''; -print ''; print ''; print ''; -Print ''; -Print ''; +Print ''; +Print ''; +print ''; Print ''; -Print ''; Print ''; +if (count($echeance->lines)>0) print ''; print ''."\n"; if ($object->nbterm > 0 && count($echeance->lines)==0) { $i=1; $capital = $object->capital; + $insurance = $object->insurance_amount/$object->nbterm; + $insurance = price2num($insurance, 'MT'); + $regulInsurance = price2num($object->insurance_amount - ($insurance * $object->nbterm)); while($i <$object->nbterm+1) { $mens = price2num($echeance->calcMonthlyPayments($capital, $object->rate/100, $object->nbterm-$i+1), 'MT'); @@ -172,8 +182,9 @@ if ($object->nbterm > 0 && count($echeance->lines)==0) print ''; print ''; print ''; - print ''; + print ''; print ''; + print ''; print ''; print ''."\n"; $i++; @@ -184,6 +195,9 @@ elseif(count($echeance->lines)>0) { $i=1; $capital = $object->capital; + $insurance = $object->insurance_amount/$object->nbterm; + $insurance = price2num($insurance, 'MT'); + $regulInsurance = price2num($object->insurance_amount - ($insurance * $object->nbterm)); foreach ($echeance->lines as $line){ $mens = $line->amount_capital+$line->amount_insurance+$line->amount_interest; $int = $line->amount_interest; @@ -191,13 +205,16 @@ elseif(count($echeance->lines)>0) print ''; print ''; print ''; + print ''; + print ''; if($line->datep > dol_now()){ print ''; }else{ print ''; } - print ''; + print ''; + print ''; print ''."\n"; $i++; $capital = $cap_rest; diff --git a/htdocs/loan/payment/card.php b/htdocs/loan/payment/card.php index 77d47e66b40..017f6a26254 100644 --- a/htdocs/loan/payment/card.php +++ b/htdocs/loan/payment/card.php @@ -54,6 +54,9 @@ if ($action == 'confirm_delete' && $confirm == 'yes' && $user->rights->loan->del { $db->begin(); + $sql = "UPDATE ".MAIN_DB_PREFIX."loan_schedule SET fk_bank = 0 WHERE fk_bank = ".$payment->fk_bank; + $db->query($sql); + $result = $payment->delete($user); if ($result > 0) { @@ -286,7 +289,7 @@ if (empty($action) && ! empty($user->rights->loan->delete)) } else { - print ''.$langs->trans('Delete').''; + print ''.$langs->trans('Delete').''; } } diff --git a/htdocs/loan/payment/payment.php b/htdocs/loan/payment/payment.php index 08937c1f389..07425ea1942 100644 --- a/htdocs/loan/payment/payment.php +++ b/htdocs/loan/payment/payment.php @@ -24,6 +24,7 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/loan/class/loan.class.php'; +require_once DOL_DOCUMENT_ROOT.'/loan/class/loanschedule.class.php'; require_once DOL_DOCUMENT_ROOT.'/loan/class/paymentloan.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; @@ -32,6 +33,8 @@ $langs->loadLangs(array("bills","loan")); $chid=GETPOST('id','int'); $action=GETPOST('action','aZ09'); $cancel=GETPOST('cancel','alpha'); +$line_id = GETPOST('line_id', 'int'); +$last=GETPOST('last'); // Security check $socid=0; @@ -43,9 +46,41 @@ if ($user->societe_id > 0) $loan = new Loan($db); $loan->fetch($chid); +if($last) +{ + $ls = new LoanSchedule($db); + // grab all loanschedule + $res = $ls->fetchAll($chid); + if ($res > 0) + { + foreach ($ls->lines as $l) + { + // get the last unpaid loanschedule + if (empty($l->fk_bank)) + { + $line_id = $l->id; + break; + } + } + } +} + +if (!empty($line_id)) +{ + $line = new LoanSchedule($db); + $res = $line->fetch($line_id); + if ($res > 0){ + $amount_capital = price($line->amount_capital); + $amount_insurance = price($line->amount_insurance); + $amount_interest = price($line->amount_interest); + } +} + + /* * Actions */ + if ($action == 'add_payment') { $error=0; @@ -69,72 +104,77 @@ if ($action == 'add_payment') setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Date")), null, 'errors'); $error++; } - if (! empty($conf->banque->enabled) && ! GETPOST('accountid', 'int') > 0) - { - setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("AccountToCredit")), null, 'errors'); - $error++; - } + if (! empty($conf->banque->enabled) && ! GETPOST('accountid', 'int') > 0) + { + setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("AccountToCredit")), null, 'errors'); + $error++; + } if (! $error) { $paymentid = 0; - $amount = GETPOST('amount_capital') + GETPOST('amount_insurance') + GETPOST('amount_interest'); - if ($amount == 0) - { - setEventMessages($langs->trans('ErrorNoPaymentDefined'), null, 'errors'); - $error++; - } + $amount = GETPOST('amount_capital') + GETPOST('amount_insurance') + GETPOST('amount_interest'); + if ($amount == 0) + { + setEventMessages($langs->trans('ErrorNoPaymentDefined'), null, 'errors'); + $error++; + } - if (! $error) - { - $db->begin(); + if (! $error) + { + $db->begin(); - // Create a line of payments - $payment = new PaymentLoan($db); - $payment->chid = $chid; - $payment->datep = $datepaid; - $payment->label = $loan->label; + // Create a line of payments + $payment = new PaymentLoan($db); + $payment->chid = $chid; + $payment->datep = $datepaid; + $payment->label = $loan->label; $payment->amount_capital = GETPOST('amount_capital'); $payment->amount_insurance = GETPOST('amount_insurance'); $payment->amount_interest = GETPOST('amount_interest'); $payment->paymenttype = GETPOST('paymenttype', 'int'); - $payment->num_payment = GETPOST('num_payment'); - $payment->note_private = GETPOST('note_private','none'); - $payment->note_public = GETPOST('note_public','none'); + $payment->num_payment = GETPOST('num_payment'); + $payment->note_private = GETPOST('note_private','none'); + $payment->note_public = GETPOST('note_public','none'); - if (! $error) - { - $paymentid = $payment->create($user); - if ($paymentid < 0) - { - setEventMessages($payment->error, $payment->errors, 'errors'); - $error++; - } - } + if (! $error) + { + $paymentid = $payment->create($user); + if ($paymentid < 0) + { + setEventMessages($payment->error, $payment->errors, 'errors'); + $error++; + } + } - if (! $error) - { - $result = $payment->addPaymentToBank($user, $chid, 'payment_loan', '(LoanPayment)', GETPOST('accountid', 'int'), '', ''); - if (! $result > 0) - { - setEventMessages($payment->error, $payment->errors, 'errors'); - $error++; - } - } + if (! $error) + { + $result = $payment->addPaymentToBank($user, $chid, 'payment_loan', '(LoanPayment)', GETPOST('accountid', 'int'), '', ''); + if (! $result > 0) + { + setEventMessages($payment->error, $payment->errors, 'errors'); + $error++; + } + elseif(isset($line)) + { + $line->fk_bank = $payment->fk_bank; + $line->update($user); + } + } - if (! $error) - { - $db->commit(); - $loc = DOL_URL_ROOT.'/loan/card.php?id='.$chid; - header('Location: '.$loc); - exit; - } - else - { - $db->rollback(); - } - } + if (! $error) + { + $db->commit(); + $loc = DOL_URL_ROOT.'/loan/card.php?id='.$chid; + header('Location: '.$loc); + exit; + } + else + { + $db->rollback(); + } + } } $action = 'create'; @@ -161,6 +201,7 @@ if ($action == 'create') print ''; print ''; print ''; + print ''; print ''; dol_fiche_head(); @@ -233,7 +274,7 @@ if ($action == 'create') print '
'; +$colspan = 6; +if (count($echeance->lines)>0) $colspan++; +print ''; print $langs->trans("FinancialCommitment"); print '
'.$langs->trans("Term").''.$langs->trans("Date").''.$langs->trans("Term").''.$langs->trans("Date").''.$langs->trans("Insurance"); +Print ''.$langs->trans("InterestAmount").''.$langs->trans("Amount").''.$langs->trans("InterestAmount").''.$langs->trans("CapitalRemain"); print ' ('.price2num($object->capital).')'; print ''; print ''.$langs->trans('DoPayment').'
' . $i .'' . dol_print_date(dol_time_plus_duree($object->datestart, $i-1, 'm'),'day') . ''.price($insurance+(($i == 1) ? $regulInsurance : 0),0,'',1).' €'.price($int,0,'',1).' €'.price($cap_rest).' €
' . $i .'' . dol_print_date($line->datep,'day') . ''.price($insurance+(($i == 1) ? $regulInsurance : 0),0,'',1).' €'.price($int,0,'',1).' €' . price($mens) . ' €'.price($int,0,'',1).' €'.price($cap_rest).' €'.$langs->trans('DoPayment').'
'; - dol_fiche_end(); + dol_fiche_end(); print ''; print ''; @@ -264,7 +305,7 @@ if ($action == 'create') print '\n"; print ''; - print_liste_field_titre("Ref", $_SERVER["PHP_SELF"], "f.facnumber", "", $param, '', $sortfield, $sortorder); + print_liste_field_titre("Ref", $_SERVER["PHP_SELF"], "f.ref", "", $param, '', $sortfield, $sortorder); print_liste_field_titre("Description", $_SERVER["PHP_SELF"], "", "", $param, 'width=20%', $sortfield, $sortorder); print_liste_field_titre("UnitPriceHT", $_SERVER["PHP_SELF"], "d.subprice", "", $param, 'align="right"', $sortfield, $sortorder); print_liste_field_titre($labelcostprice, $_SERVER["PHP_SELF"], "d.buy_price_ht", "", $param, 'align="right"', $sortfield, $sortorder); diff --git a/htdocs/margin/customerMargins.php b/htdocs/margin/customerMargins.php index 675fe527a47..5e04ebff091 100644 --- a/htdocs/margin/customerMargins.php +++ b/htdocs/margin/customerMargins.php @@ -202,7 +202,7 @@ print ''; $sql = "SELECT"; $sql.= " s.rowid as socid, s.nom as name, s.code_client, s.client,"; -if ($client) $sql.= " f.rowid as facid, f.facnumber, f.total as total_ht, f.datef, f.paye, f.fk_statut as statut,"; +if ($client) $sql.= " f.rowid as facid, f.ref, f.total as total_ht, f.datef, f.paye, f.fk_statut as statut,"; $sql.= " sum(d.total_ht) as selling_price,"; // Note: qty and buy_price_ht is always positive (if not, your database may be corrupted, you can update this) $sql.= " sum(".$db->ifsql('d.total_ht < 0','d.qty * d.buy_price_ht * -1','d.qty * d.buy_price_ht').") as buying_price,"; @@ -235,7 +235,7 @@ $sql.= " AND f.datef <= '".$db->idate($enddate)."'"; $sql .= " AND d.buy_price_ht IS NOT NULL"; if (isset($conf->global->ForceBuyingPriceIfNull) && $conf->global->ForceBuyingPriceIfNull == 1) $sql .= " AND d.buy_price_ht <> 0"; -if ($client) $sql.= " GROUP BY s.rowid, s.nom, s.code_client, s.client, f.rowid, f.facnumber, f.total, f.datef, f.paye, f.fk_statut"; +if ($client) $sql.= " GROUP BY s.rowid, s.nom, s.code_client, s.client, f.rowid, f.ref, f.total, f.datef, f.paye, f.fk_statut"; else $sql.= " GROUP BY s.rowid, s.nom, s.code_client, s.client"; $sql.=$db->order($sortfield,$sortorder); // TODO: calculate total to display then restore pagination @@ -260,7 +260,7 @@ if ($result) print ''; if (! empty($client)) { - print_liste_field_titre("Invoice",$_SERVER["PHP_SELF"],"f.facnumber","","&socid=".$socid,'',$sortfield,$sortorder); + print_liste_field_titre("Invoice",$_SERVER["PHP_SELF"],"f.ref","","&socid=".$socid,'',$sortfield,$sortorder); print_liste_field_titre("DateInvoice",$_SERVER["PHP_SELF"],"f.datef","","&socid=".$socid,'align="center"',$sortfield,$sortorder); } else @@ -304,7 +304,7 @@ if ($result) if ($client) { print '\n"; print "'; if ($id > 0) { - print_liste_field_titre("Invoice",$_SERVER["PHP_SELF"],"f.facnumber","","&id=".$id,'',$sortfield,$sortorder); + print_liste_field_titre("Invoice",$_SERVER["PHP_SELF"],"f.ref","","&id=".$id,'',$sortfield,$sortorder); print_liste_field_titre("DateInvoice",$_SERVER["PHP_SELF"],"f.datef","","&id=".$id,'align="center"',$sortfield,$sortorder); } else @@ -277,7 +277,7 @@ if ($result) if ($id > 0) { print '\n"; print " + + + + + + + + + + 1) +{ + ?> + + + + + + + + + + + + diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php index cd923ee6dcd..3981731419e 100644 --- a/htdocs/societe/card.php +++ b/htdocs/societe/card.php @@ -12,6 +12,7 @@ * Copyright (C) 2015 Raphaël Doursenaud * Copyright (C) 2018 Nicolas ZABOURI * Copyright (C) 2018 Ferran Marcet + * Copyright (C) 2018 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 @@ -1148,7 +1149,7 @@ else } else { - print ''.fieldLabel('ThirdPartyName','name').''; + print ''.$form->editfieldkey('ThirdPartyName', 'name', '', $object, 0).''; } print 'global->SOCIETE_USEPREFIX)?' colspan="3"':'').'>'; print ''; @@ -1161,11 +1162,11 @@ else // If javascript on, we show option individual if ($conf->use_javascript_ajax) { - print ''; + print ''; print ''; print ''; // Title - print ''; print ''; } @@ -1175,7 +1176,7 @@ else print ''; // Prospect/Customer - print ''; + print ''; print ''; - print '
'; if ($sumpaid < $loan->capital) { - print $langs->trans("LoanCapital") .': '; + print $langs->trans("LoanCapital") .': '; } else { @@ -273,7 +314,7 @@ if ($action == 'create') print '
'; if ($sumpaid < $loan->capital) { - print $langs->trans("Insurance") .': '; + print $langs->trans("Insurance") .': '; } else { @@ -282,7 +323,7 @@ if ($action == 'create') print '
'; if ($sumpaid < $loan->capital) { - print $langs->trans("Interest") .': '; + print $langs->trans("Interest") .': '; } else { diff --git a/htdocs/loan/schedule.php b/htdocs/loan/schedule.php new file mode 100644 index 00000000000..30ba126aefb --- /dev/null +++ b/htdocs/loan/schedule.php @@ -0,0 +1,251 @@ + + * Copyright (C) 2018 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 + * 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/loan/createschedule.php + * \ingroup loan + * \brief Schedule card + */ + +require '../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/loan/class/loan.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/loan.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/loan/class/loanschedule.class.php'; + +$loanid = GETPOST('loanid', 'int'); +$action = GETPOST('action','aZ09'); + +$object = new Loan($db); +$object->fetch($loanid); + +// Load translation files required by the page +$langs->loadLangs(array("compta","bills","loan")); + +$title = $langs->trans("Loan") . ' - ' . $langs->trans("Card"); +$help_url = 'EN:Module_Loan|FR:Module_Emprunt'; +llxHeader("",$title,$help_url); + +$head=loan_prepare_head($object); +dol_fiche_head($head, 'FinancialCommitment', $langs->trans("Loan"), -1, 'bill'); + +if ($action == 'createecheancier') { + + $i=1; + while($i <$object->nbterm+1){ + + $date = GETPOST('hi_date'.$i,'int'); + $mens = GETPOST('mens'.$i); + $int = GETPOST('hi_interets'.$i); + $insurance = GETPOST('hi_insurance'.$i); + + $echeance = new LoanSchedule($db); + + $echeance->fk_loan = $object->id; + $echeance->datec = dol_now(); + $echeance->tms = dol_now(); + $echeance->datep = $date; + $echeance->amount_capital = $mens-$int; + $echeance->amount_insurance = $insurance; + $echeance->amount_interest = $int; + $echeance->fk_typepayment = 3; + $echeance->fk_bank = 0; + $echeance->fk_user_creat = $user->id; + $echeance->fk_user_modif = $user->id; + $result=$echeance->create($user); + if ($result<0) { + setEventMessages($echeance->error, $echeance->errors,'errors'); + } + $i++; + } +} + +if ($action == 'updateecheancier') { + + $i=1; + while($i <$object->nbterm+1){ + + $mens = GETPOST('mens'.$i); + $int = GETPOST('hi_interets'.$i); + $id = GETPOST('hi_rowid'.$i); + $insurance = GETPOST('hi_insurance'.$i); + + $echeance = new LoanSchedule($db); + $echeance->fetch($id); + $echeance->tms = dol_now(); + $echeance->amount_capital = $mens-$int; + $echeance->amount_insurance = $insurance; + $echeance->amount_interest = $int; + $echeance->fk_user_modif = $user->id; + $result= $echeance->update($user,0); + if ($result<0) { + setEventMessages(null, $echeance->errors,'errors'); + } + $i++; + } +} + +$echeance = new LoanSchedule($db); +$echeance->fetchAll($object->id); + +$var = ! $var; + + +?> + +'; +print ''; +print ''; +if(count($echeance->lines)>0) +{ + print ''; +}else{ + print ''; +} +print ''; +print ''; +$colspan = 6; +if (count($echeance->lines)>0) $colspan++; +print ''; +print ''; + +print ''; +Print ''; +Print ''; +print ''; +Print ''; +Print ''; +if (count($echeance->lines)>0) print ''; +print ''."\n"; + +if ($object->nbterm > 0 && count($echeance->lines)==0) +{ + $i=1; + $capital = $object->capital; + $insurance = $object->insurance_amount/$object->nbterm; + $insurance = price2num($insurance, 'MT'); + $regulInsurance = price2num($object->insurance_amount - ($insurance * $object->nbterm)); + while($i <$object->nbterm+1) + { + $mens = price2num($echeance->calcMonthlyPayments($capital, $object->rate/100, $object->nbterm-$i+1), 'MT'); + $int = ($capital*($object->rate/12))/100; + $int = price2num($int, 'MT'); + $insu = ($insurance+(($i == 1) ? $regulInsurance : 0)); + $cap_rest = price2num($capital - ($mens-$int), 'MT'); + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''."\n"; + $i++; + $capital = $cap_rest; + } +} +elseif(count($echeance->lines)>0) +{ + $i=1; + $capital = $object->capital; + $insurance = $object->insurance_amount/$object->nbterm; + $insurance = price2num($insurance, 'MT'); + $regulInsurance = price2num($object->insurance_amount - ($insurance * $object->nbterm)); + $printed = false; + foreach ($echeance->lines as $line){ + $mens = $line->amount_capital+$line->amount_interest; + $int = $line->amount_interest; + $insu = ($insurance+(($i == 1) ? $regulInsurance : 0)); + $cap_rest = price2num($capital - ($mens-$int), 'MT'); + + print ''; + print ''; + print ''; + print ''; + print ''; + if($line->datep > dol_now() && empty($line->fk_bank)){ + print ''; + }else{ + print ''; + } + + print ''; + print ''; + print ''."\n"; + $i++; + $capital = $cap_rest; + } +} + +print '
'; +print $langs->trans("FinancialCommitment"); +print '
'.$langs->trans("Term").''.$langs->trans("Date").''.$langs->trans("Insurance"); +Print ''.$langs->trans("InterestAmount").''.$langs->trans("Amount").''.$langs->trans("CapitalRemain"); +print ' ('.price2num($object->capital).')'; +print ''; +print ''.$langs->trans('DoPayment').'
' . $i .'' . dol_print_date(dol_time_plus_duree($object->datestart, $i-1, 'm'),'day') . ''.price($insurance+(($i == 1) ? $regulInsurance : 0),0,'',1).' €'.price($int,0,'',1).' €'.price($cap_rest).' €
' . $i .'' . dol_print_date($line->datep,'day') . ''.price($insu,0,'',1).' €'.price($int,0,'',1).' €' . price($mens) . ' €'.price($cap_rest).' €'; + if (!empty($line->fk_bank)) print $langs->trans('Paid'); + elseif (!$printed) + { + print ''.$langs->trans('DoPayment').''; + $printed = true; + } + print '
'; +print '
'; +print '
'; +if (count($echeance->lines)==0) $label = $langs->trans("Create"); +else $label = $langs->trans("Save"); +print '
'; +print ''; + +// End of page +llxFooter(); +$db->close(); diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 06f67a9b79f..2579b870bcd 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -500,6 +500,17 @@ if (! defined('NOLOGIN')) $_SESSION["dol_loginmesg"]=$langs->trans("ErrorBadValueForCode"); $test=false; + // Call trigger for the "security events" log + $user->trigger_mesg='ErrorBadValueForCode - login='.GETPOST("username","alpha",2); + // Call of triggers + include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; + $interface=new Interfaces($db); + $result=$interface->run_triggers('USER_LOGIN_FAILED',$user,$user,$langs,$conf); + if ($result < 0) { + $error++; + } + // End Call of triggers + // Hooks on failed login $action=''; $hookmanager->initHooks(array('login')); @@ -568,6 +579,17 @@ if (! defined('NOLOGIN')) // We set a generic message if not defined inside function checkLoginPassEntity or subfunctions if (empty($_SESSION["dol_loginmesg"])) $_SESSION["dol_loginmesg"]=$langs->trans("ErrorBadLoginPassword"); + // Call trigger for the "security events" log + $user->trigger_mesg=$langs->trans("ErrorBadLoginPassword").' - login='.GETPOST("username","alpha",2); + // Call of triggers + include_once DOL_DOCUMENT_ROOT.'/core/class/interfaces.class.php'; + $interface=new Interfaces($db); + $result=$interface->run_triggers('USER_LOGIN_FAILED',$user,$user,$langs,$conf,GETPOST("username","alpha",2)); + if ($result < 0) { + $error++; + } + // End Call of triggers + // Hooks on failed login $action=''; $hookmanager->initHooks(array('login')); @@ -604,12 +626,25 @@ if (! defined('NOLOGIN')) $langs->loadLangs(array('main', 'errors')); $_SESSION["dol_loginmesg"]=$langs->trans("ErrorCantLoadUserFromDolibarrDatabase",$login); + + $user->trigger_mesg='ErrorCantLoadUserFromDolibarrDatabase - login='.$login; } if ($resultFetchUser < 0) { $_SESSION["dol_loginmesg"]=$user->error; + + $user->trigger_mesg=$user->error; } + // Call triggers for the "security events" log + include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; + $interface=new Interfaces($db); + $result=$interface->run_triggers('USER_LOGIN_FAILED',$user,$user,$langs,$conf); + if ($result < 0) { + $error++; + } + // End call triggers + // Hooks on failed login $action=''; $hookmanager->initHooks(array('login')); @@ -648,12 +683,25 @@ if (! defined('NOLOGIN')) $langs->loadLangs(array('main', 'errors')); $_SESSION["dol_loginmesg"]=$langs->trans("ErrorCantLoadUserFromDolibarrDatabase",$login); + + $user->trigger_mesg='ErrorCantLoadUserFromDolibarrDatabase - login='.$login; } if ($resultFetchUser < 0) { $_SESSION["dol_loginmesg"]=$user->error; + + $user->trigger_mesg=$user->error; } + // Call triggers for the "security events" log + include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; + $interface=new Interfaces($db); + $result=$interface->run_triggers('USER_LOGIN_FAILED',$user,$user,$langs,$conf); + if ($result < 0) { + $error++; + } + // End call triggers + // Hooks on failed login $action=''; $hookmanager->initHooks(array('login')); @@ -684,18 +732,27 @@ if (! defined('NOLOGIN')) $relativepathstring = preg_replace('/^custom\//', '', $relativepathstring); //var_dump($relativepathstring); - // We click on a link that leave a page we have to save search criteria. We save them from tmp to no tmp + // We click on a link that leave a page we have to save search criteria, contextpage, limit and page. We save them from tmp to no tmp if (! empty($_SESSION['lastsearch_values_tmp_'.$relativepathstring])) { $_SESSION['lastsearch_values_'.$relativepathstring]=$_SESSION['lastsearch_values_tmp_'.$relativepathstring]; unset($_SESSION['lastsearch_values_tmp_'.$relativepathstring]); } - // We also save contextpage if (! empty($_SESSION['lastsearch_contextpage_tmp_'.$relativepathstring])) { $_SESSION['lastsearch_contextpage_'.$relativepathstring]=$_SESSION['lastsearch_contextpage_tmp_'.$relativepathstring]; unset($_SESSION['lastsearch_contextpage_tmp_'.$relativepathstring]); } + if (! empty($_SESSION['lastsearch_page_tmp_'.$relativepathstring]) && $_SESSION['lastsearch_page_tmp_'.$relativepathstring] > 1) + { + $_SESSION['lastsearch_page_'.$relativepathstring]=$_SESSION['lastsearch_page_tmp_'.$relativepathstring]; + unset($_SESSION['lastsearch_page_tmp_'.$relativepathstring]); + } + if (! empty($_SESSION['lastsearch_limit_tmp_'.$relativepathstring]) && $_SESSION['lastsearch_limit_tmp_'.$relativepathstring] != $conf->liste_limit) + { + $_SESSION['lastsearch_limit_'.$relativepathstring]=$_SESSION['lastsearch_limit_tmp_'.$relativepathstring]; + unset($_SESSION['lastsearch_limit_tmp_'.$relativepathstring]); + } } $action = ''; @@ -741,6 +798,17 @@ if (! defined('NOLOGIN')) $loginfo = 'TZ='.$_SESSION["dol_tz"].';TZString='.$_SESSION["dol_tz_string"].';Screen='.$_SESSION["dol_screenwidth"].'x'.$_SESSION["dol_screenheight"]; + // Call triggers for the "security events" log + $user->trigger_mesg = $loginfo; + // Call triggers + include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; + $interface=new Interfaces($db); + $result=$interface->run_triggers('USER_LOGIN',$user,$user,$langs,$conf); + if ($result < 0) { + $error++; + } + // End call triggers + // Hooks on successfull login $action=''; $hookmanager->initHooks(array('login')); @@ -752,7 +820,7 @@ if (! defined('NOLOGIN')) { $db->rollback(); session_destroy(); - dol_print_error($db,'Error in some hooks afterLogin'); + dol_print_error($db,'Error in some triggers USER_LOGIN or in some hooks afterLogin'); exit; } else @@ -1015,7 +1083,7 @@ if (! function_exists("llxHeader")) if (empty($conf->dol_hide_leftmenu)) { - left_menu('', $help_url, '', '', 1, $title, 1); + left_menu('', $help_url, '', '', 1, $title, 1); // $menumanager is retreived with a global $menumanager inside this function } // main area @@ -1908,7 +1976,8 @@ if (! function_exists("llxFooter")) function llxFooter($comment='',$zone='private', $disabledoutputofmessages=0) { global $conf, $langs, $user, $object; - global $delayedhtmlcontent, $contextpage; + global $delayedhtmlcontent; + global $contextpage, $page, $limit; $ext='layout='.$conf->browser->layout.'&version='.urlencode(DOL_VERSION); @@ -1943,8 +2012,16 @@ if (! function_exists("llxFooter")) if (preg_match('/list\.php$/', $relativepathstring)) { unset($_SESSION['lastsearch_contextpage_tmp_'.$relativepathstring]); - if (! empty($contextpage)) $_SESSION['lastsearch_contextpage_tmp_'.$relativepathstring]=$contextpage; + unset($_SESSION['lastsearch_page_tmp_'.$relativepathstring]); + unset($_SESSION['lastsearch_limit_tmp_'.$relativepathstring]); + + if (! empty($contextpage)) $_SESSION['lastsearch_contextpage_tmp_'.$relativepathstring]=$contextpage; + if (! empty($page) && $page > 1) $_SESSION['lastsearch_page_tmp_'.$relativepathstring]=$page; + if (! empty($limit) && $limit != $conf->limit) $_SESSION['lastsearch_limit_tmp_'.$relativepathstring]=$limit; + unset($_SESSION['lastsearch_contextpage_'.$relativepathstring]); + unset($_SESSION['lastsearch_page_'.$relativepathstring]); + unset($_SESSION['lastsearch_limit_'.$relativepathstring]); } // Core error message diff --git a/htdocs/margin/agentMargins.php b/htdocs/margin/agentMargins.php index 5c808051a06..71922b77aa2 100644 --- a/htdocs/margin/agentMargins.php +++ b/htdocs/margin/agentMargins.php @@ -139,7 +139,7 @@ $sql.= ", ".MAIN_DB_PREFIX."facturedet as d"; $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; $sql.= ", ".MAIN_DB_PREFIX."user as u"; $sql.= " WHERE f.fk_soc = s.rowid"; -$sql.= ' AND f.entity IN ('.getEntity('facture').')'; +$sql.= ' AND f.entity IN ('.getEntity('invoice').')'; $sql.= " AND sc.fk_soc = f.fk_soc"; $sql.= " AND (d.product_type = 0 OR d.product_type = 1)"; if (! empty($conf->global->AGENT_CONTACT_TYPE)) diff --git a/htdocs/margin/checkMargins.php b/htdocs/margin/checkMargins.php index 06527f42b91..850b47cee17 100644 --- a/htdocs/margin/checkMargins.php +++ b/htdocs/margin/checkMargins.php @@ -49,7 +49,7 @@ $offset = $limit * $page; $pageprev = $page - 1; $pagenext = $page + 1; if (! $sortorder) $sortorder = "DESC"; -if (! $sortfield) $sortfield = 'f.facnumber'; +if (! $sortfield) $sortfield = 'f.ref'; $startdate = $enddate = ''; @@ -185,16 +185,16 @@ $massactionbutton=''; $sql = "SELECT"; -$sql .= " f.facnumber, f.rowid as invoiceid, d.rowid as invoicedetid, d.buy_price_ht, d.total_ht, d.subprice, d.label, d.description , d.qty"; +$sql .= " f.ref, f.rowid as invoiceid, d.rowid as invoicedetid, d.buy_price_ht, d.total_ht, d.subprice, d.label, d.description , d.qty"; $sql .= " ,d.fk_product"; $sql .= " FROM " . MAIN_DB_PREFIX . "facture as f "; $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "facturedet as d ON d.fk_facture = f.rowid"; $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product as p ON d.fk_product = p.rowid"; $sql .= " WHERE f.fk_statut > 0"; -$sql .= " AND f.entity IN (" . getEntity('facture') . ") "; +$sql .= " AND f.entity IN (" . getEntity('invoice') . ") "; if (! empty($startdate)) $sql .= " AND f.datef >= '" . $db->idate($startdate) . "'"; if (! empty($enddate)) $sql .= " AND f.datef <= '" . $db->idate($enddate) . "'"; -if ($search_ref) $sql.=natural_search('f.facnumber', $search_ref); +if ($search_ref) $sql.=natural_search('f.ref', $search_ref); $sql .= " AND d.buy_price_ht IS NOT NULL"; $sql .= $db->order($sortfield, $sortorder); @@ -249,7 +249,7 @@ if ($result) { print "
'; $invoicestatic->id=$objp->facid; - $invoicestatic->ref=$objp->facnumber; + $invoicestatic->ref=$objp->ref; print $invoicestatic->getNomUrl(1); print ""; diff --git a/htdocs/margin/productMargins.php b/htdocs/margin/productMargins.php index 23c9de6c321..ae79cc7957f 100644 --- a/htdocs/margin/productMargins.php +++ b/htdocs/margin/productMargins.php @@ -176,7 +176,7 @@ print ''; $sql = "SELECT p.label, p.rowid, p.fk_product_type, p.ref, p.entity as pentity,"; if ($id > 0) $sql.= " d.fk_product,"; -if ($id > 0) $sql.= " f.rowid as facid, f.facnumber, f.total as total_ht, f.datef, f.paye, f.fk_statut as statut,"; +if ($id > 0) $sql.= " f.rowid as facid, f.ref, f.total as total_ht, f.datef, f.paye, f.fk_statut as statut,"; $sql.= " SUM(d.total_ht) as selling_price,"; // Note: qty and buy_price_ht is always positive (if not your database may be corrupted, you can update this) $sql.= " SUM(".$db->ifsql('d.total_ht < 0','d.qty * d.buy_price_ht * -1','d.qty * d.buy_price_ht').") as buying_price,"; @@ -189,7 +189,7 @@ if (! empty($TSelectedCats)) { $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_product as cp ON cp.fk_product=p.rowid'; } $sql.= " WHERE f.fk_soc = s.rowid"; -$sql.= ' AND f.entity IN ('.getEntity('facture').')'; +$sql.= ' AND f.entity IN ('.getEntity('invoice').')'; $sql.= " AND f.fk_statut > 0"; $sql.= " AND d.fk_facture = f.rowid"; if ($id > 0) @@ -204,7 +204,7 @@ if (!empty($enddate)) $sql .= " AND d.buy_price_ht IS NOT NULL"; if (isset($conf->global->ForceBuyingPriceIfNull) && $conf->global->ForceBuyingPriceIfNull == 1) $sql .= " AND d.buy_price_ht <> 0"; -if ($id > 0) $sql.= " GROUP BY p.label, p.rowid, p.fk_product_type, p.ref, p.entity, d.fk_product, f.rowid, f.facnumber, f.total, f.datef, f.paye, f.fk_statut"; +if ($id > 0) $sql.= " GROUP BY p.label, p.rowid, p.fk_product_type, p.ref, p.entity, d.fk_product, f.rowid, f.ref, f.total, f.datef, f.paye, f.fk_statut"; else $sql.= " GROUP BY p.label, p.rowid, p.fk_product_type, p.ref, p.entity"; $sql.=$db->order($sortfield,$sortorder); // TODO: calculate total to display then restore pagination @@ -233,7 +233,7 @@ if ($result) print '
'; $invoicestatic->id=$objp->facid; - $invoicestatic->ref=$objp->facnumber; + $invoicestatic->ref=$objp->ref; print $invoicestatic->getNomUrl(1); print ""; diff --git a/htdocs/margin/tabs/productMargins.php b/htdocs/margin/tabs/productMargins.php index 5659be448de..1d922473036 100644 --- a/htdocs/margin/tabs/productMargins.php +++ b/htdocs/margin/tabs/productMargins.php @@ -131,7 +131,7 @@ if ($id > 0 || ! empty($ref)) if ($user->rights->facture->lire) { $sql = "SELECT s.nom as name, s.rowid as socid, s.code_client,"; - $sql.= " f.rowid as facid, f.facnumber, f.total as total_ht,"; + $sql.= " f.rowid as facid, f.ref, f.total as total_ht,"; $sql.= " f.datef, f.paye, f.fk_statut as statut, f.type,"; if (!$user->rights->societe->client->voir && !$socid) $sql.= " sc.fk_soc, sc.fk_user,"; $sql.= " sum(d.total_ht) as selling_price,"; // may be negative or positive @@ -151,7 +151,7 @@ if ($id > 0 || ! empty($ref)) if (! empty($socid)) $sql.= " AND f.fk_soc = $socid"; $sql .= " AND d.buy_price_ht IS NOT NULL"; if (isset($conf->global->ForceBuyingPriceIfNull) && $conf->global->ForceBuyingPriceIfNull == 1) $sql .= " AND d.buy_price_ht <> 0"; - $sql.= " GROUP BY s.nom, s.rowid, s.code_client, f.rowid, f.facnumber, f.total, f.datef, f.paye, f.fk_statut, f.type"; + $sql.= " GROUP BY s.nom, s.rowid, s.code_client, f.rowid, f.ref, f.total, f.datef, f.paye, f.fk_statut, f.type"; if (!$user->rights->societe->client->voir && !$socid) $sql.= ", sc.fk_soc, sc.fk_user"; $sql.= $db->order($sortfield,$sortorder); // TODO: calculate total to display then restore pagination @@ -169,7 +169,7 @@ if ($id > 0 || ! empty($ref)) print ''; print ''; - print_liste_field_titre("Invoice",$_SERVER["PHP_SELF"],"f.facnumber","","&id=".$object->id,'',$sortfield,$sortorder); + print_liste_field_titre("Invoice",$_SERVER["PHP_SELF"],"f.ref","","&id=".$object->id,'',$sortfield,$sortorder); print_liste_field_titre("Company",$_SERVER["PHP_SELF"],"s.nom","","&id=".$object->id,'',$sortfield,$sortorder); print_liste_field_titre("CustomerCode",$_SERVER["PHP_SELF"],"s.code_client","","&id=".$object->id,'',$sortfield,$sortorder); print_liste_field_titre("DateInvoice",$_SERVER["PHP_SELF"],"f.datef","","&id=".$object->id,'align="center"',$sortfield,$sortorder); @@ -199,7 +199,7 @@ if ($id > 0 || ! empty($ref)) print ''; print '\n"; print ''; diff --git a/htdocs/margin/tabs/thirdpartyMargins.php b/htdocs/margin/tabs/thirdpartyMargins.php index 55362ac4218..2856ebb8397 100644 --- a/htdocs/margin/tabs/thirdpartyMargins.php +++ b/htdocs/margin/tabs/thirdpartyMargins.php @@ -144,7 +144,7 @@ if ($socid > 0) print '
'; $sql = "SELECT distinct s.nom, s.rowid as socid, s.code_client,"; - $sql.= " f.rowid as facid, f.facnumber, f.total as total_ht,"; + $sql.= " f.rowid as facid, f.ref, f.total as total_ht,"; $sql.= " f.datef, f.paye, f.fk_statut as statut, f.type,"; $sql.= " sum(d.total_ht) as selling_price,"; // may be negative or positive $sql.= " sum(d.qty * d.buy_price_ht) as buying_price,"; // always positive @@ -159,7 +159,7 @@ if ($socid > 0) $sql.= " AND f.fk_soc = $socid"; $sql.= " AND d.buy_price_ht IS NOT NULL"; if (isset($conf->global->ForceBuyingPriceIfNull) && $conf->global->ForceBuyingPriceIfNull == 1) $sql .= " AND d.buy_price_ht <> 0"; - $sql.= " GROUP BY s.nom, s.rowid, s.code_client, f.rowid, f.facnumber, f.total, f.datef, f.paye, f.fk_statut, f.type"; + $sql.= " GROUP BY s.nom, s.rowid, s.code_client, f.rowid, f.ref, f.total, f.datef, f.paye, f.fk_statut, f.type"; $sql.= $db->order($sortfield,$sortorder); // TODO: calculate total to display then restore pagination //$sql.= $db->plimit($conf->liste_limit +1, $offset); @@ -177,7 +177,7 @@ if ($socid > 0) print "
'; $invoicestatic->id=$objp->facid; - $invoicestatic->ref=$objp->facnumber; + $invoicestatic->ref=$objp->ref; print $invoicestatic->getNomUrl(1); print "'.img_object($langs->trans("ShowCompany"),"company").' '.dol_trunc($objp->name,44).'
"; print ''; - print_liste_field_titre("Invoice",$_SERVER["PHP_SELF"],"f.facnumber","","&socid=".$_REQUEST["socid"],'',$sortfield,$sortorder); + print_liste_field_titre("Invoice",$_SERVER["PHP_SELF"],"f.ref","","&socid=".$_REQUEST["socid"],'',$sortfield,$sortorder); print_liste_field_titre("DateInvoice",$_SERVER["PHP_SELF"],"f.datef","","&socid=".$_REQUEST["socid"],'align="center"',$sortfield,$sortorder); print_liste_field_titre("SoldAmount",$_SERVER["PHP_SELF"],"selling_price","","&socid=".$_REQUEST["socid"],'align="right"',$sortfield,$sortorder); print_liste_field_titre("PurchasedAmount",$_SERVER["PHP_SELF"],"buying_price","","&socid=".$_REQUEST["socid"],'align="right"',$sortfield,$sortorder); @@ -211,7 +211,7 @@ if ($socid > 0) print ''; print '\n"; print "'; + switch($objp->type_mouvement){ + case "0": + print ''; + break; + case "1": + print ''; + break; + case "2": + print ''; + break; + case "3": + print ''; + break; + } } if (! empty($arrayfields['origin']['checked'])) { diff --git a/htdocs/product/stock/product.php b/htdocs/product/stock/product.php index 852bf2a4e8d..6d41e9589cb 100644 --- a/htdocs/product/stock/product.php +++ b/htdocs/product/stock/product.php @@ -641,6 +641,8 @@ if ($id > 0 || $ref) $text_stock_options .= (!empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_BILL) ? $langs->trans("ReStockOnBill") . '
' : ''); $text_stock_options .= (!empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER) ? $langs->trans("ReStockOnValidateOrder") . '
' : ''); $text_stock_options .= (!empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER) ? $langs->trans("ReStockOnDispatchOrder") . '
' : ''); + $text_stock_options.= (! empty($conf->global->STOCK_CALCULATE_ON_RECEPTION) || ! empty($conf->global->STOCK_CALCULATE_ON_RECEPTION_CLOSE)?$langs->trans("StockOnReception").'
':''); + print ''; @@ -767,12 +769,12 @@ if (empty($reshook)) } else { - print '' . $langs->trans("CorrectStock") . ''; + print '' . $langs->trans("CorrectStock") . ''; } } else { - print '' . $langs->trans("CorrectStock") . ''; + print '' . $langs->trans("CorrectStock") . ''; } //if (($user->rights->stock->mouvement->creer) && ! $object->hasbatch()) @@ -783,12 +785,12 @@ if (empty($reshook)) } else { - print '' . $langs->trans("TransferStock") . ''; + print '' . $langs->trans("TransferStock") . ''; } } else { - print '' . $langs->trans("CorrectStock") . ''; + print '' . $langs->trans("CorrectStock") . ''; } print ''; diff --git a/htdocs/product/stock/replenish.php b/htdocs/product/stock/replenish.php index 5ffd668680f..754afea9c82 100644 --- a/htdocs/product/stock/replenish.php +++ b/htdocs/product/stock/replenish.php @@ -82,7 +82,9 @@ if (!$sortorder) { $virtualdiffersfromphysical=0; if (! empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT) || ! empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER) -|| ! empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT_CLOSE)) +|| ! empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT_CLOSE) +|| !empty($conf->global->STOCK_CALCULATE_ON_RECEPTION) +|| !empty($conf->global->STOCK_CALCULATE_ON_RECEPTION_CLOSE)) { $virtualdiffersfromphysical=1; // According to increase/decrease stock options, virtual and physical stock may differs. } diff --git a/htdocs/product/stock/replenishorders.php b/htdocs/product/stock/replenishorders.php index a4deee38715..c0e2973b4f8 100644 --- a/htdocs/product/stock/replenishorders.php +++ b/htdocs/product/stock/replenishorders.php @@ -119,7 +119,7 @@ $sql.= ' WHERE cf.fk_soc = s.rowid '; $sql.= ' AND cf.entity = ' . $conf->entity; if ($conf->global->STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER) { $sql .= ' AND cf.fk_statut < 3'; -} elseif ($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER) { +} elseif ($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER|| !empty($conf->global->STOCK_CALCULATE_ON_RECEPTION) || !empty($conf->global->STOCK_CALCULATE_ON_RECEPTION_CLOSE)) { $sql .= ' AND cf.fk_statut < 6'; // We want also status 5, we will keep them visible if dispatching is not yet finished (tested with function dolDispatchToDo). } else { $sql .= ' AND cf.fk_statut < 5'; diff --git a/htdocs/projet/card.php b/htdocs/projet/card.php index 6c9db443487..c9abfd7d4ad 100644 --- a/htdocs/projet/card.php +++ b/htdocs/projet/card.php @@ -552,7 +552,7 @@ if ($action == 'create' && $user->rights->projet->creer) $text=$form->select_company(GETPOST('socid','int'), 'socid', $filteronlist, 'SelectThirdParty', 1, 0, array(), 0, 'minwidth300'); if (empty($conf->global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS) && empty($conf->dol_use_jmobile)) { - $texthelp=$langs->trans("IfNeedToUseOhterObjectKeepEmpty"); + $texthelp=$langs->trans("IfNeedToUseOtherObjectKeepEmpty"); print $form->textwithtooltip($text.' '.img_help(),$texthelp,1); } else print $text; @@ -789,7 +789,7 @@ elseif ($object->id > 0) $text=$form->select_company($object->thirdparty->id, 'socid', $filteronlist, 'None', 1, 0, array(), 0, 'minwidth300'); if (empty($conf->global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS) && empty($conf->dol_use_jmobile)) { - $texthelp=$langs->trans("IfNeedToUseOhterObjectKeepEmpty"); + $texthelp=$langs->trans("IfNeedToUseOtherObjectKeepEmpty"); print $form->textwithtooltip($text.' '.img_help(), $texthelp, 1, 0, '', '', 2); } else print $text; @@ -1118,7 +1118,7 @@ elseif ($object->id > 0) } else { - print ''; + print ''; } } @@ -1131,7 +1131,7 @@ elseif ($object->id > 0) } else { - print ''; + print ''; } } @@ -1144,7 +1144,7 @@ elseif ($object->id > 0) } else { - print ''; + print ''; } } @@ -1157,7 +1157,7 @@ elseif ($object->id > 0) } else { - print ''; + print ''; } } @@ -1225,7 +1225,7 @@ elseif ($object->id > 0) } else { - print ''; + print ''; } } @@ -1238,7 +1238,7 @@ elseif ($object->id > 0) } else { - print ''; + print ''; } } } diff --git a/htdocs/projet/info.php b/htdocs/projet/info.php index 1f9b35b8420..d491e55a080 100644 --- a/htdocs/projet/info.php +++ b/htdocs/projet/info.php @@ -18,8 +18,8 @@ /** * \file htdocs/projet/info.php - * \ingroup commande - * \brief Page with info on project + * \ingroup project + * \brief Page with events on project */ require '../main.inc.php'; @@ -34,7 +34,7 @@ $langs->load("projects"); $id = GETPOST('id','int'); $ref = GETPOST('ref','alpha'); $socid = GETPOST('socid','int'); -$action = GETPOST('action','alpha'); +$action = GETPOST('action','aZ09'); $limit = GETPOST('limit','int')?GETPOST('limit','int'):$conf->liste_limit; $sortfield = GETPOST("sortfield","alpha"); @@ -50,16 +50,15 @@ $pagenext = $page + 1; if (GETPOST('actioncode','array')) { - $actioncode=GETPOST('actioncode','array',3); - if (! count($actioncode)) $actioncode='0'; + $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':(empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)?'':$conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); } $search_agenda_label=GETPOST('search_agenda_label'); - // Security check $id = GETPOST("id",'int'); $socid=0; @@ -71,7 +70,7 @@ if (!$user->rights->projet->lire) accessforbidden(); /* - * Actions + * Actions */ $parameters=array('id'=>$socid); @@ -81,8 +80,8 @@ if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'e // Purge search criteria 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 { - $actioncode=''; - $search_agenda_label=''; + $actioncode=''; + $search_agenda_label=''; } @@ -170,7 +169,7 @@ if (! empty($conf->agenda->enabled)) } else { - $morehtmlcenter.=''.$langs->trans("AddAction").''; + $morehtmlcenter.=''.$langs->trans("AddAction").''; } } diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index b220af0d96a..e36a000674b 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -438,6 +438,7 @@ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php'; // List of mass actions available $arrayofmassactions = array( + 'generate_doc'=>$langs->trans("Generate"), // 'presend'=>$langs->trans("SendByMail"), // 'builddoc'=>$langs->trans("PDFMerge"), ); diff --git a/htdocs/projet/tasks.php b/htdocs/projet/tasks.php index 04605c33065..fb2399175c2 100644 --- a/htdocs/projet/tasks.php +++ b/htdocs/projet/tasks.php @@ -450,108 +450,118 @@ if ($action == 'create' && $user->rights->projet->creer && (empty($object->third print load_fiche_titre($langs->trans("NewTask"), '', 'title_project'); - print ''; - print ''; - print ''; - print ''; - if (! empty($object->id)) print ''; - - dol_fiche_head(''); - - print '
'; $invoicestatic->id=$objp->facid; - $invoicestatic->ref=$objp->facnumber; + $invoicestatic->ref=$objp->ref; print $invoicestatic->getNomUrl(1); print ""; diff --git a/htdocs/modulebuilder/template/core/modules/mailings/mailinglist_mymodule_myobject.modules.php b/htdocs/modulebuilder/template/core/modules/mailings/mailinglist_mymodule_myobject.modules.php index 545e53d350a..460df7e96bf 100644 --- a/htdocs/modulebuilder/template/core/modules/mailings/mailinglist_mymodule_myobject.modules.php +++ b/htdocs/modulebuilder/template/core/modules/mailings/mailinglist_mymodule_myobject.modules.php @@ -97,14 +97,12 @@ class mailing_mailinglist_mymodule_myobject extends MailingTargets * This is the main function that returns the array of emails * * @param int $mailing_id Id of emailing - * @param array $filtersarray Requete sql de selection des destinataires * @return int <0 if error, number of emails added if ok */ - function add_to_target($mailing_id,$filtersarray=array()) + function add_to_target($mailing_id) { // phpcs:enable $target = array(); - $cibles = array(); $j = 0; @@ -114,7 +112,7 @@ class mailing_mailinglist_mymodule_myobject extends MailingTargets if (! empty($_POST['filter']) && $_POST['filter'] != 'none') $sql.= " AND status = '".$this->db->escape($_POST['filter'])."'"; $sql.= " ORDER BY email"; - // Stocke destinataires dans cibles + // Stocke destinataires dans target $result=$this->db->query($sql); if ($result) { @@ -129,7 +127,7 @@ class mailing_mailinglist_mymodule_myobject extends MailingTargets $obj = $this->db->fetch_object($result); if ($old <> $obj->email) { - $cibles[$j] = array( + $target[$j] = array( 'email' => $obj->email, 'name' => $obj->lastname, 'id' => $obj->id, @@ -162,7 +160,7 @@ class mailing_mailinglist_mymodule_myobject extends MailingTargets // ----- Your code end here ----- - return parent::add_to_target($mailing_id, $cibles); + return parent::add_to_target($mailing_id, $target); } diff --git a/htdocs/modulebuilder/template/myobject_agenda.php b/htdocs/modulebuilder/template/myobject_agenda.php index 9c6c9265592..b1da52ad4aa 100644 --- a/htdocs/modulebuilder/template/myobject_agenda.php +++ b/htdocs/modulebuilder/template/myobject_agenda.php @@ -232,7 +232,7 @@ if ($object->id > 0) } else { - print ''.$langs->trans("AddAction").''; + print ''.$langs->trans("AddAction").''; } } diff --git a/htdocs/modulebuilder/template/myobject_card.php b/htdocs/modulebuilder/template/myobject_card.php index f9b3db7a99e..75754512c71 100644 --- a/htdocs/modulebuilder/template/myobject_card.php +++ b/htdocs/modulebuilder/template/myobject_card.php @@ -372,7 +372,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea } else { - print ''.$langs->trans('Modify').''."\n"; + print ''.$langs->trans('Modify').''."\n"; } // Clone @@ -401,7 +401,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea } else { - print ''.$langs->trans('Delete').''."\n"; + print ''.$langs->trans('Delete').''."\n"; } } print ''."\n"; diff --git a/htdocs/opensurvey/results.php b/htdocs/opensurvey/results.php index f3fd135f16d..34945504943 100644 --- a/htdocs/opensurvey/results.php +++ b/htdocs/opensurvey/results.php @@ -1050,18 +1050,20 @@ $toutsujet = explode(",", $object->sujet); // With old versions, this field was $compteursujet = 0; $meilleursujet = ''; -for ($i = 0; $i < $nbcolonnes; $i++) { - if (isset($sumfor[$i]) === true && isset($meilleurecolonne) === true && $sumfor[$i] == $meilleurecolonne) { +for ($i = 0; $i < $nbcolonnes; $i++) +{ + if (isset($sumfor[$i]) === true && isset($meilleurecolonne) === true && $sumfor[$i] == $meilleurecolonne) + { $meilleursujet.=", "; if ($object->format == "D") { $meilleursujetexport = $toutsujet[$i]; - + //var_dump($toutsujet); if (strpos($toutsujet[$i], '@') !== false) { $toutsujetdate = explode("@", $toutsujet[$i]); - $meilleursujet .= dol_print_date($toutsujetdate[0],'daytext'). ' ('.dol_print_date($toutsujetdate[0],'%A').')' . ' - ' . $toutsujetdate[1]; + $meilleursujet .= dol_print_date($toutsujetdate[0],'daytext'). ($toutsujetdate[0] ? ' ('.dol_print_date($toutsujetdate[0],'%A').')' : '') . ' - ' . $toutsujetdate[1]; } else { - $meilleursujet .= dol_print_date($toutsujet[$i],'daytext'). ' ('.dol_print_date($toutsujet[$i],'%A').')'; + $meilleursujet .= dol_print_date($toutsujet[$i],'daytext'). ($toutsujet[$i] ? ' ('.dol_print_date($toutsujet[$i],'%A').')' : ''); } } else @@ -1083,9 +1085,9 @@ if ($nbofcheckbox >= 2) print '

'."\n"; if (isset($meilleurecolonne) && $compteursujet == "1") { - print " " . $langs->trans('TheBestChoice') . ": ".$meilleursujet." " . $langs->trans("with") . " ".$meilleurecolonne."" . $vote_str . ".\n"; + print " " . $langs->trans('TheBestChoice') . ": ".$meilleursujet." " . $langs->trans("with") . " ".$meilleurecolonne." " . $vote_str . ".\n"; } elseif (isset($meilleurecolonne)) { - print " " . $langs->trans('TheBestChoices') . ": ".$meilleursujet." " . $langs->trans("with") . " ".$meilleurecolonne."" . $vote_str . ".\n"; + print " " . $langs->trans('TheBestChoices') . ": ".$meilleursujet." " . $langs->trans("with") . " ".$meilleurecolonne." " . $vote_str . ".\n"; } print '


'."\n"; } diff --git a/htdocs/product/agenda.php b/htdocs/product/agenda.php index 64ff9c66119..20ba4a5cc69 100644 --- a/htdocs/product/agenda.php +++ b/htdocs/product/agenda.php @@ -159,7 +159,7 @@ if ($id > 0 || $ref) if ((! empty($objproduct->id) || ! empty($objcon->id)) && $permok) { //$out.='trans("AddAnAction"),'filenew'); diff --git a/htdocs/product/card.php b/htdocs/product/card.php index f94c34d1804..3e95b3cbb45 100644 --- a/htdocs/product/card.php +++ b/htdocs/product/card.php @@ -2037,12 +2037,12 @@ if ($action != 'create' && $action != 'edit') } else { - print ''; + print ''; } } else { - print ''; + print ''; } } diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 6d3a0724006..ed22a5f7824 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -310,6 +310,7 @@ class Product extends CommonObject public $oldcopy; + public $fk_default_warehouse; /** * @var int ID */ @@ -2622,7 +2623,7 @@ class Product extends CommonObject } $sql.= " WHERE f.rowid = fd.fk_facture"; $sql.= " AND f.fk_soc = s.rowid"; - $sql.= " AND f.entity IN (".getEntity('facture').")"; + $sql.= " AND f.entity IN (".getEntity('invoice').")"; $sql.= " AND fd.fk_product = ".$this->id; if (!$user->rights->societe->client->voir && !$socid) { $sql.= " AND f.fk_soc = sc.fk_soc AND sc.fk_user = " .$user->id; } @@ -2788,7 +2789,7 @@ class Product extends CommonObject if ($filteronproducttype >= 0) { $sql.= " AND p.rowid = d.fk_product AND p.fk_product_type =".$filteronproducttype; } $sql.= " AND f.fk_soc = s.rowid"; - $sql.= " AND f.entity IN (".getEntity('facture').")"; + $sql.= " AND f.entity IN (".getEntity('invoice').")"; if (!$user->rights->societe->client->voir && !$socid) { $sql.= " AND f.fk_soc = sc.fk_soc AND sc.fk_user = " .$user->id; } if ($socid > 0) { $sql.= " AND f.fk_soc = $socid"; @@ -4152,84 +4153,86 @@ class Product extends CommonObject } } + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps - /** - * Load value ->stock_theorique of a product. Property this->id must be defined. - * This function need a lot of load. If you use it on list, use a cache to execute it one for each product id. - * - * @return int < 0 if KO, > 0 if OK - * @see load_stock(), loadBatchInfo() - */ - function load_virtual_stock() - { - // phpcs:enable - global $conf, $hookmanager, $action; + /** + * Load value ->stock_theorique of a product. Property this->id must be defined. + * This function need a lot of load. If you use it on list, use a cache to execute it one for each product id. + * + * @return int < 0 if KO, > 0 if OK + * @see load_stock(), loadBatchInfo() + */ + function load_virtual_stock() + { + // phpcs:enable + global $conf, $hookmanager, $action; - $stock_commande_client=0; - $stock_commande_fournisseur=0; - $stock_sending_client=0; - $stock_reception_fournisseur=0; + $stock_commande_client=0; + $stock_commande_fournisseur=0; + $stock_sending_client=0; + $stock_reception_fournisseur=0; - if (! empty($conf->commande->enabled)) { - $result=$this->load_stats_commande(0, '1,2', 1); - if ($result < 0) { dol_print_error($this->db, $this->error); - } - $stock_commande_client=$this->stats_commande['qty']; - } - if (! empty($conf->expedition->enabled)) { - $result=$this->load_stats_sending(0, '1,2', 1); - if ($result < 0) { dol_print_error($this->db, $this->error); - } - $stock_sending_client=$this->stats_expedition['qty']; - } - if (! empty($conf->fournisseur->enabled)) { - $result=$this->load_stats_commande_fournisseur(0, '1,2,3,4', 1); - if ($result < 0) { dol_print_error($this->db, $this->error); - } - $stock_commande_fournisseur=$this->stats_commande_fournisseur['qty']; + if (! empty($conf->commande->enabled)) + { + $result=$this->load_stats_commande(0,'1,2', 1); + if ($result < 0) dol_print_error($this->db,$this->error); + $stock_commande_client=$this->stats_commande['qty']; + } + if (! empty($conf->expedition->enabled)) + { + $result=$this->load_stats_sending(0,'1,2', 1); + if ($result < 0) dol_print_error($this->db,$this->error); + $stock_sending_client=$this->stats_expedition['qty']; + } + if (! empty($conf->fournisseur->enabled)) + { + $result=$this->load_stats_commande_fournisseur(0,'1,2,3,4', 1); + if ($result < 0) dol_print_error($this->db,$this->error); + $stock_commande_fournisseur=$this->stats_commande_fournisseur['qty']; - $result=$this->load_stats_reception(0, '4', 1); - if ($result < 0) { dol_print_error($this->db, $this->error); - } - $stock_reception_fournisseur=$this->stats_reception['qty']; - } + $result=$this->load_stats_reception(0,'4', 1); + if ($result < 0) dol_print_error($this->db,$this->error); + $stock_reception_fournisseur=$this->stats_reception['qty']; + } - // Stock decrease mode - if (! empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT) || ! empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT_CLOSE)) { - $this->stock_theorique=$this->stock_reel-$stock_commande_client+$stock_sending_client; - } - if (! empty($conf->global->STOCK_CALCULATE_ON_VALIDATE_ORDER)) { - $this->stock_theorique=$this->stock_reel; - } - if (! empty($conf->global->STOCK_CALCULATE_ON_BILL)) { - $this->stock_theorique=$this->stock_reel-$stock_commande_client; - } - // Stock Increase mode - if (! empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER)) { - $this->stock_theorique+=$stock_commande_fournisseur-$stock_reception_fournisseur; - } - if (! empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER)) { - $this->stock_theorique-=$stock_reception_fournisseur; - } - if (! empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_BILL)) { + // Stock decrease mode + if (! empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT) || ! empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT_CLOSE)) { + $this->stock_theorique=$this->stock_reel-$stock_commande_client+$stock_sending_client; + } + if (! empty($conf->global->STOCK_CALCULATE_ON_VALIDATE_ORDER)) { + $this->stock_theorique=$this->stock_reel; + } + if (! empty($conf->global->STOCK_CALCULATE_ON_BILL)) { + $this->stock_theorique=$this->stock_reel-$stock_commande_client; + } + // Stock Increase mode + if (! empty($conf->global->STOCK_CALCULATE_ON_RECEPTION) || ! empty($conf->global->STOCK_CALCULATE_ON_RECEPTION_CLOSE)) { $this->stock_theorique+=$stock_commande_fournisseur-$stock_reception_fournisseur; } + if (! empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER)) { + $this->stock_theorique+=$stock_commande_fournisseur-$stock_reception_fournisseur; + } + if (! empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER)) { + $this->stock_theorique-=$stock_reception_fournisseur; + } + if (! empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_BILL)) { + $this->stock_theorique+=$stock_commande_fournisseur-$stock_reception_fournisseur; + } - if (! is_object($hookmanager)) { - include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php'; - $hookmanager=new HookManager($this->db); - } - $hookmanager->initHooks(array('productdao')); - $parameters=array('id'=>$this->id); - // Note that $action and $object may have been modified by some hooks - $reshook=$hookmanager->executeHooks('loadvirtualstock', $parameters, $this, $action); - if ($reshook > 0) { $this->stock_theorique = $hookmanager->resArray['stock_theorique']; - } - - return 1; - } - + if (! is_object($hookmanager)) { + include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php'; + $hookmanager=new HookManager($this->db); + } + $hookmanager->initHooks(array('productdao')); + $parameters=array('id'=>$this->id); + // Note that $action and $object may have been modified by some hooks + $reshook=$hookmanager->executeHooks('loadvirtualstock', $parameters, $this, $action); + if ($reshook > 0) $this->stock_theorique = $hookmanager->resArray['stock_theorique']; + return 1; + } + + /** * Load existing information about a serial * @@ -4265,7 +4268,6 @@ class Product extends CommonObject } } - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps /** * Move an uploaded file described into $file array into target directory $sdir. @@ -4347,7 +4349,6 @@ class Product extends CommonObject return false; } - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps /** * Retourne tableau de toutes les photos du produit diff --git a/htdocs/product/dynamic_price/editor.php b/htdocs/product/dynamic_price/editor.php index baa738c20c5..3e4a87fe9f9 100644 --- a/htdocs/product/dynamic_price/editor.php +++ b/htdocs/product/dynamic_price/editor.php @@ -219,7 +219,7 @@ print ' print ''.$langs->trans("Back").''; if ($eid == 0) { - print '
'.$langs->trans('Delete').'
'."\n"; + print '
'.$langs->trans('Delete').'
'."\n"; } else { diff --git a/htdocs/product/inventory/card.php b/htdocs/product/inventory/card.php index 24848ad26c5..eaa2f3dffc2 100644 --- a/htdocs/product/inventory/card.php +++ b/htdocs/product/inventory/card.php @@ -336,7 +336,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea } else { - print ''.$langs->trans('Modify').''."\n"; + print ''.$langs->trans('Modify').''."\n"; } if ($permissiontodelete) @@ -345,7 +345,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea } else { - print ''.$langs->trans('Delete').''."\n"; + print ''.$langs->trans('Delete').''."\n"; } } print ''."\n"; diff --git a/htdocs/product/inventory/tpl/inventory.tpl.php b/htdocs/product/inventory/tpl/inventory.tpl.php index 30dc02a17d6..0b89ac8a647 100644 --- a/htdocs/product/inventory/tpl/inventory.tpl.php +++ b/htdocs/product/inventory/tpl/inventory.tpl.php @@ -201,7 +201,7 @@ if (empty($conf) || ! is_object($conf)) - trans('Delete') ?> + trans('Delete') ?> diff --git a/htdocs/product/list.php b/htdocs/product/list.php index dda8cf267c9..5047ba16100 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -120,7 +120,7 @@ else $result=restrictedArea($user,'produit|service','','','','','',$objcanvas); // Define virtualdiffersfromphysical $virtualdiffersfromphysical=0; -if (! empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT) || ! empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER)) +if (! empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT) || ! empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER) || ! empty($conf->global->STOCK_CALCULATE_ON_RECEPTION) ) { $virtualdiffersfromphysical=1; // According to increase/decrease stock options, virtual and physical stock may differs. } @@ -417,6 +417,7 @@ if ($resql) // List of mass actions available $arrayofmassactions = array( + 'generate_doc'=>$langs->trans("Generate"), //'presend'=>$langs->trans("SendByMail"), //'builddoc'=>$langs->trans("PDFMerge"), ); diff --git a/htdocs/product/price.php b/htdocs/product/price.php index b610e2a2914..735b01f2123 100644 --- a/htdocs/product/price.php +++ b/htdocs/product/price.php @@ -352,7 +352,10 @@ if (empty($reshook)) break; } - $res = $object->updatePrice($newprice, $val['price_base_type'], $user, $val['vat_tx'], $newprice_min, $key, $val['npr'], $psq, 0, $val['localtaxes_array'], $val['default_vat_code']); + if($object->multiprices[$key]!=$newprice || $object->multiprices_min[$key]!=$newprice_min || $object->multiprices_base_type[$key]!=$val['price_base_type']) + $res = $object->updatePrice($newprice, $val['price_base_type'], $user, $val['vat_tx'], $newprice_min, $key, $val['npr'], $psq, 0, $val['localtaxes_array'], $val['default_vat_code']); + else $res=0; + if ($res < 0) { $error ++; @@ -1111,7 +1114,7 @@ if (! $action || $action == 'delete' || $action == 'showlog_customer_price' || $ if ($object->isVariant()) { if ($user->rights->produit->creer || $user->rights->service->creer) { - print ''; + print ''; } } else { if (empty($conf->global->PRODUIT_MULTIPRICES) && empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES)) { diff --git a/htdocs/product/reassort.php b/htdocs/product/reassort.php index 71482d6c86a..d14bfeb9df2 100644 --- a/htdocs/product/reassort.php +++ b/htdocs/product/reassort.php @@ -77,7 +77,7 @@ if (! empty($canvas)) // Define virtualdiffersfromphysical $virtualdiffersfromphysical=0; -if (! empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT) || ! empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER)) +if (! empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT) || ! empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER)|| ! empty($conf->global->STOCK_CALCULATE_ON_RECEPTION)) { $virtualdiffersfromphysical=1; // According to increase/decrease stock options, virtual and physical stock may differs. } diff --git a/htdocs/product/stats/facture.php b/htdocs/product/stats/facture.php index cd2dc221bb9..6cf8c13208a 100644 --- a/htdocs/product/stats/facture.php +++ b/htdocs/product/stats/facture.php @@ -147,7 +147,7 @@ if ($id > 0 || ! empty($ref)) elseif ($user->rights->facture->lire) { $sql = "SELECT DISTINCT s.nom as name, s.rowid as socid, s.code_client,"; - $sql.= " f.facnumber, f.datef, f.paye, f.type, f.fk_statut as statut, f.rowid as facid,"; + $sql.= " f.ref, f.datef, f.paye, f.type, f.fk_statut as statut, f.rowid as facid,"; $sql.= " d.rowid, d.total_ht as total_ht, d.qty"; // We must keep the d.rowid here to not loose record because of the distinct used to ignore duplicate line when link on societe_commerciaux is used if (!$user->rights->societe->client->voir && !$socid) $sql.= ", sc.fk_soc, sc.fk_user "; $sql.= " FROM ".MAIN_DB_PREFIX."societe as s"; @@ -155,7 +155,7 @@ if ($id > 0 || ! empty($ref)) $sql.= ", ".MAIN_DB_PREFIX."facturedet as d"; if (!$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; $sql.= " WHERE f.fk_soc = s.rowid"; - $sql.= " AND f.entity IN (".getEntity('facture').")"; + $sql.= " AND f.entity IN (".getEntity('invoice').")"; $sql.= " AND d.fk_facture = f.rowid"; $sql.= " AND d.fk_product =".$product->id; if (! empty($search_month)) @@ -239,7 +239,7 @@ if ($id > 0 || ! empty($ref)) $total_qty+=$objp->qty; $invoicestatic->id=$objp->facid; - $invoicestatic->ref=$objp->facnumber; + $invoicestatic->ref=$objp->ref; $societestatic->fetch($objp->socid); $paiement = $invoicestatic->getSommePaiement(); diff --git a/htdocs/product/stock/card.php b/htdocs/product/stock/card.php index 6977ac28acf..1d9cbd7952f 100644 --- a/htdocs/product/stock/card.php +++ b/htdocs/product/stock/card.php @@ -419,12 +419,12 @@ else if ($user->rights->stock->creer) print "id."\">".$langs->trans("Modify").""; else - print "".$langs->trans("Modify").""; + print "".$langs->trans("Modify").""; if ($user->rights->stock->supprimer) print "id."\">".$langs->trans("Delete").""; else - print "".$langs->trans("Delete").""; + print "".$langs->trans("Delete").""; } } diff --git a/htdocs/product/stock/class/mouvementstock.class.php b/htdocs/product/stock/class/mouvementstock.class.php index 7991477e146..e19df0aaa1a 100644 --- a/htdocs/product/stock/class/mouvementstock.class.php +++ b/htdocs/product/stock/class/mouvementstock.class.php @@ -322,8 +322,8 @@ class MouvementStock extends CommonObject if (! $foundforbatch || $qtyisnotenough) { $langs->load("stocks"); - $this->error = $langs->trans('qtyToTranferLotIsNotEnough'); - $this->errors[] = $langs->trans('qtyToTranferLotIsNotEnough'); + $this->error = $langs->trans('qtyToTranferLotIsNotEnough').' : '.$product->ref; + $this->errors[] = $langs->trans('qtyToTranferLotIsNotEnough').' : '.$product->ref; $this->db->rollback(); return -8; } @@ -333,8 +333,8 @@ class MouvementStock extends CommonObject if (empty($product->stock_warehouse[$entrepot_id]->real) || $product->stock_warehouse[$entrepot_id]->real < abs($qty)) { $langs->load("stocks"); - $this->error = $langs->trans('qtyToTranferIsNotEnough'); - $this->errors[] = $langs->trans('qtyToTranferIsNotEnough'); + $this->error = $langs->trans('qtyToTranferIsNotEnough').' : '.$product->ref; + $this->errors[] = $langs->trans('qtyToTranferIsNotEnough').' : '.$product->ref; $this->db->rollback(); return -8; } @@ -370,6 +370,7 @@ class MouvementStock extends CommonObject dol_syslog(get_class($this)."::_create insert record into stock_mouvement", LOG_DEBUG); $resql = $this->db->query($sql); + if ($resql) { $mvid = $this->db->last_insert_id(MAIN_DB_PREFIX."stock_mouvement"); @@ -412,7 +413,7 @@ class MouvementStock extends CommonObject $error = -2; } } - + // Calculate new PMP. $newpmp=0; if (! $error) @@ -442,7 +443,6 @@ class MouvementStock extends CommonObject $newpmp = $oldpmp; } } - // Update stock quantity if (! $error) { diff --git a/htdocs/product/stock/movement_list.php b/htdocs/product/stock/movement_list.php index bd5ac4a4345..f6a694c57fa 100644 --- a/htdocs/product/stock/movement_list.php +++ b/htdocs/product/stock/movement_list.php @@ -1048,7 +1048,20 @@ if ($resql) if (! empty($arrayfields['m.type_mouvement']['checked'])) { // Type of movement - print '
'.$objp->type_mouvement.''.$langs->trans('StockIncreaseAfterCorrectTransfer').''.$langs->trans('StockDecreaseAfterCorrectTransfer').''.$langs->trans('StockDecrease').''.$langs->trans('StockIncrease').'
'; print $form->textwithpicto($langs->trans("PhysicalStock"), $text_stock_options, 1); print '
'; - - $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")) + if ($object->statut == Project::STATUS_CLOSED) { - require_once DOL_DOCUMENT_ROOT ."/core/modules/project/task/".$conf->global->PROJECT_TASK_ADDON.'.php'; - $modTask = new $obj; - $defaultref = $modTask->getNextValue($object->thirdparty,null); - } - - if (is_numeric($defaultref) && $defaultref <= 0) $defaultref=''; - - // Ref - print ''; - - print ''; - - // List of projects - print ''; - - print ''; - - // Date start - print ''; - - // Date end - print ''; - - // Planned workload - print ''; - - // Progress - print ''; - - // Description - print ''; - print ''; - - // Other options - $parameters=array(); - $reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$taskstatic,$action); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - - if (empty($reshook) && ! empty($extrafields_task->attribute_label)) - { - print $taskstatic->showOptionals($extrafields_task,'edit'); // Do not use $object here that is object of project - } - - print '
'.$langs->trans("Ref").''; - if (empty($duplicate_code_error)) - { - print (GETPOSTISSET("ref")?GETPOST("ref",'alpha'):$defaultref); + print '
'; + $langs->load("errors"); + print $langs->trans("WarningProjectClosed"); + print '
'; } else { - print $defaultref; + print ''; + print ''; + print ''; + print ''; + if (! empty($object->id)) print ''; + + dol_fiche_head(''); + + print ''; + + $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($object->thirdparty,null); + } + + if (is_numeric($defaultref) && $defaultref <= 0) $defaultref=''; + + // Ref + print ''; + + print ''; + + // List of projects + print ''; + + print ''; + + // Date start + print ''; + + // Date end + print ''; + + // Planned workload + print ''; + + // Progress + print ''; + + // Description + print ''; + print ''; + + // Other options + $parameters=array(); + $reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$taskstatic,$action); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + + if (empty($reshook) && ! empty($extrafields_task->attribute_label)) + { + print $taskstatic->showOptionals($extrafields_task,'edit'); // Do not use $object here that is object of project + } + + print '
'.$langs->trans("Ref").''; + if (empty($duplicate_code_error)) + { + print (GETPOSTISSET("ref")?GETPOST("ref",'alpha'):$defaultref); + } + else + { + print $defaultref; + } + print ''; + print '
'.$langs->trans("Label").''; + print ''; + print '
'.$langs->trans("ChildOfProjectTask").''; + print $formother->selectProjectTasks(GETPOST('task_parent'), $projectid?$projectid:$object->id, 'task_parent', 0, 0, 1, 1, 0, '0,1', 'maxwidth500'); + print '
'.$langs->trans("AffectedTo").''; + $contactsofproject=(! empty($object->id)?$object->getListContactId('internal'):''); + if (is_array($contactsofproject) && count($contactsofproject)) + { + print $form->select_dolusers($user->id, 'userid', 0, '', 0, '', $contactsofproject, 0, 0, 0, '', 0, '', 'maxwidth300'); + } + else + { + print $langs->trans("NoUserAssignedToTheProject"); + } + print '
'.$langs->trans("DateStart").''; + print $form->selectDate(($date_start?$date_start:''), 'dateo', 1, 1, 0, '', 1, 1); + print '
'.$langs->trans("DateEnd").''; + print $form->selectDate(($date_end?$date_end:-1),'datee', -1, 1, 0, '', 1, 1); + print '
'.$langs->trans("PlannedWorkload").''; + print $form->select_duration('planned_workload', $planned_workload?$planned_workload : 0, 0, 'text'); + print '
'.$langs->trans("ProgressDeclared").''; + print $formother->select_percent($progress,'progress',0,5,0,100,1); + print '
'.$langs->trans("Description").''; + print ''; + print '
'; + + dol_fiche_end(); + + print '
'; + print ''; + print '     '; + print ''; + print '
'; + + print ''; } - print ''; - print '
'.$langs->trans("Label").''; - print ''; - print '
'.$langs->trans("ChildOfProjectTask").''; - print $formother->selectProjectTasks(GETPOST('task_parent'), $projectid?$projectid:$object->id, 'task_parent', 0, 0, 1, 1, 0, '0,1', 'maxwidth500'); - print '
'.$langs->trans("AffectedTo").''; - $contactsofproject=(! empty($object->id)?$object->getListContactId('internal'):''); - if (is_array($contactsofproject) && count($contactsofproject)) - { - print $form->select_dolusers($user->id, 'userid', 0, '', 0, '', $contactsofproject, 0, 0, 0, '', 0, '', 'maxwidth300'); - } - else - { - print $langs->trans("NoUserAssignedToTheProject"); - } - print '
'.$langs->trans("DateStart").''; - print $form->selectDate(($date_start?$date_start:''), 'dateo', 1, 1, 0, '', 1, 1); - print '
'.$langs->trans("DateEnd").''; - print $form->selectDate(($date_end?$date_end:-1),'datee', -1, 1, 0, '', 1, 1); - print '
'.$langs->trans("PlannedWorkload").''; - print $form->select_duration('planned_workload', $planned_workload?$planned_workload : 0, 0, 'text'); - print '
'.$langs->trans("ProgressDeclared").''; - print $formother->select_percent($progress,'progress',0,5,0,100,1); - print '
'.$langs->trans("Description").''; - print ''; - print '
'; - - dol_fiche_end(); - - print '
'; - print ''; - print '     '; - print ''; - print '
'; - - print ''; } else if ($id > 0 || ! empty($ref)) { diff --git a/htdocs/projet/tasks/contact.php b/htdocs/projet/tasks/contact.php index 82c722f2485..e6de0743d66 100644 --- a/htdocs/projet/tasks/contact.php +++ b/htdocs/projet/tasks/contact.php @@ -326,7 +326,7 @@ if ($id > 0 || ! empty($ref)) dol_fiche_end(); /* - * Lignes de contacts + * Lines of contacts */ /* // Contacts lines (modules that overwrite templates must declare this into descriptor) @@ -340,16 +340,15 @@ if ($id > 0 || ! empty($ref)) /* * Add a new contact line - * Non affiche en mode modification de ligne */ print ''; if ($action != 'editline' && $user->rights->projet->creer) { print ''; - print ''; + print ''; print ''; - print ''; + print ''; print ''; print ''; print "\n"; @@ -507,7 +506,7 @@ if ($id > 0 || ! empty($ref)) { print ' '; print ''; - print img_delete(); + print img_picto($langs->trans('Unlink'), 'unlink'); print ''; } print ''; diff --git a/htdocs/projet/tasks/task.php b/htdocs/projet/tasks/task.php index 73ce4a562e4..7b96d2e2ea1 100644 --- a/htdocs/projet/tasks/task.php +++ b/htdocs/projet/tasks/task.php @@ -333,12 +333,12 @@ if ($id > 0 || ! empty($ref)) } else { - print ''.$langs->trans('AddTask').''; + print ''.$langs->trans('AddTask').''; } } else { - print ''.$langs->trans('AddTask').''; + print ''.$langs->trans('AddTask').''; } print ''; @@ -580,7 +580,7 @@ if ($id > 0 || ! empty($ref)) } else { - print ''.$langs->trans('Modify').''; + print ''.$langs->trans('Modify').''; } // Delete @@ -592,12 +592,12 @@ if ($id > 0 || ! empty($ref)) } else { - print ''.$langs->trans('Delete').''; + print ''.$langs->trans('Delete').''; } } else { - print ''.$langs->trans('Delete').''; + print ''.$langs->trans('Delete').''; } print ''; diff --git a/htdocs/public/emailing/mailing-unsubscribe.php b/htdocs/public/emailing/mailing-unsubscribe.php index c27cb024aab..d04d6eb8020 100644 --- a/htdocs/public/emailing/mailing-unsubscribe.php +++ b/htdocs/public/emailing/mailing-unsubscribe.php @@ -23,7 +23,8 @@ /** * \file public/emailing/mailing-unsubscribe.php * \ingroup mailing - * \brief Script use to update unsubcribe contact to prospect mailing list + * \brief Script use to update unsubcribe status of an email + * https://myserver/public/emailing/mailing-unsubscribe.php?unsuscrib=1&securitykey=securitykey&tag=abcdefghijklmn */ if (! defined('NOLOGIN')) define("NOLOGIN",1); // This means this output page does not require to be logged. @@ -75,38 +76,51 @@ if ($securitykey != $conf->global->MAILING_EMAIL_UNSUBSCRIBE_KEY) if (! empty($tag) && ($unsuscrib=='1')) { - // Update status of mail in recipient mailing list table - $statut='3'; - $sql = "UPDATE ".MAIN_DB_PREFIX."mailing_cibles SET statut=".$statut." WHERE tag='".$db->escape($tag)."'"; - dol_syslog("public/emailing/mailing-unsubscribe.php : Mail unsubcribe : ".$sql, LOG_DEBUG); + dol_syslog("public/emailing/mailing-unsubscribe.php : Launch unsubscribe requests", LOG_DEBUG); - $resql=$db->query($sql); - if (! $resql) dol_print_error($db); - - // Update status communication of thirdparty prospect - $sql = "UPDATE ".MAIN_DB_PREFIX."societe SET fk_stcomm=-1 WHERE rowid IN (SELECT source_id FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE tag='".$db->escape($tag)."' AND source_type='thirdparty' AND source_id is not null)"; - dol_syslog("public/emailing/mailing-unsubscribe.php : Mail unsubcribe thirdparty : ".$sql, LOG_DEBUG); - - $resql=$db->query($sql); - if (! $resql) dol_print_error($db); - - // Update status communication of contact prospect - $sql = "UPDATE ".MAIN_DB_PREFIX."socpeople SET no_email=1 WHERE rowid IN (SELECT source_id FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE tag = '".$db->escape($tag)."' AND source_type='contact' AND source_id is not null)"; - dol_syslog("public/emailing/mailing-unsubscribe.php : Mail unsubcribe contact : ".$sql, LOG_DEBUG); - - $resql=$db->query($sql); - if (! $resql) dol_print_error($db); - - - $sql = "SELECT mc.email"; - $sql .= " FROM ".MAIN_DB_PREFIX."mailing_cibles as mc"; - $sql .= " WHERE mc.tag='".$db->escape($tag)."'"; + $sql = "SELECT mc.email, m.entity"; + $sql .= " FROM ".MAIN_DB_PREFIX."mailing_cibles as mc, ".MAIN_DB_PREFIX."mailing as m"; + $sql .= " WHERE mc.fk_mailing = m.rowid AND mc.tag='".$db->escape($tag)."'"; $resql=$db->query($sql); if (! $resql) dol_print_error($db); $obj = $db->fetch_object($resql); + if (empty($obj->email)) + { + print 'Email not found. No need to unsubscribe.'; + exit; + } + + // Update status of mail in recipient mailing list table + $statut='3'; + $sql = "UPDATE ".MAIN_DB_PREFIX."mailing_cibles SET statut=".$statut." WHERE tag='".$db->escape($tag)."'"; + + $resql=$db->query($sql); + if (! $resql) dol_print_error($db); + + /* + // Update status communication of thirdparty prospect (old usage) + $sql = "UPDATE ".MAIN_DB_PREFIX."societe SET fk_stcomm=-1 WHERE rowid IN (SELECT source_id FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE tag = '".$db->escape($tag)."' AND source_type='thirdparty' AND source_id is not null)"; + + $resql=$db->query($sql); + if (! $resql) dol_print_error($db); + + // Update status communication of contact prospect (old usage) + $sql = "UPDATE ".MAIN_DB_PREFIX."socpeople SET no_email=1 WHERE rowid IN (SELECT source_id FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE tag = '".$db->escape($tag)."' AND source_type='contact' AND source_id is not null)"; + + $resql=$db->query($sql); + if (! $resql) dol_print_error($db); + */ + + // Update status communication of email (new usage) + $sql = "INSERT INTO ".MAIN_DB_PREFIX."mailing_unsubscribe (date_creat, entity, email) VALUES ('".$db->idate(dol_now())."', ".$obj->entity.", '".$obj->email."')"; + + $resql=$db->query($sql); + //if (! $resql) dol_print_error($db); No test on errors, may fail if already unsubscribed + + header("Content-type: text/html; charset=".$conf->file->character_set_client); print ''; diff --git a/htdocs/public/members/new.php b/htdocs/public/members/new.php index 78b3ceb75db..b78534bf4b0 100644 --- a/htdocs/public/members/new.php +++ b/htdocs/public/members/new.php @@ -1,10 +1,11 @@ - * Copyright (C) 2001-2002 Jean-Louis Bergamo - * Copyright (C) 2006-2013 Laurent Destailleur - * Copyright (C) 2012 Regis Houssin - * Copyright (C) 2012 J. Fernando Lagrange +/* Copyright (C) 2001-2002 Rodolphe Quiedeville + * Copyright (C) 2001-2002 Jean-Louis Bergamo + * Copyright (C) 2006-2013 Laurent Destailleur + * Copyright (C) 2012 Regis Houssin + * Copyright (C) 2012 J. Fernando Lagrange * Copyright (C) 2018 Frédéric France + * Copyright (C) 2018 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 @@ -232,6 +233,7 @@ if ($action == 'add') $adh->public = $public; $adh->firstname = $_POST["firstname"]; $adh->lastname = $_POST["lastname"]; + $adh->gender = $_POST["gender"]; $adh->civility_id = $_POST["civility_id"]; $adh->societe = $_POST["societe"]; $adh->address = $_POST["address"]; @@ -580,6 +582,12 @@ print $formcompany->select_civility(GETPOST('civility_id'),'civility_id').' print ''."\n"; // Firstname print ''."\n"; +// Gender +print ''; +print ''; // Company print ''."\n"; // Address diff --git a/htdocs/public/members/public_card.php b/htdocs/public/members/public_card.php index c7a9fa45b3a..c2df82fb2f2 100644 --- a/htdocs/public/members/public_card.php +++ b/htdocs/public/members/public_card.php @@ -1,8 +1,9 @@ - * Copyright (C) 2002-2003 Jean-Louis Bergamo - * Copyright (C) 2007-2012 Laurent Destailleur - * Copyright (C) 2012 Regis Houssin +/* Copyright (C) 2001-2003 Rodolphe Quiedeville + * Copyright (C) 2002-2003 Jean-Louis Bergamo + * Copyright (C) 2007-2012 Laurent Destailleur + * Copyright (C) 2012 Regis Houssin + * Copyright (C) 2018 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 @@ -91,6 +92,7 @@ if ($id > 0) print ''; print ''; print ''; + print ''; print ''; print ''; print ''; diff --git a/htdocs/public/opensurvey/studs.php b/htdocs/public/opensurvey/studs.php index a9bd8a0fb70..acf986bb226 100644 --- a/htdocs/public/opensurvey/studs.php +++ b/htdocs/public/opensurvey/studs.php @@ -95,7 +95,7 @@ if (GETPOST('ajoutcomment','alpha')) } // Add vote -if (GETPOST("boutonp") || GETPOST("boutonp.x") || GETPOST("boutonp_x")) // boutonp for chrom, boutonp_x for firefox +if (GETPOST("boutonp") || GETPOST("boutonp.x") || GETPOST("boutonp_x")) // boutonp for chrome, boutonp_x for firefox { if (!$canbemodified) accessforbidden(); @@ -160,9 +160,12 @@ if (GETPOST("boutonp") || GETPOST("boutonp.x") || GETPOST("boutonp_x")) // bout if ($email) { include_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; - $body = $langs->trans('EmailSomeoneVoted', $nom, getUrlSondage($numsondage, true)); + $application = ($conf->global->MAIN_APPLICATION_TITLE ? $conf->global->MAIN_APPLICATION_TITLE : 'Dolibarr ERP/CRM'); - $cmailfile=new CMailFile("[".MAIN_APPLICATION_TITLE."] ".$langs->trans("Poll").': '.$object->titre, $email, $conf->global->MAIN_MAIL_EMAIL_FROM, $body); + $body = str_replace('\n', '
', $langs->transnoentities('EmailSomeoneVoted', $nom, getUrlSondage($numsondage, true))); + //var_dump($body);exit; + + $cmailfile=new CMailFile("[".$application."] ".$langs->trans("Poll").': '.$object->titre, $email, $conf->global->MAIN_MAIL_EMAIL_FROM, $body, null, null, null, '', '', 0, -1); $result=$cmailfile->sendfile(); } } diff --git a/htdocs/reception/card.php b/htdocs/reception/card.php new file mode 100644 index 00000000000..c73657a8e1d --- /dev/null +++ b/htdocs/reception/card.php @@ -0,0 +1,2268 @@ + + * Copyright (C) 2005-2016 Laurent Destailleur + * Copyright (C) 2005 Simon TOSSER + * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2011-2017 Juanjo Menent + * Copyright (C) 2013 Florian Henry + * Copyright (C) 2013 Marcos García + * Copyright (C) 2014 Cedric GROSS + * Copyright (C) 2014-2017 Francis Appels + * Copyright (C) 2015 Claudio Aschieri + * Copyright (C) 2016 Ferran Marcet + * Copyright (C) 2016 Yasser Carreón + * Copyright (C) 2018 Quentin Vial-Gouteyron + * + * 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/reception/card.php + * \ingroup reception + * \brief Card of a reception + */ + +require '../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; +require_once DOL_DOCUMENT_ROOT.'/reception/class/reception.class.php'; +require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/product.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/reception.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/modules/reception/modules_reception.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; +require_once DOL_DOCUMENT_ROOT.'/product/stock/class/entrepot.class.php'; +require_once DOL_DOCUMENT_ROOT.'/product/stock/class/productlot.class.php'; +if (! empty($conf->product->enabled) || ! empty($conf->service->enabled)) require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; +if (! empty($conf->propal->enabled)) require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php'; +if (! empty($conf->fournisseur->enabled)){ + require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php'; + require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.dispatch.class.php'; +} +if (! empty($conf->productbatch->enabled)) require_once DOL_DOCUMENT_ROOT.'/product/class/productbatch.class.php'; +if (! empty($conf->projet->enabled)) { + require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; + require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php'; +} + +$langs->loadLangs(array("receptions","companies","bills",'deliveries','orders','stocks','other','propal')); + +if (!empty($conf->incoterm->enabled)) $langs->load('incoterm'); +if (! empty($conf->productbatch->enabled)) $langs->load('productbatch'); + +$origin = GETPOST('origin','alpha')?GETPOST('origin','alpha'):'reception'; // Example: commande, propal +$origin_id = GETPOST('id','int')?GETPOST('id','int'):''; +$id = $origin_id; +if (empty($origin_id)) $origin_id = GETPOST('origin_id','int'); // Id of order or propal +if (empty($origin_id)) $origin_id = GETPOST('object_id','int'); // Id of order or propal +if (empty($origin_id)) $origin_id = GETPOST('originid','int'); // Id of order or propal +$ref=GETPOST('ref','alpha'); +$line_id = GETPOST('lineid','int')?GETPOST('lineid','int'):''; + +// Security check +$socid=''; +if ($user->societe_id) $socid=$user->societe_id; + +if ($origin == 'reception') $result=restrictedArea($user, $origin, $id); +else { + $result=restrictedArea($user, 'reception'); + if($origin == 'supplierorder'){ + if (empty($user->rights->fournisseur->commande->lire) && empty($user->rights->fournisseur->commande->read)) accessforbidden(); + }else if (empty($user->rights->{$origin}->lire) && empty($user->rights->{$origin}->read)) accessforbidden(); +} + +$action = GETPOST('action','alpha'); +//Select mail models is same action as presend +if (GETPOST('modelselected')) { + $action = 'presend'; +} +$confirm = GETPOST('confirm','alpha'); +$cancel = GETPOST('cancel','alpha'); + +//PDF +$hidedetails = (GETPOST('hidedetails','int') ? GETPOST('hidedetails','int') : (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_DETAILS) ? 1 : 0)); +$hidedesc = (GETPOST('hidedesc','int') ? GETPOST('hidedesc','int') : (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_DESC) ? 1 : 0)); +$hideref = (GETPOST('hideref','int') ? GETPOST('hideref','int') : (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_REF) ? 1 : 0)); + +$object = new Reception($db); +$extrafields = new ExtraFields($db); +$extrafieldsline = new ExtraFields($db); + +// fetch optionals attributes and labels +$extralabels = $extrafields->fetch_name_optionals_label($object->table_element); + +// fetch optionals attributes lines and labels +$extralabelslines=$extrafieldsline->fetch_name_optionals_label($object->table_element_line); + + +// Load object. Make an object->fetch +include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once + +// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context +$hookmanager->initHooks(array('receptioncard','globalcard')); + +$permissiondellink=$user->rights->reception->creer; // Used by the include of actions_dellink.inc.php +//var_dump($object->lines[0]->detail_batch); + + +/* + * 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'); + +if (empty($reshook)) +{ + if ($cancel) + { + $action = ''; + $object->fetch($id); // show reception also after canceling modification + } + + include DOL_DOCUMENT_ROOT.'/core/actions_dellink.inc.php'; // Must be include, not include_once + + // Reopen + if ($action == 'reopen' && $user->rights->reception->creer) + { + $object->fetch($id); + $result = $object->reOpen(); + } + + // Confirm back to draft status + if ($action == 'modif' && $user->rights->reception->creer) + { + $result = $object->set_draft($user); + if ($result >= 0) + { + // Define output language + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) + { + $outputlangs = $langs; + $newlang = ''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id','aZ09')) $newlang = GETPOST('lang_id','aZ09'); + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang = $object->thirdparty->default_lang; + if (! empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + $model=$object->modelpdf; + $ret = $object->fetch($id); // Reload to get new records + $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } + } + + // Set incoterm + if ($action == 'set_incoterms' && !empty($conf->incoterm->enabled)) + { + $result = $object->setIncoterms(GETPOST('incoterm_id', 'int'), GETPOST('location_incoterms', 'alpha')); + } + + if ($action == 'setref_supplier') + { + $result = $object->fetch($id); + if ($result < 0) { + setEventMessages($object->error, $object->errors, 'errors'); + } + + $result = $object->setValueFrom('ref_supplier', GETPOST('ref_supplier','alpha'), '', null, 'text', '', $user, 'RECEPTION_MODIFY'); + if ($result < 0) { + setEventMessages($object->error, $object->errors, 'errors'); + $action = 'editref_supplier'; + } else { + header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id); + exit; + } + } + + if ($action == 'update_extras') + { + // Fill array 'array_options' with data from update form + $extralabels = $extrafields->fetch_name_optionals_label($object->table_element); + $ret = $extrafields->setOptionalsFromPost($extralabels, $object, GETPOST('attribute')); + if ($ret < 0) $error++; + + if (! $error) + { + // Actions on extra fields (by external module or standard code) + // TODO le hook fait double emploi avec le trigger !! + $hookmanager->initHooks(array('receptiondao')); + $parameters = array('id' => $object->id); + $reshook = $hookmanager->executeHooks('insertExtraFields', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks + if (empty($reshook)) { + $result = $object->insertExtraFields(); + if ($result < 0) + { + setEventMessages($object->error, $object->errors, 'errors'); + $error++; + } + } else if ($reshook < 0) + $error++; + } + + if ($error) + $action = 'edit_extras'; + } + + // Create reception + if ($action == 'add' && $user->rights->reception->creer) + { + + $error = 0; + $predef = ''; + + $db->begin(); + + $object->note = GETPOST('note', 'alpha'); + $object->origin = $origin; + $object->origin_id = $origin_id; + $object->fk_project = GETPOST('projectid', 'int'); + $object->weight = GETPOST('weight', 'int') == '' ? "NULL" : GETPOST('weight', 'int'); + $object->sizeH = GETPOST('sizeH', 'int') == '' ? "NULL" : GETPOST('sizeH', 'int'); + $object->sizeW = GETPOST('sizeW', 'int') == '' ? "NULL" : GETPOST('sizeW', 'int'); + $object->sizeS = GETPOST('sizeS', 'int') == '' ? "NULL" : GETPOST('sizeS', 'int'); + $object->size_units = GETPOST('size_units', 'int'); + $object->weight_units = GETPOST('weight_units', 'int'); + + $date_delivery = dol_mktime(GETPOST('date_deliveryhour', 'int'), GETPOST('date_deliverymin', 'int'), 0, GETPOST('date_deliverymonth', 'int'), GETPOST('date_deliveryday', 'int'), GETPOST('date_deliveryyear', 'int')); + + // On va boucler sur chaque ligne du document d'origine pour completer objet reception + // avec info diverses + qte a livrer + + if ($object->origin == "supplierorder") + $classname = 'CommandeFournisseur'; + else + $classname = ucfirst($object->origin); + $objectsrc = new $classname($db); + $objectsrc->fetch($object->origin_id); + + + + $object->socid = $objectsrc->socid; + $object->ref_supplier = GETPOST('ref_supplier', 'alpha'); + $object->model_pdf = GETPOST('model'); + $object->date_delivery = $date_delivery; // Date delivery planed + $object->fk_delivery_address = $objectsrc->fk_delivery_address; + $object->shipping_method_id = GETPOST('shipping_method_id', 'int'); + $object->tracking_number = GETPOST('tracking_number', 'alpha'); + $object->ref_int = GETPOST('ref_int', 'alpha'); + $object->note_private = GETPOST('note_private', 'none'); + $object->note_public = GETPOST('note_public', 'none'); + $object->fk_incoterms = GETPOST('incoterm_id', 'int'); + $object->location_incoterms = GETPOST('location_incoterms', 'alpha'); + + $batch_line = array(); + $stockLine = array(); + $array_options = array(); + + $totalqty = 0; + + $num = 0; + foreach ($_POST as $key => $value) + { + // without batch module enabled + + if (strpos($key, 'qtyasked') !== false) + { + $num++; + } + } + + for ($i = 1; $i <= $num; $i++) + { + $idl = "idl".$i; + + $sub_qty = array(); + $subtotalqty = 0; + + $j = 0; + $batch = "batchl".$i."_0"; + $stockLocation = "ent1".$i."_0"; + $qty = "qtyl".$i; + + + + //var_dump(GETPOST($qty,'int')); var_dump($_POST); var_dump($batch);exit; + //reception line for product with no batch management and no multiple stock location + if (GETPOST($qty, 'int') > 0) + $totalqty += GETPOST($qty, 'int'); + + + // Extrafields + $extralabelsline = $extrafieldsline->fetch_name_optionals_label($object->table_element_line); + $array_options[$i] = $extrafieldsline->getOptionalsFromPost($extralabelsline, $i); + } + + + if ($totalqty > 0) // There is at least one thing to ship + { + //var_dump($_POST);exit; + for ($i = 1; $i <= $num; $i++) + { + $lineToTest = ''; + foreach($objectsrc->lines as $linesrc){ + if($linesrc->id == GETPOST($idl, 'int'))$lineToTest=$linesrc; + } + $qty = "qtyl".$i; + $comment = "comment".$i; + $eatby = "dlc".$i; + $sellby = "dluo".$i; + $batch = "batch".$i; + + + + $timeFormat = '%d/%m/%Y'; + + if (GETPOST($qty, 'int') > 0 || (GETPOST($qty, 'int') == 0 && $conf->global->RECEPTION_GETS_ALL_ORDER_PRODUCTS)) + { + $ent = "entl".$i; + + $idl = "idl".$i; + + $entrepot_id = is_numeric(GETPOST($ent, 'int')) ? GETPOST($ent, 'int') : GETPOST('entrepot_id', 'int'); + + if ($entrepot_id < 0) + $entrepot_id = ''; + if (!($linesrc->fk_product > 0) && empty($conf->global->STOCK_SUPPORTS_SERVICES)) + $entrepot_id = 0; + $eatby = GETPOST($eatby, 'alpha'); + $sellby = GETPOST($sellby, 'alpha'); + $eatbydate = str_replace('/','-',$eatby); + $sellbydate = str_replace('/','-',$sellby); + + + $ret = $object->addline($entrepot_id, GETPOST($idl, 'int'), GETPOST($qty, 'int'), $array_options[$i], GETPOST($comment, 'alpha'), strtotime($eatbydate),strtotime($sellbydate), GETPOST($batch, 'alpha')); + if ($ret < 0) + { + setEventMessages($object->error, $object->errors, 'errors'); + $error++; + } + } + } + + + // Fill array 'array_options' with data from add form + $ret = $extrafields->setOptionalsFromPost($extralabels, $object); + if ($ret < 0) $error++; + if (! $error) + { + $ret=$object->create($user); // This create reception (like Odoo picking) and line of receptions. Stock movement will when validating reception. + + if ($ret <= 0) + { + setEventMessages($object->error, $object->errors, 'errors'); + $error++; + } + } + } + else + { + setEventMessages($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("QtyToReceive").'/'.$langs->transnoentitiesnoconv("Warehouse")), null, 'errors'); + $error++; + } + + if (! $error) + { + $db->commit(); + header("Location: card.php?id=".$object->id); + exit; + } + else + { + $db->rollback(); + $_GET["commande_id"]=GETPOST('commande_id','int'); + $action='create'; + } + } + + else if ($action == 'confirm_valid' && $confirm == 'yes' && + ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->reception->creer)) + || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->reception->reception_advance->validate))) + ) + { + $object->fetch_thirdparty(); + + $result = $object->valid($user); + + if ($result < 0) + { + $langs->load("errors"); + setEventMessages($langs->trans($object->error), null, 'errors'); + } + else + { + // Define output language + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) + { + $outputlangs = $langs; + $newlang = ''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id','aZ09')) $newlang = GETPOST('lang_id','aZ09'); + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang = $object->thirdparty->default_lang; + if (! empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + $model=$object->modelpdf; + $ret = $object->fetch($id); // Reload to get new records + + $result=$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref); + if ($result < 0) dol_print_error($db,$result); + } + } + } + + else if ($action == 'confirm_delete' && $confirm == 'yes' && $user->rights->reception->supprimer) + { + $result = $object->delete(); + if ($result > 0) + { + header("Location: ".DOL_URL_ROOT.'/reception/index.php'); + exit; + } + else + { + setEventMessages($object->error, $object->errors, 'errors'); + } + } + // TODO add alternative status + /*else if ($action == 'reopen' && (! empty($user->rights->reception->creer) || ! empty($user->rights->reception->reception_advance->validate))) + { + $result = $object->setStatut(0); + if ($result < 0) + { + setEventMessages($object->error, $object->errors, 'errors'); + } + }*/ + + else if ($action == 'setdate_livraison' && $user->rights->reception->creer) + { + //print "x ".$_POST['liv_month'].", ".$_POST['liv_day'].", ".$_POST['liv_year']; + $datedelivery=dol_mktime(GETPOST('liv_hour','int'), GETPOST('liv_min','int'), 0, GETPOST('liv_month','int'), GETPOST('liv_day','int'), GETPOST('liv_year','int')); + + $object->fetch($id); + $result=$object->set_date_livraison($user,$datedelivery); + if ($result < 0) + { + setEventMessages($object->error, $object->errors, 'errors'); + } + } + + // Action update + else if ($action == 'settracking_number' || $action == 'settracking_url' + || $action == 'settrueWeight' + || $action == 'settrueWidth' + || $action == 'settrueHeight' + || $action == 'settrueDepth' + || $action == 'setshipping_method_id') + { + $error=0; + + if ($action == 'settracking_number') $object->tracking_number = trim(GETPOST('tracking_number','alpha')); + if ($action == 'settracking_url') $object->tracking_url = trim(GETPOST('tracking_url','int')); + if ($action == 'settrueWeight') { + $object->trueWeight = trim(GETPOST('trueWeight','int')); + $object->weight_units = GETPOST('weight_units','int'); + } + if ($action == 'settrueWidth') $object->trueWidth = trim(GETPOST('trueWidth','int')); + if ($action == 'settrueHeight'){ + $object->trueHeight = trim(GETPOST('trueHeight','int')); + $object->size_units = GETPOST('size_units','int'); + } + if ($action == 'settrueDepth') $object->trueDepth = trim(GETPOST('trueDepth','int')); + if ($action == 'setshipping_method_id') $object->shipping_method_id = trim(GETPOST('shipping_method_id','int')); + + if (! $error) + { + if ($object->update($user) >= 0) + { + header("Location: card.php?id=".$object->id); + exit; + } + setEventMessages($object->error, $object->errors, 'errors'); + } + + $action=""; + } + + // Build document + else if ($action == 'builddoc') // En get ou en post + { + // Save last template used to generate document + if (GETPOST('model')) $object->setDocModel($user, GETPOST('model','alpha')); + + // Define output language + $outputlangs = $langs; + $newlang=''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id','aZ09')) $newlang=GETPOST('lang_id','aZ09'); + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang=$reception->thirdparty->default_lang; + if (! empty($newlang)) + { + $outputlangs = new Translate("",$conf); + $outputlangs->setDefaultLang($newlang); + } + $result = $object->generateDocument($object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + if ($result <= 0) + { + setEventMessages($object->error, $object->errors, 'errors'); + $action=''; + } + } + + // Delete file in doc form + elseif ($action == 'remove_file') + { + require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + + $upload_dir = $conf->reception->dir_output ; + $file = $upload_dir . '/' . GETPOST('file'); + $ret=dol_delete_file($file,0,0,0,$object); + if ($ret) setEventMessages($langs->trans("FileWasRemoved", GETPOST('urlfile')), null, 'mesgs'); + else setEventMessages($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), null, 'errors'); + } + + elseif ($action == 'classifybilled') + { + $object->fetch($id); + $result = $object->set_billed(); + if($result >= 0) { + header('Location: ' . $_SERVER["PHP_SELF"] . '?id=' . $object->id); + exit(); + } + } + + elseif ($action == 'classifyclosed') + { + $object->fetch($id); + $result = $object->setClosed(); + if($result >= 0) { + header('Location: ' . $_SERVER["PHP_SELF"] . '?id=' . $object->id); + exit(); + } + } + + /* + * delete a line + */ + elseif ($action == 'deleteline' && ! empty($line_id)) + { + $object->fetch($id); + $lines = $object->lines; + $line = new CommandeFournisseurDispatch($db); + + $num_prod = count($lines); + for ($i = 0 ; $i < $num_prod ; $i++) + { + if ($lines[$i]->id == $line_id) + { + + // delete single warehouse line + $line->id = $line_id; + if (! $error && $line->delete($user) < 0) + { + $error++; + } + } + unset($_POST["lineid"]); + } + + if(! $error) { + header('Location: ' . $_SERVER["PHP_SELF"] . '?id=' . $object->id); + exit(); + } + else + { + setEventMessages($line->error, $line->errors, 'errors'); + } + } + + /* + * Update a line + */ + else if ($action == 'updateline' && $user->rights->reception->creer && GETPOST('save')) + { + // Clean parameters + $qty = 0; + $entrepot_id = 0; + $batch_id = 0; + + $lines = $object->lines; + $num_prod = count($lines); + for ($i = 0; $i < $num_prod; $i++) + { + if ($lines[$i]->id == $line_id) // we have found line to update + { + $line = new CommandeFournisseurDispatch($db); + $line->fetch($line_id); + // Extrafields Lines + $extrafieldsline = new ExtraFields($db); + $extralabelsline = $extrafieldsline->fetch_name_optionals_label($object->table_element_line); + $line->array_options = $extrafieldsline->getOptionalsFromPost($extralabelsline); + + + $line->fk_product = $lines[$i]->fk_product; + + + if ($lines[$i]->fk_product > 0) + { + // single warehouse reception line + $stockLocation = "entl".$line_id; + $qty = "qtyl".$line_id; + $comment = "comment".$line_id; + + + $line->id = $line_id; + $line->fk_entrepot = GETPOST($stockLocation, 'int'); + $line->qty = GETPOST($qty, 'int'); + $line->comment = GETPOST($comment, 'alpha'); + + if(!empty($conf->productbatch->enabled)){ + $batch = "batch".$line_id; + $dlc = "dlc".$line_id; + $dluo = "dluo".$line_id; + $eatby = GETPOST($dlc, 'alpha'); + $eatbydate = str_replace('/','-',$eatby); + $sellby = GETPOST($dluo, 'alpha'); + $sellbydate = str_replace('/','-',$sellby); + $line->batch = GETPOST($batch, 'alpha'); + $line->eatby = strtotime($eatbydate); + $line->sellby = strtotime($sellbydate); + } + + if ($line->update($user) < 0) + { + setEventMessages($line->error, $line->errors, 'errors'); + $error++; + } + } + else // Product no predefined + { + $qty = "qtyl".$line_id; + $line->id = $line_id; + $line->qty = GETPOST($qty, 'int'); + $line->fk_entrepot = 0; + if ($line->update($user) < 0) + { + setEventMessages($line->error, $line->errors, 'errors'); + $error++; + } + unset($_POST[$qty]); + } + } + } + + unset($_POST["lineid"]); + + if (! $error) { + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) { + // Define output language + $outputlangs = $langs; + $newlang = ''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id','aZ09')) + $newlang = GETPOST('lang_id','aZ09'); + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) + $newlang = $object->thirdparty->default_lang; + if (! empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + + $ret = $object->fetch($object->id); // Reload to get new records + $object->generateDocument($object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } + else + { + header('Location: ' . $_SERVER['PHP_SELF'] . '?id=' . $object->id); // Pour reaffichage de la fiche en cours d'edition + exit(); + } + } + + else if ($action == 'updateline' && $user->rights->reception->creer && GETPOST('cancel','alpha') == $langs->trans('Cancel')) { + header('Location: ' . $_SERVER['PHP_SELF'] . '?id=' . $object->id); // Pour reaffichage de la fiche en cours d'edition + exit(); + } + + include DOL_DOCUMENT_ROOT.'/core/actions_printing.inc.php'; + + // Actions to send emails + if (empty($id)) $id=$facid; + $trigger_name='RECEPTION_SENTBYMAIL'; + $paramname='id'; + $mode='emailfromreception'; + $trackid='shi'.$object->id; + include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php'; +} + + +/* + * View + */ + +llxHeader('',$langs->trans('Reception'),'Reception'); + +$form = new Form($db); +$formfile = new FormFile($db); +$formproduct = new FormProduct($db); +if (! empty($conf->projet->enabled)) { $formproject = new FormProjets($db); } + +$product_static = new Product($db); +$reception_static = new Reception($db); +$warehousestatic = new Entrepot($db); + +if ($action == 'create2') +{ + print load_fiche_titre($langs->trans("CreateReception")).'
'; + print $langs->trans("ReceptionCreationIsDoneFromOrder"); + $action=''; $id=''; $ref=''; +} + +// Mode creation. +if ($action == 'create') +{ + $recept = new Reception($db); + + print load_fiche_titre($langs->trans("CreateReception")); + if (! $origin) + { + setEventMessages($langs->trans("ErrorBadParameters"), null, 'errors'); + } + + if ($origin) + { + if($origin == 'supplierorder')$classname = 'CommandeFournisseur'; + else $classname = ucfirst($origin); + + $object = new $classname($db); + if ($object->fetch($origin_id)) // This include the fetch_lines + { + $soc = new Societe($db); + $soc->fetch($object->socid); + + $author = new User($db); + $author->fetch($object->user_author_id); + + if (! empty($conf->stock->enabled)) $entrepot = new Entrepot($db); + + print '
'; + print ''; + print ''; + print ''; + print ''; + print ''; + if (GETPOST('entrepot_id','int')) + { + print ''; + } + + dol_fiche_head(''); + + print '
'.$langs->trans("Source").''.$langs->trans("Nature").''.$langs->trans("ThirdParty").''.$langs->trans("TaskContact").''.$langs->trans("Users").''.$langs->trans("ContactType").' 
'.$langs->trans("Lastname").' *
'.$langs->trans("Firstname").' *
'.$langs->trans("Gender").''; +$arraygender=array('man'=>$langs->trans("Genderman"),'woman'=>$langs->trans("Genderwoman")); +print $form->selectarray('gender', $arraygender, GETPOST('gender')?GETPOST('gender'):$object->gender, 1); +print '
'.$langs->trans("Company").'
'.$langs->trans("Person").''.$object->morphy.'
'.$langs->trans("Firstname").''.$object->firstname.' 
'.$langs->trans("Lastname").''.$object->lastname.' 
'.$langs->trans("Gender").''.$object->gender.' 
'.$langs->trans("Company").''.$object->societe.' 
'.$langs->trans("Address").''.nl2br($object->address).' 
'.$langs->trans("Zip").' / '.$langs->trans("Town").''.$object->zip.' '.$object->town.' 
'; + + // Ref + print ''; + print "\n"; + // Ref client + print ''; + print ''; + + // Tiers + print ''; + print ''; + print ''; + + // Project + if (! empty($conf->projet->enabled)) + { + $projectid = GETPOST('projectid','int')?GETPOST('projectid','int'):0; + if(empty($projectid) && ! empty($object->fk_project)) $projectid = $object->fk_project; + if ($origin == 'project') $projectid = ($originid ? $originid : 0); + + $langs->load("projects"); + print ''; + print ''; + print ''; + } + + // Date delivery planned + print ''; + print '\n"; + print ''; + + // Note Public + print ''; + print '"; + + // Note Private + if ($object->note_private && ! $user->societe_id) + { + print ''; + print '"; + } + + // Weight + print ''; + // Dim + print ''; + + // Delivery method + print ""; + print '\n"; + + // Tracking number + print ""; + print '\n"; + + // Other attributes + $parameters = array('objectsrc' => $objectsrc, 'colspan' => ' colspan="3"', 'socid'=>$socid); + $reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$recept,$action); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + + if (empty($reshook) && ! empty($extrafields->attribute_label)) { + // copy from order + $orderExtrafields = new Extrafields($db); + $orderExtrafieldLabels = $orderExtrafields->fetch_name_optionals_label($object->table_element); + if ($object->fetch_optionals($object->id, $orderExtrafieldLabels) > 0) { + $recept->array_options = array_merge($recept->array_options, $object->array_options); + } + print $object->showOptionals($extrafields, 'edit'); + } + + + // Incoterms + if (!empty($conf->incoterm->enabled)) + { + print ''; + print ''; + print ''; + } + + // Document model + include_once DOL_DOCUMENT_ROOT . '/core/modules/reception/modules_reception.php'; + $liste = ModelePdfReception::liste_modeles($db); + + if (count($liste) > 1) + { + print ""; + print '\n"; + } + + print "
'; + if ($origin == 'supplierorder' && ! empty($conf->fournisseur->enabled)) + { + print $langs->trans("RefOrder").''.img_object($langs->trans("ShowOrder"),'order').' '.$object->ref; + } + if ($origin == 'propal' && ! empty($conf->propal->enabled)) + { + print $langs->trans("RefProposal").''.img_object($langs->trans("ShowProposal"),'propal').' '.$object->ref; + } + print '
'; + if ($origin == 'supplier_order') print $langs->trans('RefSupplierOrder'); + else print $langs->trans('RefSupplier'); + print ''; + print ''; + print '
'.$langs->trans('Company').''.$soc->getNomUrl(1).'
' . $langs->trans("Project") . ''; + $numprojet = $formproject->select_projects($soc->id, $projectid, 'projectid', 0); + print '   id).'">' . $langs->trans("AddProject") . ''; + print '
'.$langs->trans("DateDeliveryPlanned").''; + //print dol_print_date($object->date_livraison,"day"); // date_livraison come from order and will be stored into date_delivery planed. + $date_delivery = ($date_delivery?$date_delivery:$object->date_livraison); // $date_delivery comes from GETPOST + print $form->select_date($date_delivery?$date_delivery:-1,'date_delivery',1,1,1); + print "
'.$langs->trans("NotePublic").''; + $doleditor = new DolEditor('note_public', $object->note_public, '', 60, 'dolibarr_notes', 'In', 0, false, true, ROWS_3, '90%'); + print $doleditor->Create(1); + print "
'.$langs->trans("NotePrivate").''; + $doleditor = new DolEditor('note_private', $object->note_private, '', 60, 'dolibarr_notes', 'In', 0, false, true, ROWS_3, '90%'); + print $doleditor->Create(1); + print "
'; + print $langs->trans("Weight"); + print ' '; + $text=$formproduct->select_measuring_units("weight_units","weight",GETPOST('weight_units','int')); + $htmltext=$langs->trans("KeepEmptyForAutoCalculation"); + print $form->textwithpicto($text, $htmltext); + print '
'; + print $langs->trans("Width").' x '.$langs->trans("Height").' x '.$langs->trans("Depth"); + print ' '; + print ' x '; + print ' x '; + print ' '; + $text=$formproduct->select_measuring_units("size_units","size"); + $htmltext=$langs->trans("KeepEmptyForAutoCalculation"); + print $form->textwithpicto($text, $htmltext); + print '
".$langs->trans("ReceptionMethod")."'; + $recept->fetch_delivery_methods(); + print $form->selectarray("shipping_method_id", $recept->meths, GETPOST('shipping_method_id','int'),1,0,0,"",1); + if ($user->admin) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1); + print "
".$langs->trans("TrackingNumber")."'; + print ''; + print "
'; + print $form->select_incoterms((!empty($object->fk_incoterms) ? $object->fk_incoterms : ''), (!empty($object->location_incoterms)?$object->location_incoterms:'')); + print '
".$langs->trans("DefaultModel")."'; + print $form->selectarray('model', $liste, $conf->global->RECEPTION_ADDON_PDF); + print "
"; + + dol_fiche_end(); + + + // Reception lines + $numAsked=0; + $dispatchLines = array(); + foreach ($_POST as $key => $value) + { + // without batch module enabled + if (preg_match('/^product_([0-9]+)_([0-9]+)$/i', $key, $reg)) + { + $numAsked ++; + + // $numline=$reg[2] + 1; // line of product + $numline = $numAsked; + $prod = "product_".$reg[1].'_'.$reg[2]; + $qty = "qty_".$reg[1].'_'.$reg[2]; + $ent = "entrepot_".$reg[1].'_'.$reg[2]; + $pu = "pu_".$reg[1].'_'.$reg[2]; // This is unit price including discount + $fk_commandefourndet = "fk_commandefourndet_".$reg[1].'_'.$reg[2]; + $dispatchLines[$numAsked]=array('prod' => GETPOST($prod, 'int'), 'qty' =>GETPOST($qty), 'ent' =>GETPOST($ent, 'int'), 'pu' =>GETPOST($pu), 'comment' =>GETPOST('comment'),'fk_commandefourndet' => GETPOST($fk_commandefourndet, 'int')); + } + + // with batch module enabled + if (preg_match('/^product_batch_([0-9]+)_([0-9]+)$/i', $key, $reg)) + { + $numAsked++; + + // eat-by date dispatch + // $numline=$reg[2] + 1; // line of product + $numline = $numAsked; + $prod = 'product_batch_'.$reg[1].'_'.$reg[2]; + $qty = 'qty_'.$reg[1].'_'.$reg[2]; + $ent = 'entrepot_'.$reg[1].'_'.$reg[2]; + $pu = 'pu_'.$reg[1].'_'.$reg[2]; + $lot = 'lot_number_'.$reg[1].'_'.$reg[2]; + $dDLUO = dol_mktime(12, 0, 0, $_POST['dluo_'.$reg[1].'_'.$reg[2].'month'], $_POST['dluo_'.$reg[1].'_'.$reg[2].'day'], $_POST['dluo_'.$reg[1].'_'.$reg[2].'year']); + $dDLC = dol_mktime(12, 0, 0, $_POST['dlc_'.$reg[1].'_'.$reg[2].'month'], $_POST['dlc_'.$reg[1].'_'.$reg[2].'day'], $_POST['dlc_'.$reg[1].'_'.$reg[2].'year']); + $fk_commandefourndet = 'fk_commandefourndet_'.$reg[1].'_'.$reg[2]; + $dispatchLines[$numAsked]=array('prod' => GETPOST($prod, 'int'), 'qty' =>GETPOST($qty), 'ent' =>GETPOST($ent, 'int'), 'pu' =>GETPOST($pu), 'comment' =>GETPOST('comment'),'fk_commandefourndet' => GETPOST($fk_commandefourndet, 'int'),'DLC'=> $dDLC,'DLUO'=> $dDLUO,'lot'=> GETPOST($lot, 'alpha')); + } + } + + + print ''; + + + print '
'; + + + print ''; + + + // Load receptions already done for same order + $object->loadReceptions(); + + if ($numAsked) + { + print ''; + print ''; + print ''; + print ''; + print ''; + if (! empty($conf->stock->enabled)) + { + print ''; + } + if (!empty($conf->productbatch->enabled)) + { + print ''; + print ''; + print ''; + } + print "\n"; + } + + $var=true; + $indiceAsked =1; + while ($indiceAsked <= $numAsked) + { + $product = new Product($db); + foreach($object->lines as $supplierLine){ + if($dispatchLines[$indiceAsked]['fk_commandefourndet'] == $supplierLine->id){ + $line = $supplierLine; + break; + } + } + + + // Show product and description + $type=$line->product_type?$line->product_type:$line->fk_product_type; + // Try to enhance type detection using date_start and date_end for free lines where type + // was not saved. + if (! empty($line->date_start)) $type=1; + if (! empty($line->date_end)) $type=1; + + print ''."\n"; + print ''."\n"; + + + // Product label + if ($line->fk_product > 0) // If predefined product + { + $product->fetch($line->fk_product); + $product->load_stock('warehouseopen'); // Load all $product->stock_warehouse[idwarehouse]->detail_batch + //var_dump($product->stock_warehouse[1]); + + print ''; + } + else + { + print "\n"; + } + + // Qty + print ''; + $qtyProdCom=$line->qty; + + // Qty already received + print ''; + + + if ($line->product_type == 1 && empty($conf->global->STOCK_SUPPORTS_SERVICES)) + { + $quantityToBeDelivered = 0; + } + else + { + $quantityToBeDelivered = $dispatchLines[$indiceAsked]['qty']; + } + $warehouse_id = $dispatchLines[$indiceAsked]['ent']; + + + $warehouseObject = null; + if ( !empty($conf->stock->enabled)) // If warehouse was already selected or if product is not a predefined, we go into this part with no multiwarehouse selection + { + print ''; + + $stock = + $product->stock_warehouse[$dispatchLines[$indiceAsked]['ent']]->real; // Convert to number + $deliverableQty=$dispatchLines[$indiceAsked]['qty']; + + + + // Quantity to send + print ''; + + // Stock + if (! empty($conf->stock->enabled)) + { + print ''; + } + + if (!empty($conf->productbatch->enabled)) + { + if( !empty($product->status_batch)){ + print ''; + print ''; + print ''; + }else { + print ''; + + } + } + print "\n"; + } + + //Display lines extrafields + if (is_array($extralabelslines) && count($extralabelslines)>0) + { + $colspan=5; + if($conf->productbatch->enabled)$colspan+=3; + $orderLineExtrafields = new Extrafields($db); + $orderLineExtrafieldLabels = $orderLineExtrafields->fetch_name_optionals_label($object->table_element_line); + $srcLine = new CommandeFournisseurLigne($db); + $srcLine->fetch_optionals($line->id,$orderLineExtrafieldLabels); // fetch extrafields also available in orderline + $line = new CommandeFournisseurDispatch($db); + $line->fetch_optionals($object->id,$extralabelslines); + $line->array_options = array_merge($line->array_options, $srcLine->array_options); + print ''; + print $line->showOptionals($extrafieldsline, 'edit', array('style'=>$bc[$var], 'colspan'=>$colspan),$indiceAsked); + print ''; + } + + $indiceAsked++; + } + + print "
'.$langs->trans("Description").''.$langs->trans("QtyOrdered").''.$langs->trans("QtyReceived").''.$langs->trans("QtyToReceive"); + if (empty($conf->productbatch->enabled)) + { + print '
('.$langs->trans("Fill").''; + print ' / '.$langs->trans("Reset").')'; + } + print '
'.$langs->trans("Warehouse").' ('.$langs->trans("Stock").')'.$langs->trans("batch_number").''.$langs->trans("EatByDate").''.$langs->trans("SellByDate").'
'; + print ''; // ancre pour retourner sur la ligne + + // Show product and description + $product_static->type=$line->fk_product_type; + $product_static->id=$line->fk_product; + $product_static->ref=$line->ref; + $product_static->status_batch=$line->product_tobatch; + + $text=$product_static->getNomUrl(1); + $text.= ' - '.(! empty($line->label)?$line->label:$line->product_label); + $description=($conf->global->PRODUIT_DESC_IN_FORM?'':dol_htmlentitiesbr($line->desc)); + print $form->textwithtooltip($text,$description,3,'','',$i); + + // Show range + print_date_range($db->jdate($line->date_start),$db->jdate($line->date_end)); + + // Add description in form + if (! empty($conf->global->PRODUIT_DESC_IN_FORM)) + { + print ($line->desc && $line->desc!=$line->product_label)?'
'.dol_htmlentitiesbr($line->desc):''; + } + + print '
"; + if ($type==1) $text = img_object($langs->trans('Service'),'service'); + else $text = img_object($langs->trans('Product'),'product'); + + if (! empty($line->label)) { + $text.= ' '.$line->label.''; + print $form->textwithtooltip($text,$line->desc,3,'','',$i); + } else { + print $text.' '.nl2br($line->desc); + } + + // Show range + print_date_range($db->jdate($line->date_start),$db->jdate($line->date_end)); + print "'.$line->qty; + print 'id.'\' />'; + print ''; + print ''; + print ''; + + + $quantityDelivered = $object->receptions[$line->id]; + print $quantityDelivered; + print ''; + print ''; + if ($line->product_type == Product::TYPE_PRODUCT || ! empty($conf->global->STOCK_SUPPORTS_SERVICES)) + { + if (GETPOST('qtyl'.$indiceAsked, 'int')) $defaultqty=GETPOST('qtyl'.$indiceAsked, 'int'); + print ''; + print ''; + } + else print $langs->trans("NA"); + print ''; + if ($line->product_type == Product::TYPE_PRODUCT || ! empty($conf->global->STOCK_SUPPORTS_SERVICES)) // Type of product need stock change ? + { + // Show warehouse combo list + $ent = "entl".$indiceAsked; + $idl = "idl".$indiceAsked; + $tmpentrepot_id = is_numeric(GETPOST($ent,'int'))?GETPOST($ent,'int'):$warehouse_id; + if ($line->fk_product > 0) + { + print ''; + print $formproduct->selectWarehouses($tmpentrepot_id, 'entl'.$indiceAsked, '', 0 , 0, $line->fk_product, '', 1); + } + } + else + { + print $langs->trans("Service"); + } + print ''; + print $form->select_date($dispatchLines[$indiceAsked]['DLC'],'dlc' . $indiceAsked, '', '', 1, ""); + print ''; + print $form->select_date($dispatchLines[$indiceAsked]['DLUO'],'dluo' . $indiceAsked, '', '', 1, ""); + print '
"; + + print '
'; + + print '
'; + print ''; + print '  '; + print ''; // Cancel for create does not post form if we don't know the backtopage + print '
'; + + print ''; + + print '
'; + } + else + { + dol_print_error($db); + } + } +} +else if ($id || $ref) +/* *************************************************************************** */ +/* */ +/* Edit and view mode */ +/* */ +/* *************************************************************************** */ +{ + $lines = $object->lines; + + $num_prod = count($lines); + + if ($object->id > 0) + { + if (!empty($object->origin) && $object->origin_id > 0) + { + $object->origin = 'CommandeFournisseur'; + $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($object->id, $extralabels); + + $head=reception_prepare_head($object); + dol_fiche_head($head, 'reception', $langs->trans("Reception"), -1, 'reception'); + + $formconfirm=''; + + // Confirm deleteion + if ($action == 'delete') + { + $formconfirm=$form->formconfirm($_SERVER['PHP_SELF'].'?id='.$object->id,$langs->trans('DeleteReception'),$langs->trans("ConfirmDeleteReception",$object->ref),'confirm_delete','',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("ConfirmValidateReception",$numref); + + if (! empty($conf->notification->enabled)) + { + require_once DOL_DOCUMENT_ROOT .'/core/class/notify.class.php'; + $notify=new Notify($db); + $text.='
'; + $text.=$notify->confirmMessage('RECEPTION_VALIDATE',$object->socid, $object); + } + + $formconfirm=$form->formconfirm($_SERVER['PHP_SELF'].'?id='.$object->id,$langs->trans('ValidateReception'),$text,'confirm_valid','',0,1); + } + + // Confirm cancelation + if ($action == 'annuler') + { + $formconfirm=$form->formconfirm($_SERVER['PHP_SELF'].'?id='.$object->id,$langs->trans('CancelReception'),$langs->trans("ConfirmCancelReception",$object->ref),'confirm_cancel','',0,1); + } + + if (! $formconfirm) { + $parameters = array(); + $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 && ! empty($conf->commande->enabled)) + { + $objectsrc=new Commande($db); + $objectsrc->fetch($object->$typeobject->id); + } + if ($typeobject == 'propal' && $object->$typeobject->id && ! empty($conf->propal->enabled)) + { + $objectsrc=new Propal($db); + $objectsrc->fetch($object->$typeobject->id); + } + if ($typeobject == 'CommandeFournisseur' && $object->$typeobject->id && ! empty($conf->fournisseur->enabled)) + { + $objectsrc=new CommandeFournisseur($db); + $objectsrc->fetch($object->$typeobject->id); + } + // Reception card + $linkback = ''.$langs->trans("BackToList").''; + $morehtmlref='
'; + // Ref customer reception + + $morehtmlref.=$form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $user->rights->reception->creer, 'string', '', 0, 1); + $morehtmlref.=$form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $user->rights->reception->creer, 'string', '', null, null, '', 1); + + // Thirdparty + $morehtmlref.='
'.$langs->trans('ThirdParty') . ' : ' . $object->thirdparty->getNomUrl(1); + // Project + if (! empty($conf->projet->enabled)) + { + $langs->load("projects"); + $morehtmlref .= '
' . $langs->trans('Project') . ' '; + if (0) { // Do not change on reception + 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', $maxlength, 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 { + // We don't have project on reception, so we will use the project or source object instead + // TODO Add project on reception + $morehtmlref .= ' : '; + if (! empty($objectsrc->fk_project)) { + $proj = new Project($db); + $proj->fetch($objectsrc->fk_project); + $morehtmlref .= ''; + $morehtmlref .= $proj->ref; + $morehtmlref .= ''; + } else { + $morehtmlref .= ''; + } + } + } + $morehtmlref.='
'; + + $object->picto = 'sending'; + dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref); + + + print '
'; + print '
'; + print '
'; + + print ''; + + // Linked documents + if ($typeobject == 'commande' && $object->$typeobject->id && ! empty($conf->commande->enabled)) + { + print ''; + print '\n"; + print ''; + } + if ($typeobject == 'propal' && $object->$typeobject->id && ! empty($conf->propal->enabled)) + { + print ''; + print '\n"; + print ''; + } + if ($typeobject == 'CommandeFournisseur' && $object->$typeobject->id && ! empty($conf->propal->enabled)) + { + print ''; + print '\n"; + print ''; + } + + // Date creation + print ''; + print '\n"; + print ''; + + // Delivery date planned + print ''; + print ''; + + // Weight + print ''; + + // Width + print ''; + + // Height + print ''; + + // Depth + print ''; + + // Volume + print ''; + 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,'reception'); + print "
'; + print $langs->trans("RefSupplierOrder").''; + print $objectsrc->getNomUrl(1,'reception'); + 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->select_date($object->date_delivery?$object->date_delivery:-1,'liv_',1,1,'',"setdate_livraison",1,0,1); + 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->reception->creer); + print ''; + + if ($action=='edittrueWeight') + { + print '
'; + print ''; + print ''; + print ''; + print ''; + print $formproduct->select_measuring_units("weight_units","weight",$object->weight_units); + print ' '; + print ' '; + print '
'; + } + else + { + print $object->trueWeight; + print ($object->trueWeight && $object->weight_units!='')?' '.measuring_units_string($object->weight_units,"weight"):''; + } + + // Calculated + if ($totalWeight > 0) + { + if (!empty($object->trueWeight)) print ' ('.$langs->trans("SumOfProductWeights").': '; + //print $totalWeight.' '.measuring_units_string(0,"weight"); + 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 ' ('.$langs->trans("Calculated").')'; + if (!empty($object->trueWeight)) print ')'; + } + print '
'.$form->editfieldkey("Width",'trueWidth',$object->trueWidth,$object,$user->rights->reception->creer).''; + print $form->editfieldval("Width",'trueWidth',$object->trueWidth,$object,$user->rights->reception->creer); + print ($object->trueWidth && $object->width_units!='')?' '.measuring_units_string($object->width_units,"size"):''; + print '
'.$form->editfieldkey("Height",'trueHeight',$object->trueHeight,$object,$user->rights->reception->creer).''; + if($action=='edittrueHeight') + { + print '
'; + print ''; + print ''; + print ''; + print ''; + print $formproduct->select_measuring_units("size_units","size",$object->size_units); + print ' '; + print ' '; + print '
'; + } + else + { + print $object->trueHeight; + print ($object->trueHeight && $object->height_units!='')?' '.measuring_units_string($object->height_units,"size"):''; + } + + print '
'.$form->editfieldkey("Depth",'trueDepth',$object->trueDepth,$object,$user->rights->reception->creer).''; + print $form->editfieldval("Depth",'trueDepth',$object->trueDepth,$object,$user->rights->reception->creer); + print ($object->trueDepth && $object->depth_units!='')?' '.measuring_units_string($object->depth_units,"size"):''; + 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 reception volume not defined we use sum of products + if ($calculatedVolume > 0) + { + if ($volumeUnit < 50) + { + //print $calculatedVolume.' '.measuring_units_string($volumeUnit,"volume"); + 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.' '.measuring_units_string($volumeUnit,"volume"); + } + if ($totalVolume > 0) + { + if ($calculatedVolume) print ' ('.$langs->trans("SumOfProductVolumes").': '; + //print $totalVolume.' '.measuring_units_string(0,"volume"); + 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 "
'; + + print '
'; + print '
'; + print '
'; + print '
'; + + print ''; + + // Reception method + print ''; + print ''; + + // Tracking Number + + print ''; + + // Incoterms + if (!empty($conf->incoterm->enabled)) + { + print ''; + print ''; + } + + print "
'; + print ''; + + if ($action != 'editshipping_method_id') print ''; + print '
'; + print $langs->trans('ReceptionMethod'); + print 'id.'">'.img_edit($langs->trans('SetReceptionMethod'),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->reception->creer).''; + print $form->editfieldval("TrackingNumber",'tracking_number',$object->tracking_url,$object,$user->rights->reception->creer,'string',$object->tracking_number); + print '
'; + print '
'; + print $langs->trans('IncotermLabel'); + print ''; + if ($user->rights->reception->creer) print ''.img_edit().''; + else print ' '; + print '
'; + print '
'; + if ($action != 'editincoterm') + { + print $form->textwithpicto($object->display_incoterms(), $object->libelle_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 '
'; + + print '
'; + + + // Lines of products + + if ($action == 'editline') + { + print '
+ + + + + '; + } + print '
'; + + print '
'; + print ''; + print ''; + // # + if (! empty($conf->global->MAIN_VIEW_LINE_NUMBER)) + { + print ''; + } + // Product/Service + print ''; + // Comment + print ''; + // Qty + print ''; + if ($origin && $origin_id > 0) + { + print ''; + } + if ($action == 'editline') + { + $editColspan = 3; + if (empty($conf->stock->enabled)) $editColspan--; + if (empty($conf->productbatch->enabled)) $editColspan--; + print ''; + } + else + { + if ($object->statut <= 1) + { + print ''; + } + else + { + print ''; + } + if (! empty($conf->stock->enabled)) + { + print ''; + } + + if (! empty($conf->productbatch->enabled)) + { + print ''; + } + } + print ''; + print ''; + //print ''; + if ($object->statut == 0) + { + print ''; + print ''; + } + print "\n"; + + $var=false; + + if (! empty($conf->global->MAIN_MULTILANGS) && ! empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) + { + $object->fetch_thirdparty(); + $outputlangs = $langs; + $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(); + + $origin = 'commande_fournisseur'; + + 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.date_start, obj.date_end"; + $sql.= ", ed.rowid as receptionline_id, ed.qty, ed.fk_reception as reception_id, ed.fk_entrepot"; + $sql.= ", e.rowid as reception_id, e.ref as reception_ref, e.date_creation, e.date_valid, e.date_delivery, e.date_reception"; + //if ($conf->livraison_bon->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.tobatch as product_tobatch'; + $sql.= ', p.description as product_desc'; + $sql.= " FROM ".MAIN_DB_PREFIX."commande_fournisseur_dispatch as ed"; + $sql.= ", ".MAIN_DB_PREFIX."reception as e"; + $sql.= ", ".MAIN_DB_PREFIX.$origin."det as obj"; + //if ($conf->livraison_bon->enabled) $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."livraison as l ON l.fk_reception = e.rowid LEFT JOIN ".MAIN_DB_PREFIX."livraisondet as ld ON ld.fk_livraison = 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('reception').")"; + $sql.= " AND obj.fk_commande = ".$origin_id; + $sql.= " AND obj.rowid = ed.fk_commandefourndet"; + $sql.= " AND ed.fk_reception = e.rowid"; + $sql.= " AND ed.fk_reception !=".$object->id; + //if ($filter) $sql.= $filter; + $sql.= " ORDER BY obj.fk_product"; + + dol_syslog("get list of reception 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->receptionline_id]=array('reception_ref'=>$obj->reception_ref, 'reception_id'=>$obj->reception_id, 'warehouse'=>$obj->fk_entrepot, 'qty'=>$obj->qty, 'date_valid'=>$obj->date_valid, 'date_delivery'=>$obj->date_delivery); + } + $i++; + } + } + //var_dump($alreadysent); + } + + // Loop on each product to send/sent + for ($i = 0 ; $i < $num_prod ; $i++) + { + 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 (! empty($conf->global->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]->product->label)?$lines[$i]->product->label:$lines[$i]->product->product_label); + + print '\n"; + } + else + { + print "\n"; + } + + if ($action == 'editline' && $lines[$i]->id == $line_id) + { + print ''; + } + else + { + print ''; + } + + + // Qty ordered + print ''; + + // Qty in other receptions (with reception and warehouse used) + if ($origin && $origin_id > 0) + { + print ''; + + if ($action == 'editline' && $lines[$i]->id == $line_id) + { + // edit mode + print ''; + } + else + { + // Qty to receive or received + print ''; + + // Warehouse source + if (! empty($conf->stock->enabled)) + { + print ''; + } + + // Batch number managment + if (! empty($conf->productbatch->enabled)) + { + if (isset($lines[$i]->batch)) + { + print ''; + print ''; + } else { + print ''; + } + } + } + + // Weight + print ''; + + // Volume + print ''; + + + if ($action == 'editline' && $lines[$i]->id == $line_id) + { + print ''; + print ''; + + // Display lines extrafields + if (! empty($rowExtrafieldsStart)) + { + print $rowExtrafieldsStart; + print $rowExtrafieldsView; + print $rowEnd; + } + } + print ""; + + // Display lines extrafields + if (is_array($extralabelslines) && count($extralabelslines)>0) { + $colspan= empty($conf->productbatch->enabled) ? 8 : 9; + $line = new CommandeFournisseurDispatch($db); + $line->fetch_optionals($lines[$i]->id,$extralabelslines); + print ''; + if ($action == 'editline' && $lines[$i]->id == $line_id) + { + print $line->showOptionals($extrafieldsline, 'edit', array('style'=>$bc[$var], 'colspan'=>$colspan),$indiceAsked); + } + else + { + print $line->showOptionals($extrafieldsline, 'view', array('style'=>$bc[$var], 'colspan'=>$colspan),$indiceAsked); + } + print ''; + } + } + + // TODO Show also lines ordered but not delivered + + print "
 '.$langs->trans("Products").''.$langs->trans("Description").''.$langs->trans("QtyOrdered").''.$langs->trans("QtyInOtherReceptions").''; + if ($object->statut <= 1) + { + print $langs->trans("QtyToReceive").' - '; + } + else + { + print $langs->trans("QtyReceived").' - '; + } + if (! empty($conf->stock->enabled)) + { + print $langs->trans("WarehouseSource").' - '; + } + if (! empty($conf->productbatch->enabled)) + { + print $langs->trans("Batch"); + } + print ''.$langs->trans("QtyToReceive").''.$langs->trans("QtyReceived").''.$langs->trans("WarehouseSource").''.$langs->trans("Batch").''.$langs->trans("CalculatedWeight").''.$langs->trans("CalculatedVolume").''.$langs->trans("Size").'
'.($i+1).''; + + + + $text=$lines[$i]->product->getNomUrl(1); + $text.= ' - '.$label; + $description=(! empty($conf->global->PRODUIT_DESC_IN_FORM)?'':dol_htmlentitiesbr($lines[$i]->product->description)); + print $form->textwithtooltip($text,$description,3,'','',$i); + print_date_range($lines[$i]->date_start,$lines[$i]->date_end); + if (! empty($conf->global->PRODUIT_DESC_IN_FORM)) + { + print (! empty($lines[$i]->product->description) && $lines[$i]->description!=$lines[$i]->product->description)?'
'.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 "'.$lines[$i]->comment.''.$lines[$i]->qty_asked.''; + foreach ($alreadysent as $key => $val) + { + if ($lines[$i]->fk_commandefourndet == $key) + { + $j = 0; + foreach($val as $receptionline_id=> $receptionline_var) + { + if ($receptionline_var['reception_id'] == $lines[$i]->fk_reception) continue; // We want to show only "other receptions" + + $j++; + if ($j > 1) print '
'; + $reception_static->fetch($receptionline_var['reception_id']); + print $reception_static->getNomUrl(1); + print ' - '.$receptionline_var['qty']; + + $htmltext=$langs->trans("DateValidation").' : '.(empty($receptionline_var['date_valid'])?$langs->trans("Draft"):dol_print_date($receptionline_var['date_valid'], 'dayhour')); + if (! empty($conf->stock->enabled) && $receptionline_var['warehouse'] > 0) + { + $warehousestatic->fetch($receptionline_var['warehouse']); + $htmltext .= '
'.$langs->trans("From").' : '.$warehousestatic->getNomUrl(1); + } + print ' '.$form->textwithpicto('', $htmltext, 1); + } + } + } + } + print '
'; + if (! empty($conf->stock->enabled)) + { + if ($lines[$i]->fk_product > 0) + { + print ''; + print ''; + // Qty to receive or received + print ''; + // Warehouse source + print ''; + // Batch number managment + if ($conf->productbatch->enabled && !empty($lines[$i]->product->status_batch)) + { + print ''; + } + print ''; + } + else + { + print ''; + print ''; + // Qty to receive or received + print ''; + // Warehouse source + print ''; + // Batch number managment + print ''; + print ''; + } + } + print '
' . '' . '' . $formproduct->selectWarehouses($lines[$i]->fk_entrepot, 'entl'.$line_id, '', 1, 0, $lines[$i]->fk_product, '', 1). '
'; + print $langs->trans('EatByDate').' : '; + print $form->select_date($lines[$i]->eatby,'dlc' .$line_id , '', '', 1, ""). '
'; + print $langs->trans('SellByDate').' : '; + print $form->select_date($lines[$i]->sellby,'dluo' .$line_id , '', '', 1, ""); + print '
' . '' . '' . '' . '
'.$lines[$i]->qty.''; + + if ($lines[$i]->fk_entrepot > 0) + { + $entrepot = new Entrepot($db); + $entrepot->fetch($lines[$i]->fk_entrepot); + print $entrepot->getNomUrl(1); + } + + print ''; + $detail =''; + if ($lines[$i]->product->status_batch) + { + $detail.= $langs->trans("Batch").': '.$lines[$i]->batch; + $detail.= ' - '.$langs->trans("SellByDate").': '.dol_print_date($lines[$i]->sellby,"day"); + $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 '
'; + if ($lines[$i]->fk_product_type == Product::TYPE_PRODUCT) print $lines[$i]->product->weight*$lines[$i]->qty.' '.measuring_units_string($lines[$i]->product->weight_units,"weight"); + else print ' '; + print ''; + if ($lines[$i]->fk_product_type == Product::TYPE_PRODUCT) print $lines[$i]->product->volume*$lines[$i]->qty.' '.measuring_units_string($lines[$i]->product->volume_units,"volume"); + else print ' '; + print ''; + print '
'; + print '
'; + } + else if ($object->statut == 0) + { + // edit-delete buttons + print '
'; + print 'id . '">' . img_edit() . ''; + print ''; + print 'id . '">' . img_delete() . ''; + print '
\n"; + print '
'; + } + + + dol_fiche_end(); + + + $object->fetchObjectLinked($object->id,$object->element); + + + /* + * Boutons actions + */ + + if (($user->societe_id == 0) && ($action!='presend')) + { + print '
'; + + $parameters = array(); + $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + if (empty($reshook)) + { + + if ($object->statut == Reception::STATUS_DRAFT && $num_prod > 0) + { + if ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->reception->creer)) + || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->reception->reception_advance->validate))) + { + print ''.$langs->trans("Validate").''; + } + else + { + print ''.$langs->trans("Validate").''; + } + } + // Edit + if ($object->statut == Reception::STATUS_VALIDATED && $user->rights->reception->creer) { + print ''; + } + + // TODO add alternative status + // 0=draft, 1=validated, 2=billed, we miss a status "delivered" (only available on order) + if ($object->statut == Reception::STATUS_CLOSED && $user->rights->reception->creer) + { + if (! empty($conf->facture->enabled) && ! empty($conf->global->WORKFLOW_BILL_ON_RECEPTION)) // Quand l'option est on, il faut avoir le bouton en plus et non en remplacement du Close ? + { + print ''.$langs->trans("ClassifyUnbilled").''; + } + else + { + print ''.$langs->trans("ReOpen").''; + } + } + + // Send + if ($object->statut > 0) + { + if (empty($conf->global->MAIN_USE_ADVANCED_PERMS) || $user->rights->reception->reception_advance->send) + { + print ''.$langs->trans('SendByMail').''; + } + else print ''.$langs->trans('SendByMail').''; + } + + // Create bill + if (! empty($conf->fournisseur->enabled) && ($object->statut == Reception::STATUS_VALIDATED || $object->statut == Reception::STATUS_CLOSED)) + { + if ($user->rights->fournisseur->facture->creer) + { + // TODO show button only if (! empty($conf->global->WORKFLOW_BILL_ON_RECEPTION)) + // If we do that, we must also make this option official. + print ''.$langs->trans("CreateBill").''; + } + } + + + // Close + if ($object->statut == Reception::STATUS_VALIDATED) + { + if ($user->rights->reception->creer && $object->statut > 0 && ! $object->billed) + { + $label="Close"; $paramaction='classifyclosed'; // = Transferred/Received + // Label here should be "Close" or "ClassifyBilled" if we decided to make bill on receptions instead of orders + if (! empty($conf->fournisseur->enabled) && ! empty($conf->global->WORKFLOW_BILL_ON_RECEPTION)) // Quand l'option est on, il faut avoir le bouton en plus et non en remplacement du Close ? + { + $label="ClassifyBilled"; + $paramaction='classifybilled'; + } + print ''.$langs->trans($label).''; + } + } + + if ($user->rights->reception->supprimer) + { + print ''.$langs->trans("Delete").''; + } + } + + print '
'; + } + + + /* + * Documents generated + */ + + if ($action != 'presend' && $action != 'editline') + { + print '
'; + + $objectref = dol_sanitizeFileName($object->ref); + $filedir = $conf->reception->dir_output . "/" .$objectref; + + $urlsource = $_SERVER["PHP_SELF"]."?id=".$object->id; + + $genallowed=$user->rights->reception->lire; + $delallowed=$user->rights->reception->creer; + + print $formfile->showdocuments('reception',$objectref,$filedir,$urlsource,$genallowed,$delallowed,$object->modelpdf,1,0,0,28,0,'','','',$soc->default_lang); + + // Show links to link elements + //$linktoelem = $form->showLinkToObjectBlock($object, null, array('order')); + $somethingshown = $form->showLinkedObjectBlock($object, ''); + + print '
'; + } + + if ($action == 'presend') + { + $ref = dol_sanitizeFileName($object->ref); + include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + $fileparams = dol_most_recent_file($conf->reception->dir_output . '/' . $ref, preg_quote($ref, '/').'[^\-]+'); + $file=$fileparams['fullname']; + // Define output language + $outputlangs = $langs; + $newlang = ''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && ! empty($_REQUEST['lang_id'])) + $newlang = $_REQUEST['lang_id']; + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) + $newlang = $object->thirdparty->default_lang; + if (!empty($newlang)) + { + $outputlangs = new Translate('', $conf); + $outputlangs->setDefaultLang($newlang); + $outputlangs->load('receptions'); + } + // Build document if it not exists + if (! $file || ! is_readable($file)) + { + $result = $object->generateDocument(GETPOST('model')?GETPOST('model'):$object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + if ($result <= 0) + { + dol_print_error($db,$object->error,$object->errors); + exit; + } + $fileparams = dol_most_recent_file($conf->reception->dir_output . '/reception/' . $ref, preg_quote($ref, '/').'[^\-]+'); + $file=$fileparams['fullname']; + } + print '
'; + print '
'; + print '
'; + print load_fiche_titre($langs->trans('SendReceptionByEMail')); + dol_fiche_head(''); + // Cree l'objet formulaire mail + include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php'; + $formmail = new FormMail($db); + $formmail->param['langsmodels']=(empty($newlang)?$langs->defaultlang:$newlang); + $formmail->fromtype = (GETPOST('fromtype')?GETPOST('fromtype'):(!empty($conf->global->MAIN_MAIL_DEFAULT_FROMTYPE)?$conf->global->MAIN_MAIL_DEFAULT_FROMTYPE:'user')); + if($formmail->fromtype === 'user'){ + $formmail->fromid = $user->id; + } + $formmail->trackid='shi'.$object->id; + if (! empty($conf->global->MAIN_EMAIL_ADD_TRACK_ID) && ($conf->global->MAIN_EMAIL_ADD_TRACK_ID & 2)) // If bit 2 is set + { + include DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; + $formmail->frommail=dolAddEmailTrackId($formmail->frommail, 'shi'.$object->id); + } + $formmail->withfrom=1; + $liste=array(); + foreach ($object->thirdparty->thirdparty_and_contact_email_array(1) as $key=>$value) $liste[$key]=$value; + $formmail->withto=GETPOST("sendto")?GETPOST("sendto"):$liste; + $formmail->withtocc=$liste; + $formmail->withtoccc=$conf->global->MAIN_EMAIL_USECCC; + $formmail->withtopic=$outputlangs->trans('SendReceptionRef','__RECEPTIONREF__'); + $formmail->withfile=2; + $formmail->withbody=1; + $formmail->withdeliveryreceipt=1; + $formmail->withcancel=1; + // Tableau des substitutions + $formmail->setSubstitFromObject($object,$langs); + $formmail->substit['__RECEPTIONREF__']=$object->ref; + $formmail->substit['__RECEPTIONTRACKNUM__']=$object->tracking_number; + $formmail->substit['__RECEPTIONTRACKNUMURL__']=$object->tracking_url; + //Find the good contact adress + if ($typeobject == 'commande' && $object->$typeobject->id && ! empty($conf->commande->enabled)) { + $objectsrc=new Commande($db); + $objectsrc->fetch($object->$typeobject->id); + } + if ($typeobject == 'propal' && $object->$typeobject->id && ! empty($conf->propal->enabled)) { + $objectsrc=new Propal($db); + $objectsrc->fetch($object->$typeobject->id); + } + $custcontact=''; + $contactarr=array(); + if (is_object($objectsrc)) // For the case the reception was created without orders + { + $contactarr=$objectsrc->liste_contact(-1,'external'); + } + if (is_array($contactarr) && count($contactarr)>0) { + foreach($contactarr as $contact) { + if ($contact['libelle']==$langs->trans('TypeContact_commande_external_CUSTOMER')) { + require_once DOL_DOCUMENT_ROOT . '/contact/class/contact.class.php'; + $contactstatic=new Contact($db); + $contactstatic->fetch($contact['id']); + $custcontact=$contactstatic->getFullName($langs,1); + } + } + if (!empty($custcontact)) { + $formmail->substit['__CONTACTCIVNAME__']=$custcontact; + } + } + // Tableau des parametres complementaires + $formmail->param['action']='send'; + $formmail->param['models']='reception_send'; + $formmail->param['models_id']=GETPOST('modelmailselected','int'); + $formmail->param['receptionid']=$object->id; + $formmail->param['returnurl']=$_SERVER["PHP_SELF"].'?id='.$object->id; + // Init list of files + if (GETPOST("mode")=='init') + { + $formmail->clear_attached_files(); + $formmail->add_attached_files($file,basename($file),dol_mimetype($file)); + } + // Show form + print $formmail->get_form(); + dol_fiche_end(); + } +} + + +llxFooter(); + +$db->close(); diff --git a/htdocs/reception/class/index.html b/htdocs/reception/class/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/reception/class/reception.class.php b/htdocs/reception/class/reception.class.php new file mode 100644 index 00000000000..fd5847e45ee --- /dev/null +++ b/htdocs/reception/class/reception.class.php @@ -0,0 +1,1975 @@ + + * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2007 Franky Van Liedekerke + * Copyright (C) 2006-2012 Laurent Destailleur + * Copyright (C) 2011-2017 Juanjo Menent + * Copyright (C) 2013 Florian Henry + * Copyright (C) 2014 Cedric GROSS + * Copyright (C) 2014-2015 Marcos García + * Copyright (C) 2014-2015 Francis Appels + * Copyright (C) 2015 Claudio Aschieri + * Copyright (C) 2016 Ferran Marcet + * Copyright (C) 2018 Quentin Vial-Gouteyron + * + * 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/reception/class/reception.class.php + * \ingroup reception + * \brief Fichier de la classe de gestion des receptions + */ + +require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php'; +require_once DOL_DOCUMENT_ROOT."/core/class/commonobjectline.class.php"; +if (! empty($conf->propal->enabled)) require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php'; +if (! empty($conf->commande->enabled)) require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php'; + + +/** + * Class to manage receptions + */ +class Reception extends CommonObject +{ + public $element="reception"; + public $fk_element="fk_reception"; + public $table_element="reception"; + public $table_element_line="commande_fournisseur_dispatch"; + protected $ismultientitymanaged = 1; // 0=No test on entity, 1=Test with field entity, 2=Test with link by societe + public $picto = 'reception'; + + var $socid; + var $ref_supplier; + var $ref_int; + var $brouillon; + var $entrepot_id; + var $lines=array(); + var $tracking_number; + var $tracking_url; + var $billed; + var $model_pdf; + + var $trueWeight; + var $weight_units; + var $trueWidth; + var $width_units; + var $trueHeight; + var $height_units; + var $trueDepth; + var $depth_units; + // A denormalized value + var $trueSize; + + var $date_delivery; // Date delivery planed + + + /** + * Effective delivery date + * @var int + */ + public $date_reception; + var $date_creation; + var $date_valid; + + var $meths; + var $listmeths; // List of carriers + + + const STATUS_DRAFT = 0; + const STATUS_VALIDATED = 1; + const STATUS_CLOSED = 2; + + + + /** + * Constructor + * + * @param DoliDB $db Database handler + */ + function __construct($db) + { + $this->db = $db; + $this->lines = array(); + $this->products = array(); + + // List of long language codes for status + $this->statuts = array(); + $this->statuts[-1] = 'StatusReceptionCanceled'; + $this->statuts[0] = 'StatusReceptionDraft'; + $this->statuts[1] = 'StatusReceptionValidated'; + $this->statuts[2] = 'StatusReceptionProcessed'; + } + + /** + * Return next contract ref + * + * @param Societe $soc Thirdparty object + * @return string Free reference for contract + */ + function getNextNumRef($soc) + { + global $langs, $conf; + $langs->load("receptions"); + + if (!empty($conf->global->RECEPTION_ADDON_NUMBER)) + { + $mybool = false; + + $file = $conf->global->RECEPTION_ADDON_NUMBER.".php"; + $classname = $conf->global->RECEPTION_ADDON_NUMBER; + + // Include file with class + $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']); + + foreach ($dirmodels as $reldir) { + + $dir = dol_buildpath($reldir."core/modules/reception/"); + + // Load file with numbering class (if found) + $mybool|=@include_once $dir.$file; + } + + if (! $mybool) + { + dol_print_error('',"Failed to include file ".$file); + return ''; + } + + $obj = new $classname(); + + $numref = ""; + $numref = $obj->getNextValue($soc,$this); + + if ( $numref != "") + { + return $numref; + } + else + { + dol_print_error($this->db,get_class($this)."::getNextNumRef ".$obj->error); + return ""; + } + } + else + { + print $langs->trans("Error")." ".$langs->trans("Error_RECEPTION_ADDON_NUMBER_NotDefined"); + return ""; + } + } + + /** + * Create reception en base + * + * @param User $user Objet du user qui cree + * @param int $notrigger 1=Does not execute triggers, 0= execute triggers + * @return int <0 si erreur, id reception creee si ok + */ + function create($user, $notrigger=0) + { + global $conf, $hookmanager; + + $now=dol_now(); + + require_once DOL_DOCUMENT_ROOT .'/product/stock/class/mouvementstock.class.php'; + $error = 0; + + // Clean parameters + $this->brouillon = 1; + $this->tracking_number = dol_sanitizeFileName($this->tracking_number); + if (empty($this->fk_project)) $this->fk_project = 0; + + $this->user = $user; + + + $this->db->begin(); + + $sql = "INSERT INTO ".MAIN_DB_PREFIX."reception ("; + $sql.= "ref"; + $sql.= ", entity"; + $sql.= ", ref_supplier"; + $sql.= ", ref_int"; + $sql.= ", date_creation"; + $sql.= ", fk_user_author"; + $sql.= ", date_reception"; + $sql.= ", date_delivery"; + $sql.= ", fk_soc"; + $sql.= ", fk_projet"; + $sql.= ", fk_shipping_method"; + $sql.= ", tracking_number"; + $sql.= ", weight"; + $sql.= ", size"; + $sql.= ", width"; + $sql.= ", height"; + $sql.= ", weight_units"; + $sql.= ", size_units"; + $sql.= ", note_private"; + $sql.= ", note_public"; + $sql.= ", model_pdf"; + $sql.= ", fk_incoterms, location_incoterms"; + $sql.= ") VALUES ("; + $sql.= "'(PROV)'"; + $sql.= ", ".$conf->entity; + $sql.= ", ".($this->ref_supplier?"'".$this->db->escape($this->ref_supplier)."'":"null"); + $sql.= ", ".($this->ref_int?"'".$this->db->escape($this->ref_int)."'":"null"); + $sql.= ", '".$this->db->idate($now)."'"; + $sql.= ", ".$user->id; + $sql.= ", ".($this->date_reception>0?"'".$this->db->idate($this->date_reception)."'":"null"); + $sql.= ", ".($this->date_delivery>0?"'".$this->db->idate($this->date_delivery)."'":"null"); + $sql.= ", ".$this->socid; + $sql.= ", ".$this->fk_project; + $sql.= ", ".($this->shipping_method_id>0?$this->shipping_method_id:"null"); + $sql.= ", '".$this->db->escape($this->tracking_number)."'"; + $sql.= ", ".$this->weight; + $sql.= ", ".$this->sizeS; // TODO Should use this->trueDepth + $sql.= ", ".$this->sizeW; // TODO Should use this->trueWidth + $sql.= ", ".$this->sizeH; // TODO Should use this->trueHeight + $sql.= ", ".$this->weight_units; + $sql.= ", ".$this->size_units; + $sql.= ", ".(!empty($this->note_private)?"'".$this->db->escape($this->note_private)."'":"null"); + $sql.= ", ".(!empty($this->note_public)?"'".$this->db->escape($this->note_public)."'":"null"); + $sql.= ", ".(!empty($this->model_pdf)?"'".$this->db->escape($this->model_pdf)."'":"null"); + $sql.= ", ".(int) $this->fk_incoterms; + $sql.= ", '".$this->db->escape($this->location_incoterms)."'"; + $sql.= ")"; + + dol_syslog(get_class($this)."::create", LOG_DEBUG); + + $resql=$this->db->query($sql); + + if ($resql) + { + $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."reception"); + + $sql = "UPDATE ".MAIN_DB_PREFIX."reception"; + $sql.= " SET ref = '(PROV".$this->id.")'"; + $sql.= " WHERE rowid = ".$this->id; + + dol_syslog(get_class($this)."::create", LOG_DEBUG); + if ($this->db->query($sql)) + { + // Insertion des lignes + $num=count($this->lines); + for ($i = 0; $i < $num; $i++) + { + $this->lines[$i]->fk_reception = $this->id; + + if (! $this->lines[$i]->create($user) > 0) + { + $error++; + } + } + + if (! $error && $this->id && $this->origin_id) + { + $ret = $this->add_object_linked(); + if (!$ret) + { + $error++; + } + } + + // Actions on extra fields (by external module or standard code) + // TODO le hook fait double emploi avec le trigger !! + $hookmanager->initHooks(array('receptiondao')); + $parameters=array('socid'=>$this->id); + $reshook=$hookmanager->executeHooks('insertExtraFields',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks + if (empty($reshook)) + { + if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used + { + $result=$this->insertExtraFields(); + if ($result < 0) + { + $error++; + } + } + } + else if ($reshook < 0) $error++; + + if (! $error && ! $notrigger) + { + // Call trigger + $result=$this->call_trigger('RECEPTION_CREATE',$user); + if ($result < 0) { $error++; } + // End call triggers + + if (! $error) + { + $this->db->commit(); + return $this->id; + } + else + { + foreach($this->errors as $errmsg) + { + dol_syslog(get_class($this)."::create ".$errmsg, LOG_ERR); + $this->error.=($this->error?', '.$errmsg:$errmsg); + } + $this->db->rollback(); + return -1*$error; + } + } + else + { + $error++; + $this->error=$this->db->lasterror()." - sql=$sql"; + $this->db->rollback(); + return -3; + } + } + else + { + $error++; + $this->error=$this->db->lasterror()." - sql=$sql"; + $this->db->rollback(); + return -2; + } + } + else + { + $error++; + $this->error=$this->db->error()." - sql=$sql"; + $this->db->rollback(); + return -1; + } + } + + + + /** + * Get object and lines from database + * + * @param int $id Id of object to load + * @param string $ref Ref of object + * @param string $ref_ext External reference of object + * @param string $ref_int Internal reference of other object + * @return int >0 if OK, 0 if not found, <0 if KO + */ + function fetch($id, $ref='', $ref_ext='', $ref_int='') + { + global $conf; + + // Check parameters + if (empty($id) && empty($ref) && empty($ref_ext) && empty($ref_int)) return -1; + + $sql = "SELECT e.rowid, e.ref, e.fk_soc as socid, e.date_creation, e.ref_supplier, e.ref_ext, e.ref_int, e.fk_user_author, e.fk_statut"; + $sql.= ", e.weight, e.weight_units, e.size, e.size_units, e.width, e.height"; + $sql.= ", e.date_reception as date_reception, e.model_pdf, e.date_delivery"; + $sql.= ", e.fk_shipping_method, e.tracking_number"; + $sql.= ", el.fk_source as origin_id, el.sourcetype as origin"; + $sql.= ", e.note_private, e.note_public"; + $sql.= ', e.fk_incoterms, e.location_incoterms'; + $sql.= ', i.libelle as libelle_incoterms'; + $sql.= " FROM ".MAIN_DB_PREFIX."reception as e"; + $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."element_element as el ON el.fk_target = e.rowid AND el.targettype = '".$this->db->escape($this->element)."'"; + $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_incoterms as i ON e.fk_incoterms = i.rowid'; + $sql.= " WHERE e.entity IN (".getEntity('reception').")"; + if ($id) $sql.= " AND e.rowid=".$id; + if ($ref) $sql.= " AND e.ref='".$this->db->escape($ref)."'"; + if ($ref_ext) $sql.= " AND e.ref_ext='".$this->db->escape($ref_ext)."'"; + if ($ref_int) $sql.= " AND e.ref_int='".$this->db->escape($ref_int)."'"; + + dol_syslog(get_class($this)."::fetch", LOG_DEBUG); + $result = $this->db->query($sql); + if ($result) + { + if ($this->db->num_rows($result)) + { + $obj = $this->db->fetch_object($result); + + $this->id = $obj->rowid; + $this->ref = $obj->ref; + $this->socid = $obj->socid; + $this->ref_supplier = $obj->ref_supplier; + $this->ref_ext = $obj->ref_ext; + $this->ref_int = $obj->ref_int; + $this->statut = $obj->fk_statut; + $this->user_author_id = $obj->fk_user_author; + $this->date_creation = $this->db->jdate($obj->date_creation); + $this->date = $this->db->jdate($obj->date_reception); // TODO deprecated + $this->date_reception = $this->db->jdate($obj->date_reception); // TODO deprecated + $this->date_reception = $this->db->jdate($obj->date_reception); // Date real + $this->date_delivery = $this->db->jdate($obj->date_delivery); // Date planed + $this->fk_delivery_address = $obj->fk_address; + $this->modelpdf = $obj->model_pdf; + $this->shipping_method_id = $obj->fk_shipping_method; + $this->tracking_number = $obj->tracking_number; + $this->origin = ($obj->origin?$obj->origin:'commande'); // For compatibility + $this->origin_id = $obj->origin_id; + $this->billed = ($obj->fk_statut==2?1:0); + + $this->trueWeight = $obj->weight; + $this->weight_units = $obj->weight_units; + + $this->trueWidth = $obj->width; + $this->width_units = $obj->size_units; + $this->trueHeight = $obj->height; + $this->height_units = $obj->size_units; + $this->trueDepth = $obj->size; + $this->depth_units = $obj->size_units; + + $this->note_public = $obj->note_public; + $this->note_private = $obj->note_private; + + // A denormalized value + $this->trueSize = $obj->size."x".$obj->width."x".$obj->height; + $this->size_units = $obj->size_units; + + //Incoterms + $this->fk_incoterms = $obj->fk_incoterms; + $this->location_incoterms = $obj->location_incoterms; + $this->libelle_incoterms = $obj->libelle_incoterms; + + $this->db->free($result); + + if ($this->statut == 0) $this->brouillon = 1; + + $file = $conf->reception->dir_output . "/" .get_exdir($this->id, 2, 0, 0, $this, 'reception') . "/" . $this->id.".pdf"; + $this->pdf_filename = $file; + + // Tracking url + $this->GetUrlTrackingStatus($obj->tracking_number); + + /* + * Thirparty + */ + $result=$this->fetch_thirdparty(); + + + // Retrieve all extrafields for reception + // fetch optionals attributes and labels + require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; + $extrafields=new ExtraFields($this->db); + $extralabels=$extrafields->fetch_name_optionals_label($this->table_element,true); + $this->fetch_optionals($this->id,$extralabels); + + /* + * Lines + */ + $result=$this->fetch_lines(); + if ($result < 0) + { + return -3; + } + + return 1; + } + else + { + dol_syslog(get_class($this).'::Fetch no reception found', LOG_ERR); + $this->error='Delivery with id '.$id.' not found'; + return 0; + } + } + else + { + $this->error=$this->db->error(); + return -1; + } + } + + /** + * Validate object and update stock if option enabled + * + * @param User $user Object user that validate + * @param int $notrigger 1=Does not execute triggers, 0= execute triggers + * @return int <0 if OK, >0 if KO + */ + function valid($user, $notrigger=0) + { + global $conf, $langs; + + require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + + dol_syslog(get_class($this)."::valid"); + + // Protection + if ($this->statut) + { + dol_syslog(get_class($this)."::valid no draft status", LOG_WARNING); + return 0; + } + + if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->reception->creer)) + || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->reception->reception_advance->validate)))) + { + $this->error='Permission denied'; + dol_syslog(get_class($this)."::valid ".$this->error, LOG_ERR); + return -1; + } + + $this->db->begin(); + + $error = 0; + + // Define new ref + $soc = new Societe($this->db); + $soc->fetch($this->socid); + + + // Define new ref + if (! $error && (preg_match('/^[\(]?PROV/i', $this->ref) || empty($this->ref))) // empty should not happened, but when it occurs, the test save life + { + $numref = $this->getNextNumRef($soc); + } + else { + $numref = $this->ref; + } + + $this->newref = $numref; + + $now=dol_now(); + + // Validate + $sql = "UPDATE ".MAIN_DB_PREFIX."reception SET"; + $sql.= " ref='".$numref."'"; + $sql.= ", fk_statut = 1"; + $sql.= ", date_valid = '".$this->db->idate($now)."'"; + $sql.= ", fk_user_valid = ".$user->id; + $sql.= " WHERE rowid = ".$this->id; + dol_syslog(get_class($this)."::valid update reception", LOG_DEBUG); + $resql=$this->db->query($sql); + if (! $resql) + { + $this->error=$this->db->lasterror(); + $error++; + } + + // If stock increment is done on reception (recommanded choice) + if (! $error && ! empty($conf->stock->enabled) && ! empty($conf->global->STOCK_CALCULATE_ON_RECEPTION)) + { + require_once DOL_DOCUMENT_ROOT.'/product/stock/class/mouvementstock.class.php'; + + $langs->load("agenda"); + + // Loop on each product line to add a stock movement + // TODO in future, reception lines may not be linked to order line + $sql = "SELECT cd.fk_product, cd.subprice,"; + $sql.= " ed.rowid, ed.qty, ed.fk_entrepot,"; + $sql.= " ed.eatby, ed.sellby, ed.batch"; + $sql.= " FROM ".MAIN_DB_PREFIX."commande_fournisseurdet as cd,"; + $sql.= " ".MAIN_DB_PREFIX."commande_fournisseur_dispatch as ed"; + $sql.= " WHERE ed.fk_reception = ".$this->id; + $sql.= " AND cd.rowid = ed.fk_commandefourndet"; + + + + dol_syslog(get_class($this)."::valid select details", LOG_DEBUG); + $resql=$this->db->query($sql); + if ($resql) + { + $cpt = $this->db->num_rows($resql); + for ($i = 0; $i < $cpt; $i++) + { + $obj = $this->db->fetch_object($resql); + + $qty = $obj->qty; + + if ($qty <= 0) continue; + dol_syslog(get_class($this)."::valid movement index ".$i." ed.rowid=".$obj->rowid." edb.rowid=".$obj->edbrowid); + + //var_dump($this->lines[$i]); + $mouvS = new MouvementStock($this->db); + $mouvS->origin = &$this; + + if (empty($obj->batch)) + { + // line without batch detail + + // We decrement stock of product (and sub-products) -> update table llx_product_stock (key of this table is fk_product+fk_entrepot) and add a movement record. + $result=$mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, $qty, $obj->subprice, $langs->trans("ReceptionValidatedInDolibarr",$numref)); + if ($result < 0) { + $error++; + $this->errors[]=$mouvS->error; + $this->errors = array_merge($this->errors, $mouvS->errors); + break; + } + } + else + { + // line with batch detail + + // We decrement stock of product (and sub-products) -> update table llx_product_stock (key of this table is fk_product+fk_entrepot) and add a movement record. + // Note: ->fk_origin_stock = id into table llx_product_batch (may be rename into llx_product_stock_batch in another version) + $result=$mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, $qty, $obj->subprice, $langs->trans("ReceptionValidatedInDolibarr",$numref), $this->db->jdate($obj->eatby), $this->db->jdate($obj->sellby), $obj->batch); + if ($result < 0) { + $error++; + $this->errors[]=$mouvS->error; + $this->errors = array_merge($this->errors, $mouvS->errors); + break; + } + } + } + } + else + { + $this->db->rollback(); + $this->error=$this->db->error(); + return -2; + } + } + + // Change status of order to "reception in process" + $ret = $this->setStatut(4, $this->origin_id, 'commande_fournisseur'); + + if (! $ret) + { + $error++; + } + + if (! $error && ! $notrigger) + { + // Call trigger + $result=$this->call_trigger('RECEPTION_VALIDATE',$user); + if ($result < 0) { $error++; } + // End call triggers + } + + if (! $error) + { + $this->oldref = $this->ref; + + // Rename directory if dir was a temporary ref + if (preg_match('/^[\(]?PROV/i', $this->ref)) + { + // On renomme repertoire ($this->ref = ancienne ref, $numfa = nouvelle ref) + // in order not to lose the attached files + $oldref = dol_sanitizeFileName($this->ref); + $newref = dol_sanitizeFileName($numref); + $dirsource = $conf->reception->dir_output.'/'.$oldref; + $dirdest = $conf->reception->dir_output.'/'.$newref; + if (file_exists($dirsource)) + { + dol_syslog(get_class($this)."::valid rename dir ".$dirsource." into ".$dirdest); + + if (@rename($dirsource, $dirdest)) + { + dol_syslog("Rename ok"); + // Rename docs starting with $oldref with $newref + $listoffiles=dol_dir_list($conf->reception->dir_output.'/'.$newref, 'files', 1, '^'.preg_quote($oldref,'/')); + foreach($listoffiles as $fileentry) + { + $dirsource=$fileentry['name']; + $dirdest=preg_replace('/^'.preg_quote($oldref,'/').'/',$newref, $dirsource); + $dirsource=$fileentry['path'].'/'.$dirsource; + $dirdest=$fileentry['path'].'/'.$dirdest; + @rename($dirsource, $dirdest); + } + } + } + } + } + + // Set new ref and current status + if (! $error) + { + $this->ref = $numref; + $this->statut = 1; + } + + if (! $error) + { + $this->db->commit(); + return 1; + } + else + { + foreach($this->errors as $errmsg) + { + dol_syslog(get_class($this)."::valid ".$errmsg, LOG_ERR); + $this->error.=($this->error?', '.$errmsg:$errmsg); + } + $this->db->rollback(); + return -1*$error; + } + } + + + + /** + * Add an reception line. + * If STOCK_WAREHOUSE_NOT_REQUIRED_FOR_RECEPTIONS is set, you can add a reception line, with no stock source defined + * If STOCK_MUST_BE_ENOUGH_FOR_RECEPTION is not set, you can add a reception line, even if not enough into stock + * + * @param int $entrepot_id Id of warehouse + * @param int $id Id of source line (supplier order line) + * @param int $qty Quantity + * @param array $array_options extrafields array + * @param string $comment Comment for stock movement + * @param date $eatby eat-by date + * @param date $sellby sell-by date + * @param string $batch Lot number + * @return int <0 if KO, >0 if OK + */ + function addline($entrepot_id, $id, $qty, $array_options=0, $comment='', $eatby='', $sellby='', $batch='') + { + global $conf, $langs, $user; + + $num = count($this->lines); + $line = new CommandeFournisseurDispatch($this->db); + + $line->fk_entrepot = $entrepot_id; + $line->fk_commandefourndet = $id; + $line->qty = $qty; + + $supplierorderline = new CommandeFournisseurLigne($this->db); + $supplierorderline->fetch($id); + + if (! empty($conf->stock->enabled) && ! empty($supplierorderline->fk_product)) + { + $fk_product = $supplierorderline->fk_product; + + if (! ($entrepot_id > 0) && empty($conf->global->STOCK_WAREHOUSE_NOT_REQUIRED_FOR_RECEPTIONS)) + { + $langs->load("errors"); + $this->error=$langs->trans("ErrorWarehouseRequiredIntoReceptionLine"); + return -1; + } + } + + // extrafields + if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED) && is_array($array_options) && count($array_options)>0) // For avoid conflicts if trigger used + $line->array_options = $array_options; + + $line->fk_product = $fk_product; + $line->fk_commande = $supplierorderline->fk_commande ; + $line->fk_user = $user->id ; + $line->comment = $comment; + $line->batch = $batch; + $line->eatby = $eatby; + $line->sellby = $sellby; + $line->status=1; + $line->fk_reception=$this->id; + + $this->lines[$num] = $line; + } + + + /** + * Update database + * + * @param User $user User that modify + * @param int $notrigger 0=launch triggers after, 1=disable triggers + * @return int <0 if KO, >0 if OK + */ + function update($user=null, $notrigger=0) + { + global $conf; + $error=0; + + // Clean parameters + + if (isset($this->ref)) $this->ref=trim($this->ref); + if (isset($this->entity)) $this->entity=trim($this->entity); + if (isset($this->ref_supplier)) $this->ref_supplier=trim($this->ref_supplier); + if (isset($this->socid)) $this->socid=trim($this->socid); + if (isset($this->fk_user_author)) $this->fk_user_author=trim($this->fk_user_author); + if (isset($this->fk_user_valid)) $this->fk_user_valid=trim($this->fk_user_valid); + if (isset($this->fk_delivery_address)) $this->fk_delivery_address=trim($this->fk_delivery_address); + if (isset($this->shipping_method_id)) $this->shipping_method_id=trim($this->shipping_method_id); + if (isset($this->tracking_number)) $this->tracking_number=trim($this->tracking_number); + if (isset($this->statut)) $this->statut=(int) $this->statut; + if (isset($this->trueDepth)) $this->trueDepth=trim($this->trueDepth); + if (isset($this->trueWidth)) $this->trueWidth=trim($this->trueWidth); + if (isset($this->trueHeight)) $this->trueHeight=trim($this->trueHeight); + if (isset($this->size_units)) $this->size_units=trim($this->size_units); + if (isset($this->weight_units)) $this->weight_units=trim($this->weight_units); + if (isset($this->trueWeight)) $this->weight=trim($this->trueWeight); + if (isset($this->note_private)) $this->note=trim($this->note_private); + if (isset($this->note_public)) $this->note=trim($this->note_public); + if (isset($this->modelpdf)) $this->modelpdf=trim($this->modelpdf); + + + // Check parameters + // Put here code to add control on parameters values + + // Update request + $sql = "UPDATE ".MAIN_DB_PREFIX."reception SET"; + + $sql.= " tms=".(dol_strlen($this->tms)!=0 ? "'".$this->db->idate($this->tms)."'" : 'null').","; + $sql.= " ref=".(isset($this->ref)?"'".$this->db->escape($this->ref)."'":"null").","; + $sql.= " ref_supplier=".(isset($this->ref_supplier)?"'".$this->db->escape($this->ref_supplier)."'":"null").","; + $sql.= " fk_soc=".(isset($this->socid)?$this->socid:"null").","; + $sql.= " date_creation=".(dol_strlen($this->date_creation)!=0 ? "'".$this->db->idate($this->date_creation)."'" : 'null').","; + $sql.= " fk_user_author=".(isset($this->fk_user_author)?$this->fk_user_author:"null").","; + $sql.= " date_valid=".(dol_strlen($this->date_valid)!=0 ? "'".$this->db->idate($this->date_valid)."'" : 'null').","; + $sql.= " fk_user_valid=".(isset($this->fk_user_valid)?$this->fk_user_valid:"null").","; + $sql.= " date_reception=".(dol_strlen($this->date_reception)!=0 ? "'".$this->db->idate($this->date_reception)."'" : 'null').","; + $sql.= " date_delivery=".(dol_strlen($this->date_delivery)!=0 ? "'".$this->db->idate($this->date_delivery)."'" : 'null').","; + $sql.= " fk_shipping_method=".((isset($this->shipping_method_id) && $this->shipping_method_id > 0)?$this->shipping_method_id:"null").","; + $sql.= " tracking_number=".(isset($this->tracking_number)?"'".$this->db->escape($this->tracking_number)."'":"null").","; + $sql.= " fk_statut=".(isset($this->statut)?$this->statut:"null").","; + $sql.= " height=".(($this->trueHeight != '')?$this->trueHeight:"null").","; + $sql.= " width=".(($this->trueWidth != '')?$this->trueWidth:"null").","; + $sql.= " size_units=".(isset($this->size_units)?$this->size_units:"null").","; + $sql.= " size=".(($this->trueDepth != '')?$this->trueDepth:"null").","; + $sql.= " weight_units=".(isset($this->weight_units)?$this->weight_units:"null").","; + $sql.= " weight=".(($this->trueWeight != '')?$this->trueWeight:"null").","; + $sql.= " note_private=".(isset($this->note_private)?"'".$this->db->escape($this->note_private)."'":"null").","; + $sql.= " note_public=".(isset($this->note_public)?"'".$this->db->escape($this->note_public)."'":"null").","; + $sql.= " model_pdf=".(isset($this->modelpdf)?"'".$this->db->escape($this->modelpdf)."'":"null").","; + $sql.= " entity=".$conf->entity; + + $sql.= " WHERE rowid=".$this->id; + + $this->db->begin(); + + dol_syslog(get_class($this)."::update", LOG_DEBUG); + $resql = $this->db->query($sql); + if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); } + + if (! $error) + { + if (! $notrigger) + { + // Call trigger + $result=$this->call_trigger('RECEPTION_MODIFY',$user); + if ($result < 0) { $error++; } + // End call triggers + } + } + + // Commit or rollback + if ($error) + { + foreach($this->errors as $errmsg) + { + dol_syslog(get_class($this)."::update ".$errmsg, LOG_ERR); + $this->error.=($this->error?', '.$errmsg:$errmsg); + } + $this->db->rollback(); + return -1*$error; + } + else + { + $this->db->commit(); + return 1; + } + } + + /** + * Delete reception. + * + * @return int >0 if OK, 0 if deletion done but failed to delete files, <0 if KO + */ + function delete(User $user) + { + global $conf, $langs, $user; + require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + + $error=0; + $this->error=''; + + + $this->db->begin(); + + // Stock control + if ($conf->stock->enabled && $conf->global->STOCK_CALCULATE_ON_RECEPTION && $this->statut > 0) + { + require_once DOL_DOCUMENT_ROOT."/product/stock/class/mouvementstock.class.php"; + + $langs->load("agenda"); + + // Loop on each product line to add a stock movement + $sql = "SELECT cd.fk_product, cd.subprice, ed.qty, ed.fk_entrepot, ed.eatby, ed.sellby, ed.batch, ed.rowid as commande_fournisseur_dispatch_id"; + $sql.= " FROM ".MAIN_DB_PREFIX."commande_fournisseurdet as cd,"; + $sql.= " ".MAIN_DB_PREFIX."commande_fournisseur_dispatch as ed"; + $sql.= " WHERE ed.fk_reception = ".$this->id; + $sql.= " AND cd.rowid = ed.fk_commandefourndet"; + + dol_syslog(get_class($this)."::delete select details", LOG_DEBUG); + $resql=$this->db->query($sql); + if ($resql) + { + $cpt = $this->db->num_rows($resql); + for ($i = 0; $i < $cpt; $i++) + { + dol_syslog(get_class($this)."::delete movement index ".$i); + $obj = $this->db->fetch_object($resql); + + $mouvS = new MouvementStock($this->db); + // we do not log origin because it will be deleted + $mouvS->origin = null; + + $result=$mouvS->livraison($user, $obj->fk_product, $obj->fk_entrepot, $obj->qty, 0, $langs->trans("ReceptionDeletedInDolibarr", $this->ref),'', $obj->eatby, $obj->sellby, $obj->batch); // Price is set to 0, because we don't want to see WAP changed + } + } + else + { + $error++;$this->errors[]="Error ".$this->db->lasterror(); + } + } + + if (! $error) + { + $sql = "DELETE FROM ".MAIN_DB_PREFIX."commande_fournisseur_dispatch"; + $sql.= " WHERE fk_reception = ".$this->id; + + if ( $this->db->query($sql) ) + { + // Delete linked object + $res = $this->deleteObjectLinked(); + if ($res < 0) $error++; + + if (! $error) + { + $sql = "DELETE FROM ".MAIN_DB_PREFIX."reception"; + $sql.= " WHERE rowid = ".$this->id; + + if ($this->db->query($sql)) + { + // Call trigger + $result=$this->call_trigger('RECEPTION_DELETE',$user); + if ($result < 0) { $error++; } + // End call triggers + + if (! empty($this->origin) && $this->origin_id > 0) + { + $this->fetch_origin(); + $origin=$this->origin; + if ($this->$origin->statut == 4) // If order source of reception is "partially received" + { + // Check if there is no more reception. If not, we can move back status of order to "validated" instead of "reception in progress" + $this->$origin->loadReceptions(); + //var_dump($this->$origin->receptions);exit; + if (count($this->$origin->receptions) <= 0) + { + $this->$origin->setStatut(3); // ordered + } + } + } + + if (! $error) + { + $this->db->commit(); + + // We delete PDFs + $ref = dol_sanitizeFileName($this->ref); + if (! empty($conf->reception->dir_output)) + { + $dir = $conf->reception->dir_output . '/' . $ref ; + $file = $dir . '/' . $ref . '.pdf'; + if (file_exists($file)) + { + if (! dol_delete_file($file)) + { + return 0; + } + } + if (file_exists($dir)) + { + if (!dol_delete_dir_recursive($dir)) + { + $this->error=$langs->trans("ErrorCanNotDeleteDir",$dir); + return 0; + } + } + } + + return 1; + } + else + { + $this->db->rollback(); + return -1; + } + } + else + { + $this->error=$this->db->lasterror()." - sql=$sql"; + $this->db->rollback(); + return -3; + } + } + else + { + $this->error=$this->db->lasterror()." - sql=$sql"; + $this->db->rollback(); + return -2; + } + } + else + { + $this->error=$this->db->lasterror()." - sql=$sql"; + $this->db->rollback(); + return -1; + } + } + else + { + $this->db->rollback(); + return -1; + } + + } + + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps + /** + * Load lines + * + * @return int >0 if OK, Otherwise if KO + */ + function fetch_lines() + { + // phpcs:enable + global $db; + dol_include_once('/fourn/class/fournisseur.commande.dispatch.class.php'); + $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.'commande_fournisseur_dispatch WHERE fk_reception='.$this->id; + $resql = $db->query($sql); + + if(!empty($resql)){ + $this->lines = array(); + while ($obj = $resql->fetch_object()){ + $line = new CommandeFournisseurDispatch($db); + $line->fetch($obj->rowid); + $line->fetch_product(); + $sql_commfourndet = 'SELECT qty, ref, label, tva_tx, vat_src_code, subprice, multicurrency_subprice, remise_percent FROM llx_commande_fournisseurdet WHERE rowid='.$line->fk_commandefourndet; + $resql_commfourndet = $db->query($sql_commfourndet); + if(!empty($resql_commfourndet)){ + $obj = $db->fetch_object($resql_commfourndet); + $line->qty_asked = $obj->qty; + $line->description = $line->comment; + $line->desc = $line->comment; + $line->tva_tx = $obj->tva_tx; + $line->vat_src_code = $obj->vat_src_code; + $line->subprice = $obj->subprice; + $line->multicurrency_subprice = $obj->multicurrency_subprice; + $line->remise_percent = $obj->remise_percent; + $line->label = !empty($obj->label)?$obj->label:$line->product->label; + $line->ref_supplier = $obj->ref; + }else { + $line->qty_asked = 0; + $line->description = ''; + $line->label = $obj->label; + } + + $pu_ht=($line->subprice*$line->qty)*(100-$line->remise_percent)/100; + $tva = $pu_ht*$line->tva_tx/100; + $this->total_ht += $pu_ht; + $this->total_tva += $pu_ht*$line->tva_tx/100; + + $this->total_ttc += $pu_ht+$tva; + + + $this->lines[]=$line; + } + + return 1; + } + else { + return -1; + } + } + + /** + * Return clicable link of object (with eventually picto) + * + * @param int $withpicto Add picto into link + * @param int $option Where point the link + * @param int $max Max length to show + * @param int $short Use short labels + * @param int $notooltip 1=No tooltip + * @return string String with URL + */ + function getNomUrl($withpicto=0,$option=0,$max=0,$short=0,$notooltip=0) + { + global $langs; + $result=''; + $label = '' . $langs->trans("ShowReception") . ''; + $label .= '
' . $langs->trans('Ref') . ': '.$this->ref; + $label .= '
'.$langs->trans('RefSupplier').': '.($this->ref_supplier ? $this->ref_supplier : $this->ref_client); + + $url = DOL_URL_ROOT.'/reception/card.php?id='.$this->id; + + if ($short) return $url; + + $linkclose=''; + if (empty($notooltip)) + { + if (! empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) + { + $label=$langs->trans("ShowReception"); + $linkclose.=' alt="'.dol_escape_htmltag($label, 1).'"'; + } + $linkclose.= ' title="'.dol_escape_htmltag($label, 1).'"'; + $linkclose.=' class="classfortooltip"'; + } + + $linkstart = ''; + $linkend=''; + + $picto='sending'; + + if ($withpicto) $result.=($linkstart.img_object(($notooltip?'':$label), $picto, ($notooltip?'':'class="classfortooltip"'), 0, 0, $notooltip?0:1).$linkend); + if ($withpicto && $withpicto != 2) $result.=' '; + $result.=$linkstart.$this->ref.$linkend; + return $result; + } + + /** + * Return status label + * + * @param int $mode 0=Long label, 1=Short label, 2=Picto + Short label, 3=Picto, 4=Picto + Long label, 5=Short label + Picto + * @return string Libelle + */ + function getLibStatut($mode=0) + { + return $this->LibStatut($this->statut,$mode); + } + + /** + * Return label of a status + * + * @param int $statut Id statut + * @param int $mode 0=Long label, 1=Short label, 2=Picto + Short label, 3=Picto, 4=Picto + Long label, 5=Short label + Picto + * @return string Label of status + */ + function LibStatut($statut,$mode) + { + global $langs; + + if ($mode==0) + { + if ($statut==0) return $langs->trans($this->statuts[$statut]); + if ($statut==1) return $langs->trans($this->statuts[$statut]); + if ($statut==2) return $langs->trans($this->statuts[$statut]); + } + if ($mode==1) + { + if ($statut==0) return $langs->trans('StatusReceptionDraftShort'); + if ($statut==1) return $langs->trans('StatusReceptionValidatedShort'); + if ($statut==2) return $langs->trans('StatusReceptionProcessedShort'); + } + if ($mode == 3) + { + if ($statut==0) return img_picto($langs->trans($this->statuts[$statut]),'statut0'); + if ($statut==1) return img_picto($langs->trans($this->statuts[$statut]),'statut4'); + if ($statut==2) return img_picto($langs->trans('StatusReceptionProcessed'),'statut6'); + } + if ($mode == 4) + { + if ($statut==0) return img_picto($langs->trans($this->statuts[$statut]),'statut0').' '.$langs->trans($this->statuts[$statut]); + if ($statut==1) return img_picto($langs->trans($this->statuts[$statut]),'statut4').' '.$langs->trans($this->statuts[$statut]); + if ($statut==2) return img_picto($langs->trans('StatusReceptionProcessed'),'statut6').' '.$langs->trans('StatusReceptionProcessed'); + } + if ($mode == 5) + { + if ($statut==0) return $langs->trans('StatusReceptionDraftShort').' '.img_picto($langs->trans($this->statuts[$statut]),'statut0'); + if ($statut==1) return $langs->trans('StatusReceptionValidatedShort').' '.img_picto($langs->trans($this->statuts[$statut]),'statut4'); + if ($statut==2) return $langs->trans('StatusReceptionProcessedShort').' '.img_picto($langs->trans('StatusReceptionProcessedShort'),'statut6'); + } + } + + /** + * Initialise an instance with random values. + * Used to build previews or test instances. + * id must be 0 if object instance is a specimen. + * + * @return void + */ + function initAsSpecimen() + { + global $langs; + dol_include_once('/fourn/class/fournisseur.commande.dispatch.class.php'); + $now=dol_now(); + + 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(); + + // Initialise parametres + $this->id=0; + $this->ref = 'SPECIMEN'; + $this->specimen=1; + $this->statut = 1; + $this->livraison_id = 0; + $this->date = $now; + $this->date_creation = $now; + $this->date_valid = $now; + $this->date_delivery = $now; + $this->date_reception = $now + 24*3600; + + $this->entrepot_id = 0; + $this->fk_delivery_address = 0; + $this->socid = 1; + + $this->commande_id = 0; + $this->commande = $order; + + $this->origin_id = 1; + $this->origin = 'commande'; + + $this->note_private = 'Private note'; + $this->note_public = 'Public note'; + + $nbp = 5; + $xnbp = 0; + while ($xnbp < $nbp) + { + $line=new CommandeFournisseurDispatch($this->db); + $line->desc=$langs->trans("Description")." ".$xnbp; + $line->libelle=$langs->trans("Description")." ".$xnbp; + $line->qty=10; + + $line->fk_product=$this->commande->lines[$xnbp]->fk_product; + + $this->lines[]=$line; + $xnbp++; + } + } + + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps + /** + * Set the planned delivery date + * + * @param User $user Objet utilisateur qui modifie + * @param timestamp $date_livraison Date de livraison + * @return int <0 if KO, >0 if OK + */ + function set_date_livraison($user, $date_livraison) + { + // phpcs:enable + if ($user->rights->reception->creer) + { + $sql = "UPDATE ".MAIN_DB_PREFIX."reception"; + $sql.= " SET date_delivery = ".($date_livraison ? "'".$this->db->idate($date_livraison)."'" : 'null'); + $sql.= " WHERE rowid = ".$this->id; + + dol_syslog(get_class($this)."::set_date_livraison", LOG_DEBUG); + $resql=$this->db->query($sql); + if ($resql) + { + $this->date_delivery = $date_livraison; + return 1; + } + else + { + $this->error=$this->db->error(); + return -1; + } + } + else + { + return -2; + } + } + + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps + /** + * Fetch deliveries method and return an array. Load array this->meths(rowid=>label). + * + * @return void + */ + function fetch_delivery_methods() + { + // phpcs:enable + global $langs; + $this->meths = array(); + + $sql = "SELECT em.rowid, em.code, em.libelle"; + $sql.= " FROM ".MAIN_DB_PREFIX."c_shipment_mode as em"; + $sql.= " WHERE em.active = 1"; + $sql.= " ORDER BY em.libelle ASC"; + + $resql = $this->db->query($sql); + if ($resql) + { + while ($obj = $this->db->fetch_object($resql)) + { + $label=$langs->trans('ReceptionMethod'.$obj->code); + $this->meths[$obj->rowid] = ($label != 'ReceptionMethod'.$obj->code?$label:$obj->libelle); + } + } + } + + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps + /** + * Fetch all deliveries method and return an array. Load array this->listmeths. + * + * @param int $id only this carrier, all if none + * @return void + */ + function list_delivery_methods($id='') + { + // phpcs:enable + global $langs; + + $this->listmeths = array(); + $i=0; + + $sql = "SELECT em.rowid, em.code, em.libelle, em.description, em.tracking, em.active"; + $sql.= " FROM ".MAIN_DB_PREFIX."c_shipment_mode as em"; + if ($id!='') $sql.= " WHERE em.rowid=".$id; + + $resql = $this->db->query($sql); + if ($resql) + { + while ($obj = $this->db->fetch_object($resql)) + { + $this->listmeths[$i]['rowid'] = $obj->rowid; + $this->listmeths[$i]['code'] = $obj->code; + $label=$langs->trans('ReceptionMethod'.$obj->code); + $this->listmeths[$i]['libelle'] = ($label != 'ReceptionMethod'.$obj->code?$label:$obj->libelle); + $this->listmeths[$i]['description'] = $obj->description; + $this->listmeths[$i]['tracking'] = $obj->tracking; + $this->listmeths[$i]['active'] = $obj->active; + $i++; + } + } + } + + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps + /** + * Update/create delivery method. + * + * @param string $id id method to activate + * + * @return void + */ + function update_delivery_method($id='') + { + // phpcs:enable + if ($id=='') + { + $sql = "INSERT INTO ".MAIN_DB_PREFIX."c_shipment_mode (code, libelle, description, tracking)"; + $sql.=" VALUES ('".$this->update['code']."','".$this->update['libelle']."','".$this->update['description']."','".$this->update['tracking']."')"; + $resql = $this->db->query($sql); + } + else + { + $sql = "UPDATE ".MAIN_DB_PREFIX."c_shipment_mode SET"; + $sql.= " code='".$this->db->escape($this->update['code'])."'"; + $sql.= ",libelle='".$this->db->escape($this->update['libelle'])."'"; + $sql.= ",description='".$this->db->escape($this->update['description'])."'"; + $sql.= ",tracking='".$this->db->escape($this->update['tracking'])."'"; + $sql.= " WHERE rowid=".$id; + $resql = $this->db->query($sql); + } + if ($resql < 0) dol_print_error($this->db,''); + } + + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps + /** + * Activate delivery method. + * + * @param int $id id method to activate + * + * @return void + */ + function activ_delivery_method($id) + { + // phpcs:enable + $sql = 'UPDATE '.MAIN_DB_PREFIX.'c_shipment_mode SET active=1'; + $sql.= ' WHERE rowid='.$id; + + $resql = $this->db->query($sql); + } + + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps + /** + * DesActivate delivery method. + * + * @param int $id id method to desactivate + * + * @return void + */ + function disable_delivery_method($id) + { + // phpcs:enable + $sql = 'UPDATE '.MAIN_DB_PREFIX.'c_shipment_mode SET active=0'; + $sql.= ' WHERE rowid='.$id; + + $resql = $this->db->query($sql); + } + + + /** + * Forge an set tracking url + * + * @param string $value Value + * @return void + */ + function GetUrlTrackingStatus($value='') + { + if (! empty($this->shipping_method_id)) + { + $sql = "SELECT em.code, em.tracking"; + $sql.= " FROM ".MAIN_DB_PREFIX."c_shipment_mode as em"; + $sql.= " WHERE em.rowid = ".$this->shipping_method_id; + + $resql = $this->db->query($sql); + if ($resql) + { + if ($obj = $this->db->fetch_object($resql)) + { + $tracking = $obj->tracking; + } + } + } + + if (!empty($tracking) && !empty($value)) + { + $url = str_replace('{TRACKID}', $value, $tracking); + $this->tracking_url = sprintf(''.($value?$value:'url').'',$url,$url); + } + else + { + $this->tracking_url = $value; + } + } + + /** + * Classify the reception as closed. + * + * @return int <0 if KO, >0 if OK + */ + function setClosed() + { + global $conf,$langs,$user; + + $error=0; + + $this->db->begin(); + + $sql = 'UPDATE '.MAIN_DB_PREFIX.'reception SET fk_statut='.self::STATUS_CLOSED; + $sql .= ' WHERE rowid = '.$this->id.' AND fk_statut > 0'; + + $resql=$this->db->query($sql); + if ($resql) + { + // Set order billed if 100% of order is received (qty in reception lines match qty in order lines) + if ($this->origin == 'order_supplier' && $this->origin_id > 0) + { + $order = new CommandeFournisseur($this->db); + $order->fetch($this->origin_id); + + $order->loadReceptions(self::STATUS_CLOSED); // Fill $order->receptions = array(orderlineid => qty) + + $receptions_match_order = 1; + foreach($order->lines as $line) + { + $lineid = $line->id; + $qty = $line->qty; + if (($line->product_type == 0 || ! empty($conf->global->STOCK_SUPPORTS_SERVICES)) && $order->receptions[$lineid] < $qty) + { + $receptions_match_order = 0; + $text='Qty for order line id '.$lineid.' is '.$qty.'. However in the receptions with status Reception::STATUS_CLOSED='.self::STATUS_CLOSED.' we have qty = '.$order->receptions[$lineid].', so we can t close order'; + dol_syslog($text); + break; + } + } + if ($receptions_match_order) + { + dol_syslog("Qty for the ".count($order->lines)." lines of order have same value for receptions with status Reception::STATUS_CLOSED=".self::STATUS_CLOSED.', so we close order'); + $order->Livraison($user, dol_now(), 'tot', 'Reception '.$this->ref); + } + } + + $this->statut=self::STATUS_CLOSED; + + + // If stock increment is done on closing + if (! $error && ! empty($conf->stock->enabled) && ! empty($conf->global->STOCK_CALCULATE_ON_RECEPTION_CLOSE)) + { + require_once DOL_DOCUMENT_ROOT.'/product/stock/class/mouvementstock.class.php'; + + $langs->load("agenda"); + + // Loop on each product line to add a stock movement + // TODO possibilite de receptionner a partir d'une propale ou autre origine ? + $sql = "SELECT cd.fk_product, cd.subprice,"; + $sql.= " ed.rowid, ed.qty, ed.fk_entrepot,"; + $sql.= " ed.eatby, ed.sellby, ed.batch"; + $sql.= " FROM ".MAIN_DB_PREFIX."commande_fournisseurdet as cd,"; + $sql.= " ".MAIN_DB_PREFIX."commande_fournisseur_dispatch as ed"; + $sql.= " WHERE ed.fk_reception = ".$this->id; + $sql.= " AND cd.rowid = ed.fk_commandefourndet"; + + dol_syslog(get_class($this)."::valid select details", LOG_DEBUG); + $resql=$this->db->query($sql); + + if ($resql) + { + $cpt = $this->db->num_rows($resql); + for ($i = 0; $i < $cpt; $i++) + { + $obj = $this->db->fetch_object($resql); + + $qty = $obj->qty; + + if ($qty <= 0) continue; + dol_syslog(get_class($this)."::valid movement index ".$i." ed.rowid=".$obj->rowid." edb.rowid=".$obj->edbrowid); + + $mouvS = new MouvementStock($this->db); + $mouvS->origin = &$this; + + if (empty($obj->batch)) + { + // line without batch detail + + // We decrement stock of product (and sub-products) -> update table llx_product_stock (key of this table is fk_product+fk_entrepot) and add a movement record + $result=$mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, $qty, $obj->subprice, $langs->trans("ReceptionClassifyClosedInDolibarr",$numref)); + if ($result < 0) { + $this->error = $mouvS->error; + $this->errors = $mouvS->errors; + $error++; break; + } + } + else + { + // line with batch detail + + // We decrement stock of product (and sub-products) -> update table llx_product_stock (key of this table is fk_product+fk_entrepot) and add a movement record + $result=$mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, $qty, $obj->subprice, $langs->trans("ReceptionClassifyClosedInDolibarr",$numref), $this->db->jdate($obj->eatby), $this->db->jdate($obj->sellby), $obj->batch); + + if ($result < 0) { + $this->error = $mouvS->error; + $this->errors = $mouvS->errors; + $error++; break; + } + } + } + } + else + { + $this->error=$this->db->lasterror(); + $error++; + } + } + + // Call trigger + if (! $error) + { + $result=$this->call_trigger('RECEPTION_CLOSED',$user); + if ($result < 0) { + $error++; + } + } + } + else + { + dol_print_error($this->db); + $error++; + } + + if (! $error) + { + $this->db->commit(); + return 1; + } + else + { + $this->db->rollback(); + return -1; + } + } + + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps + /** + * Classify the reception as invoiced (used when WORKFLOW_BILL_ON_RECEPTION is on) + * + * @return int <0 if ko, >0 if ok + */ + function set_billed() + { + // phpcs:enable + global $user; + $error=0; + + $this->db->begin(); + + $this->setClosed(); + + $sql = 'UPDATE '.MAIN_DB_PREFIX.'reception SET billed=1'; + $sql .= ' WHERE rowid = '.$this->id.' AND fk_statut > 0'; + + $resql=$this->db->query($sql); + if ($resql) + { + $this->statut=2; + $this->billed=1; + + // Call trigger + $result=$this->call_trigger('RECEPTION_BILLED',$user); + if ($result < 0) { + $error++; + } + } else { + $error++; + $this->errors[]=$this->db->lasterror; + } + + if (empty($error)) { + $this->db->commit(); + return 1; + } + else + { + $this->db->rollback(); + return -1; + } + } + + /** + * Classify the reception as validated/opened + * + * @return int <0 if ko, >0 if ok + */ + function reOpen() + { + global $conf,$langs,$user; + + $error=0; + + $this->db->begin(); + + $sql = 'UPDATE '.MAIN_DB_PREFIX.'reception SET fk_statut=1, billed=0'; + $sql .= ' WHERE rowid = '.$this->id.' AND fk_statut > 0'; + + $resql=$this->db->query($sql); + if ($resql) + { + $this->statut=1; + $this->billed=0; + + // If stock increment is done on closing + if (! $error && ! empty($conf->stock->enabled) && ! empty($conf->global->STOCK_CALCULATE_ON_RECEPTION_CLOSE)) + { + require_once DOL_DOCUMENT_ROOT.'/product/stock/class/mouvementstock.class.php'; + $numref = $this->ref; + $langs->load("agenda"); + + // Loop on each product line to add a stock movement + // TODO possibilite de receptionner a partir d'une propale ou autre origine + $sql = "SELECT ed.fk_product, cd.subprice,"; + $sql.= " ed.rowid, ed.qty, ed.fk_entrepot,"; + $sql.= " ed.eatby, ed.sellby, ed.batch"; + $sql.= " FROM ".MAIN_DB_PREFIX."commande_fournisseurdet as cd,"; + $sql.= " ".MAIN_DB_PREFIX."commande_fournisseur_dispatch as ed"; + $sql.= " WHERE ed.fk_reception = ".$this->id; + $sql.= " AND cd.rowid = ed.fk_commandefourndet"; + + dol_syslog(get_class($this)."::valid select details", LOG_DEBUG); + $resql=$this->db->query($sql); + if ($resql) + { + $cpt = $this->db->num_rows($resql); + for ($i = 0; $i < $cpt; $i++) + { + $obj = $this->db->fetch_object($resql); + + $qty = $obj->qty; + + if ($qty <= 0) continue; + + dol_syslog(get_class($this)."::reopen reception movement index ".$i." ed.rowid=".$obj->rowid); + + //var_dump($this->lines[$i]); + $mouvS = new MouvementStock($this->db); + $mouvS->origin = &$this; + + if (empty($obj->batch)) + { + // line without batch detail + + // We decrement stock of product (and sub-products) -> update table llx_product_stock (key of this table is fk_product+fk_entrepot) and add a movement record + $result=$mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, -$qty, $obj->subprice, $langs->trans("ReceptionUnClassifyCloseddInDolibarr",$numref)); + if ($result < 0) { + $this->error = $mouvS->error; + $this->errors = $mouvS->errors; + $error++; break; + } + } + else + { + // line with batch detail + + // We decrement stock of product (and sub-products) -> update table llx_product_stock (key of this table is fk_product+fk_entrepot) and add a movement record + $result=$mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, -$qty, $obj->subprice, $langs->trans("ReceptionUnClassifyCloseddInDolibarr",$numref), $this->db->jdate($obj->eatby), $this->db->jdate($obj->sellby), $obj->batch, $obj->fk_origin_stock); + if ($result < 0) { + $this->error = $mouvS->error; + $this->errors = $mouvS->errors; + $error++; break; + } + } + } + } + else + { + $this->error=$this->db->lasterror(); + $error++; + } + } + + if (! $error) + { + // Call trigger + $result=$this->call_trigger('RECEPTION_REOPEN',$user); + if ($result < 0) { + $error++; + } + } + + if($this->origin == 'order_supplier'){ + $commande = new CommandeFournisseur($this->db); + $commande->fetch($this->origin_id); + $commande->setStatus($user,4); + } + } else { + $error++; + $this->errors[]=$this->db->lasterror(); + } + + if (! $error) + { + $this->db->commit(); + return 1; + } + else + { + $this->db->rollback(); + return -1; + } + } + + + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps + /** + * Set draft status + * + * @param User $user Object user that modify + * @return int <0 if KO, >0 if OK + */ + function set_draft($user) + { + // phpcs:enable + global $conf,$langs; + + $error=0; + + // Protection + if ($this->statut <= self::STATUS_DRAFT) + { + return 0; + } + + if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->reception->creer)) + || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->reception->reception_advance->validate)))) + { + $this->error='Permission denied'; + return -1; + } + + $this->db->begin(); + + $sql = "UPDATE ".MAIN_DB_PREFIX."reception"; + $sql.= " SET fk_statut = ".self::STATUS_DRAFT; + $sql.= " WHERE rowid = ".$this->id; + + dol_syslog(get_class($this)."::set_draft", LOG_DEBUG); + if ($this->db->query($sql)) + { + // If stock increment is done on closing + if (! $error && ! empty($conf->stock->enabled) && ! empty($conf->global->STOCK_CALCULATE_ON_RECEPTION)) + { + require_once DOL_DOCUMENT_ROOT.'/product/stock/class/mouvementstock.class.php'; + + $langs->load("agenda"); + + // Loop on each product line to add a stock movement + // TODO possibilite de receptionner a partir d'une propale ou autre origine + $sql = "SELECT cd.fk_product, cd.subprice,"; + $sql.= " ed.rowid, ed.qty, ed.fk_entrepot,"; + $sql.= " ed.eatby, ed.sellby, ed.batch"; + $sql.= " FROM ".MAIN_DB_PREFIX."commande_fournisseurdet as cd,"; + $sql.= " ".MAIN_DB_PREFIX."commande_fournisseur_dispatch as ed"; + $sql.= " WHERE ed.fk_reception = ".$this->id; + $sql.= " AND cd.rowid = ed.fk_commandefourndet"; + + dol_syslog(get_class($this)."::valid select details", LOG_DEBUG); + $resql=$this->db->query($sql); + if ($resql) + { + $cpt = $this->db->num_rows($resql); + for ($i = 0; $i < $cpt; $i++) + { + $obj = $this->db->fetch_object($resql); + + $qty = $obj->qty; + + + if ($qty <= 0) continue; + dol_syslog(get_class($this)."::reopen reception movement index ".$i." ed.rowid=".$obj->rowid." edb.rowid=".$obj->edbrowid); + + //var_dump($this->lines[$i]); + $mouvS = new MouvementStock($this->db); + $mouvS->origin = &$this; + + if (empty($obj->batch)) + { + // line without batch detail + + // We decrement stock of product (and sub-products) -> update table llx_product_stock (key of this table is fk_product+fk_entrepot) and add a movement record + $result=$mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, -$qty, $obj->subprice, $langs->trans("ReceptionBackToDraftInDolibarr",$this->ref)); + if ($result < 0) { + $this->error = $mouvS->error; + $this->errors = $mouvS->errors; + $error++; break; + + } + } + else + { + // line with batch detail + + // We decrement stock of product (and sub-products) -> update table llx_product_stock (key of this table is fk_product+fk_entrepot) and add a movement record + $result=$mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, -$qty, $obj->subprice, $langs->trans("ReceptionBackToDraftInDolibarr",$this->ref), $this->db->jdate($obj->eatby), $this->db->jdate($obj->sellby), $obj->batch); + if ($result < 0) { + $this->error = $mouvS->error; + $this->errors = $mouvS->errors; + $error++; break; + } + } + } + } + else + { + $this->error=$this->db->lasterror(); + $error++; + } + } + + if (!$error) { + // Call trigger + $result=$this->call_trigger('RECEPTION_UNVALIDATE',$user); + if ($result < 0) $error++; + } + if ($this->origin == 'order_supplier') + { + if (!empty($this->origin) && $this->origin_id > 0) + { + $this->fetch_origin(); + $origin = $this->origin; + if ($this->$origin->statut == 4) // If order source of reception is "partially received" + { + // Check if there is no more reception validated. + $this->$origin->fetchObjectLinked(); + $setStatut = 1; + if (!empty($this->$origin->linkedObjects['reception'])) + { + foreach ($this->$origin->linkedObjects['reception'] as $rcption) + { + if ($rcption->statut > 0) + { + $setStatut = 0; + break; + } + } + //var_dump($this->$origin->receptions);exit; + if ($setStatut) + { + $this->$origin->setStatut(3); // ordered + } + } + } + } + } + + if (!$error) { + $this->statut=self::STATUS_DRAFT; + $this->db->commit(); + return 1; + }else { + $this->db->rollback(); + return -1; + } + } + else + { + $this->error=$this->db->error(); + $this->db->rollback(); + return -1; + } + } + + /** + * Create a document onto disk according to template module. + * + * @param string $modele Force the model to using ('' to not force) + * @param Translate $outputlangs object lang to use for translations + * @param int $hidedetails Hide details of lines + * @param int $hidedesc Hide description + * @param int $hideref Hide ref + * @return int 0 if KO, 1 if OK + */ + public function generateDocument($modele, $outputlangs,$hidedetails=0, $hidedesc=0, $hideref=0) + { + global $conf,$langs; + + $langs->load("receptions"); + + if (! dol_strlen($modele)) + { + $modele = 'squille'; + + if ($this->modelpdf) { + $modele = $this->modelpdf; + } elseif (! empty($conf->global->RECEPTION_ADDON_PDF)) { + $modele = $conf->global->RECEPTION_ADDON_PDF; + } + } + + $modelpath = "core/modules/reception/doc/"; + + $this->fetch_origin(); + + return $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + + /** + * Function used to replace a thirdparty id with another one. + * + * @param DoliDB $db Database handler + * @param int $origin_id Old thirdparty id + * @param int $dest_id New thirdparty id + * @return bool + */ + public static function replaceThirdparty(DoliDB $db, $origin_id, $dest_id) + { + $tables = array('reception'); + + return CommonObject::commonReplaceThirdparty($db, $origin_id, $dest_id, $tables); + } +} \ No newline at end of file diff --git a/htdocs/reception/class/receptionstats.class.php b/htdocs/reception/class/receptionstats.class.php new file mode 100644 index 00000000000..3f60a9846fb --- /dev/null +++ b/htdocs/reception/class/receptionstats.class.php @@ -0,0 +1,142 @@ + + * Copyright (c) 2005-2013 Laurent Destailleur + * Copyright (C) 2005-2009 Regis Houssin + * Copyright (C) 2011 Juanjo Menent + * + * 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/reception/class/receptionstats.class.php + * \ingroup reception + * \brief File of class fo tmanage reception statistics + */ + +include_once DOL_DOCUMENT_ROOT . '/core/class/stats.class.php'; +include_once DOL_DOCUMENT_ROOT . '/reception/class/reception.class.php'; +include_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php'; + + +/** + * Class to manage reception statistics + */ +class ReceptionStats extends Stats +{ + public $table_element; + + var $socid; + var $userid; + + var $from; + var $field; + var $where; + + + /** + * Constructor + * + * @param DoliDB $db Database handler + * @param int $socid Id third party for filter + * @param string $mode Option (not used) + * @param int $userid Id user for filter (creation user) + */ + function __construct($db, $socid, $mode, $userid=0) + { + global $user, $conf; + + $this->db = $db; + + $this->socid = ($socid > 0 ? $socid : 0); + $this->userid = $userid; + $this->cachefilesuffix = $mode; + + $object=new Reception($this->db); + $this->from = MAIN_DB_PREFIX.$object->table_element." as c"; + //$this->from.= ", ".MAIN_DB_PREFIX."societe as s"; + $this->field='weight'; // Warning, unit of weight is NOT USED AND MUST BE + $this->where.= " c.fk_statut > 0"; // Not draft and not cancelled + + //$this->where.= " AND c.fk_soc = s.rowid AND c.entity = ".$conf->entity; + $this->where.= " AND c.entity = ".$conf->entity; + if (!$user->rights->societe->client->voir && !$this->socid) $this->where .= " AND c.fk_soc = sc.fk_soc AND sc.fk_user = " .$user->id; + if ($this->socid) + { + $this->where.=" AND c.fk_soc = ".$this->socid; + } + if ($this->userid > 0) $this->where.=' AND c.fk_user_author = '.$this->userid; + } + + /** + * Return reception number by month for a year + * + * @param int $year Year to scan + * @return array Array with number by month + */ + function getNbByMonth($year) + { + global $user; + + $sql = "SELECT date_format(c.date_valid,'%m') as dm, COUNT(*) as nb"; + $sql.= " FROM ".$this->from; + if (!$user->rights->societe->client->voir && !$this->socid) $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; + $sql.= " WHERE c.date_valid 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'); + + $res=$this->_getNbByMonth($year, $sql); + return $res; + } + + /** + * Return receptions number per year + * + * @return array Array with number by year + * + */ + function getNbByYear() + { + global $user; + + $sql = "SELECT date_format(c.date_valid,'%Y') as dm, COUNT(*) as nb, SUM(c.".$this->field.")"; + $sql.= " FROM ".$this->from; + if (!$user->rights->societe->client->voir && !$this->socid) $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; + $sql.= " WHERE ".$this->where; + $sql.= " GROUP BY dm"; + $sql.= $this->db->order('dm','DESC'); + + return $this->_getNbByYear($sql); + } + + /** + * Return nb, total and average + * + * @return array Array of values + */ + function getAllByYear() + { + global $user; + + $sql = "SELECT date_format(c.date_valid,'%Y') as year, COUNT(*) as nb, SUM(c.".$this->field.") as total, AVG(".$this->field.") as avg"; + $sql.= " FROM ".$this->from; + if (!$user->rights->societe->client->voir && !$this->socid) $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; + $sql.= " WHERE ".$this->where; + $sql.= " GROUP BY year"; + $sql.= $this->db->order('year','DESC'); + + return $this->_getAllByYear($sql); + } +} + diff --git a/htdocs/reception/contact.php b/htdocs/reception/contact.php new file mode 100644 index 00000000000..7fc1ed889f5 --- /dev/null +++ b/htdocs/reception/contact.php @@ -0,0 +1,274 @@ + + * Copyright (C) 2005-2011 Laurent Destailleur + * Copyright (C) 2005-2012 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/reception/contact.php + * \ingroup reception + * \brief Onglet de gestion des contacts de reception + */ + +require '../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/reception/class/reception.class.php'; +require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php'; +require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/reception.lib.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->projet->enabled)) { + require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; + require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php'; +} + +$langs->load("orders"); +$langs->load("receptions"); +$langs->load("companies"); + +$id=GETPOST('id','int'); +$ref=GETPOST('ref','alpha'); +$action=GETPOST('action','alpha'); + +// Security check +if ($user->societe_id) $socid=$user->societe_id; +$result = restrictedArea($user, 'reception', $id,''); + +$object = new Reception($db); +if ($id > 0 || ! empty($ref)) +{ + $object->fetch($id, $ref); + $object->fetch_thirdparty(); + + if (!empty($object->origin)) + { + $origin = $object->origin; + + $object->fetch_origin(); + $typeobject = $object->origin; + } + + // Linked documents + if ($origin == 'order_supplier' && $object->$typeobject->id && ! empty($conf->fournisseur->enabled)) + { + $objectsrc=new CommandeFournisseur($db); + $objectsrc->fetch($object->$typeobject->id); + } + if ($typeobject == 'propal' && $object->$typeobject->id && ! empty($conf->propal->enabled)) + { + $objectsrc=new Propal($db); + $objectsrc->fetch($object->$typeobject->id); + } +} + + +/* + * Actions + */ + +if ($action == 'addcontact' && $user->rights->reception->creer) +{ + if ($result > 0 && $id > 0) + { + $result = $objectsrc->add_contact(GETPOST('userid') ? GETPOST('userid') : GETPOST('contactid'), $_POST["type"], $_POST["source"]); + } + + if ($result >= 0) + { + header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id); + exit; + } + else + { + if ($objectsrc->error == 'DB_ERROR_RECORD_ALREADY_EXISTS') + { + $langs->load("errors"); + $mesg = $langs->trans("ErrorThisContactIsAlreadyDefinedAsThisType"); + } else { + $mesg = $objectsrc->error; + $mesgs = $objectsrc->errors; + } + setEventMessages($mesg, $mesgs, 'errors'); + } +} + +// bascule du statut d'un contact +else if ($action == 'swapstatut' && $user->rights->reception->creer) +{ + $result=$objectsrc->swapContactStatus(GETPOST('ligne')); +} + +// Efface un contact +else if ($action == 'deletecontact' && $user->rights->reception->creer) +{ + $result = $objectsrc->delete_contact(GETPOST("lineid")); + + if ($result >= 0) + { + header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id); + exit; + } + else { + dol_print_error($db); + } +} +/* +else if ($action == 'setaddress' && $user->rights->reception->creer) +{ + $object->fetch($id); + $result=$object->setDeliveryAddress($_POST['fk_address']); + if ($result < 0) dol_print_error($db,$object->error); +}*/ + + +/* + * View + */ + +llxHeader('',$langs->trans('Reception'),'EN:Customers_Orders|FR:receptions_Clients|ES:Pedidos de clientes'); + +$form = new Form($db); +$formcompany = new FormCompany($db); +$formother = new FormOther($db); +$contactstatic=new Contact($db); +$userstatic=new User($db); + + +/* *************************************************************************** */ +/* */ +/* Mode vue et edition */ +/* */ +/* *************************************************************************** */ + +if ($id > 0 || ! empty($ref)) +{ + $langs->trans("OrderCard"); + + $head = reception_prepare_head($object); + dol_fiche_head($head, 'contact', $langs->trans("Reception"), -1, 'sending'); + + + // Reception card + $linkback = ''.$langs->trans("BackToList").''; + + $morehtmlref='
'; + // Ref customer reception + $morehtmlref.=$form->editfieldkey("RefSupplier", '', $object->ref_supplier, $object, $user->rights->reception->creer, 'string', '', 0, 1); + $morehtmlref.=$form->editfieldval("RefSupplier", '', $object->ref_supplier, $object, $user->rights->reception->creer, 'string', '', null, null, '', 1); + // Thirdparty + $morehtmlref.='
'.$langs->trans('ThirdParty') . ' : ' . $object->thirdparty->getNomUrl(1); + // Project + if (! empty($conf->projet->enabled)) { + $langs->load("projects"); + $morehtmlref .= '
' . $langs->trans('Project') . ' '; + if (0) { // Do not change on reception + 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', $maxlength, 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 { + // We don't have project on reception, so we will use the project or source object instead + // TODO Add project on reception + $morehtmlref .= ' : '; + if (! empty($objectsrc->fk_project)) { + $proj = new Project($db); + $proj->fetch($objectsrc->fk_project); + $morehtmlref .= ''; + $morehtmlref .= $proj->ref; + $morehtmlref .= ''; + } else { + $morehtmlref .= ''; + } + } + } + $morehtmlref.='
'; + + $object->picto = 'sending'; + dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref); + + + print '
'; + //print '
'; + print '
'; + + print ''; + // Linked documents + if ($origin == 'order_supplier' && $object->$typeobject->id && ! empty($conf->fournisseur->enabled)) + { + print ''; + print '\n"; + print ''; + } + if ($typeobject == 'propal' && $object->$typeobject->id && ! empty($conf->propal->enabled)) + { + print ''; + print '\n"; + print ''; + } + + print "
'; + $objectsrc=new CommandeFournisseur($db); + $objectsrc->fetch($object->$typeobject->id); + print $langs->trans("RefOrder").''; + print $objectsrc->getNomUrl(1,'commande'); + print "
'; + $objectsrc=new Propal($db); + $objectsrc->fetch($object->$typeobject->id); + print $langs->trans("RefProposal").''; + print $objectsrc->getNomUrl(1,'reception'); + print "
"; + + + //print '
'; + //print '
'; + //print '
'; + //print '
'; + + + //print '
'; + //print '
'; + print '
'; + + print '
'; + + + dol_fiche_end(); + + // Lignes de contacts + echo '
'; + + // Contacts lines (modules that overwrite templates must declare this into descriptor) + $dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl')); + foreach($dirtpls as $reldir) + { + $res=@include dol_buildpath($reldir.'/contacts.tpl.php'); + if ($res) break; + } +} + +llxFooter(); + +$db->close(); diff --git a/htdocs/reception/index.php b/htdocs/reception/index.php new file mode 100644 index 00000000000..f74a23525e9 --- /dev/null +++ b/htdocs/reception/index.php @@ -0,0 +1,297 @@ + + * Copyright (C) 2004-2011 Laurent Destailleur + * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2018 Quentin Vial-Gouteyron + * + * 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/reception/index.php + * \ingroup reception + * \brief Home page of reception area. + */ + +require '../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php'; +require_once DOL_DOCUMENT_ROOT.'/reception/class/reception.class.php'; + +$langs->load("orders"); +$langs->load("receptions"); + +/* + * View + */ + +$orderstatic=new CommandeFournisseur($db); +$companystatic=new Societe($db); +$reception=new Reception($db); + +$helpurl='EN:Module_Receptions|FR:Module_Receptions|ES:Módulo_Receptiones'; +llxHeader('',$langs->trans("Reception"),$helpurl); + +print load_fiche_titre($langs->trans("ReceptionsArea")); + + +print '
'; + + +if (! empty($conf->global->MAIN_SEARCH_FORM_ON_HOME_AREAS)) // This is useless due to the global search combo +{ + print '
'; + print ''; + print ''; + print ''; + print ''; + print "
'.$langs->trans("Search").'
'; + print $langs->trans("Reception").':

\n"; +} + +/* + * Receptions to validate + */ +$clause = " WHERE "; + +$sql = "SELECT e.rowid, e.ref, e.ref_supplier,"; +$sql.= " s.nom as name, s.rowid as socid,"; +$sql.= " c.ref as commande_fournisseur_ref, c.rowid as commande_fournisseur_id"; +$sql.= " FROM ".MAIN_DB_PREFIX."reception as e"; +$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."element_element as el ON e.rowid = el.fk_target AND el.targettype = 'reception'"; +$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."commande_fournisseur as c ON el.fk_source = c.rowid"; +$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = e.fk_soc"; +if (!$user->rights->societe->client->voir && !$socid) +{ + $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON e.fk_soc = sc.fk_soc"; + $sql.= $clause." sc.fk_user = " .$user->id; + $clause = " AND "; +} +$sql.= $clause." e.fk_statut = 0"; +$sql.= " AND e.entity IN (".getEntity('reception').")"; +if ($socid) $sql.= " AND c.fk_soc = ".$socid; + +$resql=$db->query($sql); +if ($resql) +{ + $num = $db->num_rows($resql); + if ($num) + { + print ''; + print ''; + print ''; + $i = 0; + while ($i < $num) + { + $obj = $db->fetch_object($resql); + + $reception->id=$obj->rowid; + $reception->ref=$obj->ref; + $reception->ref_supplier=$obj->ref_supplier; + + print '"; + print ''; + print ''; + $i++; + } + print "
'.$langs->trans("ReceptionsToValidate").'
'; + print $reception->getNomUrl(1); + print "'; + print ''.$obj->name.''; + print ''; + if ($obj->commande_fournisseur_id) print ''.$obj->commande_fournisseur_ref.''; + print '

"; + } +} + + +/* + * CommandeFournisseurs a traiter + */ +$sql = "SELECT c.rowid, c.ref, c.ref_supplier as ref_supplier, c.fk_statut, s.nom as name, s.rowid as socid"; +$sql.= " FROM ".MAIN_DB_PREFIX."commande_fournisseur as c,"; +$sql.= " ".MAIN_DB_PREFIX."societe as s"; +if (!$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; +$sql.= " WHERE c.fk_soc = s.rowid"; +$sql.= " AND c.entity = ".$conf->entity; +$sql.= " AND c.fk_statut = 3";//Commandé +if ($socid) $sql.= " AND c.fk_soc = ".$socid; +if (!$user->rights->societe->client->voir && !$socid) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; +$sql.= " ORDER BY c.rowid ASC"; +$resql=$db->query($sql); +if ($resql) +{ + $num = $db->num_rows($resql); + if ($num) + { + $langs->load("orders"); + + $i = 0; + print ''; + print ''; + print ''; + while ($i < $num) + { + $obj = $db->fetch_object($resql); + + $orderstatic->id=$obj->rowid; + $orderstatic->ref=$obj->ref; + $orderstatic->ref_supplier=$obj->ref_supplier; + $orderstatic->statut=$obj->fk_statut; + $orderstatic->facturee=0; + + $companystatic->name=$obj->name; + $companystatic->id=$obj->socid; + + print ''; + print ''; + print ''; + print ''; + print ''; + $i++; + } + print "
'.$langs->trans("SuppliersOrdersToProcess").'
'; + print $orderstatic->getNomUrl(1); + print ''; + print $companystatic->getNomUrl(1,'customer',32); + print ''; + print $orderstatic->getLibStatut(3); + print '

"; + } +} + + +//print '
'; +print '
'; + + +/* + * CommandeFournisseurs en traitement + */ +$sql = "SELECT c.rowid, c.ref, c.ref_supplier as ref_supplier, c.fk_statut as status, c.billed as billed, s.nom as name, s.rowid as socid"; +$sql.= " FROM ".MAIN_DB_PREFIX."commande_fournisseur as c,"; +$sql.= " ".MAIN_DB_PREFIX."societe as s"; +if (!$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; +$sql.= " WHERE c.fk_soc = s.rowid"; +$sql.= " AND c.entity = ".$conf->entity; +$sql.= " AND c.fk_statut IN (4)"; +if ($socid) $sql.= " AND c.fk_soc = ".$socid; +if (!$user->rights->societe->client->voir && !$socid) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; + +$resql = $db->query($sql); +if ( $resql ) +{ + $langs->load("orders"); + + $num = $db->num_rows($resql); + if ($num) + { + $i = 0; + print ''; + print ''; + print ''; + while ($i < $num) + { + $obj = $db->fetch_object($resql); + + $orderstatic->id=$obj->rowid; + $orderstatic->ref=$obj->ref; + $orderstatic->ref_supplier=$obj->ref_supplier; + $orderstatic->statut=$obj->status; + $orderstatic->facturee=$obj->billed; + + $companystatic->name=$obj->name; + $companystatic->id=$obj->socid; + + print ''; + print ''; + print ''; + print ''; + $i++; + } + print "
'.$langs->trans("SuppliersOrdersInProcess").'
'; + print $orderstatic->getNomUrl(1); + print ''; + print $companystatic->getNomUrl(1,'customer'); + print ''; + print $orderstatic->getLibStatut(3); + print '

"; + } +} +else dol_print_error($db); + + +/* + * Last receptions + */ +$sql = "SELECT e.rowid, e.ref, e.ref_supplier,"; +$sql.= " s.nom as name, s.rowid as socid,"; +$sql.= " c.ref as commande_fournisseur_ref, c.rowid as commande_fournisseur_id"; +$sql.= " FROM ".MAIN_DB_PREFIX."reception as e"; +$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."element_element as el ON e.rowid = el.fk_target AND el.targettype = 'reception' AND el.sourcetype IN ('order_supplier')"; +$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."commande_fournisseur as c ON el.fk_source = c.rowid AND el.sourcetype IN ('order_supplier') AND el.targettype = 'reception'"; +$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = e.fk_soc"; +if (! $user->rights->societe->client->voir && ! $socid) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON e.fk_soc = sc.fk_soc"; +$sql.= " WHERE e.entity IN (".getEntity('reception').")"; +if (! $user->rights->societe->client->voir && ! $socid) $sql.= " AND sc.fk_user = " .$user->id; +$sql.= " AND e.fk_statut = 1"; +if ($socid) $sql.= " AND c.fk_soc = ".$socid; +$sql.= " ORDER BY e.date_delivery DESC"; + +$sql.= $db->plimit(5, 0); + +$resql = $db->query($sql); +if ($resql) +{ + $num = $db->num_rows($resql); + if ($num) + { + $i = 0; + print ''; + print ''; + print ''; + while ($i < $num) + { + $obj = $db->fetch_object($resql); + + $reception->id=$obj->rowid; + $reception->ref=$obj->ref; + $reception->ref_supplier=$obj->ref_supplier; + + print ''; + print ''; + print ''; + $i++; + } + print "
'.$langs->trans("LastReceptions", $num).'
'; + print $reception->getNomUrl(1); + print ''.img_object($langs->trans("ShowCompany"),"company").' '.$obj->name.''; + if ($obj->commande_fournisseur_id > 0) + { + $orderstatic->id=$obj->commande_fournisseur_id; + $orderstatic->ref=$obj->commande_fournisseur_ref; + print $orderstatic->getNomUrl(1); + } + else print ' '; + print '

"; + } + $db->free($resql); +} +else dol_print_error($db); + + +print '
'; + + +llxFooter(); +$db->close(); diff --git a/htdocs/reception/list.php b/htdocs/reception/list.php new file mode 100644 index 00000000000..edcd4513c40 --- /dev/null +++ b/htdocs/reception/list.php @@ -0,0 +1,995 @@ + + * Copyright (C) 2004-2015 Laurent Destailleur + * Copyright (C) 2005-2010 Regis Houssin + * Copyright (C) 2016 Ferran Marcet + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/reception/list.php + * \ingroup reception + * \brief Page to list all receptions + */ + +require '../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/reception/class/reception.class.php'; +require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php'; +require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php'; +require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.product.class.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/lib/date.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; + +$langs->load("receptions"); +$langs->load("deliveries"); +$langs->load('companies'); +$langs->load('bills'); + +$socid=GETPOST('socid','int'); +$massaction=GETPOST('massaction','alpha'); +$toselect = GETPOST('toselect', 'array'); + +// Security check +$receptionid = GETPOST('id','int'); +if ($user->societe_id) $socid=$user->societe_id; +$result = restrictedArea($user, 'reception',$receptionid,''); + +$diroutputmassaction=$conf->reception->dir_output . '/temp/massgeneration/'.$user->id; + +$search_ref_rcp = GETPOST("search_ref_rcp"); +$search_ref_liv = GETPOST('search_ref_liv'); +$search_ref_supplier = GETPOST('search_ref_supplier'); +$search_company = GETPOST("search_company"); +$search_town=GETPOST('search_town','alpha'); +$search_zip=GETPOST('search_zip','alpha'); +$search_state=trim(GETPOST("search_state")); +$search_country=GETPOST("search_country",'int'); +$search_type_thirdparty=GETPOST("search_type_thirdparty",'int'); +$search_billed=GETPOST("search_billed",'int'); +$sall = GETPOST('sall', 'alphanohtml'); +$optioncss = GETPOST('optioncss','alpha'); + +$limit = GETPOST('limit','int')?GETPOST('limit','int'):$conf->liste_limit; +$sortfield = GETPOST('sortfield','alpha'); +$sortorder = GETPOST('sortorder','alpha'); +$page = GETPOST('page','int'); +if (! $sortfield) $sortfield="e.ref"; +if (! $sortorder) $sortorder="DESC"; +if (empty($page) || $page == -1) { $page = 0; } // If $page is not defined, or '' or -1 +$offset = $limit * $page; +$pageprev = $page - 1; +$pagenext = $page + 1; + +// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context +$contextpage='receptionlist'; + +$viewstatut=GETPOST('viewstatut'); + +// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context +$hookmanager->initHooks(array('receptionlist')); +$extrafields = new ExtraFields($db); + +// fetch optionals attributes and labels +$extralabels = $extrafields->fetch_name_optionals_label('reception'); +$search_array_options=$extrafields->getOptionalsFromPost($extralabels,'','search_'); + +// List of fields to search into when doing a "search in all" +$fieldstosearchall = array( + 'e.ref'=>"Ref", + 's.nom'=>"ThirdParty", + 'e.note_public'=>'NotePublic', +); +if (empty($user->socid)) $fieldstosearchall["e.note_private"]="NotePrivate"; + +$checkedtypetiers=0; +$arrayfields=array( + 'e.ref'=>array('label'=>$langs->trans("Ref"), 'checked'=>1), + 'e.ref_supplier'=>array('label'=>$langs->trans("RefSupplier"), 'checked'=>1), + 's.nom'=>array('label'=>$langs->trans("ThirdParty"), 'checked'=>1), + 's.town'=>array('label'=>$langs->trans("Town"), 'checked'=>1), + 's.zip'=>array('label'=>$langs->trans("Zip"), 'checked'=>1), + 'state.nom'=>array('label'=>$langs->trans("StateShort"), 'checked'=>0), + 'country.code_iso'=>array('label'=>$langs->trans("Country"), 'checked'=>0), + 'typent.code'=>array('label'=>$langs->trans("ThirdPartyType"), 'checked'=>$checkedtypetiers), + 'e.date_delivery'=>array('label'=>$langs->trans("DateDeliveryPlanned"), 'checked'=>1), + 'e.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500), + 'e.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500), + 'e.fk_statut'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>1000), + 'e.billed'=>array('label'=>$langs->trans("Billed"), 'checked'=>1, 'position'=>1000, 'enabled'=>(!empty($conf->global->WORKFLOW_BILL_ON_RECEPTION))) +); + +// Extra fields +if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) +{ + foreach($extrafields->attribute_label as $key => $val) + { + $arrayfields["ef.".$key]=array('label'=>$extrafields->attribute_label[$key], 'checked'=>$extrafields->attribute_list[$key], 'position'=>$extrafields->attribute_pos[$key], 'enabled'=>$extrafields->attribute_perms[$key]); + } +} + + +/* + * Actions + */ + +if (GETPOST('cancel')) { $action='list'; $massaction=''; } +if (! GETPOST('confirmmassaction') && $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'); + +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_ref_supplier=''; + $search_ref_rcp=''; + $search_ref_liv=''; + $search_company=''; + $search_town=''; + $search_zip=""; + $search_state=""; + $search_type=''; + $search_country=''; + $search_type_thirdparty=''; + $search_billed=''; + $viewstatut=''; + $search_array_options=array(); +} + +if (empty($reshook)) +{ + if ($massaction == 'confirm_createbills') { + + $receptions = GETPOST('toselect','array'); + $createbills_onebythird = GETPOST('createbills_onebythird', 'int'); + $validate_invoices = GETPOST('valdate_invoices', 'int'); + + $TFact = array(); + $TFactThird = array(); + + $nb_bills_created = 0; + + $db->begin(); + $errors =array(); + foreach($receptions as $id_reception) + { + $rcp = new Reception($db); + // On ne facture que les réceptions validées + if ($rcp->fetch($id_reception) <= 0 || $rcp->statut != 1){ + $errors[]=$langs->trans('StatusMustBeValidate',$rcp->ref); + $error++; + continue; + } + + $object = new FactureFournisseur($db); + if (!empty($createbills_onebythird) && !empty($TFactThird[$rcp->socid])){ + $object = $TFactThird[$rcp->socid]; // If option "one bill per third" is set, we use already created reception. + if(empty($object->rowid)&&$object->id != null)$object->rowid = $object->id; + if(!empty($object->rowid))$object->fetchObjectLinked(); + $rcp->fetchObjectLinked(); + + if (count($rcp->linkedObjectsIds['order_supplier']) > 0) + { + foreach ($rcp->linkedObjectsIds['order_supplier'] as $key => $value) + { + if(empty($object->linkedObjectsIds['order_supplier']) || !in_array($value, $object->linkedObjectsIds['order_supplier']))//Dont try to link if already linked + $object->add_object_linked('order_supplier', $value); // add supplier order linked object + } + } + } + else { + $object->socid = $rcp->socid; + $object->type = FactureFournisseur::TYPE_STANDARD; + $object->cond_reglement_id = $rcp->thirdparty->cond_reglement_supplier_id; + $object->mode_reglement_id = $rcp->thirdparty->mode_reglement_supplier_id; + $object->fk_account = !empty($rcp->thirdparty->fk_account)?$rcp->thirdparty->fk_account:0; + $object->remise_percent = !empty($rcp->thirdparty->remise_percent)?$rcp->thirdparty->remise_percent:0; + $object->remise_absolue = !empty($rcp->thirdparty->remise_absolue)?$rcp->thirdparty->remise_absolue:0; + + $object->fk_project = $rcp->fk_project; + $object->ref_supplier = $rcp->ref_supplier; + + $datefacture = dol_mktime(12, 0, 0, GETPOST('remonth'),GETPOST('reday'), GETPOST('reyear')); + if (empty($datefacture)) + { + $datefacture = dol_mktime(date("h"), date("M"), 0, date("m"), date("d"), date("Y")); + } + + $object->date = $datefacture; + $object->origin = 'reception'; + $object->origin_id = $id_reception; + + $rcp->fetchObjectLinked(); + if (count($rcp->linkedObjectsIds['order_supplier']) > 0) + { + foreach ($rcp->linkedObjectsIds['order_supplier'] as $key => $value) + { + $object->linked_objects['order_supplier'] = $value; + } + } + + $res = $object->create($user); + //var_dump($object->error);exit; + if($res > 0){ + $nb_bills_created++; + $object->id = $res; + }else { + $errors[]=$rcp->ref.' : '.$langs->trans($object->error); + $error++; + } + } + + if ($object->id > 0) + { + if(!empty($createbills_onebythird) && !empty($TFactThird[$rcp->socid])){ //cause function create already add object linked for facturefournisseur + $res = $object->add_object_linked($object->origin,$id_reception); + + if ($res==0) + { + $errors[]=$object->error; + $error++; + } + } + + if (! $error) + { + $lines = $rcp->lines; + if (empty($lines) && method_exists($rcp, 'fetch_lines')) + { + $rcp->fetch_lines(); + $lines = $rcp->lines; + } + + $fk_parent_line=0; + $num=count($lines); + + for ($i=0;$i<$num;$i++) + { + $desc=($lines[$i]->desc?$lines[$i]->desc:$lines[$i]->libelle); + if ($lines[$i]->subprice < 0) + { + // Negative line, we create a discount line + $discount = new DiscountAbsolute($db); + $discount->fk_soc=$object->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=$object->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; + } + $result = $object->addline( + $desc, + $lines[$i]->subprice, + $lines[$i]->tva_tx, + $lines[$i]->localtax1_tx, + $lines[$i]->localtax2_tx, + $lines[$i]->qty, + $lines[$i]->fk_product, + $lines[$i]->remise_percent, + $date_start, + $date_end, + 0, + $lines[$i]->info_bits, + 'HT', + $product_type, + $i, + false, + 0, + null, + $lines[$i]->rowid, + 0, + $lines[$i]->ref_supplier + + ); + + $rcp->add_object_linked('facture_fourn_det',$result); + + if ($result > 0) + { + $lineid=$result; + } + else + { + $lineid=0; + $error++; + break; + } + // Defined the new fk_parent_line + if ($result > 0 && $lines[$i]->product_type == 9) + { + $fk_parent_line = $result; + } + } + } + } + } + + //$rcp->classifyBilled($user); // Disabled. This behavior must be set or not using the workflow module. + + if(!empty($createbills_onebythird) && empty($TFactThird[$rcp->socid])) $TFactThird[$rcp->socid] = $object; + else $TFact[$object->id] = $object; + } + + // Build doc with all invoices + $TAllFact = empty($createbills_onebythird) ? $TFact : $TFactThird; + $toselect = array(); + + if (! $error && $validate_invoices) + { + $massaction = $action = 'builddoc'; + foreach($TAllFact as &$object) + { + $result = $object->validate($user); + if ($result <= 0) + { + $error++; + setEventMessages($object->error, $object->errors, 'errors'); + break; + } + + $id = $object->id; // For builddoc action + + // Fac builddoc + $donotredirect = 1; + $upload_dir = $conf->fournisseur->facture->dir_output; + $permissioncreate=$user->rights->fournisseur->facture->creer; + include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php'; + } + + $massaction = $action = 'confirm_createbills'; + } + + if (! $error) + { + $db->commit(); + setEventMessage($langs->trans('BillCreated', $nb_bills_created)); + } + else + { + + $db->rollback(); + $action='create'; + $_GET["origin"]=$_POST["origin"]; + $_GET["originid"]=$_POST["originid"]; + setEventMessages($object->error, $errors, 'errors'); + $error++; + } + } +} + + +/* + * View + */ + +$form=new Form($db); +$companystatic=new Societe($db); +$reception=new Reception($db); +$formcompany=new FormCompany($db); +$formfile = new FormFile($db); + + +$helpurl='EN:Module_Receptions|FR:Module_Receptions|ES:Módulo_Receptiones'; +llxHeader('',$langs->trans('ListOfReceptions'),$helpurl); + +$sql = "SELECT e.rowid, e.ref, e.ref_supplier, e.date_reception as date_reception, e.date_delivery as date_livraison, l.date_delivery as date_reception, e.fk_statut, e.billed,"; +$sql.= ' s.rowid as socid, s.nom as name, 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.= ' e.date_creation as date_creation, e.tms as date_update'; +// Add fields from extrafields +foreach ($extrafields->attribute_label as $key => $val) $sql.=($extrafields->attribute_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."reception as e"; +if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."reception_extrafields as ef on (e.rowid = ef.fk_object)"; +$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = e.fk_soc"; +$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)"; +$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."element_element as ee ON e.rowid = ee.fk_source AND ee.sourcetype = 'reception' AND ee.targettype = 'delivery'"; +$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."livraison as l ON l.rowid = ee.fk_target"; +if (!$user->rights->societe->client->voir && !$socid) // Internal user with no permission to see all +{ + $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; +} +$sql.= " WHERE e.entity IN (".getEntity('reception').")"; +if (!$user->rights->societe->client->voir && !$socid) // Internal user with no permission to see all +{ + $sql.= " AND e.fk_soc = sc.fk_soc"; + $sql.= " AND sc.fk_user = " .$user->id; +} +if ($socid) +{ + $sql.= " AND e.fk_soc = ".$socid; +} +if ($viewstatut <> '' && $viewstatut >= 0) { + $sql.= " AND e.fk_statut = ".$viewstatut; +} +if ($search_billed != '' && $search_billed >= 0) $sql.=' AND e.billed = '.$search_billed; +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 (".$search_country.')'; +if ($search_type_thirdparty) $sql .= " AND s.fk_typent IN (".$search_type_thirdparty.')'; +if ($search_ref_rcp) $sql .= natural_search('e.ref', $search_ref_rcp); +if ($search_ref_liv) $sql .= natural_search('l.ref', $search_ref_liv); +if ($search_company) $sql .= natural_search('s.nom', $search_company); +if ($search_ref_supplier) $sql .= natural_search('e.ref_supplier', $search_ref_supplier); +if ($sall) $sql .= natural_search(array_keys($fieldstosearchall), $sall); + +// Add where from extra fields +foreach ($search_array_options as $key => $val) +{ + $crit=$val; + $tmpkey=preg_replace('/search_options_/','',$key); + $typ=$extrafields->attribute_type[$tmpkey]; + $mode=0; + if (in_array($typ, array('int','double','real'))) $mode=1; // Search on a numeric + if (in_array($typ, array('sellist')) && $crit != '0' && $crit != '-1') $mode=2; // Search on a foreign key int + if ($crit != '' && (! in_array($typ, array('select','sellist')) || $crit != '0')) + { + $sql .= natural_search('ef.'.$tmpkey, $crit, $mode); + } +} +// 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; + +$nbtotalofrecords = ''; +if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) +{ + $result = $db->query($sql); + $nbtotalofrecords = $db->num_rows($result); +} + +$sql.= $db->order($sortfield,$sortorder); +$sql.= $db->plimit($limit + 1,$offset); + +//print $sql; +$resql=$db->query($sql); +if ($resql) +{ + $num = $db->num_rows($resql); + + $reception = new Reception($db); + + $arrayofselected=is_array($toselect)?$toselect:array(); + + $param=''; + if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage; + if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit; + if ($sall) $param.= "&sall=".$sall; + if ($search_ref_rcp) $param.= "&search_ref_rcp=".$search_ref_rcp; + if ($search_ref_liv) $param.= "&search_ref_liv=".$search_ref_liv; + if ($search_company) $param.= "&search_company=".$search_company; + if ($optioncss != '') $param.='&optioncss='.$optioncss; + if ($search_billed != '' && $search_billed >= 0)$param.= "&search_billed=".$search_billed; + if ($search_town) $param.= "&search_town=".$search_town; + if ($search_zip) $param.= "&search_zip=".$search_zip; + if ($search_state) $param.= "&search_state=".$search_state; + if ($viewstatut) $param.= "&viewstatut=".$viewstatut; + if ($search_country) $param.= "&search_country=".$search_country; + if ($search_type_thirdparty) $param.= "&search_type_thirdparty=".$search_type_thirdparty; + if ($search_ref_supplier) $param.= "&search_ref_supplier=".$search_ref_supplier; + // Add $param from extra fields + foreach ($search_array_options as $key => $val) + { + $crit=$val; + $tmpkey=preg_replace('/search_options_/','',$key); + if ($val != '') $param.='&search_options_'.$tmpkey.'='.urlencode($val); + } + + + $arrayofmassactions = array( +// 'presend'=>$langs->trans("SendByMail"), +); + + if($user->rights->fournisseur->facture->creer)$arrayofmassactions['createbills']=$langs->trans("CreateInvoiceForThisSupplier"); + if($massaction == 'createbills') $arrayofmassactions=array(); + $massactionbutton=$form->selectMassAction('', $arrayofmassactions); + //$massactionbutton=$form->selectMassAction('', $massaction == 'presend' ? array() : array('presend'=>$langs->trans("SendByMail"), 'builddoc'=>$langs->trans("PDFMerge"))); + + $i = 0; + print '
'."\n"; + if ($optioncss != '') print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + print_barre_liste($langs->trans('ListOfReceptions'), $page, $_SERVER["PHP_SELF"],$param,$sortfield,$sortorder,$massactionbutton,$num, $nbtotalofrecords, '', 0, '', '', $limit); + + + if ($massaction == 'createbills') + { + //var_dump($_REQUEST); + print ''; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print '
'; + print $langs->trans('DateInvoice'); + print ''; + print $form->select_date('', '', '', '', '', '', 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('valdate_invoices', 0, 1, 1); + print ' ('.$langs->trans("AutoValidationNotPossibleWhenStockIsDecreasedOnInvoiceValidation").')'; + } + else + { + print $form->selectyesno('valdate_invoices', 0, 1); + } + print '
'; + + print '
'; + print '
'; + print ' '; + print ''; + print '
'; + print '
'; + } + + if ($sall) + { + foreach($fieldstosearchall as $key => $val) $fieldstosearchall[$key]=$langs->trans($val); + print $langs->trans("FilterOnInto", $sall) . join(', ',$fieldstosearchall); + } + + $moreforfilter=''; + if (! empty($moreforfilter)) + { + print '
'; + print $moreforfilter; + $parameters=array('type'=>$type); + $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + print '
'; + } + + $varpage=empty($contextpage)?$_SERVER["PHP_SELF"]:$contextpage; + $selectedfields=$form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields + $selectedfields.=$form->showCheckAddButtons('checkforselect', 1); + + + print '
'; + print ''."\n"; + + // Lignes des champs de filtre + print ''; + // Ref + if (! empty($arrayfields['e.ref']['checked'])) + { + print ''; + } + // Ref customer + if (! empty($arrayfields['e.ref_supplier']['checked'])) + { + print ''; + } + // Thirdparty + if (! empty($arrayfields['s.nom']['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 delivery planned + if (! empty($arrayfields['e.date_delivery']['checked'])) + { + print ''; + } + if (! empty($arrayfields['l.ref']['checked'])) + { + // Delivery ref + print ''; + } + // Extra fields + if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) + { + foreach($extrafields->attribute_label as $key => $val) + { + if (! empty($arrayfields["ef.".$key]['checked'])) + { + $align=$extrafields->getAlignFlag($key); + $typeofextrafield=$extrafields->attribute_type[$key]; + print ''; + } + } + } + // 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['e.datec']['checked'])) + { + print ''; + } + // Date modification + if (! empty($arrayfields['e.tms']['checked'])) + { + print ''; + } + // Status + if (! empty($arrayfields['e.fk_statut']['checked'])) + { + print ''; + } + // Status billed + if (! empty($arrayfields['e.billed']['checked'])) + { + print ''; + } + // Action column + print ''; + print "\n"; + + print ''; + if (! empty($arrayfields['e.ref']['checked'])) print_liste_field_titre($arrayfields['e.ref']['label'], $_SERVER["PHP_SELF"],"e.ref","",$param,'',$sortfield,$sortorder); + if (! empty($arrayfields['e.ref_supplier']['checked'])) print_liste_field_titre($arrayfields['e.ref_supplier']['label'], $_SERVER["PHP_SELF"],"e.ref_supplier","",$param,'',$sortfield,$sortorder); + if (! empty($arrayfields['s.nom']['checked'])) print_liste_field_titre($arrayfields['s.nom']['label'], $_SERVER["PHP_SELF"],"s.nom", "", $param,'align="left"',$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,'align="center"',$sortfield,$sortorder); + if (! empty($arrayfields['typent.code']['checked'])) print_liste_field_titre($arrayfields['typent.code']['label'],$_SERVER["PHP_SELF"],"typent.code","",$param,'align="center"',$sortfield,$sortorder); + if (! empty($arrayfields['e.date_delivery']['checked'])) print_liste_field_titre($arrayfields['e.date_delivery']['label'], $_SERVER["PHP_SELF"],"e.date_delivery","",$param, 'align="center"',$sortfield,$sortorder); + if (! empty($arrayfields['l.ref']['checked'])) print_liste_field_titre($arrayfields['l.ref']['label'], $_SERVER["PHP_SELF"],"l.ref","",$param, '',$sortfield,$sortorder); + if (! empty($arrayfields['l.date_delivery']['checked'])) print_liste_field_titre($arrayfields['l.date_delivery']['label'], $_SERVER["PHP_SELF"],"l.date_delivery","",$param, 'align="center"',$sortfield,$sortorder); + // Extra fields + if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) + { + foreach($extrafields->attribute_label as $key => $val) + { + if (! empty($arrayfields["ef.".$key]['checked'])) + { + $align=$extrafields->getAlignFlag($key); + $sortonfield = "ef.".$key; + if (! empty($extrafields->attribute_computed[$key])) $sortonfield=''; + print_liste_field_titre($extralabels[$key],$_SERVER["PHP_SELF"],$sortonfield,"",$param,($align?'align="'.$align.'"':''),$sortfield,$sortorder); + } + } + } + // Hook fields + $parameters=array('arrayfields'=>$arrayfields); + $reshook=$hookmanager->executeHooks('printFieldListTitle',$parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + if (! empty($arrayfields['e.datec']['checked'])) print_liste_field_titre($arrayfields['e.datec']['label'],$_SERVER["PHP_SELF"],"e.date_creation","",$param,'align="center" class="nowrap"',$sortfield,$sortorder); + if (! empty($arrayfields['e.tms']['checked'])) print_liste_field_titre($arrayfields['e.tms']['label'],$_SERVER["PHP_SELF"],"e.tms","",$param,'align="center" class="nowrap"',$sortfield,$sortorder); + if (! empty($arrayfields['e.fk_statut']['checked'])) print_liste_field_titre($arrayfields['e.fk_statut']['label'],$_SERVER["PHP_SELF"],"e.fk_statut","",$param,'align="right"',$sortfield,$sortorder); + if (! empty($arrayfields['e.billed']['checked'])) print_liste_field_titre($arrayfields['e.billed']['label'],$_SERVER["PHP_SELF"],"e.billed","",$param,'align="center"',$sortfield,$sortorder); + print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"],"",'','','align="center"',$sortfield,$sortorder,'maxwidthsearch '); + print "\n"; + + $i=0; + $var=true; + $totalarray=array(); + while ($i < min($num,$limit)) + { + $obj = $db->fetch_object($resql); + + $reception->id=$obj->rowid; + $reception->ref=$obj->ref; + + $companystatic->id=$obj->socid; + $companystatic->ref=$obj->name; + $companystatic->name=$obj->name; + + + print ''; + + // Ref + if (! empty($arrayfields['e.ref']['checked'])) + { + print "\n"; + + if (! $i) $totalarray['nbfield']++; + } + + // Ref customer + if (! empty($arrayfields['e.ref_supplier']['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']++; + } + + // Date delivery planed + if (! empty($arrayfields['e.date_delivery']['checked'])) + { + print '\n"; + } + + if (! empty($arrayfields['l.ref']['checked']) || ! empty($arrayfields['l.date_delivery']['checked'])) + { + $reception->fetchObjectLinked($reception->id,$reception->element); + $receiving=''; + if (count($reception->linkedObjects['delivery']) > 0) $receiving=reset($reception->linkedObjects['delivery']); + + if (! empty($arrayfields['l.ref']['checked'])) + { + // Ref + print ''; + } + + if (! empty($arrayfields['l.date_delivery']['checked'])) + { + // Date received + print ''."\n"; + } + } + + // Extra fields + if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) + { + foreach($extrafields->attribute_label as $key => $val) + { + if (! empty($arrayfields["ef.".$key]['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + } + } + } + // Fields from hook + $parameters=array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $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 + print ''; + if (! $i) $totalarray['nbfield']++; + + print "\n"; + + $i++; + } + + print "
'; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print $form->select_country($search_country,'search_country','',0,'maxwidth100'); + print ''; + print $form->selectarray("search_type_thirdparty", $formcompany->typent_array(0), $search_type_thirdparty, 0, 0, 0, '', 0, 0, 0, (empty($conf->global->SOCIETE_SORT_ON_TYPEENT)?'ASC':$conf->global->SOCIETE_SORT_ON_TYPEENT)); + print ' '; + print ''; + } + if (! empty($arrayfields['l.date_delivery']['checked'])) + { + // Date received + print ' '; + if (in_array($typeofextrafield, array('varchar', 'int', 'double', 'select'))) + { + $crit=$val; + $tmpkey=preg_replace('/search_options_/','',$key); + $searchclass=''; + if (in_array($typeofextrafield, array('varchar', 'select'))) $searchclass='searchstring'; + if (in_array($typeofextrafield, array('int', 'double'))) $searchclass='searchnum'; + print ''; + } + print ''; + print ''; + print ''; + print $form->selectarray('viewstatut', array('0'=>$langs->trans('StatusReceptionDraftShort'),'1'=>$langs->trans('StatusReceptionValidatedShort'),'2'=>$langs->trans('StatusReceptionProcessedShort')),$viewstatut,1); + print ''; + print $form->selectyesno('search_billed', $search_billed, 1, 0, 1); + print ''; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; + print '
"; + print $reception->getNomUrl(1); + $filename=dol_sanitizeFileName($reception->ref); + $filedir=$conf->reception->dir_output . '/' . dol_sanitizeFileName($reception->ref); + $urlsource=$_SERVER['PHP_SELF'].'?id='.$reception->rowid; + print $formfile->getDocumentsLink($reception->element, $filename, $filedir); + print ""; + print $obj->ref_supplier; + 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 (count($typenArray)==0) $typenArray = $formcompany->typent_array(1); + print $typenArray[$obj->typent_code]; + print ''; + print dol_print_date($db->jdate($obj->date_livraison),"day"); + /*$now = time(); + if ( ($now - $db->jdate($obj->date_reception)) > $conf->warnings->lim && $obj->statutid == 1 ) + { + }*/ + print "'; + print !empty($receiving) ? $receiving->getNomUrl($db) : ''; + print ''; + print dol_print_date($db->jdate($obj->date_reception),"day"); + print 'getAlignFlag($key); + if ($align) print ' align="'.$align.'"'; + print '>'; + $tmpkey='options_'.$key; + print $extrafields->showOutputField($key, $obj->$tmpkey, '', 1); + print ''; + print dol_print_date($db->jdate($obj->date_creation), 'dayhour'); + print ''; + print dol_print_date($db->jdate($obj->date_update), 'dayhour'); + print ''.$reception->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 '
"; + print "
"; + print '
'; + $db->free($resql); +} +else +{ + dol_print_error($db); +} + +llxFooter(); +$db->close(); diff --git a/htdocs/reception/note.php b/htdocs/reception/note.php new file mode 100644 index 00000000000..f00a88aaec7 --- /dev/null +++ b/htdocs/reception/note.php @@ -0,0 +1,165 @@ + + * Copyright (C) 2004-2008 Laurent Destailleur + * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2013 Florian Henry + * + * 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/reception/nosendingte.php + * \ingroup receptionsending + * \brief Note card reception + */ + +require '../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/reception/class/reception.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/reception.lib.php'; +dol_include_once('/fourn/class/fournisseur.commande.class.php'); +if (! empty($conf->projet->enabled)) { + require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; + require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php'; +} + +$langs->load("receptions"); +$langs->load("companies"); +$langs->load("bills"); +$langs->load('deliveries'); +$langs->load('orders'); +$langs->load('stocks'); +$langs->load('other'); +$langs->load('propal'); + +$id=(GETPOST('id','int')?GETPOST('id','int'):GETPOST('facid','int')); // For backward compatibility +$ref=GETPOST('ref','alpha'); +$action=GETPOST('action','alpha'); + +// Security check +$socid=''; +if ($user->societe_id) $socid=$user->societe_id; +$result=restrictedArea($user, $origin, $origin_id); + +$object = new Reception($db); +if ($id > 0 || ! empty($ref)) +{ + $object->fetch($id, $ref); + $object->fetch_thirdparty(); + + if (!empty($object->origin)) + { + $typeobject = $object->origin; + $origin = $object->origin; + $object->fetch_origin(); + } + + // Linked documents + if ($typeobject == 'commande' && $object->$typeobject->id && ! empty($conf->commande->enabled)) + { + $objectsrc=new Commande($db); + $objectsrc->fetch($object->$typeobject->id); + } + if ($typeobject == 'propal' && $object->$typeobject->id && ! empty($conf->propal->enabled)) + { + $objectsrc=new Propal($db); + $objectsrc->fetch($object->$typeobject->id); + } +} + +$permissionnote=$user->rights->reception->creer; // Used by the include of actions_setnotes.inc.php + + +/* + * Actions + */ + +include DOL_DOCUMENT_ROOT.'/core/actions_setnotes.inc.php'; // Must be include, not includ_once + + +/* + * View + */ + +llxHeader('','Reception'); + +$form = new Form($db); + +if ($id > 0 || ! empty($ref)) +{ + + $head=reception_prepare_head($object); + dol_fiche_head($head, 'note', $langs->trans("Reception"), -1, 'sending'); + + + // Reception card + $linkback = ''.$langs->trans("BackToList").''; + + $morehtmlref='
'; + // Ref customer reception + $morehtmlref.=$form->editfieldkey("RefSupplier", '', $object->ref_supplier, $object, $user->rights->reception->creer, 'string', '', 0, 1); + $morehtmlref.=$form->editfieldval("RefSupplier", '', $object->ref_supplier, $object, $user->rights->reception->creer, 'string', '', null, null, '', 1); + // Thirdparty + $morehtmlref.='
'.$langs->trans('ThirdParty') . ' : ' . $object->thirdparty->getNomUrl(1); + // Project + if (! empty($conf->projet->enabled)) { + $langs->load("projects"); + $morehtmlref .= '
' . $langs->trans('Project') . ' '; + if (0) { // Do not change on reception + 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', $maxlength, 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 { + // We don't have project on reception, so we will use the project or source object instead + // TODO Add project on reception + $morehtmlref .= ' : '; + if (! empty($objectsrc->fk_project)) { + $proj = new Project($db); + $proj->fetch($objectsrc->fk_project); + $morehtmlref .= ''; + $morehtmlref .= $proj->ref; + $morehtmlref .= ''; + } else { + $morehtmlref .= ''; + } + } + } + $morehtmlref.='
'; + + $object->picto = 'sending'; + dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref); + + + print '
'; + + $cssclass='titlefield'; + include DOL_DOCUMENT_ROOT.'/core/tpl/notes.tpl.php'; + + dol_fiche_end(); +} + + +llxFooter(); + +$db->close(); diff --git a/htdocs/reception/stats/index.php b/htdocs/reception/stats/index.php new file mode 100644 index 00000000000..ae8a493f805 --- /dev/null +++ b/htdocs/reception/stats/index.php @@ -0,0 +1,365 @@ + + * Copyright (C) 2004-2016 Laurent Destailleur + * Copyright (C) 2005-2009 Regis Houssin + * Copyright (C) 2018 Quentin Vial-Gouteyron + * + * 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/reception/stats/index.php + * \ingroup reception + * \brief Page with reception statistics + */ + +require '../../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/reception/class/reception.class.php'; +require_once DOL_DOCUMENT_ROOT.'/reception/class/receptionstats.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/dolgraph.class.php'; + +$WIDTH=DolGraph::getDefaultGraphSizeForStats('width'); +$HEIGHT=DolGraph::getDefaultGraphSizeForStats('height'); + +$userid=GETPOST('userid','int'); +$socid=GETPOST('socid','int'); +// Security check +if ($user->societe_id > 0) +{ + $action = ''; + $socid = $user->societe_id; +} + +$nowyear=strftime("%Y", dol_now()); +$year = GETPOST('year')>0?GETPOST('year'):$nowyear; +//$startyear=$year-2; +$startyear=$year-1; +$endyear=$year; + +$langs->load("reception"); +$langs->load("other"); +$langs->load("companies"); + + +/* + * View + */ + +$form=new Form($db); + +llxHeader(); + +print load_fiche_titre($langs->trans("StatisticsOfReceptions"), $mesg); + + +dol_mkdir($dir); + +$stats = new ReceptionStats($db, $socid, $mode, ($userid>0?$userid:0)); + +// Build graphic number of object +$data = $stats->getNbByMonthWithPrevYear($endyear,$startyear); +//var_dump($data);exit; +// $data = array(array('Lib',val1,val2,val3),...) + + +if (!$user->rights->societe->client->voir || $user->societe_id) +{ + $filenamenb = $dir.'/receptionsnbinyear-'.$user->id.'-'.$year.'.png'; + if ($mode == 'customer') $fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=receptionstats&file=receptionsnbinyear-'.$user->id.'-'.$year.'.png'; + if ($mode == 'supplier') $fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=receptionstatssupplier&file=receptionsnbinyear-'.$user->id.'-'.$year.'.png'; +} +else +{ + $filenamenb = $dir.'/receptionsnbinyear-'.$year.'.png'; + if ($mode == 'customer') $fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=receptionstats&file=receptionsnbinyear-'.$year.'.png'; + if ($mode == 'supplier') $fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=receptionstatssupplier&file=receptionsnbinyear-'.$year.'.png'; +} + +$px1 = new DolGraph(); +$mesg = $px1->isGraphKo(); +if (! $mesg) +{ + $px1->SetData($data); + $px1->SetPrecisionY(0); + $i=$startyear;$legend=array(); + while ($i <= $endyear) + { + $legend[]=$i; + $i++; + } + $px1->SetLegend($legend); + $px1->SetMaxValue($px1->GetCeilMaxValue()); + $px1->SetMinValue(min(0,$px1->GetFloorMinValue())); + $px1->SetWidth($WIDTH); + $px1->SetHeight($HEIGHT); + $px1->SetYLabel($langs->trans("NbOfReceptions")); + $px1->SetShading(3); + $px1->SetHorizTickIncrement(1); + $px1->SetPrecisionY(0); + $px1->mode='depth'; + $px1->SetTitle($langs->trans("NumberOfReceptionsByMonth")); + + $px1->draw($filenamenb,$fileurlnb); +} + +// Build graphic amount of object +/* +$data = $stats->getAmountByMonthWithPrevYear($endyear,$startyear); +//var_dump($data); +// $data = array(array('Lib',val1,val2,val3),...) + +if (!$user->rights->societe->client->voir || $user->societe_id) +{ + $filenameamount = $dir.'/receptionsamountinyear-'.$user->id.'-'.$year.'.png'; + if ($mode == 'customer') $fileurlamount = DOL_URL_ROOT.'/viewimage.php?modulepart=receptionstats&file=receptionsamountinyear-'.$user->id.'-'.$year.'.png'; + if ($mode == 'supplier') $fileurlamount = DOL_URL_ROOT.'/viewimage.php?modulepart=receptionstatssupplier&file=receptionsamountinyear-'.$user->id.'-'.$year.'.png'; +} +else +{ + $filenameamount = $dir.'/receptionsamountinyear-'.$year.'.png'; + if ($mode == 'customer') $fileurlamount = DOL_URL_ROOT.'/viewimage.php?modulepart=receptionstats&file=receptionsamountinyear-'.$year.'.png'; + if ($mode == 'supplier') $fileurlamount = DOL_URL_ROOT.'/viewimage.php?modulepart=receptionstatssupplier&file=receptionsamountinyear-'.$year.'.png'; +} + +$px2 = new DolGraph(); +$mesg = $px2->isGraphKo(); +if (! $mesg) +{ + $px2->SetData($data); + $i=$startyear;$legend=array(); + while ($i <= $endyear) + { + $legend[]=$i; + $i++; + } + $px2->SetLegend($legend); + $px2->SetMaxValue($px2->GetCeilMaxValue()); + $px2->SetMinValue(min(0,$px2->GetFloorMinValue())); + $px2->SetWidth($WIDTH); + $px2->SetHeight($HEIGHT); + $px2->SetYLabel($langs->trans("AmountOfReceptions")); + $px2->SetShading(3); + $px2->SetHorizTickIncrement(1); + $px2->SetPrecisionY(0); + $px2->mode='depth'; + $px2->SetTitle($langs->trans("AmountOfReceptionsByMonthHT")); + + $px2->draw($filenameamount,$fileurlamount); +} +*/ + +/* +$data = $stats->getAverageByMonthWithPrevYear($endyear, $startyear); + +if (!$user->rights->societe->client->voir || $user->societe_id) +{ + $filename_avg = $dir.'/receptionsaverage-'.$user->id.'-'.$year.'.png'; + if ($mode == 'customer') $fileurl_avg = DOL_URL_ROOT.'/viewimage.php?modulepart=receptionstats&file=receptionsaverage-'.$user->id.'-'.$year.'.png'; + if ($mode == 'supplier') $fileurl_avg = DOL_URL_ROOT.'/viewimage.php?modulepart=receptionstatssupplier&file=receptionsaverage-'.$user->id.'-'.$year.'.png'; +} +else +{ + $filename_avg = $dir.'/receptionsaverage-'.$year.'.png'; + if ($mode == 'customer') $fileurl_avg = DOL_URL_ROOT.'/viewimage.php?modulepart=receptionstats&file=receptionsaverage-'.$year.'.png'; + if ($mode == 'supplier') $fileurl_avg = DOL_URL_ROOT.'/viewimage.php?modulepart=receptionstatssupplier&file=receptionsaverage-'.$year.'.png'; +} + +$px3 = new DolGraph(); +$mesg = $px3->isGraphKo(); +if (! $mesg) +{ + $px3->SetData($data); + $i=$startyear;$legend=array(); + while ($i <= $endyear) + { + $legend[]=$i; + $i++; + } + $px3->SetLegend($legend); + $px3->SetYLabel($langs->trans("AmountAverage")); + $px3->SetMaxValue($px3->GetCeilMaxValue()); + $px3->SetMinValue($px3->GetFloorMinValue()); + $px3->SetWidth($WIDTH); + $px3->SetHeight($HEIGHT); + $px3->SetShading(3); + $px3->SetHorizTickIncrement(1); + $px3->SetPrecisionY(0); + $px3->mode='depth'; + $px3->SetTitle($langs->trans("AmountAverage")); + + $px3->draw($filename_avg,$fileurl_avg); +} +*/ + + +// Show array +$data = $stats->getAllByYear(); +$arrayyears=array(); +foreach($data as $val) { + if (! empty($val['year'])) { + $arrayyears[$val['year']]=$val['year']; + } +} +if (! count($arrayyears)) $arrayyears[$nowyear]=$nowyear; + +$h=0; +$head = array(); +$head[$h][0] = DOL_URL_ROOT . '/commande/stats/index.php?mode='.$mode; +$head[$h][1] = $langs->trans("ByMonthYear"); +$head[$h][2] = 'byyear'; +$h++; + +$type='reception_stats'; + +complete_head_from_modules($conf,$langs,null,$head,$h,$type); + +dol_fiche_head($head, 'byyear', $langs->trans("Statistics"), -1); + + +print '
'; + + +//if (empty($socid)) +//{ + // Show filter box + print '
'; + print ''; + + print ''; + print ''; + // Company + print ''; + // User + print ''; + // Year + print ''; + print ''; + print '
'.$langs->trans("Filter").'
'.$langs->trans("ThirdParty").''; + if ($mode == 'customer') $filter='s.client in (1,2,3)'; + if ($mode == 'supplier') $filter='s.fournisseur = 1'; + print $form->select_company($socid,'socid',$filter,1,0,0,array(),0,'','style="width: 95%"'); + print '
'.$langs->trans("CreatedBy").''; + print $form->select_dolusers($userid, 'userid', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); + print '
'.$langs->trans("Year").''; + if (! in_array($year,$arrayyears)) $arrayyears[$year]=$year; + if (! in_array($nowyear,$arrayyears)) $arrayyears[$nowyear]=$nowyear; + arsort($arrayyears); + print $form->selectarray('year',$arrayyears,$year,0); + print '
'; + print '
'; + print '

'; +//} + +print ''; +print ''; +print ''; +print ''; +/*print ''; +print '';*/ +print ''; + +$oldyear=0; +foreach ($data as $val) +{ + $year = $val['year']; + while (! empty($year) && $oldyear > $year+1) + { // If we have empty year + $oldyear--; + + + print ''; + print ''; + + print ''; + /*print ''; + print '';*/ + print ''; + } + + print ''; + print ''; + print ''; + /*print ''; + print '';*/ + print ''; + $oldyear=$year; +} + +print '
'.$langs->trans("Year").''.$langs->trans("NbOfReceptions").''.$langs->trans("AmountTotal").''.$langs->trans("AmountAverage").'
'.$oldyear.'000
'; + if ($year) print ''.$year.''; + else print $langs->trans("ValidationDateNotDefinedEvenIfReceptionValidated"); + print ''.$val['nb'].''.price(price2num($val['total'],'MT'),1).''.price(price2num($val['avg'],'MT'),1).'
'; + + +print '
'; + + +// Show graphs +print '
'; +if ($mesg) { print $mesg; } +else { + print $px1->show(); + print "
\n"; + /*print $px2->show(); + print "
\n"; + print $px3->show();*/ +} +print '
'; + + +print '
'; +print '
'; + +dol_fiche_end(); + + + +// TODO USe code similar to commande/stats/index.php instead of this one. +/* +print ''; +print ''; +print ''; + +$sql = "SELECT count(*) as nb, date_format(date_reception,'%Y') as dm"; +$sql.= " FROM ".MAIN_DB_PREFIX."reception"; +$sql.= " WHERE fk_statut > 0"; +$sql.= " AND entity = ".$conf->entity; +$sql.= " GROUP BY dm DESC"; + +$resql=$db->query($sql); +if ($resql) +{ + $num = $db->num_rows($resql); + $i = 0; + while ($i < $num) + { + $row = $db->fetch_row($resql); + $nbproduct = $row[0]; + $year = $row[1]; + print ""; + print ''; + $i++; + } +} +$db->free($resql); + +print '
'.$langs->trans("Year").''.$langs->trans("NbOfReceptions").'
'.$year.''.$nbproduct.'
'; +*/ + +print '
'; +print ''.$langs->trans("StatsOnReceptionsOnlyValidated").''; + +llxFooter(); + +$db->close(); diff --git a/htdocs/reception/stats/month.php b/htdocs/reception/stats/month.php new file mode 100644 index 00000000000..df11f046e65 --- /dev/null +++ b/htdocs/reception/stats/month.php @@ -0,0 +1,76 @@ + + * Copyright (C) 2004-2009 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 + * 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/reception/stats/month.php + * \ingroup commande + * \brief Page des stats receptions par mois + */ + +require '../../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/reception/class/reception.class.php'; +require_once DOL_DOCUMENT_ROOT.'/reception/class/receptionstats.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/dolgraph.class.php'; + + +/* + * View + */ + +llxHeader(); + +$WIDTH=DolGraph::getDefaultGraphSizeForStats('width'); +$HEIGHT=DolGraph::getDefaultGraphSizeForStats('height'); + +$mesg = ''; + +print load_fiche_titre($langs->trans("StatisticsOfReceptions").' '.$_GET["year"], $mesg); + +$stats = new ReceptionStats($db); +$data = $stats->getNbReceptionByMonth($_GET["year"]); + +dol_mkdir($conf->reception->dir_temp); + +$filename = $conf->reception->dir_temp."/reception".$year.".png"; +$fileurl = DOL_URL_ROOT.'/viewimage.php?modulepart=receptionstats&file=reception'.$year.'.png'; + +$px = new DolGraph(); +$mesg = $px->isGraphKo(); +if (! $mesg) +{ + $px->SetData($data); + $px->SetMaxValue($px->GetCeilMaxValue()); + $px->SetWidth($WIDTH); + $px->SetHeight($HEIGHT); + $px->SetYLabel($langs->trans("NbOfOrders")); + $px->SetShading(3); + $px->SetHorizTickIncrement(1); + $px->SetPrecisionY(0); + $px->draw($filename,$fileurl); +} + +print ''; +print ''; +print ''; +print '
Nombre d reception par mois'; +print $px->show(); +print '
'; + +llxFooter(); + +$db->close(); diff --git a/htdocs/reception/tpl/index.html b/htdocs/reception/tpl/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/reception/tpl/linkedobjectblock.tpl.php b/htdocs/reception/tpl/linkedobjectblock.tpl.php new file mode 100644 index 00000000000..3847b4dadd9 --- /dev/null +++ b/htdocs/reception/tpl/linkedobjectblock.tpl.php @@ -0,0 +1,79 @@ + + * Copyright (C) 2014 Marcos García + * + * 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 . + */ +?> + + + +load("receptions"); + +$total=0; $ilink=0; +$var=true; +foreach($linkedObjectBlock as $key => $objectlink) +{ + $ilink++; + + $trclass=($var?'pair':'impair'); + if ($ilink == count($linkedObjectBlock) && empty($noMoreLinkedObjectBlockAfter) && count($linkedObjectBlock) <= 1) $trclass.=' liste_sub_total'; +?> +
trans("Reception"); ?>getNomUrl(1); ?>date_delivery,'day'); ?>rights->reception->lire) { + $total = $total + $objectlink->total_ht; + echo price($objectlink->total_ht); + } ?>getLibStatut(3); ?> + element != 'order_supplier') { + ?> + ">transnoentitiesnoconv("RemoveLink"), 'unlink'); ?>
trans("Total"); ?>
'.fieldLabel('FirstName','firstname').'
'.$form->editfieldkey('FirstName', 'firstname', '', $object, 0).'
'.fieldLabel('UserTitle','civility_id').''; + print '
'.$form->editfieldkey('UserTitle', 'civility_id', '', $object, 0).''; print $formcompany->select_civility($object->civility_id, 'civility_id', 'maxwidth100').'
'.fieldLabel('ProspectCustomer','customerprospect',1).'
'.$form->editfieldkey('ProspectCustomer', 'customerprospect', '', $object, 0, 'string', '', 1).''; $selected=GETPOST('client','int')!=''?GETPOST('client','int'):$object->client; print ''.fieldLabel('CustomerCode','customer_code').''; + print ''.$form->editfieldkey('CustomerCode', 'customer_code', '', $object, 0).''; print ''; - print ''; // Barcode if (! empty($conf->barcode->enabled)) { - print ''; + print ''; print ''; } // Address - print ''; + print ''; print ''; // Zip / Town - print ''; // Country - print ''; @@ -1264,11 +1265,11 @@ else { if(!empty($conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT) && ($conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT == 1 || $conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT == 2)) { - print ''; + print ''; print ''; - print ''; + print ''; print ''; if (! empty($conf->socialnetworks->enabled)) @@ -1287,27 +1288,33 @@ else // Skype if (! empty($conf->global->SOCIALNETWORKS_SKYPE)) { - print ''; - print ''; + print ''; + print ''; } // Twitter if (! empty($conf->global->SOCIALNETWORKS_TWITTER)) { - print ''; - print ''; + print ''; + print ''; } // Facebook if (! empty($conf->global->SOCIALNETWORKS_FACEBOOK)) { - print ''; - print ''; + print ''; + print ''; } } // Phone / Fax - print ''; + print ''; print ''; - print ''; + print ''; print ''; // Prof ids @@ -1322,7 +1329,7 @@ else if (($j % 2) == 0) print ''; $idprof_mandatory ='SOCIETE_IDPROF'.($i).'_MANDATORY'; - print ''; @@ -1334,11 +1341,11 @@ else if ($j % 2 == 1) print ''; // Vat is used - print ''; + print ''; print ''; - print ''; + print ''; print ''; - print ''; // Legal Form - print ''; + print ''; print ''; // Capital - print ''; + print ''; print ''; if (! empty($conf->global->MAIN_MULTILANGS)) { - print ''; print ''; @@ -1431,7 +1438,7 @@ else if (!empty($conf->incoterm->enabled)) { print ''; - print ''; + print ''; print ''; @@ -1444,7 +1451,7 @@ else // Customer //if ($object->prospect || $object->client || (! $object->fournisseur && ! empty($conf->global->THIRDPARTY_CAN_HAVE_CATEGORY_EVEN_IF_NOT_CUSTOMER_PROSPECT_SUPPLIER))) { - print '"; @@ -1452,7 +1459,7 @@ else // Supplier //if ($object->fournisseur) { - print '"; @@ -1463,7 +1470,7 @@ else if (! empty($conf->multicurrency->enabled)) { print ''; - print ''; + print ''; print ''; @@ -1478,18 +1485,18 @@ else print $object->showOptionals($extrafields,'edit'); } - // Assign a sale representative - print ''; - print ''; - print ''; + // Assign a sale representative + print ''; + print ''; + print ''; // Ajout du logo print ''; - print ''; + print ''; print ''; @@ -1736,7 +1743,7 @@ else } // Name - print ''; + print ''; print ''; // Alias names (commercial, trademark or alias names) @@ -1746,7 +1753,7 @@ else // Prefix if (! empty($conf->global->SOCIETE_USEPREFIX)) // Old not used prefix field { - print ''; + print ''; print ''; - print ''; - print ''; + print ''; print ''; @@ -2626,7 +2629,7 @@ else else { $langs->load("mails"); - print ''; + print ''; } if ($user->rights->societe->creer) diff --git a/htdocs/societe/class/api_thirdparties.class.php b/htdocs/societe/class/api_thirdparties.class.php index 42d1d616852..50d9710be40 100644 --- a/htdocs/societe/class/api_thirdparties.class.php +++ b/htdocs/societe/class/api_thirdparties.class.php @@ -894,7 +894,7 @@ class Thirdparties extends DolibarrApi } - $sql = "SELECT f.facnumber, f.type as factype, re.fk_facture_source, re.rowid, re.amount_ht, re.amount_tva, re.amount_ttc, re.description, re.fk_facture, re.fk_facture_line"; + $sql = "SELECT f.ref, f.type as factype, re.fk_facture_source, re.rowid, re.amount_ht, re.amount_tva, re.amount_ttc, re.description, re.fk_facture, re.fk_facture_line"; $sql .= " FROM ".MAIN_DB_PREFIX."societe_remise_except as re, ".MAIN_DB_PREFIX."facture as f"; $sql .= " WHERE f.rowid = re.fk_facture_source AND re.fk_soc = ".$id; if ($filter == "available") $sql .= " AND re.fk_facture IS NULL AND re.fk_facture_line IS NULL"; diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index de792c69189..7559301a913 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -3804,7 +3804,7 @@ class Societe extends CommonObject if ($mode == 'supplier') { $sql .= " AND entity IN (".getEntity('facture_fourn').")"; } else { - $sql .= " AND entity IN (".getEntity('facture').")"; + $sql .= " AND entity IN (".getEntity('invoice').")"; } dol_syslog("getOutstandingBills", LOG_DEBUG); diff --git a/htdocs/societe/consumption.php b/htdocs/societe/consumption.php index 3a3fb8507c9..c1a0605b2e1 100644 --- a/htdocs/societe/consumption.php +++ b/htdocs/societe/consumption.php @@ -200,13 +200,13 @@ if ($type_element == 'invoice') { // Customer : show products from invoices require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; $documentstatic=new Facture($db); - $sql_select = 'SELECT f.rowid as doc_id, f.facnumber as doc_number, f.type as doc_type, f.datef as dateprint, f.fk_statut as status, f.paye as paid, '; + $sql_select = 'SELECT f.rowid as doc_id, f.ref as doc_number, f.type as doc_type, f.datef as dateprint, f.fk_statut as status, f.paye as paid, '; $tables_from = MAIN_DB_PREFIX."facture as f,".MAIN_DB_PREFIX."facturedet as d"; $where = " WHERE f.fk_soc = s.rowid AND s.rowid = ".$socid; $where.= " AND d.fk_facture = f.rowid"; $where.= " AND f.entity = ".$conf->entity; $dateprint = 'f.datef'; - $doc_number='f.facnumber'; + $doc_number='f.ref'; $thirdTypeSelect='customer'; } if ($type_element == 'propal') diff --git a/htdocs/societe/project.php b/htdocs/societe/project.php index 97e6817f5d5..5d8936060ac 100644 --- a/htdocs/societe/project.php +++ b/htdocs/societe/project.php @@ -133,7 +133,7 @@ if ($socid) /* } else { - print ''.$langs->trans("AddProject").''; + print ''.$langs->trans("AddProject").''; } } diff --git a/htdocs/stripe/class/actions_stripe.class.php b/htdocs/stripe/class/actions_stripe.class.php index 69dc4e33307..a7a2e56ecff 100644 --- a/htdocs/stripe/class/actions_stripe.class.php +++ b/htdocs/stripe/class/actions_stripe.class.php @@ -215,23 +215,23 @@ class ActionsStripeconnect } else { - print ''.$langs->trans("StripeConnectPay").''; + print ''.$langs->trans("StripeConnectPay").''; } } elseif ($resteapayer == 0) { - print ''.$langs->trans("StripeConnectPay").''; + print ''.$langs->trans("StripeConnectPay").''; } } else { - print ''.$langs->trans("StripeConnectPay").''; + print ''.$langs->trans("StripeConnectPay").''; } } elseif (is_object($object) && $object->element == 'invoice_supplier'){ - print ''.$langs->trans("StripeConnectPay").''; + print ''.$langs->trans("StripeConnectPay").''; } elseif (is_object($object) && $object->element == 'member'){ - print ''.$langs->trans("StripeAutoSubscription").''; + print ''.$langs->trans("StripeAutoSubscription").''; } return 0; } diff --git a/htdocs/stripe/payment.php b/htdocs/stripe/payment.php index 7a06da294ab..a99104409ef 100644 --- a/htdocs/stripe/payment.php +++ b/htdocs/stripe/payment.php @@ -762,7 +762,7 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie * List of unpaid invoices */ - $sql = 'SELECT f.rowid as facid, f.facnumber, f.total_ttc, f.multicurrency_code, f.multicurrency_total_ttc, f.type, '; + $sql = 'SELECT f.rowid as facid, f.ref, f.total_ttc, f.multicurrency_code, f.multicurrency_total_ttc, f.type, '; $sql.= ' f.datef as df, f.fk_soc as socid'; $sql.= ' FROM '.MAIN_DB_PREFIX.'facture as f'; @@ -789,7 +789,7 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie } // Sort invoices by date and serial number: the older one comes first - $sql.=' ORDER BY f.datef ASC, f.facnumber ASC'; + $sql.=' ORDER BY f.datef ASC, f.ref ASC'; $resql = $db->query($sql); if ($resql) @@ -1073,7 +1073,7 @@ if (! GETPOST('action')) if (! $sortorder) $sortorder='DESC'; if (! $sortfield) $sortfield='p.datep'; - $sql = 'SELECT p.datep as dp, p.amount, f.amount as fa_amount, f.facnumber'; + $sql = 'SELECT p.datep as dp, p.amount, f.amount as fa_amount, f.ref'; $sql.=', f.rowid as facid, c.libelle as paiement_type, p.num_paiement'; $sql.= ' FROM '.MAIN_DB_PREFIX.'paiement as p, '.MAIN_DB_PREFIX.'facture as f, '.MAIN_DB_PREFIX.'c_paiement as c'; $sql.= ' WHERE p.fk_facture = f.rowid AND p.fk_paiement = c.id'; @@ -1095,7 +1095,7 @@ if (! GETPOST('action')) print_barre_liste($langs->trans('Payments'), $page, $_SERVER["PHP_SELF"],'',$sortfield,$sortorder,'',$num); print '
'; $tmpcode=$object->code_client; if (empty($tmpcode) && ! empty($modCodeClient->code_auto)) $tmpcode=$modCodeClient->getNextValue($object,0); @@ -1202,7 +1203,7 @@ else { // Supplier print '
'.fieldLabel('Supplier','fournisseur',1).''; + print ''.$form->editfieldkey('Supplier', 'fournisseur', '', $object, 0, 'string', '', 1).''; $default = -1; if (! empty($conf->global->THIRDPARTY_SUPPLIER_BY_DEFAULT)) $default=1; print $form->selectyesno("fournisseur", (GETPOST('fournisseur','int')!=''?GETPOST('fournisseur','int'):(GETPOST("type",'alpha') == '' ? $default : $object->fournisseur)), 1, 0, (GETPOST("type",'alpha') == '' ? 1 : 0)); @@ -1210,7 +1211,7 @@ else print ''; if (! empty($conf->fournisseur->enabled) && ! empty($user->rights->fournisseur->lire)) { - print fieldLabel('SupplierCode','supplier_code'); + print $form->editfieldkey('SupplierCode', 'supplier_code', '', $object, 0); } print ''; if (! empty($conf->fournisseur->enabled) && ! empty($user->rights->fournisseur->lire)) @@ -1228,33 +1229,33 @@ else } // Status - print '
'.fieldLabel('Status','status').''; + print '
'.$form->editfieldkey('Status', 'status', '', $object, 0).''; print $form->selectarray('status', array('0'=>$langs->trans('ActivityCeased'),'1'=>$langs->trans('InActivity')),1); print '
'.fieldLabel('Gencod','barcode').'
'.$form->editfieldkey('Gencod', 'barcode', '', $object, 0).''; print '
'.fieldLabel('Address','address').'
'.$form->editfieldkey('Address', 'address', '', $object, 0).'
'.fieldLabel('Zip','zipcode').''; + print '
'.$form->editfieldkey('Zip', 'zipcode', '', $object, 0).''; print $formcompany->select_ziptown($object->zip,'zipcode',array('town','selectcountry_id','state_id'), 0, 0, '', 'maxwidth100 quatrevingtpercent'); - print ''.fieldLabel('Town','town').''; + print ''.$form->editfieldkey('Town', 'town', '', $object, 0).''; print $formcompany->select_ziptown($object->town,'town',array('zipcode','selectcountry_id','state_id'), 0, 0, '', 'maxwidth100 quatrevingtpercent'); print '
'.fieldLabel('Country','selectcountry_id').''; + print '
'.$form->editfieldkey('Country', 'selectcountry_id', '', $object, 0).''; print $form->select_country((GETPOST('country_id')!=''?GETPOST('country_id'):$object->country_id)); if ($user->admin) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1); print '
'.fieldLabel('Region-State','state_id').''; + print '
'.$form->editfieldkey('Region-State', 'state_id', '', $object, 0).''; } else { - print '
'.fieldLabel('State','state_id').''; + print '
'.$form->editfieldkey('State', 'state_id', '', $object, 0).''; } if ($object->country_id) print $formcompany->select_state($object->state_id,$object->country_code); @@ -1277,9 +1278,9 @@ else } // Email / Web - print '
'.fieldLabel('EMail','email',$conf->global->SOCIETE_EMAIL_MANDATORY).'
'.$form->editfieldkey('EMail', 'email', '', $object, 0, 'string', '', $conf->global->SOCIETE_EMAIL_MANDATORY).'
'.fieldLabel('Web','url').'
'.$form->editfieldkey('Web', 'url', '', $object, 0).'
'.fieldLabel('Skype','skype').'skype).'">
'.$form->editfieldkey('Skype', 'skype', '', $object, 0).''; + print 'skype).'">'; + print '
'.fieldLabel('Twitter','twitter').'twitter).'">
'.$form->editfieldkey('Twitter', 'twitter', '', $object, 0).''; + print 'twitter).'">'; + print '
'.fieldLabel('Facebook','facebook').'facebook).'">
'.$form->editfieldkey('Facebook', 'facebook', '', $object, 0).''; + print 'facebook).'">'; + print '
'.fieldLabel('Phone','phone').'
'.$form->editfieldkey('Phone', 'phone', '', $object, 0).''.fieldLabel('Fax','fax').''.$form->editfieldkey('Fax', 'fax', '', $object, 0).'
'.fieldLabel($idprof,$key, (empty($conf->global->$idprof_mandatory)?0:1)).''; + print ''.$form->editfieldkey($idprof, $key, '', $object, 0, 'string', '', (empty($conf->global->$idprof_mandatory)?0:1)).''; print $formcompany->get_input_id_prof($i, $key, $object->$key, $object->country_code); print '
'.fieldLabel('VATIsUsed','assujtva_value').'
'.$form->editfieldkey('VATIsUsed', 'assujtva_value', '', $object, 0).''; print $form->selectyesno('assujtva_value', GETPOSTISSET('assujtva_value')?GETPOST('assujtva_value','int'):1, 1); // Assujeti par defaut en creation print ''.fieldLabel('VATIntra','intra_vat').''.$form->editfieldkey('VATIntra', 'intra_vat', '', $object, 0).''; $s = ''; @@ -1391,18 +1398,18 @@ else } // Type - Size - print '
'.fieldLabel('ThirdPartyType','typent_id').''."\n"; + print '
'.$form->editfieldkey('ThirdPartyType', 'typent_id', '', $object, 0).''."\n"; $sortparam=(empty($conf->global->SOCIETE_SORT_ON_TYPEENT)?'ASC':$conf->global->SOCIETE_SORT_ON_TYPEENT); // NONE means we keep sort of original array, so we sort on position. ASC, means next function will sort on label. print $form->selectarray("typent_id", $formcompany->typent_array(0), $object->typent_id, 0, 0, 0, '', 0, 0, 0, $sortparam); if ($user->admin) print ' '.info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1); print ''.fieldLabel('Staff','effectif_id').''; + print ''.$form->editfieldkey('Staff', 'effectif_id', '', $object, 0).''; print $form->selectarray("effectif_id", $formcompany->effectif_array(0), $object->effectif_id); if ($user->admin) print ' '.info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1); print '
'.fieldLabel('JuridicalStatus','forme_juridique_code').'
'.$form->editfieldkey('JuridicalStatus', 'forme_juridique_code', '', $object, 0).''; if ($object->country_id) { @@ -1415,13 +1422,13 @@ else print '
'.fieldLabel('Capital','capital').'
'.$form->editfieldkey('Capital', 'capital', '', $object, 0).' '; print ''.$langs->trans("Currency".$conf->currency).'
'.fieldLabel('DefaultLang','default_lang').''."\n"; + print '
'.$form->editfieldkey('DefaultLang', 'default_lang', '', $object, 0).''."\n"; print $formadmin->select_language(($object->default_lang?$object->default_lang:$conf->global->MAIN_LANG_DEFAULT),'default_lang',0,0,1,0,0,'maxwidth200onsmartphone'); print '
'.fieldLabel('IncotermLabel','incoterm_id').''.$form->editfieldkey('IncotermLabel', 'incoterm_id', '', $object, 0).''; print $form->select_incoterms((!empty($object->fk_incoterms) ? $object->fk_incoterms : ''), (!empty($object->location_incoterms)?$object->location_incoterms:'')); print '
' . fieldLabel('CustomersProspectsCategoriesShort', 'custcats') . ''; + print '
' . $form->editfieldkey('CustomersProspectsCategoriesShort', 'custcats', '', $object, 0) . ''; $cate_arbo = $form->select_all_categories(Categorie::TYPE_CUSTOMER, null, 'parent', null, null, 1); print $form->multiselectarray('custcats', $cate_arbo, GETPOST('custcats', 'array'), null, null, null, null, "90%"); print "
' . fieldLabel('SuppliersCategoriesShort', 'suppcats') . ''; + print '
' . $form->editfieldkey('SuppliersCategoriesShort', 'suppcats', '', $object, 0) . ''; $cate_arbo = $form->select_all_categories(Categorie::TYPE_SUPPLIER, null, 'parent', null, null, 1); print $form->multiselectarray('suppcats', $cate_arbo, GETPOST('suppcats', 'array'), null, null, null, null, "90%"); print "
'.fieldLabel('Currency','multicurrency_code').''.$form->editfieldkey('Currency', 'multicurrency_code', '', $object, 0).''; print $form->selectMultiCurrency(($object->multicurrency_code ? $object->multicurrency_code : $conf->currency), 'multicurrency_code', 1); print '
'.fieldLabel('AllocateCommercial','commercial_id').''; - $userlist = $form->select_dolusers('', '', 0, null, 0, '', '', 0, 0, 0, '', 0, '', '', 0, 1); - // Note: If user has no right to "see all thirdparties", we for selection of sale representative to him, so after creation he can see the record. - print $form->multiselectarray('commercial', $userlist, (count(GETPOST('commercial', 'array')) > 0?GETPOST('commercial', 'array'):(empty($user->rights->societe->client->voir)?array($user->id):array())), null, null, null, null, "90%"); - print '
'.$form->editfieldkey('AllocateCommercial', 'commercial_id', '', $object, 0).''; + $userlist = $form->select_dolusers('', '', 0, null, 0, '', '', 0, 0, 0, '', 0, '', '', 0, 1); + // Note: If user has no right to "see all thirdparties", we for selection of sale representative to him, so after creation he can see the record. + print $form->multiselectarray('commercial', $userlist, (count(GETPOST('commercial', 'array')) > 0?GETPOST('commercial', 'array'):(empty($user->rights->societe->client->voir)?array($user->id):array())), null, null, null, null, "90%"); + print '
'.fieldLabel('Logo','photoinput').''.$form->editfieldkey('Logo', 'photoinput', '', $object, 0).''; print ''; print '
'.fieldLabel('ThirdPartyName','name',1).'
'.$form->editfieldkey('ThirdPartyName', 'name', '', $object, 0, 'string', '', 1).'
'.fieldLabel('Prefix','prefix').''; + print '
'.$form->editfieldkey('Prefix', 'prefix', '', $object, 0).''; // It does not change the prefix mode using the auto numbering prefix if (($prefixCustomerIsUsed || $prefixSupplierIsUsed) && $object->prefix_comm) { @@ -1761,14 +1768,14 @@ else } // Prospect/Customer - print '
'.fieldLabel('ProspectCustomer','customerprospect',1).'
'.$form->editfieldkey('ProspectCustomer', 'customerprospect', '', $object, 0, 'string', '', 1).''.fieldLabel('CustomerCode','customer_code').''; + print ''.$form->editfieldkey('CustomerCode', 'customer_code', '', $object, 0).''; print ''; - print ''; print ''; + print ''; print ''; } // Status - print ''; // Address - print ''; + print ''; print ''; // Zip / Town - print ''; // Country - print ''; @@ -1872,11 +1879,11 @@ else { if(!empty($conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT) && ($conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT == 1 || $conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT == 2)) { - print ''; + print ''; print ''; - print ''; + print ''; print ''; if (! empty($conf->socialnetworks->enabled)) @@ -1894,27 +1901,27 @@ else // Skype if (! empty($conf->global->SOCIALNETWORKS_SKYPE)) { - print ''; + print ''; print ''; } // Twitter if (! empty($conf->global->SOCIALNETWORKS_TWITTER)) { - print ''; + print ''; print ''; } // Facebook if (! empty($conf->global->SOCIALNETWORKS_FACEBOOK)) { - print ''; + print ''; print ''; } } // Phone / Fax - print ''; + print ''; print ''; - print ''; + print ''; print ''; // Prof ids @@ -1929,12 +1936,8 @@ else if (($j % 2) == 0) print ''; $idprof_mandatory ='SOCIETE_IDPROF'.($i).'_MANDATORY'; - if (empty($conf->global->$idprof_mandatory) || ! $object->isACompany()) - print ''; if (($j % 2) == 1) print ''; $j++; @@ -1944,7 +1947,7 @@ else if ($j % 2 == 1) print ''; // VAT is used - print ''; @@ -1952,7 +1955,7 @@ else //TODO: Place into a function to control showing by country or study better option if($mysoc->localtax1_assuj=="1" && $mysoc->localtax2_assuj=="1") { - print ''; - print ''; + print ''; print ''; // Type - Size - print ''; - print ''; // Juridical type - print ''; // Capital - print ''; + print ''; print ''; @@ -2051,7 +2054,7 @@ else // Default language if (! empty($conf->global->MAIN_MULTILANGS)) { - print ''; print ''; @@ -2061,7 +2064,7 @@ else if (!empty($conf->incoterm->enabled)) { print ''; - print ''; + print ''; print ''; @@ -2071,7 +2074,7 @@ else if (! empty($conf->categorie->enabled) && ! empty($user->rights->categorie->lire)) { // Customer - print ''; + print ''; print '"; // Supplier - print ''; + print ''; print ''; - print ''; + print ''; print ''; @@ -2118,15 +2121,15 @@ else // Webservices url/key if (!empty($conf->syncsupplierwebservices->enabled)) { - print ''; + print ''; print ''; - print ''; + print ''; print ''; } // Logo print ''; - print ''; + print ''; print ''; - print ''; + print ''; print '
'; if ((!$object->code_client || $object->code_client == -1) && $modCodeClient->code_auto) @@ -1799,13 +1806,13 @@ else || (! empty($conf->supplier_proposal->enabled) && ! empty($user->rights->supplier_proposal->lire))) { print '
'.fieldLabel('Supplier','fournisseur',1).''; + print ''.$form->editfieldkey('Supplier', 'fournisseur', '', $object, 0, 'string', '', 1).''; print $form->selectyesno("fournisseur",$object->fournisseur,1); print ''; if (! empty($conf->fournisseur->enabled) && ! empty($user->rights->fournisseur->lire)) { - print fieldLabel('SupplierCode','supplier_code'); + print $form->editfieldkey('SupplierCode', 'supplier_code', '', $object, 0); } print ''; if (! empty($conf->fournisseur->enabled) && ! empty($user->rights->fournisseur->lire)) @@ -1838,31 +1845,31 @@ else // Barcode if (! empty($conf->barcode->enabled)) { - print '
'.fieldLabel('Gencod','barcode').'
'.$form->editfieldkey('Gencod', 'barcode', '', $object, 0).''; print '
'.fieldLabel('Status','status').''; + print '
'.$form->editfieldkey('Status', 'status', '', $object, 0).''; print $form->selectarray('status', array('0'=>$langs->trans('ActivityCeased'),'1'=>$langs->trans('InActivity')),$object->status); print '
'.fieldLabel('Address','address').'
'.$form->editfieldkey('Address', 'address', '', $object, 0).'
'.fieldLabel('Zip','zipcode').''; + print '
'.$form->editfieldkey('Zip', 'zipcode', '', $object, 0).''; print $formcompany->select_ziptown($object->zip, 'zipcode', array('town', 'selectcountry_id', 'state_id'), 0, 0, '', 'maxwidth50onsmartphone'); - print ''.fieldLabel('Town','town').''; + print ''.$form->editfieldkey('Town', 'town', '', $object, 0).''; print $formcompany->select_ziptown($object->town, 'town', array('zipcode', 'selectcountry_id', 'state_id')); print '
'.fieldLabel('Country','selectcounty_id').''; + print '
'.$form->editfieldkey('Country', 'selectcounty_id', '', $object, 0).''; print $form->select_country((GETPOST('country_id')!=''?GETPOST('country_id'):$object->country_id),'country_id'); if ($user->admin) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1); print '
'.fieldLabel('Region-State','state_id').''; + print '
'.$form->editfieldkey('Region-State', 'state_id', '', $object, 0).''; } else { - print '
'.fieldLabel('State','state_id').''; + print '
'.$form->editfieldkey('State', 'state_id', '', $object, 0).''; } print $formcompany->select_state($object->state_id,$object->country_code); @@ -1884,9 +1891,9 @@ else } // EMail / Web - print '
'.fieldLabel('EMail','email',(! empty($conf->global->SOCIETE_EMAIL_MANDATORY))).'
'.$form->editfieldkey('EMail', 'email', '', $object, 0, 'string', '', (! empty($conf->global->SOCIETE_EMAIL_MANDATORY))).'
'.fieldLabel('Web','url').'
'.$form->editfieldkey('Web', 'url', '', $object, 0).'
'.fieldLabel('Skype','skype').'
'.$form->editfieldkey('Skype', 'skype', '', $object, 0).'
'.fieldLabel('Twitter','twitter').'
'.$form->editfieldkey('Twitter', 'twitter', '', $object, 0).'
'.fieldLabel('Facebook','facebook').'
'.$form->editfieldkey('Facebook', 'facebook', '', $object, 0).'
'.fieldLabel('Phone','phone').'
'.$form->editfieldkey('Phone', 'phone', '', $object, 0).''.fieldLabel('Fax','fax').''.$form->editfieldkey('Fax', 'fax', '', $object, 0).'
'.fieldLabel($idprof,$key).''; - else - print ''.fieldLabel($idprof,$key).''; - - print $formcompany->get_input_id_prof($i,$key,$object->$key,$object->country_code); + print ''.$form->editfieldkey($idprof, $key, '', $object, 0, 'string', '', ! (empty($conf->global->$idprof_mandatory) || ! $object->isACompany())).''; + print $formcompany->get_input_id_prof($i, $key, $object->$key, $object->country_code); print '
'.fieldLabel('VATIsUsed','assujtva_value').''; + print '
'.$form->editfieldkey('VATIsUsed', 'assujtva_value', '', $object, 0).''; print $form->selectyesno('assujtva_value',$object->tva_assuj,1); print '
'.fieldLabel($langs->transcountry("LocalTax1IsUsed",$mysoc->country_code),'localtax1assuj_value').''; + print '
'.$form->editfieldkey($langs->transcountry("LocalTax1IsUsed",$mysoc->country_code), 'localtax1assuj_value', '', $object, 0).''; print $form->selectyesno('localtax1assuj_value',$object->localtax1_assuj,1); if(! isOnlyOneLocalTax(1)) { @@ -1962,7 +1965,7 @@ else } print ''.fieldLabel($langs->transcountry("LocalTax2IsUsed",$mysoc->country_code),'localtax2assuj_value').''; + print ''.$form->editfieldkey($langs->transcountry("LocalTax2IsUsed",$mysoc->country_code), 'localtax2assuj_value', '', $object, 0).''; print $form->selectyesno('localtax2assuj_value',$object->localtax2_assuj,1); if (! isOnlyOneLocalTax(2)) { @@ -1974,7 +1977,7 @@ else } elseif($mysoc->localtax1_assuj=="1" && $mysoc->localtax2_assuj!="1") { - print '
'.fieldLabel($langs->transcountry("LocalTax1IsUsed",$mysoc->country_code),'localtax1assuj_value').''; + print '
'.$form->editfieldkey($langs->transcountry("LocalTax1IsUsed",$mysoc->country_code), 'localtax1assuj_value', '', $object, 0).''; print $form->selectyesno('localtax1assuj_value',$object->localtax1_assuj,1); if(! isOnlyOneLocalTax(1)) { @@ -1986,7 +1989,7 @@ else } elseif($mysoc->localtax2_assuj=="1" && $mysoc->localtax1_assuj!="1") { - print '
'.fieldLabel($langs->transcountry("LocalTax2IsUsed",$mysoc->country_code),'localtax2assuj_value').''; + print '
'.$form->editfieldkey($langs->transcountry("LocalTax2IsUsed",$mysoc->country_code), 'localtax2assuj_value', '', $object, 0).''; print $form->selectyesno('localtax2assuj_value',$object->localtax2_assuj,1); if(! isOnlyOneLocalTax(2)) { @@ -1998,7 +2001,7 @@ else } // VAT Code - print '
'.fieldLabel('VATIntra','intra_vat').'
'.$form->editfieldkey('VATIntra', 'intra_vat', '', $object, 0).''; $s =''; @@ -2028,22 +2031,22 @@ else print '
'.fieldLabel('ThirdPartyType','typent_id').''; + print '
'.$form->editfieldkey('ThirdPartyType', 'typent_id', '', $object, 0).''; print $form->selectarray("typent_id",$formcompany->typent_array(0), $object->typent_id, 0, 0, 0, '', 0, 0, 0, (empty($conf->global->SOCIETE_SORT_ON_TYPEENT)?'ASC':$conf->global->SOCIETE_SORT_ON_TYPEENT)); if ($user->admin) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1); print ''.fieldLabel('Staff','effectif_id').''; + print ''.$form->editfieldkey('Staff', 'effectif_id', '', $object, 0).''; print $form->selectarray("effectif_id",$formcompany->effectif_array(0), $object->effectif_id); if ($user->admin) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1); print '
'.fieldLabel('JuridicalStatus','forme_juridique_code').''; + print '
'.$form->editfieldkey('JuridicalStatus', 'forme_juridique_code', '', $object, 0).''; print $formcompany->select_juridicalstatus($object->forme_juridique_code, $object->country_code, '', 'forme_juridique_code'); print '
'.fieldLabel('Capital','capital').'
'.$form->editfieldkey('Capital', 'capital', '', $object, 0).' '.$langs->trans("Currency".$conf->currency).'
'.fieldLabel('DefaultLang','default_lang').''."\n"; + print '
'.$form->editfieldkey('DefaultLang', 'default_lang', '', $object, 0).''."\n"; print $formadmin->select_language($object->default_lang,'default_lang',0,0,1); print '
'.fieldLabel('IncotermLabel','incoterm_id').''.$form->editfieldkey('IncotermLabel', 'incoterm_id', '', $object, 0).''; print $form->select_incoterms((!empty($object->fk_incoterms) ? $object->fk_incoterms : ''), (!empty($object->location_incoterms)?$object->location_incoterms:'')); print '
' . fieldLabel('CustomersCategoriesShort', 'custcats') . '
' . $form->editfieldkey('CustomersCategoriesShort', 'custcats', '', $object, 0) . ''; $cate_arbo = $form->select_all_categories(Categorie::TYPE_CUSTOMER, null, null, null, null, 1); $c = new Categorie($db); @@ -2084,7 +2087,7 @@ else print "
' . fieldLabel('SuppliersCategoriesShort', 'suppcats') . '
' . $form->editfieldkey('SuppliersCategoriesShort', 'suppcats', '', $object, 0) . ''; $cate_arbo = $form->select_all_categories(Categorie::TYPE_SUPPLIER, null, null, null, null, 1); $c = new Categorie($db); @@ -2101,7 +2104,7 @@ else if (! empty($conf->multicurrency->enabled)) { print '
'.fieldLabel('Currency','multicurrency_code').''.$form->editfieldkey('Currency', 'multicurrency_code', '', $object, 0).''; print $form->selectMultiCurrency(($object->multicurrency_code ? $object->multicurrency_code : $conf->currency), 'multicurrency_code', 1); print '
'.fieldLabel('WebServiceURL','webservices_url').'
'.$form->editfieldkey('WebServiceURL', 'webservices_url', '', $object, 0).''.fieldLabel('WebServiceKey','webservices_key').''.$form->editfieldkey('WebServiceKey', 'webservices_key', '', $object, 0).'
'.fieldLabel('Logo','photoinput').''.$form->editfieldkey('Logo', 'photoinput', '', $object, 0).''; if ($object->logo) print $form->showphoto('societe',$object); $caneditfield=1; @@ -2144,7 +2147,7 @@ else // Assign sale representative print '
'.fieldLabel('AllocateCommercial','commercial_id').''.$form->editfieldkey('AllocateCommercial', 'commercial_id', '', $object, 0).''; $userlist = $form->select_dolusers('', '', 0, null, 0, '', '', 0, 0, 0, '', 0, '', '', 0, 1); $arrayselected = GETPOST('commercial', 'array'); @@ -2155,7 +2158,7 @@ else print '
'; print ''; - dol_fiche_end(); + dol_fiche_end(); print '
'; print ''; @@ -2524,7 +2527,7 @@ else if (! empty($conf->multicurrency->enabled)) { print '
'.fieldLabel('Currency','multicurrency_code').''.$form->editfieldkey('Currency', 'multicurrency_code', '', $object, 0).''; print !empty($object->multicurrency_code) ? currency_name($object->multicurrency_code,1) : ''; print '
'; print ''; - print_liste_field_titre('Invoice',$_SERVER["PHP_SELF"],'facnumber','','','',$sortfield,$sortorder); + print_liste_field_titre('Invoice',$_SERVER["PHP_SELF"],'ref','','','',$sortfield,$sortorder); print_liste_field_titre('Date',$_SERVER["PHP_SELF"],'dp','','','',$sortfield,$sortorder); print_liste_field_titre('Type',$_SERVER["PHP_SELF"],'libelle','','','',$sortfield,$sortorder); print_liste_field_titre('Amount',$_SERVER["PHP_SELF"],'fa_amount','','','align="right"',$sortfield,$sortorder); @@ -1106,7 +1106,7 @@ if (! GETPOST('action')) { $objp = $db->fetch_object($resql); print ''; - print '\n"; + print '\n"; print '\n"; print '\n"; print ''; diff --git a/htdocs/supplier_proposal/card.php b/htdocs/supplier_proposal/card.php index 99e99517f75..55bdddec096 100644 --- a/htdocs/supplier_proposal/card.php +++ b/htdocs/supplier_proposal/card.php @@ -630,7 +630,7 @@ if (empty($reshook)) $desc = $productsupplier->desc_supplier; } else $desc = $productsupplier->description; - if (trim($product_desc) != trim($desc)) $desc = dol_concatdesc($desc, $product_desc); + if (trim($product_desc) != trim($desc)) $desc = dol_concatdesc($desc, $product_desc, '', !empty($conf->global->CHANGE_ORDER_CONCAT_DESCRIPTION)); $pu_ht = $productsupplier->fourn_pu; @@ -1169,10 +1169,9 @@ if ($action == 'create') } // Multicurrency - if (! empty($conf->multicurrency->enabled)) - { + if (! empty($conf->multicurrency->enabled)) { print ''; - print ''; + print ''; print ''; @@ -1524,7 +1523,7 @@ if ($action == 'create') print ''; print '
'.$objp->facnumber."'.$objp->ref."'.dol_print_date($db->jdate($objp->dp))."'.$objp->paiement_type.' '.$objp->num_paiement."'.price($objp->amount).' 
'.fieldLabel('Currency','multicurrency_code').''.$form->editfieldkey('Currency', 'multicurrency_code', '', $object, 0).''; print $form->selectMultiCurrency($currency_code, 'multicurrency_code'); print '
'; print ''; if ($action != 'editmulticurrencycode' && ! empty($object->brouillon)) print ''; @@ -1541,7 +1540,7 @@ if ($action == 'create') print ''; print '
'; - print fieldLabel('Currency','multicurrency_code'); + print $form->editfieldkey('Currency', 'multicurrency_code', '', $object, 0); print 'id . '">' . img_edit($langs->transnoentitiesnoconv('SetMultiCurrencyCode'), 1) . '
'; print ''; if ($action != 'editmulticurrencyrate' && ! empty($object->brouillon) && $object->multicurrency_code && $object->multicurrency_code != $conf->currency) print ''; @@ -1612,17 +1611,17 @@ if ($action == 'create') if (!empty($conf->multicurrency->enabled) && ($object->multicurrency_code != $conf->currency)) { // Multicurrency Amount HT - print ''; + print ''; print ''; print ''; // Multicurrency Amount VAT - print ''; + print ''; print ''; print ''; // Multicurrency Amount TTC - print ''; + print ''; print ''; print ''; } @@ -1778,7 +1777,7 @@ if ($action == 'create') ) { if (count($object->lines) > 0) print ''; - // else print ''.$langs->trans('Validate').''; + // else print ''.$langs->trans('Validate').''; } // Edit @@ -1797,7 +1796,7 @@ if ($action == 'create') if (empty($conf->global->MAIN_USE_ADVANCED_PERMS) || $user->rights->supplier_proposal->send_advance) { print ''; } else - print ''; + print ''; } // Create an order diff --git a/htdocs/supplier_proposal/list.php b/htdocs/supplier_proposal/list.php index 795564984d4..1fe96bc4def 100644 --- a/htdocs/supplier_proposal/list.php +++ b/htdocs/supplier_proposal/list.php @@ -10,6 +10,7 @@ * Copyright (C) 2012 Christophe Battarel * Copyright (C) 2013 Cédric Salvador * Copyright (C) 2016 Ferran Marcet + * Copyright (C) 2018 Charlene Benke * * 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 @@ -77,8 +78,10 @@ $sall=trim((GETPOST('search_all', 'alphanohtml')!='')?GETPOST('search_all', 'alp $mesg=(GETPOST("msg") ? GETPOST("msg") : GETPOST("mesg")); $year=GETPOST("year"); $month=GETPOST("month"); +$day=GETPOST("day"); $yearvalid=GETPOST("yearvalid"); $monthvalid=GETPOST("monthvalid"); +$dayvalid=GETPOST("dayvalid"); $limit = GETPOST('limit','int')?GETPOST('limit','int'):$conf->liste_limit; $sortfield = GETPOST("sortfield",'alpha'); @@ -196,8 +199,10 @@ if (GETPOST('button_removefilter_x','alpha') || GETPOST('button_removefilter.x', $search_author=''; $yearvalid=''; $monthvalid=''; + $dayvalid=''; $year=''; $month=''; + $day=''; $search_status=''; $object_statut=''; } @@ -284,32 +289,8 @@ if ($search_montant_ttc != '') $sql.= natural_search("sp.total", $search_montant if ($sall) $sql .= natural_search(array_keys($fieldstosearchall), $sall); if ($socid) $sql.= ' AND s.rowid = '.$socid; if ($search_status >= 0 && $search_status != '') $sql.= ' AND sp.fk_statut IN ('.$db->escape($search_status).')'; -if ($month > 0) -{ - if ($year > 0 && empty($day)) - $sql.= " AND sp.date_livraison BETWEEN '".$db->idate(dol_get_first_day($year,$month,false))."' AND '".$db->idate(dol_get_last_day($year,$month,false))."'"; - else if ($year > 0 && ! empty($day)) - $sql.= " AND sp.date_livraison BETWEEN '".$db->idate(dol_mktime(0, 0, 0, $month, $day, $year))."' AND '".$db->idate(dol_mktime(23, 59, 59, $month, $day, $year))."'"; - else - $sql.= " AND date_format(sp.date_livraison, '%m') = '".$month."'"; -} -else if ($year > 0) -{ - $sql.= " AND sp.date_livraison BETWEEN '".$db->idate(dol_get_first_day($year,1,false))."' AND '".$db->idate(dol_get_last_day($year,12,false))."'"; -} -if ($monthvalid > 0) -{ - if ($yearvalid > 0 && empty($dayvalid)) - $sql.= " AND sp.date_valid BETWEEN '".$db->idate(dol_get_first_day($yearvalid,$monthvalid,false))."' AND '".$db->idate(dol_get_last_day($yearvalid,$monthvalid,false))."'"; - else if ($yearvalid > 0 && ! empty($dayvalid)) - $sql.= " AND sp.date_valid BETWEEN '".$db->idate(dol_mktime(0, 0, 0, $monthvalid, $dayvalid, $yearvalid))."' AND '".$db->idate(dol_mktime(23, 59, 59, $monthvalid, $dayvalid, $yearvalid))."'"; - else - $sql.= " AND date_format(sp.date_valid, '%m') = '".$monthvalid."'"; -} -else if ($yearvalid > 0) -{ - $sql.= " AND sp.date_valid BETWEEN '".$db->idate(dol_get_first_day($yearvalid,1,false))."' AND '".$db->idate(dol_get_last_day($yearvalid,12,false))."'"; -} +$sql.= dolSqlDateFilter("sp.date_livraison", $day, $month, $year); +$sql.= dolSqlDateFilter("sp.date_valid", $dayvalid, $monthvalid, $yearvalid); if ($search_sale > 0) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$search_sale; if ($search_user > 0) { @@ -396,6 +377,7 @@ if ($resql) // List of mass actions available $arrayofmassactions = array( + 'generate_doc'=>$langs->trans("Generate"), //'presend'=>$langs->trans("SendByMail"), 'builddoc'=>$langs->trans("PDFMerge"), ); diff --git a/htdocs/takepos/customers.php b/htdocs/takepos/customers.php index 5a67998f180..41738861702 100644 --- a/htdocs/takepos/customers.php +++ b/htdocs/takepos/customers.php @@ -55,7 +55,7 @@ $_GET['optioncss'] = 'print'; */ if ($action=="change") { - $sql="UPDATE ".MAIN_DB_PREFIX."facture set fk_soc=".$idcustomer." where facnumber='(PROV-POS-".$place.")'"; + $sql="UPDATE ".MAIN_DB_PREFIX."facture set fk_soc=".$idcustomer." where ref='(PROV-POS-".$place.")'"; $resql = $db->query($sql); ?>
'; - print fieldLabel('CurrencyRate','multicurrency_tx'); + print $form->editfieldkey('CurrencyRate', 'multicurrency_tx', '', $object, 0); print 'id . '">' . img_edit($langs->transnoentitiesnoconv('SetMultiCurrencyCode'), 1) . '
' . fieldLabel('MulticurrencyAmountHT','multicurrency_total_ht') . '
' . $form->editfieldkey('MulticurrencyAmountHT', 'multicurrency_total_ht', '', $object, 0) . '' . price($object->multicurrency_total_ht, '', $langs, 0, - 1, - 1, (!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency)) . '
' . fieldLabel('MulticurrencyAmountVAT','multicurrency_total_tva') . '
' . $form->editfieldkey('MulticurrencyAmountVAT', 'multicurrency_total_tva', '', $object, 0) . '' . price($object->multicurrency_total_tva, '', $langs, 0, - 1, - 1, (!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency)) . '
' . fieldLabel('MulticurrencyAmountTTC','multicurrency_total_ttc') . '
' . $form->editfieldkey('MulticurrencyAmountTTC', 'multicurrency_total_ttc', '', $object, 0) . '' . price($object->multicurrency_total_ttc, '', $langs, 0, - 1, - 1, (!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency)) . '