40 require
'../../main.inc.php';
41 require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
42 require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture-rec.class.php';
43 require_once DOL_DOCUMENT_ROOT.
'/compta/bank/class/account.class.php';
44 require_once DOL_DOCUMENT_ROOT.
'/compta/paiement/class/paiement.class.php';
45 require_once DOL_DOCUMENT_ROOT.
'/core/modules/facture/modules_facture.php';
46 require_once DOL_DOCUMENT_ROOT.
'/core/class/discount.class.php';
47 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
48 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
49 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmargin.class.php';
50 require_once DOL_DOCUMENT_ROOT.
'/core/lib/invoice.lib.php';
51 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
52 require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
53 require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
55 require_once DOL_DOCUMENT_ROOT.
'/commande/class/commande.class.php';
58 require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
59 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
61 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
64 require_once DOL_DOCUMENT_ROOT.
'/variants/class/ProductCombination.class.php';
67 require_once DOL_DOCUMENT_ROOT.
'/accountancy/class/accountingjournal.class.php';
71 $langs->loadLangs(array(
'bills',
'companies',
'compta',
'products',
'banks',
'main',
'withdrawals'));
73 $langs->load(
'incoterm');
76 $langs->load(
'margins');
79 $projectid = (
GETPOST(
'projectid',
'int') ?
GETPOST(
'projectid',
'int') : 0);
83 $socid =
GETPOST(
'socid',
'int');
84 $action =
GETPOST(
'action',
'aZ09');
85 $confirm =
GETPOST(
'confirm',
'alpha');
86 $cancel =
GETPOST(
'cancel',
'alpha');
87 $lineid =
GETPOST(
'lineid',
'int');
88 $userid =
GETPOST(
'userid',
'int');
89 $search_ref =
GETPOST(
'sf_ref',
'alpha') ?
GETPOST(
'sf_ref',
'alpha') :
GETPOST(
'search_ref',
'alpha');
90 $search_societe =
GETPOST(
'search_societe',
'alpha');
91 $search_montant_ht =
GETPOST(
'search_montant_ht',
'alpha');
92 $search_montant_ttc =
GETPOST(
'search_montant_ttc',
'alpha');
93 $origin =
GETPOST(
'origin',
'alpha');
95 $fac_rec =
GETPOST(
'fac_rec',
'int');
96 $facid =
GETPOST(
'facid',
'int');
97 $ref_client =
GETPOST(
'ref_client',
'int');
98 $rank = (
GETPOST(
'rank',
'int') > 0) ?
GETPOST(
'rank',
'int') : -1;
101 $hidedetails = (
GETPOST(
'hidedetails',
'int') ?
GETPOST(
'hidedetails',
'int') : (!empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_DETAILS) ? 1 : 0));
102 $hidedesc = (
GETPOST(
'hidedesc',
'int') ?
GETPOST(
'hidedesc',
'int') : (!empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_DESC) ? 1 : 0));
103 $hideref = (
GETPOST(
'hideref',
'int') ?
GETPOST(
'hideref',
'int') : (!empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_REF) ? 1 : 0));
108 $usehm = (!empty($conf->global->MAIN_USE_HOURMIN_IN_DATE_RANGE) ? $conf->global->MAIN_USE_HOURMIN_IN_DATE_RANGE : 0);
114 $extrafields->fetch_name_optionals_label($object->table_element);
117 if ($id > 0 || !empty($ref)) {
118 if ($action !=
'add') {
119 if (empty($conf->global->INVOICE_USE_SITUATION)) {
120 $fetch_situation =
false;
122 $fetch_situation =
true;
124 $ret = $object->fetch($id, $ref,
'',
'', $fetch_situation);
129 $hookmanager->initHooks(array(
'invoicecard',
'globalcard'));
131 $usercanread = $user->hasRight(
"facture",
"lire");
132 $usercancreate = $user->hasRight(
"facture",
"creer");
133 $usercanissuepayment = $user->hasRight(
"facture",
"paiement");
134 $usercandelete = $user->hasRight(
"facture",
"supprimer");
135 $usercancreatecontract = $user->hasRight(
"contrat",
"creer");
136 $usercanvalidate = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && $usercancreate) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->facture->invoice_advance->validate)));
137 $usercansend = (empty($conf->global->MAIN_USE_ADVANCED_PERMS) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->facture->invoice_advance->send)));
138 $usercanreopen = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && $usercancreate) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->facture->invoice_advance->reopen)));
139 if (!empty($conf->global->INVOICE_DISALLOW_REOPEN)) {
140 $usercanreopen =
false;
142 $usercanunvalidate = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($usercancreate)) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->facture->invoice_advance->unvalidate)));
144 $usercanproductignorepricemin = ((!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->produit->ignore_price_min_advance)) || empty($conf->global->MAIN_USE_ADVANCED_PERMS));
145 $usercancreatemargin = (!empty($user->rights->margins->creer) ? $user->rights->margins->creer : 0);
146 $usercanreadallmargin = (!empty($user->rights->margins->liretous) ? $user->rights->margins->liretous : 0);
147 $usercancreatewithdrarequest = (!empty($user->rights->prelevement->bons->creer) ? $user->rights->prelevement->bons->creer : 0);
149 $permissionnote = $usercancreate;
150 $permissiondellink = $usercancreate;
151 $permissiontoedit = $usercancreate;
152 $permissiontoadd = $usercancreate;
155 $retainedWarrantyInvoiceAvailableType = array();
156 if (!empty($conf->global->INVOICE_USE_RETAINED_WARRANTY)) {
157 $retainedWarrantyInvoiceAvailableType = explode(
'+', $conf->global->INVOICE_USE_RETAINED_WARRANTY);
162 $socid = $user->socid;
166 $result =
restrictedArea($user,
'facture', $object->id,
'',
'',
'fk_soc',
'rowid', $isdraft);
173 $parameters = array(
'socid' => $socid);
174 $reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
179 if (empty($reshook)) {
180 $backurlforlist = DOL_URL_ROOT.
'/compta/facture/list.php';
182 if (empty($backtopage) || ($cancel && empty($id))) {
183 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
184 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
185 $backtopage = $backurlforlist;
187 $backtopage = DOL_URL_ROOT.
'/compta/facture/card.php?id='.((!empty($id) && $id > 0) ? $id :
'__ID__');
193 if (!empty($backtopageforcancel)) {
194 header(
"Location: ".$backtopageforcancel);
196 } elseif (!empty($backtopage)) {
197 header(
"Location: ".$backtopage);
203 include DOL_DOCUMENT_ROOT.
'/core/actions_setnotes.inc.php';
205 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
207 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
210 if ($action ==
'confirm_clone' && $confirm ==
'yes' && $permissiontoadd) {
214 $objectutil->socid = $socid;
215 $result = $objectutil->createFromClone($user, $id);
217 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?facid='.$result);
220 $langs->load(
"errors");
224 } elseif ($action ==
'reopen' && $usercanreopen) {
225 $result = $object->fetch($id);
228 $result = $object->setUnpaid($user);
230 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?facid='.$id);
236 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes') {
238 $result = $object->fetch($id);
239 $object->fetch_thirdparty();
241 $idwarehouse =
GETPOST(
'idwarehouse');
243 $qualified_for_stock_change = 0;
244 if (empty($conf->global->STOCK_SUPPORTS_SERVICES)) {
245 $qualified_for_stock_change = $object->hasProductsOrServices(2);
247 $qualified_for_stock_change = $object->hasProductsOrServices(1);
250 $isErasable = $object->is_erasable();
252 if (($usercandelete && $isErasable > 0)
253 || ($usercancreate && $isErasable == 1)) {
254 $result = $object->delete($user, 0, $idwarehouse);
256 header(
'Location: '.DOL_URL_ROOT.
'/compta/facture/list.php?restore_lastsearch_values=1');
263 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $usercancreate) {
266 $object->fetch_thirdparty();
268 $result = $object->deleteline(
GETPOST(
'lineid',
'int'));
271 $object->line_order(
true);
273 $outputlangs = $langs;
275 if ($conf->global->MAIN_MULTILANGS && empty($newlang) &&
GETPOST(
'lang_id')) {
278 if ($conf->global->MAIN_MULTILANGS && empty($newlang)) {
279 $newlang = $object->thirdparty->default_lang;
281 if (!empty($newlang)) {
283 $outputlangs->setDefaultLang($newlang);
284 $outputlangs->load(
'products');
286 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
287 $ret = $object->fetch($id);
288 $result = $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
291 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?facid='.$id);
298 } elseif ($action ==
'unlinkdiscount' && $usercancreate) {
301 $result = $discount->fetch(
GETPOST(
"discountid"));
302 $discount->unlink_invoice();
303 } elseif ($action ==
'valid' && $usercancreate) {
307 if (!empty($conf->global-> INVOICE_CHECK_POSTERIOR_DATE)) {
308 $last_of_type = $object->willBeLastOfSameType(
true);
309 if (empty($object->date_validation) && !$last_of_type[0]) {
318 if ($object->total_ht >= 0) {
319 setEventMessages($langs->trans(
"ErrorInvoiceAvoirMustBeNegative"), null,
'errors');
327 if (empty($conf->global->FACTURE_ENABLE_NEGATIVE) && $object->total_ttc < 0) {
328 setEventMessages($langs->trans(
"ErrorInvoiceOfThisTypeMustBePositive"), null,
'errors');
337 $array_of_total_ht_per_vat_rate = array();
338 $array_of_total_ht_devise_per_vat_rate = array();
339 foreach ($object->lines as $line) {
341 $vat_src_code_for_line =
'';
342 if (empty($array_of_total_ht_per_vat_rate[$line->tva_tx.
'_'.$vat_src_code_for_line])) {
343 $array_of_total_ht_per_vat_rate[$line->tva_tx.
'_'.$vat_src_code_for_line] = 0;
345 if (empty($array_of_total_ht_devise_per_vat_rate[$line->tva_tx.
'_'.$vat_src_code_for_line])) {
346 $array_of_total_ht_devise_per_vat_rate[$line->tva_tx.
'_'.$vat_src_code_for_line] = 0;
348 $array_of_total_ht_per_vat_rate[$line->tva_tx.
'_'.$vat_src_code_for_line] += $line->total_ht;
349 $array_of_total_ht_devise_per_vat_rate[$line->tva_tx.
'_'.$vat_src_code_for_line] += $line->multicurrency_total_ht;
353 foreach ($array_of_total_ht_per_vat_rate as $vatrate => $tmpvalue) {
354 $tmp_total_ht =
price2num($array_of_total_ht_per_vat_rate[$vatrate]);
355 $tmp_total_ht_devise =
price2num($array_of_total_ht_devise_per_vat_rate[$vatrate]);
357 if (($tmp_total_ht < 0 || $tmp_total_ht_devise < 0) && empty($conf->global->FACTURE_ENABLE_NEGATIVE_LINES)) {
358 if ($object->type == $object::TYPE_DEPOSIT) {
359 $langs->load(
"errors");
361 setEventMessages($langs->trans(
"ErrorLinesCantBeNegativeOnDeposits"), null,
'errors');
365 $tmpvatratetoshow = explode(
'_', $vatrate);
366 $tmpvatratetoshow[0] = round($tmpvatratetoshow[0], 2);
368 if ($tmpvatratetoshow[0] != 0) {
369 $langs->load(
"errors");
370 setEventMessages($langs->trans(
"ErrorLinesCantBeNegativeForOneVATRate", $tmpvatratetoshow[0]), null,
'errors');
378 } elseif ($action ==
'classin' && $usercancreate) {
380 $object->setProject(
GETPOST(
'projectid',
'int'));
381 } elseif ($action ==
'setmode' && $usercancreate) {
383 $result = $object->setPaymentMethods(
GETPOST(
'mode_reglement_id',
'int'));
387 } elseif ($action ==
'setretainedwarrantyconditions' && $user->rights->facture->creer) {
389 $object->retained_warranty_fk_cond_reglement = 0;
390 $result = $object->setRetainedWarrantyPaymentTerms(
GETPOST(
'retained_warranty_fk_cond_reglement',
'int'));
395 $old_rw_date_lim_reglement = $object->retained_warranty_date_limit;
396 $new_rw_date_lim_reglement = $object->calculate_date_lim_reglement($object->retained_warranty_fk_cond_reglement);
397 if ($new_rw_date_lim_reglement > $old_rw_date_lim_reglement) {
398 $object->retained_warranty_date_limit = $new_rw_date_lim_reglement;
400 if ($object->retained_warranty_date_limit < $object->date) {
401 $object->retained_warranty_date_limit = $object->date;
403 $result = $object->update($user);
407 } elseif ($action ==
'setretainedwarranty' && $user->rights->facture->creer) {
409 $result = $object->setRetainedWarranty(
GETPOST(
'retained_warranty',
'float'));
413 } elseif ($action ==
'setretainedwarrantydatelimit' && $user->rights->facture->creer) {
415 $result = $object->setRetainedWarrantyDateLimit(
GETPOST(
'retained_warranty_date_limit',
'float'));
419 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
420 $result = $object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
421 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
422 $result = $object->setMulticurrencyRate(
price2num(
GETPOST(
'multicurrency_tx')),
GETPOST(
'calculation_mode',
'int'));
423 } elseif ($action ==
'setinvoicedate' && $usercancreate) {
425 $old_date_lim_reglement = $object->date_lim_reglement;
427 if (empty($newdate)) {
428 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")), null,
'errors');
429 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?facid='.$id.
'&action=editinvoicedate&token='.
newToken());
432 if ($newdate > (
dol_now(
'tzuserrel') + (empty($conf->global->INVOICE_MAX_FUTURE_DELAY) ? 0 : $conf->global->INVOICE_MAX_FUTURE_DELAY))) {
433 if (empty($conf->global->INVOICE_MAX_FUTURE_DELAY)) {
434 setEventMessages($langs->trans(
"WarningInvoiceDateInFuture"), null,
'warnings');
436 setEventMessages($langs->trans(
"WarningInvoiceDateTooFarInFuture"), null,
'warnings');
440 $object->date = $newdate;
441 $new_date_lim_reglement = $object->calculate_date_lim_reglement();
442 if ($new_date_lim_reglement > $old_date_lim_reglement) {
443 $object->date_lim_reglement = $new_date_lim_reglement;
445 if ($object->date_lim_reglement < $object->date) {
446 $object->date_lim_reglement = $object->date;
448 $result = $object->update($user);
452 } elseif ($action ==
'setdate_pointoftax' && $usercancreate) {
455 $date_pointoftax =
dol_mktime(0, 0, 0,
GETPOST(
'date_pointoftaxmonth',
'int'),
GETPOST(
'date_pointoftaxday',
'int'),
GETPOST(
'date_pointoftaxyear',
'int'),
'tzserver');
457 $object->date_pointoftax = $date_pointoftax;
458 $result = $object->update($user);
462 } elseif ($action ==
'setconditions' && $usercancreate) {
464 $object->cond_reglement_code = 0;
465 $object->cond_reglement_id = 0;
472 $result = $object->setPaymentTerms(
GETPOST(
'cond_reglement_id',
'int'));
480 $old_date_lim_reglement = $object->date_lim_reglement;
481 $new_date_lim_reglement = $object->calculate_date_lim_reglement();
482 if ($new_date_lim_reglement > $old_date_lim_reglement) {
483 $object->date_lim_reglement = $new_date_lim_reglement;
485 if ($object->date_lim_reglement < $object->date) {
486 $object->date_lim_reglement = $object->date;
488 $result = $object->update($user);
500 } elseif ($action ==
'setpaymentterm' && $usercancreate) {
502 $object->date_lim_reglement =
dol_mktime(12, 0, 0,
GETPOST(
'paymenttermmonth',
'int'),
GETPOST(
'paymenttermday',
'int'),
GETPOST(
'paymenttermyear',
'int'));
503 if ($object->date_lim_reglement < $object->date) {
504 $object->date_lim_reglement = $object->calculate_date_lim_reglement();
505 setEventMessages($langs->trans(
"DatePaymentTermCantBeLowerThanObjectDate"), null,
'warnings');
507 $result = $object->update($user);
511 } elseif ($action ==
'setrevenuestamp' && $usercancreate) {
513 $object->revenuestamp =
GETPOST(
'revenuestamp');
514 $result = $object->update($user);
515 $object->update_price(1);
520 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
521 $outputlangs = $langs;
523 if ($conf->global->MAIN_MULTILANGS && empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
524 $newlang =
GETPOST(
'lang_id',
'aZ09');
526 if ($conf->global->MAIN_MULTILANGS && empty($newlang)) {
527 $newlang = $object->thirdparty->default_lang;
529 if (!empty($newlang)) {
531 $outputlangs->setDefaultLang($newlang);
532 $outputlangs->load(
'products');
534 $model = $object->model_pdf;
535 $ret = $object->fetch($id);
537 $result = $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
543 } elseif ($action ==
'set_incoterms' &&
isModEnabled(
'incoterm')) {
544 $result = $object->setIncoterms(
GETPOST(
'incoterm_id',
'int'),
GETPOST(
'location_incoterms',
'alpha'));
545 } elseif ($action ==
'setbankaccount' && $usercancreate) {
546 $result = $object->setBankAccount(
GETPOST(
'fk_account',
'int'));
547 } elseif ($action ==
'setremisepercent' && $usercancreate) {
549 $result = $object->setDiscount($user,
price2num(
GETPOST(
'remise_percent'),
'', 2));
550 } elseif ($action ==
"setabsolutediscount" && $usercancreate) {
555 if (
GETPOST(
"remise_id",
'int') > 0) {
556 $ret = $object->fetch($id);
558 $result = $object->insert_discount(
GETPOST(
"remise_id",
'int'));
568 if (
GETPOST(
"remise_id_for_payment",
'int') > 0) {
569 require_once DOL_DOCUMENT_ROOT.
'/core/class/discount.class.php';
571 $discount->fetch(
GETPOST(
"remise_id_for_payment",
'int'));
575 $remaintopay = $object->getRemainToPay(0);
579 setEventMessages($langs->trans(
"ErrorDiscountLargerThanRemainToPaySplitItBefore"), null,
'errors');
583 $result = $discount->link_to_invoice(0, $id);
591 $newremaintopay = $object->getRemainToPay(0);
592 if ($newremaintopay == 0) {
593 $object->setPaid($user);
604 if (empty($error) && empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
605 $outputlangs = $langs;
607 if ($conf->global->MAIN_MULTILANGS && empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
608 $newlang =
GETPOST(
'lang_id',
'aZ09');
610 if ($conf->global->MAIN_MULTILANGS && empty($newlang)) {
611 $newlang = $object->thirdparty->default_lang;
613 if (!empty($newlang)) {
615 $outputlangs->setDefaultLang($newlang);
617 $ret = $object->fetch($id);
619 $result = $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
624 } elseif ($action ==
'setref' && $usercancreate) {
626 $object->setValueFrom(
'ref',
GETPOST(
'ref'),
'', null,
'',
'', $user,
'BILL_MODIFY');
627 } elseif ($action ==
'setref_client' && $usercancreate) {
629 $object->set_ref_client(
GETPOST(
'ref_client'));
630 } elseif ($action ==
'confirm_valid' && $confirm ==
'yes' && $usercanvalidate) {
632 $idwarehouse =
GETPOST(
'idwarehouse',
'int');
635 $object->fetch_thirdparty();
639 $qualified_for_stock_change = 0;
640 if (empty($conf->global->STOCK_SUPPORTS_SERVICES)) {
641 $qualified_for_stock_change = $object->hasProductsOrServices(2);
643 $qualified_for_stock_change = $object->hasProductsOrServices(1);
646 if ($qualified_for_stock_change) {
647 if (!$idwarehouse || $idwarehouse == - 1) {
649 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
"Warehouse")), null,
'errors');
656 $result = $object->validate($user,
'', $idwarehouse);
659 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
660 $outputlangs = $langs;
662 if (!empty($conf->global->MAIN_MULTILANGS) && empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
663 $newlang =
GETPOST(
'lang_id',
'aZ09');
665 if (!empty($conf->global->MAIN_MULTILANGS) && empty($newlang)) {
666 $newlang = $object->thirdparty->default_lang;
668 if (!empty($newlang)) {
670 $outputlangs->setDefaultLang($newlang);
671 $outputlangs->load(
'products');
673 $model = $object->model_pdf;
675 $ret = $object->fetch($id);
677 $result = $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
683 if (count($object->errors)) {
690 } elseif ($action ==
'confirm_modif' && $usercanunvalidate) {
692 $idwarehouse =
GETPOST(
'idwarehouse',
'int');
695 $object->fetch_thirdparty();
699 $qualified_for_stock_change = 0;
700 if (empty($conf->global->STOCK_SUPPORTS_SERVICES)) {
701 $qualified_for_stock_change = $object->hasProductsOrServices(2);
703 $qualified_for_stock_change = $object->hasProductsOrServices(1);
706 if ($qualified_for_stock_change) {
707 if (!$idwarehouse || $idwarehouse == - 1) {
709 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
"Warehouse")), null,
'errors');
717 $sql =
'SELECT pf.amount';
718 $sql .=
' FROM '.MAIN_DB_PREFIX.
'paiement_facture as pf';
719 $sql .=
' WHERE pf.fk_facture = '.((int) $object->id);
721 $result = $db->query($sql);
724 $num = $db->num_rows($result);
727 $objp = $db->fetch_object($result);
728 $totalpaid += $objp->amount;
735 $resteapayer = $object->total_ttc - $totalpaid;
738 $ventilExportCompta = $object->getVentilExportCompta();
741 if ($ventilExportCompta == 0) {
742 if (!empty($conf->global->INVOICE_CAN_BE_EDITED_EVEN_IF_PAYMENT_DONE) || ($resteapayer == $object->total_ttc && empty($object->paye))) {
743 $result = $object->setDraft($user, $idwarehouse);
749 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
750 $outputlangs = $langs;
752 if ($conf->global->MAIN_MULTILANGS && empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
753 $newlang =
GETPOST(
'lang_id',
'aZ09');
755 if ($conf->global->MAIN_MULTILANGS && empty($newlang)) {
756 $newlang = $object->thirdparty->default_lang;
758 if (!empty($newlang)) {
760 $outputlangs->setDefaultLang($newlang);
761 $outputlangs->load(
'products');
763 $model = $object->model_pdf;
764 $ret = $object->fetch($id);
766 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
771 } elseif ($action ==
'confirm_paid' && $confirm ==
'yes' && $usercanissuepayment) {
774 $result = $object->setPaid($user);
778 } elseif ($action ==
'confirm_paid_partially' && $confirm ==
'yes' && $usercanissuepayment) {
781 $close_code =
GETPOST(
"close_code",
'restricthtml');
782 $close_note =
GETPOST(
"close_note",
'restricthtml');
784 $result = $object->setPaid($user, $close_code, $close_note);
789 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Reason")), null,
'errors');
791 } elseif ($action ==
'confirm_canceled' && $confirm ==
'yes') {
794 $close_code =
GETPOST(
"close_code",
'restricthtml');
795 $close_note =
GETPOST(
"close_note",
'restricthtml');
797 $result = $object->setCanceled($user, $close_code, $close_note);
802 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Reason")), null,
'errors');
804 } elseif ($action ==
'confirm_converttoreduc' && $confirm ==
'yes' && $usercancreate) {
807 $object->fetch_thirdparty();
812 $result = $discountcheck->fetch(0, $object->id);
825 $amount_ht = $amount_tva = $amount_ttc = array();
826 $multicurrency_amount_ht = $multicurrency_amount_tva = $multicurrency_amount_ttc = array();
830 foreach ($object->lines as $line) {
831 if ($line->product_type < 9 && $line->total_ht != 0) {
832 $keyforvatrate = $line->tva_tx.($line->vat_src_code ?
' ('.$line->vat_src_code.
')' :
'');
834 $amount_ht[$keyforvatrate] += $line->total_ht;
835 $amount_tva[$keyforvatrate] += $line->total_tva;
836 $amount_ttc[$keyforvatrate] += $line->total_ttc;
837 $multicurrency_amount_ht[$keyforvatrate] += $line->multicurrency_total_ht;
838 $multicurrency_amount_tva[$keyforvatrate] += $line->multicurrency_total_tva;
839 $multicurrency_amount_ttc[$keyforvatrate] += $line->multicurrency_total_ttc;
845 if (!empty($conf->global->INVOICE_ALLOW_REUSE_OF_CREDIT_WHEN_PARTIALLY_REFUNDED) && $object->type ==
Facture::TYPE_CREDIT_NOTE) {
846 $alreadypaid = $object->getSommePaiement();
847 if ($alreadypaid && abs($alreadypaid) < abs($object->total_ttc)) {
848 $ratio = abs(($object->total_ttc - $alreadypaid) / $object->total_ttc);
849 foreach ($amount_ht as $vatrate => $val) {
850 $amount_ht[$vatrate] =
price2num($amount_ht[$vatrate] * $ratio,
'MU');
851 $amount_tva[$vatrate] =
price2num($amount_tva[$vatrate] * $ratio,
'MU');
852 $amount_ttc[$vatrate] =
price2num($amount_ttc[$vatrate] * $ratio,
'MU');
853 $multicurrency_amount_ht[$vatrate] =
price2num($multicurrency_amount_ht[$vatrate] * $ratio,
'MU');
854 $multicurrency_amount_tva[$vatrate] =
price2num($multicurrency_amount_tva[$vatrate] * $ratio,
'MU');
855 $multicurrency_amount_ttc[$vatrate] =
price2num($multicurrency_amount_ttc[$vatrate] * $ratio,
'MU');
864 $discount->description =
'(CREDIT_NOTE)';
866 $discount->description =
'(DEPOSIT)';
868 $discount->description =
'(EXCESS RECEIVED)';
870 setEventMessages($langs->trans(
'CantConvertToReducAnInvoiceOfThisType'), null,
'errors');
872 $discount->fk_soc = $object->socid;
873 $discount->fk_facture_source = $object->id;
881 $sql =
'SELECT SUM(pf.amount) as total_paiements';
882 $sql .=
' FROM '.MAIN_DB_PREFIX.
'paiement_facture as pf, '.MAIN_DB_PREFIX.
'paiement as p';
883 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_paiement as c ON p.fk_paiement = c.id';
884 $sql .=
' WHERE pf.fk_facture = '.((int) $object->id);
885 $sql .=
' AND pf.fk_paiement = p.rowid';
886 $sql .=
' AND p.entity IN ('.getEntity(
'invoice').
')';
887 $resql = $db->query($sql);
892 $res = $db->fetch_object(
$resql);
893 $total_paiements = $res->total_paiements;
896 $total_creditnote_and_deposit = 0;
897 $sql =
"SELECT re.rowid, re.amount_ht, re.amount_tva, re.amount_ttc,";
898 $sql .=
" re.description, re.fk_facture_source";
899 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe_remise_except as re";
900 $sql .=
" WHERE fk_facture = ".((int) $object->id);
901 $resql = $db->query($sql);
903 while ($obj = $db->fetch_object(
$resql)) {
904 $total_creditnote_and_deposit += $obj->amount_ttc;
910 $discount->amount_ht = $discount->amount_ttc = $total_paiements + $total_creditnote_and_deposit - $object->total_ttc;
911 $discount->amount_tva = 0;
912 $discount->tva_tx = 0;
913 $discount->vat_src_code =
'';
915 $result = $discount->create($user);
921 foreach ($amount_ht as $tva_tx => $xxx) {
922 $discount->amount_ht = abs($amount_ht[$tva_tx]);
923 $discount->amount_tva = abs($amount_tva[$tva_tx]);
924 $discount->amount_ttc = abs($amount_ttc[$tva_tx]);
925 $discount->multicurrency_amount_ht = abs($multicurrency_amount_ht[$tva_tx]);
926 $discount->multicurrency_amount_tva = abs($multicurrency_amount_tva[$tva_tx]);
927 $discount->multicurrency_amount_ttc = abs($multicurrency_amount_ttc[$tva_tx]);
932 if (preg_match(
'/\((.*)\)/', $tva_tx, $reg)) {
933 $vat_src_code = $reg[1];
934 $tva_tx = preg_replace(
'/\s*\(.*\)/',
'', $tva_tx);
937 $discount->tva_tx = abs($tva_tx);
938 $discount->vat_src_code = $vat_src_code;
940 $result = $discount->create($user);
951 $result = $object->setPaid($user);
966 } elseif ($action ==
'confirm_delete_paiement' && $confirm ==
'yes' && $usercanissuepayment) {
971 $result = $paiement->fetch(
GETPOST(
'paiement_id',
'int'));
973 $result = $paiement->delete();
975 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
983 } elseif ($action ==
'add' && $usercancreate) {
986 $object->socid =
GETPOST(
'socid',
'int');
988 $selectedLines =
GETPOST(
'toselect',
'array');
990 if (
GETPOST(
'type',
'int') ===
'') {
991 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")), null,
'errors');
997 $originentity =
GETPOST(
'originentity');
999 $ret = $extrafields->setOptionalsFromPost(null, $object);
1005 $date_pointoftax =
dol_mktime(0, 0, 0,
GETPOST(
'date_pointoftaxmonth',
'int'),
GETPOST(
'date_pointoftaxday',
'int'),
GETPOST(
'date_pointoftaxyear',
'int'),
'tzserver');
1009 if (empty($dateinvoice)) {
1011 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")), null,
'errors');
1013 } elseif ($dateinvoice > (
dol_get_last_hour(
dol_now(
'tzuserrel')) + (empty($conf->global->INVOICE_MAX_FUTURE_DELAY) ? 0 : $conf->global->INVOICE_MAX_FUTURE_DELAY))) {
1019 if (!(
GETPOST(
'fac_replacement',
'int') > 0)) {
1021 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ReplaceInvoice")), null,
'errors');
1027 $result = $object->fetch(
GETPOST(
'fac_replacement',
'int'));
1028 $object->fetch_thirdparty();
1030 $object->date = $dateinvoice;
1031 $object->date_pointoftax = $date_pointoftax;
1032 $object->note_public = trim(
GETPOST(
'note_public',
'restricthtml'));
1033 $object->note_private = trim(
GETPOST(
'note_private',
'restricthtml'));
1034 $object->ref_client =
GETPOST(
'ref_client',
'alphanohtml');
1035 $object->model_pdf =
GETPOST(
'model',
'alphanohtml');
1036 $object->fk_project =
GETPOST(
'projectid',
'int');
1037 $object->cond_reglement_id =
GETPOST(
'cond_reglement_id',
'int');
1038 $object->mode_reglement_id =
GETPOST(
'mode_reglement_id',
'int');
1039 $object->fk_account =
GETPOST(
'fk_account',
'int');
1042 $object->fk_incoterms =
GETPOST(
'incoterm_id',
'int');
1043 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
1044 $object->multicurrency_code =
GETPOST(
'multicurrency_code',
'alpha');
1045 $object->multicurrency_tx =
GETPOST(
'originmulticurrency_tx',
'int');
1048 $object->fk_facture_source =
GETPOST(
'fac_replacement',
'int');
1051 $id = $object->createFromCurrent($user);
1060 $sourceinvoice =
GETPOST(
'fac_avoir',
'int');
1061 if (!($sourceinvoice > 0) && empty($conf->global->INVOICE_CREDIT_NOTE_STANDALONE)) {
1063 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"CorrectInvoice")), null,
'errors');
1067 if (empty($dateinvoice)) {
1069 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")), null,
'errors');
1071 } elseif ($dateinvoice > (
dol_get_last_hour(
dol_now(
'tzuserrel')) + (empty($conf->global->INVOICE_MAX_FUTURE_DELAY) ? 0 : $conf->global->INVOICE_MAX_FUTURE_DELAY))) {
1078 if (!empty($originentity)) {
1079 $object->entity = $originentity;
1081 $object->socid =
GETPOST(
'socid',
'int');
1082 $object->ref =
GETPOST(
'ref');
1083 $object->date = $dateinvoice;
1084 $object->date_pointoftax = $date_pointoftax;
1085 $object->note_public = trim(
GETPOST(
'note_public',
'restricthtml'));
1086 $object->note_private = trim(
GETPOST(
'note_private',
'restricthtml'));
1087 $object->ref_client =
GETPOST(
'ref_client');
1088 $object->model_pdf =
GETPOST(
'model');
1089 $object->fk_project =
GETPOST(
'projectid',
'int');
1090 $object->cond_reglement_id = 0;
1091 $object->mode_reglement_id =
GETPOST(
'mode_reglement_id',
'int');
1092 $object->fk_account =
GETPOST(
'fk_account',
'int');
1095 $object->fk_incoterms =
GETPOST(
'incoterm_id',
'int');
1096 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
1097 $object->multicurrency_code =
GETPOST(
'multicurrency_code',
'alpha');
1098 $object->multicurrency_tx =
GETPOST(
'originmulticurrency_tx',
'int');
1101 $object->fk_facture_source = $sourceinvoice > 0 ? $sourceinvoice :
'';
1104 $facture_source =
new Facture($db);
1105 if ($facture_source->fetch($object->fk_facture_source) > 0) {
1107 $object->situation_counter = $facture_source->situation_counter;
1108 $object->situation_cycle_ref = $facture_source->situation_cycle_ref;
1109 $facture_source->fetchPreviousNextSituationInvoice();
1114 $id = $object->create($user);
1119 if ($object->copy_linked_contact($facture_source,
'internal') < 0) {
1121 } elseif ($facture_source->socid == $object->socid) {
1123 if ($object->copy_linked_contact($facture_source,
'external') < 0) {
1134 if (
GETPOST(
'invoiceAvoirWithLines',
'int') == 1 && $id > 0) {
1135 if (!empty($facture_source->lines)) {
1136 $fk_parent_line = 0;
1138 foreach ($facture_source->lines as $line) {
1140 if (method_exists($line,
'fetch_optionals')) {
1142 $line->fetch_optionals();
1146 if (($line->product_type != 9 && empty($line->fk_parent_line)) || $line->product_type == 9) {
1147 $fk_parent_line = 0;
1152 $source_fk_prev_id = $line->fk_prev_id;
1153 $line->fk_prev_id = $line->id;
1155 if (!empty($facture_source->tab_previous_situation_invoice)) {
1158 $tab_jumped_credit_notes = array();
1159 $lineIndex = count($facture_source->tab_previous_situation_invoice) - 1;
1160 $searchPreviousInvoice =
true;
1161 while ($searchPreviousInvoice) {
1162 if ($facture_source->tab_previous_situation_invoice[$lineIndex]->type ==
Facture::TYPE_SITUATION || $lineIndex < 1) {
1163 $searchPreviousInvoice =
false;
1167 $tab_jumped_credit_notes[$lineIndex] = $facture_source->tab_previous_situation_invoice[$lineIndex]->id;
1173 $maxPrevSituationPercent = 0;
1174 foreach ($facture_source->tab_previous_situation_invoice[$lineIndex]->lines as $prevLine) {
1175 if ($prevLine->id == $source_fk_prev_id) {
1176 $maxPrevSituationPercent = max($maxPrevSituationPercent, $prevLine->situation_percent);
1179 $line->total_ht = $line->total_ht - $prevLine->total_ht;
1180 $line->total_tva = $line->total_tva - $prevLine->total_tva;
1181 $line->total_ttc = $line->total_ttc - $prevLine->total_ttc;
1182 $line->total_localtax1 = $line->total_localtax1 - $prevLine->total_localtax1;
1183 $line->total_localtax2 = $line->total_localtax2 - $prevLine->total_localtax2;
1185 $line->multicurrency_subprice = $line->multicurrency_subprice - $prevLine->multicurrency_subprice;
1186 $line->multicurrency_total_ht = $line->multicurrency_total_ht - $prevLine->multicurrency_total_ht;
1187 $line->multicurrency_total_tva = $line->multicurrency_total_tva - $prevLine->multicurrency_total_tva;
1188 $line->multicurrency_total_ttc = $line->multicurrency_total_ttc - $prevLine->multicurrency_total_ttc;
1193 $line->situation_percent = $maxPrevSituationPercent - $line->situation_percent;
1198 $maxPrevSituationPercent = 0;
1199 foreach ($tab_jumped_credit_notes as $index => $creditnoteid) {
1200 foreach ($facture_source->tab_previous_situation_invoice[$index]->lines as $prevLine) {
1201 if ($prevLine->fk_prev_id == $source_fk_prev_id) {
1202 $maxPrevSituationPercent = $prevLine->situation_percent;
1204 $line->total_ht -= $prevLine->total_ht;
1205 $line->total_tva -= $prevLine->total_tva;
1206 $line->total_ttc -= $prevLine->total_ttc;
1207 $line->total_localtax1 -= $prevLine->total_localtax1;
1208 $line->total_localtax2 -= $prevLine->total_localtax2;
1210 $line->multicurrency_subprice -= $prevLine->multicurrency_subprice;
1211 $line->multicurrency_total_ht -= $prevLine->multicurrency_total_ht;
1212 $line->multicurrency_total_tva -= $prevLine->multicurrency_total_tva;
1213 $line->multicurrency_total_ttc -= $prevLine->multicurrency_total_ttc;
1219 $line->situation_percent += $maxPrevSituationPercent;
1225 $line->fk_facture = $object->id;
1226 $line->fk_parent_line = $fk_parent_line;
1228 $line->subprice = -$line->subprice;
1229 $line->pa_ht = $line->pa_ht;
1230 $line->total_ht = -$line->total_ht;
1231 $line->total_tva = -$line->total_tva;
1232 $line->total_ttc = -$line->total_ttc;
1233 $line->total_localtax1 = -$line->total_localtax1;
1234 $line->total_localtax2 = -$line->total_localtax2;
1236 $line->multicurrency_subprice = -$line->multicurrency_subprice;
1237 $line->multicurrency_total_ht = -$line->multicurrency_total_ht;
1238 $line->multicurrency_total_tva = -$line->multicurrency_total_tva;
1239 $line->multicurrency_total_ttc = -$line->multicurrency_total_ttc;
1241 $line->context[
'createcreditnotefrominvoice'] = 1;
1242 $result = $line->insert(0, 1);
1244 $object->lines[] = $line;
1247 if ($result > 0 && $line->product_type == 9) {
1248 $fk_parent_line = $result;
1252 $object->update_price(1);
1256 if (
GETPOST(
'invoiceAvoirWithPaymentRestAmount',
'int') == 1 && $id > 0) {
1257 if ($facture_source->fetch($object->fk_facture_source) > 0) {
1258 $totalpaid = $facture_source->getSommePaiement();
1259 $totalcreditnotes = $facture_source->getSumCreditNotesUsed();
1260 $totaldeposits = $facture_source->getSumDepositsUsed();
1261 $remain_to_pay = abs($facture_source->total_ttc - $totalpaid - $totalcreditnotes - $totaldeposits);
1263 $object->addline($langs->trans(
'invoiceAvoirLineWithPaymentRestAmount'), $remain_to_pay, 1, 0, 0, 0, 0, 0,
'',
'',
'TTC');
1268 if (!empty($object->fk_facture_source) && $id > 0) {
1269 $facture_source->fetch($object->fk_facture_source);
1270 $facture_source->fetchObjectLinked();
1272 if (!empty($facture_source->linkedObjectsIds)) {
1273 foreach ($facture_source->linkedObjectsIds as $sourcetype => $TIds) {
1274 $object->add_object_linked($sourcetype, current($TIds));
1283 if (empty($dateinvoice)) {
1285 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")), null,
'errors');
1287 } elseif ($dateinvoice > (
dol_get_last_hour(
dol_now(
'tzuserrel')) + (empty($conf->global->INVOICE_MAX_FUTURE_DELAY) ? 0 : $conf->global->INVOICE_MAX_FUTURE_DELAY))) {
1294 $object->socid =
GETPOST(
'socid',
'int');
1295 $object->type =
GETPOST(
'type');
1296 $object->ref =
GETPOST(
'ref');
1297 $object->date = $dateinvoice;
1298 $object->date_pointoftax = $date_pointoftax;
1299 $object->note_public = trim(
GETPOST(
'note_public',
'restricthtml'));
1300 $object->note_private = trim(
GETPOST(
'note_private',
'restricthtml'));
1301 $object->ref_client =
GETPOST(
'ref_client');
1302 $object->model_pdf =
GETPOST(
'model');
1303 $object->fk_project =
GETPOST(
'projectid',
'int');
1304 $object->cond_reglement_id = (
GETPOST(
'type') == 3 ? 1 :
GETPOST(
'cond_reglement_id'));
1305 $object->mode_reglement_id =
GETPOST(
'mode_reglement_id',
'int');
1306 $object->fk_account =
GETPOST(
'fk_account',
'int');
1310 $object->fk_incoterms =
GETPOST(
'incoterm_id',
'int');
1311 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
1312 $object->multicurrency_code =
GETPOST(
'multicurrency_code',
'alpha');
1313 $object->multicurrency_tx =
GETPOST(
'originmulticurrency_tx',
'int');
1316 $object->fac_rec =
GETPOST(
'fac_rec',
'int');
1318 $id = $object->create($user);
1324 $typeamount =
GETPOST(
'typedeposit',
'aZ09');
1325 $valuestandardinvoice =
price2num(str_replace(
'%',
'',
GETPOST(
'valuestandardinvoice',
'alpha')),
'MU');
1326 $valuedeposit =
price2num(str_replace(
'%',
'',
GETPOST(
'valuedeposit',
'alpha')),
'MU');
1328 if (
GETPOST(
'socid',
'int') < 1) {
1330 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Customer")), null,
'errors');
1334 if (empty($dateinvoice)) {
1336 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")), null,
'errors');
1338 } elseif ($dateinvoice > (
dol_get_last_hour(
dol_now(
'tzuserrel')) + (empty($conf->global->INVOICE_MAX_FUTURE_DELAY) ? 0 : $conf->global->INVOICE_MAX_FUTURE_DELAY))) {
1346 if ($valuestandardinvoice < 0 || $valuestandardinvoice > 100) {
1347 setEventMessages($langs->trans(
"ErrorAPercentIsRequired"), null,
'errors');
1352 if ($typeamount && !empty($origin) && !empty($originid)) {
1353 if ($typeamount ==
'amount' && $valuedeposit <= 0) {
1354 setEventMessages($langs->trans(
"ErrorAnAmountWithoutTaxIsRequired"), null,
'errors');
1358 if ($typeamount ==
'variable' && $valuedeposit <= 0) {
1359 setEventMessages($langs->trans(
"ErrorAPercentIsRequired"), null,
'errors');
1363 if ($typeamount ==
'variablealllines' && $valuedeposit <= 0) {
1364 setEventMessages($langs->trans(
"ErrorAPercentIsRequired"), null,
'errors');
1373 $object->socid =
GETPOST(
'socid',
'int');
1374 $object->type =
GETPOST(
'type');
1375 $object->ref =
GETPOST(
'ref');
1376 $object->date = $dateinvoice;
1377 $object->date_pointoftax = $date_pointoftax;
1378 $object->note_public = trim(
GETPOST(
'note_public',
'restricthtml'));
1379 $object->note_private = trim(
GETPOST(
'note_private',
'restricthtml'));
1380 $object->ref_client =
GETPOST(
'ref_client');
1381 $object->model_pdf =
GETPOST(
'model');
1382 $object->fk_project =
GETPOST(
'projectid',
'int');
1383 $object->cond_reglement_id = (
GETPOST(
'type') == 3 ? 1 :
GETPOST(
'cond_reglement_id'));
1384 $object->mode_reglement_id =
GETPOST(
'mode_reglement_id');
1385 $object->fk_account =
GETPOST(
'fk_account',
'int');
1389 $object->fk_incoterms =
GETPOST(
'incoterm_id',
'int');
1390 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
1391 $object->multicurrency_code =
GETPOST(
'multicurrency_code',
'alpha');
1392 $object->multicurrency_tx =
GETPOST(
'originmulticurrency_tx',
'int');
1395 $object->situation_counter = 1;
1396 $object->situation_final = 0;
1397 $object->situation_cycle_ref = $object->newCycle();
1400 if (in_array($object->type, $retainedWarrantyInvoiceAvailableType)) {
1401 $object->retained_warranty =
GETPOST(
'retained_warranty',
'int');
1402 $object->retained_warranty_fk_cond_reglement =
GETPOST(
'retained_warranty_fk_cond_reglement',
'int');
1404 $object->retained_warranty = 0;
1405 $object->retained_warranty_fk_cond_reglement = 0;
1408 $retained_warranty_date_limit =
GETPOST(
'retained_warranty_date_limit');
1409 if (!empty($retained_warranty_date_limit) &&
dol_stringtotime($retained_warranty_date_limit)) {
1410 $object->retained_warranty_date_limit =
dol_stringtotime($retained_warranty_date_limit);
1412 $object->retained_warranty_date_limit = !empty($object->retained_warranty_date_limit) ? $object->retained_warranty_date_limit : $object->calculate_date_lim_reglement($object->retained_warranty_fk_cond_reglement);
1414 $object->fetch_thirdparty();
1417 if (!empty($origin) && !empty($originid)) {
1420 $element = $subelement = $origin;
1421 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
1422 $element = $regs[1];
1423 $subelement = $regs[2];
1427 if ($element ==
'order') {
1428 $element = $subelement =
'commande';
1430 if ($element ==
'propal') {
1431 $element =
'comm/propal';
1432 $subelement =
'propal';
1434 if ($element ==
'contract') {
1435 $element = $subelement =
'contrat';
1437 if ($element ==
'inter') {
1438 $element = $subelement =
'ficheinter';
1440 if ($element ==
'shipping') {
1441 $element = $subelement =
'expedition';
1444 $object->origin = $origin;
1445 $object->origin_id = $originid;
1448 $object->linked_objects[$object->origin] = $object->origin_id;
1450 if ($object->origin ==
'shipping') {
1451 require_once DOL_DOCUMENT_ROOT.
'/expedition/class/expedition.class.php';
1453 $exp->fetch($object->origin_id);
1454 $exp->fetchObjectLinked();
1455 if (is_array($exp->linkedObjectsIds[
'commande']) && count($exp->linkedObjectsIds[
'commande']) > 0) {
1456 foreach ($exp->linkedObjectsIds[
'commande'] as $key => $value) {
1457 $object->linked_objects[
'commande'] = $value;
1462 if (is_array($_POST[
'other_linked_objects']) && !empty($_POST[
'other_linked_objects'])) {
1463 $object->linked_objects = array_merge($object->linked_objects, $_POST[
'other_linked_objects']);
1466 $id = $object->create($user);
1471 $classname = ucfirst($subelement);
1472 $srcobject =
new $classname($db);
1474 dol_syslog(
"Try to find source object origin=".$object->origin.
" originid=".$object->origin_id.
" to add lines or deposit lines");
1475 $result = $srcobject->fetch($object->origin_id);
1480 $amountdeposit = array();
1481 if (!empty($conf->global->MAIN_DEPOSIT_MULTI_TVA)) {
1482 if ($typeamount ==
'amount') {
1483 $amount = $valuedeposit;
1485 $amount = $srcobject->total_ttc * ($valuedeposit / 100);
1488 $TTotalByTva = array();
1489 foreach ($srcobject->lines as &$line) {
1490 if (!empty($line->special_code)) {
1493 $TTotalByTva[$line->tva_tx] += $line->total_ttc;
1496 foreach ($TTotalByTva as $tva => &$total) {
1497 $coef = $total / $srcobject->total_ttc;
1498 $am = $amount * $coef;
1499 $amount_ttc_diff += $am;
1500 $amountdeposit[$tva] += $am / (1 + $tva / 100);
1503 if ($typeamount ==
'amount') {
1504 $amountdeposit[0] = $valuedeposit;
1505 } elseif ($typeamount ==
'variable') {
1508 $lines = $srcobject->lines;
1509 $numlines = count($lines);
1510 for ($i = 0; $i < $numlines; $i++) {
1512 if (empty($lines[$i]->qty)) {
1515 if (!empty($lines[$i]->special_code)) {
1519 $totalamount += $lines[$i]->total_ht;
1520 $tva_tx = $lines[$i]->tva_tx;
1521 $amountdeposit[$tva_tx] += ($lines[$i]->total_ht * $valuedeposit) / 100;
1525 if ($totalamount == 0) {
1526 $amountdeposit[0] = 0;
1534 $amount_ttc_diff = $amountdeposit[0];
1537 foreach ($amountdeposit as $tva => $amount) {
1538 if (empty($amount)) {
1543 'amount' =>
'FixAmount',
1544 'variable' =>
'VarAmount'
1546 $descline =
'(DEPOSIT)';
1548 if ($typeamount ==
'amount') {
1549 $descline .=
' ('.price($valuedeposit,
'', $langs, 0, - 1, - 1, (!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency)).
')';
1550 } elseif ($typeamount ==
'variable') {
1551 $descline .=
' ('.$valuedeposit.
'%)';
1554 $descline .=
' - '.$srcobject->ref;
1555 $result = $object->addline(
1562 (empty($conf->global->INVOICE_PRODUCTID_DEPOSIT) ? 0 : $conf->global->INVOICE_PRODUCTID_DEPOSIT),
1567 $lines[$i]->info_bits,
1573 $lines[$i]->special_code,
1590 $diff = $object->total_ttc - $amount_ttc_diff;
1592 if (!empty($conf->global->MAIN_DEPOSIT_MULTI_TVA) && $diff != 0) {
1593 $object->fetch_lines();
1594 $subprice_diff = $object->lines[0]->subprice - $diff / (1 + $object->lines[0]->tva_tx / 100);
1595 $object->updateline($object->lines[0]->id, $object->lines[0]->desc, $subprice_diff, $object->lines[0]->qty, $object->lines[0]->remise_percent, $object->lines[0]->date_start, $object->lines[0]->date_end, $object->lines[0]->tva_tx, 0, 0,
'HT', $object->lines[0]->info_bits, $object->lines[0]->product_type, 0, 0, 0, $object->lines[0]->pa_ht, $object->lines[0]->label, 0, array(), 100);
1602 $lines = $srcobject->lines;
1603 if (empty($lines) && method_exists($srcobject,
'fetch_lines')) {
1604 $srcobject->fetch_lines();
1605 $lines = $srcobject->lines;
1610 if (is_array($lines)) {
1611 foreach ($lines as $line) {
1613 $line->qty =
price2num($line->qty * $valuestandardinvoice / 100,
'MS');
1619 if (is_array($lines)) {
1620 foreach ($lines as $line) {
1622 $line->qty =
price2num($line->qty * $valuedeposit / 100,
'MS');
1627 $fk_parent_line = 0;
1628 $num = count($lines);
1630 for ($i = 0; $i < $num; $i++) {
1631 if (!in_array($lines[$i]->
id, $selectedLines)) {
1636 if ($srcobject->element ==
'shipping' && $conf->global->SHIPMENT_GETS_ALL_ORDER_PRODUCTS && $lines[$i]->qty == 0) {
1640 if (!isset($conf->global->CONTRACT_EXCLUDE_SERVICES_STATUS_FOR_INVOICE)) {
1641 $conf->global->CONTRACT_EXCLUDE_SERVICES_STATUS_FOR_INVOICE =
'5';
1643 if ($srcobject->element ==
'contrat' && in_array($lines[$i]->statut, explode(
',', $conf->global->CONTRACT_EXCLUDE_SERVICES_STATUS_FOR_INVOICE))) {
1647 $label = (!empty($lines[$i]->label) ? $lines[$i]->label :
'');
1648 $desc = (!empty($lines[$i]->desc) ? $lines[$i]->desc : $lines[$i]->libelle);
1649 if ($object->situation_counter == 1) {
1650 $lines[$i]->situation_percent = 0;
1653 if ($lines[$i]->subprice < 0 && empty($conf->global->INVOICE_KEEP_DISCOUNT_LINES_AS_IN_ORIGIN)) {
1656 $discount->fk_soc = $object->socid;
1657 $discount->amount_ht = abs($lines[$i]->total_ht);
1658 $discount->amount_tva = abs($lines[$i]->total_tva);
1659 $discount->amount_ttc = abs($lines[$i]->total_ttc);
1660 $discount->tva_tx = $lines[$i]->tva_tx;
1661 $discount->fk_user = $user->id;
1662 $discount->description = $desc;
1663 $discount->multicurrency_subprice = abs($lines[$i]->multicurrency_subprice);
1664 $discount->multicurrency_amount_ht = abs($lines[$i]->multicurrency_total_ht);
1665 $discount->multicurrency_amount_tva = abs($lines[$i]->multicurrency_total_tva);
1666 $discount->multicurrency_amount_ttc = abs($lines[$i]->multicurrency_total_ttc);
1668 $discountid = $discount->create($user);
1669 if ($discountid > 0) {
1670 $result = $object->insert_discount($discountid);
1678 $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0);
1681 $date_start =
false;
1682 if ($lines[$i]->date_debut_prevue) {
1683 $date_start = $lines[$i]->date_debut_prevue;
1685 if ($lines[$i]->date_debut_reel) {
1686 $date_start = $lines[$i]->date_debut_reel;
1688 if ($lines[$i]->date_start) {
1689 $date_start = $lines[$i]->date_start;
1694 if ($lines[$i]->date_fin_prevue) {
1695 $date_end = $lines[$i]->date_fin_prevue;
1697 if ($lines[$i]->date_fin_reel) {
1698 $date_end = $lines[$i]->date_fin_reel;
1700 if ($lines[$i]->date_end) {
1701 $date_end = $lines[$i]->date_end;
1705 if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) {
1706 $fk_parent_line = 0;
1710 if (method_exists($lines[$i],
'fetch_optionals')) {
1711 $lines[$i]->fetch_optionals();
1712 $array_options = $lines[$i]->array_options;
1715 $tva_tx = $lines[$i]->tva_tx;
1716 if (!empty($lines[$i]->vat_src_code) && !preg_match(
'/\(/', $tva_tx)) {
1717 $tva_tx .=
' ('.$lines[$i]->vat_src_code.
')';
1722 $localtax1_tx =
get_localtax($tva_tx, 1, $object->thirdparty);
1723 $localtax2_tx =
get_localtax($tva_tx, 2, $object->thirdparty);
1725 $result = $object->addline(
1727 $lines[$i]->subprice,
1732 $lines[$i]->fk_product,
1733 $lines[$i]->remise_percent,
1737 $lines[$i]->info_bits,
1738 $lines[$i]->fk_remise_except,
1743 $lines[$i]->special_code,
1747 $lines[$i]->fk_fournprice,
1751 $lines[$i]->situation_percent,
1752 $lines[$i]->fk_prev_id,
1753 $lines[$i]->fk_unit,
1768 if ($result > 0 && $lines[$i]->product_type == 9) {
1769 $fk_parent_line = $result;
1779 $object->update_price(1,
'auto', 0, $mysoc);
1808 $parameters = array(
'objFrom' => $srcobject);
1809 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $object, $action);
1820 $id = $object->create($user);
1822 for ($i = 1; $i <= $NBLINES; $i++) {
1823 if (
GETPOST(
'idprod'.$i,
'int')) {
1825 $product->fetch(
GETPOST(
'idprod'.$i,
'int'));
1828 $result = $object->addline($product->description, $product->price,
price2num(
GETPOST(
'qty'.$i),
'MS'), $product->tva_tx, $product->localtax1_tx, $product->localtax2_tx,
GETPOST(
'idprod'.$i,
'int'),
price2num(
GETPOST(
'remise_percent'.$i),
'', 2), $startday, $endday, 0, 0,
'', $product->price_base_type, $product->price_ttc, $product->type, -1, 0,
'', 0, 0, null, 0,
'', 0, 100,
'', $product->fk_unit, 0,
'', 1);
1832 $object->update_price(1,
'auto', 0, $mysoc);
1839 if (empty($dateinvoice)) {
1841 $mesg = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date"));
1843 } elseif ($dateinvoice > (
dol_get_last_hour(
dol_now(
'tzuserrel')) + (empty($conf->global->INVOICE_MAX_FUTURE_DELAY) ? 0 : $conf->global->INVOICE_MAX_FUTURE_DELAY))) {
1849 if (!(
GETPOST(
'situations',
'int') > 0)) {
1851 $mesg = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"InvoiceSituation"));
1857 $result = $object->fetch(
GETPOST(
'situations',
'int'));
1858 $object->fk_facture_source =
GETPOST(
'situations',
'int');
1861 if (!empty($origin) && !empty($originid)) {
1862 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
1864 $object->origin = $origin;
1865 $object->origin_id = $originid;
1868 if (!empty($conf->global->INVOICE_USE_RETAINED_WARRANTY)) {
1869 $retained_warranty =
GETPOST(
'retained_warranty',
'int');
1870 if (
price2num($retained_warranty) > 0) {
1871 $object->retained_warranty =
price2num($retained_warranty);
1874 if (
GETPOST(
'retained_warranty_fk_cond_reglement',
'int') > 0) {
1875 $object->retained_warranty_fk_cond_reglement =
GETPOST(
'retained_warranty_fk_cond_reglement',
'int');
1878 $retained_warranty_date_limit =
GETPOST(
'retained_warranty_date_limit');
1879 if (!empty($retained_warranty_date_limit) && $db->jdate($retained_warranty_date_limit)) {
1880 $object->retained_warranty_date_limit = $db->jdate($retained_warranty_date_limit);
1882 $object->retained_warranty_date_limit = !empty($object->retained_warranty_date_limit) ? $object->retained_warranty_date_limit : $object->calculate_date_lim_reglement($object->retained_warranty_fk_cond_reglement);
1885 foreach ($object->lines as $i => &$line) {
1886 $line->origin = $object->origin;
1887 $line->origin_id = $line->id;
1888 $line->fk_prev_id = $line->id;
1889 $line->fetch_optionals();
1890 $line->situation_percent = $line->get_prev_progress($object->id);
1893 $tabprice =
calcul_price_total($line->qty, $line->subprice, $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, 0,
'HT', 0, $line->product_type, $mysoc,
'', $line->situation_percent);
1894 $line->total_ht = $tabprice[0];
1895 $line->total_tva = $tabprice[1];
1896 $line->total_ttc = $tabprice[2];
1897 $line->total_localtax1 = $tabprice[9];
1898 $line->total_localtax2 = $tabprice[10];
1899 $line->multicurrency_total_ht = $tabprice[16];
1900 $line->multicurrency_total_tva = $tabprice[17];
1901 $line->multicurrency_total_ttc = $tabprice[18];
1904 if ($line->fk_remise_except) {
1906 $result = $discount->fetch($line->fk_remise_except);
1909 if ($discount->fk_facture_line > 0) {
1910 $line->fk_remise_except = 0;
1917 $object->fetch_thirdparty();
1918 $object->date = $dateinvoice;
1919 $object->date_pointoftax = $date_pointoftax;
1920 $object->note_public = trim(
GETPOST(
'note_public',
'restricthtml'));
1921 $object->note = trim(
GETPOST(
'note',
'restricthtml'));
1922 $object->note_private = trim(
GETPOST(
'note',
'restricthtml'));
1923 $object->ref_client =
GETPOST(
'ref_client',
'alpha');
1924 $object->model_pdf =
GETPOST(
'model',
'alpha');
1925 $object->fk_project =
GETPOST(
'projectid',
'int');
1926 $object->cond_reglement_id =
GETPOST(
'cond_reglement_id',
'int');
1927 $object->mode_reglement_id =
GETPOST(
'mode_reglement_id',
'int');
1933 $object->situation_counter = $object->situation_counter + 1;
1934 $id = $object->createFromCurrent($user);
1936 $mesg = $object->error;
1938 $nextSituationInvoice =
new Facture($db);
1939 $nextSituationInvoice->fetch($id);
1942 $extrafields->fetch_name_optionals_label($nextSituationInvoice->table_element);
1943 $ret = $extrafields->setOptionalsFromPost(null, $nextSituationInvoice);
1945 $nextSituationInvoice->insertExtraFields();
1952 if ($id > 0 && !$error) {
1956 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE) && count($object->lines)) {
1957 $outputlangs = $langs;
1959 if ($conf->global->MAIN_MULTILANGS && empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
1960 $newlang =
GETPOST(
'lang_id',
'aZ09');
1962 if ($conf->global->MAIN_MULTILANGS && empty($newlang)) {
1963 $newlang = $object->thirdparty->default_lang;
1965 if (!empty($newlang)) {
1966 $outputlangs =
new Translate(
"", $conf);
1967 $outputlangs->setDefaultLang($newlang);
1968 $outputlangs->load(
'products');
1970 $model = $object->model_pdf;
1971 $ret = $object->fetch($id);
1973 $result = $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1979 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?facid='.$id);
1984 $_GET[
"origin"] = $_POST[
"origin"];
1985 $_GET[
"originid"] = $_POST[
"originid"];
1988 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'vatforalllines',
'alpha') !==
'') {
1990 $vat_rate = (
GETPOST(
'vatforalllines') ?
GETPOST(
'vatforalllines') : 0);
1991 $vat_rate = str_replace(
'*',
'', $vat_rate);
1992 $localtax1_rate =
get_localtax($vat_rate, 1, $object->thirdparty, $mysoc);
1993 $localtax2_rate =
get_localtax($vat_rate, 2, $object->thirdparty, $mysoc);
1994 foreach ($object->lines as $line) {
1995 $result = $object->updateline($line->id, $line->desc, $line->subprice, $line->qty, $line->remise_percent, $line->date_start, $line->date_end, $vat_rate, $localtax1_rate, $localtax2_rate,
'HT', $line->info_bits, $line->product_type, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->special_code, $line->array_options, $line->situation_percent, $line->fk_unit, $line->multicurrency_subprice);
1997 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'remiseforalllines',
'alpha') !==
'' && $usercancreate) {
1999 $remise_percent = (
GETPOST(
'remiseforalllines') ?
GETPOST(
'remiseforalllines') : 0);
2000 $remise_percent = str_replace(
'*',
'', $remise_percent);
2001 foreach ($object->lines as $line) {
2002 $result = $object->updateline($line->id, $line->desc, $line->subprice, $line->qty, $remise_percent, $line->date_start, $line->date_end, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx,
'HT', $line->info_bits, $line->product_type, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->special_code, $line->array_options, $line->situation_percent, $line->fk_unit, $line->multicurrency_subprice);
2004 } elseif ($action ==
'addline' && $usercancreate) {
2005 $langs->load(
'errors');
2013 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'alpha');
2014 if ($prod_entry_mode ==
'free') {
2016 $tva_tx = (
GETPOST(
'tva_tx',
'alpha') ?
GETPOST(
'tva_tx',
'alpha') : 0);
2018 $idprod =
GETPOST(
'idprod',
'int');
2026 $extralabelsline = $extrafields->fetch_name_optionals_label($object->table_element_line);
2027 $array_options = $extrafields->getOptionalsFromPost($object->table_element_line, $predef);
2029 if (is_array($extralabelsline)) {
2031 foreach ($extralabelsline as $key => $value) {
2032 unset($_POST[
"options_".$key.$predef]);
2036 if ((empty($idprod) || $idprod < 0) && ($price_ht < 0) && ($qty < 0)) {
2037 setEventMessages($langs->trans(
'ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv(
'UnitPriceHT'), $langs->transnoentitiesnoconv(
'Qty')), null,
'errors');
2040 if (!$prod_entry_mode) {
2042 setEventMessages($langs->trans(
'ErrorChooseBetweenFreeEntryOrPredefinedProduct'), null,
'errors');
2046 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
2047 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Type')), null,
'errors');
2050 if (($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && (($price_ht < 0 && empty($conf->global->FACTURE_ENABLE_NEGATIVE_LINES)) || $price_ht ==
'') && $price_ht_devise ==
'') && $object->type !=
Facture::TYPE_CREDIT_NOTE) {
2051 if ($price_ht < 0 && empty($conf->global->FACTURE_ENABLE_NEGATIVE_LINES)) {
2052 $langs->load(
"errors");
2053 if ($object->type == $object::TYPE_DEPOSIT) {
2055 setEventMessages($langs->trans(
"ErrorLinesCantBeNegativeOnDeposits"), null,
'errors');
2057 setEventMessages($langs->trans(
"ErrorFieldCantBeNegativeOnInvoice", $langs->transnoentitiesnoconv(
"UnitPriceHT"), $langs->transnoentitiesnoconv(
"CustomerAbsoluteDiscountShort")), null,
'errors');
2061 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")), null,
'errors');
2066 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Qty')), null,
'errors');
2069 if ($prod_entry_mode ==
'free' && empty($idprod) && empty($product_desc)) {
2070 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Description')), null,
'errors');
2074 $langs->load(
"errors");
2075 setEventMessages($langs->trans(
'ErrorQtyForCustomerInvoiceCantBeNegative'), null,
'errors');
2079 if (!$error &&
isModEnabled(
'variants') && $prod_entry_mode !=
'free') {
2080 if ($combinations =
GETPOST(
'combinations',
'array')) {
2084 if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
2085 $idprod = $res->fk_product_child;
2087 setEventMessages($langs->trans(
'ErrorProductCombinationNotFound'), null,
'errors');
2093 if (!$error && ($qty >= 0) && (!empty($product_desc) || (!empty($idprod) && $idprod > 0))) {
2094 $ret = $object->fetch($id);
2099 $ret = $object->fetch_thirdparty();
2104 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
2115 if (!empty($idprod) && $idprod > 0) {
2117 $prod->fetch($idprod);
2119 $label = ((
GETPOST(
'product_label') &&
GETPOST(
'product_label') != $prod->label) ?
GETPOST(
'product_label') :
'');
2124 $datapriceofproduct = $prod->getSellPrice($mysoc, $object->thirdparty, $pqp);
2126 $pu_ht = $datapriceofproduct[
'pu_ht'];
2127 $pu_ttc = $datapriceofproduct[
'pu_ttc'];
2128 $price_min = $datapriceofproduct[
'price_min'];
2129 $price_base_type = $datapriceofproduct[
'price_base_type'];
2130 $tva_tx = $datapriceofproduct[
'tva_tx'];
2131 $tva_npr = $datapriceofproduct[
'tva_npr'];
2133 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
2134 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $prod->tva_tx));
2137 if (!empty($price_ht) || $price_ht ===
'0') {
2139 $pu_ttc =
price2num($pu_ht * (1 + ($tmpvat / 100)),
'MU');
2140 } elseif ($tmpvat != $tmpprodvat) {
2143 if ($price_base_type !=
'HT') {
2144 $pu_ht =
price2num($pu_ttc / (1 + ($tmpvat / 100)),
'MU');
2146 $pu_ttc =
price2num($pu_ht * (1 + ($tmpvat / 100)),
'MU');
2153 if (!empty($conf->global->MAIN_MULTILANGS) && !empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) {
2154 $outputlangs = $langs;
2156 if (empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
2157 $newlang =
GETPOST(
'lang_id',
'aZ09');
2159 if (empty($newlang)) {
2160 $newlang = $object->thirdparty->default_lang;
2162 if (!empty($newlang)) {
2163 $outputlangs =
new Translate(
"", $conf);
2164 $outputlangs->setDefaultLang($newlang);
2165 $outputlangs->load(
'products');
2168 $desc = (!empty($prod->multilangs [$outputlangs->defaultlang] [
"description"])) ? $prod->multilangs [$outputlangs->defaultlang] [
"description"] : $prod->description;
2170 $desc = $prod->description;
2174 if ($product_desc==$desc && !empty($conf->global->PRODUIT_AUTOFILL_DESC)) {
2178 if (!empty($product_desc) && !empty($conf->global->MAIN_NO_CONCAT_DESCRIPTION)) {
2179 $desc = $product_desc;
2181 $desc =
dol_concatdesc($desc, $product_desc,
'', !empty($conf->global->MAIN_CHANGE_ORDER_CONCAT_DESCRIPTION));
2185 if (empty($conf->global->MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE) && (!empty($prod->customcode) || !empty($prod->country_code))) {
2188 if (!empty($conf->global->MAIN_MULTILANGS) && !empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) {
2189 $outputlangs = $langs;
2191 if (empty($newlang) &&
GETPOST(
'lang_id',
'alpha')) {
2192 $newlang =
GETPOST(
'lang_id',
'alpha');
2194 if (empty($newlang)) {
2195 $newlang = $object->thirdparty->default_lang;
2197 if (!empty($newlang)) {
2198 $outputlangs =
new Translate(
"", $conf);
2199 $outputlangs->setDefaultLang($newlang);
2200 $outputlangs->load(
'products');
2202 if (!empty($prod->customcode)) {
2203 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
2205 if (!empty($prod->customcode) && !empty($prod->country_code)) {
2208 if (!empty($prod->country_code)) {
2209 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code, 0, $db, $outputlangs, 0);
2212 if (!empty($prod->customcode)) {
2213 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
2215 if (!empty($prod->customcode) && !empty($prod->country_code)) {
2218 if (!empty($prod->country_code)) {
2219 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code, 0, $db, $langs, 0);
2226 $type = $prod->type;
2227 $fk_unit = $prod->fk_unit;
2231 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
2232 $tva_tx = str_replace(
'*',
'', $tva_tx);
2233 if (empty($tva_tx)) {
2236 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
2237 $desc = $product_desc;
2239 $fk_unit =
GETPOST(
'units',
'alpha');
2242 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
2249 $localtax1_tx =
get_localtax($tva_tx, 1, $object->thirdparty, $mysoc, $tva_npr);
2250 $localtax2_tx =
get_localtax($tva_tx, 2, $object->thirdparty, $mysoc, $tva_npr);
2258 $price2num_remise_percent =
price2num($remise_percent);
2259 $price2num_price_min =
price2num($price_min);
2260 if (empty($price2num_pu_ht)) {
2261 $price2num_pu_ht = 0;
2263 if (empty($price2num_remise_percent)) {
2264 $price2num_remise_percent = 0;
2266 if (empty($price2num_price_min)) {
2267 $price2num_price_min = 0;
2270 if ($usercanproductignorepricemin && (!empty($price_min) && ($price2num_pu_ht * (1 - $price2num_remise_percent / 100) < $price2num_price_min))) {
2271 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, - 1, $conf->currency));
2275 if (!empty($conf->productbatch->enabled) && !empty($lines[$i]->detail_batch) && is_array($lines[$i]->detail_batch) && !empty($conf->global->INVOICE_INCUDE_DETAILS_OF_LOTS_SERIALS)) {
2276 $langs->load(
'productbatch');
2277 foreach ($lines[$i]->detail_batch as $batchline) {
2278 $desc .=
' '.$langs->trans(
'Batch').
' '.$batchline->batch.
' '.$langs->trans(
'printQty', $batchline->qty).
' ';
2283 $result = $object->addline($desc, $pu_ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, $idprod, $remise_percent, $date_start, $date_end, 0, $info_bits,
'', $price_base_type, $pu_ttc, $type, min($rank, count($object->lines) + 1), $special_code,
'', 0,
GETPOST(
'fk_parent_line'), $fournprice, $buyingprice, $label, $array_options,
GETPOST(
'progress'),
'', $fk_unit, $pu_ht_devise);
2287 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
2288 $outputlangs = $langs;
2290 if (!empty($conf->global->MAIN_MULTILANGS) && empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
2291 $newlang =
GETPOST(
'lang_id',
'aZ09');
2293 if (!empty($conf->global->MAIN_MULTILANGS) && empty($newlang)) {
2294 $newlang = $object->thirdparty->default_lang;
2296 if (!empty($newlang)) {
2297 $outputlangs =
new Translate(
"", $conf);
2298 $outputlangs->setDefaultLang($newlang);
2299 $outputlangs->load(
'products');
2301 $model = $object->model_pdf;
2302 $ret = $object->fetch($id);
2304 $result = $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
2310 unset($_POST[
'prod_entry_mode']);
2312 unset($_POST[
'qty']);
2313 unset($_POST[
'type']);
2314 unset($_POST[
'remise_percent']);
2315 unset($_POST[
'price_ht']);
2316 unset($_POST[
'multicurrency_price_ht']);
2317 unset($_POST[
'price_ttc']);
2318 unset($_POST[
'tva_tx']);
2319 unset($_POST[
'product_ref']);
2320 unset($_POST[
'product_label']);
2321 unset($_POST[
'product_desc']);
2322 unset($_POST[
'fournprice']);
2323 unset($_POST[
'buying_price']);
2324 unset($_POST[
'np_marginRate']);
2325 unset($_POST[
'np_markRate']);
2326 unset($_POST[
'dp_desc']);
2327 unset($_POST[
'idprod']);
2328 unset($_POST[
'units']);
2330 unset($_POST[
'date_starthour']);
2331 unset($_POST[
'date_startmin']);
2332 unset($_POST[
'date_startsec']);
2333 unset($_POST[
'date_startday']);
2334 unset($_POST[
'date_startmonth']);
2335 unset($_POST[
'date_startyear']);
2336 unset($_POST[
'date_endhour']);
2337 unset($_POST[
'date_endmin']);
2338 unset($_POST[
'date_endsec']);
2339 unset($_POST[
'date_endday']);
2340 unset($_POST[
'date_endmonth']);
2341 unset($_POST[
'date_endyear']);
2343 unset($_POST[
'situations']);
2344 unset($_POST[
'progress']);
2352 } elseif ($action ==
'updateline' && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
2353 if (!$object->fetch($id) > 0) {
2356 $object->fetch_thirdparty();
2371 if (preg_match(
'/\*/', $vat_rate)) {
2376 $vat_rate = str_replace(
'*',
'', $vat_rate);
2377 $localtax1_rate =
get_localtax($vat_rate, 1, $object->thirdparty);
2378 $localtax2_rate =
get_localtax($vat_rate, 2, $object->thirdparty);
2385 $extralabelsline = $extrafields->fetch_name_optionals_label($object->table_element_line);
2386 $array_options = $extrafields->getOptionalsFromPost($object->table_element_line);
2388 if (is_array($extralabelsline)) {
2390 foreach ($extralabelsline as $key => $value) {
2391 unset($_POST[
"options_".$key]);
2396 $special_code =
GETPOST(
'special_code',
'int');
2397 if ($special_code == 3) {
2402 $line->fetch(
GETPOST(
'lineid',
'int'));
2403 $percent = $line->get_prev_progress($object->id);
2408 if ($progress >= 0) {
2409 $mesg = $langs->trans(
"CantBeNullOrPositive");
2413 } elseif ($progress < $line->situation_percent) {
2414 $mesg = $langs->trans(
"CantBeLessThanMinPercent");
2418 } elseif ($progress < $percent) {
2419 $mesg =
'<div class="warning">'.$langs->trans(
"CantBeLessThanMinPercent").
'</div>';
2429 $productid =
GETPOST(
'productid',
'int');
2430 if (!empty($productid)) {
2432 $product->fetch($productid);
2434 $type = $product->type;
2436 $price_min = $product->price_min;
2437 if ((!empty($conf->global->PRODUIT_MULTIPRICES) || !empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES)) && !empty($object->thirdparty->price_level)) {
2438 $price_min = $product->multiprices_min [$object->thirdparty->price_level];
2445 setEventMessages($langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, - 1, $conf->currency)), null,
'errors');
2450 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
2454 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")), null,
'errors');
2459 $langs->load(
"errors");
2460 setEventMessages($langs->trans(
'ErrorQtyForCustomerInvoiceCantBeNegative'), null,
'errors');
2463 if ((empty($productid) && (($pu_ht < 0 && empty($conf->global->FACTURE_ENABLE_NEGATIVE_LINES)) || $pu_ht ==
'') && $pu_ht_devise ==
'') && $object->type !=
Facture::TYPE_CREDIT_NOTE) {
2464 if ($pu_ht < 0 && empty($conf->global->FACTURE_ENABLE_NEGATIVE_LINES)) {
2465 $langs->load(
"errors");
2466 if ($object->type == $object::TYPE_DEPOSIT) {
2468 setEventMessages($langs->trans(
"ErrorLinesCantBeNegativeOnDeposits"), null,
'errors');
2470 setEventMessages($langs->trans(
"ErrorFieldCantBeNegativeOnInvoice", $langs->transnoentitiesnoconv(
"UnitPriceHT"), $langs->transnoentitiesnoconv(
"CustomerAbsoluteDiscountShort")), null,
'errors');
2474 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")), null,
'errors');
2482 if (empty($usercancreatemargin)) {
2483 foreach ($object->lines as &$line) {
2484 if ($line->id ==
GETPOST(
'lineid',
'int')) {
2485 $fournprice = $line->fk_fournprice;
2486 $buyingprice = $line->pa_ht;
2492 $result = $object->updateline(
2506 GETPOST(
'fk_parent_line',
'int'),
2519 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
2521 $outputlangs = $langs;
2523 if ($conf->global->MAIN_MULTILANGS && empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
2524 $newlang =
GETPOST(
'lang_id',
'aZ09');
2526 if ($conf->global->MAIN_MULTILANGS && empty($newlang)) {
2527 $newlang = $object->thirdparty->default_lang;
2529 if (!empty($newlang)) {
2530 $outputlangs =
new Translate(
"", $conf);
2531 $outputlangs->setDefaultLang($newlang);
2532 $outputlangs->load(
'products');
2535 $ret = $object->fetch($id);
2536 $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
2539 unset($_POST[
'qty']);
2540 unset($_POST[
'type']);
2541 unset($_POST[
'productid']);
2542 unset($_POST[
'remise_percent']);
2543 unset($_POST[
'price_ht']);
2544 unset($_POST[
'multicurrency_price_ht']);
2545 unset($_POST[
'price_ttc']);
2546 unset($_POST[
'tva_tx']);
2547 unset($_POST[
'product_ref']);
2548 unset($_POST[
'product_label']);
2549 unset($_POST[
'product_desc']);
2550 unset($_POST[
'fournprice']);
2551 unset($_POST[
'buying_price']);
2552 unset($_POST[
'np_marginRate']);
2553 unset($_POST[
'np_markRate']);
2555 unset($_POST[
'dp_desc']);
2556 unset($_POST[
'idprod']);
2557 unset($_POST[
'units']);
2559 unset($_POST[
'date_starthour']);
2560 unset($_POST[
'date_startmin']);
2561 unset($_POST[
'date_startsec']);
2562 unset($_POST[
'date_startday']);
2563 unset($_POST[
'date_startmonth']);
2564 unset($_POST[
'date_startyear']);
2565 unset($_POST[
'date_endhour']);
2566 unset($_POST[
'date_endmin']);
2567 unset($_POST[
'date_endsec']);
2568 unset($_POST[
'date_endday']);
2569 unset($_POST[
'date_endmonth']);
2570 unset($_POST[
'date_endyear']);
2572 unset($_POST[
'situations']);
2573 unset($_POST[
'progress']);
2578 } elseif ($action ==
'updatealllines' && $usercancreate &&
GETPOST(
'all_percent') == $langs->trans(
'Modifier')) {
2579 if (!$object->fetch($id) > 0) {
2582 if (
GETPOST(
'all_progress') !=
"") {
2583 $all_progress =
GETPOST(
'all_progress',
'int');
2584 foreach ($object->lines as $line) {
2585 $percent = $line->get_prev_progress($object->id);
2586 if (floatval($all_progress) < floatval($percent)) {
2587 $mesg = $langs->trans(
"Line").
' '.$i.
' : '.$langs->trans(
"CantBeLessThanMinPercent");
2591 $object->update_percent($line,
GETPOST(
'all_progress'),
false);
2594 $object->update_price(1);
2596 } elseif ($action ==
'updateline' && $usercancreate && !$cancel) {
2597 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?facid='.$id);
2599 } elseif ($action ==
'confirm_situationout' && $confirm ==
'yes' && $usercancreate) {
2601 $object->fetch($id,
'',
'',
'',
true);
2607 && $object->is_last_in_cycle()
2608 && $usercanunvalidate
2611 $newCycle = $object->newCycle();
2612 if ($newCycle > 1) {
2614 $lastCycle = $object->situation_cycle_ref;
2615 $lastSituationCounter = $object->situation_counter;
2616 $linkedCreditNotesList = array();
2618 if (count($object->tab_next_situation_invoice) > 0) {
2619 foreach ($object->tab_next_situation_invoice as $next_invoice) {
2621 && $next_invoice->situation_counter == $object->situation_counter
2622 && $next_invoice->fk_facture_source == $object->id
2624 $linkedCreditNotesList[] = $next_invoice->id;
2629 $object->situation_cycle_ref = $newCycle;
2630 $object->situation_counter = 1;
2631 $object->situation_final = 0;
2632 if ($object->update($user) > 0) {
2634 if (count($linkedCreditNotesList) > 0) {
2636 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'facture';
2637 $sql .=
' SET situation_cycle_ref = '.((int) $newCycle);
2638 $sql .=
' , situation_final=0';
2639 $sql .=
' , situation_counter='.((int) $object->situation_counter);
2640 $sql .=
' WHERE rowid IN ('.$db->sanitize(implode(
',', $linkedCreditNotesList)).
')';
2642 $resql = $db->query($sql);
2648 foreach ($object->lines as $line) {
2650 if ($line->product_type == 9) {
2655 if (!empty($object->tab_previous_situation_invoice)) {
2657 $lineIndex = count($object->tab_previous_situation_invoice) - 1;
2658 $searchPreviousInvoice =
true;
2659 while ($searchPreviousInvoice) {
2661 $searchPreviousInvoice =
false;
2669 $maxPrevSituationPercent = 0;
2670 foreach ($object->tab_previous_situation_invoice[$lineIndex]->lines as $prevLine) {
2671 if ($prevLine->id == $line->fk_prev_id) {
2672 $maxPrevSituationPercent = max($maxPrevSituationPercent, $prevLine->situation_percent);
2677 $line->situation_percent = $line->situation_percent - $maxPrevSituationPercent;
2679 if ($line->update() < 0) {
2688 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
2690 setEventMessages($langs->trans(
'ErrorOutingSituationInvoiceCreditNote'), array(),
'errors');
2693 setEventMessages($langs->trans(
'ErrorOutingSituationInvoiceOnUpdate'), array(),
'errors');
2696 setEventMessages($langs->trans(
'ErrorFindNextSituationInvoice'), array(),
'errors');
2699 } elseif ($action ==
'import_lines_from_object'
2704 $fromElement =
GETPOST(
'fromelement');
2705 $fromElementid =
GETPOST(
'fromelementid');
2706 $importLines =
GETPOST(
'line_checkbox');
2708 if (!empty($importLines) && is_array($importLines) && !empty($fromElement) && ctype_alpha($fromElement) && !empty($fromElementid)) {
2709 if ($fromElement ==
'commande') {
2711 $lineClassName =
'OrderLine';
2712 } elseif ($fromElement ==
'propal') {
2713 dol_include_once(
'/comm/'.$fromElement.
'/class/'.$fromElement.
'.class.php');
2714 $lineClassName =
'PropaleLigne';
2716 $nextRang = count($object->lines) + 1;
2719 foreach ($importLines as $lineId) {
2720 $lineId = intval($lineId);
2721 $originLine =
new $lineClassName($db);
2722 if (intval($fromElementid) > 0 && $originLine->fetch($lineId) > 0) {
2723 $originLine->fetch_optionals();
2724 $desc = $originLine->desc;
2725 $pu_ht = $originLine->subprice;
2726 $qty = $originLine->qty;
2727 $txtva = $originLine->tva_tx;
2728 $txlocaltax1 = $originLine->localtax1_tx;
2729 $txlocaltax2 = $originLine->localtax2_tx;
2730 $fk_product = $originLine->fk_product;
2731 $remise_percent = $originLine->remise_percent;
2732 $date_start = $originLine->date_start;
2733 $date_end = $originLine->date_end;
2735 $info_bits = $originLine->info_bits;
2736 $fk_remise_except = $originLine->fk_remise_except;
2737 $price_base_type =
'HT';
2739 $type = $originLine->product_type;
2740 $rang = $nextRang++;
2741 $special_code = $originLine->special_code;
2742 $origin = $originLine->element;
2743 $origin_id = $originLine->id;
2744 $fk_parent_line = 0;
2745 $fk_fournprice = $originLine->fk_fournprice;
2746 $pa_ht = $originLine->pa_ht;
2747 $label = $originLine->label;
2748 $array_options = $originLine->array_options;
2750 $situation_percent = 0;
2752 $situation_percent = 100;
2755 $fk_unit = $originLine->fk_unit;
2756 $pu_ht_devise = $originLine->multicurrency_subprice;
2758 $res = $object->addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1, $txlocaltax2, $fk_product, $remise_percent, $date_start, $date_end, $ventil, $info_bits, $fk_remise_except, $price_base_type, $pu_ttc, $type, $rang, $special_code, $origin, $origin_id, $fk_parent_line, $fk_fournprice, $pa_ht, $label, $array_options, $situation_percent, $fk_prev_id, $fk_unit, $pu_ht_devise);
2777 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
2783 $triggersendname =
'BILL_SENTBYMAIL';
2785 $autocopy =
'MAIN_MAIL_AUTOCOPY_INVOICE_TO';
2786 $trackid =
'inv'.$object->id;
2787 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
2790 $upload_dir = $conf->facture->multidir_output[!empty($object->entity) ? $object->entity : $conf->entity];
2791 $permissiontoadd = $usercancreate;
2792 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
2795 if ($action ==
'update_extras') {
2799 $ret = $extrafields->setOptionalsFromPost(null, $object,
GETPOST(
'attribute',
'restricthtml'));
2806 $result = $object->insertExtraFields(
'BILL_MODIFY');
2814 $action =
'edit_extras';
2818 if (!empty($conf->global->MAIN_DISABLE_CONTACTS_TAB) && $usercancreate) {
2819 if ($action ==
'addcontact') {
2820 $result = $object->fetch($id);
2822 if ($result > 0 && $id > 0) {
2825 $result = $object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
2829 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
2832 if ($object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
2833 $langs->load(
"errors");
2834 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"), null,
'errors');
2839 } elseif ($action ==
'swapstatut') {
2841 if ($object->fetch($id)) {
2842 $result = $object->swapContactStatus(
GETPOST(
'ligne',
'int'));
2846 } elseif ($action ==
'deletecontact') {
2848 $object->fetch($id);
2849 $result = $object->delete_contact($lineid);
2852 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
2860 $action =
'edit_extras';
2876 $paymentstatic =
new Paiement($db);
2877 $bankaccountstatic =
new Account($db);
2884 $title = $langs->trans(
'InvoiceCustomer').
" - ".$langs->trans(
'Card');
2886 $help_url =
"EN:Customers_Invoices|FR:Factures_Clients|ES:Facturas_a_clientes";
2892 if ($action ==
'create') {
2893 $facturestatic =
new Facture($db);
2894 $extrafields->fetch_name_optionals_label($facturestatic->table_element);
2899 $res = $soc->fetch($socid);
2902 $currency_code = $conf->currency;
2906 $remise_absolue = 0;
2907 if (!empty($origin) && !empty($originid)) {
2909 $element = $subelement = $origin;
2911 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
2912 $element = $regs[1];
2913 $subelement = $regs[2];
2916 if ($element ==
'project') {
2917 $projectid = $originid;
2919 if (empty($cond_reglement_id)) {
2920 $cond_reglement_id = $soc->cond_reglement_id;
2922 if (empty($mode_reglement_id)) {
2923 $mode_reglement_id = $soc->mode_reglement_id;
2925 if (empty($fk_account)) {
2926 $fk_account = $soc->fk_account;
2928 if (!$remise_percent) {
2929 $remise_percent = $soc->remise_percent;
2931 if (!$dateinvoice) {
2933 $dateinvoice = (empty($dateinvoice) ? (empty($conf->global->MAIN_AUTOFILL_DATE) ?-1 :
'') : $dateinvoice);
2937 if ($element ==
'order' || $element ==
'commande') {
2938 $element = $subelement =
'commande';
2940 if ($element ==
'propal') {
2941 $element =
'comm/propal';
2942 $subelement =
'propal';
2944 if ($element ==
'contract') {
2945 $element = $subelement =
'contrat';
2947 if ($element ==
'shipping') {
2948 $element = $subelement =
'expedition';
2953 $classname = ucfirst($subelement);
2954 $objectsrc =
new $classname($db);
2955 $objectsrc->fetch($originid);
2956 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
2957 $objectsrc->fetch_lines();
2959 $objectsrc->fetch_thirdparty();
2961 $projectid = (!empty($projectid) ? $projectid : $objectsrc->fk_project);
2962 $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client : (!empty($objectsrc->ref_customer) ? $objectsrc->ref_customer :
''));
2965 if (empty($socid)) {
2966 $soc = $objectsrc->thirdparty;
2969 $dateinvoice = (empty($dateinvoice) ? (empty($conf->global->MAIN_AUTOFILL_DATE) ?-1 :
'') : $dateinvoice);
2971 if ($element ==
'expedition') {
2972 $ref_client = (!empty($objectsrc->ref_customer) ? $objectsrc->ref_customer :
'');
2974 $elem = $subelem = $objectsrc->origin;
2975 $expeoriginid = $objectsrc->origin_id;
2977 $classname = ucfirst($subelem);
2979 $expesrc =
new $classname($db);
2980 $expesrc->fetch($expeoriginid);
2982 $cond_reglement_id = (!empty($expesrc->cond_reglement_id) ? $expesrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 1));
2983 $mode_reglement_id = (!empty($expesrc->mode_reglement_id) ? $expesrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
2984 $fk_account = (!empty($expesrc->fk_account) ? $expesrc->fk_account : (!empty($soc->fk_account) ? $soc->fk_account : 0));
2985 $remise_percent = (!empty($expesrc->remise_percent) ? $expesrc->remise_percent : (!empty($soc->remise_percent) ? $soc->remise_percent : 0));
2986 $remise_absolue = (!empty($expesrc->remise_absolue) ? $expesrc->remise_absolue : (!empty($soc->remise_absolue) ? $soc->remise_absolue : 0));
2989 $expesrc->fetch_optionals();
2990 $object->array_options = $expesrc->array_options;
2992 $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0));
2993 $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
2994 $fk_account = (!empty($objectsrc->fk_account) ? $objectsrc->fk_account : (!empty($soc->fk_account) ? $soc->fk_account : 0));
2995 $remise_percent = (!empty($objectsrc->remise_percent) ? $objectsrc->remise_percent : (!empty($soc->remise_percent) ? $soc->remise_percent : 0));
2996 $remise_absolue = (!empty($objectsrc->remise_absolue) ? $objectsrc->remise_absolue : (!empty($soc->remise_absolue) ? $soc->remise_absolue : 0));
2999 if (!empty($objectsrc->multicurrency_code)) {
3000 $currency_code = $objectsrc->multicurrency_code;
3002 if (!empty($conf->global->MULTICURRENCY_USE_ORIGIN_TX) && !empty($objectsrc->multicurrency_tx)) {
3003 $currency_tx = $objectsrc->multicurrency_tx;
3008 $objectsrc->fetch_optionals();
3009 $object->array_options = $objectsrc->array_options;
3013 $cond_reglement_id = $soc->cond_reglement_id;
3014 $mode_reglement_id = $soc->mode_reglement_id;
3015 $fk_account = $soc->fk_account;
3016 $remise_percent = $soc->remise_percent;
3017 $remise_absolue = 0;
3018 $dateinvoice = (empty($dateinvoice) ? (empty($conf->global->MAIN_AUTOFILL_DATE) ?-1 :
'') : $dateinvoice);
3020 if (
isModEnabled(
'multicurrency') && !empty($soc->multicurrency_code)) {
3021 $currency_code = $soc->multicurrency_code;
3026 if (empty($cond_reglement_id)) {
3027 $cond_reglement_id =
GETPOST(
"cond_reglement_id",
'int');
3031 if (empty($mode_reglement_id)) {
3032 $mode_reglement_id =
GETPOST(
"mode_reglement_id",
'int');
3038 if (!empty($soc->id)) {
3039 $absolute_discount = $soc->getAvailableDiscounts();
3041 $note_public = $object->getDefaultCreateValueFor(
'note_public', ((!empty($origin) && !empty($originid) && is_object($objectsrc) && !empty($conf->global->FACTURE_REUSE_NOTES_ON_CREATE_FROM)) ? $objectsrc->note_public : null));
3042 $note_private = $object->getDefaultCreateValueFor(
'note_private', ((!empty($origin) && !empty($originid) && is_object($objectsrc) && !empty($conf->global->FACTURE_REUSE_NOTES_ON_CREATE_FROM)) ? $objectsrc->note_private : null));
3044 if (!empty($conf->use_javascript_ajax)) {
3045 require_once DOL_DOCUMENT_ROOT.
'/core/lib/ajax.lib.php';
3051 if ($origin ==
'contrat') {
3052 $langs->load(
"admin");
3053 $text = $langs->trans(
"ToCreateARecurringInvoice");
3054 $text .=
' '.$langs->trans(
"ToCreateARecurringInvoiceGene", $langs->transnoentitiesnoconv(
"MenuFinancial"), $langs->transnoentitiesnoconv(
"BillsCustomers"), $langs->transnoentitiesnoconv(
"ListOfTemplates"));
3055 if (empty($conf->global->INVOICE_DISABLE_AUTOMATIC_RECURRING_INVOICE)) {
3056 $text .=
' '.$langs->trans(
"ToCreateARecurringInvoiceGeneAuto", $langs->transnoentitiesnoconv(
'Module2300Name'));
3058 print
info_admin($text, 0, 0, 0,
'opacitymedium').
'<br>';
3061 print
'<form name="add" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST" id="formtocreate" name="formtocreate">';
3062 print
'<input type="hidden" name="token" value="'.newToken().
'">';
3063 print
'<input type="hidden" name="action" value="add">';
3065 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">'.
"\n";
3067 print
'<input name="ref" type="hidden" value="provisoire">';
3068 print
'<input name="ref_client" type="hidden" value="'.$ref_client.
'">';
3069 print
'<input name="force_cond_reglement_id" type="hidden" value="0">';
3070 print
'<input name="force_mode_reglement_id" type="hidden" value="0">';
3071 print
'<input name="force_fk_account" type="hidden" value="0">';
3072 print
'<input type="hidden" name="origin" value="'.$origin.
'">';
3073 print
'<input type="hidden" name="originid" value="'.$originid.
'">';
3074 print
'<input type="hidden" name="originentity" value="'.GETPOST(
'originentity').
'">';
3075 if (!empty($currency_tx)) {
3076 print
'<input type="hidden" name="originmulticurrency_tx" value="'.$currency_tx.
'">';
3081 print
'<table class="border centpercent">';
3086 $exampletemplateinvoice =
new FactureRec($db);
3088 if (empty($origin) && empty($originid) &&
GETPOST(
'fac_rec',
'int') > 0) {
3089 $invoice_predefined->fetch(
GETPOST(
'fac_rec',
'int'));
3093 if ($soc->id > 0 && (!
GETPOST(
'fac_rec',
'int') || !empty($invoice_predefined->frequency))) {
3095 print
'<tr><td class="fieldrequired">'.$langs->trans(
'Customer').
'</td>';
3096 print
'<td colspan="2">';
3097 print $soc->getNomUrl(1,
'customer');
3098 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">';
3100 $arrayoutstandingbills = $soc->getOutstandingBills();
3101 $outstandingBills = $arrayoutstandingbills[
'opened'];
3102 print
' - <span class="opacitymedium">'.$langs->trans(
'CurrentOutstandingBill').
':</span> ';
3103 print
price($outstandingBills,
'', $langs, 0, 0, -1, $conf->currency);
3104 if ($soc->outstanding_limit !=
'') {
3105 if ($outstandingBills > $soc->outstanding_limit) {
3106 print
img_warning($langs->trans(
"OutstandingBillReached"));
3108 print
' / '.price($soc->outstanding_limit,
'', $langs, 0, 0, -1, $conf->currency);
3113 print
'<tr><td class="fieldrequired">'.$langs->trans(
'Customer').
'</td>';
3114 print
'<td colspan="2">';
3115 print
img_picto(
'',
'company').$form->select_company($soc->id,
'socid',
'((s.client = 1 OR s.client = 3) AND s.status = 1)',
'SelectThirdParty', 0, 0, null, 0,
'minwidth300 widthcentpercentminusxx maxwidth500');
3117 if (empty($conf->global->RELOAD_PAGE_ON_CUSTOMER_CHANGE_DISABLED)) {
3118 print
'<script type="text/javascript">
3119 $(document).ready(function() {
3120 $("#socid").change(function() {
3122 console.log("Submit page");
3123 $(\'input[name="action"]\').val(\'create\');
3124 $(\'input[name="force_cond_reglement_id"]\').val(\'1\');
3125 $(\'input[name="force_mode_reglement_id"]\').val(\'1\');
3126 $(\'input[name="force_fk_account"]\').val(\'1\');
3127 $("#formtocreate").submit(); */
3129 // For company change, we must reuse data of comany, not input already done, so we call a GET with action=create, not a POST submit.
3130 console.log("We have changed the company - Reload page");
3131 var socid = $(this).val();
3132 var fac_rec = $(\'#fac_rec\').val();
3133 window.location.href = "'.$_SERVER[
"PHP_SELF"].
'?action=create&socid="+socid+"&fac_rec="+fac_rec;
3138 if (!
GETPOST(
'fac_rec',
'int')) {
3139 print
' <a href="'.DOL_URL_ROOT.
'/societe/card.php?action=create&client=3&fournisseur=0&backtopage='.urlencode($_SERVER[
"PHP_SELF"].
'?action=create').
'"><span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans(
"AddThirdParty").
'"></span></a>';
3146 if (empty($origin) && empty($originid) &&
GETPOST(
'fac_rec',
'int') > 0) {
3147 $invoice_predefined->fetch(
GETPOST(
'fac_rec',
'int'));
3149 $dateinvoice = $invoice_predefined->date_when;
3150 if (empty($projectid)) {
3151 $projectid = $invoice_predefined->fk_project;
3153 $cond_reglement_id = $invoice_predefined->cond_reglement_id;
3154 $mode_reglement_id = $invoice_predefined->mode_reglement_id;
3155 $fk_account = $invoice_predefined->fk_account;
3156 $note_public = $invoice_predefined->note_public;
3157 $note_private = $invoice_predefined->note_private;
3159 if (!empty($invoice_predefined->multicurrency_code)) {
3160 $currency_code = $invoice_predefined->multicurrency_code;
3162 if (!empty($invoice_predefined->multicurrency_tx)) {
3163 $currency_tx = $invoice_predefined->multicurrency_tx;
3166 $sql =
'SELECT r.rowid, r.titre as title, r.total_ttc';
3167 $sql .=
' FROM '.MAIN_DB_PREFIX.
'facture_rec as r';
3168 $sql .=
' WHERE r.fk_soc = '.((int) $invoice_predefined->socid);
3170 $resql = $db->query($sql);
3172 $num = $db->num_rows(
$resql);
3176 print
'<tr><td>'.$langs->trans(
'CreateFromRepeatableInvoice').
'</td><td>';
3178 print
'<select class="flat" id="fac_rec" name="fac_rec">';
3179 print
'<option value="0" selected></option>';
3181 $objp = $db->fetch_object(
$resql);
3182 print
'<option value="'.$objp->rowid.
'"';
3183 if (
GETPOST(
'fac_rec',
'int') == $objp->rowid) {
3185 $exampletemplateinvoice->fetch(
GETPOST(
'fac_rec',
'int'));
3187 print
'>'.$objp->title.
' ('.
price($objp->total_ttc).
' '.$langs->trans(
"TTC").
')</option>';
3195 if (empty($conf->global->RELOAD_PAGE_ON_TEMPLATE_CHANGE_DISABLED)) {
3196 print
'<script type="text/javascript">
3197 $(document).ready(function() {
3198 $("#fac_rec").change(function() {
3199 console.log("We have changed the template invoice - Reload page");
3200 var fac_rec = $(this).val();
3201 var socid = $(\'#socid\').val();
3202 // For template invoice change, we must reuse data of template, not input already done, so we call a GET with action=create, not a POST submit.
3203 window.location.href = "'.$_SERVER[
"PHP_SELF"].
'?action=create&socid="+socid+"&fac_rec="+fac_rec;
3216 print
'<tr><td class="tdtop fieldrequired">'.$langs->trans(
'Type').
'</td><td colspan="2">';
3217 print
'<div class="tagtable">'.
"\n";
3220 print
'<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
3221 $tmp =
'<input type="radio" id="radio_standard" name="type" value="0"'.(GETPOST(
'type',
'int') ?
'' :
' checked').
'> ';
3222 $tmp = $tmp.
'<label for="radio_standard" >'.$langs->trans(
"InvoiceStandardAsk").
'</label>';
3223 $desc =
$form->textwithpicto($tmp, $langs->transnoentities(
"InvoiceStandardDesc"), 1,
'help',
'', 0, 3);
3224 print
'<table class="nobordernopadding"><tr>';
3228 if ((($origin ==
'propal') || ($origin ==
'commande')) && (!empty($originid))) {
3237 print
'<td class="nowrap" style="padding-left: 15px">';
3238 print
'<span class="opacitymedium">'.$langs->trans(
'PercentOfOriginalObject').
'</span>:<input class="right" placeholder="100%" type="text" id="valuestandardinvoice" name="valuestandardinvoice" size="3" value="'.(
GETPOSTISSET(
'valuestandardinvoice') ?
GETPOST(
'valuestandardinvoice',
'alpha') :
'100%').
'"/>';
3241 print
'</tr></table>';
3242 print
'</div></div>';
3244 if ((empty($origin)) || ((($origin ==
'propal') || ($origin ==
'commande')) && (!empty($originid)))) {
3246 if (empty($conf->global->INVOICE_DISABLE_DEPOSIT)) {
3247 print
'<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
3248 $tmp =
'<input type="radio" id="radio_deposit" name="type" value="3"'.(GETPOST(
'type') == 3 ?
' checked' :
'').
'> ';
3249 print
'<script type="text/javascript">
3250 jQuery(document).ready(function() {
3251 jQuery("#typestandardinvoice, #valuestandardinvoice").click(function() {
3252 jQuery("#radio_standard").prop("checked", true);
3254 jQuery("#typedeposit, #valuedeposit").click(function() {
3255 jQuery("#radio_deposit").prop("checked", true);
3257 jQuery("#typedeposit").change(function() {
3258 console.log("We change type of down payment");
3259 jQuery("#radio_deposit").prop("checked", true);
3260 setRadioForTypeOfIncoice();
3262 jQuery("#radio_standard, #radio_deposit, #radio_replacement, #radio_template").change(function() {
3263 setRadioForTypeOfIncoice();
3265 function setRadioForTypeOfIncoice() {
3266 console.log("Change radio");
3267 if (jQuery("#radio_deposit").prop("checked") && (jQuery("#typedeposit").val() == \'amount\' || jQuery("#typedeposit").val() == \'variable\')) {
3268 jQuery(".checkforselect").prop("disabled", true);
3269 jQuery(".checkforselect").prop("checked", false);
3271 jQuery(".checkforselect").prop("disabled", false);
3272 jQuery(".checkforselect").prop("checked", true);
3278 $tmp = $tmp.
'<label for="radio_deposit" >'.$langs->trans(
"InvoiceDeposit").
'</label>';
3279 $desc =
$form->textwithpicto($tmp, $langs->transnoentities(
"InvoiceDepositDesc"), 1,
'help',
'', 0, 3);
3280 print
'<table class="nobordernopadding"><tr>';
3284 if (($origin ==
'propal') || ($origin ==
'commande')) {
3285 print
'<td class="nowrap" style="padding-left: 15px">';
3287 'amount' => $langs->transnoentitiesnoconv(
'FixAmount', $langs->transnoentitiesnoconv(
'Deposit')),
3288 'variable' => $langs->transnoentitiesnoconv(
'VarAmountOneLine', $langs->transnoentitiesnoconv(
'Deposit')),
3289 'variablealllines' => $langs->transnoentitiesnoconv(
'VarAmountAllLines')
3291 $typedeposit =
GETPOST(
'typedeposit',
'aZ09');
3292 $valuedeposit =
GETPOST(
'valuedeposit',
'int');
3293 if (empty($typedeposit) && ! empty($objectsrc->deposit_percent)) {
3294 $origin_payment_conditions_deposit_percent =
getDictionaryValue(
'c_payment_term',
'deposit_percent', $objectsrc->cond_reglement_id);
3295 if (! empty($origin_payment_conditions_deposit_percent)) {
3296 $typedeposit =
'variable';
3299 if (empty($valuedeposit) && $typedeposit ==
'variable' && ! empty($objectsrc->deposit_percent)) {
3300 $valuedeposit = $objectsrc->deposit_percent;
3302 print
$form->selectarray(
'typedeposit', $arraylist, $typedeposit, 0, 0, 0,
'', 1);
3304 print
'<td class="nowrap" style="padding-left: 5px">';
3305 print
'<span class="opacitymedium paddingleft">'.$langs->trans(
"AmountOrPercent").
'</span><input type="text" id="valuedeposit" name="valuedeposit" class="width75 right" value="'.$valuedeposit.
'"/>';
3308 print
'</tr></table>';
3310 print
'</div></div>';
3315 if (!empty($conf->global->INVOICE_USE_SITUATION)) {
3317 print
'<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
3318 $tmp =
'<input id="radio_situation" type="radio" name="type" value="5"'.(GETPOST(
'type') == 5 ?
' checked' :
'').
'> ';
3319 $tmp = $tmp.
'<label for="radio_situation" >'.$langs->trans(
"InvoiceFirstSituationAsk").
'</label>';
3320 $desc =
$form->textwithpicto($tmp, $langs->transnoentities(
"InvoiceFirstSituationDesc"), 1,
'help',
'', 0, 3);
3322 print
'</div></div>';
3325 $opt =
$form->selectSituationInvoices(
GETPOST(
'originid',
'int'), $socid);
3327 print
'<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
3328 $tmp =
'<input type="radio" name="type" value="5"'.(GETPOST(
'type') == 5 &&
GETPOST(
'originid',
'int') ?
' checked' :
'');
3329 if ($opt == (
'<option value ="0" selected>'.$langs->trans(
'NoSituations').
'</option>') || (
GETPOST(
'origin') &&
GETPOST(
'origin') !=
'facture' &&
GETPOST(
'origin') !=
'commande')) {
3330 $tmp .=
' disabled';
3333 $text =
'<label>'.$tmp.$langs->trans(
"InvoiceSituationAsk").
'</label> ';
3334 $text .=
'<select class="flat" id="situations" name="situations"';
3335 if ($opt == (
'<option value ="0" selected>'.$langs->trans(
'NoSituations').
'</option>') || (
GETPOST(
'origin') &&
GETPOST(
'origin') !=
'facture' &&
GETPOST(
'origin') !=
'commande')) {
3336 $text .=
' disabled';
3340 $text .=
'</select>';
3341 $desc =
$form->textwithpicto($text, $langs->transnoentities(
"InvoiceSituationDesc"), 1,
'help',
'', 0, 3);
3343 print
'</div></div>';
3347 if (empty($conf->global->INVOICE_DISABLE_REPLACEMENT)) {
3349 $facids = $facturestatic->list_replacable_invoices($soc->id);
3355 if (is_array($facids)) {
3356 foreach ($facids as $facparam) {
3357 $options .=
'<option value="'.$facparam [
'id'].
'"';
3358 if ($facparam[
'id'] ==
GETPOST(
'fac_replacement',
'int')) {
3359 $options .=
' selected';
3361 $options .=
'>'.$facparam[
'ref'];
3362 $options .=
' ('.$facturestatic->LibStatut($facparam[
'paid'], $facparam[
'status'], 0, $facparam[
'alreadypaid']).
')';
3363 $options .=
'</option>';
3367 print
'<!-- replacement line -->';
3368 print
'<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
3369 $tmp =
'<input type="radio" name="type" id="radio_replacement" value="1"'.(GETPOST(
'type') == 1 ?
' checked' :
'');
3370 if (!$options || $invoice_predefined->id > 0) {
3371 $tmp .=
' disabled';
3374 print
'<script type="text/javascript">
3375 jQuery(document).ready(function() {
3376 jQuery("#fac_replacement").change(function() {
3377 jQuery("#radio_replacement").prop("checked", true);
3381 $text =
'<label>'.$tmp.$langs->trans(
"InvoiceReplacementAsk").
'</label>';
3382 $text .=
'<select class="flat" name="fac_replacement" id="fac_replacement"';
3383 if (!$options || $invoice_predefined->id > 0) {
3384 $text .=
' disabled';
3388 $text .=
'<option value="-1"> </option>';
3391 $text .=
'<option value="-1">'.$langs->trans(
"NoReplacableInvoice").
'</option>';
3393 $text .=
'</select>';
3394 $desc =
$form->textwithpicto($text, $langs->transnoentities(
"InvoiceReplacementDesc"), 1,
'help',
'', 0, 3);
3396 print
'</div></div>';
3399 if (!empty($conf->global->INVOICE_USE_SITUATION)) {
3400 print
'<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
3401 $tmp =
'<input type="radio" name="type" id="radio_situation" value="0" disabled> ';
3402 $text =
'<label>'.$tmp.$langs->trans(
"InvoiceFirstSituationAsk").
'</label> ';
3403 $text .=
'<span class="opacitymedium">('.$langs->trans(
"YouMustCreateInvoiceFromThird").
')</span> ';
3404 $desc =
$form->textwithpicto($text, $langs->transnoentities(
"InvoiceFirstSituationDesc"), 1,
'help',
'', 0, 3);
3406 print
'</div></div>';
3408 print
'<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
3409 $tmp =
'<input type="radio" name="type" id="radio_situation" value="0" disabled> ';
3410 $text =
'<label>'.$tmp.$langs->trans(
"InvoiceSituationAsk").
'</label> ';
3411 $text .=
'<span class="opacitymedium">('.$langs->trans(
"YouMustCreateInvoiceFromThird").
')</span> ';
3412 $desc =
$form->textwithpicto($text, $langs->transnoentities(
"InvoiceFirstSituationDesc"), 1,
'help',
'', 0, 3);
3414 print
'</div></div>';
3417 print
'<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
3418 $tmp =
'<input type="radio" name="type" id="radio_replacement" value="0" disabled> ';
3419 $text =
'<label>'.$tmp.$langs->trans(
"InvoiceReplacement").
'</label> ';
3420 $text .=
'<span class="opacitymedium">('.$langs->trans(
"YouMustCreateInvoiceFromThird").
')</span> ';
3421 $desc =
$form->textwithpicto($text, $langs->transnoentities(
"InvoiceReplacementDesc"), 1,
'help',
'', 0, 3);
3423 print
'</div></div>';
3426 if (empty($origin)) {
3429 if (empty($conf->global->INVOICE_DISABLE_CREDIT_NOTE)) {
3431 $facids = $facturestatic->list_qualified_avoir_invoices($soc->id);
3437 $newinvoice_static =
new Facture($db);
3438 foreach ($facids as $key => $valarray) {
3439 $newinvoice_static->id = $key;
3440 $newinvoice_static->ref = $valarray [
'ref'];
3441 $newinvoice_static->statut = $valarray [
'status'];
3442 $newinvoice_static->type = $valarray [
'type'];
3443 $newinvoice_static->paye = $valarray [
'paye'];
3445 $optionsav .=
'<option value="'.$key.
'"';
3446 if ($key ==
GETPOST(
'fac_avoir')) {
3447 $optionsav .=
' selected';
3450 $newinvoice_static->fetch_optionals($key);
3451 $object->array_options = $newinvoice_static->array_options;
3454 $optionsav .= $newinvoice_static->ref;
3455 $optionsav .=
' ('.$newinvoice_static->getLibStatut(1, $valarray [
'paymentornot']).
')';
3456 $optionsav .=
'</option>';
3459 print
'<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
3460 $tmp =
'<input type="radio" id="radio_creditnote" name="type" value="2"'.(GETPOST(
'type') == 2 ?
' checked' :
'');
3461 if ((!$optionsav && empty($conf->global->INVOICE_CREDIT_NOTE_STANDALONE)) || $invoice_predefined->id > 0) {
3462 $tmp .=
' disabled';
3466 print
'<script type="text/javascript">
3467 jQuery(document).ready(function() {
3468 if (! jQuery("#radio_creditnote").is(":checked"))
3470 jQuery("#credit_note_options").hide();
3472 jQuery("#radio_creditnote").click(function() {
3473 jQuery("#credit_note_options").show();
3475 jQuery("#radio_standard, #radio_replacement, #radio_deposit").click(function() {
3476 jQuery("#credit_note_options").hide();
3480 $text =
'<label>'.$tmp.$langs->transnoentities(
"InvoiceAvoirAsk").
'</label> ';
3482 $text .=
'<select class="flat valignmiddle" name="fac_avoir" id="fac_avoir"';
3483 if (!$optionsav || $invoice_predefined->id > 0) {
3484 $text .=
' disabled';
3488 $text .=
'<option value="-1"></option>';
3489 $text .= $optionsav;
3491 $text .=
'<option value="-1">'.$langs->trans(
"NoInvoiceToCorrect").
'</option>';
3493 $text .=
'</select>';
3494 $desc =
$form->textwithpicto($text, $langs->transnoentities(
"InvoiceAvoirDesc"), 1,
'help',
'', 0, 3);
3497 print
'<div id="credit_note_options" class="clearboth">';
3498 print
' <input type="checkbox" name="invoiceAvoirWithLines" id="invoiceAvoirWithLines" value="1" onclick="$(\'#credit_note_options input[type=checkbox]\').not(this).prop(\'checked\', false);" '.(GETPOST(
'invoiceAvoirWithLines',
'int') > 0 ?
'checked' :
'').
' /> <label for="invoiceAvoirWithLines">'.$langs->trans(
'invoiceAvoirWithLines').
"</label>";
3499 print
'<br> <input type="checkbox" name="invoiceAvoirWithPaymentRestAmount" id="invoiceAvoirWithPaymentRestAmount" value="1" onclick="$(\'#credit_note_options input[type=checkbox]\').not(this).prop(\'checked\', false);" '.(GETPOST(
'invoiceAvoirWithPaymentRestAmount',
'int') > 0 ?
'checked' :
'').
' /> <label for="invoiceAvoirWithPaymentRestAmount">'.$langs->trans(
'invoiceAvoirWithPaymentRestAmount').
"</label>";
3502 print
'</div></div>';
3505 print
'<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
3506 if (empty($conf->global->INVOICE_CREDIT_NOTE_STANDALONE)) {
3507 $tmp =
'<input type="radio" name="type" id="radio_creditnote" value="0" disabled> ';
3509 $tmp =
'<input type="radio" name="type" id="radio_creditnote" value="2" > ';
3511 $text =
'<label>'.$tmp.$langs->trans(
"InvoiceAvoir").
'</label> ';
3512 $text .=
'<span class="opacitymedium">('.$langs->trans(
"YouMustCreateInvoiceFromThird").
')</span> ';
3513 $desc =
$form->textwithpicto($text, $langs->transnoentities(
"InvoiceAvoirDesc"), 1,
'help',
'', 0, 3);
3515 print
'</div></div>'.
"\n";
3520 print
'<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
3521 $tmp =
'<input type="radio" name="type" id="radio_template" value="0" disabled> ';
3522 $text =
'<label>'.$tmp.$langs->trans(
"RepeatableInvoice").
'</label> ';
3524 $desc =
$form->textwithpicto($text, $langs->transnoentities(
"YouMustCreateStandardInvoiceFirstDesc"), 1,
'help',
'', 0, 3);
3526 print
'</div></div>';
3531 if (!empty($conf->global->INVOICE_USE_DEFAULT_DOCUMENT)) {
3535 foreach ($listtType as $type) {
3536 $thisTypeConfName =
'FACTURE_ADDON_PDF_'.$type;
3537 $curent = !empty($conf->global->{$thisTypeConfName}) ? $conf->global->{$thisTypeConfName}:$conf->global->FACTURE_ADDON_PDF;
3538 $jsListType .= (!empty($jsListType) ?
',' :
'').
'"'.$type.
'":"'.$curent.
'"';
3541 print
'<script type="text/javascript">
3542 $(document).ready(function() {
3543 var listType = {'.$jsListType.
'};
3544 $("[name=\'type\'").change(function() {
3545 if($( this ).prop("checked"))
3547 if(($( this ).val() in listType))
3549 $("#model").val(listType[$( this ).val()]);
3553 $("#model").val("'.$conf->global->FACTURE_ADDON_PDF.
'");
3566 print
'<tr><td>'.$langs->trans(
'DiscountStillRemaining').
'</td><td colspan="2">';
3570 $backtopage = urlencode($_SERVER[
"PHP_SELF"].
'?socid='.$thirdparty->id.
'&action='.$action.
'&origin='.
GETPOST(
'origin',
'alpha').
'&originid='.
GETPOST(
'originid',
'int'));
3571 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
3577 $date_pointoftax =
dol_mktime(0, 0, 0,
GETPOST(
'date_pointoftaxmonth',
'int'),
GETPOST(
'date_pointoftaxday',
'int'),
GETPOST(
'date_pointoftaxyear',
'int'),
'tzserver');
3580 print
'<tr><td class="fieldrequired">'.$langs->trans(
'DateInvoice').
'</td><td colspan="2">';
3581 print
$form->selectDate($newdateinvoice ? $newdateinvoice : $dateinvoice,
'',
'',
'',
'',
"add", 1, 1);
3585 if (!empty($conf->global->INVOICE_POINTOFTAX_DATE)) {
3586 print
'<tr><td class="fieldrequired">'.$langs->trans(
'DatePointOfTax').
'</td><td colspan="2">';
3587 print
$form->selectDate($date_pointoftax ? $date_pointoftax : -1,
'date_pointoftax',
'',
'',
'',
"add", 1, 1);
3592 print
'<tr><td class="nowrap fieldrequired">'.$langs->trans(
'PaymentConditionsShort').
'</td><td colspan="2">';
3593 $form->select_conditions_paiements(
GETPOSTISSET(
'cond_reglement_id') ?
GETPOST(
'cond_reglement_id',
'int') : $cond_reglement_id,
'cond_reglement_id');
3597 if (!empty($conf->global->INVOICE_USE_RETAINED_WARRANTY)) {
3598 $rwStyle =
'display:none;';
3599 if (in_array(
GETPOST(
'type',
'int'), $retainedWarrantyInvoiceAvailableType)) {
3603 $retained_warranty =
GETPOST(
'retained_warranty',
'int');
3604 if (empty($retained_warranty)) {
3605 if (!empty($objectsrc->retained_warranty)) {
3606 $retained_warranty = $objectsrc->retained_warranty;
3609 $retained_warranty_js_default = !empty($retained_warranty) ? $retained_warranty : $conf->global->INVOICE_SITUATION_DEFAULT_RETAINED_WARRANTY_PERCENT;
3611 print
'<tr class="retained-warranty-line" style="'.$rwStyle.
'" ><td class="nowrap">'.$langs->trans(
'RetainedWarranty').
'</td><td colspan="2">';
3612 print
'<input id="new-situation-invoice-retained-warranty" name="retained_warranty" type="number" value="'.$retained_warranty.
'" step="0.01" min="0" max="100" />%';
3615 print
'<tr class="retained-warranty-line" style="'.$rwStyle.
'" ><td class="nowrap">'.$langs->trans(
'PaymentConditionsShortRetainedWarranty').
'</td><td colspan="2">';
3616 $retained_warranty_fk_cond_reglement =
GETPOST(
'retained_warranty_fk_cond_reglement',
'int');
3617 if (empty($retained_warranty_fk_cond_reglement)) {
3618 $retained_warranty_fk_cond_reglement = $conf->global->INVOICE_SITUATION_DEFAULT_RETAINED_WARRANTY_COND_ID;
3619 if (!empty($objectsrc->retained_warranty_fk_cond_reglement)) {
3620 $retained_warranty_fk_cond_reglement = $objectsrc->retained_warranty_fk_cond_reglement;
3622 $retained_warranty_fk_cond_reglement = $conf->global->INVOICE_SITUATION_DEFAULT_RETAINED_WARRANTY_COND_ID;
3625 $form->select_conditions_paiements($retained_warranty_fk_cond_reglement,
'retained_warranty_fk_cond_reglement', -1, 1);
3628 print
'<script type="text/javascript">
3629 $(document).ready(function() {
3630 $("[name=\'type\']").change(function() {
3631 if($( this ).prop("checked") && $.inArray($( this ).val(), '.json_encode($retainedWarrantyInvoiceAvailableType).
' ) !== -1)
3633 $(".retained-warranty-line").show();
3634 $("#new-situation-invoice-retained-warranty").val("'.floatval($retained_warranty_js_default).
'");
3637 $(".retained-warranty-line").hide();
3638 $("#new-situation-invoice-retained-warranty").val("");
3642 $("[name=\'type\']:checked").trigger("change");
3648 print
'<tr><td>'.$langs->trans(
'PaymentMode').
'</td><td colspan="2">';
3649 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
3650 print
$form->select_types_paiements(
GETPOSTISSET(
'mode_reglement_id') ?
GETPOST(
'mode_reglement_id') : $mode_reglement_id,
'mode_reglement_id',
'CRDT', 0, 1, 0, 0, 1,
'maxwidth200 widthcentpercentminusx', 1);
3655 print
'<tr><td>'.$langs->trans(
'BankAccount').
'</td><td colspan="2">';
3656 print
img_picto(
'',
'bank_account',
'class="pictofixedwidth"');
3657 print
$form->select_comptes(($fk_account < 0 ?
'' : $fk_account),
'fk_account', 0,
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx', 1);
3663 $langs->load(
'projects');
3664 print
'<tr><td>'.$langs->trans(
'Project').
'</td><td colspan="2">';
3665 print
img_picto(
'',
'project').$formproject->select_projects(($socid > 0 ? $socid : -1), $projectid,
'projectid', 0, 0, 1, 1, 0, 0, 0,
'', 1, 0,
'maxwidth500 widthcentpercentminusxx');
3666 print
' <a href="'.DOL_URL_ROOT.
'/projet/card.php?socid='.$soc->id.
'&action=create&status=1&backtopage='.urlencode($_SERVER[
"PHP_SELF"].
'?action=create&socid='.$soc->id.($fac_rec ?
'&fac_rec='.$fac_rec :
'')).
'"><span class="fa fa-plus-circle valignmiddle" title="'.$langs->trans(
"AddProject").
'"></span></a>';
3673 print
'<td><label for="incoterm_id">'.$form->textwithpicto($langs->trans(
"IncotermLabel"), !empty($objectsrc->label_incoterms) ? $objectsrc->label_incoterms :
'', 1).
'</label></td>';
3674 print
'<td colspan="2" class="maxwidthonsmartphone">';
3675 $incoterm_id =
GETPOST(
'incoterm_id');
3676 $incoterm_location =
GETPOST(
'location_incoterms');
3677 if (empty($incoterm_id)) {
3678 $incoterm_id = (!empty($objectsrc->fk_incoterms) ? $objectsrc->fk_incoterms : $soc->fk_incoterms);
3679 $incoterm_location = (!empty($objectsrc->location_incoterms) ? $objectsrc->location_incoterms : $soc->location_incoterms);
3681 print
$form->select_incoterms($incoterm_id, $incoterm_location);
3686 $parameters = array(
'objectsrc' => !empty($objectsrc) ? $objectsrc : 0,
'colspan' =>
' colspan="2"',
'cols' =>
'2',
'socid'=>$socid);
3687 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $object, $action);
3688 print $hookmanager->resPrint;
3689 if (empty($reshook)) {
3690 if (!empty($conf->global->THIRDPARTY_PROPAGATE_EXTRAFIELDS_TO_INVOICE) && !empty($soc->id)) {
3692 $tpExtrafields =
new Extrafields($db);
3693 $tpExtrafieldLabels = $tpExtrafields->fetch_name_optionals_label($soc->table_element);
3694 if ($soc->fetch_optionals() > 0) {
3695 $object->array_options = array_merge($object->array_options, $soc->array_options);
3699 print $object->showOptionals($extrafields,
'create', $parameters);
3703 print
'<tr><td>'.$langs->trans(
'Model').
'</td>';
3704 print
'<td colspan="2">';
3705 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
3706 include_once DOL_DOCUMENT_ROOT.
'/core/modules/facture/modules_facture.php';
3708 if (!empty($conf->global->INVOICE_USE_DEFAULT_DOCUMENT)) {
3710 $paramkey =
'FACTURE_ADDON_PDF_'.$object->type;
3711 $preselected = !empty($conf->global->$paramkey) ? $conf->global->$paramkey : $conf->global->FACTURE_ADDON_PDF;
3713 $preselected = $conf->global->FACTURE_ADDON_PDF;
3715 print
$form->selectarray(
'model', $liste, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
3721 print
'<td>'.$form->editfieldkey(
'Currency',
'multicurrency_code',
'', $object, 0).
'</td>';
3722 print
'<td colspan="2" class="maxwidthonsmartphone">';
3723 print
img_picto(
'',
'currency',
'class="pictofixedwidth"');
3724 print
$form->selectMultiCurrency($currency_code,
'multicurrency_code');
3730 if (
GETPOST(
'fac_rec',
'int') > 0) {
3731 $dateexample = ($newdateinvoice ? $newdateinvoice : $dateinvoice);
3732 if (empty($dateexample)) {
3735 $substitutionarray = array(
3736 '__TOTAL_HT__' => $langs->trans(
"AmountHT").
' ('.$langs->trans(
"Example").
': '.
price($exampletemplateinvoice->total_ht).
')',
3737 '__TOTAL_TTC__' => $langs->trans(
"AmountTTC").
' ('.$langs->trans(
"Example").
': '.
price($exampletemplateinvoice->total_ttc).
')',
3738 '__INVOICE_PREVIOUS_MONTH__' => $langs->trans(
"PreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'm'),
'%m').
')',
3739 '__INVOICE_MONTH__' => $langs->trans(
"MonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($dateexample,
'%m').
')',
3740 '__INVOICE_NEXT_MONTH__' => $langs->trans(
"NextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'm'),
'%m').
')',
3741 '__INVOICE_PREVIOUS_MONTH_TEXT__' => $langs->trans(
"TextPreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'm'),
'%B').
')',
3742 '__INVOICE_MONTH_TEXT__' => $langs->trans(
"TextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($dateexample,
'%B').
')',
3743 '__INVOICE_NEXT_MONTH_TEXT__' => $langs->trans(
"TextNextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'm'),
'%B').
')',
3744 '__INVOICE_PREVIOUS_YEAR__' => $langs->trans(
"PreviousYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'y'),
'%Y').
')',
3745 '__INVOICE_YEAR__' => $langs->trans(
"YearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($dateexample,
'%Y').
')',
3746 '__INVOICE_NEXT_YEAR__' => $langs->trans(
"NextYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'y'),
'%Y').
')'
3749 $htmltext =
'<i>'.$langs->trans(
"FollowingConstantsWillBeSubstituted").
':<br>';
3750 foreach ($substitutionarray as $key => $val) {
3751 $htmltext .= $key.
' = '.$langs->trans($val).
'<br>';
3753 $htmltext .=
'</i>';
3758 print
'<td class="tdtop">';
3759 print
$form->textwithpicto($langs->trans(
'NotePublic'), $htmltext);
3761 print
'<td valign="top" colspan="2">';
3762 $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%');
3763 print $doleditor->Create(1);
3766 if (empty($user->socid)) {
3768 print
'<td class="tdtop">';
3769 print
$form->textwithpicto($langs->trans(
'NotePrivate'), $htmltext);
3771 print
'<td valign="top" colspan="2">';
3772 $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%');
3773 print $doleditor->Create(1);
3779 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
3780 $langs->loadLangs(array(
'orders',
'propal'));
3783 if ($origin ==
'contrat') {
3785 $objectsrc->remise_absolue = $remise_absolue;
3786 $objectsrc->remise_percent = $remise_percent;
3787 $objectsrc->update_price(1, - 1, 1);
3790 print
"\n<!-- Show ref of origin ".$classname.
" -->\n";
3791 print
'<input type="hidden" name="amount" value="'.$objectsrc->total_ht.
'">'.
"\n";
3792 print
'<input type="hidden" name="total" value="'.$objectsrc->total_ttc.
'">'.
"\n";
3793 print
'<input type="hidden" name="tva" value="'.$objectsrc->total_tva.
'">'.
"\n";
3798 switch (get_class($objectsrc)) {
3800 $newclassname =
'CommercialProposal';
3803 $newclassname =
'Order';
3806 $newclassname =
'Sending';
3809 $newclassname =
'Contract';
3812 $newclassname =
'Intervention';
3815 $newclassname = get_class($objectsrc);
3819 print
'<tr><td>'.$langs->trans($newclassname).
'</td>';
3820 print
'<td colspan="2">';
3821 print $objectsrc->getNomUrl(1);
3823 $objectsrc->fetchObjectLinked($originid, $origin,
'',
'facture');
3824 if (is_array($objectsrc->linkedObjects[
'facture']) && count($objectsrc->linkedObjects[
'facture']) >= 1) {
3826 echo
' - '.$langs->trans(
'LatestRelatedBill').
' '.end($objectsrc->linkedObjects[
'facture'])->getNomUrl(1);
3829 print
'<tr><td>'.$langs->trans(
'AmountHT').
'</td><td colspan="2">'.
price($objectsrc->total_ht).
'</td></tr>';
3830 print
'<tr><td>'.$langs->trans(
'AmountVAT').
'</td><td colspan="2">'.
price($objectsrc->total_tva).
"</td></tr>";
3831 if ($mysoc->localtax1_assuj ==
"1" || $objectsrc->total_localtax1 != 0) {
3832 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td><td colspan="2">'.
price($objectsrc->total_localtax1).
"</td></tr>";
3835 if ($mysoc->localtax2_assuj ==
"1" || $objectsrc->total_localtax2 != 0) {
3836 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td><td colspan="2">'.
price($objectsrc->total_localtax2).
"</td></tr>";
3838 print
'<tr><td>'.$langs->trans(
'AmountTTC').
'</td><td colspan="2">'.
price($objectsrc->total_ttc).
"</td></tr>";
3841 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountHT').
'</td><td colspan="2">'.
price($objectsrc->multicurrency_total_ht).
'</td></tr>';
3842 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountVAT').
'</td><td colspan="2">'.
price($objectsrc->multicurrency_total_tva).
"</td></tr>";
3843 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountTTC').
'</td><td colspan="2">'.
price($objectsrc->multicurrency_total_ttc).
"</td></tr>";
3851 print
$form->buttonsSaveCancel(
"CreateDraft");
3854 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
3857 $title = $langs->trans(
'ProductsAndServices');
3860 print
'<div class="div-table-responsive-no-min">';
3861 print
'<table class="noborder centpercent">';
3863 $objectsrc->printOriginLinesList(
'', $selectedLines);
3870 } elseif ($id > 0 || !empty($ref)) {
3871 if (empty($object->id)) {
3872 $langs->load(
'errors');
3873 echo
'<div class="error">'.$langs->trans(
"ErrorRecordNotFound").
'</div>';
3882 $result = $object->fetch($id, $ref);
3889 $extrafields->fetch_name_optionals_label($object->table_element);
3891 if ($user->socid > 0 && $user->socid != $object->socid) {
3895 $result = $object->fetch_thirdparty();
3897 $result = $soc->fetch($object->socid);
3901 $selleruserevenustamp = $mysoc->useRevenueStamp();
3903 $totalpaid = $object->getSommePaiement();
3904 $totalcreditnotes = $object->getSumCreditNotesUsed();
3905 $totaldeposits = $object->getSumDepositsUsed();
3913 $resteapayer =
price2num($object->total_ttc - $totalpaid - $totalcreditnotes - $totaldeposits,
'MT');
3917 $multicurrency_totalpaid = $object->getSommePaiement(1);
3918 $multicurrency_totalcreditnotes = $object->getSumCreditNotesUsed(1);
3919 $multicurrency_totaldeposits = $object->getSumDepositsUsed(1);
3920 $multicurrency_resteapayer =
price2num($object->multicurrency_total_ttc - $multicurrency_totalpaid - $multicurrency_totalcreditnotes - $multicurrency_totaldeposits,
'MT');
3924 if ($resteapayer == 0 && $multicurrency_resteapayer != 0 && $object->multicurrency_code != $conf->currency) {
3925 $resteapayer =
price2num($multicurrency_resteapayer / $object->multicurrency_tx,
'MT');
3929 if ($object->paye) {
3932 $resteapayeraffiche = $resteapayer;
3934 if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
3935 $filterabsolutediscount =
"fk_facture_source IS NULL";
3936 $filtercreditnote =
"fk_facture_source IS NOT NULL";
3938 $filterabsolutediscount =
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
3939 $filtercreditnote =
"fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
3942 $absolute_discount = $soc->getAvailableDiscounts(
'', $filterabsolutediscount);
3943 $absolute_creditnote = $soc->getAvailableDiscounts(
'', $filtercreditnote);
3944 $absolute_discount =
price2num($absolute_discount,
'MT');
3945 $absolute_creditnote =
price2num($absolute_creditnote,
'MT');
3947 $author =
new User($db);
3948 if ($object->user_author) {
3949 $author->fetch($object->user_author);
3952 $objectidnext = $object->getIdReplacingInvoice();
3956 print
dol_get_fiche_head($head,
'compta', $langs->trans(
'InvoiceCustomer'), -1,
'bill');
3961 if ($action ==
'converttoreduc') {
3963 $type_fac =
'ExcessReceived';
3965 $type_fac =
'CreditNote';
3967 $type_fac =
'Deposit';
3969 $text = $langs->trans(
'ConfirmConvertToReduc', strtolower($langs->transnoentities($type_fac)));
3970 $text .=
'<br>'.$langs->trans(
'ConfirmConvertToReduc2');
3971 $formconfirm =
$form->formconfirm($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $langs->trans(
'ConvertToReduc'), $text,
'confirm_converttoreduc',
'',
"yes", 2);
3975 if ($action ==
'delete') {
3976 $text = $langs->trans(
'ConfirmDeleteBill', $object->ref);
3977 $formquestion = array();
3979 if ($object->type !=
Facture::TYPE_DEPOSIT && !empty($conf->global->STOCK_CALCULATE_ON_BILL) && $object->statut >= 1) {
3980 $qualified_for_stock_change = 0;
3981 if (empty($conf->global->STOCK_SUPPORTS_SERVICES)) {
3982 $qualified_for_stock_change = $object->hasProductsOrServices(2);
3984 $qualified_for_stock_change = $object->hasProductsOrServices(1);
3987 if ($qualified_for_stock_change) {
3988 $langs->load(
"stocks");
3989 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
3991 $label = $object->type ==
Facture::TYPE_CREDIT_NOTE ? $langs->trans(
"SelectWarehouseForStockDecrease") : $langs->trans(
"SelectWarehouseForStockIncrease");
3993 if ($conf->browser->name ==
'ie') {
3996 $formquestion = array(
4000 array(
'type' =>
'other',
'name' =>
'idwarehouse',
'label' => $label,
'value' => $formproduct->selectWarehouses(
GETPOST(
'idwarehouse') ?
GETPOST(
'idwarehouse') :
'ifone',
'idwarehouse',
'', 1, 0, 0, $langs->trans(
"NoStockAction"), 0, $forcecombo))
4002 $formconfirm =
$form->formconfirm($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $langs->trans(
'DeleteBill'), $text,
'confirm_delete', $formquestion,
"yes", 1);
4004 $formconfirm =
$form->formconfirm($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $langs->trans(
'DeleteBill'), $text,
'confirm_delete',
'',
'no', 1);
4007 $formconfirm =
$form->formconfirm($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $langs->trans(
'DeleteBill'), $text,
'confirm_delete',
'',
'no', 1);
4012 if ($action ==
'situationout') {
4013 $text = $langs->trans(
'ConfirmRemoveSituationFromCycle', $object->ref);
4014 $label = $langs->trans(
"ConfirmOuting");
4015 $formquestion = array();
4020 && $object->is_last_in_cycle()
4021 && $usercanunvalidate
4023 $formconfirm =
$form->formconfirm($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $label, $text,
'confirm_situationout', $formquestion,
"yes", 1);
4028 if ($action ==
'valid') {
4030 $objectref = substr($object->ref, 1, 4);
4031 if ($objectref ==
'PROV') {
4032 $savdate = $object->date;
4033 if (!empty($conf->global->FAC_FORCE_DATE_VALIDATION)) {
4035 $object->date_lim_reglement = $object->calculate_date_lim_reglement();
4037 $numref = $object->getNextNumRef($soc);
4040 $numref = $object->ref;
4043 $text = $langs->trans(
'ConfirmValidateBill', $numref);
4044 if (!empty($conf->notification->enabled)) {
4045 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
4046 $notify =
new Notify($db);
4048 $text .= $notify->confirmMessage(
'BILL_VALIDATE', $object->socid, $object);
4050 $formquestion = array();
4053 $qualified_for_stock_change = 0;
4054 if (empty($conf->global->STOCK_SUPPORTS_SERVICES)) {
4055 $qualified_for_stock_change = $object->hasProductsOrServices(2);
4057 $qualified_for_stock_change = $object->hasProductsOrServices(1);
4060 if ($qualified_for_stock_change) {
4061 $langs->load(
"stocks");
4062 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
4063 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/entrepot.class.php';
4066 $warehouse_array = $warehouse->list_array();
4067 if (count($warehouse_array) == 1) {
4068 $label = $object->type ==
Facture::TYPE_CREDIT_NOTE ? $langs->trans(
"WarehouseForStockIncrease", current($warehouse_array)) : $langs->trans(
"WarehouseForStockDecrease", current($warehouse_array));
4069 $value =
'<input type="hidden" id="idwarehouse" name="idwarehouse" value="'.key($warehouse_array).
'">';
4071 $label = $object->type ==
Facture::TYPE_CREDIT_NOTE ? $langs->trans(
"SelectWarehouseForStockIncrease") : $langs->trans(
"SelectWarehouseForStockDecrease");
4072 $value = $formproduct->selectWarehouses(
GETPOST(
'idwarehouse') ?
GETPOST(
'idwarehouse') :
'ifone',
'idwarehouse',
'', 1);
4074 $formquestion = array(
4080 array(
'type' =>
'other',
'name' =>
'idwarehouse',
'label' => $label,
'value' => $value));
4084 $text .=
'<br>'.img_warning().
' '.$langs->trans(
"ErrorInvoiceOfThisTypeMustBePositive");
4089 foreach ($object->lines as $line) {
4090 $res = $line->fetch_product();
4092 if ($line->product->isService() && $line->product->isMandatoryPeriod() && (empty($line->date_start) || empty($line->date_end) )) {
4098 if ($nbMandated > 0 ) $text .=
'<div><span class="clearboth nowraponall warning">'.$langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate").
'</span></div>';
4101 $formconfirm =
$form->formconfirm($_SERVER[
"PHP_SELF"].
'?facid='.$object->id, $langs->trans(
'ValidateBill'), $text,
'confirm_valid', $formquestion, (($object->type !=
Facture::TYPE_CREDIT_NOTE && $object->total_ttc < 0) ?
"no" :
"yes"), 2);
4105 if ($action ==
'modif') {
4106 $text = $langs->trans(
'ConfirmUnvalidateBill', $object->ref);
4107 $formquestion = array();
4110 $qualified_for_stock_change = 0;
4111 if (empty($conf->global->STOCK_SUPPORTS_SERVICES)) {
4112 $qualified_for_stock_change = $object->hasProductsOrServices(2);
4114 $qualified_for_stock_change = $object->hasProductsOrServices(1);
4117 if ($qualified_for_stock_change) {
4118 $langs->load(
"stocks");
4119 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
4120 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/entrepot.class.php';
4123 $warehouse_array = $warehouse->list_array();
4124 if (count($warehouse_array) == 1) {
4125 $label = $object->type ==
Facture::TYPE_CREDIT_NOTE ? $langs->trans(
"WarehouseForStockDecrease", current($warehouse_array)) : $langs->trans(
"WarehouseForStockIncrease", current($warehouse_array));
4126 $value =
'<input type="hidden" id="idwarehouse" name="idwarehouse" value="'.key($warehouse_array).
'">';
4128 $label = $object->type ==
Facture::TYPE_CREDIT_NOTE ? $langs->trans(
"SelectWarehouseForStockDecrease") : $langs->trans(
"SelectWarehouseForStockIncrease");
4129 $value = $formproduct->selectWarehouses(
GETPOST(
'idwarehouse') ?
GETPOST(
'idwarehouse') :
'ifone',
'idwarehouse',
'', 1);
4131 $formquestion = array(
4137 array(
'type' =>
'other',
'name' =>
'idwarehouse',
'label' => $label,
'value' => $value));
4141 $formconfirm =
$form->formconfirm($_SERVER[
"PHP_SELF"].
'?facid='.$object->id, $langs->trans(
'UnvalidateBill'), $text,
'confirm_modif', $formquestion,
"yes", 1);
4145 if ($action ==
'paid' && ($resteapayer <= 0 || (!empty($conf->global->INVOICE_CAN_SET_PAID_EVEN_IF_PARTIALLY_PAID) && $resteapayer == $object->total_ttc))) {
4146 $formconfirm =
$form->formconfirm($_SERVER[
"PHP_SELF"].
'?facid='.$object->id, $langs->trans(
'ClassifyPaid'), $langs->trans(
'ConfirmClassifyPaidBill', $object->ref),
'confirm_paid',
'',
"yes", 1);
4148 if ($action ==
'paid' && $resteapayer > 0 && (empty($conf->global->INVOICE_CAN_SET_PAID_EVEN_IF_PARTIALLY_PAID) || $resteapayer != $object->total_ttc)) {
4152 $close[$i][
'code'] =
'discount_vat';
4154 $close[$i][
'code'] =
'badcustomer';
4156 $close[$i][
'code'] =
'bankcharge';
4158 $close[$i][
'code'] =
'other';
4162 $close[$i][
'label'] = $langs->trans(
"HelpEscompte").
'<br><br>'.$langs->trans(
"ConfirmClassifyPaidPartiallyReasonDiscountVatDesc");
4164 $close[$i][
'label'] = $langs->trans(
"ConfirmClassifyPaidPartiallyReasonBadCustomerDesc");
4166 $close[$i][
'label'] = $langs->trans(
"ConfirmClassifyPaidPartiallyReasonBankChargeDesc");
4168 $close[$i][
'label'] = $langs->trans(
"Other");
4172 $close[$i][
'reason'] =
$form->textwithpicto($langs->transnoentities(
"ConfirmClassifyPaidPartiallyReasonDiscount", $resteapayer, $langs->trans(
"Currency".$conf->currency)), $close[$i][
'label'], 1);
4174 $close[$i][
'reason'] =
$form->textwithpicto($langs->transnoentities(
"ConfirmClassifyPaidPartiallyReasonBadCustomer", $resteapayer, $langs->trans(
"Currency".$conf->currency)), $close[$i][
'label'], 1);
4176 $close[$i][
'reason'] =
$form->textwithpicto($langs->transnoentities(
"ConfirmClassifyPaidPartiallyReasonBankCharge", $resteapayer, $langs->trans(
"Currency".$conf->currency)), $close[$i][
'label'], 1);
4178 $close[$i][
'reason'] =
$form->textwithpicto($langs->transnoentities(
"Other"), $close[$i][
'label'], 1);
4181 foreach ($close as $key => $val) {
4182 $arrayreasons[$close[$key][
'code']] = $close[$key][
'reason'];
4186 $formquestion = array(
'text' => $langs->trans(
"ConfirmClassifyPaidPartiallyQuestion"), array(
'type' =>
'radio',
'name' =>
'close_code',
'label' => $langs->trans(
"Reason"),
'values' => $arrayreasons), array(
'type' =>
'text',
'name' =>
'close_note',
'label' => $langs->trans(
"Comment"),
'value' =>
'',
'morecss' =>
'minwidth300'));
4188 $formconfirm =
$form->formconfirm($_SERVER[
"PHP_SELF"].
'?facid='.$object->id, $langs->trans(
'ClassifyPaid'), $langs->trans(
'ConfirmClassifyPaidPartially', $object->ref),
'confirm_paid_partially', $formquestion,
"yes", 1, 340, 600);
4192 if ($action ==
'canceled') {
4195 if ($objectidnext) {
4196 $facturereplacement =
new Facture($db);
4197 $facturereplacement->fetch($objectidnext);
4198 $statusreplacement = $facturereplacement->statut;
4200 if ($objectidnext && $statusreplacement == 0) {
4201 print
'<div class="error">'.$langs->trans(
"ErrorCantCancelIfReplacementInvoiceNotValidated").
'</div>';
4204 $close[1][
'code'] =
'badcustomer';
4205 $close[2][
'code'] =
'abandon';
4207 $close[1][
'label'] = $langs->trans(
"ConfirmClassifyPaidPartiallyReasonBadCustomerDesc");
4208 $close[2][
'label'] = $langs->trans(
"ConfirmClassifyAbandonReasonOtherDesc");
4210 $close[1][
'reason'] =
$form->textwithpicto($langs->transnoentities(
"ConfirmClassifyPaidPartiallyReasonBadCustomer", $object->ref), $close[1][
'label'], 1);
4211 $close[2][
'reason'] =
$form->textwithpicto($langs->transnoentities(
"ConfirmClassifyAbandonReasonOther"), $close[2][
'label'], 1);
4213 $arrayreasons[$close[1][
'code']] = $close[1][
'reason'];
4214 $arrayreasons[$close[2][
'code']] = $close[2][
'reason'];
4217 $formquestion = array(
'text' => $langs->trans(
"ConfirmCancelBillQuestion"), array(
'type' =>
'radio',
'name' =>
'close_code',
'label' => $langs->trans(
"Reason"),
'values' => $arrayreasons), array(
'type' =>
'text',
'name' =>
'close_note',
'label' => $langs->trans(
"Comment"),
'value' =>
'',
'morecss' =>
'minwidth300'));
4219 $formconfirm =
$form->formconfirm($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $langs->trans(
'CancelBill'), $langs->trans(
'ConfirmCancelBill', $object->ref),
'confirm_canceled', $formquestion,
"yes", 1, 270);
4223 if ($action ==
'deletepayment') {
4224 $payment_id =
GETPOST(
'paiement_id');
4225 $formconfirm =
$form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&paiement_id='.$payment_id, $langs->trans(
'DeletePayment'), $langs->trans(
'ConfirmDeletePayment'),
'confirm_delete_paiement',
'',
'no', 1);
4229 if ($action ==
'ask_deleteline') {
4230 $formconfirm =
$form->formconfirm($_SERVER[
"PHP_SELF"].
'?facid='.$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'',
'no', 1);
4234 if ($action ==
'clone') {
4236 $formquestion = array(
4237 array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' =>
$form->select_company($object->socid,
'socid',
'(s.client=1 OR s.client=2 OR s.client=3)', 1)),
4238 array(
'type' =>
'date',
'name' =>
'newdate',
'label' => $langs->trans(
"Date"),
'value' =>
dol_now())
4241 $formconfirm =
$form->formconfirm($_SERVER[
"PHP_SELF"].
'?facid='.$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneInvoice', $object->ref),
'confirm_clone', $formquestion,
'yes', 1, 250);
4244 if ($action ==
"remove_file_comfirm") {
4245 $file =
GETPOST(
'file',
'alpha');
4247 $formconfirm =
$form->formconfirm(
4248 $_SERVER[
"PHP_SELF"].
'?facid='.$object->id.
'&file='.$file,
4249 $langs->trans(
'DeleteFileHeader'),
4250 $langs->trans(
'DeleteFileText').
"<br><br>".$file,
4259 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid,
'remainingtopay' => &$resteapayer);
4260 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
4261 if (empty($reshook)) {
4262 $formconfirm .= $hookmanager->resPrint;
4263 } elseif ($reshook > 0) {
4264 $formconfirm = $hookmanager->resPrint;
4272 $linkback =
'<a href="'.DOL_URL_ROOT.
'/compta/facture/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
4274 $morehtmlref =
'<div class="refidno">';
4276 if ($object->status == $object::STATUS_DRAFT && !$mysoc->isInEEC() && !empty($conf->global->INVOICE_ALLOW_FREE_REF)) {
4277 $morehtmlref .=
$form->editfieldkey(
"Ref",
'ref', $object->ref, $object, $usercancreate,
'string',
'', 0, 1);
4278 $morehtmlref .=
$form->editfieldval(
"Ref",
'ref', $object->ref, $object, $usercancreate,
'string',
'', null, null,
'', 1);
4279 $morehtmlref .=
'<br>';
4282 $morehtmlref .=
$form->editfieldkey(
"RefCustomer",
'ref_client', $object->ref_client, $object, $usercancreate,
'string',
'', 0, 1);
4283 $morehtmlref .=
$form->editfieldval(
"RefCustomer",
'ref_client', $object->ref_client, $object, $usercancreate,
'string',
'', null, null,
'', 1);
4285 $morehtmlref .=
'<br>'.$langs->trans(
'ThirdParty').
' : '.$object->thirdparty->getNomUrl(1,
'customer');
4286 if (empty($conf->global->MAIN_DISABLE_OTHER_LINK) && $object->thirdparty->id > 0) {
4287 $morehtmlref .=
' (<a href="'.DOL_URL_ROOT.
'/compta/facture/list.php?socid='.$object->thirdparty->id.
'&search_societe='.urlencode($object->thirdparty->name).
'">'.$langs->trans(
"OtherBills").
'</a>)';
4291 $langs->load(
"projects");
4292 $morehtmlref .=
'<br>'.$langs->trans(
'Project').
' ';
4293 if ($usercancreate) {
4294 if ($action !=
'classify') {
4295 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> : ';
4297 if ($action ==
'classify') {
4299 $morehtmlref .=
'<form method="post" action="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'">';
4300 $morehtmlref .=
'<input type="hidden" name="action" value="classin">';
4301 $morehtmlref .=
'<input type="hidden" name="token" value="'.newToken().
'">';
4302 $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project,
'projectid', $maxlength, 0, 1, 0, 1, 0, 0,
'', 1);
4303 $morehtmlref .=
'<input type="submit" class="button valignmiddle" value="'.$langs->trans(
"Modify").
'">';
4304 $morehtmlref .=
'</form>';
4306 $morehtmlref .=
$form->form_project($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->socid, $object->fk_project,
'none', 0, 0, 0, 1);
4309 if (!empty($object->fk_project)) {
4311 $proj->fetch($object->fk_project);
4312 $morehtmlref .=
' : '.$proj->getNomUrl(1);
4314 $morehtmlref .=
' - '.$proj->title;
4321 $morehtmlref .=
'</div>';
4323 $object->totalpaid = $totalpaid;
4325 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref,
'', 0,
'',
'');
4327 print
'<div class="fichecenter">';
4328 print
'<div class="fichehalfleft">';
4329 print
'<div class="underbanner clearboth"></div>';
4331 print
'<table class="border centpercent tableforfield">';
4334 print
'<tr><td class="titlefield fieldname_type">'.$langs->trans(
'Type').
'</td><td class="valuefield fieldname_type">';
4335 print
'<span class="badgeneutral">';
4336 print $object->getLibType();
4338 if ($object->module_source) {
4339 print
' <span class="opacitymediumbycolor paddingleft">('.$langs->trans(
"POS").
' '.ucfirst($object->module_source).
' - '.$langs->trans(
"Terminal").
' '.$object->pos_source.
')</span>';
4342 $facreplaced =
new Facture($db);
4343 $facreplaced->fetch($object->fk_facture_source);
4344 print
' <span class="opacitymediumbycolor paddingleft">'.$langs->transnoentities(
"ReplaceInvoice", $facreplaced->getNomUrl(1)).
'</span>';
4348 $facusing->fetch($object->fk_facture_source);
4349 print
' <span class="opacitymediumbycolor paddingleft">'.$langs->transnoentities(
"CorrectInvoice", $facusing->getNomUrl(1)).
'</span>';
4352 $facidavoir = $object->getListIdAvoirFromInvoice();
4353 if (count($facidavoir) > 0) {
4354 print
' <span class="opacitymediumbycolor paddingleft">'.$langs->transnoentities(
"InvoiceHasAvoir");
4356 foreach ($facidavoir as $id) {
4363 $facavoir->fetch($id);
4364 print $facavoir->getNomUrl(1);
4368 if ($objectidnext > 0) {
4369 $facthatreplace =
new Facture($db);
4370 $facthatreplace->fetch($objectidnext);
4371 print
' <span class="opacitymediumbycolor paddingleft">'.str_replace(
'{s1}', $facthatreplace->getNomUrl(1), $langs->transnoentities(
"ReplacedByInvoice",
'{s1}')).
'</span>';
4376 $result = $discount->fetch(0, $object->id);
4378 print
' <span class="opacitymediumbycolor paddingleft">';
4379 $s = $langs->trans(
"CreditNoteConvertedIntoDiscount",
'{s1}',
'{s2}');
4380 $s = str_replace(
'{s1}', $object->getLibType(1), $s);
4381 $s = str_replace(
'{s2}', $discount->getNomUrl(1,
'discount'), $s);
4383 print
'</span><br>';
4387 if ($object->fk_fac_rec_source > 0) {
4389 $result = $tmptemplate->fetch($object->fk_fac_rec_source);
4391 print
' <span class="opacitymediumbycolor paddingleft">';
4392 $s = $langs->transnoentities(
"GeneratedFromTemplate",
'{s1}');
4393 $s = str_replace(
'{s1}',
'<a href="'.DOL_URL_ROOT.
'/compta/facture/card-rec.php?facid='.$tmptemplate->id.
'">'.
dol_escape_htmltag($tmptemplate->ref).
'</a>', $s);
4401 print
'<!-- Discounts -->'.
"\n";
4402 print
'<tr><td>'.$langs->trans(
'DiscountStillRemaining').
'</td>';
4406 $backtopage = urlencode($_SERVER[
"PHP_SELF"].
'?facid='.$object->id);
4407 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
4412 print
'<table class="nobordernopadding centpercent"><tr><td>';
4413 print $langs->trans(
'DateInvoice');
4415 if ($action !=
'editinvoicedate' && !empty($object->brouillon) && $usercancreate && empty($conf->global->FAC_FORCE_DATE_VALIDATION)) {
4416 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editinvoicedate&token='.
newToken().
'&facid='.$object->id.
'">'.
img_edit($langs->trans(
'SetDate'), 1).
'</a></td>';
4418 print
'</tr></table>';
4421 if ($action ==
'editinvoicedate') {
4422 $form->form_date($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->date,
'invoicedate');
4424 print
'<span class="valuedate">'.dol_print_date($object->date,
'day').
'</span>';
4430 if (!empty($conf->global->INVOICE_POINTOFTAX_DATE)) {
4433 print
'<table class="nobordernopadding centpercent"><tr><td>';
4434 print $langs->trans(
'DatePointOfTax');
4436 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editdate_pointoftax&token='.
newToken().
'&facid='.$object->id.
'">'.
img_edit($langs->trans(
'SetDate'), 1).
'</a></td>';
4437 print
'</tr></table>';
4439 if ($action ==
'editdate_pointoftax') {
4440 $form->form_date($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->date_pointoftax,
'date_pointoftax');
4442 print
'<span class="valuedate">'.dol_print_date($object->date_pointoftax,
'day').
'</span>';
4449 print
'<table class="nobordernopadding centpercent"><tr><td>';
4450 print $langs->trans(
'PaymentConditionsShort');
4453 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>';
4455 print
'</tr></table>';
4458 if ($action ==
'editconditions') {
4459 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->cond_reglement_id,
'cond_reglement_id');
4461 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->cond_reglement_id,
'none');
4470 print
'<table class="nobordernopadding centpercent"><tr><td>';
4471 print $langs->trans(
'DateMaxPayment');
4474 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editpaymentterm&token='.
newToken().
'&facid='.$object->id.
'">'.
img_edit($langs->trans(
'SetDate'), 1).
'</a></td>';
4476 print
'</tr></table>';
4479 if ($action ==
'editpaymentterm') {
4480 $form->form_date($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->date_lim_reglement,
'paymentterm');
4482 print
'<span class="valuedate">'.dol_print_date($object->date_lim_reglement,
'day').
'</span>';
4483 if ($object->hasDelay()) {
4494 print
'<table class="nobordernopadding centpercent"><tr><td>';
4495 print $langs->trans(
'PaymentMode');
4497 if ($action !=
'editmode' && $usercancreate) {
4498 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>';
4500 print
'</tr></table>';
4502 if ($action ==
'editmode') {
4503 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
4505 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->mode_reglement_id,
'none',
'CRDT');
4514 print
'<table class="nobordernopadding centpercent"><tr><td>';
4515 print
$form->editfieldkey(
'Currency',
'multicurrency_code',
'', $object, 0);
4517 if ($usercancreate && $action !=
'editmulticurrencycode' && !empty($object->brouillon)) {
4518 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>';
4520 print
'</tr></table>';
4522 $htmlname = (($usercancreate && $action ==
'editmulticurrencycode') ?
'multicurrency_code' :
'none');
4523 $form->form_multicurrency_code($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->multicurrency_code, $htmlname);
4527 if ($object->multicurrency_code != $conf->currency || $object->multicurrency_tx != 1) {
4530 print
'<table class="nobordernopadding" width="100%"><tr><td>';
4531 print
$form->editfieldkey(
'CurrencyRate',
'multicurrency_tx',
'', $object, 0);
4533 if ($usercancreate && $action !=
'editmulticurrencyrate' && !empty($object->brouillon) && $object->multicurrency_code && $object->multicurrency_code != $conf->currency) {
4534 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>';
4536 print
'</tr></table>';
4538 if ($action ==
'editmulticurrencyrate' || $action ==
'actualizemulticurrencyrate') {
4539 if ($action ==
'actualizemulticurrencyrate') {
4542 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->multicurrency_tx, ($usercancreate ?
'multicurrency_tx' :
'none'), $object->multicurrency_code);
4544 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->multicurrency_tx,
'none', $object->multicurrency_code);
4545 if ($object->statut == $object::STATUS_DRAFT && $object->multicurrency_code && $object->multicurrency_code != $conf->currency) {
4546 print
'<div class="inline-block"> ';
4547 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=actualizemulticurrencyrate">'.$langs->trans(
"ActualizeCurrency").
'</a>';
4557 print
'<tr><td class="nowrap">';
4558 print
'<table class="nobordernopadding centpercent"><tr><td class="nowrap">';
4559 print $langs->trans(
'BankAccount');
4561 if (($action !=
'editbankaccount') && $usercancreate) {
4562 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>';
4564 print
'</tr></table>';
4566 if ($action ==
'editbankaccount') {
4567 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->fk_account,
'fk_account', 1);
4569 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->fk_account,
'none');
4578 print
'<table class="nobordernopadding centpercent"><tr><td>';
4579 print $langs->trans(
'IncotermLabel');
4580 print
'<td><td class="right">';
4581 if ($usercancreate) {
4582 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/compta/facture/card.php?facid='.$object->id.
'&action=editincoterm&token='.
newToken().
'">'.
img_edit().
'</a>';
4586 print
'</td></tr></table>';
4589 if ($action !=
'editincoterm') {
4590 print
$form->textwithpicto($object->display_incoterms(), $object->label_incoterms, 1);
4592 print
$form->select_incoterms((!empty($object->fk_incoterms) ? $object->fk_incoterms :
''), (!empty($object->location_incoterms) ? $object->location_incoterms :
''), $_SERVER[
'PHP_SELF'].
'?id='.$object->id);
4599 if (!empty($object->retained_warranty) || !empty($conf->global->INVOICE_USE_RETAINED_WARRANTY)) {
4600 $displayWarranty =
true;
4601 if (!in_array($object->type, $retainedWarrantyInvoiceAvailableType) && empty($object->retained_warranty)) {
4602 $displayWarranty =
false;
4605 if ($displayWarranty) {
4607 print
'<tr class="retained-warranty-lines" ><td>';
4608 print
'<table id="retained-warranty-table" class="nobordernopadding" width="100%"><tr><td>';
4609 print $langs->trans(
'RetainedWarranty');
4611 if ($action !=
'editretainedwarranty' && $user->rights->facture->creer) {
4612 print
'<td align="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editretainedwarranty&token='.
newToken().
'&facid='.$object->id.
'">'.
img_edit($langs->trans(
'setretainedwarranty'), 1).
'</a></td>';
4615 print
'</tr></table>';
4617 if ($action ==
'editretainedwarranty') {
4618 print
'<form id="retained-warranty-form" method="POST" action="'.$_SERVER[
'PHP_SELF'].
'?facid='.$object->id.
'">';
4619 print
'<input type="hidden" name="action" value="setretainedwarranty">';
4620 print
'<input type="hidden" name="token" value="'.newToken().
'">';
4621 print
'<input name="retained_warranty" type="number" step="0.01" min="0" max="100" value="'.$object->retained_warranty.
'" >';
4622 print
'<input type="submit" class="button valignmiddle" value="'.$langs->trans(
"Modify").
'">';
4625 print
price($object->retained_warranty).
'%';
4630 print
'<tr class="retained-warranty-lines" ><td>';
4631 print
'<table id="retained-warranty-cond-reglement-table" class="nobordernopadding" width="100%"><tr><td>';
4632 print $langs->trans(
'PaymentConditionsShortRetainedWarranty');
4634 if ($action !=
'editretainedwarrantypaymentterms' && $user->rights->facture->creer) {
4635 print
'<td align="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editretainedwarrantypaymentterms&token='.
newToken().
'&facid='.$object->id.
'">'.
img_edit($langs->trans(
'setPaymentConditionsShortRetainedWarranty'), 1).
'</a></td>';
4638 print
'</tr></table>';
4640 $defaultDate = !empty($object->retained_warranty_date_limit) ? $object->retained_warranty_date_limit : strtotime(
'-1 years', $object->date_lim_reglement);
4641 if ($object->date > $defaultDate) {
4642 $defaultDate = $object->date;
4645 if ($action ==
'editretainedwarrantypaymentterms') {
4647 print
'<form method="POST" action="'.$_SERVER[
'PHP_SELF'].
'?facid='.$object->id.
'">';
4648 print
'<input type="hidden" name="action" value="setretainedwarrantyconditions">';
4649 print
'<input type="hidden" name="token" value="'.newToken().
'">';
4650 $retained_warranty_fk_cond_reglement =
GETPOST(
'retained_warranty_fk_cond_reglement',
'int');
4651 $retained_warranty_fk_cond_reglement = !empty($retained_warranty_fk_cond_reglement) ? $retained_warranty_fk_cond_reglement : $object->retained_warranty_fk_cond_reglement;
4652 $retained_warranty_fk_cond_reglement = !empty($retained_warranty_fk_cond_reglement) ? $retained_warranty_fk_cond_reglement : $conf->global->INVOICE_SITUATION_DEFAULT_RETAINED_WARRANTY_COND_ID;
4653 $form->select_conditions_paiements($retained_warranty_fk_cond_reglement,
'retained_warranty_fk_cond_reglement', -1, 1);
4654 print
'<input type="submit" class="button valignmiddle" value="'.$langs->trans(
"Modify").
'">';
4657 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?facid='.$object->id, $object->retained_warranty_fk_cond_reglement,
'none');
4658 if (!$displayWarranty) {
4659 print
img_picto($langs->trans(
'RetainedWarrantyNeed100Percent'),
'warning.png',
'class="pictowarning valignmiddle" ');
4665 print
'<tr class="retained-warranty-lines" ><td>';
4666 print
'<table id="retained-warranty-date-limit-table" class="nobordernopadding" width="100%"><tr><td>';
4667 print $langs->trans(
'RetainedWarrantyDateLimit');
4669 if ($action !=
'editretainedwarrantydatelimit' && $user->rights->facture->creer) {
4670 print
'<td align="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editretainedwarrantydatelimit&token='.
newToken().
'&facid='.$object->id.
'">'.
img_edit($langs->trans(
'setretainedwarrantyDateLimit'), 1).
'</a></td>';
4673 print
'</tr></table>';
4675 $defaultDate = !empty($object->retained_warranty_date_limit) ? $object->retained_warranty_date_limit : strtotime(
'-1 years', $object->date_lim_reglement);
4676 if ($object->date > $defaultDate) {
4677 $defaultDate = $object->date;
4680 if ($action ==
'editretainedwarrantydatelimit') {
4682 print
'<form method="POST" action="'.$_SERVER[
'PHP_SELF'].
'?facid='.$object->id.
'">';
4683 print
'<input type="hidden" name="action" value="setretainedwarrantydatelimit">';
4684 print
'<input type="hidden" name="token" value="'.newToken().
'">';
4685 print
'<input name="retained_warranty_date_limit" type="date" step="1" min="'.dol_print_date($object->date,
'%Y-%m-%d').
'" value="'.
dol_print_date($defaultDate,
'%Y-%m-%d').
'" >';
4686 print
'<input type="submit" class="button valignmiddle" value="'.$langs->trans(
"Modify").
'">';
4689 print
dol_print_date($object->retained_warranty_date_limit,
'day');
4698 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
4703 print
'<div class="fichehalfright">';
4705 print
'<!-- amounts -->'.
"\n";
4706 print
'<div class="underbanner clearboth"></div>'.
"\n";
4707 print
'<table class="border tableforfield centpercent">';
4710 if (!empty($conf->global->INVOICE_POSITIVE_CREDIT_NOTE_SCREEN) && $object->type == $object::TYPE_CREDIT_NOTE) {
4714 if (
isModEnabled(
'multicurrency') && ($object->multicurrency_code != $conf->currency)) {
4716 print
'<tr><td class="titlefieldmiddle">'.$form->editfieldkey(
'MulticurrencyAmountHT',
'multicurrency_total_ht',
'', $object, 0).
'</td>';
4717 print
'<td class="nowrap right amountcard">'.price($sign * $object->multicurrency_total_ht,
'', $langs, 0, -1, -1, (!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency)).
'</td>';
4721 print
'<tr><td>'.$form->editfieldkey(
'MulticurrencyAmountVAT',
'multicurrency_total_tva',
'', $object, 0).
'</td>';
4722 print
'<td class="nowrap right amountcard">'.price($sign * $object->multicurrency_total_tva,
'', $langs, 0, -1, -1, (!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency)).
'</td>';
4726 print
'<tr><td>'.$form->editfieldkey(
'MulticurrencyAmountTTC',
'multicurrency_total_ttc',
'', $object, 0).
'</td>';
4727 print
'<td class="nowrap right amountcard">'.price($sign * $object->multicurrency_total_ttc,
'', $langs, 0, -1, -1, (!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency)).
'</td>';
4732 print
'<tr><td class="titlefieldmiddle">'.$langs->trans(
'AmountHT').
'</td>';
4733 print
'<td class="nowrap right amountcard">'.price($sign * $object->total_ht, 1,
'', 1, - 1, - 1, $conf->currency).
'</td></tr>';
4736 print
'<tr><td>'.$langs->trans(
'AmountVAT').
'</td><td colspan="3" class="nowrap right amountcard">'.
price($sign * $object->total_tva, 1,
'', 1, - 1, - 1, $conf->currency).
'</td></tr>';
4740 if (($mysoc->localtax1_assuj ==
"1" && $mysoc->useLocalTax(1)) || $object->total_localtax1 != 0) {
4741 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td>';
4742 print
'<td class="nowrap right amountcard">'.price($sign * $object->total_localtax1, 1,
'', 1, - 1, - 1, $conf->currency).
'</td></tr>';
4744 if (($mysoc->localtax2_assuj ==
"1" && $mysoc->useLocalTax(2)) || $object->total_localtax2 != 0) {
4745 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td>';
4746 print
'<td class="nowrap right amountcard">'.price($sign * $object->total_localtax2, 1,
'', 1, - 1, - 1, $conf->currency).
'</td></tr>';
4750 if ($selleruserevenustamp) {
4752 print
'<table class="nobordernopadding" width="100%"><tr><td>';
4753 print $langs->trans(
'RevenueStamp');
4755 if ($action !=
'editrevenuestamp' && !empty($object->brouillon) && $usercancreate) {
4756 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editrevenuestamp&token='.
newToken().
'&facid='.$object->id.
'">'.
img_edit($langs->trans(
'SetRevenuStamp'), 1).
'</a></td>';
4758 print
'</tr></table>';
4760 if ($action ==
'editrevenuestamp') {
4761 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'" method="post">';
4762 print
'<input type="hidden" name="token" value="'.newToken().
'">';
4763 print
'<input type="hidden" name="action" value="setrevenuestamp">';
4764 print
'<input type="hidden" name="revenuestamp" id="revenuestamp_val" value="'.price2num($object->revenuestamp).
'">';
4765 print $formother->select_revenue_stamp(
'',
'revenuestamp_type', $mysoc->country_code);
4766 print
' → <span id="revenuestamp_span"></span>';
4767 print
' <input type="submit" class="button buttongen button-save" value="'.$langs->trans(
'Modify').
'">';
4770 $(document).ready(function(){
4771 js_recalculate_revenuestamp();
4772 $('select[name=revenuestamp_type]').on('change',function(){
4773 js_recalculate_revenuestamp();
4776 function js_recalculate_revenuestamp(){
4777 var valselected = $('select[name=revenuestamp_type]').val();
4778 console.log('Calculate revenue stamp from '+valselected);
4780 if (valselected.indexOf('%') == -1)
4782 revenue = valselected;
4786 var revenue_type = parseFloat(valselected);
4787 var amount_net = ".round($object->total_ht, 2).
";
4788 revenue = revenue_type * amount_net / 100;
4789 revenue = revenue.toFixed(2);
4791 $('#revenuestamp_val').val(revenue);
4792 $('#revenuestamp_span').html(revenue);
4796 print
price($object->revenuestamp, 1,
'', 1, - 1, - 1, $conf->currency);
4802 print
'<tr><td>'.$langs->trans(
'AmountTTC').
'</td><td class="nowrap right amountcard">'.
price($sign * $object->total_ttc, 1,
'', 1, - 1, - 1, $conf->currency).
'</td></tr>';
4816 if ($mysoc->localtax1_assuj ==
"1" || $object->total_localtax1 != 0) {
4819 if ($mysoc->localtax2_assuj ==
"1" || $object->total_localtax2 != 0) {
4822 if ($selleruserevenustamp) {
4833 if (($object->situation_cycle_ref > 0) && !empty($conf->global->INVOICE_USE_SITUATION)) {
4834 print
'<!-- List of situation invoices -->';
4835 print
'<table class="noborder situationstable" width="100%">';
4837 print
'<tr class="liste_titre">';
4838 print
'<td>'.$langs->trans(
'ListOfSituationInvoices').
'</td>';
4840 print
'<td class="center">'.$langs->trans(
'Situation').
'</td>';
4842 print
'<td class="right"></td>';
4844 print
'<td class="right">'.$langs->trans(
'AmountHT').
'</td>';
4845 print
'<td class="right">'.$langs->trans(
'AmountTTC').
'</td>';
4846 print
'<td width="18"> </td>';
4849 $total_prev_ht = $total_prev_ttc = 0;
4850 $total_global_ht = $total_global_ttc = 0;
4852 if (count($object->tab_previous_situation_invoice) > 0) {
4855 $current_situation_counter = array();
4856 foreach ($object->tab_previous_situation_invoice as $prev_invoice) {
4857 $tmptotalpaidforthisinvoice = $prev_invoice->getSommePaiement();
4858 $total_prev_ht += $prev_invoice->total_ht;
4859 $total_prev_ttc += $prev_invoice->total_ttc;
4860 $current_situation_counter[] = (($prev_invoice->type ==
Facture::TYPE_CREDIT_NOTE) ?-1 : 1) * $prev_invoice->situation_counter;
4861 print
'<tr class="oddeven">';
4862 print
'<td>'.$prev_invoice->getNomUrl(1).
'</td>';
4864 print
'<td align="center" >'.(($prev_invoice->type ==
Facture::TYPE_CREDIT_NOTE) ? $langs->trans(
'situationInvoiceShortcode_AS') : $langs->trans(
'situationInvoiceShortcode_S')).$prev_invoice->situation_counter.
'</td>';
4866 print
'<td class="right"></td>';
4868 print
'<td class="right"><span class="amount">'.price($prev_invoice->total_ht).
'</span></td>';
4869 print
'<td class="right"><span class="amount">'.price($prev_invoice->total_ttc).
'</span></td>';
4870 print
'<td class="right">'.$prev_invoice->getLibStatut(3, $tmptotalpaidforthisinvoice).
'</td>';
4876 $total_global_ht += $total_prev_ht;
4877 $total_global_ttc += $total_prev_ttc;
4878 $total_global_ht += $object->total_ht;
4879 $total_global_ttc += $object->total_ttc;
4881 print
'<tr class="oddeven">';
4882 print
'<td>'.$object->getNomUrl(1).
'</td>';
4884 print
'<td class="center">'.(($object->type ==
Facture::TYPE_CREDIT_NOTE) ? $langs->trans(
'situationInvoiceShortcode_AS') : $langs->trans(
'situationInvoiceShortcode_S')).$object->situation_counter.
'</td>';
4886 print
'<td class="right"></td>';
4888 print
'<td class="right"><span class="amount">'.price($object->total_ht).
'</span></td>';
4889 print
'<td class="right"><span class="amount">'.price($object->total_ttc).
'</span></td>';
4890 print
'<td class="right">'.$object->getLibStatut(3, $object->getSommePaiement()).
'</td>';
4894 print
'<tr class="oddeven">';
4895 print
'<td colspan="2" class="left"><b>'.$langs->trans(
'CurrentSituationTotal').
'</b></td>';
4898 foreach ($current_situation_counter as $sit) {
4899 $curSign = $sit > 0 ?
'+' :
'-';
4900 $curType = $sit > 0 ? $langs->trans(
'situationInvoiceShortcode_S') : $langs->trans(
'situationInvoiceShortcode_AS');
4902 print
' '.$curSign.
' ';
4904 print $curType.abs($sit);
4911 print
'<td class="right"><b>'.price($total_global_ht).
'</b></td>';
4912 print
'<td class="right"><b>'.price($total_global_ttc).
'</b></td>';
4913 print
'<td width="18"> </td>';
4917 if (count($object->tab_next_situation_invoice) > 0) {
4929 $total_next_ht = $total_next_ttc = 0;
4931 foreach ($object->tab_next_situation_invoice as $next_invoice) {
4932 $totalpaid = $next_invoice->getSommePaiement();
4933 $total_next_ht += $next_invoice->total_ht;
4934 $total_next_ttc += $next_invoice->total_ttc;
4936 print
'<tr class="oddeven">';
4937 print
'<td>'.$next_invoice->getNomUrl(1).
'</td>';
4939 print
'<td class="center">'.(($next_invoice->type ==
Facture::TYPE_CREDIT_NOTE) ? $langs->trans(
'situationInvoiceShortcode_AS') : $langs->trans(
'situationInvoiceShortcode_S')).$next_invoice->situation_counter.
'</td>';
4941 print
'<td class="right"></td>';
4943 print
'<td class="right"><span class="amount">'.price($next_invoice->total_ht).
'</span></td>';
4944 print
'<td class="right"><span class="amount">'.price($next_invoice->total_ttc).
'</span></td>';
4945 print
'<td class="right">'.$next_invoice->getLibStatut(3, $totalpaid).
'</td>';
4949 $total_global_ht += $total_next_ht;
4950 $total_global_ttc += $total_next_ttc;
4952 print
'<tr class="oddeven">';
4953 print
'<td colspan="3" class="right"></td>';
4955 print
'<td class="right"></td>';
4957 print
'<td class="right"><b>'.price($total_global_ht).
'</b></td>';
4958 print
'<td class="right"><b>'.price($total_global_ttc).
'</b></td>';
4959 print
'<td width="18"> </td>';
4967 if ($object->type == $object::TYPE_CREDIT_NOTE) {
4973 print
'<!-- List of payments already done -->';
4974 print
'<div class="div-table-responsive-no-min">';
4975 print
'<table class="noborder paymenttable centpercent">';
4977 print
'<tr class="liste_titre">';
4978 print
'<td class="liste_titre">'.($object->type ==
Facture::TYPE_CREDIT_NOTE ? $langs->trans(
"PaymentsBack") : $langs->trans(
'Payments')).
'</td>';
4979 print
'<td class="liste_titre"><span class="hideonsmartphone">'.$langs->trans(
'Date').
'</span></td>';
4980 print
'<td class="liste_titre"><span class="hideonsmartphone">'.$langs->trans(
'Type').
'</span></td>';
4982 print
'<td class="liste_titre"><span class="hideonsmartphone">'.$langs->trans(
'BankAccount').
'</span></td>';
4984 print
'<td class="liste_titre right">'.$langs->trans(
'Amount').
'</td>';
4985 print
'<td class="liste_titre" width="18"> </td>';
4989 $sql =
'SELECT p.datep as dp, p.ref, p.num_paiement as num_payment, p.rowid, p.fk_bank,';
4990 $sql .=
' c.code as payment_code, c.libelle as payment_label,';
4991 $sql .=
' pf.amount,';
4992 $sql .=
' ba.rowid as baid, ba.ref as baref, ba.label, ba.number as banumber, ba.account_number, ba.fk_accountancy_journal, ba.currency_code as bacurrency_code';
4993 $sql .=
' FROM '.MAIN_DB_PREFIX.
'paiement_facture as pf, '.MAIN_DB_PREFIX.
'paiement as p';
4994 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_paiement as c ON p.fk_paiement = c.id';
4995 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'bank as b ON p.fk_bank = b.rowid';
4996 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'bank_account as ba ON b.fk_account = ba.rowid';
4997 $sql .=
' WHERE pf.fk_facture = '.((int) $object->id).
' AND pf.fk_paiement = p.rowid';
4998 $sql .=
' AND p.entity IN ('.getEntity(
'invoice').
')';
4999 $sql .=
' ORDER BY p.datep, p.tms';
5001 $result = $db->query($sql);
5003 $num = $db->num_rows($result);
5008 $objp = $db->fetch_object($result);
5010 $paymentstatic->id = $objp->rowid;
5011 $paymentstatic->datepaye = $db->jdate($objp->dp);
5012 $paymentstatic->ref = $objp->ref;
5013 $paymentstatic->num_payment = $objp->num_payment;
5014 $paymentstatic->paiementcode = $objp->payment_code;
5016 print
'<tr class="oddeven"><td class="nowraponall">';
5017 print $paymentstatic->getNomUrl(1);
5020 $dateofpayment = $db->jdate($objp->dp);
5022 if ($tmparray[
'seconds'] == 0 && $tmparray[
'minutes'] == 0 && ($tmparray[
'hours'] == 0 || $tmparray[
'hours'] == 12)) {
5028 $label = ($langs->trans(
"PaymentType".$objp->payment_code) != (
"PaymentType".$objp->payment_code)) ? $langs->trans(
"PaymentType".$objp->payment_code) : $objp->payment_label;
5029 print
'<td>'.$label.
' '.$objp->num_payment.
'</td>';
5031 $bankaccountstatic->id = $objp->baid;
5032 $bankaccountstatic->ref = $objp->baref;
5033 $bankaccountstatic->label = $objp->baref;
5034 $bankaccountstatic->number = $objp->banumber;
5035 $bankaccountstatic->currency_code = $objp->bacurrency_code;
5038 $bankaccountstatic->account_number = $objp->account_number;
5041 $accountingjournal->fetch($objp->fk_accountancy_journal);
5042 $bankaccountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1,
'', 1);
5045 print
'<td class="nowraponall">';
5046 if ($bankaccountstatic->id) {
5047 print $bankaccountstatic->getNomUrl(1,
'transactions');
5051 print
'<td class="right"><span class="amount">'.price($sign * $objp->amount).
'</span></td>';
5052 print
'<td class="center">';
5054 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=deletepayment&token='.
newToken().
'&paiement_id='.$objp->rowid.
'">';
5071 print
'<tr><td colspan="'.$nbcols.
'" class="right">';
5072 print
'<span class="opacitymedium">';
5074 print $langs->trans(
'AlreadyPaidNoCreditNotesNoDeposits');
5076 print $langs->trans(
'AlreadyPaid');
5078 print
'</span></td><td class="right'.(($totalpaid > 0) ?
' amountalreadypaid' :
'').
'">'.
price($totalpaid).
'</td><td> </td></tr>';
5080 $resteapayeraffiche = $resteapayer;
5081 $cssforamountpaymentcomplete =
'amountpaymentcomplete';
5084 $creditnoteamount = 0;
5086 $sql =
"SELECT re.rowid, re.amount_ht, re.amount_tva, re.amount_ttc,";
5087 $sql .=
" re.description, re.fk_facture_source";
5088 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe_remise_except as re";
5089 $sql .=
" WHERE fk_facture = ".((int) $object->id);
5090 $resql = $db->query($sql);
5092 $num = $db->num_rows(
$resql);
5096 $obj = $db->fetch_object(
$resql);
5097 $invoice->fetch($obj->fk_facture_source);
5098 print
'<tr><td colspan="'.$nbcols.
'" class="right">';
5099 print
'<span class="opacitymedium">';
5101 print $langs->trans(
"CreditNote").
' ';
5104 print $langs->trans(
"Deposit").
' ';
5106 print $invoice->getNomUrl(0);
5109 print
'<td class="right"><span class="amount">'.price($obj->amount_ttc).
'</span></td>';
5110 print
'<td class="right">';
5111 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?facid='.$object->id.
'&action=unlinkdiscount&token='.
newToken().
'&discountid='.$obj->rowid.
'">'.
img_delete().
'</a>';
5115 $creditnoteamount += $obj->amount_ttc;
5118 $depositamount += $obj->amount_ttc;
5127 print
'<tr><td colspan="'.$nbcols.
'" class="nowrap right">';
5128 print
'<span class="opacitymedium">';
5129 print
$form->textwithpicto($langs->trans(
"Discount"), $langs->trans(
"HelpEscompte"), - 1);
5131 print
'</td><td class="right"><span class="amount">'.price(
price2num($object->total_ttc - $creditnoteamount - $depositamount - $totalpaid,
'MT')).
'</span></td><td> </td></tr>';
5132 $resteapayeraffiche = 0;
5133 $cssforamountpaymentcomplete =
'amountpaymentneutral';
5137 print
'<tr><td colspan="'.$nbcols.
'" class="nowrap right">';
5138 print
'<span class="opacitymedium">';
5139 print
$form->textwithpicto($langs->trans(
"Abandoned"), $langs->trans(
"HelpAbandonBadCustomer"), - 1);
5141 print
'</td><td class="right">'.price(
price2num($object->total_ttc - $creditnoteamount - $depositamount - $totalpaid,
'MT')).
'</td><td> </td></tr>';
5143 $cssforamountpaymentcomplete =
'amountpaymentneutral';
5147 print
'<tr><td colspan="'.$nbcols.
'" class="nowrap right">';
5148 print
'<span class="opacitymedium">';
5149 print
$form->textwithpicto($langs->trans(
"ProductReturned"), $langs->trans(
"HelpAbandonProductReturned"), - 1);
5151 print
'</td><td class="right"><span class="amount">'.price(
price2num($object->total_ttc - $creditnoteamount - $depositamount - $totalpaid,
'MT')).
'</span></td><td> </td></tr>';
5152 $resteapayeraffiche = 0;
5153 $cssforamountpaymentcomplete =
'amountpaymentneutral';
5157 print
'<tr><td colspan="'.$nbcols.
'" class="nowrap right">';
5158 $text = $langs->trans(
"HelpAbandonOther");
5159 if ($object->close_note) {
5160 $text .=
'<br><br><b>'.$langs->trans(
"Reason").
'</b>:'.$object->close_note;
5162 print
'<span class="opacitymedium">';
5163 print
$form->textwithpicto($langs->trans(
"Abandoned"), $text, - 1);
5165 print
'</td><td class="right"><span class="amount">'.price(
price2num($object->total_ttc - $creditnoteamount - $depositamount - $totalpaid,
'MT')).
'</span></td><td> </td></tr>';
5166 $resteapayeraffiche = 0;
5167 $cssforamountpaymentcomplete =
'amountpaymentneutral';
5171 print
'<tr><td colspan="'.$nbcols.
'" class="right">';
5172 print
'<span class="opacitymedium">';
5173 print $langs->trans(
"Billed");
5174 print
'</td><td class="right">'.price($object->total_ttc).
'</td><td> </td></tr>';
5176 print
'<tr><td colspan="'.$nbcols.
'" class="right">';
5177 print
'<span class="opacitymedium">';
5178 print $langs->trans(
'RemainderToPay');
5179 if ($resteapayeraffiche < 0) {
5180 print
' ('.$langs->trans(
'NegativeIfExcessReceived').
')';
5184 print
'<td class="right'.($resteapayeraffiche ?
' amountremaintopay' : (
' '.$cssforamountpaymentcomplete)).
'">'.
price($resteapayeraffiche).
'</td><td> </td></tr>';
5187 if ($object->multicurrency_code != $conf->currency || $object->multicurrency_tx != 1) {
5188 print
'<tr><td colspan="'.$nbcols.
'" class="right">';
5189 print
'<span class="opacitymedium">';
5190 print $langs->trans(
'RemainderToPayMulticurrency');
5191 if ($resteapayeraffiche < 0) {
5192 print
' ('.$langs->trans(
'NegativeIfExcessReceived').
')';
5196 print
'<td class="right'.($resteapayeraffiche ?
' amountremaintopay' : (
' '.$cssforamountpaymentcomplete)).
'">';
5198 print
price(
price2num($object->multicurrency_tx*$resteapayeraffiche,
'MT'), 1, $langs, 1, -1, -1, (empty($object->multicurrency_code) ? $conf->currency : $object->multicurrency_code)).
'</td><td> </td></tr>';
5202 if (!empty($object->situation_final) && !empty($object->retained_warranty) && $displayWarranty) {
5205 $retainedWarranty = $total_global_ttc * $object->retained_warranty / 100;
5208 $retainedWarranty = $object->total_ttc * $object->retained_warranty / 100;
5211 $billedWithRetainedWarranty = $object->total_ttc - $retainedWarranty;
5213 print
'<tr><td colspan="'.$nbcols.
'" align="right">'.$langs->trans(
"ToPayOn",
dol_print_date($object->date_lim_reglement,
'day')).
' :</td><td align="right">'.
price($billedWithRetainedWarranty).
'</td><td> </td></tr>';
5216 print
'<tr><td colspan="'.$nbcols.
'" align="right">';
5217 print $langs->trans(
"RetainedWarranty").
' ('.$object->retained_warranty.
'%)';
5218 print !empty($object->retained_warranty_date_limit) ?
' '.$langs->trans(
"ToPayOn",
dol_print_date($object->retained_warranty_date_limit,
'day')) :
'';
5219 print
' :</td><td align="right">'.price($retainedWarranty).
'</td><td> </td></tr>';
5222 $resteapayeraffiche = $resteapayer;
5223 $cssforamountpaymentcomplete =
'amountpaymentneutral';
5226 print
'<tr><td colspan="'.$nbcols.
'" class="right">';
5227 print
'<span class="opacitymedium">'.$langs->trans(
'AlreadyPaidBack').
'</span>';
5228 print
'</td><td class="right"><span class="amount">'.price($sign * $totalpaid).
'</span></td><td> </td></tr>';
5231 print
'<tr><td colspan="'.$nbcols.
'" class="right"><span class="opacitymedium">'.$langs->trans(
"Billed").
'</span></td><td class="right">'.
price($sign * $object->total_ttc).
'</td><td> </td></tr>';
5234 print
'<tr><td colspan="'.$nbcols.
'" class="right">';
5235 print
'<span class="opacitymedium">'.$langs->trans(
'RemainderToPayBack');
5236 if ($resteapayeraffiche > 0) {
5237 print
' ('.$langs->trans(
'NegativeIfExcessRefunded').
')';
5239 print
'</span></td>';
5240 print
'<td class="right'.($resteapayeraffiche ?
' amountremaintopayback' : (
' '.$cssforamountpaymentcomplete)).
'">'.
price($sign * $resteapayeraffiche).
'</td>';
5241 print
'<td class="nowrap"> </td></tr>';
5244 if ($object->multicurrency_code != $conf->currency || $object->multicurrency_tx != 1) {
5245 print
'<tr><td colspan="'.$nbcols.
'" class="right">';
5246 print
'<span class="opacitymedium">'.$langs->trans(
'RemainderToPayBackMulticurrency');
5247 if ($resteapayeraffiche > 0) {
5248 print
' ('.$langs->trans(
'NegativeIfExcessRefunded').
')';
5252 print
'<td class="right'.($resteapayeraffiche ?
' amountremaintopayback' : (
' '.$cssforamountpaymentcomplete)).
'">'.(!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency).
' '.
price(
price2num($sign * $object->multicurrency_tx * $resteapayeraffiche,
'MT')).
'</td><td> </td></tr>';
5266 $formmargin->displayMarginInfos($object);
5272 print
'<div class="clearboth"></div><br><br>';
5274 if (!empty($conf->global->MAIN_DISABLE_CONTACTS_TAB)) {
5275 $blocname =
'contacts';
5276 $title = $langs->trans(
'ContactsAddresses');
5277 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
5280 if (!empty($conf->global->MAIN_DISABLE_NOTES_TAB)) {
5281 $blocname =
'notes';
5282 $title = $langs->trans(
'Notes');
5283 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
5287 $result = $object->getLinesArray();
5290 if (!empty($conf->global->INVOICE_USE_SITUATION)) {
5291 if ($object->situation_cycle_ref && $object->statut == 0) {
5292 print
'<!-- Area to change globally the situation percent -->'.
"\n";
5293 print
'<div class="div-table-responsive">';
5295 print
'<form name="updatealllines" id="updatealllines" action="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'#updatealllines" method="POST">';
5296 print
'<input type="hidden" name="token" value="'.newToken().
'" />';
5297 print
'<input type="hidden" name="action" value="updatealllines" />';
5298 print
'<input type="hidden" name="id" value="'.$object->id.
'" />';
5300 print
'<table id="tablelines_all_progress" class="noborder noshadow" width="100%">';
5302 print
'<tr class="liste_titre nodrag nodrop">';
5305 if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER)) {
5306 print
'<td align="center" width="5"> </td>';
5308 print
'<td class="minwidth500imp">'.$langs->trans(
'ModifyAllLines').
'</td>';
5309 print
'<td class="right">'.$langs->trans(
'Progress').
'</td>';
5310 print
'<td> </td>';
5313 print
'<tr class="nodrag nodrop">';
5315 if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER)) {
5316 print
'<td align="center" width="5"> </td>';
5318 print
'<td> </td>';
5319 print
'<td class="nowrap right"><input type="text" size="1" value="" name="all_progress">%</td>';
5320 print
'<td class="right"><input type="submit" class="button" name="all_percent" value="Modifier" /></td>';
5331 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.(($action !=
'editline') ?
'' :
'#line_'.
GETPOST(
'lineid',
'int')).
'" method="POST">
5332 <input type="hidden" name="token" value="' .
newToken().
'">
5333 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
5334 <input type="hidden" name="mode" value="">
5335 <input type="hidden" name="page_y" value="">
5336 <input type="hidden" name="id" value="' . $object->id.
'">
5339 if (!empty($conf->use_javascript_ajax) && $object->statut == 0) {
5340 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
5343 print
'<div class="div-table-responsive-no-min">';
5344 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
5347 if (!empty($object->lines)) {
5348 $ret = $object->printObjectLines($action, $mysoc, $soc, $lineid, 1);
5352 if ($object->statut == 0 && $usercancreate && $action !=
'valid' && $action !=
'editline') {
5353 if ($action !=
'editline' && $action !=
'selectlines') {
5356 $parameters = array();
5357 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
5358 if ($reshook < 0)
setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
5359 if (empty($reshook))
5360 $object->formAddObjectLine(1, $mysoc, $soc);
5374 if ($action !=
'prerelance' && $action !=
'presend' && $action !=
'valid' && $action !=
'editline') {
5375 print
'<div class="tabsAction">';
5377 $parameters = array();
5378 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
5379 if (empty($reshook)) {
5383 'class' =>
'classfortooltip'
5389 $ventilExportCompta = $object->getVentilExportCompta();
5391 if ($ventilExportCompta == 0) {
5392 if (!empty($conf->global->INVOICE_CAN_BE_EDITED_EVEN_IF_PAYMENT_DONE) || ($resteapayer ==
price2num($object->total_ttc,
'MT', 1) && empty($object->paye))) {
5393 if (!$objectidnext && $object->is_last_in_cycle()) {
5394 if ($usercanunvalidate) {
5395 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default', $_SERVER[
'PHP_SELF'].
'?facid='.$object->id.
'&action=modif&token='.
newToken(),
'',
true, $params);
5397 $params[
'attr'][
'title'] = $langs->trans(
'NotEnoughPermissions');
5398 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default', $_SERVER[
'PHP_SELF'].
'?facid='.$object->id.
'&action=modif&token='.
newToken(),
'',
false, $params);
5400 } elseif (!$object->is_last_in_cycle()) {
5401 $params[
'attr'][
'title'] = $langs->trans(
'NotLastInCycle');
5402 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default',
'#',
'',
false, $params);
5404 $params[
'attr'][
'title'] = $langs->trans(
'DisabledBecauseReplacedInvoice');
5405 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default',
'#',
'',
false, $params);
5409 $params[
'attr'][
'title'] = $langs->trans(
'DisabledBecauseDispatchedInBookkeeping');
5410 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default',
'#',
'',
false, $params);
5415 $result = $discount->fetch(0, $object->id);
5423 && ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && $usercancreate) || $usercanreopen)) {
5424 if ($object->close_code !=
'replaced' || (!$objectidnext)) {
5425 print
dolGetButtonAction($langs->trans(
'ReOpen'),
'',
'default', $_SERVER[
'PHP_SELF'].
'?facid='.$object->id.
'&action=reopen&token='.
newToken(),
'',
true, $params);
5427 $params[
'attr'][
'title'] = $langs->trans(
"DisabledBecauseReplacedInvoice");
5428 print
dolGetButtonAction($langs->trans(
'ReOpen'),
'',
'default',
'#',
'',
false, $params);
5433 if (!empty($conf->global->CONTRACT_CREATE_FROM_INVOICE)) {
5435 $langs->load(
"contracts");
5437 if ($usercancreatecontract) {
5438 print
'<a class="butAction" href="' . DOL_URL_ROOT .
'/contrat/card.php?action=create&origin=' . $object->element .
'&originid=' . $object->id .
'&socid=' . $object->socid .
'">' . $langs->trans(
'AddContract') .
'</a>';
5445 if ($usercanvalidate) {
5446 print
dolGetButtonAction($langs->trans(
'Validate'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?facid='.$object->id.
'&action=valid&token='.
newToken(),
'',
true, $params);
5451 if (empty($user->socid)) {
5453 if ($objectidnext) {
5454 print
'<span class="butActionRefused classfortooltip" title="'.$langs->trans(
"DisabledBecauseReplacedInvoice").
'">'.$langs->trans(
'SendMail').
'</span>';
5457 print
dolGetButtonAction($langs->trans(
'SendMail'),
'',
'default', $_SERVER[
'PHP_SELF'].
'?facid='.$object->id.
'&action=presend&mode=init#formmailbeforetitle',
'',
true, $params);
5459 print
dolGetButtonAction($langs->trans(
'SendMail'),
'',
'default',
'#',
'',
false, $params);
5467 if ($resteapayer > 0) {
5468 if ($usercancreatewithdrarequest) {
5469 if (!$objectidnext && $object->close_code !=
'replaced') {
5470 print
'<a class="butAction" href="'.DOL_URL_ROOT.
'/compta/facture/prelevement.php?facid='.$object->id.
'" title="'.
dol_escape_htmltag($langs->trans(
"MakeWithdrawRequest")).
'">'.$langs->trans(
"MakeWithdrawRequest").
'</a>';
5472 print
'<span class="butActionRefused classfortooltip" title="'.$langs->trans(
"DisabledBecauseReplacedInvoice").
'">'.$langs->trans(
'MakeWithdrawRequest').
'</span>';
5483 if (
isModEnabled(
'takepos') && $object->module_source ==
'takepos') {
5484 $langs->load(
"cashdesk");
5485 $receipt_url = DOL_URL_ROOT.
"/takepos/receipt.php";
5486 print
'<a target="_blank" rel="noopener noreferrer" class="butAction" href="'.$receipt_url.
'?facid='.((int) $object->id).
'">'.$langs->trans(
'POSTicket').
'</a>';
5491 if ($objectidnext) {
5492 print
'<span class="butActionRefused classfortooltip" title="'.$langs->trans(
"DisabledBecauseReplacedInvoice").
'">'.$langs->trans(
'DoPayment').
'</span>';
5496 $params[
'attr'][
'title'] = $langs->trans(
'DisabledBecauseRemainderToPayIsZero');
5497 print
dolGetButtonAction($langs->trans(
'DoPayment'),
'',
'default',
'#',
'',
false, $params);
5501 print
dolGetButtonAction($langs->trans(
'DoPayment'),
'',
'default', DOL_URL_ROOT.
'/compta/paiement.php?facid='.$object->id.
'&action=create&accountid='.$object->fk_account,
'',
true, $params);
5506 $sumofpayment = $totalpaid;
5507 $sumofpaymentall = $totalpaid + $totalcreditnotes + $totaldeposits;
5513 if ($resteapayer == 0) {
5514 print
'<span class="butActionRefused classfortooltip" title="'.$langs->trans(
"DisabledBecauseRemainderToPayIsZero").
'">'.$langs->trans(
'DoPaymentBack').
'</span>';
5516 print
'<a class="butAction" href="'.DOL_URL_ROOT.
'/compta/paiement.php?facid='.$object->id.
'&action=create&accountid='.$object->fk_account.
'">'.$langs->trans(
'DoPaymentBack').
'</a>';
5522 print
'<a class="butAction'.($conf->use_javascript_ajax ?
' reposition' :
'').
'" href="'.$_SERVER[
"PHP_SELF"].
'?facid='.$object->id.
'&action=converttoreduc">'.$langs->trans(
'ConvertExcessReceivedToReduc').
'</a>';
5526 && (!empty($conf->global->INVOICE_ALLOW_REUSE_OF_CREDIT_WHEN_PARTIALLY_REFUNDED) || $sumofpayment == 0)
5528 print
'<a class="butAction'.($conf->use_javascript_ajax ?
' reposition' :
'').
'" href="'.$_SERVER[
"PHP_SELF"].
'?facid='.$object->id.
'&action=converttoreduc" title="'.
dol_escape_htmltag($langs->trans(
"ConfirmConvertToReduc2")).
'">'.$langs->trans(
'ConvertToReduc').
'</a>';
5534 print
'<a class="butAction'.($conf->use_javascript_ajax ?
' reposition' :
'').
'" href="'.$_SERVER[
"PHP_SELF"].
'?facid='.$object->id.
'&action=converttoreduc">'.$langs->trans(
'ConvertToReduc').
'</a>';
5536 print
'<span class="butActionRefused" title="'.$langs->trans(
"AmountPaidMustMatchAmountOfDownPayment").
'">'.$langs->trans(
'ConvertToReduc').
'</span>';
5550 $params[
'attr'][
'title'] = $langs->trans(
'AmountPaidMustMatchAmountOfDownPayment');
5551 print
dolGetButtonAction($langs->trans(
'ClassifyPaid'),
'',
'default',
'#',
'',
false, $params);
5553 print
dolGetButtonAction($langs->trans(
'ClassifyPaid'),
'',
'default', $_SERVER[
'PHP_SELF'].
'?facid='.$object->id.
'&action=paid',
'',
true, $params);
5558 if ($object->statut ==
Facture::STATUS_VALIDATED && $object->paye == 0 && $resteapayer > 0 && (empty($conf->global->INVOICE_CAN_SET_PAID_EVEN_IF_PARTIALLY_PAID) || $resteapayer != $object->total_ttc) && $usercanissuepayment) {
5559 if ($totalpaid > 0 || $totalcreditnotes > 0) {
5561 print
'<a class="butAction'.($conf->use_javascript_ajax ?
' reposition' :
'').
'" href="'.$_SERVER[
'PHP_SELF'].
'?facid='.$object->id.
'&action=paid">'.$langs->trans(
'ClassifyPaidPartially').
'</a>';
5563 if (empty($conf->global->INVOICE_CAN_NEVER_BE_CANCELED)) {
5564 if ($objectidnext) {
5565 print
'<span class="butActionRefused classfortooltip" title="'.$langs->trans(
"DisabledBecauseReplacedInvoice").
'">'.$langs->trans(
'ClassifyCanceled').
'</span>';
5567 print
'<a class="butAction'.($conf->use_javascript_ajax ?
' reposition' :
'').
'" href="'.$_SERVER[
'PHP_SELF'].
'?facid='.$object->id.
'&action=canceled">'.$langs->trans(
'ClassifyCanceled').
'</a>';
5575 if (!$objectidnext) {
5576 print
'<a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?socid='.$object->socid.
'&fac_avoir='.$object->id.
'&action=create&type=2'.($object->fk_project > 0 ?
'&projectid='.$object->fk_project :
'').($object->entity > 0 ?
'&originentity='.$object->entity :
'').
'">'.$langs->trans(
"CreateCreditNote").
'</a>';
5583 && ($object->total_ttc - $totalpaid - $totalcreditnotes - $totaldeposits) > 0
5586 && $object->is_last_in_cycle()
5587 && $conf->global->INVOICE_USE_SITUATION_CREDIT_NOTE
5589 if ($usercanunvalidate) {
5590 print
'<a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?socid='.$object->socid.
'&fac_avoir='.$object->id.
'&invoiceAvoirWithLines=1&action=create&type=2'.($object->fk_project > 0 ?
'&projectid='.$object->fk_project :
'').
'">'.$langs->trans(
"CreateCreditNote").
'</a>';
5592 print
'<span class="butActionRefused classfortooltip" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
"CreateCreditNote").
'</span>';
5598 print
dolGetButtonAction($langs->trans(
'ToClone'),
'',
'default', $_SERVER[
'PHP_SELF'].
'?facid='.$object->id.
'&action=clone&object=invoice',
'',
true, $params);
5603 if (!$objectidnext && count($object->lines) > 0) {
5604 print
dolGetButtonAction($langs->trans(
'ChangeIntoRepeatableInvoice'),
'',
'default', DOL_URL_ROOT.
'/compta/facture/card-rec.php?facid='.$object->id.
'&action=create',
'',
true, $params);
5613 && $object->situation_counter > 1
5614 && $object->is_last_in_cycle()
5615 && $usercanunvalidate
5617 if (($object->total_ttc - $totalcreditnotes) == 0) {
5618 print
'<a id="butSituationOut" class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?facid='.$object->id.
'&action=situationout">'.$langs->trans(
"RemoveSituationFromCycle").
'</a>';
5620 print
'<a id="butSituationOutRefused" class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"DisabledBecauseNotEnouthCreditNote").
'" >'.$langs->trans(
"RemoveSituationFromCycle").
'</a>';
5625 if ($usercancreate && ($object->type == 5) && ($object->statut == 1 || $object->statut == 2)) {
5626 if ($object->is_last_in_cycle() && $object->situation_final != 1) {
5627 print
'<a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?action=create&type=5&origin=facture&originid='.$object->id.
'&socid='.$object->socid.
'" >'.$langs->trans(
'CreateNextSituationInvoice').
'</a>';
5628 } elseif (!$object->is_last_in_cycle()) {
5629 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"DisabledBecauseNotLastInCycle").
'">'.$langs->trans(
'CreateNextSituationInvoice').
'</a>';
5631 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"DisabledBecauseFinal").
'">'.$langs->trans(
'CreateNextSituationInvoice').
'</a>';
5636 $isErasable = $object->is_erasable();
5640 'class' =>
'classfortooltip'
5643 if ($usercandelete || ($usercancreate && $isErasable == 1)) {
5644 $enableDelete =
false;
5646 if ($isErasable == -4) {
5647 $params[
'attr'][
'title'] = $langs->trans(
'DisabledBecausePayments');
5648 } elseif ($isErasable == -3) {
5649 $params[
'attr'][
'title'] = $langs->trans(
'DisabledBecauseNotLastSituationInvoice');
5650 } elseif ($isErasable == -2) {
5651 $params[
'attr'][
'title'] = $langs->trans(
'DisabledBecauseNotLastInvoice');
5652 } elseif ($isErasable == -1) {
5653 $params[
'attr'][
'title'] = $langs->trans(
'DisabledBecauseDispatchedInBookkeeping');
5654 } elseif ($isErasable <= 0) {
5655 $params[
'attr'][
'title'] = $langs->trans(
'DisabledBecauseNotErasable');
5656 } elseif ($objectidnext) {
5657 $params[
'attr'][
'title'] = $langs->trans(
'DisabledBecauseReplacedInvoice');
5659 $deleteHref = $_SERVER[
"PHP_SELF"].
'?facid='.$object->id.
'&action=delete&token='.
newToken();
5660 $enableDelete =
true;
5662 print
dolGetButtonAction($langs->trans(
'Delete'),
'',
'delete', $deleteHref,
'', $enableDelete, $params);
5664 $params[
'attr'][
'title'] = $langs->trans(
'NotAllowed');
5665 print
dolGetButtonAction($langs->trans(
'Delete'),
'',
'delete',
'#',
'',
false, $params);
5672 if (
GETPOST(
'modelselected',
'alpha')) {
5673 $action =
'presend';
5675 if ($action !=
'prerelance' && $action !=
'presend') {
5676 print
'<div class="fichecenter"><div class="fichehalfleft">';
5677 print
'<a name="builddoc"></a>';
5681 $filedir = $conf->facture->multidir_output[$object->entity].
'/'.
dol_sanitizeFileName($object->ref);
5682 $urlsource = $_SERVER[
'PHP_SELF'].
'?facid='.$object->id;
5683 $genallowed = $usercanread;
5684 $delallowed = $usercancreate;
5686 print $formfile->showdocuments(
5706 'remove_file_comfirm'
5709 $somethingshown = $formfile->numoffiles;
5712 $linktoelem =
$form->showLinkToObjectBlock($object, null, array(
'invoice'));
5714 $compatibleImportElementsList =
false;
5718 $compatibleImportElementsList = array(
'commande',
'propal');
5720 $somethingshown =
$form->showLinkedObjectBlock($object, $linktoelem, $compatibleImportElementsList);
5724 $useonlinepayment = (!empty($conf->paypal->enabled) || !empty($conf->stripe->enabled) || !empty($conf->paybox->enabled));
5727 print
'<br><!-- Link to pay -->'.
"\n";
5728 require_once DOL_DOCUMENT_ROOT.
'/core/lib/payments.lib.php';
5729 print showOnlinePaymentUrl(
'invoice', $object->ref).
'<br>';
5732 print
'</div><div class="fichehalfright">';
5735 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
5737 $somethingshown =
$formactions->showactions($object,
'invoice', $socid, 1);
5739 print
'</div></div>';
5744 $modelmail =
'facture_send';
5745 $defaulttopic =
'SendBillRef';
5746 $diroutput = $conf->facture->multidir_output[$object->entity];
5747 $trackid =
'inv'.$object->id;
5749 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
if(!function_exists('dol_getprefix')) dol_include_once($relpath, $classname= '')
Make an include_once using default root and alternate root if it fails.
GETPOST($paramname, $check= 'alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
getDictionaryValue($tablename, $field, $id, $checkentity=false, $rowidfield= 'rowid')
Return the value of a filed into a dictionary for the record $id.
Class to manage notifications.
img_edit($titlealt= 'default', $float=0, $other= '')
Show logo editer/modifier fiche.
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.
const TYPE_STANDARD
Standard invoice.
if($cancel &&!$id) if($action== 'add'&&!$cancel) if($action== 'delete') if($id) $form
Actions.
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...
Class to manage products or services.
dol_now($mode= 'auto')
Return date for now.
Class to manage invoice templates.
calcul_price_total($qty, $pu, $remise_percent_ligne, $txtva, $uselocaltax1_rate, $uselocaltax2_rate, $remise_percent_global, $price_base_type, $info_bits, $type, $seller= '', $localtaxes_array= '', $progress=100, $multicurrency_tx=1, $pu_devise=0, $multicurrency_code= '')
Calculate totals (net, vat, ...) of a line.
Class to manage Dolibarr users.
const TYPE_REPLACEMENT
Replacement invoice.
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOCSRFCHECK')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for properties) With native = 0: P...
dol_stringtotime($string, $gm=1)
Convert a string date into a GM Timestamps date Warning: YYYY-MM-DDTHH:MM:SS+02:00 (RFC3339) is not s...
dolGetButtonAction($label, $html= '', $actionType= 'default', $url= '', $id= '', $userRight=1, $params=array())
Function dolGetButtonAction.
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...
const TYPE_PROFORMA
Proforma invoice (should not be used.
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...
get_localtax($vatrate, $local, $thirdparty_buyer="", $thirdparty_seller="", $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate, from a $thirdparty_buyer to a $thirdparty_seller Note: This function applies same rules than get_default_tva.
const TYPE_SITUATION
Situation invoice.
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.
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
Class to manage bank accounts.
img_warning($titlealt= 'default', $moreatt= '', $morecss= 'pictowarning')
Show warning logo.
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...
const TYPE_CREDIT_NOTE
Credit note invoice.
static getIdAndTxFromCode($dbs, $code, $date_document= '')
Get id and rate of currency from code.
setEventMessages($mesg, $mesgs, $style= 'mesgs', $messagekey= '')
Set event messages in dol_events session object.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form...
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...
Class to manage third parties objects (customers, suppliers, prospects...)
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin= '1', $morecss= 'hideonsmartphone', $textfordropdown= '')
Show information for admin users or standard users.
const STATUS_VALIDATED
Validated (need to be paid)
Class to manage projects.
load_fiche_titre($titre, $morehtmlright= '', $picto= 'generic', $pictoisfullpath=0, $id= '', $morecssontable= '', $morehtmlcenter= '')
Load a title with picto.
price2num($amount, $rounding= '', $option=0)
Function that return a number with universal decimal format (decimal separator is '...
Class to manage shipments.
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_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename= '', $restricttologhandler= '', $logcontext=null)
Write log message into outputs.
const STATUS_DRAFT
Draft status.
Class to manage payments of customer invoices.
dol_getdate($timestamp, $fast=false, $forcetimezone= '')
Return an array with locale date info.
accessforbidden($message= '', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program Calling this function terminate execution ...
Class to manage translations.
dol_sanitizeFileName($str, $newstr= '_', $unaccent=1)
Clean a string to use it as a file name.
const STATUS_CLOSED
Classified paid.
Class ProductCombination Used to represent a product combination.
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete= 'resolve', $idforemptyvalue= '-1')
Convert a html select field into an ajax combobox.
restrictedArea($user, $features, $objectid=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.
if(isModEnabled('facture')&&!empty($user->rights->facture->lire)) if((isModEnabled('fournisseur')&&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)&&$user->rights->fournisseur->facture->lire)||(isModEnabled('supplier_invoice')&&$user->rights->supplier_invoice->lire)) if(isModEnabled('don')&&!empty($user->rights->don->lire)) if(isModEnabled('tax')&&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture')&&isModEnabled('commande')&&$user->rights->commande->lire &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $resql
Social contributions to pay.
const STATUS_ABANDONED
Classified abandoned and no payment done.
const TYPE_DEPOSIT
Deposit invoice.
dol_get_fiche_head($links=array(), $active= '', $title= '', $notab=0, $picto= '', $pictoisfullpath=0, $morehtmlright= '', $morecss= '', $limittoshow=0, $moretabssuffix= '')
Show tabs of a record.
dol_print_date($time, $format= '', $tzoutput= 'auto', $outputlangs= '', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
dol_htmlcleanlastbr($stringtodecode)
This function remove all ending and br at end.
dol_print_error($db= '', $error= '', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
newToken()
Return the value of token currently saved into session with name 'newtoken'.
Class to manage absolute discounts.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
isModEnabled($module)
Is Dolibarr module enabled.
Class to manage a WYSIWYG editor.
Class to manage accounting accounts.
Class to manage invoices.
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.
img_delete($titlealt= 'default', $other= 'class="pictodelete"', $morecss= '')
Show delete logo.
$formconfirm
if ($action == 'delbookkeepingyear') {
getCountry($searchkey, $withcode= '', $dbtouse=0, $outputlangs= '', $entconv=1, $searchlabel= '')
Return country label, code or id from an id, code or label.
Class to manage invoice lines.
Class to manage warehouses.
facture_prepare_head($object)
Initialize the array of tabs for customer invoice.