34require
'../../main.inc.php';
35require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture-rec.class.php';
36require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
37require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
38if (isModEnabled(
'project')) {
39 include_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
42require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
43require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
44require_once DOL_DOCUMENT_ROOT.
'/core/lib/invoice.lib.php';
45require_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';
66if ($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');
77$page = GETPOSTISSET(
'pageplusone') ? (
GETPOST(
'pageplusone') - 1) :
GETPOST(
"page",
'int');
78if (empty($page) || $page == -1) {
81$offset = $limit * $page;
86 $sortfield =
'f.titre';
92if (($id > 0 || $ref) && $action !=
'create' && $action !=
'add') {
93 $ret = $object->fetch($id, $ref);
100$hookmanager->initHooks(array(
'invoicereccard',
'globalcard'));
104$extrafields->fetch_name_optionals_label($object->table_element);
106$search_array_options = $extrafields->getOptionalsFromPost($object->table_element,
'',
'search_');
108$permissionnote = $user->hasRight(
'facture',
'creer');
109$permissiondellink = $user->hasRight(
'facture',
'creer');
110$permissiontoedit = $user->hasRight(
'facture',
'creer');
112$usercanread = $user->hasRight(
'facture',
'lire');
113$usercancreate = $user->hasRight(
'facture',
'creer');
114$usercanissuepayment = $user->hasRight(
'facture',
'paiement');
115$usercandelete = $user->hasRight(
'facture',
'supprimer');
116$usercanvalidate = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && $usercancreate) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->facture->invoice_advance->validate)));
117$usercansend = (empty($conf->global->MAIN_USE_ADVANCED_PERMS) || $user->rights->facture->invoice_advance->send);
118$usercanreopen = (empty($conf->global->MAIN_USE_ADVANCED_PERMS) || $user->rights->facture->invoice_advance->reopen);
119$usercanunvalidate = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($usercancreate)) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->facture->invoice_advance->unvalidate)));
121$usercanproductignorepricemin = ((!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->produit->ignore_price_min_advance)) || empty($conf->global->MAIN_USE_ADVANCED_PERMS));
122$usercancreatemargin = $user->hasRight(
"margins",
"creer");
123$usercanreadallmargin = $user->hasRight(
"margins",
"liretous");
124$usercancreatewithdrarequest = $user->hasRight(
"prelevement",
"bons",
"creer");
130$result =
restrictedArea($user,
'facture', $object->id, $objecttype);
137if (
GETPOST(
'cancel',
'alpha')) {
141if (!
GETPOST(
'confirmmassaction',
'alpha') && $massaction !=
'presend' && $massaction !=
'confirm_presend') {
145$parameters = array();
146$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
151if (empty($reshook)) {
152 if (
GETPOST(
'cancel',
'alpha')) {
157 include DOL_DOCUMENT_ROOT.
'/core/actions_changeselectedfields.inc.php';
160 include DOL_DOCUMENT_ROOT.
'/core/actions_setnotes.inc.php';
162 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
164 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
175 if ($action ==
'add') {
176 if (!
GETPOST(
'title',
'alphanohtml')) {
177 setEventMessages($langs->transnoentities(
"ErrorFieldRequired", $langs->trans(
"Title")),
null,
'errors');
182 $frequency =
GETPOST(
'frequency',
'int');
183 $reyear =
GETPOST(
'reyear',
'int');
184 $remonth =
GETPOST(
'remonth',
'int');
185 $reday =
GETPOST(
'reday',
'int');
186 $rehour =
GETPOST(
'rehour',
'int');
187 $remin =
GETPOST(
'remin',
'int');
188 $nb_gen_max =
GETPOST(
'nb_gen_max',
'int');
191 if (
GETPOST(
'frequency',
'int')) {
192 if (empty($reyear) || empty($remonth) || empty($reday)) {
193 setEventMessages($langs->transnoentities(
"ErrorFieldRequired", $langs->trans(
"Date")),
null,
'errors');
205 $object->titre =
GETPOST(
'title',
'alphanohtml');
206 $object->title =
GETPOST(
'title',
'alphanohtml');
207 $object->note_private =
GETPOST(
'note_private',
'restricthtml');
208 $object->note_public =
GETPOST(
'note_public',
'restricthtml');
209 $object->model_pdf =
GETPOST(
'modelpdf',
'alphanohtml');
210 $object->usenewprice =
GETPOST(
'usenewprice',
'alphanohtml');
212 $object->mode_reglement_id =
GETPOST(
'mode_reglement_id',
'int');
213 $object->cond_reglement_id =
GETPOST(
'cond_reglement_id',
'int');
215 $object->frequency = $frequency;
216 $object->unit_frequency =
GETPOST(
'unit_frequency',
'alpha');
217 $object->nb_gen_max = $nb_gen_max;
218 $object->auto_validate =
GETPOST(
'auto_validate',
'int');
219 $object->generate_pdf =
GETPOST(
'generate_pdf',
'int');
220 $object->fk_project = $projectid;
222 $date_next_execution =
dol_mktime($rehour, $remin, 0, $remonth, $reday, $reyear);
223 $object->date_when = $date_next_execution;
226 if (
GETPOST(
'facid',
'int') > 0) {
228 $srcObject->fetch(
GETPOST(
'facid',
'int'));
230 $srcObject->fetchObjectLinked();
232 if (!empty($srcObject->linkedObjectsIds[
'contrat'])) {
233 $contractidid = reset($srcObject->linkedObjectsIds[
'contrat']);
235 $object->origin =
'contrat';
236 $object->origin_id = $contractidid;
237 $object->linked_objects[$object->origin] = $object->origin_id;
243 $oldinvoice =
new Facture($db);
244 $oldinvoice->fetch(
GETPOST(
'facid',
'int'));
246 $result = $object->create($user, $oldinvoice->id);
248 $result = $oldinvoice->delete($user, 1);
263 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?facid='.$object->id);
274 if ($action ==
'confirm_delete' && $confirm ==
'yes' && $user->rights->facture->supprimer) {
275 $object->delete($user);
277 header(
"Location: ".DOL_URL_ROOT.
'/compta/facture/invoicetemplate_list.php');
284 if ($action ==
'setconditions' && $user->hasRight(
'facture',
'creer')) {
285 $result = $object->setPaymentTerms(
GETPOST(
'cond_reglement_id',
'int'));
286 } elseif ($action ==
'setmode' && $user->hasRight(
'facture',
'creer')) {
288 $result = $object->setPaymentMethods(
GETPOST(
'mode_reglement_id',
'int'));
289 } elseif ($action ==
'classin' && $user->hasRight(
'facture',
'creer')) {
291 $object->setProject(
GETPOST(
'projectid',
'int'));
292 } elseif ($action ==
'setref' && $user->hasRight(
'facture',
'creer')) {
295 $result = $object->setValueFrom(
'titre', $ref,
'',
null,
'text',
'', $user,
'BILLREC_MODIFY');
297 $object->titre = $ref;
298 $object->title = $ref;
299 $object->ref = $object->title;
302 if ($object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
303 $langs->load(
"errors");
304 setEventMessages($langs->trans(
'ErrorRefAlreadyExists', $ref),
null,
'errors');
309 } elseif ($action ==
'setbankaccount' && $user->hasRight(
'facture',
'creer')) {
311 $result = $object->setBankAccount(
GETPOST(
'fk_account',
'int'));
312 } elseif ($action ==
'setfrequency' && $user->hasRight(
'facture',
'creer')) {
314 $object->setFrequencyAndUnit(
GETPOST(
'frequency',
'int'),
GETPOST(
'unit_frequency',
'alpha'));
315 } elseif ($action ==
'setdate_when' && $user->hasRight(
'facture',
'creer')) {
319 $object->setNextDate($date);
321 } elseif ($action ==
'setnb_gen_max' && $user->hasRight(
'facture',
'creer')) {
323 $object->setMaxPeriod(
GETPOST(
'nb_gen_max',
'int'));
324 } elseif ($action ==
'setauto_validate' && $user->hasRight(
'facture',
'creer')) {
326 $object->setAutoValidate(
GETPOST(
'auto_validate',
'int'));
327 } elseif ($action ==
'setgenerate_pdf' && $user->hasRight(
'facture',
'creer')) {
329 $object->setGeneratepdf(
GETPOST(
'generate_pdf',
'int'));
330 } elseif ($action ==
'setmodelpdf' && $user->hasRight(
'facture',
'creer')) {
332 $object->setModelpdf(
GETPOST(
'modelpdf',
'alpha'));
333 } elseif ($action ==
'disable' && $user->hasRight(
'facture',
'creer')) {
339 $res = $object->setValueFrom(
'suspended', 1);
350 } elseif ($action ==
'enable' && $user->hasRight(
'facture',
'creer')) {
356 $res = $object->setValueFrom(
'suspended', 0);
367 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
369 $result = $object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
370 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
372 $result = $object->setMulticurrencyRate(
price2num(
GETPOST(
'multicurrency_tx')),
GETPOST(
'calculation_mode',
'int'));
376 if ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $user->hasRight(
'facture',
'creer')) {
378 $object->fetch_thirdparty();
387 if ($line->delete($user) > 0) {
388 $result = $object->update_price(1);
392 $object->fetch($object->id);
401 } elseif ($action ==
'update_extras') {
405 $ret = $extrafields->setOptionalsFromPost(
null, $object,
GETPOST(
'attribute',
'restricthtml'));
411 $result = $object->insertExtraFields(
'BILLREC_MODIFY');
420 if ($action ==
'addline' && $user->hasRight(
'facture',
'creer')) {
421 $langs->load(
'errors');
426 $product_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
429 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'alpha');
430 if ($prod_entry_mode ==
'free') {
433 $idprod =
GETPOST(
'idprod',
'int');
435 if (!empty($conf->global->MAIN_DISABLE_FREE_LINES) && $idprod <= 0) {
436 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
441 $tva_tx = (
GETPOST(
'tva_tx',
'alpha') ?
GETPOST(
'tva_tx',
'alpha') : 0);
445 if (empty($remise_percent)) {
450 $extralabelsline = $extrafields->fetch_name_optionals_label($object->table_element_line);
451 $array_options = $extrafields->getOptionalsFromPost($object->table_element_line, $predef);
453 if (is_array($extralabelsline)) {
455 foreach ($extralabelsline as $key => $value) {
456 unset($_POST[
"options_".$key.$predef]);
460 if ((empty($idprod) || $idprod < 0) && ($price_ht < 0) && ($qty < 0)) {
461 setEventMessages($langs->trans(
'ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv(
'UnitPriceHT'), $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
464 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
465 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Type')),
null,
'errors');
468 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && (!($price_ht >= 0) || $price_ht ==
'')) {
469 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
473 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
476 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($product_desc)) {
477 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Description')),
null,
'errors');
481 $langs->load(
"errors");
482 setEventMessages($langs->trans(
'ErrorQtyForCustomerInvoiceCantBeNegative'),
null,
'errors');
486 if (!$error && ($qty >= 0) && (!empty($product_desc) || (!empty($idprod) && $idprod > 0))) {
487 $ret = $object->fetch($id);
492 $ret = $object->fetch_thirdparty();
497 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
508 if (!empty($idprod) && $idprod > 0) {
510 $prod->fetch($idprod);
512 $label = ((
GETPOST(
'product_label') &&
GETPOST(
'product_label') != $prod->label) ?
GETPOST(
'product_label') :
'');
524 $datapriceofproduct = $prod->getSellPrice($mysoc, $object->thirdparty, $pqp);
526 $pu_ht = $datapriceofproduct[
'pu_ht'];
527 $pu_ttc = $datapriceofproduct[
'pu_ttc'];
528 $price_min = $datapriceofproduct[
'price_min'];
529 $price_base_type = empty($datapriceofproduct[
'price_base_type']) ?
'HT' : $datapriceofproduct[
'price_base_type'];
533 $tmpvat = (float)
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
534 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $prod->tva_tx));
537 if (!empty($price_ht)) {
539 $pu_ttc =
price2num($pu_ht * (1 + ($tmpvat / 100)),
'MU');
540 } elseif ($tmpvat != $tmpprodvat) {
543 if ($price_base_type !=
'HT') {
544 $pu_ht =
price2num($pu_ttc / (1 + ($tmpvat / 100)),
'MU');
546 $pu_ttc =
price2num($pu_ht * (1 + ($tmpvat / 100)),
'MU');
553 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && !empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) {
554 $outputlangs = $langs;
556 if (empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
557 $newlang =
GETPOST(
'lang_id',
'aZ09');
559 if (empty($newlang)) {
560 $newlang = $object->thirdparty->default_lang;
562 if (!empty($newlang)) {
564 $outputlangs->setDefaultLang($newlang);
567 $desc = (!empty($prod->multilangs [$outputlangs->defaultlang] [
"description"])) ? $prod->multilangs [$outputlangs->defaultlang] [
"description"] : $prod->
description;
569 $desc = $prod->description;
575 if (empty($conf->global->MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE) && (!empty($prod->customcode) || !empty($prod->country_code))) {
578 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && !empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) {
579 $outputlangs = $langs;
581 if (empty($newlang) &&
GETPOST(
'lang_id',
'alpha')) {
582 $newlang =
GETPOST(
'lang_id',
'alpha');
584 if (empty($newlang)) {
585 $newlang = $object->thirdparty->default_lang;
587 if (!empty($newlang)) {
589 $outputlangs->setDefaultLang($newlang);
590 $outputlangs->load(
'products');
592 if (!empty($prod->customcode)) {
593 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
595 if (!empty($prod->customcode) && !empty($prod->country_code)) {
598 if (!empty($prod->country_code)) {
599 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code, 0, $db, $outputlangs, 0);
602 if (!empty($prod->customcode)) {
603 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
605 if (!empty($prod->customcode) && !empty($prod->country_code)) {
608 if (!empty($prod->country_code)) {
609 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code, 0, $db, $langs, 0);
617 $fk_unit = $prod->fk_unit;
621 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
622 $tva_tx = str_replace(
'*',
'', $tva_tx);
623 if (empty($tva_tx)) {
626 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
627 $desc = $product_desc;
629 $fk_unit =
GETPOST(
'units',
'alpha');
632 $date_start_fill =
GETPOST(
'date_start_fill',
'int');
633 $date_end_fill =
GETPOST(
'date_end_fill',
'int');
640 $localtax1_tx =
get_localtax($tva_tx, 1, $object->thirdparty, $mysoc, $tva_npr);
641 $localtax2_tx =
get_localtax($tva_tx, 2, $object->thirdparty, $mysoc, $tva_npr);
648 if ($usercanproductignorepricemin && (!empty($price_min) && (
price2num($pu_ht) * (1 -
price2num($remise_percent) / 100) <
price2num($price_min)))) {
649 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, - 1, $conf->currency));
653 $result = $object->addline($desc, $pu_ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, $idprod, $remise_percent, $price_base_type, $info_bits,
'', $pu_ttc, $type, -1, $special_code, $label, $fk_unit, 0, $date_start_fill, $date_end_fill, $fournprice, $buyingprice);
674 $object->fetch($object->id);
676 unset($_POST[
'prod_entry_mode']);
678 unset($_POST[
'qty']);
679 unset($_POST[
'type']);
680 unset($_POST[
'remise_percent']);
681 unset($_POST[
'price_ht']);
682 unset($_POST[
'multicurrency_price_ht']);
683 unset($_POST[
'price_ttc']);
684 unset($_POST[
'tva_tx']);
685 unset($_POST[
'product_ref']);
686 unset($_POST[
'product_label']);
687 unset($_POST[
'product_desc']);
688 unset($_POST[
'fournprice']);
689 unset($_POST[
'buying_price']);
690 unset($_POST[
'np_marginRate']);
691 unset($_POST[
'np_markRate']);
692 unset($_POST[
'dp_desc']);
693 unset($_POST[
'idprod']);
694 unset($_POST[
'units']);
696 unset($_POST[
'date_starthour']);
697 unset($_POST[
'date_startmin']);
698 unset($_POST[
'date_startsec']);
699 unset($_POST[
'date_startday']);
700 unset($_POST[
'date_startmonth']);
701 unset($_POST[
'date_startyear']);
702 unset($_POST[
'date_endhour']);
703 unset($_POST[
'date_endmin']);
704 unset($_POST[
'date_endsec']);
705 unset($_POST[
'date_endday']);
706 unset($_POST[
'date_endmonth']);
707 unset($_POST[
'date_endyear']);
709 unset($_POST[
'date_start_fill']);
710 unset($_POST[
'date_end_fill']);
712 unset($_POST[
'situations']);
713 unset($_POST[
'progress']);
721 } elseif ($action ==
'updateline' && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
722 if (!$object->fetch($id) > 0) {
725 $object->fetch_thirdparty();
740 if (preg_match(
'/\*/', $vat_rate)) {
745 $vat_rate = str_replace(
'*',
'', $vat_rate);
746 $localtax1_rate =
get_localtax($vat_rate, 1, $object->thirdparty);
747 $localtax2_rate =
get_localtax($vat_rate, 2, $object->thirdparty);
754 $extralabelsline = $extrafields->fetch_name_optionals_label($object->table_element_line);
755 $array_options = $extrafields->getOptionalsFromPost($object->table_element_line);
758 if ($objectline->fetch(
GETPOST(
'lineid',
'int'))) {
759 $objectline->array_options = $array_options;
760 $result = $objectline->insertExtraFields();
766 $position = ($objectline->rang >= 0 ? $objectline->rang : 0);
769 if (is_array($extralabelsline)) {
771 foreach ($extralabelsline as $key => $value) {
772 unset($_POST[
"options_".$key]);
777 $special_code =
GETPOST(
'special_code',
'int');
778 if ($special_code == 3) {
795 if (empty($remise_percent)) {
800 $productid =
GETPOST(
'productid',
'int');
801 if (!empty($productid)) {
803 $product->fetch($productid);
805 $type = $product->type;
807 $price_min = $product->price_min;
808 if (!empty($conf->global->PRODUIT_MULTIPRICES) && !empty($object->thirdparty->price_level)) {
809 $price_min = $product->multiprices_min[$object->thirdparty->price_level];
817 if (((!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->produit->ignore_price_min_advance)) || empty($conf->global->MAIN_USE_ADVANCED_PERMS)) && (($typeinvoice ==
Facture::TYPE_STANDARD || $typeinvoice ==
Facture::TYPE_REPLACEMENT) && $price_min && ((float)
price2num($pu_ht) * (1 - (float) $remise_percent / 100) < (float)
price2num($price_min)))) {
818 setEventMessages($langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, - 1, $conf->currency)),
null,
'errors');
822 $type =
GETPOST(
'type',
'int');
823 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
826 if (
GETPOST(
'type',
'int') < 0) {
827 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
832 $langs->load(
"errors");
833 setEventMessages($langs->trans(
'ErrorQtyForCustomerInvoiceCantBeNegative'),
null,
'errors');
837 $date_start_fill =
GETPOST(
'date_start_fill',
'int');
838 $date_end_fill =
GETPOST(
'date_end_fill',
'int');
842 $result = $object->updateline(
887 $object->fetch($object->id);
889 unset($_POST[
'qty']);
890 unset($_POST[
'type']);
891 unset($_POST[
'productid']);
892 unset($_POST[
'remise_percent']);
893 unset($_POST[
'price_ht']);
894 unset($_POST[
'multicurrency_price_ht']);
895 unset($_POST[
'price_ttc']);
896 unset($_POST[
'tva_tx']);
897 unset($_POST[
'product_ref']);
898 unset($_POST[
'product_label']);
899 unset($_POST[
'product_desc']);
900 unset($_POST[
'fournprice']);
901 unset($_POST[
'buying_price']);
902 unset($_POST[
'np_marginRate']);
903 unset($_POST[
'np_markRate']);
905 unset($_POST[
'dp_desc']);
906 unset($_POST[
'idprod']);
907 unset($_POST[
'units']);
909 unset($_POST[
'date_starthour']);
910 unset($_POST[
'date_startmin']);
911 unset($_POST[
'date_startsec']);
912 unset($_POST[
'date_startday']);
913 unset($_POST[
'date_startmonth']);
914 unset($_POST[
'date_startyear']);
915 unset($_POST[
'date_endhour']);
916 unset($_POST[
'date_endmin']);
917 unset($_POST[
'date_endsec']);
918 unset($_POST[
'date_endday']);
919 unset($_POST[
'date_endmonth']);
920 unset($_POST[
'date_endyear']);
922 unset($_POST[
'situations']);
923 unset($_POST[
'progress']);
937llxHeader(
'', $langs->trans(
"RepeatableInvoices"), $help_url);
939$form =
new Form($db);
941if (isModEnabled(
'project')) {
944$companystatic =
new Societe($db);
954if ($action ==
'create') {
955 print
load_fiche_titre($langs->trans(
"CreateRepeatableInvoice"),
'',
'bill');
958 $product_static =
new Product($db);
960 if ($object->fetch($id, $ref) > 0) {
961 $result = $object->getLinesArray();
963 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
964 print
'<input type="hidden" name="token" value="'.newToken().
'">';
965 print
'<input type="hidden" name="action" value="add">';
966 print
'<input type="hidden" name="facid" value="'.$object->id.
'">';
971 if (isModEnabled(
'project')) {
974 if ($object->fk_account > 0) {
978 print
'<table class="border centpercent">';
980 $object->fetch_thirdparty();
983 print
'<tr><td class="titlefieldcreate fieldrequired">'.$langs->trans(
"Title").
'</td><td>';
984 print
'<input class="flat quatrevingtpercent" type="text" name="title" value="'.dol_escape_htmltag(
GETPOST(
"title",
'alphanohtml')).
'" autofocus>';
988 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Customer").
'</td><td>'.$object->thirdparty->getNomUrl(1,
'customer').
'</td>';
991 $note_public = GETPOSTISSET(
'note_public') ?
GETPOST(
'note_public',
'restricthtml') : $object->note_public;
992 $note_private = GETPOSTISSET(
'note_private') ?
GETPOST(
'note_private',
'restricthtml') : $object->note_private;
997 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH__'] = $langs->trans(
"PreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, -1,
'm'),
'%m').
')';
998 $substitutionarray[
'__INVOICE_MONTH__'] = $langs->trans(
"MonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($object->date,
'%m').
')';
999 $substitutionarray[
'__INVOICE_NEXT_MONTH__'] = $langs->trans(
"NextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, 1,
'm'),
'%m').
')';
1000 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH_TEXT__'] = $langs->trans(
"TextPreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, -1,
'm'),
'%B').
')';
1001 $substitutionarray[
'__INVOICE_MONTH_TEXT__'] = $langs->trans(
"TextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($object->date,
'%B').
')';
1002 $substitutionarray[
'__INVOICE_NEXT_MONTH_TEXT__'] = $langs->trans(
"TextNextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, 1,
'm'),
'%B').
')';
1003 $substitutionarray[
'__INVOICE_PREVIOUS_YEAR__'] = $langs->trans(
"PreviousYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, -1,
'y'),
'%Y').
')';
1004 $substitutionarray[
'__INVOICE_YEAR__'] = $langs->trans(
"YearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($object->date,
'%Y').
')';
1005 $substitutionarray[
'__INVOICE_NEXT_YEAR__'] = $langs->trans(
"NextYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, 1,
'y'),
'%Y').
')';
1007 $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').
')';
1008 $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').
')';
1009 $substitutionarray[
'__INVOICE_COUNTER_CURRENT__'] = $langs->trans(
"Count");
1010 $substitutionarray[
'__INVOICE_COUNTER_MAX__'] = $langs->trans(
"MaxPeriodNumber");
1012 $htmltext =
'<i>'.$langs->trans(
"FollowingConstantsWillBeSubstituted").
':<br>';
1013 foreach ($substitutionarray as $key => $val) {
1014 $htmltext .= $key.
' = '.$langs->trans($val).
'<br>';
1016 $htmltext .=
'</i>';
1020 print
'<td class="tdtop">';
1021 print $form->textwithpicto($langs->trans(
'NotePublic'), $htmltext, 1,
'help',
'', 0, 2,
'notepublic');
1024 $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%');
1025 print $doleditor->Create(1);
1028 if (empty($user->socid)) {
1030 print
'<td class="tdtop">';
1031 print $form->textwithpicto($langs->trans(
'NotePrivate'), $htmltext, 1,
'help',
'', 0, 2,
'noteprivate');
1034 $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%');
1035 print $doleditor->Create(1);
1041 print
"<tr><td>".$langs->trans(
"Author").
"</td><td>".$user->getFullName($langs).
"</td></tr>";
1044 print
"<tr><td>".$langs->trans(
"PaymentConditions").
"</td><td>";
1045 print $form->getSelectConditionsPaiements(GETPOSTISSET(
'cond_reglement_id') ?
GETPOST(
'cond_reglement_id',
'int') : $object->cond_reglement_id,
'cond_reglement_id', -1, 0, 0,
'');
1050 print
"<tr><td>".$langs->trans(
"PaymentMode").
"</td><td>";
1051 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
1052 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);
1057 if ($object->fk_account > 0) {
1058 print
"<tr><td>".$langs->trans(
'BankAccount').
"</td><td>";
1059 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->fk_account,
'none');
1064 if (isModEnabled(
'project') && is_object($object->thirdparty) && $object->thirdparty->id > 0) {
1065 $projectid =
GETPOST(
'projectid') ?
GETPOST(
'projectid') : $object->fk_project;
1066 $langs->load(
'projects');
1067 print
'<tr><td>'.$langs->trans(
'Project').
'</td><td>';
1068 print
img_picto(
'',
'project',
'class="pictofixedwidth"');
1069 $numprojet = $formproject->select_projects($object->thirdparty->id, $projectid,
'projectid', 0, 0, 1, 0, 0, 0, 0,
'', 0, 0,
'');
1070 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>';
1075 print
"<tr><td>".$langs->trans(
'Model').
"</td><td>";
1076 include_once DOL_DOCUMENT_ROOT.
'/core/modules/facture/modules_facture.php';
1078 print
img_picto(
'',
'generic',
'class="pictofixedwidth"');
1079 print $form->selectarray(
'modelpdf', $list, $conf->global->FACTURE_ADDON_PDF);
1088 $title = $langs->trans(
"Recurrence");
1093 print
'<table class="border centpercent">';
1096 print
'<tr><td class="titlefieldcreate">'.$form->textwithpicto($langs->trans(
"Frequency"), $langs->transnoentitiesnoconv(
'toolTipFrequency')).
"</td><td>";
1097 print
"<input type='text' name='frequency' value='".GETPOST(
'frequency',
'int').
"' size='4' /> ";
1098 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'));
1102 print
"<tr><td>".$langs->trans(
'NextDateToExecution').
"</td><td>";
1104 print $form->selectDate($date_next_execution,
'', 1, 1,
'',
"add", 1, 1);
1108 print
"<tr><td>".$langs->trans(
"MaxPeriodNumber").
"</td><td>";
1109 print
'<input type="text" name="nb_gen_max" value="'.GETPOST(
'nb_gen_max').
'" size="5" />';
1113 print
"<tr><td>".$langs->trans(
"StatusOfGeneratedInvoices").
"</td><td>";
1114 $select = array(
'0'=>$langs->trans(
'BillStatusDraft'),
'1'=>$langs->trans(
'BillStatusValidated'));
1115 print $form->selectarray(
'auto_validate', $select,
GETPOST(
'auto_validate'));
1119 if (!empty($conf->global->INVOICE_REC_CAN_DISABLE_DOCUMENT_FILE_GENERATION)) {
1120 print
"<tr><td>".$langs->trans(
"StatusOfGeneratedDocuments").
"</td><td>";
1121 $select = array(
'0'=>$langs->trans(
'DoNotGenerateDoc'),
'1'=>$langs->trans(
'AutoGenerateDoc'));
1122 print $form->selectarray(
'generate_pdf', $select,
GETPOST(
'generate_pdf'));
1125 print
'<input type="hidden" name="generate_pdf" value="1">';
1133 $title = $langs->trans(
"ProductsAndServices");
1134 if (!isModEnabled(
'service')) {
1135 $title = $langs->trans(
"Products");
1136 } elseif (!isModEnabled(
'product')) {
1137 $title = $langs->trans(
"Services");
1145 print
'<div class="div-table-responsive-no-min">';
1146 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
1148 if (!empty($object->lines)) {
1152 $object->printObjectLines(
'', $mysoc, $object->thirdparty, $lineid, 0);
1160 if ($flag_price_may_change) {
1161 print
'<tr><td colspan="3" class="left">';
1162 print
'<select name="usenewprice" class="flat">';
1163 print
'<option value="0">'.$langs->trans(
"AlwaysUseFixedPrice").
'</option>';
1164 print
'<option value="1" disabled>'.$langs->trans(
"AlwaysUseNewPrice").
'</option>';
1170 print $form->buttonsSaveCancel(
"Create");
1180 if ($object->id > 0) {
1181 $object->fetch_thirdparty();
1185 if ($action ==
'ask_deleteline') {
1186 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'',
'no', 1);
1189 if ($action ==
'delete') {
1190 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'DeleteRepeatableInvoice'), $langs->trans(
'ConfirmDeleteRepeatableInvoice'),
'confirm_delete',
'',
'no', 1);
1194 $parameters = array(
'formConfirm' => $formconfirm);
1195 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1196 if (empty($reshook)) {
1197 $formconfirm .= $hookmanager->resPrint;
1198 } elseif ($reshook > 0) {
1199 $formconfirm = $hookmanager->resPrint;
1204 $author =
new User($db);
1205 $author->fetch($object->user_author);
1209 print
dol_get_fiche_head($head,
'card', $langs->trans(
"RepeatableInvoice"), -1,
'bill');
1213 $linkback =
'<a href="'.DOL_URL_ROOT.
'/compta/facture/invoicetemplate_list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1216 if ($action !=
'editref') {
1217 $morehtmlref .= $form->editfieldkey($object->ref,
'ref', $object->ref, $object, $user->hasRight(
'facture',
'creer'),
'',
'', 0, 2);
1219 $morehtmlref .= $form->editfieldval(
'',
'ref', $object->ref, $object, $user->hasRight(
'facture',
'creer'),
'string');
1222 $morehtmlref .=
'<div class="refidno">';
1227 $morehtmlref .= $langs->trans(
'ThirdParty').
' : '.$object->thirdparty->getNomUrl(1);
1229 if (isModEnabled(
'project')) {
1230 $langs->load(
"projects");
1231 $morehtmlref .=
'<br>'.$langs->trans(
'Project').
' ';
1232 if ($user->hasRight(
'facture',
'creer')) {
1233 if ($action !=
'classify') {
1234 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.newToken().
'&id='.$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> : ';
1236 if ($action ==
'classify') {
1238 $morehtmlref .=
'<form method="post" action="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'">';
1239 $morehtmlref .=
'<input type="hidden" name="action" value="classin">';
1240 $morehtmlref .=
'<input type="hidden" name="token" value="'.newToken().
'">';
1241 $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project,
'projectid', $maxlength, 0, 1, 0, 1, 0, 0,
'', 1);
1242 $morehtmlref .=
'<input type="submit" class="button valignmiddle" value="'.$langs->trans(
"Modify").
'">';
1243 $morehtmlref .=
'</form>';
1245 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->socid, $object->fk_project,
'none', 0, 0, 0, 1,
'',
'maxwidth300');
1248 if (!empty($object->fk_project)) {
1250 $proj->fetch($object->fk_project);
1251 $morehtmlref .=
' : '.$proj->getNomUrl(1);
1253 $morehtmlref .=
' - '.$proj->title;
1260 $morehtmlref .=
'</div>';
1262 $morehtmlright =
'';
1264 dol_banner_tab($object,
'ref', $linkback, 1,
'title',
'none', $morehtmlref,
'', 0,
'', $morehtmlright);
1266 print
'<div class="fichecenter">';
1267 print
'<div class="fichehalfleft">';
1268 print
'<div class="underbanner clearboth"></div>';
1270 print
'<table class="border centpercent tableforfield">';
1272 print
'<tr><td class="titlefield">'.$langs->trans(
"Author").
'</td><td>';
1273 print $author->getNomUrl(-1);
1276 print
'<tr><td>'.$langs->trans(
"AmountHT").
'</td>';
1277 print
'<td>'.price($object->total_ht,
'', $langs, 1, -1, -1, $conf->currency).
'</td>';
1280 print
'<tr><td>'.$langs->trans(
"AmountVAT").
'</td><td>'.
price($object->total_tva,
'', $langs, 1, -1, -1, $conf->currency).
'</td>';
1284 if (($mysoc->localtax1_assuj ==
"1" && $mysoc->useLocalTax(1)) || $object->total_localtax1 != 0) {
1285 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td>';
1286 print
'<td class="nowrap">'.price($object->total_localtax1, 1,
'', 1, - 1, - 1, $conf->currency).
'</td></tr>';
1288 if (($mysoc->localtax2_assuj ==
"1" && $mysoc->useLocalTax(2)) || $object->total_localtax2 != 0) {
1289 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td>';
1290 print
'<td class=nowrap">'.price($object->total_localtax2, 1,
'', 1, - 1, - 1, $conf->currency).
'</td></tr>';
1293 print
'<tr><td>'.$langs->trans(
"AmountTTC").
'</td><td colspan="3">'.
price($object->total_ttc,
'', $langs, 1, -1, -1, $conf->currency).
'</td>';
1299 print
'<table class="nobordernopadding centpercent"><tr><td>';
1300 print $langs->trans(
'PaymentConditionsShort');
1302 if ($action !=
'editconditions' && $user->hasRight(
'facture',
'creer')) {
1303 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>';
1305 print
'</tr></table>';
1308 if ($action ==
'editconditions') {
1309 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->cond_reglement_id,
'cond_reglement_id');
1311 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->cond_reglement_id,
'none');
1320 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1321 print $langs->trans(
'PaymentMode');
1323 if ($action !=
'editmode' && $user->hasRight(
'facture',
'creer')) {
1324 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>';
1326 print
'</tr></table>';
1328 if ($action ==
'editmode') {
1329 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
1331 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->mode_reglement_id,
'none');
1336 if (isModEnabled(
'multicurrency')) {
1340 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1341 print $form->editfieldkey(
'Currency',
'multicurrency_code',
'', $object, 0);
1343 if ($usercancreate && $action !=
'editmulticurrencycode' && !empty($object->brouillon)) {
1344 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>';
1346 print
'</tr></table>';
1348 $htmlname = (($usercancreate && $action ==
'editmulticurrencycode') ?
'multicurrency_code' :
'none');
1349 $form->form_multicurrency_code($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->multicurrency_code, $htmlname);
1353 if ($object->multicurrency_code != $conf->currency || $object->multicurrency_tx != 1) {
1356 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1357 print $form->editfieldkey(
'CurrencyRate',
'multicurrency_tx',
'', $object, 0);
1359 if ($usercancreate && $action !=
'editmulticurrencyrate' && !empty($object->brouillon) && $object->multicurrency_code && $object->multicurrency_code != $conf->currency) {
1360 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>';
1362 print
'</tr></table>';
1364 if ($action ==
'editmulticurrencyrate' || $action ==
'actualizemulticurrencyrate') {
1365 if ($action ==
'actualizemulticurrencyrate') {
1368 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->multicurrency_tx, ($usercancreate ?
'multicurrency_tx' :
'none'), $object->multicurrency_code);
1370 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->multicurrency_tx,
'none', $object->multicurrency_code);
1371 if ($object->statut == $object::STATUS_DRAFT && $object->multicurrency_code && $object->multicurrency_code != $conf->currency) {
1372 print
'<div class="inline-block"> ';
1373 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=actualizemulticurrencyrate">'.$langs->trans(
"ActualizeCurrency").
'</a>';
1383 if (!empty($object->frequency) && !empty($object->date_when)) {
1384 $dateexample = $object->date_when;
1390 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH__'] = $langs->trans(
"PreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'm'),
'%m').
')';
1391 $substitutionarray[
'__INVOICE_MONTH__'] = $langs->trans(
"MonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($dateexample,
'%m').
')';
1392 $substitutionarray[
'__INVOICE_NEXT_MONTH__'] = $langs->trans(
"NextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'm'),
'%m').
')';
1393 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH_TEXT__'] = $langs->trans(
"TextPreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'm'),
'%B').
')';
1394 $substitutionarray[
'__INVOICE_MONTH_TEXT__'] = $langs->trans(
"TextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($dateexample,
'%B').
')';
1395 $substitutionarray[
'__INVOICE_NEXT_MONTH_TEXT__'] = $langs->trans(
"TextNextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'm'),
'%B').
')';
1396 $substitutionarray[
'__INVOICE_PREVIOUS_YEAR__'] = $langs->trans(
"PreviousYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'y'),
'%Y').
')';
1397 $substitutionarray[
'__INVOICE_YEAR__'] = $langs->trans(
"YearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($dateexample,
'%Y').
')';
1398 $substitutionarray[
'__INVOICE_NEXT_YEAR__'] = $langs->trans(
"NextYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'y'),
'%Y').
')';
1400 $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').
')';
1401 $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').
')';
1402 $substitutionarray[
'__INVOICE_COUNTER_CURRENT__'] = $object->nb_gen_done;
1403 $substitutionarray[
'__INVOICE_COUNTER_MAX__'] = $object->nb_gen_max;
1405 $htmltext =
'<i>'.$langs->trans(
"FollowingConstantsWillBeSubstituted").
':<br>';
1406 foreach ($substitutionarray as $key => $val) {
1407 $htmltext .= $key.
' = '.$langs->trans($val).
'<br>';
1409 $htmltext .=
'</i>';
1413 print $form->editfieldkey($form->textwithpicto($langs->trans(
'NotePublic'), $htmltext, 1,
'help',
'', 0, 2,
'notepublic'),
'note_public', $object->note_public, $object, $user->hasRight(
'facture',
'creer'));
1414 print
'</td><td class="wordbreak">';
1415 print $form->editfieldval($langs->trans(
"NotePublic"),
'note_public', $object->note_public, $object, $user->hasRight(
'facture',
'creer'),
'textarea:'.ROWS_4.
':90%',
'',
null,
null,
'', 1);
1421 print $form->editfieldkey($form->textwithpicto($langs->trans(
"NotePrivate"), $htmltext, 1,
'help',
'', 0, 2,
'noteprivate'),
'note_private', $object->note_private, $object, $user->hasRight(
'facture',
'creer'));
1422 print
'</td><td class="wordbreak">';
1423 print $form->editfieldval($langs->trans(
"NotePrivate"),
'note_private', $object->note_private, $object, $user->hasRight(
'facture',
'creer'),
'textarea:'.ROWS_4.
':90%',
'',
null,
null,
'', 1);
1428 print
'<tr><td class="nowrap">';
1429 print
'<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
1430 print $langs->trans(
'BankAccount');
1432 if (($action !=
'editbankaccount') && $user->hasRight(
'facture',
'creer') && $object->statut ==
FactureRec::STATUS_DRAFT) {
1433 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>';
1435 print
'</tr></table>';
1437 if ($action ==
'editbankaccount') {
1438 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->fk_account,
'fk_account', 1);
1440 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->fk_account,
'none');
1446 print
'<tr><td class="nowrap">';
1447 print
'<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
1448 print $langs->trans(
'Model');
1450 if (($action !=
'editmodelpdf') && $user->hasRight(
'facture',
'creer') && $object->statut ==
FactureRec::STATUS_DRAFT) {
1451 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>';
1453 print
'</tr></table>';
1455 if ($action ==
'editmodelpdf') {
1456 include_once DOL_DOCUMENT_ROOT.
'/core/modules/facture/modules_facture.php';
1459 foreach ($models as $k => $model) {
1460 $list[] = str_replace(
':',
'|', $k).
':'.$model;
1462 $select =
'select;'.implode(
',', $list);
1463 print $form->editfieldval($langs->trans(
"Model"),
'modelpdf', $object->model_pdf, $object, $user->hasRight(
'facture',
'creer'), $select);
1465 print $object->model_pdf;
1472 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1477 print
'<div class="fichehalfright">';
1478 print
'<div class="underbanner clearboth"></div>';
1484 $title = $langs->trans(
"Recurrence");
1487 print
'<table class="border centpercent tableforfield">';
1489 print
'<tr><td colspan="2">'.img_picto(
'',
'recurring',
'class="pictofixedwidth"').$title.
'</td></tr>';
1492 print
'<tr><td style="width: 50%">';
1493 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1494 print $langs->trans(
'Frequency');
1496 if ($action !=
'editfrequency' && $user->hasRight(
'facture',
'creer')) {
1497 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>';
1499 print
'</tr></table>';
1501 if ($action ==
'editfrequency') {
1502 print
'<form method="post" action="'.$_SERVER[
"PHP_SELF"].
'?facid='.$object->id.
'">';
1503 print
'<input type="hidden" name="action" value="setfrequency">';
1504 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1505 print
'<table class="nobordernopadding">';
1507 print
"<input type='text' name='frequency' value='".$object->frequency.
"' size='5' /> ";
1508 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'));
1510 print
'<td class="left"><input type="submit" class="button button-edit smallpaddingimp" value="'.$langs->trans(
"Modify").
'"></td>';
1511 print
'</tr></table></form>';
1513 if ($object->frequency > 0) {
1514 print $langs->trans(
'FrequencyPer_'.$object->unit_frequency, $object->frequency);
1516 print
'<span class="opacitymedium">'.$langs->trans(
"NotARecurringInvoiceTemplate").
'</span>';
1523 if ($action ==
'date_when' || $object->frequency > 0) {
1524 print $form->editfieldkey($langs->trans(
"NextDateToExecution"),
'date_when', $object->date_when, $object, $user->hasRight(
'facture',
'creer'),
'day');
1526 print $langs->trans(
"NextDateToExecution");
1529 if ($action ==
'date_when' || $object->frequency > 0) {
1530 print $form->editfieldval($langs->trans(
"NextDateToExecution"),
'date_when', $object->date_when, $object, $user->hasRight(
'facture',
'creer'),
'day', $object->date_when,
null,
'',
'', 0,
'strikeIfMaxNbGenReached');
1533 if (!$object->isMaxNbGenReached()) {
1534 if (!$object->suspended && $action !=
'editdate_when' && $object->frequency > 0 && $object->date_when && $object->date_when < $now) {
1538 print
img_info($langs->trans(
"MaxNumberOfGenerationReached"));
1545 if ($action ==
'nb_gen_max' || $object->frequency > 0) {
1546 print $form->editfieldkey($langs->trans(
"MaxPeriodNumber"),
'nb_gen_max', $object->nb_gen_max, $object, $user->hasRight(
'facture',
'creer'));
1548 print $langs->trans(
"MaxPeriodNumber");
1551 if ($action ==
'nb_gen_max' || $object->frequency > 0) {
1552 print $form->editfieldval($langs->trans(
"MaxPeriodNumber"),
'nb_gen_max', $object->nb_gen_max ? $object->nb_gen_max :
'', $object, $user->hasRight(
'facture',
'creer'));
1561 if ($action ==
'auto_validate' || $object->frequency > 0) {
1562 print $form->editfieldkey($langs->trans(
"StatusOfGeneratedInvoices"),
'auto_validate', $object->auto_validate, $object, $user->hasRight(
'facture',
'creer'));
1564 print $langs->trans(
"StatusOfGeneratedInvoices");
1567 $select =
'select;0:'.$langs->trans(
'BillStatusDraft').
',1:'.$langs->trans(
'BillStatusValidated');
1568 if ($action ==
'auto_validate' || $object->frequency > 0) {
1569 print $form->editfieldval($langs->trans(
"StatusOfGeneratedInvoices"),
'auto_validate', $object->auto_validate, $object, $user->hasRight(
'facture',
'creer'), $select);
1573 if (!empty($conf->global->INVOICE_REC_CAN_DISABLE_DOCUMENT_FILE_GENERATION)) {
1576 if ($action ==
'generate_pdf' || $object->frequency > 0) {
1577 print $form->editfieldkey($langs->trans(
"StatusOfGeneratedDocuments"),
'generate_pdf', $object->generate_pdf, $object, $user->hasRight(
'facture',
'creer'));
1579 print $langs->trans(
"StatusOfGeneratedDocuments");
1583 $select =
'select;0:'.$langs->trans(
'DoNotGenerateDoc').
',1:'.$langs->trans(
'AutogenerateDoc');
1584 if ($action ==
'generate_pdf' || $object->frequency > 0) {
1585 print $form->editfieldval($langs->trans(
"StatusOfGeneratedDocuments"),
'generate_pdf', $object->generate_pdf, $object, $user->hasRight(
'facture',
'creer'), $select);
1590 print
'<input type="hidden" name="generate_pdf" value="1">';
1596 if ($object->frequency > 0) {
1599 if (!isModEnabled(
'cron')) {
1600 print
info_admin($langs->trans(
"EnableAndSetupModuleCron", $langs->transnoentitiesnoconv(
"Module2300Name")));
1603 print
'<div class="underbanner clearboth"></div>';
1604 print
'<table class="border centpercent tableforfield">';
1607 print
'<tr><td style="width: 50%">'.$langs->trans(
"NbOfGenerationDone").
'</td>';
1609 print $object->nb_gen_done ? $object->nb_gen_done :
'0';
1615 print $langs->trans(
"DateLastGeneration");
1629 print
'<div class="clearboth"></div><br>';
1633 print
'<form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.(($action !=
'editline') ?
'#add' :
'#line_'.
GETPOST(
'lineid',
'int')).
'" method="POST">';
1634 print
'<input type="hidden" name="token" value="' . newToken().
'">';
1635 print
'<input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">';
1636 print
'<input type="hidden" name="mode" value="">';
1637 print
'<input type="hidden" name="id" value="' . $object->id.
'">';
1638 print
'<input type="hidden" name="page_y" value="">';
1640 if (!empty($conf->use_javascript_ajax) && $object->statut == 0) {
1641 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
1644 print
'<div class="div-table-responsive-no-min">';
1645 print
'<table id="tablelines" class="noborder noshadow centpercent">';
1647 if (!empty($object->lines)) {
1648 $canchangeproduct = 1;
1649 $object->printObjectLines($action, $mysoc, $object->thirdparty, $lineid, 0);
1653 if ($object->statut == $object::STATUS_DRAFT && $user->hasRight(
'facture',
'creer') && $action !=
'valid' && $action !=
'editline') {
1654 if ($action !=
'editline') {
1657 $parameters = array();
1658 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
1659 if ($reshook < 0)
setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
1660 if (empty($reshook))
1661 $object->formAddObjectLine(0, $mysoc, $object->thirdparty);
1676 print
'<div class="tabsAction">';
1678 $parameters = array();
1679 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
1680 if (empty($reshook)) {
1683 'class' =>
'classfortooltip',
1686 if (empty($object->suspended)) {
1687 if ($user->hasRight(
'facture',
'creer')) {
1688 if (!empty($object->frequency) && $object->nb_gen_max > 0 && ($object->nb_gen_done >= $object->nb_gen_max)) {
1689 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="' .
dol_escape_htmltag($langs->trans(
"MaxGenerationReached")) .
'">' . $langs->trans(
"CreateBill") .
'</a></div>';
1691 if (empty($object->frequency) || $object->date_when <= $nowlasthour) {
1692 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>';
1694 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="' .
dol_escape_htmltag($langs->trans(
"DateIsNotEnough")) .
'">' . $langs->trans(
"CreateBill") .
'</a></div>';
1698 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#">' . $langs->trans(
"CreateBill") .
'</a></div>';
1702 if ($user->hasRight(
'facture',
'creer')) {
1703 if (empty($object->suspended)) {
1704 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>';
1706 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>';
1711 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"] .
'?id=' . $object->id .
'&action=delete&token=' . newToken(),
'delete', $user->hasRight(
'facture',
'supprimer'));
1717 print
'<div class="fichecenter"><div class="fichehalfleft">';
1718 print
'<a name="builddoc"></a>';
1722 $linktoelem = $form->showLinkToObjectBlock($object,
null, array(
'invoice'));
1724 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
1728 print
'<div class="fichehalfright">';
1733 $morehtmlcenter =
'';
1736 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
1738 $somethingshown =
$formactions->showactions($object, $object->element, (is_object($object->thirdparty) ? $object->thirdparty->id : 0), 1,
'', $MAXEVENT,
'', $morehtmlcenter);
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.
dol_get_last_hour($date, $gm='tzserver')
Return GMT time for last hour of a given GMT date (it replaces hours, min and second part to 23:59:59...
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='rowid', $fieldref='ref', $morehtmlref='', $moreparam='', $nodbprefix=0, $morehtmlleft='', $morehtmlstatus='', $onlybanner=0, $morehtmlright='')
Show tab footer of a card.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
dol_get_fiche_end($notab=0)
Return tab footer of a card.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
dol_htmlcleanlastbr($stringtodecode)
This function remove all ending and br at end.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='')
Show information for admin users or standard users.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
get_localtax($vatrate, $local, $thirdparty_buyer="", $thirdparty_seller="", $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $object=null, $include=null)
Return array of possible common substitutions.
img_edit($titlealt='default', $float=0, $other='')
Show logo editer/modifier fiche.
img_info($titlealt='default')
Show info logo.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
invoice_rec_prepare_head($object)
Return array head with list of tabs to view object informations.
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.