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->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_deleteinvoice' && $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');
440 if (empty($remise_percent)) {
445 $extralabelsline = $extrafields->fetch_name_optionals_label($object->table_element_line);
446 $array_options = $extrafields->getOptionalsFromPost($object->table_element_line, $predef);
448 if (is_array($extralabelsline)) {
450 foreach ($extralabelsline as $key => $value) {
451 unset($_POST[
"options_".$key.$predef]);
455 if ((empty($idprod) || $idprod < 0) && ($price_ht < 0) && ($qty < 0)) {
456 setEventMessages($langs->trans(
'ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv(
'UnitPriceHT'), $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
459 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
460 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Type')),
null,
'errors');
463 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && (!($price_ht >= 0) || $price_ht ==
'')) {
464 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
468 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
471 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($product_desc)) {
472 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Description')),
null,
'errors');
476 $langs->load(
"errors");
477 setEventMessages($langs->trans(
'ErrorQtyForCustomerInvoiceCantBeNegative'),
null,
'errors');
481 if (!$error && ($qty >= 0) && (!empty($product_desc) || (!empty($idprod) && $idprod > 0))) {
482 $ret = $object->fetch($id);
487 $ret = $object->fetch_thirdparty();
492 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
503 if (!empty($idprod) && $idprod > 0) {
505 $prod->fetch($idprod);
507 $label = ((
GETPOST(
'product_label') &&
GETPOST(
'product_label') != $prod->label) ?
GETPOST(
'product_label') :
'');
512 if (empty($tva_tx)) {
519 $datapriceofproduct = $prod->getSellPrice($mysoc, $object->thirdparty, $pqp);
521 $pu_ht = $datapriceofproduct[
'pu_ht'];
522 $pu_ttc = $datapriceofproduct[
'pu_ttc'];
523 $price_min = $datapriceofproduct[
'price_min'];
524 $price_base_type = empty($datapriceofproduct[
'price_base_type']) ?
'HT' : $datapriceofproduct[
'price_base_type'];
525 $tva_tx = $datapriceofproduct[
'tva_tx'];
526 $tva_npr = $datapriceofproduct[
'tva_npr'];
528 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
529 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $prod->tva_tx));
532 if (!empty($price_ht)) {
534 $pu_ttc =
price2num($pu_ht * (1 + ($tmpvat / 100)),
'MU');
535 } elseif ($tmpvat != $tmpprodvat) {
538 if ($price_base_type !=
'HT') {
539 $pu_ht =
price2num($pu_ttc / (1 + ($tmpvat / 100)),
'MU');
541 $pu_ttc =
price2num($pu_ht * (1 + ($tmpvat / 100)),
'MU');
548 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && !empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) {
549 $outputlangs = $langs;
551 if (empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
552 $newlang =
GETPOST(
'lang_id',
'aZ09');
554 if (empty($newlang)) {
555 $newlang = $object->thirdparty->default_lang;
557 if (!empty($newlang)) {
559 $outputlangs->setDefaultLang($newlang);
562 $desc = (!empty($prod->multilangs [$outputlangs->defaultlang] [
"description"])) ? $prod->multilangs [$outputlangs->defaultlang] [
"description"] : $prod->description;
564 $desc = $prod->description;
570 if (empty($conf->global->MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE) && (!empty($prod->customcode) || !empty($prod->country_code))) {
573 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && !empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) {
574 $outputlangs = $langs;
576 if (empty($newlang) &&
GETPOST(
'lang_id',
'alpha')) {
577 $newlang =
GETPOST(
'lang_id',
'alpha');
579 if (empty($newlang)) {
580 $newlang = $object->thirdparty->default_lang;
582 if (!empty($newlang)) {
584 $outputlangs->setDefaultLang($newlang);
585 $outputlangs->load(
'products');
587 if (!empty($prod->customcode)) {
588 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
590 if (!empty($prod->customcode) && !empty($prod->country_code)) {
593 if (!empty($prod->country_code)) {
594 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code, 0, $db, $outputlangs, 0);
597 if (!empty($prod->customcode)) {
598 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
600 if (!empty($prod->customcode) && !empty($prod->country_code)) {
603 if (!empty($prod->country_code)) {
604 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code, 0, $db, $langs, 0);
612 $fk_unit = $prod->fk_unit;
616 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
617 $tva_tx = str_replace(
'*',
'', $tva_tx);
618 if (empty($tva_tx)) {
621 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
622 $desc = $product_desc;
624 $fk_unit =
GETPOST(
'units',
'alpha');
627 $date_start_fill =
GETPOST(
'date_start_fill',
'int');
628 $date_end_fill =
GETPOST(
'date_end_fill',
'int');
635 $localtax1_tx =
get_localtax($tva_tx, 1, $object->thirdparty, $mysoc, $tva_npr);
636 $localtax2_tx =
get_localtax($tva_tx, 2, $object->thirdparty, $mysoc, $tva_npr);
643 if ($usercanproductignorepricemin && (!empty($price_min) && (
price2num($pu_ht) * (1 -
price2num($remise_percent) / 100) <
price2num($price_min)))) {
644 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, - 1, $conf->currency));
648 $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);
669 $object->fetch($object->id);
671 unset($_POST[
'prod_entry_mode']);
673 unset($_POST[
'qty']);
674 unset($_POST[
'type']);
675 unset($_POST[
'remise_percent']);
676 unset($_POST[
'price_ht']);
677 unset($_POST[
'multicurrency_price_ht']);
678 unset($_POST[
'price_ttc']);
679 unset($_POST[
'tva_tx']);
680 unset($_POST[
'product_ref']);
681 unset($_POST[
'product_label']);
682 unset($_POST[
'product_desc']);
683 unset($_POST[
'fournprice']);
684 unset($_POST[
'buying_price']);
685 unset($_POST[
'np_marginRate']);
686 unset($_POST[
'np_markRate']);
687 unset($_POST[
'dp_desc']);
688 unset($_POST[
'idprod']);
689 unset($_POST[
'units']);
691 unset($_POST[
'date_starthour']);
692 unset($_POST[
'date_startmin']);
693 unset($_POST[
'date_startsec']);
694 unset($_POST[
'date_startday']);
695 unset($_POST[
'date_startmonth']);
696 unset($_POST[
'date_startyear']);
697 unset($_POST[
'date_endhour']);
698 unset($_POST[
'date_endmin']);
699 unset($_POST[
'date_endsec']);
700 unset($_POST[
'date_endday']);
701 unset($_POST[
'date_endmonth']);
702 unset($_POST[
'date_endyear']);
704 unset($_POST[
'date_start_fill']);
705 unset($_POST[
'date_end_fill']);
707 unset($_POST[
'situations']);
708 unset($_POST[
'progress']);
716 } elseif ($action ==
'updateline' && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
717 if (!$object->fetch($id) > 0) {
720 $object->fetch_thirdparty();
735 if (preg_match(
'/\*/', $vat_rate)) {
740 $vat_rate = str_replace(
'*',
'', $vat_rate);
741 $localtax1_rate =
get_localtax($vat_rate, 1, $object->thirdparty);
742 $localtax2_rate =
get_localtax($vat_rate, 2, $object->thirdparty);
749 $extralabelsline = $extrafields->fetch_name_optionals_label($object->table_element_line);
750 $array_options = $extrafields->getOptionalsFromPost($object->table_element_line);
753 if ($objectline->fetch(
GETPOST(
'lineid',
'int'))) {
754 $objectline->array_options = $array_options;
755 $result = $objectline->insertExtraFields();
761 $position = ($objectline->rang >= 0 ? $objectline->rang : 0);
764 if (is_array($extralabelsline)) {
766 foreach ($extralabelsline as $key => $value) {
767 unset($_POST[
"options_".$key]);
772 $special_code =
GETPOST(
'special_code',
'int');
773 if ($special_code == 3) {
790 if (empty($remise_percent)) {
795 $productid =
GETPOST(
'productid',
'int');
796 if (!empty($productid)) {
798 $product->fetch($productid);
800 $type = $product->type;
802 $price_min = $product->price_min;
803 if (!empty($conf->global->PRODUIT_MULTIPRICES) && !empty($object->thirdparty->price_level)) {
804 $price_min = $product->multiprices_min[$object->thirdparty->price_level];
813 setEventMessages($langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, - 1, $conf->currency)),
null,
'errors');
817 $type =
GETPOST(
'type',
'int');
818 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
821 if (
GETPOST(
'type',
'int') < 0) {
822 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
827 $langs->load(
"errors");
828 setEventMessages($langs->trans(
'ErrorQtyForCustomerInvoiceCantBeNegative'),
null,
'errors');
832 $date_start_fill =
GETPOST(
'date_start_fill',
'int');
833 $date_end_fill =
GETPOST(
'date_end_fill',
'int');
837 $result = $object->updateline(
882 $object->fetch($object->id);
884 unset($_POST[
'qty']);
885 unset($_POST[
'type']);
886 unset($_POST[
'productid']);
887 unset($_POST[
'remise_percent']);
888 unset($_POST[
'price_ht']);
889 unset($_POST[
'multicurrency_price_ht']);
890 unset($_POST[
'price_ttc']);
891 unset($_POST[
'tva_tx']);
892 unset($_POST[
'product_ref']);
893 unset($_POST[
'product_label']);
894 unset($_POST[
'product_desc']);
895 unset($_POST[
'fournprice']);
896 unset($_POST[
'buying_price']);
897 unset($_POST[
'np_marginRate']);
898 unset($_POST[
'np_markRate']);
900 unset($_POST[
'dp_desc']);
901 unset($_POST[
'idprod']);
902 unset($_POST[
'units']);
904 unset($_POST[
'date_starthour']);
905 unset($_POST[
'date_startmin']);
906 unset($_POST[
'date_startsec']);
907 unset($_POST[
'date_startday']);
908 unset($_POST[
'date_startmonth']);
909 unset($_POST[
'date_startyear']);
910 unset($_POST[
'date_endhour']);
911 unset($_POST[
'date_endmin']);
912 unset($_POST[
'date_endsec']);
913 unset($_POST[
'date_endday']);
914 unset($_POST[
'date_endmonth']);
915 unset($_POST[
'date_endyear']);
917 unset($_POST[
'situations']);
918 unset($_POST[
'progress']);
939 $companystatic =
new Societe($db);
949 if ($action ==
'create') {
950 print
load_fiche_titre($langs->trans(
"CreateRepeatableInvoice"),
'',
'bill');
953 $product_static =
new Product($db);
955 if ($object->fetch($id, $ref) > 0) {
956 $result = $object->getLinesArray();
958 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
959 print
'<input type="hidden" name="token" value="'.newToken().
'">';
960 print
'<input type="hidden" name="action" value="add">';
961 print
'<input type="hidden" name="facid" value="'.$object->id.
'">';
969 if ($object->fk_account > 0) {
973 print
'<table class="border centpercent">';
975 $object->fetch_thirdparty();
978 print
'<tr><td class="titlefieldcreate fieldrequired">'.$langs->trans(
"Title").
'</td><td>';
979 print
'<input class="flat quatrevingtpercent" type="text" name="title" value="'.dol_escape_htmltag(
GETPOST(
"title",
'alphanohtml')).
'" autofocus>';
983 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Customer").
'</td><td>'.$object->thirdparty->getNomUrl(1,
'customer').
'</td>';
986 $note_public =
GETPOSTISSET(
'note_public') ?
GETPOST(
'note_public',
'restricthtml') : $object->note_public;
987 $note_private =
GETPOSTISSET(
'note_private') ?
GETPOST(
'note_private',
'restricthtml') : $object->note_private;
992 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH__'] = $langs->trans(
"PreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, -1,
'm'),
'%m').
')';
993 $substitutionarray[
'__INVOICE_MONTH__'] = $langs->trans(
"MonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($object->date,
'%m').
')';
994 $substitutionarray[
'__INVOICE_NEXT_MONTH__'] = $langs->trans(
"NextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, 1,
'm'),
'%m').
')';
995 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH_TEXT__'] = $langs->trans(
"TextPreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, -1,
'm'),
'%B').
')';
996 $substitutionarray[
'__INVOICE_MONTH_TEXT__'] = $langs->trans(
"TextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($object->date,
'%B').
')';
997 $substitutionarray[
'__INVOICE_NEXT_MONTH_TEXT__'] = $langs->trans(
"TextNextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, 1,
'm'),
'%B').
')';
998 $substitutionarray[
'__INVOICE_PREVIOUS_YEAR__'] = $langs->trans(
"PreviousYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, -1,
'y'),
'%Y').
')';
999 $substitutionarray[
'__INVOICE_YEAR__'] = $langs->trans(
"YearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($object->date,
'%Y').
')';
1000 $substitutionarray[
'__INVOICE_NEXT_YEAR__'] = $langs->trans(
"NextYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, 1,
'y'),
'%Y').
')';
1002 $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').
')';
1003 $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').
')';
1004 $substitutionarray[
'__INVOICE_COUNTER_CURRENT__'] = $langs->trans(
"Count");
1005 $substitutionarray[
'__INVOICE_COUNTER_MAX__'] = $langs->trans(
"MaxPeriodNumber");
1007 $htmltext =
'<i>'.$langs->trans(
"FollowingConstantsWillBeSubstituted").
':<br>';
1008 foreach ($substitutionarray as $key => $val) {
1009 $htmltext .= $key.
' = '.$langs->trans($val).
'<br>';
1011 $htmltext .=
'</i>';
1015 print
'<td class="tdtop">';
1016 print
$form->textwithpicto($langs->trans(
'NotePublic'), $htmltext, 1,
'help',
'', 0, 2,
'notepublic');
1019 $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%');
1020 print $doleditor->Create(1);
1023 if (empty($user->socid)) {
1025 print
'<td class="tdtop">';
1026 print
$form->textwithpicto($langs->trans(
'NotePrivate'), $htmltext, 1,
'help',
'', 0, 2,
'noteprivate');
1029 $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%');
1030 print $doleditor->Create(1);
1036 print
"<tr><td>".$langs->trans(
"Author").
"</td><td>".$user->getFullName($langs).
"</td></tr>";
1039 print
"<tr><td>".$langs->trans(
"PaymentConditions").
"</td><td>";
1040 print
$form->getSelectConditionsPaiements(
GETPOSTISSET(
'cond_reglement_id') ?
GETPOST(
'cond_reglement_id',
'int') : $object->cond_reglement_id,
'cond_reglement_id', -1, 0, 0,
'');
1045 print
"<tr><td>".$langs->trans(
"PaymentMode").
"</td><td>";
1046 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
1047 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);
1052 if ($object->fk_account > 0) {
1053 print
"<tr><td>".$langs->trans(
'BankAccount').
"</td><td>";
1054 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->fk_account,
'none');
1059 if (
isModEnabled(
'project') && is_object($object->thirdparty) && $object->thirdparty->id > 0) {
1060 $projectid =
GETPOST(
'projectid') ?
GETPOST(
'projectid') : $object->fk_project;
1061 $langs->load(
'projects');
1062 print
'<tr><td>'.$langs->trans(
'Project').
'</td><td>';
1063 print
img_picto(
'',
'project',
'class="pictofixedwidth"');
1064 $numprojet = $formproject->select_projects($object->thirdparty->id, $projectid,
'projectid', 0, 0, 1, 0, 0, 0, 0,
'', 0, 0,
'');
1065 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>';
1070 print
"<tr><td>".$langs->trans(
'Model').
"</td><td>";
1071 include_once DOL_DOCUMENT_ROOT.
'/core/modules/facture/modules_facture.php';
1073 print
img_picto(
'',
'generic',
'class="pictofixedwidth"');
1074 print
$form->selectarray(
'modelpdf', $list, $conf->global->FACTURE_ADDON_PDF);
1083 $title = $langs->trans(
"Recurrence");
1088 print
'<table class="border centpercent">';
1091 print
'<tr><td class="titlefieldcreate">'.$form->textwithpicto($langs->trans(
"Frequency"), $langs->transnoentitiesnoconv(
'toolTipFrequency')).
"</td><td>";
1092 print
"<input type='text' name='frequency' value='".GETPOST(
'frequency',
'int').
"' size='4' /> ";
1093 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'));
1097 print
"<tr><td>".$langs->trans(
'NextDateToExecution').
"</td><td>";
1099 print
$form->selectDate($date_next_execution,
'', 1, 1,
'',
"add", 1, 1);
1103 print
"<tr><td>".$langs->trans(
"MaxPeriodNumber").
"</td><td>";
1104 print
'<input type="text" name="nb_gen_max" value="'.GETPOST(
'nb_gen_max').
'" size="5" />';
1108 print
"<tr><td>".$langs->trans(
"StatusOfGeneratedInvoices").
"</td><td>";
1109 $select = array(
'0'=>$langs->trans(
'BillStatusDraft'),
'1'=>$langs->trans(
'BillStatusValidated'));
1110 print
$form->selectarray(
'auto_validate', $select,
GETPOST(
'auto_validate'));
1114 if (!empty($conf->global->INVOICE_REC_CAN_DISABLE_DOCUMENT_FILE_GENERATION)) {
1115 print
"<tr><td>".$langs->trans(
"StatusOfGeneratedDocuments").
"</td><td>";
1116 $select = array(
'0'=>$langs->trans(
'DoNotGenerateDoc'),
'1'=>$langs->trans(
'AutoGenerateDoc'));
1117 print
$form->selectarray(
'generate_pdf', $select,
GETPOST(
'generate_pdf'));
1120 print
'<input type="hidden" name="generate_pdf" value="1">';
1128 $title = $langs->trans(
"ProductsAndServices");
1130 $title = $langs->trans(
"Products");
1132 $title = $langs->trans(
"Services");
1140 print
'<div class="div-table-responsive-no-min">';
1141 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
1143 if (!empty($object->lines)) {
1147 $object->printObjectLines(
'', $mysoc, $object->thirdparty, $lineid, 0);
1155 if ($flag_price_may_change) {
1156 print
'<tr><td colspan="3" class="left">';
1157 print
'<select name="usenewprice" class="flat">';
1158 print
'<option value="0">'.$langs->trans(
"AlwaysUseFixedPrice").
'</option>';
1159 print
'<option value="1" disabled>'.$langs->trans(
"AlwaysUseNewPrice").
'</option>';
1165 print
$form->buttonsSaveCancel(
"Create");
1175 if ($object->id > 0) {
1176 $object->fetch_thirdparty();
1179 if ($action ==
'ask_deleteline') {
1180 $formconfirm =
$form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'',
'no', 1);
1184 if ($action ==
'delete') {
1185 $formconfirm =
$form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'DeleteRepeatableInvoice'), $langs->trans(
'ConfirmDeleteRepeatableInvoice'),
'confirm_deleteinvoice',
'',
'no', 1);
1190 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1191 if (empty($reshook)) {
1193 } elseif ($reshook > 0) {
1199 $author =
new User($db);
1200 $author->fetch($object->user_author);
1204 print
dol_get_fiche_head($head,
'card', $langs->trans(
"RepeatableInvoice"), -1,
'bill');
1208 $linkback =
'<a href="'.DOL_URL_ROOT.
'/compta/facture/invoicetemplate_list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1211 if ($action !=
'editref') {
1212 $morehtmlref .=
$form->editfieldkey($object->ref,
'ref', $object->ref, $object, $user->rights->facture->creer,
'',
'', 0, 2);
1214 $morehtmlref .=
$form->editfieldval(
'',
'ref', $object->ref, $object, $user->rights->facture->creer,
'string');
1217 $morehtmlref .=
'<div class="refidno">';
1222 $morehtmlref .= $langs->trans(
'ThirdParty').
' : '.$object->thirdparty->getNomUrl(1);
1225 $langs->load(
"projects");
1226 $morehtmlref .=
'<br>'.$langs->trans(
'Project').
' ';
1227 if ($user->rights->facture->creer) {
1228 if ($action !=
'classify') {
1229 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> : ';
1231 if ($action ==
'classify') {
1233 $morehtmlref .=
'<form method="post" action="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'">';
1234 $morehtmlref .=
'<input type="hidden" name="action" value="classin">';
1235 $morehtmlref .=
'<input type="hidden" name="token" value="'.newToken().
'">';
1236 $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project,
'projectid', $maxlength, 0, 1, 0, 1, 0, 0,
'', 1);
1237 $morehtmlref .=
'<input type="submit" class="button valignmiddle" value="'.$langs->trans(
"Modify").
'">';
1238 $morehtmlref .=
'</form>';
1240 $morehtmlref .=
$form->form_project($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->socid, $object->fk_project,
'none', 0, 0, 0, 1,
'',
'maxwidth300');
1243 if (!empty($object->fk_project)) {
1245 $proj->fetch($object->fk_project);
1246 $morehtmlref .=
' : '.$proj->getNomUrl(1);
1248 $morehtmlref .=
' - '.$proj->title;
1255 $morehtmlref .=
'</div>';
1257 $morehtmlright =
'';
1259 dol_banner_tab($object,
'ref', $linkback, 1,
'title',
'none', $morehtmlref,
'', 0,
'', $morehtmlright);
1261 print
'<div class="fichecenter">';
1262 print
'<div class="fichehalfleft">';
1263 print
'<div class="underbanner clearboth"></div>';
1265 print
'<table class="border centpercent tableforfield">';
1267 print
'<tr><td class="titlefield">'.$langs->trans(
"Author").
'</td><td>';
1268 print $author->getNomUrl(-1);
1271 print
'<tr><td>'.$langs->trans(
"AmountHT").
'</td>';
1272 print
'<td>'.price($object->total_ht,
'', $langs, 1, -1, -1, $conf->currency).
'</td>';
1275 print
'<tr><td>'.$langs->trans(
"AmountVAT").
'</td><td>'.
price($object->total_tva,
'', $langs, 1, -1, -1, $conf->currency).
'</td>';
1279 if (($mysoc->localtax1_assuj ==
"1" && $mysoc->useLocalTax(1)) || $object->total_localtax1 != 0) {
1280 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td>';
1281 print
'<td class="nowrap">'.price($object->total_localtax1, 1,
'', 1, - 1, - 1, $conf->currency).
'</td></tr>';
1283 if (($mysoc->localtax2_assuj ==
"1" && $mysoc->useLocalTax(2)) || $object->total_localtax2 != 0) {
1284 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td>';
1285 print
'<td class=nowrap">'.price($object->total_localtax2, 1,
'', 1, - 1, - 1, $conf->currency).
'</td></tr>';
1288 print
'<tr><td>'.$langs->trans(
"AmountTTC").
'</td><td colspan="3">'.
price($object->total_ttc,
'', $langs, 1, -1, -1, $conf->currency).
'</td>';
1294 print
'<table class="nobordernopadding centpercent"><tr><td>';
1295 print $langs->trans(
'PaymentConditionsShort');
1297 if ($action !=
'editconditions' && $user->rights->facture->creer) {
1298 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>';
1300 print
'</tr></table>';
1303 if ($action ==
'editconditions') {
1304 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->cond_reglement_id,
'cond_reglement_id');
1306 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->cond_reglement_id,
'none');
1315 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1316 print $langs->trans(
'PaymentMode');
1318 if ($action !=
'editmode' && $user->rights->facture->creer) {
1319 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>';
1321 print
'</tr></table>';
1323 if ($action ==
'editmode') {
1324 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
1326 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->mode_reglement_id,
'none');
1335 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1336 print
$form->editfieldkey(
'Currency',
'multicurrency_code',
'', $object, 0);
1338 if ($usercancreate && $action !=
'editmulticurrencycode' && !empty($object->brouillon)) {
1339 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>';
1341 print
'</tr></table>';
1343 $htmlname = (($usercancreate && $action ==
'editmulticurrencycode') ?
'multicurrency_code' :
'none');
1344 $form->form_multicurrency_code($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->multicurrency_code, $htmlname);
1348 if ($object->multicurrency_code != $conf->currency || $object->multicurrency_tx != 1) {
1351 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1352 print
$form->editfieldkey(
'CurrencyRate',
'multicurrency_tx',
'', $object, 0);
1354 if ($usercancreate && $action !=
'editmulticurrencyrate' && !empty($object->brouillon) && $object->multicurrency_code && $object->multicurrency_code != $conf->currency) {
1355 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>';
1357 print
'</tr></table>';
1359 if ($action ==
'editmulticurrencyrate' || $action ==
'actualizemulticurrencyrate') {
1360 if ($action ==
'actualizemulticurrencyrate') {
1363 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->multicurrency_tx, ($usercancreate ?
'multicurrency_tx' :
'none'), $object->multicurrency_code);
1365 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->multicurrency_tx,
'none', $object->multicurrency_code);
1366 if ($object->statut == $object::STATUS_DRAFT && $object->multicurrency_code && $object->multicurrency_code != $conf->currency) {
1367 print
'<div class="inline-block"> ';
1368 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=actualizemulticurrencyrate">'.$langs->trans(
"ActualizeCurrency").
'</a>';
1378 if (!empty($object->frequency) && !empty($object->date_when)) {
1379 $dateexample = $object->date_when;
1385 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH__'] = $langs->trans(
"PreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'm'),
'%m').
')';
1386 $substitutionarray[
'__INVOICE_MONTH__'] = $langs->trans(
"MonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($dateexample,
'%m').
')';
1387 $substitutionarray[
'__INVOICE_NEXT_MONTH__'] = $langs->trans(
"NextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'm'),
'%m').
')';
1388 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH_TEXT__'] = $langs->trans(
"TextPreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'm'),
'%B').
')';
1389 $substitutionarray[
'__INVOICE_MONTH_TEXT__'] = $langs->trans(
"TextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($dateexample,
'%B').
')';
1390 $substitutionarray[
'__INVOICE_NEXT_MONTH_TEXT__'] = $langs->trans(
"TextNextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'm'),
'%B').
')';
1391 $substitutionarray[
'__INVOICE_PREVIOUS_YEAR__'] = $langs->trans(
"PreviousYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'y'),
'%Y').
')';
1392 $substitutionarray[
'__INVOICE_YEAR__'] = $langs->trans(
"YearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($dateexample,
'%Y').
')';
1393 $substitutionarray[
'__INVOICE_NEXT_YEAR__'] = $langs->trans(
"NextYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'y'),
'%Y').
')';
1395 $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').
')';
1396 $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').
')';
1397 $substitutionarray[
'__INVOICE_COUNTER_CURRENT__'] = $object->nb_gen_done;
1398 $substitutionarray[
'__INVOICE_COUNTER_MAX__'] = $object->nb_gen_max;
1400 $htmltext =
'<i>'.$langs->trans(
"FollowingConstantsWillBeSubstituted").
':<br>';
1401 foreach ($substitutionarray as $key => $val) {
1402 $htmltext .= $key.
' = '.$langs->trans($val).
'<br>';
1404 $htmltext .=
'</i>';
1408 print
$form->editfieldkey(
$form->textwithpicto($langs->trans(
'NotePublic'), $htmltext, 1,
'help',
'', 0, 2,
'notepublic'),
'note_public', $object->note_public, $object, $user->rights->facture->creer);
1409 print
'</td><td class="wordbreak">';
1410 print
$form->editfieldval($langs->trans(
"NotePublic"),
'note_public', $object->note_public, $object, $user->rights->facture->creer,
'textarea:'.ROWS_4.
':90%',
'',
null,
null,
'', 1);
1416 print
$form->editfieldkey(
$form->textwithpicto($langs->trans(
"NotePrivate"), $htmltext, 1,
'help',
'', 0, 2,
'noteprivate'),
'note_private', $object->note_private, $object, $user->rights->facture->creer);
1417 print
'</td><td class="wordbreak">';
1418 print
$form->editfieldval($langs->trans(
"NotePrivate"),
'note_private', $object->note_private, $object, $user->rights->facture->creer,
'textarea:'.ROWS_4.
':90%',
'',
null,
null,
'', 1);
1423 print
'<tr><td class="nowrap">';
1424 print
'<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
1425 print $langs->trans(
'BankAccount');
1427 if (($action !=
'editbankaccount') && $user->rights->facture->creer && $object->statut ==
FactureRec::STATUS_DRAFT) {
1428 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>';
1430 print
'</tr></table>';
1432 if ($action ==
'editbankaccount') {
1433 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->fk_account,
'fk_account', 1);
1435 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->fk_account,
'none');
1441 print
'<tr><td class="nowrap">';
1442 print
'<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
1443 print $langs->trans(
'Model');
1446 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>';
1448 print
'</tr></table>';
1450 if ($action ==
'editmodelpdf') {
1451 include_once DOL_DOCUMENT_ROOT.
'/core/modules/facture/modules_facture.php';
1454 foreach ($models as $k => $model) {
1455 $list[] = str_replace(
':',
'|', $k).
':'.$model;
1457 $select =
'select;'.implode(
',', $list);
1458 print
$form->editfieldval($langs->trans(
"Model"),
'modelpdf', $object->model_pdf, $object, $user->rights->facture->creer, $select);
1460 print $object->model_pdf;
1467 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1472 print
'<div class="fichehalfright">';
1473 print
'<div class="underbanner clearboth"></div>';
1479 $title = $langs->trans(
"Recurrence");
1482 print
'<table class="border centpercent tableforfield">';
1484 print
'<tr><td colspan="2">'.img_picto(
'',
'recurring',
'class="pictofixedwidth"').$title.
'</td></tr>';
1487 print
'<tr><td style="width: 50%">';
1488 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1489 print $langs->trans(
'Frequency');
1491 if ($action !=
'editfrequency' && $user->rights->facture->creer) {
1492 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>';
1494 print
'</tr></table>';
1496 if ($action ==
'editfrequency') {
1497 print
'<form method="post" action="'.$_SERVER[
"PHP_SELF"].
'?facid='.$object->id.
'">';
1498 print
'<input type="hidden" name="action" value="setfrequency">';
1499 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1500 print
'<table class="nobordernopadding">';
1502 print
"<input type='text' name='frequency' value='".$object->frequency.
"' size='5' /> ";
1503 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'));
1505 print
'<td class="left"><input type="submit" class="button button-edit smallpaddingimp" value="'.$langs->trans(
"Modify").
'"></td>';
1506 print
'</tr></table></form>';
1508 if ($object->frequency > 0) {
1509 print $langs->trans(
'FrequencyPer_'.$object->unit_frequency, $object->frequency);
1511 print
'<span class="opacitymedium">'.$langs->trans(
"NotARecurringInvoiceTemplate").
'</span>';
1518 if ($action ==
'date_when' || $object->frequency > 0) {
1519 print
$form->editfieldkey($langs->trans(
"NextDateToExecution"),
'date_when', $object->date_when, $object, $user->rights->facture->creer,
'day');
1521 print $langs->trans(
"NextDateToExecution");
1524 if ($action ==
'date_when' || $object->frequency > 0) {
1525 print
$form->editfieldval($langs->trans(
"NextDateToExecution"),
'date_when', $object->date_when, $object, $user->rights->facture->creer,
'day', $object->date_when,
null,
'',
'', 0,
'strikeIfMaxNbGenReached');
1528 if (!$object->isMaxNbGenReached()) {
1529 if (!$object->suspended && $action !=
'editdate_when' && $object->frequency > 0 && $object->date_when && $object->date_when < $now) {
1533 print
img_info($langs->trans(
"MaxNumberOfGenerationReached"));
1540 if ($action ==
'nb_gen_max' || $object->frequency > 0) {
1541 print
$form->editfieldkey($langs->trans(
"MaxPeriodNumber"),
'nb_gen_max', $object->nb_gen_max, $object, $user->rights->facture->creer);
1543 print $langs->trans(
"MaxPeriodNumber");
1546 if ($action ==
'nb_gen_max' || $object->frequency > 0) {
1547 print
$form->editfieldval($langs->trans(
"MaxPeriodNumber"),
'nb_gen_max', $object->nb_gen_max ? $object->nb_gen_max :
'', $object, $user->rights->facture->creer);
1556 if ($action ==
'auto_validate' || $object->frequency > 0) {
1557 print
$form->editfieldkey($langs->trans(
"StatusOfGeneratedInvoices"),
'auto_validate', $object->auto_validate, $object, $user->rights->facture->creer);
1559 print $langs->trans(
"StatusOfGeneratedInvoices");
1562 $select =
'select;0:'.$langs->trans(
'BillStatusDraft').
',1:'.$langs->trans(
'BillStatusValidated');
1563 if ($action ==
'auto_validate' || $object->frequency > 0) {
1564 print
$form->editfieldval($langs->trans(
"StatusOfGeneratedInvoices"),
'auto_validate', $object->auto_validate, $object, $user->rights->facture->creer, $select);
1568 if (!empty($conf->global->INVOICE_REC_CAN_DISABLE_DOCUMENT_FILE_GENERATION)) {
1571 if ($action ==
'generate_pdf' || $object->frequency > 0) {
1572 print
$form->editfieldkey($langs->trans(
"StatusOfGeneratedDocuments"),
'generate_pdf', $object->generate_pdf, $object, $user->rights->facture->creer);
1574 print $langs->trans(
"StatusOfGeneratedDocuments");
1578 $select =
'select;0:'.$langs->trans(
'DoNotGenerateDoc').
',1:'.$langs->trans(
'AutogenerateDoc');
1579 if ($action ==
'generate_pdf' || $object->frequency > 0) {
1580 print
$form->editfieldval($langs->trans(
"StatusOfGeneratedDocuments"),
'generate_pdf', $object->generate_pdf, $object, $user->rights->facture->creer, $select);
1585 print
'<input type="hidden" name="generate_pdf" value="1">';
1591 if ($object->frequency > 0) {
1595 print
info_admin($langs->trans(
"EnableAndSetupModuleCron", $langs->transnoentitiesnoconv(
"Module2300Name")));
1598 print
'<div class="underbanner clearboth"></div>';
1599 print
'<table class="border centpercent tableforfield">';
1602 print
'<tr><td style="width: 50%">'.$langs->trans(
"NbOfGenerationDone").
'</td>';
1604 print $object->nb_gen_done ? $object->nb_gen_done :
'0';
1610 print $langs->trans(
"DateLastGeneration");
1624 print
'<div class="clearboth"></div><br>';
1628 print
'<form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.(($action !=
'editline') ?
'#add' :
'#line_'.
GETPOST(
'lineid',
'int')).
'" method="POST">';
1629 print
'<input type="hidden" name="token" value="' .
newToken().
'">';
1630 print
'<input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">';
1631 print
'<input type="hidden" name="mode" value="">';
1632 print
'<input type="hidden" name="id" value="' . $object->id.
'">';
1633 print
'<input type="hidden" name="page_y" value="">';
1635 if (!empty($conf->use_javascript_ajax) && $object->statut == 0) {
1636 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
1639 print
'<div class="div-table-responsive-no-min">';
1640 print
'<table id="tablelines" class="noborder noshadow centpercent">';
1642 if (!empty($object->lines)) {
1643 $canchangeproduct = 1;
1644 $object->printObjectLines($action, $mysoc, $object->thirdparty, $lineid, 0);
1648 if ($object->statut == $object::STATUS_DRAFT && $user->rights->facture->creer && $action !=
'valid' && $action !=
'editline') {
1649 if ($action !=
'editline') {
1652 $parameters = array();
1653 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
1654 if ($reshook < 0)
setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
1655 if (empty($reshook))
1656 $object->formAddObjectLine(0, $mysoc, $object->thirdparty);
1671 print
'<div class="tabsAction">';
1673 $parameters = array();
1674 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
1675 if (empty($reshook)) {
1678 'class' =>
'classfortooltip',
1681 if (empty($object->suspended)) {
1682 if ($user->rights->facture->creer) {
1683 if (!empty($object->frequency) && $object->nb_gen_max > 0 && ($object->nb_gen_done >= $object->nb_gen_max)) {
1684 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="' .
dol_escape_htmltag($langs->trans(
"MaxGenerationReached")) .
'">' . $langs->trans(
"CreateBill") .
'</a></div>';
1686 if (empty($object->frequency) || $object->date_when <= $nowlasthour) {
1687 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>';
1689 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="' .
dol_escape_htmltag($langs->trans(
"DateIsNotEnough")) .
'">' . $langs->trans(
"CreateBill") .
'</a></div>';
1693 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#">' . $langs->trans(
"CreateBill") .
'</a></div>';
1697 if ($user->rights->facture->creer) {
1698 if (empty($object->suspended)) {
1699 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>';
1701 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>';
1706 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"] .
'?id=' . $object->id .
'&action=delete&token=' .
newToken(),
'delete', $user->rights->facture->supprimer);
1712 print
'<div class="fichecenter"><div class="fichehalfleft">';
1713 print
'<a name="builddoc"></a>';
1717 $linktoelem =
$form->showLinkToObjectBlock($object,
null, array(
'invoice'));
1719 $somethingshown =
$form->showLinkedObjectBlock($object, $linktoelem);
1723 print
'<div class="fichehalfright">';
1730 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
1732 $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.