dolibarr  18.0.6
card.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2004-2006 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3  * Copyright (C) 2004-2015 Laurent Destailleur <eldy@users.sourceforge.net>
4  * Copyright (C) 2005 Eric Seigne <eric.seigne@ryxeo.com>
5  * Copyright (C) 2005-2016 Regis Houssin <regis.houssin@inodbox.com>
6  * Copyright (C) 2010-2015 Juanjo Menent <jmenent@2byte.es>
7  * Copyright (C) 2011-2022 Philippe Grand <philippe.grand@atoo-net.com>
8  * Copyright (C) 2012-2016 Marcos García <marcosgdf@gmail.com>
9  * Copyright (C) 2013 Florian Henry <florian.henry@open-concept.pro>
10  * Copyright (C) 2014 Ion Agorria <ion@agorria.com>
11  * Copyright (C) 2018-2019 Frédéric France <frederic.france@netlogic.fr>
12  * Copyright (C) 2022 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
13  * Copyright (C) 2022 Charlene Benke <charlene@patas-monkey.com>
14  * Copyright (C) 2023 Joachim Kueter <git-jk@bloxera.com>
15  *
16  * This program is free software; you can redistribute it and/or modify
17  * it under the terms of the GNU General Public License as published by
18  * the Free Software Foundation; either version 2 of the License, or
19  * (at your option) any later version.
20  *
21  * This program is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24  * GNU General Public License for more details.
25  *
26  * You should have received a copy of the GNU General Public License
27  * along with this program. If not, see <https://www.gnu.org/licenses/>.
28  * or see https://www.gnu.org/
29  */
30 
38 // Load Dolibarr environment
39 require '../../main.inc.php';
40 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
41 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
42 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formorder.class.php';
43 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
44 require_once DOL_DOCUMENT_ROOT.'/core/lib/fourn.lib.php';
45 require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
46 require_once DOL_DOCUMENT_ROOT.'/core/modules/supplier_order/modules_commandefournisseur.php';
47 require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
48 require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.product.class.php';
49 
50 if (isModEnabled('supplier_proposal')) {
51  require_once DOL_DOCUMENT_ROOT.'/supplier_proposal/class/supplier_proposal.class.php';
52 }
53 if (isModEnabled("product")) {
54  require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
55 }
56 if (isModEnabled('project')) {
57  require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
58  require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
59 }
60 require_once NUSOAP_PATH.'/nusoap.php'; // Include SOAP
61 
62 if (isModEnabled('variants')) {
63  require_once DOL_DOCUMENT_ROOT.'/variants/class/ProductCombination.class.php';
64 }
65 
66 
67 // Load translation files required by the page
68 $langs->loadLangs(array('admin', 'orders', 'sendings', 'companies', 'bills', 'propal', 'receptions', 'supplier_proposal', 'deliveries', 'products', 'stocks', 'productbatch'));
69 if (isModEnabled('incoterm')) {
70  $langs->load('incoterm');
71 }
72 
73 
74 // Get Parameters
75 $id = GETPOST('id', 'int');
76 $ref = GETPOST('ref', 'alpha');
77 $action = GETPOST('action', 'alpha');
78 $confirm = GETPOST('confirm', 'alpha');
79 $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'purchaseordercard'; // To manage different context of search
80 $backtopage = GETPOST('backtopage', 'alpha');
81 $backtopageforcancel = GETPOST('backtopageforcancel', 'alpha');
82 
83 $socid = GETPOST('socid', 'int');
84 $projectid = GETPOST('projectid', 'int');
85 $cancel = GETPOST('cancel', 'alpha');
86 $lineid = GETPOST('lineid', 'int');
87 $origin = GETPOST('origin', 'alpha');
88 $originid = (GETPOST('originid', 'int') ? GETPOST('originid', 'int') : GETPOST('origin_id', 'int')); // For backward compatibility
89 $rank = (GETPOST('rank', 'int') > 0) ? GETPOST('rank', 'int') : -1;
90 
91 // PDF
92 $hidedetails = (GETPOST('hidedetails', 'int') ? GETPOST('hidedetails', 'int') : (!empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_DETAILS) ? 1 : 0));
93 $hidedesc = (GETPOST('hidedesc', 'int') ? GETPOST('hidedesc', 'int') : (!empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_DESC) ? 1 : 0));
94 $hideref = (GETPOST('hideref', 'int') ? GETPOST('hideref', 'int') : (!empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_REF) ? 1 : 0));
95 
96 $datelivraison = dol_mktime(GETPOST('liv_hour', 'int'), GETPOST('liv_min', 'int'), GETPOST('liv_sec', 'int'), GETPOST('liv_month', 'int'), GETPOST('liv_day', 'int'), GETPOST('liv_year', 'int'));
97 
98 
99 // Security check
100 if (!empty($user->socid)) {
101  $socid = $user->socid;
102 }
103 
104 // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
105 $hookmanager->initHooks(array('ordersuppliercard', 'globalcard'));
106 
107 $object = new CommandeFournisseur($db);
108 $extrafields = new ExtraFields($db);
109 
110 // fetch optionals attributes and labels
111 $extrafields->fetch_name_optionals_label($object->table_element);
112 
113 if ($user->socid) {
114  $socid = $user->socid;
115 }
116 
117 // Load object
118 if ($id > 0 || !empty($ref)) {
119  $ret = $object->fetch($id, $ref);
120  if ($ret < 0) {
121  dol_print_error($db, $object->error);
122  }
123  $ret = $object->fetch_thirdparty();
124  if ($ret < 0) {
125  dol_print_error($db, $object->error);
126  }
127 } elseif (!empty($socid) && $socid > 0) {
128  $object->socid = $socid;
129  $ret = $object->fetch_thirdparty();
130  if ($ret < 0) {
131  dol_print_error($db, $object->error);
132  }
133 }
134 
135 // Security check
136 $isdraft = (isset($object->statut) && ($object->statut == $object::STATUS_DRAFT) ? 1 : 0);
137 $result = restrictedArea($user, 'fournisseur', $object, 'commande_fournisseur', 'commande', 'fk_soc', 'rowid', $isdraft);
138 
139 // Common permissions
140 $usercanread = ($user->hasRight("fournisseur", "commande", "lire") || $user->hasRight("supplier_order", "lire"));
141 $usercancreate = ($user->hasRight("fournisseur", "commande", "creer") || $user->hasRight("supplier_order", "creer"));
142 $usercandelete = (($user->hasRight("fournisseur", "commande", "supprimer") || $user->hasRight("supplier_order", "supprimer")) || ($usercancreate && isset($object->statut) && $object->statut == $object::STATUS_DRAFT));
143 
144 // Advanced permissions
145 $usercanvalidate = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($usercancreate)) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && $user->hasRight("fournisseur", "supplier_order_advance", "validate")));
146 
147 // Additional area permissions
148 $usercanapprove = $user->hasRight("fournisseur", "commande", "approuver");
149 $usercanapprovesecond = $user->hasRight("fournisseur", "commande", "approve2");
150 $usercanorder = $user->hasRight("fournisseur", "commande", "commander");
151 if (empty($conf->reception->enabled)) {
152  $usercanreceive = $user->hasRight("fournisseur", "commande", "receptionner");
153 } else {
154  $usercanreceive = $user->hasRight("reception", "creer");
155 }
156 
157 // Permissions for includes
158 $permissionnote = $usercancreate; // Used by the include of actions_setnotes.inc.php
159 $permissiondellink = $usercancreate; // Used by the include of actions_dellink.inc.php
160 $permissiontoedit = $usercancreate; // Used by the include of actions_lineupdown.inc.php
161 $permissiontoadd = $usercancreate; // Used by the include of actions_addupdatedelete.inc.php
162 
163 // Project permission
164 $caneditproject = false;
165 if (isModEnabled('project')) {
166  $caneditproject = empty($conf->global->SUPPLIER_ORDER_FORBID_EDIT_PROJECT) || ($object->statut == CommandeFournisseur::STATUS_DRAFT && preg_match('/^[\‍(]?PROV/i', $object->ref));
167 }
168 
169 $error = 0;
170 
171 
172 /*
173  * Actions
174  */
175 
176 $parameters = array('socid'=>$socid);
177 $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
178 if ($reshook < 0) {
179  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
180 }
181 
182 if (empty($reshook)) {
183  $backurlforlist = DOL_URL_ROOT.'/fourn/commande/list.php'.($socid > 0 ? '?socid='.((int) $socid) : '');
184 
185  if (empty($backtopage) || ($cancel && empty($id))) {
186  if (empty($backtopage) || ($cancel && strpos($backtopage, '__ID__'))) {
187  if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) {
188  $backtopage = $backurlforlist;
189  } else {
190  $backtopage = DOL_URL_ROOT.'/fourn/commande/card.php?id='.((!empty($id) && $id > 0) ? $id : '__ID__');
191  }
192  }
193  }
194 
195  if ($cancel) {
196  if (!empty($backtopageforcancel)) {
197  header("Location: ".$backtopageforcancel);
198  exit;
199  } elseif (!empty($backtopage)) {
200  header("Location: ".$backtopage);
201  exit;
202  }
203  $action = '';
204  }
205 
206  include DOL_DOCUMENT_ROOT.'/core/actions_setnotes.inc.php'; // Must be include, not include_once
207 
208  include DOL_DOCUMENT_ROOT.'/core/actions_dellink.inc.php'; // Must be include, not include_once
209 
210  include DOL_DOCUMENT_ROOT.'/core/actions_lineupdown.inc.php'; // Must be include, not include_once
211 
212  if ($action == 'setref_supplier' && $usercancreate) {
213  $result = $object->setValueFrom('ref_supplier', GETPOST('ref_supplier', 'alpha'), '', null, 'text', '', $user, 'ORDER_SUPPLIER_MODIFY');
214  if ($result < 0) {
215  setEventMessages($object->error, $object->errors, 'errors');
216  }
217  }
218 
219  // Set incoterm
220  if ($action == 'set_incoterms' && $usercancreate) {
221  $result = $object->setIncoterms(GETPOST('incoterm_id', 'int'), GETPOST('location_incoterms', 'alpha'));
222  if ($result < 0) {
223  setEventMessages($object->error, $object->errors, 'errors');
224  }
225  }
226 
227  // payment conditions
228  if ($action == 'setconditions' && $usercancreate) {
229  $result = $object->setPaymentTerms(GETPOST('cond_reglement_id', 'int'));
230  if ($result < 0) {
231  setEventMessages($object->error, $object->errors, 'errors');
232  }
233  }
234 
235  // payment mode
236  if ($action == 'setmode' && $usercancreate) {
237  $result = $object->setPaymentMethods(GETPOST('mode_reglement_id', 'int'));
238  if ($result < 0) {
239  setEventMessages($object->error, $object->errors, 'errors');
240  }
241  } elseif ($action == 'setmulticurrencycode' && $usercancreate) {
242  // Multicurrency Code
243  $result = $object->setMulticurrencyCode(GETPOST('multicurrency_code', 'alpha'));
244  } elseif ($action == 'setmulticurrencyrate' && $usercancreate) {
245  // Multicurrency rate
246  $result = $object->setMulticurrencyRate(price2num(GETPOST('multicurrency_tx')), GETPOST('calculation_mode', 'int'));
247  }
248 
249  // bank account
250  if ($action == 'setbankaccount' && $usercancreate) {
251  $result = $object->setBankAccount(GETPOST('fk_account', 'int'));
252  if ($result < 0) {
253  setEventMessages($object->error, $object->errors, 'errors');
254  }
255  }
256 
257  // date of delivery
258  if ($action == 'setdate_livraison' && $usercancreate) {
259  $result = $object->setDeliveryDate($user, $datelivraison);
260  if ($result < 0) {
261  setEventMessages($object->error, $object->errors, 'errors');
262  }
263  }
264 
265  // Set project
266  if ($action == 'classin' && $usercancreate && $caneditproject) {
267  $result = $object->setProject($projectid);
268  if ($result < 0) {
269  setEventMessages($object->error, $object->errors, 'errors');
270  }
271  }
272 
273  // Edit Thirdparty
274  if (!empty($conf->global->MAIN_CAN_EDIT_SUPPLIER_ON_SUPPLIER_ORDER) && $action == 'set_thirdparty' && $usercancreate && $object->statut == CommandeFournisseur::STATUS_DRAFT) {
275  $new_socid = GETPOST('new_socid', 'int');
276  if (!empty($new_socid) && $new_socid != $object->thirdparty->id) {
277  $db->begin();
278 
279  // Update supplier
280  $sql = 'UPDATE '.MAIN_DB_PREFIX.'commande_fournisseur';
281  $sql .= ' SET fk_soc = '.((int) $new_socid);
282  $sql .= ' WHERE fk_soc = '.((int) $object->thirdparty->id);
283  $sql .= ' AND rowid = '.((int) $object->id);
284 
285  $res = $db->query($sql);
286 
287  if (!$res) {
288  $db->rollback();
289  } else {
290  $db->commit();
291 
292  // Replace prices for each lines by new supplier prices
293  foreach ($object->lines as $l) {
294  $sql = 'SELECT price, unitprice, tva_tx, ref_fourn';
295  $sql .= ' FROM '.MAIN_DB_PREFIX.'product_fournisseur_price';
296  $sql .= ' WHERE fk_product = '.((int) $l->fk_product);
297  $sql .= ' AND fk_soc = '.((int) $new_socid);
298  $sql .= ' ORDER BY unitprice ASC';
299 
300  $resql = $db->query($sql);
301  if ($resql) {
302  $num_row = $db->num_rows($resql);
303  if (empty($num_row)) {
304  // No product price for this supplier !
305  $l->subprice = 0;
306  $l->total_ht = 0;
307  $l->total_tva = 0;
308  $l->total_ttc = 0;
309  $l->ref_supplier = '';
310  $l->update();
311  } else {
312  // No need for loop to keep best supplier price
313  $obj = $db->fetch_object($resql);
314  $l->subprice = $obj->unitprice;
315  $l->total_ht = $obj->price;
316  $l->tva_tx = $obj->tva_tx;
317  $l->total_tva = $l->total_ht * ($obj->tva_tx / 100);
318  $l->total_ttc = $l->total_ht + $l->total_tva;
319  $l->ref_supplier = $obj->ref_fourn;
320  $l->update();
321  }
322  } else {
323  dol_print_error($db);
324  }
325  $db->free($resql);
326  }
327  $object->update_price();
328  }
329  }
330  header('Location: '.$_SERVER['PHP_SELF'].'?id='.$object->id);
331  exit;
332  }
333 
334  if ($action == 'setremisepercent' && $usercancreate) {
335  $result = $object->set_remise($user, price2num(GETPOST('remise_percent')));
336  if ($result < 0) {
337  setEventMessages($object->error, $object->errors, 'errors');
338  }
339  }
340 
341  if ($action == 'reopen') { // no test on permission here, permission to use will depends on status
342  if (in_array($object->statut, array(1, 2, 3, 4, 5, 6, 7, 9))) {
343  if ($object->statut == 1) {
344  $newstatus = 0; // Validated->Draft
345  } elseif ($object->statut == 2) {
346  $newstatus = 0; // Approved->Draft
347  } elseif ($object->statut == 3) {
348  $newstatus = 2; // Ordered->Approved
349  } elseif ($object->statut == 4) {
350  $newstatus = 3;
351  } elseif ($object->statut == 5) {
352  //$newstatus=2; // Ordered
353  // TODO Can we set it to submited ?
354  //$newstatus=3; // Submited
355  // TODO If there is at least one reception, we can set to Received->Received partially
356  $newstatus = 4; // Received partially
357  } elseif ($object->statut == 6) {
358  $newstatus = 2; // Canceled->Approved
359  } elseif ($object->statut == 7) {
360  $newstatus = 3; // Canceled->Process running
361  } elseif ($object->statut == 9) {
362  $newstatus = 1; // Refused->Validated
363  } else {
364  $newstatus = 2;
365  }
366 
367  //print "old status = ".$object->statut.' new status = '.$newstatus;
368  $db->begin();
369 
370  $result = $object->setStatus($user, $newstatus);
371  if ($result > 0) {
372  // Currently the "Re-open" also remove the billed flag because there is no button "Set unpaid" yet.
373  $sql = 'UPDATE '.MAIN_DB_PREFIX.'commande_fournisseur';
374  $sql .= ' SET billed = 0';
375  $sql .= ' WHERE rowid = '.((int) $object->id);
376 
377  $resql = $db->query($sql);
378 
379  if ($newstatus == 0) {
380  $sql = 'UPDATE '.MAIN_DB_PREFIX.'commande_fournisseur';
381  $sql .= ' SET fk_user_approve = null, fk_user_approve2 = null, date_approve = null, date_approve2 = null';
382  $sql .= ' WHERE rowid = '.((int) $object->id);
383 
384  $resql = $db->query($sql);
385  }
386 
387  $db->commit();
388 
389  header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id);
390  exit;
391  } else {
392  $db->rollback();
393 
394  setEventMessages($object->error, $object->errors, 'errors');
395  }
396  }
397  }
398 
399  /*
400  * Classify supplier order as billed
401  */
402  if ($action == 'classifybilled' && $usercancreate) {
403  $ret = $object->classifyBilled($user);
404  if ($ret < 0) {
405  setEventMessages($object->error, $object->errors, 'errors');
406  }
407  }
408 
409  // Add a product line
410  if ($action == 'addline' && GETPOST('submitforalllines', 'aZ09') && GETPOST('vatforalllines', 'alpha') !== '' && $usercancreate) {
411  // Define new vat_rate for all lines
412  $vat_rate = (GETPOST('vatforalllines') ? GETPOST('vatforalllines') : 0);
413  $vat_rate = str_replace('*', '', $vat_rate);
414  $localtax1_rate = get_localtax($vat_rate, 1, $object->thirdparty, $mysoc);
415  $localtax2_rate = get_localtax($vat_rate, 2, $object->thirdparty, $mysoc);
416  foreach ($object->lines as $line) {
417  $result = $object->updateline($line->id, $line->desc, $line->subprice, $line->qty, $line->remise_percent, $vat_rate, $localtax1_rate, $localtax2_rate, 'HT', $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);
418  }
419  } elseif ($action == 'addline' && $usercancreate) {
420  $db->begin();
421 
422  $langs->load('errors');
423  $error = 0;
424 
425  // Set if we used free entry or predefined product
426  $predef = '';
427  $product_desc = (GETPOSTISSET('dp_desc') ? GETPOST('dp_desc', 'restricthtml') : '');
428  $date_start = dol_mktime(GETPOST('date_start'.$predef.'hour'), GETPOST('date_start'.$predef.'min'), GETPOST('date_start'.$predef.'sec'), GETPOST('date_start'.$predef.'month'), GETPOST('date_start'.$predef.'day'), GETPOST('date_start'.$predef.'year'));
429  $date_end = dol_mktime(GETPOST('date_end'.$predef.'hour'), GETPOST('date_end'.$predef.'min'), GETPOST('date_end'.$predef.'sec'), GETPOST('date_end'.$predef.'month'), GETPOST('date_end'.$predef.'day'), GETPOST('date_end'.$predef.'year'));
430 
431  $prod_entry_mode = GETPOST('prod_entry_mode');
432  if ($prod_entry_mode == 'free') {
433  $idprod = 0;
434  } else {
435  $idprod = GETPOST('idprod', 'int');
436  }
437 
438  $tva_tx = (GETPOST('tva_tx') ? GETPOST('tva_tx') : 0); // Can be '1.2' or '1.2 (CODE)'
439 
440  $price_ht = price2num(GETPOST('price_ht'), 'MU', 2);
441  $price_ht_devise = price2num(GETPOST('multicurrency_price_ht'), 'CU', 2);
442  $price_ttc = price2num(GETPOST('price_ttc'), 'MU', 2);
443  $price_ttc_devise = price2num(GETPOST('multicurrency_price_ttc'), 'CU', 2);
444  $qty = price2num(GETPOST('qty'.$predef, 'alpha'), 'MS');
445 
446  $remise_percent = (GETPOSTISSET('remise_percent'.$predef) ? price2num(GETPOST('remise_percent'.$predef, 'alpha'), '', 2) : 0);
447  if (empty($remise_percent)) {
448  $remise_percent = 0;
449  }
450 
451  // Extrafields
452  $extralabelsline = $extrafields->fetch_name_optionals_label($object->table_element_line);
453  $array_options = $extrafields->getOptionalsFromPost($object->table_element_line, $predef);
454  // Unset extrafield
455  if (is_array($extralabelsline)) {
456  // Get extra fields
457  foreach ($extralabelsline as $key => $value) {
458  unset($_POST["options_".$key]);
459  }
460  }
461 
462  if ($prod_entry_mode == 'free' && GETPOST('price_ht') < 0 && $qty < 0) {
463  setEventMessages($langs->trans('ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv('UnitPrice'), $langs->transnoentitiesnoconv('Qty')), null, 'errors');
464  $error++;
465  }
466  if ($prod_entry_mode == 'free' && !GETPOST('idprodfournprice') && GETPOST('type') < 0) {
467  setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Type')), null, 'errors');
468  $error++;
469  }
470  if ($prod_entry_mode == 'free' && GETPOST('price_ht') === '' && GETPOST('price_ttc') === '' && $price_ht_devise === '') { // Unit price can be 0 but not ''
471  setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('UnitPrice')), null, 'errors');
472  $error++;
473  }
474  if ($prod_entry_mode == 'free' && !GETPOST('dp_desc')) {
475  setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Description')), null, 'errors');
476  $error++;
477  }
478  if (GETPOST('qty', 'alpha') == '') { // 0 is allowed for order
479  setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Qty')), null, 'errors');
480  $error++;
481  }
482 
483  if (!$error && isModEnabled('variants') && $prod_entry_mode != 'free') {
484  if ($combinations = GETPOST('combinations', 'array')) {
485  //Check if there is a product with the given combination
486  $prodcomb = new ProductCombination($db);
487 
488  if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
489  $idprod = $res->fk_product_child;
490  } else {
491  setEventMessages($langs->trans('ErrorProductCombinationNotFound'), null, 'errors');
492  $error++;
493  }
494  }
495  }
496 
497  if ($prod_entry_mode != 'free' && empty($error)) { // With combolist mode idprodfournprice is > 0 or -1. With autocomplete, idprodfournprice is > 0 or ''
498  $productsupplier = new ProductFournisseur($db);
499 
500  $idprod = 0;
501  if (GETPOST('idprodfournprice', 'alpha') == -1 || GETPOST('idprodfournprice', 'alpha') == '') {
502  $idprod = -99; // Same behaviour than with combolist. When not select idprodfournprice is now -99 (to avoid conflict with next action that may return -1, -2, ...)
503  }
504 
505  $reg = array();
506  if (preg_match('/^idprod_([0-9]+)$/', GETPOST('idprodfournprice', 'alpha'), $reg)) {
507  $idprod = $reg[1];
508  $res = $productsupplier->fetch($idprod); // Load product from its id
509  // Call to init some price properties of $productsupplier
510  // So if a supplier price already exists for another thirdparty (first one found), we use it as reference price
511  if (!empty($conf->global->SUPPLIER_TAKE_FIRST_PRICE_IF_NO_PRICE_FOR_CURRENT_SUPPLIER)) {
512  $fksoctosearch = 0;
513  $productsupplier->get_buyprice(0, -1, $idprod, 'none', $fksoctosearch); // We force qty to -1 to be sure to find if a supplier price exist
514  if ($productsupplier->fourn_socid != $socid) { // The price we found is for another supplier, so we clear supplier price
515  $productsupplier->ref_supplier = '';
516  }
517  } else {
518  $fksoctosearch = $object->thirdparty->id;
519  $productsupplier->get_buyprice(0, -1, $idprod, 'none', $fksoctosearch); // We force qty to -1 to be sure to find if a supplier price exist
520  }
521  } elseif (GETPOST('idprodfournprice', 'alpha') > 0) {
522  $qtytosearch = $qty; // Just to see if a price exists for the quantity. Not used to found vat.
523  //$qtytosearch = -1; // We force qty to -1 to be sure to find if a supplier price exist
524  $idprod = $productsupplier->get_buyprice(GETPOST('idprodfournprice', 'alpha'), $qtytosearch);
525  $res = $productsupplier->fetch($idprod);
526  }
527 
528  if ($idprod > 0) {
529  $label = $productsupplier->label;
530 
531  // Define output language
532  if (getDolGlobalInt('MAIN_MULTILANGS') && !empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) {
533  $outputlangs = $langs;
534  $newlang = '';
535  if (empty($newlang) && GETPOST('lang_id', 'aZ09')) {
536  $newlang = GETPOST('lang_id', 'aZ09');
537  }
538  if (empty($newlang)) {
539  $newlang = $object->thirdparty->default_lang;
540  }
541  if (!empty($newlang)) {
542  $outputlangs = new Translate("", $conf);
543  $outputlangs->setDefaultLang($newlang);
544  }
545  $desc = (!empty($productsupplier->multilangs[$outputlangs->defaultlang]["description"])) ? $productsupplier->multilangs[$outputlangs->defaultlang]["description"] : $productsupplier->description;
546  } else {
547  $desc = $productsupplier->description;
548  }
549  // if we use supplier description of the products
550  if (!empty($productsupplier->desc_supplier) && !empty($conf->global->PRODUIT_FOURN_TEXTS)) {
551  $desc = $productsupplier->desc_supplier;
552  }
553 
554  //If text set in desc is the same as product descpription (as now it's preloaded) whe add it only one time
555  if (trim($product_desc) == trim($desc) && !empty($conf->global->PRODUIT_AUTOFILL_DESC)) {
556  $product_desc='';
557  }
558 
559  if (!empty($product_desc) && !empty($conf->global->MAIN_NO_CONCAT_DESCRIPTION)) {
560  $desc = $product_desc;
561  }
562  if (!empty($product_desc) && trim($product_desc) != trim($desc)) {
563  $desc = dol_concatdesc($desc, $product_desc, '', !empty($conf->global->MAIN_CHANGE_ORDER_CONCAT_DESCRIPTION));
564  }
565 
566  $ref_supplier = $productsupplier->ref_supplier;
567 
568  // Get vat rate
569  $tva_npr = 0;
570  if (!GETPOSTISSET('tva_tx')) { // If vat rate not provided from the form (the form has the priority)
571  $tva_tx = get_default_tva($object->thirdparty, $mysoc, $productsupplier->id, GETPOST('idprodfournprice', 'alpha'));
572  $tva_npr = get_default_npr($object->thirdparty, $mysoc, $productsupplier->id, GETPOST('idprodfournprice', 'alpha'));
573  if (empty($tva_tx)) {
574  $tva_npr = 0;
575  }
576  }
577 
578  $localtax1_tx = get_localtax($tva_tx, 1, $mysoc, $object->thirdparty, $tva_npr);
579  $localtax2_tx = get_localtax($tva_tx, 2, $mysoc, $object->thirdparty, $tva_npr);
580 
581  $type = $productsupplier->type;
582  if (GETPOST('price_ht') != '' || GETPOST('multicurrency_price_ht') != '') {
583  $price_base_type = 'HT';
584  $pu = price2num($price_ht, 'MU');
585  $pu_devise = price2num($price_ht_devise, 'CU');
586  } elseif (GETPOST('price_ttc') != '' || GETPOST('multicurrency_price_ttc') != '') {
587  $price_base_type = 'TTC';
588  $pu = price2num($price_ttc, 'MU');
589  $pu_devise = price2num($price_ttc_devise, 'CU');
590  } else {
591  $price_base_type = ($productsupplier->fourn_price_base_type ? $productsupplier->fourn_price_base_type : 'HT');
592  if (empty($object->multicurrency_code) || ($productsupplier->fourn_multicurrency_code != $object->multicurrency_code)) { // If object is in a different currency and price not in this currency
593  $pu = $productsupplier->fourn_pu;
594  $pu_devise = 0;
595  } else {
596  $pu = $productsupplier->fourn_pu;
597  $pu_devise = $productsupplier->fourn_multicurrency_unitprice;
598  }
599  }
600 
601  if (empty($pu)) {
602  $pu = 0; // If pu is '' or null, we force to have a numeric value
603  }
604 
605  $result = $object->addline(
606  $desc,
607  ($price_base_type == 'HT' ? $pu : 0),
608  $qty,
609  $tva_tx,
610  $localtax1_tx,
611  $localtax2_tx,
612  $idprod,
613  $productsupplier->product_fourn_price_id,
614  $ref_supplier,
615  $remise_percent,
616  $price_base_type,
617  ($price_base_type == 'TTC' ? $pu : 0),
618  $type,
619  $tva_npr,
620  '',
621  $date_start,
622  $date_end,
623  $array_options,
624  $productsupplier->fk_unit,
625  $pu_devise,
626  '',
627  0,
628  min($rank, count($object->lines) + 1)
629  );
630  }
631  if ($idprod == -99 || $idprod == 0) {
632  // Product not selected
633  $error++;
634  $langs->load("errors");
635  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ProductOrService")), null, 'errors');
636  }
637  if ($idprod == -1) {
638  // Quantity too low
639  $error++;
640  $langs->load("errors");
641  setEventMessages($langs->trans("ErrorQtyTooLowForThisSupplier"), null, 'errors');
642  }
643  } elseif (empty($error)) { // $price_ht is already set
644  $tva_npr = (preg_match('/\*/', $tva_tx) ? 1 : 0);
645  $tva_tx = str_replace('*', '', $tva_tx);
646  $label = (GETPOST('product_label') ? GETPOST('product_label') : '');
647  $desc = $product_desc;
648  $type = GETPOST('type');
649  $ref_supplier = GETPOST('fourn_ref', 'alpha');
650 
651  $fk_unit = GETPOST('units', 'alpha');
652 
653  if (!preg_match('/\‍((.*)\‍)/', $tva_tx)) {
654  $tva_tx = price2num($tva_tx); // $txtva can have format '5,1' or '5.1' or '5.1(XXX)', we must clean only if '5,1'
655  }
656 
657  // Local Taxes
658  $localtax1_tx = get_localtax($tva_tx, 1, $mysoc, $object->thirdparty);
659  $localtax2_tx = get_localtax($tva_tx, 2, $mysoc, $object->thirdparty);
660 
661  if (GETPOST('price_ht') != '' || GETPOST('multicurrency_price_ht') != '') {
662  $pu_ht = price2num($price_ht, 'MU'); // $pu_ht must be rounded according to settings
663  } else {
664  $pu_ttc = price2num(GETPOST('price_ttc'), 'MU');
665  $pu_ht = price2num($pu_ttc / (1 + ($tva_tx / 100)), 'MU'); // $pu_ht must be rounded according to settings
666  }
667  $price_base_type = 'HT';
668  $pu_ht_devise = price2num($price_ht_devise, 'CU');
669 
670  $result = $object->addline($desc, $pu_ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, 0, 0, $ref_supplier, $remise_percent, $price_base_type, $pu_ttc, $type, '', '', $date_start, $date_end, $array_options, $fk_unit, $pu_ht_devise);
671  }
672 
673  //print "xx".$tva_tx; exit;
674  if (!$error && $result > 0) {
675  $db->commit();
676 
677  $ret = $object->fetch($object->id); // Reload to get new records
678 
679  // Define output language
680  if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
681  $outputlangs = $langs;
682  $newlang = '';
683  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
684  $newlang = $object->thirdparty->default_lang;
685  if (GETPOST('lang_id', 'aZ09'))
686  $newlang = GETPOST('lang_id', 'aZ09');
687  }
688  if (!empty($newlang)) {
689  $outputlangs = new Translate("", $conf);
690  $outputlangs->setDefaultLang($newlang);
691  }
692  $model = $object->model_pdf;
693  $ret = $object->fetch($id); // Reload to get new records
694 
695  $result = $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
696  if ($result < 0) {
697  setEventMessages($object->error, $object->errors, 'errors');
698  }
699  }
700 
701  unset($_POST ['prod_entry_mode']);
702 
703  unset($_POST['qty']);
704  unset($_POST['type']);
705  unset($_POST['remise_percent']);
706  unset($_POST['pu']);
707  unset($_POST['price_ht']);
708  unset($_POST['multicurrency_price_ht']);
709  unset($_POST['price_ttc']);
710  unset($_POST['fourn_ref']);
711  unset($_POST['tva_tx']);
712  unset($_POST['label']);
713  unset($localtax1_tx);
714  unset($localtax2_tx);
715  unset($_POST['np_marginRate']);
716  unset($_POST['np_markRate']);
717  unset($_POST['dp_desc']);
718  unset($_POST['idprodfournprice']);
719  unset($_POST['units']);
720 
721  unset($_POST['date_starthour']);
722  unset($_POST['date_startmin']);
723  unset($_POST['date_startsec']);
724  unset($_POST['date_startday']);
725  unset($_POST['date_startmonth']);
726  unset($_POST['date_startyear']);
727  unset($_POST['date_endhour']);
728  unset($_POST['date_endmin']);
729  unset($_POST['date_endsec']);
730  unset($_POST['date_endday']);
731  unset($_POST['date_endmonth']);
732  unset($_POST['date_endyear']);
733  } else {
734  $db->rollback();
735  setEventMessages($object->error, $object->errors, 'errors');
736  }
737 
738  $action = '';
739  }
740 
741  /*
742  * Updating a line in the order
743  */
744  if ($action == 'updateline' && $usercancreate && !GETPOST('cancel', 'alpha')) {
745  $db->begin();
746 
747  $vat_rate = (GETPOST('tva_tx') ? GETPOST('tva_tx') : 0);
748 
749  if ($lineid) {
750  $line = new CommandeFournisseurLigne($db);
751  $res = $line->fetch($lineid);
752  if (!$res) {
753  dol_print_error($db);
754  }
755  }
756 
757  $productsupplier = new ProductFournisseur($db);
758  if (!empty($conf->global->SUPPLIER_ORDER_WITH_PREDEFINED_PRICES_ONLY)) {
759  if ($line->fk_product > 0 && $productsupplier->get_buyprice(0, price2num(GETPOST('qty', 'int')), $line->fk_product, 'none', GETPOST('socid', 'int')) < 0) {
760  setEventMessages($langs->trans("ErrorQtyTooLowForThisSupplier"), null, 'warnings');
761  }
762  }
763 
764  $date_start = dol_mktime(GETPOST('date_starthour'), GETPOST('date_startmin'), GETPOST('date_startsec'), GETPOST('date_startmonth'), GETPOST('date_startday'), GETPOST('date_startyear'));
765  $date_end = dol_mktime(GETPOST('date_endhour'), GETPOST('date_endmin'), GETPOST('date_endsec'), GETPOST('date_endmonth'), GETPOST('date_endday'), GETPOST('date_endyear'));
766 
767  // Define info_bits
768  $info_bits = 0;
769  if (preg_match('/\*/', $vat_rate)) {
770  $info_bits |= 0x01;
771  }
772 
773  // Define vat_rate
774  $vat_rate = str_replace('*', '', $vat_rate);
775  $localtax1_rate = get_localtax($vat_rate, 1, $mysoc, $object->thirdparty);
776  $localtax2_rate = get_localtax($vat_rate, 2, $mysoc, $object->thirdparty);
777 
778  if (GETPOST('price_ht') != '') {
779  $price_base_type = 'HT';
780  $ht = price2num(GETPOST('price_ht'), '', 2);
781  } else {
782  $reg = array();
783  $vatratecleaned = $vat_rate;
784  if (preg_match('/^(.*)\s*\‍((.*)\‍)$/', $vat_rate, $reg)) { // If vat is "xx (yy)"
785  $vatratecleaned = trim($reg[1]);
786  $vatratecode = $reg[2];
787  }
788 
789  $ttc = price2num(GETPOST('price_ttc'), '', 2);
790  $ht = (float) $ttc / (1 + ($vatratecleaned / 100));
791  $price_base_type = 'HT';
792  }
793 
794  $pu_ht_devise = price2num(GETPOST('multicurrency_subprice'), 'CU', 2);
795 
796  // Extrafields Lines
797  $extralabelsline = $extrafields->fetch_name_optionals_label($object->table_element_line);
798  $array_options = $extrafields->getOptionalsFromPost($object->table_element_line);
799  // Unset extrafield POST Data
800  if (is_array($extralabelsline)) {
801  foreach ($extralabelsline as $key => $value) {
802  unset($_POST["options_".$key]);
803  }
804  }
805 
806  $result = $object->updateline(
807  $lineid,
808  GETPOST('product_desc', 'restricthtml'),
809  $ht,
810  price2num(GETPOST('qty'), 'MS'),
811  price2num(GETPOST('remise_percent'), '', 2),
812  $vat_rate,
813  $localtax1_rate,
814  $localtax2_rate,
815  $price_base_type,
816  0,
817  GETPOSTISSET("type") ? GETPOST("type") : $line->product_type,
818  false,
819  $date_start,
820  $date_end,
821  $array_options,
822  GETPOST('units'),
823  $pu_ht_devise,
824  GETPOST('fourn_ref', 'alpha')
825  );
826  unset($_POST['qty']);
827  unset($_POST['type']);
828  unset($_POST['idprodfournprice']);
829  unset($_POST['remmise_percent']);
830  unset($_POST['dp_desc']);
831  unset($_POST['np_desc']);
832  unset($_POST['pu']);
833  unset($_POST['fourn_ref']);
834  unset($_POST['tva_tx']);
835  unset($_POST['date_start']);
836  unset($_POST['date_end']);
837  unset($_POST['units']);
838  unset($localtax1_tx);
839  unset($localtax2_tx);
840 
841  unset($_POST['date_starthour']);
842  unset($_POST['date_startmin']);
843  unset($_POST['date_startsec']);
844  unset($_POST['date_startday']);
845  unset($_POST['date_startmonth']);
846  unset($_POST['date_startyear']);
847  unset($_POST['date_endhour']);
848  unset($_POST['date_endmin']);
849  unset($_POST['date_endsec']);
850  unset($_POST['date_endday']);
851  unset($_POST['date_endmonth']);
852  unset($_POST['date_endyear']);
853 
854  if ($result >= 0) {
855  // Define output language
856  if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
857  $outputlangs = $langs;
858  $newlang = '';
859  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
860  $newlang = GETPOST('lang_id', 'aZ09');
861  }
862  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
863  $newlang = $object->thirdparty->default_lang;
864  }
865  if (!empty($newlang)) {
866  $outputlangs = new Translate("", $conf);
867  $outputlangs->setDefaultLang($newlang);
868  }
869  $model = $object->model_pdf;
870  $ret = $object->fetch($id); // Reload to get new records
871 
872  $result = $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
873  if ($result < 0) {
874  dol_print_error($db, $result);
875  }
876  }
877 
878  $db->commit();
879  } else {
880  $db->rollback();
881 
882  setEventMessages($object->error, $object->errors, 'errors');
883  }
884  }
885 
886  // Remove a product line
887  if ($action == 'confirm_deleteline' && $confirm == 'yes' && $usercancreate) {
888  $db->begin();
889 
890  $result = $object->deleteline($lineid);
891  if ($result > 0) {
892  // reorder lines
893  $object->line_order(true);
894  // Define output language
895  $outputlangs = $langs;
896  $newlang = '';
897  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
898  $newlang = GETPOST('lang_id', 'aZ09');
899  }
900  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
901  $newlang = $object->thirdparty->default_lang;
902  }
903  if (!empty($newlang)) {
904  $outputlangs = new Translate("", $conf);
905  $outputlangs->setDefaultLang($newlang);
906  }
907  if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
908  $ret = $object->fetch($object->id); // Reload to get new records
909  $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
910  }
911  } else {
912  $error++;
913  setEventMessages($object->error, $object->errors, 'errors');
914  // Reset action to avoid asking again confirmation on failure
915  $action = '';
916  }
917 
918  if (!$error) {
919  // reopen order if necessary
920  if ($object->status == CommandeFournisseur::STATUS_RECEIVED_COMPLETELY) {
921  if ($object->setStatus($user, CommandeFournisseur::STATUS_RECEIVED_PARTIALLY) < 0) {
922  setEventMessages($object->error, $object->errors, 'errors');
923  $error++;
924  $action = '';
925  }
926  }
927  }
928 
929  if (!$error) {
930  $db->commit();
931  header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id);
932  exit;
933  } else {
934  $db->rollback();
935  }
936  }
937 
938  // Validate
939  if ($action == 'confirm_valid' && $confirm == 'yes' && $usercanvalidate) {
940  $db->begin();
941 
942  $object->date_commande = dol_now();
943  $result = $object->valid($user);
944  if ($result >= 0) {
945  // Define output language
946  if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
947  $outputlangs = $langs;
948  $newlang = '';
949  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
950  $newlang = GETPOST('lang_id', 'aZ09');
951  }
952  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
953  $newlang = $object->thirdparty->default_lang;
954  }
955  if (!empty($newlang)) {
956  $outputlangs = new Translate("", $conf);
957  $outputlangs->setDefaultLang($newlang);
958  }
959  $model = $object->model_pdf;
960  $ret = $object->fetch($id); // Reload to get new records
961 
962  $result = $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
963  if ($result < 0) {
964  $error++;
965  dol_print_error($db, $result);
966  }
967  }
968  } else {
969  $error++;
970  setEventMessages($object->error, $object->errors, 'errors');
971  }
972 
973  // If we have permission, and if we don't need to provide the idwarehouse, we go directly on approved step
974  if (!$error && empty($conf->global->SUPPLIER_ORDER_NO_DIRECT_APPROVE) && $usercanapprove && !(!empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER) && $object->hasProductsOrServices(1))) {
975  $action = 'confirm_approve'; // can make standard or first level approval also if permission is set
976  }
977 
978  if (!$error) {
979  $db->commit();
980  } else {
981  $db->rollback();
982  }
983  }
984 
985  if (($action == 'confirm_approve' || $action == 'confirm_approve2') && $confirm == 'yes' && $usercanapprove) {
986  $db->begin();
987 
988  $idwarehouse = GETPOST('idwarehouse', 'int');
989 
990  $qualified_for_stock_change = 0;
991  if (empty($conf->global->STOCK_SUPPORTS_SERVICES)) {
992  $qualified_for_stock_change = $object->hasProductsOrServices(2);
993  } else {
994  $qualified_for_stock_change = $object->hasProductsOrServices(1);
995  }
996 
997  // Check parameters
998  if (isModEnabled('stock') && !empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER) && $qualified_for_stock_change) { // warning name of option should be STOCK_CALCULATE_ON_SUPPLIER_APPROVE_ORDER
999  if (!$idwarehouse || $idwarehouse == -1) {
1000  $error++;
1001  setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("Warehouse")), null, 'errors');
1002  $action = '';
1003  }
1004  }
1005 
1006  if (!$error) {
1007  $result = $object->approve($user, $idwarehouse, ($action == 'confirm_approve2' ? 1 : 0));
1008  if ($result > 0) {
1009  if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
1010  $outputlangs = $langs;
1011  $newlang = '';
1012  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
1013  $newlang = GETPOST('lang_id', 'aZ09');
1014  }
1015  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
1016  $newlang = $object->thirdparty->default_lang;
1017  }
1018  if (!empty($newlang)) {
1019  $outputlangs = new Translate("", $conf);
1020  $outputlangs->setDefaultLang($newlang);
1021  }
1022  $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1023  }
1024  } else {
1025  $error++;
1026  setEventMessages($object->error, $object->errors, 'errors');
1027  }
1028  }
1029 
1030  if (!$error) {
1031  $db->commit();
1032 
1033  header("Location: ".$_SERVER["PHP_SELF"]."?id=".$object->id);
1034  exit;
1035  } else {
1036  $db->rollback();
1037  }
1038  }
1039 
1040  if ($action == 'confirm_refuse' && $confirm == 'yes' && $usercanapprove) {
1041  if (GETPOST('refuse_note')) {
1042  $object->refuse_note = GETPOST('refuse_note');
1043  }
1044  $result = $object->refuse($user);
1045  if ($result > 0) {
1046  header("Location: ".$_SERVER["PHP_SELF"]."?id=".$object->id);
1047  exit;
1048  } else {
1049  setEventMessages($object->error, $object->errors, 'errors');
1050  }
1051  }
1052 
1053  // Force mandatory order method
1054  if ($action == 'commande') {
1055  $methodecommande = GETPOST('methodecommande', 'int');
1056 
1057  if ($cancel) {
1058  $action = '';
1059  } elseif ($methodecommande <= 0) {
1060  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("OrderMode")), null, 'errors');
1061  $action = 'createorder';
1062  }
1063  }
1064 
1065  if ($action == 'confirm_commande' && $confirm == 'yes' && $usercanorder) {
1066  $db->begin();
1067 
1068  $result = $object->commande($user, GETPOST("datecommande"), GETPOST("methode", 'int'), GETPOST('comment', 'alphanohtml'));
1069  if ($result > 0) {
1070  if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
1071  $outputlangs = $langs;
1072  $newlang = '';
1073  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
1074  $newlang = GETPOST('lang_id', 'aZ09');
1075  }
1076  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
1077  $newlang = $object->thirdparty->default_lang;
1078  }
1079  if (!empty($newlang)) {
1080  $outputlangs = new Translate("", $conf);
1081  $outputlangs->setDefaultLang($newlang);
1082  }
1083  $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1084  }
1085  $action = '';
1086  } else {
1087  $error++;
1088  setEventMessages($object->error, $object->errors, 'errors');
1089  }
1090 
1091  if (!$error) {
1092  $db->commit();
1093 
1094  header("Location: ".$_SERVER["PHP_SELF"]."?id=".$object->id);
1095  exit;
1096  } else {
1097  $db->rollback();
1098  }
1099  }
1100 
1101 
1102  if ($action == 'confirm_delete' && $confirm == 'yes' && $usercandelete) {
1103  $result = $object->delete($user);
1104  if ($result > 0) {
1105  header("Location: ".DOL_URL_ROOT.'/fourn/commande/list.php?restore_lastsearch_values=1');
1106  exit;
1107  } else {
1108  setEventMessages($object->error, $object->errors, 'errors');
1109  }
1110  }
1111 
1112  // Action clone object
1113  if ($action == 'confirm_clone' && $confirm == 'yes' && $usercancreate) {
1114  if (1 == 0 && !GETPOST('clone_content') && !GETPOST('clone_receivers')) {
1115  setEventMessages($langs->trans("NoCloneOptionsSpecified"), null, 'errors');
1116  } else {
1117  if ($object->id > 0) {
1118  $orig = clone $object;
1119 
1120  $result = $object->createFromClone($user, $socid);
1121  if ($result > 0) {
1122  header("Location: ".$_SERVER['PHP_SELF'].'?id='.$result);
1123  exit;
1124  } else {
1125  setEventMessages($object->error, $object->errors, 'errors');
1126  $object = $orig;
1127  $action = '';
1128  }
1129  }
1130  }
1131  }
1132 
1133  // Set status of reception (complete, partial, ...)
1134  if ($action == 'livraison' && $usercanreceive) {
1135  if ($cancel) {
1136  $action = '';
1137  } else {
1138  $db->begin();
1139 
1140  if (GETPOST("type") != '') {
1141  $date_liv = dol_mktime(GETPOST('rehour'), GETPOST('remin'), GETPOST('resec'), GETPOST("remonth"), GETPOST("reday"), GETPOST("reyear"));
1142 
1143  $result = $object->Livraison($user, $date_liv, GETPOST("type"), GETPOST("comment")); // GETPOST("type") is 'tot', 'par', 'nev', 'can'
1144  if ($result > 0) {
1145  $langs->load("deliveries");
1146  setEventMessages($langs->trans("DeliveryStateSaved"), null);
1147  $action = '';
1148  } elseif ($result == -3) {
1149  $error++;
1150  setEventMessages($object->error, $object->errors, 'errors');
1151  } else {
1152  $error++;
1153  setEventMessages($object->error, $object->errors, 'errors');
1154  }
1155  } else {
1156  $error++;
1157  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Delivery")), null, 'errors');
1158  }
1159 
1160  if (!$error) {
1161  $db->commit();
1162  } else {
1163  $db->rollback();
1164  }
1165  }
1166  }
1167 
1168  if ($action == 'confirm_cancel' && $confirm == 'yes' && $usercanorder) {
1169  if (GETPOST('cancel_note')) {
1170  $object->cancel_note = GETPOST('cancel_note');
1171  }
1172  $result = $object->cancel($user);
1173  if ($result > 0) {
1174  header("Location: ".$_SERVER["PHP_SELF"]."?id=".$object->id);
1175  exit;
1176  } else {
1177  setEventMessages($object->error, $object->errors, 'errors');
1178  }
1179  }
1180 
1181  // Actions when printing a doc from card
1182  include DOL_DOCUMENT_ROOT.'/core/actions_printing.inc.php';
1183 
1184  // Actions to send emails
1185  $triggersendname = 'ORDER_SUPPLIER_SENTBYMAIL';
1186  $autocopy = 'MAIN_MAIL_AUTOCOPY_SUPPLIER_ORDER_TO';
1187  $trackid = 'sord'.$object->id;
1188  include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
1189 
1190  // Actions to build doc
1191  $upload_dir = $conf->fournisseur->commande->dir_output;
1192  $permissiontoadd = $usercancreate;
1193  include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
1194 
1195 
1196  if ($action == 'update_extras') {
1197  $object->oldcopy = dol_clone($object);
1198 
1199  // Fill array 'array_options' with data from add form
1200  $ret = $extrafields->setOptionalsFromPost(null, $object, GETPOST('attribute', 'restricthtml'));
1201  if ($ret < 0) {
1202  $error++;
1203  }
1204 
1205  if (!$error) {
1206  // Actions on extra fields
1207  if (!$error) {
1208  $result = $object->insertExtraFields('ORDER_SUPPLIER_MODIFY');
1209  if ($result < 0) {
1210  $error++;
1211  setEventMessages($object->error, $object->errors, 'errors');
1212  }
1213  }
1214  }
1215 
1216  if ($error) {
1217  $action = 'edit_extras';
1218  }
1219  }
1220 
1221  /*
1222  * Create an order
1223  */
1224  if ($action == 'add' && $usercancreate) {
1225  $error = 0;
1226  $selectedLines = GETPOST('toselect', 'array');
1227  if ($socid < 1) {
1228  setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentities('Supplier')), null, 'errors');
1229  $action = 'create';
1230  $error++;
1231  }
1232 
1233  if (!$error) {
1234  $db->begin();
1235 
1236  // Creation commande
1237  $object->ref_supplier = GETPOST('refsupplier');
1238  $object->socid = $socid;
1239  $object->cond_reglement_id = GETPOST('cond_reglement_id', 'int');
1240  $object->mode_reglement_id = GETPOST('mode_reglement_id', 'int');
1241  $object->fk_account = GETPOST('fk_account', 'int');
1242  $object->note_private = GETPOST('note_private', 'restricthtml');
1243  $object->note_public = GETPOST('note_public', 'restricthtml');
1244  $object->date_livraison = $datelivraison; // deprecated
1245  $object->delivery_date = $datelivraison;
1246  $object->fk_incoterms = GETPOST('incoterm_id', 'int');
1247  $object->location_incoterms = GETPOST('location_incoterms', 'alpha');
1248  $object->multicurrency_code = GETPOST('multicurrency_code', 'alpha');
1249  $object->multicurrency_tx = price2num(GETPOST('originmulticurrency_tx', 'alpha'));
1250  $object->fk_project = GETPOST('projectid', 'int');
1251 
1252  // Fill array 'array_options' with data from add form
1253  if (!$error) {
1254  $ret = $extrafields->setOptionalsFromPost(null, $object);
1255  if ($ret < 0) {
1256  $error++;
1257  }
1258  }
1259 
1260  if (!$error) {
1261  // If creation from another object of another module (Example: origin=propal, originid=1)
1262  if (!empty($origin) && !empty($originid)) {
1263  $element = $subelement = $origin;
1264  $classname = ucfirst($subelement);
1265  if ($origin == 'propal' || $origin == 'proposal') {
1266  $element = 'comm/propal'; $subelement = 'propal';
1267  $classname = 'Propal';
1268  }
1269  if ($origin == 'order' || $origin == 'commande') {
1270  $element = $subelement = 'commande';
1271  $classname = 'Commande';
1272  }
1273  if ($origin == 'supplier_proposal') {
1274  $classname = 'SupplierProposal';
1275  $element = 'supplier_proposal';
1276  $subelement = 'supplier_proposal';
1277  }
1278 
1279  $object->origin = $origin;
1280  $object->origin_id = $originid;
1281 
1282  // Possibility to add external linked objects with hooks
1283  $object->linked_objects [$object->origin] = $object->origin_id;
1284  $other_linked_objects = GETPOST('other_linked_objects', 'array');
1285  if (!empty($other_linked_objects)) {
1286  $object->linked_objects = array_merge($object->linked_objects, $other_linked_objects);
1287  }
1288 
1289  $id = $object->create($user);
1290  if ($id > 0) {
1291  dol_include_once('/'.$element.'/class/'.$subelement.'.class.php');
1292 
1293  $srcobject = new $classname($db);
1294 
1295  dol_syslog("Try to find source object origin=".$object->origin." originid=".$object->origin_id." to add lines");
1296  $result = $srcobject->fetch($object->origin_id);
1297  if ($result > 0) {
1298  $tmpdate = ($srcobject->delivery_date ? $srcobject->delivery_date : $srcobject->date_livraison);
1299  $object->setDeliveryDate($user, $tmpdate);
1300  $object->set_id_projet($user, $srcobject->fk_project);
1301 
1302  $lines = $srcobject->lines;
1303  if (empty($lines) && method_exists($srcobject, 'fetch_lines')) {
1304  $srcobject->fetch_lines();
1305  $lines = $srcobject->lines;
1306  }
1307 
1308  $fk_parent_line = 0;
1309  $num = count($lines);
1310 
1311  for ($i = 0; $i < $num; $i++) {
1312  if (empty($lines[$i]->subprice) || $lines[$i]->qty <= 0 || !in_array($lines[$i]->id, $selectedLines)) {
1313  continue;
1314  }
1315 
1316  $label = (!empty($lines[$i]->label) ? $lines[$i]->label : '');
1317  $desc = (!empty($lines[$i]->desc) ? $lines[$i]->desc : $lines[$i]->product_desc);
1318  $product_type = (!empty($lines[$i]->product_type) ? $lines[$i]->product_type : 0);
1319 
1320  // Reset fk_parent_line for no child products and special product
1321  if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) {
1322  $fk_parent_line = 0;
1323  }
1324 
1325  // Extrafields
1326  if (method_exists($lines[$i], 'fetch_optionals')) { // For avoid conflicts if
1327  $lines[$i]->fetch_optionals();
1328  $array_option = $lines[$i]->array_options;
1329  }
1330 
1331  $ref_supplier = '';
1332  $product_fourn_price_id = 0;
1333  if ($origin == "commande") {
1334  $productsupplier = new ProductFournisseur($db);
1335  $result = $productsupplier->find_min_price_product_fournisseur($lines[$i]->fk_product, $lines[$i]->qty, $srcobject->socid);
1336  if ($result > 0) {
1337  $ref_supplier = $productsupplier->ref_supplier;
1338  $product_fourn_price_id = $productsupplier->product_fourn_price_id;
1339  }
1340  } else {
1341  $ref_supplier = $lines[$i]->ref_fourn;
1342  $product_fourn_price_id = 0;
1343  }
1344 
1345  $tva_tx = $lines[$i]->tva_tx;
1346 
1347  if ($origin == "commande") {
1348  $soc = new Societe($db);
1349  $soc->fetch($socid);
1350  $tva_tx = get_default_tva($soc, $mysoc, $lines[$i]->fk_product, $product_fourn_price_id);
1351  }
1352 
1353  $result = $object->addline(
1354  $desc,
1355  $lines[$i]->subprice,
1356  $lines[$i]->qty,
1357  $tva_tx,
1358  $lines[$i]->localtax1_tx,
1359  $lines[$i]->localtax2_tx,
1360  $lines[$i]->fk_product > 0 ? $lines[$i]->fk_product : 0,
1361  $product_fourn_price_id,
1362  $ref_supplier,
1363  $lines[$i]->remise_percent,
1364  'HT',
1365  0,
1366  $lines[$i]->product_type,
1367  '',
1368  '',
1369  null,
1370  null,
1371  $array_option,
1372  $lines[$i]->fk_unit,
1373  0,
1374  $element,
1375  !empty($lines[$i]->id) ? $lines[$i]->id : $lines[$i]->rowid,
1376  -1,
1377  $lines[$i]->special_code
1378  );
1379 
1380  if ($result < 0) {
1381  setEventMessages($object->error, $object->errors, 'errors');
1382  $error++;
1383  break;
1384  }
1385 
1386  // Defined the new fk_parent_line
1387  if ($result > 0 && $lines[$i]->product_type == 9) {
1388  $fk_parent_line = $result;
1389  }
1390  }
1391 
1392  // Add link between elements
1393 
1394 
1395  // Hooks
1396  $parameters = array('objFrom' => $srcobject);
1397  $reshook = $hookmanager->executeHooks('createFrom', $parameters, $object, $action); // Note that $action and $object may have been
1398 
1399  if ($reshook < 0) {
1400  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
1401  $error++;
1402  }
1403  } else {
1404  setEventMessages($srcobject->error, $srcobject->errors, 'errors');
1405  $error++;
1406  }
1407  } else {
1408  setEventMessages($object->error, $object->errors, 'errors');
1409  $error++;
1410  }
1411  } else {
1412  $id = $object->create($user);
1413  if ($id < 0) {
1414  $error++;
1415  setEventMessages($object->error, $object->errors, 'errors');
1416  }
1417  }
1418  }
1419 
1420  if ($error) {
1421  $langs->load("errors");
1422  $db->rollback();
1423  $action = 'create';
1424  $_GET['socid'] = $_POST['socid'];
1425  } else {
1426  $db->commit();
1427  header("Location: ".$_SERVER['PHP_SELF']."?id=".urlencode($id));
1428  exit;
1429  }
1430  }
1431  }
1432 
1433  if ($action == 'webservice' && GETPOST('mode', 'alpha') == "send" && !GETPOST('cancel', 'alpha')) {
1434  $ws_url = $object->thirdparty->webservices_url;
1435  $ws_key = $object->thirdparty->webservices_key;
1436  $ws_user = GETPOST('ws_user', 'alpha');
1437  $ws_password = GETPOST('ws_password', 'alpha');
1438  $ws_entity = GETPOST('ws_entity', 'int');
1439  $ws_thirdparty = GETPOST('ws_thirdparty', 'int');
1440 
1441  // NS and Authentication parameters
1442  $ws_ns = 'http://www.dolibarr.org/ns/';
1443  $ws_authentication = array(
1444  'dolibarrkey'=>$ws_key,
1445  'sourceapplication'=>'DolibarrWebServiceClient',
1446  'login'=>$ws_user,
1447  'password'=>$ws_password,
1448  'entity'=>$ws_entity
1449  );
1450 
1451  //Is sync supplier web services module activated? and everything filled?
1452  if (empty($conf->syncsupplierwebservices->enabled)) {
1453  setEventMessages($langs->trans("WarningModuleNotActive", $langs->transnoentities("Module2650Name")), null, 'mesgs');
1454  } elseif (empty($ws_url) || empty($ws_key)) {
1455  setEventMessages($langs->trans("ErrorWebServicesFieldsRequired"), null, 'errors');
1456  } elseif (empty($ws_user) || empty($ws_password) || empty($ws_thirdparty)) {
1457  setEventMessages($langs->trans("ErrorFieldsRequired"), null, 'errors');
1458  } else {
1459  //Create SOAP client and connect it to order
1460  $soapclient_order = new nusoap_client($ws_url."/webservices/server_order.php");
1461  $soapclient_order->soap_defencoding = 'UTF-8';
1462  $soapclient_order->decodeUTF8(false);
1463 
1464  //Create SOAP client and connect it to product/service
1465  $soapclient_product = new nusoap_client($ws_url."/webservices/server_productorservice.php");
1466  $soapclient_product->soap_defencoding = 'UTF-8';
1467  $soapclient_product->decodeUTF8(false);
1468 
1469  //Prepare the order lines from order
1470  $order_lines = array();
1471  foreach ($object->lines as $line) {
1472  $ws_parameters = array('authentication' => $ws_authentication, 'id' => '', 'ref' => $line->ref_supplier);
1473  $result_product = $soapclient_product->call("getProductOrService", $ws_parameters, $ws_ns, '');
1474 
1475  if ($result_product["result"]["result_code"] == "OK") {
1476  $order_lines[] = array(
1477  'desc' => $line->product_desc,
1478  'type' => $line->product_type,
1479  'product_id' => $result_product["product"]["id"],
1480  'vat_rate' => $line->tva_tx,
1481  'qty' => $line->qty,
1482  'price' => $line->price,
1483  'unitprice' => $line->subprice,
1484  'total_net' => $line->total_ht,
1485  'total_vat' => $line->total_tva,
1486  'total' => $line->total_ttc,
1487  'date_start' => $line->date_start,
1488  'date_end' => $line->date_end,
1489  );
1490  }
1491  }
1492 
1493  //Prepare the order header
1494  $order = array(
1495  'thirdparty_id' => $ws_thirdparty,
1496  'date' => dol_print_date(dol_now(), 'dayrfc'),
1497  'total_net' => $object->total_ht,
1498  'total_var' => $object->total_tva,
1499  'total' => $object->total_ttc,
1500  'lines' => $order_lines
1501  );
1502 
1503  $ws_parameters = array('authentication'=>$ws_authentication, 'order' => $order);
1504  $result_order = $soapclient_order->call("createOrder", $ws_parameters, $ws_ns, '');
1505 
1506  if (empty($result_order["result"]["result_code"])) { //No result, check error str
1507  setEventMessages($langs->trans("SOAPError")." '".$soapclient_order->error_str."'", null, 'errors');
1508  } elseif ($result_order["result"]["result_code"] != "OK") { //Something went wrong
1509  setEventMessages($langs->trans("SOAPError")." '".$result_order["result"]["result_code"]."' - '".$result_order["result"]["result_label"]."'", null, 'errors');
1510  } else {
1511  setEventMessages($langs->trans("RemoteOrderRef")." ".$result_order["ref"], null, 'mesgs');
1512  }
1513  }
1514  }
1515 
1516  if (!empty($conf->global->MAIN_DISABLE_CONTACTS_TAB) && $usercancreate) {
1517  if ($action == 'addcontact') {
1518  if ($object->id > 0) {
1519  $contactid = (GETPOST('userid') ? GETPOST('userid') : GETPOST('contactid'));
1520  $typeid = (GETPOST('typecontact') ? GETPOST('typecontact') : GETPOST('type'));
1521  $result = $object->add_contact($contactid, $typeid, GETPOST("source", 'aZ09'));
1522  }
1523 
1524  if ($result >= 0) {
1525  header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
1526  exit;
1527  } else {
1528  if ($object->error == 'DB_ERROR_RECORD_ALREADY_EXISTS') {
1529  $langs->load("errors");
1530  setEventMessages($langs->trans("ErrorThisContactIsAlreadyDefinedAsThisType"), null, 'errors');
1531  } else {
1532  setEventMessages($object->error, $object->errors, 'errors');
1533  }
1534  }
1535  } elseif ($action == 'swapstatut' && $object->id > 0) {
1536  // bascule du statut d'un contact
1537  $result = $object->swapContactStatus(GETPOST('ligne', 'int'));
1538  } elseif ($action == 'deletecontact' && $object->id > 0) {
1539  // Efface un contact
1540  $result = $object->delete_contact(GETPOST("lineid", 'int'));
1541 
1542  if ($result >= 0) {
1543  header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
1544  exit;
1545  } else {
1546  dol_print_error($db);
1547  }
1548  }
1549  }
1550 }
1551 
1552 
1553 /*
1554  * View
1555  */
1556 
1557 $form = new Form($db);
1558 $formfile = new FormFile($db);
1559 $formorder = new FormOrder($db);
1560 $productstatic = new Product($db);
1561 if (isModEnabled('project')) {
1562  $formproject = new FormProjets($db);
1563 }
1564 
1565 $title = $object->ref." - ".$langs->trans('Card');
1566 if ($action == 'create') {
1567  $title = $langs->trans("NewOrderSupplier");
1568 }
1569 $help_url = 'EN:Module_Suppliers_Orders|FR:CommandeFournisseur|ES:Módulo_Pedidos_a_proveedores';
1570 llxHeader('', $title, $help_url);
1571 
1572 $now = dol_now();
1573 
1574 if ($action == 'create') {
1575  print load_fiche_titre($langs->trans('NewOrderSupplier'), '', 'supplier_order');
1576 
1578 
1579  $currency_code = $conf->currency;
1580 
1581  $societe = '';
1582  if ($socid > 0) {
1583  $societe = new Societe($db);
1584  $societe->fetch($socid);
1585  }
1586 
1587  if (!empty($origin) && !empty($originid)) {
1588  // Parse element/subelement (ex: project_task)
1589  $element = $subelement = $origin;
1590  $classname = ucfirst($subelement);
1591  $regs = array();
1592  if (preg_match('/^([^_]+)_([^_]+)/i', $origin, $regs)) {
1593  $element = $regs[1];
1594  $subelement = $regs[2];
1595  }
1596 
1597  if ($origin == 'propal' || $origin == 'proposal') {
1598  $classname = 'Propal';
1599  $element = 'comm/propal'; $subelement = 'propal';
1600  }
1601  if ($origin == 'order' || $origin == 'commande') {
1602  $classname = 'Commande';
1603  $element = $subelement = 'commande';
1604  }
1605  if ($origin == 'supplier_proposal') {
1606  $classname = 'SupplierProposal';
1607  $element = 'supplier_proposal';
1608  $subelement = 'supplier_proposal';
1609  }
1610 
1611 
1612  dol_include_once('/'.$element.'/class/'.$subelement.'.class.php');
1613 
1614  $objectsrc = new $classname($db);
1615  $objectsrc->fetch($originid);
1616  if (empty($objectsrc->lines) && method_exists($objectsrc, 'fetch_lines')) {
1617  $objectsrc->fetch_lines();
1618  }
1619  $objectsrc->fetch_thirdparty();
1620 
1621  // Replicate extrafields
1622  $objectsrc->fetch_optionals();
1623  $object->array_options = $objectsrc->array_options;
1624 
1625  $projectid = (!empty($objectsrc->fk_project) ? $objectsrc->fk_project : '');
1626  $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client : '');
1627 
1628  $soc = $objectsrc->thirdparty;
1629 
1630  $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0));
1631  $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
1632  $fk_account = (!empty($objectsrc->fk_account) ? $objectsrc->fk_account : (!empty($soc->fk_account) ? $soc->fk_account : 0));
1633  $availability_id = (!empty($objectsrc->availability_id) ? $objectsrc->availability_id : (!empty($soc->availability_id) ? $soc->availability_id : 0));
1634  $shipping_method_id = (!empty($objectsrc->shipping_method_id) ? $objectsrc->shipping_method_id : (!empty($soc->shipping_method_id) ? $soc->shipping_method_id : 0));
1635  $demand_reason_id = (!empty($objectsrc->demand_reason_id) ? $objectsrc->demand_reason_id : (!empty($soc->demand_reason_id) ? $soc->demand_reason_id : 0));
1636  $remise_percent = (!empty($objectsrc->remise_percent) ? $objectsrc->remise_percent : (!empty($soc->remise_supplier_percent) ? $soc->remise_supplier_percent : 0));
1637  $remise_absolue = (!empty($objectsrc->remise_absolue) ? $objectsrc->remise_absolue : (!empty($soc->remise_absolue) ? $soc->remise_absolue : 0));
1638  $dateinvoice = empty($conf->global->MAIN_AUTOFILL_DATE) ?-1 : '';
1639 
1640  $datedelivery = (!empty($objectsrc->date_livraison) ? $objectsrc->date_livraison : (!empty($objectsrc->delivery_date) ? $objectsrc->delivery_date : ''));
1641 
1642  if (isModEnabled("multicurrency")) {
1643  if (!empty($objectsrc->multicurrency_code)) {
1644  $currency_code = $objectsrc->multicurrency_code;
1645  }
1646  if (!empty($conf->global->MULTICURRENCY_USE_ORIGIN_TX) && !empty($objectsrc->multicurrency_tx)) {
1647  $currency_tx = $objectsrc->multicurrency_tx;
1648  }
1649  }
1650 
1651  $note_private = $object->getDefaultCreateValueFor('note_private', (!empty($objectsrc->note_private) ? $objectsrc->note_private : null));
1652  $note_public = $object->getDefaultCreateValueFor('note_public', (!empty($objectsrc->note_public) ? $objectsrc->note_public : null));
1653 
1654  // Object source contacts list
1655  $srccontactslist = $objectsrc->liste_contact(-1, 'external', 1);
1656  } else {
1657  $cond_reglement_id = !empty($societe->cond_reglement_supplier_id) ? $societe->cond_reglement_supplier_id : 0;
1658  $mode_reglement_id = !empty($societe->mode_reglement_supplier_id) ? $societe->mode_reglement_supplier_id : 0;
1659 
1660  if (isModEnabled("multicurrency") && !empty($societe->multicurrency_code)) {
1661  $currency_code = $societe->multicurrency_code;
1662  }
1663 
1664  $note_private = $object->getDefaultCreateValueFor('note_private');
1665  $note_public = $object->getDefaultCreateValueFor('note_public');
1666  }
1667 
1668  // If not defined, set default value from constant
1669  if (empty($cond_reglement_id) && !empty($conf->global->SUPPLIER_ORDER_DEFAULT_PAYMENT_TERM_ID)) {
1670  $cond_reglement_id = $conf->global->SUPPLIER_ORDER_DEFAULT_PAYMENT_TERM_ID;
1671  }
1672  if (empty($mode_reglement_id) && !empty($conf->global->SUPPLIER_ORDER_DEFAULT_PAYMENT_MODE_ID)) {
1673  $mode_reglement_id = $conf->global->SUPPLIER_ORDER_DEFAULT_PAYMENT_MODE_ID;
1674  }
1675 
1676  print '<form name="add" action="'.$_SERVER["PHP_SELF"].'" method="post">';
1677  print '<input type="hidden" name="token" value="'.newToken().'">';
1678  print '<input type="hidden" name="action" value="add">';
1679  print '<input type="hidden" name="remise_percent" value="'.(empty($soc->remise_supplier_percent) ? '' : $soc->remise_supplier_percent).'">';
1680  print '<input type="hidden" name="origin" value="'.$origin.'">';
1681  print '<input type="hidden" name="originid" value="'.$originid.'">';
1682  if ($backtopage) {
1683  print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
1684  }
1685  if ($backtopageforcancel) {
1686  print '<input type="hidden" name="backtopageforcancel" value="'.$backtopageforcancel.'">';
1687  }
1688 
1689  if (!empty($currency_tx)) {
1690  print '<input type="hidden" name="originmulticurrency_tx" value="'.$currency_tx.'">';
1691  }
1692 
1693  print dol_get_fiche_head('');
1694 
1695  print '<table class="border centpercent">';
1696 
1697  // Ref
1698  print '<tr><td class="titlefieldcreate">'.$langs->trans('Ref').'</td><td>'.$langs->trans('Draft').'</td></tr>';
1699 
1700  // Third party
1701  print '<tr><td class="fieldrequired">'.$langs->trans('Supplier').'</td>';
1702  print '<td>';
1703 
1704  if (!empty($societe->id) && $societe->id > 0) {
1705  print $societe->getNomUrl(1, 'supplier');
1706  print '<input type="hidden" name="socid" value="'.$societe->id.'">';
1707  } else {
1708  $filter = '((s.fournisseur:=:1) AND (s.status:=:1))';
1709  print img_picto('', 'company', 'class="pictofixedwidth"').$form->select_company((empty($socid) ? '' : $socid), 'socid', $filter, 'SelectThirdParty', 1, 0, null, 0, 'minwidth175 maxwidth500 widthcentpercentminusxx');
1710  // reload page to retrieve customer informations
1711  if (empty($conf->global->RELOAD_PAGE_ON_SUPPLIER_CHANGE_DISABLED)) {
1712  print '<script>
1713  $(document).ready(function() {
1714  $("#socid").change(function() {
1715  console.log("We have changed the company - Reload page");
1716  // reload page
1717  $("input[name=action]").val("create");
1718  $("form[name=add]").submit();
1719  });
1720  });
1721  </script>';
1722  }
1723  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>';
1724  }
1725  print '</td>';
1726 
1727  if (!empty($societe->id) && $societe->id > 0) {
1728  // Discounts for third party
1729  print '<tr><td>'.$langs->trans('Discounts').'</td><td>';
1730 
1731  $absolute_discount = $societe->getAvailableDiscounts('', '', 0, 1);
1732 
1733  $thirdparty = $societe;
1734  $discount_type = 1;
1735  $backtopage = urlencode($_SERVER["PHP_SELF"].'?socid='.$thirdparty->id.'&action='.$action.'&origin='.GETPOST('origin').'&originid='.GETPOST('originid'));
1736  include DOL_DOCUMENT_ROOT.'/core/tpl/object_discounts.tpl.php';
1737 
1738  print '</td></tr>';
1739  }
1740 
1741  // Ref supplier
1742  print '<tr><td>'.$langs->trans('RefSupplier').'</td><td><input name="refsupplier" type="text"></td>';
1743  print '</tr>';
1744 
1745  // Payment term
1746  print '<tr><td class="nowrap">'.$langs->trans('PaymentConditionsShort').'</td><td>';
1747  print img_picto('', 'payment', 'class="pictofixedwidth"');
1748  print $form->getSelectConditionsPaiements((GETPOSTISSET('cond_reglement_id') && GETPOST('cond_reglement_id') != 0) ? GETPOST('cond_reglement_id') : $cond_reglement_id, 'cond_reglement_id', -1, 1);
1749  print '</td></tr>';
1750 
1751  // Payment mode
1752  print '<tr><td>'.$langs->trans('PaymentMode').'</td><td>';
1753  print img_picto('', 'bank', 'class="pictofixedwidth"');
1754  $form->select_types_paiements((GETPOSTISSET('mode_reglement_id') && GETPOST('mode_reglement_id') != 0) ? GETPOST('mode_reglement_id') : $mode_reglement_id, 'mode_reglement_id');
1755  print '</td></tr>';
1756 
1757  // Planned delivery date
1758  print '<tr><td>';
1759  print $langs->trans('DateDeliveryPlanned');
1760  print '</td>';
1761  print '<td>';
1762  $usehourmin = 0;
1763  if (!empty($conf->global->SUPPLIER_ORDER_USE_HOUR_FOR_DELIVERY_DATE)) {
1764  $usehourmin = 1;
1765  }
1766  print img_picto('', 'action', 'class="pictofixedwidth"');
1767  print $form->selectDate($datelivraison ? $datelivraison : -1, 'liv_', $usehourmin, $usehourmin, '', "set");
1768  print '</td></tr>';
1769 
1770  // Bank Account
1771  if (!empty($conf->global->BANK_ASK_PAYMENT_BANK_DURING_SUPPLIER_ORDER) && isModEnabled("banque")) {
1772  $langs->load("bank");
1773  print '<tr><td>'.$langs->trans('BankAccount').'</td><td>';
1774  print img_picto('', 'bank_account', 'class="pictofixedwidth"');
1775  $form->select_comptes($fk_account, 'fk_account', 0, '', 1);
1776  print '</td></tr>';
1777  }
1778 
1779  // Project
1780  if (isModEnabled('project')) {
1781  $formproject = new FormProjets($db);
1782 
1783  $langs->load('projects');
1784  print '<tr><td>'.$langs->trans('Project').'</td><td>';
1785  print img_picto('', 'project', 'class="pictofixedwidth"').$formproject->select_projects((empty($conf->global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS) ? $societe->id : -1), $projectid, 'projectid', 0, 0, 1, 1, 0, 0, 0, '', 1, 0, 'maxwidth500');
1786  print ' &nbsp; <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>';
1787  print '</td></tr>';
1788  }
1789 
1790  // Incoterms
1791  if (isModEnabled('incoterm')) {
1792  $fkincoterms = (!empty($object->fk_incoterms) ? $object->fk_incoterms : ($socid > 0 ? $societe->fk_incoterms : ''));
1793  $locincoterms = (!empty($object->location_incoterms) ? $object->location_incoterms : ($socid > 0 ? $societe->location_incoterms : ''));
1794  print '<tr>';
1795  print '<td><label for="incoterm_id">'.$form->textwithpicto($langs->trans("IncotermLabel"), $object->label_incoterms, 1).'</label></td>';
1796  print '<td class="maxwidthonsmartphone">';
1797  print img_picto('', 'incoterm', 'class="pictofixedwidth"');
1798  print $form->select_incoterms($fkincoterms, $locincoterms);
1799  print '</td></tr>';
1800  }
1801 
1802  // Multicurrency
1803  if (isModEnabled("multicurrency")) {
1804  print '<tr>';
1805  print '<td>'.$form->editfieldkey('Currency', 'multicurrency_code', '', $object, 0).'</td>';
1806  print '<td class="maxwidthonsmartphone">';
1807  print img_picto('', 'currency', 'class="pictofixedwidth"');
1808  print $form->selectMultiCurrency($currency_code, 'multicurrency_code');
1809  print '</td></tr>';
1810  }
1811 
1812  print '<tr><td>'.$langs->trans('NotePublic').'</td>';
1813  print '<td>';
1814  $doleditor = new DolEditor('note_public', isset($note_public) ? $note_public : GETPOST('note_public', 'restricthtml'), '', 80, 'dolibarr_notes', 'In', 0, false, empty($conf->global->FCKEDITOR_ENABLE_NOTE_PUBLIC) ? 0 : 1, ROWS_3, '90%');
1815  print $doleditor->Create(1);
1816  print '</td>';
1817  //print '<textarea name="note_public" wrap="soft" cols="60" rows="'.ROWS_5.'"></textarea>';
1818  print '</tr>';
1819 
1820  print '<tr><td>'.$langs->trans('NotePrivate').'</td>';
1821  print '<td>';
1822  $doleditor = new DolEditor('note_private', isset($note_private) ? $note_private : GETPOST('note_private', 'restricthtml'), '', 80, 'dolibarr_notes', 'In', 0, false, empty($conf->global->FCKEDITOR_ENABLE_NOTE_PRIVATE) ? 0 : 1, ROWS_3, '90%');
1823  print $doleditor->Create(1);
1824  print '</td>';
1825  //print '<td><textarea name="note_private" wrap="soft" cols="60" rows="'.ROWS_5.'"></textarea></td>';
1826  print '</tr>';
1827 
1828  if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
1829  print "\n<!-- ".$classname." info -->";
1830  print "\n";
1831  print '<input type="hidden" name="amount" value="'.$objectsrc->total_ht.'">'."\n";
1832  print '<input type="hidden" name="total" value="'.$objectsrc->total_ttc.'">'."\n";
1833  print '<input type="hidden" name="tva" value="'.$objectsrc->total_tva.'">'."\n";
1834  print '<input type="hidden" name="origin" value="'.$objectsrc->element.'">';
1835  print '<input type="hidden" name="originid" value="'.$objectsrc->id.'">';
1836 
1837  $newclassname = $classname;
1838  print '<tr><td>'.$langs->trans($newclassname).'</td><td>'.$objectsrc->getNomUrl(1, 'supplier').'</td></tr>';
1839  print '<tr><td>'.$langs->trans('AmountHT').'</td><td>'.price($objectsrc->total_ht).'</td></tr>';
1840  print '<tr><td>'.$langs->trans('AmountVAT').'</td><td>'.price($objectsrc->total_tva)."</td></tr>";
1841  if ($mysoc->localtax1_assuj == "1" || $objectsrc->total_localtax1 != 0) { // Localtax1 RE
1842  print '<tr><td>'.$langs->transcountry("AmountLT1", $mysoc->country_code).'</td><td>'.price($objectsrc->total_localtax1)."</td></tr>";
1843  }
1844 
1845  if ($mysoc->localtax2_assuj == "1" || $objectsrc->total_localtax2 != 0) { // Localtax2 IRPF
1846  print '<tr><td>'.$langs->transcountry("AmountLT2", $mysoc->country_code).'</td><td>'.price($objectsrc->total_localtax2)."</td></tr>";
1847  }
1848 
1849  print '<tr><td>'.$langs->trans('AmountTTC').'</td><td>'.price($objectsrc->total_ttc)."</td></tr>";
1850 
1851  if (isModEnabled("multicurrency")) {
1852  print '<tr><td>'.$langs->trans('MulticurrencyAmountHT').'</td><td>'.price($objectsrc->multicurrency_total_ht).'</td></tr>';
1853  print '<tr><td>'.$langs->trans('MulticurrencyAmountVAT').'</td><td>'.price($objectsrc->multicurrency_total_tva).'</td></tr>';
1854  print '<tr><td>'.$langs->trans('MulticurrencyAmountTTC').'</td><td>'.price($objectsrc->multicurrency_total_ttc).'</td></tr>';
1855  }
1856  }
1857 
1858  // Other options
1859  $parameters = array();
1860  $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1861  print $hookmanager->resPrint;
1862 
1863  if (empty($reshook)) {
1864  print $object->showOptionals($extrafields, 'create');
1865  }
1866 
1867  // Bouton "Create Draft"
1868  print "</table>\n";
1869 
1870  print dol_get_fiche_end();
1871 
1872  print $form->buttonsSaveCancel("CreateDraft");
1873 
1874  // Show origin lines
1875  if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
1876  $title = $langs->trans('ProductsAndServices');
1877  print load_fiche_titre($title);
1878 
1879  print '<div class="div-table-responsive-no-min">';
1880  print '<table class="noborder centpercent">';
1881 
1882  $selectedLines = array();
1883 
1884  $objectsrc->printOriginLinesList('', $selectedLines);
1885 
1886  print '</table>';
1887  print '</div>';
1888  }
1889  print "</form>\n";
1890 } elseif (!empty($object->id)) {
1891  // view
1892  $result = $object->fetch($id, $ref);
1893  $object->fetch_thirdparty();
1894 
1895  $societe = $object->thirdparty;
1896 
1897  $author = new User($db);
1898  $author->fetch($object->user_author_id);
1899 
1900  $head = ordersupplier_prepare_head($object);
1901 
1902  $title = $langs->trans("SupplierOrder");
1903  print dol_get_fiche_head($head, 'card', $title, -1, 'order');
1904 
1905 
1906  $formconfirm = '';
1907 
1908  // Confirmation de la suppression de la commande
1909  if ($action == 'delete') {
1910  $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('DeleteOrder'), $langs->trans('ConfirmDeleteOrder'), 'confirm_delete', '', 0, 2);
1911  }
1912 
1913  // Clone confirmation
1914  if ($action == 'clone') {
1915  $filter = '(s.fournisseur:=:1)';
1916  // Create an array for form
1917  $formquestion = array(
1918  array('type' => 'other', 'name' => 'socid', 'label' => $langs->trans("SelectThirdParty"), 'value' => $form->select_company(GETPOST('socid', 'int'), 'socid', $filter))
1919  );
1920  // Paiement incomplet. On demande si motif = escompte ou autre
1921  $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneOrder', $object->ref), 'confirm_clone', $formquestion, 'yes', 1);
1922  }
1923 
1924  // Confirmation de la validation
1925  if ($action == 'valid') {
1926  $object->date_commande = dol_now();
1927 
1928  // We check if number is temporary number
1929  if (preg_match('/^[\‍(]?PROV/i', $object->ref) || empty($object->ref)) { // empty should not happened, but when it occurs, the test save life
1930  $newref = $object->getNextNumRef($object->thirdparty);
1931  } else {
1932  $newref = $object->ref;
1933  }
1934 
1935  if ($newref < 0) {
1936  setEventMessages($object->error, $object->errors, 'errors');
1937  $action = '';
1938  } else {
1939  $text = $langs->trans('ConfirmValidateOrder', $newref);
1940  if (isModEnabled('notification')) {
1941  require_once DOL_DOCUMENT_ROOT.'/core/class/notify.class.php';
1942  $notify = new Notify($db);
1943  $text .= '<br>';
1944  $text .= $notify->confirmMessage('ORDER_SUPPLIER_VALIDATE', $object->socid, $object);
1945  }
1946 
1947  $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ValidateOrder'), $text, 'confirm_valid', '', 0, 1);
1948  }
1949  }
1950 
1951  // Confirm approval
1952  if ($action == 'approve' || $action == 'approve2') {
1953  $qualified_for_stock_change = 0;
1954  if (empty($conf->global->STOCK_SUPPORTS_SERVICES)) {
1955  $qualified_for_stock_change = $object->hasProductsOrServices(2);
1956  } else {
1957  $qualified_for_stock_change = $object->hasProductsOrServices(1);
1958  }
1959 
1960  $formquestion = array();
1961  if (isModEnabled('stock') && !empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER) && $qualified_for_stock_change) {
1962  $langs->load("stocks");
1963  require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php';
1964  $formproduct = new FormProduct($db);
1965  $forcecombo = 0;
1966  if ($conf->browser->name == 'ie') {
1967  $forcecombo = 1; // There is a bug in IE10 that make combo inside popup crazy
1968  }
1969  $formquestion = array(
1970  //'text' => $langs->trans("ConfirmClone"),
1971  //array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1),
1972  //array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1),
1973  array('type' => 'other', 'name' => 'idwarehouse', 'label' => $langs->trans("SelectWarehouseForStockIncrease"), 'value' => $formproduct->selectWarehouses(GETPOST('idwarehouse', 'int'), 'idwarehouse', '', 1, 0, 0, '', 0, $forcecombo))
1974  );
1975  }
1976  $text = $langs->trans("ConfirmApproveThisOrder", $object->ref);
1977  if (isModEnabled('notification')) {
1978  require_once DOL_DOCUMENT_ROOT.'/core/class/notify.class.php';
1979  $notify = new Notify($db);
1980  $text .= '<br>';
1981  $text .= $notify->confirmMessage('ORDER_SUPPLIER_APPROVE', $object->socid, $object);
1982  }
1983 
1984  $formconfirm = $form->formconfirm($_SERVER['PHP_SELF']."?id=".$object->id, $langs->trans("ApproveThisOrder"), $text, "confirm_".$action, $formquestion, 1, 1, 240);
1985  }
1986 
1987  // Confirmation of disapproval
1988  if ($action == 'refuse') {
1989  $formquestion = array(
1990  array(
1991  'type' => 'text',
1992  'name' => 'refuse_note',
1993  'label' => $langs->trans("Reason"),
1994  'value' => '',
1995  'morecss' => 'minwidth300'
1996  )
1997  );
1998  $formconfirm = $form->formconfirm($_SERVER['PHP_SELF']."?id=$object->id", $langs->trans("DenyingThisOrder"), $langs->trans("ConfirmDenyingThisOrder", $object->ref), "confirm_refuse", $formquestion, 0, 1);
1999  }
2000 
2001  // Confirmation of cancellation
2002  if ($action == 'cancel') {
2003  $formquestion = array(
2004  array(
2005  'type' => 'text',
2006  'name' => 'cancel_note',
2007  'label' => $langs->trans("Reason"),
2008  'value' => '',
2009  'morecss' => 'minwidth300'
2010  )
2011  );
2012  $formconfirm = $form->formconfirm($_SERVER['PHP_SELF']."?id=$object->id", $langs->trans("Cancel"), $langs->trans("ConfirmCancelThisOrder", $object->ref), "confirm_cancel", $formquestion, 0, 1);
2013  }
2014 
2015  // Confirmation de l'envoi de la commande
2016  if ($action == 'commande') {
2017  $date_com = dol_mktime(GETPOST('rehour'), GETPOST('remin'), GETPOST('resec'), GETPOST("remonth"), GETPOST("reday"), GETPOST("reyear"));
2018  $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", '', 0, 2);
2019  }
2020 
2021  // Confirmation to delete line
2022  if ($action == 'ask_deleteline') {
2023  $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$lineid, $langs->trans('DeleteProductLine'), $langs->trans('ConfirmDeleteProductLine'), 'confirm_deleteline', '', 0, 1);
2024  }
2025 
2026  $parameters = array('formConfirm' => $formconfirm, 'lineid'=>$lineid);
2027  $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
2028  if (empty($reshook)) {
2029  $formconfirm .= $hookmanager->resPrint;
2030  } elseif ($reshook > 0) {
2031  $formconfirm = $hookmanager->resPrint;
2032  }
2033 
2034  // Print form confirm
2035  print $formconfirm;
2036 
2037 
2038  // Supplier order card
2039 
2040  $linkback = '<a href="'.DOL_URL_ROOT.'/fourn/commande/list.php?restore_lastsearch_values=1'.(!empty($socid) ? '&socid='.$socid : '').'">'.$langs->trans("BackToList").'</a>';
2041 
2042  $morehtmlref = '<div class="refidno">';
2043  // Ref supplier
2044  $morehtmlref .= $form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $usercancreate, 'string', '', 0, 1);
2045  $morehtmlref .= $form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $usercancreate, 'string'.(isset($conf->global->THIRDPARTY_REF_INPUT_SIZE) ? ':'.$conf->global->THIRDPARTY_REF_INPUT_SIZE : ''), '', null, null, '', 1);
2046  // Thirdparty
2047  $morehtmlref .= '<br>';
2048  if (!empty($conf->global->MAIN_CAN_EDIT_SUPPLIER_ON_SUPPLIER_ORDER) && !empty($usercancreate) && $action == 'edit_thirdparty') {
2049  $morehtmlref .= '<form method="post" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
2050  $morehtmlref .= '<input type="hidden" name="action" value="set_thirdparty">';
2051  $morehtmlref .= '<input type="hidden" name="token" value="'.newToken().'">';
2052  $filter = '(s.fournisseur:=:1)';
2053  $morehtmlref .= $form->select_company($object->thirdparty->id, 'new_socid', $filter, '', 0, 0, array(), 0, 'minwidth300');
2054  $morehtmlref .= '<input type="submit" class="button valignmiddle" value="'.$langs->trans("Modify").'">';
2055  $morehtmlref .= '</form>';
2056  }
2057  if (empty($conf->global->MAIN_CAN_EDIT_SUPPLIER_ON_SUPPLIER_ORDER) || $action != 'edit_thirdparty') {
2058  if (!empty($conf->global->MAIN_CAN_EDIT_SUPPLIER_ON_SUPPLIER_ORDER) && $object->statut == CommandeFournisseur::STATUS_DRAFT) {
2059  $morehtmlref .= '<a class="editfielda" href="'.$_SERVER['PHP_SELF'].'?action=edit_thirdparty&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->transnoentitiesnoconv('SetThirdParty')).'</a>';
2060  }
2061  $morehtmlref .= $object->thirdparty->getNomUrl(1, 'supplier');
2062  if (empty($conf->global->MAIN_DISABLE_OTHER_LINK) && $object->thirdparty->id > 0) {
2063  $morehtmlref .= ' (<a href="'.DOL_URL_ROOT.'/fourn/commande/list.php?socid='.$object->thirdparty->id.'&search_company='.urlencode($object->thirdparty->name).'">'.$langs->trans("OtherOrders").'</a>)';
2064  }
2065  }
2066 
2067  // Project
2068  if (isModEnabled('project')) {
2069  $langs->load("projects");
2070  $morehtmlref .= '<br>';
2071  if ($permissiontoadd) {
2072  $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
2073  if ($action != 'classify' && $caneditproject) {
2074  $morehtmlref .= '<a class="editfielda" href="'.$_SERVER['PHP_SELF'].'?action=classify&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->transnoentitiesnoconv('SetProject')).'</a> ';
2075  }
2076  $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, (empty($conf->global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS) ? $object->socid : -1), $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, 0, 0, 1, '', 'maxwidth300');
2077  } else {
2078  if (!empty($object->fk_project)) {
2079  $proj = new Project($db);
2080  $proj->fetch($object->fk_project);
2081  $morehtmlref .= $proj->getNomUrl(1);
2082  if ($proj->title) {
2083  $morehtmlref .= '<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).'</span>';
2084  }
2085  }
2086  }
2087  }
2088  $morehtmlref .= '</div>';
2089 
2090 
2091  dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
2092 
2093 
2094  print '<div class="fichecenter">';
2095  print '<div class="fichehalfleft">';
2096  print '<div class="underbanner clearboth"></div>';
2097 
2098  print '<table class="border tableforfield centpercent">';
2099 
2100  // Date
2101  if ($object->methode_commande_id > 0) {
2102  $usehourmin = 0;
2103  if (!empty($conf->global->SUPPLIER_ORDER_USE_HOUR_FOR_DELIVERY_DATE)) {
2104  $usehourmin = 1;
2105  }
2106  print '<tr><td class="titlefield">'.$langs->trans("Date").'</td><td>';
2107  print $object->date_commande ? dol_print_date($object->date_commande, $usehourmin ? 'dayhour' : 'day') : '';
2108  if ($object->hasDelay() && !empty($object->delivery_date) && !empty($object->date_commande)) {
2109  print ' '.img_picto($langs->trans("Late").' : '.$object->showDelay(), "warning");
2110  }
2111  print "</td></tr>";
2112 
2113  if ($object->methode_commande) {
2114  print '<tr><td>'.$langs->trans("Method").'</td><td>'.$object->getInputMethod().'</td></tr>';
2115  }
2116  }
2117 
2118  // Author
2119  print '<tr><td class="titlefield">'.$langs->trans("AuthorRequest").'</td>';
2120  print '<td>'.$author->getNomUrl(1, '', 0, 0, 0).'</td>';
2121  print '</tr>';
2122 
2123  // Relative and absolute discounts
2124  if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
2125  $filterabsolutediscount = "fk_invoice_supplier_source IS NULL"; // If we want deposit to be substracted to payments only and not to total of final invoice
2126  $filtercreditnote = "fk_invoice_supplier_source IS NOT NULL"; // If we want deposit to be substracted to payments only and not to total of final invoice
2127  } else {
2128  $filterabsolutediscount = "fk_invoice_supplier_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS PAID)%')";
2129  $filtercreditnote = "fk_invoice_supplier_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS PAID)%')";
2130  }
2131 
2132  $absolute_discount = $societe->getAvailableDiscounts('', $filterabsolutediscount, 0, 1);
2133  $absolute_creditnote = $societe->getAvailableDiscounts('', $filtercreditnote, 0, 1);
2134  $absolute_discount = price2num($absolute_discount, 'MT');
2135  $absolute_creditnote = price2num($absolute_creditnote, 'MT');
2136 
2137  print '<tr><td class="titlefield">'.$langs->trans('Discounts').'</td><td>';
2138 
2139  $thirdparty = $societe;
2140  $discount_type = 1;
2141  $backtopage = urlencode($_SERVER["PHP_SELF"].'?id='.$object->id);
2142  include DOL_DOCUMENT_ROOT.'/core/tpl/object_discounts.tpl.php';
2143 
2144  print '</td></tr>';
2145 
2146  // Default terms of the settlement
2147  $langs->load('bills');
2148  print '<tr><td class="nowrap">';
2149  print '<table class="nobordernopadding centpercent"><tr><td class="nowrap">';
2150  print $langs->trans('PaymentConditions');
2151  print '<td>';
2152  if ($action != 'editconditions') {
2153  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>';
2154  }
2155  print '</tr></table>';
2156  print '</td><td>';
2157  if ($action == 'editconditions') {
2158  $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->cond_reglement_id, 'cond_reglement_id');
2159  } else {
2160  $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->cond_reglement_id, 'none');
2161  }
2162  print "</td>";
2163  print '</tr>';
2164 
2165  // Mode of payment
2166  $langs->load('bills');
2167  print '<tr><td class="nowrap">';
2168  print '<table class="nobordernopadding centpercent"><tr><td class="nowrap">';
2169  print $langs->trans('PaymentMode');
2170  print '</td>';
2171  if ($action != 'editmode') {
2172  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>';
2173  }
2174  print '</tr></table>';
2175  print '</td><td>';
2176  if ($action == 'editmode') {
2177  $form->form_modes_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->mode_reglement_id, 'mode_reglement_id', 'DBIT', 1, 1);
2178  } else {
2179  $form->form_modes_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->mode_reglement_id, 'none');
2180  }
2181  print '</td></tr>';
2182 
2183  // Multicurrency
2184  if (isModEnabled("multicurrency")) {
2185  // Multicurrency code
2186  print '<tr>';
2187  print '<td>';
2188  print '<table class="nobordernopadding centpercent"><tr><td>';
2189  print $form->editfieldkey('Currency', 'multicurrency_code', '', $object, 0);
2190  print '</td>';
2191  if ($action != 'editmulticurrencycode' && $object->statut == $object::STATUS_DRAFT) {
2192  print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editmulticurrencycode&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->transnoentitiesnoconv('SetMultiCurrencyCode'), 1).'</a></td>';
2193  }
2194  print '</tr></table>';
2195  print '</td><td>';
2196  if ($action == 'editmulticurrencycode') {
2197  $form->form_multicurrency_code($_SERVER['PHP_SELF'].'?id='.$object->id, $object->multicurrency_code, 'multicurrency_code');
2198  } else {
2199  $form->form_multicurrency_code($_SERVER['PHP_SELF'].'?id='.$object->id, $object->multicurrency_code, 'none');
2200  }
2201  print '</td></tr>';
2202 
2203  // Multicurrency rate
2204  if ($object->multicurrency_code != $conf->currency || $object->multicurrency_tx != 1) {
2205  print '<tr>';
2206  print '<td>';
2207  print '<table class="nobordernopadding centpercent"><tr>';
2208  print '<td>';
2209  print $form->editfieldkey('CurrencyRate', 'multicurrency_tx', '', $object, 0);
2210  print '</td>';
2211  if ($action != 'editmulticurrencyrate' && $object->statut == $object::STATUS_DRAFT && $object->multicurrency_code && $object->multicurrency_code != $conf->currency) {
2212  print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editmulticurrencyrate&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->transnoentitiesnoconv('SetMultiCurrencyCode'), 1).'</a></td>';
2213  }
2214  print '</tr></table>';
2215  print '</td><td>';
2216  if ($action == 'editmulticurrencyrate' || $action == 'actualizemulticurrencyrate') {
2217  if ($action == 'actualizemulticurrencyrate') {
2218  list($object->fk_multicurrency, $object->multicurrency_tx) = MultiCurrency::getIdAndTxFromCode($object->db, $object->multicurrency_code);
2219  }
2220  $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$object->id, $object->multicurrency_tx, 'multicurrency_tx', $object->multicurrency_code);
2221  } else {
2222  $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$object->id, $object->multicurrency_tx, 'none', $object->multicurrency_code);
2223  if ($object->statut == $object::STATUS_DRAFT && $object->multicurrency_code && $object->multicurrency_code != $conf->currency) {
2224  print '<div class="inline-block"> &nbsp; &nbsp; &nbsp; &nbsp; ';
2225  print '<a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=actualizemulticurrencyrate">'.$langs->trans("ActualizeCurrency").'</a>';
2226  print '</div>';
2227  }
2228  }
2229  print '</td></tr>';
2230  }
2231  }
2232 
2233  // Bank Account
2234  if (!empty($conf->global->BANK_ASK_PAYMENT_BANK_DURING_SUPPLIER_ORDER) && isModEnabled("banque")) {
2235  print '<tr><td class="nowrap">';
2236  print '<table class="nobordernopadding centpercent"><tr><td class="nowrap">';
2237  print $langs->trans('BankAccount');
2238  print '<td>';
2239  if ($action != 'editbankaccount' && $usercancreate) {
2240  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>';
2241  }
2242  print '</tr></table>';
2243  print '</td><td>';
2244  if ($action == 'editbankaccount') {
2245  $form->formSelectAccount($_SERVER['PHP_SELF'].'?id='.$object->id, $object->fk_account, 'fk_account', 1);
2246  } else {
2247  $form->formSelectAccount($_SERVER['PHP_SELF'].'?id='.$object->id, $object->fk_account, 'none');
2248  }
2249  print '</td>';
2250  print '</tr>';
2251  }
2252 
2253  // Delivery delay (in days)
2254  print '<tr>';
2255  print '<td>'.$langs->trans('NbDaysToDelivery').'&nbsp;'.img_picto($langs->trans('DescNbDaysToDelivery'), 'info', 'style="cursor:help"').'</td>';
2256  print '<td>'.$object->getMaxDeliveryTimeDay($langs).'</td>';
2257  print '</tr>';
2258 
2259  // Delivery date planed
2260  print '<tr><td>';
2261  print '<table class="nobordernopadding centpercent"><tr><td>';
2262  print $langs->trans('DateDeliveryPlanned');
2263  print '</td>';
2264  if ($action != 'editdate_livraison') {
2265  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>';
2266  }
2267  print '</tr></table>';
2268  print '</td><td>';
2269  if ($action == 'editdate_livraison') {
2270  print '<form name="setdate_livraison" action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'" method="post">';
2271  print '<input type="hidden" name="token" value="'.newToken().'">';
2272  print '<input type="hidden" name="action" value="setdate_livraison">';
2273  $usehourmin = 0;
2274  if (!empty($conf->global->SUPPLIER_ORDER_USE_HOUR_FOR_DELIVERY_DATE)) {
2275  $usehourmin = 1;
2276  }
2277  print $form->selectDate($object->delivery_date ? $object->delivery_date : -1, 'liv_', $usehourmin, $usehourmin, '', "setdate_livraison");
2278  print '<input type="submit" class="button button-edit smallpaddingimp valign middle" value="'.$langs->trans('Modify').'">';
2279  print '</form>';
2280  } else {
2281  $usehourmin = 'day';
2282  if (!empty($conf->global->SUPPLIER_ORDER_USE_HOUR_FOR_DELIVERY_DATE)) {
2283  $usehourmin = 'dayhour';
2284  }
2285  print $object->delivery_date ? dol_print_date($object->delivery_date, $usehourmin) : '&nbsp;';
2286  if ($object->hasDelay() && !empty($object->delivery_date) && ($object->statut == $object::STATUS_ORDERSENT || $object->statut == $object::STATUS_RECEIVED_PARTIALLY)) {
2287  print ' '.img_picto($langs->trans("Late").' : '.$object->showDelay(), "warning");
2288  }
2289  }
2290  print '</td></tr>';
2291 
2292  // Incoterms
2293  if (isModEnabled('incoterm')) {
2294  print '<tr><td>';
2295  print '<table class="nobordernopadding centpercent"><tr><td>';
2296  print $langs->trans('IncotermLabel');
2297  print '<td><td class="right">';
2298  if ($usercancreate) {
2299  print '<a class="editfielda" href="'.DOL_URL_ROOT.'/fourn/commande/card.php?id='.$object->id.'&action=editincoterm&token='.newToken().'">'.img_edit().'</a>';
2300  } else {
2301  print '&nbsp;';
2302  }
2303  print '</td></tr></table>';
2304  print '</td>';
2305  print '<td>';
2306  if ($action != 'editincoterm') {
2307  print $form->textwithpicto(dol_escape_htmltag($object->display_incoterms()), $object->label_incoterms, 1);
2308  } else {
2309  print $form->select_incoterms((!empty($object->fk_incoterms) ? $object->fk_incoterms : ''), (!empty($object->location_incoterms) ? $object->location_incoterms : ''), $_SERVER['PHP_SELF'].'?id='.$object->id);
2310  }
2311  print '</td></tr>';
2312  }
2313 
2314  // Other attributes
2315  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
2316 
2317  print '</table>';
2318 
2319  print '</div>';
2320  print '<div class="fichehalfright">';
2321  print '<div class="underbanner clearboth"></div>';
2322 
2323  print '<table class="border tableforfield centpercent">';
2324 
2325  print '<tr>';
2326  // Amount HT
2327  print '<td class="titlefieldmiddle">' . $langs->trans('AmountHT') . '</td>';
2328  print '<td class="nowrap amountcard right">' . price($object->total_ht, '', $langs, 0, -1, -1, $conf->currency) . '</td>';
2329  if (isModEnabled("multicurrency") && ($object->multicurrency_code && $object->multicurrency_code != $conf->currency)) {
2330  // Multicurrency Amount HT
2331  print '<td class="nowrap amountcard right">' . price($object->multicurrency_total_ht, '', $langs, 0, -1, -1, $object->multicurrency_code) . '</td>';
2332  }
2333  print '</tr>';
2334 
2335  print '<tr>';
2336  // Amount VAT
2337  print '<td class="titlefieldmiddle">' . $langs->trans('AmountVAT') . '</td>';
2338  print '<td class="nowrap amountcard right">' . price($object->total_tva, '', $langs, 0, -1, -1, $conf->currency) . '</td>';
2339  if (isModEnabled("multicurrency") && ($object->multicurrency_code && $object->multicurrency_code != $conf->currency)) {
2340  // Multicurrency Amount VAT
2341  print '<td class="nowrap amountcard right">' . price($object->multicurrency_total_tva, '', $langs, 0, -1, -1, $object->multicurrency_code) . '</td>';
2342  }
2343  print '</tr>';
2344 
2345  // Amount Local Taxes
2346  if ($mysoc->localtax1_assuj == "1" || $object->total_localtax1 != 0) {
2347  print '<tr>';
2348  print '<td class="titlefieldmiddle">' . $langs->transcountry("AmountLT1", $mysoc->country_code) . '</td>';
2349  print '<td class="nowrap amountcard right">' . price($object->total_localtax1, '', $langs, 0, -1, -1, $conf->currency) . '</td>';
2350  if (isModEnabled("multicurrency") && ($object->multicurrency_code && $object->multicurrency_code != $conf->currency)) {
2351  print '<td class="nowrap amountcard right">' . price($object->total_localtax1, '', $langs, 0, -1, -1, $object->multicurrency_code) . '</td>';
2352  }
2353  print '</tr>';
2354 
2355  if ($mysoc->localtax2_assuj == "1" || $object->total_localtax2 != 0) {
2356  print '<tr>';
2357  print '<td>' . $langs->transcountry("AmountLT2", $mysoc->country_code) . '</td>';
2358  print '<td class="nowrap amountcard right">' . price($object->total_localtax2, '', $langs, 0, -1, -1, $conf->currency) . '</td>';
2359  if (isModEnabled("multicurrency") && ($object->multicurrency_code && $object->multicurrency_code != $conf->currency)) {
2360  print '<td class="nowrap amountcard right">' . price($object->total_localtax2, '', $langs, 0, -1, -1, $object->multicurrency_code) . '</td>';
2361  }
2362  print '</tr>';
2363  }
2364  }
2365 
2366  $alert = '';
2367  if (!empty($conf->global->ORDER_MANAGE_MIN_AMOUNT) && $object->total_ht < $object->thirdparty->supplier_order_min_amount) {
2368  $alert = ' ' . img_warning($langs->trans('OrderMinAmount') . ': ' . price($object->thirdparty->supplier_order_min_amount));
2369  }
2370 
2371  print '<tr>';
2372  // Amount TTC
2373  print '<td>' . $langs->trans('AmountTTC') . '</td>';
2374  print '<td class="nowrap amountcard right">' . price($object->total_ttc, '', $langs, 0, -1, -1, $conf->currency) . $alert . '</td>';
2375  if (isModEnabled("multicurrency") && ($object->multicurrency_code && $object->multicurrency_code != $conf->currency)) {
2376  // Multicurrency Amount TTC
2377  print '<td class="nowrap amountcard right">' . price($object->multicurrency_total_ttc, '', $langs, 0, -1, -1, $object->multicurrency_code) . '</td>';
2378  }
2379  print '</tr>';
2380 
2381  print '</table>';
2382 
2383  // Margin Infos
2384  /*if (isModEnabled('margin')) {
2385  $formmargin->displayMarginInfos($object);
2386  }*/
2387 
2388 
2389  print '</div>';
2390  print '</div>';
2391 
2392  print '<div class="clearboth"></div><br>';
2393 
2394  if (!empty($conf->global->MAIN_DISABLE_CONTACTS_TAB)) {
2395  $blocname = 'contacts';
2396  $title = $langs->trans('ContactsAddresses');
2397  include DOL_DOCUMENT_ROOT.'/core/tpl/bloc_showhide.tpl.php';
2398  }
2399 
2400  if (!empty($conf->global->MAIN_DISABLE_NOTES_TAB)) {
2401  $blocname = 'notes';
2402  $title = $langs->trans('Notes');
2403  include DOL_DOCUMENT_ROOT.'/core/tpl/bloc_showhide.tpl.php';
2404  }
2405 
2406  /*
2407  * Lines
2408  */
2409  //$result = $object->getLinesArray();
2410 
2411 
2412  print ' <form name="addproduct" id="addproduct" action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.(($action != 'editline') ? '' : '#line_'.GETPOST('lineid', 'int')).'" method="POST">
2413  <input type="hidden" name="token" value="'.newToken().'">
2414  <input type="hidden" name="action" value="' . (($action != 'editline') ? 'addline' : 'updateline').'">
2415  <input type="hidden" name="mode" value="">
2416  <input type="hidden" name="page_y" value="">
2417  <input type="hidden" name="id" value="'.$object->id.'">
2418  <input type="hidden" name="socid" value="'.$societe->id.'">
2419  ';
2420 
2421  if (!empty($conf->use_javascript_ajax) && $object->statut == 0) {
2422  include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php';
2423  }
2424 
2425  print '<div class="div-table-responsive-no-min">';
2426  print '<table id="tablelines" class="noborder noshadow centpercent">';
2427 
2428  // Add free products/services form
2429  global $forceall, $senderissupplier, $dateSelector, $inputalsopricewithtax;
2430  $forceall = 1; $dateSelector = 0; $inputalsopricewithtax = 1;
2431  $senderissupplier = 2; // $senderissupplier=2 is same than 1 but disable test on minimum qty and disable autofill qty with minimum.
2432  if (!empty($conf->global->SUPPLIER_ORDER_WITH_PREDEFINED_PRICES_ONLY)) {
2433  $senderissupplier = 1;
2434  }
2435 
2436  // Show object lines
2437  if (!empty($object->lines)) {
2438  $object->printObjectLines($action, $object->thirdparty, $mysoc, $lineid, 1);
2439  }
2440 
2441  $num = count($object->lines);
2442 
2443  // Form to add new line
2444  if ($object->statut == CommandeFournisseur::STATUS_DRAFT && $usercancreate) {
2445  if ($action != 'editline') {
2446  // Add free products/services
2447 
2448  $parameters = array();
2449  $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
2450  if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
2451  if (empty($reshook))
2452  $object->formAddObjectLine(1, $societe, $mysoc);
2453  }
2454  }
2455  print '</table>';
2456  print '</div>';
2457  print '</form>';
2458 
2459  print dol_get_fiche_end();
2460 
2465  if ($user->socid == 0 && $action != 'delete') {
2466  if ($action != 'createorder' && $action != 'presend' && $action != 'editline') {
2467  print '<div class="tabsAction">';
2468 
2469  $parameters = array();
2470  $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been
2471  // modified by hook
2472  if (empty($reshook)) {
2473  $object->fetchObjectLinked(); // Links are used to show or not button, so we load them now.
2474 
2475  // Validate
2476  if ($object->statut == 0 && $num > 0) {
2477  if ($usercanvalidate) {
2478  $tmpbuttonlabel = $langs->trans('Validate');
2479  if ($usercanapprove && empty($conf->global->SUPPLIER_ORDER_NO_DIRECT_APPROVE)) {
2480  $tmpbuttonlabel = $langs->trans("ValidateAndApprove");
2481  }
2482 
2483  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&amp;action=valid">';
2484  print $tmpbuttonlabel;
2485  print '</a>';
2486  }
2487  }
2488  // Create event
2489  /*if (isModEnabled('agenda') && !empty($conf->global->MAIN_ADD_EVENT_ON_ELEMENT_CARD)) // Add hidden condition because this is not a "workflow" action so should appears somewhere else on page.
2490  {
2491  print '<div class="inline-block divButAction"><a class="butAction" href="' . DOL_URL_ROOT . '/comm/action/card.php?action=create&amp;origin=' . $object->element . '&amp;originid=' . $object->id . '&amp;socid=' . $object->socid . '">' . $langs->trans("AddAction") . '</a></div>';
2492  }*/
2493 
2494  // Modify
2495  if ($object->statut == CommandeFournisseur::STATUS_VALIDATED) {
2496  if ($usercanorder) {
2497  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=reopen&token='.newToken().'">'.$langs->trans("Modify").'</a>';
2498  }
2499  }
2500 
2501  // Approve
2502  if ($object->statut == CommandeFournisseur::STATUS_VALIDATED) {
2503  if ($usercanapprove) {
2504  if (!empty($conf->global->SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED) && $object->total_ht >= $conf->global->SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED && !empty($object->user_approve_id)) {
2505  print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("FirstApprovalAlreadyDone")).'">'.$langs->trans("ApproveOrder").'</a>';
2506  } else {
2507  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&amp;action=approve">'.$langs->trans("ApproveOrder").'</a>';
2508  }
2509  } else {
2510  print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("NotAllowed")).'">'.$langs->trans("ApproveOrder").'</a>';
2511  }
2512  }
2513 
2514  // Second approval (if option SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED is set)
2515  if (!empty($conf->global->SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED) && $object->total_ht >= $conf->global->SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED) {
2516  if ($object->statut == CommandeFournisseur::STATUS_VALIDATED) {
2517  if ($usercanapprovesecond) {
2518  if (!empty($object->user_approve_id2)) {
2519  print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("SecondApprovalAlreadyDone")).'">'.$langs->trans("Approve2Order").'</a>';
2520  } else {
2521  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&amp;action=approve2">'.$langs->trans("Approve2Order").'</a>';
2522  }
2523  } else {
2524  print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("NotAllowed")).'">'.$langs->trans("Approve2Order").'</a>';
2525  }
2526  }
2527  }
2528 
2529  // Refuse
2530  if ($object->statut == CommandeFournisseur::STATUS_VALIDATED) {
2531  if ($usercanapprove || $usercanapprovesecond) {
2532  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&amp;action=refuse">'.$langs->trans("RefuseOrder").'</a>';
2533  } else {
2534  print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("NotAllowed")).'">'.$langs->trans("RefuseOrder").'</a>';
2535  }
2536  }
2537 
2538  // Send
2539  if (empty($user->socid)) {
2540  if (in_array($object->statut, array(CommandeFournisseur::STATUS_ACCEPTED, 3, 4, 5)) || !empty($conf->global->SUPPLIER_ORDER_SENDBYEMAIL_FOR_ALL_STATUS)) {
2541  if ($usercanorder) {
2542  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=presend&mode=init#formmailbeforetitle">'.$langs->trans('SendMail').'</a>';
2543  }
2544  }
2545  }
2546 
2547  // Reopen
2548  if (in_array($object->statut, array(CommandeFournisseur::STATUS_ACCEPTED))) {
2549  $buttonshown = 0;
2550  if (!$buttonshown && $usercanapprove) {
2551  if (empty($conf->global->SUPPLIER_ORDER_REOPEN_BY_APPROVER_ONLY)
2552  || (!empty($conf->global->SUPPLIER_ORDER_REOPEN_BY_APPROVER_ONLY) && $user->id == $object->user_approve_id)) {
2553  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=reopen&token='.newToken().'">'.$langs->trans("Disapprove").'</a>';
2554  $buttonshown++;
2555  }
2556  }
2557  if (!$buttonshown && $usercanapprovesecond && !empty($conf->global->SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED)) {
2558  if (empty($conf->global->SUPPLIER_ORDER_REOPEN_BY_APPROVER2_ONLY)
2559  || (!empty($conf->global->SUPPLIER_ORDER_REOPEN_BY_APPROVER2_ONLY) && $user->id == $object->user_approve_id2)) {
2560  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=reopen&token='.newToken().'">'.$langs->trans("Disapprove").'</a>';
2561  }
2562  }
2563  }
2564  if (in_array($object->statut, array(3, 4, 5, 6, 7, 9))) {
2565  if ($usercanorder) {
2566  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=reopen&token='.newToken().'">'.$langs->trans("ReOpen").'</a>';
2567  }
2568  }
2569 
2570  // Ship
2571  $hasreception = 0;
2572  if (isModEnabled('stock') && (!empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER) || !empty($conf->global->STOCK_CALCULATE_ON_RECEPTION) || !empty($conf->global->STOCK_CALCULATE_ON_RECEPTION_CLOSE))) {
2573  $labelofbutton = $langs->trans('ReceiveProducts');
2574  if ($conf->reception->enabled) {
2575  $labelofbutton = $langs->trans("CreateReception");
2576  if (!empty($object->linkedObjects['reception'])) {
2577  foreach ($object->linkedObjects['reception'] as $element) {
2578  if ($element->statut >= 0) {
2579  $hasreception = 1;
2580  break;
2581  }
2582  }
2583  }
2584  }
2585 
2586  if (in_array($object->statut, array(3, 4, 5))) {
2587  if (isModEnabled("supplier_order") && $usercanreceive) {
2588  print '<div class="inline-block divButAction"><a class="butAction" href="'.DOL_URL_ROOT.'/fourn/commande/dispatch.php?id='.$object->id.'">'.$labelofbutton.'</a></div>';
2589  } else {
2590  print '<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("NotAllowed")).'">'.$labelofbutton.'</a></div>';
2591  }
2592  }
2593  }
2594 
2595  if ($object->statut == CommandeFournisseur::STATUS_ACCEPTED) {
2596  if ($usercanorder) {
2597  print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&amp;action=createorder#makeorder">'.$langs->trans("MakeOrder").'</a></div>';
2598  } else {
2599  print '<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#">'.$langs->trans("MakeOrder").'</a></div>';
2600  }
2601  }
2602 
2603  // Classify received (this does not record reception)
2604  if ($object->statut == CommandeFournisseur::STATUS_ORDERSENT || $object->statut == CommandeFournisseur::STATUS_RECEIVED_PARTIALLY) {
2605  if ($usercanreceive) {
2606  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>';
2607  }
2608  }
2609 
2610  // Create bill
2611  //if (isModEnabled('facture'))
2612  //{
2613  if (isModEnabled("supplier_invoice") && ($object->statut >= 2 && $object->statut != 7 && $object->billed != 1)) { // statut 2 means approved, 7 means canceled
2614  if ($user->hasRight('fournisseur', 'facture', 'creer') || $user->hasRight("supplier_invoice", "creer")) {
2615  print '<a class="butAction" href="'.DOL_URL_ROOT.'/fourn/facture/card.php?action=create&amp;origin='.$object->element.'&amp;originid='.$object->id.'&amp;socid='.$object->socid.'">'.$langs->trans("CreateBill").'</a>';
2616  }
2617  }
2618  //}
2619 
2620  // Classify billed manually (need one invoice if module invoice is on, no condition on invoice if not)
2621  if ($usercancreate && $object->statut >= 2 && $object->statut != 7 && $object->billed != 1) { // statut 2 means approved
2622  if (!isModEnabled('facture')) {
2623  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=classifybilled&token='.newToken().'">'.$langs->trans("ClassifyBilled").'</a>';
2624  } else {
2625  if (!empty($object->linkedObjectsIds['invoice_supplier'])) {
2626  if ($user->hasRight('fournisseur', 'facture', 'creer') || $user->hasRight("supplier_invoice", "creer")) {
2627  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=classifybilled&token='.newToken().'">'.$langs->trans("ClassifyBilled").'</a>';
2628  }
2629  } else {
2630  print '<a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->trans("NeedAtLeastOneInvoice")).'">'.$langs->trans("ClassifyBilled").'</a>';
2631  }
2632  }
2633  }
2634 
2635  // Create a remote order using WebService only if module is activated
2636  if (!empty($conf->syncsupplierwebservices->enabled) && $object->statut >= 2) { // 2 means accepted
2637  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=webservice&token='.newToken().'&mode=init">'.$langs->trans('CreateRemoteOrder').'</a>';
2638  }
2639 
2640  // Clone
2641  if ($usercancreate) {
2642  print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&amp;socid='.$object->socid.'&amp;action=clone&amp;object=order">'.$langs->trans("ToClone").'</a>';
2643  }
2644 
2645  // Cancel
2646  if ($object->statut == CommandeFournisseur::STATUS_ACCEPTED) {
2647  if ($usercanorder) {
2648  print '<a class="butActionDelete" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&amp;action=cancel">'.$langs->trans("CancelOrder").'</a>';
2649  }
2650  }
2651 
2652  // Delete
2653  if (!empty($usercandelete)) {
2654  if ($hasreception) {
2655  print '<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans("ReceptionExist").'">'.$langs->trans("Delete").'</a>';
2656  } else {
2657  print '<a class="butActionDelete" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken().'">'.$langs->trans("Delete").'</a>';
2658  }
2659  }
2660  }
2661 
2662  print "</div>";
2663  }
2664 
2665  if ($usercanorder && $object->statut == CommandeFournisseur::STATUS_ACCEPTED && $action == 'createorder') {
2666  // Set status to ordered (action=commande)
2667  print '<!-- form to record supplier order -->'."\n";
2668  print '<form name="commande" id="makeorder" action="card.php?id='.$object->id.'&amp;action=commande" method="POST">';
2669 
2670  print '<input type="hidden" name="token" value="'.newToken().'">';
2671  print '<input type="hidden" name="action" value="commande">';
2672  print load_fiche_titre($langs->trans("ToOrder"), '', '');
2673  print '<table class="noborder centpercent">';
2674  //print '<tr class="liste_titre"><td colspan="2">'.$langs->trans("ToOrder").'</td></tr>';
2675  print '<tr><td class="fieldrequired">'.$langs->trans("OrderDate").'</td><td>';
2676  $date_com = dol_mktime(GETPOST('rehour', 'int'), GETPOST('remin', 'int'), GETPOST('resec', 'int'), GETPOST('remonth', 'int'), GETPOST('reday', 'int'), GETPOST('reyear', 'int'));
2677  print $form->selectDate($date_com ?: '', '', 0, 0, '', "commande", 1, 1);
2678  print '</td></tr>';
2679 
2680  // Force mandatory order method
2681  print '<tr><td class="fieldrequired">'.$langs->trans("OrderMode").'</td><td>';
2682  $formorder->selectInputMethod(GETPOST('methodecommande'), "methodecommande", 1);
2683  print '</td></tr>';
2684 
2685  print '<tr><td>'.$langs->trans("Comment").'</td><td><input class="quatrevingtpercent" type="text" name="comment" value="'.GETPOST('comment').'"></td></tr>';
2686 
2687  print '<tr><td class="center" colspan="2">';
2688  print '<input type="submit" name="makeorder" class="button" value="'.$langs->trans("ToOrder").'">';
2689  print ' &nbsp; &nbsp; ';
2690  print '<input type="submit" name="cancel" class="button button-cancel" value="'.$langs->trans("Cancel").'">';
2691  print '</td></tr>';
2692  print '</table>';
2693 
2694  print '</form>';
2695  print "<br>";
2696  }
2697 
2698  // Select mail models is same action as presend
2699  if (GETPOST('modelselected')) {
2700  $action = 'presend';
2701  }
2702 
2703  if ($action != 'createorder' && $action != 'presend' ) {
2704  print '<div class="fichecenter"><div class="fichehalfleft">';
2705 
2706  // Generated documents
2707  $objref = dol_sanitizeFileName($object->ref);
2708  $file = $conf->fournisseur->dir_output.'/commande/'.$objref.'/'.$objref.'.pdf';
2709  $relativepath = $objref.'/'.$objref.'.pdf';
2710  $filedir = $conf->fournisseur->dir_output.'/commande/'.$objref;
2711  $urlsource = $_SERVER["PHP_SELF"]."?id=".$object->id;
2712  $genallowed = $usercanread;
2713  $delallowed = $usercancreate;
2714  $modelpdf = (!empty($object->model_pdf) ? $object->model_pdf : (empty($conf->global->COMMANDE_SUPPLIER_ADDON_PDF) ? '' : $conf->global->COMMANDE_SUPPLIER_ADDON_PDF));
2715 
2716  print $formfile->showdocuments('commande_fournisseur', $objref, $filedir, $urlsource, $genallowed, $delallowed, $modelpdf, 1, 0, 0, 0, 0, '', '', '', $object->thirdparty->default_lang, '', $object);
2717  $somethingshown = $formfile->numoffiles;
2718 
2719  // Show links to link elements
2720  $linktoelem = $form->showLinkToObjectBlock($object, null, array('supplier_order', 'order_supplier'));
2721  $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
2722 
2723  print '</div><div class="fichehalfright">';
2724 
2725  if ($action == 'classifyreception') {
2726  if ($usercanreceive && ($object->statut == CommandeFournisseur::STATUS_ORDERSENT || $object->statut == CommandeFournisseur::STATUS_RECEIVED_PARTIALLY)) {
2727  // Set status to received (action=livraison)
2728  print '<!-- form to record purchase order received -->'."\n";
2729  print '<form id="classifyreception" action="card.php?id='.$object->id.'" method="post">';
2730  print '<input type="hidden" name="token" value="'.newToken().'">';
2731  print '<input type="hidden" name="action" value="livraison">';
2732  print load_fiche_titre($langs->trans("Receive"), '', '');
2733 
2734  print '<table class="noborder centpercent">';
2735  //print '<tr class="liste_titre"><td colspan="2">'.$langs->trans("Receive").'</td></tr>';
2736  print '<tr><td>'.$langs->trans("DeliveryDate").'</td><td>';
2737  $datepreselected = dol_now();
2738  print $form->selectDate($datepreselected, '', 1, 1, '', "commande", 1, 1);
2739  print "</td></tr>\n";
2740 
2741  print '<tr><td class="fieldrequired">'.$langs->trans("Delivery")."</td><td>\n";
2742  $liv = array();
2743  $liv[''] = '&nbsp;';
2744  $liv['tot'] = $langs->trans("CompleteOrNoMoreReceptionExpected");
2745  $liv['par'] = $langs->trans("PartialWoman");
2746  $liv['nev'] = $langs->trans("NeverReceived");
2747  $liv['can'] = $langs->trans("Canceled");
2748 
2749  print $form->selectarray("type", $liv);
2750 
2751  print '</td></tr>';
2752  print '<tr><td>'.$langs->trans("Comment").'</td><td><input class="quatrevingtpercent" type="text" name="comment"></td></tr>';
2753  print '<tr><td class="center" colspan="2">';
2754  print '<input type="submit" name="receive" class="button" value="'.$langs->trans("Receive").'">';
2755  print ' &nbsp; &nbsp; ';
2756  print '<input type="submit" name="cancel" class="button button-cancel" value="'.$langs->trans("Cancel").'">';
2757  print '</td></tr>';
2758  print "</table>\n";
2759  print "</form>\n";
2760  print "<br>";
2761  }
2762  }
2763 
2764  // List of actions on element
2765  include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
2766  $formactions = new FormActions($db);
2767  $somethingshown = $formactions->showactions($object, 'order_supplier', $socid, 1, 'listaction'.($genallowed ? 'largetitle' : ''));
2768 
2769  print '</div></div>';
2770  }
2771 
2772  /*
2773  * Action webservice
2774  */
2775  if ($action == 'webservice' && GETPOST('mode', 'alpha') != "send" && !GETPOST('cancel', 'alpha')) {
2776  $mode = GETPOST('mode', 'alpha');
2777  $ws_url = $object->thirdparty->webservices_url;
2778  $ws_key = $object->thirdparty->webservices_key;
2779  $ws_user = GETPOST('ws_user', 'alpha');
2780  $ws_password = GETPOST('ws_password', 'alpha');
2781 
2782  // NS and Authentication parameters
2783  $ws_ns = 'http://www.dolibarr.org/ns/';
2784  $ws_authentication = array(
2785  'dolibarrkey'=>$ws_key,
2786  'sourceapplication'=>'DolibarrWebServiceClient',
2787  'login'=>$ws_user,
2788  'password'=>$ws_password,
2789  'entity'=>''
2790  );
2791 
2792  print load_fiche_titre($langs->trans('CreateRemoteOrder'), '');
2793 
2794  //Is everything filled?
2795  if (empty($ws_url) || empty($ws_key)) {
2796  setEventMessages($langs->trans("ErrorWebServicesFieldsRequired"), null, 'errors');
2797  $mode = "init";
2798  $error_occurred = true; //Don't allow to set the user/pass if thirdparty fields are not filled
2799  } elseif ($mode != "init" && (empty($ws_user) || empty($ws_password))) {
2800  setEventMessages($langs->trans("ErrorFieldsRequired"), null, 'errors');
2801  $mode = "init";
2802  }
2803 
2804  if ($mode == "init") {
2805  //Table/form header
2806  print '<table class="border centpercent">';
2807  print '<form action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'" method="post">';
2808  print '<input type="hidden" name="token" value="'.newToken().'">';
2809  print '<input type="hidden" name="action" value="webservice">';
2810  print '<input type="hidden" name="mode" value="check">';
2811 
2812  if ($error_occurred) {
2813  print "<br>".$langs->trans("ErrorOccurredReviseAndRetry")."<br>";
2814  print '<input class="button button-cancel" type="submit" id="cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
2815  } else {
2816  // Webservice url
2817  print '<tr><td>'.$langs->trans("WebServiceURL").'</td><td colspan="3">'.dol_print_url($ws_url).'</td></tr>';
2818  //Remote User
2819  print '<tr><td>'.$langs->trans("User").'</td><td><input class="width100" type="text" name="ws_user"></td></tr>';
2820  //Remote Password
2821  print '<tr><td>'.$langs->trans("Password").'</td><td><input class="width100" type="text" name="ws_password"></td></tr>';
2822  //Submit button
2823  print '<tr><td class="center" colspan="2">';
2824  print '<input type="submit" class="button" id="ws_submit" name="ws_submit" value="'.$langs->trans("CreateRemoteOrder").'">';
2825  print ' &nbsp; &nbsp; ';
2826  //Cancel button
2827  print '<input class="button button-cancel" type="submit" id="cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
2828  print '</td></tr>';
2829  }
2830 
2831  //End table/form
2832  print '</form>';
2833  print '</table>';
2834  } elseif ($mode == "check") {
2835  $ws_entity = '';
2836  $ws_thirdparty = '';
2837  $error_occurred = false;
2838 
2839  //Create SOAP client and connect it to user
2840  $soapclient_user = new nusoap_client($ws_url."/webservices/server_user.php");
2841  $soapclient_user->soap_defencoding = 'UTF-8';
2842  $soapclient_user->decodeUTF8(false);
2843 
2844  //Get the thirdparty associated to user
2845  $ws_parameters = array('authentication'=>$ws_authentication, 'id' => '', 'ref'=>$ws_user);
2846  $result_user = $soapclient_user->call("getUser", $ws_parameters, $ws_ns, '');
2847  $user_status_code = $result_user["result"]["result_code"];
2848 
2849  if ($user_status_code == "OK") {
2850  //Fill the variables
2851  $ws_entity = $result_user["user"]["entity"];
2852  $ws_authentication['entity'] = $ws_entity;
2853  $ws_thirdparty = $result_user["user"]["fk_thirdparty"];
2854  if (empty($ws_thirdparty)) {
2855  setEventMessages($langs->trans("RemoteUserMissingAssociatedSoc"), null, 'errors');
2856  $error_occurred = true;
2857  } else {
2858  //Create SOAP client and connect it to product/service
2859  $soapclient_product = new nusoap_client($ws_url."/webservices/server_productorservice.php");
2860  $soapclient_product->soap_defencoding = 'UTF-8';
2861  $soapclient_product->decodeUTF8(false);
2862 
2863  // Iterate each line and get the reference that uses the supplier of that product/service
2864  $i = 0;
2865  foreach ($object->lines as $line) {
2866  $i = $i + 1;
2867  $ref_supplier = $line->ref_supplier;
2868  $line_id = $i."º) ".$line->product_ref.": ";
2869  if (empty($ref_supplier)) {
2870  continue;
2871  }
2872  $ws_parameters = array('authentication' => $ws_authentication, 'id' => '', 'ref' => $ref_supplier);
2873  $result_product = $soapclient_product->call("getProductOrService", $ws_parameters, $ws_ns, '');
2874  if (!$result_product) {
2875  setEventMessages($line_id.$langs->trans("SOAPError")." ".$soapclient_product->error_str." - ".$soapclient_product->response, null, 'errors');
2876  $error_occurred = true;
2877  break;
2878  }
2879 
2880  // Check the result code
2881  $status_code = $result_product["result"]["result_code"];
2882  if (empty($status_code)) { //No result, check error str
2883  setEventMessages($langs->trans("SOAPError")." '".$soapclient_order->error_str."'", null, 'errors');
2884  } elseif ($status_code != "OK") { //Something went wrong
2885  if ($status_code == "NOT_FOUND") {
2886  setEventMessages($line_id.$langs->trans("SupplierMissingRef")." '".$ref_supplier."'", null, 'warnings');
2887  } else {
2888  setEventMessages($line_id.$langs->trans("ResponseNonOK")." '".$status_code."' - '".$result_product["result"]["result_label"]."'", null, 'errors');
2889  $error_occurred = true;
2890  break;
2891  }
2892  }
2893 
2894 
2895  // Ensure that price is equal and warn user if it's not
2896  $supplier_price = price($result_product["product"]["price_net"]); //Price of client tab in supplier dolibarr
2897  $local_price = null; //Price of supplier as stated in product suppliers tab on this dolibarr, NULL if not found
2898 
2899  $product_fourn = new ProductFournisseur($db);
2900  $product_fourn_list = $product_fourn->list_product_fournisseur_price($line->fk_product);
2901  if (count($product_fourn_list) > 0) {
2902  foreach ($product_fourn_list as $product_fourn_line) {
2903  //Only accept the line where the supplier is the same at this order and has the same ref
2904  if ($product_fourn_line->fourn_id == $object->socid && $product_fourn_line->fourn_ref == $ref_supplier) {
2905  $local_price = price($product_fourn_line->fourn_price);
2906  }
2907  }
2908  }
2909 
2910  if ($local_price != null && $local_price != $supplier_price) {
2911  setEventMessages($line_id.$langs->trans("RemotePriceMismatch")." ".$supplier_price." - ".$local_price, null, 'warnings');
2912  }
2913 
2914  // Check if is in sale
2915  if (empty($result_product["product"]["status_tosell"])) {
2916  setEventMessages($line_id.$langs->trans("ProductStatusNotOnSellShort")." '".$ref_supplier."'", null, 'warnings');
2917  }
2918  }
2919  }
2920  } elseif ($user_status_code == "PERMISSION_DENIED") {
2921  setEventMessages($langs->trans("RemoteUserNotPermission"), null, 'errors');
2922  $error_occurred = true;
2923  } elseif ($user_status_code == "BAD_CREDENTIALS") {
2924  setEventMessages($langs->trans("RemoteUserBadCredentials"), null, 'errors');
2925  $error_occurred = true;
2926  } else {
2927  setEventMessages($langs->trans("ResponseNonOK")." '".$user_status_code."'", null, 'errors');
2928  $error_occurred = true;
2929  }
2930 
2931  //Form
2932  print '<form action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'" method="post">';
2933  print '<input type="hidden" name="token" value="'.newToken().'">';
2934  print '<input type="hidden" name="action" value="webservice">';
2935  print '<input type="hidden" name="mode" value="send">';
2936  print '<input type="hidden" name="ws_user" value="'.$ws_user.'">';
2937  print '<input type="hidden" name="ws_password" value="'.$ws_password.'">';
2938  print '<input type="hidden" name="ws_entity" value="'.$ws_entity.'">';
2939  print '<input type="hidden" name="ws_thirdparty" value="'.$ws_thirdparty.'">';
2940  if ($error_occurred) {
2941  print "<br>".$langs->trans("ErrorOccurredReviseAndRetry")."<br>";
2942  } else {
2943  print '<input type="submit" class="button" id="ws_submit" name="ws_submit" value="'.$langs->trans("Confirm").'">';
2944  print ' &nbsp; &nbsp; ';
2945  }
2946  print '<input class="button button-cancel" type="submit" id="cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
2947  print '</form>';
2948  }
2949  }
2950 
2951  // Presend form
2952  $modelmail = 'order_supplier_send';
2953  $defaulttopic = 'SendOrderRef';
2954  $diroutput = $conf->fournisseur->commande->dir_output;
2955  $autocopy = 'MAIN_MAIL_AUTOCOPY_SUPPLIER_ORDER_TO';
2956  $trackid = 'sord'.$object->id;
2957 
2958  include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php';
2959  }
2960 }
2961 
2962 // End of page
2963 llxFooter();
2964 $db->close();
if(GETPOST('button_removefilter_x', 'alpha')||GETPOST('button_removefilter.x', 'alpha')||GETPOST('button_removefilter', 'alpha')) if(GETPOST('button_search_x', 'alpha')||GETPOST('button_search.x', 'alpha')||GETPOST('button_search', 'alpha')) if($action=="save" &&empty($cancel)) $help_url
View.
Definition: agenda.php:118
if(preg_match('/set_([a-z0-9_\-]+)/i', $action, $reg)) if(preg_match('/del_([a-z0-9_\-]+)/i', $action, $reg)) if($action=='set') elseif($action=='specimen') elseif($action=='setmodel') elseif($action=='del') elseif($action=='setdoc') $formactions
View.
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Definition: wrapper.php:56
llxFooter()
Empty footer.
Definition: wrapper.php:70
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_ORDERSENT
Order sent, shipment on process.
Class to manage line orders.
Class to manage a WYSIWYG editor.
Class to manage standard extra fields.
Class to manage building of HTML components.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class to manage HTML output components for orders Before adding component here, check they are not in...
Class with static methods for building HTML components related to products Only components common to ...
Class to manage building of HTML components.
static getIdAndTxFromCode($dbs, $code, $date_document='')
Get id and rate of currency from code.
Class to manage notifications.
Class ProductCombination Used to represent a product combination.
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.
Definition: user.class.php:48
$parameters
Actions.
Definition: card.php:83
if(isModEnabled('facture') && $user->hasRight('facture', 'lire')) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') && $user->hasRight('don', 'lire')) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $sql
Social contributions to pay.
Definition: index.php:746
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
print *****$script_file(".$version.") pid c cd cd cd description as p label as s rowid
ordersupplier_prepare_head(CommandeFournisseur $object)
Prepare array with list of tabs.
Definition: fourn.lib.php:139
dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='rowid', $fieldref='ref', $morehtmlref='', $moreparam='', $nodbprefix=0, $morehtmlleft='', $morehtmlstatus='', $onlybanner=0, $morehtmlright='')
Show tab footer of a card.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_get_fiche_end($notab=0)
Return tab footer of a card.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
if(!function_exists('dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
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.
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...
dol_htmloutput_events($disabledoutputofmessages=0)
Print formated messages to output (Used to show messages on html output).
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_print_url($url, $target='_blank', $max=32, $withpicto=0, $morecss='float')
Show Url link.
get_localtax($vatrate, $local, $thirdparty_buyer="", $thirdparty_seller="", $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
isModEnabled($module)
Is Dolibarr module enabled.
img_edit($titlealt='default', $float=0, $other='')
Show logo editer/modifier fiche.
get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that return vat rate of a product line (according to seller, buyer and product vat rate) VAT...
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
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...
$formconfirm
if ($action == 'delbookkeepingyear') {
div float
Buy price without taxes.
Definition: style.css.php:926
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.