34 require
'../../main.inc.php';
35 require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture-rec.class.php';
36 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
37 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
39 include_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
42 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
43 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
44 require_once DOL_DOCUMENT_ROOT.
'/core/lib/invoice.lib.php';
45 require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
48 $langs->loadLangs(array(
'bills',
'companies',
'compta',
'admin',
'other',
'products',
'banks'));
50 $action =
GETPOST(
'action',
'alpha');
51 $massaction =
GETPOST(
'massaction',
'alpha');
52 $show_files =
GETPOST(
'show_files',
'int');
53 $confirm =
GETPOST(
'confirm',
'alpha');
54 $cancel =
GETPOST(
'cancel',
'alpha');
55 $toselect =
GETPOST(
'toselect',
'array');
56 $contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'invoicetemplatelist';
60 $lineid =
GETPOST(
'lineid',
'int');
63 $socid = $user->socid;
65 $objecttype =
'facture_rec';
66 if ($action ==
"create" || $action ==
"add") {
69 $projectid =
GETPOST(
'projectid',
'int');
71 $year_date_when =
GETPOST(
'year_date_when');
72 $month_date_when =
GETPOST(
'month_date_when');
74 $limit =
GETPOST(
'limit',
'int') ?
GETPOST(
'limit',
'int') : $conf->liste_limit;
75 $sortfield =
GETPOST(
'sortfield',
'aZ09comma');
76 $sortorder =
GETPOST(
'sortorder',
'aZ09comma');
78 if (empty($page) || $page == -1) {
81 $offset = $limit * $page;
86 $sortfield =
'f.titre';
88 $pageprev = $page - 1;
89 $pagenext = $page + 1;
92 if (($id > 0 || $ref) && $action !=
'create' && $action !=
'add') {
93 $ret = $object->fetch($id, $ref);
100 $hookmanager->initHooks(array(
'invoicereccard',
'globalcard'));
104 $extrafields->fetch_name_optionals_label($object->table_element);
106 $search_array_options = $extrafields->getOptionalsFromPost($object->table_element,
'',
'search_');
108 $permissionnote = $user->hasRight(
'facture',
'creer');
109 $permissiondellink = $user->hasRight(
'facture',
'creer');
110 $permissiontoedit = $user->hasRight(
'facture',
'creer');
112 $usercanread = $user->hasRight(
'facture',
'lire');
113 $usercancreate = $user->hasRight(
'facture',
'creer');
114 $usercanissuepayment = $user->hasRight(
'facture',
'paiement');
115 $usercandelete = $user->hasRight(
'facture',
'supprimer');
116 $usercanvalidate = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && $usercancreate) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->facture->invoice_advance->validate)));
117 $usercansend = (empty($conf->global->MAIN_USE_ADVANCED_PERMS) || $user->rights->facture->invoice_advance->send);
118 $usercanreopen = (empty($conf->global->MAIN_USE_ADVANCED_PERMS) || $user->rights->facture->invoice_advance->reopen);
119 $usercanunvalidate = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($usercancreate)) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->facture->invoice_advance->unvalidate)));
121 $usercanproductignorepricemin = ((!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->produit->ignore_price_min_advance)) || empty($conf->global->MAIN_USE_ADVANCED_PERMS));
122 $usercancreatemargin = $user->hasRight(
"margins",
"creer");
123 $usercanreadallmargin = $user->hasRight(
"margins",
"liretous");
124 $usercancreatewithdrarequest = $user->hasRight(
"prelevement",
"bons",
"creer");
130 $result =
restrictedArea($user,
'facture', $object->id, $objecttype);
137 if (
GETPOST(
'cancel',
'alpha')) {
141 if (!
GETPOST(
'confirmmassaction',
'alpha') && $massaction !=
'presend' && $massaction !=
'confirm_presend') {
145 $parameters = array();
146 $reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
151 if (empty($reshook)) {
152 if (
GETPOST(
'cancel',
'alpha')) {
157 include DOL_DOCUMENT_ROOT.
'/core/actions_changeselectedfields.inc.php';
160 include DOL_DOCUMENT_ROOT.
'/core/actions_setnotes.inc.php';
162 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
164 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
175 if ($action ==
'add') {
176 if (!
GETPOST(
'title',
'alphanohtml')) {
177 setEventMessages($langs->transnoentities(
"ErrorFieldRequired", $langs->trans(
"Title")),
null,
'errors');
182 $frequency =
GETPOST(
'frequency',
'int');
183 $reyear =
GETPOST(
'reyear',
'int');
184 $remonth =
GETPOST(
'remonth',
'int');
185 $reday =
GETPOST(
'reday',
'int');
186 $rehour =
GETPOST(
'rehour',
'int');
187 $remin =
GETPOST(
'remin',
'int');
188 $nb_gen_max =
GETPOST(
'nb_gen_max',
'int');
191 if (
GETPOST(
'frequency',
'int')) {
192 if (empty($reyear) || empty($remonth) || empty($reday)) {
193 setEventMessages($langs->transnoentities(
"ErrorFieldRequired", $langs->trans(
"Date")),
null,
'errors');
205 $object->titre =
GETPOST(
'title',
'alphanohtml');
206 $object->title =
GETPOST(
'title',
'alphanohtml');
207 $object->note_private =
GETPOST(
'note_private',
'restricthtml');
208 $object->note_public =
GETPOST(
'note_public',
'restricthtml');
209 $object->model_pdf =
GETPOST(
'modelpdf',
'alphanohtml');
210 $object->usenewprice =
GETPOST(
'usenewprice',
'alphanohtml');
212 $object->mode_reglement_id =
GETPOST(
'mode_reglement_id',
'int');
213 $object->cond_reglement_id =
GETPOST(
'cond_reglement_id',
'int');
215 $object->frequency = $frequency;
216 $object->unit_frequency =
GETPOST(
'unit_frequency',
'alpha');
217 $object->nb_gen_max = $nb_gen_max;
218 $object->auto_validate =
GETPOST(
'auto_validate',
'int');
219 $object->generate_pdf =
GETPOST(
'generate_pdf',
'int');
220 $object->fk_project = $projectid;
222 $date_next_execution =
dol_mktime($rehour, $remin, 0, $remonth, $reday, $reyear);
223 $object->date_when = $date_next_execution;
226 if (
GETPOST(
'facid',
'int') > 0) {
228 $srcObject->fetch(
GETPOST(
'facid',
'int'));
230 $srcObject->fetchObjectLinked();
232 if (!empty($srcObject->linkedObjectsIds[
'contrat'])) {
233 $contractidid = reset($srcObject->linkedObjectsIds[
'contrat']);
235 $object->origin =
'contrat';
236 $object->origin_id = $contractidid;
237 $object->linked_objects[$object->origin] = $object->origin_id;
243 $oldinvoice =
new Facture($db);
244 $oldinvoice->fetch(
GETPOST(
'facid',
'int'));
246 $result = $object->create($user, $oldinvoice->id);
248 $result = $oldinvoice->delete($user, 1);
263 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?facid='.$object->id);
274 if ($action ==
'confirm_delete' && $confirm ==
'yes' && $user->rights->facture->supprimer) {
275 $object->delete($user);
277 header(
"Location: ".DOL_URL_ROOT.
'/compta/facture/invoicetemplate_list.php');
284 if ($action ==
'setconditions' && $user->hasRight(
'facture',
'creer')) {
285 $result = $object->setPaymentTerms(
GETPOST(
'cond_reglement_id',
'int'));
286 } elseif ($action ==
'setmode' && $user->hasRight(
'facture',
'creer')) {
288 $result = $object->setPaymentMethods(
GETPOST(
'mode_reglement_id',
'int'));
289 } elseif ($action ==
'classin' && $user->hasRight(
'facture',
'creer')) {
291 $object->setProject(
GETPOST(
'projectid',
'int'));
292 } elseif ($action ==
'setref' && $user->hasRight(
'facture',
'creer')) {
295 $result = $object->setValueFrom(
'titre', $ref,
'',
null,
'text',
'', $user,
'BILLREC_MODIFY');
297 $object->titre = $ref;
298 $object->title = $ref;
299 $object->ref = $object->title;
302 if ($object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
303 $langs->load(
"errors");
304 setEventMessages($langs->trans(
'ErrorRefAlreadyExists', $ref),
null,
'errors');
309 } elseif ($action ==
'setbankaccount' && $user->hasRight(
'facture',
'creer')) {
311 $result = $object->setBankAccount(
GETPOST(
'fk_account',
'int'));
312 } elseif ($action ==
'setfrequency' && $user->hasRight(
'facture',
'creer')) {
314 $object->setFrequencyAndUnit(
GETPOST(
'frequency',
'int'),
GETPOST(
'unit_frequency',
'alpha'));
315 } elseif ($action ==
'setdate_when' && $user->hasRight(
'facture',
'creer')) {
319 $object->setNextDate($date);
321 } elseif ($action ==
'setnb_gen_max' && $user->hasRight(
'facture',
'creer')) {
323 $object->setMaxPeriod(
GETPOST(
'nb_gen_max',
'int'));
324 } elseif ($action ==
'setauto_validate' && $user->hasRight(
'facture',
'creer')) {
326 $object->setAutoValidate(
GETPOST(
'auto_validate',
'int'));
327 } elseif ($action ==
'setgenerate_pdf' && $user->hasRight(
'facture',
'creer')) {
329 $object->setGeneratepdf(
GETPOST(
'generate_pdf',
'int'));
330 } elseif ($action ==
'setmodelpdf' && $user->hasRight(
'facture',
'creer')) {
332 $object->setModelpdf(
GETPOST(
'modelpdf',
'alpha'));
333 } elseif ($action ==
'disable' && $user->hasRight(
'facture',
'creer')) {
339 $res = $object->setValueFrom(
'suspended', 1);
350 } elseif ($action ==
'enable' && $user->hasRight(
'facture',
'creer')) {
356 $res = $object->setValueFrom(
'suspended', 0);
367 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
369 $result = $object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
370 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
372 $result = $object->setMulticurrencyRate(
price2num(
GETPOST(
'multicurrency_tx')),
GETPOST(
'calculation_mode',
'int'));
376 if ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $user->hasRight(
'facture',
'creer')) {
378 $object->fetch_thirdparty();
387 if ($line->delete($user) > 0) {
388 $result = $object->update_price(1);
392 $object->fetch($object->id);
401 } elseif ($action ==
'update_extras') {
405 $ret = $extrafields->setOptionalsFromPost(
null, $object,
GETPOST(
'attribute',
'restricthtml'));
411 $result = $object->insertExtraFields(
'BILLREC_MODIFY');
420 if ($action ==
'addline' && $user->hasRight(
'facture',
'creer')) {
421 $langs->load(
'errors');
429 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'alpha');
430 if ($prod_entry_mode ==
'free') {
432 $tva_tx = (
GETPOST(
'tva_tx',
'alpha') ?
GETPOST(
'tva_tx',
'alpha') : 0);
434 $idprod =
GETPOST(
'idprod',
'int');
437 if (!empty($conf->global->MAIN_DISABLE_FREE_LINES) && $idprod <= 0) {
438 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
445 if (empty($remise_percent)) {
450 $extralabelsline = $extrafields->fetch_name_optionals_label($object->table_element_line);
451 $array_options = $extrafields->getOptionalsFromPost($object->table_element_line, $predef);
453 if (is_array($extralabelsline)) {
455 foreach ($extralabelsline as $key => $value) {
456 unset($_POST[
"options_".$key.$predef]);
460 if ((empty($idprod) || $idprod < 0) && ($price_ht < 0) && ($qty < 0)) {
461 setEventMessages($langs->trans(
'ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv(
'UnitPriceHT'), $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
464 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
465 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Type')),
null,
'errors');
468 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && (!($price_ht >= 0) || $price_ht ==
'')) {
469 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
473 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
476 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($product_desc)) {
477 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Description')),
null,
'errors');
481 $langs->load(
"errors");
482 setEventMessages($langs->trans(
'ErrorQtyForCustomerInvoiceCantBeNegative'),
null,
'errors');
486 if (!$error && ($qty >= 0) && (!empty($product_desc) || (!empty($idprod) && $idprod > 0))) {
487 $ret = $object->fetch($id);
492 $ret = $object->fetch_thirdparty();
497 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
508 if (!empty($idprod) && $idprod > 0) {
510 $prod->fetch($idprod);
512 $label = ((
GETPOST(
'product_label') &&
GETPOST(
'product_label') != $prod->label) ?
GETPOST(
'product_label') :
'');
517 if (empty($tva_tx)) {
524 $datapriceofproduct = $prod->getSellPrice($mysoc, $object->thirdparty, $pqp);
526 $pu_ht = $datapriceofproduct[
'pu_ht'];
527 $pu_ttc = $datapriceofproduct[
'pu_ttc'];
528 $price_min = $datapriceofproduct[
'price_min'];
529 $price_base_type = $datapriceofproduct[
'price_base_type'];
530 $tva_tx = $datapriceofproduct[
'tva_tx'];
531 $tva_npr = $datapriceofproduct[
'tva_npr'];
533 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
534 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $prod->tva_tx));
537 if (!empty($price_ht)) {
539 $pu_ttc =
price2num($pu_ht * (1 + ($tmpvat / 100)),
'MU');
540 } elseif ($tmpvat != $tmpprodvat) {
543 if ($price_base_type !=
'HT') {
544 $pu_ht =
price2num($pu_ttc / (1 + ($tmpvat / 100)),
'MU');
546 $pu_ttc =
price2num($pu_ht * (1 + ($tmpvat / 100)),
'MU');
553 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && !empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) {
554 $outputlangs = $langs;
556 if (empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
557 $newlang =
GETPOST(
'lang_id',
'aZ09');
559 if (empty($newlang)) {
560 $newlang = $object->thirdparty->default_lang;
562 if (!empty($newlang)) {
564 $outputlangs->setDefaultLang($newlang);
567 $desc = (!empty($prod->multilangs [$outputlangs->defaultlang] [
"description"])) ? $prod->multilangs [$outputlangs->defaultlang] [
"description"] : $prod->description;
569 $desc = $prod->description;
575 if (empty($conf->global->MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE) && (!empty($prod->customcode) || !empty($prod->country_code))) {
578 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && !empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) {
579 $outputlangs = $langs;
581 if (empty($newlang) &&
GETPOST(
'lang_id',
'alpha')) {
582 $newlang =
GETPOST(
'lang_id',
'alpha');
584 if (empty($newlang)) {
585 $newlang = $object->thirdparty->default_lang;
587 if (!empty($newlang)) {
589 $outputlangs->setDefaultLang($newlang);
590 $outputlangs->load(
'products');
592 if (!empty($prod->customcode)) {
593 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
595 if (!empty($prod->customcode) && !empty($prod->country_code)) {
598 if (!empty($prod->country_code)) {
599 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code, 0, $db, $outputlangs, 0);
602 if (!empty($prod->customcode)) {
603 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
605 if (!empty($prod->customcode) && !empty($prod->country_code)) {
608 if (!empty($prod->country_code)) {
609 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code, 0, $db, $langs, 0);
617 $fk_unit = $prod->fk_unit;
621 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
622 $tva_tx = str_replace(
'*',
'', $tva_tx);
623 if (empty($tva_tx)) {
626 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
627 $desc = $product_desc;
629 $fk_unit =
GETPOST(
'units',
'alpha');
632 $date_start_fill =
GETPOST(
'date_start_fill',
'int');
633 $date_end_fill =
GETPOST(
'date_end_fill',
'int');
640 $localtax1_tx =
get_localtax($tva_tx, 1, $object->thirdparty, $mysoc, $tva_npr);
641 $localtax2_tx =
get_localtax($tva_tx, 2, $object->thirdparty, $mysoc, $tva_npr);
648 if ($usercanproductignorepricemin && (!empty($price_min) && (
price2num($pu_ht) * (1 -
price2num($remise_percent) / 100) <
price2num($price_min)))) {
649 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, - 1, $conf->currency));
653 $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);
674 $object->fetch($object->id);
676 unset($_POST[
'prod_entry_mode']);
678 unset($_POST[
'qty']);
679 unset($_POST[
'type']);
680 unset($_POST[
'remise_percent']);
681 unset($_POST[
'price_ht']);
682 unset($_POST[
'multicurrency_price_ht']);
683 unset($_POST[
'price_ttc']);
684 unset($_POST[
'tva_tx']);
685 unset($_POST[
'product_ref']);
686 unset($_POST[
'product_label']);
687 unset($_POST[
'product_desc']);
688 unset($_POST[
'fournprice']);
689 unset($_POST[
'buying_price']);
690 unset($_POST[
'np_marginRate']);
691 unset($_POST[
'np_markRate']);
692 unset($_POST[
'dp_desc']);
693 unset($_POST[
'idprod']);
694 unset($_POST[
'units']);
696 unset($_POST[
'date_starthour']);
697 unset($_POST[
'date_startmin']);
698 unset($_POST[
'date_startsec']);
699 unset($_POST[
'date_startday']);
700 unset($_POST[
'date_startmonth']);
701 unset($_POST[
'date_startyear']);
702 unset($_POST[
'date_endhour']);
703 unset($_POST[
'date_endmin']);
704 unset($_POST[
'date_endsec']);
705 unset($_POST[
'date_endday']);
706 unset($_POST[
'date_endmonth']);
707 unset($_POST[
'date_endyear']);
709 unset($_POST[
'date_start_fill']);
710 unset($_POST[
'date_end_fill']);
712 unset($_POST[
'situations']);
713 unset($_POST[
'progress']);
721 } elseif ($action ==
'updateline' && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
722 if (!$object->fetch($id) > 0) {
725 $object->fetch_thirdparty();
740 if (preg_match(
'/\*/', $vat_rate)) {
745 $vat_rate = str_replace(
'*',
'', $vat_rate);
746 $localtax1_rate =
get_localtax($vat_rate, 1, $object->thirdparty);
747 $localtax2_rate =
get_localtax($vat_rate, 2, $object->thirdparty);
754 $extralabelsline = $extrafields->fetch_name_optionals_label($object->table_element_line);
755 $array_options = $extrafields->getOptionalsFromPost($object->table_element_line);
758 if ($objectline->fetch(
GETPOST(
'lineid',
'int'))) {
759 $objectline->array_options = $array_options;
760 $result = $objectline->insertExtraFields();
766 $position = ($objectline->rang >= 0 ? $objectline->rang : 0);
769 if (is_array($extralabelsline)) {
771 foreach ($extralabelsline as $key => $value) {
772 unset($_POST[
"options_".$key]);
777 $special_code =
GETPOST(
'special_code',
'int');
778 if ($special_code == 3) {
795 if (empty($remise_percent)) {
800 $productid =
GETPOST(
'productid',
'int');
801 if (!empty($productid)) {
803 $product->fetch($productid);
805 $type = $product->type;
807 $price_min = $product->price_min;
808 if (!empty($conf->global->PRODUIT_MULTIPRICES) && !empty($object->thirdparty->price_level)) {
809 $price_min = $product->multiprices_min[$object->thirdparty->price_level];
818 setEventMessages($langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, - 1, $conf->currency)),
null,
'errors');
822 $type =
GETPOST(
'type',
'int');
823 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
826 if (
GETPOST(
'type',
'int') < 0) {
827 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
832 $langs->load(
"errors");
833 setEventMessages($langs->trans(
'ErrorQtyForCustomerInvoiceCantBeNegative'),
null,
'errors');
837 $date_start_fill =
GETPOST(
'date_start_fill',
'int');
838 $date_end_fill =
GETPOST(
'date_end_fill',
'int');
842 $result = $object->updateline(
887 $object->fetch($object->id);
889 unset($_POST[
'qty']);
890 unset($_POST[
'type']);
891 unset($_POST[
'productid']);
892 unset($_POST[
'remise_percent']);
893 unset($_POST[
'price_ht']);
894 unset($_POST[
'multicurrency_price_ht']);
895 unset($_POST[
'price_ttc']);
896 unset($_POST[
'tva_tx']);
897 unset($_POST[
'product_ref']);
898 unset($_POST[
'product_label']);
899 unset($_POST[
'product_desc']);
900 unset($_POST[
'fournprice']);
901 unset($_POST[
'buying_price']);
902 unset($_POST[
'np_marginRate']);
903 unset($_POST[
'np_markRate']);
905 unset($_POST[
'dp_desc']);
906 unset($_POST[
'idprod']);
907 unset($_POST[
'units']);
909 unset($_POST[
'date_starthour']);
910 unset($_POST[
'date_startmin']);
911 unset($_POST[
'date_startsec']);
912 unset($_POST[
'date_startday']);
913 unset($_POST[
'date_startmonth']);
914 unset($_POST[
'date_startyear']);
915 unset($_POST[
'date_endhour']);
916 unset($_POST[
'date_endmin']);
917 unset($_POST[
'date_endsec']);
918 unset($_POST[
'date_endday']);
919 unset($_POST[
'date_endmonth']);
920 unset($_POST[
'date_endyear']);
922 unset($_POST[
'situations']);
923 unset($_POST[
'progress']);
936 $title = $object->ref.
" - ".$langs->trans(
'Card');
946 $companystatic =
new Societe($db);
956 if ($action ==
'create') {
957 print
load_fiche_titre($langs->trans(
"CreateRepeatableInvoice"),
'',
'bill');
960 $product_static =
new Product($db);
962 if ($object->fetch($id, $ref) > 0) {
963 $result = $object->getLinesArray();
965 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
966 print
'<input type="hidden" name="token" value="'.newToken().
'">';
967 print
'<input type="hidden" name="action" value="add">';
968 print
'<input type="hidden" name="facid" value="'.$object->id.
'">';
976 if ($object->fk_account > 0) {
980 print
'<table class="border centpercent">';
982 $object->fetch_thirdparty();
985 print
'<tr><td class="titlefieldcreate fieldrequired">'.$langs->trans(
"Title").
'</td><td>';
986 print
'<input class="flat quatrevingtpercent" type="text" name="title" value="'.dol_escape_htmltag(
GETPOST(
"title",
'alphanohtml')).
'" autofocus>';
990 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Customer").
'</td><td>'.$object->thirdparty->getNomUrl(1,
'customer').
'</td>';
993 $note_public =
GETPOSTISSET(
'note_public') ?
GETPOST(
'note_public',
'restricthtml') : $object->note_public;
994 $note_private =
GETPOSTISSET(
'note_private') ?
GETPOST(
'note_private',
'restricthtml') : $object->note_private;
999 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH__'] = $langs->trans(
"PreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, -1,
'm'),
'%m').
')';
1000 $substitutionarray[
'__INVOICE_MONTH__'] = $langs->trans(
"MonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($object->date,
'%m').
')';
1001 $substitutionarray[
'__INVOICE_NEXT_MONTH__'] = $langs->trans(
"NextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, 1,
'm'),
'%m').
')';
1002 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH_TEXT__'] = $langs->trans(
"TextPreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, -1,
'm'),
'%B').
')';
1003 $substitutionarray[
'__INVOICE_MONTH_TEXT__'] = $langs->trans(
"TextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($object->date,
'%B').
')';
1004 $substitutionarray[
'__INVOICE_NEXT_MONTH_TEXT__'] = $langs->trans(
"TextNextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, 1,
'm'),
'%B').
')';
1005 $substitutionarray[
'__INVOICE_PREVIOUS_YEAR__'] = $langs->trans(
"PreviousYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, -1,
'y'),
'%Y').
')';
1006 $substitutionarray[
'__INVOICE_YEAR__'] = $langs->trans(
"YearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($object->date,
'%Y').
')';
1007 $substitutionarray[
'__INVOICE_NEXT_YEAR__'] = $langs->trans(
"NextYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, 1,
'y'),
'%Y').
')';
1009 $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').
')';
1010 $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').
')';
1011 $substitutionarray[
'__INVOICE_COUNTER_CURRENT__'] = $langs->trans(
"Count");
1012 $substitutionarray[
'__INVOICE_COUNTER_MAX__'] = $langs->trans(
"MaxPeriodNumber");
1014 $htmltext =
'<i>'.$langs->trans(
"FollowingConstantsWillBeSubstituted").
':<br>';
1015 foreach ($substitutionarray as $key => $val) {
1016 $htmltext .= $key.
' = '.$langs->trans($val).
'<br>';
1018 $htmltext .=
'</i>';
1022 print
'<td class="tdtop">';
1023 print
$form->textwithpicto($langs->trans(
'NotePublic'), $htmltext, 1,
'help',
'', 0, 2,
'notepublic');
1026 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 80,
'dolibarr_notes',
'In', 0,
false, empty($conf->global->FCKEDITOR_ENABLE_NOTE_PUBLIC) ? 0 : 1, ROWS_3,
'90%');
1027 print $doleditor->Create(1);
1030 if (empty($user->socid)) {
1032 print
'<td class="tdtop">';
1033 print
$form->textwithpicto($langs->trans(
'NotePrivate'), $htmltext, 1,
'help',
'', 0, 2,
'noteprivate');
1036 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 80,
'dolibarr_notes',
'In', 0,
false, empty($conf->global->FCKEDITOR_ENABLE_NOTE_PRIVATE) ? 0 : 1, ROWS_3,
'90%');
1037 print $doleditor->Create(1);
1043 print
"<tr><td>".$langs->trans(
"Author").
"</td><td>".$user->getFullName($langs).
"</td></tr>";
1046 print
"<tr><td>".$langs->trans(
"PaymentConditions").
"</td><td>";
1047 print
$form->getSelectConditionsPaiements(
GETPOSTISSET(
'cond_reglement_id') ?
GETPOST(
'cond_reglement_id',
'int') : $object->cond_reglement_id,
'cond_reglement_id', -1, 0, 0,
'');
1052 print
"<tr><td>".$langs->trans(
"PaymentMode").
"</td><td>";
1053 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
1054 print
$form->select_types_paiements(
GETPOSTISSET(
'mode_reglement_id') ?
GETPOST(
'mode_reglement_id',
'int') : $object->mode_reglement_id,
'mode_reglement_id',
'', 0, 1, 0, 0, 1,
'', 1);
1059 if ($object->fk_account > 0) {
1060 print
"<tr><td>".$langs->trans(
'BankAccount').
"</td><td>";
1061 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->fk_account,
'none');
1066 if (
isModEnabled(
'project') && is_object($object->thirdparty) && $object->thirdparty->id > 0) {
1067 $projectid =
GETPOST(
'projectid') ?
GETPOST(
'projectid') : $object->fk_project;
1068 $langs->load(
'projects');
1069 print
'<tr><td>'.$langs->trans(
'Project').
'</td><td>';
1070 print
img_picto(
'',
'project',
'class="pictofixedwidth"');
1071 $numprojet = $formproject->select_projects($object->thirdparty->id, $projectid,
'projectid', 0, 0, 1, 0, 0, 0, 0,
'', 0, 0,
'');
1072 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>';
1077 print
"<tr><td>".$langs->trans(
'Model').
"</td><td>";
1078 include_once DOL_DOCUMENT_ROOT.
'/core/modules/facture/modules_facture.php';
1080 print
img_picto(
'',
'generic',
'class="pictofixedwidth"');
1081 print
$form->selectarray(
'modelpdf', $list, $conf->global->FACTURE_ADDON_PDF);
1090 $title = $langs->trans(
"Recurrence");
1095 print
'<table class="border centpercent">';
1098 print
'<tr><td class="titlefieldcreate">'.$form->textwithpicto($langs->trans(
"Frequency"), $langs->transnoentitiesnoconv(
'toolTipFrequency')).
"</td><td>";
1099 print
"<input type='text' name='frequency' value='".GETPOST(
'frequency',
'int').
"' size='4' /> ";
1100 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'));
1104 print
"<tr><td>".$langs->trans(
'NextDateToExecution').
"</td><td>";
1106 print
$form->selectDate($date_next_execution,
'', 1, 1,
'',
"add", 1, 1);
1110 print
"<tr><td>".$langs->trans(
"MaxPeriodNumber").
"</td><td>";
1111 print
'<input type="text" name="nb_gen_max" value="'.GETPOST(
'nb_gen_max').
'" size="5" />';
1115 print
"<tr><td>".$langs->trans(
"StatusOfGeneratedInvoices").
"</td><td>";
1116 $select = array(
'0'=>$langs->trans(
'BillStatusDraft'),
'1'=>$langs->trans(
'BillStatusValidated'));
1117 print
$form->selectarray(
'auto_validate', $select,
GETPOST(
'auto_validate'));
1121 if (!empty($conf->global->INVOICE_REC_CAN_DISABLE_DOCUMENT_FILE_GENERATION)) {
1122 print
"<tr><td>".$langs->trans(
"StatusOfGeneratedDocuments").
"</td><td>";
1123 $select = array(
'0'=>$langs->trans(
'DoNotGenerateDoc'),
'1'=>$langs->trans(
'AutoGenerateDoc'));
1124 print
$form->selectarray(
'generate_pdf', $select,
GETPOST(
'generate_pdf'));
1127 print
'<input type="hidden" name="generate_pdf" value="1">';
1135 $title = $langs->trans(
"ProductsAndServices");
1137 $title = $langs->trans(
"Products");
1139 $title = $langs->trans(
"Services");
1147 print
'<div class="div-table-responsive-no-min">';
1148 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
1150 if (!empty($object->lines)) {
1154 $object->printObjectLines(
'', $mysoc, $object->thirdparty, $lineid, 0);
1162 if ($flag_price_may_change) {
1163 print
'<tr><td colspan="3" class="left">';
1164 print
'<select name="usenewprice" class="flat">';
1165 print
'<option value="0">'.$langs->trans(
"AlwaysUseFixedPrice").
'</option>';
1166 print
'<option value="1" disabled>'.$langs->trans(
"AlwaysUseNewPrice").
'</option>';
1172 print
$form->buttonsSaveCancel(
"Create");
1182 if ($object->id > 0) {
1183 $object->fetch_thirdparty();
1186 if ($action ==
'ask_deleteline') {
1187 $formconfirm =
$form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'',
'no', 1);
1191 if ($action ==
'delete') {
1192 $formconfirm =
$form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'DeleteRepeatableInvoice'), $langs->trans(
'ConfirmDeleteRepeatableInvoice'),
'confirm_delete',
'',
'no', 1);
1197 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1198 if (empty($reshook)) {
1200 } elseif ($reshook > 0) {
1206 $author =
new User($db);
1207 $author->fetch($object->user_author);
1211 print
dol_get_fiche_head($head,
'card', $langs->trans(
"RepeatableInvoice"), -1,
'bill');
1215 $linkback =
'<a href="'.DOL_URL_ROOT.
'/compta/facture/invoicetemplate_list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1218 if ($action !=
'editref') {
1219 $morehtmlref .=
$form->editfieldkey($object->ref,
'ref', $object->ref, $object, $user->hasRight(
'facture',
'creer'),
'',
'', 0, 2);
1221 $morehtmlref .=
$form->editfieldval(
'',
'ref', $object->ref, $object, $user->hasRight(
'facture',
'creer'),
'string');
1224 $morehtmlref .=
'<div class="refidno">';
1229 $morehtmlref .= $object->thirdparty->getNomUrl(1,
'customer');
1232 $langs->load(
"projects");
1233 $morehtmlref .=
'<br>';
1234 if ($user->hasRight(
'facture',
'creer')) {
1235 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
1236 if ($action !=
'classify') {
1237 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
1239 $morehtmlref .=
$form->form_project($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->socid, $object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
1241 if (!empty($object->fk_project)) {
1243 $proj->fetch($object->fk_project);
1244 $morehtmlref .=
' : '.$proj->getNomUrl(1);
1246 $morehtmlref .=
' - '.$proj->title;
1253 $morehtmlref .=
'</div>';
1255 $morehtmlright =
'';
1257 dol_banner_tab($object,
'ref', $linkback, 1,
'title',
'none', $morehtmlref,
'', 0,
'', $morehtmlright);
1259 print
'<div class="fichecenter">';
1260 print
'<div class="fichehalfleft">';
1261 print
'<div class="underbanner clearboth"></div>';
1263 print
'<table class="border centpercent tableforfield">';
1265 print
'<tr><td class="titlefield">'.$langs->trans(
"Author").
'</td><td>';
1266 print $author->getNomUrl(-1);
1269 print
'<tr><td>'.$langs->trans(
"AmountHT").
'</td>';
1270 print
'<td>'.price($object->total_ht,
'', $langs, 1, -1, -1, $conf->currency).
'</td>';
1273 print
'<tr><td>'.$langs->trans(
"AmountVAT").
'</td><td>'.
price($object->total_tva,
'', $langs, 1, -1, -1, $conf->currency).
'</td>';
1277 if (($mysoc->localtax1_assuj ==
"1" && $mysoc->useLocalTax(1)) || $object->total_localtax1 != 0) {
1278 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td>';
1279 print
'<td class="nowrap">'.price($object->total_localtax1, 1,
'', 1, - 1, - 1, $conf->currency).
'</td></tr>';
1281 if (($mysoc->localtax2_assuj ==
"1" && $mysoc->useLocalTax(2)) || $object->total_localtax2 != 0) {
1282 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td>';
1283 print
'<td class=nowrap">'.price($object->total_localtax2, 1,
'', 1, - 1, - 1, $conf->currency).
'</td></tr>';
1286 print
'<tr><td>'.$langs->trans(
"AmountTTC").
'</td><td colspan="3">'.
price($object->total_ttc,
'', $langs, 1, -1, -1, $conf->currency).
'</td>';
1292 print
'<table class="nobordernopadding centpercent"><tr><td>';
1293 print $langs->trans(
'PaymentConditionsShort');
1295 if ($action !=
'editconditions' && $user->hasRight(
'facture',
'creer')) {
1296 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>';
1298 print
'</tr></table>';
1301 if ($action ==
'editconditions') {
1302 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->cond_reglement_id,
'cond_reglement_id');
1304 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->cond_reglement_id,
'none');
1313 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1314 print $langs->trans(
'PaymentMode');
1316 if ($action !=
'editmode' && $user->hasRight(
'facture',
'creer')) {
1317 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>';
1319 print
'</tr></table>';
1321 if ($action ==
'editmode') {
1322 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
1324 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->mode_reglement_id,
'none');
1333 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1334 print
$form->editfieldkey(
'Currency',
'multicurrency_code',
'', $object, 0);
1336 if ($usercancreate && $action !=
'editmulticurrencycode' && !empty($object->brouillon)) {
1337 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>';
1339 print
'</tr></table>';
1341 $htmlname = (($usercancreate && $action ==
'editmulticurrencycode') ?
'multicurrency_code' :
'none');
1342 $form->form_multicurrency_code($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->multicurrency_code, $htmlname);
1346 if ($object->multicurrency_code != $conf->currency || $object->multicurrency_tx != 1) {
1349 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1350 print
$form->editfieldkey(
'CurrencyRate',
'multicurrency_tx',
'', $object, 0);
1352 if ($usercancreate && $action !=
'editmulticurrencyrate' && !empty($object->brouillon) && $object->multicurrency_code && $object->multicurrency_code != $conf->currency) {
1353 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>';
1355 print
'</tr></table>';
1357 if ($action ==
'editmulticurrencyrate' || $action ==
'actualizemulticurrencyrate') {
1358 if ($action ==
'actualizemulticurrencyrate') {
1361 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->multicurrency_tx, ($usercancreate ?
'multicurrency_tx' :
'none'), $object->multicurrency_code);
1363 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->multicurrency_tx,
'none', $object->multicurrency_code);
1364 if ($object->statut == $object::STATUS_DRAFT && $object->multicurrency_code && $object->multicurrency_code != $conf->currency) {
1365 print
'<div class="inline-block"> ';
1366 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=actualizemulticurrencyrate">'.$langs->trans(
"ActualizeCurrency").
'</a>';
1376 if (!empty($object->frequency) && !empty($object->date_when)) {
1377 $dateexample = $object->date_when;
1383 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH__'] = $langs->trans(
"PreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'm'),
'%m').
')';
1384 $substitutionarray[
'__INVOICE_MONTH__'] = $langs->trans(
"MonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($dateexample,
'%m').
')';
1385 $substitutionarray[
'__INVOICE_NEXT_MONTH__'] = $langs->trans(
"NextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'm'),
'%m').
')';
1386 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH_TEXT__'] = $langs->trans(
"TextPreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'm'),
'%B').
')';
1387 $substitutionarray[
'__INVOICE_MONTH_TEXT__'] = $langs->trans(
"TextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($dateexample,
'%B').
')';
1388 $substitutionarray[
'__INVOICE_NEXT_MONTH_TEXT__'] = $langs->trans(
"TextNextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'm'),
'%B').
')';
1389 $substitutionarray[
'__INVOICE_PREVIOUS_YEAR__'] = $langs->trans(
"PreviousYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'y'),
'%Y').
')';
1390 $substitutionarray[
'__INVOICE_YEAR__'] = $langs->trans(
"YearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($dateexample,
'%Y').
')';
1391 $substitutionarray[
'__INVOICE_NEXT_YEAR__'] = $langs->trans(
"NextYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'y'),
'%Y').
')';
1393 $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').
')';
1394 $substitutionarray[
'__INVOICE_DATE_NEXT_INVOICE_AFTER_GEN__'] = $langs->trans(
"DateNextInvoiceAfterGen").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree(($object->date_when ? $object->date_when :
dol_now()), $object->frequency, $object->unit_frequency),
'dayhour').
')';
1395 $substitutionarray[
'__INVOICE_COUNTER_CURRENT__'] = $object->nb_gen_done;
1396 $substitutionarray[
'__INVOICE_COUNTER_MAX__'] = $object->nb_gen_max;
1398 $htmltext =
'<i>'.$langs->trans(
"FollowingConstantsWillBeSubstituted").
':<br>';
1399 foreach ($substitutionarray as $key => $val) {
1400 $htmltext .= $key.
' = '.$langs->trans($val).
'<br>';
1402 $htmltext .=
'</i>';
1406 print
$form->editfieldkey(
$form->textwithpicto($langs->trans(
'NotePublic'), $htmltext, 1,
'help',
'', 0, 2,
'notepublic'),
'note_public', $object->note_public, $object, $user->hasRight(
'facture',
'creer'));
1407 print
'</td><td class="wordbreak">';
1408 print
$form->editfieldval($langs->trans(
"NotePublic"),
'note_public', $object->note_public, $object, $user->hasRight(
'facture',
'creer'),
'textarea:'.ROWS_4.
':90%',
'',
null,
null,
'', 1);
1414 print
$form->editfieldkey(
$form->textwithpicto($langs->trans(
"NotePrivate"), $htmltext, 1,
'help',
'', 0, 2,
'noteprivate'),
'note_private', $object->note_private, $object, $user->hasRight(
'facture',
'creer'));
1415 print
'</td><td class="wordbreak">';
1416 print
$form->editfieldval($langs->trans(
"NotePrivate"),
'note_private', $object->note_private, $object, $user->hasRight(
'facture',
'creer'),
'textarea:'.ROWS_4.
':90%',
'',
null,
null,
'', 1);
1421 print
'<tr><td class="nowrap">';
1422 print
'<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
1423 print $langs->trans(
'BankAccount');
1425 if (($action !=
'editbankaccount') && $user->hasRight(
'facture',
'creer') && $object->statut ==
FactureRec::STATUS_DRAFT) {
1426 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>';
1428 print
'</tr></table>';
1430 if ($action ==
'editbankaccount') {
1431 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->fk_account,
'fk_account', 1);
1433 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->fk_account,
'none');
1439 print
'<tr><td class="nowrap">';
1440 print
'<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
1441 print $langs->trans(
'Model');
1443 if (($action !=
'editmodelpdf') && $user->hasRight(
'facture',
'creer') && $object->statut ==
FactureRec::STATUS_DRAFT) {
1444 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>';
1446 print
'</tr></table>';
1448 if ($action ==
'editmodelpdf') {
1449 include_once DOL_DOCUMENT_ROOT.
'/core/modules/facture/modules_facture.php';
1452 foreach ($models as $k => $model) {
1453 $list[] = str_replace(
':',
'|', $k).
':'.$model;
1455 $select =
'select;'.implode(
',', $list);
1456 print
$form->editfieldval($langs->trans(
"Model"),
'modelpdf', $object->model_pdf, $object, $user->hasRight(
'facture',
'creer'), $select);
1458 print $object->model_pdf;
1465 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1470 print
'<div class="fichehalfright">';
1471 print
'<div class="underbanner clearboth"></div>';
1477 $title = $langs->trans(
"Recurrence");
1480 print
'<table class="border centpercent tableforfield">';
1482 print
'<tr><td colspan="2">'.img_picto(
'',
'recurring',
'class="pictofixedwidth"').$title.
'</td></tr>';
1485 print
'<tr><td style="width: 50%">';
1486 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1487 print $langs->trans(
'Frequency');
1489 if ($action !=
'editfrequency' && $user->hasRight(
'facture',
'creer')) {
1490 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>';
1492 print
'</tr></table>';
1494 if ($action ==
'editfrequency') {
1495 print
'<form method="post" action="'.$_SERVER[
"PHP_SELF"].
'?facid='.$object->id.
'">';
1496 print
'<input type="hidden" name="action" value="setfrequency">';
1497 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1498 print
'<table class="nobordernopadding">';
1500 print
"<input type='text' name='frequency' value='".$object->frequency.
"' size='5' /> ";
1501 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'));
1503 print
'<td class="left"><input type="submit" class="button button-edit smallpaddingimp" value="'.$langs->trans(
"Modify").
'"></td>';
1504 print
'</tr></table></form>';
1506 if ($object->frequency > 0) {
1507 print $langs->trans(
'FrequencyPer_'.$object->unit_frequency, $object->frequency);
1509 print
'<span class="opacitymedium">'.$langs->trans(
"NotARecurringInvoiceTemplate").
'</span>';
1516 if ($action ==
'date_when' || $object->frequency > 0) {
1517 print
$form->editfieldkey($langs->trans(
"NextDateToExecution"),
'date_when', $object->date_when, $object, $user->hasRight(
'facture',
'creer'),
'day');
1519 print $langs->trans(
"NextDateToExecution");
1522 if ($action ==
'date_when' || $object->frequency > 0) {
1523 print
$form->editfieldval($langs->trans(
"NextDateToExecution"),
'date_when', $object->date_when, $object, $user->hasRight(
'facture',
'creer'),
'day', $object->date_when,
null,
'',
'', 0,
'strikeIfMaxNbGenReached');
1526 if (!$object->isMaxNbGenReached()) {
1527 if (!$object->suspended && $action !=
'editdate_when' && $object->frequency > 0 && $object->date_when && $object->date_when < $now) {
1531 print
img_info($langs->trans(
"MaxNumberOfGenerationReached"));
1538 if ($action ==
'nb_gen_max' || $object->frequency > 0) {
1539 print
$form->editfieldkey($langs->trans(
"MaxPeriodNumber"),
'nb_gen_max', $object->nb_gen_max, $object, $user->hasRight(
'facture',
'creer'));
1541 print $langs->trans(
"MaxPeriodNumber");
1544 if ($action ==
'nb_gen_max' || $object->frequency > 0) {
1545 print
$form->editfieldval($langs->trans(
"MaxPeriodNumber"),
'nb_gen_max', $object->nb_gen_max ? $object->nb_gen_max :
'', $object, $user->hasRight(
'facture',
'creer'));
1554 if ($action ==
'auto_validate' || $object->frequency > 0) {
1555 print
$form->editfieldkey($langs->trans(
"StatusOfGeneratedInvoices"),
'auto_validate', $object->auto_validate, $object, $user->hasRight(
'facture',
'creer'));
1557 print $langs->trans(
"StatusOfGeneratedInvoices");
1560 $select =
'select;0:'.$langs->trans(
'BillStatusDraft').
',1:'.$langs->trans(
'BillStatusValidated');
1561 if ($action ==
'auto_validate' || $object->frequency > 0) {
1562 print
$form->editfieldval($langs->trans(
"StatusOfGeneratedInvoices"),
'auto_validate', $object->auto_validate, $object, $user->hasRight(
'facture',
'creer'), $select);
1566 if (!empty($conf->global->INVOICE_REC_CAN_DISABLE_DOCUMENT_FILE_GENERATION)) {
1569 if ($action ==
'generate_pdf' || $object->frequency > 0) {
1570 print
$form->editfieldkey($langs->trans(
"StatusOfGeneratedDocuments"),
'generate_pdf', $object->generate_pdf, $object, $user->hasRight(
'facture',
'creer'));
1572 print $langs->trans(
"StatusOfGeneratedDocuments");
1576 $select =
'select;0:'.$langs->trans(
'DoNotGenerateDoc').
',1:'.$langs->trans(
'AutogenerateDoc');
1577 if ($action ==
'generate_pdf' || $object->frequency > 0) {
1578 print
$form->editfieldval($langs->trans(
"StatusOfGeneratedDocuments"),
'generate_pdf', $object->generate_pdf, $object, $user->hasRight(
'facture',
'creer'), $select);
1583 print
'<input type="hidden" name="generate_pdf" value="1">';
1589 if ($object->frequency > 0) {
1593 print
info_admin($langs->trans(
"EnableAndSetupModuleCron", $langs->transnoentitiesnoconv(
"Module2300Name")));
1596 print
'<div class="underbanner clearboth"></div>';
1597 print
'<table class="border centpercent tableforfield">';
1600 print
'<tr><td style="width: 50%">'.$langs->trans(
"NbOfGenerationDone").
'</td>';
1602 print $object->nb_gen_done ? $object->nb_gen_done :
'0';
1608 print $langs->trans(
"DateLastGeneration");
1622 print
'<div class="clearboth"></div><br>';
1626 print
'<form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.(($action !=
'editline') ?
'#add' :
'#line_'.
GETPOST(
'lineid',
'int')).
'" method="POST">';
1627 print
'<input type="hidden" name="token" value="' .
newToken().
'">';
1628 print
'<input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">';
1629 print
'<input type="hidden" name="mode" value="">';
1630 print
'<input type="hidden" name="id" value="' . $object->id.
'">';
1631 print
'<input type="hidden" name="page_y" value="">';
1633 if (!empty($conf->use_javascript_ajax) && $object->statut == 0) {
1634 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
1637 print
'<div class="div-table-responsive-no-min">';
1638 print
'<table id="tablelines" class="noborder noshadow centpercent">';
1640 if (!empty($object->lines)) {
1641 $canchangeproduct = 1;
1642 $object->printObjectLines($action, $mysoc, $object->thirdparty, $lineid, 0);
1646 if ($object->statut == $object::STATUS_DRAFT && $user->hasRight(
'facture',
'creer') && $action !=
'valid' && $action !=
'editline') {
1647 if ($action !=
'editline') {
1650 $parameters = array();
1651 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
1652 if ($reshook < 0)
setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
1653 if (empty($reshook))
1654 $object->formAddObjectLine(0, $mysoc, $object->thirdparty);
1669 print
'<div class="tabsAction">';
1671 $parameters = array();
1672 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
1673 if (empty($reshook)) {
1676 'class' =>
'classfortooltip',
1679 if (empty($object->suspended)) {
1680 if ($user->hasRight(
'facture',
'creer')) {
1681 if (!empty($object->frequency) && $object->nb_gen_max > 0 && ($object->nb_gen_done >= $object->nb_gen_max)) {
1682 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="' .
dol_escape_htmltag($langs->trans(
"MaxGenerationReached")) .
'">' . $langs->trans(
"CreateBill") .
'</a></div>';
1684 if (empty($object->frequency) || $object->date_when <= $nowlasthour) {
1685 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>';
1687 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="' .
dol_escape_htmltag($langs->trans(
"DateIsNotEnough")) .
'">' . $langs->trans(
"CreateBill") .
'</a></div>';
1691 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#">' . $langs->trans(
"CreateBill") .
'</a></div>';
1695 if ($user->hasRight(
'facture',
'creer')) {
1696 if (empty($object->suspended)) {
1697 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>';
1699 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>';
1704 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"] .
'?id=' . $object->id .
'&action=delete&token=' .
newToken(),
'delete', $user->hasRight(
'facture',
'supprimer'));
1710 print
'<div class="fichecenter"><div class="fichehalfleft">';
1711 print
'<a name="builddoc"></a>';
1715 $linktoelem =
$form->showLinkToObjectBlock($object,
null, array(
'invoice'));
1717 $somethingshown =
$form->showLinkedObjectBlock($object, $linktoelem);
1721 print
'<div class="fichehalfright">';
1728 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
1730 $somethingshown =
$formactions->showactions($object, $object->element, (is_object($object->thirdparty) ? $object->thirdparty->id : 0), 1,
'', $MAXEVENT,
'', $morehtmlcenter);
if(GETPOST('button_removefilter_x', 'alpha')||GETPOST('button_removefilter.x', 'alpha')||GETPOST('button_removefilter', 'alpha')) if(GETPOST('button_search_x', 'alpha')||GETPOST('button_search.x', 'alpha')||GETPOST('button_search', 'alpha')) if($action=="save" &&empty($cancel)) $help_url
View.
if(preg_match('/set_([a-z0-9_\-]+)/i', $action, $reg)) if(preg_match('/del_([a-z0-9_\-]+)/i', $action, $reg)) if($action=='set') elseif($action=='specimen') elseif($action=='setmodel') elseif($action=='del') elseif($action=='setdoc') $formactions
View.
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
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=0, $outputlangs='', $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
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.
dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='rowid', $fieldref='ref', $morehtmlref='', $moreparam='', $nodbprefix=0, $morehtmlleft='', $morehtmlstatus='', $onlybanner=0, $morehtmlright='')
Show tab footer of a card.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
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_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
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_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
newToken()
Return the value of token currently saved into session with name 'newtoken'.
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.
get_default_npr(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that returns whether VAT must be recoverable collected VAT (e.g.
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.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='')
Show information for admin users or standard users.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
get_localtax($vatrate, $local, $thirdparty_buyer="", $thirdparty_seller="", $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $object=null, $include=null)
Return array of possible common substitutions.
isModEnabled($module)
Is Dolibarr module enabled.
img_edit($titlealt='default', $float=0, $other='')
Show logo editer/modifier fiche.
get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that return vat rate of a product line (according to seller, buyer and product vat rate) VAT...
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 informations.
$formconfirm
if ($action == 'delbookkeepingyear') {
div float
Buy price without taxes.
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.