41require
'../../main.inc.php';
53require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
54require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
55require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
56require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formorder.class.php';
57require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
58require_once DOL_DOCUMENT_ROOT.
'/core/lib/fourn.lib.php';
59require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
60require_once DOL_DOCUMENT_ROOT.
'/core/modules/supplier_order/modules_commandefournisseur.php';
61require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.commande.class.php';
62require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
65 require_once DOL_DOCUMENT_ROOT.
'/supplier_proposal/class/supplier_proposal.class.php';
68 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
71 require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
72 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
74require_once NUSOAP_PATH.
'/nusoap.php';
77 require_once DOL_DOCUMENT_ROOT.
'/variants/class/ProductCombination.class.php';
81 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.commande.dispatch.class.php';
82 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
86$langs->loadLangs(array(
'admin',
'orders',
'sendings',
'companies',
'bills',
'propal',
'receptions',
'supplier_proposal',
'products',
'stocks',
'productbatch'));
88 $langs->load(
'incoterm');
93$action =
GETPOST(
'action',
'alpha');
94$confirm =
GETPOST(
'confirm',
'alpha');
95$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'purchaseordercard';
96$cancel =
GETPOST(
'cancel',
'alpha');
97$backtopage =
GETPOST(
'backtopage',
'alpha');
98$backtopageforcancel =
GETPOST(
'backtopageforcancel',
'alpha');
105$origin =
GETPOST(
'origin',
'alpha');
108$stockDelete =
GETPOST(
'stockDelete',
'int');
119if ($user->isExternalUser()) {
120 $socid = $user->isExternalUser();
124$hookmanager->initHooks(array(
'ordersuppliercard',
'globalcard'));
129$extrafields->fetch_name_optionals_label(
$object->table_element);
132if ($id > 0 || !empty($ref)) {
133 $ret =
$object->fetch($id, $ref);
137 $ret =
$object->fetch_thirdparty();
141} elseif (!empty($socid) && $socid > 0) {
143 $ret =
$object->fetch_thirdparty();
150$isdraft = (isset(
$object->status) && (
$object->status == $object::STATUS_DRAFT) ? 1 : 0);
151$result =
restrictedArea($user,
'fournisseur', $object,
'commande_fournisseur',
'commande',
'fk_soc',
'rowid', $isdraft);
154$usercanread = ($user->hasRight(
"fournisseur",
"commande",
"lire") || $user->hasRight(
"supplier_order",
"lire"));
155$usercancreate = ($user->hasRight(
"fournisseur",
"commande",
"creer") || $user->hasRight(
"supplier_order",
"creer"));
156$usercandelete = (($user->hasRight(
"fournisseur",
"commande",
"supprimer") || $user->hasRight(
"supplier_order",
"supprimer")) || ($usercancreate && isset(
$object->status) &&
$object->status == $object::STATUS_DRAFT));
159$usercanvalidate = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !empty($usercancreate)) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
"fournisseur",
"supplier_order_advance",
"validate")));
162$usercanapprove = $user->hasRight(
"fournisseur",
"commande",
"approuver");
163$usercanapprovesecond = $user->hasRight(
"fournisseur",
"commande",
"approve2");
164$usercanorder = $user->hasRight(
"fournisseur",
"commande",
"commander");
166 $usercanreceive = $user->hasRight(
"fournisseur",
"commande",
"receptionner");
168 $usercanreceive = $user->hasRight(
"reception",
"creer");
172$permissionnote = $usercancreate;
173$permissiondellink = $usercancreate;
174$permissiontoedit = $usercancreate;
175$permissiontoadd = $usercancreate;
176$permissiontoeditextra = $permissiontoadd;
177if (
GETPOST(
'attribute',
'aZ09') && isset($extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')])) {
179 $permissiontoeditextra =
dol_eval((
string) $extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')]);
183$caneditproject =
false;
196$parameters = array(
'socid' => $socid);
197$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
202if (empty($reshook)) {
203 $backurlforlist = DOL_URL_ROOT.
'/fourn/commande/list.php'.($socid > 0 ?
'?socid='.((int) $socid) :
'');
205 if (empty($backtopage) || ($cancel && empty($id))) {
206 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
207 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
208 $backtopage = $backurlforlist;
210 $backtopage = DOL_URL_ROOT.
'/fourn/commande/card.php?id='.((!empty($id) &&
$id > 0) ? $id :
'__ID__');
216 if (!empty($backtopageforcancel)) {
217 header(
"Location: ".$backtopageforcancel);
219 } elseif (!empty($backtopage)) {
220 header(
"Location: ".$backtopage);
226 include DOL_DOCUMENT_ROOT.
'/core/actions_setnotes.inc.php';
228 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
230 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
232 if ($action ==
'setref_supplier' && $usercancreate) {
233 $result =
$object->setValueFrom(
'ref_supplier',
GETPOST(
'ref_supplier',
'alpha'),
'',
null,
'text',
'', $user,
'ORDER_SUPPLIER_MODIFY');
240 if ($action ==
'set_incoterms' && $usercancreate) {
248 if ($action ==
'setconditions' && $usercancreate) {
256 if ($action ==
'setmode' && $usercancreate) {
261 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
263 $result =
$object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
264 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
270 if ($action ==
'setbankaccount' && $usercancreate) {
278 if ($action ==
'setdate_livraison' && $usercancreate) {
279 $result =
$object->setDeliveryDate($user, $datelivraison);
286 if ($action ==
'classin' && $usercancreate && $caneditproject) {
287 $result =
$object->setProject($projectid);
294 if ($action ==
'confirm_delete_subtotalline' && $confirm ==
'yes' && $usercancreate) {
299 $result =
$object->deleteSubtotalLine($langs,
GETPOSTINT(
'lineid'), (
bool)
GETPOST(
'deletecorrespondingsubtotalline'));
304 $outputlangs = $langs;
310 $newlang =
$object->thirdparty->default_lang;
312 if (!empty($newlang)) {
314 $outputlangs->setDefaultLang($newlang);
315 $outputlangs->load(
'products');
319 $result =
$object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
322 header(
'Location: '.
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' => $id]));
330 if ($action ==
'addline' &&
GETPOST(
'updateallvatlinesblock',
'alpha') &&
GETPOST(
'vatforblocklines',
'alpha') !==
'' && $usercancreate) {
331 $tx_tva =
GETPOST(
'vatforblocklines') ?
GETPOST(
'vatforblocklines') : 0;
332 $result =
$object->updateSubtotalLineBlockLines($langs,
$object->getRangOfLine($lineid),
'tva', $tx_tva);
336 } elseif ($action ==
'addline' &&
GETPOST(
'updatealldiscountlinesblock',
'alpha') &&
GETPOST(
'discountforblocklines',
'alpha') !==
'' && $usercancreate) {
337 $discount =
GETPOST(
'discountforblocklines') ?
GETPOST(
'discountforblocklines') : 0;
338 $result =
$object->updateSubtotalLineBlockLines($langs,
$object->getRangOfLine($lineid),
'discount', $discount);
344 if ($action ==
'settags' &&
isModEnabled(
'category') && $usercancreate) {
354 if (!empty($new_socid) && $new_socid !=
$object->thirdparty->id) {
358 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'commande_fournisseur';
359 $sql .=
' SET fk_soc = '.((int) $new_socid);
360 $sql .=
' WHERE fk_soc = '.((int)
$object->thirdparty->id);
361 $sql .=
' AND rowid = '.((int)
$object->id);
363 $res =
$db->query($sql);
371 foreach (
$object->lines as $l) {
372 $sql =
'SELECT price, unitprice, tva_tx, ref_fourn';
373 $sql .=
' FROM '.MAIN_DB_PREFIX.
'product_fournisseur_price';
374 $sql .=
' WHERE fk_product = '.((int) $l->fk_product);
375 $sql .=
' AND fk_soc = '.((int) $new_socid);
376 $sql .=
' ORDER BY unitprice ASC';
378 $resql =
$db->query($sql);
380 $num_row =
$db->num_rows($resql);
381 if (empty($num_row)) {
387 $l->ref_supplier =
'';
391 $obj =
$db->fetch_object($resql);
392 $l->subprice = $obj->unitprice;
393 $l->total_ht = $obj->price;
394 $l->tva_tx = $obj->tva_tx;
395 $l->total_tva = $l->total_ht * ($obj->tva_tx / 100);
396 $l->total_ttc = $l->total_ht + $l->total_tva;
397 $l->ref_supplier = $obj->ref_fourn;
408 header(
'Location: '.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
412 if ($action ==
'setremisepercent' && $usercancreate) {
419 if ($action ==
'reopen' && $permissiontoadd) {
420 $resSetReopen =
$object->setReopen($user);
422 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
432 if ($action ==
'classifybilled' && $usercancreate) {
433 $ret =
$object->classifyBilled($user);
437 } elseif ($action ==
'classifyunbilled' && $usercancreate) {
438 $ret =
$object->classifyUnBilled($user);
445 if ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'aZ09') && (
GETPOST(
'alldate_start',
'alpha') ||
GETPOST(
'alldate_end',
'alpha')) && $usercancreate) {
449 foreach (
$object->lines as $line) {
450 if ($line->product_type == 1) {
452 $line_price_base_type = $line->getPriceBaseType();
453 $line_pu = ($line_price_base_type ===
'TTC') ? (
float) $line->subprice_ttc : (float) $line->subprice;
454 $result =
$object->updateline($line->id, $line->desc, $line_pu, $line->qty, (
float) $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, $line_price_base_type, $line->info_bits, $line->product_type, 0, $alldate_start, $alldate_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice, $line->ref_supplier);
457 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'remiseforalllines',
'alpha') !==
'' && $usercancreate) {
459 $remise_percent = (
GETPOST(
'remiseforalllines') ?
GETPOST(
'remiseforalllines') : 0);
460 $remise_percent = str_replace(
'*',
'', $remise_percent);
461 foreach (
$object->lines as $line) {
463 $line_price_base_type = $line->getPriceBaseType();
464 $line_pu = ($line_price_base_type ===
'TTC') ? (
float) $line->subprice_ttc : (float) $line->subprice;
465 $result =
$object->updateline($line->id, $line->desc, $line_pu, $line->qty, (
float) $remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, $line_price_base_type, $line->info_bits, $line->product_type, 0, $line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice, $line->ref_supplier);
467 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'aZ09') &&
GETPOST(
'vatforalllines',
'alpha') !==
'' && $usercancreate) {
469 $vat_rate = (
GETPOST(
'vatforalllines') ?
GETPOST(
'vatforalllines') : 0);
470 $vat_rate = str_replace(
'*',
'', $vat_rate);
473 foreach (
$object->lines as $line) {
474 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
478 $line_price_base_type = $line->getPriceBaseType();
479 $line_pu = ($line_price_base_type ===
'TTC') ? (
float) $line->subprice_ttc : (float) $line->subprice;
480 $result =
$object->updateline($line->id, $line->desc, $line_pu, $line->qty, (
float) $line->remise_percent, $vat_rate, $localtax1_rate, $localtax2_rate, $line_price_base_type, $line->info_bits, $line->product_type, 0, $line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice, $line->ref_supplier);
482 } elseif ($action ==
'confirm_addtextline' && $usercancreate) {
485 $langs->load(
'subtotals');
487 $desc =
GETPOST(
'subtotaltextcontent',
'restricthtml');
490 $result =
$object->addSubtotalLine($langs, $desc, 0, array());
501 $outputlangs = $langs;
502 $newlang =
GETPOST(
'lang_id',
'alpha');
504 $newlang =
$object->thirdparty->default_lang;
506 if (!empty($newlang)) {
508 $outputlangs->setDefaultLang($newlang);
511 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
516 header(
'Location: '.
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' => $id]));
518 } elseif ($action ==
'confirm_addtitleline' && $usercancreate) {
521 $langs->load(
'subtotals');
523 $desc =
GETPOST(
'subtotallinedesc',
'alphanohtml');
524 $depth =
GETPOSTINT(
'subtotallinelevel') ?? 1;
526 $subtotal_options = array();
528 foreach (CommandeFournisseur::$TITLE_OPTIONS as $option) {
529 $value =
GETPOST($option,
'alphanohtml');
531 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
536 $result =
$object->addSubtotalLine($langs, $desc, (
int) $depth, $subtotal_options);
547 $outputlangs = $langs;
548 $newlang =
GETPOST(
'lang_id',
'alpha');
550 $newlang =
$object->thirdparty->default_lang;
552 if (!empty($newlang)) {
554 $outputlangs->setDefaultLang($newlang);
557 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
562 header(
'Location: '.
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' => $id]));
564 } elseif ($action ==
'confirm_addsubtotalline' && $usercancreate) {
567 $langs->load(
'subtotals');
569 $choosen_line =
GETPOST(
'subtotaltitleline',
'alphanohtml');
570 foreach (
$object->lines as $line) {
571 if ($line->desc == $choosen_line && $line->special_code == SUBTOTALS_SPECIAL_CODE) {
573 $depth = -$line->qty;
577 $subtotal_options = array();
579 foreach (CommandeFournisseur::$SUBTOTAL_OPTIONS as $option) {
580 $value =
GETPOST($option,
'alphanohtml');
582 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
587 if (isset($desc) && isset($depth)) {
588 $result =
$object->addSubtotalLine($langs, $desc, (
int) $depth, $subtotal_options);
591 $object->errors[] = $langs->trans(
"CorrespondingTitleNotFound");
600 $outputlangs = $langs;
601 $newlang =
GETPOST(
'lang_id',
'alpha');
603 $newlang =
$object->thirdparty->default_lang;
605 if (!empty($newlang)) {
607 $outputlangs->setDefaultLang($newlang);
610 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
615 header(
'Location: '.
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' => $id]));
617 } elseif ($action ==
'addline' && $usercancreate) {
620 $langs->load(
'errors');
625 $line_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
629 $prod_entry_mode =
GETPOST(
'prod_entry_mode');
630 if ($prod_entry_mode ==
'free') {
644 $remise_percent = (GETPOSTISSET(
'remise_percent'.$predef) ?
price2num(
GETPOST(
'remise_percent'.$predef,
'alpha'),
'', 2) : 0);
645 if (empty($remise_percent)) {
650 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
651 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
653 if (is_array($extralabelsline)) {
655 foreach ($extralabelsline as $key => $value) {
656 unset($_POST[
"options_".$key]);
660 if ($prod_entry_mode ==
'free' &&
GETPOST(
'price_ht') < 0 && $qty < 0) {
661 setEventMessages($langs->trans(
'ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv(
'UnitPrice'), $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
664 if ($prod_entry_mode ==
'free' && !
GETPOST(
'idprodfournprice') &&
GETPOST(
'type') < 0) {
665 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Type')),
null,
'errors');
668 if ($prod_entry_mode ==
'free' &&
GETPOST(
'price_ht') ===
'' &&
GETPOST(
'price_ttc') ===
'' && $price_ht_devise ===
'') {
669 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'UnitPrice')),
null,
'errors');
672 if ($prod_entry_mode ==
'free' && !
GETPOST(
'dp_desc')) {
673 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Description')),
null,
'errors');
676 if (
GETPOST(
'qty',
'alpha') ==
'') {
677 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
681 if (!$error &&
isModEnabled(
'variants') && $prod_entry_mode !=
'free') {
682 if ($combinations =
GETPOST(
'combinations',
'array:alphanohtml')) {
686 if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
687 $idprod = $res->fk_product_child;
689 setEventMessages($langs->trans(
'ErrorProductCombinationNotFound'),
null,
'errors');
695 if ($prod_entry_mode !=
'free' && empty($error)) {
699 if (
GETPOST(
'idprodfournprice',
'alpha') == -1 ||
GETPOST(
'idprodfournprice',
'alpha') ==
'') {
704 if (preg_match(
'/^idprod_([0-9]+)$/',
GETPOST(
'idprodfournprice',
'alpha'), $reg)) {
705 $idprod = (int) $reg[1];
706 $res = $productsupplier->fetch($idprod);
709 if (
getDolGlobalString(
'SUPPLIER_TAKE_FIRST_PRICE_IF_NO_PRICE_FOR_CURRENT_SUPPLIER')) {
711 $productsupplier->get_buyprice(0, -1, $idprod,
'none', $fksoctosearch);
712 if ($productsupplier->fourn_socid != $socid) {
713 $productsupplier->ref_supplier =
'';
716 $fksoctosearch =
$object->thirdparty->id;
717 $productsupplier->get_buyprice(0, -1, $idprod,
'none', $fksoctosearch);
719 } elseif (
GETPOSTINT(
'idprodfournprice') > 0) {
720 $qtytosearch = (float) $qty;
722 $idprod = $productsupplier->get_buyprice(
GETPOSTINT(
'idprodfournprice'), $qtytosearch);
723 $res = $productsupplier->fetch($idprod);
727 $label = $productsupplier->label;
731 $outputlangs = $langs;
733 if (
GETPOST(
'lang_id',
'aZ09')) {
734 $newlang =
GETPOST(
'lang_id',
'aZ09');
736 if (empty($newlang)) {
737 $newlang =
$object->thirdparty->default_lang;
739 if (!empty($newlang)) {
741 $outputlangs->setDefaultLang($newlang);
743 $desc = (!empty($productsupplier->multilangs[$outputlangs->defaultlang][
"description"])) ? $productsupplier->multilangs[$outputlangs->defaultlang][
"description"] : $productsupplier->
description;
745 $desc = $productsupplier->description;
748 if (!empty($productsupplier->desc_supplier) &&
getDolGlobalString(
'PRODUIT_FOURN_TEXTS')) {
749 $desc = $productsupplier->desc_supplier;
760 $ref_supplier = $productsupplier->ref_supplier;
764 if (!GETPOSTISSET(
'tva_tx')) {
765 $tmpidprodfournprice =
GETPOST(
'idprodfournprice',
'alpha');
766 if (is_numeric($tmpidprodfournprice) && (
int) $tmpidprodfournprice > 0) {
767 $tmpidprodfournprice = (int) $tmpidprodfournprice;
769 $tmpidprodfournprice = 0;
773 if (empty($tva_tx)) {
781 $type = $productsupplier->type;
782 if (
GETPOST(
'price_ht') !=
'' ||
GETPOST(
'multicurrency_price_ht') !=
'') {
783 $price_base_type =
'HT';
785 $pu_devise =
price2num($price_ht_devise,
'CU');
786 } elseif (
GETPOST(
'price_ttc') !=
'' ||
GETPOST(
'multicurrency_price_ttc') !=
'') {
787 $price_base_type =
'TTC';
789 $pu_devise =
price2num($price_ttc_devise,
'CU');
791 $price_base_type = ($productsupplier->fourn_price_base_type ? $productsupplier->fourn_price_base_type :
'HT');
792 if (empty(
$object->multicurrency_code) || ($productsupplier->fourn_multicurrency_code !=
$object->multicurrency_code)) {
793 $pu = $productsupplier->fourn_pu;
796 $pu = $productsupplier->fourn_pu;
797 $pu_devise = $productsupplier->fourn_multicurrency_unitprice;
807 ($price_base_type ==
'HT' ? $pu : 0),
813 $productsupplier->product_fourn_price_id,
817 ($price_base_type ==
'TTC' ? $pu : 0),
824 $productsupplier->fk_unit,
828 min($rank, count(
$object->lines) + 1)
831 if ($idprod == -99 || $idprod == 0) {
834 $langs->load(
"errors");
835 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
840 $langs->load(
"errors");
841 setEventMessages($langs->trans(
"ErrorQtyTooLowForThisSupplier"),
null,
'errors');
843 } elseif (empty($error)) {
844 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
845 $tva_tx = str_replace(
'*',
'', $tva_tx);
846 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
849 $ref_supplier =
GETPOST(
'fourn_ref',
'alpha');
853 if (!preg_match(
'/\((.*)\)/', $tva_tx)) {
862 if (
GETPOST(
'price_ht') !=
'' ||
GETPOST(
'multicurrency_price_ht') !=
'') {
863 $price_base_type =
'HT';
866 $pu_ht_devise =
price2num($price_ht_devise,
'CU');
868 $price_base_type =
'TTC';
871 $pu_ht_devise =
price2num($price_ttc_devise,
'CU');
874 $result =
$object->addline($desc, (
float) $pu_ht, (
float) $qty, $tva_tx, $localtax1_tx, $localtax2_tx, 0, 0, $ref_supplier, $remise_percent, $price_base_type, (
float) $pu_ttc, $type, 0, 0,
$date_start, $date_end, $array_options, $fk_unit, (
float) $pu_ht_devise);
878 if (!$error && $result > 0) {
885 $outputlangs = $langs;
888 $newlang =
$object->thirdparty->default_lang;
889 if (
GETPOST(
'lang_id',
'aZ09')) {
890 $newlang =
GETPOST(
'lang_id',
'aZ09');
893 if (!empty($newlang)) {
895 $outputlangs->setDefaultLang($newlang);
900 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
906 unset($_POST [
'prod_entry_mode']);
908 unset($_POST[
'qty']);
909 unset($_POST[
'type']);
910 unset($_POST[
'remise_percent']);
912 unset($_POST[
'price_ht']);
913 unset($_POST[
'multicurrency_price_ht']);
914 unset($_POST[
'price_ttc']);
915 unset($_POST[
'fourn_ref']);
916 unset($_POST[
'tva_tx']);
917 unset($_POST[
'label']);
918 unset($localtax1_tx);
919 unset($localtax2_tx);
920 unset($_POST[
'np_marginRate']);
921 unset($_POST[
'np_markRate']);
922 unset($_POST[
'dp_desc']);
923 unset($_POST[
'idprodfournprice']);
924 unset($_POST[
'units']);
926 unset($_POST[
'date_starthour']);
927 unset($_POST[
'date_startmin']);
928 unset($_POST[
'date_startsec']);
929 unset($_POST[
'date_startday']);
930 unset($_POST[
'date_startmonth']);
931 unset($_POST[
'date_startyear']);
932 unset($_POST[
'date_endhour']);
933 unset($_POST[
'date_endmin']);
934 unset($_POST[
'date_endsec']);
935 unset($_POST[
'date_endday']);
936 unset($_POST[
'date_endmonth']);
937 unset($_POST[
'date_endyear']);
939 header(
'Location: '.
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' => $id]));
947 } elseif ($action ==
'updatetitleline' && GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
950 $langs->load(
'subtotals');
952 $desc =
GETPOST(
'line_desc',
'alphanohtml') ?? $langs->trans(
"Title");
955 $subtotal_options = array();
957 foreach (CommandeFournisseur::$TITLE_OPTIONS as $option) {
958 $value =
GETPOST($option,
'alphanohtml');
960 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
965 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
976 $outputlangs = $langs;
977 $newlang =
GETPOST(
'lang_id',
'alpha');
979 $newlang =
$object->thirdparty->default_lang;
981 if (!empty($newlang)) {
983 $outputlangs->setDefaultLang($newlang);
986 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
991 } elseif ($action ==
'updatetextline' && GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
994 $langs->load(
'subtotals');
996 $desc =
GETPOST(
'line_desc',
'restricthtml');
999 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, 0, array());
1010 $outputlangs = $langs;
1011 $newlang =
GETPOST(
'lang_id',
'alpha');
1013 $newlang =
$object->thirdparty->default_lang;
1015 if (!empty($newlang)) {
1017 $outputlangs->setDefaultLang($newlang);
1020 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1025 } elseif ($action ==
'updatesubtotalline' && GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1028 $langs->load(
'subtotals');
1030 $desc =
GETPOST(
'line_desc',
'alphanohtml');
1033 $subtotal_options = array();
1035 foreach (CommandeFournisseur::$SUBTOTAL_OPTIONS as $option) {
1036 $value =
GETPOST($option,
'alphanohtml');
1038 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1043 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1051 $outputlangs = $langs;
1052 $newlang =
GETPOST(
'lang_id',
'alpha');
1054 $newlang =
$object->thirdparty->default_lang;
1056 if (!empty($newlang)) {
1058 $outputlangs->setDefaultLang($newlang);
1061 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1066 } elseif ($action ==
'updateline' && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1075 $res = $line->fetch($lineid);
1082 if (
getDolGlobalInt(
'SUPPLIER_ORDER_WITH_PREDEFINED_PRICES_ONLY') == 1) {
1083 if ($line->fk_product > 0 && $productsupplier->get_buyprice(0, (
float)
price2num(
GETPOSTFLOAT(
'qty')), $line->fk_product,
'none',
GETPOSTINT(
'socid')) < 0) {
1084 setEventMessages($langs->trans(
"ErrorQtyTooLowForThisSupplier"),
null,
'warnings');
1093 if (preg_match(
'/\*/', $vat_rate)) {
1098 $vat_rate = str_replace(
'*',
'', $vat_rate);
1109 $price_base_type =
'HT';
1110 if (empty($pu_ht) && !empty($pu_ttc)) {
1112 $price_base_type =
'TTC';
1113 } elseif (!empty($pu_ht) && !empty($pu_ttc)) {
1114 foreach (
$object->lines as $line_obj) {
1117 if ($line_obj->wasEnteredIncludingTax()) {
1119 $price_base_type =
'TTC';
1129 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1130 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
1132 if (is_array($extralabelsline)) {
1133 foreach ($extralabelsline as $key => $value) {
1134 unset($_POST[
"options_".$key]);
1138 $result =
$object->updateline(
1140 GETPOST(
'product_desc',
'restricthtml'),
1149 GETPOSTISSET(
"type") ?
GETPOST(
"type") : $line->product_type,
1155 (float) $pu_ht_devise,
1158 unset($_POST[
'qty']);
1159 unset($_POST[
'type']);
1160 unset($_POST[
'idprodfournprice']);
1161 unset($_POST[
'remmise_percent']);
1162 unset($_POST[
'dp_desc']);
1163 unset($_POST[
'np_desc']);
1164 unset($_POST[
'pu']);
1165 unset($_POST[
'fourn_ref']);
1166 unset($_POST[
'tva_tx']);
1167 unset($_POST[
'date_start']);
1168 unset($_POST[
'date_end']);
1169 unset($_POST[
'units']);
1170 unset($localtax1_tx);
1171 unset($localtax2_tx);
1173 unset($_POST[
'date_starthour']);
1174 unset($_POST[
'date_startmin']);
1175 unset($_POST[
'date_startsec']);
1176 unset($_POST[
'date_startday']);
1177 unset($_POST[
'date_startmonth']);
1178 unset($_POST[
'date_startyear']);
1179 unset($_POST[
'date_endhour']);
1180 unset($_POST[
'date_endmin']);
1181 unset($_POST[
'date_endsec']);
1182 unset($_POST[
'date_endday']);
1183 unset($_POST[
'date_endmonth']);
1184 unset($_POST[
'date_endyear']);
1189 $outputlangs = $langs;
1192 $newlang =
GETPOST(
'lang_id',
'aZ09');
1195 $newlang =
$object->thirdparty->default_lang;
1197 if (!empty($newlang)) {
1199 $outputlangs->setDefaultLang($newlang);
1204 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1219 if ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $usercancreate) {
1222 $result =
$object->deleteLine($lineid);
1227 $outputlangs = $langs;
1230 $newlang =
GETPOST(
'lang_id',
'aZ09');
1233 $newlang =
$object->thirdparty->default_lang;
1235 if (!empty($newlang)) {
1237 $outputlangs->setDefaultLang($newlang);
1241 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1263 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
1271 if ($action ==
'confirm_valid' && $confirm ==
'yes' && $usercanvalidate) {
1275 $result =
$object->valid($user);
1279 $outputlangs = $langs;
1282 $newlang =
GETPOST(
'lang_id',
'aZ09');
1285 $newlang =
$object->thirdparty->default_lang;
1287 if (!empty($newlang)) {
1289 $outputlangs->setDefaultLang($newlang);
1294 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1307 $action =
'confirm_approve';
1317 if (($action ==
'confirm_approve' || $action ==
'confirm_approve2') && $confirm ==
'yes' && $usercanapprove) {
1322 $qualified_for_stock_change = 0;
1324 $qualified_for_stock_change =
$object->hasProductsOrServices(2);
1326 $qualified_for_stock_change =
$object->hasProductsOrServices(1);
1331 if (!$idwarehouse || $idwarehouse == -1) {
1333 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
"Warehouse")),
null,
'errors');
1339 $result =
$object->approve($user, $idwarehouse, ($action ==
'confirm_approve2' ? 1 : 0));
1342 $outputlangs = $langs;
1345 $newlang =
GETPOST(
'lang_id',
'aZ09');
1348 $newlang =
$object->thirdparty->default_lang;
1350 if (!empty($newlang)) {
1352 $outputlangs->setDefaultLang($newlang);
1354 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1365 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".
$object->id);
1372 if ($action ==
'confirm_refuse' && $confirm ==
'yes' && $usercanapprove) {
1376 $result =
$object->refuse($user);
1378 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".
$object->id);
1386 if ($action ==
'commande') {
1387 $methodecommande =
GETPOSTINT(
'methodecommande');
1391 } elseif ($methodecommande <= 0 && !
getDolGlobalInt(
'SUPPLIER_ORDER_MODE_OPTIONAL')) {
1392 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"OrderMode")),
null,
'errors');
1393 $action =
'createorder';
1397 if ($action ==
'confirm_commande' && $confirm ==
'yes' && $usercanorder) {
1399 $object->context[
"sendmanualtriggers"] =
GETPOST(
"manual_trigger_send");
1403 $outputlangs = $langs;
1406 $newlang =
GETPOST(
'lang_id',
'aZ09');
1409 $newlang =
$object->thirdparty->default_lang;
1411 if (!empty($newlang)) {
1413 $outputlangs->setDefaultLang($newlang);
1415 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1426 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".
$object->id);
1434 if ($action ==
'confirm_delete' && $confirm ==
'yes' && $usercandelete) {
1437 $errorsOnDelete = array();
1492 if (empty($errOnDelete)) {
1493 $result =
$object->delete($user);
1496 header(
"Location: " . DOL_URL_ROOT .
'/fourn/commande/list.php?restore_lastsearch_values=1');
1509 if ($action ==
'confirm_clone' && $confirm ==
'yes' && $usercancreate) {
1511 if (1 == 0 && !
GETPOST(
'clone_content') && !
GETPOST(
'clone_receivers')) {
1512 setEventMessages($langs->trans(
"NoCloneOptionsSpecified"),
null,
'errors');
1517 $result =
$object->createFromClone($user, $socid);
1519 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?id='.$result);
1531 if ($action ==
'livraison' && $usercanreceive) {
1542 $langs->load(
"sendings");
1552 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"Delivery")),
null,
'errors');
1563 if ($action ==
'confirm_cancel' && $confirm ==
'yes' && $usercanorder) {
1567 $result =
$object->cancel($user);
1569 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".
$object->id);
1577 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
1580 $triggersendname =
'ORDER_SUPPLIER_SENTBYMAIL';
1581 $autocopy =
'MAIN_MAIL_AUTOCOPY_SUPPLIER_ORDER_TO';
1582 $trackid =
'sord'.$object->id;
1583 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
1587 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1590 if ($action ==
'update_extras' && $permissiontoeditextra) {
1593 $attribute_name =
GETPOST(
'attribute',
'aZ09');
1596 $ret = $extrafields->setOptionalsFromPost(
null, $object, $attribute_name);
1602 $result =
$object->updateExtraField($attribute_name,
'ORDER_SUPPLIER_MODIFY');
1610 $action =
'edit_extras';
1617 if ($action ==
'add' && $permissiontoadd) {
1619 $selectedLines =
GETPOST(
'toselect',
'array:int');
1621 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentities(
'Supplier')),
null,
'errors');
1638 $object->delivery_date = $datelivraison;
1640 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
1641 $object->multicurrency_code =
GETPOST(
'multicurrency_code',
'alpha');
1647 $ret = $extrafields->setOptionalsFromPost(
null, $object);
1655 if (!empty($origin) && !empty($originid)) {
1656 $element = $subelement = $origin;
1657 $classname = ucfirst($subelement);
1658 if ($origin ==
'propal' || $origin ==
'proposal') {
1659 $element =
'comm/propal';
1660 $subelement =
'propal';
1661 $classname =
'Propal';
1663 if ($origin ==
'order' || $origin ==
'commande') {
1664 $element = $subelement =
'commande';
1665 $classname =
'Commande';
1667 if ($origin ==
'supplier_proposal') {
1668 $classname =
'SupplierProposal';
1669 $element =
'supplier_proposal';
1670 $subelement =
'supplier_proposal';
1674 $object->origin_type = $origin;
1675 $object->origin_id = $originid;
1679 $other_linked_objects =
GETPOST(
'other_linked_objects',
'array');
1680 if (!empty($other_linked_objects)) {
1681 $object->linked_objects = array_merge(
$object->linked_objects, $other_linked_objects);
1688 $srcobject =
new $classname(
$db);
1690 dol_syslog(
"Try to find source object origin=".
$object->origin_type.
" originid=".
$object->origin_id.
" to add lines");
1691 $result = $srcobject->fetch(
$object->origin_id);
1693 if (empty(
$object->delivery_date)) {
1694 $tmpdate = $srcobject->delivery_date;
1695 $object->setDeliveryDate($user, $tmpdate);
1698 $object->set_id_projet($user, $srcobject->fk_project);
1700 $lines = $srcobject->lines;
1701 if (empty($lines) && method_exists($srcobject,
'fetch_lines')) {
1702 $srcobject->fetch_lines();
1703 $lines = $srcobject->lines;
1706 $fk_parent_line = 0;
1707 $num = count($lines);
1709 for ($i = 0; $i < $num; $i++) {
1711 empty($lines[$i]->subprice)
1712 || $lines[$i]->qty < 0
1713 || !in_array($lines[$i]->
id, $selectedLines)
1714 || $lines[$i]->special_code == SUBTOTALS_SPECIAL_CODE
1719 $label = (!empty($lines[$i]->label) ? $lines[$i]->label :
'');
1720 $desc = (!empty($lines[$i]->desc) ? $lines[$i]->desc :
'');
1721 $product_type = (!empty($lines[$i]->product_type) ? $lines[$i]->product_type : 0);
1723 if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) {
1724 $fk_parent_line = 0;
1728 if (method_exists($lines[$i],
'fetch_optionals')) {
1729 $lines[$i]->fetch_optionals();
1730 $array_option = $lines[$i]->array_options;
1732 $array_option = array();
1736 $product_fourn_price_id = 0;
1737 if ($origin ==
"commande") {
1739 $result = $productsupplier->find_min_price_product_fournisseur($lines[$i]->fk_product, $lines[$i]->qty,
$object->socid);
1740 $lines[$i]->subprice = 0;
1742 $ref_supplier = $productsupplier->ref_supplier;
1743 $product_fourn_price_id = $productsupplier->product_fourn_price_id;
1745 foreach ($srcobject->lines as $li) {
1746 $sql =
'SELECT price, unitprice, tva_tx, remise_percent, entity, ref_fourn';
1747 $sql .=
' FROM '.MAIN_DB_PREFIX.
'product_fournisseur_price';
1748 $sql .=
' WHERE fk_product = '.((int) $li->fk_product);
1749 $sql .=
' AND entity IN ('.getEntity(
'product_fournisseur_price').
')';
1750 $sql .=
' AND fk_soc = '.((int)
$object->socid);
1751 $sql .=
' ORDER BY unitprice ASC';
1753 $resql =
$db->query($sql);
1755 $num_row =
$db->num_rows($resql);
1756 if (empty($num_row)) {
1757 $li->remise_percent = 0;
1759 $obj =
$db->fetch_object($resql);
1760 $li->subprice = $obj->unitprice;
1761 $li->remise_percent = $obj->remise_percent;
1770 $ref_supplier = $lines[$i]->ref_fourn;
1771 $product_fourn_price_id = 0;
1774 $tva_tx = $lines[$i]->tva_tx;
1776 if ($origin ==
"commande") {
1778 $soc->fetch($socid);
1783 $line_price_base_type = $lines[$i]->getPriceBaseType();
1786 $lines[$i]->subprice,
1789 $lines[$i]->localtax1_tx,
1790 $lines[$i]->localtax2_tx,
1791 $lines[$i]->fk_product > 0 ? $lines[$i]->fk_product : 0,
1792 $product_fourn_price_id,
1794 $lines[$i]->remise_percent,
1795 $line_price_base_type,
1796 (float) $lines[$i]->subprice_ttc,
1797 $lines[$i]->product_type,
1803 $lines[$i]->fk_unit,
1806 !empty($lines[$i]->id) ? $lines[$i]->id : $lines[$i]->rowid,
1808 $lines[$i]->special_code,
1819 if ($result > 0 && $lines[$i]->product_type == 9) {
1820 $fk_parent_line = $result;
1828 $parameters = array(
'objFrom' => $srcobject);
1829 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $object, $action);
1853 $categories =
GETPOST(
'categories',
'array:int');
1854 if (method_exists($object,
'setCategories')) {
1855 $object->setCategories($categories);
1860 $langs->load(
"errors");
1865 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".urlencode((
string) ($id)));
1872 if ($action ==
'addcontact' && $permissiontoadd) {
1876 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
1880 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1883 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1884 $langs->load(
"errors");
1885 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
1890 } elseif ($action ==
'swapstatut' &&
$object->id > 0 && $permissiontoadd) {
1893 } elseif ($action ==
'deletecontact' &&
$object->id > 0 && $permissiontoadd) {
1898 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1920$title =
$object->ref.
" - ".$langs->trans(
'Card');
1921if ($action ==
'create') {
1922 $title = $langs->trans(
"NewOrderSupplier");
1924$help_url =
'EN:Module_Suppliers_Orders|FR:CommandeFournisseur|ES:Módulo_Pedidos_a_proveedores';
1925llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-supplier-order page-card');
1929if ($action ==
'create') {
1930 print
load_fiche_titre($langs->trans(
'NewOrderSupplier'),
'',
'supplier_order');
1934 $currency_code =
$conf->currency;
1941 $societe->fetch($socid);
1944 if (!empty($origin) && !empty($originid)) {
1946 $element = $subelement = $origin;
1947 $classname = ucfirst($subelement);
1949 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
1950 $element = $regs[1];
1951 $subelement = $regs[2];
1954 if ($origin ==
'propal' || $origin ==
'proposal') {
1955 $classname =
'Propal';
1956 $element =
'comm/propal';
1957 $subelement =
'propal';
1959 if ($origin ==
'order' || $origin ==
'commande') {
1960 $classname =
'Commande';
1961 $element = $subelement =
'commande';
1963 if ($origin ==
'supplier_proposal') {
1964 $classname =
'SupplierProposal';
1965 $element =
'supplier_proposal';
1966 $subelement =
'supplier_proposal';
1972 $objectsrc =
new $classname(
$db);
1973 $objectsrc->fetch($originid);
1974 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
1975 $objectsrc->fetch_lines();
1977 $objectsrc->fetch_thirdparty();
1980 $objectsrc->fetch_optionals();
1981 $object->array_options = $objectsrc->array_options;
1983 $projectid = (int) $objectsrc->fk_project;
1984 $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client :
'');
1986 if ($origin ==
"commande") {
1987 $cond_reglement_id = 0;
1988 $deposit_percent = 0;
1989 $mode_reglement_id = 0;
1990 $objectsrc->note_private =
'';
1991 $objectsrc->note_public =
'';
1992 if ($societe =
$object->thirdparty) {
1993 $cond_reglement_id = $societe->cond_reglement_supplier_id;
1994 $deposit_percent = $societe->deposit_percent;
1995 $mode_reglement_id = $societe->mode_reglement_supplier_id;
1997 $currency_code = $societe->multicurrency_code;
1999 $currency_tx = $societe->multicurrency_tx;
2004 $soc = $objectsrc->thirdparty;
2006 $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0));
2007 $deposit_percent = (!empty($objectsrc->deposit_percent) ? $objectsrc->deposit_percent : (!empty($soc->deposit_percent) ? $soc->deposit_percent : 0));
2008 $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
2009 $fk_account = (!empty($objectsrc->fk_account) ? $objectsrc->fk_account : (!empty($soc->fk_account) ? $soc->fk_account : 0));
2010 $availability_id = (!empty($objectsrc->availability_id) ? $objectsrc->availability_id : (!empty($soc->availability_id) ? $soc->availability_id : 0));
2011 $shipping_method_id = (!empty($objectsrc->shipping_method_id) ? $objectsrc->shipping_method_id : (!empty($soc->shipping_method_id) ? $soc->shipping_method_id : 0));
2012 $demand_reason_id = (!empty($objectsrc->demand_reason_id) ? $objectsrc->demand_reason_id : (!empty($soc->demand_reason_id) ? $soc->demand_reason_id : 0));
2015 $datelivraison = (!empty($objectsrc->delivery_date) ? $objectsrc->delivery_date :
'');
2018 if (!empty($objectsrc->multicurrency_code)) {
2019 $currency_code = $objectsrc->multicurrency_code;
2021 if (
getDolGlobalString(
'MULTICURRENCY_USE_ORIGIN_TX') && !empty($objectsrc->multicurrency_tx)) {
2022 $currency_tx = $objectsrc->multicurrency_tx;
2026 $note_private =
$object->getDefaultCreateValueFor(
'note_private', (!empty($objectsrc->note_private) ? $objectsrc->note_private : null));
2027 $note_public =
$object->getDefaultCreateValueFor(
'note_public', (!empty($objectsrc->note_public) ? $objectsrc->note_public : null));
2030 $srccontactslist = $objectsrc->liste_contact(-1,
'external', 1);
2033 $cond_reglement_id = !empty($societe->cond_reglement_supplier_id) ? $societe->cond_reglement_supplier_id : 0;
2034 $deposit_percent = !empty($societe->deposit_percent) ? $societe->deposit_percent : 0;
2035 $mode_reglement_id = !empty($societe->mode_reglement_supplier_id) ? $societe->mode_reglement_supplier_id : 0;
2037 if (
isModEnabled(
"multicurrency") && !empty($societe->multicurrency_code)) {
2038 $currency_code = $societe->multicurrency_code;
2041 $note_private =
$object->getDefaultCreateValueFor(
'note_private');
2042 $note_public =
$object->getDefaultCreateValueFor(
'note_public');
2046 if (empty($cond_reglement_id) &&
getDolGlobalString(
'SUPPLIER_ORDER_DEFAULT_PAYMENT_TERM_ID')) {
2049 if (empty($mode_reglement_id) &&
getDolGlobalString(
'SUPPLIER_ORDER_DEFAULT_PAYMENT_MODE_ID')) {
2052 if (GETPOSTISSET(
'cond_reglement_id_deposit_percent')) {
2053 $deposit_percent =
GETPOSTFLOAT(
'cond_reglement_id_deposit_percent');
2056 print
'<form name="add" action="'.$_SERVER[
"PHP_SELF"].
'" method="post">';
2057 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2058 print
'<input type="hidden" name="action" value="add">';
2059 print
'<input type="hidden" name="remise_percent" value="'.(empty($soc->remise_supplier_percent) ?
'' : $soc->remise_supplier_percent).
'">';
2060 print
'<input type="hidden" name="origin" value="'.$origin.
'">';
2061 print
'<input type="hidden" name="originid" value="'.$originid.
'">';
2062 print
'<input type="hidden" name="changecompany" value="0">';
2064 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2066 if ($backtopageforcancel) {
2067 print
'<input type="hidden" name="backtopageforcancel" value="'.$backtopageforcancel.
'">';
2070 if (!empty($currency_tx)) {
2071 print
'<input type="hidden" name="originmulticurrency_tx" value="'.$currency_tx.
'">';
2077 $parameters = array();
2079 $reshook = $hookmanager->executeHooks(
'tabContentCreateSupplierOrder', $parameters, $object, $action);
2080 if (empty($reshook)) {
2081 print
'<table class="border centpercent">';
2084 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
'Ref').
'</td><td>'.$langs->trans(
'Draft').
'</td></tr>';
2087 print
'<tr><td class="fieldrequired">'.$langs->trans(
'Supplier').
'</td>';
2090 if (!empty($societe->id) && $societe->id > 0) {
2091 print $societe->getNomUrl(1,
'supplier');
2092 print
'<input type="hidden" name="socid" value="'.$societe->id.
'">';
2094 $filter =
'((s.fournisseur:=:1) AND (s.status:=:1))';
2095 print
img_picto(
'',
'company',
'class="pictofixedwidth"').$form->select_company((empty($socid) ?
'' : $socid),
'socid', $filter,
'SelectThirdParty', 1, 0, array(), 0,
'minwidth175 maxwidth500 widthcentpercentminusxx');
2099 $(document).ready(function() {
2100 $("#socid").change(function() {
2101 console.log("We have changed the company - Reload page");
2103 $("input[name=action]").val("create");
2104 $("input[name=changecompany]").val("1");
2105 $("form[name=add]").submit();
2110 print
' <a href="'.DOL_URL_ROOT.
'/societe/card.php?action=create&client=0&fournisseur=1&backtopage='.urlencode($_SERVER[
"PHP_SELF"].
'?action=create').
'"><span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans(
"AddThirdParty").
'"></span></a>';
2116 print
'<tr><td>'.$form->textwithpicto($langs->trans(
'RefSupplier'), $langs->trans(
'RefOfOnVendorSide', $langs->transnoentitiesnoconv(
"SupplierOrder")));
2117 print
'</td><td><input name="refsupplier" type="text"></td>';
2121 if (!empty($societe->id) && $societe->id > 0) {
2123 print
'<tr><td>'.$langs->trans(
'Discounts').
'</td><td>';
2125 $absolute_discount = $societe->getAvailableDiscounts(
null,
'', 0, 1);
2127 $thirdparty = $societe;
2129 $backtopage = urlencode($_SERVER[
"PHP_SELF"].
'?socid='.$thirdparty->id.
'&action='.$action.
'&origin='.
GETPOST(
'origin').
'&originid='.
GETPOST(
'originid'));
2130 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
2136 print
'<tr><td class="nowrap">'.$langs->trans(
'PaymentConditionsShort').
'</td><td>';
2137 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
2138 print $form->getSelectConditionsPaiements((GETPOSTISSET(
'cond_reglement_id') &&
GETPOST(
'cond_reglement_id') != 0) ?
GETPOSTINT(
'cond_reglement_id') : $cond_reglement_id,
'cond_reglement_id', 1, 1, 0,
'maxwidth200 widthcentpercentminusx', $deposit_percent);
2142 print
'<tr><td>'.$langs->trans(
'PaymentMode').
'</td><td>';
2143 print
img_picto(
'',
'bank',
'class="pictofixedwidth"');
2144 $form->select_types_paiements((GETPOSTISSET(
'mode_reglement_id') &&
GETPOSTINT(
'mode_reglement_id') != 0) ?
GETPOST(
'mode_reglement_id') : $mode_reglement_id,
'mode_reglement_id');
2149 print $langs->trans(
'DateDeliveryPlanned');
2156 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2157 print $form->selectDate($datelivraison ? $datelivraison : -1,
'liv_', $usehourmin, $usehourmin, 0,
"set", 1, 1);
2162 $langs->load(
"bank");
2163 print
'<tr><td>'.$langs->trans(
'BankAccount').
'</td><td>';
2164 print
img_picto(
'',
'bank_account',
'class="pictofixedwidth"');
2165 $form->select_comptes($fk_account ??
'',
'fk_account', 0,
'', 1);
2173 $langs->load(
'projects');
2174 print
'<tr><td>'.$langs->trans(
'Project').
'</td><td>';
2175 if (!empty($user->socid)) {
2176 $projSocFilter = $user->socid;
2177 } elseif (
getDolGlobalString(
'PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS') || (
int) $socid == 0) {
2180 $projSocFilter = -1;
2182 $projSocFilter = $socid;
2184 print
img_picto(
'',
'project',
'class="pictofixedwidth"').$formproject->select_projects($projSocFilter, $projectid,
'projectid', 0, 0, 1, 1, 0, 0, 0,
'', 1, 0,
'maxwidth500');
2185 print
' <a href="'.DOL_URL_ROOT.
'/projet/card.php?action=create&status=1'.(!empty($societe->id) ?
'&socid='.$societe->id :
"").
'&backtopage='.urlencode($_SERVER[
"PHP_SELF"].
'?action=create'.(!empty($societe->id) ?
'&socid='.$societe->id :
"")).
'"><span class="fa fa-plus-circle valignmiddle" title="'.$langs->trans(
"AddProject").
'"></span></a>';
2191 $fkincoterms = (!empty(
$object->fk_incoterms) ?
$object->fk_incoterms : ($socid > 0 ? $societe->fk_incoterms :
''));
2192 $locincoterms = (!empty(
$object->location_incoterms) ?
$object->location_incoterms : ($socid > 0 ? $societe->location_incoterms :
''));
2194 print
'<td><label for="incoterm_id">'.$form->textwithpicto($langs->trans(
"IncotermLabel"),
$object->label_incoterms, 1).
'</label></td>';
2195 print
'<td class="maxwidthonsmartphone">';
2196 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
2197 print $form->select_incoterms($fkincoterms, $locincoterms);
2204 print
'<td>'.$form->editfieldkey(
'Currency',
'multicurrency_code',
'', $object, 0).
'</td>';
2205 print
'<td class="maxwidthonsmartphone">';
2206 print
img_picto(
'',
'currency',
'class="pictofixedwidth"');
2207 print $form->selectMultiCurrency($currency_code,
'multicurrency_code');
2213 print
'<tr><td>'.$langs->trans(
"Categories").
'</td><td colspan="3">';
2214 print $form->selectCategories(Categorie::TYPE_SUPPLIER_ORDER,
'categories', $object);
2218 print
'<tr><td>'.$langs->trans(
'NotePublic').
'</td>';
2220 $doleditor =
new DolEditor(
'note_public', isset($note_public) ? $note_public :
GETPOST(
'note_public',
'restricthtml'),
'', 80,
'dolibarr_notes',
'In', false, false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
2221 print $doleditor->Create(1);
2226 print
'<tr><td>'.$langs->trans(
'NotePrivate').
'</td>';
2228 $doleditor =
new DolEditor(
'note_private', isset($note_private) ? $note_private :
GETPOST(
'note_private',
'restricthtml'),
'', 80,
'dolibarr_notes',
'In', false, false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
2229 print $doleditor->Create(1);
2234 if (!empty($origin) && !empty($originid) && is_object($objectsrc) && $classname !==
null) {
2235 print
"\n<!-- ".$classname.
" info -->";
2237 print
'<input type="hidden" name="amount" value="'.$objectsrc->total_ht.
'">'.
"\n";
2238 print
'<input type="hidden" name="total" value="'.$objectsrc->total_ttc.
'">'.
"\n";
2239 print
'<input type="hidden" name="tva" value="'.$objectsrc->total_tva.
'">'.
"\n";
2240 print
'<input type="hidden" name="origin" value="'.$objectsrc->element.
'">';
2241 print
'<input type="hidden" name="originid" value="'.$objectsrc->id.
'">';
2243 $newclassname = $classname;
2244 print
'<tr><td>'.$langs->trans($newclassname).
'</td><td>'.$objectsrc->getNomUrl(1,
'supplier').
'</td></tr>';
2245 print
'<tr><td>'.$langs->trans(
'AmountHT').
'</td><td>'.
price($objectsrc->total_ht).
'</td></tr>';
2246 print
'<tr><td>'.$langs->trans(
'AmountVAT').
'</td><td>'.
price($objectsrc->total_tva).
"</td></tr>";
2247 if (
$mysoc->localtax1_assuj ==
"1" || $objectsrc->total_localtax1 != 0) {
2248 print
'<tr><td>'.$langs->transcountry(
"AmountLT1",
$mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax1).
"</td></tr>";
2251 if (
$mysoc->localtax2_assuj ==
"1" || $objectsrc->total_localtax2 != 0) {
2252 print
'<tr><td>'.$langs->transcountry(
"AmountLT2",
$mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax2).
"</td></tr>";
2255 print
'<tr><td>'.$langs->trans(
'AmountTTC').
'</td><td>'.
price($objectsrc->total_ttc).
"</td></tr>";
2258 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountHT').
'</td><td>'.
price($objectsrc->multicurrency_total_ht).
'</td></tr>';
2259 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountVAT').
'</td><td>'.
price($objectsrc->multicurrency_total_tva).
'</td></tr>';
2260 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountTTC').
'</td><td>'.
price($objectsrc->multicurrency_total_ttc).
'</td></tr>';
2265 $parameters = array();
2266 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $object, $action);
2267 print $hookmanager->resPrint;
2269 if (empty($reshook)) {
2270 if (
getDolGlobalString(
'THIRDPARTY_PROPAGATE_EXTRAFIELDS_TO_SUPPLIER_ORDER') && !empty($societe->id)) {
2273 $tpExtrafieldLabels = $tpExtrafields->fetch_name_optionals_label($societe->table_element);
2274 if ($societe->fetch_optionals() > 0) {
2275 $object->array_options = array_merge(
$object->array_options, $societe->array_options);
2279 print
$object->showOptionals($extrafields,
'create');
2287 print $form->buttonsSaveCancel(
"CreateDraft");
2290 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2291 $title = $langs->trans(
'ProductsAndServices');
2294 print
'<div class="div-table-responsive-no-min">';
2295 print
'<table class="noborder centpercent">';
2297 $selectedLines = array();
2299 $objectsrc->printOriginLinesList(
'', $selectedLines);
2305} elseif (!empty(
$object->id)) {
2307 $result =
$object->fetch($id, $ref);
2312 $societe =
$object->thirdparty;
2315 $author->fetch(
$object->user_author_id);
2319 $title = $langs->trans(
"SupplierOrder");
2320 print
dol_get_fiche_head($head,
'card', $title, -1,
'order', 0,
'',
'', 0,
'', 1);
2326 if ($action ==
'delete') {
2327 $arrayAjouts = array();
2358 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.((
int)
$object->id), $langs->trans(
'DeleteOrder'), $langs->trans(
'ConfirmDeleteOrder'),
'confirm_delete', $arrayAjouts, 0, 2, $heightModal, $widthModal);
2362 if ($action ==
'clone') {
2363 $filter =
'(s.fournisseur:=:1)';
2365 $formquestion = array(
2366 array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter))
2369 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneOrder',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1);
2373 if ($action ==
'valid') {
2377 if (preg_match(
'/^[\(]?PROV/i', (
string)
$object->ref) || empty(
$object->ref)) {
2387 $text = $langs->trans(
'ConfirmValidateOrder', $newref);
2389 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2392 $text .= $notify->confirmMessage(
'ORDER_SUPPLIER_VALIDATE',
$object->socid, $object);
2395 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ValidateOrder'), $text,
'confirm_valid',
'', 0, 1);
2400 if ($action ==
'approve' || $action ==
'approve2') {
2401 $qualified_for_stock_change = 0;
2403 $qualified_for_stock_change =
$object->hasProductsOrServices(2);
2405 $qualified_for_stock_change =
$object->hasProductsOrServices(1);
2408 $formquestion = array();
2410 $langs->load(
"stocks");
2411 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
2414 if (
$conf->browser->name ==
'ie') {
2417 $formquestion = array(
2421 array(
'type' =>
'other',
'name' =>
'idwarehouse',
'label' => $langs->trans(
"SelectWarehouseForStockIncrease"),
'value' => $formproduct->selectWarehouses(
GETPOSTINT(
'idwarehouse'),
'idwarehouse',
'', 1, 0, 0,
'', 0, $forcecombo))
2424 $text = $langs->trans(
"ConfirmApproveThisOrder",
$object->ref);
2426 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2429 $text .= $notify->confirmMessage(
'ORDER_SUPPLIER_APPROVE',
$object->socid, $object);
2432 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"ApproveThisOrder"), $text,
"confirm_".$action, $formquestion, 1, 1, 240);
2436 if ($action ==
'refuse') {
2437 $formquestion = array(
2440 'name' =>
'refuse_note',
2441 'label' => $langs->trans(
"Reason"),
2443 'morecss' =>
'minwidth300'
2446 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=$object->id", $langs->trans(
"DenyingThisOrder"), $langs->trans(
"ConfirmDenyingThisOrder",
$object->ref),
"confirm_refuse", $formquestion, 0, 1);
2450 if ($action ==
'cancel') {
2451 $formquestion = array(
2454 'name' =>
'cancel_note',
2455 'label' => $langs->trans(
"Reason"),
2457 'morecss' =>
'minwidth300'
2461 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2465 $text .= $notify->confirmMessage(
'ORDER_SUPPLIER_CANCEL',
$object->socid, $object);
2467 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=$object->id", $langs->trans(
"Cancel"), $langs->trans(
"ConfirmCancelThisOrder",
$object->ref),
"confirm_cancel", $formquestion, 0, 1);
2471 if ($action ==
'commande') {
2472 $formquestion = array();
2475 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2479 $text .= $notify->confirmMessage(
'ORDER_SUPPLIER_SUBMIT',
$object->socid, $object);
2482 require_once DOL_DOCUMENT_ROOT.
'/webhook/class/target.class.php';
2484 if ($targetstatic->isTriggerCodeManualTarget(
'ORDER_SUPPLIER_SUBMIT') > 0) {
2485 $formquestion[] = array(
'type' =>
'checkbox',
'name' =>
'manual_trigger_send',
'label' => $langs->trans(
"QuestionSendManualTrigger"));
2488 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id.
"&datecommande=".$date_com.
"&methode=".
GETPOST(
"methodecommande").
"&comment=".urlencode(
GETPOST(
"comment")), $langs->trans(
"MakeOrder"), $langs->trans(
"ConfirmMakeOrder",
dol_print_date($date_com,
'day')),
"confirm_commande", $formquestion, 0, 2);
2492 if ($action ==
'ask_deleteline') {
2493 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'', 0, 1);
2497 if ($action ==
'ask_subtotal_deleteline') {
2498 $langs->load(
'subtotals');
2499 $subtotaltitle =
'DeleteSubtotalLine';
2500 $subtotalquestion =
'ConfirmDeleteSubtotalLine';
2501 $subtotalformquestion = array();
2502 if (
GETPOST(
'type') ==
'title') {
2503 $subtotalformquestion = array(array(
'type' =>
'checkbox',
'name' =>
'deletecorrespondingsubtotalline',
'label' => $langs->trans(
'DeleteCorrespondingSubtotalLine'),
'value' => 0));
2504 $subtotaltitle =
'DeleteTitleLine';
2505 $subtotalquestion =
'ConfirmDeleteTitleLine';
2507 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans($subtotaltitle), $langs->trans($subtotalquestion),
'confirm_delete_subtotalline', $subtotalformquestion,
'no', 1);
2511 if ($action ==
'add_title_line') {
2512 $langs->load(
'subtotals');
2514 $depth_array =
$object->getPossibleLevels($langs);
2515 require DOL_DOCUMENT_ROOT .
'/core/tpl/subtotal_create.tpl.php';
2516 } elseif ($action ==
'add_subtotal_line') {
2517 $langs->load(
'subtotals');
2519 $titles =
$object->getPossibleTitles();
2520 require DOL_DOCUMENT_ROOT .
'/core/tpl/subtotal_create.tpl.php';
2521 } elseif ($action ==
'add_text_line') {
2522 $langs->load(
'subtotals');
2524 require DOL_DOCUMENT_ROOT .
'/core/tpl/subtotal_create.tpl.php';
2528 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
2529 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
2530 if (empty($reshook)) {
2531 $formconfirm .= $hookmanager->resPrint;
2532 } elseif ($reshook > 0) {
2533 $formconfirm = $hookmanager->resPrint;
2542 $linkback =
'<a href="'.DOL_URL_ROOT.
'/fourn/commande/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
2544 $morehtmlref =
'<div class="refidno">';
2546 $morehtmlref .= $form->editfieldkey(
"RefSupplier",
'ref_supplier',
$object->ref_supplier, $object, (
int) $usercancreate,
'string',
'', 0, 1);
2547 $morehtmlref .= $form->editfieldval(
"RefSupplier",
'ref_supplier',
$object->ref_supplier, $object, $usercancreate,
'string'.(isset(
$conf->global->THIRDPARTY_REF_INPUT_SIZE) ?
':' .
getDolGlobalString(
'THIRDPARTY_REF_INPUT_SIZE') :
''),
'', null, null,
'', 1);
2549 $morehtmlref .=
'<br>';
2550 if (
getDolGlobalString(
'MAIN_CAN_EDIT_SUPPLIER_ON_SUPPLIER_ORDER') && !empty($usercancreate) && $action ==
'edit_thirdparty') {
2551 $morehtmlref .=
'<form method="post" action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'">';
2552 $morehtmlref .=
'<input type="hidden" name="action" value="set_thirdparty">';
2553 $morehtmlref .=
'<input type="hidden" name="token" value="'.newToken().
'">';
2554 $filter =
'(s.fournisseur:=:1)';
2555 $morehtmlref .= $form->select_company(
$object->thirdparty->id,
'new_socid', $filter,
'', 0, 0, array(), 0,
'minwidth300');
2556 $morehtmlref .=
'<input type="submit" class="button valignmiddle" value="'.$langs->trans(
"Modify").
'">';
2557 $morehtmlref .=
'</form>';
2559 if (!
getDolGlobalString(
'MAIN_CAN_EDIT_SUPPLIER_ON_SUPPLIER_ORDER') || $action !=
'edit_thirdparty') {
2561 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=edit_thirdparty&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetThirdParty')).
'</a>';
2563 $morehtmlref .=
$object->thirdparty->getNomUrl(1,
'supplier');
2565 $morehtmlref .=
' (<a href="'.DOL_URL_ROOT.
'/fourn/commande/list.php?socid='.
$object->thirdparty->id.
'">'.$langs->trans(
"OtherOrders").
'</a>)';
2571 $langs->load(
"projects");
2572 $morehtmlref .=
'<br>';
2573 if ($permissiontoadd) {
2574 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
2575 if ($action !=
'classify' && $caneditproject) {
2576 $morehtmlref .=
'<a class="editfielda" href="'.dolBuildUrl($_SERVER[
'PHP_SELF'], [
'action' =>
'classify',
'id' =>
$object->id],
true).
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
2578 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (!
getDolGlobalString(
'PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS') ?
$object->socid : -1), (
string)
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 1, 0, 0, 1,
'',
'maxwidth300');
2580 if (!empty(
$object->fk_project)) {
2582 $proj->fetch(
$object->fk_project);
2583 $morehtmlref .= $proj->getNomUrl(1);
2585 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
2590 $morehtmlref .=
'</div>';
2593 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
2596 $parameters = array();
2598 $reshook = $hookmanager->executeHooks(
'tabContentViewSupplierOrder', $parameters, $object, $action);
2599 if (empty($reshook)) {
2600 print
'<div class="fichecenter">';
2601 print
'<div class="fichehalfleft">';
2602 print
'<div class="underbanner clearboth"></div>';
2604 print
'<table class="border tableforfield centpercent">';
2607 if (
$object->methode_commande_id > 0) {
2612 print
'<tr><td class="titlefield">'.$langs->trans(
"Date").
'</td><td>';
2615 print
' '.img_picto($langs->trans(
"Late").
' : '.
$object->showDelay(),
"warning");
2619 if (
$object->methode_commande) {
2620 print
'<tr><td>'.$langs->trans(
"Method").
'</td><td>'.
$object->getInputMethod().
'</td></tr>';
2625 print
'<tr><td class="titlefield">'.$langs->trans(
"AuthorRequest").
'</td>';
2626 print
'<td>'.$author->getNomUrl(-1,
'', 0, 0, 0).
'</td>';
2631 $filterabsolutediscount =
"fk_invoice_supplier_source IS NULL";
2632 $filtercreditnote =
"fk_invoice_supplier_source IS NOT NULL";
2634 $filterabsolutediscount =
"fk_invoice_supplier_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS PAID)%')";
2635 $filtercreditnote =
"fk_invoice_supplier_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS PAID)%')";
2638 $absolute_discount = $societe->getAvailableDiscounts(
null, $filterabsolutediscount, 0, 1);
2639 $absolute_creditnote = $societe->getAvailableDiscounts(
null, $filtercreditnote, 0, 1);
2640 $absolute_discount =
price2num($absolute_discount,
'MT');
2641 $absolute_creditnote =
price2num($absolute_creditnote,
'MT');
2643 print
'<tr><td class="titlefield">'.$langs->trans(
'Discounts').
'</td><td>';
2645 $thirdparty = $societe;
2647 $backtopage = urlencode($_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
2648 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
2653 $langs->load(
'bills');
2654 print
'<tr><td class="nowrap">';
2655 print
'<table class="nobordernopadding centpercent"><tr><td class="nowrap">';
2656 print $langs->trans(
'PaymentConditions');
2658 if ($action !=
'editconditions' && $permissiontoadd) {
2659 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editconditions&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->trans(
'SetConditions'), 1).
'</a></td>';
2661 print
'</tr></table>';
2663 if ($action ==
'editconditions') {
2664 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->cond_reglement_id,
'cond_reglement_id', 1,
'', 1,
$object->deposit_percent);
2666 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->cond_reglement_id,
'none', 1,
'', 1,
$object->deposit_percent);
2672 $langs->load(
'bills');
2673 print
'<tr><td class="nowrap">';
2674 print
'<table class="nobordernopadding centpercent"><tr><td class="nowrap">';
2675 print $langs->trans(
'PaymentMode');
2677 if ($action !=
'editmode' && $permissiontoadd) {
2678 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editmode&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->trans(
'SetMode'), 1).
'</a></td>';
2680 print
'</tr></table>';
2682 if ($action ==
'editmode') {
2683 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->mode_reglement_id,
'mode_reglement_id',
'DBIT', 1, 1);
2685 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->mode_reglement_id,
'none');
2691 print
'<tr><td class="nowrap">';
2692 print
'<table class="nobordernopadding centpercent"><tr><td class="nowrap">';
2693 print $langs->trans(
'BankAccount');
2695 if ($action !=
'editbankaccount' && $permissiontoadd) {
2696 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>';
2698 print
'</tr></table>';
2700 if ($action ==
'editbankaccount') {
2701 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->fk_account,
'fk_account', 1);
2703 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->fk_account,
'none');
2711 print
'<td>'.$langs->trans(
'NbDaysToDelivery').
' '.
img_picto($langs->trans(
'DescNbDaysToDelivery'),
'info',
'style="cursor:help"').
'</td>';
2712 print
'<td>'.$object->getMaxDeliveryTimeDay($langs).
'</td>';
2717 print
'<table class="nobordernopadding centpercent"><tr><td>';
2718 print $langs->trans(
'DateDeliveryPlanned');
2720 if ($action !=
'editdate_livraison') {
2721 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editdate_livraison&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->trans(
'SetDeliveryDate'), 1).
'</a></td>';
2723 print
'</tr></table>';
2725 if ($action ==
'editdate_livraison') {
2726 print
'<form name="setdate_livraison" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
2727 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2728 print
'<input type="hidden" name="action" value="setdate_livraison">';
2733 print $form->selectDate(
$object->delivery_date ?
$object->delivery_date : -1,
'liv_', $usehourmin, $usehourmin, 0,
"setdate_livraison");
2734 print
'<input type="submit" class="button button-edit smallpaddingimp valign middle" value="'.$langs->trans(
'Modify').
'">';
2737 $usehourmin =
'day';
2739 $usehourmin =
'dayhour';
2742 if (
$object->hasDelay() && !empty(
$object->delivery_date) && (
$object->status == $object::STATUS_ORDERSENT ||
$object->status == $object::STATUS_RECEIVED_PARTIALLY)) {
2743 print
' '.img_picto($langs->trans(
"Late").
' : '.
$object->showDelay(),
"warning");
2751 print
'<table class="nobordernopadding centpercent"><tr><td>';
2752 print $langs->trans(
'IncotermLabel');
2753 print
'<td><td class="right">';
2754 if ($usercancreate) {
2755 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/fourn/commande/card.php?id='.
$object->id.
'&action=editincoterm&token='.
newToken().
'">'.
img_edit().
'</a>';
2759 print
'</td></tr></table>';
2762 if ($action !=
'editincoterm') {
2765 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
2773 print
'<table class="nobordernopadding centpercent"><tr><td>';
2774 print $langs->trans(
"Categories");
2775 print
'<td><td class="right">';
2776 if ($usercancreate) {
2777 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/fourn/commande/card.php?id='.
$object->id.
'&action=edittags&token='.
newToken().
'">'.
img_edit().
'</a>';
2781 print
'</td></tr></table>';
2784 if ($action ==
'edittags') {
2785 print
'<form method="POST" action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'">';
2786 print
'<input type="hidden" name="action" value="settags">';
2787 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2788 print $form->selectCategories(Categorie::TYPE_SUPPLIER_ORDER,
'categories', $object);
2789 print
'<input type="submit" class="button valignmiddle smallpaddingimp" value="'.$langs->trans(
"Modify").
'">';
2792 print $form->showCategories(
$object->id, Categorie::TYPE_SUPPLIER_ORDER, 1);
2798 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
2803 print
'<div class="fichehalfright">';
2804 print
'<div class="underbanner clearboth"></div>';
2806 print
'<table class="border tableforfield centpercent">';
2808 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_currency_amount.tpl.php';
2812 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountHT') .
'</td>';
2813 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ht, 0, $langs, 0, -1, -1,
$conf->currency) .
'</td>';
2816 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ht, 0, $langs, 0, -1, -1,
$object->multicurrency_code) .
'</td>';
2822 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountVAT') .
'</td>';
2823 print
'<td class="nowrap amountcard right">' .
price(
$object->total_tva, 0, $langs, 0, -1, -1,
$conf->currency) .
'</td>';
2826 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_tva, 0, $langs, 0, -1, -1,
$object->multicurrency_code) .
'</td>';
2831 if (
$mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
2833 print
'<td class="titlefieldmiddle">' . $langs->transcountry(
"AmountLT1",
$mysoc->country_code) .
'</td>';
2834 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax1, 0, $langs, 0, -1, -1,
$conf->currency) .
'</td>';
2836 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax1, 0, $langs, 0, -1, -1,
$object->multicurrency_code) .
'</td>';
2840 if (
$mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
2842 print
'<td>' . $langs->transcountry(
"AmountLT2",
$mysoc->country_code) .
'</td>';
2843 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax2, 0, $langs, 0, -1, -1,
$conf->currency) .
'</td>';
2845 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax2, 0, $langs, 0, -1, -1,
$object->multicurrency_code) .
'</td>';
2853 $alert =
' ' .
img_warning($langs->trans(
'OrderMinAmount') .
': ' .
price(
$object->thirdparty->supplier_order_min_amount));
2858 print
'<td>' . $langs->trans(
'AmountTTC') .
'</td>';
2859 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ttc, 0, $langs, 0, -1, -1,
$conf->currency) . $alert .
'</td>';
2862 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ttc, 0, $langs, 0, -1, -1,
$object->multicurrency_code) .
'</td>';
2877 print
'<div class="clearboth"></div><br>';
2880 $blocname =
'contacts';
2881 $title = $langs->trans(
'ContactsAddresses');
2882 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
2886 $blocname =
'notes';
2887 $title = $langs->trans(
'Notes');
2888 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
2897 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.(($action !=
'editline') ?
'' :
'#line_'.
GETPOSTINT(
'lineid')).
'" method="POST">
2898 <input type="hidden" name="token" value="'.
newToken().
'">
2899 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
2900 <input type="hidden" name="mode" value="">
2901 <input type="hidden" name="page_y" value="">
2902 <input type="hidden" name="id" value="'.
$object->id.
'">
2903 <input type="hidden" name="socid" value="'.$societe->id.
'">
2908 include DOL_DOCUMENT_ROOT .
'/core/tpl/subtotal_ajaxrow.tpl.php';
2910 include DOL_DOCUMENT_ROOT .
'/core/tpl/ajaxrow.tpl.php';
2914 print
'<div class="div-table-responsive-no-min">';
2915 print
'<table id="tablelines" class="noborder noshadow centpercent">';
2918 global $forceall, $senderissupplier, $dateSelector, $inputalsopricewithtax;
2921 $inputalsopricewithtax = 1;
2922 $senderissupplier = 2;
2924 $senderissupplier =
getDolGlobalInt(
'SUPPLIER_ORDER_WITH_PREDEFINED_PRICES_ONLY');
2936 if ($action !=
'editline') {
2939 $parameters = array();
2940 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
2944 if (empty($reshook)) {
2960 if ($user->socid == 0 && $action !=
'delete') {
2961 if ($action !=
'createorder' && $action !=
'presend' && $action !=
'editline') {
2962 print
'<div class="tabsAction">';
2964 $parameters = array();
2965 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
2967 if (empty($reshook)) {
2973 $langs->load(
'subtotals');
2975 $url_button = array();
2977 $url_button[] = array(
2978 'lang' =>
'subtotals',
2980 'perm' => (
bool) $usercancreate,
2981 'label' => $langs->trans(
'AddTitleLine'),
2982 'url' =>
dolBuildUrl($_SERVER[
'PHP_SELF'], [
'id' =>
$object->id,
'action' =>
'add_title_line'],
true)
2985 $url_button[] = array(
2986 'lang' =>
'subtotals',
2988 'perm' => (
bool) $usercancreate,
2989 'label' => $langs->trans(
'AddSubtotalLine'),
2990 'url' =>
dolBuildUrl($_SERVER[
'PHP_SELF'], [
'id' =>
$object->id,
'action' =>
'add_subtotal_line'],
true)
2993 $url_button[] = array(
2994 'lang' =>
'subtotals',
2996 'perm' => (
bool) $usercancreate,
2997 'label' => $langs->trans(
'AddTextLine'),
2998 'url' =>
dolBuildUrl($_SERVER[
'PHP_SELF'], [
'id' =>
$object->id,
'action' =>
'add_text_line'],
true)
3001 print
dolGetButtonAction(
'', $langs->trans(
'SubTotal'),
'default', $url_button,
'',
true);
3006 if ($usercanvalidate) {
3007 $tmpbuttonlabel = $langs->trans(
'Validate');
3009 $tmpbuttonlabel = $langs->trans(
"ValidateAndApprove");
3012 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=valid&token='.
newToken().
'">';
3013 print $tmpbuttonlabel;
3017 $langs->load(
"errors");
3018 print
dolGetButtonAction($langs->trans(
"ErrorObjectMustHaveLinesToBeValidated",
$object->ref), $langs->trans(
'Validate'),
'default', $_SERVER[
"PHP_SELF"] .
'?action=validate&token=' .
newToken() .
'&id=' .
$object->id, (
string)
$object->id, -1);
3029 if ($usercanorder) {
3030 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=reopen&token='.
newToken().
'">'.$langs->trans(
"Modify").
'</a>';
3036 if ($usercanapprove) {
3038 print
'<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans(
"FirstApprovalAlreadyDone")).
'">'.$langs->trans(
"ApproveOrder").
'</a>';
3040 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=approve&token='.
newToken().
'">'.$langs->trans(
"ApproveOrder").
'</a>';
3043 print
'<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans(
"NotAllowed")).
'">'.$langs->trans(
"ApproveOrder").
'</a>';
3050 if ($usercanapprovesecond) {
3051 if (!empty(
$object->user_approve_id2)) {
3052 print
'<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans(
"SecondApprovalAlreadyDone")).
'">'.$langs->trans(
"Approve2Order").
'</a>';
3054 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=approve2&token='.
newToken().
'">'.$langs->trans(
"Approve2Order").
'</a>';
3057 print
'<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans(
"NotAllowed")).
'">'.$langs->trans(
"Approve2Order").
'</a>';
3064 if ($usercanapprove || $usercanapprovesecond) {
3065 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=refuse&token='.
newToken().
'">'.$langs->trans(
"RefuseOrder").
'</a>';
3067 print
'<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans(
"NotAllowed")).
'">'.$langs->trans(
"RefuseOrder").
'</a>';
3072 if (empty($user->socid)) {
3074 if ($usercanorder) {
3075 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email',
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id,
'action' =>
'presend',
'mode' =>
'init'],
true).
'#formmailbeforetitle',
'');
3083 if (!$buttonshown && $usercanapprove) {
3086 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=reopen&token='.
newToken().
'">'.$langs->trans(
"Disapprove").
'</a>';
3090 if (!$buttonshown && $usercanapprovesecond &&
getDolGlobalString(
'SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED')) {
3093 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=reopen&token='.
newToken().
'">'.$langs->trans(
"Disapprove").
'</a>';
3097 if (in_array(
$object->status, array(3, 4, 5, 6, 7, 9))) {
3098 if ($usercanorder) {
3099 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=reopen&token='.
newToken().
'">'.$langs->trans(
"ReOpen").
'</a>';
3106 $labelofbutton = $langs->trans(
'ReceiveProducts');
3108 $labelofbutton = $langs->trans(
"CreateReception");
3109 if (!empty(
$object->linkedObjects[
'reception'])) {
3110 foreach (
$object->linkedObjects[
'reception'] as $element) {
3111 if ($element->statut >= 0) {
3124 $dispachedLines =
$object->getDispachedLines(1);
3125 $nbDispachedLines = count($dispachedLines);
3126 if ($nbDispachedLines > 0) {
3131 if (in_array(
$object->status, array(3, 4, 5))) {
3132 if (
isModEnabled(
"supplier_order") && $usercanreceive) {
3133 print
'<div class="inline-block divButAction"><a class="butAction" href="'.DOL_URL_ROOT.
'/fourn/commande/dispatch.php?id='.
$object->id.
'">'.$labelofbutton.
'</a></div>';
3135 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans(
"NotAllowed")).
'">'.$labelofbutton.
'</a></div>';
3141 if ($usercanorder) {
3142 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=createorder&token='.
newToken().
'#makeorder">'.$langs->trans(
"MakeOrder").
'</a></div>';
3144 print
'<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#">'.$langs->trans(
"MakeOrder").
'</a></div>';
3150 if ($usercanreceive) {
3151 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&token='.
newToken().
'&action=classifyreception#classifyreception">'.$langs->trans(
"ClassifyReception").
'</a></div>';
3158 if ($user->hasRight(
'fournisseur',
'facture',
'creer') || $user->hasRight(
"supplier_invoice",
"creer")) {
3159 print
'<a class="butAction" href="'.DOL_URL_ROOT.
'/fourn/facture/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->socid.
'">'.$langs->trans(
"SupplierOrderCreateBill").
'</a>';
3167 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=classifybilled&token='.
newToken().
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3169 if (!empty(
$object->linkedObjectsIds[
'invoice_supplier']) || (empty(
$object->linkedObjectsIds[
'invoice_supplier']) && !
getDolGlobalInt(
'SUPPLIER_ORDER_DISABLE_CLASSIFY_BILLED_FROM_SUPPLIER_ORDER'))) {
3170 if ($user->hasRight(
'fournisseur',
'facture',
'creer') || $user->hasRight(
"supplier_invoice",
"creer")) {
3171 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=classifybilled&token='.
newToken().
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3174 print
'<a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->trans(
"NeedAtLeastOneInvoice")).
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3180 if ($usercancreate &&
$object->billed > 0 &&
$object->status > $object::STATUS_DRAFT) {
3181 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=classifyunbilled&token='.
newToken().
'">'.$langs->trans(
"ClassifyUnbilled").
'</a>';
3185 if ($usercancreate) {
3186 print
'<a class="butAction butActionClone" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&socid='.
$object->socid.
'&action=clone&token='.
newToken().
'&object=order">'.$langs->trans(
"ToClone").
'</a>';
3191 if ($usercanorder) {
3192 print
'<a class="butActionDelete" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=cancel&token='.
newToken().
'">'.$langs->trans(
"CancelOrder").
'</a>';
3197 if (!empty($usercandelete)) {
3198 if ($hasreception) {
3199 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"ReceptionExist").
'">'.$langs->trans(
"Delete").
'</a>';
3201 print
'<a class="butActionDelete" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete&token='.
newToken().
'">'.$langs->trans(
"Delete").
'</a>';
3211 print
'<!-- form to record supplier order -->'.
"\n";
3212 print
'<form name="commande" id="makeorder" action="card.php?id='.$object->id.
'&action=commande" method="POST">';
3214 print
'<input type="hidden" name="token" value="'.newToken().
'">';
3215 print
'<input type="hidden" name="action" value="commande">';
3217 print
'<table class="noborder centpercent">';
3219 print
'<tr><td class="fieldrequired">'.$langs->trans(
"OrderDate").
'</td><td>';
3221 print $form->selectDate($date_com ?:
'',
'', 0, 0, 0,
"commande", 1, 1);
3225 print
'<tr><td class="fieldrequired">'.$langs->trans(
"OrderMode").
'</td><td>';
3226 $formorder->selectInputMethod(
GETPOST(
'methodecommande'),
"methodecommande", 1);
3229 print
'<tr><td>'.$langs->trans(
"Comment").
'</td><td><input class="quatrevingtpercent" type="text" name="comment" value="'.
GETPOST(
'comment').
'"></td></tr>';
3231 print
'<tr><td class="center" colspan="2">';
3232 print
'<input type="submit" name="makeorder" class="button" value="'.$langs->trans(
"ToOrder").
'">';
3233 print
' ';
3234 print
'<input type="submit" name="cancel" class="button button-cancel" value="'.$langs->trans(
"Cancel").
'">';
3243 if (
GETPOST(
'modelselected')) {
3244 $action =
'presend';
3247 if ($action !=
'createorder' && $action !=
'presend') {
3248 print
'<div class="fichecenter"><div class="fichehalfleft">';
3253 $relativepath = $objref.
'/'.$objref.
'.pdf';
3255 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
3256 $genallowed = $usercanread;
3257 $delallowed = $usercancreate;
3260 print $formfile->showdocuments(
'commande_fournisseur', $objref, $filedir, $urlsource, (
int) $genallowed, (int) $delallowed, $modelpdf, 1, 0, 0, 0, 0,
'',
'',
'',
$object->thirdparty->default_lang,
'', $object);
3261 $somethingshown = $formfile->numoffiles;
3264 $tmparray = $form->showLinkToObjectBlock($object, array(), array(
'supplier_order',
'order_supplier'), 1);
3265 $linktoelem = $tmparray[
'linktoelem'];
3266 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
3267 print $htmltoenteralink;
3269 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
3271 print
'</div><div class="fichehalfright">';
3273 if ($action ==
'classifyreception') {
3276 print
'<!-- form to record purchase order received -->'.
"\n";
3277 print
'<form id="classifyreception" action="card.php?id='.$object->id.
'" method="post">';
3278 print
'<input type="hidden" name="token" value="'.newToken().
'">';
3279 print
'<input type="hidden" name="action" value="livraison">';
3282 print
'<table class="noborder centpercent">';
3284 print
'<tr><td>'.$langs->trans(
"DeliveryDate").
'</td><td>';
3286 print $form->selectDate($datepreselected,
'', 1, 1, 0,
"commande", 1, 1);
3287 print
"</td></tr>\n";
3289 print
'<tr><td class="fieldrequired">'.$langs->trans(
"Delivery").
"</td><td>\n";
3291 $liv[
''] =
' ';
3292 $liv[
'tot'] = $langs->trans(
"CompleteOrNoMoreReceptionExpected");
3293 $liv[
'par'] = $langs->trans(
"PartialWoman");
3294 $liv[
'nev'] = $langs->trans(
"NeverReceived");
3295 $liv[
'can'] = $langs->trans(
"Canceled");
3297 print $form->selectarray(
"type", $liv);
3300 print
'<tr><td>'.$langs->trans(
"Comment").
'</td><td><input class="quatrevingtpercent" type="text" name="comment"></td></tr>';
3301 print
'<tr><td class="center" colspan="2">';
3302 print
'<input type="submit" name="receive" class="button" value="'.$langs->trans(
"Receive").
'">';
3303 print
' ';
3304 print
'<input type="submit" name="cancel" class="button button-cancel" value="'.$langs->trans(
"Cancel").
'">';
3313 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
3315 $somethingshown = $formactions->showactions($object,
'order_supplier', $socid, 1,
'listaction'.($genallowed ?
'largetitle' :
''));
3317 print
'</div></div>';
3323 if ($action ==
'webservice' &&
GETPOST(
'mode',
'alpha') !=
"send" && !
GETPOST(
'cancel',
'alpha')) {
3324 $mode =
GETPOST(
'mode',
'alpha');
3325 $ws_url =
$object->thirdparty->webservices_url;
3326 $ws_key =
$object->thirdparty->webservices_key;
3327 $ws_user =
GETPOST(
'ws_user',
'alpha');
3328 $ws_password =
GETPOST(
'ws_password',
'alpha');
3329 $error_occurred =
false;
3332 $ws_ns =
'http://www.dolibarr.org/ns/';
3333 $ws_authentication = array(
3334 'dolibarrkey' => $ws_key,
3335 'sourceapplication' =>
'DolibarrWebServiceClient',
3336 'login' => $ws_user,
3337 'password' => $ws_password,
3344 if (empty($ws_url) || empty($ws_key)) {
3345 setEventMessages($langs->trans(
"ErrorWebServicesFieldsRequired"),
null,
'errors');
3347 $error_occurred =
true;
3348 } elseif ($mode !=
"init" && (empty($ws_user) || empty($ws_password))) {
3353 if ($mode ==
"init") {
3355 print
'<table class="border centpercent">';
3356 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
3357 print
'<input type="hidden" name="token" value="'.newToken().
'">';
3358 print
'<input type="hidden" name="action" value="webservice">';
3359 print
'<input type="hidden" name="mode" value="check">';
3361 if ($error_occurred) {
3362 print
"<br>".$langs->trans(
"ErrorOccurredReviseAndRetry").
"<br>";
3363 print
'<input class="button button-cancel" type="submit" id="cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
3366 print
'<tr><td>'.$langs->trans(
"WebServiceURL").
'</td><td colspan="3">'.
dol_print_url($ws_url).
'</td></tr>';
3368 print
'<tr><td>'.$langs->trans(
"User").
'</td><td><input class="width100" type="text" name="ws_user"></td></tr>';
3370 print
'<tr><td>'.$langs->trans(
"Password").
'</td><td><input class="width100" type="text" name="ws_password"></td></tr>';
3372 print
'<tr><td class="center" colspan="2">';
3373 print
'<input type="submit" class="button" id="ws_submit" name="ws_submit" value="'.$langs->trans(
"CreateRemoteOrder").
'">';
3374 print
' ';
3376 print
'<input class="button button-cancel" type="submit" id="cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
3383 } elseif ($mode ==
"check") {
3385 $ws_thirdparty =
'';
3386 $error_occurred =
false;
3389 $soapclient_user =
new nusoap_client($ws_url.
"/webservices/server_user.php");
3390 $soapclient_user->soap_defencoding =
'UTF-8';
3391 $soapclient_user->decodeUTF8(
false);
3394 $ws_parameters = array(
'authentication' => $ws_authentication,
'id' =>
'',
'ref' => $ws_user);
3395 $result_user = $soapclient_user->call(
"getUser", $ws_parameters, $ws_ns,
'');
3396 $user_status_code = $result_user[
"result"][
"result_code"];
3398 if ($user_status_code ==
"OK") {
3400 $ws_entity = $result_user[
"user"][
"entity"];
3401 $ws_authentication[
'entity'] = $ws_entity;
3402 $ws_thirdparty = $result_user[
"user"][
"fk_thirdparty"];
3403 if (empty($ws_thirdparty)) {
3404 setEventMessages($langs->trans(
"RemoteUserMissingAssociatedSoc"),
null,
'errors');
3405 $error_occurred =
true;
3408 $soapclient_product =
new nusoap_client($ws_url.
"/webservices/server_productorservice.php");
3409 $soapclient_product->soap_defencoding =
'UTF-8';
3410 $soapclient_product->decodeUTF8(
false);
3415 foreach (
$object->lines as $line) {
3417 $ref_supplier = $line->ref_supplier;
3418 $line_id = $i.
"º) ".$line->product_ref.
": ";
3419 if (empty($ref_supplier)) {
3422 $ws_parameters = array(
'authentication' => $ws_authentication,
'id' =>
'',
'ref' => $ref_supplier);
3423 $result_product = $soapclient_product->call(
"getProductOrService", $ws_parameters, $ws_ns,
'');
3424 if (!$result_product) {
3425 setEventMessages($line_id.$langs->trans(
"Error").
" SOAP ".$soapclient_product->error_str.
" - ".$soapclient_product->response,
null,
'errors');
3426 $error_occurred =
true;
3431 $status_code = $result_product[
"result"][
"result_code"];
3432 if (empty($status_code)) {
3433 setEventMessages($langs->trans(
"Error").
" SOAP '".$soapclient_product->error_str.
"'",
null,
'errors');
3434 } elseif ($status_code !=
"OK") {
3435 if ($status_code ==
"NOT_FOUND") {
3436 setEventMessages($line_id.$langs->trans(
"SupplierMissingRef").
" '".$ref_supplier.
"'",
null,
'warnings');
3438 setEventMessages($line_id.$langs->trans(
"ResponseNonOK").
" '".$status_code.
"' - '".$result_product[
"result"][
"result_label"].
"'",
null,
'errors');
3439 $error_occurred =
true;
3446 $supplier_price =
price($result_product[
"product"][
"price_net"]);
3447 $local_price =
null;
3450 $product_fourn_list = $product_fourn->list_product_fournisseur_price($line->fk_product);
3451 if (count($product_fourn_list) > 0) {
3452 foreach ($product_fourn_list as $product_fourn_line) {
3454 if ($product_fourn_line->fourn_id ==
$object->socid && $product_fourn_line->fourn_ref == $ref_supplier) {
3455 $local_price =
price($product_fourn_line->fourn_price);
3460 if ($local_price !=
null && $local_price != $supplier_price) {
3461 setEventMessages($line_id.$langs->trans(
"RemotePriceMismatch").
" ".$supplier_price.
" - ".$local_price,
null,
'warnings');
3465 if (empty($result_product[
"product"][
"status_tosell"])) {
3466 setEventMessages($line_id.$langs->trans(
"ProductStatusNotOnSellShort").
" '".$ref_supplier.
"'",
null,
'warnings');
3470 } elseif ($user_status_code ==
"PERMISSION_DENIED") {
3471 setEventMessages($langs->trans(
"RemoteUserNotPermission"),
null,
'errors');
3472 $error_occurred =
true;
3473 } elseif ($user_status_code ==
"BAD_CREDENTIALS") {
3474 setEventMessages($langs->trans(
"RemoteUserBadCredentials"),
null,
'errors');
3475 $error_occurred =
true;
3477 setEventMessages($langs->trans(
"ResponseNonOK").
" '".$user_status_code.
"'",
null,
'errors');
3478 $error_occurred =
true;
3482 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
3483 print
'<input type="hidden" name="token" value="'.newToken().
'">';
3484 print
'<input type="hidden" name="action" value="webservice">';
3485 print
'<input type="hidden" name="mode" value="send">';
3486 print
'<input type="hidden" name="ws_user" value="'.$ws_user.
'">';
3487 print
'<input type="hidden" name="ws_password" value="'.$ws_password.
'">';
3488 print
'<input type="hidden" name="ws_entity" value="'.$ws_entity.
'">';
3489 print
'<input type="hidden" name="ws_thirdparty" value="'.$ws_thirdparty.
'">';
3490 if ($error_occurred) {
3491 print
"<br>".$langs->trans(
"ErrorOccurredReviseAndRetry").
"<br>";
3493 print
'<input type="submit" class="button" id="ws_submit" name="ws_submit" value="'.$langs->trans(
"Confirm").
'">';
3494 print
' ';
3496 print
'<input class="button button-cancel" type="submit" id="cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
3502 $modelmail =
'order_supplier_send';
3503 $defaulttopic =
'SendOrderRef';
3505 $autocopy =
'MAIN_MAIL_AUTOCOPY_SUPPLIER_ORDER_TO';
3506 $trackid =
'sord'.$object->id;
3508 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $object
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage predefined suppliers products.
const STATUS_RECEIVED_PARTIALLY
Received partially.
const STATUS_VALIDATED
Validated status.
const STATUS_RECEIVED_COMPLETELY
Received completely.
const STATUS_DRAFT
Draft status.
const STATUS_ACCEPTED
Accepted.
const STATUS_ORDERSENT
Order sent, shipment on process.
Class to manage line orders.
Class to manage a WYSIWYG editor.
Class to manage the table of subscription to notifications.
Class ProductCombination Used to represent the relation between a product and one of its variants.
Class to manage predefined suppliers products.
Class to manage products or services.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
Class to manage Dolibarr users.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
$date_start
Variables from include:
ordersupplier_prepare_head(CommandeFournisseur $object)
Prepare array with list of tabs.
dol_now($mode='gmt')
Return date for now.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolBuildUrl($url, $params=[], $addtoken=false, $anchor='')
Return path of url.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
dol_print_url($url, $target='_blank', $max=32, $withpicto=0, $morecss='')
Show Url link.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
getMultidirOutput($object, $module='', $forobject=0, $mode='output')
Return the full path of the directory where a module (or an object of a module) stores its files.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
GETPOSTFLOAT($paramname, $rounding='', $option=2)
Return the value of a $_GET or $_POST supervariable, converted into float.
get_default_npr(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that returns whether VAT must be recoverable collected VAT (e.g.: VAT NPR in France)
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_clone($srcobject, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
get_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...
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular VAT rate, when selling a product with vat $vatrate,...
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
dol_htmloutput_events($disabledoutputofmessages=0)
Print formatted messages to output (Used to show messages on html output).
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
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...
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.