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->rights->facture->creer;
109 $permissiondellink = $user->rights->facture->creer;
110 $permissiontoedit = $user->rights->facture->creer;
112 $usercanread = $user->rights->facture->lire;
113 $usercancreate = $user->rights->facture->creer;
114 $usercanissuepayment = $user->rights->facture->paiement;
115 $usercandelete = $user->rights->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->rights->margins->creer;
123 $usercanreadallmargin = $user->rights->margins->liretous;
124 $usercancreatewithdrarequest = $user->rights->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->rights->facture->creer) {
285 $result = $object->setPaymentTerms(
GETPOST(
'cond_reglement_id',
'int'));
286 } elseif ($action ==
'setmode' && $user->rights->facture->creer) {
288 $result = $object->setPaymentMethods(
GETPOST(
'mode_reglement_id',
'int'));
289 } elseif ($action ==
'classin' && $user->rights->facture->creer) {
291 $object->setProject(
GETPOST(
'projectid',
'int'));
292 } elseif ($action ==
'setref' && $user->rights->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->rights->facture->creer) {
311 $result = $object->setBankAccount(
GETPOST(
'fk_account',
'int'));
312 } elseif ($action ==
'setfrequency' && $user->rights->facture->creer) {
314 $object->setFrequencyAndUnit(
GETPOST(
'frequency',
'int'),
GETPOST(
'unit_frequency',
'alpha'));
315 } elseif ($action ==
'setdate_when' && $user->rights->facture->creer) {
319 $object->setNextDate($date);
321 } elseif ($action ==
'setnb_gen_max' && $user->rights->facture->creer) {
323 $object->setMaxPeriod(
GETPOST(
'nb_gen_max',
'int'));
324 } elseif ($action ==
'setauto_validate' && $user->rights->facture->creer) {
326 $object->setAutoValidate(
GETPOST(
'auto_validate',
'int'));
327 } elseif ($action ==
'setgenerate_pdf' && $user->rights->facture->creer) {
329 $object->setGeneratepdf(
GETPOST(
'generate_pdf',
'int'));
330 } elseif ($action ==
'setmodelpdf' && $user->rights->facture->creer) {
332 $object->setModelpdf(
GETPOST(
'modelpdf',
'alpha'));
333 } elseif ($action ==
'disable' && $user->rights->facture->creer) {
339 $res = $object->setValueFrom(
'suspended', 1);
350 } elseif ($action ==
'enable' && $user->rights->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->rights->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->rights->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');
442 $extralabelsline = $extrafields->fetch_name_optionals_label($object->table_element_line);
443 $array_options = $extrafields->getOptionalsFromPost($object->table_element_line, $predef);
445 if (is_array($extralabelsline)) {
447 foreach ($extralabelsline as $key => $value) {
448 unset($_POST[
"options_".$key.$predef]);
452 if ((empty($idprod) || $idprod < 0) && ($price_ht < 0) && ($qty < 0)) {
453 setEventMessages($langs->trans(
'ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv(
'UnitPriceHT'), $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
456 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
457 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Type')),
null,
'errors');
460 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && (!($price_ht >= 0) || $price_ht ==
'')) {
461 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
465 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
468 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($product_desc)) {
469 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Description')),
null,
'errors');
473 $langs->load(
"errors");
474 setEventMessages($langs->trans(
'ErrorQtyForCustomerInvoiceCantBeNegative'),
null,
'errors');
478 if (!$error && ($qty >= 0) && (!empty($product_desc) || (!empty($idprod) && $idprod > 0))) {
479 $ret = $object->fetch($id);
484 $ret = $object->fetch_thirdparty();
489 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
500 if (!empty($idprod) && $idprod > 0) {
502 $prod->fetch($idprod);
504 $label = ((
GETPOST(
'product_label') &&
GETPOST(
'product_label') != $prod->label) ?
GETPOST(
'product_label') :
'');
509 if (empty($tva_tx)) {
516 $datapriceofproduct = $prod->getSellPrice($mysoc, $object->thirdparty, $pqp);
518 $pu_ht = $datapriceofproduct[
'pu_ht'];
519 $pu_ttc = $datapriceofproduct[
'pu_ttc'];
520 $price_min = $datapriceofproduct[
'price_min'];
521 $price_base_type = $datapriceofproduct[
'price_base_type'];
522 $tva_tx = $datapriceofproduct[
'tva_tx'];
523 $tva_npr = $datapriceofproduct[
'tva_npr'];
525 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
526 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $prod->tva_tx));
529 if (!empty($price_ht)) {
531 $pu_ttc =
price2num($pu_ht * (1 + ($tmpvat / 100)),
'MU');
532 } elseif ($tmpvat != $tmpprodvat) {
535 if ($price_base_type !=
'HT') {
536 $pu_ht =
price2num($pu_ttc / (1 + ($tmpvat / 100)),
'MU');
538 $pu_ttc =
price2num($pu_ht * (1 + ($tmpvat / 100)),
'MU');
545 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && !empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) {
546 $outputlangs = $langs;
548 if (empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
549 $newlang =
GETPOST(
'lang_id',
'aZ09');
551 if (empty($newlang)) {
552 $newlang = $object->thirdparty->default_lang;
554 if (!empty($newlang)) {
556 $outputlangs->setDefaultLang($newlang);
559 $desc = (!empty($prod->multilangs [$outputlangs->defaultlang] [
"description"])) ? $prod->multilangs [$outputlangs->defaultlang] [
"description"] : $prod->description;
561 $desc = $prod->description;
567 if (empty($conf->global->MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE) && (!empty($prod->customcode) || !empty($prod->country_code))) {
570 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && !empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) {
571 $outputlangs = $langs;
573 if (empty($newlang) &&
GETPOST(
'lang_id',
'alpha')) {
574 $newlang =
GETPOST(
'lang_id',
'alpha');
576 if (empty($newlang)) {
577 $newlang = $object->thirdparty->default_lang;
579 if (!empty($newlang)) {
581 $outputlangs->setDefaultLang($newlang);
582 $outputlangs->load(
'products');
584 if (!empty($prod->customcode)) {
585 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
587 if (!empty($prod->customcode) && !empty($prod->country_code)) {
590 if (!empty($prod->country_code)) {
591 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code, 0, $db, $outputlangs, 0);
594 if (!empty($prod->customcode)) {
595 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
597 if (!empty($prod->customcode) && !empty($prod->country_code)) {
600 if (!empty($prod->country_code)) {
601 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code, 0, $db, $langs, 0);
609 $fk_unit = $prod->fk_unit;
613 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
614 $tva_tx = str_replace(
'*',
'', $tva_tx);
615 if (empty($tva_tx)) {
618 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
619 $desc = $product_desc;
621 $fk_unit =
GETPOST(
'units',
'alpha');
624 $date_start_fill =
GETPOST(
'date_start_fill',
'int');
625 $date_end_fill =
GETPOST(
'date_end_fill',
'int');
632 $localtax1_tx =
get_localtax($tva_tx, 1, $object->thirdparty, $mysoc, $tva_npr);
633 $localtax2_tx =
get_localtax($tva_tx, 2, $object->thirdparty, $mysoc, $tva_npr);
640 if ($usercanproductignorepricemin && (!empty($price_min) && (
price2num($pu_ht) * (1 -
price2num($remise_percent) / 100) <
price2num($price_min)))) {
641 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, - 1, $conf->currency));
645 $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);
666 $object->fetch($object->id);
668 unset($_POST[
'prod_entry_mode']);
670 unset($_POST[
'qty']);
671 unset($_POST[
'type']);
672 unset($_POST[
'remise_percent']);
673 unset($_POST[
'price_ht']);
674 unset($_POST[
'multicurrency_price_ht']);
675 unset($_POST[
'price_ttc']);
676 unset($_POST[
'tva_tx']);
677 unset($_POST[
'product_ref']);
678 unset($_POST[
'product_label']);
679 unset($_POST[
'product_desc']);
680 unset($_POST[
'fournprice']);
681 unset($_POST[
'buying_price']);
682 unset($_POST[
'np_marginRate']);
683 unset($_POST[
'np_markRate']);
684 unset($_POST[
'dp_desc']);
685 unset($_POST[
'idprod']);
686 unset($_POST[
'units']);
688 unset($_POST[
'date_starthour']);
689 unset($_POST[
'date_startmin']);
690 unset($_POST[
'date_startsec']);
691 unset($_POST[
'date_startday']);
692 unset($_POST[
'date_startmonth']);
693 unset($_POST[
'date_startyear']);
694 unset($_POST[
'date_endhour']);
695 unset($_POST[
'date_endmin']);
696 unset($_POST[
'date_endsec']);
697 unset($_POST[
'date_endday']);
698 unset($_POST[
'date_endmonth']);
699 unset($_POST[
'date_endyear']);
701 unset($_POST[
'date_start_fill']);
702 unset($_POST[
'date_end_fill']);
704 unset($_POST[
'situations']);
705 unset($_POST[
'progress']);
713 } elseif ($action ==
'updateline' && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
714 if (!$object->fetch($id) > 0) {
717 $object->fetch_thirdparty();
732 if (preg_match(
'/\*/', $vat_rate)) {
737 $vat_rate = str_replace(
'*',
'', $vat_rate);
738 $localtax1_rate =
get_localtax($vat_rate, 1, $object->thirdparty);
739 $localtax2_rate =
get_localtax($vat_rate, 2, $object->thirdparty);
746 $extralabelsline = $extrafields->fetch_name_optionals_label($object->table_element_line);
747 $array_options = $extrafields->getOptionalsFromPost($object->table_element_line);
750 if ($objectline->fetch(
GETPOST(
'lineid',
'int'))) {
751 $objectline->array_options = $array_options;
752 $result = $objectline->insertExtraFields();
758 $position = ($objectline->rang >= 0 ? $objectline->rang : 0);
761 if (is_array($extralabelsline)) {
763 foreach ($extralabelsline as $key => $value) {
764 unset($_POST[
"options_".$key]);
769 $special_code =
GETPOST(
'special_code',
'int');
770 if ($special_code == 3) {
789 $productid =
GETPOST(
'productid',
'int');
790 if (!empty($productid)) {
792 $product->fetch($productid);
794 $type = $product->type;
796 $price_min = $product->price_min;
797 if (!empty($conf->global->PRODUIT_MULTIPRICES) && !empty($object->thirdparty->price_level)) {
798 $price_min = $product->multiprices_min[$object->thirdparty->price_level];
807 setEventMessages($langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, - 1, $conf->currency)),
null,
'errors');
811 $type =
GETPOST(
'type',
'int');
812 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
815 if (
GETPOST(
'type',
'int') < 0) {
816 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
821 $langs->load(
"errors");
822 setEventMessages($langs->trans(
'ErrorQtyForCustomerInvoiceCantBeNegative'),
null,
'errors');
826 $date_start_fill =
GETPOST(
'date_start_fill',
'int');
827 $date_end_fill =
GETPOST(
'date_end_fill',
'int');
831 $result = $object->updateline(
876 $object->fetch($object->id);
878 unset($_POST[
'qty']);
879 unset($_POST[
'type']);
880 unset($_POST[
'productid']);
881 unset($_POST[
'remise_percent']);
882 unset($_POST[
'price_ht']);
883 unset($_POST[
'multicurrency_price_ht']);
884 unset($_POST[
'price_ttc']);
885 unset($_POST[
'tva_tx']);
886 unset($_POST[
'product_ref']);
887 unset($_POST[
'product_label']);
888 unset($_POST[
'product_desc']);
889 unset($_POST[
'fournprice']);
890 unset($_POST[
'buying_price']);
891 unset($_POST[
'np_marginRate']);
892 unset($_POST[
'np_markRate']);
894 unset($_POST[
'dp_desc']);
895 unset($_POST[
'idprod']);
896 unset($_POST[
'units']);
898 unset($_POST[
'date_starthour']);
899 unset($_POST[
'date_startmin']);
900 unset($_POST[
'date_startsec']);
901 unset($_POST[
'date_startday']);
902 unset($_POST[
'date_startmonth']);
903 unset($_POST[
'date_startyear']);
904 unset($_POST[
'date_endhour']);
905 unset($_POST[
'date_endmin']);
906 unset($_POST[
'date_endsec']);
907 unset($_POST[
'date_endday']);
908 unset($_POST[
'date_endmonth']);
909 unset($_POST[
'date_endyear']);
911 unset($_POST[
'situations']);
912 unset($_POST[
'progress']);
933 $companystatic =
new Societe($db);
943 if ($action ==
'create') {
944 print
load_fiche_titre($langs->trans(
"CreateRepeatableInvoice"),
'',
'bill');
947 $product_static =
new Product($db);
949 if ($object->fetch($id, $ref) > 0) {
950 $result = $object->getLinesArray();
952 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
953 print
'<input type="hidden" name="token" value="'.newToken().
'">';
954 print
'<input type="hidden" name="action" value="add">';
955 print
'<input type="hidden" name="facid" value="'.$object->id.
'">';
963 if ($object->fk_account > 0) {
967 print
'<table class="border centpercent">';
969 $object->fetch_thirdparty();
972 print
'<tr><td class="titlefieldcreate fieldrequired">'.$langs->trans(
"Title").
'</td><td>';
973 print
'<input class="flat quatrevingtpercent" type="text" name="title" value="'.dol_escape_htmltag(
GETPOST(
"title",
'alphanohtml')).
'" autofocus>';
977 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Customer").
'</td><td>'.$object->thirdparty->getNomUrl(1,
'customer').
'</td>';
980 $note_public =
GETPOSTISSET(
'note_public') ?
GETPOST(
'note_public',
'restricthtml') : $object->note_public;
981 $note_private =
GETPOSTISSET(
'note_private') ?
GETPOST(
'note_private',
'restricthtml') : $object->note_private;
986 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH__'] = $langs->trans(
"PreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, -1,
'm'),
'%m').
')';
987 $substitutionarray[
'__INVOICE_MONTH__'] = $langs->trans(
"MonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($object->date,
'%m').
')';
988 $substitutionarray[
'__INVOICE_NEXT_MONTH__'] = $langs->trans(
"NextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, 1,
'm'),
'%m').
')';
989 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH_TEXT__'] = $langs->trans(
"TextPreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, -1,
'm'),
'%B').
')';
990 $substitutionarray[
'__INVOICE_MONTH_TEXT__'] = $langs->trans(
"TextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($object->date,
'%B').
')';
991 $substitutionarray[
'__INVOICE_NEXT_MONTH_TEXT__'] = $langs->trans(
"TextNextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, 1,
'm'),
'%B').
')';
992 $substitutionarray[
'__INVOICE_PREVIOUS_YEAR__'] = $langs->trans(
"PreviousYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, -1,
'y'),
'%Y').
')';
993 $substitutionarray[
'__INVOICE_YEAR__'] = $langs->trans(
"YearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($object->date,
'%Y').
')';
994 $substitutionarray[
'__INVOICE_NEXT_YEAR__'] = $langs->trans(
"NextYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, 1,
'y'),
'%Y').
')';
996 $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').
')';
997 $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').
')';
998 $substitutionarray[
'__INVOICE_COUNTER_CURRENT__'] = $langs->trans(
"Count");
999 $substitutionarray[
'__INVOICE_COUNTER_MAX__'] = $langs->trans(
"MaxPeriodNumber");
1001 $htmltext =
'<i>'.$langs->trans(
"FollowingConstantsWillBeSubstituted").
':<br>';
1002 foreach ($substitutionarray as $key => $val) {
1003 $htmltext .= $key.
' = '.$langs->trans($val).
'<br>';
1005 $htmltext .=
'</i>';
1009 print
'<td class="tdtop">';
1010 print
$form->textwithpicto($langs->trans(
'NotePublic'), $htmltext, 1,
'help',
'', 0, 2,
'notepublic');
1013 $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%');
1014 print $doleditor->Create(1);
1017 if (empty($user->socid)) {
1019 print
'<td class="tdtop">';
1020 print
$form->textwithpicto($langs->trans(
'NotePrivate'), $htmltext, 1,
'help',
'', 0, 2,
'noteprivate');
1023 $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%');
1024 print $doleditor->Create(1);
1030 print
"<tr><td>".$langs->trans(
"Author").
"</td><td>".$user->getFullName($langs).
"</td></tr>";
1033 print
"<tr><td>".$langs->trans(
"PaymentConditions").
"</td><td>";
1034 print
$form->getSelectConditionsPaiements(
GETPOSTISSET(
'cond_reglement_id') ?
GETPOST(
'cond_reglement_id',
'int') : $object->cond_reglement_id,
'cond_reglement_id', -1, 0, 0,
'');
1039 print
"<tr><td>".$langs->trans(
"PaymentMode").
"</td><td>";
1040 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
1041 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);
1046 if ($object->fk_account > 0) {
1047 print
"<tr><td>".$langs->trans(
'BankAccount').
"</td><td>";
1048 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->fk_account,
'none');
1053 if (
isModEnabled(
'project') && is_object($object->thirdparty) && $object->thirdparty->id > 0) {
1054 $projectid =
GETPOST(
'projectid') ?
GETPOST(
'projectid') : $object->fk_project;
1055 $langs->load(
'projects');
1056 print
'<tr><td>'.$langs->trans(
'Project').
'</td><td>';
1057 print
img_picto(
'',
'project',
'class="pictofixedwidth"');
1058 $numprojet = $formproject->select_projects($object->thirdparty->id, $projectid,
'projectid', 0, 0, 1, 0, 0, 0, 0,
'', 0, 0,
'');
1059 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>';
1064 print
"<tr><td>".$langs->trans(
'Model').
"</td><td>";
1065 include_once DOL_DOCUMENT_ROOT.
'/core/modules/facture/modules_facture.php';
1067 print
img_picto(
'',
'generic',
'class="pictofixedwidth"');
1068 print
$form->selectarray(
'modelpdf', $list, $conf->global->FACTURE_ADDON_PDF);
1077 $title = $langs->trans(
"Recurrence");
1082 print
'<table class="border centpercent">';
1085 print
'<tr><td class="titlefieldcreate">'.$form->textwithpicto($langs->trans(
"Frequency"), $langs->transnoentitiesnoconv(
'toolTipFrequency')).
"</td><td>";
1086 print
"<input type='text' name='frequency' value='".GETPOST(
'frequency',
'int').
"' size='4' /> ";
1087 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'));
1091 print
"<tr><td>".$langs->trans(
'NextDateToExecution').
"</td><td>";
1093 print
$form->selectDate($date_next_execution,
'', 1, 1,
'',
"add", 1, 1);
1097 print
"<tr><td>".$langs->trans(
"MaxPeriodNumber").
"</td><td>";
1098 print
'<input type="text" name="nb_gen_max" value="'.GETPOST(
'nb_gen_max').
'" size="5" />';
1102 print
"<tr><td>".$langs->trans(
"StatusOfGeneratedInvoices").
"</td><td>";
1103 $select = array(
'0'=>$langs->trans(
'BillStatusDraft'),
'1'=>$langs->trans(
'BillStatusValidated'));
1104 print
$form->selectarray(
'auto_validate', $select,
GETPOST(
'auto_validate'));
1108 if (!empty($conf->global->INVOICE_REC_CAN_DISABLE_DOCUMENT_FILE_GENERATION)) {
1109 print
"<tr><td>".$langs->trans(
"StatusOfGeneratedDocuments").
"</td><td>";
1110 $select = array(
'0'=>$langs->trans(
'DoNotGenerateDoc'),
'1'=>$langs->trans(
'AutoGenerateDoc'));
1111 print
$form->selectarray(
'generate_pdf', $select,
GETPOST(
'generate_pdf'));
1114 print
'<input type="hidden" name="generate_pdf" value="1">';
1122 $title = $langs->trans(
"ProductsAndServices");
1124 $title = $langs->trans(
"Products");
1126 $title = $langs->trans(
"Services");
1134 print
'<div class="div-table-responsive-no-min">';
1135 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
1137 if (!empty($object->lines)) {
1141 $object->printObjectLines(
'', $mysoc, $object->thirdparty, $lineid, 0);
1149 if ($flag_price_may_change) {
1150 print
'<tr><td colspan="3" class="left">';
1151 print
'<select name="usenewprice" class="flat">';
1152 print
'<option value="0">'.$langs->trans(
"AlwaysUseFixedPrice").
'</option>';
1153 print
'<option value="1" disabled>'.$langs->trans(
"AlwaysUseNewPrice").
'</option>';
1159 print
$form->buttonsSaveCancel(
"Create");
1169 if ($object->id > 0) {
1170 $object->fetch_thirdparty();
1173 if ($action ==
'ask_deleteline') {
1174 $formconfirm =
$form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'',
'no', 1);
1178 if ($action ==
'delete') {
1179 $formconfirm =
$form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'DeleteRepeatableInvoice'), $langs->trans(
'ConfirmDeleteRepeatableInvoice'),
'confirm_delete',
'',
'no', 1);
1184 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1185 if (empty($reshook)) {
1187 } elseif ($reshook > 0) {
1193 $author =
new User($db);
1194 $author->fetch($object->user_author);
1198 print
dol_get_fiche_head($head,
'card', $langs->trans(
"RepeatableInvoice"), -1,
'bill');
1202 $linkback =
'<a href="'.DOL_URL_ROOT.
'/compta/facture/invoicetemplate_list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1205 if ($action !=
'editref') {
1206 $morehtmlref .=
$form->editfieldkey($object->ref,
'ref', $object->ref, $object, $user->rights->facture->creer,
'',
'', 0, 2);
1208 $morehtmlref .=
$form->editfieldval(
'',
'ref', $object->ref, $object, $user->rights->facture->creer,
'string');
1211 $morehtmlref .=
'<div class="refidno">';
1216 $morehtmlref .= $langs->trans(
'ThirdParty').
' : '.$object->thirdparty->getNomUrl(1);
1219 $langs->load(
"projects");
1220 $morehtmlref .=
'<br>'.$langs->trans(
'Project').
' ';
1221 if ($user->rights->facture->creer) {
1222 if ($action !=
'classify') {
1223 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> : ';
1225 if ($action ==
'classify') {
1227 $morehtmlref .=
'<form method="post" action="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'">';
1228 $morehtmlref .=
'<input type="hidden" name="action" value="classin">';
1229 $morehtmlref .=
'<input type="hidden" name="token" value="'.newToken().
'">';
1230 $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project,
'projectid', $maxlength, 0, 1, 0, 1, 0, 0,
'', 1);
1231 $morehtmlref .=
'<input type="submit" class="button valignmiddle" value="'.$langs->trans(
"Modify").
'">';
1232 $morehtmlref .=
'</form>';
1234 $morehtmlref .=
$form->form_project($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->socid, $object->fk_project,
'none', 0, 0, 0, 1);
1237 if (!empty($object->fk_project)) {
1239 $proj->fetch($object->fk_project);
1240 $morehtmlref .=
' : '.$proj->getNomUrl(1);
1242 $morehtmlref .=
' - '.$proj->title;
1249 $morehtmlref .=
'</div>';
1251 $morehtmlright =
'';
1253 dol_banner_tab($object,
'ref', $linkback, 1,
'title',
'none', $morehtmlref,
'', 0,
'', $morehtmlright);
1255 print
'<div class="fichecenter">';
1256 print
'<div class="fichehalfleft">';
1257 print
'<div class="underbanner clearboth"></div>';
1259 print
'<table class="border centpercent tableforfield">';
1261 print
'<tr><td class="titlefield">'.$langs->trans(
"Author").
'</td><td>';
1262 print $author->getNomUrl(-1);
1265 print
'<tr><td>'.$langs->trans(
"AmountHT").
'</td>';
1266 print
'<td>'.price($object->total_ht,
'', $langs, 1, -1, -1, $conf->currency).
'</td>';
1269 print
'<tr><td>'.$langs->trans(
"AmountVAT").
'</td><td>'.
price($object->total_tva,
'', $langs, 1, -1, -1, $conf->currency).
'</td>';
1273 if (($mysoc->localtax1_assuj ==
"1" && $mysoc->useLocalTax(1)) || $object->total_localtax1 != 0) {
1274 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td>';
1275 print
'<td class="nowrap">'.price($object->total_localtax1, 1,
'', 1, - 1, - 1, $conf->currency).
'</td></tr>';
1277 if (($mysoc->localtax2_assuj ==
"1" && $mysoc->useLocalTax(2)) || $object->total_localtax2 != 0) {
1278 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td>';
1279 print
'<td class=nowrap">'.price($object->total_localtax2, 1,
'', 1, - 1, - 1, $conf->currency).
'</td></tr>';
1282 print
'<tr><td>'.$langs->trans(
"AmountTTC").
'</td><td colspan="3">'.
price($object->total_ttc,
'', $langs, 1, -1, -1, $conf->currency).
'</td>';
1288 print
'<table class="nobordernopadding centpercent"><tr><td>';
1289 print $langs->trans(
'PaymentConditionsShort');
1291 if ($action !=
'editconditions' && $user->rights->facture->creer) {
1292 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>';
1294 print
'</tr></table>';
1297 if ($action ==
'editconditions') {
1298 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->cond_reglement_id,
'cond_reglement_id');
1300 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->cond_reglement_id,
'none');
1309 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1310 print $langs->trans(
'PaymentMode');
1312 if ($action !=
'editmode' && $user->rights->facture->creer) {
1313 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>';
1315 print
'</tr></table>';
1317 if ($action ==
'editmode') {
1318 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
1320 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->mode_reglement_id,
'none');
1329 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1330 print
$form->editfieldkey(
'Currency',
'multicurrency_code',
'', $object, 0);
1332 if ($usercancreate && $action !=
'editmulticurrencycode' && !empty($object->brouillon)) {
1333 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>';
1335 print
'</tr></table>';
1337 $htmlname = (($usercancreate && $action ==
'editmulticurrencycode') ?
'multicurrency_code' :
'none');
1338 $form->form_multicurrency_code($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->multicurrency_code, $htmlname);
1342 if ($object->multicurrency_code != $conf->currency || $object->multicurrency_tx != 1) {
1345 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1346 print
$form->editfieldkey(
'CurrencyRate',
'multicurrency_tx',
'', $object, 0);
1348 if ($usercancreate && $action !=
'editmulticurrencyrate' && !empty($object->brouillon) && $object->multicurrency_code && $object->multicurrency_code != $conf->currency) {
1349 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>';
1351 print
'</tr></table>';
1353 if ($action ==
'editmulticurrencyrate' || $action ==
'actualizemulticurrencyrate') {
1354 if ($action ==
'actualizemulticurrencyrate') {
1357 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->multicurrency_tx, ($usercancreate ?
'multicurrency_tx' :
'none'), $object->multicurrency_code);
1359 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->multicurrency_tx,
'none', $object->multicurrency_code);
1360 if ($object->statut == $object::STATUS_DRAFT && $object->multicurrency_code && $object->multicurrency_code != $conf->currency) {
1361 print
'<div class="inline-block"> ';
1362 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=actualizemulticurrencyrate">'.$langs->trans(
"ActualizeCurrency").
'</a>';
1372 if (!empty($object->frequency) && !empty($object->date_when)) {
1373 $dateexample = $object->date_when;
1379 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH__'] = $langs->trans(
"PreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'm'),
'%m').
')';
1380 $substitutionarray[
'__INVOICE_MONTH__'] = $langs->trans(
"MonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($dateexample,
'%m').
')';
1381 $substitutionarray[
'__INVOICE_NEXT_MONTH__'] = $langs->trans(
"NextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'm'),
'%m').
')';
1382 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH_TEXT__'] = $langs->trans(
"TextPreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'm'),
'%B').
')';
1383 $substitutionarray[
'__INVOICE_MONTH_TEXT__'] = $langs->trans(
"TextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($dateexample,
'%B').
')';
1384 $substitutionarray[
'__INVOICE_NEXT_MONTH_TEXT__'] = $langs->trans(
"TextNextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'm'),
'%B').
')';
1385 $substitutionarray[
'__INVOICE_PREVIOUS_YEAR__'] = $langs->trans(
"PreviousYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'y'),
'%Y').
')';
1386 $substitutionarray[
'__INVOICE_YEAR__'] = $langs->trans(
"YearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($dateexample,
'%Y').
')';
1387 $substitutionarray[
'__INVOICE_NEXT_YEAR__'] = $langs->trans(
"NextYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'y'),
'%Y').
')';
1389 $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').
')';
1390 $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').
')';
1391 $substitutionarray[
'__INVOICE_COUNTER_CURRENT__'] = $object->nb_gen_done;
1392 $substitutionarray[
'__INVOICE_COUNTER_MAX__'] = $object->nb_gen_max;
1394 $htmltext =
'<i>'.$langs->trans(
"FollowingConstantsWillBeSubstituted").
':<br>';
1395 foreach ($substitutionarray as $key => $val) {
1396 $htmltext .= $key.
' = '.$langs->trans($val).
'<br>';
1398 $htmltext .=
'</i>';
1402 print
$form->editfieldkey(
$form->textwithpicto($langs->trans(
'NotePublic'), $htmltext, 1,
'help',
'', 0, 2,
'notepublic'),
'note_public', $object->note_public, $object, $user->rights->facture->creer);
1403 print
'</td><td class="wordbreak">';
1404 print
$form->editfieldval($langs->trans(
"NotePublic"),
'note_public', $object->note_public, $object, $user->rights->facture->creer,
'textarea:'.ROWS_4.
':90%',
'',
null,
null,
'', 1);
1410 print
$form->editfieldkey(
$form->textwithpicto($langs->trans(
"NotePrivate"), $htmltext, 1,
'help',
'', 0, 2,
'noteprivate'),
'note_private', $object->note_private, $object, $user->rights->facture->creer);
1411 print
'</td><td class="wordbreak">';
1412 print
$form->editfieldval($langs->trans(
"NotePrivate"),
'note_private', $object->note_private, $object, $user->rights->facture->creer,
'textarea:'.ROWS_4.
':90%',
'',
null,
null,
'', 1);
1417 print
'<tr><td class="nowrap">';
1418 print
'<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
1419 print $langs->trans(
'BankAccount');
1421 if (($action !=
'editbankaccount') && $user->rights->facture->creer && $object->statut ==
FactureRec::STATUS_DRAFT) {
1422 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>';
1424 print
'</tr></table>';
1426 if ($action ==
'editbankaccount') {
1427 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->fk_account,
'fk_account', 1);
1429 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->fk_account,
'none');
1435 print
'<tr><td class="nowrap">';
1436 print
'<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
1437 print $langs->trans(
'Model');
1440 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>';
1442 print
'</tr></table>';
1444 if ($action ==
'editmodelpdf') {
1445 include_once DOL_DOCUMENT_ROOT.
'/core/modules/facture/modules_facture.php';
1448 foreach ($models as $k => $model) {
1449 $list[] = str_replace(
':',
'|', $k).
':'.$model;
1451 $select =
'select;'.implode(
',', $list);
1452 print
$form->editfieldval($langs->trans(
"Model"),
'modelpdf', $object->model_pdf, $object, $user->rights->facture->creer, $select);
1454 print $object->model_pdf;
1461 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1466 print
'<div class="fichehalfright">';
1467 print
'<div class="underbanner clearboth"></div>';
1473 $title = $langs->trans(
"Recurrence");
1476 print
'<table class="border centpercent tableforfield">';
1478 print
'<tr><td colspan="2">'.img_picto(
'',
'recurring',
'class="pictofixedwidth"').$title.
'</td></tr>';
1481 print
'<tr><td style="width: 50%">';
1482 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1483 print $langs->trans(
'Frequency');
1485 if ($action !=
'editfrequency' && $user->rights->facture->creer) {
1486 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>';
1488 print
'</tr></table>';
1490 if ($action ==
'editfrequency') {
1491 print
'<form method="post" action="'.$_SERVER[
"PHP_SELF"].
'?facid='.$object->id.
'">';
1492 print
'<input type="hidden" name="action" value="setfrequency">';
1493 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1494 print
'<table class="nobordernopadding">';
1496 print
"<input type='text' name='frequency' value='".$object->frequency.
"' size='5' /> ";
1497 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'));
1499 print
'<td class="left"><input type="submit" class="button button-edit smallpaddingimp" value="'.$langs->trans(
"Modify").
'"></td>';
1500 print
'</tr></table></form>';
1502 if ($object->frequency > 0) {
1503 print $langs->trans(
'FrequencyPer_'.$object->unit_frequency, $object->frequency);
1505 print
'<span class="opacitymedium">'.$langs->trans(
"NotARecurringInvoiceTemplate").
'</span>';
1512 if ($action ==
'date_when' || $object->frequency > 0) {
1513 print
$form->editfieldkey($langs->trans(
"NextDateToExecution"),
'date_when', $object->date_when, $object, $user->rights->facture->creer,
'day');
1515 print $langs->trans(
"NextDateToExecution");
1518 if ($action ==
'date_when' || $object->frequency > 0) {
1519 print
$form->editfieldval($langs->trans(
"NextDateToExecution"),
'date_when', $object->date_when, $object, $user->rights->facture->creer,
'day', $object->date_when,
null,
'',
'', 0,
'strikeIfMaxNbGenReached');
1522 if (!$object->isMaxNbGenReached()) {
1523 if (!$object->suspended && $action !=
'editdate_when' && $object->frequency > 0 && $object->date_when && $object->date_when < $now) {
1527 print
img_info($langs->trans(
"MaxNumberOfGenerationReached"));
1534 if ($action ==
'nb_gen_max' || $object->frequency > 0) {
1535 print
$form->editfieldkey($langs->trans(
"MaxPeriodNumber"),
'nb_gen_max', $object->nb_gen_max, $object, $user->rights->facture->creer);
1537 print $langs->trans(
"MaxPeriodNumber");
1540 if ($action ==
'nb_gen_max' || $object->frequency > 0) {
1541 print
$form->editfieldval($langs->trans(
"MaxPeriodNumber"),
'nb_gen_max', $object->nb_gen_max ? $object->nb_gen_max :
'', $object, $user->rights->facture->creer);
1550 if ($action ==
'auto_validate' || $object->frequency > 0) {
1551 print
$form->editfieldkey($langs->trans(
"StatusOfGeneratedInvoices"),
'auto_validate', $object->auto_validate, $object, $user->rights->facture->creer);
1553 print $langs->trans(
"StatusOfGeneratedInvoices");
1556 $select =
'select;0:'.$langs->trans(
'BillStatusDraft').
',1:'.$langs->trans(
'BillStatusValidated');
1557 if ($action ==
'auto_validate' || $object->frequency > 0) {
1558 print
$form->editfieldval($langs->trans(
"StatusOfGeneratedInvoices"),
'auto_validate', $object->auto_validate, $object, $user->rights->facture->creer, $select);
1562 if (!empty($conf->global->INVOICE_REC_CAN_DISABLE_DOCUMENT_FILE_GENERATION)) {
1565 if ($action ==
'generate_pdf' || $object->frequency > 0) {
1566 print
$form->editfieldkey($langs->trans(
"StatusOfGeneratedDocuments"),
'generate_pdf', $object->generate_pdf, $object, $user->rights->facture->creer);
1568 print $langs->trans(
"StatusOfGeneratedDocuments");
1572 $select =
'select;0:'.$langs->trans(
'DoNotGenerateDoc').
',1:'.$langs->trans(
'AutogenerateDoc');
1573 if ($action ==
'generate_pdf' || $object->frequency > 0) {
1574 print
$form->editfieldval($langs->trans(
"StatusOfGeneratedDocuments"),
'generate_pdf', $object->generate_pdf, $object, $user->rights->facture->creer, $select);
1579 print
'<input type="hidden" name="generate_pdf" value="1">';
1585 if ($object->frequency > 0) {
1589 print
info_admin($langs->trans(
"EnableAndSetupModuleCron", $langs->transnoentitiesnoconv(
"Module2300Name")));
1592 print
'<div class="underbanner clearboth"></div>';
1593 print
'<table class="border centpercent tableforfield">';
1596 print
'<tr><td style="width: 50%">'.$langs->trans(
"NbOfGenerationDone").
'</td>';
1598 print $object->nb_gen_done ? $object->nb_gen_done :
'0';
1604 print $langs->trans(
"DateLastGeneration");
1618 print
'<div class="clearboth"></div><br>';
1622 print
'<form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.(($action !=
'editline') ?
'#add' :
'#line_'.
GETPOST(
'lineid',
'int')).
'" method="POST">';
1623 print
'<input type="hidden" name="token" value="' .
newToken().
'">';
1624 print
'<input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">';
1625 print
'<input type="hidden" name="mode" value="">';
1626 print
'<input type="hidden" name="id" value="' . $object->id.
'">';
1627 print
'<input type="hidden" name="page_y" value="">';
1629 if (!empty($conf->use_javascript_ajax) && $object->statut == 0) {
1630 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
1633 print
'<div class="div-table-responsive-no-min">';
1634 print
'<table id="tablelines" class="noborder noshadow centpercent">';
1636 if (!empty($object->lines)) {
1637 $canchangeproduct = 1;
1638 $object->printObjectLines($action, $mysoc, $object->thirdparty, $lineid, 0);
1642 if ($object->statut == $object::STATUS_DRAFT && $user->rights->facture->creer && $action !=
'valid' && $action !=
'editline') {
1643 if ($action !=
'editline') {
1646 $parameters = array();
1647 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
1648 if ($reshook < 0)
setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
1649 if (empty($reshook))
1650 $object->formAddObjectLine(0, $mysoc, $object->thirdparty);
1665 print
'<div class="tabsAction">';
1667 $parameters = array();
1668 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
1669 if (empty($reshook)) {
1672 'class' =>
'classfortooltip',
1675 if (empty($object->suspended)) {
1676 if ($user->rights->facture->creer) {
1677 if (!empty($object->frequency) && $object->nb_gen_max > 0 && ($object->nb_gen_done >= $object->nb_gen_max)) {
1678 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="' .
dol_escape_htmltag($langs->trans(
"MaxGenerationReached")) .
'">' . $langs->trans(
"CreateBill") .
'</a></div>';
1680 if (empty($object->frequency) || $object->date_when <= $nowlasthour) {
1681 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>';
1683 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="' .
dol_escape_htmltag($langs->trans(
"DateIsNotEnough")) .
'">' . $langs->trans(
"CreateBill") .
'</a></div>';
1687 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#">' . $langs->trans(
"CreateBill") .
'</a></div>';
1691 if ($user->rights->facture->creer) {
1692 if (empty($object->suspended)) {
1693 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>';
1695 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>';
1700 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"] .
'?id=' . $object->id .
'&action=delete&token=' .
newToken(),
'delete', $user->rights->facture->supprimer);
1706 print
'<div class="fichecenter"><div class="fichehalfleft">';
1707 print
'<a name="builddoc"></a>';
1711 $linktoelem =
$form->showLinkToObjectBlock($object,
null, array(
'invoice'));
1713 $somethingshown =
$form->showLinkedObjectBlock($object, $linktoelem);
1717 print
'<div class="fichehalfright">';
1724 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
1726 $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.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='')
Show tabs of a record.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0)
Returns text escaped for inclusion in HTML alt or title tags, or into values of HTML input fields.
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.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='')
Set event messages in dol_events session object.
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)
Fonction qui renvoie si tva doit etre tva percue recuperable.
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.
get_localtax($vatrate, $local, $thirdparty_buyer="", $thirdparty_seller="", $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $object=null)
Return array of possible common substitutions.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
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.
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.