44require
'../../main.inc.php';
45require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
46require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture-rec.class.php';
47require_once DOL_DOCUMENT_ROOT.
'/compta/bank/class/account.class.php';
48require_once DOL_DOCUMENT_ROOT.
'/compta/paiement/class/paiement.class.php';
49require_once DOL_DOCUMENT_ROOT.
'/core/modules/facture/modules_facture.php';
50require_once DOL_DOCUMENT_ROOT.
'/core/class/discount.class.php';
51require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
52require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
53require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
54require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmargin.class.php';
55require_once DOL_DOCUMENT_ROOT.
'/core/lib/invoice.lib.php';
56require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
57require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
58if (isModEnabled(
'order')) {
59 require_once DOL_DOCUMENT_ROOT.
'/commande/class/commande.class.php';
61if (isModEnabled(
'project')) {
62 require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
63 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
65require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
67if (isModEnabled(
'variants')) {
68 require_once DOL_DOCUMENT_ROOT.
'/variants/class/ProductCombination.class.php';
70if (isModEnabled(
'accounting')) {
71 require_once DOL_DOCUMENT_ROOT.
'/accountancy/class/accountingjournal.class.php';
75$langs->loadLangs(array(
'bills',
'companies',
'compta',
'products',
'banks',
'main',
'withdrawals'));
76if (isModEnabled(
'incoterm')) {
77 $langs->load(
'incoterm');
79if (isModEnabled(
'margin')) {
80 $langs->load(
'margins');
87$action =
GETPOST(
'action',
'aZ09');
88$confirm =
GETPOST(
'confirm',
'alpha');
89$cancel =
GETPOST(
'cancel',
'alpha');
90$backtopage =
GETPOST(
'backtopage',
'alpha');
91$backtopageforcancel =
GETPOST(
'backtopageforcancel',
'alpha');
94$search_ref =
GETPOST(
'sf_ref',
'alpha') ?
GETPOST(
'sf_ref',
'alpha') :
GETPOST(
'search_ref',
'alpha');
95$search_societe =
GETPOST(
'search_societe',
'alpha');
96$search_montant_ht =
GETPOST(
'search_montant_ht',
'alpha');
97$search_montant_ttc =
GETPOST(
'search_montant_ttc',
'alpha');
98$origin =
GETPOST(
'origin',
'alpha');
105$selectedLines =
GETPOST(
'toselect',
'array');
121$extrafields->fetch_name_optionals_label(
$object->table_element);
124if ($id > 0 || !empty($ref)) {
125 if ($action !=
'add') {
127 $fetch_situation =
false;
129 $fetch_situation =
true;
131 $ret =
$object->fetch($id, $ref,
'', 0, $fetch_situation);
132 if ($ret > 0 && isset(
$object->fk_project)) {
133 $ret =
$object->fetch_project();
139$hookmanager->initHooks(array(
'invoicecard',
'globalcard'));
142$usercanread = $user->hasRight(
"facture",
"lire");
143$usercancreate = $user->hasRight(
"facture",
"creer");
144$usercanissuepayment = $user->hasRight(
"facture",
"paiement");
145$usercandelete = $user->hasRight(
"facture",
"supprimer") || ($usercancreate && isset(
$object->status) &&
$object->status == $object::STATUS_DRAFT);
146$usercancreatecontract = $user->hasRight(
"contrat",
"creer");
149$usercanvalidate = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'facture',
'invoice_advance',
'validate')));
151$usercanreopen = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'facture',
'invoice_advance',
'reopen')));
153 $usercanreopen =
false;
155$usercanunvalidate = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !empty($usercancreate)) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'facture',
'invoice_advance',
'unvalidate')));
156$usermustrespectpricemin = ((
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'produit',
'ignore_price_min_advance')) || !
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS'));
159$usercancreatemargin = $user->hasRight(
'margins',
'creer');
160$usercanreadallmargin = $user->hasRight(
'margins',
'liretous');
161$usercancreatewithdrarequest = $user->hasRight(
'prelevement',
'bons',
'creer');
163$permissionnote = $usercancreate;
164$permissiondellink = $usercancreate;
165$permissiontoedit = $usercancreate;
166$permissiontoadd = $usercancreate;
169$retainedWarrantyInvoiceAvailableType = array();
171 $retainedWarrantyInvoiceAvailableType = explode(
'+',
getDolGlobalString(
'INVOICE_USE_RETAINED_WARRANTY'));
176 $socid = $user->socid;
187$parameters = array(
'socid' => $socid);
188$reshook = $hookmanager->executeHooks(
'doActions', $parameters,
$object, $action);
193if (empty($reshook)) {
194 $backurlforlist = DOL_URL_ROOT.
'/compta/facture/list.php';
196 if (empty($backtopage) || ($cancel && empty($id))) {
197 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
198 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
199 $backtopage = $backurlforlist;
201 $backtopage = DOL_URL_ROOT.
'/compta/facture/card.php?id='.((!empty($id) && $id > 0) ? $id :
'__ID__');
207 if (!empty($backtopageforcancel)) {
208 header(
"Location: ".$backtopageforcancel);
210 } elseif (!empty($backtopage)) {
211 header(
"Location: ".$backtopage);
217 include DOL_DOCUMENT_ROOT.
'/core/actions_setnotes.inc.php';
219 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
221 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
224 if ($action ==
'confirm_clone' && $confirm ==
'yes' && $permissiontoadd) {
226 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'IdThirdParty')),
null,
'errors');
229 '@phan-var-force Facture $objectutil';
232 $objectutil->socid = $socid;
233 $result = $objectutil->createFromClone($user, $id);
235 $warningMsgLineList = array();
237 foreach ($objectutil->lines as $line) {
238 if (!is_object($line->product)) {
239 $line->fetch_product();
241 if (is_object($line->product) && $line->product->id > 0) {
242 if (empty($line->product->status)) {
243 $warningMsgLineList[$line->id] = $langs->trans(
'WarningLineProductNotToSell', $line->product->ref);
247 if (!empty($warningMsgLineList)) {
251 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
'?facid=' . $result);
254 $langs->load(
"errors");
259 } elseif ($action ==
'reopen' && $usercanreopen) {
263 $result =
$object->setUnpaid($user);
265 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?facid='.$id);
271 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes') {
276 $idwarehouse =
GETPOST(
'idwarehouse');
278 $qualified_for_stock_change = 0;
280 $qualified_for_stock_change =
$object->hasProductsOrServices(2);
282 $qualified_for_stock_change =
$object->hasProductsOrServices(1);
285 $isErasable =
$object->is_erasable();
287 if (($usercandelete && $isErasable > 0)
288 || ($usercancreate && $isErasable == 1)) {
289 $result =
$object->delete($user, 0, $idwarehouse);
291 header(
'Location: '.DOL_URL_ROOT.
'/compta/facture/list.php?restore_lastsearch_values=1');
298 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $usercancreate) {
308 $outputlangs = $langs;
314 $newlang =
$object->thirdparty->default_lang;
316 if (!empty($newlang)) {
318 $outputlangs->setDefaultLang($newlang);
319 $outputlangs->load(
'products');
323 $result =
$object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
326 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?facid='.$id);
333 } elseif ($action ==
'unlinkdiscount' && $usercancreate) {
336 $result = $discount->fetch(
GETPOSTINT(
"discountid"));
337 $discount->unlink_invoice();
338 } elseif ($action ==
'valid' && $usercancreate) {
342 if ((preg_match(
'/^[\(]?PROV/i',
$object->ref) || empty(
$object->ref)) &&
349 $last_of_type =
$object->willBeLastOfSameType(
true);
350 if (empty(
$object->date_validation) && !$last_of_type[0]) {
360 setEventMessages($langs->trans(
"ErrorInvoiceAvoirMustBeNegative"),
null,
'errors');
369 setEventMessages($langs->trans(
"ErrorInvoiceOfThisTypeMustBePositive"),
null,
'errors');
378 $array_of_total_ht_per_vat_rate = array();
379 $array_of_total_ht_devise_per_vat_rate = array();
380 foreach (
$object->lines as $line) {
382 $vat_src_code_for_line =
'';
383 if (empty($array_of_total_ht_per_vat_rate[$line->tva_tx.
'_'.$vat_src_code_for_line])) {
384 $array_of_total_ht_per_vat_rate[$line->tva_tx.
'_'.$vat_src_code_for_line] = 0;
386 if (empty($array_of_total_ht_devise_per_vat_rate[$line->tva_tx.
'_'.$vat_src_code_for_line])) {
387 $array_of_total_ht_devise_per_vat_rate[$line->tva_tx.
'_'.$vat_src_code_for_line] = 0;
389 $array_of_total_ht_per_vat_rate[$line->tva_tx.
'_'.$vat_src_code_for_line] += $line->total_ht;
390 $array_of_total_ht_devise_per_vat_rate[$line->tva_tx.
'_'.$vat_src_code_for_line] += $line->multicurrency_total_ht;
394 foreach ($array_of_total_ht_per_vat_rate as $vatrate => $tmpvalue) {
395 $tmp_total_ht =
price2num($array_of_total_ht_per_vat_rate[$vatrate]);
396 $tmp_total_ht_devise =
price2num($array_of_total_ht_devise_per_vat_rate[$vatrate]);
398 if (($tmp_total_ht < 0 || $tmp_total_ht_devise < 0) && !
getDolGlobalString(
'FACTURE_ENABLE_NEGATIVE_LINES')) {
399 if (
$object->type == $object::TYPE_DEPOSIT) {
400 $langs->load(
"errors");
402 setEventMessages($langs->trans(
"ErrorLinesCantBeNegativeOnDeposits"),
null,
'errors');
406 $tmpvatratetoshow = explode(
'_', $vatrate);
407 $tmpvatratetoshow[0] = round((
float) $tmpvatratetoshow[0], 2);
409 if ($tmpvatratetoshow[0] != 0) {
410 $langs->load(
"errors");
411 setEventMessages($langs->trans(
"ErrorLinesCantBeNegativeForOneVATRate", $tmpvatratetoshow[0]),
null,
'errors');
419 } elseif ($action ==
'classin' && $usercancreate) {
422 } elseif ($action ==
'setmode' && $usercancreate) {
428 } elseif ($action ==
'setretainedwarrantyconditions' && $usercancreate) {
430 $object->retained_warranty_fk_cond_reglement = 0;
431 $result =
$object->setRetainedWarrantyPaymentTerms(
GETPOSTINT(
'retained_warranty_fk_cond_reglement'));
436 $old_rw_date_lim_reglement =
$object->retained_warranty_date_limit;
437 $new_rw_date_lim_reglement =
$object->calculate_date_lim_reglement(
$object->retained_warranty_fk_cond_reglement);
438 if ($new_rw_date_lim_reglement > $old_rw_date_lim_reglement) {
439 $object->retained_warranty_date_limit = $new_rw_date_lim_reglement;
444 $result =
$object->update($user);
448 } elseif ($action ==
'setretainedwarranty' && $usercancreate) {
454 } elseif ($action ==
'setretainedwarrantydatelimit' && $usercancreate) {
456 $result =
$object->setRetainedWarrantyDateLimit(
GETPOSTFLOAT(
'retained_warranty_date_limit'));
460 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
461 $result =
$object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
462 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
464 } elseif ($action ==
'setinvoicedate' && $usercancreate) {
466 $old_date_lim_reglement =
$object->date_lim_reglement;
468 if (empty($newdate)) {
469 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
470 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?facid='.$id.
'&action=editinvoicedate&token='.
newToken());
475 setEventMessages($langs->trans(
"WarningInvoiceDateInFuture"),
null,
'warnings');
477 setEventMessages($langs->trans(
"WarningInvoiceDateTooFarInFuture"),
null,
'warnings');
482 $new_date_lim_reglement =
$object->calculate_date_lim_reglement();
483 if ($new_date_lim_reglement) {
484 $object->date_lim_reglement = $new_date_lim_reglement;
489 $result =
$object->update($user);
492 $action =
'editinvoicedate';
494 } elseif ($action ==
'setdate_pointoftax' && $usercancreate) {
499 $object->date_pointoftax = $date_pointoftax;
500 $result =
$object->update($user);
504 } elseif ($action ==
'setconditions' && $usercancreate) {
506 $object->cond_reglement_code = 0;
507 $object->cond_reglement_id = 0;
522 $old_date_lim_reglement =
$object->date_lim_reglement;
523 $new_date_lim_reglement =
$object->calculate_date_lim_reglement();
524 if ($new_date_lim_reglement) {
525 $object->date_lim_reglement = $new_date_lim_reglement;
530 $result =
$object->update($user);
542 } elseif ($action ==
'setpaymentterm' && $usercancreate) {
546 $object->date_lim_reglement =
$object->calculate_date_lim_reglement();
547 setEventMessages($langs->trans(
"DatePaymentTermCantBeLowerThanObjectDate"),
null,
'warnings');
549 $result =
$object->update($user);
553 } elseif ($action ==
'setrevenuestamp' && $usercancreate) {
556 $result =
$object->update($user);
563 $outputlangs = $langs;
566 $newlang =
GETPOST(
'lang_id',
'aZ09');
569 $newlang =
$object->thirdparty->default_lang;
571 if (!empty($newlang)) {
573 $outputlangs->setDefaultLang($newlang);
574 $outputlangs->load(
'products');
579 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
585 } elseif ($action ==
'set_incoterms' && isModEnabled(
'incoterm') && $usercancreate) {
587 } elseif ($action ==
'setbankaccount' && $usercancreate) {
589 } elseif ($action ==
'setremisepercent' && $usercancreate) {
592 } elseif ($action ==
"setabsolutediscount" && $usercancreate) {
610 if (
GETPOSTINT(
"remise_id_for_payment") > 0) {
611 require_once DOL_DOCUMENT_ROOT.
'/core/class/discount.class.php';
613 $discount->fetch(
GETPOSTINT(
"remise_id_for_payment"));
617 $remaintopay =
$object->getRemainToPay(0);
621 setEventMessages($langs->trans(
"ErrorDiscountLargerThanRemainToPaySplitItBefore"),
null,
'errors');
625 $result = $discount->link_to_invoice(0, $id);
633 $newremaintopay =
$object->getRemainToPay(0);
634 if ($newremaintopay == 0) {
647 $outputlangs = $langs;
650 $newlang =
GETPOST(
'lang_id',
'aZ09');
654 $newlang =
$object->thirdparty->default_lang;
656 if (!empty($newlang)) {
658 $outputlangs->setDefaultLang($newlang);
662 $result =
$object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
667 } elseif ($action ==
'setref' && $usercancreate) {
669 $object->setValueFrom(
'ref',
GETPOST(
'ref'),
'', 0,
'',
'', $user,
'BILL_MODIFY');
670 } elseif ($action ==
'setref_client' && $usercancreate) {
673 } elseif ($action ==
'confirm_valid' && $confirm ==
'yes' && $usercanvalidate) {
682 $qualified_for_stock_change = 0;
684 $qualified_for_stock_change =
$object->hasProductsOrServices(2);
686 $qualified_for_stock_change =
$object->hasProductsOrServices(1);
689 if ($qualified_for_stock_change) {
690 if (!$idwarehouse || $idwarehouse == - 1) {
692 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
"Warehouse")),
null,
'errors');
699 $result =
$object->validate($user,
'', $idwarehouse);
703 $outputlangs = $langs;
706 $newlang =
GETPOST(
'lang_id',
'aZ09');
709 $newlang =
$object->thirdparty->default_lang;
711 if (!empty($newlang)) {
713 $outputlangs->setDefaultLang($newlang);
714 $outputlangs->load(
'products');
720 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
733 } elseif ($action ==
'confirm_modif' && $usercanunvalidate) {
742 $qualified_for_stock_change = 0;
744 $qualified_for_stock_change =
$object->hasProductsOrServices(2);
746 $qualified_for_stock_change =
$object->hasProductsOrServices(1);
749 if ($qualified_for_stock_change) {
750 if (!$idwarehouse || $idwarehouse == - 1) {
752 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
"Warehouse")),
null,
'errors');
761 $sql =
'SELECT pf.amount';
762 $sql .=
' FROM '.MAIN_DB_PREFIX.
'paiement_facture as pf';
763 $sql .=
' WHERE pf.fk_facture = '.((int)
$object->id);
765 $result = $db->query($sql);
768 $num = $db->num_rows($result);
771 $objp = $db->fetch_object($result);
772 $totalpaid += $objp->amount;
779 $resteapayer =
$object->total_ttc - $totalpaid;
782 $ventilExportCompta =
$object->getVentilExportCompta();
785 if ($ventilExportCompta == 0) {
787 $result =
$object->setDraft($user, $idwarehouse);
794 $outputlangs = $langs;
797 $newlang =
GETPOST(
'lang_id',
'aZ09');
800 $newlang =
$object->thirdparty->default_lang;
802 if (!empty($newlang)) {
804 $outputlangs->setDefaultLang($newlang);
805 $outputlangs->load(
'products');
810 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
815 } elseif ($action ==
'confirm_paid' && $confirm ==
'yes' && $usercanissuepayment) {
818 $result =
$object->setPaid($user);
822 } elseif ($action ==
'confirm_paid_partially' && $confirm ==
'yes' && $usercanissuepayment) {
825 $close_code =
GETPOST(
"close_code",
'restricthtml');
826 $close_note =
GETPOST(
"close_note",
'restricthtml');
828 $result =
$object->setPaid($user, $close_code, $close_note);
833 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Reason")),
null,
'errors');
835 } elseif ($action ==
'confirm_canceled' && $confirm ==
'yes' && $usercancreate) {
838 $close_code =
GETPOST(
"close_code",
'restricthtml');
839 $close_note =
GETPOST(
"close_note",
'restricthtml');
841 $result =
$object->setCanceled($user, $close_code, $close_note);
846 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Reason")),
null,
'errors');
848 } elseif ($action ==
'confirm_converttoreduc' && $confirm ==
'yes' && $usercancreate) {
856 $result = $discountcheck->fetch(0,
$object->id);
869 $amount_ht = $amount_tva = $amount_ttc = array();
870 $multicurrency_amount_ht = $multicurrency_amount_tva = $multicurrency_amount_ttc = array();
874 foreach (
$object->lines as $line) {
875 if ($line->product_type < 9 && $line->total_ht != 0) {
876 $keyforvatrate = $line->tva_tx.($line->vat_src_code ?
' ('.$line->vat_src_code.
')' :
'');
878 if (!isset($amount_ht[$keyforvatrate])) {
879 $amount_ht[$keyforvatrate]=0;
881 $amount_ht[$keyforvatrate] += $line->total_ht;
882 if (!isset($amount_tva[$keyforvatrate])) {
883 $amount_tva[$keyforvatrate]=0;
885 $amount_tva[$keyforvatrate] += $line->total_tva;
886 if (!isset($amount_ttc[$keyforvatrate])) {
887 $amount_ttc[$keyforvatrate]=0;
889 $amount_ttc[$keyforvatrate] += $line->total_ttc;
890 if (!isset($multicurrency_amount_ht[$keyforvatrate])) {
891 $multicurrency_amount_ht[$keyforvatrate]=0;
893 $multicurrency_amount_ht[$keyforvatrate] += $line->multicurrency_total_ht;
894 if (!isset($multicurrency_amount_tva[$keyforvatrate])) {
895 $multicurrency_amount_tva[$keyforvatrate]=0;
897 $multicurrency_amount_tva[$keyforvatrate] += $line->multicurrency_total_tva;
898 if (!isset($multicurrency_amount_ttc[$keyforvatrate])) {
899 $multicurrency_amount_ttc[$keyforvatrate]=0;
901 $multicurrency_amount_ttc[$keyforvatrate] += $line->multicurrency_total_ttc;
905 '@phan-var-force array<string,float> $amount_ht
906 @phan-var-force array<string,float> $amount_tva
907 @phan-var-force array<string,float> $amount_ttc
908 @phan-var-force array<string,float> $multicurrency_amount_ht
909 @phan-var-force array<string,float> $multicurrency_amount_tva
910 @phan-var-force array<string,float> $multicurrency_amount_ttc';
914 $alreadypaid =
$object->getSommePaiement();
915 if ($alreadypaid && abs($alreadypaid) < abs(
$object->total_ttc)) {
916 $ratio = abs((
$object->total_ttc - $alreadypaid) /
$object->total_ttc);
917 foreach ($amount_ht as $vatrate => $val) {
918 $amount_ht[$vatrate] =
price2num($amount_ht[$vatrate] * $ratio,
'MU');
919 $amount_tva[$vatrate] =
price2num($amount_tva[$vatrate] * $ratio,
'MU');
920 $amount_ttc[$vatrate] =
price2num($amount_ttc[$vatrate] * $ratio,
'MU');
921 $multicurrency_amount_ht[$vatrate] =
price2num($multicurrency_amount_ht[$vatrate] * $ratio,
'MU');
922 $multicurrency_amount_tva[$vatrate] =
price2num($multicurrency_amount_tva[$vatrate] * $ratio,
'MU');
923 $multicurrency_amount_ttc[$vatrate] =
price2num($multicurrency_amount_ttc[$vatrate] * $ratio,
'MU');
932 $discount->description =
'(CREDIT_NOTE)';
934 $discount->description =
'(DEPOSIT)';
936 $discount->description =
'(EXCESS RECEIVED)';
938 setEventMessages($langs->trans(
'CantConvertToReducAnInvoiceOfThisType'),
null,
'errors');
940 $discount->fk_soc =
$object->socid;
941 $discount->socid =
$object->socid;
942 $discount->fk_facture_source =
$object->id;
950 $sql =
'SELECT SUM(pf.amount) as total_paiements';
951 $sql .=
' FROM '.MAIN_DB_PREFIX.
'paiement_facture as pf, '.MAIN_DB_PREFIX.
'paiement as p';
952 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_paiement as c ON p.fk_paiement = c.id';
953 $sql .=
' WHERE pf.fk_facture = '.((int)
$object->id);
954 $sql .=
' AND pf.fk_paiement = p.rowid';
955 $sql .=
' AND p.entity IN ('.getEntity(
'invoice').
')';
956 $resql = $db->query($sql);
961 $res = $db->fetch_object($resql);
962 $total_paiements = $res->total_paiements;
965 $total_creditnote_and_deposit = 0;
966 $sql =
"SELECT re.rowid, re.amount_ht, re.amount_tva, re.amount_ttc,";
967 $sql .=
" re.description, re.fk_facture_source";
968 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe_remise_except as re";
969 $sql .=
" WHERE fk_facture = ".((int)
$object->id);
970 $resql = $db->query($sql);
971 if (!empty($resql)) {
972 while ($obj = $db->fetch_object($resql)) {
973 $total_creditnote_and_deposit += $obj->amount_ttc;
979 $discount->amount_ht = $discount->amount_ttc = $total_paiements + $total_creditnote_and_deposit -
$object->total_ttc;
980 $discount->amount_tva = 0;
981 $discount->tva_tx = 0;
982 $discount->vat_src_code =
'';
984 $result = $discount->create($user);
990 foreach ($amount_ht as $tva_tx => $xxx) {
991 $discount->amount_ht = abs((
float) $amount_ht[$tva_tx]);
992 $discount->amount_tva = abs((
float) $amount_tva[$tva_tx]);
993 $discount->amount_ttc = abs((
float) $amount_ttc[$tva_tx]);
994 $discount->multicurrency_amount_ht = abs((
float) $multicurrency_amount_ht[$tva_tx]);
995 $discount->multicurrency_amount_tva = abs((
float) $multicurrency_amount_tva[$tva_tx]);
996 $discount->multicurrency_amount_ttc = abs((
float) $multicurrency_amount_ttc[$tva_tx]);
1001 if (preg_match(
'/\((.*)\)/', $tva_tx, $reg)) {
1002 $vat_src_code = $reg[1];
1003 $tva_tx = preg_replace(
'/\s*\(.*\)/',
'', $tva_tx);
1006 $discount->tva_tx = abs((
float) $tva_tx);
1007 $discount->vat_src_code = $vat_src_code;
1009 $result = $discount->create($user);
1017 if (empty($error)) {
1020 $result =
$object->setPaid($user);
1035 } elseif ($action ==
'confirm_delete_paiement' && $confirm ==
'yes' && $usercanissuepayment) {
1040 $result = $paiement->fetch(
GETPOSTINT(
'paiement_id'));
1042 $result = $paiement->delete($user);
1044 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
1052 } elseif ($action ==
'add' && $usercancreate) {
1059 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1065 $originentity =
GETPOST(
'originentity');
1067 $ret = $extrafields->setOptionalsFromPost(
null,
$object);
1077 if (empty($dateinvoice)) {
1079 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
1089 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ReplaceInvoice")),
null,
'errors');
1099 $object->date_pointoftax = $date_pointoftax;
1100 $object->note_public = trim(
GETPOST(
'note_public',
'restricthtml'));
1101 $object->note_private = trim(
GETPOST(
'note_private',
'restricthtml'));
1112 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
1113 $object->multicurrency_code =
GETPOST(
'multicurrency_code',
'alpha');
1120 $id =
$object->createFromCurrent($user);
1130 if (!($sourceinvoice > 0) && !
getDolGlobalString(
'INVOICE_CREDIT_NOTE_STANDALONE')) {
1132 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"CorrectInvoice")),
null,
'errors');
1136 if (empty($dateinvoice)) {
1138 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
1148 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"InvoiceSubtype")),
null,
'errors');
1153 if (!empty($originentity)) {
1154 $object->entity = $originentity;
1160 $object->date_pointoftax = $date_pointoftax;
1161 $object->note_public = trim(
GETPOST(
'note_public',
'restricthtml'));
1162 $object->note_private = trim(
GETPOST(
'note_private',
'restricthtml'));
1167 $object->cond_reglement_id = 0;
1173 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
1174 $object->multicurrency_code =
GETPOST(
'multicurrency_code',
'alpha');
1178 $object->fk_facture_source = $sourceinvoice > 0 ? $sourceinvoice :
'';
1181 $facture_source =
new Facture($db);
1182 if ($facture_source->fetch(
$object->fk_facture_source) > 0) {
1184 $object->situation_counter = $facture_source->situation_counter;
1185 $object->situation_cycle_ref = $facture_source->situation_cycle_ref;
1186 $facture_source->fetchPreviousNextSituationInvoice();
1196 if (
$object->copy_linked_contact($facture_source,
'internal') < 0) {
1198 } elseif ($facture_source->socid ==
$object->socid) {
1200 if (
$object->copy_linked_contact($facture_source,
'external') < 0) {
1211 if (
GETPOSTINT(
'invoiceAvoirWithLines') == 1 && $id > 0) {
1212 if (!empty($facture_source->lines)) {
1213 $fk_parent_line = 0;
1215 foreach ($facture_source->lines as $line) {
1217 if (method_exists($line,
'fetch_optionals')) {
1219 $line->fetch_optionals();
1223 if (($line->product_type != 9 && empty($line->fk_parent_line)) || $line->product_type == 9) {
1224 $fk_parent_line = 0;
1229 $source_fk_prev_id = $line->fk_prev_id;
1230 $line->fk_prev_id = $line->id;
1232 if (!empty($facture_source->tab_previous_situation_invoice)) {
1235 $tab_jumped_credit_notes = array();
1236 $lineIndex = count($facture_source->tab_previous_situation_invoice) - 1;
1237 $searchPreviousInvoice =
true;
1238 while ($searchPreviousInvoice) {
1239 if ($facture_source->tab_previous_situation_invoice[$lineIndex]->type ==
Facture::TYPE_SITUATION || $lineIndex < 1) {
1240 $searchPreviousInvoice =
false;
1244 $tab_jumped_credit_notes[$lineIndex] = $facture_source->tab_previous_situation_invoice[$lineIndex]->id;
1250 $maxPrevSituationPercent = 0;
1251 foreach ($facture_source->tab_previous_situation_invoice[$lineIndex]->lines as $prevLine) {
1252 if ($prevLine->id == $source_fk_prev_id) {
1253 $maxPrevSituationPercent = max($maxPrevSituationPercent, $prevLine->situation_percent);
1256 $line->total_ht -= $prevLine->total_ht;
1257 $line->total_tva -= $prevLine->total_tva;
1258 $line->total_ttc -= $prevLine->total_ttc;
1259 $line->total_localtax1 -= $prevLine->total_localtax1;
1260 $line->total_localtax2 -= $prevLine->total_localtax2;
1262 $line->multicurrency_subprice -= $prevLine->multicurrency_subprice;
1263 $line->multicurrency_total_ht -= $prevLine->multicurrency_total_ht;
1264 $line->multicurrency_total_tva -= $prevLine->multicurrency_total_tva;
1265 $line->multicurrency_total_ttc -= $prevLine->multicurrency_total_ttc;
1270 $line->situation_percent = $maxPrevSituationPercent - $line->situation_percent;
1275 $maxPrevSituationPercent = 0;
1276 foreach ($tab_jumped_credit_notes as $index => $creditnoteid) {
1277 foreach ($facture_source->tab_previous_situation_invoice[$index]->lines as $prevLine) {
1278 if ($prevLine->fk_prev_id == $source_fk_prev_id) {
1279 $maxPrevSituationPercent = $prevLine->situation_percent;
1281 $line->total_ht -= $prevLine->total_ht;
1282 $line->total_tva -= $prevLine->total_tva;
1283 $line->total_ttc -= $prevLine->total_ttc;
1284 $line->total_localtax1 -= $prevLine->total_localtax1;
1285 $line->total_localtax2 -= $prevLine->total_localtax2;
1287 $line->multicurrency_subprice -= $prevLine->multicurrency_subprice;
1288 $line->multicurrency_total_ht -= $prevLine->multicurrency_total_ht;
1289 $line->multicurrency_total_tva -= $prevLine->multicurrency_total_tva;
1290 $line->multicurrency_total_ttc -= $prevLine->multicurrency_total_ttc;
1296 $line->situation_percent += $maxPrevSituationPercent;
1302 $line->fk_facture =
$object->id;
1303 $line->fk_parent_line = $fk_parent_line;
1305 $line->subprice = -$line->subprice;
1307 $line->total_ht = -$line->total_ht;
1308 $line->total_tva = -$line->total_tva;
1309 $line->total_ttc = -$line->total_ttc;
1310 $line->total_localtax1 = -$line->total_localtax1;
1311 $line->total_localtax2 = -$line->total_localtax2;
1313 $line->multicurrency_subprice = -$line->multicurrency_subprice;
1314 $line->multicurrency_total_ht = -$line->multicurrency_total_ht;
1315 $line->multicurrency_total_tva = -$line->multicurrency_total_tva;
1316 $line->multicurrency_total_ttc = -$line->multicurrency_total_ttc;
1318 $line->context[
'createcreditnotefrominvoice'] = 1;
1319 $result = $line->insert(0, 1);
1324 if ($result > 0 && $line->product_type == 9) {
1325 $fk_parent_line = $result;
1333 if (
GETPOSTINT(
'invoiceAvoirWithPaymentRestAmount') == 1 && $id > 0) {
1334 if ($facture_source->fetch(
$object->fk_facture_source) > 0) {
1335 $totalpaid = $facture_source->getSommePaiement();
1336 $totalcreditnotes = $facture_source->getSumCreditNotesUsed();
1337 $totaldeposits = $facture_source->getSumDepositsUsed();
1338 $remain_to_pay = abs($facture_source->total_ttc - $totalpaid - $totalcreditnotes - $totaldeposits);
1340 if (
getDolGlobalString(
'INVOICE_VAT_TO_USE_ON_CREDIT_NOTE_WHEN_GENERATED_FROM_REMAIN_TO_PAY') ==
'default') {
1341 if ((empty(
$object->thirdparty) || !is_object(
$object->thirdparty) || get_class(
$object->thirdparty) !=
'Societe')) {
1344 if (!empty(
$object->thirdparty) && is_object(
$object->thirdparty) && get_class(
$object->thirdparty) ==
'Societe') {
1349 } elseif ((
float)
getDolGlobalString(
'INVOICE_VAT_TO_USE_ON_CREDIT_NOTE_WHEN_GENERATED_FROM_REMAIN_TO_PAY') > 0) {
1350 $tva_tx = (float)
getDolGlobalString(
'INVOICE_VAT_TO_USE_ON_CREDIT_NOTE_WHEN_GENERATED_FROM_REMAIN_TO_PAY');
1355 $object->addline($langs->trans(
'invoiceAvoirLineWithPaymentRestAmount'), $remain_to_pay, 1, $tva_tx, 0, 0, 0, 0,
'',
'', 0, 0, 0,
'TTC');
1360 if (!empty(
$object->fk_facture_source) && $id > 0) {
1361 $facture_source->fetch(
$object->fk_facture_source);
1362 $facture_source->fetchObjectLinked();
1364 if (!empty($facture_source->linkedObjectsIds)) {
1365 foreach ($facture_source->linkedObjectsIds as $sourcetype => $TIds) {
1366 $object->add_object_linked($sourcetype, current($TIds));
1375 if (empty($dateinvoice)) {
1377 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
1388 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"InvoiceSubtype")),
null,
'errors');
1398 $object->date_pointoftax = $date_pointoftax;
1399 $object->note_public = trim(
GETPOST(
'note_public',
'restricthtml'));
1400 $object->note_private = trim(
GETPOST(
'note_private',
'restricthtml'));
1412 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
1413 $object->multicurrency_code =
GETPOST(
'multicurrency_code',
'alpha');
1425 $typeamount =
GETPOST(
'typedeposit',
'aZ09');
1426 $valuestandardinvoice =
price2num(str_replace(
'%',
'',
GETPOST(
'valuestandardinvoice',
'alpha')),
'MU');
1427 $valuedeposit =
price2num(str_replace(
'%',
'',
GETPOST(
'valuedeposit',
'alpha')),
'MU');
1431 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Customer")),
null,
'errors');
1435 if (empty($dateinvoice)) {
1437 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
1447 if ($valuestandardinvoice < 0 || $valuestandardinvoice > 100) {
1448 setEventMessages($langs->trans(
"ErrorAPercentIsRequired"),
null,
'errors');
1453 if ($typeamount && !empty($origin) && !empty($originid)) {
1454 if ($typeamount ==
'amount' && $valuedeposit <= 0) {
1455 setEventMessages($langs->trans(
"ErrorAnAmountWithoutTaxIsRequired"),
null,
'errors');
1459 if ($typeamount ==
'variable' && $valuedeposit <= 0) {
1460 setEventMessages($langs->trans(
"ErrorAPercentIsRequired"),
null,
'errors');
1464 if ($typeamount ==
'variablealllines' && $valuedeposit <= 0) {
1465 setEventMessages($langs->trans(
"ErrorAPercentIsRequired"),
null,
'errors');
1475 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"InvoiceSubtype")),
null,
'errors');
1485 $object->date_pointoftax = $date_pointoftax;
1486 $object->note_public = trim(
GETPOST(
'note_public',
'restricthtml'));
1487 $object->note_private = trim(
GETPOST(
'note_private',
'restricthtml'));
1499 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
1500 $object->multicurrency_code =
GETPOST(
'multicurrency_code',
'alpha');
1504 $object->situation_counter = 1;
1509 if (in_array(
$object->type, $retainedWarrantyInvoiceAvailableType)) {
1511 $object->retained_warranty_fk_cond_reglement =
GETPOSTINT(
'retained_warranty_fk_cond_reglement');
1513 $object->retained_warranty = 0;
1514 $object->retained_warranty_fk_cond_reglement = 0;
1517 $retained_warranty_date_limit =
GETPOST(
'retained_warranty_date_limit');
1518 if (!empty($retained_warranty_date_limit) &&
dol_stringtotime($retained_warranty_date_limit)) {
1521 $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);
1526 if (!empty($origin) && !empty($originid)) {
1529 $element = $subelement = $origin;
1530 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
1531 $element = $regs[1];
1532 $subelement = $regs[2];
1536 if ($element ==
'order') {
1537 $element = $subelement =
'commande';
1539 if ($element ==
'propal') {
1540 $element =
'comm/propal';
1541 $subelement =
'propal';
1543 if ($element ==
'contract') {
1544 $element = $subelement =
'contrat';
1546 if ($element ==
'inter') {
1547 $element = $subelement =
'ficheinter';
1549 if ($element ==
'shipping') {
1550 $element = $subelement =
'expedition';
1554 $object->origin_type = $origin;
1555 $object->origin_id = $originid;
1560 if (
$object->origin ==
'shipping') {
1561 require_once DOL_DOCUMENT_ROOT.
'/expedition/class/expedition.class.php';
1563 $exp->fetch(
$object->origin_id);
1564 $exp->fetchObjectLinked();
1565 if (is_array($exp->linkedObjectsIds[
'commande']) && count($exp->linkedObjectsIds[
'commande']) > 0) {
1566 foreach ($exp->linkedObjectsIds[
'commande'] as $key => $value) {
1567 $object->linked_objects[
'commande'] = $value;
1573 $object->linked_objects = array_merge(
$object->linked_objects,
GETPOST(
'other_linked_objects',
'array:int'));
1581 $classname = ucfirst($subelement);
1582 $srcobject =
new $classname($db);
1583 '@phan-var-force CommonObject $srcobject';
1585 dol_syslog(
"Try to find source object origin=".
$object->origin.
" originid=".
$object->origin_id.
" to add lines or deposit lines");
1586 $result = $srcobject->fetch(
$object->origin_id);
1591 $amountdeposit = array();
1593 if ($typeamount ==
'amount') {
1594 $amount = (float) $valuedeposit;
1596 $amount = $srcobject->total_ttc * ((float) $valuedeposit / 100);
1599 $TTotalByTva = array();
1600 foreach ($srcobject->lines as &$line) {
1601 if (!empty($line->special_code)) {
1604 $TTotalByTva[$line->tva_tx] += $line->total_ttc;
1606 '@phan-var-force array<string,float> $TTotalByTva';
1608 $amount_ttc_diff = 0.;
1609 foreach ($TTotalByTva as $tva => &$total) {
1610 $coef = $total / $srcobject->total_ttc;
1611 $am = $amount * $coef;
1612 $amount_ttc_diff += $am;
1613 $amountdeposit[$tva] += $am / (1 + (float) $tva / 100);
1616 if ($typeamount ==
'amount') {
1617 $amountdeposit[0] = $valuedeposit;
1618 } elseif ($typeamount ==
'variable') {
1621 $lines = $srcobject->lines;
1622 $numlines = count($lines);
1623 for ($i = 0; $i < $numlines; $i++) {
1625 if (empty($lines[$i]->qty)) {
1628 if (!empty($lines[$i]->special_code)) {
1632 $totalamount += $lines[$i]->total_ht;
1633 $tva_tx = $lines[$i]->tva_tx;
1634 $amountdeposit[$tva_tx] += ($lines[$i]->total_ht * (float) $valuedeposit) / 100;
1638 if ($totalamount == 0) {
1639 $amountdeposit[0] = 0;
1647 $amount_ttc_diff = $amountdeposit[0];
1650 foreach ($amountdeposit as $tva => $amount) {
1651 if (empty($amount)) {
1656 'amount' =>
'FixAmount',
1657 'variable' =>
'VarAmount'
1659 $descline =
'(DEPOSIT)';
1661 if ($typeamount ==
'amount') {
1662 $descline .=
' ('.price($valuedeposit, 0, $langs, 0, - 1, - 1, (!empty(
$object->multicurrency_code) ?
$object->multicurrency_code : $conf->currency)).
')';
1663 } elseif ($typeamount ==
'variable') {
1664 $descline .=
' ('.$valuedeposit.
'%)';
1667 $descline .=
' - '.$srcobject->ref;
1680 $lines[$i]->info_bits,
1686 $lines[$i]->special_code,
1699 (!empty($conf->global->MAIN_DEPOSIT_MULTI_TVA) ? 0 : 1)
1703 $diff =
$object->total_ttc - $amount_ttc_diff;
1707 $subprice_diff =
$object->lines[0]->subprice - $diff / (1 +
$object->lines[0]->tva_tx / 100);
1708 $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);
1715 $lines = $srcobject->lines;
1716 if (empty($lines) && method_exists($srcobject,
'fetch_lines')) {
1717 $srcobject->fetch_lines();
1718 $lines = $srcobject->lines;
1723 if (is_array($lines)) {
1724 foreach ($lines as $line) {
1726 $line->qty =
price2num((
float) $line->qty * (
float) $valuestandardinvoice / 100,
'MS');
1732 if (is_array($lines)) {
1733 foreach ($lines as $line) {
1735 $line->qty =
price2num((
float) $line->qty * (
float) $valuedeposit / 100,
'MS');
1740 $fk_parent_line = 0;
1741 $num = count($lines);
1743 for ($i = 0; $i < $num; $i++) {
1744 if (!in_array($lines[$i]->
id, $selectedLines)) {
1749 if ($srcobject->element ==
'shipping' &&
getDolGlobalString(
'SHIPMENT_GETS_ALL_ORDER_PRODUCTS') && $lines[$i]->qty == 0) {
1753 if (!isset($conf->global->CONTRACT_EXCLUDE_SERVICES_STATUS_FOR_INVOICE)) {
1754 $conf->global->CONTRACT_EXCLUDE_SERVICES_STATUS_FOR_INVOICE =
'5';
1756 if ($srcobject->element ==
'contrat' && in_array($lines[$i]->
statut, explode(
',',
getDolGlobalString(
'CONTRACT_EXCLUDE_SERVICES_STATUS_FOR_INVOICE')))) {
1760 $label = (!empty($lines[$i]->label) ? $lines[$i]->label :
'');
1761 $desc = (!empty($lines[$i]->desc) ? $lines[$i]->desc :
'');
1763 if (
$object->situation_counter == 1) {
1764 $lines[$i]->situation_percent = 0;
1767 if ($lines[$i]->subprice < 0 && !
getDolGlobalString(
'INVOICE_KEEP_DISCOUNT_LINES_AS_IN_ORIGIN')) {
1770 $desc = $label ? $label : $langs->trans(
'Discount');
1774 $discount->fk_soc =
$object->socid;
1775 $discount->socid =
$object->socid;
1776 $discount->amount_ht = abs($lines[$i]->total_ht);
1777 $discount->amount_tva = abs($lines[$i]->total_tva);
1778 $discount->amount_ttc = abs($lines[$i]->total_ttc);
1779 $discount->tva_tx = $lines[$i]->tva_tx;
1780 $discount->fk_user = $user->id;
1781 $discount->description = $desc;
1782 $discount->multicurrency_subprice = abs($lines[$i]->multicurrency_subprice);
1783 $discount->multicurrency_amount_ht = abs($lines[$i]->multicurrency_total_ht);
1784 $discount->multicurrency_amount_tva = abs($lines[$i]->multicurrency_total_tva);
1785 $discount->multicurrency_amount_ttc = abs($lines[$i]->multicurrency_total_ttc);
1787 $discountid = $discount->create($user);
1788 if ($discountid > 0) {
1789 $result =
$object->insert_discount($discountid);
1801 $date_start =
false;
1802 if (isset($lines[$i]->date_debut_prevue)) {
1803 $date_start = $lines[$i]->date_debut_prevue;
1805 if (isset($lines[$i]->date_debut_reel)) {
1806 $date_start = $lines[$i]->date_debut_reel;
1808 if (isset($lines[$i]->date_start)) {
1809 $date_start = $lines[$i]->date_start;
1814 if (isset($lines[$i]->date_fin_prevue)) {
1815 $date_end = $lines[$i]->date_fin_prevue;
1817 if (isset($lines[$i]->date_fin_reel)) {
1818 $date_end = $lines[$i]->date_fin_reel;
1820 if (isset($lines[$i]->date_end)) {
1821 $date_end = $lines[$i]->date_end;
1825 if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) {
1826 $fk_parent_line = 0;
1830 if (method_exists($lines[$i],
'fetch_optionals')) {
1831 $lines[$i]->fetch_optionals();
1832 $array_options = $lines[$i]->array_options;
1835 $tva_tx = $lines[$i]->tva_tx;
1836 if (!empty($lines[$i]->vat_src_code) && !preg_match(
'/\(/', $tva_tx)) {
1837 $tva_tx .=
' ('.$lines[$i]->vat_src_code.
')';
1847 $lines[$i]->subprice,
1852 $lines[$i]->fk_product,
1853 $lines[$i]->remise_percent,
1857 $lines[$i]->info_bits,
1858 isset($lines[$i]->fk_remise_except) ? $lines[$i]->fk_remise_except : null,
1863 $lines[$i]->special_code,
1867 isset($lines[$i]->fk_fournprice) ? $lines[$i]->fk_fournprice : null,
1871 $lines[$i]->situation_percent ?? 100,
1872 $lines[$i]->fk_prev_id ?? 0,
1873 $lines[$i]->fk_unit,
1888 if ($result > 0 && $lines[$i]->product_type == 9) {
1889 $fk_parent_line = $result;
1899 $object->update_price(1,
'auto', 0, $mysoc);
1927 $parameters = array(
'origin_type' =>
$object->origin_type,
'origin_id' =>
$object->origin_id,
'objFrom' => $srcobject);
1928 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters,
$object, $action);
1941 for ($i = 1; $i <= $NBLINES; $i++) {
1947 $result =
$object->addline($product->description, $product->price,
price2num(
GETPOST(
'qty'.$i),
'MS'), $product->tva_tx, $product->localtax1_tx, $product->localtax2_tx,
GETPOSTINT(
'idprod'.$i),
price2num(
GETPOST(
'remise_percent'.$i),
'', 2), $startday, $endday, 0, 0, 0, $product->price_base_type, $product->price_ttc, $product->type, -1, 0,
'', 0, 0, 0, 0,
'', array(), 100, 0, $product->fk_unit, 0,
'', 1);
1951 $object->update_price(1,
'auto', 0, $mysoc);
1958 if (empty($dateinvoice)) {
1960 $mesg = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date"));
1970 $mesg = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"InvoiceSituation"));
1980 if (!empty($origin) && !empty($originid)) {
1981 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
1984 $object->origin_type = $origin;
1985 $object->origin_id = $originid;
1989 $retained_warranty =
GETPOSTINT(
'retained_warranty');
1990 if (
price2num($retained_warranty) > 0) {
1994 if (
GETPOSTINT(
'retained_warranty_fk_cond_reglement') > 0) {
1995 $object->retained_warranty_fk_cond_reglement =
GETPOSTINT(
'retained_warranty_fk_cond_reglement');
1998 $retained_warranty_date_limit =
GETPOST(
'retained_warranty_date_limit');
1999 if (!empty($retained_warranty_date_limit) && $db->jdate($retained_warranty_date_limit)) {
2000 $object->retained_warranty_date_limit = $db->jdate($retained_warranty_date_limit);
2002 $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);
2005 foreach (
$object->lines as $i => &$line) {
2006 $line->fk_prev_id = $line->id;
2007 $line->fetch_optionals();
2009 $line->situation_percent = 0;
2011 $line->situation_percent = $line->get_prev_progress(
$object->id);
2015 $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, array(), $line->situation_percent);
2016 $line->total_ht = $tabprice[0];
2017 $line->total_tva = $tabprice[1];
2018 $line->total_ttc = $tabprice[2];
2019 $line->total_localtax1 = $tabprice[9];
2020 $line->total_localtax2 = $tabprice[10];
2021 $line->multicurrency_total_ht = $tabprice[16];
2022 $line->multicurrency_total_tva = $tabprice[17];
2023 $line->multicurrency_total_ttc = $tabprice[18];
2026 if ($line->fk_remise_except) {
2028 $result = $discount->fetch($line->fk_remise_except);
2031 if ($discount->fk_facture_line > 0) {
2032 $line->fk_remise_except = 0;
2041 $object->date_pointoftax = $date_pointoftax;
2042 $object->note_public = trim(
GETPOST(
'note_public',
'restricthtml'));
2058 $object->situation_counter += 1;
2060 $id =
$object->createFromCurrent($user);
2064 $nextSituationInvoice =
new Facture($db);
2065 $nextSituationInvoice->fetch($id);
2068 $extrafields->fetch_name_optionals_label($nextSituationInvoice->table_element);
2069 $ret = $extrafields->setOptionalsFromPost(
null, $nextSituationInvoice);
2071 $nextSituationInvoice->insertExtraFields();
2075 $parameters = array(
'origin_type' =>
$object->origin_type,
'origin_id' =>
$object->origin_id);
2076 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $nextSituationInvoice, $action);
2087 if ($id > 0 && !$error) {
2092 $outputlangs = $langs;
2095 $newlang =
GETPOST(
'lang_id',
'aZ09');
2098 $newlang =
$object->thirdparty->default_lang;
2100 if (!empty($newlang)) {
2101 $outputlangs =
new Translate(
"", $conf);
2102 $outputlangs->setDefaultLang($newlang);
2103 $outputlangs->load(
'products');
2108 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
2114 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?facid='.$id);
2119 $_GET[
"origin"] = $_POST[
"origin"];
2120 $_GET[
"originid"] = $_POST[
"originid"];
2123 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'aZ09') && (
GETPOST(
'alldate_start',
'alpha') ||
GETPOST(
'alldate_end',
'alpha')) && $usercancreate) {
2127 foreach (
$object->lines as $line) {
2128 if ($line->product_type == 1) {
2129 $result =
$object->updateline($line->id, $line->desc, $line->subprice, $line->qty, $line->remise_percent, $alldate_start, $alldate_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);
2132 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'vatforalllines',
'alpha') !==
'' && $usercancreate) {
2134 $vat_rate = (
GETPOST(
'vatforalllines') ?
GETPOST(
'vatforalllines') : 0);
2135 $vat_rate = str_replace(
'*',
'', $vat_rate);
2138 foreach (
$object->lines as $line) {
2139 $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);
2141 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'remiseforalllines',
'alpha') !==
'' && $usercancreate) {
2143 $remise_percent = (
GETPOST(
'remiseforalllines') ?
GETPOST(
'remiseforalllines') : 0);
2144 $remise_percent = str_replace(
'*',
'', $remise_percent);
2145 foreach (
$object->lines as $line) {
2146 $tvatx= $line->tva_tx;
2147 if (!empty($line->vat_src_code)) {
2148 $tvatx .=
' ('.$line->vat_src_code.
')';
2150 $result =
$object->updateline($line->id, $line->desc, $line->subprice, $line->qty, $remise_percent, $line->date_start, $line->date_end, $tvatx, $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);
2152 } elseif ($action ==
'addline' && !
GETPOST(
'submitforalllines',
'alpha') && !
GETPOST(
'submitforallmargins',
'alpha') && $usercancreate) {
2153 $langs->load(
'errors');
2158 $product_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
2161 $price_ht_devise =
'';
2163 $price_ttc_devise =
'';
2165 $price_min_ttc =
'';
2167 if (
GETPOST(
'price_ht') !==
'') {
2170 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
2173 if (
GETPOST(
'price_ttc') !==
'') {
2176 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
2177 $price_ttc_devise =
price2num(
GETPOST(
'multicurrency_price_ttc'),
'CU', 2);
2180 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'aZ09');
2181 if ($prod_entry_mode ==
'free') {
2187 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
2192 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
2195 $remise_percent = (GETPOSTISSET(
'remise_percent'.$predef) ?
price2num(
GETPOST(
'remise_percent'.$predef,
'alpha'),
'', 2) : 0);
2196 if (empty($remise_percent)) {
2197 $remise_percent = 0;
2201 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
2202 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
2204 if (is_array($extralabelsline)) {
2206 foreach ($extralabelsline as $key => $value) {
2207 unset($_POST[
"options_".$key.$predef]);
2211 if ((empty($idprod) || $idprod < 0) && ($price_ht < 0) && ($qty < 0)) {
2212 setEventMessages($langs->trans(
'ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv(
'UnitPriceHT'), $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
2215 if (!$prod_entry_mode) {
2217 setEventMessages($langs->trans(
'ErrorChooseBetweenFreeEntryOrPredefinedProduct'),
null,
'errors');
2221 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
2222 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Type')),
null,
'errors');
2225 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && (($price_ht < 0 && !
getDolGlobalString(
'FACTURE_ENABLE_NEGATIVE_LINES')) || $price_ht ==
'') && (($price_ht_devise < 0 && !
getDolGlobalString(
'FACTURE_ENABLE_NEGATIVE_LINES')) || $price_ht_devise ==
'') && $price_ttc ===
'' && $price_ttc_devise ===
'' &&
$object->type !=
Facture::TYPE_CREDIT_NOTE) {
2226 if (($price_ht < 0 || $price_ttc < 0) && !
getDolGlobalString(
'FACTURE_ENABLE_NEGATIVE_LINES')) {
2227 $langs->load(
"errors");
2228 if (
$object->type == $object::TYPE_DEPOSIT) {
2230 setEventMessages($langs->trans(
"ErrorLinesCantBeNegativeOnDeposits"),
null,
'errors');
2232 setEventMessages($langs->trans(
"ErrorFieldCantBeNegativeOnInvoice", $langs->transnoentitiesnoconv(
"UnitPriceHT"), $langs->transnoentitiesnoconv(
"CustomerAbsoluteDiscountShort")),
null,
'errors');
2236 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
2241 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
2244 if ($prod_entry_mode ==
'free' && empty($idprod) && empty($product_desc)) {
2245 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Description')),
null,
'errors');
2249 $langs->load(
"errors");
2250 setEventMessages($langs->trans(
'ErrorQtyForCustomerInvoiceCantBeNegative'),
null,
'errors');
2254 if (!$error && isModEnabled(
'variants') && $prod_entry_mode !=
'free') {
2255 if ($combinations =
GETPOST(
'combinations',
'array')) {
2259 if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
2260 $idprod = $res->fk_product_child;
2262 setEventMessages($langs->trans(
'ErrorProductCombinationNotFound'),
null,
'errors');
2268 if (!$error && ($qty >= 0) && (!empty($product_desc) || (!empty($idprod) && $idprod > 0))) {
2274 $ret =
$object->fetch_thirdparty();
2279 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
2290 if (!empty($idprod) && $idprod > 0) {
2292 $prod->fetch($idprod);
2294 $label = ((
GETPOST(
'product_label') &&
GETPOST(
'product_label') != $prod->label) ?
GETPOST(
'product_label') :
'');
2299 $datapriceofproduct = $prod->getSellPrice($mysoc,
$object->thirdparty, $pqp);
2301 $pu_ht = $datapriceofproduct[
'pu_ht'];
2302 $pu_ttc = $datapriceofproduct[
'pu_ttc'];
2303 $price_min = $datapriceofproduct[
'price_min'];
2304 $price_min_ttc = (isset($datapriceofproduct[
'price_min_ttc'])) ? $datapriceofproduct[
'price_min_ttc'] : null;
2305 $price_base_type = empty($datapriceofproduct[
'price_base_type']) ?
'HT' : $datapriceofproduct[
'price_base_type'];
2309 $tmpvat = (float)
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
2310 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string) $prod->tva_tx));
2314 if (!empty($price_ht) || $price_ht ===
'0') {
2316 $pu_ttc =
price2num((
float) $pu_ht * (1 + ($tmpvat / 100)),
'MU');
2317 } elseif (!empty($price_ht_devise) || $price_ht_devise ===
'0') {
2318 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
2321 } elseif (!empty($price_ttc) || $price_ttc ===
'0') {
2323 $pu_ht =
price2num((
float) $pu_ttc / (1 + ($tmpvat / 100)),
'MU');
2324 } elseif ($tmpvat != $tmpprodvat) {
2326 if ($price_base_type !=
'HT') {
2327 $pu_ht =
price2num($pu_ttc / (1 + ($tmpvat / 100)),
'MU');
2329 $pu_ttc =
price2num($pu_ht * (1 + ($tmpvat / 100)),
'MU');
2337 $outputlangs = $langs;
2339 if (empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
2340 $newlang =
GETPOST(
'lang_id',
'aZ09');
2342 if (empty($newlang)) {
2343 $newlang =
$object->thirdparty->default_lang;
2345 if (!empty($newlang)) {
2346 $outputlangs =
new Translate(
"", $conf);
2347 $outputlangs->setDefaultLang($newlang);
2348 $outputlangs->load(
'products');
2351 $desc = (!empty($prod->multilangs [$outputlangs->defaultlang] [
"description"])) ? $prod->multilangs [$outputlangs->defaultlang] [
"description"] : $prod->
description;
2353 $desc = $prod->description;
2362 $desc = $product_desc;
2368 if (!
getDolGlobalString(
'MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE') && (!empty($prod->customcode) || !empty($prod->country_code))) {
2372 $outputlangs = $langs;
2374 if (empty($newlang) &&
GETPOST(
'lang_id',
'alpha')) {
2375 $newlang =
GETPOST(
'lang_id',
'alpha');
2377 if (empty($newlang)) {
2378 $newlang =
$object->thirdparty->default_lang;
2380 if (!empty($newlang)) {
2381 $outputlangs =
new Translate(
"", $conf);
2382 $outputlangs->setDefaultLang($newlang);
2383 $outputlangs->load(
'products');
2385 if (!empty($prod->customcode)) {
2386 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
2388 if (!empty($prod->customcode) && !empty($prod->country_code)) {
2391 if (!empty($prod->country_code)) {
2392 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code, 0, $db, $outputlangs, 0);
2395 if (!empty($prod->customcode)) {
2396 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
2398 if (!empty($prod->customcode) && !empty($prod->country_code)) {
2401 if (!empty($prod->country_code)) {
2402 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code, 0, $db, $langs, 0);
2409 $type = $prod->type;
2410 $fk_unit = $prod->fk_unit;
2412 if (!empty($price_ht)) {
2417 if (!empty($price_ttc)) {
2422 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
2423 $tva_tx = str_replace(
'*',
'', $tva_tx);
2424 if (empty($tva_tx)) {
2427 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
2428 $desc = $product_desc;
2430 $fk_unit =
GETPOST(
'units',
'alpha');
2432 if ($pu_ttc && !$pu_ht) {
2433 $price_base_type =
'TTC';
2447 $pu_ht_devise =
price2num($price_ht_devise,
'', 2);
2448 $pu_ttc_devise =
price2num($price_ttc_devise,
'', 2);
2451 $pu_equivalent = $pu_ht;
2452 $pu_equivalent_ttc = $pu_ttc;
2454 $currency_tx =
$object->multicurrency_tx;
2458 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'') {
2459 $pu_equivalent = (float) $pu_ht_devise * $currency_tx;
2461 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'') {
2462 $pu_equivalent_ttc = (float) $pu_ttc_devise * $currency_tx;
2482 $price2num_remise_percent =
price2num($remise_percent);
2483 $price2num_price_min =
price2num($price_min);
2484 $price2num_price_min_ttc =
price2num($price_min_ttc);
2485 if (empty($price2num_pu_ht)) {
2486 $price2num_pu_ht = 0;
2488 if (empty($price2num_remise_percent)) {
2489 $price2num_remise_percent = 0;
2491 if (empty($price2num_price_min)) {
2492 $price2num_price_min = 0;
2494 if (empty($price2num_price_min_ttc)) {
2495 $price2num_price_min_ttc = 0;
2500 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - $remise_percent / 100)) < (
float)
price2num($price_min)) && $price_base_type ==
'HT') {
2501 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
2504 } elseif ($pu_equivalent_ttc && $price_min_ttc && (((
float)
price2num($pu_equivalent_ttc) * (1 - $remise_percent / 100)) < (
float)
price2num($price_min_ttc)) && $price_base_type ==
'TTC') {
2505 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
2512 '@phan-var-force array<string,mixed> $lines';
2514 if (isModEnabled(
'productbatch') && !empty($lines[$i]->detail_batch) && is_array($lines[$i]->detail_batch) &&
getDolGlobalString(
'INVOICE_INCUDE_DETAILS_OF_LOTS_SERIALS')) {
2515 $langs->load(
'productbatch');
2516 foreach ($lines[$i]->detail_batch as $batchline) {
2517 $desc .=
' '.$langs->trans(
'Batch').
' '.$batchline->batch.
' '.$langs->trans(
'printQty', $batchline->qty).
' ';
2522 $result =
$object->addline($desc, $pu_ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, $idprod, $remise_percent, $date_start, $date_end, 0, $info_bits, 0, $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'), 0, $fk_unit, $pu_ht_devise);
2527 $outputlangs = $langs;
2530 $newlang =
GETPOST(
'lang_id',
'aZ09');
2533 $newlang =
$object->thirdparty->default_lang;
2535 if (!empty($newlang)) {
2536 $outputlangs =
new Translate(
"", $conf);
2537 $outputlangs->setDefaultLang($newlang);
2538 $outputlangs->load(
'products');
2543 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
2549 unset($_POST[
'prod_entry_mode']);
2550 unset($_POST[
'qty']);
2551 unset($_POST[
'type']);
2552 unset($_POST[
'remise_percent']);
2553 unset($_POST[
'price_ht']);
2554 unset($_POST[
'multicurrency_price_ht']);
2555 unset($_POST[
'price_ttc']);
2556 unset($_POST[
'tva_tx']);
2557 unset($_POST[
'product_ref']);
2558 unset($_POST[
'product_label']);
2559 unset($_POST[
'product_desc']);
2560 unset($_POST[
'fournprice']);
2561 unset($_POST[
'buying_price']);
2562 unset($_POST[
'np_marginRate']);
2563 unset($_POST[
'np_markRate']);
2564 unset($_POST[
'dp_desc']);
2565 unset($_POST[
'idprod']);
2566 unset($_POST[
'units']);
2567 unset($_POST[
'date_starthour']);
2568 unset($_POST[
'date_startmin']);
2569 unset($_POST[
'date_startsec']);
2570 unset($_POST[
'date_startday']);
2571 unset($_POST[
'date_startmonth']);
2572 unset($_POST[
'date_startyear']);
2573 unset($_POST[
'date_endhour']);
2574 unset($_POST[
'date_endmin']);
2575 unset($_POST[
'date_endsec']);
2576 unset($_POST[
'date_endday']);
2577 unset($_POST[
'date_endmonth']);
2578 unset($_POST[
'date_endyear']);
2579 unset($_POST[
'situations']);
2580 unset($_POST[
'progress']);
2588 } elseif ($action ==
'updateline' && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
2589 if (!
$object->fetch($id) > 0) {
2601 $vat_rate = str_replace(
'*',
'', $vat_rate);
2613 if (preg_match(
'/\*/', $vat_rate)) {
2618 $vat_rate = str_replace(
'*',
'', $vat_rate);
2627 $pu_equivalent = $pu_ht;
2628 $pu_equivalent_ttc = $pu_ttc;
2630 $currency_tx =
$object->multicurrency_tx;
2634 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'') {
2635 $pu_equivalent = (float) $pu_ht_devise * (
float) $currency_tx;
2637 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'') {
2638 $pu_equivalent_ttc = (float) $pu_ttc_devise * (
float) $currency_tx;
2653 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
2654 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
2656 if (is_array($extralabelsline)) {
2658 foreach ($extralabelsline as $key => $value) {
2659 unset($_POST[
"options_".$key]);
2665 if ($special_code == 3) {
2671 $percent = $line->get_prev_progress(
$object->id);
2676 if ($progress >= 0) {
2677 $mesg = $langs->trans(
"CantBeNullOrPositive");
2681 } elseif ($progress < $line->situation_percent) {
2682 $mesg = $langs->trans(
"CantBeLessThanMinPercent");
2686 } elseif ($progress < $percent) {
2687 $mesg =
'<div class="warning">'.$langs->trans(
"CantBeLessThanMinPercent").
'</div>';
2698 if (!empty($productid)) {
2700 $product->fetch($productid);
2702 $type = $product->type;
2704 $price_min = $product->price_min;
2706 $price_min = $product->multiprices_min[
$object->thirdparty->price_level];
2708 $price_min_ttc = $product->price_min_ttc;
2710 $price_min_ttc = $product->multiprices_min_ttc[
$object->thirdparty->price_level];
2717 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - (
float) $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
2718 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
2721 $action =
'editline';
2722 } elseif ($pu_equivalent_ttc && $price_min_ttc && (((
float)
price2num($pu_equivalent_ttc) * (1 - (
float) $remise_percent / 100)) < (
float)
price2num($price_min_ttc)) && $price_base_type ==
'TTC') {
2723 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
2726 $action =
'editline';
2731 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
2735 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
2740 $langs->load(
"errors");
2741 setEventMessages($langs->trans(
'ErrorQtyForCustomerInvoiceCantBeNegative'),
null,
'errors');
2745 if (($pu_ht < 0 || $pu_ttc < 0) && !
getDolGlobalString(
'FACTURE_ENABLE_NEGATIVE_LINES')) {
2746 $langs->load(
"errors");
2747 if (
$object->type == $object::TYPE_DEPOSIT) {
2749 setEventMessages($langs->trans(
"ErrorLinesCantBeNegativeOnDeposits"),
null,
'errors');
2751 setEventMessages($langs->trans(
"ErrorFieldCantBeNegativeOnInvoice", $langs->transnoentitiesnoconv(
"UnitPriceHT"), $langs->transnoentitiesnoconv(
"CustomerAbsoluteDiscountShort")),
null,
'errors');
2755 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
2762 $previousprogress = $line->get_allprev_progress($line->fk_facture);
2765 if ($fullprogress < $previousprogress) {
2767 setEventMessages($langs->trans(
'CantBeLessThanMinPercent'),
null,
'errors');
2771 if ($fullprogress > 100) {
2772 $fullprogress = 100;
2774 $addprogress = $fullprogress - $previousprogress;
2781 if (empty($usercancreatemargin)) {
2782 foreach (
$object->lines as &$line) {
2784 $fournprice = $line->fk_fournprice;
2785 $buyingprice = $line->pa_ht;
2791 $price_base_type =
'HT';
2793 if (empty($pu) && !empty($pu_ttc)) {
2795 $price_base_type =
'TTC';
2798 $result =
$object->updateline(
2827 $outputlangs = $langs;
2830 $newlang =
GETPOST(
'lang_id',
'aZ09');
2833 $newlang =
$object->thirdparty->default_lang;
2835 if (!empty($newlang)) {
2836 $outputlangs =
new Translate(
"", $conf);
2837 $outputlangs->setDefaultLang($newlang);
2838 $outputlangs->load(
'products');
2842 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
2845 unset($_POST[
'qty']);
2846 unset($_POST[
'type']);
2847 unset($_POST[
'productid']);
2848 unset($_POST[
'remise_percent']);
2849 unset($_POST[
'price_ht']);
2850 unset($_POST[
'multicurrency_price_ht']);
2851 unset($_POST[
'price_ttc']);
2852 unset($_POST[
'tva_tx']);
2853 unset($_POST[
'product_ref']);
2854 unset($_POST[
'product_label']);
2855 unset($_POST[
'product_desc']);
2856 unset($_POST[
'fournprice']);
2857 unset($_POST[
'buying_price']);
2858 unset($_POST[
'np_marginRate']);
2859 unset($_POST[
'np_markRate']);
2860 unset($_POST[
'dp_desc']);
2861 unset($_POST[
'idprod']);
2862 unset($_POST[
'units']);
2863 unset($_POST[
'date_starthour']);
2864 unset($_POST[
'date_startmin']);
2865 unset($_POST[
'date_startsec']);
2866 unset($_POST[
'date_startday']);
2867 unset($_POST[
'date_startmonth']);
2868 unset($_POST[
'date_startyear']);
2869 unset($_POST[
'date_endhour']);
2870 unset($_POST[
'date_endmin']);
2871 unset($_POST[
'date_endsec']);
2872 unset($_POST[
'date_endday']);
2873 unset($_POST[
'date_endmonth']);
2874 unset($_POST[
'date_endyear']);
2875 unset($_POST[
'situations']);
2876 unset($_POST[
'progress']);
2881 } elseif ($action ==
'updatealllines' && $usercancreate &&
GETPOST(
'all_percent') == $langs->trans(
'Modifier')) {
2882 if (!
$object->fetch($id) > 0) {
2885 if (
GETPOST(
'all_progress') !=
"") {
2887 foreach (
$object->lines as $line) {
2889 $percent = $line->get_allprev_progress(
$object->id);
2891 $percent = $line->get_prev_progress(
$object->id);
2893 if ((
float) $all_progress < (
float) $percent) {
2894 $mesg = $langs->trans(
"Line").
' '.$line->rang.
' : '.$langs->trans(
"CantBeLessThanMinPercent");
2903 } elseif ($action ==
'updateline' && $usercancreate && !$cancel) {
2904 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?facid='.$id);
2906 } elseif ($action ==
'confirm_situationout' && $confirm ==
'yes' && $usercancreate) {
2908 $object->fetch($id,
'',
'', 0,
true);
2914 &&
$object->is_last_in_cycle()
2915 && $usercanunvalidate
2918 $newCycle =
$object->newCycle();
2919 if ($newCycle > 1) {
2921 $lastCycle =
$object->situation_cycle_ref;
2922 $lastSituationCounter =
$object->situation_counter;
2923 $linkedCreditNotesList = array();
2925 if (count(
$object->tab_next_situation_invoice) > 0) {
2926 foreach (
$object->tab_next_situation_invoice as $next_invoice) {
2928 && $next_invoice->situation_counter ==
$object->situation_counter
2929 && $next_invoice->fk_facture_source ==
$object->id
2931 $linkedCreditNotesList[] = $next_invoice->id;
2936 $object->situation_cycle_ref = $newCycle;
2937 $object->situation_counter = 1;
2939 if (
$object->update($user) > 0) {
2941 if (count($linkedCreditNotesList) > 0) {
2943 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'facture';
2944 $sql .=
' SET situation_cycle_ref = '.((int) $newCycle);
2945 $sql .=
' , situation_final=0';
2946 $sql .=
' , situation_counter='.((int)
$object->situation_counter);
2947 $sql .=
' WHERE rowid IN ('.$db->sanitize(implode(
',', $linkedCreditNotesList)).
')';
2949 $resql = $db->query($sql);
2955 foreach (
$object->lines as $line) {
2957 if ($line->product_type == 9) {
2962 if (!empty(
$object->tab_previous_situation_invoice)) {
2964 $lineIndex = count(
$object->tab_previous_situation_invoice) - 1;
2965 $searchPreviousInvoice =
true;
2966 while ($searchPreviousInvoice) {
2968 $searchPreviousInvoice =
false;
2976 $maxPrevSituationPercent = 0;
2977 foreach (
$object->tab_previous_situation_invoice[$lineIndex]->lines as $prevLine) {
2978 if ($prevLine->id == $line->fk_prev_id) {
2979 $maxPrevSituationPercent = max($maxPrevSituationPercent, $prevLine->situation_percent);
2984 $line->situation_percent -= $maxPrevSituationPercent;
2986 if ($line->update() < 0) {
2995 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
2997 setEventMessages($langs->trans(
'ErrorOutingSituationInvoiceCreditNote'), array(),
'errors');
3000 setEventMessages($langs->trans(
'ErrorOutingSituationInvoiceOnUpdate'), array(),
'errors');
3003 setEventMessages($langs->trans(
'ErrorFindNextSituationInvoice'), array(),
'errors');
3009 $fromElement =
GETPOST(
'fromelement');
3010 $fromElementid =
GETPOST(
'fromelementid');
3011 $importLines =
GETPOST(
'line_checkbox');
3013 if (!empty($importLines) && is_array($importLines) && !empty($fromElement) && ctype_alpha($fromElement) && !empty($fromElementid)) {
3014 if ($fromElement ==
'commande') {
3016 $lineClassName =
'OrderLine';
3017 } elseif ($fromElement ==
'propal') {
3018 dol_include_once(
'/comm/'.$fromElement.
'/class/'.$fromElement.
'.class.php');
3019 $lineClassName =
'PropaleLigne';
3021 $nextRang = count(
$object->lines) + 1;
3024 foreach ($importLines as $lineId) {
3025 $lineId = intval($lineId);
3026 $originLine =
new $lineClassName($db);
3027 if (intval($fromElementid) > 0 && $originLine->fetch($lineId) > 0) {
3028 $originLine->fetch_optionals();
3029 $desc = $originLine->desc;
3030 $pu_ht = $originLine->subprice;
3031 $qty = $originLine->qty;
3032 $txtva = $originLine->tva_tx;
3033 $txlocaltax1 = $originLine->localtax1_tx;
3034 $txlocaltax2 = $originLine->localtax2_tx;
3035 $fk_product = $originLine->fk_product;
3036 $remise_percent = $originLine->remise_percent;
3037 $date_start = $originLine->date_start;
3038 $date_end = $originLine->date_end;
3039 $fk_code_ventilation = 0;
3040 $info_bits = $originLine->info_bits;
3041 $fk_remise_except = $originLine->fk_remise_except;
3042 $price_base_type =
'HT';
3044 $type = $originLine->product_type;
3045 $rang = $nextRang++;
3046 $special_code = $originLine->special_code;
3047 $origin = $originLine->element;
3048 $origin_id = $originLine->id;
3049 $fk_parent_line = 0;
3050 $fk_fournprice = $originLine->fk_fournprice;
3051 $pa_ht = $originLine->pa_ht;
3052 $label = $originLine->label;
3053 $array_options = $originLine->array_options;
3055 $situation_percent = 0;
3057 $situation_percent = 100;
3060 $fk_unit = $originLine->fk_unit;
3061 $pu_ht_devise = $originLine->multicurrency_subprice;
3063 $res =
$object->addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1, $txlocaltax2, $fk_product, $remise_percent, $date_start, $date_end, $fk_code_ventilation, $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);
3082 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
3088 $triggersendname =
'BILL_SENTBYMAIL';
3090 $autocopy =
'MAIN_MAIL_AUTOCOPY_INVOICE_TO';
3091 $trackid =
'inv'.$object->id;
3092 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
3095 $upload_dir = $conf->invoice->multidir_output[!empty(
$object->entity) ?
$object->entity : $conf->entity];
3096 $permissiontoadd = $usercancreate;
3097 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
3100 if ($action ==
'update_extras' && $usercancreate) {
3104 $ret = $extrafields->setOptionalsFromPost(
null,
$object,
GETPOST(
'attribute',
'restricthtml'));
3111 $result =
$object->insertExtraFields(
'BILL_MODIFY');
3119 $action =
'edit_extras';
3124 if ($action ==
'addcontact' && $usercancreate) {
3125 $result =
$object->fetch($id);
3127 if ($result > 0 && $id > 0) {
3130 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
3134 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
3137 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
3138 $langs->load(
"errors");
3139 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
3144 } elseif ($action ==
'swapstatut' && $usercancreate) {
3151 } elseif ($action ==
'deletecontact' && $usercancreate) {
3154 $result =
$object->delete_contact($lineid);
3157 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
3165 $action =
'edit_extras';
3176$form =
new Form($db);
3182$bankaccountstatic =
new Account($db);
3183if (isModEnabled(
'project')) {
3189$title =
$object->ref.
" - ".$langs->trans(
'Card');
3190if ($action ==
'create') {
3191 $title = $langs->trans(
"NewBill");
3193$help_url =
"EN:Customers_Invoices|FR:Factures_Clients|ES:Facturas_a_clientes";
3199if ($action ==
'create') {
3200 $facturestatic =
new Facture($db);
3201 $extrafields->fetch_name_optionals_label($facturestatic->table_element);
3206 $res = $soc->fetch($socid);
3209 $currency_code = $conf->currency;
3211 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
3212 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
3217 if (!empty($origin) && !empty($originid)) {
3219 $element = $subelement = $origin;
3221 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
3222 $element = $regs[1];
3223 $subelement = $regs[2];
3229 if ($element ==
'project') {
3230 $projectid = $originid;
3232 if (empty($cond_reglement_id)) {
3233 $cond_reglement_id = $soc->cond_reglement_id;
3235 if (empty($mode_reglement_id)) {
3236 $mode_reglement_id = $soc->mode_reglement_id;
3238 if (empty($fk_account)) {
3239 $fk_account = $soc->fk_account;
3241 if (empty($dateinvoice)) {
3247 if ($element ==
'order' || $element ==
'commande') {
3248 $element = $subelement =
'commande';
3250 if ($element ==
'propal') {
3251 $element =
'comm/propal';
3252 $subelement =
'propal';
3254 if ($element ==
'contract') {
3255 $element = $subelement =
'contrat';
3257 if ($element ==
'shipping') {
3258 $element = $subelement =
'expedition';
3263 $classname = ucfirst($subelement);
3264 $objectsrc =
new $classname($db);
3265 $objectsrc->fetch($originid);
3266 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
3267 $objectsrc->fetch_lines();
3269 $objectsrc->fetch_thirdparty();
3271 $projectid = (!empty($projectid) ? $projectid : $objectsrc->fk_project);
3272 $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client : (!empty($objectsrc->ref_customer) ? $objectsrc->ref_customer :
''));
3275 if (empty($socid)) {
3276 $soc = $objectsrc->thirdparty;
3279 $dateinvoice = (empty($dateinvoice) ? (!
getDolGlobalString(
'MAIN_AUTOFILL_DATE') ? -1 :
'') : $dateinvoice);
3281 if ($element ==
'expedition') {
3282 $ref_client = (!empty($objectsrc->ref_customer) ? $objectsrc->ref_customer :
'');
3284 $elem = $subelem = $objectsrc->origin;
3285 $expeoriginid = $objectsrc->origin_id;
3287 $classname = ucfirst($subelem);
3289 $expesrc =
new $classname($db);
3290 $expesrc->fetch($expeoriginid);
3292 $cond_reglement_id = (!empty($expesrc->cond_reglement_id) ? $expesrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 1));
3293 $mode_reglement_id = (!empty($expesrc->mode_reglement_id) ? $expesrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
3294 $fk_account = (!empty($expesrc->fk_account) ? $expesrc->fk_account : (!empty($soc->fk_account) ? $soc->fk_account : 0));
3296 if (isModEnabled(
'multicurrency')) {
3297 $currency_code = (!empty($expesrc->multicurrency_code) ? $expesrc->multicurrency_code : (!empty($soc->multicurrency_code) ? $soc->multicurrency_code : $objectsrc->multicurrency_code));
3298 $currency_tx = (!empty($expesrc->multicurrency_tx) ? $expesrc->multicurrency_tx : (!empty($soc->multicurrency_tx) ? $soc->multicurrency_tx : $objectsrc->multicurrency_tx));
3302 $expesrc->fetch_optionals();
3303 $object->array_options = $expesrc->array_options;
3305 $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : (!empty($cond_reglement_id) ? $cond_reglement_id : 0)));
3306 $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : (!empty($mode_reglement_id) ? $mode_reglement_id : 0)));
3307 $fk_account = (!empty($objectsrc->fk_account) ? $objectsrc->fk_account : (!empty($soc->fk_account) ? $soc->fk_account : (!empty($fk_account) ? $fk_account : 0)));
3309 if (isModEnabled(
'multicurrency')) {
3310 if (!empty($objectsrc->multicurrency_code)) {
3311 $currency_code = $objectsrc->multicurrency_code;
3313 if (
getDolGlobalString(
'MULTICURRENCY_USE_ORIGIN_TX') && !empty($objectsrc->multicurrency_tx)) {
3314 $currency_tx = $objectsrc->multicurrency_tx;
3319 $objectsrc->fetch_optionals();
3320 $object->array_options = $objectsrc->array_options;
3324 $cond_reglement_id = empty($soc->cond_reglement_id) ? $cond_reglement_id : $soc->cond_reglement_id;
3325 $mode_reglement_id = empty($soc->mode_reglement_id) ? $mode_reglement_id : $soc->mode_reglement_id;
3326 $fk_account = empty($soc->fk_account) ? $fk_account : $soc->fk_account;
3328 $dateinvoice = (empty($dateinvoice) ? (!
getDolGlobalString(
'MAIN_AUTOFILL_DATE') ? -1 :
'') : $dateinvoice);
3330 if (isModEnabled(
'multicurrency') && !empty($soc->multicurrency_code)) {
3331 $currency_code = $soc->multicurrency_code;
3336 if (!
GETPOST(
'changecompany')) {
3337 if (GETPOSTISSET(
'cond_reglement_id')) {
3338 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
3340 if (GETPOSTISSET(
'mode_reglement_id')) {
3341 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
3343 if (GETPOSTISSET(
'cond_reglement_id')) {
3349 if (empty($cond_reglement_id)) {
3350 $cond_reglement_id =
GETPOSTINT(
"cond_reglement_id");
3354 if (empty($mode_reglement_id)) {
3355 $mode_reglement_id =
GETPOSTINT(
"mode_reglement_id");
3365 if (!empty($soc->id)) {
3366 $absolute_discount = $soc->getAvailableDiscounts();
3368 $note_public =
$object->getDefaultCreateValueFor(
'note_public', ((!empty($origin) && !empty($originid) && is_object($objectsrc) &&
getDolGlobalString(
'FACTURE_REUSE_NOTES_ON_CREATE_FROM')) ? $objectsrc->note_public : null));
3369 $note_private =
$object->getDefaultCreateValueFor(
'note_private', ((!empty($origin) && !empty($originid) && is_object($objectsrc) &&
getDolGlobalString(
'FACTURE_REUSE_NOTES_ON_CREATE_FROM')) ? $objectsrc->note_private : null));
3371 if (!empty($conf->use_javascript_ajax)) {
3372 require_once DOL_DOCUMENT_ROOT.
'/core/lib/ajax.lib.php';
3378 if ($origin ==
'contrat') {
3379 $langs->load(
"admin");
3380 $text = $langs->trans(
"ToCreateARecurringInvoice");
3381 $text .=
' '.$langs->trans(
"ToCreateARecurringInvoiceGene", $langs->transnoentitiesnoconv(
"MenuFinancial"), $langs->transnoentitiesnoconv(
"BillsCustomers"), $langs->transnoentitiesnoconv(
"ListOfTemplates"));
3383 $text .=
' '.$langs->trans(
"ToCreateARecurringInvoiceGeneAuto", $langs->transnoentitiesnoconv(
'Module2300Name'));
3385 print
info_admin($text, 0, 0, 0,
'opacitymedium').
'<br>';
3388 print
'<form name="add" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST" id="formtocreate" name="formtocreate">';
3389 print
'<input type="hidden" name="token" value="'.newToken().
'">';
3390 print
'<input type="hidden" name="action" id="formtocreateaction" value="add">';
3391 print
'<input type="hidden" name="changecompany" value="0">';
3393 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">'.
"\n";
3395 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
3396 print
'<input name="ref" type="hidden" value="provisoire">';
3397 print
'<input name="ref_client" type="hidden" value="'.$ref_client.
'">';
3398 print
'<input name="force_cond_reglement_id" type="hidden" value="0">';
3399 print
'<input name="force_mode_reglement_id" type="hidden" value="0">';
3400 print
'<input name="force_fk_account" type="hidden" value="0">';
3401 print
'<input type="hidden" name="origin" value="'.$origin.
'">';
3402 print
'<input type="hidden" name="originid" value="'.$originid.
'">';
3403 print
'<input type="hidden" name="originentity" value="'.GETPOST(
'originentity').
'">';
3404 if (!empty($currency_tx)) {
3405 print
'<input type="hidden" name="originmulticurrency_tx" value="'.$currency_tx.
'">';
3411 $parameters = array();
3413 $reshook = $hookmanager->executeHooks(
'tabContentCreateInvoice', $parameters,
$object, $action);
3414 if (empty($reshook)) {
3415 print
'<table class="border centpercent">';
3417 $exampletemplateinvoice =
new FactureRec($db);
3419 if (empty($origin) && empty($originid) &&
GETPOSTINT(
'fac_rec') > 0) {
3420 $invoice_predefined->fetch(
GETPOSTINT(
'fac_rec'));
3424 if ($soc->id > 0 && (!
GETPOSTINT(
'fac_rec') || !empty($invoice_predefined->frequency))) {
3426 print
'<tr><td class="fieldrequired">'.$langs->trans(
'Customer').
'</td>';
3427 print
'<td colspan="2">';
3428 print $soc->getNomUrl(1,
'customer');
3429 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">';
3431 $arrayoutstandingbills = $soc->getOutstandingBills();
3432 $outstandingBills = $arrayoutstandingbills[
'opened'];
3433 print
' - <span class="opacitymedium">'.$langs->trans(
'CurrentOutstandingBill').
':</span> ';
3434 print
'<span class="amount">'.price($outstandingBills, 0, $langs, 0, 0, -1, $conf->currency).
'</span>';
3435 if ($soc->outstanding_limit !=
'') {
3436 if ($outstandingBills > $soc->outstanding_limit) {
3437 print
img_warning($langs->trans(
"OutstandingBillReached"));
3439 print
' / '.price($soc->outstanding_limit, 0, $langs, 0, 0, -1, $conf->currency);
3444 print
'<tr><td class="fieldrequired">'.$langs->trans(
'Customer').
'</td>';
3445 print
'<td colspan="2">';
3446 $filter =
'((s.client:IN:1,2,3) AND (s.status:=:1))';
3447 print
img_picto(
'',
'company',
'class="pictofixedwidth"').$form->select_company($soc->id,
'socid', $filter,
'SelectThirdParty', 1, 0, array(), 0,
'minwidth300 widthcentpercentminusxx maxwidth500');
3451 $(document).ready(function() {
3452 $("#socid").change(function() {
3454 console.log("Submit page");
3455 $(\'input[name="action"]\').val(\'create\');
3456 $(\'input[name="force_cond_reglement_id"]\').val(\'1\');
3457 $(\'input[name="force_mode_reglement_id"]\').val(\'1\');
3458 $(\'input[name="force_fk_account"]\').val(\'1\');
3459 $("#formtocreate").submit(); */
3461 // For company change, we must submit page with action=create instead of action=add
3462 console.log("We have changed the company - Resubmit page");
3463 jQuery("input[name=changecompany]").val("1");
3464 jQuery("#formtocreateaction").val("create");
3465 jQuery("#formtocreate").submit();
3471 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>';
3478 if (empty($origin) && empty($originid) &&
GETPOSTINT(
'fac_rec') > 0) {
3480 foreach ($invoice_predefined->array_options as $key => $option) {
3481 if (!isset(
$object->array_options[$key])) {
3482 $object->array_options[$key] = $invoice_predefined->array_options[$key];
3486 $dateinvoice = $invoice_predefined->date_when;
3487 if (empty($projectid)) {
3488 $projectid = $invoice_predefined->fk_project;
3490 $cond_reglement_id = $invoice_predefined->cond_reglement_id;
3491 $mode_reglement_id = $invoice_predefined->mode_reglement_id;
3492 $fk_account = $invoice_predefined->fk_account;
3493 $note_public = $invoice_predefined->note_public;
3494 $note_private = $invoice_predefined->note_private;
3496 if (!empty($invoice_predefined->multicurrency_code)) {
3497 $currency_code = $invoice_predefined->multicurrency_code;
3499 if (!empty($invoice_predefined->multicurrency_tx)) {
3500 $currency_tx = $invoice_predefined->multicurrency_tx;
3503 $sql =
'SELECT r.rowid, r.titre as title, r.total_ttc';
3504 $sql .=
' FROM '.MAIN_DB_PREFIX.
'facture_rec as r';
3505 $sql .=
' WHERE r.fk_soc = '.((int) $invoice_predefined->socid);
3507 $resql = $db->query($sql);
3509 $num = $db->num_rows($resql);
3513 print
'<tr><td>'.$langs->trans(
'CreateFromRepeatableInvoice').
'</td><td>';
3515 print
'<select class="flat" id="fac_rec" name="fac_rec">';
3516 print
'<option value="0" selected></option>';
3518 $objp = $db->fetch_object($resql);
3519 print
'<option value="'.$objp->rowid.
'"';
3522 $exampletemplateinvoice->fetch(
GETPOSTINT(
'fac_rec'));
3524 print
'>'.$objp->title.
' ('.
price($objp->total_ttc).
' '.$langs->trans(
"TTC").
')</option>';
3533 print
'<script type="text/javascript">
3534 $(document).ready(function() {
3535 $("#fac_rec").change(function() {
3536 console.log("We have changed the template invoice - Reload page");
3537 var fac_rec = $(this).val();
3538 var socid = $(\'#socid\').val();
3539 // 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.
3540 window.location.href = "'.$_SERVER[
"PHP_SELF"].
'?action=create&socid="+socid+"&fac_rec="+fac_rec;
3553 print
'<tr><td class="tdtop fieldrequired">'.$langs->trans(
'Type').
'</td><td colspan="2">';
3554 print
'<div class="tagtable">'.
"\n";
3557 print
'<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
3558 $tmp =
'<input type="radio" id="radio_standard" name="type" value="0"'.(GETPOSTINT(
'type') ?
'' :
' checked').
'> ';
3559 $tmp = $tmp.
'<label for="radio_standard" >'.$langs->trans(
"InvoiceStandardAsk").
'</label>';
3561 $desc = $form->textwithpicto($tmp, $langs->transnoentities(
"InvoiceStandardDesc"), 1,
'help',
'nowraponall', 0, 3,
'standardonsmartphone');
3562 print
'<table class="nobordernopadding"><tr>';
3566 if ((($origin ==
'propal') || ($origin ==
'commande')) && (!empty($originid))) {
3575 print
'<td class="nowrap" style="padding-left: 15px">';
3576 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%').
'"/>';
3579 print
'</tr></table>';
3580 print
'</div></div>';
3582 if ((empty($origin)) || ((($origin ==
'propal') || ($origin ==
'commande')) && (!empty($originid)))) {
3585 print
'<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
3586 $tmp =
'<input type="radio" id="radio_deposit" name="type" value="3"'.(GETPOSTINT(
'type') == 3 ?
' checked' :
'').
'> ';
3587 print
'<script type="text/javascript">
3588 jQuery(document).ready(function() {
3589 jQuery("#typestandardinvoice, #valuestandardinvoice").click(function() {
3590 jQuery("#radio_standard").prop("checked", true);
3592 jQuery("#typedeposit, #valuedeposit").click(function() {
3593 jQuery("#radio_deposit").prop("checked", true);
3595 jQuery("#typedeposit").change(function() {
3596 console.log("We change type of down payment");
3597 jQuery("#radio_deposit").prop("checked", true);
3598 setRadioForTypeOfInvoice();
3600 jQuery("#radio_standard, #radio_deposit, #radio_replacement, #radio_creditnote, #radio_template").change(function() {
3601 setRadioForTypeOfInvoice();
3603 function setRadioForTypeOfInvoice() {
3604 console.log("Change radio for type of invoice");
3605 if (jQuery("#radio_deposit").prop("checked") && (jQuery("#typedeposit").val() == \'amount\' || jQuery("#typedeposit").val() == \'variable\')) {
3606 jQuery("#checkforselects").prop("disabled", true);
3607 jQuery("#checkforselects").prop("checked", false);
3608 jQuery(".checkforselect").prop("disabled", true);
3609 jQuery(".checkforselect").prop("checked", false);
3611 jQuery("#checkforselects").prop("disabled", false);
3612 jQuery("#checkforselects").prop("checked", true);
3613 jQuery(".checkforselect").prop("disabled", false);
3614 jQuery(".checkforselect").prop("checked", true);
3620 print
'<table class="nobordernopadding"><tr>';
3622 $tmp = $tmp.
'<label for="radio_deposit">'.$langs->trans(
"InvoiceDeposit").
'</label>';
3624 $desc = $form->textwithpicto($tmp, $langs->transnoentities(
"InvoiceDepositDesc"), 1,
'help',
'', 0, 3,
'depositonsmartphone');
3627 if (($origin ==
'propal') || ($origin ==
'commande')) {
3628 print
'<td class="nowrap" style="padding-left: 15px">';
3630 'amount' => $langs->transnoentitiesnoconv(
'FixAmount', $langs->transnoentitiesnoconv(
'Deposit')),
3631 'variable' => $langs->transnoentitiesnoconv(
'VarAmountOneLine', $langs->transnoentitiesnoconv(
'Deposit')),
3632 'variablealllines' => $langs->transnoentitiesnoconv(
'VarAmountAllLines')
3634 $typedeposit =
GETPOST(
'typedeposit',
'aZ09');
3636 if (empty($typedeposit) && !empty($objectsrc->deposit_percent)) {
3637 $origin_payment_conditions_deposit_percent =
getDictionaryValue(
'c_payment_term',
'deposit_percent', $objectsrc->cond_reglement_id);
3638 if (!empty($origin_payment_conditions_deposit_percent)) {
3639 $typedeposit =
'variable';
3642 if (empty($valuedeposit) && $typedeposit ==
'variable' && !empty($objectsrc->deposit_percent)) {
3643 $valuedeposit = $objectsrc->deposit_percent;
3645 print $form->selectarray(
'typedeposit', $arraylist, $typedeposit, 0, 0, 0,
'', 1);
3647 print
'<td class="nowrap" style="padding-left: 5px">';
3648 print
'<span class="opacitymedium paddingleft">'.$langs->trans(
"AmountOrPercent").
'</span><input type="text" id="valuedeposit" name="valuedeposit" class="width75 right" value="'.$valuedeposit.
'"/>';
3651 print
'</tr></table>';
3653 print
'</div></div>';
3660 print
'<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
3661 $tmp =
'<input id="radio_situation" type="radio" name="type" value="5"'.(GETPOST(
'type') == 5 ?
' checked' :
'').
'> ';
3662 $tmp = $tmp.
'<label for="radio_situation" >'.$langs->trans(
"InvoiceFirstSituationAsk").
'</label>';
3664 $desc = $form->textwithpicto($tmp, $langs->transnoentities(
"InvoiceFirstSituationDesc"), 1,
'help',
'', 0, 3,
'firstsituationonsmartphone');
3666 print
'</div></div>';
3669 $opt = $form->selectSituationInvoices(
GETPOSTINT(
'originid'), $socid);
3671 print
'<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
3672 $tmp =
'<input type="radio" name="type" value="5"'.(GETPOST(
'type') == 5 &&
GETPOSTINT(
'originid') ?
' checked' :
'');
3673 if ($opt == (
'<option value ="0" selected>'.$langs->trans(
'NoSituations').
'</option>') || (
GETPOST(
'origin') &&
GETPOST(
'origin') !=
'facture' &&
GETPOST(
'origin') !=
'commande')) {
3674 $tmp .=
' disabled';
3677 $text = $tmp.
'<label>'.$langs->trans(
"InvoiceSituationAsk").
'</label> ';
3678 $text .=
'<select class="flat" id="situations" name="situations"';
3679 if ($opt == (
'<option value ="0" selected>'.$langs->trans(
'NoSituations').
'</option>') || (
GETPOST(
'origin') &&
GETPOST(
'origin') !=
'facture' &&
GETPOST(
'origin') !=
'commande')) {
3680 $text .=
' disabled';
3684 $text .=
'</select>';
3685 $desc = $form->textwithpicto($text, $langs->transnoentities(
"InvoiceSituationDesc"), 1,
'help',
'', 0, 3);
3687 print
'</div></div>';
3693 $facids = $facturestatic->list_replacable_invoices($soc->id);
3699 if (is_array($facids)) {
3700 foreach ($facids as $facparam) {
3701 $options .=
'<option value="'.$facparam [
'id'].
'"';
3702 if ($facparam[
'id'] ==
GETPOSTINT(
'fac_replacement')) {
3703 $options .=
' selected';
3705 $options .=
'>'.$facparam[
'ref'];
3706 $options .=
' ('.$facturestatic->LibStatut($facparam[
'paid'], $facparam[
'status'], 0, $facparam[
'alreadypaid']).
')';
3707 $options .=
'</option>';
3711 print
'<!-- replacement line -->';
3712 print
'<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
3713 $tmp =
'<input type="radio" name="type" id="radio_replacement" value="1"'.(GETPOST(
'type') == 1 ?
' checked' :
'');
3714 if (!$options || $invoice_predefined->id > 0) {
3715 $tmp .=
' disabled';
3718 print
'<script type="text/javascript">
3719 jQuery(document).ready(function() {
3720 jQuery("#fac_replacement").change(function() {
3721 jQuery("#radio_replacement").prop("checked", true);
3725 $text = $tmp.
'<label for="radio_replacement">'.$langs->trans(
"InvoiceReplacementAsk").
'</label>';
3726 $text .=
'<select class="flat" name="fac_replacement" id="fac_replacement"';
3727 if (!$options || $invoice_predefined->id > 0) {
3728 $text .=
' disabled';
3732 $text .=
'<option value="-1"> </option>';
3735 $text .=
'<option value="-1">'.$langs->trans(
"NoReplacableInvoice").
'</option>';
3737 $text .=
'</select>';
3738 $desc = $form->textwithpicto($text, $langs->transnoentities(
"InvoiceReplacementDesc"), 1,
'help',
'', 0, 3);
3740 print
'</div></div>';
3744 print
'<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
3745 $tmp =
'<input type="radio" name="type" id="radio_situation" value="0" disabled> ';
3746 $text = $tmp.
'<label>'.$langs->trans(
"InvoiceSituationAsk").
'</label> ';
3747 $text .=
'<span class="opacitymedium">('.$langs->trans(
"YouMustCreateInvoiceFromThird").
')</span> ';
3748 $desc = $form->textwithpicto($text, $langs->transnoentities(
"InvoiceFirstSituationDesc"), 1,
'help',
'nowraponall', 0, 3,
'firstsituationonsmartphone');
3750 print
'</div></div>';
3753 print
'<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
3754 $tmp =
'<input type="radio" name="type" id="radio_replacement" value="0" disabled> ';
3755 $text = $tmp.
'<label for="radio_replacement" class="opacitymedium">'.$langs->trans(
"InvoiceReplacement").
'</label> ';
3757 $desc = $form->textwithpicto($text, $langs->transnoentities(
"InvoiceReplacementDesc").
'<br><br>'.$langs->trans(
"YouMustCreateInvoiceFromThird"), 1,
'help',
'nowraponall', 0, 3,
'replacementonsmartphone');
3759 print
'</div></div>';
3762 if (empty($origin)) {
3767 $facids = $facturestatic->list_qualified_avoir_invoices($soc->id);
3773 $newinvoice_static =
new Facture($db);
3774 foreach ($facids as $key => $valarray) {
3775 $newinvoice_static->id = $key;
3776 $newinvoice_static->ref = $valarray [
'ref'];
3777 $newinvoice_static->statut = $valarray [
'status'];
3778 $newinvoice_static->status = $valarray [
'status'];
3779 $newinvoice_static->type = $valarray [
'type'];
3780 $newinvoice_static->paye = $valarray [
'paye'];
3782 $optionsav .=
'<option value="'.$key.
'"';
3783 if ($key ==
GETPOST(
'fac_avoir')) {
3784 $optionsav .=
' selected';
3787 $newinvoice_static->fetch_optionals($key);
3788 $object->array_options = $newinvoice_static->array_options;
3791 $optionsav .= $newinvoice_static->ref;
3792 $optionsav .=
' ('.$newinvoice_static->getLibStatut(1, $valarray [
'paymentornot']).
')';
3793 $optionsav .=
'</option>';
3796 print
'<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
3797 $tmp =
'<input type="radio" id="radio_creditnote" name="type" value="2"'.(GETPOST(
'type') == 2 ?
' checked' :
'');
3798 if ((!$optionsav && !
getDolGlobalString(
'INVOICE_CREDIT_NOTE_STANDALONE')) || $invoice_predefined->id > 0) {
3799 $tmp .=
' disabled';
3803 print
'<script type="text/javascript">
3804 jQuery(document).ready(function() {
3805 if (jQuery("#radio_creditnote").is(":checked"))
3807 jQuery("#radio_standard").prop("disabled", true);
3809 jQuery("#radio_standard").prop("disabled", false);
3811 if (! jQuery("#radio_creditnote").is(":checked"))
3813 jQuery("#credit_note_options").hide();
3815 jQuery("#radio_creditnote").click(function() {
3816 jQuery("#credit_note_options").show();
3818 jQuery("#radio_standard, #radio_replacement, #radio_deposit").click(function() {
3819 jQuery("#credit_note_options").hide();
3823 $text =
'<label>'.$tmp.$langs->transnoentities(
"InvoiceAvoirAsk").
'</label> ';
3824 $text .=
'<select class="flat valignmiddle" name="fac_avoir" id="fac_avoir"';
3825 if (!$optionsav || $invoice_predefined->id > 0) {
3826 $text .=
' disabled';
3830 $text .=
'<option value="-1"></option>';
3831 $text .= $optionsav;
3833 $text .=
'<option value="-1">'.$langs->trans(
"NoInvoiceToCorrect").
'</option>';
3835 $text .=
'</select>';
3836 $desc = $form->textwithpicto($text, $langs->transnoentities(
"InvoiceAvoirDesc"), 1,
'help',
'', 0, 3);
3839 print
'<div id="credit_note_options" class="clearboth paddingtop marginbottomonly">';
3840 print
' <input type="checkbox" name="invoiceAvoirWithLines" id="invoiceAvoirWithLines" value="1" onclick="$(\'#credit_note_options input[type=checkbox]\').not(this).prop(\'checked\', false);" '.(GETPOSTINT(
'invoiceAvoirWithLines') > 0 ?
'checked' :
'').
' /> <label for="invoiceAvoirWithLines">'.$langs->trans(
'invoiceAvoirWithLines').
"</label>";
3841 print
'<br> <input type="checkbox" name="invoiceAvoirWithPaymentRestAmount" id="invoiceAvoirWithPaymentRestAmount" value="1" onclick="$(\'#credit_note_options input[type=checkbox]\').not(this).prop(\'checked\', false);" '.(GETPOSTINT(
'invoiceAvoirWithPaymentRestAmount') > 0 ?
'checked' :
'').
' /> <label for="invoiceAvoirWithPaymentRestAmount">'.$langs->trans(
'invoiceAvoirWithPaymentRestAmount').
"</label>";
3844 print
'</div></div>';
3847 print
'<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
3849 $tmp =
'<input type="radio" name="type" id="radio_creditnote" value="0" disabled> ';
3851 $tmp =
'<input type="radio" name="type" id="radio_creditnote" value="2" > ';
3853 $text = $tmp.
'<label class="opacitymedium" for="radio_creditnote">'.$langs->trans(
"InvoiceAvoir").
'</label> ';
3855 $desc = $form->textwithpicto($text, $langs->transnoentities(
"InvoiceAvoirDesc").
'<br><br>'.$langs->trans(
"CreateCreditNoteWhenClientInvoiceExists"), 1,
'help',
'', 0, 3,
'creditnoteonsmartphone');
3857 print
'</div></div>'.
"\n";
3862 print
'<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
3863 $tmp =
'<input type="radio" name="type" id="radio_template" value="0" disabled> ';
3864 $text = $tmp.
'<label class="opacitymedium" for="radio_template">'.$langs->trans(
"RepeatableInvoice").
'</label> ';
3865 $desc = $form->textwithpicto($text, $langs->transnoentities(
"YouMustCreateStandardInvoiceFirstDesc"), 1,
'help',
'', 0, 3,
'templateonsmartphone');
3867 print
'</div></div>';
3876 foreach ($listtType as $type) {
3877 $thisTypeConfName =
'FACTURE_ADDON_PDF_'.$type;
3879 $jsListType .= (!empty($jsListType) ?
',' :
'').
'"'.$type.
'":"'.$current.
'"';
3882 print
'<script type="text/javascript">
3883 $(document).ready(function() {
3884 var listType = {'.$jsListType.
'};
3885 $("[name=\'type\'").change(function() {
3886 console.log("change name=type");
3887 if ($( this ).prop("checked"))
3889 if(($( this ).val() in listType))
3891 $("#model").val(listType[$( this ).val()]);
3908 print
'<tr><td class="fieldrequired">'.$langs->trans(
'InvoiceSubtype').
'</td><td colspan="2">';
3909 print $form->getSelectInvoiceSubtype(
GETPOST(
'subtype'),
'subtype', 1, 0,
'');
3915 print
'<tr><td>'.$langs->trans(
'DiscountStillRemaining').
'</td><td colspan="2">';
3919 $backtopage = $_SERVER[
"PHP_SELF"].
'?socid='.$thirdparty->id.
'&action='.$action.
'&origin='.urlencode((
string) (
GETPOST(
'origin'))).
'&originid='.urlencode((
string) (
GETPOSTINT(
'originid')));
3920 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
3929 print
'<tr><td class="fieldrequired">'.$langs->trans(
'DateInvoice').
'</td><td colspan="2">';
3930 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
3931 print $form->selectDate($newdateinvoice ? $newdateinvoice : $dateinvoice,
'', 0, 0, 0,
"add", 1, 1);
3936 print
'<tr><td class="fieldrequired">'.$langs->trans(
'DatePointOfTax').
'</td><td colspan="2">';
3937 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
3938 print $form->selectDate($date_pointoftax ? $date_pointoftax : -1,
'date_pointoftax', 0, 0, 0,
"add", 1, 1);
3943 print
'<tr><td class="nowrap fieldrequired">'.$langs->trans(
'PaymentConditionsShort').
'</td><td colspan="2">';
3944 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
3945 print $form->getSelectConditionsPaiements($cond_reglement_id,
'cond_reglement_id', -1, 1, 0,
'maxwidth500 widthcentpercentminusx');
3950 $rwStyle =
'display:none;';
3951 if (in_array(
GETPOSTINT(
'type'), $retainedWarrantyInvoiceAvailableType)) {
3955 $retained_warranty =
GETPOSTINT(
'retained_warranty');
3956 if (empty($retained_warranty)) {
3957 if (!empty($objectsrc->retained_warranty)) {
3958 $retained_warranty = $objectsrc->retained_warranty;
3961 $retained_warranty_js_default = !empty($retained_warranty) ? $retained_warranty :
getDolGlobalString(
'INVOICE_SITUATION_DEFAULT_RETAINED_WARRANTY_PERCENT');
3963 print
'<tr class="retained-warranty-line" style="'.$rwStyle.
'" ><td class="nowrap">'.$langs->trans(
'RetainedWarranty').
'</td><td colspan="2">';
3964 print
'<input id="new-situation-invoice-retained-warranty" name="retained_warranty" type="number" value="'.$retained_warranty.
'" step="0.01" min="0" max="100" />%';
3967 print
'<tr class="retained-warranty-line" style="'.$rwStyle.
'" ><td class="nowrap">'.$langs->trans(
'PaymentConditionsShortRetainedWarranty').
'</td><td colspan="2">';
3968 $retained_warranty_fk_cond_reglement =
GETPOSTINT(
'retained_warranty_fk_cond_reglement');
3969 if (empty($retained_warranty_fk_cond_reglement)) {
3970 $retained_warranty_fk_cond_reglement =
getDolGlobalString(
'INVOICE_SITUATION_DEFAULT_RETAINED_WARRANTY_COND_ID');
3971 if (!empty($objectsrc->retained_warranty_fk_cond_reglement)) {
3972 $retained_warranty_fk_cond_reglement = $objectsrc->retained_warranty_fk_cond_reglement;
3974 $retained_warranty_fk_cond_reglement =
getDolGlobalString(
'INVOICE_SITUATION_DEFAULT_RETAINED_WARRANTY_COND_ID');
3977 print $form->getSelectConditionsPaiements($retained_warranty_fk_cond_reglement,
'retained_warranty_fk_cond_reglement', -1, 1);
3980 print
'<script type="text/javascript">
3981 $(document).ready(function() {
3982 $("[name=\'type\']").change(function() {
3983 if($( this ).prop("checked") && $.inArray($( this ).val(), '.json_encode($retainedWarrantyInvoiceAvailableType).
' ) !== -1)
3985 $(".retained-warranty-line").show();
3986 $("#new-situation-invoice-retained-warranty").val("'.(float) $retained_warranty_js_default.
'");
3989 $(".retained-warranty-line").hide();
3990 $("#new-situation-invoice-retained-warranty").val("");
3994 $("[name=\'type\']:checked").trigger("change");
4000 print
'<tr><td>'.$langs->trans(
'PaymentMode').
'</td><td colspan="2">';
4001 print
img_picto(
'',
'bank',
'class="pictofixedwidth"');
4002 print $form->select_types_paiements($mode_reglement_id,
'mode_reglement_id',
'CRDT', 0, 1, 0, 0, 1,
'maxwidth200 widthcentpercentminusx', 1);
4006 if (isModEnabled(
"bank")) {
4007 print
'<tr><td>'.$langs->trans(
'BankAccount').
'</td><td colspan="2">';
4008 print
img_picto(
'',
'bank_account',
'class="pictofixedwidth"');
4009 print $form->select_comptes($fk_account,
'fk_account', 0,
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx', 1);
4014 if (isModEnabled(
'project')) {
4015 $langs->load(
'projects');
4016 print
'<tr><td>'.$langs->trans(
'Project').
'</td><td colspan="2">';
4017 print
img_picto(
'',
'project',
'class="pictofixedwidth"').$formproject->select_projects(($socid > 0 ? $socid : -1), $projectid,
'projectid', 0, 0, 1, 1, 0, 0, 0,
'', 1, 0,
'maxwidth500 widthcentpercentminusxx');
4018 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>';
4023 if (isModEnabled(
'incoterm')) {
4025 print
'<td><label for="incoterm_id">'.$form->textwithpicto($langs->trans(
"IncotermLabel"), !empty($objectsrc->label_incoterms) ? $objectsrc->label_incoterms :
'', 1).
'</label></td>';
4026 print
'<td colspan="2" class="maxwidthonsmartphone">';
4027 $incoterm_id =
GETPOST(
'incoterm_id');
4028 $location_incoterms =
GETPOST(
'location_incoterms');
4029 if (empty($incoterm_id)) {
4030 $incoterm_id = (!empty($objectsrc->fk_incoterms) ? $objectsrc->fk_incoterms : $soc->fk_incoterms);
4031 $location_incoterms = (!empty($objectsrc->location_incoterms) ? $objectsrc->location_incoterms : $soc->location_incoterms);
4033 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
4034 print $form->select_incoterms($incoterm_id, $location_incoterms);
4039 $parameters = array(
'objectsrc' => !empty($objectsrc) ? $objectsrc : 0,
'colspan' =>
' colspan="2"',
'cols' =>
'2',
'socid' => $socid);
4040 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters,
$object, $action);
4041 print $hookmanager->resPrint;
4042 if (empty($reshook)) {
4043 if (
getDolGlobalString(
'THIRDPARTY_PROPAGATE_EXTRAFIELDS_TO_INVOICE') && !empty($soc->id)) {
4046 $tpExtrafieldLabels = $tpExtrafields->fetch_name_optionals_label($soc->table_element);
4047 if ($soc->fetch_optionals() > 0) {
4048 $object->array_options = array_merge(
$object->array_options, $soc->array_options);
4052 print
$object->showOptionals($extrafields,
'create', $parameters);
4056 print
'<tr><td>'.$langs->trans(
'Model').
'</td>';
4057 print
'<td colspan="2">';
4058 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
4059 include_once DOL_DOCUMENT_ROOT.
'/core/modules/facture/modules_facture.php';
4064 $paramkey =
'FACTURE_ADDON_PDF_'.$type;
4069 print $form->selectarray(
'model', $liste, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
4073 if (isModEnabled(
'multicurrency')) {
4075 print
'<td>'.$form->editfieldkey(
'Currency',
'multicurrency_code',
'',
$object, 0).
'</td>';
4076 print
'<td colspan="2" class="maxwidthonsmartphone">';
4077 print
img_picto(
'',
'currency',
'class="pictofixedwidth"');
4078 print $form->selectMultiCurrency(((GETPOSTISSET(
'multicurrency_code') && !
GETPOST(
'changecompany')) ?
GETPOST(
'multicurrency_code') : $currency_code),
'multicurrency_code', 0,
'', false,
'maxwidth100 widthcentpercentminusx');
4085 $dateexample = ($newdateinvoice ? $newdateinvoice : $dateinvoice);
4086 if (empty($dateexample)) {
4089 $substitutionarray = array(
4090 '__TOTAL_HT__' => $langs->trans(
"AmountHT").
' ('.$langs->trans(
"Example").
': '.
price($exampletemplateinvoice->total_ht).
')',
4091 '__TOTAL_TTC__' => $langs->trans(
"AmountTTC").
' ('.$langs->trans(
"Example").
': '.
price($exampletemplateinvoice->total_ttc).
')',
4092 '__INVOICE_PREVIOUS_MONTH__' => $langs->trans(
"PreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'm'),
'%m').
')',
4093 '__INVOICE_MONTH__' => $langs->trans(
"MonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($dateexample,
'%m').
')',
4094 '__INVOICE_NEXT_MONTH__' => $langs->trans(
"NextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'm'),
'%m').
')',
4095 '__INVOICE_PREVIOUS_MONTH_TEXT__' => $langs->trans(
"TextPreviousMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'm'),
'%B').
')',
4096 '__INVOICE_MONTH_TEXT__' => $langs->trans(
"TextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($dateexample,
'%B').
')',
4097 '__INVOICE_NEXT_MONTH_TEXT__' => $langs->trans(
"TextNextMonthOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'm'),
'%B').
')',
4098 '__INVOICE_PREVIOUS_YEAR__' => $langs->trans(
"PreviousYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, -1,
'y'),
'%Y').
')',
4099 '__INVOICE_YEAR__' => $langs->trans(
"YearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date($dateexample,
'%Y').
')',
4100 '__INVOICE_NEXT_YEAR__' => $langs->trans(
"NextYearOfInvoice").
' ('.$langs->trans(
"Example").
': '.
dol_print_date(
dol_time_plus_duree($dateexample, 1,
'y'),
'%Y').
')'
4103 $htmltext =
'<i>'.$langs->trans(
"FollowingConstantsWillBeSubstituted").
':<br>';
4104 foreach ($substitutionarray as $key => $val) {
4105 $htmltext .= $key.
' = '.$langs->trans($val).
'<br>';
4107 $htmltext .=
'</i>';
4112 print
'<td class="tdtop">';
4113 print $form->textwithpicto($langs->trans(
'NotePublic'), $htmltext);
4115 print
'<td valign="top" colspan="2">';
4116 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 80,
'dolibarr_notes',
'In', 0,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
4117 print $doleditor->Create(1);
4120 if (empty($user->socid)) {
4122 print
'<td class="tdtop">';
4123 print $form->textwithpicto($langs->trans(
'NotePrivate'), $htmltext);
4125 print
'<td valign="top" colspan="2">';
4126 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 80,
'dolibarr_notes',
'In', 0,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
4127 print $doleditor->Create(1);
4133 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
4134 $langs->loadLangs(array(
'orders',
'propal'));
4137 if ($origin ==
'contrat') {
4139 $objectsrc->update_price(1,
'auto', 1);
4142 print
"\n<!-- Show ref of origin ".$classname.
" -->\n";
4143 print
'<input type="hidden" name="amount" value="'.$objectsrc->total_ht.
'">'.
"\n";
4144 print
'<input type="hidden" name="total" value="'.$objectsrc->total_ttc.
'">'.
"\n";
4145 print
'<input type="hidden" name="tva" value="'.$objectsrc->total_tva.
'">'.
"\n";
4150 switch (get_class($objectsrc)) {
4152 $newclassname =
'CommercialProposal';
4155 $newclassname =
'Order';
4158 $newclassname =
'Sending';
4161 $newclassname =
'Contract';
4164 $newclassname =
'Intervention';
4167 $newclassname = get_class($objectsrc);
4171 print
'<tr><td>'.$langs->trans($newclassname).
'</td>';
4172 print
'<td colspan="2">';
4173 print $objectsrc->getNomUrl(1);
4175 $objectsrc->fetchObjectLinked($originid, $origin,
null,
'facture');
4176 if (isset($objectsrc->linkedObjects[
'facture']) && is_array($objectsrc->linkedObjects[
'facture']) && count($objectsrc->linkedObjects[
'facture']) >= 1) {
4178 echo
' - '.$langs->trans(
'LatestRelatedBill').
' '.end($objectsrc->linkedObjects[
'facture'])->getNomUrl(1);
4181 print
'<tr><td>'.$langs->trans(
'AmountHT').
'</td><td colspan="2">'.
price($objectsrc->total_ht).
'</td></tr>';
4182 print
'<tr><td>'.$langs->trans(
'AmountVAT').
'</td><td colspan="2">'.
price($objectsrc->total_tva).
"</td></tr>";
4183 if ($mysoc->localtax1_assuj ==
"1" || $objectsrc->total_localtax1 != 0) {
4184 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td><td colspan="2">'.
price($objectsrc->total_localtax1).
"</td></tr>";
4187 if ($mysoc->localtax2_assuj ==
"1" || $objectsrc->total_localtax2 != 0) {
4188 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td><td colspan="2">'.
price($objectsrc->total_localtax2).
"</td></tr>";
4190 print
'<tr><td>'.$langs->trans(
'AmountTTC').
'</td><td colspan="2">'.
price($objectsrc->total_ttc).
"</td></tr>";
4192 if (isModEnabled(
'multicurrency')) {
4193 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountHT').
'</td><td colspan="2">'.
price($objectsrc->multicurrency_total_ht).
'</td></tr>';
4194 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountVAT').
'</td><td colspan="2">'.
price($objectsrc->multicurrency_total_tva).
"</td></tr>";
4195 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountTTC').
'</td><td colspan="2">'.
price($objectsrc->multicurrency_total_ttc).
"</td></tr>";
4203 print $form->buttonsSaveCancel(
"CreateDraft");
4206 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
4209 $title = $langs->trans(
'ProductsAndServices');
4212 print
'<div class="div-table-responsive-no-min">';
4213 print
'<table class="noborder centpercent">';
4215 $objectsrc->printOriginLinesList(
'', $selectedLines);
4222} elseif ($id > 0 || !empty($ref)) {
4224 $langs->load(
'errors');
4225 echo
'<div class="error">'.$langs->trans(
"ErrorRecordNotFound").
'</div>';
4234 $result =
$object->fetch($id, $ref);
4241 $extrafields->fetch_name_optionals_label(
$object->table_element);
4243 if ($user->socid > 0 && $user->socid !=
$object->socid) {
4247 $result =
$object->fetch_thirdparty();
4249 $result = $soc->fetch(
$object->socid);
4253 $selleruserevenustamp = $mysoc->useRevenueStamp();
4255 $totalpaid =
$object->getSommePaiement();
4256 $totalcreditnotes =
$object->getSumCreditNotesUsed();
4257 $totaldeposits =
$object->getSumDepositsUsed();
4263 $resteapayer =
price2num(
$object->total_ttc - $totalpaid - $totalcreditnotes - $totaldeposits,
'MT');
4266 if (isModEnabled(
'multicurrency')) {
4267 $multicurrency_totalpaid =
$object->getSommePaiement(1);
4268 $multicurrency_totalcreditnotes =
$object->getSumCreditNotesUsed(1);
4269 $multicurrency_totaldeposits =
$object->getSumDepositsUsed(1);
4270 $multicurrency_resteapayer =
price2num(
$object->multicurrency_total_ttc - $multicurrency_totalpaid - $multicurrency_totalcreditnotes - $multicurrency_totaldeposits,
'MT');
4274 if ($resteapayer == 0 && $multicurrency_resteapayer != 0 &&
$object->multicurrency_code != $conf->currency) {
4275 $resteapayer =
price2num((
float) $multicurrency_resteapayer /
$object->multicurrency_tx,
'MT');
4282 $resteapayeraffiche = $resteapayer;
4285 $filterabsolutediscount =
"fk_facture_source IS NULL";
4286 $filtercreditnote =
"fk_facture_source IS NOT NULL";
4288 $filterabsolutediscount =
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
4289 $filtercreditnote =
"fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
4292 $absolute_discount = $soc->getAvailableDiscounts(
null, $filterabsolutediscount);
4293 $absolute_creditnote = $soc->getAvailableDiscounts(
null, $filtercreditnote);
4294 $absolute_discount =
price2num($absolute_discount,
'MT');
4295 $absolute_creditnote =
price2num($absolute_creditnote,
'MT');
4297 $author =
new User($db);
4298 if (
$object->user_creation_id) {
4299 $author->fetch(
$object->user_creation_id);
4302 $objectidnext =
$object->getIdReplacingInvoice();
4306 print
dol_get_fiche_head($head,
'compta', $langs->trans(
'InvoiceCustomer'), -1,
'bill');
4311 if ($action ==
'converttoreduc') {
4313 $type_fac =
'ExcessReceived';
4315 $type_fac =
'CreditNote';
4317 $type_fac =
'Deposit';
4319 $text = $langs->trans(
'ConfirmConvertToReduc', strtolower($langs->transnoentities($type_fac)));
4320 $text .=
'<br>'.$langs->trans(
'ConfirmConvertToReduc2');
4321 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id, $langs->trans(
'ConvertToReduc'), $text,
'confirm_converttoreduc',
'',
"yes", 2);
4325 if ($action ==
'delete') {
4326 $text = $langs->trans(
'ConfirmDeleteBill',
$object->ref);
4327 $formquestion = array();
4330 $qualified_for_stock_change = 0;
4332 $qualified_for_stock_change =
$object->hasProductsOrServices(2);
4334 $qualified_for_stock_change =
$object->hasProductsOrServices(1);
4337 if ($qualified_for_stock_change) {
4338 $langs->load(
"stocks");
4339 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
4343 if ($conf->browser->name ==
'ie') {
4346 $formquestion = array(
4350 array(
'type' =>
'other',
'name' =>
'idwarehouse',
'label' => $label,
'value' => $formproduct->selectWarehouses(
GETPOST(
'idwarehouse') ?
GETPOST(
'idwarehouse') :
'ifone',
'idwarehouse',
'', 1, 0, 0, $langs->trans(
"NoStockAction"), 0, $forcecombo))
4352 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id, $langs->trans(
'DeleteBill'), $text,
'confirm_delete', $formquestion,
"yes", 1);
4354 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id, $langs->trans(
'DeleteBill'), $text,
'confirm_delete',
'',
'no', 1);
4357 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id, $langs->trans(
'DeleteBill'), $text,
'confirm_delete',
'',
'no', 1);
4362 if ($action ==
'situationout') {
4363 $text = $langs->trans(
'ConfirmRemoveSituationFromCycle',
$object->ref);
4364 $label = $langs->trans(
"ConfirmOuting");
4365 $formquestion = array();
4370 &&
$object->is_last_in_cycle()
4371 && $usercanunvalidate
4373 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id, $label, $text,
'confirm_situationout', $formquestion,
"yes", 1);
4378 if ($action ==
'valid') {
4380 $objectref = substr(
$object->ref, 1, 4);
4381 if ($objectref ==
'PROV') {
4385 $object->date_lim_reglement =
$object->calculate_date_lim_reglement();
4387 $numref =
$object->getNextNumRef($soc);
4393 $text = $langs->trans(
'ConfirmValidateBill', $numref);
4394 if (isModEnabled(
'notification')) {
4395 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
4396 $notify =
new Notify($db);
4398 $text .= $notify->confirmMessage(
'BILL_VALIDATE',
$object->socid,
$object);
4400 $formquestion = array();
4403 $qualified_for_stock_change = 0;
4405 $qualified_for_stock_change =
$object->hasProductsOrServices(2);
4407 $qualified_for_stock_change =
$object->hasProductsOrServices(1);
4410 if ($qualified_for_stock_change) {
4411 $langs->load(
"stocks");
4412 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
4413 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/entrepot.class.php';
4416 $warehouse_array = $warehouse->list_array();
4417 if (count($warehouse_array) == 1) {
4418 $label =
$object->type ==
Facture::TYPE_CREDIT_NOTE ? $langs->trans(
"WarehouseForStockIncrease", current($warehouse_array)) : $langs->trans(
"WarehouseForStockDecrease", current($warehouse_array));
4419 $value =
'<input type="hidden" id="idwarehouse" name="idwarehouse" value="'.key($warehouse_array).
'">';
4422 $value = $formproduct->selectWarehouses(
GETPOST(
'idwarehouse') ?
GETPOST(
'idwarehouse') :
'ifone',
'idwarehouse',
'', 1);
4424 $formquestion = array(
4430 array(
'type' =>
'other',
'name' =>
'idwarehouse',
'label' => $label,
'value' => $value));
4434 $text .=
'<br>'.img_warning().
' '.$langs->trans(
"ErrorInvoiceOfThisTypeMustBePositive");
4439 foreach (
$object->lines as $line) {
4440 $res = $line->fetch_product();
4442 if ($line->product->isService() && $line->product->isMandatoryPeriod() && (empty($line->date_start) || empty($line->date_end))) {
4448 if ($nbMandated > 0) {
4450 setEventMessages($langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate"),
null,
'errors');
4453 $text .=
'<div><span class="clearboth nowraponall warning">'.img_warning().$langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate").
'</span></div>';
4458 $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, 240);
4463 if ($action ==
'modif') {
4464 $text = $langs->trans(
'ConfirmUnvalidateBill',
$object->ref);
4465 $formquestion = array();
4468 $qualified_for_stock_change = 0;
4470 $qualified_for_stock_change =
$object->hasProductsOrServices(2);
4472 $qualified_for_stock_change =
$object->hasProductsOrServices(1);
4475 if ($qualified_for_stock_change) {
4476 $langs->load(
"stocks");
4477 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
4478 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/entrepot.class.php';
4481 $warehouse_array = $warehouse->list_array();
4482 if (count($warehouse_array) == 1) {
4483 $label =
$object->type ==
Facture::TYPE_CREDIT_NOTE ? $langs->trans(
"WarehouseForStockDecrease", current($warehouse_array)) : $langs->trans(
"WarehouseForStockIncrease", current($warehouse_array));
4484 $value =
'<input type="hidden" id="idwarehouse" name="idwarehouse" value="'.key($warehouse_array).
'">';
4487 $value = $formproduct->selectWarehouses(
GETPOST(
'idwarehouse') ?
GETPOST(
'idwarehouse') :
'ifone',
'idwarehouse',
'', 1);
4489 $formquestion = array(
4495 array(
'type' =>
'other',
'name' =>
'idwarehouse',
'label' => $label,
'value' => $value));
4499 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?facid='.
$object->id, $langs->trans(
'UnvalidateBill'), $text,
'confirm_modif', $formquestion,
"yes", 1);
4503 if ($action ==
'paid' && ($resteapayer <= 0 || (
getDolGlobalString(
'INVOICE_CAN_SET_PAID_EVEN_IF_PARTIALLY_PAID') && $resteapayer ==
$object->total_ttc))) {
4504 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?facid='.
$object->id, $langs->trans(
'ClassifyPaid'), $langs->trans(
'ConfirmClassifyPaidBill',
$object->ref),
'confirm_paid',
'',
"yes", 1);
4506 if ($action ==
'paid' && $resteapayer > 0 && (!
getDolGlobalString(
'INVOICE_CAN_SET_PAID_EVEN_IF_PARTIALLY_PAID') || $resteapayer !=
$object->total_ttc)) {
4510 $close[$i][
'code'] =
'discount_vat';
4512 $close[$i][
'code'] =
'badcustomer';
4514 $close[$i][
'code'] =
'bankcharge';
4516 $close[$i][
'code'] =
'withholdingtax';
4518 $close[$i][
'code'] =
'other';
4522 $close[$i][
'label'] = $langs->trans(
"HelpEscompte").
'<br><br>'.$langs->trans(
"ConfirmClassifyPaidPartiallyReasonDiscountVatDesc");
4524 $close[$i][
'label'] = $langs->trans(
"ConfirmClassifyPaidPartiallyReasonBadCustomerDesc");
4526 $close[$i][
'label'] = $langs->trans(
"ConfirmClassifyPaidPartiallyReasonBankChargeDesc");
4528 $close[$i][
'label'] = $langs->trans(
"ConfirmClassifyPaidPartiallyReasonWithholdingTaxDesc");
4530 $close[$i][
'label'] = $langs->trans(
"Other");
4534 $close[$i][
'reason'] = $form->textwithpicto($langs->transnoentities(
"ConfirmClassifyPaidPartiallyReasonDiscount", $resteapayer, $langs->trans(
"Currency".$conf->currency)), $close[$i][
'label'], 1);
4536 $close[$i][
'reason'] = $form->textwithpicto($langs->transnoentities(
"ConfirmClassifyPaidPartiallyReasonBadCustomer", $resteapayer, $langs->trans(
"Currency".$conf->currency)), $close[$i][
'label'], 1);
4538 $close[$i][
'reason'] = $form->textwithpicto($langs->transnoentities(
"ConfirmClassifyPaidPartiallyReasonBankCharge", $resteapayer, $langs->trans(
"Currency".$conf->currency)), $close[$i][
'label'], 1);
4540 $close[$i][
'reason'] = $form->textwithpicto($langs->transnoentities(
"ConfirmClassifyPaidPartiallyReasonWithholdingTax"), $close[$i][
'label'], 1);
4542 $close[$i][
'reason'] = $form->textwithpicto($langs->transnoentities(
"Other"), $close[$i][
'label'], 1);
4546 foreach ($close as $key => $val) {
4547 $arrayreasons[$close[$key][
'code']] = $close[$key][
'reason'];
4551 $formquestion = array(
'text' => $langs->trans(
"ConfirmClassifyPaidPartiallyQuestion"), 0 => array(
'type' =>
'radio',
'name' =>
'close_code',
'label' => $langs->trans(
"Reason"),
'values' => $arrayreasons), 1 => array(
'type' =>
'text',
'name' =>
'close_note',
'label' => $langs->trans(
"Comment"),
'value' =>
'',
'morecss' =>
'minwidth300'));
4553 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?facid='.
$object->id, $langs->trans(
'ClassifyPaid'), $langs->trans(
'ConfirmClassifyPaidPartially',
$object->ref),
'confirm_paid_partially', $formquestion,
"yes", 1, 380, 600);
4557 if ($action ==
'canceled') {
4560 if ($objectidnext) {
4561 $facturereplacement =
new Facture($db);
4562 $facturereplacement->fetch($objectidnext);
4563 $statusreplacement = $facturereplacement->status;
4565 if ($objectidnext && $statusreplacement == 0) {
4566 print
'<div class="error">'.$langs->trans(
"ErrorCantCancelIfReplacementInvoiceNotValidated").
'</div>';
4569 $close[1][
'code'] =
'badcustomer';
4570 $close[2][
'code'] =
'abandon';
4572 $close[1][
'label'] = $langs->trans(
"ConfirmClassifyPaidPartiallyReasonBadCustomerDesc");
4573 $close[2][
'label'] = $langs->trans(
"ConfirmClassifyAbandonReasonOtherDesc");
4575 $close[1][
'reason'] = $form->textwithpicto($langs->transnoentities(
"ConfirmClassifyPaidPartiallyReasonBadCustomer",
$object->ref), $close[1][
'label'], 1);
4576 $close[2][
'reason'] = $form->textwithpicto($langs->transnoentities(
"ConfirmClassifyAbandonReasonOther"), $close[2][
'label'], 1);
4579 $arrayreasons[$close[1][
'code']] = $close[1][
'reason'];
4580 $arrayreasons[$close[2][
'code']] = $close[2][
'reason'];
4583 $formquestion = array(
'text' => $langs->trans(
"ConfirmCancelBillQuestion"), 0 => array(
'type' =>
'radio',
'name' =>
'close_code',
'label' => $langs->trans(
"Reason"),
'values' => $arrayreasons), 1 => array(
'type' =>
'text',
'name' =>
'close_note',
'label' => $langs->trans(
"Comment"),
'value' =>
'',
'morecss' =>
'minwidth300'));
4585 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id, $langs->trans(
'CancelBill'), $langs->trans(
'ConfirmCancelBill',
$object->ref),
'confirm_canceled', $formquestion,
"yes", 1, 270);
4589 if ($action ==
'deletepayment') {
4590 $payment_id =
GETPOST(
'paiement_id');
4591 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&paiement_id='.$payment_id, $langs->trans(
'DeletePayment'), $langs->trans(
'ConfirmDeletePayment'),
'confirm_delete_paiement',
'',
'no', 1);
4595 if ($action ==
'ask_deleteline') {
4596 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?facid='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'',
'no', 1);
4600 if ($action ==
'clone') {
4601 $filter =
'(s.client:IN:1,2,3)';
4603 $formquestion = array(
4604 array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
$object->socid,
'socid', $filter, 1)),
4605 array(
'type' =>
'date',
'name' =>
'newdate',
'label' => $langs->trans(
"Date"),
'value' =>
dol_now())
4608 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?facid='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneInvoice',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1, 250);
4611 if ($action ==
"remove_file_comfirm") {
4612 $file =
GETPOST(
'file',
'alpha');
4614 $formconfirm = $form->formconfirm(
4615 $_SERVER[
"PHP_SELF"].
'?facid='.
$object->id.
'&file='.urlencode($file),
4616 $langs->trans(
'DeleteFileHeader'),
4617 $langs->trans(
'DeleteFileText').
"<br><br>".$file,
4626 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid,
'remainingtopay' => &$resteapayer);
4627 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters,
$object, $action);
4628 if (empty($reshook)) {
4629 $formconfirm .= $hookmanager->resPrint;
4630 } elseif ($reshook > 0) {
4631 $formconfirm = $hookmanager->resPrint;
4639 $linkback =
'<a href="'.DOL_URL_ROOT.
'/compta/facture/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
4641 $morehtmlref =
'<div class="refidno">';
4644 $morehtmlref .= $form->editfieldkey(
"Ref",
'ref',
$object->ref,
$object, $usercancreate,
'string',
'', 0, 1);
4645 $morehtmlref .= $form->editfieldval(
"Ref",
'ref',
$object->ref,
$object, $usercancreate,
'string',
'',
null,
null,
'', 1);
4646 $morehtmlref .=
'<br>';
4649 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_client',
$object->ref_customer,
$object, $usercancreate,
'string',
'', 0, 1);
4650 $morehtmlref .= $form->editfieldval(
"RefCustomer",
'ref_client',
$object->ref_customer,
$object, $usercancreate,
'string'.(getDolGlobalString(
'THIRDPARTY_REF_INPUT_SIZE') ?
':' .
getDolGlobalString(
'THIRDPARTY_REF_INPUT_SIZE') :
''),
'', null, null,
'', 1);
4652 $morehtmlref .=
'<br>'.$object->thirdparty->getNomUrl(1,
'customer');
4654 $morehtmlref .=
' (<a href="'.DOL_URL_ROOT.
'/compta/facture/list.php?socid='.
$object->thirdparty->id.
'&search_societe='.urlencode(
$object->thirdparty->name).
'">'.$langs->trans(
"OtherBills").
'</a>)';
4657 if (isModEnabled(
'project')) {
4658 $langs->load(
"projects");
4659 $morehtmlref .=
'<br>';
4660 if ($usercancreate) {
4661 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
4662 if ($action !=
'classify') {
4663 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
4665 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->socid,
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
4667 if (!empty(
$object->fk_project)) {
4669 $proj->fetch(
$object->fk_project);
4670 $morehtmlref .= $proj->getNomUrl(1);
4672 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
4677 $morehtmlref .=
'</div>';
4679 $object->totalpaid = $totalpaid;
4680 $object->totalcreditnotes = $totalcreditnotes;
4681 $object->totaldeposits = $totaldeposits;
4684 dol_banner_tab(
$object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref,
'', 0,
'',
'');
4687 $parameters = array();
4689 $reshook = $hookmanager->executeHooks(
'tabContentViewInvoice', $parameters,
$object, $action);
4690 if (empty($reshook)) {
4691 print
'<div class="fichecenter">';
4692 print
'<div class="fichehalfleft">';
4693 print
'<div class="underbanner clearboth"></div>';
4695 print
'<table class="border centpercent tableforfield">';
4698 print
'<tr><td class="fieldname_type">'.$langs->trans(
'Type').
'</td><td class="valuefield fieldname_type">';
4701 print
' '.$object->getSubtypeLabel(
'facture');
4707 $facreplaced =
new Facture($db);
4708 $facreplaced->fetch(
$object->fk_facture_source);
4709 print
' <span class="opacitymediumbycolor paddingleft">'.$langs->transnoentities(
"ReplaceInvoice", $facreplaced->getNomUrl(1,
'', 32)).
'</span>';
4713 $facusing->fetch(
$object->fk_facture_source);
4714 print
' <span class="opacitymediumbycolor paddingleft">'.$langs->transnoentities(
"CorrectInvoice", $facusing->getNomUrl(1,
'', 32)).
'</span>';
4717 $facidavoir =
$object->getListIdAvoirFromInvoice();
4718 if (count($facidavoir) > 0) {
4719 print
' <span class="opacitymediumbycolor paddingleft">'.$langs->transnoentities(
"InvoiceHasAvoir");
4721 foreach ($facidavoir as $id) {
4728 $facavoir->fetch($id);
4729 print $facavoir->getNomUrl(1,
'', 32);
4733 if ($objectidnext > 0) {
4734 $facthatreplace =
new Facture($db);
4735 $facthatreplace->fetch($objectidnext);
4736 print
' <span class="opacitymediumbycolor paddingleft">'.str_replace(
'{s1}', $facthatreplace->getNomUrl(1), $langs->transnoentities(
"ReplacedByInvoice",
'{s1}')).
'</span>';
4741 $result = $discount->fetch(0,
$object->id);
4743 print
' <span class="opacitymediumbycolor paddingleft">';
4744 $s = $langs->trans(
"CreditNoteConvertedIntoDiscount",
'{s1}',
'{s2}');
4745 $s = str_replace(
'{s1}',
$object->getLibType(0), $s);
4746 $s = str_replace(
'{s2}', $discount->getNomUrl(1,
'discount'), $s);
4748 print
'</span><br>';
4752 if (
$object->fk_fac_rec_source > 0) {
4754 $result = $tmptemplate->fetch(
$object->fk_fac_rec_source);
4756 print
' <span class="opacitymediumbycolor paddingleft">';
4757 $s = $langs->transnoentities(
"GeneratedFromTemplate",
'{s1}');
4758 $s = str_replace(
'{s1}', $tmptemplate->getNomUrl(1,
'', 32), $s);
4766 print
'<!-- Discounts -->'.
"\n";
4767 print
'<tr><td>'.$langs->trans(
'DiscountStillRemaining').
'</td>';
4771 $backtopage = $_SERVER[
"PHP_SELF"].
'?facid='.
$object->id;
4772 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
4777 print
'<table class="nobordernopadding centpercent"><tr><td>';
4778 print $langs->trans(
'DateInvoice');
4780 if ($action !=
'editinvoicedate' &&
$object->status == $object::STATUS_DRAFT && $usercancreate && !
getDolGlobalString(
'FAC_FORCE_DATE_VALIDATION')) {
4781 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>';
4783 print
'</tr></table>';
4786 if ($action ==
'editinvoicedate') {
4787 $form->form_date($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id,
$object->date,
'invoicedate');
4789 print
'<span class="valuedate">'.dol_print_date(
$object->date,
'day').
'</span>';
4798 print
'<table class="nobordernopadding centpercent"><tr><td>';
4799 print $langs->trans(
'DatePointOfTax');
4801 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>';
4802 print
'</tr></table>';
4804 if ($action ==
'editdate_pointoftax') {
4805 $form->form_date($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id,
$object->date_pointoftax,
'date_pointoftax');
4807 print
'<span class="valuedate">'.dol_print_date(
$object->date_pointoftax,
'day').
'</span>';
4814 print
'<table class="nobordernopadding centpercent"><tr><td>';
4815 print $langs->trans(
'PaymentConditionsShort');
4818 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>';
4820 print
'</tr></table>';
4823 if ($action ==
'editconditions') {
4824 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id,
$object->cond_reglement_id,
'cond_reglement_id');
4826 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id,
$object->cond_reglement_id,
'none');
4835 print
'<table class="nobordernopadding centpercent"><tr><td>';
4836 print $langs->trans(
'DateMaxPayment');
4839 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>';
4841 print
'</tr></table>';
4844 if ($action ==
'editpaymentterm') {
4845 $form->form_date($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id,
$object->date_lim_reglement,
'paymentterm');
4847 print
'<span class="valuedate">'.dol_print_date(
$object->date_lim_reglement,
'day').
'</span>';
4859 print
'<table class="nobordernopadding centpercent"><tr><td>';
4860 print $langs->trans(
'PaymentMode');
4862 if ($action !=
'editmode' && $usercancreate) {
4863 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>';
4865 print
'</tr></table>';
4867 if ($action ==
'editmode') {
4868 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id,
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
4870 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id,
$object->mode_reglement_id,
'none',
'CRDT');
4875 if (isModEnabled(
'multicurrency')) {
4879 print
'<table class="nobordernopadding centpercent"><tr><td>';
4880 print $form->editfieldkey(
'Currency',
'multicurrency_code',
'',
$object, 0);
4882 if ($usercancreate && $action !=
'editmulticurrencycode' &&
$object->status == $object::STATUS_DRAFT) {
4883 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>';
4885 print
'</tr></table>';
4887 $htmlname = (($usercancreate && $action ==
'editmulticurrencycode') ?
'multicurrency_code' :
'none');
4888 $form->form_multicurrency_code($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->multicurrency_code, $htmlname);
4892 if (
$object->multicurrency_code != $conf->currency ||
$object->multicurrency_tx != 1) {
4895 print
'<table class="nobordernopadding" width="100%"><tr><td>';
4896 print $form->editfieldkey(
'CurrencyRate',
'multicurrency_tx',
'',
$object, 0);
4898 if ($usercancreate && $action !=
'editmulticurrencyrate' &&
$object->status == $object::STATUS_DRAFT &&
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency) {
4899 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>';
4901 print
'</tr></table>';
4903 if ($action ==
'editmulticurrencyrate' || $action ==
'actualizemulticurrencyrate') {
4904 if ($action ==
'actualizemulticurrencyrate') {
4907 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->multicurrency_tx, ($usercancreate ?
'multicurrency_tx' :
'none'),
$object->multicurrency_code);
4909 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->multicurrency_tx,
'none',
$object->multicurrency_code);
4910 if (
$object->status == $object::STATUS_DRAFT &&
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency) {
4911 print
'<div class="inline-block"> ';
4912 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=actualizemulticurrencyrate">'.$langs->trans(
"ActualizeCurrency").
'</a>';
4921 if (isModEnabled(
"bank")) {
4922 print
'<tr><td class="nowrap">';
4923 print
'<table class="nobordernopadding centpercent"><tr><td class="nowrap">';
4924 print $langs->trans(
'BankAccount');
4926 if (($action !=
'editbankaccount') && $usercancreate) {
4927 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>';
4929 print
'</tr></table>';
4931 if ($action ==
'editbankaccount') {
4932 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->fk_account,
'fk_account', 1);
4934 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->fk_account,
'none');
4941 if (isModEnabled(
'incoterm')) {
4943 print
'<table class="nobordernopadding centpercent"><tr><td>';
4944 print $langs->trans(
'IncotermLabel');
4945 print
'<td><td class="right">';
4946 if ($usercancreate) {
4947 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/compta/facture/card.php?facid='.
$object->id.
'&action=editincoterm&token='.
newToken().
'">'.
img_edit().
'</a>';
4951 print
'</td></tr></table>';
4954 if ($action !=
'editincoterm') {
4955 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
4957 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
4965 $displayWarranty =
true;
4966 if (!in_array(
$object->type, $retainedWarrantyInvoiceAvailableType) && empty(
$object->retained_warranty)) {
4967 $displayWarranty =
false;
4970 if ($displayWarranty) {
4972 print
'<tr class="retained-warranty-lines" ><td>';
4973 print
'<table id="retained-warranty-table" class="nobordernopadding centpercent"><tr><td>';
4974 print $langs->trans(
'RetainedWarranty');
4977 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>';
4980 print
'</tr></table>';
4983 print
'<form id="retained-warranty-form" method="POST" action="'.$_SERVER[
'PHP_SELF'].
'?facid='.
$object->id.
'">';
4984 print
'<input type="hidden" name="action" value="setretainedwarranty">';
4985 print
'<input type="hidden" name="token" value="'.newToken().
'">';
4986 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
4987 print
'<input name="retained_warranty" type="number" step="0.01" min="0" max="100" value="'.$object->retained_warranty.
'" >';
4988 print
'<input type="submit" class="button valignmiddle smallpaddingimp" value="'.$langs->trans(
"Modify").
'">';
4996 print
'<tr class="retained-warranty-lines" ><td>';
4997 print
'<table id="retained-warranty-cond-reglement-table" class="nobordernopadding" width="100%"><tr><td>';
4998 print $langs->trans(
'PaymentConditionsShortRetainedWarranty');
5000 if ($action !=
'editretainedwarrantypaymentterms' && $user->hasRight(
'facture',
'creer') &&
$object->status ==
Facture::STATUS_DRAFT) {
5001 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>';
5004 print
'</tr></table>';
5006 $defaultDate = !empty(
$object->retained_warranty_date_limit) ?
$object->retained_warranty_date_limit : strtotime(
'-1 years',
$object->date_lim_reglement);
5007 if (
$object->date > $defaultDate) {
5013 print
'<form method="POST" action="'.$_SERVER[
'PHP_SELF'].
'?facid='.
$object->id.
'">';
5014 print
'<input type="hidden" name="action" value="setretainedwarrantyconditions">';
5015 print
'<input type="hidden" name="token" value="'.newToken().
'">';
5016 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
5017 $retained_warranty_fk_cond_reglement =
GETPOSTINT(
'retained_warranty_fk_cond_reglement');
5018 $retained_warranty_fk_cond_reglement = !empty($retained_warranty_fk_cond_reglement) ? $retained_warranty_fk_cond_reglement :
$object->retained_warranty_fk_cond_reglement;
5019 $retained_warranty_fk_cond_reglement = !empty($retained_warranty_fk_cond_reglement) ? $retained_warranty_fk_cond_reglement :
getDolGlobalString(
'INVOICE_SITUATION_DEFAULT_RETAINED_WARRANTY_COND_ID');
5020 print $form->getSelectConditionsPaiements($retained_warranty_fk_cond_reglement,
'retained_warranty_fk_cond_reglement', -1, 1);
5021 print
'<input type="submit" class="button valignmiddle" value="'.$langs->trans(
"Modify").
'">';
5024 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?facid='.
$object->id,
$object->retained_warranty_fk_cond_reglement,
'none');
5025 if (!$displayWarranty) {
5026 print
img_picto($langs->trans(
'RetainedWarrantyNeed100Percent'),
'warning.png',
'class="pictowarning valignmiddle" ');
5032 print
'<tr class="retained-warranty-lines" ><td>';
5033 print
'<table id="retained-warranty-date-limit-table" class="nobordernopadding" width="100%"><tr><td>';
5034 print $langs->trans(
'RetainedWarrantyDateLimit');
5037 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>';
5040 print
'</tr></table>';
5042 $defaultDate = !empty(
$object->retained_warranty_date_limit) ?
$object->retained_warranty_date_limit : strtotime(
'-1 years',
$object->date_lim_reglement);
5043 if (
$object->date > $defaultDate) {
5049 print
'<form method="POST" action="'.$_SERVER[
'PHP_SELF'].
'?facid='.
$object->id.
'">';
5050 print
'<input type="hidden" name="action" value="setretainedwarrantydatelimit">';
5051 print
'<input type="hidden" name="token" value="'.newToken().
'">';
5052 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
5053 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').
'" >';
5054 print
'<input type="submit" class="button valignmiddle" value="'.$langs->trans(
"Modify").
'">';
5066 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
5071 print
'<div class="fichehalfright">';
5073 print
'<!-- amounts -->'.
"\n";
5074 print
'<div class="underbanner clearboth"></div>'.
"\n";
5076 print
'<table class="border tableforfield centpercent">';
5084 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountHT') .
'</td>';
5085 print
'<td class="nowrap amountcard right">' .
price($sign *
$object->total_ht, 0, $langs, 0, -1, -1, $conf->currency) .
'</td>';
5086 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
5088 print
'<td class="nowrap amountcard right">' .
price($sign *
$object->multicurrency_total_ht, 0, $langs, 0, -1, -1,
$object->multicurrency_code) .
'</td>';
5094 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountVAT') .
'</td>';
5095 print
'<td class="nowrap amountcard right">' .
price($sign *
$object->total_tva, 0, $langs, 0, -1, -1, $conf->currency) .
'</td>';
5096 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
5098 print
'<td class="nowrap amountcard right">' .
price($sign *
$object->multicurrency_total_tva, 0, $langs, 0, -1, -1,
$object->multicurrency_code) .
'</td>';
5103 if (($mysoc->localtax1_assuj ==
"1" && $mysoc->useLocalTax(1)) ||
$object->total_localtax1 != 0) {
5105 print
'<td class="titlefieldmiddle">' . $langs->transcountry(
"AmountLT1", $mysoc->country_code) .
'</td>';
5106 print
'<td class="nowrap amountcard right">' .
price($sign *
$object->total_localtax1, 0, $langs, 0, -1, -1, $conf->currency) .
'</td>';
5107 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
5110 print
'<td class="nowrap amountcard right">' .
price($sign *
$object->multicurrency_total_localtax1, 0, $langs, 0, -1, -1,
$object->multicurrency_code) .
'</td>';
5115 if (($mysoc->localtax2_assuj ==
"1" && $mysoc->useLocalTax(2)) ||
$object->total_localtax2 != 0) {
5117 print
'<td>' . $langs->transcountry(
"AmountLT2", $mysoc->country_code) .
'</td>';
5118 print
'<td class="nowrap amountcard right">' .
price($sign *
$object->total_localtax2, 0, $langs, 0, -1, -1, $conf->currency) .
'</td>';
5119 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
5122 print
'<td class="nowrap amountcard right">' .
price($sign *
$object->multicurrency_total_localtax2, 0, $langs, 0, -1, -1,
$object->multicurrency_code) .
'</td>';
5128 if ($selleruserevenustamp) {
5129 print
'<tr><td class="titlefieldmiddle">';
5130 print
'<table class="nobordernopadding centpercent"><tr><td>';
5131 print $langs->trans(
'RevenueStamp');
5133 if ($action !=
'editrevenuestamp' &&
$object->status == $object::STATUS_DRAFT && $usercancreate) {
5134 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>';
5136 print
'</tr></table>';
5137 print
'</td><td class="nowrap amountcard right">';
5138 if ($action ==
'editrevenuestamp') {
5139 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
5140 print
'<input type="hidden" name="token" value="'.newToken().
'">';
5141 print
'<input type="hidden" name="action" value="setrevenuestamp">';
5142 print
'<input type="hidden" name="revenuestamp" id="revenuestamp_val" value="'.price2num(
$object->revenuestamp).
'">';
5143 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
5144 print $formother->select_revenue_stamp(
'',
'revenuestamp_type', $mysoc->country_code);
5145 print
' → <span id="revenuestamp_span"></span>';
5146 print
' <input type="submit" class="button buttongen button-save small" value="'.$langs->trans(
'Modify').
'">';
5149 $(document).ready(function(){
5150 js_recalculate_revenuestamp();
5151 $('select[name=revenuestamp_type]').on('change',function(){
5152 js_recalculate_revenuestamp();
5155 function js_recalculate_revenuestamp(){
5156 var valselected = $('select[name=revenuestamp_type]').val();
5157 console.log('Calculate revenue stamp from '+valselected);
5159 if (valselected.indexOf('%') == -1)
5161 revenue = valselected;
5165 var revenue_type = parseFloat(valselected);
5166 var amount_net = ".round(
$object->total_ht, 2).
";
5167 revenue = revenue_type * amount_net / 100;
5168 revenue = revenue.toFixed(2);
5170 $('#revenuestamp_val').val(revenue);
5171 $('#revenuestamp_span').html(revenue);
5175 print
price(
$object->revenuestamp, 1,
'', 1, -1, -1, $conf->currency);
5182 print
'<td>' . $langs->trans(
'AmountTTC') .
'</td>';
5183 print
'<td class="nowrap amountcard right">' .
price($sign *
$object->total_ttc, 0, $langs, 0, -1, -1, $conf->currency) .
'</td>';
5184 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
5186 print
'<td class="nowrap amountcard right">' .
price($sign *
$object->multicurrency_total_ttc, 0, $langs, 0, -1, -1,
$object->multicurrency_code) .
'</td>';
5194 if (isModEnabled(
'project')) {
5197 if (isModEnabled(
"bank")) {
5201 if ($mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
5204 if ($mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
5207 if ($selleruserevenustamp) {
5210 if (isModEnabled(
'multicurrency')) {
5213 if (isModEnabled(
'incoterm')) {
5219 print
'<!-- List of situation invoices -->';
5220 print
'<table class="noborder situationstable" width="100%">';
5222 print
'<tr class="liste_titre">';
5223 print
'<td>'.$langs->trans(
'ListOfSituationInvoices').
'</td>';
5225 print
'<td class="center">'.$langs->trans(
'Situation').
'</td>';
5226 if (isModEnabled(
"bank")) {
5227 print
'<td class="right"></td>';
5229 print
'<td class="right">'.$langs->trans(
'AmountHT').
'</td>';
5230 print
'<td class="right">'.$langs->trans(
'AmountTTC').
'</td>';
5231 print
'<td width="18"> </td>';
5234 $total_prev_ht = $total_prev_ttc = 0;
5235 $total_global_ht = $total_global_ttc = 0;
5237 if (count(
$object->tab_previous_situation_invoice) > 0) {
5240 $current_situation_counter = array();
5241 foreach (
$object->tab_previous_situation_invoice as $prev_invoice) {
5242 $tmptotalpaidforthisinvoice = $prev_invoice->getSommePaiement();
5243 $total_prev_ht += $prev_invoice->total_ht;
5244 $total_prev_ttc += $prev_invoice->total_ttc;
5245 $current_situation_counter[] = (($prev_invoice->type ==
Facture::TYPE_CREDIT_NOTE) ? -1 : 1) * $prev_invoice->situation_counter;
5246 print
'<tr class="oddeven">';
5247 print
'<td>'.$prev_invoice->getNomUrl(1).
'</td>';
5249 print
'<td align="center" >'.(($prev_invoice->type ==
Facture::TYPE_CREDIT_NOTE) ? $langs->trans(
'situationInvoiceShortcode_AS') : $langs->trans(
'situationInvoiceShortcode_S')).$prev_invoice->situation_counter.
'</td>';
5250 if (isModEnabled(
"bank")) {
5251 print
'<td class="right"></td>';
5253 print
'<td class="right"><span class="amount">'.price($prev_invoice->total_ht).
'</span></td>';
5254 print
'<td class="right"><span class="amount">'.price($prev_invoice->total_ttc).
'</span></td>';
5255 print
'<td class="right">'.$prev_invoice->getLibStatut(3, $tmptotalpaidforthisinvoice).
'</td>';
5261 $total_global_ht += $total_prev_ht;
5262 $total_global_ttc += $total_prev_ttc;
5263 $total_global_ht +=
$object->total_ht;
5264 $total_global_ttc +=
$object->total_ttc;
5266 print
'<tr class="oddeven">';
5267 print
'<td>'.$object->getNomUrl(1).
'</td>';
5269 print
'<td class="center">'.(($object->type ==
Facture::TYPE_CREDIT_NOTE) ? $langs->trans(
'situationInvoiceShortcode_AS') : $langs->trans(
'situationInvoiceShortcode_S')).
$object->situation_counter.
'</td>';
5270 if (isModEnabled(
"bank")) {
5271 print
'<td class="right"></td>';
5273 print
'<td class="right"><span class="amount">'.price(
$object->total_ht).
'</span></td>';
5274 print
'<td class="right"><span class="amount">'.price(
$object->total_ttc).
'</span></td>';
5275 print
'<td class="right">'.$object->getLibStatut(3,
$object->getSommePaiement()).
'</td>';
5279 print
'<tr class="oddeven">';
5280 print
'<td colspan="2" class="left"><b>'.$langs->trans(
'CurrentSituationTotal').
'</b></td>';
5283 foreach ($current_situation_counter as $sit) {
5284 $curSign = $sit > 0 ?
'+' :
'-';
5285 $curType = $sit > 0 ? $langs->trans(
'situationInvoiceShortcode_S') : $langs->trans(
'situationInvoiceShortcode_AS');
5287 print
' '.$curSign.
' ';
5289 print $curType.abs($sit);
5293 if (isModEnabled(
"bank")) {
5296 print
'<td class="right"><b>'.price($total_global_ht).
'</b></td>';
5297 print
'<td class="right"><b>'.price($total_global_ttc).
'</b></td>';
5298 print
'<td width="18"> </td>';
5302 if (count(
$object->tab_next_situation_invoice) > 0) {
5314 $total_next_ht = $total_next_ttc = 0;
5316 foreach (
$object->tab_next_situation_invoice as $next_invoice) {
5317 $totalpaid = $next_invoice->getSommePaiement();
5318 $total_next_ht += $next_invoice->total_ht;
5319 $total_next_ttc += $next_invoice->total_ttc;
5321 print
'<tr class="oddeven">';
5322 print
'<td>'.$next_invoice->getNomUrl(1).
'</td>';
5324 print
'<td class="center">'.(($next_invoice->type ==
Facture::TYPE_CREDIT_NOTE) ? $langs->trans(
'situationInvoiceShortcode_AS') : $langs->trans(
'situationInvoiceShortcode_S')).$next_invoice->situation_counter.
'</td>';
5325 if (isModEnabled(
"bank")) {
5326 print
'<td class="right"></td>';
5328 print
'<td class="right"><span class="amount">'.price($next_invoice->total_ht).
'</span></td>';
5329 print
'<td class="right"><span class="amount">'.price($next_invoice->total_ttc).
'</span></td>';
5330 print
'<td class="right">'.$next_invoice->getLibStatut(3, $totalpaid).
'</td>';
5334 $total_global_ht += $total_next_ht;
5335 $total_global_ttc += $total_next_ttc;
5337 print
'<tr class="oddeven">';
5338 print
'<td colspan="3" class="right"></td>';
5339 if (isModEnabled(
"bank")) {
5340 print
'<td class="right"></td>';
5342 print
'<td class="right"><b>'.price($total_global_ht).
'</b></td>';
5343 print
'<td class="right"><b>'.price($total_global_ttc).
'</b></td>';
5344 print
'<td width="18"> </td>';
5352 if (
$object->type == $object::TYPE_CREDIT_NOTE) {
5358 print
'<!-- List of payments already done -->';
5359 print
'<div class="div-table-responsive-no-min">';
5360 print
'<table class="noborder paymenttable centpercent">';
5362 print
'<tr class="liste_titre">';
5363 print
'<td class="liste_titre">'.($object->type ==
Facture::TYPE_CREDIT_NOTE ? $langs->trans(
"PaymentsBack") : $langs->trans(
'Payments')).
'</td>';
5364 print
'<td class="liste_titre"><span class="hideonsmartphone">'.$langs->trans(
'Date').
'</span></td>';
5365 print
'<td class="liste_titre"><span class="hideonsmartphone">'.$langs->trans(
'Type').
'</span></td>';
5366 if (isModEnabled(
"bank")) {
5367 print
'<td class="liste_titre"><span class="hideonsmartphone">'.$langs->trans(
'BankAccount').
'</span></td>';
5369 print
'<td class="liste_titre right">'.$langs->trans(
'Amount').
'</td>';
5370 print
'<td class="liste_titre" width="18"> </td>';
5374 $sql =
'SELECT p.datep as dp, p.ref, p.num_paiement as num_payment, p.rowid, p.fk_bank,';
5375 $sql .=
' c.code as payment_code, c.libelle as payment_label,';
5376 $sql .=
' pf.amount,';
5377 $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';
5378 $sql .=
' FROM '.MAIN_DB_PREFIX.
'paiement_facture as pf, '.MAIN_DB_PREFIX.
'paiement as p';
5379 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_paiement as c ON p.fk_paiement = c.id';
5380 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'bank as b ON p.fk_bank = b.rowid';
5381 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'bank_account as ba ON b.fk_account = ba.rowid';
5382 $sql .=
' WHERE pf.fk_facture = '.((int)
$object->id).
' AND pf.fk_paiement = p.rowid';
5383 $sql .=
' AND p.entity IN ('.getEntity(
'invoice').
')';
5384 $sql .=
' ORDER BY p.datep, p.tms';
5386 $result = $db->query($sql);
5388 $num = $db->num_rows($result);
5393 $objp = $db->fetch_object($result);
5395 $paymentstatic->id = $objp->rowid;
5396 $paymentstatic->datepaye = $db->jdate($objp->dp);
5397 $paymentstatic->ref = $objp->ref;
5398 $paymentstatic->num_payment = $objp->num_payment;
5399 $paymentstatic->paiementcode = $objp->payment_code;
5401 print
'<tr class="oddeven"><td class="nowraponall">';
5402 print $paymentstatic->getNomUrl(1);
5405 $dateofpayment = $db->jdate($objp->dp);
5407 if ($tmparray[
'seconds'] == 0 && $tmparray[
'minutes'] == 0 && ($tmparray[
'hours'] == 0 || $tmparray[
'hours'] == 12)) {
5414 $label = ($langs->trans(
"PaymentType".$objp->payment_code) !=
"PaymentType".$objp->payment_code) ? $langs->trans(
"PaymentType".$objp->payment_code) : $objp->payment_label;
5415 print
'<td class="tdoverflowmax80" title="'.dol_escape_htmltag($label.
' '.$objp->num_payment).
'">'.
dol_escape_htmltag($label.
' '.$objp->num_payment).
'</td>';
5416 if (isModEnabled(
"bank")) {
5417 $bankaccountstatic->id = $objp->baid;
5418 $bankaccountstatic->ref = $objp->baref;
5419 $bankaccountstatic->label = $objp->baref;
5420 $bankaccountstatic->number = $objp->banumber;
5421 $bankaccountstatic->currency_code = $objp->bacurrency_code;
5423 if (isModEnabled(
'accounting')) {
5424 $bankaccountstatic->account_number = $objp->account_number;
5427 $accountingjournal->fetch($objp->fk_accountancy_journal);
5428 $bankaccountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1,
'', 1);
5431 print
'<td class="nowraponall">';
5432 if ($bankaccountstatic->id) {
5433 print $bankaccountstatic->getNomUrl(1,
'transactions');
5437 print
'<td class="right"><span class="amount">'.price($sign * $objp->amount).
'</span></td>';
5438 print
'<td class="center">';
5441 $paiement->fetch($objp->rowid);
5443 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=deletepayment&token='.
newToken().
'&paiement_id='.$objp->rowid.
'">';
5460 print
'<tr><td colspan="'.$nbcols.
'" class="right">';
5461 print
'<span class="opacitymedium">';
5463 print $langs->trans(
'AlreadyPaidNoCreditNotesNoDeposits');
5465 print $langs->trans(
'AlreadyPaid');
5467 print
'</span></td><td class="right'.(($totalpaid > 0) ?
' amountalreadypaid' :
'').
'">'.
price($totalpaid).
'</td><td> </td></tr>';
5469 $resteapayeraffiche = $resteapayer;
5470 $cssforamountpaymentcomplete =
'amountpaymentcomplete';
5473 $creditnoteamount = 0;
5475 $sql =
"SELECT re.rowid, re.amount_ht, re.amount_tva, re.amount_ttc,";
5476 $sql .=
" re.description, re.fk_facture_source";
5477 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe_remise_except as re";
5478 $sql .=
" WHERE fk_facture = ".((int)
$object->id);
5479 $resql = $db->query($sql);
5481 $num = $db->num_rows($resql);
5485 $obj = $db->fetch_object($resql);
5486 $invoice->fetch($obj->fk_facture_source);
5487 print
'<tr><td colspan="'.$nbcols.
'" class="right">';
5488 print
'<span class="opacitymedium">';
5490 print $langs->trans(
"CreditNote").
' ';
5493 print $langs->trans(
"Deposit").
' ';
5495 print $invoice->getNomUrl(0);
5498 print
'<td class="right"><span class="amount">'.price($obj->amount_ttc).
'</span></td>';
5499 print
'<td class="right">';
5500 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?facid='.
$object->id.
'&action=unlinkdiscount&token='.
newToken().
'&discountid='.$obj->rowid.
'">';
5501 print
img_picto($langs->transnoentitiesnoconv(
"RemoveDiscount"),
'unlink');
5506 $creditnoteamount += $obj->amount_ttc;
5509 $depositamount += $obj->amount_ttc;
5518 print
'<tr><td colspan="'.$nbcols.
'" class="nowrap right">';
5519 print
'<span class="opacitymedium">';
5520 print $form->textwithpicto($langs->trans(
"Discount"), $langs->trans(
"HelpEscompte"), - 1);
5522 print
'</td><td class="right"><span class="amount">'.price(
price2num(
$object->total_ttc - $creditnoteamount - $depositamount - $totalpaid,
'MT')).
'</span></td><td> </td></tr>';
5523 $resteapayeraffiche = 0;
5524 $cssforamountpaymentcomplete =
'amountpaymentneutral';
5528 print
'<tr><td colspan="'.$nbcols.
'" class="nowrap right">';
5529 print
'<span class="opacitymedium">';
5530 print $form->textwithpicto($langs->trans(
"Abandoned"), $langs->trans(
"HelpAbandonBadCustomer"), - 1);
5532 print
'</td><td class="right">'.price(
price2num(
$object->total_ttc - $creditnoteamount - $depositamount - $totalpaid,
'MT')).
'</td><td> </td></tr>';
5534 $cssforamountpaymentcomplete =
'amountpaymentneutral';
5538 print
'<tr><td colspan="'.$nbcols.
'" class="nowrap right">';
5539 print
'<span class="opacitymedium">';
5540 print $form->textwithpicto($langs->trans(
"ProductReturned"), $langs->trans(
"HelpAbandonProductReturned"), - 1);
5542 print
'</td><td class="right"><span class="amount">'.price(
price2num(
$object->total_ttc - $creditnoteamount - $depositamount - $totalpaid,
'MT')).
'</span></td><td> </td></tr>';
5543 $resteapayeraffiche = 0;
5544 $cssforamountpaymentcomplete =
'amountpaymentneutral';
5548 print
'<tr><td colspan="'.$nbcols.
'" class="nowrap right">';
5549 $text = $langs->trans(
"HelpAbandonOther");
5551 $text .=
'<br><br><b>'.$langs->trans(
"Reason").
'</b>:'.
$object->close_note;
5553 print
'<span class="opacitymedium">';
5555 print $form->textwithpicto($langs->trans(
"Abandoned"), $text, - 1);
5557 print
'</td><td class="right"><span class="amount">'.price(
price2num(
$object->total_ttc - $creditnoteamount - $depositamount - $totalpaid,
'MT')).
'</span></td><td> </td></tr>';
5558 $resteapayeraffiche = 0;
5559 $cssforamountpaymentcomplete =
'amountpaymentneutral';
5563 print
'<tr><td colspan="'.$nbcols.
'" class="right">';
5564 print
'<span class="opacitymedium">';
5565 print $langs->trans(
"Billed");
5566 print
'</td><td class="right">'.price(
$object->total_ttc).
'</td><td> </td></tr>';
5568 print
'<tr><td colspan="'.$nbcols.
'" class="right">';
5569 print
'<span class="opacitymedium">';
5570 print $langs->trans(
'RemainderToPay');
5571 if ($resteapayeraffiche < 0) {
5572 print
' ('.$langs->trans(
'NegativeIfExcessReceived').
')';
5576 print
'<td class="right'.($resteapayeraffiche ?
' amountremaintopay' : (
' '.$cssforamountpaymentcomplete)).
'">'.
price($resteapayeraffiche).
'</td><td> </td></tr>';
5579 if (
$object->multicurrency_code != $conf->currency ||
$object->multicurrency_tx != 1) {
5580 print
'<tr><td colspan="'.$nbcols.
'" class="right">';
5581 print
'<span class="opacitymedium">';
5582 print $langs->trans(
'RemainderToPayMulticurrency');
5583 if ($resteapayeraffiche < 0) {
5584 print
' ('.$langs->trans(
'NegativeIfExcessReceived').
')';
5588 print
'<td class="right'.($resteapayeraffiche ?
' amountremaintopay' : (
' '.$cssforamountpaymentcomplete)).
'">';
5590 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>';
5594 if (!empty(
$object->situation_final) && !empty(
$object->retained_warranty) && $displayWarranty) {
5597 $retainedWarranty = $total_global_ttc *
$object->retained_warranty / 100;
5600 $retainedWarranty =
$object->total_ttc *
$object->retained_warranty / 100;
5603 $billedWithRetainedWarranty =
$object->total_ttc - $retainedWarranty;
5605 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>';
5608 print
'<tr><td colspan="'.$nbcols.
'" align="right">';
5609 print $langs->trans(
"RetainedWarranty").
' ('.
$object->retained_warranty.
'%)';
5610 print !empty(
$object->retained_warranty_date_limit) ?
' '.$langs->trans(
"ToPayOn",
dol_print_date(
$object->retained_warranty_date_limit,
'day')) :
'';
5611 print
' :</td><td align="right">'.price($retainedWarranty).
'</td><td> </td></tr>';
5614 $resteapayeraffiche = $resteapayer;
5615 $cssforamountpaymentcomplete =
'amountpaymentneutral';
5618 print
'<tr><td colspan="'.$nbcols.
'" class="right">';
5619 print
'<span class="opacitymedium">'.$langs->trans(
'AlreadyPaidBack').
'</span>';
5620 print
'</td><td class="right"><span class="amount">'.price($sign * $totalpaid).
'</span></td><td> </td></tr>';
5623 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>';
5626 print
'<tr><td colspan="'.$nbcols.
'" class="right">';
5627 print
'<span class="opacitymedium">'.$langs->trans(
'RemainderToPayBack');
5628 if ($resteapayeraffiche > 0) {
5629 print
' ('.$langs->trans(
'NegativeIfExcessRefunded').
')';
5631 print
'</span></td>';
5632 print
'<td class="right'.($resteapayeraffiche ?
' amountremaintopayback' : (
' '.$cssforamountpaymentcomplete)).
'">'.
price($sign * $resteapayeraffiche).
'</td>';
5633 print
'<td class="nowrap"> </td></tr>';
5636 if (
$object->multicurrency_code != $conf->currency ||
$object->multicurrency_tx != 1) {
5637 print
'<tr><td colspan="'.$nbcols.
'" class="right">';
5638 print
'<span class="opacitymedium">'.$langs->trans(
'RemainderToPayBackMulticurrency');
5639 if ($resteapayeraffiche > 0) {
5640 print
' ('.$langs->trans(
'NegativeIfExcessRefunded').
')';
5644 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>';
5657 if (isModEnabled(
'margin')) {
5658 $formmargin->displayMarginInfos(
$object);
5664 print
'<div class="clearboth"></div><br><br>';
5667 $blocname =
'contacts';
5668 $title = $langs->trans(
'ContactsAddresses');
5669 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
5673 $blocname =
'notes';
5674 $title = $langs->trans(
'Notes');
5675 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
5679 $result =
$object->getLinesArray();
5683 global $inputalsopricewithtax;
5684 $inputalsopricewithtax = 1;
5689 print
'<!-- Area to change globally the situation percent -->'.
"\n";
5690 print
'<div class="div-table-responsive">';
5692 print
'<form name="updatealllines" id="updatealllines" action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'#updatealllines" method="POST">';
5693 print
'<input type="hidden" name="token" value="'.newToken().
'" />';
5694 print
'<input type="hidden" name="action" value="updatealllines" />';
5695 print
'<input type="hidden" name="id" value="'.$object->id.
'" />';
5696 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
5698 print
'<table id="tablelines_all_progress" class="noborder noshadow" width="100%">';
5700 print
'<tr class="liste_titre nodrag nodrop">';
5704 print
'<td align="center" width="5"> </td>';
5706 print
'<td class="minwidth500imp">'.$langs->trans(
'ModifyAllLines').
'</td>';
5707 print
'<td class="right">'.$langs->trans(
'Progress').
'</td>';
5708 print
'<td> </td>';
5711 print
'<tr class="nodrag nodrop">';
5714 print
'<td align="center" width="5"> </td>';
5716 print
'<td> </td>';
5717 print
'<td class="nowrap right"><input type="text" size="1" value="" name="all_progress">%</td>';
5718 print
'<td class="right"><input type="submit" class="button" name="all_percent" value="Modifier" /></td>';
5729 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="POST">
5730 <input type="hidden" name="token" value="' .
newToken().
'">
5731 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
5732 <input type="hidden" name="mode" value="">
5733 <input type="hidden" name="page_y" value="">
5734 <input type="hidden" name="id" value="' .
$object->id.
'">
5735 <input type="hidden" name="backtopage" value="'.$backtopage.
'">
5738 if (!empty($conf->use_javascript_ajax) &&
$object->status == 0) {
5739 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
5742 print
'<div class="div-table-responsive-no-min">';
5743 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
5747 $object->printObjectLines($action, $mysoc, $soc, $lineid, 1);
5751 if (
$object->status == 0 && $usercancreate && $action !=
'valid') {
5752 if ($action !=
'editline' && $action !=
'selectlines') {
5755 $parameters = array();
5756 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters,
$object, $action);
5760 if (empty($reshook)) {
5761 $object->formAddObjectLine(1, $mysoc, $soc);
5764 $parameters = array();
5765 $reshook = $hookmanager->executeHooks(
'formEditObjectLine', $parameters,
$object, $action);
5779 if ($action !=
'prerelance' && $action !=
'presend' && $action !=
'valid' && $action !=
'editline') {
5780 print
'<div class="tabsAction">';
5782 $parameters = array();
5783 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters,
$object, $action);
5784 if (empty($reshook)) {
5787 'class' =>
'classfortooltip',
5794 $ventilExportCompta =
$object->getVentilExportCompta();
5796 if ($ventilExportCompta == 0) {
5798 if (!$objectidnext &&
$object->is_last_in_cycle()) {
5799 if ($usercanunvalidate) {
5800 unset($params[
'attr'][
'title']);
5801 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default', $_SERVER[
'PHP_SELF'].
'?facid='.
$object->id.
'&action=modif&token='.
newToken(),
'',
true, $params);
5803 $params[
'attr'][
'title'] = $langs->trans(
'NotEnoughPermissions');
5804 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default', $_SERVER[
'PHP_SELF'].
'?facid='.
$object->id.
'&action=modif&token='.
newToken(),
'',
false, $params);
5806 } elseif (!
$object->is_last_in_cycle()) {
5807 $params[
'attr'][
'title'] = $langs->trans(
'NotLastInCycle');
5808 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default',
'#',
'',
false, $params);
5810 $params[
'attr'][
'title'] = $langs->trans(
'DisabledBecauseReplacedInvoice');
5811 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default',
'#',
'',
false, $params);
5815 $params[
'attr'][
'title'] = $langs->trans(
'DisabledBecauseDispatchedInBookkeeping');
5816 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default',
'#',
'',
false, $params);
5821 $result = $discount->fetch(0,
$object->id);
5829 && ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || $usercanreopen)) {
5830 if (
$object->close_code !=
'replaced' || (!$objectidnext)) {
5831 unset($params[
'attr'][
'title']);
5832 print
dolGetButtonAction($langs->trans(
'ReOpen'),
'',
'default', $_SERVER[
'PHP_SELF'].
'?facid='.
$object->id.
'&action=reopen&token='.
newToken(),
'',
true, $params);
5834 $params[
'attr'][
'title'] = $langs->trans(
"DisabledBecauseReplacedInvoice");
5835 print
dolGetButtonAction($langs->trans(
'ReOpen'),
'',
'default',
'#',
'',
false, $params);
5842 $langs->load(
"contracts");
5844 if ($usercancreatecontract) {
5845 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>';
5852 if ($usercanvalidate) {
5853 unset($params[
'attr'][
'title']);
5854 print
dolGetButtonAction($langs->trans(
'Validate'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?facid='.
$object->id.
'&action=valid&token='.
newToken(),
'',
true, $params);
5859 if (empty($user->socid)) {
5861 if ($objectidnext) {
5862 print
'<span class="butActionRefused classfortooltip" title="'.$langs->trans(
"DisabledBecauseReplacedInvoice").
'">'.$langs->trans(
'SendMail').
'</span>';
5865 unset($params[
'attr'][
'title']);
5866 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default', $_SERVER[
'PHP_SELF'].
'?facid='.
$object->id.
'&action=presend&mode=init#formmailbeforetitle',
'',
true, $params);
5868 unset($params[
'attr'][
'title']);
5869 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default',
'#',
'',
false, $params);
5877 if ($resteapayer > 0) {
5878 if ($usercancreatewithdrarequest) {
5879 if (!$objectidnext &&
$object->close_code !=
'replaced') {
5880 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>';
5882 print
'<span class="butActionRefused classfortooltip" title="'.$langs->trans(
"DisabledBecauseReplacedInvoice").
'">'.$langs->trans(
'MakeWithdrawRequest').
'</span>';
5893 if (isModEnabled(
'takepos') &&
$object->module_source ==
'takepos') {
5894 $langs->load(
"cashdesk");
5895 $receipt_url = DOL_URL_ROOT.
"/takepos/receipt.php";
5896 print
'<a target="_blank" rel="noopener noreferrer" class="butAction" href="'.$receipt_url.
'?facid='.((int)
$object->id).
'">'.$langs->trans(
'POSTicket').
'</a>';
5901 if ($objectidnext) {
5902 print
'<span class="butActionRefused classfortooltip" title="'.$langs->trans(
"DisabledBecauseReplacedInvoice").
'">'.$langs->trans(
'DoPayment').
'</span>';
5906 $params[
'attr'][
'title'] = $langs->trans(
'DisabledBecauseRemainderToPayIsZero');
5907 print
dolGetButtonAction($langs->trans(
'DoPayment'),
'',
'default',
'#',
'',
false, $params);
5911 unset($params[
'attr'][
'title']);
5912 print
dolGetButtonAction($langs->trans(
'DoPayment'),
'',
'default', DOL_URL_ROOT.
'/compta/paiement.php?facid='.
$object->id.
'&action=create'.(
$object->fk_account > 0 ?
'&accountid='.$object->fk_account :
''),
'', true, $params);
5917 $sumofpayment = $totalpaid;
5918 $sumofpaymentall = $totalpaid + $totalcreditnotes + $totaldeposits;
5924 if ($resteapayer == 0) {
5925 print
'<span class="butActionRefused classfortooltip" title="'.$langs->trans(
"DisabledBecauseRemainderToPayIsZero").
'">'.$langs->trans(
'DoPaymentBack').
'</span>';
5927 print
'<a class="butAction" href="'.DOL_URL_ROOT.
'/compta/paiement.php?facid='.
$object->id.
'&action=create&accountid='.
$object->fk_account.
'">'.$langs->trans(
'DoPaymentBack').
'</a>';
5933 print
'<a class="butAction'.($conf->use_javascript_ajax ?
' reposition' :
'').
'" href="'.$_SERVER[
"PHP_SELF"].
'?facid='.
$object->id.
'&action=converttoreduc&token='.
newToken().
'">'.$langs->trans(
'ConvertExcessReceivedToReduc').
'</a>';
5937 && (
getDolGlobalString(
'INVOICE_ALLOW_REUSE_OF_CREDIT_WHEN_PARTIALLY_REFUNDED') || $sumofpayment == 0) &&
$object->total_ht < 0
5939 print
'<a class="butAction classfortooltip'.($conf->use_javascript_ajax ?
' reposition' :
'').
'" href="'.$_SERVER[
"PHP_SELF"].
'?facid='.
$object->id.
'&action=converttoreduc&token='.
newToken().
'" title="'.
dol_escape_htmltag($langs->trans(
"ConfirmConvertToReduc2")).
'">'.$langs->trans(
'ConvertToReduc').
'</a>';
5946 print
'<a class="butAction'.($conf->use_javascript_ajax ?
' reposition' :
'').
'" href="'.$_SERVER[
"PHP_SELF"].
'?facid='.
$object->id.
'&action=converttoreduc&token='.
newToken().
'">'.$langs->trans(
'ConvertToReduc').
'</a>';
5948 print
'<span class="butActionRefused classfortooltip" title="'.$langs->trans(
"AmountPaidMustMatchAmountOfDownPayment").
'">'.$langs->trans(
'ConvertToReduc').
'</span>';
5962 $params[
'attr'][
'title'] = $langs->trans(
'AmountPaidMustMatchAmountOfDownPayment');
5963 print
dolGetButtonAction($langs->trans(
'ClassifyPaid'),
'',
'default',
'#',
'',
false, $params);
5965 unset($params[
'attr'][
'title']);
5966 print
dolGetButtonAction($langs->trans(
'ClassifyPaid'),
'',
'default', $_SERVER[
'PHP_SELF'].
'?facid='.
$object->id.
'&action=paid&token='.
newToken(),
'',
true, $params);
5972 if ($totalpaid > 0 || $totalcreditnotes > 0) {
5974 print
'<a class="butAction'.($conf->use_javascript_ajax ?
' reposition' :
'').
'" href="'.$_SERVER[
'PHP_SELF'].
'?facid='.
$object->id.
'&action=paid&token='.
newToken().
'">'.$langs->trans(
'ClassifyPaidPartially').
'</a>';
5977 if ($objectidnext) {
5978 print
'<span class="butActionRefused classfortooltip" title="'.$langs->trans(
"DisabledBecauseReplacedInvoice").
'">'.$langs->trans(
'ClassifyCanceled').
'</span>';
5980 print
'<a class="butAction'.($conf->use_javascript_ajax ?
' reposition' :
'').
'" href="'.$_SERVER[
'PHP_SELF'].
'?facid='.
$object->id.
'&action=canceled">'.$langs->trans(
'ClassifyCanceled').
'</a>';
5988 if (!$objectidnext) {
5989 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>';
5996 && (
$object->total_ttc - $totalpaid - $totalcreditnotes - $totaldeposits) > 0
5999 &&
$object->is_last_in_cycle()
6002 if ($usercanunvalidate) {
6003 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>';
6005 print
'<span class="butActionRefused classfortooltip" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
"CreateCreditNote").
'</span>';
6011 unset($params[
'attr'][
'title']);
6012 print
dolGetButtonAction($langs->trans(
'ToClone'),
'',
'default', $_SERVER[
'PHP_SELF'].
'?facid='.
$object->id.
'&action=clone&object=invoice&token='.
newToken(),
'',
true, $params);
6017 if (!$objectidnext && count(
$object->lines) > 0) {
6018 unset($params[
'attr'][
'title']);
6019 print
dolGetButtonAction($langs->trans(
'ChangeIntoRepeatableInvoice'),
'',
'default', DOL_URL_ROOT.
'/compta/facture/card-rec.php?facid='.
$object->id.
'&action=create',
'',
true, $params);
6028 &&
$object->situation_counter > 1
6029 &&
$object->is_last_in_cycle()
6030 && $usercanunvalidate
6032 if ((
$object->total_ttc - $totalcreditnotes) == 0) {
6033 print
'<a id="butSituationOut" class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?facid='.
$object->id.
'&action=situationout">'.$langs->trans(
"RemoveSituationFromCycle").
'</a>';
6035 print
'<a id="butSituationOutRefused" class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"DisabledBecauseNotEnouthCreditNote").
'" >'.$langs->trans(
"RemoveSituationFromCycle").
'</a>';
6041 if (
$object->is_last_in_cycle() &&
$object->situation_final != 1) {
6042 print
'<a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?action=create&type=5&origin=facture&originid='.
$object->id.
'&socid='.
$object->socid.
'" >'.$langs->trans(
'CreateNextSituationInvoice').
'</a>';
6043 } elseif (!
$object->is_last_in_cycle()) {
6044 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"DisabledBecauseNotLastInCycle").
'">'.$langs->trans(
'CreateNextSituationInvoice').
'</a>';
6046 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"DisabledBecauseFinal").
'">'.$langs->trans(
'CreateNextSituationInvoice').
'</a>';
6051 $isErasable =
$object->is_erasable();
6053 if ($isErasable == -4) {
6054 $htmltooltip = $langs->trans(
'DisabledBecausePayments');
6055 } elseif ($isErasable == -3) {
6056 $htmltooltip = $langs->trans(
'DisabledBecauseNotLastSituationInvoice');
6057 } elseif ($isErasable == -2) {
6058 $htmltooltip = $langs->trans(
'DisabledBecauseNotLastInvoice');
6059 } elseif ($isErasable == -1) {
6060 $htmltooltip = $langs->trans(
'DisabledBecauseDispatchedInBookkeeping');
6061 } elseif ($isErasable <= 0) {
6062 $htmltooltip = $langs->trans(
'DisabledBecauseNotErasable');
6063 } elseif ($objectidnext) {
6064 $htmltooltip = $langs->trans(
'DisabledBecauseReplacedInvoice');
6066 if ($usercandelete || ($usercancreate && $isErasable == 1)) {
6067 $enableDelete =
false;
6069 if ($isErasable > 0 && ! $objectidnext) {
6070 $deleteHref = $_SERVER[
"PHP_SELF"].
'?facid='.
$object->id.
'&action=delete&token='.
newToken();
6071 $enableDelete =
true;
6073 unset($params[
'attr'][
'title']);
6074 print
dolGetButtonAction($htmltooltip, $langs->trans(
'Delete'),
'delete', $deleteHref,
'', $enableDelete, $params);
6076 unset($params[
'attr'][
'title']);
6077 print
dolGetButtonAction($htmltooltip, $langs->trans(
'Delete'),
'delete',
'#',
'',
false);
6084 if (
GETPOST(
'modelselected',
'alpha')) {
6085 $action =
'presend';
6087 if ($action !=
'prerelance' && $action !=
'presend') {
6088 print
'<div class="fichecenter"><div class="fichehalfleft">';
6089 print
'<a name="builddoc"></a>';
6094 $urlsource = $_SERVER[
'PHP_SELF'].
'?facid='.
$object->id;
6095 $genallowed = $usercanread;
6096 $delallowed = $usercancreate;
6098 print $formfile->showdocuments(
6118 'remove_file_comfirm'
6121 $somethingshown = $formfile->numoffiles;
6124 $linktoelem = $form->showLinkToObjectBlock(
$object, array(), array(
'invoice'));
6126 $compatibleImportElementsList =
false;
6130 $compatibleImportElementsList = array(
'commande',
'propal');
6132 $somethingshown = $form->showLinkedObjectBlock(
$object, $linktoelem, $compatibleImportElementsList);
6136 include_once DOL_DOCUMENT_ROOT.
'/core/lib/payments.lib.php';
6137 $validpaymentmethod = getValidOnlinePaymentMethods(
'');
6138 $useonlinepayment = count($validpaymentmethod);
6141 print
'<br><!-- Link to pay -->'.
"\n";
6142 require_once DOL_DOCUMENT_ROOT.
'/core/lib/payments.lib.php';
6143 print showOnlinePaymentUrl(
'invoice',
$object->ref).
'<br>';
6146 print
'</div><div class="fichehalfright">';
6150 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/compta/facture/agenda.php?id='.
$object->id);
6153 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
6155 $somethingshown = $formactions->showactions(
$object,
'invoice', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
6157 print
'</div></div>';
6162 $modelmail =
'facture_send';
6163 $defaulttopic =
'SendBillRef';
6164 $diroutput = $conf->invoice->multidir_output[
$object->entity];
6165 $trackid =
'inv'.$object->id;
6167 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
Class to manage bank accounts.
Class to manage accounting journals.
Class to manage absolute discounts.
Class to manage a WYSIWYG editor.
Class to manage warehouses.
Class to manage shipments.
Class to manage invoices.
const TYPE_REPLACEMENT
Replacement invoice.
const STATUS_DRAFT
Draft status.
const TYPE_STANDARD
Standard invoice.
const TYPE_SITUATION
Situation invoice.
const TYPE_PROFORMA
Proforma invoice (should not be used.
const STATUS_VALIDATED
Validated (need to be paid)
const TYPE_DEPOSIT
Deposit invoice.
const STATUS_ABANDONED
Classified abandoned and no payment done.
const TYPE_CREDIT_NOTE
Credit note invoice.
const STATUS_CLOSED
Classified paid.
Class to manage invoice lines.
Class to manage invoice templates.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
static getIdAndTxFromCode($dbs, $code, $date_document='')
Get id and rate of currency from code.
Class to manage the table of subscription to notifications.
Class to manage payments of customer invoices.
Class ProductCombination Used to represent the relation between a product and one of its variants.
Class to manage products or services.
const TYPE_PRODUCT
Regular product.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
Class to manage Dolibarr users.
getCountry($searchkey, $withcode='', $dbtouse=null, $outputlangs=null, $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
dol_get_last_hour($date, $gm='tzserver')
Return GMT time for last hour of a given GMT date (it replaces hours, min and second part to 23:59:59...
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
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...
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
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.
GETPOSTISARRAY($paramname, $method=0)
Return true if the parameter $paramname is submit from a POST OR GET as an array.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
dol_htmlcleanlastbr($stringtodecode)
This function remove all ending and br at end.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
GETPOSTFLOAT($paramname, $rounding='')
Return the value of a $_GET or $_POST supervariable, converted into float.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that return vat rate of a product line (according to seller, buyer and product vat rate) VAT...
getDictionaryValue($tablename, $field, $id, $checkentity=false, $rowidfield='rowid')
Return the value of a filed into a dictionary for the record $id.
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
facture_prepare_head($object)
Initialize the array of tabs for customer invoice.
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.
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall TAKEPOS_SHOW_SUBPRICE right right right takeposterminal SELECT e e e e e statut
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall TAKEPOS_SHOW_SUBPRICE right right right takeposterminal SELECT e rowid