37require
'../../main.inc.php';
47require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture-rec.class.php';
48require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
49require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
51 include_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
53require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
54require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
55require_once DOL_DOCUMENT_ROOT.
'/core/lib/invoice.lib.php';
58$langs->loadLangs(array(
'bills',
'companies',
'compta',
'admin',
'other',
'products',
'banks'));
60$action =
GETPOST(
'action',
'aZ09');
61$massaction =
GETPOST(
'massaction',
'alpha');
63$confirm =
GETPOST(
'confirm',
'alpha');
64$cancel =
GETPOST(
'cancel',
'alpha');
65$toselect =
GETPOST(
'toselect',
'array:int');
66$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'invoicetemplatelist';
67$backtopage =
GETPOST(
'backtopage',
'alpha');
68$backtopageforcancel =
GETPOST(
'backtopageforcancel',
'alpha');
76 $socid = $user->socid;
78$objecttype =
'facture_rec';
79if ($action ==
"create" || $action ==
"add") {
84$year_date_when =
GETPOST(
'year_date_when');
85$month_date_when =
GETPOST(
'month_date_when');
86$selectedLines =
GETPOST(
'toselect',
'array:int');
89$sortfield =
GETPOST(
'sortfield',
'aZ09comma');
90$sortorder =
GETPOST(
'sortorder',
'aZ09comma');
92if (empty($page) || $page == -1) {
95$offset = $limit * $page;
100 $sortfield =
'f.titre';
102$pageprev = $page - 1;
103$pagenext = $page + 1;
106if (($id > 0 || $ref) && $action !=
'create' && $action !=
'add') {
107 $ret =
$object->fetch($id, $ref);
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);
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);
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;
314 $onlylines =
GETPOST(
'toselect',
'array:int');
316 $result =
$object->create($user, $oldinvoice->id, 0, $onlylines);
318 $result = $oldinvoice->delete($user, 1);
333 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?facid='.
$object->id);
344 if ($action ==
'confirm_delete' && $confirm ==
'yes' && $user->hasRight(
'facture',
'supprimer')) {
347 header(
"Location: ".DOL_URL_ROOT.
'/compta/facture/invoicetemplate_list.php');
353 if ($action ==
'setconditions' && $usercancreate) {
355 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModified", $langs->transnoentitiesnoconv(
"PaymentTerm"));
357 } elseif ($action ==
'setmode' && $usercancreate) {
359 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModified", $langs->transnoentitiesnoconv(
"PaymentMode"));
361 $object->setValueFrom(
'fk_societe_rib', 0);
364 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?facid='.
$object->id);
366 } elseif ($action ==
'classin' && $usercancreate) {
368 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModified", $langs->transnoentitiesnoconv(
"Project"));
370 } elseif ($action ==
'setref' && $usercancreate) {
372 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModifiedFromYToZ", $langs->transnoentitiesnoconv(
"Title"),
$object->title, $ref);
373 $result =
$object->setValueFrom(
'titre', $ref,
'',
null,
'text',
'', $user,
'BILLREC_MODIFY');
379 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
380 $langs->load(
"errors");
381 setEventMessages($langs->trans(
'ErrorRefAlreadyExists', $ref),
null,
'errors');
386 } elseif ($action ==
'setbankaccount' && $usercancreate) {
388 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModified", $langs->transnoentitiesnoconv(
"Bank"));
390 } elseif ($action ==
'setbankaccountcustomer' && $usercancreate) {
392 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModified", $langs->transnoentitiesnoconv(
"DebitBankAccount"));
393 $fk_societe_rib = (
GETPOSTINT(
'accountcustomerid') !=
"-1") ?
GETPOSTINT(
'accountcustomerid') : 0;
394 $result =
$object->setValueFrom(
'fk_societe_rib', $fk_societe_rib);
395 } elseif ($action ==
'setfrequency' && $usercancreate) {
397 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModified", $langs->transnoentitiesnoconv(
"Frequency"));
399 } elseif ($action ==
'setdate_when' && $usercancreate) {
405 } elseif ($action ==
'setnb_gen_max' && $usercancreate) {
408 } elseif ($action ==
'setauto_validate' && $usercancreate) {
411 } elseif ($action ==
'setEmailTemplate' && $usercancreate) {
414 } elseif ($action ==
'setgenerate_pdf' && $usercancreate) {
417 } elseif ($action ==
'setmodelpdf' && $usercancreate) {
420 } elseif ($action ==
'disable' && $usercancreate) {
424 $object->context[
'actionmsg'] = $langs->trans(
"RecordDisabled");
426 $res =
$object->setValueFrom(
'suspended', 1,
'',
null,
'text',
'', $user,
'BILLREC_MODIFY');
437 } elseif ($action ==
'enable' && $usercancreate) {
441 $object->context[
'actionmsg'] = $langs->trans(
"RecordEnabled");
443 $res =
$object->setValueFrom(
'suspended', 0,
'',
null,
'text',
'', $user,
'BILLREC_MODIFY');
454 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
456 $result =
$object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
458 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
462 } elseif ($action ==
'setruleforlinesdates' && $usercancreate) {
463 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModified", $langs->transnoentitiesnoconv(
"RuleForLinesDates"));
464 $ruleForLinesDates = GETPOSTISSET(
'rule_for_lines_dates') ?
GETPOST(
'rule_for_lines_dates',
'alpha') :
'prepaid';
465 $object->setValueFrom(
'rule_for_lines_dates', $ruleForLinesDates);
469 if ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $usercancreate) {
480 if ($line->delete($user) > 0) {
481 $result =
$object->update_price(1);
494 } elseif ($action ==
'confirm_delete_subtotalline' && $confirm ==
'yes' && $usercancreate) {
499 $result =
$object->deleteSubtotalLine($langs,
GETPOSTINT(
'lineid'), (
bool)
GETPOST(
'deletecorrespondingsubtotalline'), $user);
501 $result =
$object->update_price(1);
506 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.$id);
516 } elseif ($action ==
'update_extras' && $permissiontoeditextra) {
519 $attribute_name =
GETPOST(
'attribute',
'aZ09');
522 $ret = $extrafields->setOptionalsFromPost(
null, $object, $attribute_name);
528 $result =
$object->updateExtraField($attribute_name,
'BILLREC_MODIFY');
536 $action =
'edit_extras';
541 if ($action ==
'addline' && $usercancreate) {
542 $langs->load(
'errors');
547 $product_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
550 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'alpha');
551 if ($prod_entry_mode ==
'free') {
557 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
562 $tva_tx = (
GETPOST(
'tva_tx',
'alpha') ?
GETPOST(
'tva_tx',
'alpha') : 0);
566 if (empty($remise_percent)) {
571 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
572 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
574 if (is_array($extralabelsline)) {
576 foreach ($extralabelsline as $key => $value) {
577 unset($_POST[
"options_".$key.$predef]);
581 if ((empty($idprod) || $idprod < 0) && ($price_ht < 0) && ((
float) $qty < 0)) {
582 setEventMessages($langs->trans(
'ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv(
'UnitPriceHT'), $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
585 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
586 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Type')),
null,
'errors');
589 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && (!($price_ht >= 0) || $price_ht ==
'')) {
590 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
594 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
597 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($product_desc)) {
598 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Description')),
null,
'errors');
602 $langs->load(
"errors");
603 setEventMessages($langs->trans(
'ErrorQtyForCustomerInvoiceCantBeNegative'),
null,
'errors');
607 if (!$error && ($qty >= 0) && (!empty($product_desc) || (!empty($idprod) && $idprod > 0))) {
613 $ret =
$object->fetch_thirdparty();
618 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
629 if (!empty($idprod) && $idprod > 0) {
631 $prod->fetch($idprod);
647 $pu_ht = $datapriceofproduct[
'pu_ht'];
648 $pu_ttc = $datapriceofproduct[
'pu_ttc'];
649 $price_min = $datapriceofproduct[
'price_min'];
650 $price_base_type = empty($datapriceofproduct[
'price_base_type']) ?
'HT' : $datapriceofproduct[
'price_base_type'];
654 $tmpvat = (float)
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
655 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string)
$prod->tva_tx));
658 if (!empty($price_ht)) {
660 $pu_ttc =
price2num((
float) $pu_ht * (1 + ($tmpvat / 100)),
'MU');
661 } elseif ($tmpvat != $tmpprodvat) {
664 if ($price_base_type !=
'HT') {
665 $pu_ht =
price2num((
float) $pu_ttc / (1 + ($tmpvat / 100)),
'MU');
667 $pu_ttc =
price2num((
float) $pu_ht * (1 + ($tmpvat / 100)),
'MU');
671 $outputlangs = $langs;
677 if (
GETPOST(
'lang_id',
'aZ09')) {
678 $newlang =
GETPOST(
'lang_id',
'aZ09');
680 if (empty($newlang)) {
681 $newlang =
$object->thirdparty->default_lang;
683 if (!empty($newlang)) {
685 $outputlangs->setDefaultLang($newlang);
686 $outputlangs->load(
'products');
689 $desc = (!empty(
$prod->multilangs [$outputlangs->defaultlang] [
"description"])) ?
$prod->multilangs [$outputlangs->defaultlang] [
"description"] :
$prod->
description;
691 $desc =
$prod->description;
699 if (!empty(
$prod->customcode)) {
700 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomsCode").
': '.
$prod->customcode;
702 if (!empty(
$prod->customcode) && !empty(
$prod->country_code)) {
705 if (!empty(
$prod->country_code)) {
706 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry(
$prod->country_code,
'',
$db, $outputlangs, 0);
709 if (!empty(
$prod->customcode)) {
710 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomsCode").
': '.
$prod->customcode;
712 if (!empty(
$prod->customcode) && !empty(
$prod->country_code)) {
715 if (!empty(
$prod->country_code)) {
716 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry(
$prod->country_code,
'',
$db, $langs, 0);
724 $fk_unit =
$prod->fk_unit;
728 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
729 $tva_tx = str_replace(
'*',
'', $tva_tx);
730 if (empty($tva_tx)) {
733 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
734 $desc = $product_desc;
739 $date_start_fill =
GETPOSTINT(
'date_start_fill');
743 $fournprice = (int) (
GETPOST(
'fournprice'.$predef) ?
GETPOST(
'fournprice'.$predef) :
'');
755 $fk_parent_line =
GETPOSTINT(
'fk_parent_line');
757 if ($usercanproductignorepricemin && (!empty($price_min) && ((
float)
price2num($pu_ht) * (1 - (
float)
price2num($remise_percent) / 100) < (
float)
price2num($price_min)))) {
758 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
762 $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);
767 if ($objectline->fetch($result)) {
768 $objectline->array_options = $array_options;
769 $result = $objectline->insertExtraFields();
795 unset($_POST[
'prod_entry_mode']);
797 unset($_POST[
'qty']);
798 unset($_POST[
'type']);
799 unset($_POST[
'remise_percent']);
800 unset($_POST[
'price_ht']);
801 unset($_POST[
'multicurrency_price_ht']);
802 unset($_POST[
'price_ttc']);
803 unset($_POST[
'tva_tx']);
804 unset($_POST[
'product_ref']);
805 unset($_POST[
'product_label']);
806 unset($_POST[
'product_desc']);
807 unset($_POST[
'fournprice']);
808 unset($_POST[
'buying_price']);
809 unset($_POST[
'np_marginRate']);
810 unset($_POST[
'np_markRate']);
811 unset($_POST[
'dp_desc']);
812 unset($_POST[
'idprod']);
813 unset($_POST[
'units']);
815 unset($_POST[
'date_starthour']);
816 unset($_POST[
'date_startmin']);
817 unset($_POST[
'date_startsec']);
818 unset($_POST[
'date_startday']);
819 unset($_POST[
'date_startmonth']);
820 unset($_POST[
'date_startyear']);
821 unset($_POST[
'date_endhour']);
822 unset($_POST[
'date_endmin']);
823 unset($_POST[
'date_endsec']);
824 unset($_POST[
'date_endday']);
825 unset($_POST[
'date_endmonth']);
826 unset($_POST[
'date_endyear']);
828 unset($_POST[
'date_start_fill']);
829 unset($_POST[
'date_end_fill']);
831 unset($_POST[
'situations']);
832 unset($_POST[
'progress']);
840 } elseif ($action ==
'confirm_addtextline' && $usercancreate) {
843 $langs->load(
'subtotals');
845 $desc =
GETPOST(
'subtotaltextcontent',
'restricthtml');
848 $result =
$object->addSubtotalLine($langs, $desc, 0, array());
859 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.$id);
861 } elseif ($action ==
'confirm_addtitleline' && $usercancreate) {
864 $langs->load(
'subtotals');
866 $desc =
GETPOST(
'subtotallinedesc',
'alphanohtml');
867 $depth =
GETPOSTINT(
'subtotallinelevel') ?? 1;
869 $subtotal_options = array();
871 foreach (FactureRec::$TITLE_OPTIONS as $option) {
872 $value =
GETPOST($option,
'alphanohtml');
874 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
879 $result =
$object->addSubtotalLine($langs, $desc, (
int) $depth, $subtotal_options);
890 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.$id);
892 } elseif ($action ==
'confirm_addsubtotalline' && $usercancreate) {
895 $langs->load(
'subtotals');
897 $choosen_line =
GETPOST(
'subtotaltitleline',
'alphanohtml');
898 foreach (
$object->lines as $line) {
899 if ($line->desc == $choosen_line && $line->special_code == SUBTOTALS_SPECIAL_CODE) {
901 $depth = -$line->qty;
905 $subtotal_options = array();
907 foreach (FactureRec::$SUBTOTAL_OPTIONS as $option) {
908 $value =
GETPOST($option,
'alphanohtml');
910 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
915 if (isset($desc) && isset($depth)) {
916 $result =
$object->addSubtotalLine($langs, $desc, (
int) $depth, $subtotal_options);
919 $object->errors[] = $langs->trans(
"CorrespondingTitleNotFound");
928 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.$id);
930 } elseif ($action ==
'updateline' && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
931 if (!
$object->fetch($id) > 0) {
954 if (preg_match(
'/\*/', $vat_rate)) {
959 $vat_rate = str_replace(
'*',
'', $vat_rate);
964 $fournprice = (int) (
GETPOST(
'fournprice') ?
GETPOST(
'fournprice') :
'');
968 $pu_equivalent = $pu_ht;
969 $pu_equivalent_ttc = $pu_ttc;
971 $currency_tx =
$object->multicurrency_tx;
975 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
976 $pu_equivalent = (float) $pu_ht_devise / (
float) $currency_tx;
978 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
979 $pu_equivalent_ttc = (float) $pu_ttc_devise / (
float) $currency_tx;
994 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
995 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
998 if ($objectline->fetch(
GETPOSTINT(
'lineid'))) {
999 $objectline->array_options = $array_options;
1000 $result = $objectline->insertExtraFields();
1005 $position = ($objectline->rang >= 0 ? $objectline->rang : 0);
1008 if (is_array($extralabelsline)) {
1010 foreach ($extralabelsline as $key => $value) {
1011 unset($_POST[
"options_".$key]);
1017 if ($special_code == 3) {
1030 if (empty($remise_percent)) {
1031 $remise_percent = 0;
1034 $price_base_type =
'HT';
1036 if (empty($pu) && !empty($pu_ttc)) {
1038 $price_base_type =
'TTC';
1043 if (!empty($productid)) {
1045 $product->fetch($productid);
1047 $type = $product->type;
1049 $price_min = $product->price_min;
1051 $price_min = $product->multiprices_min[
$object->thirdparty->price_level];
1053 $price_min_ttc = $product->price_min_ttc;
1055 $price_min_ttc = $product->multiprices_min_ttc[
$object->thirdparty->price_level];
1064 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - (
float) $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
1065 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1068 $action =
'editline';
1069 } 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') {
1070 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1073 $action =
'editline';
1078 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1082 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1087 $langs->load(
"errors");
1088 setEventMessages($langs->trans(
'ErrorQtyForCustomerInvoiceCantBeNegative'),
null,
'errors');
1092 $date_start_fill =
GETPOSTINT(
'date_start_fill');
1093 $date_end_fill =
GETPOSTINT(
'date_end_fill');
1094 $fk_parent_line =
GETPOST(
'fk_parent_line',
'int');
1098 $result =
$object->updateline(
1117 (
float) $pu_ht_devise,
1122 (
float) $buyingprice,
1123 (
int) $fk_parent_line
1147 unset($_POST[
'qty']);
1148 unset($_POST[
'type']);
1149 unset($_POST[
'productid']);
1150 unset($_POST[
'remise_percent']);
1151 unset($_POST[
'price_ht']);
1152 unset($_POST[
'multicurrency_price_ht']);
1153 unset($_POST[
'price_ttc']);
1154 unset($_POST[
'tva_tx']);
1155 unset($_POST[
'product_ref']);
1156 unset($_POST[
'product_label']);
1157 unset($_POST[
'product_desc']);
1158 unset($_POST[
'fournprice']);
1159 unset($_POST[
'buying_price']);
1160 unset($_POST[
'np_marginRate']);
1161 unset($_POST[
'np_markRate']);
1163 unset($_POST[
'dp_desc']);
1164 unset($_POST[
'idprod']);
1165 unset($_POST[
'units']);
1167 unset($_POST[
'date_starthour']);
1168 unset($_POST[
'date_startmin']);
1169 unset($_POST[
'date_startsec']);
1170 unset($_POST[
'date_startday']);
1171 unset($_POST[
'date_startmonth']);
1172 unset($_POST[
'date_startyear']);
1173 unset($_POST[
'date_endhour']);
1174 unset($_POST[
'date_endmin']);
1175 unset($_POST[
'date_endsec']);
1176 unset($_POST[
'date_endday']);
1177 unset($_POST[
'date_endmonth']);
1178 unset($_POST[
'date_endyear']);
1180 unset($_POST[
'situations']);
1181 unset($_POST[
'progress']);
1186 } elseif ($action ==
'updatetitleline' && GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1189 $langs->load(
'subtotals');
1191 $desc =
GETPOST(
'line_desc',
'alphanohtml') ?? $langs->trans(
"Title");
1194 $subtotal_options = array();
1196 foreach (Facture::$TITLE_OPTIONS as $option) {
1197 $value =
GETPOST($option,
'alphanohtml');
1199 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1204 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1215 } elseif ($action ==
'updatetextline' && GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1218 $langs->load(
'subtotals');
1220 $desc =
GETPOST(
'line_desc',
'restricthtml');
1223 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, 0, array());
1234 } elseif ($action ==
'updatesubtotalline' && GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1237 $langs->load(
'subtotals');
1239 $desc =
GETPOST(
'line_desc',
'alphanohtml');
1242 $subtotal_options = array();
1244 foreach (Facture::$SUBTOTAL_OPTIONS as $option) {
1245 $value =
GETPOST($option,
'alphanohtml');
1247 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1252 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1268$title =
$object->ref.
" - ".$langs->trans(
'Card');
1278 $formproject =
null;
1288if ($action ==
'create') {
1289 print
load_fiche_titre($langs->trans(
"CreateRepeatableInvoice"),
'',
'bill');
1295 if ($sourceInvoice->fetch($id, $ref) > 0) {
1296 $result = $sourceInvoice->getLinesArray();
1298 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
1299 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1300 print
'<input type="hidden" name="action" value="add">';
1301 print
'<input type="hidden" name="facid" value="'.$sourceInvoice->id.
'">';
1310 if ($sourceInvoice->fk_account > 0) {
1314 print
'<table class="border centpercent">';
1316 $sourceInvoice->fetch_thirdparty();
1319 print
'<tr><td class="titlefieldcreate fieldrequired">'.$langs->trans(
"Title").
'</td><td>';
1320 print
'<input class="flat quatrevingtpercent" type="text" name="title" value="'.dol_escape_htmltag(
GETPOST(
"title",
'alphanohtml')).
'" autofocus>';
1324 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Customer").
'</td><td>'.$sourceInvoice->thirdparty->getNomUrl(1,
'customer').
'</td>';
1329 print
"<tr><td>".$langs->trans(
"InvoiceSubtype").
"</td><td>";
1330 print $form->getSelectInvoiceSubtype(GETPOSTISSET(
'subtype') ?
GETPOSTINT(
'subtype') : $sourceInvoice->subtype,
'subtype', 0, 0,
'');
1334 $note_public = GETPOSTISSET(
'note_public') ?
GETPOST(
'note_public',
'restricthtml') : $sourceInvoice->note_public;
1335 $note_private = GETPOSTISSET(
'note_private') ?
GETPOST(
'note_private',
'restricthtml') : $sourceInvoice->note_private;
1338 $substitutionarray = getCommonSubstitutionArray($langs, 2,
null, $sourceInvoice);
1340 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH__'] = $langs->trans(
"PreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($sourceInvoice->date, -1,
'm'),
'%m').
')';
1341 $substitutionarray[
'__INVOICE_MONTH__'] = $langs->trans(
"MonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($sourceInvoice->date,
'%m').
')';
1342 $substitutionarray[
'__INVOICE_NEXT_MONTH__'] = $langs->trans(
"NextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($sourceInvoice->date, 1,
'm'),
'%m').
')';
1343 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH_TEXT__'] = $langs->trans(
"TextPreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($sourceInvoice->date, -1,
'm'),
'%B').
')';
1344 $substitutionarray[
'__INVOICE_MONTH_TEXT__'] = $langs->trans(
"TextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($sourceInvoice->date,
'%B').
')';
1345 $substitutionarray[
'__INVOICE_NEXT_MONTH_TEXT__'] = $langs->trans(
"TextNextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($sourceInvoice->date, 1,
'm'),
'%B').
')';
1346 $substitutionarray[
'__INVOICE_PREVIOUS_YEAR__'] = $langs->trans(
"PreviousYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($sourceInvoice->date, -1,
'y'),
'%Y').
')';
1347 $substitutionarray[
'__INVOICE_YEAR__'] = $langs->trans(
"YearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($sourceInvoice->date,
'%Y').
')';
1348 $substitutionarray[
'__INVOICE_NEXT_YEAR__'] = $langs->trans(
"NextYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($sourceInvoice->date, 1,
'y'),
'%Y').
')';
1350 $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').
')';
1351 $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').
')';
1352 $substitutionarray[
'__INVOICE_COUNTER_CURRENT__'] = $langs->trans(
"Count");
1353 $substitutionarray[
'__INVOICE_COUNTER_MAX__'] = $langs->trans(
"MaxPeriodNumber");
1355 $htmltext =
'<i>'.$langs->trans(
"FollowingConstantsWillBeSubstituted").
':<br>';
1356 foreach ($substitutionarray as $key => $val) {
1357 $htmltext .= $key.
' = '.$langs->trans($val).
'<br>';
1359 $htmltext .=
'</i>';
1362 print
"<tr><td>".$langs->trans(
"Author").
"</td><td>".$user->getFullName($langs).
"</td></tr>";
1365 print
"<tr><td>".$langs->trans(
"PaymentConditions").
"</td><td>";
1366 print $form->getSelectConditionsPaiements(GETPOSTISSET(
'cond_reglement_id') ?
GETPOSTINT(
'cond_reglement_id') : $sourceInvoice->cond_reglement_id,
'cond_reglement_id', -1, 0, 0,
'');
1371 print
"<tr><td>".$langs->trans(
"PaymentMode").
"</td><td>";
1372 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
1373 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);
1378 print
"<tr><td>".$langs->trans(
'DebitBankAccount').
"</td><td>";
1379 $defaultRibId = $sourceInvoice->thirdparty->getDefaultRib();
1380 $form->selectRib(GETPOSTISSET(
'accountcustomerid') ?
GETPOSTINT(
'accountcustomerid') : $defaultRibId,
'accountcustomerid',
'(fk_soc:=:'.$sourceInvoice->socid.
")", 1,
'', 1);
1384 $(document).ready(function() {
1385 if($("#selectmode_reglement_id option:selected").data("code") != "' . $factureRec::PAYMENTCODETOEDITSOCIETERIB .
'") {
1386 hideselectfksocieterib();
1388 $("#selectmode_reglement_id").change(function() {
1389 if($("#selectmode_reglement_id option:selected").data("code") != "'. $factureRec::PAYMENTCODETOEDITSOCIETERIB .
'") {
1390 hideselectfksocieterib(1);
1392 showselectfksocieterib();
1397 function hideselectfksocieterib(empty = 0){
1398 $("#selectaccountcustomerid").closest("tr").hide();
1400 $("#selectaccountcustomerid").val("-1").change();
1404 function showselectfksocieterib(){
1405 $("#selectaccountcustomerid").closest("tr").show();
1410 if ($sourceInvoice->fk_account > 0) {
1411 print
"<tr><td>".$langs->trans(
'BankAccount').
"</td><td>";
1412 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.$sourceInvoice->id, (
string) $sourceInvoice->fk_account,
'none');
1418 print
"<tr><td>".$langs->trans(
"RuleForLinesDates").
"</td><td>";
1419 print $form->getSelectRuleForLinesDates(GETPOSTISSET(
'rule_for_lines_dates') ?
GETPOST(
'rule_for_lines_dates',
'alpha') : $factureRec->rule_for_lines_dates);
1427 $extralabels = $extrafields->fetch_name_optionals_label($draft->table_element);
1428 if ($draft->fetch_optionals() > 0) {
1429 $sourceInvoice->array_options = array_merge($sourceInvoice->array_options, $draft->array_options);
1432 print $sourceInvoice->showOptionals($extrafields,
'create', $parameters);
1435 if (
isModEnabled(
'project') && is_object($sourceInvoice->thirdparty) && $sourceInvoice->thirdparty->id > 0 && is_object($formproject)) {
1436 $projectid =
GETPOST(
'projectid') ?
GETPOST(
'projectid') : $sourceInvoice->fk_project;
1437 $langs->load(
'projects');
1438 print
'<tr><td>'.$langs->trans(
'Project').
'</td><td>';
1439 print
img_picto(
'',
'project',
'class="pictofixedwidth"');
1440 $numprojet = $formproject->select_projects($sourceInvoice->thirdparty->id, $projectid,
'projectid', 0, 0, 1, 0, 0, 0, 0,
'', 0, 0,
'');
1441 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>';
1446 print
"<tr><td>".$langs->trans(
'Model').
"</td><td>";
1447 include_once DOL_DOCUMENT_ROOT.
'/core/modules/facture/modules_facture.php';
1449 print
img_picto(
'',
'generic',
'class="pictofixedwidth"');
1451 print $form->selectarray(
'modelpdf', $list,
$conf->global->FACTURE_ADDON_PDF);
1456 print
'<td class="tdtop">';
1457 print $form->textwithpicto($langs->trans(
'NotePublic'), $htmltext, 1,
'help',
'', 0, 2,
'notepublic');
1460 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1461 print $doleditor->Create(1);
1464 if (empty($user->socid)) {
1466 print
'<td class="tdtop">';
1467 print $form->textwithpicto($langs->trans(
'NotePrivate'), $htmltext, 1,
'help',
'', 0, 2,
'noteprivate');
1470 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1471 print $doleditor->Create(1);
1481 $title = $langs->trans(
"Recurrence");
1484 print
'<span class="opacitymedium">'.$langs->trans(
"ToCreateARecurringInvoiceGeneAuto", $langs->transnoentitiesnoconv(
'Module2300Name')).
'</span><br><br>';
1488 print
'<table class="border centpercent">';
1491 print
'<tr><td class="titlefieldcreate">'.$form->textwithpicto($langs->trans(
"Frequency"), $langs->transnoentitiesnoconv(
'toolTipFrequency')).
"</td><td>";
1492 print
'<input type="text" class="width50" name="frequency" value="'.GETPOST(
'frequency',
'int').
'"> ';
1493 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'));
1497 print
"<tr><td>".$form->textwithpicto($langs->trans(
'NextDateToExecution'), $langs->trans(
"NextDateToExecutionHelp")).
"</td><td>";
1499 print $form->selectDate($date_next_execution,
'', 1, 1, 0,
"add", 1, 1);
1503 print
"<tr><td>".$langs->trans(
"MaxPeriodNumber").
"</td><td>";
1504 print
'<input type="text" class="width50" name="nb_gen_max" value="'.GETPOSTINT(
'nb_gen_max').
'">';
1508 print
"<tr><td>".$langs->trans(
"StatusOfAutoGeneratedInvoices").
"</td><td>";
1509 $select = array(
'0' => $langs->trans(
'BillStatusDraft'),
'1' => $langs->trans(
'BillStatusValidated'),
'2' => $langs->trans(
'BillStatusValidatedWithSendind'));
1510 print $form->selectarray(
'auto_validate', $select,
GETPOSTINT(
'auto_validate'));
1514 print
"<tr id='col_auto_send_model_mail' class='".(GETPOSTINT(
'auto_validate') != 2 ?
'hidden' :
'').
"'><td>" . $langs->trans(
"EmailTemplateForAutoSend") .
"</td><td>";
1515 print $form->selectModelMail(
"auto_send_",
"facture_send", 1, 0,
GETPOSTINT(
'auto_send_model_mail'));
1518 $(document).ready(function() {
1519 $('#auto_validate').on('change', function () {
1520 if(+$(this).val() === 2) {
1521 $('#col_auto_send_model_mail').show();
1523 $('#col_auto_send_model_mail').hide();
1524 $('#select_auto_send_model_mail').val(0);
1532 print
"<tr><td>".$langs->trans(
"StatusOfGeneratedDocuments").
"</td><td>";
1533 $select = array(
'0' => $langs->trans(
'DoNotGenerateDoc'),
'1' => $langs->trans(
'AutoGenerateDoc'));
1534 print $form->selectarray(
'generate_pdf', $select,
GETPOSTINT(
'generate_pdf'));
1537 print
'<input type="hidden" name="generate_pdf" value="1">';
1545 $title = $langs->trans(
"ProductsAndServices");
1547 $title = $langs->trans(
"Products");
1549 $title = $langs->trans(
"Services");
1557 print
'<div class="div-table-responsive-no-min">';
1558 print
'<table id="tablelines" class="noborder noshadow centpercent nomarginbottom">';
1561 if (!empty($sourceInvoice->lines)) {
1562 $sourceInvoice->printOriginLinesList(
'', $selectedLines);
1571 if (!empty($flag_price_may_change)) {
1572 print
'<tr><td colspan="3" class="left">';
1573 print
'<select name="usenewprice" class="flat">';
1574 print
'<option value="0">'.$langs->trans(
"AlwaysUseFixedPrice").
'</option>';
1575 print
'<option value="1" disabled>'.$langs->trans(
"AlwaysUseNewPrice").
'</option>';
1583 print $form->buttonsSaveCancel(
"Create");
1596 if ($action ==
'ask_deleteline') {
1597 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'',
'no', 1);
1600 if ($action ==
'delete') {
1601 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DeleteRepeatableInvoice'), $langs->trans(
'ConfirmDeleteRepeatableInvoice'),
'confirm_delete',
'',
'no', 1);
1604 if ($action ==
'ask_subtotal_deleteline') {
1605 $langs->load(
"subtotals");
1606 $title =
"DeleteSubtotalLine";
1607 $question =
"ConfirmDeleteSubtotalLine";
1608 if (
GETPOST(
'type') ==
'title') {
1609 $formconfirm = array(array(
'type' =>
'checkbox',
'name' =>
'deletecorrespondingsubtotalline',
'label' => $langs->trans(
"DeleteCorrespondingSubtotalLine"),
'value' => 0));
1610 $title =
"DeleteTitleLine";
1611 $question =
"ConfirmDeleteTitleLine";
1613 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans($title), $langs->trans($question),
'confirm_delete_subtotalline', $formconfirm,
'no', 1);
1617 if ($action ==
'add_title_line') {
1618 $langs->load(
'subtotals');
1620 $depth_array =
$object->getPossibleLevels($langs);
1622 } elseif ($action ==
'add_subtotal_line') {
1623 $langs->load(
'subtotals');
1625 $titles =
$object->getPossibleTitles();
1627 } elseif ($action ==
'add_text_line') {
1628 $langs->load(
'subtotals');
1634 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
1635 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1636 if (empty($reshook)) {
1637 $formconfirm .= $hookmanager->resPrint;
1638 } elseif ($reshook > 0) {
1639 $formconfirm = $hookmanager->resPrint;
1645 $author->fetch(
$object->user_creation_id);
1653 $linkback =
'<a href="'.DOL_URL_ROOT.
'/compta/facture/invoicetemplate_list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1656 if ($action !=
'editref') {
1657 $morehtmlref .= $form->editfieldkey(
$object->ref,
'ref',
$object->ref, $object, $user->hasRight(
'facture',
'creer'),
'',
'', 0, 2);
1659 $morehtmlref .= $form->editfieldval(
'',
'ref',
$object->ref, $object, $user->hasRight(
'facture',
'creer'),
'string');
1662 $morehtmlref .=
'<div class="refidno">';
1667 $morehtmlref .=
$object->thirdparty->getNomUrl(1,
'customer');
1670 $langs->load(
"projects");
1671 $morehtmlref .=
'<br>';
1672 if ($user->hasRight(
'facture',
'creer')) {
1673 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
1674 if ($action !=
'classify') {
1675 $morehtmlref .=
'<a class="editfielda" href="'.dolBuildUrl($_SERVER[
'PHP_SELF'], [
'action' =>
'classify',
'id' =>
$object->id],
true).
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
1677 $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');
1679 if (!empty(
$object->fk_project)) {
1681 $proj->fetch(
$object->fk_project);
1682 $morehtmlref .=
' : '.$proj->getNomUrl(1);
1684 $morehtmlref .=
' - '.$proj->title;
1691 $morehtmlref .=
'</div>';
1693 $morehtmlstatus =
'';
1695 dol_banner_tab($object,
'ref', $linkback, 1,
'title',
'none', $morehtmlref,
'', 0,
'', $morehtmlstatus);
1697 print
'<div class="fichecenter">';
1698 print
'<div class="fichehalfleft">';
1699 print
'<div class="underbanner clearboth"></div>';
1701 print
'<table class="border centpercent tableforfield">';
1705 print
"<tr><td>".$langs->trans(
"InvoiceSubtype").
"</td><td>";
1707 print
$object->getSubtypeLabel(
'facture_rec');
1713 print
'<tr><td class="titlefieldmiddle">'.$langs->trans(
"Author").
'</td><td>';
1714 print $author->getNomUrl(-1);
1719 print
'<table class="nobordernopadding centpercent"><tr><td>';
1720 print $langs->trans(
'PaymentConditionsShort');
1722 if ($action !=
'editconditions' && $user->hasRight(
'facture',
'creer')) {
1723 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>';
1725 print
'</tr></table>';
1727 if ($action ==
'editconditions') {
1728 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id, (
string)
$object->cond_reglement_id,
'cond_reglement_id');
1730 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id, (
string)
$object->cond_reglement_id,
'none');
1736 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1737 print $langs->trans(
'PaymentMode');
1739 if ($action !=
'editmode' && $user->hasRight(
'facture',
'creer')) {
1740 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>';
1742 print
'</tr></table>';
1744 if ($action ==
'editmode') {
1745 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id, (
string)
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
1747 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id, (
string)
$object->mode_reglement_id,
'none');
1753 if (
$object->mode_reglement_code == $object::PAYMENTCODETOEDITSOCIETERIB) {
1754 print
'<tr><td class="nowrap">';
1755 print
'<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
1756 print $langs->trans(
'DebitBankAccount');
1760 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>';
1762 print
'</tr></table>';
1765 if ($action ==
'editbankaccountcustomer') {
1766 $form->formRib($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->fk_societe_rib,
'accountcustomerid',
'fk_soc='.$object->socid, 1, 1);
1768 $form->formRib($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->fk_societe_rib,
'none',
'', 0, 1);
1775 print
'<tr><td class="nowrap">';
1776 print
'<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
1777 print $langs->trans(
'BankAccount');
1780 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>';
1782 print
'</tr></table>';
1784 if ($action ==
'editbankaccount') {
1785 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->fk_account,
'fk_account', 1);
1787 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->fk_account,
'none');
1795 print
'<table class="nobordernopadding centpercent"><tr><td>';
1796 print $langs->trans(
'RuleForLinesDates');
1798 if ($action !=
'editruleforlinesdates' && $user->hasRight(
'facture',
'creer')) {
1799 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>';
1801 print
'</tr></table>';
1803 if ($action ==
'editruleforlinesdates') {
1804 $form->form_rule_for_lines_dates($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id,
$object->rule_for_lines_dates,
'rule_for_lines_dates');
1806 $form->form_rule_for_lines_dates($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id,
$object->rule_for_lines_dates,
'none');
1812 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1815 print
'<tr><td class="nowrap">';
1816 print
'<table class="nobordernopadding centpercent"><tr><td class="nowrap">';
1817 print $langs->trans(
'Model');
1820 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>';
1822 print
'</tr></table>';
1824 if ($action ==
'editmodelpdf') {
1825 include_once DOL_DOCUMENT_ROOT.
'/core/modules/facture/modules_facture.php';
1828 foreach ($models as $k => $model) {
1829 $list[] = str_replace(
':',
'|', $k).
':'.$model;
1831 $select =
'select;'.implode(
',', $list);
1832 print $form->editfieldval($langs->trans(
"Model"),
'modelpdf',
$object->model_pdf, $object, $user->hasRight(
'facture',
'creer'), $select);
1846 print
'<div class="fichehalfright">';
1848 print
'<!-- amounts -->'.
"\n";
1849 print
'<div class="underbanner clearboth"></div>'.
"\n";
1852 $title = $langs->trans(
"Recurrence");
1854 print
'<table class="border tableforfield centpercent">';
1856 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_currency_amount.tpl.php';
1864 print
'<tr><td class="titlefieldmiddle">'.$langs->trans(
"AmountHT").
'</td>';
1865 print
'<td class="nowraponall amountcard right">'.price($sign *
$object->total_ht, 0, $langs, 1, -1, -1,
$conf->currency).
'</td>';
1868 print
'<td class="nowraponall amountcard right">' .
price($sign *
$object->multicurrency_total_ht, 0, $langs, 0, -1, -1,
$object->multicurrency_code) .
'</td>';
1873 print
'<tr><td>'.$langs->trans(
"AmountVAT").
'</td>';
1874 print
'<td class="nowrap amountcard right">'.price($sign *
$object->total_tva, 0, $langs, 1, -1, -1,
$conf->currency).
'</td>';
1877 print
'<td class="nowraponall amountcard right">' .
price($sign *
$object->multicurrency_total_tva, 0, $langs, 0, -1, -1,
$object->multicurrency_code) .
'</td>';
1882 if ((
$mysoc->localtax1_assuj ==
"1" &&
$mysoc->useLocalTax(1)) ||
$object->total_localtax1 != 0) {
1884 print
'<td class="titlefieldmiddle">'.$langs->transcountry(
"AmountLT1",
$mysoc->country_code).
'</td>';
1885 print
'<td class="nowraponall amountcard right">'.price($sign *
$object->total_localtax1, 1,
'', 1, - 1, - 1,
$conf->currency).
'</td></tr>';
1889 print
'<td class="nowraponall amountcard right">' .
price($sign *
$object->multicurrency_total_localtax1, 0, $langs, 0, -1, -1,
$object->multicurrency_code) .
'</td>';
1894 if ((
$mysoc->localtax2_assuj ==
"1" &&
$mysoc->useLocalTax(2)) ||
$object->total_localtax2 != 0) {
1896 print
'<td>'.$langs->transcountry(
"AmountLT2",
$mysoc->country_code).
'</td>';
1897 print
'<td class=nowraponall amountcard right">'.price($sign *
$object->total_localtax2, 1,
'', 1, - 1, - 1,
$conf->currency).
'</td></tr>';
1901 print
'<td class="nowraponall amountcard right">' .
price($sign *
$object->multicurrency_total_localtax2, 0, $langs, 0, -1, -1,
$object->multicurrency_code) .
'</td>';
1962 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>';
1965 print
'<td class="nowrap amountcard right">' .
price($sign *
$object->multicurrency_total_ttc, 0, $langs, 0, -1, -1,
$object->multicurrency_code) .
'</td>';
1970 print
'<tr class="liste_titre"><td class="liste_titre">'.img_picto(
'',
'recurring',
'class="pictofixedwidth"').$title.
'</td>';
1978 print
'<tr><td style="width: 50%">';
1979 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1980 print $langs->trans(
'Frequency');
1982 if ($action !=
'editfrequency' && $user->hasRight(
'facture',
'creer')) {
1983 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>';
1985 print
'</tr></table>';
1987 if ($action ==
'editfrequency') {
1988 print
'<form method="post" action="'.$_SERVER[
"PHP_SELF"].
'?facid='.
$object->id.
'">';
1989 print
'<input type="hidden" name="action" value="setfrequency">';
1990 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1991 print
'<table class="nobordernopadding">';
1993 print
'<input type="text" name="frequency" class="width50 marginrightonly right" value="'.$object->frequency.
'">';
1994 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'));
1996 print
'<td class="left"><input type="submit" class="button button-edit smallpaddingimp" value="'.$langs->trans(
"Modify").
'"></td>';
1997 print
'</tr></table></form>';
2000 print $langs->trans(
'FrequencyPer_'.
$object->unit_frequency,
$object->frequency);
2002 print
'<span class="opacitymedium">'.$langs->trans(
"NotARecurringInvoiceTemplate").
'</span>';
2014 if ($action ==
'date_when' ||
$object->frequency > 0) {
2015 print $form->editfieldkey($form->textwithpicto($langs->trans(
"NextDateToExecution"), $langs->trans(
"NextDateToExecutionHelp")),
'date_when',
$object->date_when, $object, $user->hasRight(
'facture',
'creer'),
'day');
2017 print $form->textwithpicto($langs->trans(
"NextDateToExecution"), $langs->trans(
"NextDateToExecutionHelp"));
2020 if ($action ==
'date_when' ||
$object->frequency > 0) {
2021 print $form->editfieldval($langs->trans(
"NextDateToExecution"),
'date_when',
$object->date_when, $object, $user->hasRight(
'facture',
'creer'),
'day',
$object->date_when,
null,
'',
'', 0,
'strikeIfMaxNbGenReached');
2024 if (!
$object->isMaxNbGenReached()) {
2029 print
img_info($langs->trans(
"MaxNumberOfGenerationReached"));
2039 if ($action ==
'nb_gen_max' ||
$object->frequency > 0) {
2040 print $form->editfieldkey($langs->trans(
"MaxPeriodNumber"),
'nb_gen_max', (
string)
$object->nb_gen_max, $object, $user->hasRight(
'facture',
'creer'));
2042 print $langs->trans(
"MaxPeriodNumber");
2045 if ($action ==
'nb_gen_max' ||
$object->frequency > 0) {
2046 print $form->editfieldval($langs->trans(
"MaxPeriodNumber"),
'nb_gen_max',
$object->nb_gen_max ?
$object->nb_gen_max :
'',
$object, $user->hasRight(
'facture',
'creer'));
2058 if ($action ==
'auto_validate' ||
$object->frequency > 0) {
2059 print $form->editfieldkey($langs->trans(
"StatusOfAutoGeneratedInvoices"),
'auto_validate', (
string)
$object->auto_validate, $object, $user->hasRight(
'facture',
'creer'));
2061 print $langs->trans(
"StatusOfAutoGeneratedInvoices");
2064 $select =
'select;0:' . $langs->trans(
'BillStatusDraft') .
',1:' . $langs->trans(
'BillStatusValidated') .
',2:' . $langs->trans(
'BillStatusValidatedWithSendind');
2065 if ($action ==
'auto_validate' ||
$object->frequency > 0) {
2066 print $form->editfieldval($langs->trans(
"StatusOfAutoGeneratedInvoices"),
'auto_validate',
$object->auto_validate, $object, $user->hasRight(
'facture',
'creer'), $select);
2076 print
'<tr><td style="width: 50%">';
2077 print
'<table class="nobordernopadding" width="100%"><tr><td>';
2078 print $langs->trans(
"EmailTemplateForAutoSend");
2080 if ($action !=
'editEmailTemplate' && $user->hasRight(
'facture',
'creer')) {
2081 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>';
2083 print
'</tr></table>';
2086 if ($action ==
'editEmailTemplate') {
2088 print
'<form method="POST" action="' . $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id .
'">';
2089 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
2090 print
'<input type="hidden" name="action" value="setEmailTemplate">';
2091 print $form->selectModelMail(
"auto_send_",
"facture_send", 1, 0,
$object->fk_email_template);
2092 print
'<input type="submit" class="button valignmiddle smallpaddingimp" name="modify" value="' . $langs->trans(
"Modify") .
'">';
2093 print
'<input type="submit" class="button button-cancel valignmiddle smallpaddingimp" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
2097 if (!empty(
$object->fk_email_template)) {
2098 $sql =
"SELECT label
2099 FROM ".$db->prefix().
"c_email_templates
2100 WHERE rowid = ".((int)
$object->fk_email_template);
2101 $result =
$db->query($sql);
2103 if ($obj =
$db->fetch_object($result)) {
2108 print $langs->trans(
'DefaultMailModel');
2120 if ($action ==
'generate_pdf' ||
$object->frequency > 0) {
2121 print $form->editfieldkey($langs->trans(
"StatusOfGeneratedDocuments"),
'generate_pdf', (
string)
$object->generate_pdf, $object, $user->hasRight(
'facture',
'creer'));
2123 print $langs->trans(
"StatusOfGeneratedDocuments");
2127 $select =
'select;0:'.$langs->trans(
'DoNotGenerateDoc').
',1:'.$langs->trans(
'AutogenerateDoc');
2128 if ($action ==
'generate_pdf' ||
$object->frequency > 0) {
2129 print $form->editfieldval($langs->trans(
"StatusOfGeneratedDocuments"),
'generate_pdf',
$object->generate_pdf,
$object, $user->hasRight(
'facture',
'creer'), $select);
2137 print
'<input type="hidden" name="generate_pdf" value="1">';
2148 print
info_admin($langs->trans(
"EnableAndSetupModuleCron", $langs->transnoentitiesnoconv(
"Module2300Name")));
2151 print
'<div class="underbanner clearboth"></div>';
2152 print
'<table class="border centpercent tableforfield">';
2155 print
'<tr><td style="width: 50%">'.$langs->trans(
"NbOfGenerationDone").
'</td>';
2163 print $langs->trans(
"DateLastGeneration");
2177 print
'<div class="clearboth"></div><br>';
2181 print
'<form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.(($action !=
'editline') ?
'#add' :
'#line_'.
GETPOSTINT(
'lineid')).
'" method="POST">';
2182 print
'<input type="hidden" name="token" value="' .
newToken().
'">';
2183 print
'<input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">';
2184 print
'<input type="hidden" name="mode" value="">';
2185 print
'<input type="hidden" name="id" value="' .
$object->id.
'">';
2186 print
'<input type="hidden" name="page_y" value="">';
2188 if (!empty(
$conf->use_javascript_ajax) &&
$object->statut == 0) {
2190 include DOL_DOCUMENT_ROOT.
'/core/tpl/subtotal_ajaxrow.tpl.php';
2192 include DOL_DOCUMENT_ROOT .
'/core/tpl/ajaxrow.tpl.php';
2196 print
'<div class="div-table-responsive-no-min">';
2197 print
'<table id="tablelines" class="noborder noshadow centpercent nomarginbottom">';
2200 $canchangeproduct = 1;
2205 if (
$object->status == $object::STATUS_DRAFT && $user->hasRight(
'facture',
'creer') && $action !=
'valid' && $action !=
'editline') {
2206 if ($action !=
'editline') {
2209 $parameters = array();
2210 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
2214 if (empty($reshook)) {
2231 print
'<div class="tabsAction">';
2233 $parameters = array();
2234 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
2235 if (empty($reshook)) {
2238 'class' =>
'classfortooltip',
2245 $langs->load(
"subtotals");
2247 $url_button = array();
2249 $url_button[] = array(
2250 'lang' =>
'subtotals',
2252 'perm' => (
bool) $usercancreate,
2253 'label' => $langs->trans(
'AddTitleLine'),
2254 'url' =>
'/compta/facture/card-rec.php?id='.$object->id.
'&action=add_title_line&token='.
newToken()
2257 $url_button[] = array(
2258 'lang' =>
'subtotals',
2260 'perm' => (
bool) $usercancreate,
2261 'label' => $langs->trans(
'AddSubtotalLine'),
2262 'url' =>
'/compta/facture/card-rec.php?id='.$object->id.
'&action=add_subtotal_line&token='.
newToken()
2265 $url_button[] = array(
2266 'lang' =>
'subtotals',
2268 'perm' => (
bool) $usercancreate,
2269 'label' => $langs->trans(
'AddTextLine'),
2270 'url' =>
'/compta/facture/card-rec.php?id='.$object->id.
'&action=add_text_line&token='.
newToken()
2272 print
dolGetButtonAction(
'', $langs->trans(
'SubTotal'),
'default', $url_button,
'',
true);
2275 if (empty(
$object->suspended)) {
2276 if ($user->hasRight(
'facture',
'creer')) {
2278 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="' .
dol_escape_htmltag($langs->trans(
"MaxGenerationReached")) .
'">' . $langs->trans(
"CreateBill") .
'</a></div>';
2280 if (empty(
$object->frequency) ||
$object->date_when <= $nowlasthour) {
2281 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>';
2283 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="' .
dol_escape_htmltag($langs->trans(
"DateIsNotEnough")) .
'">' . $langs->trans(
"CreateBill") .
'</a></div>';
2287 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#">' . $langs->trans(
"CreateBill") .
'</a></div>';
2291 if ($user->hasRight(
'facture',
'creer')) {
2292 if (empty(
$object->suspended)) {
2293 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>';
2295 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>';
2300 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=delete&token=' .
newToken(),
'delete', $user->hasRight(
'facture',
'supprimer'));
2306 print
'<div class="fichecenter"><div class="fichehalfleft">';
2307 print
'<a name="builddoc"></a>';
2311 $tmparray = $form->showLinkToObjectBlock($object, array(), array(
'invoice'), 1);
2312 $linktoelem = $tmparray[
'linktoelem'];
2313 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
2314 print $htmltoenteralink;
2316 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
2320 print
'<div class="fichehalfright">';
2324 $morehtmlcenter =
'<div class="nowraponall">';
2326 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'FullList'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/compta/facture/agenda-rec.php?id='.
$object->id);
2327 $morehtmlcenter .=
'</div>';
2330 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
2332 $somethingshown = $formactions->showactions($object,
$object->element, (is_object(
$object->thirdparty) ?
$object->thirdparty->id : 0), 1,
'', $MAXEVENT,
'', $morehtmlcenter);
2337 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.
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).
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,...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
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, $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.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
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.
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 information.
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
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.