38require
'../../main.inc.php';
48require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture-rec.class.php';
49require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
50require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
52 include_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
54require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
55require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
56require_once DOL_DOCUMENT_ROOT.
'/core/lib/invoice.lib.php';
59$langs->loadLangs(array(
'bills',
'companies',
'compta',
'admin',
'other',
'products',
'banks'));
61$action =
GETPOST(
'action',
'aZ09');
62$massaction =
GETPOST(
'massaction',
'alpha');
64$confirm =
GETPOST(
'confirm',
'alpha');
65$cancel =
GETPOST(
'cancel',
'alpha');
66$toselect =
GETPOST(
'toselect',
'array:int');
67$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'invoicetemplatelist';
68$backtopage =
GETPOST(
'backtopage',
'alpha');
69$backtopageforcancel =
GETPOST(
'backtopageforcancel',
'alpha');
77 $socid = $user->socid;
79$objecttype =
'facture_rec';
80if ($action ==
"create" || $action ==
"add") {
85$year_date_when =
GETPOST(
'year_date_when');
86$month_date_when =
GETPOST(
'month_date_when');
87$selectedLines =
GETPOST(
'toselect',
'array:int');
90$sortfield =
GETPOST(
'sortfield',
'aZ09comma');
91$sortorder =
GETPOST(
'sortorder',
'aZ09comma');
93if (empty($page) || $page == -1) {
96$offset = $limit * $page;
101 $sortfield =
'f.titre';
103$pageprev = $page - 1;
104$pagenext = $page + 1;
107if (($id > 0 || $ref) && $action !=
'create' && $action !=
'add') {
108 $ret =
$object->fetch($id, $ref);
112 setEventMessages($langs->trans(
"ErrorRecordNotFound"),
null,
'errors');
117$hookmanager->initHooks(array(
'invoicereccard',
'globalcard'));
120$extrafields->fetch_name_optionals_label(
$object->table_element);
122$search_array_options = $extrafields->getOptionalsFromPost(
$object->table_element,
'',
'search_');
124$permissiontoadd = $user->hasRight(
'facture',
'creer');
125$permissionnote = $user->hasRight(
'facture',
'creer');
126$permissiondellink = $user->hasRight(
'facture',
'creer');
127$permissiontoedit = $user->hasRight(
'facture',
'creer');
128$permissiontoeditextra = $permissiontoadd;
129if (
GETPOST(
'attribute',
'aZ09') && isset($extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')])) {
131 $permissiontoeditextra =
dol_eval((
string) $extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')]);
134$usercanread = $user->hasRight(
'facture',
'lire');
135$usercancreate = $user->hasRight(
'facture',
'creer');
136$usercanissuepayment = $user->hasRight(
'facture',
'paiement');
137$usercandelete = $user->hasRight(
'facture',
'supprimer');
140$usercanvalidate = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'facture',
'invoice_advance',
'validate')));
141$usercansend = (!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || $user->hasRight(
'facture',
'invoice_advance',
'send'));
142$usercanreopen = (!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || $user->hasRight(
'facture',
'invoice_advance',
'reopen'));
143$usercanunvalidate = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !empty($usercancreate)) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'facture',
'invoice_advance',
'unvalidate')));
144$usermustrespectpricemin = ((
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'produit',
'ignore_price_min_advance')) || !
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS'));
147$usercanproductignorepricemin = ((
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'produit',
'ignore_price_min_advance')) || !
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS'));
148$usercancreatemargin = $user->hasRight(
"margins",
"creer");
149$usercanreadallmargin = $user->hasRight(
"margins",
"liretous");
150$usercancreatewithdrarequest = $user->hasRight(
"prelevement",
"bons",
"creer");
164if (
GETPOST(
'cancel',
'alpha')) {
165 if ($action !=
'updateline') {
173if (!
GETPOST(
'confirmmassaction',
'alpha') && $massaction !=
'presend' && $massaction !=
'confirm_presend') {
177$parameters = array(
'socid' => $socid);
178$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
180 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
183if (empty($reshook)) {
184 $backurlforlist = DOL_URL_ROOT.
'/compta/facture/invoicetemplate_list.php';
186 if (empty($backtopage) || ($cancel && empty($id))) {
187 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
188 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
189 $backtopage = $backurlforlist;
191 $backtopage = DOL_URL_ROOT.
'/compta/facture/invoicetemplate_list.php?id='.((!empty($id) &&
$id > 0) ? $id :
'__ID__');
199 if (!empty($backtopageforcancel)) {
200 header(
"Location: ".$backtopageforcancel);
202 } elseif (!empty($backtopage)) {
203 header(
"Location: ".$backtopage);
210 include DOL_DOCUMENT_ROOT.
'/core/actions_changeselectedfields.inc.php';
213 include DOL_DOCUMENT_ROOT.
'/core/actions_setnotes.inc.php';
215 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
217 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
226 if ($action ==
'add' && $usercancreate) {
227 if (!
GETPOST(
'title',
'alphanohtml')) {
228 setEventMessages($langs->transnoentities(
"ErrorFieldRequired", $langs->trans(
"Title")),
null,
'errors');
243 if (empty($reyear) || empty($remonth) || empty($reday)) {
244 setEventMessages($langs->transnoentities(
"ErrorFieldRequired", $langs->trans(
"Date")),
null,
'errors');
267 $object->rule_for_lines_dates =
GETPOST(
'rule_for_lines_dates',
'alpha');
269 $object->frequency = $frequency;
271 $object->nb_gen_max = $nb_gen_max;
275 $object->fk_project = $projectid;
277 $date_next_execution =
dol_mktime($rehour, $remin, 0, $remonth, $reday, $reyear);
278 $object->date_when = $date_next_execution;
280 $ret = $extrafields->setOptionalsFromPost(
null, $object);
282 setEventMessages($extrafields->error, $extrafields->errors,
'errors');
291 $srcObject->fetchObjectLinked();
293 if (!empty($srcObject->linkedObjectsIds[
'contrat'])) {
294 $contractidid = reset($srcObject->linkedObjectsIds[
'contrat']);
296 $object->origin_type =
'contrat';
297 $object->origin_id = $contractidid;
299 } elseif (!empty($srcObject->linkedObjectsIds[
'commande'])) {
300 $orderid = reset($srcObject->linkedObjectsIds[
'commande']);
302 $object->linked_objects[
'commande'] = $orderid;
303 } elseif (!empty($srcObject->linkedObjectsIds[
'propal'])) {
304 $proposalid = reset($srcObject->linkedObjectsIds[
'propal']);
305 $object->linked_objects[
'propal'] = $proposalid;
311 $oldinvoice =
new Facture($db);
314 $onlylines =
GETPOST(
'toselect',
'array:int');
316 $result =
$object->create($user, $oldinvoice->id, 0, $onlylines);
318 $result = $oldinvoice->delete($user, 1);
321 setEventMessages($oldinvoice->error, $oldinvoice->errors,
'errors');
333 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?facid='.
$object->id);
344 if ($action ==
'confirm_delete' && $confirm ==
'yes' && $user->hasRight(
'facture',
'supprimer')) {
346 $result =
$object->delete($user);
348 header(
"Location: ".DOL_URL_ROOT.
'/compta/facture/invoicetemplate_list.php');
357 if ($action ==
'setconditions' && $usercancreate) {
359 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModified", $langs->transnoentitiesnoconv(
"PaymentTerm"));
361 } elseif ($action ==
'setmode' && $usercancreate) {
363 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModified", $langs->transnoentitiesnoconv(
"PaymentMode"));
365 $object->setValueFrom(
'fk_societe_rib', 0);
368 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?facid='.
$object->id);
370 } elseif ($action ==
'classin' && $usercancreate) {
372 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModified", $langs->transnoentitiesnoconv(
"Project"));
374 } elseif ($action ==
'setref' && $usercancreate) {
376 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModifiedFromYToZ", $langs->transnoentitiesnoconv(
"Title"),
$object->title, $ref);
377 $result =
$object->setValueFrom(
'titre', $ref,
'',
null,
'text',
'', $user,
'BILLREC_MODIFY');
383 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
384 $langs->load(
"errors");
385 setEventMessages($langs->trans(
'ErrorRefAlreadyExists', $ref),
null,
'errors');
390 } elseif ($action ==
'setbankaccount' && $usercancreate) {
392 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModified", $langs->transnoentitiesnoconv(
"Bank"));
394 } elseif ($action ==
'setbankaccountcustomer' && $usercancreate) {
396 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModified", $langs->transnoentitiesnoconv(
"DebitBankAccount"));
397 $fk_societe_rib = (
GETPOSTINT(
'accountcustomerid') !=
"-1") ?
GETPOSTINT(
'accountcustomerid') : 0;
398 $result =
$object->setValueFrom(
'fk_societe_rib', $fk_societe_rib);
399 } elseif ($action ==
'setfrequency' && $usercancreate) {
401 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModified", $langs->transnoentitiesnoconv(
"Frequency"));
403 } elseif ($action ==
'setdate_when' && $usercancreate) {
409 } elseif ($action ==
'setnb_gen_max' && $usercancreate) {
412 } elseif ($action ==
'setauto_validate' && $usercancreate) {
415 } elseif ($action ==
'setEmailTemplate' && $usercancreate) {
418 } elseif ($action ==
'setgenerate_pdf' && $usercancreate) {
421 } elseif ($action ==
'setmodelpdf' && $usercancreate) {
424 } elseif ($action ==
'disable' && $usercancreate) {
428 $object->context[
'actionmsg'] = $langs->trans(
"RecordDisabled");
430 $res =
$object->setValueFrom(
'suspended', 1,
'',
null,
'text',
'', $user,
'BILLREC_MODIFY');
441 } elseif ($action ==
'enable' && $usercancreate) {
445 $object->context[
'actionmsg'] = $langs->trans(
"RecordEnabled");
447 $res =
$object->setValueFrom(
'suspended', 0,
'',
null,
'text',
'', $user,
'BILLREC_MODIFY');
458 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
460 $result =
$object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
462 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
466 } elseif ($action ==
'setruleforlinesdates' && $usercancreate) {
467 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModified", $langs->transnoentitiesnoconv(
"RuleForLinesDates"));
468 $ruleForLinesDates =
GETPOSTISSET(
'rule_for_lines_dates') ?
GETPOST(
'rule_for_lines_dates',
'alpha') :
'prepaid';
469 $object->setValueFrom(
'rule_for_lines_dates', $ruleForLinesDates);
473 if ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $usercancreate) {
484 if ($line->delete($user) > 0) {
485 $result =
$object->update_price(1);
492 setEventMessages($db->lasterror(),
null,
'errors');
496 setEventMessages($line->error, $line->errors,
'errors');
498 } elseif ($action ==
'confirm_delete_subtotalline' && $confirm ==
'yes' && $usercancreate) {
503 $result =
$object->deleteSubtotalLine($langs,
GETPOSTINT(
'lineid'), (
bool)
GETPOST(
'deletecorrespondingsubtotalline'), $user);
505 $result =
$object->update_price(1);
510 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.$id);
514 setEventMessages($db->lasterror(),
null,
'errors');
520 } elseif ($action ==
'update_extras' && $permissiontoeditextra) {
523 $attribute_name =
GETPOST(
'attribute',
'aZ09');
526 $ret = $extrafields->setOptionalsFromPost(
null, $object, $attribute_name);
532 $result =
$object->updateExtraField($attribute_name,
'BILLREC_MODIFY');
540 $action =
'edit_extras';
545 if ($action ==
'addline' && $usercancreate) {
546 $langs->load(
'errors');
554 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'alpha');
555 if ($prod_entry_mode ==
'free') {
561 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
566 $tva_tx = (
GETPOST(
'tva_tx',
'alpha') ?
GETPOST(
'tva_tx',
'alpha') : 0);
570 if (empty($remise_percent)) {
575 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
576 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
578 if (is_array($extralabelsline)) {
580 foreach ($extralabelsline as $key => $value) {
581 unset($_POST[
"options_".$key.$predef]);
585 if ((empty($idprod) || $idprod < 0) && ($price_ht < 0) && ((
float) $qty < 0)) {
586 setEventMessages($langs->trans(
'ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv(
'UnitPriceHT'), $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
589 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
590 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Type')),
null,
'errors');
593 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && (!($price_ht >= 0) || $price_ht ==
'')) {
594 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
598 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
601 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($product_desc)) {
602 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Description')),
null,
'errors');
606 $langs->load(
"errors");
607 setEventMessages($langs->trans(
'ErrorQtyForCustomerInvoiceCantBeNegative'),
null,
'errors');
611 if (!$error && ($qty >= 0) && (!empty($product_desc) || (!empty($idprod) && $idprod > 0))) {
614 dol_print_error($db,
$object->error);
617 $ret =
$object->fetch_thirdparty();
622 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
633 if (!empty($idprod) && $idprod > 0) {
635 $prod->fetch($idprod);
651 $pu_ht = $datapriceofproduct[
'pu_ht'];
652 $pu_ttc = $datapriceofproduct[
'pu_ttc'];
653 $price_min = $datapriceofproduct[
'price_min'];
654 $price_base_type = empty($datapriceofproduct[
'price_base_type']) ?
'HT' : $datapriceofproduct[
'price_base_type'];
658 $tmpvat = (float)
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
659 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string)
$prod->tva_tx));
662 if (!empty($price_ht)) {
664 $pu_ttc =
price2num((
float) $pu_ht * (1 + ($tmpvat / 100)),
'MU');
665 } elseif ($tmpvat != $tmpprodvat) {
668 if ($price_base_type !=
'HT') {
669 $pu_ht =
price2num((
float) $pu_ttc / (1 + ($tmpvat / 100)),
'MU');
671 $pu_ttc =
price2num((
float) $pu_ht * (1 + ($tmpvat / 100)),
'MU');
675 $outputlangs = $langs;
681 if (
GETPOST(
'lang_id',
'aZ09')) {
682 $newlang =
GETPOST(
'lang_id',
'aZ09');
684 if (empty($newlang)) {
685 $newlang =
$object->thirdparty->default_lang;
687 if (!empty($newlang)) {
689 $outputlangs->setDefaultLang($newlang);
690 $outputlangs->load(
'products');
693 $desc = (!empty(
$prod->multilangs [$outputlangs->defaultlang] [
"description"])) ?
$prod->multilangs [$outputlangs->defaultlang] [
"description"] :
$prod->
description;
695 $desc =
$prod->description;
703 if (!empty(
$prod->customcode)) {
704 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomsCode").
': '.
$prod->customcode;
706 if (!empty(
$prod->customcode) && !empty(
$prod->country_code)) {
709 if (!empty(
$prod->country_code)) {
710 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry(
$prod->country_code,
'', $db, $outputlangs, 0);
713 if (!empty(
$prod->customcode)) {
714 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomsCode").
': '.
$prod->customcode;
716 if (!empty(
$prod->customcode) && !empty(
$prod->country_code)) {
719 if (!empty(
$prod->country_code)) {
720 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry(
$prod->country_code,
'', $db, $langs, 0);
728 $fk_unit =
$prod->fk_unit;
732 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
733 $tva_tx = str_replace(
'*',
'', $tva_tx);
734 if (empty($tva_tx)) {
737 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
738 $desc = $product_desc;
743 $date_start_fill =
GETPOSTINT(
'date_start_fill');
747 $fournprice = (int) (
GETPOST(
'fournprice'.$predef) ?
GETPOST(
'fournprice'.$predef) :
'');
759 $fk_parent_line =
GETPOSTINT(
'fk_parent_line');
761 if ($usercanproductignorepricemin && (!empty($price_min) && ((
float)
price2num($pu_ht) * (1 - (
float)
price2num($remise_percent) / 100) < (
float)
price2num($price_min)))) {
762 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
763 setEventMessages($mesg,
null,
'errors');
766 $result =
$object->addline($desc, $pu_ht, (
float) $qty, $tva_tx, $localtax1_tx, $localtax2_tx, $idprod, $remise_percent, $price_base_type, $info_bits, 0, $pu_ttc, $type, -1, $special_code, $label, (
int) $fk_unit, 0, $date_start_fill, $date_end_fill, (
int) $fournprice, (
float) $buyingprice, $fk_parent_line);
771 if ($objectline->fetch($result)) {
772 $objectline->array_options = $array_options;
773 $result = $objectline->insertExtraFields();
775 setEventMessages($langs->trans(
'Error').$result,
null,
'errors');
799 unset($_POST[
'prod_entry_mode']);
801 unset($_POST[
'qty']);
802 unset($_POST[
'type']);
803 unset($_POST[
'remise_percent']);
804 unset($_POST[
'price_ht']);
805 unset($_POST[
'multicurrency_price_ht']);
806 unset($_POST[
'price_ttc']);
807 unset($_POST[
'tva_tx']);
808 unset($_POST[
'product_ref']);
809 unset($_POST[
'product_label']);
810 unset($_POST[
'product_desc']);
811 unset($_POST[
'fournprice']);
812 unset($_POST[
'buying_price']);
813 unset($_POST[
'np_marginRate']);
814 unset($_POST[
'np_markRate']);
815 unset($_POST[
'dp_desc']);
816 unset($_POST[
'idprod']);
817 unset($_POST[
'units']);
819 unset($_POST[
'date_starthour']);
820 unset($_POST[
'date_startmin']);
821 unset($_POST[
'date_startsec']);
822 unset($_POST[
'date_startday']);
823 unset($_POST[
'date_startmonth']);
824 unset($_POST[
'date_startyear']);
825 unset($_POST[
'date_endhour']);
826 unset($_POST[
'date_endmin']);
827 unset($_POST[
'date_endsec']);
828 unset($_POST[
'date_endday']);
829 unset($_POST[
'date_endmonth']);
830 unset($_POST[
'date_endyear']);
832 unset($_POST[
'date_start_fill']);
833 unset($_POST[
'date_end_fill']);
835 unset($_POST[
'situations']);
836 unset($_POST[
'progress']);
844 } elseif ($action ==
'confirm_addtextline' && $usercancreate) {
847 $langs->load(
'subtotals');
849 $desc =
GETPOST(
'subtotaltextcontent',
'restricthtml');
852 $result =
$object->addSubtotalLine($langs, $desc, 0, array());
863 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.$id);
865 } elseif ($action ==
'confirm_addtitleline' && $usercancreate) {
868 $langs->load(
'subtotals');
870 $desc =
GETPOST(
'subtotallinedesc',
'alphanohtml');
871 $depth =
GETPOSTINT(
'subtotallinelevel') ?? 1;
873 $subtotal_options = array();
875 foreach (FactureRec::$TITLE_OPTIONS as $option) {
876 $value =
GETPOST($option,
'alphanohtml');
878 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
883 $result =
$object->addSubtotalLine($langs, $desc, (
int) $depth, $subtotal_options);
894 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.$id);
896 } elseif ($action ==
'confirm_addsubtotalline' && $usercancreate) {
899 $langs->load(
'subtotals');
901 $choosen_line =
GETPOST(
'subtotaltitleline',
'alphanohtml');
902 foreach (
$object->lines as $line) {
903 if ($line->desc == $choosen_line && $line->special_code == SUBTOTALS_SPECIAL_CODE) {
905 $depth = -$line->qty;
909 $subtotal_options = array();
911 foreach (FactureRec::$SUBTOTAL_OPTIONS as $option) {
912 $value =
GETPOST($option,
'alphanohtml');
914 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
919 if (isset($desc) && isset($depth)) {
920 $result =
$object->addSubtotalLine($langs, $desc, (
int) $depth, $subtotal_options);
923 $object->errors[] = $langs->trans(
"CorrespondingTitleNotFound");
932 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.$id);
934 } elseif ($action ==
'updateline' && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
935 if (!
$object->fetch($id) > 0) {
936 dol_print_error($db);
958 if (preg_match(
'/\*/', $vat_rate)) {
963 $vat_rate = str_replace(
'*',
'', $vat_rate);
968 $fournprice = (int) (
GETPOST(
'fournprice') ?
GETPOST(
'fournprice') :
'');
972 $pu_equivalent = $pu_ht;
973 $pu_equivalent_ttc = $pu_ttc;
975 $currency_tx =
$object->multicurrency_tx;
979 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
980 $pu_equivalent = (float) $pu_ht_devise / (
float) $currency_tx;
982 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
983 $pu_equivalent_ttc = (float) $pu_ttc_devise / (
float) $currency_tx;
998 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
999 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
1002 if ($objectline->fetch(
GETPOSTINT(
'lineid'))) {
1003 $objectline->array_options = $array_options;
1004 $result = $objectline->insertExtraFields();
1006 setEventMessages($langs->trans(
'Error').$result,
null,
'errors');
1009 $position = ($objectline->rang >= 0 ? $objectline->rang : 0);
1012 if (is_array($extralabelsline)) {
1014 foreach ($extralabelsline as $key => $value) {
1015 unset($_POST[
"options_".$key]);
1021 if ($special_code == 3) {
1034 if (empty($remise_percent)) {
1035 $remise_percent = 0;
1038 $price_base_type =
'HT';
1040 if (empty($pu) && !empty($pu_ttc)) {
1042 $price_base_type =
'TTC';
1047 if (!empty($productid)) {
1049 $product->fetch($productid);
1051 $type = $product->type;
1053 $price_min = $product->price_min;
1055 $price_min = $product->multiprices_min[
$object->thirdparty->price_level];
1057 $price_min_ttc = $product->price_min_ttc;
1059 $price_min_ttc = $product->multiprices_min_ttc[
$object->thirdparty->price_level];
1068 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - (
float) $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
1069 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1070 setEventMessages($mesg,
null,
'errors');
1072 $action =
'editline';
1073 } elseif ($pu_equivalent_ttc && $price_min_ttc && (((
float)
price2num($pu_equivalent_ttc) * (1 - (
float) $remise_percent / 100)) < (
float)
price2num($price_min_ttc)) && $price_base_type ==
'TTC') {
1074 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1075 setEventMessages($mesg,
null,
'errors');
1077 $action =
'editline';
1082 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1086 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1091 $langs->load(
"errors");
1092 setEventMessages($langs->trans(
'ErrorQtyForCustomerInvoiceCantBeNegative'),
null,
'errors');
1096 $date_start_fill =
GETPOSTINT(
'date_start_fill');
1097 $date_end_fill =
GETPOSTINT(
'date_end_fill');
1098 $fk_parent_line =
GETPOST(
'fk_parent_line',
'int');
1102 $result =
$object->updateline(
1121 (
float) $pu_ht_devise,
1126 (
float) $buyingprice,
1127 (
int) $fk_parent_line
1151 unset($_POST[
'qty']);
1152 unset($_POST[
'type']);
1153 unset($_POST[
'productid']);
1154 unset($_POST[
'remise_percent']);
1155 unset($_POST[
'price_ht']);
1156 unset($_POST[
'multicurrency_price_ht']);
1157 unset($_POST[
'price_ttc']);
1158 unset($_POST[
'tva_tx']);
1159 unset($_POST[
'product_ref']);
1160 unset($_POST[
'product_label']);
1161 unset($_POST[
'product_desc']);
1162 unset($_POST[
'fournprice']);
1163 unset($_POST[
'buying_price']);
1164 unset($_POST[
'np_marginRate']);
1165 unset($_POST[
'np_markRate']);
1167 unset($_POST[
'dp_desc']);
1168 unset($_POST[
'idprod']);
1169 unset($_POST[
'units']);
1171 unset($_POST[
'date_starthour']);
1172 unset($_POST[
'date_startmin']);
1173 unset($_POST[
'date_startsec']);
1174 unset($_POST[
'date_startday']);
1175 unset($_POST[
'date_startmonth']);
1176 unset($_POST[
'date_startyear']);
1177 unset($_POST[
'date_endhour']);
1178 unset($_POST[
'date_endmin']);
1179 unset($_POST[
'date_endsec']);
1180 unset($_POST[
'date_endday']);
1181 unset($_POST[
'date_endmonth']);
1182 unset($_POST[
'date_endyear']);
1184 unset($_POST[
'situations']);
1185 unset($_POST[
'progress']);
1190 } elseif ($action ==
'updatetitleline' &&
GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1193 $langs->load(
'subtotals');
1195 $desc =
GETPOST(
'line_desc',
'alphanohtml') ?? $langs->trans(
"Title");
1198 $subtotal_options = array();
1200 foreach (Facture::$TITLE_OPTIONS as $option) {
1201 $value =
GETPOST($option,
'alphanohtml');
1203 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1208 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1219 } elseif ($action ==
'updatetextline' &&
GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1222 $langs->load(
'subtotals');
1224 $desc =
GETPOST(
'line_desc',
'restricthtml');
1227 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, 0, array());
1238 } elseif ($action ==
'updatesubtotalline' &&
GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1241 $langs->load(
'subtotals');
1243 $desc =
GETPOST(
'line_desc',
'alphanohtml');
1246 $subtotal_options = array();
1248 foreach (Facture::$SUBTOTAL_OPTIONS as $option) {
1249 $value =
GETPOST($option,
'alphanohtml');
1251 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1256 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1272$title =
$object->ref.
" - ".$langs->trans(
'Card');
1277$form =
new Form($db);
1282 $formproject =
null;
1284$companystatic =
new Societe($db);
1292if ($action ==
'create') {
1293 print
load_fiche_titre($langs->trans(
"CreateRepeatableInvoice"),
'',
'bill');
1295 $sourceInvoice =
new Facture($db);
1297 $product_static =
new Product($db);
1299 if ($sourceInvoice->fetch($id, $ref) > 0) {
1300 $result = $sourceInvoice->getLinesArray();
1302 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
1303 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1304 print
'<input type="hidden" name="action" value="add">';
1305 print
'<input type="hidden" name="facid" value="'.$sourceInvoice->id.
'">';
1314 if ($sourceInvoice->fk_account > 0) {
1318 print
'<table class="border centpercent">';
1320 $sourceInvoice->fetch_thirdparty();
1323 print
'<tr><td class="titlefieldcreate fieldrequired">'.$langs->trans(
"Title").
'</td><td>';
1324 print
'<input class="flat quatrevingtpercent" type="text" name="title" value="'.dol_escape_htmltag(
GETPOST(
"title",
'alphanohtml')).
'" autofocus>';
1328 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Customer").
'</td><td>'.$sourceInvoice->thirdparty->getNomUrl(1,
'customer').
'</td>';
1333 print
"<tr><td>".$langs->trans(
"InvoiceSubtype").
"</td><td>";
1334 print $form->getSelectInvoiceSubtype(
GETPOSTISSET(
'subtype') ?
GETPOSTINT(
'subtype') : $sourceInvoice->subtype,
'subtype', 0, 0,
'');
1338 $note_public =
GETPOSTISSET(
'note_public') ?
GETPOST(
'note_public',
'restricthtml') : $sourceInvoice->note_public;
1339 $note_private =
GETPOSTISSET(
'note_private') ?
GETPOST(
'note_private',
'restricthtml') : $sourceInvoice->note_private;
1342 $substitutionarray = getCommonSubstitutionArray($langs, 2,
null, $sourceInvoice);
1344 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH__'] = $langs->trans(
"PreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($sourceInvoice->date, -1,
'm'),
'%m').
')';
1345 $substitutionarray[
'__INVOICE_MONTH__'] = $langs->trans(
"MonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($sourceInvoice->date,
'%m').
')';
1346 $substitutionarray[
'__INVOICE_NEXT_MONTH__'] = $langs->trans(
"NextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($sourceInvoice->date, 1,
'm'),
'%m').
')';
1347 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH_TEXT__'] = $langs->trans(
"TextPreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($sourceInvoice->date, -1,
'm'),
'%B').
')';
1348 $substitutionarray[
'__INVOICE_MONTH_TEXT__'] = $langs->trans(
"TextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($sourceInvoice->date,
'%B').
')';
1349 $substitutionarray[
'__INVOICE_NEXT_MONTH_TEXT__'] = $langs->trans(
"TextNextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($sourceInvoice->date, 1,
'm'),
'%B').
')';
1350 $substitutionarray[
'__INVOICE_PREVIOUS_YEAR__'] = $langs->trans(
"PreviousYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($sourceInvoice->date, -1,
'y'),
'%Y').
')';
1351 $substitutionarray[
'__INVOICE_YEAR__'] = $langs->trans(
"YearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($sourceInvoice->date,
'%Y').
')';
1352 $substitutionarray[
'__INVOICE_NEXT_YEAR__'] = $langs->trans(
"NextYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($sourceInvoice->date, 1,
'y'),
'%Y').
')';
1354 $substitutionarray[
'__INVOICE_DATE_NEXT_INVOICE_BEFORE_GEN__'] = $langs->trans(
"DateNextInvoiceBeforeGen").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($sourceInvoice->date, 1,
'm'),
'dayhour').
')';
1355 $substitutionarray[
'__INVOICE_DATE_NEXT_INVOICE_AFTER_GEN__'] = $langs->trans(
"DateNextInvoiceAfterGen").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($sourceInvoice->date, 2,
'm'),
'dayhour').
')';
1356 $substitutionarray[
'__INVOICE_COUNTER_CURRENT__'] = $langs->trans(
"Count");
1357 $substitutionarray[
'__INVOICE_COUNTER_MAX__'] = $langs->trans(
"MaxPeriodNumber");
1359 $htmltext =
'<i>'.$langs->trans(
"FollowingConstantsWillBeSubstituted").
':<br>';
1360 foreach ($substitutionarray as $key => $val) {
1361 $htmltext .= $key.
' = '.$langs->trans($val).
'<br>';
1363 $htmltext .=
'</i>';
1366 print
"<tr><td>".$langs->trans(
"Author").
"</td><td>".$user->getFullName($langs).
"</td></tr>";
1369 print
"<tr><td>".$langs->trans(
"PaymentConditions").
"</td><td>";
1370 print $form->getSelectConditionsPaiements(
GETPOSTISSET(
'cond_reglement_id') ?
GETPOSTINT(
'cond_reglement_id') : $sourceInvoice->cond_reglement_id,
'cond_reglement_id', -1, 0, 0,
'');
1375 print
"<tr><td>".$langs->trans(
"PaymentMode").
"</td><td>";
1376 print img_picto(
'',
'payment',
'class="pictofixedwidth"');
1377 print $form->select_types_paiements((
string) (
GETPOSTISSET(
'mode_reglement_id') ?
GETPOSTINT(
'mode_reglement_id') : $sourceInvoice->mode_reglement_id),
'mode_reglement_id',
'', 0, 1, 0, 0, 1,
'', 1);
1382 print
"<tr><td>".$langs->trans(
'DebitBankAccount').
"</td><td>";
1383 $defaultRibId = $sourceInvoice->thirdparty->getDefaultRib();
1384 $form->selectRib(
GETPOSTISSET(
'accountcustomerid') ?
GETPOSTINT(
'accountcustomerid') : $defaultRibId,
'accountcustomerid',
'(fk_soc:=:'.$sourceInvoice->socid.
")", 1,
'', 1);
1388 $(document).ready(function() {
1389 if($("#selectmode_reglement_id option:selected").data("code") != "' . $factureRec::PAYMENTCODETOEDITSOCIETERIB .
'") {
1390 hideselectfksocieterib();
1392 $("#selectmode_reglement_id").change(function() {
1393 if($("#selectmode_reglement_id option:selected").data("code") != "'. $factureRec::PAYMENTCODETOEDITSOCIETERIB .
'") {
1394 hideselectfksocieterib(1);
1396 showselectfksocieterib();
1401 function hideselectfksocieterib(empty = 0){
1402 $("#selectaccountcustomerid").closest("tr").hide();
1404 $("#selectaccountcustomerid").val("-1").change();
1408 function showselectfksocieterib(){
1409 $("#selectaccountcustomerid").closest("tr").show();
1414 if ($sourceInvoice->fk_account > 0) {
1415 print
"<tr><td>".$langs->trans(
'BankAccount').
"</td><td>";
1416 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.$sourceInvoice->id, (
string) $sourceInvoice->fk_account,
'none');
1422 print
"<tr><td>".$langs->trans(
"RuleForLinesDates").
"</td><td>";
1423 print $form->getSelectRuleForLinesDates(
GETPOSTISSET(
'rule_for_lines_dates') ?
GETPOST(
'rule_for_lines_dates',
'alpha') : $factureRec->rule_for_lines_dates);
1431 $extralabels = $extrafields->fetch_name_optionals_label($draft->table_element);
1432 if ($draft->fetch_optionals() > 0) {
1433 $sourceInvoice->array_options = array_merge($sourceInvoice->array_options, $draft->array_options);
1436 print $sourceInvoice->showOptionals($extrafields,
'create', $parameters);
1439 if (
isModEnabled(
'project') && is_object($sourceInvoice->thirdparty) && $sourceInvoice->thirdparty->id > 0 && is_object($formproject)) {
1440 $projectid =
GETPOST(
'projectid') ?
GETPOST(
'projectid') : $sourceInvoice->fk_project;
1441 $langs->load(
'projects');
1442 print
'<tr><td>'.$langs->trans(
'Project').
'</td><td>';
1443 print img_picto(
'',
'project',
'class="pictofixedwidth"');
1444 $numprojet = $formproject->select_projects($sourceInvoice->thirdparty->id, $projectid,
'projectid', 0, 0, 1, 0, 0, 0, 0,
'', 0, 0,
'');
1445 print
' <a href="'.DOL_URL_ROOT.
'/projet/card.php?socid='.$sourceInvoice->thirdparty->id.
'&action=create&status=1&backtopage='.urlencode($_SERVER[
"PHP_SELF"].
'?action=create&socid='.$sourceInvoice->thirdparty->id.(!empty($id) ?
'&id='.$id :
'')).
'">'.img_object($langs->trans(
"AddProject"),
'add').
'</a>';
1450 print
"<tr><td>".$langs->trans(
'Model').
"</td><td>";
1451 include_once DOL_DOCUMENT_ROOT.
'/core/modules/facture/modules_facture.php';
1453 print img_picto(
'',
'generic',
'class="pictofixedwidth"');
1455 print $form->selectarray(
'modelpdf', $list,
$conf->global->FACTURE_ADDON_PDF);
1460 print
'<td class="tdtop">';
1461 print $form->textwithpicto($langs->trans(
'NotePublic'), $htmltext, 1,
'help',
'', 0, 2,
'notepublic');
1464 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1465 print $doleditor->Create(1);
1468 if (empty($user->socid)) {
1470 print
'<td class="tdtop">';
1471 print $form->textwithpicto($langs->trans(
'NotePrivate'), $htmltext, 1,
'help',
'', 0, 2,
'noteprivate');
1474 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1475 print $doleditor->Create(1);
1485 $title = $langs->trans(
"Recurrence");
1486 print
load_fiche_titre(img_picto(
'',
'recurring',
'class="pictofixedwidth"').$title,
'',
'');
1488 print
'<span class="opacitymedium">'.$langs->trans(
"ToCreateARecurringInvoiceGeneAuto", $langs->transnoentitiesnoconv(
'Module2300Name')).
'</span><br><br>';
1492 print
'<table class="border centpercent">';
1495 print
'<tr><td class="titlefieldcreate">'.$form->textwithpicto($langs->trans(
"Frequency"), $langs->transnoentitiesnoconv(
'toolTipFrequency')).
"</td><td>";
1496 print
'<input type="text" class="width50" name="frequency" value="'.GETPOST(
'frequency',
'int').
'"> ';
1497 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'));
1501 print
"<tr><td>".$form->textwithpicto($langs->trans(
'NextDateToExecution'), $langs->trans(
"NextDateToExecutionHelp")).
"</td><td>";
1503 print $form->selectDate($date_next_execution,
'', 1, 1, 0,
"add", 1, 1);
1507 print
"<tr><td>".$langs->trans(
"MaxPeriodNumber").
"</td><td>";
1508 print
'<input type="text" class="width50" name="nb_gen_max" value="'.GETPOSTINT(
'nb_gen_max').
'">';
1512 print
"<tr><td>".$langs->trans(
"StatusOfAutoGeneratedInvoices").
"</td><td>";
1513 $select = array(
'0' => $langs->trans(
'BillStatusDraft'),
'1' => $langs->trans(
'BillStatusValidated'),
'2' => $langs->trans(
'BillStatusValidatedWithSendind'));
1514 print $form->selectarray(
'auto_validate', $select,
GETPOSTINT(
'auto_validate'));
1518 print
"<tr id='col_auto_send_model_mail' class='".(GETPOSTINT(
'auto_validate') != 2 ?
'hidden' :
'').
"'><td>" . $langs->trans(
"EmailTemplateForAutoSend") .
"</td><td>";
1519 print $form->selectModelMail(
"auto_send_",
"facture_send", 1, 0,
GETPOSTINT(
'auto_send_model_mail'));
1522 $(document).ready(function() {
1523 $('#auto_validate').on('change', function () {
1524 if(+$(this).val() === 2) {
1525 $('#col_auto_send_model_mail').show();
1527 $('#col_auto_send_model_mail').hide();
1528 $('#select_auto_send_model_mail').val(0);
1536 print
"<tr><td>".$langs->trans(
"StatusOfGeneratedDocuments").
"</td><td>";
1537 $select = array(
'0' => $langs->trans(
'DoNotGenerateDoc'),
'1' => $langs->trans(
'AutoGenerateDoc'));
1538 print $form->selectarray(
'generate_pdf', $select,
GETPOSTINT(
'generate_pdf'));
1541 print
'<input type="hidden" name="generate_pdf" value="1">';
1549 $title = $langs->trans(
"ProductsAndServices");
1551 $title = $langs->trans(
"Products");
1553 $title = $langs->trans(
"Services");
1561 print
'<div class="div-table-responsive-no-min">';
1562 print
'<table id="tablelines" class="noborder noshadow centpercent nomarginbottom">';
1565 if (!empty($sourceInvoice->lines)) {
1566 $sourceInvoice->printOriginLinesList(
'', $selectedLines);
1575 if (!empty($flag_price_may_change)) {
1576 print
'<tr><td colspan="3" class="left">';
1577 print
'<select name="usenewprice" class="flat">';
1578 print
'<option value="0">'.$langs->trans(
"AlwaysUseFixedPrice").
'</option>';
1579 print
'<option value="1" disabled>'.$langs->trans(
"AlwaysUseNewPrice").
'</option>';
1587 print $form->buttonsSaveCancel(
"Create");
1591 dol_print_error(
null,
"Error, no invoice ".$sourceInvoice->id);
1600 if ($action ==
'ask_deleteline') {
1601 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'',
'no', 1);
1604 if ($action ==
'delete') {
1605 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DeleteRepeatableInvoice'), $langs->trans(
'ConfirmDeleteRepeatableInvoice'),
'confirm_delete',
'',
'no', 1);
1608 if ($action ==
'ask_subtotal_deleteline') {
1609 $langs->load(
"subtotals");
1610 $title =
"DeleteSubtotalLine";
1611 $question =
"ConfirmDeleteSubtotalLine";
1612 if (
GETPOST(
'type') ==
'title') {
1613 $formconfirm = array(array(
'type' =>
'checkbox',
'name' =>
'deletecorrespondingsubtotalline',
'label' => $langs->trans(
"DeleteCorrespondingSubtotalLine"),
'value' => 0));
1614 $title =
"DeleteTitleLine";
1615 $question =
"ConfirmDeleteTitleLine";
1617 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans($title), $langs->trans($question),
'confirm_delete_subtotalline', $formconfirm,
'no', 1);
1621 if ($action ==
'add_title_line') {
1622 $langs->load(
'subtotals');
1624 $depth_array =
$object->getPossibleLevels($langs);
1626 } elseif ($action ==
'add_subtotal_line') {
1627 $langs->load(
'subtotals');
1629 $titles =
$object->getPossibleTitles();
1631 } elseif ($action ==
'add_text_line') {
1632 $langs->load(
'subtotals');
1638 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
1639 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1640 if (empty($reshook)) {
1641 $formconfirm .= $hookmanager->resPrint;
1642 } elseif ($reshook > 0) {
1643 $formconfirm = $hookmanager->resPrint;
1648 $author =
new User($db);
1649 $author->fetch(
$object->user_creation_id);
1657 $linkback =
'<a href="'.DOL_URL_ROOT.
'/compta/facture/invoicetemplate_list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1660 if ($action !=
'editref') {
1661 $morehtmlref .= $form->editfieldkey(
$object->ref,
'ref',
$object->ref, $object, $user->hasRight(
'facture',
'creer'),
'',
'', 0, 2);
1663 $morehtmlref .= $form->editfieldval(
'',
'ref',
$object->ref, $object, $user->hasRight(
'facture',
'creer'),
'string');
1666 $morehtmlref .=
'<div class="refidno">';
1671 $morehtmlref .=
$object->thirdparty->getNomUrl(1,
'customer');
1674 $langs->load(
"projects");
1675 $morehtmlref .=
'<br>';
1676 if ($user->hasRight(
'facture',
'creer')) {
1677 $morehtmlref .= img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
1678 if ($action !=
'classify') {
1679 $morehtmlref .=
'<a class="editfielda" href="'.dolBuildUrl($_SERVER[
'PHP_SELF'], [
'action' =>
'classify',
'id' =>
$object->id],
true).
'">'.img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
1681 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->socid, (
string)
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
1683 if (!empty(
$object->fk_project)) {
1685 $proj->fetch(
$object->fk_project);
1686 $morehtmlref .=
' : '.$proj->getNomUrl(1);
1688 $morehtmlref .=
' - '.$proj->title;
1695 $morehtmlref .=
'</div>';
1697 $morehtmlstatus =
'';
1699 dol_banner_tab($object,
'ref', $linkback, 1,
'title',
'none', $morehtmlref,
'', 0,
'', $morehtmlstatus);
1701 print
'<div class="fichecenter">';
1702 print
'<div class="fichehalfleft">';
1703 print
'<div class="underbanner clearboth"></div>';
1705 print
'<table class="border centpercent tableforfield">';
1709 print
"<tr><td>".$langs->trans(
"InvoiceSubtype").
"</td><td>";
1711 print
$object->getSubtypeLabel(
'facture_rec');
1717 print
'<tr><td class="titlefieldmiddle">'.$langs->trans(
"Author").
'</td><td>';
1718 print $author->getNomUrl(-1);
1723 print
'<table class="nobordernopadding centpercent"><tr><td>';
1724 print $langs->trans(
'PaymentConditionsShort');
1726 if ($action !=
'editconditions' && $user->hasRight(
'facture',
'creer')) {
1727 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>';
1729 print
'</tr></table>';
1731 if ($action ==
'editconditions') {
1732 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id, (
string)
$object->cond_reglement_id,
'cond_reglement_id');
1734 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id, (
string)
$object->cond_reglement_id,
'none');
1740 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1741 print $langs->trans(
'PaymentMode');
1743 if ($action !=
'editmode' && $user->hasRight(
'facture',
'creer')) {
1744 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>';
1746 print
'</tr></table>';
1748 if ($action ==
'editmode') {
1749 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id, (
string)
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
1751 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id, (
string)
$object->mode_reglement_id,
'none');
1757 if (
$object->mode_reglement_code == $object::PAYMENTCODETOEDITSOCIETERIB) {
1758 print
'<tr><td class="nowrap">';
1759 print
'<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
1760 print $langs->trans(
'DebitBankAccount');
1764 print
'<td class="right"><a class="editfielda" href="' . $_SERVER[
"PHP_SELF"] .
'?action=editbankaccountcustomer&token=' .
newToken() .
'&id=' .
$object->id .
'">' . img_edit($langs->trans(
'SetDebitBankAccount'), 1) .
'</a></td>';
1766 print
'</tr></table>';
1769 if ($action ==
'editbankaccountcustomer') {
1770 $form->formRib($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->fk_societe_rib,
'accountcustomerid',
'fk_soc='.$object->socid, 1, 1);
1772 $form->formRib($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->fk_societe_rib,
'none',
'', 0, 1);
1779 print
'<tr><td class="nowrap">';
1780 print
'<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
1781 print $langs->trans(
'BankAccount');
1784 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>';
1786 print
'</tr></table>';
1788 if ($action ==
'editbankaccount') {
1789 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->fk_account,
'fk_account', 1);
1791 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->fk_account,
'none');
1799 print
'<table class="nobordernopadding centpercent"><tr><td>';
1800 print $langs->trans(
'RuleForLinesDates');
1802 if ($action !=
'editruleforlinesdates' && $user->hasRight(
'facture',
'creer')) {
1803 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editruleforlinesdates&token='.
newToken().
'&facid='.
$object->id.
'">'.img_edit($langs->trans(
'SetRuleForLinesDates'), 1).
'</a></td>';
1805 print
'</tr></table>';
1807 if ($action ==
'editruleforlinesdates') {
1808 $form->form_rule_for_lines_dates($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id,
$object->rule_for_lines_dates,
'rule_for_lines_dates');
1810 $form->form_rule_for_lines_dates($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id,
$object->rule_for_lines_dates,
'none');
1816 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1819 print
'<tr><td class="nowrap">';
1820 print
'<table class="nobordernopadding centpercent"><tr><td class="nowrap">';
1821 print $langs->trans(
'Model');
1824 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>';
1826 print
'</tr></table>';
1828 if ($action ==
'editmodelpdf') {
1829 include_once DOL_DOCUMENT_ROOT.
'/core/modules/facture/modules_facture.php';
1832 foreach ($models as $k => $model) {
1833 $list[] = str_replace(
':',
'|', $k).
':'.$model;
1835 $select =
'select;'.implode(
',', $list);
1836 print $form->editfieldval($langs->trans(
"Model"),
'modelpdf',
$object->model_pdf, $object, $user->hasRight(
'facture',
'creer'), $select);
1850 print
'<div class="fichehalfright">';
1852 print
'<!-- amounts -->'.
"\n";
1853 print
'<div class="underbanner clearboth"></div>'.
"\n";
1856 $title = $langs->trans(
"Recurrence");
1858 print
'<table class="border tableforfield centpercent">';
1860 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_currency_amount.tpl.php';
1868 print
'<tr><td class="titlefieldmiddle">'.$langs->trans(
"AmountHT").
'</td>';
1869 print
'<td class="nowraponall amountcard right">'.price($sign *
$object->total_ht, 0, $langs, 1, -1, -1,
$conf->currency).
'</td>';
1872 print
'<td class="nowraponall amountcard right">' .
price($sign *
$object->multicurrency_total_ht, 0, $langs, 0, -1, -1,
$object->multicurrency_code) .
'</td>';
1877 print
'<tr><td>'.$langs->trans(
"AmountVAT").
'</td>';
1878 print
'<td class="nowrap amountcard right">'.price($sign *
$object->total_tva, 0, $langs, 1, -1, -1,
$conf->currency).
'</td>';
1881 print
'<td class="nowraponall amountcard right">' .
price($sign *
$object->multicurrency_total_tva, 0, $langs, 0, -1, -1,
$object->multicurrency_code) .
'</td>';
1886 if ((
$mysoc->localtax1_assuj ==
"1" &&
$mysoc->useLocalTax(1)) ||
$object->total_localtax1 != 0) {
1888 print
'<td class="titlefieldmiddle">'.$langs->transcountry(
"AmountLT1",
$mysoc->country_code).
'</td>';
1889 print
'<td class="nowraponall amountcard right">'.price($sign *
$object->total_localtax1, 1,
'', 1, - 1, - 1,
$conf->currency).
'</td></tr>';
1893 print
'<td class="nowraponall amountcard right">' .
price($sign *
$object->multicurrency_total_localtax1, 0, $langs, 0, -1, -1,
$object->multicurrency_code) .
'</td>';
1898 if ((
$mysoc->localtax2_assuj ==
"1" &&
$mysoc->useLocalTax(2)) ||
$object->total_localtax2 != 0) {
1900 print
'<td>'.$langs->transcountry(
"AmountLT2",
$mysoc->country_code).
'</td>';
1901 print
'<td class=nowraponall amountcard right">'.price($sign *
$object->total_localtax2, 1,
'', 1, - 1, - 1,
$conf->currency).
'</td></tr>';
1905 print
'<td class="nowraponall amountcard right">' .
price($sign *
$object->multicurrency_total_localtax2, 0, $langs, 0, -1, -1,
$object->multicurrency_code) .
'</td>';
1966 print
'<tr><td>'.$langs->trans(
"AmountTTC").
'</td><td class="nowraponall amountcard right">'.
price($sign *
$object->total_ttc, 0, $langs, 1, -1, -1,
$conf->currency).
'</td>';
1969 print
'<td class="nowrap amountcard right">' .
price($sign *
$object->multicurrency_total_ttc, 0, $langs, 0, -1, -1,
$object->multicurrency_code) .
'</td>';
1974 print
'<tr class="liste_titre"><td class="liste_titre">'.img_picto(
'',
'recurring',
'class="pictofixedwidth"').$title.
'</td>';
1982 print
'<tr><td style="width: 50%">';
1983 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1984 print $langs->trans(
'Frequency');
1986 if ($action !=
'editfrequency' && $user->hasRight(
'facture',
'creer')) {
1987 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>';
1989 print
'</tr></table>';
1991 if ($action ==
'editfrequency') {
1992 print
'<form method="post" action="'.$_SERVER[
"PHP_SELF"].
'?facid='.
$object->id.
'">';
1993 print
'<input type="hidden" name="action" value="setfrequency">';
1994 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1995 print
'<table class="nobordernopadding">';
1997 print
'<input type="text" name="frequency" class="width50 marginrightonly right" value="'.$object->frequency.
'">';
1998 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'));
2000 print
'<td class="left"><input type="submit" class="button button-edit smallpaddingimp" value="'.$langs->trans(
"Modify").
'"></td>';
2001 print
'</tr></table></form>';
2004 print $langs->trans(
'FrequencyPer_'.
$object->unit_frequency,
$object->frequency);
2006 print
'<span class="opacitymedium">'.$langs->trans(
"NotARecurringInvoiceTemplate").
'</span>';
2018 if ($action ==
'date_when' ||
$object->frequency > 0) {
2019 print $form->editfieldkey($form->textwithpicto($langs->trans(
"NextDateToExecution"), $langs->trans(
"NextDateToExecutionHelp")),
'date_when',
$object->date_when, $object, $user->hasRight(
'facture',
'creer'),
'day');
2021 print $form->textwithpicto($langs->trans(
"NextDateToExecution"), $langs->trans(
"NextDateToExecutionHelp"));
2024 if ($action ==
'date_when' ||
$object->frequency > 0) {
2025 print $form->editfieldval($langs->trans(
"NextDateToExecution"),
'date_when',
$object->date_when, $object, $user->hasRight(
'facture',
'creer'),
'day',
$object->date_when,
null,
'',
'', 0,
'strikeIfMaxNbGenReached');
2028 if (!
$object->isMaxNbGenReached()) {
2030 print img_warning($langs->trans(
"Late"));
2033 print img_info($langs->trans(
"MaxNumberOfGenerationReached"));
2043 if ($action ==
'nb_gen_max' ||
$object->frequency > 0) {
2044 print $form->editfieldkey($langs->trans(
"MaxPeriodNumber"),
'nb_gen_max', (
string)
$object->nb_gen_max, $object, $user->hasRight(
'facture',
'creer'));
2046 print $langs->trans(
"MaxPeriodNumber");
2049 if ($action ==
'nb_gen_max' ||
$object->frequency > 0) {
2050 print $form->editfieldval($langs->trans(
"MaxPeriodNumber"),
'nb_gen_max',
$object->nb_gen_max ?
$object->nb_gen_max :
'',
$object, $user->hasRight(
'facture',
'creer'));
2062 if ($action ==
'auto_validate' ||
$object->frequency > 0) {
2063 print $form->editfieldkey($langs->trans(
"StatusOfAutoGeneratedInvoices"),
'auto_validate', (
string)
$object->auto_validate, $object, $user->hasRight(
'facture',
'creer'));
2065 print $langs->trans(
"StatusOfAutoGeneratedInvoices");
2068 $select =
'select;0:' . $langs->trans(
'BillStatusDraft') .
',1:' . $langs->trans(
'BillStatusValidated') .
',2:' . $langs->trans(
'BillStatusValidatedWithSendind');
2069 if ($action ==
'auto_validate' ||
$object->frequency > 0) {
2070 print $form->editfieldval($langs->trans(
"StatusOfAutoGeneratedInvoices"),
'auto_validate',
$object->auto_validate, $object, $user->hasRight(
'facture',
'creer'), $select);
2080 print
'<tr><td style="width: 50%">';
2081 print
'<table class="nobordernopadding" width="100%"><tr><td>';
2082 print $langs->trans(
"EmailTemplateForAutoSend");
2084 if ($action !=
'editEmailTemplate' && $user->hasRight(
'facture',
'creer')) {
2085 print
'<td class="right"><a class="editfielda" href="' . $_SERVER[
"PHP_SELF"] .
'?action=editEmailTemplate&token=' .
newToken() .
'&facid=' .
$object->id .
'">' . img_edit($langs->trans(
'Edit'), 1) .
'</a></td>';
2087 print
'</tr></table>';
2090 if ($action ==
'editEmailTemplate') {
2092 print
'<form method="POST" action="' . $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id .
'">';
2093 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
2094 print
'<input type="hidden" name="action" value="setEmailTemplate">';
2095 print $form->selectModelMail(
"auto_send_",
"facture_send", 1, 0,
$object->fk_email_template);
2096 print
'<input type="submit" class="button valignmiddle smallpaddingimp" name="modify" value="' . $langs->trans(
"Modify") .
'">';
2097 print
'<input type="submit" class="button button-cancel valignmiddle smallpaddingimp" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
2101 if (!empty(
$object->fk_email_template)) {
2102 $sql =
"SELECT label
2103 FROM ".$db->prefix().
"c_email_templates
2104 WHERE rowid = ".((int)
$object->fk_email_template);
2105 $result = $db->query($sql);
2107 if ($obj = $db->fetch_object($result)) {
2112 print $langs->trans(
'DefaultMailModel');
2124 if ($action ==
'generate_pdf' ||
$object->frequency > 0) {
2125 print $form->editfieldkey($langs->trans(
"StatusOfGeneratedDocuments"),
'generate_pdf', (string)
$object->generate_pdf, $object, $user->hasRight(
'facture',
'creer'));
2127 print $langs->trans(
"StatusOfGeneratedDocuments");
2131 $select =
'select;0:'.$langs->trans(
'DoNotGenerateDoc').
',1:'.$langs->trans(
'AutogenerateDoc');
2132 if ($action ==
'generate_pdf' ||
$object->frequency > 0) {
2133 print $form->editfieldval($langs->trans(
"StatusOfGeneratedDocuments"),
'generate_pdf',
$object->generate_pdf,
$object, $user->hasRight(
'facture',
'creer'), $select);
2141 print
'<input type="hidden" name="generate_pdf" value="1">';
2152 print
info_admin($langs->trans(
"EnableAndSetupModuleCron", $langs->transnoentitiesnoconv(
"Module2300Name")));
2155 print
'<div class="underbanner clearboth"></div>';
2156 print
'<table class="border centpercent tableforfield">';
2159 print
'<tr><td style="width: 50%">'.$langs->trans(
"NbOfGenerationDone").
'</td>';
2167 print $langs->trans(
"DateLastGeneration");
2181 print
'<div class="clearboth"></div><br>';
2185 print
'<form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.(($action !=
'editline') ?
'#add' :
'#line_'.
GETPOSTINT(
'lineid')).
'" method="POST">';
2186 print
'<input type="hidden" name="token" value="' .
newToken().
'">';
2187 print
'<input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">';
2188 print
'<input type="hidden" name="mode" value="">';
2189 print
'<input type="hidden" name="id" value="' .
$object->id.
'">';
2190 print
'<input type="hidden" name="page_y" value="">';
2192 if (!empty(
$conf->use_javascript_ajax) &&
$object->status == 0) {
2194 include DOL_DOCUMENT_ROOT.
'/core/tpl/subtotal_ajaxrow.tpl.php';
2196 include DOL_DOCUMENT_ROOT .
'/core/tpl/ajaxrow.tpl.php';
2200 print
'<div class="div-table-responsive-no-min">';
2201 print
'<table id="tablelines" class="noborder noshadow centpercent nomarginbottom">';
2204 $canchangeproduct = 1;
2209 if (
$object->status == $object::STATUS_DRAFT && $user->hasRight(
'facture',
'creer') && $action !=
'valid' && $action !=
'editline') {
2210 if ($action !=
'editline') {
2213 $parameters = array();
2214 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
2216 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
2218 if (empty($reshook)) {
2235 print
'<div class="tabsAction">';
2237 $parameters = array();
2238 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
2239 if (empty($reshook)) {
2242 'class' =>
'classfortooltip',
2249 $langs->load(
"subtotals");
2251 $url_button = array();
2253 $url_button[] = array(
2254 'lang' =>
'subtotals',
2256 'perm' => (
bool) $usercancreate,
2257 'label' => $langs->trans(
'AddTitleLine'),
2258 'url' =>
'/compta/facture/card-rec.php?id='.$object->id.
'&action=add_title_line&token='.
newToken()
2261 $url_button[] = array(
2262 'lang' =>
'subtotals',
2264 'perm' => (
bool) $usercancreate,
2265 'label' => $langs->trans(
'AddSubtotalLine'),
2266 'url' =>
'/compta/facture/card-rec.php?id='.$object->id.
'&action=add_subtotal_line&token='.
newToken()
2269 $url_button[] = array(
2270 'lang' =>
'subtotals',
2272 'perm' => (
bool) $usercancreate,
2273 'label' => $langs->trans(
'AddTextLine'),
2274 'url' =>
'/compta/facture/card-rec.php?id='.$object->id.
'&action=add_text_line&token='.
newToken()
2276 print dolGetButtonAction(
'', $langs->trans(
'SubTotal'),
'default', $url_button,
'',
true);
2279 if (empty(
$object->suspended)) {
2280 if ($user->hasRight(
'facture',
'creer')) {
2282 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="' .
dol_escape_htmltag($langs->trans(
"MaxGenerationReached")) .
'">' . $langs->trans(
"CreateBill") .
'</a></div>';
2284 if (empty(
$object->frequency) ||
$object->date_when <= $nowlasthour) {
2285 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>';
2287 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="' .
dol_escape_htmltag($langs->trans(
"DateIsNotEnough")) .
'">' . $langs->trans(
"CreateBill") .
'</a></div>';
2291 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#">' . $langs->trans(
"CreateBill") .
'</a></div>';
2295 if ($user->hasRight(
'facture',
'creer')) {
2296 if (empty(
$object->suspended)) {
2297 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>';
2299 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>';
2304 print dolGetButtonAction($langs->trans(
"Delete"), $langs->trans(
"Delete"),
'delete', $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=delete&token=' .
newToken(),
'delete', $user->hasRight(
'facture',
'supprimer'), array(
'attr' => array(
'class' =>
'reposition'))).
"\n";
2310 print
'<div class="fichecenter"><div class="fichehalfleft">';
2311 print
'<a name="builddoc"></a>';
2315 $tmparray = $form->showLinkToObjectBlock($object, array(), array(
'invoice'), 1);
2316 $linktoelem = $tmparray[
'linktoelem'];
2317 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
2318 print $htmltoenteralink;
2320 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
2324 print
'<div class="fichehalfright">';
2328 $morehtmlcenter =
'<div class="nowraponall">';
2330 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'FullList'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/compta/facture/agenda-rec.php?id='.
$object->id);
2331 $morehtmlcenter .=
'</div>';
2334 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
2336 $somethingshown = $formactions->showactions($object,
$object->element, (is_object(
$object->thirdparty) ?
$object->thirdparty->id : 0), 1,
'', $MAXEVENT,
'', $morehtmlcenter);
2341 print $langs->trans(
"NoRecordFound");
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $object
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
const STATUS_DRAFT
Draft status.
Class to manage a WYSIWYG editor.
Class to manage invoices.
const TYPE_REPLACEMENT
Replacement invoice.
const STATUS_DRAFT
Draft status.
const TYPE_STANDARD
Standard 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.
Class to manage products or services.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
Class to manage Dolibarr users.
getCountry($searchkey, $withcode='', $dbtouse=null, $outputlangs=null, $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
dol_get_last_hour($date, $gm='tzserver')
Return GMT time for last hour of a given GMT date (it replaces hours, min and second part to 23:59:59...
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
$date_start
Variables from include:
dol_now($mode='gmt')
Return date for now.
recordNotFound($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Displays an error page when a record is not found.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
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.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
GETPOSTFLOAT($paramname, $rounding='', $option=2)
Return the value of a $_GET or $_POST supervariable, converted into float.
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...
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_clone($srcobject, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular VAT rate, when selling a product with vat $vatrate,...
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='', $textonpictotooltip='', $cssfordropdown='info_admin')
Show information in HTML for admin users or standard users.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
invoice_rec_prepare_head($object)
Return array head with list of tabs to view object information.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $nodie=0, $mode='')
Check permissions of a user to show a page and an object.