36require
'../../main.inc.php';
37require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture-rec.class.php';
38require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
39require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
40if (isModEnabled(
'project')) {
41 include_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
44require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
45require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
46require_once DOL_DOCUMENT_ROOT.
'/core/lib/invoice.lib.php';
47require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
50$langs->loadLangs(array(
'bills',
'companies',
'compta',
'admin',
'other',
'products',
'banks'));
52$action =
GETPOST(
'action',
'alpha');
53$massaction =
GETPOST(
'massaction',
'alpha');
55$confirm =
GETPOST(
'confirm',
'alpha');
56$cancel =
GETPOST(
'cancel',
'alpha');
57$toselect =
GETPOST(
'toselect',
'array');
58$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'invoicetemplatelist';
59$backtopage =
GETPOST(
'backtopage',
'alpha');
60$backtopageforcancel =
GETPOST(
'backtopageforcancel',
'alpha');
67 $socid = $user->socid;
69$objecttype =
'facture_rec';
70if ($action ==
"create" || $action ==
"add") {
75$year_date_when =
GETPOST(
'year_date_when');
76$month_date_when =
GETPOST(
'month_date_when');
77$selectedLines =
GETPOST(
'toselect',
'array');
80$sortfield =
GETPOST(
'sortfield',
'aZ09comma');
81$sortorder =
GETPOST(
'sortorder',
'aZ09comma');
83if (empty($page) || $page == -1) {
86$offset = $limit * $page;
91 $sortfield =
'f.titre';
97if (($id > 0 || $ref) && $action !=
'create' && $action !=
'add') {
98 $ret =
$object->fetch($id, $ref);
105$hookmanager->initHooks(array(
'invoicereccard',
'globalcard'));
109$extrafields->fetch_name_optionals_label(
$object->table_element);
111$search_array_options = $extrafields->getOptionalsFromPost(
$object->table_element,
'',
'search_');
113$permissionnote = $user->hasRight(
'facture',
'creer');
114$permissiondellink = $user->hasRight(
'facture',
'creer');
115$permissiontoedit = $user->hasRight(
'facture',
'creer');
117$usercanread = $user->hasRight(
'facture',
'lire');
118$usercancreate = $user->hasRight(
'facture',
'creer');
119$usercanissuepayment = $user->hasRight(
'facture',
'paiement');
120$usercandelete = $user->hasRight(
'facture',
'supprimer');
121$usercanvalidate = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'facture',
'invoice_advance',
'validate')));
122$usercansend = (!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || $user->rights->facture->invoice_advance->send);
123$usercanreopen = (!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || $user->rights->facture->invoice_advance->reopen);
124$usercanunvalidate = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !empty($usercancreate)) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'facture',
'invoice_advance',
'unvalidate')));
126$usercanproductignorepricemin = ((
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'produit',
'ignore_price_min_advance')) || !
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS'));
127$usercancreatemargin = $user->hasRight(
"margins",
"creer");
128$usercanreadallmargin = $user->hasRight(
"margins",
"liretous");
129$usercancreatewithdrarequest = $user->hasRight(
"prelevement",
"bons",
"creer");
143if (
GETPOST(
'cancel',
'alpha')) {
147if (!
GETPOST(
'confirmmassaction',
'alpha') && $massaction !=
'presend' && $massaction !=
'confirm_presend') {
151$parameters = array();
152$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
157if (empty($reshook)) {
158 $backurlforlist = DOL_URL_ROOT.
'/compta/facture/invoicetemplate_list.php';
160 if (empty($backtopage) || ($cancel && empty($id))) {
161 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
162 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
163 $backtopage = $backurlforlist;
165 $backtopage = DOL_URL_ROOT.
'/compta/facture/invoicetemplate_list.php?id='.((!empty($id) && $id > 0) ? $id :
'__ID__');
173 if (!empty($backtopageforcancel)) {
174 header(
"Location: ".$backtopageforcancel);
176 } elseif (!empty($backtopage)) {
177 header(
"Location: ".$backtopage);
184 include DOL_DOCUMENT_ROOT.
'/core/actions_changeselectedfields.inc.php';
187 include DOL_DOCUMENT_ROOT.
'/core/actions_setnotes.inc.php';
189 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
191 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
200 if ($action ==
'add') {
201 if (!
GETPOST(
'title',
'alphanohtml')) {
202 setEventMessages($langs->transnoentities(
"ErrorFieldRequired", $langs->trans(
"Title")),
null,
'errors');
217 if (empty($reyear) || empty($remonth) || empty($reday)) {
218 setEventMessages($langs->transnoentities(
"ErrorFieldRequired", $langs->trans(
"Date")),
null,
'errors');
240 $object->frequency = $frequency;
242 $object->nb_gen_max = $nb_gen_max;
245 $object->fk_project = $projectid;
247 $date_next_execution =
dol_mktime($rehour, $remin, 0, $remonth, $reday, $reyear);
248 $object->date_when = $date_next_execution;
250 $ret = $extrafields->setOptionalsFromPost(
null, $object);
260 $srcObject->fetchObjectLinked();
262 if (!empty($srcObject->linkedObjectsIds[
'contrat'])) {
263 $contractidid = reset($srcObject->linkedObjectsIds[
'contrat']);
266 $object->origin_id = $contractidid;
273 $oldinvoice =
new Facture($db);
276 $onlylines =
GETPOST(
'toselect',
'array');
278 $result =
$object->create($user, $oldinvoice->id, 0, $onlylines);
280 $result = $oldinvoice->delete($user, 1);
295 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?facid='.
$object->id);
306 if ($action ==
'confirm_delete' && $confirm ==
'yes' && $user->hasRight(
'facture',
'supprimer')) {
309 header(
"Location: ".DOL_URL_ROOT.
'/compta/facture/invoicetemplate_list.php');
315 if ($action ==
'setconditions' && $user->hasRight(
'facture',
'creer')) {
317 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModified", $langs->transnoentitiesnoconv(
"PaymentTerm"));
319 } elseif ($action ==
'setmode' && $user->hasRight(
'facture',
'creer')) {
321 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModified", $langs->transnoentitiesnoconv(
"PaymentMode"));
323 } elseif ($action ==
'classin' && $user->hasRight(
'facture',
'creer')) {
325 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModified", $langs->transnoentitiesnoconv(
"Project"));
327 } elseif ($action ==
'setref' && $user->hasRight(
'facture',
'creer')) {
329 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModifiedFromYToZ", $langs->transnoentitiesnoconv(
"Title"),
$object->title, $ref);
330 $result =
$object->setValueFrom(
'titre', $ref,
'',
null,
'text',
'', $user,
'BILLREC_MODIFY');
336 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
337 $langs->load(
"errors");
338 setEventMessages($langs->trans(
'ErrorRefAlreadyExists', $ref),
null,
'errors');
343 } elseif ($action ==
'setbankaccount' && $user->hasRight(
'facture',
'creer')) {
345 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModified", $langs->transnoentitiesnoconv(
"Bank"));
347 } elseif ($action ==
'setfrequency' && $user->hasRight(
'facture',
'creer')) {
349 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModified", $langs->transnoentitiesnoconv(
"Frequency"));
351 } elseif ($action ==
'setdate_when' && $user->hasRight(
'facture',
'creer')) {
357 } elseif ($action ==
'setnb_gen_max' && $user->hasRight(
'facture',
'creer')) {
360 } elseif ($action ==
'setauto_validate' && $user->hasRight(
'facture',
'creer')) {
363 } elseif ($action ==
'setgenerate_pdf' && $user->hasRight(
'facture',
'creer')) {
366 } elseif ($action ==
'setmodelpdf' && $user->hasRight(
'facture',
'creer')) {
369 } elseif ($action ==
'disable' && $user->hasRight(
'facture',
'creer')) {
373 $object->context[
'actionmsg'] = $langs->trans(
"RecordDisabled");
375 $res =
$object->setValueFrom(
'suspended', 1,
'',
null,
'text',
'', $user,
'BILLREC_MODIFY');
386 } elseif ($action ==
'enable' && $user->hasRight(
'facture',
'creer')) {
390 $object->context[
'actionmsg'] = $langs->trans(
"RecordEnabled");
392 $res =
$object->setValueFrom(
'suspended', 0,
'',
null,
'text',
'', $user,
'BILLREC_MODIFY');
403 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
405 $result =
$object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
406 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
412 if ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $user->hasRight(
'facture',
'creer')) {
423 if ($line->delete($user) > 0) {
424 $result =
$object->update_price(1);
437 } elseif ($action ==
'update_extras') {
441 $ret = $extrafields->setOptionalsFromPost(
null, $object,
GETPOST(
'attribute',
'restricthtml'));
447 $result =
$object->insertExtraFields(
'BILLREC_MODIFY');
456 if ($action ==
'addline' && $user->hasRight(
'facture',
'creer')) {
457 $langs->load(
'errors');
462 $product_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
465 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'alpha');
466 if ($prod_entry_mode ==
'free') {
472 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
477 $tva_tx = (
GETPOST(
'tva_tx',
'alpha') ?
GETPOST(
'tva_tx',
'alpha') : 0);
481 if (empty($remise_percent)) {
486 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
487 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
489 if (is_array($extralabelsline)) {
491 foreach ($extralabelsline as $key => $value) {
492 unset($_POST[
"options_".$key.$predef]);
496 if ((empty($idprod) || $idprod < 0) && ($price_ht < 0) && ($qty < 0)) {
497 setEventMessages($langs->trans(
'ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv(
'UnitPriceHT'), $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
500 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
501 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Type')),
null,
'errors');
504 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && (!($price_ht >= 0) || $price_ht ==
'')) {
505 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
509 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
512 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($product_desc)) {
513 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Description')),
null,
'errors');
517 $langs->load(
"errors");
518 setEventMessages($langs->trans(
'ErrorQtyForCustomerInvoiceCantBeNegative'),
null,
'errors');
522 if (!$error && ($qty >= 0) && (!empty($product_desc) || (!empty($idprod) && $idprod > 0))) {
528 $ret =
$object->fetch_thirdparty();
533 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
544 if (!empty($idprod) && $idprod > 0) {
546 $prod->fetch($idprod);
548 $label = ((
GETPOST(
'product_label') &&
GETPOST(
'product_label') != $prod->label) ?
GETPOST(
'product_label') :
'');
560 $datapriceofproduct = $prod->getSellPrice($mysoc,
$object->thirdparty, $pqp);
562 $pu_ht = $datapriceofproduct[
'pu_ht'];
563 $pu_ttc = $datapriceofproduct[
'pu_ttc'];
564 $price_min = $datapriceofproduct[
'price_min'];
565 $price_base_type = empty($datapriceofproduct[
'price_base_type']) ?
'HT' : $datapriceofproduct[
'price_base_type'];
569 $tmpvat = (float)
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
570 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string) $prod->tva_tx));
573 if (!empty($price_ht)) {
575 $pu_ttc =
price2num($pu_ht * (1 + ($tmpvat / 100)),
'MU');
576 } elseif ($tmpvat != $tmpprodvat) {
579 if ($price_base_type !=
'HT') {
580 $pu_ht =
price2num($pu_ttc / (1 + ($tmpvat / 100)),
'MU');
582 $pu_ttc =
price2num($pu_ht * (1 + ($tmpvat / 100)),
'MU');
590 $outputlangs = $langs;
592 if (empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
593 $newlang =
GETPOST(
'lang_id',
'aZ09');
595 if (empty($newlang)) {
596 $newlang =
$object->thirdparty->default_lang;
598 if (!empty($newlang)) {
600 $outputlangs->setDefaultLang($newlang);
603 $desc = (!empty($prod->multilangs [$outputlangs->defaultlang] [
"description"])) ? $prod->multilangs [$outputlangs->defaultlang] [
"description"] : $prod->
description;
605 $desc = $prod->description;
611 if (!
getDolGlobalString(
'MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE') && (!empty($prod->customcode) || !empty($prod->country_code))) {
615 $outputlangs = $langs;
617 if (empty($newlang) &&
GETPOST(
'lang_id',
'alpha')) {
618 $newlang =
GETPOST(
'lang_id',
'alpha');
620 if (empty($newlang)) {
621 $newlang =
$object->thirdparty->default_lang;
623 if (!empty($newlang)) {
625 $outputlangs->setDefaultLang($newlang);
626 $outputlangs->load(
'products');
628 if (!empty($prod->customcode)) {
629 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
631 if (!empty($prod->customcode) && !empty($prod->country_code)) {
634 if (!empty($prod->country_code)) {
635 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code, 0, $db, $outputlangs, 0);
638 if (!empty($prod->customcode)) {
639 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
641 if (!empty($prod->customcode) && !empty($prod->country_code)) {
644 if (!empty($prod->country_code)) {
645 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code, 0, $db, $langs, 0);
653 $fk_unit = $prod->fk_unit;
657 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
658 $tva_tx = str_replace(
'*',
'', $tva_tx);
659 if (empty($tva_tx)) {
662 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
663 $desc = $product_desc;
665 $fk_unit =
GETPOST(
'units',
'alpha');
668 $date_start_fill =
GETPOSTINT(
'date_start_fill');
684 if ($usercanproductignorepricemin && (!empty($price_min) && (
price2num($pu_ht) * (1 -
price2num($remise_percent) / 100) <
price2num($price_min)))) {
685 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, - 1, $conf->currency));
689 $result =
$object->addline($desc, $pu_ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, $idprod, $remise_percent, $price_base_type, $info_bits,
'', $pu_ttc, $type, -1, $special_code, $label, $fk_unit, 0, $date_start_fill, $date_end_fill, $fournprice, $buyingprice);
712 unset($_POST[
'prod_entry_mode']);
714 unset($_POST[
'qty']);
715 unset($_POST[
'type']);
716 unset($_POST[
'remise_percent']);
717 unset($_POST[
'price_ht']);
718 unset($_POST[
'multicurrency_price_ht']);
719 unset($_POST[
'price_ttc']);
720 unset($_POST[
'tva_tx']);
721 unset($_POST[
'product_ref']);
722 unset($_POST[
'product_label']);
723 unset($_POST[
'product_desc']);
724 unset($_POST[
'fournprice']);
725 unset($_POST[
'buying_price']);
726 unset($_POST[
'np_marginRate']);
727 unset($_POST[
'np_markRate']);
728 unset($_POST[
'dp_desc']);
729 unset($_POST[
'idprod']);
730 unset($_POST[
'units']);
732 unset($_POST[
'date_starthour']);
733 unset($_POST[
'date_startmin']);
734 unset($_POST[
'date_startsec']);
735 unset($_POST[
'date_startday']);
736 unset($_POST[
'date_startmonth']);
737 unset($_POST[
'date_startyear']);
738 unset($_POST[
'date_endhour']);
739 unset($_POST[
'date_endmin']);
740 unset($_POST[
'date_endsec']);
741 unset($_POST[
'date_endday']);
742 unset($_POST[
'date_endmonth']);
743 unset($_POST[
'date_endyear']);
745 unset($_POST[
'date_start_fill']);
746 unset($_POST[
'date_end_fill']);
748 unset($_POST[
'situations']);
749 unset($_POST[
'progress']);
757 } elseif ($action ==
'updateline' && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
758 if (!
$object->fetch($id) > 0) {
776 if (preg_match(
'/\*/', $vat_rate)) {
781 $vat_rate = str_replace(
'*',
'', $vat_rate);
790 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
791 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
794 if ($objectline->fetch(
GETPOSTINT(
'lineid'))) {
795 $objectline->array_options = $array_options;
796 $result = $objectline->insertExtraFields();
802 $position = ($objectline->rang >= 0 ? $objectline->rang : 0);
805 if (is_array($extralabelsline)) {
807 foreach ($extralabelsline as $key => $value) {
808 unset($_POST[
"options_".$key]);
814 if ($special_code == 3) {
831 if (empty($remise_percent)) {
837 if (!empty($productid)) {
839 $product->fetch($productid);
841 $type = $product->type;
843 $price_min = $product->price_min;
845 $price_min = $product->multiprices_min[
$object->thirdparty->price_level];
854 setEventMessages($langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, - 1, $conf->currency)),
null,
'errors');
859 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
863 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
868 $langs->load(
"errors");
869 setEventMessages($langs->trans(
'ErrorQtyForCustomerInvoiceCantBeNegative'),
null,
'errors');
873 $date_start_fill =
GETPOSTINT(
'date_start_fill');
925 unset($_POST[
'qty']);
926 unset($_POST[
'type']);
927 unset($_POST[
'productid']);
928 unset($_POST[
'remise_percent']);
929 unset($_POST[
'price_ht']);
930 unset($_POST[
'multicurrency_price_ht']);
931 unset($_POST[
'price_ttc']);
932 unset($_POST[
'tva_tx']);
933 unset($_POST[
'product_ref']);
934 unset($_POST[
'product_label']);
935 unset($_POST[
'product_desc']);
936 unset($_POST[
'fournprice']);
937 unset($_POST[
'buying_price']);
938 unset($_POST[
'np_marginRate']);
939 unset($_POST[
'np_markRate']);
941 unset($_POST[
'dp_desc']);
942 unset($_POST[
'idprod']);
943 unset($_POST[
'units']);
945 unset($_POST[
'date_starthour']);
946 unset($_POST[
'date_startmin']);
947 unset($_POST[
'date_startsec']);
948 unset($_POST[
'date_startday']);
949 unset($_POST[
'date_startmonth']);
950 unset($_POST[
'date_startyear']);
951 unset($_POST[
'date_endhour']);
952 unset($_POST[
'date_endmin']);
953 unset($_POST[
'date_endsec']);
954 unset($_POST[
'date_endday']);
955 unset($_POST[
'date_endmonth']);
956 unset($_POST[
'date_endyear']);
958 unset($_POST[
'situations']);
959 unset($_POST[
'progress']);
972$title =
$object->ref.
" - ".$langs->trans(
'Card');
977$form =
new Form($db);
979if (isModEnabled(
'project')) {
982$companystatic =
new Societe($db);
992if ($action ==
'create') {
993 print
load_fiche_titre($langs->trans(
"CreateRepeatableInvoice"),
'',
'bill');
996 $product_static =
new Product($db);
998 if (
$object->fetch($id, $ref) > 0) {
999 $result =
$object->getLinesArray();
1001 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
1002 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1003 print
'<input type="hidden" name="action" value="add">';
1004 print
'<input type="hidden" name="facid" value="'.$object->id.
'">';
1009 if (isModEnabled(
'project')) {
1012 if (
$object->fk_account > 0) {
1016 print
'<table class="border centpercent">';
1021 print
'<tr><td class="titlefieldcreate fieldrequired">'.$langs->trans(
"Title").
'</td><td>';
1022 print
'<input class="flat quatrevingtpercent" type="text" name="title" value="'.dol_escape_htmltag(
GETPOST(
"title",
'alphanohtml')).
'" autofocus>';
1026 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Customer").
'</td><td>'.
$object->thirdparty->getNomUrl(1,
'customer').
'</td>';
1031 print
"<tr><td>".$langs->trans(
"InvoiceSubtype").
"</td><td>";
1032 print $form->getSelectInvoiceSubtype(GETPOSTISSET(
'subtype') ?
GETPOST(
'subtype') :
$object->subtype,
'subtype', 0, 0,
'');
1036 $note_public = GETPOSTISSET(
'note_public') ?
GETPOST(
'note_public',
'restricthtml') :
$object->note_public;
1037 $note_private = GETPOSTISSET(
'note_private') ?
GETPOST(
'note_private',
'restricthtml') :
$object->note_private;
1042 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH__'] = $langs->trans(
"PreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree(
$object->date, -1,
'm'),
'%m').
')';
1043 $substitutionarray[
'__INVOICE_MONTH__'] = $langs->trans(
"MonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
$object->date,
'%m').
')';
1045 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH_TEXT__'] = $langs->trans(
"TextPreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree(
$object->date, -1,
'm'),
'%B').
')';
1046 $substitutionarray[
'__INVOICE_MONTH_TEXT__'] = $langs->trans(
"TextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
$object->date,
'%B').
')';
1047 $substitutionarray[
'__INVOICE_NEXT_MONTH_TEXT__'] = $langs->trans(
"TextNextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree(
$object->date, 1,
'm'),
'%B').
')';
1049 $substitutionarray[
'__INVOICE_YEAR__'] = $langs->trans(
"YearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
$object->date,
'%Y').
')';
1052 $substitutionarray[
'__INVOICE_DATE_NEXT_INVOICE_BEFORE_GEN__'] = $langs->trans(
"DateNextInvoiceBeforeGen").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree(
$object->date, 1,
'm'),
'dayhour').
')';
1053 $substitutionarray[
'__INVOICE_DATE_NEXT_INVOICE_AFTER_GEN__'] = $langs->trans(
"DateNextInvoiceAfterGen").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree(
$object->date, 2,
'm'),
'dayhour').
')';
1054 $substitutionarray[
'__INVOICE_COUNTER_CURRENT__'] = $langs->trans(
"Count");
1055 $substitutionarray[
'__INVOICE_COUNTER_MAX__'] = $langs->trans(
"MaxPeriodNumber");
1057 $htmltext =
'<i>'.$langs->trans(
"FollowingConstantsWillBeSubstituted").
':<br>';
1058 foreach ($substitutionarray as $key => $val) {
1059 $htmltext .= $key.
' = '.$langs->trans($val).
'<br>';
1061 $htmltext .=
'</i>';
1064 print
"<tr><td>".$langs->trans(
"Author").
"</td><td>".$user->getFullName($langs).
"</td></tr>";
1067 print
"<tr><td>".$langs->trans(
"PaymentConditions").
"</td><td>";
1068 print $form->getSelectConditionsPaiements(GETPOSTISSET(
'cond_reglement_id') ?
GETPOSTINT(
'cond_reglement_id') :
$object->cond_reglement_id,
'cond_reglement_id', -1, 0, 0,
'');
1073 print
"<tr><td>".$langs->trans(
"PaymentMode").
"</td><td>";
1074 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
1075 print $form->select_types_paiements(GETPOSTISSET(
'mode_reglement_id') ?
GETPOSTINT(
'mode_reglement_id') :
$object->mode_reglement_id,
'mode_reglement_id',
'', 0, 1, 0, 0, 1,
'', 1);
1080 if (
$object->fk_account > 0) {
1081 print
"<tr><td>".$langs->trans(
'BankAccount').
"</td><td>";
1082 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->fk_account,
'none');
1091 $extralabels = $extrafields->fetch_name_optionals_label($draft->table_element);
1092 if ($draft->fetch_optionals() > 0) {
1093 $object->array_options = array_merge(
$object->array_options, $draft->array_options);
1096 print
$object->showOptionals($extrafields,
'create', $parameters);
1099 if (isModEnabled(
'project') && is_object(
$object->thirdparty) &&
$object->thirdparty->id > 0) {
1101 $langs->load(
'projects');
1102 print
'<tr><td>'.$langs->trans(
'Project').
'</td><td>';
1103 print
img_picto(
'',
'project',
'class="pictofixedwidth"');
1104 $numprojet = $formproject->select_projects(
$object->thirdparty->id, $projectid,
'projectid', 0, 0, 1, 0, 0, 0, 0,
'', 0, 0,
'');
1105 print
' <a href="'.DOL_URL_ROOT.
'/projet/card.php?socid='.
$object->thirdparty->id.
'&action=create&status=1&backtopage='.urlencode($_SERVER[
"PHP_SELF"].
'?action=create&socid='.
$object->thirdparty->id.(!empty($id) ?
'&id='.$id :
'')).
'">'.
img_object($langs->trans(
"AddProject"),
'add').
'</a>';
1110 print
"<tr><td>".$langs->trans(
'Model').
"</td><td>";
1111 include_once DOL_DOCUMENT_ROOT.
'/core/modules/facture/modules_facture.php';
1113 print
img_picto(
'',
'generic',
'class="pictofixedwidth"');
1115 print $form->selectarray(
'modelpdf', $list, $conf->global->FACTURE_ADDON_PDF);
1120 print
'<td class="tdtop">';
1121 print $form->textwithpicto($langs->trans(
'NotePublic'), $htmltext, 1,
'help',
'', 0, 2,
'notepublic');
1124 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 80,
'dolibarr_notes',
'In', 0,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1125 print $doleditor->Create(1);
1128 if (empty($user->socid)) {
1130 print
'<td class="tdtop">';
1131 print $form->textwithpicto($langs->trans(
'NotePrivate'), $htmltext, 1,
'help',
'', 0, 2,
'noteprivate');
1134 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 80,
'dolibarr_notes',
'In', 0,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1135 print $doleditor->Create(1);
1145 $title = $langs->trans(
"Recurrence");
1148 print
'<span class="opacitymedium">'.$langs->trans(
"ToCreateARecurringInvoiceGeneAuto", $langs->transnoentitiesnoconv(
'Module2300Name')).
'</span><br><br>';
1152 print
'<table class="border centpercent">';
1155 print
'<tr><td class="titlefieldcreate">'.$form->textwithpicto($langs->trans(
"Frequency"), $langs->transnoentitiesnoconv(
'toolTipFrequency')).
"</td><td>";
1156 print
'<input type="text" class="width50" name="frequency" value="'.GETPOST(
'frequency',
'int').
'"> ';
1157 print $form->selectarray(
'unit_frequency', array(
'd' => $langs->trans(
'Day'),
'm' => $langs->trans(
'Month'),
'y' => $langs->trans(
'Year')), (
GETPOST(
'unit_frequency') ?
GETPOST(
'unit_frequency') :
'm'));
1161 print
"<tr><td>".$langs->trans(
'NextDateToExecution').
"</td><td>";
1163 print $form->selectDate($date_next_execution,
'', 1, 1, 0,
"add", 1, 1);
1167 print
"<tr><td>".$langs->trans(
"MaxPeriodNumber").
"</td><td>";
1168 print
'<input type="text" class="width50" name="nb_gen_max" value="'.GETPOSTINT(
'nb_gen_max').
'">';
1172 print
"<tr><td>".$langs->trans(
"StatusOfAutoGeneratedInvoices").
"</td><td>";
1173 $select = array(
'0' => $langs->trans(
'BillStatusDraft'),
'1' => $langs->trans(
'BillStatusValidated'));
1174 print $form->selectarray(
'auto_validate', $select,
GETPOSTINT(
'auto_validate'));
1179 print
"<tr><td>".$langs->trans(
"StatusOfGeneratedDocuments").
"</td><td>";
1180 $select = array(
'0' => $langs->trans(
'DoNotGenerateDoc'),
'1' => $langs->trans(
'AutoGenerateDoc'));
1181 print $form->selectarray(
'generate_pdf', $select,
GETPOSTINT(
'generate_pdf'));
1184 print
'<input type="hidden" name="generate_pdf" value="1">';
1192 $title = $langs->trans(
"ProductsAndServices");
1193 if (!isModEnabled(
'service')) {
1194 $title = $langs->trans(
"Products");
1195 } elseif (!isModEnabled(
'product')) {
1196 $title = $langs->trans(
"Services");
1204 print
'<div class="div-table-responsive-no-min">';
1205 print
'<table id="tablelines" class="noborder noshadow centpercent">';
1209 $object->printOriginLinesList(
'', $selectedLines);
1218 if (!empty($flag_price_may_change)) {
1219 print
'<tr><td colspan="3" class="left">';
1220 print
'<select name="usenewprice" class="flat">';
1221 print
'<option value="0">'.$langs->trans(
"AlwaysUseFixedPrice").
'</option>';
1222 print
'<option value="1" disabled>'.$langs->trans(
"AlwaysUseNewPrice").
'</option>';
1228 print $form->buttonsSaveCancel(
"Create");
1243 if ($action ==
'ask_deleteline') {
1244 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'',
'no', 1);
1247 if ($action ==
'delete') {
1248 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DeleteRepeatableInvoice'), $langs->trans(
'ConfirmDeleteRepeatableInvoice'),
'confirm_delete',
'',
'no', 1);
1252 $parameters = array(
'formConfirm' => $formconfirm);
1253 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1254 if (empty($reshook)) {
1255 $formconfirm .= $hookmanager->resPrint;
1256 } elseif ($reshook > 0) {
1257 $formconfirm = $hookmanager->resPrint;
1262 $author =
new User($db);
1263 $author->fetch(
$object->user_author);
1267 print
dol_get_fiche_head($head,
'card', $langs->trans(
"RepeatableInvoice"), -1,
'bill');
1271 $linkback =
'<a href="'.DOL_URL_ROOT.
'/compta/facture/invoicetemplate_list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1274 if ($action !=
'editref') {
1275 $morehtmlref .= $form->editfieldkey(
$object->ref,
'ref',
$object->ref, $object, $user->hasRight(
'facture',
'creer'),
'',
'', 0, 2);
1277 $morehtmlref .= $form->editfieldval(
'',
'ref',
$object->ref, $object, $user->hasRight(
'facture',
'creer'),
'string');
1280 $morehtmlref .=
'<div class="refidno">';
1285 $morehtmlref .=
$object->thirdparty->getNomUrl(1,
'customer');
1287 if (isModEnabled(
'project')) {
1288 $langs->load(
"projects");
1289 $morehtmlref .=
'<br>';
1290 if ($user->hasRight(
'facture',
'creer')) {
1291 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
1292 if ($action !=
'classify') {
1293 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
1295 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->socid,
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
1297 if (!empty(
$object->fk_project)) {
1299 $proj->fetch(
$object->fk_project);
1300 $morehtmlref .=
' : '.$proj->getNomUrl(1);
1302 $morehtmlref .=
' - '.$proj->title;
1309 $morehtmlref .=
'</div>';
1311 $morehtmlstatus =
'';
1313 dol_banner_tab($object,
'ref', $linkback, 1,
'title',
'none', $morehtmlref,
'', 0,
'', $morehtmlstatus);
1315 print
'<div class="fichecenter">';
1316 print
'<div class="fichehalfleft">';
1317 print
'<div class="underbanner clearboth"></div>';
1319 print
'<table class="border centpercent tableforfield">';
1323 print
"<tr><td>".$langs->trans(
"InvoiceSubtype").
"</td><td>";
1325 print
$object->getSubtypeLabel(
'facture_rec');
1331 print
'<tr><td class="titlefield">'.$langs->trans(
"Author").
'</td><td>';
1332 print $author->getNomUrl(-1);
1336 print
'<tr><td>'.$langs->trans(
"AmountHT").
'</td>';
1337 print
'<td>'.price(
$object->total_ht, 0, $langs, 1, -1, -1, $conf->currency).
'</td>';
1341 print
'<tr><td>'.$langs->trans(
"AmountVAT").
'</td><td>'.
price(
$object->total_tva, 0, $langs, 1, -1, -1, $conf->currency).
'</td>';
1345 if (($mysoc->localtax1_assuj ==
"1" && $mysoc->useLocalTax(1)) ||
$object->total_localtax1 != 0) {
1346 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td>';
1347 print
'<td class="nowrap">'.price(
$object->total_localtax1, 1,
'', 1, - 1, - 1, $conf->currency).
'</td></tr>';
1349 if (($mysoc->localtax2_assuj ==
"1" && $mysoc->useLocalTax(2)) ||
$object->total_localtax2 != 0) {
1350 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td>';
1351 print
'<td class=nowrap">'.price(
$object->total_localtax2, 1,
'', 1, - 1, - 1, $conf->currency).
'</td></tr>';
1354 print
'<tr><td>'.$langs->trans(
"AmountTTC").
'</td><td colspan="3">'.
price(
$object->total_ttc, 0, $langs, 1, -1, -1, $conf->currency).
'</td>';
1360 print
'<table class="nobordernopadding centpercent"><tr><td>';
1361 print $langs->trans(
'PaymentConditionsShort');
1363 if ($action !=
'editconditions' && $user->hasRight(
'facture',
'creer')) {
1364 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editconditions&token='.newToken().
'&facid='.
$object->id.
'">'.
img_edit($langs->trans(
'SetConditions'), 1).
'</a></td>';
1366 print
'</tr></table>';
1369 if ($action ==
'editconditions') {
1370 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id,
$object->cond_reglement_id,
'cond_reglement_id');
1372 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id,
$object->cond_reglement_id,
'none');
1381 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1382 print $langs->trans(
'PaymentMode');
1384 if ($action !=
'editmode' && $user->hasRight(
'facture',
'creer')) {
1385 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editmode&token='.newToken().
'&facid='.
$object->id.
'">'.
img_edit($langs->trans(
'SetMode'), 1).
'</a></td>';
1387 print
'</tr></table>';
1389 if ($action ==
'editmode') {
1390 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id,
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
1392 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id,
$object->mode_reglement_id,
'none');
1397 if (isModEnabled(
'multicurrency')) {
1401 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1402 print $form->editfieldkey(
'Currency',
'multicurrency_code',
'', $object, 0);
1404 if ($usercancreate && $action !=
'editmulticurrencycode' &&
$object->suspended == $object::STATUS_SUSPENDED) {
1405 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editmulticurrencycode&token='.newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetMultiCurrencyCode'), 1).
'</a></td>';
1407 print
'</tr></table>';
1409 $htmlname = (($usercancreate && $action ==
'editmulticurrencycode') ?
'multicurrency_code' :
'none');
1410 $form->form_multicurrency_code($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->multicurrency_code, $htmlname);
1414 if (
$object->multicurrency_code != $conf->currency ||
$object->multicurrency_tx != 1) {
1417 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1418 print $form->editfieldkey(
'CurrencyRate',
'multicurrency_tx',
'', $object, 0);
1420 if ($usercancreate && $action !=
'editmulticurrencyrate' &&
$object->suspended == $object::STATUS_SUSPENDED &&
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency) {
1421 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editmulticurrencyrate&token='.newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetMultiCurrencyCode'), 1).
'</a></td>';
1423 print
'</tr></table>';
1425 if ($action ==
'editmulticurrencyrate' || $action ==
'actualizemulticurrencyrate') {
1426 if ($action ==
'actualizemulticurrencyrate') {
1429 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->multicurrency_tx, ($usercancreate ?
'multicurrency_tx' :
'none'),
$object->multicurrency_code);
1431 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->multicurrency_tx,
'none',
$object->multicurrency_code);
1432 if (
$object->statut == $object::STATUS_DRAFT &&
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency) {
1433 print
'<div class="inline-block"> ';
1434 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=actualizemulticurrencyrate">'.$langs->trans(
"ActualizeCurrency").
'</a>';
1445 $dateexample =
$object->date_when;
1451 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH__'] = $langs->trans(
"PreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'm'),
'%m').
')';
1452 $substitutionarray[
'__INVOICE_MONTH__'] = $langs->trans(
"MonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($dateexample,
'%m').
')';
1453 $substitutionarray[
'__INVOICE_NEXT_MONTH__'] = $langs->trans(
"NextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'm'),
'%m').
')';
1454 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH_TEXT__'] = $langs->trans(
"TextPreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'm'),
'%B').
')';
1455 $substitutionarray[
'__INVOICE_MONTH_TEXT__'] = $langs->trans(
"TextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($dateexample,
'%B').
')';
1456 $substitutionarray[
'__INVOICE_NEXT_MONTH_TEXT__'] = $langs->trans(
"TextNextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'm'),
'%B').
')';
1457 $substitutionarray[
'__INVOICE_PREVIOUS_YEAR__'] = $langs->trans(
"PreviousYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'y'),
'%Y').
')';
1458 $substitutionarray[
'__INVOICE_YEAR__'] = $langs->trans(
"YearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($dateexample,
'%Y').
')';
1459 $substitutionarray[
'__INVOICE_NEXT_YEAR__'] = $langs->trans(
"NextYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'y'),
'%Y').
')';
1461 $substitutionarray[
'__INVOICE_DATE_NEXT_INVOICE_BEFORE_GEN__'] = $langs->trans(
"DateNextInvoiceBeforeGen").
' ('.$langs->trans(
"Example").
': '.
dol_print_date((
$object->date_when ?
$object->date_when :
dol_now()),
'dayhour').
')';
1463 $substitutionarray[
'__INVOICE_COUNTER_CURRENT__'] =
$object->nb_gen_done;
1464 $substitutionarray[
'__INVOICE_COUNTER_MAX__'] =
$object->nb_gen_max;
1466 $htmltext =
'<i>'.$langs->trans(
"FollowingConstantsWillBeSubstituted").
':<br>';
1467 foreach ($substitutionarray as $key => $val) {
1468 $htmltext .= $key.
' = '.$langs->trans($val).
'<br>';
1470 $htmltext .=
'</i>';
1473 print
'<tr><td class="nowrap">';
1474 print
'<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
1475 print $langs->trans(
'BankAccount');
1478 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editbankaccount&token='.newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->trans(
'SetBankAccount'), 1).
'</a></td>';
1480 print
'</tr></table>';
1482 if ($action ==
'editbankaccount') {
1483 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->fk_account,
'fk_account', 1);
1485 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->fk_account,
'none');
1491 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1496 print $form->editfieldkey($form->textwithpicto($langs->trans(
'NotePublic'), $htmltext, 1,
'help',
'', 0, 2,
'notepublic'),
'note_public',
$object->note_public, $object, $user->hasRight(
'facture',
'creer'));
1497 print
'</td><td class="wordbreak">';
1498 print $form->editfieldval($langs->trans(
"NotePublic"),
'note_public',
$object->note_public, $object, $user->hasRight(
'facture',
'creer'),
'textarea:'.ROWS_4.
':90%',
'',
null,
null,
'', 1);
1504 print $form->editfieldkey($form->textwithpicto($langs->trans(
"NotePrivate"), $htmltext, 1,
'help',
'', 0, 2,
'noteprivate'),
'note_private',
$object->note_private, $object, $user->hasRight(
'facture',
'creer'));
1505 print
'</td><td class="wordbreak">';
1506 print $form->editfieldval($langs->trans(
"NotePrivate"),
'note_private',
$object->note_private, $object, $user->hasRight(
'facture',
'creer'),
'textarea:'.ROWS_4.
':90%',
'',
null,
null,
'', 1);
1511 print
'<tr><td class="nowrap">';
1512 print
'<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
1513 print $langs->trans(
'Model');
1516 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editmodelpdf&token='.newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->trans(
'SetModel'), 1).
'</a></td>';
1518 print
'</tr></table>';
1520 if ($action ==
'editmodelpdf') {
1521 include_once DOL_DOCUMENT_ROOT.
'/core/modules/facture/modules_facture.php';
1524 foreach ($models as $k => $model) {
1525 $list[] = str_replace(
':',
'|', $k).
':'.$model;
1527 $select =
'select;'.implode(
',', $list);
1528 print $form->editfieldval($langs->trans(
"Model"),
'modelpdf',
$object->model_pdf, $object, $user->hasRight(
'facture',
'creer'), $select);
1542 print
'<div class="fichehalfright">';
1543 print
'<div class="underbanner clearboth"></div>';
1549 $title = $langs->trans(
"Recurrence");
1551 print
'<table class="border centpercent tableforfield">';
1553 print
'<tr><td colspan="2">'.img_picto(
'',
'recurring',
'class="pictofixedwidth"').$title.
'</td></tr>';
1556 print
'<tr><td style="width: 50%">';
1557 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1558 print $langs->trans(
'Frequency');
1560 if ($action !=
'editfrequency' && $user->hasRight(
'facture',
'creer')) {
1561 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editfrequency&token='.newToken().
'&facid='.
$object->id.
'">'.
img_edit($langs->trans(
'Edit'), 1).
'</a></td>';
1563 print
'</tr></table>';
1565 if ($action ==
'editfrequency') {
1566 print
'<form method="post" action="'.$_SERVER[
"PHP_SELF"].
'?facid='.
$object->id.
'">';
1567 print
'<input type="hidden" name="action" value="setfrequency">';
1568 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1569 print
'<table class="nobordernopadding">';
1571 print
'<input type="text" name="frequency" class="width50 marginrightonly right" value="'.$object->frequency.
'">';
1572 print $form->selectarray(
'unit_frequency', array(
'd' => $langs->trans(
'Day'),
'm' => $langs->trans(
'Month'),
'y' => $langs->trans(
'Year')), (
$object->unit_frequency ?
$object->unit_frequency :
'm'));
1574 print
'<td class="left"><input type="submit" class="button button-edit smallpaddingimp" value="'.$langs->trans(
"Modify").
'"></td>';
1575 print
'</tr></table></form>';
1578 print $langs->trans(
'FrequencyPer_'.
$object->unit_frequency,
$object->frequency);
1580 print
'<span class="opacitymedium">'.$langs->trans(
"NotARecurringInvoiceTemplate").
'</span>';
1587 if ($action ==
'date_when' ||
$object->frequency > 0) {
1588 print $form->editfieldkey($langs->trans(
"NextDateToExecution"),
'date_when',
$object->date_when, $object, $user->hasRight(
'facture',
'creer'),
'day');
1590 print $langs->trans(
"NextDateToExecution");
1593 if ($action ==
'date_when' ||
$object->frequency > 0) {
1594 print $form->editfieldval($langs->trans(
"NextDateToExecution"),
'date_when',
$object->date_when, $object, $user->hasRight(
'facture',
'creer'),
'day',
$object->date_when,
null,
'',
'', 0,
'strikeIfMaxNbGenReached');
1597 if (!
$object->isMaxNbGenReached()) {
1602 print
img_info($langs->trans(
"MaxNumberOfGenerationReached"));
1609 if ($action ==
'nb_gen_max' ||
$object->frequency > 0) {
1610 print $form->editfieldkey($langs->trans(
"MaxPeriodNumber"),
'nb_gen_max',
$object->nb_gen_max, $object, $user->hasRight(
'facture',
'creer'));
1612 print $langs->trans(
"MaxPeriodNumber");
1615 if ($action ==
'nb_gen_max' ||
$object->frequency > 0) {
1616 print $form->editfieldval($langs->trans(
"MaxPeriodNumber"),
'nb_gen_max',
$object->nb_gen_max ?
$object->nb_gen_max :
'',
$object, $user->hasRight(
'facture',
'creer'));
1625 if ($action ==
'auto_validate' ||
$object->frequency > 0) {
1626 print $form->editfieldkey($langs->trans(
"StatusOfAutoGeneratedInvoices"),
'auto_validate',
$object->auto_validate, $object, $user->hasRight(
'facture',
'creer'));
1628 print $langs->trans(
"StatusOfAutoGeneratedInvoices");
1631 $select =
'select;0:'.$langs->trans(
'BillStatusDraft').
',1:'.$langs->trans(
'BillStatusValidated');
1632 if ($action ==
'auto_validate' ||
$object->frequency > 0) {
1633 print $form->editfieldval($langs->trans(
"StatusOfAutoGeneratedInvoices"),
'auto_validate',
$object->auto_validate, $object, $user->hasRight(
'facture',
'creer'), $select);
1640 if ($action ==
'generate_pdf' ||
$object->frequency > 0) {
1641 print $form->editfieldkey($langs->trans(
"StatusOfGeneratedDocuments"),
'generate_pdf',
$object->generate_pdf, $object, $user->hasRight(
'facture',
'creer'));
1643 print $langs->trans(
"StatusOfGeneratedDocuments");
1647 $select =
'select;0:'.$langs->trans(
'DoNotGenerateDoc').
',1:'.$langs->trans(
'AutogenerateDoc');
1648 if ($action ==
'generate_pdf' ||
$object->frequency > 0) {
1649 print $form->editfieldval($langs->trans(
"StatusOfGeneratedDocuments"),
'generate_pdf',
$object->generate_pdf, $object, $user->hasRight(
'facture',
'creer'), $select);
1654 print
'<input type="hidden" name="generate_pdf" value="1">';
1663 if (!isModEnabled(
'cron')) {
1664 print
info_admin($langs->trans(
"EnableAndSetupModuleCron", $langs->transnoentitiesnoconv(
"Module2300Name")));
1667 print
'<div class="underbanner clearboth"></div>';
1668 print
'<table class="border centpercent tableforfield">';
1671 print
'<tr><td style="width: 50%">'.$langs->trans(
"NbOfGenerationDone").
'</td>';
1679 print $langs->trans(
"DateLastGeneration");
1693 print
'<div class="clearboth"></div><br>';
1697 print
'<form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.(($action !=
'editline') ?
'#add' :
'#line_'.
GETPOSTINT(
'lineid')).
'" method="POST">';
1698 print
'<input type="hidden" name="token" value="' . newToken().
'">';
1699 print
'<input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">';
1700 print
'<input type="hidden" name="mode" value="">';
1701 print
'<input type="hidden" name="id" value="' .
$object->id.
'">';
1702 print
'<input type="hidden" name="page_y" value="">';
1704 if (!empty($conf->use_javascript_ajax) &&
$object->statut == 0) {
1705 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
1708 print
'<div class="div-table-responsive-no-min">';
1709 print
'<table id="tablelines" class="noborder noshadow centpercent">';
1712 $canchangeproduct = 1;
1713 $object->printObjectLines($action, $mysoc,
$object->thirdparty, $lineid, 0);
1717 if (
$object->status == $object::STATUS_DRAFT && $user->hasRight(
'facture',
'creer') && $action !=
'valid' && $action !=
'editline') {
1718 if ($action !=
'editline') {
1721 $parameters = array();
1722 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
1726 if (empty($reshook)) {
1743 print
'<div class="tabsAction">';
1745 $parameters = array();
1746 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
1747 if (empty($reshook)) {
1750 'class' =>
'classfortooltip',
1753 if (empty(
$object->suspended)) {
1754 if ($user->hasRight(
'facture',
'creer')) {
1756 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="' .
dol_escape_htmltag($langs->trans(
"MaxGenerationReached")) .
'">' . $langs->trans(
"CreateBill") .
'</a></div>';
1758 if (empty(
$object->frequency) ||
$object->date_when <= $nowlasthour) {
1759 print
'<div class="inline-block divButAction"><a class="butAction" href="' . DOL_URL_ROOT .
'/compta/facture/card.php?action=create&socid=' .
$object->thirdparty->id .
'&fac_rec=' .
$object->id .
'">' . $langs->trans(
"CreateBill") .
'</a></div>';
1761 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="' .
dol_escape_htmltag($langs->trans(
"DateIsNotEnough")) .
'">' . $langs->trans(
"CreateBill") .
'</a></div>';
1765 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#">' . $langs->trans(
"CreateBill") .
'</a></div>';
1769 if ($user->hasRight(
'facture',
'creer')) {
1770 if (empty(
$object->suspended)) {
1771 print
'<div class="inline-block divButAction"><a class="butActionDelete" href="'.$_SERVER[
"PHP_SELF"].
'?action=disable&id='.
$object->id.
'&token='.newToken().
'">'.$langs->trans(
"Disable").
'</a></div>';
1773 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=enable&id='.
$object->id.
'&token='.newToken().
'">'.$langs->trans(
"Enable").
'</a></div>';
1778 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=delete&token=' . newToken(),
'delete', $user->hasRight(
'facture',
'supprimer'));
1784 print
'<div class="fichecenter"><div class="fichehalfleft">';
1785 print
'<a name="builddoc"></a>';
1789 $linktoelem = $form->showLinkToObjectBlock($object,
null, array(
'invoice'));
1791 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
1795 print
'<div class="fichehalfright">';
1800 $morehtmlcenter =
'';
1803 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
1805 $somethingshown = $formactions->showactions($object,
$object->element, (is_object(
$object->thirdparty) ?
$object->thirdparty->id : 0), 1,
'', $MAXEVENT,
'', $morehtmlcenter);
1810 print $langs->trans(
"NoRecordFound");
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
const STATUS_DRAFT
Draft status.
Class to manage a WYSIWYG editor.
Class to manage invoices.
const TYPE_REPLACEMENT
Replacement invoice.
const TYPE_STANDARD
Standard invoice.
const TYPE_CREDIT_NOTE
Credit note invoice.
Class to manage invoice lines of templates.
Class to manage invoice templates.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
static getIdAndTxFromCode($dbs, $code, $date_document='')
Get id and rate of currency from code.
Class to manage products or services.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
Class to manage Dolibarr users.
getCountry($searchkey, $withcode='', $dbtouse=null, $outputlangs=null, $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
dol_get_last_hour($date, $gm='tzserver')
Return GMT time for last hour of a given GMT date (it replaces hours, min and second part to 23:59:59...
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
dol_htmlcleanlastbr($stringtodecode)
This function remove all ending and br at end.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $object=null, $include=null)
Return array of possible common substitutions.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
img_info($titlealt='default')
Show info logo.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
invoice_rec_prepare_head($object)
Return array head with list of tabs to view object information.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.