34 require
'../../main.inc.php';
35 require_once DOL_DOCUMENT_ROOT .
'/fourn/class/fournisseur.facture-rec.class.php';
36 require_once DOL_DOCUMENT_ROOT .
'/fourn/class/fournisseur.product.class.php';
37 require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
38 require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formother.class.php';
40 include_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
42 require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formprojet.class.php';
43 require_once DOL_DOCUMENT_ROOT .
'/core/class/doleditor.class.php';
44 require_once DOL_DOCUMENT_ROOT .
'/core/lib/invoice.lib.php';
45 require_once DOL_DOCUMENT_ROOT .
'/core/class/extrafields.class.php';
48 $langs->loadLangs(array(
'bills',
'companies',
'compta',
'admin',
'other',
'products',
'banks',
'suppliers'));
50 $action =
GETPOST(
'action',
'alpha');
51 $massaction =
GETPOST(
'massaction',
'alpha');
52 $show_files =
GETPOST(
'show_files',
'int');
53 $confirm =
GETPOST(
'confirm',
'alpha');
54 $cancel =
GETPOST(
'cancel',
'alpha');
55 $toselect =
GETPOST(
'toselect',
'array');
56 $contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'supplierinvoicetemplatelist';
58 $limit =
GETPOST(
'limit',
'int') ?
GETPOST(
'limit',
'int') : $conf->liste_limit;
59 $sortfield =
GETPOST(
"sortfield",
'alpha');
60 $sortorder =
GETPOST(
"sortorder",
'alpha');
65 $lineid =
GETPOST(
'lineid',
'int');
66 $title =
GETPOST(
'title',
'alpha');
67 $ref_supplier =
GETPOST(
'ref_supplier',
'alpha');
68 $projectid =
GETPOST(
'projectid',
'int');
69 $year_date_when =
GETPOST(
'year_date_when');
70 $month_date_when =
GETPOST(
'month_date_when');
72 $socid = $user->socid;
74 $objecttype =
'facturefournisseur_rec';
75 if ($action ==
"create" || $action ==
"add") {
79 if (empty($page) || $page == -1) {
82 $offset = $limit * $page;
87 $sortfield =
'f.titre';
89 $pageprev = $page - 1;
90 $pagenext = $page + 1;
93 if (($id > 0 || $title) && $action !=
'create' && $action !=
'add') {
94 $ret = $object->fetch($id, $title);
101 $hookmanager->initHooks(array(
'supplierinvoicereccard',
'globalcard'));
105 $extrafields->fetch_name_optionals_label($object->table_element);
107 $search_array_options = $extrafields->getOptionalsFromPost($object->table_element,
'',
'search_');
109 $permissionnote = $user->rights->fournisseur->facture->creer || $user->rights->supplier_invoice->creer;
110 $permissiondellink = $user->rights->fournisseur->facture->creer || $user->rights->supplier_invoice->creer;
111 $permissiontoedit = $user->rights->fournisseur->facture->creer || $user->rights->supplier_invoice->creer;
113 $usercanread = $user->rights->fournisseur->facture->lire || $user->rights->supplier_invoice->lire;
114 $usercancreate = $user->rights->fournisseur->facture->creer || $user->rights->supplier_invoice->creer;
115 $usercandelete = $user->rights->fournisseur->facture->supprimer || $user->rights->supplier_invoice->supprimer;
116 $usercanvalidate = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($usercancreate)) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->fournisseur->supplier_invoice_advance->validate)));
117 $usercansend = (empty($conf->global->MAIN_USE_ADVANCED_PERMS) || $user->rights->fournisseur->supplier_invoice_advance->send);
119 $usercanproductignorepricemin = ((!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->produit->ignore_price_min_advance)) || empty($conf->global->MAIN_USE_ADVANCED_PERMS));
120 $usercancreatemargin = $user->rights->margins->creer;
121 $usercanreadallmargin = $user->rights->margins->liretous;
122 $usercancreatewithdrarequest = $user->rights->prelevement->bons->creer;
128 $result =
restrictedArea($user,
'facture', $object->id, $objecttype);
134 if (
GETPOST(
'cancel',
'alpha')) {
138 if (!
GETPOST(
'confirmmassaction',
'alpha') && $massaction !=
'presend' && $massaction !=
'confirm_presend') {
142 $parameters = array(
'socid' => $socid);
143 $reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
148 if (empty($reshook)) {
149 if (
GETPOST(
'cancel',
'alpha')) {
154 include DOL_DOCUMENT_ROOT .
'/core/actions_changeselectedfields.inc.php';
157 include DOL_DOCUMENT_ROOT .
'/core/actions_setnotes.inc.php';
159 include DOL_DOCUMENT_ROOT .
'/core/actions_dellink.inc.php';
161 include DOL_DOCUMENT_ROOT .
'/core/actions_lineupdown.inc.php';
164 if ($action ==
'add') {
165 if (!
GETPOST(
'title',
'alphanohtml')) {
166 setEventMessages($langs->transnoentities(
"ErrorFieldRequired", $langs->trans(
"Title")),
null,
'errors');
171 $frequency =
GETPOST(
'frequency',
'int');
172 $reyear =
GETPOST(
'reyear',
'int');
173 $remonth =
GETPOST(
'remonth',
'int');
174 $reday =
GETPOST(
'reday',
'int');
175 $rehour =
GETPOST(
'rehour',
'int');
176 $remin =
GETPOST(
'remin',
'int');
177 $nb_gen_max =
GETPOST(
'nb_gen_max',
'int');
180 if (
GETPOST(
'frequency',
'int')) {
181 if (empty($reyear) || empty($remonth) || empty($reday)) {
182 setEventMessages($langs->transnoentities(
"ErrorFieldRequired", $langs->trans(
"Date")),
null,
'errors');
189 $object->titre =
GETPOST(
'title',
'alphanohtml');
190 $object->title =
GETPOST(
'title',
'alphanohtml');
191 $object->fk_project =
GETPOST(
'projectid',
'int');
192 $object->ref_supplier =
GETPOST(
'ref_supplier',
'alphanohtml');
194 $object->note_private =
GETPOST(
'note_private',
'restricthtml');
195 $object->note_public =
GETPOST(
'note_public',
'restricthtml');
196 $object->model_pdf =
GETPOST(
'modelpdf',
'alpha');
197 $object->usenewprice =
GETPOST(
'usenewprice',
'alpha');
199 $object->frequency = $frequency;
200 $object->unit_frequency =
GETPOST(
'unit_frequency',
'alpha');
201 $object->nb_gen_max = $nb_gen_max;
202 $object->auto_validate =
GETPOST(
'auto_validate',
'int');
203 $object->generate_pdf =
GETPOST(
'generate_pdf',
'int');
205 $date_next_execution =
dol_mktime($rehour, $remin, 0, $remonth, $reday, $reyear);
206 $object->date_when = $date_next_execution;
211 $oldinvoice->fetch(
GETPOST(
'facid',
'int'));
213 $object->cond_reglement_id = $oldinvoice->cond_reglement_id;
214 $object->cond_reglement_code = $oldinvoice->cond_reglement_code;
215 $object->cond_reglement_label = $oldinvoice->cond_reglement_label;
216 $object->cond_reglement_doc = $oldinvoice->cond_reglement_doc;
217 $object->mode_reglement_id = $oldinvoice->mode_reglement_id;
218 $object->mode_reglement_code = $oldinvoice->mode_reglement_code;
220 $result = $object->create($user, $oldinvoice->id);
222 $result = $oldinvoice->delete($user, 1);
237 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
'?facid=' . $object->id);
251 if ($action ==
'confirm_deleteinvoice' && $confirm ==
'yes' && ($user->rights->fournisseur->facture->supprimer || $user->rights->supplier_invoice->supprimer)) {
252 $object->delete($user);
254 header(
'Location: ' . DOL_URL_ROOT .
'/fourn/facture/list-rec.php');
260 if ($action ==
'setconditions' && $usercancreate) {
261 $result = $object->setPaymentTerms(
GETPOST(
'cond_reglement_id',
'int'));
262 } elseif ($action ==
'setmode' && $usercancreate) {
264 $result = $object->setPaymentMethods(
GETPOST(
'mode_reglement_id',
'int'));
265 } elseif ($action ==
'classin' && $usercancreate) {
267 $object->setProject(
GETPOST(
'projectid',
'int'));
268 } elseif ($action ==
'setref_supplier' && $usercancreate) {
269 $result = $object->setValueFrom(
'ref_supplier', $ref_supplier,
'',
null,
'text',
'', $user);
273 if ($object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
274 $langs->load(
"errors");
275 setEventMessages($langs->trans(
'ErrorRefAlreadyExists', $ref_supplier),
null,
'errors');
280 } elseif ($action ==
'settitle' && $usercancreate) {
281 $result = $object->setValueFrom(
'titre', $title,
'',
null,
'text',
'', $user);
284 $object->titre = $title;
285 $object->title = $title;
286 $object->ref = $object->title;
289 if ($object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
290 $langs->load(
"errors");
291 setEventMessages($langs->trans(
'ErrorTitreAlreadyExists', $title),
null,
'errors');
296 } elseif ($action ==
'setbankaccount' && $usercancreate) {
298 $result = $object->setBankAccount(
GETPOST(
'fk_account',
'int'));
299 } elseif ($action ==
'setfrequency' && $usercancreate) {
301 $object->setFrequencyAndUnit(
GETPOST(
'frequency',
'int'),
GETPOST(
'unit_frequency',
'alpha'));
302 } elseif ($action ==
'setdate_when' && $usercancreate) {
306 $object->setNextDate($date);
308 } elseif ($action ==
'setnb_gen_max' && $usercancreate) {
310 $object->setMaxPeriod(
GETPOST(
'nb_gen_max',
'int'));
311 } elseif ($action ==
'setauto_validate' && $usercancreate) {
313 $object->setAutoValidate(
GETPOST(
'auto_validate',
'int'));
314 } elseif ($action ==
'setgenerate_pdf' && $usercancreate) {
316 $object->setGeneratepdf(
GETPOST(
'generate_pdf',
'int'));
317 } elseif ($action ==
'setmodelpdf' && $usercancreate) {
319 $object->setModelpdf(
GETPOST(
'modelpdf',
'alpha'));
320 } elseif ($action ==
'disable' && $usercancreate) {
326 $res = $object->setValueFrom(
'suspended', 1);
337 } elseif ($action ==
'enable' && $usercancreate) {
343 $res = $object->setValueFrom(
'suspended', 0);
354 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
356 $result = $object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
357 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
359 $result = $object->setMulticurrencyRate(
price2num(
GETPOST(
'multicurrency_tx')),
GETPOST(
'calculation_mode',
'int'));
360 } elseif ($action ==
'setlibelle' && $usercancreate) {
363 $object->libelle =
GETPOST(
'libelle');
364 $result = $object->update($user);
372 if ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $usercancreate) {
374 $object->fetch_thirdparty();
383 if ($line->delete($user) > 0) {
384 $result = $object->update_price(1);
388 $object->fetch($object->id);
397 } elseif ($action ==
'update_extras') {
401 $ret = $extrafields->setOptionalsFromPost(
null, $object,
GETPOST(
'attribute',
'restricthtml'));
407 $result = $object->insertExtraFields(
'BILLREC_MODIFY');
416 if ($action ==
'addline' && $usercancreate) {
417 $langs->load(
'errors');
425 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'alpha');
426 if ($prod_entry_mode ==
'free') {
428 $tva_tx = (
GETPOST(
'tva_tx',
'alpha') ?
GETPOST(
'tva_tx',
'alpha') : 0);
429 $ref_fournisseur = (
GETPOSTISSET(
'fourn_ref') ?
GETPOST(
'fourn_ref',
'restricthtml') :
'');
431 $idprod =
GETPOST(
'idprod',
'int');
439 $extralabelsline = $extrafields->fetch_name_optionals_label($object->table_element_line);
440 $array_options = $extrafields->getOptionalsFromPost($object->table_element_line, $predef);
442 if (is_array($extralabelsline)) {
444 foreach ($extralabelsline as $key => $value) {
445 unset($_POST[
"options_" . $key . $predef]);
449 if ((empty($idprod) || $idprod < 0) && ($price_ht < 0) && ($qty < 0)) {
450 setEventMessages($langs->trans(
'ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv(
'UnitPriceHT'), $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
453 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
454 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Type')),
null,
'errors');
457 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && (! ($price_ht >= 0) || $price_ht ==
'')) {
458 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
462 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
465 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($product_desc)) {
466 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Description')),
null,
'errors');
470 $langs->load(
"errors");
471 setEventMessages($langs->trans(
'ErrorQtyForCustomerInvoiceCantBeNegative'),
null,
'errors');
475 if ($prod_entry_mode !=
'free' && empty($error)) {
479 if (
GETPOST(
'idprodfournprice',
'alpha') == -1 ||
GETPOST(
'idprodfournprice',
'alpha') ==
'') {
483 if (preg_match(
'/^idprod_([0-9]+)$/',
GETPOST(
'idprodfournprice',
'alpha'), $reg)) {
484 $idprod = (int) $reg[1];
485 $res = $productsupplier->fetch($idprod);
488 if (!empty($conf->global->SUPPLIER_TAKE_FIRST_PRICE_IF_NO_PRICE_FOR_CURRENT_SUPPLIER)) {
490 $productsupplier->get_buyprice(0, -1, $idprod,
'none', $fksoctosearch);
491 if ($productsupplier->fourn_socid != $socid) {
492 $productsupplier->ref_supplier =
'';
495 $fksoctosearch = $object->thirdparty->id;
496 $productsupplier->get_buyprice(0, -1, $idprod,
'none', $fksoctosearch);
498 } elseif (
GETPOST(
'idprodfournprice',
'alpha') > 0) {
500 $idprod = $productsupplier->get_buyprice(
GETPOST(
'idprodfournprice',
'alpha'), $qtytosearch);
501 $res = $productsupplier->fetch($idprod);
502 $ref_fournisseur = $productsupplier->ref_supplier;
506 if (! $error && ($qty >= 0) && (!empty($product_desc) || (!empty($idprod) && $idprod > 0))) {
507 $ret = $object->fetch($id);
512 $ret = $object->fetch_thirdparty();
515 $date_start =
dol_mktime(
GETPOST(
'date_start' . $predef .
'hour'),
GETPOST(
'date_start' . $predef .
'min'),
GETPOST(
'date_start' . $predef .
'sec'),
GETPOST(
'date_start' . $predef .
'month'),
GETPOST(
'date_start' . $predef .
'day'),
GETPOST(
'date_start' . $predef .
'year'));
516 $date_end =
dol_mktime(
GETPOST(
'date_end' . $predef .
'hour'),
GETPOST(
'date_end' . $predef .
'min'),
GETPOST(
'date_end' . $predef .
'sec'),
GETPOST(
'date_end' . $predef .
'month'),
GETPOST(
'date_end' . $predef .
'day'),
GETPOST(
'date_end' . $predef .
'year'));
517 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
528 if (!empty($idprod) && $idprod > 0) {
530 $prod->fetch($idprod);
532 $label = ((
GETPOST(
'product_label') &&
GETPOST(
'product_label') != $prod->label) ?
GETPOST(
'product_label') :
'');
537 if (empty($tva_tx)) {
544 $datapriceofproduct = $prod->getSellPrice($mysoc, $object->thirdparty, $pqp);
546 $pu_ht = $datapriceofproduct[
'pu_ht'];
547 $pu_ttc = $datapriceofproduct[
'pu_ttc'];
548 $price_min = $datapriceofproduct[
'price_min'];
549 $price_base_type = $datapriceofproduct[
'price_base_type'];
550 $tva_tx = $datapriceofproduct[
'tva_tx'];
551 $tva_npr = $datapriceofproduct[
'tva_npr'];
553 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
554 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $prod->tva_tx));
557 if (!empty($price_ht)) {
559 $pu_ttc =
price2num($pu_ht * (1 + ($tmpvat / 100)),
'MU');
560 } elseif ($tmpvat != $tmpprodvat) {
563 if ($price_base_type !=
'HT') {
564 $pu_ht =
price2num($pu_ttc / (1 + ($tmpvat / 100)),
'MU');
566 $pu_ttc =
price2num($pu_ht * (1 + ($tmpvat / 100)),
'MU');
573 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && !empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) {
574 $outputlangs = $langs;
576 if (empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
577 $newlang =
GETPOST(
'lang_id',
'aZ09');
579 if (empty($newlang)) {
580 $newlang = $object->thirdparty->default_lang;
582 if (!empty($newlang)) {
584 $outputlangs->setDefaultLang($newlang);
587 $desc = (!empty($prod->multilangs [$outputlangs->defaultlang] [
"description"])) ? $prod->multilangs [$outputlangs->defaultlang] [
"description"] : $prod->description;
589 $desc = $prod->description;
595 if (empty($conf->global->MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE) && (!empty($prod->customcode) || !empty($prod->country_code))) {
598 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && !empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) {
599 $outputlangs = $langs;
601 if (empty($newlang) &&
GETPOST(
'lang_id',
'alpha')) {
602 $newlang =
GETPOST(
'lang_id',
'alpha');
604 if (empty($newlang)) {
605 $newlang = $object->thirdparty->default_lang;
607 if (!empty($newlang)) {
609 $outputlangs->setDefaultLang($newlang);
610 $outputlangs->load(
'products');
612 if (!empty($prod->customcode)) {
613 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomCode") .
': ' . $prod->customcode;
615 if (!empty($prod->customcode) && !empty($prod->country_code)) {
618 if (!empty($prod->country_code)) {
619 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin") .
': ' .
getCountry($prod->country_code, 0, $db, $outputlangs, 0);
622 if (!empty($prod->customcode)) {
623 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomCode") .
': ' . $prod->customcode;
625 if (!empty($prod->customcode) && !empty($prod->country_code)) {
628 if (!empty($prod->country_code)) {
629 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin") .
': ' .
getCountry($prod->country_code, 0, $db, $langs, 0);
637 $fk_unit = $prod->fk_unit;
641 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
642 $tva_tx = str_replace(
'*',
'', $tva_tx);
643 if (empty($tva_tx)) {
646 $desc = $product_desc;
648 $fk_unit =
GETPOST(
'units',
'alpha');
651 $date_start_fill = !empty(
GETPOST(
'date_start_fill',
'int')) ?
GETPOST(
'date_start_fill',
'int') : null;
652 $date_end_fill = !empty(
GETPOST(
'date_end_fill',
'int')) ?
GETPOST(
'date_end_fill',
'int') : null;
659 $localtax1_tx =
get_localtax($tva_tx, 1, $object->thirdparty, $mysoc, $tva_npr);
660 $localtax2_tx =
get_localtax($tva_tx, 2, $object->thirdparty, $mysoc, $tva_npr);
671 if ($usercanproductignorepricemin && (!empty($price_min) && ($pu_ht * (1 - $remise_percent / 100) < $price_min))) {
672 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
676 $result = $object->addline($idprod, $ref_fournisseur, $label, $desc, $pu_ht, $pu_ttc, $qty, $remise_percent, $tva_tx, $localtax1_tx, $localtax2_tx, $price_base_type, $type, $date_start_fill, $date_end_fill, $info_bits, $special_code, -1, $fk_unit);
679 $object->fetch($object->id);
681 unset($_POST[
'prod_entry_mode']);
682 unset($_POST[
'qty']);
683 unset($_POST[
'type']);
684 unset($_POST[
'remise_percent']);
685 unset($_POST[
'price_ht']);
686 unset($_POST[
'multicurrency_price_ht']);
687 unset($_POST[
'price_ttc']);
688 unset($_POST[
'tva_tx']);
689 unset($_POST[
'product_ref']);
690 unset($_POST[
'product_label']);
691 unset($_POST[
'product_desc']);
692 unset($_POST[
'fournprice']);
693 unset($_POST[
'buying_price']);
694 unset($_POST[
'np_marginRate']);
695 unset($_POST[
'np_markRate']);
696 unset($_POST[
'dp_desc']);
697 unset($_POST[
'idprod']);
698 unset($_POST[
'units']);
699 unset($_POST[
'date_starthour']);
700 unset($_POST[
'date_startmin']);
701 unset($_POST[
'date_startsec']);
702 unset($_POST[
'date_startday']);
703 unset($_POST[
'date_startmonth']);
704 unset($_POST[
'date_startyear']);
705 unset($_POST[
'date_endhour']);
706 unset($_POST[
'date_endmin']);
707 unset($_POST[
'date_endsec']);
708 unset($_POST[
'date_endday']);
709 unset($_POST[
'date_endmonth']);
710 unset($_POST[
'date_endyear']);
711 unset($_POST[
'date_start_fill']);
712 unset($_POST[
'date_end_fill']);
713 unset($_POST[
'situations']);
714 unset($_POST[
'progress']);
722 } elseif ($action ==
'updateline' && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
723 if (! $object->fetch($id) > 0) {
726 $object->fetch_thirdparty();
732 $ref_fourn =
GETPOST(
'fourn_ref',
'alpha');
740 if (preg_match(
'/\*/', $vat_rate)) {
745 $vat_rate = str_replace(
'*',
'', $vat_rate);
746 $localtax1_rate =
get_localtax($vat_rate, 1, $object->thirdparty);
747 $localtax2_rate =
get_localtax($vat_rate, 2, $object->thirdparty);
750 $extralabelsline = $extrafields->fetch_name_optionals_label($object->table_element_line);
751 $array_options = $extrafields->getOptionalsFromPost($object->table_element_line);
754 if ($objectline->fetch(
GETPOST(
'lineid',
'int'))) {
755 $objectline->array_options = $array_options;
756 $result = $objectline->insertExtraFields();
762 $position = ($objectline->rang >= 0 ? $objectline->rang : 0);
765 if (is_array($extralabelsline)) {
767 foreach ($extralabelsline as $key => $value) {
768 unset($_POST[
"options_" . $key]);
773 $special_code =
GETPOST(
'special_code',
'int');
774 if (!
GETPOST(
'qty',
'alpha')) {
781 $productid =
GETPOST(
'productid',
'int');
782 if (!empty($productid)) {
784 $product->fetch($productid);
786 $type = $product->type;
788 $price_min = $product->price_min;
789 if (!empty($conf->global->PRODUIT_MULTIPRICES) && !empty($object->thirdparty->price_level)) {
790 $price_min = $product->multiprices_min[$object->thirdparty->price_level];
793 $label = $product->label;
796 if (((!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->produit->ignore_price_min_advance)) || empty($conf->global->MAIN_USE_ADVANCED_PERMS)) && $price_min && (
price2num($pu_ht) * (1 - $remise_percent / 100) <
price2num($price_min))) {
797 setEventMessages($langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency)),
null,
'errors');
801 $type =
GETPOST(
'type',
'int');
802 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
805 if (
GETPOST(
'type',
'int') < 0) {
806 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
811 $langs->load(
"errors");
812 setEventMessages($langs->trans(
'ErrorQtyForCustomerInvoiceCantBeNegative'),
null,
'errors');
816 $date_start_fill = !empty(
GETPOST(
'date_start_fill',
'int')) ?
GETPOST(
'date_start_fill',
'int') :
'NULL';
817 $date_end_fill = !empty(
GETPOST(
'date_end_fill',
'int')) ?
GETPOST(
'date_end_fill',
'int') :
'NULL';
821 $result = $object->updateline(
GETPOST(
'lineid',
'int'),
GETPOST(
'productid',
'int'), $ref_fourn, $label, $description, $pu_ht, $qty, $remise_percent, $vat_rate, $localtax1_rate, $localtax1_rate,
'HT', $type, $date_start_fill, $date_end_fill, $info_bits, $special_code, -1);
823 $object->fetch($object->id);
825 unset($_POST[
'qty']);
826 unset($_POST[
'type']);
827 unset($_POST[
'productid']);
828 unset($_POST[
'remise_percent']);
829 unset($_POST[
'price_ht']);
830 unset($_POST[
'multicurrency_price_ht']);
831 unset($_POST[
'price_ttc']);
832 unset($_POST[
'tva_tx']);
833 unset($_POST[
'product_ref']);
834 unset($_POST[
'product_label']);
835 unset($_POST[
'product_desc']);
836 unset($_POST[
'fournprice']);
837 unset($_POST[
'buying_price']);
838 unset($_POST[
'np_marginRate']);
839 unset($_POST[
'np_markRate']);
840 unset($_POST[
'dp_desc']);
841 unset($_POST[
'idprod']);
842 unset($_POST[
'units']);
843 unset($_POST[
'date_starthour']);
844 unset($_POST[
'date_startmin']);
845 unset($_POST[
'date_startsec']);
846 unset($_POST[
'date_startday']);
847 unset($_POST[
'date_startmonth']);
848 unset($_POST[
'date_startyear']);
849 unset($_POST[
'date_endhour']);
850 unset($_POST[
'date_endmin']);
851 unset($_POST[
'date_endsec']);
852 unset($_POST[
'date_endday']);
853 unset($_POST[
'date_endmonth']);
854 unset($_POST[
'date_endyear']);
855 unset($_POST[
'situations']);
856 unset($_POST[
'progress']);
876 $companystatic =
new Societe($db);
885 if ($action ==
'create') {
886 print
load_fiche_titre($langs->trans(
"CreateRepeatableInvoice"),
'',
'bill');
889 $product_static =
new Product($db);
891 if ($object->fetch($id) > 0) {
892 $result = $object->fetch_lines();
894 print
'<form action="' . $_SERVER[
"PHP_SELF"] .
'" method="POST">';
895 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
896 print
'<input type="hidden" name="action" value="add">';
897 print
'<input type="hidden" name="facid" value="' . $object->id .
'">';
903 if ($object->fk_account > 0) $rowspan++;
905 print
'<table class="border centpercent">';
907 $object->fetch_thirdparty();
910 print
'<tr><td class="titlefieldcreate fieldrequired">' . $langs->trans(
"Title") .
'</td><td>';
911 print
'<input class="flat quatrevingtpercent" type="text" name="title" value="' .
dol_escape_htmltag(
GETPOST(
"title",
'alphanohtml')) .
'">';
915 print
'<tr><td class="titlefieldcreate fieldrequired">' . $langs->trans(
"SupplierRef") .
'</td><td>';
916 print
'<input class="flat quatrevingtpercent" type="text" name="ref_supplier" value="' . $object->ref_supplier .
'">';
920 print
'<tr><td class="titlefieldcreate">' . $langs->trans(
"Customer") .
'</td><td>' . $object->thirdparty->getNomUrl(1,
'customer') .
'</td>';
923 $note_public =
GETPOSTISSET(
'note_public') ?
GETPOST(
'note_public',
'restricthtml') : $object->note_public;
924 $note_private =
GETPOSTISSET(
'note_private') ?
GETPOST(
'note_private',
'restricthtml') : $object->note_private;
929 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH__'] = $langs->trans(
"PreviousMonthOfInvoice") .
' (' . $langs->trans(
"Example") .
': ' .
dol_print_date(
dol_time_plus_duree($object->date, -1,
'm'),
'%m') .
')';
930 $substitutionarray[
'__INVOICE_MONTH__'] = $langs->trans(
"MonthOfInvoice") .
' (' . $langs->trans(
"Example") .
': ' .
dol_print_date($object->date,
'%m') .
')';
931 $substitutionarray[
'__INVOICE_NEXT_MONTH__'] = $langs->trans(
"NextMonthOfInvoice") .
' (' . $langs->trans(
"Example") .
': ' .
dol_print_date(
dol_time_plus_duree($object->date, 1,
'm'),
'%m') .
')';
932 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH_TEXT__'] = $langs->trans(
"TextPreviousMonthOfInvoice") .
' (' . $langs->trans(
"Example") .
': ' .
dol_print_date(
dol_time_plus_duree($object->date, -1,
'm'),
'%B') .
')';
933 $substitutionarray[
'__INVOICE_MONTH_TEXT__'] = $langs->trans(
"TextMonthOfInvoice") .
' (' . $langs->trans(
"Example") .
': ' .
dol_print_date($object->date,
'%B') .
')';
934 $substitutionarray[
'__INVOICE_NEXT_MONTH_TEXT__'] = $langs->trans(
"TextNextMonthOfInvoice") .
' (' . $langs->trans(
"Example") .
': ' .
dol_print_date(
dol_time_plus_duree($object->date, 1,
'm'),
'%B') .
')';
935 $substitutionarray[
'__INVOICE_PREVIOUS_YEAR__'] = $langs->trans(
"PreviousYearOfInvoice") .
' (' . $langs->trans(
"Example") .
': ' .
dol_print_date(
dol_time_plus_duree($object->date, -1,
'y'),
'%Y') .
')';
936 $substitutionarray[
'__INVOICE_YEAR__'] = $langs->trans(
"YearOfInvoice") .
' (' . $langs->trans(
"Example") .
': ' .
dol_print_date($object->date,
'%Y') .
')';
937 $substitutionarray[
'__INVOICE_NEXT_YEAR__'] = $langs->trans(
"NextYearOfInvoice") .
' (' . $langs->trans(
"Example") .
': ' .
dol_print_date(
dol_time_plus_duree($object->date, 1,
'y'),
'%Y') .
')';
939 $substitutionarray[
'__INVOICE_DATE_NEXT_INVOICE_BEFORE_GEN__'] = $langs->trans(
"DateNextInvoiceBeforeGen") .
' (' . $langs->trans(
"Example") .
': ' .
dol_print_date($object->date_when,
'dayhour') .
')';
940 $substitutionarray[
'__INVOICE_DATE_NEXT_INVOICE_AFTER_GEN__'] = $langs->trans(
"DateNextInvoiceAfterGen") .
' (' . $langs->trans(
"Example") .
': ' .
dol_print_date(
dol_time_plus_duree($object->date_when, $object->frequency, $object->unit_frequency),
'dayhour') .
')';
941 $substitutionarray[
'__INVOICE_COUNTER_CURRENT__'] = $langs->trans(
"Count");
942 $substitutionarray[
'__INVOICE_COUNTER_MAX__'] = $langs->trans(
"MaxPeriodNumber");
944 $htmltext =
'<i>' . $langs->trans(
"FollowingConstantsWillBeSubstituted") .
':<br>';
945 foreach ($substitutionarray as $key => $val) {
946 $htmltext .= $key .
' = ' . $langs->trans($val) .
'<br>';
951 print
'<tr><td class="titlefieldcreate">' . $langs->trans(
"Label") .
'</td><td>';
952 print
'<input class="flat quatrevingtpercent" type="text" name="libelle" value="' . $object->label .
'">';
957 print
'<td class="tdtop">';
958 print
$form->textwithpicto($langs->trans(
'NotePublic'), $htmltext, 1,
'help',
'', 0, 2,
'notepublic');
961 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 80,
'dolibarr_notes',
'In', 0,
false, empty($conf->global->FCKEDITOR_ENABLE_NOTE_PUBLIC) ? 0 : 1, ROWS_3,
'90%');
962 print $doleditor->Create(1);
965 if (empty($user->socid)) {
967 print
'<td class="tdtop">';
968 print
$form->textwithpicto($langs->trans(
'NotePrivate'), $htmltext, 1,
'help',
'', 0, 2,
'noteprivate');
971 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 80,
'dolibarr_notes',
'In', 0,
false, empty($conf->global->FCKEDITOR_ENABLE_NOTE_PRIVATE) ? 0 : 1, ROWS_3,
'90%');
972 print $doleditor->Create(1);
977 print
"<tr><td>" . $langs->trans(
"Author") .
"</td><td>" . $user->getFullName($langs) .
"</td></tr>";
980 print
"<tr><td>" . $langs->trans(
"PaymentConditions") .
"</td><td>";
981 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'] .
'?id=' . $object->id, $object->cond_reglement_id,
'none');
985 print
"<tr><td>" . $langs->trans(
"PaymentMode") .
"</td><td>";
986 $form->form_modes_reglement($_SERVER[
'PHP_SELF'] .
'?id=' . $object->id, $object->mode_reglement_id,
'none',
'', 1);
990 if (
isModEnabled(
'project') && is_object($object->thirdparty) && $object->thirdparty->id > 0) {
991 $projectid =
GETPOST(
'projectid') ?
GETPOST(
'projectid') : $object->fk_project;
992 $langs->load(
'projects');
993 print
'<tr><td>' . $langs->trans(
'Project') .
'</td><td>';
994 $numprojet = $formproject->select_projects($object->thirdparty->id, $projectid,
'projectid', 0, 0, 1, 0, 0, 0, 0,
'', 0, 0,
'');
995 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 :
'')) .
'">' . $langs->trans(
"AddProject") .
'</a>';
1000 if ($object->fk_account > 0) {
1001 print
"<tr><td>" . $langs->trans(
'BankAccount') .
"</td><td>";
1002 $form->formSelectAccount($_SERVER[
'PHP_SELF'] .
'?id=' . $object->id, $object->fk_account,
'none');
1007 print
"<tr><td>" . $langs->trans(
'Model') .
"</td><td>";
1008 include_once DOL_DOCUMENT_ROOT .
'/core/modules/supplier_invoice/modules_facturefournisseur.php';
1010 print
$form->selectarray(
'modelpdf', $list, $conf->global->INVOICE_SUPPLIER_ADDON_PDF);
1018 $title = $langs->trans(
"Recurrence");
1023 print
'<table class="border centpercent">';
1026 print
'<tr><td class="titlefieldcreate">' .
$form->textwithpicto($langs->trans(
"Frequency"), $langs->transnoentitiesnoconv(
'toolTipFrequency')) .
"</td><td>";
1027 print
"<input type='text' name='frequency' value='" .
GETPOST(
'frequency',
'int') .
"' size='4' /> " .
$form->selectarray(
'unit_frequency', array(
'd' => $langs->trans(
'Day'),
'm' => $langs->trans(
'Month'),
'y' => $langs->trans(
'Year')), (
GETPOST(
'unit_frequency') ?
GETPOST(
'unit_frequency') :
'm'));
1031 print
"<tr><td>" . $langs->trans(
'NextDateToExecution') .
"</td><td>";
1033 print
$form->selectDate($date_next_execution,
'', 1, 1,
'',
"add", 1, 1);
1037 print
"<tr><td>" . $langs->trans(
"MaxPeriodNumber") .
"</td><td>";
1038 print
'<input type="text" name="nb_gen_max" value="' .
GETPOST(
'nb_gen_max') .
'" size="5" />';
1042 print
"<tr><td>" . $langs->trans(
"StatusOfGeneratedInvoices") .
"</td><td>";
1043 $select = array(
'0' => $langs->trans(
'BillStatusDraft'),
'1' => $langs->trans(
'BillStatusValidated'));
1044 print
$form->selectarray(
'auto_validate', $select,
GETPOST(
'auto_validate'));
1048 if (!empty($conf->global->INVOICE_REC_CAN_DISABLE_DOCUMENT_FILE_GENERATION)) {
1049 print
"<tr><td>" . $langs->trans(
"StatusOfGeneratedDocuments") .
"</td><td>";
1050 $select = array(
'0' => $langs->trans(
'DoNotGenerateDoc'),
'1' => $langs->trans(
'AutoGenerateDoc'));
1051 print
$form->selectarray(
'generate_pdf', $select,
GETPOST(
'generate_pdf'));
1054 print
'<input type="hidden" name="generate_pdf" value="1">';
1061 $title = $langs->trans(
"ProductsAndServices");
1062 if (empty($conf->service->enabled)) {
1063 $title = $langs->trans(
"Products");
1064 } elseif (empty($conf->product->enabled)) {
1065 $title = $langs->trans(
"Services");
1073 print
'<div class="div-table-responsive-no-min">';
1074 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
1076 if (!empty($object->lines)) {
1080 $object->printObjectLines(
'', $mysoc, $object->thirdparty, $lineid, 0);
1088 print
$form->buttonsSaveCancel(
"Create");
1098 if ($object->id > 0) {
1099 $object->fetch($object->id);
1100 $object->fetch_thirdparty();
1103 if ($action ==
'ask_deleteline') {
1104 $formconfirm =
$form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' . $object->id .
'&lineid=' . $lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'',
'no', 1);
1108 if ($action ==
'ask_deleteinvoice') {
1109 $formconfirm =
$form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' . $object->id, $langs->trans(
'DeleteRepeatableInvoice'), $langs->trans(
'ConfirmDeleteRepeatableInvoice'),
'confirm_deleteinvoice',
'',
'no', 1);
1114 $author =
new User($db);
1115 $author->fetch($object->user_author);
1119 print
dol_get_fiche_head($head,
'card', $langs->trans(
'RepeatableInvoice'), -1,
'bill');
1123 $linkback =
'<a href="' . DOL_URL_ROOT .
'/fourn/facture/list-rec.php?restore_lastsearch_values=1' . (!empty($socid) ?
'&socid=' . $socid :
'') .
'">' . $langs->trans(
'BackToList') .
'</a>';
1126 if ($action !=
'edittitle') {
1127 $morehtmlref .=
$form->editfieldkey($object->titre,
'title', $object->titre, $object, $usercancreate,
'',
'', 0, 2);
1129 $morehtmlref .=
$form->editfieldval(
'',
'title', $object->titre, $object, $usercancreate,
'string');
1131 $morehtmlref .=
'<div class="refidno">';
1133 $morehtmlref .=
$form->editfieldkey(
"RefSupplier",
'ref_supplier', $object->ref_supplier, $object, $usercancreate,
'string',
'', 0, 1);
1134 $morehtmlref .=
$form->editfieldval(
"RefSupplier",
'ref_supplier', $object->ref_supplier, $object, $usercancreate,
'string',
'',
null,
null,
'', 1);
1136 $morehtmlref .=
'<br>' . $langs->trans(
'ThirdParty') .
' : ' . $object->thirdparty->getNomUrl(1);
1140 $langs->load(
'projects');
1141 $morehtmlref .=
'<br>' . $langs->trans(
'Project') .
' ';
1142 if ($usercancreate) {
1143 if ($action !=
'classify') {
1144 $morehtmlref .=
'<a class="editfielda" href="' . $_SERVER[
'PHP_SELF'] .
'?action=classify&token=' .
newToken() .
'&id=' . $object->id .
'">' .
img_edit($langs->transnoentitiesnoconv(
'SetProject')) .
'</a> : ';
1146 if ($action ==
'classify') {
1147 $morehtmlref .=
'<form method="post" action="' . $_SERVER[
'PHP_SELF'] .
'?id=' . $object->id .
'">';
1148 $morehtmlref .=
'<input type="hidden" name="action" value="classin">';
1149 $morehtmlref .=
'<input type="hidden" name="token" value="' .
newToken() .
'">';
1150 $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project,
'projectid', $maxlength, 0, 1, 0, 1, 0, 0,
'', 1);
1151 $morehtmlref .=
'<input type="submit" class="button valignmiddle" value="' . $langs->trans(
"Modify") .
'">';
1152 $morehtmlref .=
'</form>';
1154 $morehtmlref .=
$form->form_project($_SERVER[
'PHP_SELF'] .
'?id=' . $object->id, $object->socid, $object->fk_project,
'none', 0, 0, 0, 1);
1157 if (!empty($object->fk_project)) {
1159 $project->fetch($object->fk_project);
1160 $morehtmlref .=
' : ' . $project->getNomUrl(1);
1161 if ($project->title) {
1162 $morehtmlref .=
' - ' . $project->title;
1169 $morehtmlref .=
'</div>';
1171 $morehtmlright =
'';
1173 dol_banner_tab($object,
'ref', $linkback, 1,
'title',
'none', $morehtmlref,
'', 0,
'', $morehtmlright);
1175 print
'<div class="fichecenter">';
1176 print
'<div class="fichehalfleft">';
1177 print
'<div class="underbanner clearboth"></div>';
1179 print
'<table class="border centpercent tableforfield">';
1181 print
'<tr><td class="titlefield">' . $langs->trans(
'Author') .
'</td><td>';
1182 print $author->getNomUrl(-1);
1187 print
'<td>' .
$form->editfieldkey(
"Label",
'libelle', $object->libelle, $object, $usercancreate) .
'</td>';
1188 print
'<td>' .
$form->editfieldval(
"Label",
'libelle', $object->libelle, $object, $usercancreate) .
'</td>';
1191 print
'<tr><td>' . $langs->trans(
'AmountHT') .
'</td>';
1192 print
'<td>' .
price($object->total_ht,
'', $langs, 1, -1, -1, $conf->currency) .
'</td>';
1195 print
'<tr><td>' . $langs->trans(
"AmountVAT") .
'</td><td>' .
price($object->total_tva,
'', $langs, 1, -1, -1, $conf->currency) .
'</td>';
1199 if (($mysoc->localtax1_assuj ==
"1" && $mysoc->useLocalTax(1)) || $object->total_localtax1 != 0) {
1200 print
'<tr><td>' . $langs->transcountry(
"AmountLT1", $mysoc->country_code) .
'</td>';
1201 print
'<td class="nowrap">' .
price($object->total_localtax1, 1,
'', 1, -1, -1, $conf->currency) .
'</td></tr>';
1203 if (($mysoc->localtax2_assuj ==
"1" && $mysoc->useLocalTax(2)) || $object->total_localtax2 != 0) {
1204 print
'<tr><td>' . $langs->transcountry(
"AmountLT2", $mysoc->country_code) .
'</td>';
1205 print
'<td class=nowrap">' .
price($object->total_localtax2, 1,
'', 1, -1, -1, $conf->currency) .
'</td></tr>';
1208 print
'<tr><td>' . $langs->trans(
"AmountTTC") .
'</td><td colspan="3">' .
price($object->total_ttc,
'', $langs, 1, -1, -1, $conf->currency) .
'</td>';
1213 print
'<table class="nobordernopadding centpercent"><tr><td>';
1214 print $langs->trans(
'PaymentConditionsShort');
1216 if ($action !=
'editconditions' && $usercancreate) {
1217 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>';
1219 print
'</tr></table>';
1221 if ($action ==
'editconditions') {
1222 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'] .
'?facid=' . $object->id, $object->cond_reglement_id,
'cond_reglement_id');
1224 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'] .
'?facid=' . $object->id, $object->cond_reglement_id,
'none');
1231 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1232 print $langs->trans(
'PaymentMode');
1234 if ($action !=
'editmode' && $usercancreate) {
1235 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>';
1237 print
'</tr></table>';
1239 if ($action ==
'editmode') {
1240 $form->form_modes_reglement($_SERVER[
'PHP_SELF'] .
'?facid=' . $object->id, $object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
1242 $form->form_modes_reglement($_SERVER[
'PHP_SELF'] .
'?facid=' . $object->id, $object->mode_reglement_id,
'none');
1251 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1252 print
$form->editfieldkey(
'Currency',
'multicurrency_code',
'', $object, 0);
1254 if ($usercancreate && $action !=
'editmulticurrencycode' && !empty($object->brouillon)) {
1255 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>';
1257 print
'</tr></table>';
1259 $htmlname = (($usercancreate && $action ==
'editmulticurrencycode') ?
'multicurrency_code' :
'none');
1260 $form->form_multicurrency_code($_SERVER[
'PHP_SELF'] .
'?id=' . $object->id, $object->multicurrency_code, $htmlname);
1264 if ($object->multicurrency_code != $conf->currency || $object->multicurrency_tx != 1) {
1267 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1268 print
$form->editfieldkey(
'CurrencyRate',
'multicurrency_tx',
'', $object, 0);
1270 if ($usercancreate && $action !=
'editmulticurrencyrate' && !empty($object->brouillon) && $object->multicurrency_code && $object->multicurrency_code != $conf->currency) {
1271 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>';
1273 print
'</tr></table>';
1275 if ($action ==
'editmulticurrencyrate' || $action ==
'actualizemulticurrencyrate') {
1276 if ($action ==
'actualizemulticurrencyrate') {
1279 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'] .
'?id=' . $object->id, $object->multicurrency_tx, ($usercancreate ?
'multicurrency_tx' :
'none'), $object->multicurrency_code);
1281 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'] .
'?id=' . $object->id, $object->multicurrency_tx,
'none', $object->multicurrency_code);
1282 if ($object->statut == $object::STATUS_DRAFT && $object->multicurrency_code && $object->multicurrency_code != $conf->currency) {
1283 print
'<div class="inline-block"> ';
1284 print
'<a href="' . $_SERVER[
"PHP_SELF"] .
'?id=' . $object->id .
'&action=actualizemulticurrencyrate">' . $langs->trans(
"ActualizeCurrency") .
'</a>';
1294 if (!empty($object->frequency) && !empty($object->date_when)) {
1295 $dateexample = $object->date_when;
1300 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH__'] = $langs->trans(
"PreviousMonthOfInvoice") .
' (' . $langs->trans(
"Example") .
': ' .
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'm'),
'%m') .
')';
1301 $substitutionarray[
'__INVOICE_MONTH__'] = $langs->trans(
"MonthOfInvoice") .
' (' . $langs->trans(
"Example") .
': ' .
dol_print_date($dateexample,
'%m') .
')';
1302 $substitutionarray[
'__INVOICE_NEXT_MONTH__'] = $langs->trans(
"NextMonthOfInvoice") .
' (' . $langs->trans(
"Example") .
': ' .
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'm'),
'%m') .
')';
1303 $substitutionarray[
'__INVOICE_PREVIOUS_MONTH_TEXT__'] = $langs->trans(
"TextPreviousMonthOfInvoice") .
' (' . $langs->trans(
"Example") .
': ' .
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'm'),
'%B') .
')';
1304 $substitutionarray[
'__INVOICE_MONTH_TEXT__'] = $langs->trans(
"TextMonthOfInvoice") .
' (' . $langs->trans(
"Example") .
': ' .
dol_print_date($dateexample,
'%B') .
')';
1305 $substitutionarray[
'__INVOICE_NEXT_MONTH_TEXT__'] = $langs->trans(
"TextNextMonthOfInvoice") .
' (' . $langs->trans(
"Example") .
': ' .
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'm'),
'%B') .
')';
1306 $substitutionarray[
'__INVOICE_PREVIOUS_YEAR__'] = $langs->trans(
"PreviousYearOfInvoice") .
' (' . $langs->trans(
"Example") .
': ' .
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'y'),
'%Y') .
')';
1307 $substitutionarray[
'__INVOICE_YEAR__'] = $langs->trans(
"YearOfInvoice") .
' (' . $langs->trans(
"Example") .
': ' .
dol_print_date($dateexample,
'%Y') .
')';
1308 $substitutionarray[
'__INVOICE_NEXT_YEAR__'] = $langs->trans(
"NextYearOfInvoice") .
' (' . $langs->trans(
"Example") .
': ' .
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'y'),
'%Y') .
')';
1310 $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') .
')';
1311 $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') .
')';
1312 $substitutionarray[
'__INVOICE_COUNTER_CURRENT__'] = $object->nb_gen_done;
1313 $substitutionarray[
'__INVOICE_COUNTER_MAX__'] = $object->nb_gen_max;
1315 $htmltext =
'<i>' . $langs->trans(
"FollowingConstantsWillBeSubstituted") .
':<br>';
1316 foreach ($substitutionarray as $key => $val) {
1317 $htmltext .= $key .
' = ' . $langs->trans($val) .
'<br>';
1319 $htmltext .=
'</i>';
1323 print
$form->editfieldkey(
$form->textwithpicto($langs->trans(
'NotePublic'), $htmltext, 1,
'help',
'', 0, 2,
'notepublic'),
'note_public', $object->note_public, $object, $usercancreate);
1324 print
'</td><td class="wordbreak">';
1325 print
$form->editfieldval($langs->trans(
"NotePublic"),
'note_public', $object->note_public, $object, $usercancreate,
'textarea:' . ROWS_4 .
':90%',
'',
null,
null,
'', 1);
1331 print
$form->editfieldkey(
$form->textwithpicto($langs->trans(
"NotePrivate"), $htmltext, 1,
'help',
'', 0, 2,
'noteprivate'),
'note_private', $object->note_private, $object, $usercancreate);
1332 print
'</td><td class="wordbreak">';
1333 print
$form->editfieldval($langs->trans(
"NotePrivate"),
'note_private', $object->note_private, $object, $usercancreate,
'textarea:' . ROWS_4 .
':90%',
'',
null,
null,
'', 1);
1338 print
'<tr><td class="nowrap">';
1339 print
'<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
1340 print $langs->trans(
'BankAccount');
1342 if ($action !=
'editbankaccount' && $usercancreate && $object->statut == FactureFournisseurRec::STATUS_NOTSUSPENDED) {
1343 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>';
1345 print
'</tr></table>';
1347 if ($action ==
'editbankaccount') {
1348 $form->formSelectAccount($_SERVER[
'PHP_SELF'] .
'?id=' . $object->id, $object->fk_account,
'fk_account', 1);
1350 $form->formSelectAccount($_SERVER[
'PHP_SELF'] .
'?id=' . $object->id, $object->fk_account,
'none');
1356 print
'<tr><td class="nowrap">';
1357 print
'<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
1358 print $langs->trans(
'Model');
1360 if ($action !=
'editmodelpdf' && $usercancreate && $object->statut == FactureFournisseurRec::STATUS_NOTSUSPENDED) {
1361 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>';
1363 print
'</tr></table>';
1365 if ($action ==
'editmodelpdf') {
1366 include_once DOL_DOCUMENT_ROOT .
'/core/modules/supplier_invoice/modules_facturefournisseur.php';
1369 foreach ($models as $k => $model) {
1370 $list[] = str_replace(
':',
'|', $k) .
':' . $model;
1372 $select =
'select;' . implode(
',', $list);
1374 print
$form->editfieldval($langs->trans(
'Model'),
'modelpdf', $object->model_pdf, $object, $usercancreate, $select);
1376 print $object->model_pdf;
1383 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
1388 print
'<div class="fichehalfright">';
1389 print
'<div class="underbanner clearboth"></div>';
1394 $title = $langs->trans(
"Recurrence");
1397 print
'<table class="border centpercent tableforfield">';
1399 print
'<tr><td colspan="2">' .
img_picto(
'',
'recurring',
'class="pictofixedwidth"') . $title .
'</td></tr>';
1402 print
'<tr><td style="width: 50%">';
1403 print
'<table class="nobordernopadding" width="100%"><tr><td>';
1404 print $langs->trans(
'Frequency');
1406 if ($action !=
'editfrequency' && $usercancreate) {
1407 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>';
1409 print
'</tr></table>';
1411 if ($action ==
'editfrequency') {
1412 print
'<form method="post" action="' . $_SERVER[
"PHP_SELF"] .
'?facid=' . $object->id .
'">';
1413 print
'<input type="hidden" name="action" value="setfrequency">';
1414 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
1415 print
'<table class="nobordernopadding">';
1417 print
"<input type='text' name='frequency' value='" . $object->frequency .
"' size='5' /> " .
$form->selectarray(
'unit_frequency', array(
'd' => $langs->trans(
'Day'),
'm' => $langs->trans(
'Month'),
'y' => $langs->trans(
'Year')), ($object->unit_frequency ? $object->unit_frequency :
'm'));
1419 print
'<td class="left"><input type="submit" class="button button-edit" value="' . $langs->trans(
"Modify") .
'"></td>';
1420 print
'</tr></table></form>';
1422 if ($object->frequency > 0) {
1423 print $langs->trans(
'FrequencyPer_' . $object->unit_frequency, $object->frequency);
1425 print $langs->trans(
"NotARecurringInvoiceTemplate");
1432 if ($action ==
'date_when' || $object->frequency > 0) {
1433 print
$form->editfieldkey($langs->trans(
"NextDateToExecution"),
'date_when', $object->date_when, $object, $usercancreate,
'day');
1435 print $langs->trans(
"NextDateToExecution");
1438 if ($action ==
'date_when' || $object->frequency > 0) {
1439 print
$form->editfieldval($langs->trans(
"NextDateToExecution"),
'date_when', $object->date_when, $object, $usercancreate,
'day', $object->date_when,
null,
'',
'', 0,
'strikeIfMaxNbGenReached');
1442 if (! $object->isMaxNbGenReached()) {
1443 if (! $object->suspended && $action !=
'editdate_when' && $object->frequency > 0 && $object->date_when && $object->date_when < $now) {
1447 print
img_info($langs->trans(
"MaxNumberOfGenerationReached"));
1454 if ($action ==
'nb_gen_max' || $object->frequency > 0) {
1455 print
$form->editfieldkey($langs->trans(
"MaxPeriodNumber"),
'nb_gen_max', $object->nb_gen_max, $object, $usercancreate);
1457 print $langs->trans(
"MaxPeriodNumber");
1460 if ($action ==
'nb_gen_max' || $object->frequency > 0) {
1461 print
$form->editfieldval($langs->trans(
"MaxPeriodNumber"),
'nb_gen_max', $object->nb_gen_max ? $object->nb_gen_max :
'', $object, $usercancreate);
1470 if ($action ==
'auto_validate' || $object->frequency > 0) {
1471 print
$form->editfieldkey($langs->trans(
"StatusOfGeneratedInvoices"),
'auto_validate', $object->auto_validate, $object, $usercancreate);
1473 print $langs->trans(
"StatusOfGeneratedInvoices");
1476 $select =
'select;0:' . $langs->trans(
'BillStatusDraft') .
',1:' . $langs->trans(
'BillStatusValidated');
1477 if ($action ==
'auto_validate' || $object->frequency > 0) {
1478 print
$form->editfieldval($langs->trans(
"StatusOfGeneratedInvoices"),
'auto_validate', $object->auto_validate, $object, $usercancreate, $select);
1482 if (!empty($conf->global->INVOICE_REC_CAN_DISABLE_DOCUMENT_FILE_GENERATION)) {
1485 if ($action ==
'generate_pdf' || $object->frequency > 0) {
1486 print
$form->editfieldkey($langs->trans(
"StatusOfGeneratedDocuments"),
'generate_pdf', $object->generate_pdf, $object, $usercancreate);
1488 print $langs->trans(
"StatusOfGeneratedDocuments");
1492 $select =
'select;0:' . $langs->trans(
'DoNotGenerateDoc') .
',1:' . $langs->trans(
'AutogenerateDoc');
1493 if ($action ==
'generate_pdf' || $object->frequency > 0) {
1494 print
$form->editfieldval($langs->trans(
"StatusOfGeneratedDocuments"),
'generate_pdf', $object->generate_pdf, $object, $usercancreate, $select);
1499 print
'<input type="hidden" name="generate_pdf" value="1">';
1505 if ($object->frequency > 0) {
1508 if (empty($conf->cron->enabled)) {
1509 print
info_admin($langs->trans(
"EnableAndSetupModuleCron", $langs->transnoentitiesnoconv(
"Module2300Name")));
1512 print
'<div class="underbanner clearboth"></div>';
1513 print
'<table class="border centpercent tableforfield">';
1516 print
'<tr><td style="width: 50%">' . $langs->trans(
"NbOfGenerationDone") .
'</td>';
1518 print $object->nb_gen_done ? $object->nb_gen_done :
'0';
1524 print $langs->trans(
"DateLastGeneration");
1538 print
'<div class="clearboth"></div><br>';
1541 print
' <form name="addproduct" id="addproduct" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' . $object->id . (($action !=
'editline') ?
'#add' :
'#line_' .
GETPOST(
'lineid',
'int')) .
'" method="POST">
1542 <input type="hidden" name="token" value="' .
newToken() .
'">
1543 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline') .
'">
1544 <input type="hidden" name="mode" value="">
1545 <input type="hidden" name="id" value="' . $object->id .
'">
1548 if (!empty($conf->use_javascript_ajax) && $object->statut == 0) {
1549 include DOL_DOCUMENT_ROOT .
'/core/tpl/ajaxrow.tpl.php';
1552 print
'<div class="div-table-responsive-no-min">';
1553 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
1554 $object->fetch_lines();
1556 if (!empty($object->lines)) {
1557 $canchangeproduct = 1;
1559 foreach ($object->lines as $line) {
1560 $line->ref = $line->label;
1561 $line->product_label = $line->label;
1562 $line->subprice = $line->pu_ht;
1565 global $canchangeproduct;
1566 $canchangeproduct = 0;
1568 $object->statut = $object->suspended;
1569 $object->printObjectLines($action, $mysoc, $object->thirdparty, $lineid, 0);
1574 if ($object->statut == $object::STATUS_DRAFT && $usercancreate && $action !=
'valid' && $action !=
'editline') {
1575 if ($action !=
'editline') {
1578 $parameters = array();
1579 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
1580 if ($reshook < 0)
setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
1581 if (empty($reshook))
1582 global $senderissupplier;
1583 $senderissupplier = 2;
1584 $object->formAddObjectLine(0, $object->thirdparty, $mysoc);
1598 print
'<div class="tabsAction">';
1600 if (empty($object->suspended)) {
1601 if ($usercancreate) {
1602 if (!empty($object->frequency) && $object->nb_gen_max > 0 && ($object->nb_gen_done >= $object->nb_gen_max)) {
1603 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="' .
dol_escape_htmltag($langs->trans(
"MaxGenerationReached")) .
'">' . $langs->trans(
"CreateBill") .
'</a></div>';
1605 if (empty($object->frequency) || $object->date_when <= $nowlasthour) {
1606 print
'<div class="inline-block divButAction"><a class="butAction" href="' . DOL_URL_ROOT .
'/fourn/facture/card.php?action=create&socid=' . $object->thirdparty->id .
'&fac_rec=' . $object->id .
'">' . $langs->trans(
"CreateBill") .
'</a></div>';
1608 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="' .
dol_escape_htmltag($langs->trans(
"DateIsNotEnough")) .
'">' . $langs->trans(
"CreateBill") .
'</a></div>';
1612 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#">' . $langs->trans(
"CreateBill") .
'</a></div>';
1616 if ($usercancreate) {
1617 if (empty($object->suspended)) {
1618 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>';
1620 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>';
1625 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=ask_deleteinvoice&token='.
newToken(),
'delete', ($user->rights->fournisseur->facture->supprimer || $user->rights->supplier_invoice->supprimer));
1629 print
'<div class="fichecenter"><div class="fichehalfleft">';
1630 print
'<a name="builddoc"></a>';
1633 $linktoelem =
$form->showLinkToObjectBlock($object,
null, array(
'invoice'));
1635 $somethingshown =
$form->showLinkedObjectBlock($object, $linktoelem);
1637 print
'</div></div>';
if(GETPOST('button_removefilter_x', 'alpha')||GETPOST('button_removefilter.x', 'alpha')||GETPOST('button_removefilter', 'alpha')) if(GETPOST('button_search_x', 'alpha')||GETPOST('button_search.x', 'alpha')||GETPOST('button_search', 'alpha')) if($action=="save" &&empty($cancel)) $help_url
View.
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Class to manage a WYSIWYG editor.
Class to manage suppliers invoices.
Class to manage supplier invoice lines of templates.
Class to manage invoice templates.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation models.
static getIdAndTxFromCode($dbs, $code, $date_document='')
Get id and rate of currency from code.
Class to manage predefined suppliers products.
Class to manage products or services.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
Class to manage Dolibarr users.
getCountry($searchkey, $withcode='', $dbtouse=0, $outputlangs='', $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
dol_get_last_hour($date, $gm='tzserver')
Return GMT time for last hour of a given GMT date (it replaces hours, min and second part to 23:59:59...
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='rowid', $fieldref='ref', $morehtmlref='', $moreparam='', $nodbprefix=0, $morehtmlleft='', $morehtmlstatus='', $onlybanner=0, $morehtmlright='')
Show tab footer of a card.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='')
Show tabs of a record.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0)
Returns text escaped for inclusion in HTML alt or title tags, or into values of HTML input fields.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_get_fiche_end($notab=0)
Return tab footer of a card.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='')
Set event messages in dol_events session object.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
dol_htmlcleanlastbr($stringtodecode)
This function remove all ending and br at end.
get_default_npr(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Fonction qui renvoie si tva doit etre tva percue recuperable.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='')
Show information for admin users or standard users.
get_localtax($vatrate, $local, $thirdparty_buyer="", $thirdparty_seller="", $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $object=null)
Return array of possible common substitutions.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
isModEnabled($module)
Is Dolibarr module enabled.
img_edit($titlealt='default', $float=0, $other='')
Show logo editer/modifier fiche.
get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that return vat rate of a product line (according to seller, buyer and product vat rate) VAT...
img_info($titlealt='default')
Show info logo.
supplier_invoice_rec_prepare_head($object)
Return array head with list of tabs to view object informations.
$formconfirm
if ($action == 'delbookkeepingyear') {
div float
Buy price without taxes.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.