35require
'../../main.inc.php';
36require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture-rec.class.php';
37require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
38require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
39if (isModEnabled(
'project')) {
40 include_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
43require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
44require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
45require_once DOL_DOCUMENT_ROOT.
'/core/lib/invoice.lib.php';
46require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
49$langs->loadLangs(array(
'bills',
'companies',
'compta',
'admin',
'other',
'products',
'banks'));
51$action =
GETPOST(
'action',
'alpha');
52$massaction =
GETPOST(
'massaction',
'alpha');
53$show_files =
GETPOST(
'show_files',
'int');
54$confirm =
GETPOST(
'confirm',
'alpha');
55$cancel =
GETPOST(
'cancel',
'alpha');
56$toselect =
GETPOST(
'toselect',
'array');
57$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'invoicetemplatelist';
61$lineid =
GETPOST(
'lineid',
'int');
64 $socid = $user->socid;
66$objecttype =
'facture_rec';
67if ($action ==
"create" || $action ==
"add") {
70$projectid =
GETPOST(
'projectid',
'int');
72$year_date_when =
GETPOST(
'year_date_when');
73$month_date_when =
GETPOST(
'month_date_when');
74$selectedLines =
GETPOST(
'toselect',
'array');
76$limit =
GETPOST(
'limit',
'int') ?
GETPOST(
'limit',
'int') : $conf->liste_limit;
77$sortfield =
GETPOST(
'sortfield',
'aZ09comma');
78$sortorder =
GETPOST(
'sortorder',
'aZ09comma');
79$page = GETPOSTISSET(
'pageplusone') ? (
GETPOST(
'pageplusone') - 1) :
GETPOST(
"page",
'int');
80if (empty($page) || $page == -1) {
83$offset = $limit * $page;
88 $sortfield =
'f.titre';
94if (($id > 0 || $ref) && $action !=
'create' && $action !=
'add') {
95 $ret = $object->fetch($id, $ref);
105$hookmanager->initHooks(array(
'invoicereccard',
'globalcard'));
109$extrafields->fetch_name_optionals_label($object->table_element);
111$search_array_options = $extrafields->getOptionalsFromPost($object->table_element,
'',
'search_');
113$permissionnote = $user->hasRight(
'facture',
'creer');
114$permissiondellink = $user->hasRight(
'facture',
'creer');
115$permissiontoedit = $user->hasRight(
'facture',
'creer');
117$usercanread = $user->hasRight(
'facture',
'lire');
118$usercancreate = $user->hasRight(
'facture',
'creer');
119$usercanissuepayment = $user->hasRight(
'facture',
'paiement');
120$usercandelete = $user->hasRight(
'facture',
'supprimer');
121$usercanvalidate = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !empty($user->rights->facture->invoice_advance->validate)));
122$usercansend = (!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || $user->rights->facture->invoice_advance->send);
123$usercanreopen = (!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || $user->rights->facture->invoice_advance->reopen);
124$usercanunvalidate = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !empty($usercancreate)) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !empty($user->rights->facture->invoice_advance->unvalidate)));
126$usercanproductignorepricemin = ((
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && empty($user->rights->produit->ignore_price_min_advance)) || !
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS'));
127$usercancreatemargin = $user->hasRight(
"margins",
"creer");
128$usercanreadallmargin = $user->hasRight(
"margins",
"liretous");
129$usercancreatewithdrarequest = $user->hasRight(
"prelevement",
"bons",
"creer");
135$result =
restrictedArea($user,
'facture', $object->id, $objecttype);
142if (
GETPOST(
'cancel',
'alpha')) {
146if (!
GETPOST(
'confirmmassaction',
'alpha') && $massaction !=
'presend' && $massaction !=
'confirm_presend') {
150$parameters = array();
151$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
156if (empty($reshook)) {
157 if (
GETPOST(
'cancel',
'alpha')) {
162 include DOL_DOCUMENT_ROOT.
'/core/actions_changeselectedfields.inc.php';
165 include DOL_DOCUMENT_ROOT.
'/core/actions_setnotes.inc.php';
167 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
169 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
180 if ($action ==
'add') {
181 if (!
GETPOST(
'title',
'alphanohtml')) {
182 setEventMessages($langs->transnoentities(
"ErrorFieldRequired", $langs->trans(
"Title")),
null,
'errors');
187 $frequency =
GETPOST(
'frequency',
'int');
188 $reyear =
GETPOST(
'reyear',
'int');
189 $remonth =
GETPOST(
'remonth',
'int');
190 $reday =
GETPOST(
'reday',
'int');
191 $rehour =
GETPOST(
'rehour',
'int');
192 $remin =
GETPOST(
'remin',
'int');
193 $nb_gen_max =
GETPOST(
'nb_gen_max',
'int');
196 if (
GETPOST(
'frequency',
'int')) {
197 if (empty($reyear) || empty($remonth) || empty($reday)) {
198 setEventMessages($langs->transnoentities(
"ErrorFieldRequired", $langs->trans(
"Date")),
null,
'errors');
210 $object->subtype =
GETPOST(
'subtype');
211 $object->title =
GETPOST(
'title',
'alphanohtml');
212 $object->note_private =
GETPOST(
'note_private',
'restricthtml');
213 $object->note_public =
GETPOST(
'note_public',
'restricthtml');
214 $object->model_pdf =
GETPOST(
'modelpdf',
'alphanohtml');
215 $object->usenewprice =
GETPOST(
'usenewprice',
'alphanohtml');
217 $object->mode_reglement_id =
GETPOST(
'mode_reglement_id',
'int');
218 $object->cond_reglement_id =
GETPOST(
'cond_reglement_id',
'int');
220 $object->frequency = $frequency;
221 $object->unit_frequency =
GETPOST(
'unit_frequency',
'alpha');
222 $object->nb_gen_max = $nb_gen_max;
223 $object->auto_validate =
GETPOST(
'auto_validate',
'int');
224 $object->generate_pdf =
GETPOST(
'generate_pdf',
'int');
225 $object->fk_project = $projectid;
227 $date_next_execution =
dol_mktime($rehour, $remin, 0, $remonth, $reday, $reyear);
228 $object->date_when = $date_next_execution;
230 $ret = $extrafields->setOptionalsFromPost(
null, $object);
236 if (
GETPOST(
'facid',
'int') > 0) {
238 $srcObject->fetch(
GETPOST(
'facid',
'int'));
240 $srcObject->fetchObjectLinked();
242 if (!empty($srcObject->linkedObjectsIds[
'contrat'])) {
243 $contractidid = reset($srcObject->linkedObjectsIds[
'contrat']);
245 $object->origin =
'contrat';
246 $object->origin_id = $contractidid;
247 $object->linked_objects[$object->origin] = $object->origin_id;
253 $oldinvoice =
new Facture($db);
254 $oldinvoice->fetch(
GETPOST(
'facid',
'int'));
256 $onlylines =
GETPOST(
'toselect',
'array');
258 $result = $object->create($user, $oldinvoice->id, 0, $onlylines);
260 $result = $oldinvoice->delete($user, 1);
275 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?facid='.$object->id);
286 if ($action ==
'confirm_delete' && $confirm ==
'yes' && $user->hasRight(
'facture',
'supprimer')) {
287 $object->delete($user);
289 header(
"Location: ".DOL_URL_ROOT.
'/compta/facture/invoicetemplate_list.php');
295 if ($action ==
'setconditions' && $user->hasRight(
'facture',
'creer')) {
297 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModified", $langs->transnoentitiesnoconv(
"PaymentTerm"));
298 $result = $object->setPaymentTerms(
GETPOST(
'cond_reglement_id',
'int'));
299 } elseif ($action ==
'setmode' && $user->hasRight(
'facture',
'creer')) {
301 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModified", $langs->transnoentitiesnoconv(
"PaymentMode"));
302 $result = $object->setPaymentMethods(
GETPOST(
'mode_reglement_id',
'int'));
303 } elseif ($action ==
'classin' && $user->hasRight(
'facture',
'creer')) {
305 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModified", $langs->transnoentitiesnoconv(
"Project"));
306 $object->setProject(
GETPOST(
'projectid',
'int'));
307 } elseif ($action ==
'setref' && $user->hasRight(
'facture',
'creer')) {
309 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModifiedFromYToZ", $langs->transnoentitiesnoconv(
"Title"), $object->title, $ref);
310 $result = $object->setValueFrom(
'titre', $ref,
'',
null,
'text',
'', $user,
'BILLREC_MODIFY');
312 $object->title = $ref;
313 $object->ref = $object->title;
316 if ($object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
317 $langs->load(
"errors");
318 setEventMessages($langs->trans(
'ErrorRefAlreadyExists', $ref),
null,
'errors');
323 } elseif ($action ==
'setbankaccount' && $user->hasRight(
'facture',
'creer')) {
325 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModified", $langs->transnoentitiesnoconv(
"Bank"));
326 $result = $object->setBankAccount(
GETPOST(
'fk_account',
'int'));
327 } elseif ($action ==
'setfrequency' && $user->hasRight(
'facture',
'creer')) {
329 $object->context[
'actionmsg'] = $langs->trans(
"FieldXModified", $langs->transnoentitiesnoconv(
"Frequency"));
330 $object->setFrequencyAndUnit(
GETPOST(
'frequency',
'int'),
GETPOST(
'unit_frequency',
'alpha'));
331 } elseif ($action ==
'setdate_when' && $user->hasRight(
'facture',
'creer')) {
335 $object->setNextDate($date);
337 } elseif ($action ==
'setnb_gen_max' && $user->hasRight(
'facture',
'creer')) {
339 $object->setMaxPeriod(
GETPOST(
'nb_gen_max',
'int'));
340 } elseif ($action ==
'setauto_validate' && $user->hasRight(
'facture',
'creer')) {
342 $object->setAutoValidate(
GETPOST(
'auto_validate',
'int'));
343 } elseif ($action ==
'setgenerate_pdf' && $user->hasRight(
'facture',
'creer')) {
345 $object->setGeneratepdf(
GETPOST(
'generate_pdf',
'int'));
346 } elseif ($action ==
'setmodelpdf' && $user->hasRight(
'facture',
'creer')) {
348 $object->setModelpdf(
GETPOST(
'modelpdf',
'alpha'));
349 } elseif ($action ==
'disable' && $user->hasRight(
'facture',
'creer')) {
353 $object->context[
'actionmsg'] = $langs->trans(
"RecordDisabled");
355 $res = $object->setValueFrom(
'suspended', 1,
'',
null,
'text',
'', $user,
'BILLREC_MODIFY');
366 } elseif ($action ==
'enable' && $user->hasRight(
'facture',
'creer')) {
370 $object->context[
'actionmsg'] = $langs->trans(
"RecordEnabled");
372 $res = $object->setValueFrom(
'suspended', 0,
'',
null,
'text',
'', $user,
'BILLREC_MODIFY');
383 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
385 $result = $object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
386 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
388 $result = $object->setMulticurrencyRate(
price2num(
GETPOST(
'multicurrency_tx')),
GETPOST(
'calculation_mode',
'int'));
392 if ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $user->hasRight(
'facture',
'creer')) {
394 $object->fetch_thirdparty();
403 if ($line->delete($user) > 0) {
404 $result = $object->update_price(1);
408 $object->fetch($object->id);
417 } elseif ($action ==
'update_extras') {
418 $object->oldcopy =
dol_clone($object, 2);
421 $ret = $extrafields->setOptionalsFromPost(
null, $object,
GETPOST(
'attribute',
'restricthtml'));
427 $result = $object->insertExtraFields(
'BILLREC_MODIFY');
436 if ($action ==
'addline' && $user->hasRight(
'facture',
'creer')) {
437 $langs->load(
'errors');
442 $product_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
445 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'alpha');
446 if ($prod_entry_mode ==
'free') {
449 $idprod =
GETPOST(
'idprod',
'int');
452 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
457 $tva_tx = (
GETPOST(
'tva_tx',
'alpha') ?
GETPOST(
'tva_tx',
'alpha') : 0);
461 if (empty($remise_percent)) {
466 $extralabelsline = $extrafields->fetch_name_optionals_label($object->table_element_line);
467 $array_options = $extrafields->getOptionalsFromPost($object->table_element_line, $predef);
469 if (is_array($extralabelsline)) {
471 foreach ($extralabelsline as $key => $value) {
472 unset($_POST[
"options_".$key.$predef]);
476 if ((empty($idprod) || $idprod < 0) && ($price_ht < 0) && ($qty < 0)) {
477 setEventMessages($langs->trans(
'ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv(
'UnitPriceHT'), $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
480 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
481 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Type')),
null,
'errors');
484 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && (!($price_ht >= 0) || $price_ht ==
'')) {
485 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
489 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
492 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($product_desc)) {
493 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Description')),
null,
'errors');
497 $langs->load(
"errors");
498 setEventMessages($langs->trans(
'ErrorQtyForCustomerInvoiceCantBeNegative'),
null,
'errors');
502 if (!$error && ($qty >= 0) && (!empty($product_desc) || (!empty($idprod) && $idprod > 0))) {
503 $ret = $object->fetch($id);
508 $ret = $object->fetch_thirdparty();
513 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
524 if (!empty($idprod) && $idprod > 0) {
526 $prod->fetch($idprod);
528 $label = ((
GETPOST(
'product_label') &&
GETPOST(
'product_label') != $prod->label) ?
GETPOST(
'product_label') :
'');
540 $datapriceofproduct = $prod->getSellPrice($mysoc, $object->thirdparty, $pqp);
542 $pu_ht = $datapriceofproduct[
'pu_ht'];
543 $pu_ttc = $datapriceofproduct[
'pu_ttc'];
544 $price_min = $datapriceofproduct[
'price_min'];
545 $price_base_type = empty($datapriceofproduct[
'price_base_type']) ?
'HT' : $datapriceofproduct[
'price_base_type'];
549 $tmpvat = (float)
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
550 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $prod->tva_tx));
553 if (!empty($price_ht)) {
555 $pu_ttc =
price2num($pu_ht * (1 + ($tmpvat / 100)),
'MU');
556 } elseif ($tmpvat != $tmpprodvat) {
559 if ($price_base_type !=
'HT') {
560 $pu_ht =
price2num($pu_ttc / (1 + ($tmpvat / 100)),
'MU');
562 $pu_ttc =
price2num($pu_ht * (1 + ($tmpvat / 100)),
'MU');
570 $outputlangs = $langs;
572 if (empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
573 $newlang =
GETPOST(
'lang_id',
'aZ09');
575 if (empty($newlang)) {
576 $newlang = $object->thirdparty->default_lang;
578 if (!empty($newlang)) {
580 $outputlangs->setDefaultLang($newlang);
583 $desc = (!empty($prod->multilangs [$outputlangs->defaultlang] [
"description"])) ? $prod->multilangs [$outputlangs->defaultlang] [
"description"] : $prod->
description;
585 $desc = $prod->description;
591 if (!
getDolGlobalString(
'MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE') && (!empty($prod->customcode) || !empty($prod->country_code))) {
595 $outputlangs = $langs;
597 if (empty($newlang) &&
GETPOST(
'lang_id',
'alpha')) {
598 $newlang =
GETPOST(
'lang_id',
'alpha');
600 if (empty($newlang)) {
601 $newlang = $object->thirdparty->default_lang;
603 if (!empty($newlang)) {
605 $outputlangs->setDefaultLang($newlang);
606 $outputlangs->load(
'products');
608 if (!empty($prod->customcode)) {
609 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
611 if (!empty($prod->customcode) && !empty($prod->country_code)) {
614 if (!empty($prod->country_code)) {
615 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code, 0, $db, $outputlangs, 0);
618 if (!empty($prod->customcode)) {
619 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
621 if (!empty($prod->customcode) && !empty($prod->country_code)) {
624 if (!empty($prod->country_code)) {
625 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code, 0, $db, $langs, 0);
633 $fk_unit = $prod->fk_unit;
637 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
638 $tva_tx = str_replace(
'*',
'', $tva_tx);
639 if (empty($tva_tx)) {
642 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
643 $desc = $product_desc;
645 $fk_unit =
GETPOST(
'units',
'alpha');
648 $date_start_fill =
GETPOST(
'date_start_fill',
'int');
649 $date_end_fill =
GETPOST(
'date_end_fill',
'int');
656 $localtax1_tx =
get_localtax($tva_tx, 1, $object->thirdparty, $mysoc, $tva_npr);
657 $localtax2_tx =
get_localtax($tva_tx, 2, $object->thirdparty, $mysoc, $tva_npr);
664 $fk_parent_line =
GETPOST(
'fk_parent_line',
'int');
666 if ($usercanproductignorepricemin && (!empty($price_min) && (
price2num($pu_ht) * (1 -
price2num($remise_percent) / 100) <
price2num($price_min)))) {
667 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, - 1, $conf->currency));
671 $result = $object->addline($desc, $pu_ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, $idprod, $remise_percent, $price_base_type, $info_bits,
'', $pu_ttc, $type, -1, $special_code, $label, $fk_unit, 0, $date_start_fill, $date_end_fill, $fournprice, $buyingprice, $fk_parent_line);
692 $object->fetch($object->id);
694 unset($_POST[
'prod_entry_mode']);
696 unset($_POST[
'qty']);
697 unset($_POST[
'type']);
698 unset($_POST[
'remise_percent']);
699 unset($_POST[
'price_ht']);
700 unset($_POST[
'multicurrency_price_ht']);
701 unset($_POST[
'price_ttc']);
702 unset($_POST[
'tva_tx']);
703 unset($_POST[
'product_ref']);
704 unset($_POST[
'product_label']);
705 unset($_POST[
'product_desc']);
706 unset($_POST[
'fournprice']);
707 unset($_POST[
'buying_price']);
708 unset($_POST[
'np_marginRate']);
709 unset($_POST[
'np_markRate']);
710 unset($_POST[
'dp_desc']);
711 unset($_POST[
'idprod']);
712 unset($_POST[
'units']);
714 unset($_POST[
'date_starthour']);
715 unset($_POST[
'date_startmin']);
716 unset($_POST[
'date_startsec']);
717 unset($_POST[
'date_startday']);
718 unset($_POST[
'date_startmonth']);
719 unset($_POST[
'date_startyear']);
720 unset($_POST[
'date_endhour']);
721 unset($_POST[
'date_endmin']);
722 unset($_POST[
'date_endsec']);
723 unset($_POST[
'date_endday']);
724 unset($_POST[
'date_endmonth']);
725 unset($_POST[
'date_endyear']);
727 unset($_POST[
'date_start_fill']);
728 unset($_POST[
'date_end_fill']);
730 unset($_POST[
'situations']);
731 unset($_POST[
'progress']);
739 } elseif ($action ==
'updateline' && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
740 if (!$object->fetch($id) > 0) {
743 $object->fetch_thirdparty();
758 if (preg_match(
'/\*/', $vat_rate)) {
763 $vat_rate = str_replace(
'*',
'', $vat_rate);
764 $localtax1_rate =
get_localtax($vat_rate, 1, $object->thirdparty);
765 $localtax2_rate =
get_localtax($vat_rate, 2, $object->thirdparty);
772 $extralabelsline = $extrafields->fetch_name_optionals_label($object->table_element_line);
773 $array_options = $extrafields->getOptionalsFromPost($object->table_element_line);
776 if ($objectline->fetch(
GETPOST(
'lineid',
'int'))) {
777 $objectline->array_options = $array_options;
778 $result = $objectline->insertExtraFields();
784 $position = ($objectline->rang >= 0 ? $objectline->rang : 0);
787 if (is_array($extralabelsline)) {
789 foreach ($extralabelsline as $key => $value) {
790 unset($_POST[
"options_".$key]);
795 $special_code =
GETPOST(
'special_code',
'int');
796 if ($special_code == 3) {
813 if (empty($remise_percent)) {
818 $productid =
GETPOST(
'productid',
'int');
819 if (!empty($productid)) {
821 $product->fetch($productid);
823 $type = $product->type;
825 $price_min = $product->price_min;
826 if (
getDolGlobalString(
'PRODUIT_MULTIPRICES') && !empty($object->thirdparty->price_level)) {
827 $price_min = $product->multiprices_min[$object->thirdparty->price_level];
836 setEventMessages($langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, - 1, $conf->currency)),
null,
'errors');
840 $type =
GETPOST(
'type',
'int');
841 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
844 if (
GETPOST(
'type',
'int') < 0) {
845 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
850 $langs->load(
"errors");
851 setEventMessages($langs->trans(
'ErrorQtyForCustomerInvoiceCantBeNegative'),
null,
'errors');
855 $date_start_fill =
GETPOST(
'date_start_fill',
'int');
856 $date_end_fill =
GETPOST(
'date_end_fill',
'int');
857 $fk_parent_line =
GETPOST(
'fk_parent_line',
'int');
861 $result = $object->updateline(
907 $object->fetch($object->id);
909 unset($_POST[
'qty']);
910 unset($_POST[
'type']);
911 unset($_POST[
'productid']);
912 unset($_POST[
'remise_percent']);
913 unset($_POST[
'price_ht']);
914 unset($_POST[
'multicurrency_price_ht']);
915 unset($_POST[
'price_ttc']);
916 unset($_POST[
'tva_tx']);
917 unset($_POST[
'product_ref']);
918 unset($_POST[
'product_label']);
919 unset($_POST[
'product_desc']);
920 unset($_POST[
'fournprice']);
921 unset($_POST[
'buying_price']);
922 unset($_POST[
'np_marginRate']);
923 unset($_POST[
'np_markRate']);
925 unset($_POST[
'dp_desc']);
926 unset($_POST[
'idprod']);
927 unset($_POST[
'units']);
929 unset($_POST[
'date_starthour']);
930 unset($_POST[
'date_startmin']);
931 unset($_POST[
'date_startsec']);
932 unset($_POST[
'date_startday']);
933 unset($_POST[
'date_startmonth']);
934 unset($_POST[
'date_startyear']);
935 unset($_POST[
'date_endhour']);
936 unset($_POST[
'date_endmin']);
937 unset($_POST[
'date_endsec']);
938 unset($_POST[
'date_endday']);
939 unset($_POST[
'date_endmonth']);
940 unset($_POST[
'date_endyear']);
942 unset($_POST[
'situations']);
943 unset($_POST[
'progress']);
956$title = $object->ref.
" - ".$langs->trans(
'Card');
961$form =
new Form($db);
963if (isModEnabled(
'project')) {
966$companystatic =
new Societe($db);
976if ($action ==
'create') {
977 print
load_fiche_titre($langs->trans(
"CreateRepeatableInvoice"),
'',
'bill');
980 $product_static =
new Product($db);
982 if ($object->fetch($id, $ref) > 0) {
983 $result = $object->getLinesArray();
985 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
986 print
'<input type="hidden" name="token" value="'.newToken().
'">';
987 print
'<input type="hidden" name="action" value="add">';
988 print
'<input type="hidden" name="facid" value="'.$object->id.
'">';
993 if (isModEnabled(
'project')) {
996 if ($object->fk_account > 0) {
1000 print
'<table class="border centpercent">';
1002 $object->fetch_thirdparty();
1005 print
'<tr><td class="titlefieldcreate fieldrequired">'.$langs->trans(
"Title").
'</td><td>';
1006 print
'<input class="flat quatrevingtpercent" type="text" name="title" value="'.dol_escape_htmltag(
GETPOST(
"title",
'alphanohtml')).
'" autofocus>';
1010 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Customer").
'</td><td>'.$object->thirdparty->getNomUrl(1,
'customer').
'</td>';
1015 print
"<tr><td>".$langs->trans(
"InvoiceSubtype").
"</td><td>";
1016 print $form->getSelectInvoiceSubtype(GETPOSTISSET(
'subtype') ?
GETPOST(
'subtype') : $object->subtype,
'subtype', 0, 0,
'');
1020 $note_public = GETPOSTISSET(
'note_public') ?
GETPOST(
'note_public',
'restricthtml') : $object->note_public;
1021 $note_private = GETPOSTISSET(
'note_private') ?
GETPOST(
'note_private',
'restricthtml') : $object->note_private;
1026 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH__'] = $langs->trans(
"PreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, -1,
'm'),
'%m').
')';
1027 $substitutionarray[
'__INVOICE_MONTH__'] = $langs->trans(
"MonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($object->date,
'%m').
')';
1028 $substitutionarray[
'__INVOICE_NEXT_MONTH__'] = $langs->trans(
"NextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, 1,
'm'),
'%m').
')';
1029 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH_TEXT__'] = $langs->trans(
"TextPreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, -1,
'm'),
'%B').
')';
1030 $substitutionarray[
'__INVOICE_MONTH_TEXT__'] = $langs->trans(
"TextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($object->date,
'%B').
')';
1031 $substitutionarray[
'__INVOICE_NEXT_MONTH_TEXT__'] = $langs->trans(
"TextNextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, 1,
'm'),
'%B').
')';
1032 $substitutionarray[
'__INVOICE_PREVIOUS_YEAR__'] = $langs->trans(
"PreviousYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, -1,
'y'),
'%Y').
')';
1033 $substitutionarray[
'__INVOICE_YEAR__'] = $langs->trans(
"YearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($object->date,
'%Y').
')';
1034 $substitutionarray[
'__INVOICE_NEXT_YEAR__'] = $langs->trans(
"NextYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, 1,
'y'),
'%Y').
')';
1036 $substitutionarray[
'__INVOICE_DATE_NEXT_INVOICE_BEFORE_GEN__'] = $langs->trans(
"DateNextInvoiceBeforeGen").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, 1,
'm'),
'dayhour').
')';
1037 $substitutionarray[
'__INVOICE_DATE_NEXT_INVOICE_AFTER_GEN__'] = $langs->trans(
"DateNextInvoiceAfterGen").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($object->date, 2,
'm'),
'dayhour').
')';
1038 $substitutionarray[
'__INVOICE_COUNTER_CURRENT__'] = $langs->trans(
"Count");
1039 $substitutionarray[
'__INVOICE_COUNTER_MAX__'] = $langs->trans(
"MaxPeriodNumber");
1041 $htmltext =
'<i>'.$langs->trans(
"FollowingConstantsWillBeSubstituted").
':<br>';
1042 foreach ($substitutionarray as $key => $val) {
1043 $htmltext .= $key.
' = '.$langs->trans($val).
'<br>';
1045 $htmltext .=
'</i>';
1048 print
"<tr><td>".$langs->trans(
"Author").
"</td><td>".$user->getFullName($langs).
"</td></tr>";
1051 print
"<tr><td>".$langs->trans(
"PaymentConditions").
"</td><td>";
1052 print $form->getSelectConditionsPaiements(GETPOSTISSET(
'cond_reglement_id') ?
GETPOST(
'cond_reglement_id',
'int') : $object->cond_reglement_id,
'cond_reglement_id', -1, 0, 0,
'');
1057 print
"<tr><td>".$langs->trans(
"PaymentMode").
"</td><td>";
1058 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
1059 print $form->select_types_paiements(GETPOSTISSET(
'mode_reglement_id') ?
GETPOST(
'mode_reglement_id',
'int') : $object->mode_reglement_id,
'mode_reglement_id',
'', 0, 1, 0, 0, 1,
'', 1);
1064 if ($object->fk_account > 0) {
1065 print
"<tr><td>".$langs->trans(
'BankAccount').
"</td><td>";
1066 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->fk_account,
'none');
1072 $draft->fetch(
GETPOST(
'facid',
'int'));
1075 $extralabels = $extrafields->fetch_name_optionals_label($draft->table_element);
1076 if ($draft->fetch_optionals() > 0) {
1077 $object->array_options = array_merge($object->array_options, $draft->array_options);
1080 print $object->showOptionals($extrafields,
'create', $parameters);
1083 if (isModEnabled(
'project') && is_object($object->thirdparty) && $object->thirdparty->id > 0) {
1084 $projectid =
GETPOST(
'projectid') ?
GETPOST(
'projectid') : $object->fk_project;
1085 $langs->load(
'projects');
1086 print
'<tr><td>'.$langs->trans(
'Project').
'</td><td>';
1087 print
img_picto(
'',
'project',
'class="pictofixedwidth"');
1088 $numprojet = $formproject->select_projects($object->thirdparty->id, $projectid,
'projectid', 0, 0, 1, 0, 0, 0, 0,
'', 0, 0,
'');
1089 print
' <a href="'.DOL_URL_ROOT.
'/projet/card.php?socid='.$object->thirdparty->id.
'&action=create&status=1&backtopage='.urlencode($_SERVER[
"PHP_SELF"].
'?action=create&socid='.$object->thirdparty->id.(!empty($id) ?
'&id='.$id :
'')).
'">'.
img_object($langs->trans(
"AddProject"),
'add').
'</a>';
1094 print
"<tr><td>".$langs->trans(
'Model').
"</td><td>";
1095 include_once DOL_DOCUMENT_ROOT.
'/core/modules/facture/modules_facture.php';
1097 print
img_picto(
'',
'generic',
'class="pictofixedwidth"');
1098 print $form->selectarray(
'modelpdf', $list, $conf->global->FACTURE_ADDON_PDF);
1103 print
'<td class="tdtop">';
1104 print $form->textwithpicto($langs->trans(
'NotePublic'), $htmltext, 1,
'help',
'', 0, 2,
'notepublic');
1107 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 80,
'dolibarr_notes',
'In', 0,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1108 print $doleditor->Create(1);
1111 if (empty($user->socid)) {
1113 print
'<td class="tdtop">';
1114 print $form->textwithpicto($langs->trans(
'NotePrivate'), $htmltext, 1,
'help',
'', 0, 2,
'noteprivate');
1117 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 80,
'dolibarr_notes',
'In', 0,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1118 print $doleditor->Create(1);
1128 $title = $langs->trans(
"Recurrence");
1131 print
'<span class="opacitymedium">'.$langs->trans(
"ToCreateARecurringInvoiceGeneAuto", $langs->transnoentitiesnoconv(
'Module2300Name')).
'</span><br><br>';
1135 print
'<table class="border centpercent">';
1138 print
'<tr><td class="titlefieldcreate">'.$form->textwithpicto($langs->trans(
"Frequency"), $langs->transnoentitiesnoconv(
'toolTipFrequency')).
"</td><td>";
1139 print
"<input type='text' name='frequency' value='".GETPOST(
'frequency',
'int').
"' size='4' /> ";
1140 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'));
1144 print
"<tr><td>".$langs->trans(
'NextDateToExecution').
"</td><td>";
1146 print $form->selectDate($date_next_execution,
'', 1, 1,
'',
"add", 1, 1);
1150 print
"<tr><td>".$langs->trans(
"MaxPeriodNumber").
"</td><td>";
1151 print
'<input type="text" name="nb_gen_max" value="'.GETPOST(
'nb_gen_max').
'" size="5" />';
1155 print
"<tr><td>".$langs->trans(
"StatusOfAutoGeneratedInvoices").
"</td><td>";
1156 $select = array(
'0'=>$langs->trans(
'BillStatusDraft'),
'1'=>$langs->trans(
'BillStatusValidated'));
1157 print $form->selectarray(
'auto_validate', $select,
GETPOST(
'auto_validate'));
1162 print
"<tr><td>".$langs->trans(
"StatusOfGeneratedDocuments").
"</td><td>";
1163 $select = array(
'0'=>$langs->trans(
'DoNotGenerateDoc'),
'1'=>$langs->trans(
'AutoGenerateDoc'));
1164 print $form->selectarray(
'generate_pdf', $select,
GETPOST(
'generate_pdf'));
1167 print
'<input type="hidden" name="generate_pdf" value="1">';
1175 $title = $langs->trans(
"ProductsAndServices");
1176 if (!isModEnabled(
'service')) {
1177 $title = $langs->trans(
"Products");
1178 } elseif (!isModEnabled(
'product')) {
1179 $title = $langs->trans(
"Services");
1187 print
'<div class="div-table-responsive-no-min">';
1188 print
'<table id="tablelines" class="noborder noshadow centpercent">';
1191 if (!empty($object->lines)) {
1192 $object->printOriginLinesList(
'', $selectedLines);
1200 if (!empty($flag_price_may_change)) {
1201 print
'<tr><td colspan="3" class="left">';
1202 print
'<select name="usenewprice" class="flat">';
1203 print
'<option value="0">'.$langs->trans(
"AlwaysUseFixedPrice").
'</option>';
1204 print
'<option value="1" disabled>'.$langs->trans(
"AlwaysUseNewPrice").
'</option>';
1210 print $form->buttonsSaveCancel(
"Create");
1220 if ($object->id > 0) {
1221 $object->fetch_thirdparty();
1225 if ($action ==
'ask_deleteline') {
1226 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'',
'no', 1);
1229 if ($action ==
'delete') {
1230 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'DeleteRepeatableInvoice'), $langs->trans(
'ConfirmDeleteRepeatableInvoice'),
'confirm_delete',
'',
'no', 1);
1234 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
1235 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1236 if (empty($reshook)) {
1237 $formconfirm .= $hookmanager->resPrint;
1238 } elseif ($reshook > 0) {
1239 $formconfirm = $hookmanager->resPrint;
1244 $author =
new User($db);
1245 $author->fetch($object->user_author);
1249 print
dol_get_fiche_head($head,
'card', $langs->trans(
"RepeatableInvoice"), -1,
'bill');
1253 $linkback =
'<a href="'.DOL_URL_ROOT.
'/compta/facture/invoicetemplate_list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1256 if ($action !=
'editref') {
1257 $morehtmlref .= $form->editfieldkey($object->ref,
'ref', $object->ref, $object, $user->hasRight(
'facture',
'creer'),
'',
'', 0, 2);
1259 $morehtmlref .= $form->editfieldval(
'',
'ref', $object->ref, $object, $user->hasRight(
'facture',
'creer'),
'string');
1262 $morehtmlref .=
'<div class="refidno">';
1267 $morehtmlref .= $object->thirdparty->getNomUrl(1,
'customer');
1269 if (isModEnabled(
'project')) {
1270 $langs->load(
"projects");
1271 $morehtmlref .=
'<br>';
1272 if ($user->hasRight(
'facture',
'creer')) {
1273 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
1274 if ($action !=
'classify') {
1275 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.newToken().
'&id='.$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
1277 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->socid, $object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
1279 if (!empty($object->fk_project)) {
1281 $proj->fetch($object->fk_project);
1282 $morehtmlref .=
' : '.$proj->getNomUrl(1);
1284 $morehtmlref .=
' - '.$proj->title;
1291 $morehtmlref .=
'</div>';
1293 $morehtmlright =
'';
1295 dol_banner_tab($object,
'ref', $linkback, 1,
'title',
'none', $morehtmlref,
'', 0,
'', $morehtmlright);
1297 print
'<div class="fichecenter">';
1298 print
'<div class="fichehalfleft">';
1299 print
'<div class="underbanner clearboth"></div>';
1301 print
'<table class="border centpercent tableforfield">';
1305 print
"<tr><td>".$langs->trans(
"InvoiceSubtype").
"</td><td>";
1306 if ($object->subtype > 0) {
1307 print $object->getSubtypeLabel(
'facture_rec');
1313 print
'<tr><td class="titlefield">'.$langs->trans(
"Author").
'</td><td>';
1314 print $author->getNomUrl(-1);
1318 print
'<tr><td>'.$langs->trans(
"AmountHT").
'</td>';
1319 print
'<td>'.price($object->total_ht,
'', $langs, 1, -1, -1, $conf->currency).
'</td>';
1323 print
'<tr><td>'.$langs->trans(
"AmountVAT").
'</td><td>'.
price($object->total_tva,
'', $langs, 1, -1, -1, $conf->currency).
'</td>';
1327 if (($mysoc->localtax1_assuj ==
"1" && $mysoc->useLocalTax(1)) || $object->total_localtax1 != 0) {
1328 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td>';
1329 print
'<td class="nowrap">'.price($object->total_localtax1, 1,
'', 1, - 1, - 1, $conf->currency).
'</td></tr>';
1331 if (($mysoc->localtax2_assuj ==
"1" && $mysoc->useLocalTax(2)) || $object->total_localtax2 != 0) {
1332 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td>';
1333 print
'<td class=nowrap">'.price($object->total_localtax2, 1,
'', 1, - 1, - 1, $conf->currency).
'</td></tr>';
1336 print
'<tr><td>'.$langs->trans(
"AmountTTC").
'</td><td colspan="3">'.
price($object->total_ttc,
'', $langs, 1, -1, -1, $conf->currency).
'</td>';
1342 print
'<table class="nobordernopadding centpercent"><tr><td>';
1343 print $langs->trans(
'PaymentConditionsShort');
1345 if ($action !=
'editconditions' && $user->hasRight(
'facture',
'creer')) {
1346 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>';
1348 print
'</tr></table>';
1350 if ($action ==
'editconditions') {
1351 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->cond_reglement_id,
'cond_reglement_id');
1353 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->cond_reglement_id,
'none');
1359 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1360 print $langs->trans(
'PaymentMode');
1362 if ($action !=
'editmode' && $user->hasRight(
'facture',
'creer')) {
1363 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>';
1365 print
'</tr></table>';
1367 if ($action ==
'editmode') {
1368 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
1370 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->mode_reglement_id,
'none');
1375 if (isModEnabled(
'multicurrency')) {
1379 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1380 print $form->editfieldkey(
'Currency',
'multicurrency_code',
'', $object, 0);
1382 if ($usercancreate && $action !=
'editmulticurrencycode' && $object->suspended == $object::STATUS_SUSPENDED) {
1383 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editmulticurrencycode&token='.newToken().
'&id='.$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetMultiCurrencyCode'), 1).
'</a></td>';
1385 print
'</tr></table>';
1387 $htmlname = (($usercancreate && $action ==
'editmulticurrencycode') ?
'multicurrency_code' :
'none');
1388 $form->form_multicurrency_code($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->multicurrency_code, $htmlname);
1392 if ($object->multicurrency_code != $conf->currency || $object->multicurrency_tx != 1) {
1395 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1396 print $form->editfieldkey(
'CurrencyRate',
'multicurrency_tx',
'', $object, 0);
1398 if ($usercancreate && $action !=
'editmulticurrencyrate' && $object->suspended == $object::STATUS_SUSPENDED && $object->multicurrency_code && $object->multicurrency_code != $conf->currency) {
1399 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editmulticurrencyrate&token='.newToken().
'&id='.$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetMultiCurrencyCode'), 1).
'</a></td>';
1401 print
'</tr></table>';
1403 if ($action ==
'editmulticurrencyrate' || $action ==
'actualizemulticurrencyrate') {
1404 if ($action ==
'actualizemulticurrencyrate') {
1407 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->multicurrency_tx, ($usercancreate ?
'multicurrency_tx' :
'none'), $object->multicurrency_code);
1409 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->multicurrency_tx,
'none', $object->multicurrency_code);
1410 if ($object->statut == $object::STATUS_DRAFT && $object->multicurrency_code && $object->multicurrency_code != $conf->currency) {
1411 print
'<div class="inline-block"> ';
1412 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=actualizemulticurrencyrate">'.$langs->trans(
"ActualizeCurrency").
'</a>';
1422 if (!empty($object->frequency) && !empty($object->date_when)) {
1423 $dateexample = $object->date_when;
1429 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH__'] = $langs->trans(
"PreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'm'),
'%m').
')';
1430 $substitutionarray[
'__INVOICE_MONTH__'] = $langs->trans(
"MonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($dateexample,
'%m').
')';
1431 $substitutionarray[
'__INVOICE_NEXT_MONTH__'] = $langs->trans(
"NextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'm'),
'%m').
')';
1432 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH_TEXT__'] = $langs->trans(
"TextPreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'm'),
'%B').
')';
1433 $substitutionarray[
'__INVOICE_MONTH_TEXT__'] = $langs->trans(
"TextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($dateexample,
'%B').
')';
1434 $substitutionarray[
'__INVOICE_NEXT_MONTH_TEXT__'] = $langs->trans(
"TextNextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'm'),
'%B').
')';
1435 $substitutionarray[
'__INVOICE_PREVIOUS_YEAR__'] = $langs->trans(
"PreviousYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'y'),
'%Y').
')';
1436 $substitutionarray[
'__INVOICE_YEAR__'] = $langs->trans(
"YearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($dateexample,
'%Y').
')';
1437 $substitutionarray[
'__INVOICE_NEXT_YEAR__'] = $langs->trans(
"NextYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'y'),
'%Y').
')';
1439 $substitutionarray[
'__INVOICE_DATE_NEXT_INVOICE_BEFORE_GEN__'] = $langs->trans(
"DateNextInvoiceBeforeGen").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(($object->date_when ? $object->date_when :
dol_now()),
'dayhour').
')';
1440 $substitutionarray[
'__INVOICE_DATE_NEXT_INVOICE_AFTER_GEN__'] = $langs->trans(
"DateNextInvoiceAfterGen").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree(($object->date_when ? $object->date_when :
dol_now()), $object->frequency, $object->unit_frequency),
'dayhour').
')';
1441 $substitutionarray[
'__INVOICE_COUNTER_CURRENT__'] = $object->nb_gen_done;
1442 $substitutionarray[
'__INVOICE_COUNTER_MAX__'] = $object->nb_gen_max;
1444 $htmltext =
'<i>'.$langs->trans(
"FollowingConstantsWillBeSubstituted").
':<br>';
1445 foreach ($substitutionarray as $key => $val) {
1446 $htmltext .= $key.
' = '.$langs->trans($val).
'<br>';
1448 $htmltext .=
'</i>';
1451 print
'<tr><td class="nowrap">';
1452 print
'<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
1453 print $langs->trans(
'BankAccount');
1455 if (($action !=
'editbankaccount') && $user->hasRight(
'facture',
'creer') && $object->statut ==
FactureRec::STATUS_DRAFT) {
1456 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>';
1458 print
'</tr></table>';
1460 if ($action ==
'editbankaccount') {
1461 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->fk_account,
'fk_account', 1);
1463 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->fk_account,
'none');
1469 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1474 print $form->editfieldkey($form->textwithpicto($langs->trans(
'NotePublic'), $htmltext, 1,
'help',
'', 0, 2,
'notepublic'),
'note_public', $object->note_public, $object, $user->hasRight(
'facture',
'creer'));
1475 print
'</td><td class="wordbreak">';
1476 print $form->editfieldval($langs->trans(
"NotePublic"),
'note_public', $object->note_public, $object, $user->hasRight(
'facture',
'creer'),
'textarea:'.ROWS_4.
':90%',
'',
null,
null,
'', 1);
1482 print $form->editfieldkey($form->textwithpicto($langs->trans(
"NotePrivate"), $htmltext, 1,
'help',
'', 0, 2,
'noteprivate'),
'note_private', $object->note_private, $object, $user->hasRight(
'facture',
'creer'));
1483 print
'</td><td class="wordbreak">';
1484 print $form->editfieldval($langs->trans(
"NotePrivate"),
'note_private', $object->note_private, $object, $user->hasRight(
'facture',
'creer'),
'textarea:'.ROWS_4.
':90%',
'',
null,
null,
'', 1);
1489 print
'<tr><td class="nowrap">';
1490 print
'<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
1491 print $langs->trans(
'Model');
1493 if (($action !=
'editmodelpdf') && $user->hasRight(
'facture',
'creer') && $object->statut ==
FactureRec::STATUS_DRAFT) {
1494 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>';
1496 print
'</tr></table>';
1498 if ($action ==
'editmodelpdf') {
1499 include_once DOL_DOCUMENT_ROOT.
'/core/modules/facture/modules_facture.php';
1502 foreach ($models as $k => $model) {
1503 $list[] = str_replace(
':',
'|', $k).
':'.$model;
1505 $select =
'select;'.implode(
',', $list);
1506 print $form->editfieldval($langs->trans(
"Model"),
'modelpdf', $object->model_pdf, $object, $user->hasRight(
'facture',
'creer'), $select);
1508 print $object->model_pdf;
1520 print
'<div class="fichehalfright">';
1521 print
'<div class="underbanner clearboth"></div>';
1527 $title = $langs->trans(
"Recurrence");
1529 print
'<table class="border centpercent tableforfield">';
1531 print
'<tr><td colspan="2">'.img_picto(
'',
'recurring',
'class="pictofixedwidth"').$title.
'</td></tr>';
1534 print
'<tr><td style="width: 50%">';
1535 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1536 print $langs->trans(
'Frequency');
1538 if ($action !=
'editfrequency' && $user->hasRight(
'facture',
'creer')) {
1539 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>';
1541 print
'</tr></table>';
1543 if ($action ==
'editfrequency') {
1544 print
'<form method="post" action="'.$_SERVER[
"PHP_SELF"].
'?facid='.$object->id.
'">';
1545 print
'<input type="hidden" name="action" value="setfrequency">';
1546 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1547 print
'<table class="nobordernopadding">';
1549 print
"<input type='text' name='frequency' value='".$object->frequency.
"' size='5' /> ";
1550 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'));
1552 print
'<td class="left"><input type="submit" class="button button-edit smallpaddingimp" value="'.$langs->trans(
"Modify").
'"></td>';
1553 print
'</tr></table></form>';
1555 if ($object->frequency > 0) {
1556 print $langs->trans(
'FrequencyPer_'.$object->unit_frequency, $object->frequency);
1558 print
'<span class="opacitymedium">'.$langs->trans(
"NotARecurringInvoiceTemplate").
'</span>';
1565 if ($action ==
'date_when' || $object->frequency > 0) {
1566 print $form->editfieldkey($langs->trans(
"NextDateToExecution"),
'date_when', $object->date_when, $object, $user->hasRight(
'facture',
'creer'),
'day');
1568 print $langs->trans(
"NextDateToExecution");
1571 if ($action ==
'date_when' || $object->frequency > 0) {
1572 print $form->editfieldval($langs->trans(
"NextDateToExecution"),
'date_when', $object->date_when, $object, $user->hasRight(
'facture',
'creer'),
'day', $object->date_when,
null,
'',
'', 0,
'strikeIfMaxNbGenReached');
1575 if (!$object->isMaxNbGenReached()) {
1576 if (!$object->suspended && $action !=
'editdate_when' && $object->frequency > 0 && $object->date_when && $object->date_when < $now) {
1580 print
img_info($langs->trans(
"MaxNumberOfGenerationReached"));
1587 if ($action ==
'nb_gen_max' || $object->frequency > 0) {
1588 print $form->editfieldkey($langs->trans(
"MaxPeriodNumber"),
'nb_gen_max', $object->nb_gen_max, $object, $user->hasRight(
'facture',
'creer'));
1590 print $langs->trans(
"MaxPeriodNumber");
1593 if ($action ==
'nb_gen_max' || $object->frequency > 0) {
1594 print $form->editfieldval($langs->trans(
"MaxPeriodNumber"),
'nb_gen_max', $object->nb_gen_max ? $object->nb_gen_max :
'', $object, $user->hasRight(
'facture',
'creer'));
1603 if ($action ==
'auto_validate' || $object->frequency > 0) {
1604 print $form->editfieldkey($langs->trans(
"StatusOfAutoGeneratedInvoices"),
'auto_validate', $object->auto_validate, $object, $user->hasRight(
'facture',
'creer'));
1606 print $langs->trans(
"StatusOfAutoGeneratedInvoices");
1609 $select =
'select;0:'.$langs->trans(
'BillStatusDraft').
',1:'.$langs->trans(
'BillStatusValidated');
1610 if ($action ==
'auto_validate' || $object->frequency > 0) {
1611 print $form->editfieldval($langs->trans(
"StatusOfAutoGeneratedInvoices"),
'auto_validate', $object->auto_validate, $object, $user->hasRight(
'facture',
'creer'), $select);
1618 if ($action ==
'generate_pdf' || $object->frequency > 0) {
1619 print $form->editfieldkey($langs->trans(
"StatusOfGeneratedDocuments"),
'generate_pdf', $object->generate_pdf, $object, $user->hasRight(
'facture',
'creer'));
1621 print $langs->trans(
"StatusOfGeneratedDocuments");
1625 $select =
'select;0:'.$langs->trans(
'DoNotGenerateDoc').
',1:'.$langs->trans(
'AutogenerateDoc');
1626 if ($action ==
'generate_pdf' || $object->frequency > 0) {
1627 print $form->editfieldval($langs->trans(
"StatusOfGeneratedDocuments"),
'generate_pdf', $object->generate_pdf, $object, $user->hasRight(
'facture',
'creer'), $select);
1632 print
'<input type="hidden" name="generate_pdf" value="1">';
1638 if ($object->frequency > 0) {
1641 if (!isModEnabled(
'cron')) {
1642 print
info_admin($langs->trans(
"EnableAndSetupModuleCron", $langs->transnoentitiesnoconv(
"Module2300Name")));
1645 print
'<div class="underbanner clearboth"></div>';
1646 print
'<table class="border centpercent tableforfield">';
1649 print
'<tr><td style="width: 50%">'.$langs->trans(
"NbOfGenerationDone").
'</td>';
1651 print $object->nb_gen_done ? $object->nb_gen_done :
'0';
1657 print $langs->trans(
"DateLastGeneration");
1671 print
'<div class="clearboth"></div><br>';
1675 print
'<form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.(($action !=
'editline') ?
'#add' :
'#line_'.
GETPOST(
'lineid',
'int')).
'" method="POST">';
1676 print
'<input type="hidden" name="token" value="' . newToken().
'">';
1677 print
'<input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">';
1678 print
'<input type="hidden" name="mode" value="">';
1679 print
'<input type="hidden" name="id" value="' . $object->id.
'">';
1680 print
'<input type="hidden" name="page_y" value="">';
1682 if (!empty($conf->use_javascript_ajax) && $object->statut == 0) {
1683 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
1686 print
'<div class="div-table-responsive-no-min">';
1687 print
'<table id="tablelines" class="noborder noshadow centpercent">';
1689 if (!empty($object->lines)) {
1690 $canchangeproduct = 1;
1691 $object->printObjectLines($action, $mysoc, $object->thirdparty, $lineid, 0);
1695 if ($object->statut == $object::STATUS_DRAFT && $user->hasRight(
'facture',
'creer') && $action !=
'valid' && $action !=
'editline') {
1696 if ($action !=
'editline') {
1699 $parameters = array();
1700 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
1704 if (empty($reshook)) {
1705 $object->formAddObjectLine(0, $mysoc, $object->thirdparty);
1721 print
'<div class="tabsAction">';
1723 $parameters = array();
1724 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
1725 if (empty($reshook)) {
1728 'class' =>
'classfortooltip',
1731 if (empty($object->suspended)) {
1732 if ($user->hasRight(
'facture',
'creer')) {
1733 if (!empty($object->frequency) && $object->nb_gen_max > 0 && ($object->nb_gen_done >= $object->nb_gen_max)) {
1734 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="' .
dol_escape_htmltag($langs->trans(
"MaxGenerationReached")) .
'">' . $langs->trans(
"CreateBill") .
'</a></div>';
1736 if (empty($object->frequency) || $object->date_when <= $nowlasthour) {
1737 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>';
1739 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="' .
dol_escape_htmltag($langs->trans(
"DateIsNotEnough")) .
'">' . $langs->trans(
"CreateBill") .
'</a></div>';
1743 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#">' . $langs->trans(
"CreateBill") .
'</a></div>';
1747 if ($user->hasRight(
'facture',
'creer')) {
1748 if (empty($object->suspended)) {
1749 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>';
1751 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>';
1756 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"] .
'?id=' . $object->id .
'&action=delete&token=' . newToken(),
'delete', $user->hasRight(
'facture',
'supprimer'));
1762 print
'<div class="fichecenter"><div class="fichehalfleft">';
1763 print
'<a name="builddoc"></a>';
1767 $linktoelem = $form->showLinkToObjectBlock($object,
null, array(
'invoice'));
1769 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
1773 print
'<div class="fichehalfright">';
1778 $morehtmlcenter =
'';
1781 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
1783 $morehtmlcenter =
'';
1784 $somethingshown =
$formactions->showactions($object, $object->element, (is_object($object->thirdparty) ? $object->thirdparty->id : 0), 1,
'', $MAXEVENT,
'', $morehtmlcenter);
if(preg_match('/set_([a-z0-9_\-]+)/i', $action, $reg)) if(preg_match('/del_([a-z0-9_\-]+)/i', $action, $reg)) if($action=='set') elseif( $action=='specimen') elseif($action=='setmodel') elseif( $action=='del') elseif($action=='setdoc') $formactions
View.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
const STATUS_DRAFT
Draft status.
Class to manage a WYSIWYG editor.
Class to manage invoices.
const TYPE_REPLACEMENT
Replacement invoice.
const TYPE_STANDARD
Standard invoice.
Class to manage invoice lines of templates.
Class to manage invoice templates.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
static getIdAndTxFromCode($dbs, $code, $date_document='')
Get id and rate of currency from code.
Class to manage products or services.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
Class to manage Dolibarr users.
getCountry($searchkey, $withcode='', $dbtouse=0, $outputlangs='', $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
dol_get_last_hour($date, $gm='tzserver')
Return GMT time for last hour of a given GMT date (it replaces hours, min and second part to 23:59:59...
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='rowid', $fieldref='ref', $morehtmlref='', $moreparam='', $nodbprefix=0, $morehtmlleft='', $morehtmlstatus='', $onlybanner=0, $morehtmlright='')
Show tab footer of a card.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
dol_get_fiche_end($notab=0)
Return tab footer of a card.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
dol_htmlcleanlastbr($stringtodecode)
This function remove all ending and br at end.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='')
Show information for admin users or standard users.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
get_localtax($vatrate, $local, $thirdparty_buyer="", $thirdparty_seller="", $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $object=null, $include=null)
Return array of possible common substitutions.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
img_edit($titlealt='default', $float=0, $other='')
Show logo editer/modifier fiche.
img_info($titlealt='default')
Show info logo.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
invoice_rec_prepare_head($object)
Return array head with list of tabs to view object informations.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.