dolibarr  x.y.z
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  *
15  * This program is free software; you can redistribute it and/or modify
16  * it under the terms of the GNU General Public License as published by
17  * the Free Software Foundation; either version 2 of the License, or
18  * (at your option) any later version.
19  *
20  * This program is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23  * GNU General Public License for more details.
24  *
25  * You should have received a copy of the GNU General Public License
26  * along with this program. If not, see <https://www.gnu.org/licenses/>.
27  * or see https://www.gnu.org/
28  */
29 
37 // Load Dolibarr environment
38 require '../../main.inc.php';
39 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
40 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
41 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formorder.class.php';
42 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
43 require_once DOL_DOCUMENT_ROOT.'/core/lib/fourn.lib.php';
44 require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
45 require_once DOL_DOCUMENT_ROOT.'/core/modules/supplier_order/modules_commandefournisseur.php';
46 require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
47 require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.product.class.php';
48 
49 if (isModEnabled('supplier_proposal')) {
50  require_once DOL_DOCUMENT_ROOT.'/supplier_proposal/class/supplier_proposal.class.php';
51 }
52 if (isModEnabled("product")) {
53  require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
54 }
55 if (isModEnabled('project')) {
56  require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
57  require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
58 }
59 require_once NUSOAP_PATH.'/nusoap.php'; // Include SOAP
60 
61 if (isModEnabled('variants')) {
62  require_once DOL_DOCUMENT_ROOT.'/variants/class/ProductCombination.class.php';
63 }
64 
65 
66 // Load translation files required by the page
67 $langs->loadLangs(array('admin', 'orders', 'sendings', 'companies', 'bills', 'propal', 'receptions', 'supplier_proposal', 'deliveries', 'products', 'stocks', 'productbatch'));
68 if (isModEnabled('incoterm')) {
69  $langs->load('incoterm');
70 }
71 
72 
73 // Get Parameters
74 $id = GETPOST('id', 'int');
75 $ref = GETPOST('ref', 'alpha');
76 $action = GETPOST('action', 'alpha');
77 $confirm = GETPOST('confirm', 'alpha');
78 $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'purchaseordercard'; // To manage different context of search
79 
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', $id, 'commande_fournisseur', 'commande', 'fk_soc', 'rowid', $isdraft);
138 
139 // Common permissions
140 $usercanread = ($user->rights->fournisseur->commande->lire || $user->rights->supplier_order->lire);
141 $usercancreate = ($user->rights->fournisseur->commande->creer || $user->rights->supplier_order->creer);
142 $usercandelete = (($user->rights->fournisseur->commande->supprimer || $user->rights->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) && !empty($user->rights->fournisseur->supplier_order_advance->validate)));
146 
147 // Additional area permissions
148 $usercanapprove = !empty($user->rights->fournisseur->commande->approuver) ? $user->rights->fournisseur->commande->approuver : 0;
149 $usercanapprovesecond = !empty($user->rights->fournisseur->commande->approve2) ? $user->rights->fournisseur->commande->approve2 : 0;
150 $usercanorder = !empty($user->rights->fournisseur->commande->commander) ? $user->rights->fournisseur->commande->commander : 0;
151 if (empty($conf->reception->enabled)) {
152  $usercanreceive = $user->rights->fournisseur->commande->receptionner;
153 } else {
154  $usercanreceive = $user->rights->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('price_ht_devise') != '') {
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('price_ttc_devise') != '') {
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('price_ht_devise') != '') {
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  dol_print_error($db, $result);
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 = $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  $db->commit();
920 
921  header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id);
922  exit;
923  } else {
924  $db->rollback();
925  }
926  }
927 
928  // Validate
929  if ($action == 'confirm_valid' && $confirm == 'yes' && $usercanvalidate) {
930  $db->begin();
931 
932  $object->date_commande = dol_now();
933  $result = $object->valid($user);
934  if ($result >= 0) {
935  // Define output language
936  if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
937  $outputlangs = $langs;
938  $newlang = '';
939  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
940  $newlang = GETPOST('lang_id', 'aZ09');
941  }
942  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
943  $newlang = $object->thirdparty->default_lang;
944  }
945  if (!empty($newlang)) {
946  $outputlangs = new Translate("", $conf);
947  $outputlangs->setDefaultLang($newlang);
948  }
949  $model = $object->model_pdf;
950  $ret = $object->fetch($id); // Reload to get new records
951 
952  $result = $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
953  if ($result < 0) {
954  $error++;
955  dol_print_error($db, $result);
956  }
957  }
958  } else {
959  $error++;
960  setEventMessages($object->error, $object->errors, 'errors');
961  }
962 
963  // If we have permission, and if we don't need to provide the idwarehouse, we go directly on approved step
964  if (!$error && empty($conf->global->SUPPLIER_ORDER_NO_DIRECT_APPROVE) && $usercanapprove && !(!empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER) && $object->hasProductsOrServices(1))) {
965  $action = 'confirm_approve'; // can make standard or first level approval also if permission is set
966  }
967 
968  if (!$error) {
969  $db->commit();
970  } else {
971  $db->rollback();
972  }
973  }
974 
975  if (($action == 'confirm_approve' || $action == 'confirm_approve2') && $confirm == 'yes' && $usercanapprove) {
976  $db->begin();
977 
978  $idwarehouse = GETPOST('idwarehouse', 'int');
979 
980  $qualified_for_stock_change = 0;
981  if (empty($conf->global->STOCK_SUPPORTS_SERVICES)) {
982  $qualified_for_stock_change = $object->hasProductsOrServices(2);
983  } else {
984  $qualified_for_stock_change = $object->hasProductsOrServices(1);
985  }
986 
987  // Check parameters
988  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
989  if (!$idwarehouse || $idwarehouse == -1) {
990  $error++;
991  setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("Warehouse")), null, 'errors');
992  $action = '';
993  }
994  }
995 
996  if (!$error) {
997  $result = $object->approve($user, $idwarehouse, ($action == 'confirm_approve2' ? 1 : 0));
998  if ($result > 0) {
999  if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
1000  $outputlangs = $langs;
1001  $newlang = '';
1002  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
1003  $newlang = GETPOST('lang_id', 'aZ09');
1004  }
1005  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
1006  $newlang = $object->thirdparty->default_lang;
1007  }
1008  if (!empty($newlang)) {
1009  $outputlangs = new Translate("", $conf);
1010  $outputlangs->setDefaultLang($newlang);
1011  }
1012  $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1013  }
1014  } else {
1015  $error++;
1016  setEventMessages($object->error, $object->errors, 'errors');
1017  }
1018  }
1019 
1020  if (!$error) {
1021  $db->commit();
1022 
1023  header("Location: ".$_SERVER["PHP_SELF"]."?id=".$object->id);
1024  exit;
1025  } else {
1026  $db->rollback();
1027  }
1028  }
1029 
1030  if ($action == 'confirm_refuse' && $confirm == 'yes' && $usercanapprove) {
1031  if (GETPOST('refuse_note')) {
1032  $object->refuse_note = GETPOST('refuse_note');
1033  }
1034  $result = $object->refuse($user);
1035  if ($result > 0) {
1036  header("Location: ".$_SERVER["PHP_SELF"]."?id=".$object->id);
1037  exit;
1038  } else {
1039  setEventMessages($object->error, $object->errors, 'errors');
1040  }
1041  }
1042 
1043  // Force mandatory order method
1044  if ($action == 'commande') {
1045  $methodecommande = GETPOST('methodecommande', 'int');
1046 
1047  if ($cancel) {
1048  $action = '';
1049  } elseif ($methodecommande <= 0) {
1050  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("OrderMode")), null, 'errors');
1051  $action = 'makeorder';
1052  }
1053  }
1054 
1055  if ($action == 'confirm_commande' && $confirm == 'yes' && $usercanorder) {
1056  $db->begin();
1057 
1058  $result = $object->commande($user, GETPOST("datecommande"), GETPOST("methode", 'int'), GETPOST('comment', 'alphanohtml'));
1059  if ($result > 0) {
1060  if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
1061  $outputlangs = $langs;
1062  $newlang = '';
1063  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
1064  $newlang = GETPOST('lang_id', 'aZ09');
1065  }
1066  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
1067  $newlang = $object->thirdparty->default_lang;
1068  }
1069  if (!empty($newlang)) {
1070  $outputlangs = new Translate("", $conf);
1071  $outputlangs->setDefaultLang($newlang);
1072  }
1073  $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1074  }
1075  $action = '';
1076  } else {
1077  $error++;
1078  setEventMessages($object->error, $object->errors, 'errors');
1079  }
1080 
1081  if (!$error) {
1082  $db->commit();
1083 
1084  header("Location: ".$_SERVER["PHP_SELF"]."?id=".$object->id);
1085  exit;
1086  } else {
1087  $db->rollback();
1088  }
1089  }
1090 
1091 
1092  if ($action == 'confirm_delete' && $confirm == 'yes' && $usercandelete) {
1093  $result = $object->delete($user);
1094  if ($result > 0) {
1095  header("Location: ".DOL_URL_ROOT.'/fourn/commande/list.php?restore_lastsearch_values=1');
1096  exit;
1097  } else {
1098  setEventMessages($object->error, $object->errors, 'errors');
1099  }
1100  }
1101 
1102  // Action clone object
1103  if ($action == 'confirm_clone' && $confirm == 'yes' && $usercancreate) {
1104  if (1 == 0 && !GETPOST('clone_content') && !GETPOST('clone_receivers')) {
1105  setEventMessages($langs->trans("NoCloneOptionsSpecified"), null, 'errors');
1106  } else {
1107  if ($object->id > 0) {
1108  $orig = clone $object;
1109 
1110  $result = $object->createFromClone($user, $socid);
1111  if ($result > 0) {
1112  header("Location: ".$_SERVER['PHP_SELF'].'?id='.$result);
1113  exit;
1114  } else {
1115  setEventMessages($object->error, $object->errors, 'errors');
1116  $object = $orig;
1117  $action = '';
1118  }
1119  }
1120  }
1121  }
1122 
1123  // Set status of reception (complete, partial, ...)
1124  if ($action == 'livraison' && $usercanreceive) {
1125  if ($cancel) {
1126  $action = '';
1127  } else {
1128  $db->begin();
1129 
1130  if (GETPOST("type") != '') {
1131  $date_liv = dol_mktime(GETPOST('rehour'), GETPOST('remin'), GETPOST('resec'), GETPOST("remonth"), GETPOST("reday"), GETPOST("reyear"));
1132 
1133  $result = $object->Livraison($user, $date_liv, GETPOST("type"), GETPOST("comment")); // GETPOST("type") is 'tot', 'par', 'nev', 'can'
1134  if ($result > 0) {
1135  $langs->load("deliveries");
1136  setEventMessages($langs->trans("DeliveryStateSaved"), null);
1137  $action = '';
1138  } elseif ($result == -3) {
1139  $error++;
1140  setEventMessages($object->error, $object->errors, 'errors');
1141  } else {
1142  $error++;
1143  setEventMessages($object->error, $object->errors, 'errors');
1144  }
1145  } else {
1146  $error++;
1147  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Delivery")), null, 'errors');
1148  }
1149 
1150  if (!$error) {
1151  $db->commit();
1152  } else {
1153  $db->rollback();
1154  }
1155  }
1156  }
1157 
1158  if ($action == 'confirm_cancel' && $confirm == 'yes' && $usercanorder) {
1159  if (GETPOST('cancel_note')) {
1160  $object->cancel_note = GETPOST('cancel_note');
1161  }
1162  $result = $object->cancel($user);
1163  if ($result > 0) {
1164  header("Location: ".$_SERVER["PHP_SELF"]."?id=".$object->id);
1165  exit;
1166  } else {
1167  setEventMessages($object->error, $object->errors, 'errors');
1168  }
1169  }
1170 
1171  // Actions when printing a doc from card
1172  include DOL_DOCUMENT_ROOT.'/core/actions_printing.inc.php';
1173 
1174  // Actions to send emails
1175  $triggersendname = 'ORDER_SUPPLIER_SENTBYMAIL';
1176  $autocopy = 'MAIN_MAIL_AUTOCOPY_SUPPLIER_ORDER_TO';
1177  $trackid = 'sord'.$object->id;
1178  include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
1179 
1180  // Actions to build doc
1181  $upload_dir = $conf->fournisseur->commande->dir_output;
1182  $permissiontoadd = $usercancreate;
1183  include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
1184 
1185 
1186  if ($action == 'update_extras') {
1187  $object->oldcopy = dol_clone($object);
1188 
1189  // Fill array 'array_options' with data from add form
1190  $ret = $extrafields->setOptionalsFromPost(null, $object, GETPOST('attribute', 'restricthtml'));
1191  if ($ret < 0) {
1192  $error++;
1193  }
1194 
1195  if (!$error) {
1196  // Actions on extra fields
1197  if (!$error) {
1198  $result = $object->insertExtraFields('ORDER_SUPPLIER_MODIFY');
1199  if ($result < 0) {
1200  $error++;
1201  setEventMessages($object->error, $object->errors, 'errors');
1202  }
1203  }
1204  }
1205 
1206  if ($error) {
1207  $action = 'edit_extras';
1208  }
1209  }
1210 
1211  /*
1212  * Create an order
1213  */
1214  if ($action == 'add' && $usercancreate) {
1215  $error = 0;
1216  $selectedLines = GETPOST('toselect', 'array');
1217  if ($socid < 1) {
1218  setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentities('Supplier')), null, 'errors');
1219  $action = 'create';
1220  $error++;
1221  }
1222 
1223  if (!$error) {
1224  $db->begin();
1225 
1226  // Creation commande
1227  $object->ref_supplier = GETPOST('refsupplier');
1228  $object->socid = $socid;
1229  $object->cond_reglement_id = GETPOST('cond_reglement_id', 'int');
1230  $object->mode_reglement_id = GETPOST('mode_reglement_id', 'int');
1231  $object->fk_account = GETPOST('fk_account', 'int');
1232  $object->note_private = GETPOST('note_private', 'restricthtml');
1233  $object->note_public = GETPOST('note_public', 'restricthtml');
1234  $object->date_livraison = $datelivraison; // deprecated
1235  $object->delivery_date = $datelivraison;
1236  $object->fk_incoterms = GETPOST('incoterm_id', 'int');
1237  $object->location_incoterms = GETPOST('location_incoterms', 'alpha');
1238  $object->multicurrency_code = GETPOST('multicurrency_code', 'alpha');
1239  $object->multicurrency_tx = price2num(GETPOST('originmulticurrency_tx', 'alpha'));
1240  $object->fk_project = GETPOST('projectid', 'int');
1241 
1242  // Fill array 'array_options' with data from add form
1243  if (!$error) {
1244  $ret = $extrafields->setOptionalsFromPost(null, $object);
1245  if ($ret < 0) {
1246  $error++;
1247  }
1248  }
1249 
1250  if (!$error) {
1251  // If creation from another object of another module (Example: origin=propal, originid=1)
1252  if (!empty($origin) && !empty($originid)) {
1253  $element = $subelement = $origin;
1254  $classname = ucfirst($subelement);
1255  if ($origin == 'propal' || $origin == 'proposal') {
1256  $element = 'comm/propal'; $subelement = 'propal';
1257  $classname = 'Propal';
1258  }
1259  if ($origin == 'order' || $origin == 'commande') {
1260  $element = $subelement = 'commande';
1261  $classname = 'Commande';
1262  }
1263  if ($origin == 'supplier_proposal') {
1264  $classname = 'SupplierProposal';
1265  $element = 'supplier_proposal';
1266  $subelement = 'supplier_proposal';
1267  }
1268 
1269  $object->origin = $origin;
1270  $object->origin_id = $originid;
1271 
1272  // Possibility to add external linked objects with hooks
1273  $object->linked_objects [$object->origin] = $object->origin_id;
1274  $other_linked_objects = GETPOST('other_linked_objects', 'array');
1275  if (!empty($other_linked_objects)) {
1276  $object->linked_objects = array_merge($object->linked_objects, $other_linked_objects);
1277  }
1278 
1279  $id = $object->create($user);
1280  if ($id > 0) {
1281  dol_include_once('/'.$element.'/class/'.$subelement.'.class.php');
1282 
1283  $srcobject = new $classname($db);
1284 
1285  dol_syslog("Try to find source object origin=".$object->origin." originid=".$object->origin_id." to add lines");
1286  $result = $srcobject->fetch($object->origin_id);
1287  if ($result > 0) {
1288  $tmpdate = ($srcobject->delivery_date ? $srcobject->delivery_date : $srcobject->date_livraison);
1289  $object->setDeliveryDate($user, $tmpdate);
1290  $object->set_id_projet($user, $srcobject->fk_project);
1291 
1292  $lines = $srcobject->lines;
1293  if (empty($lines) && method_exists($srcobject, 'fetch_lines')) {
1294  $srcobject->fetch_lines();
1295  $lines = $srcobject->lines;
1296  }
1297 
1298  $fk_parent_line = 0;
1299  $num = count($lines);
1300 
1301  for ($i = 0; $i < $num; $i++) {
1302  if (empty($lines[$i]->subprice) || $lines[$i]->qty <= 0 || !in_array($lines[$i]->id, $selectedLines)) {
1303  continue;
1304  }
1305 
1306  $label = (!empty($lines[$i]->label) ? $lines[$i]->label : '');
1307  $desc = (!empty($lines[$i]->desc) ? $lines[$i]->desc : $lines[$i]->product_desc);
1308  $product_type = (!empty($lines[$i]->product_type) ? $lines[$i]->product_type : 0);
1309 
1310  // Reset fk_parent_line for no child products and special product
1311  if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) {
1312  $fk_parent_line = 0;
1313  }
1314 
1315  // Extrafields
1316  if (method_exists($lines[$i], 'fetch_optionals')) { // For avoid conflicts if
1317  $lines[$i]->fetch_optionals();
1318  $array_option = $lines[$i]->array_options;
1319  }
1320 
1321  $ref_supplier = '';
1322  $product_fourn_price_id = 0;
1323  if ($origin == "commande") {
1324  $productsupplier = new ProductFournisseur($db);
1325  $result = $productsupplier->find_min_price_product_fournisseur($lines[$i]->fk_product, $lines[$i]->qty, $srcobject->socid);
1326  if ($result > 0) {
1327  $ref_supplier = $productsupplier->ref_supplier;
1328  $product_fourn_price_id = $productsupplier->product_fourn_price_id;
1329  }
1330  } else {
1331  $ref_supplier = $lines[$i]->ref_fourn;
1332  $product_fourn_price_id = 0;
1333  }
1334 
1335  $tva_tx = $lines[$i]->tva_tx;
1336 
1337  if ($origin == "commande") {
1338  $soc = new societe($db);
1339  $soc->fetch($socid);
1340  $tva_tx = get_default_tva($soc, $mysoc, $lines[$i]->fk_product, $product_fourn_price_id);
1341  }
1342 
1343  $object->special_code = $lines[$i]->special_code;
1344 
1345  $result = $object->addline(
1346  $desc,
1347  $lines[$i]->subprice,
1348  $lines[$i]->qty,
1349  $tva_tx,
1350  $lines[$i]->localtax1_tx,
1351  $lines[$i]->localtax2_tx,
1352  $lines[$i]->fk_product > 0 ? $lines[$i]->fk_product : 0,
1353  $product_fourn_price_id,
1354  $ref_supplier,
1355  $lines[$i]->remise_percent,
1356  'HT',
1357  0,
1358  $lines[$i]->product_type,
1359  '',
1360  '',
1361  null,
1362  null,
1363  $array_option,
1364  $lines[$i]->fk_unit,
1365  0,
1366  $element,
1367  !empty($lines[$i]->id) ? $lines[$i]->id : $lines[$i]->rowid
1368  );
1369 
1370  if ($result < 0) {
1371  $error++;
1372  break;
1373  }
1374 
1375  // Defined the new fk_parent_line
1376  if ($result > 0 && $lines[$i]->product_type == 9) {
1377  $fk_parent_line = $result;
1378  }
1379  }
1380 
1381  // Add link between elements
1382 
1383 
1384  // Hooks
1385  $parameters = array('objFrom' => $srcobject);
1386  $reshook = $hookmanager->executeHooks('createFrom', $parameters, $object, $action); // Note that $action and $object may have been
1387 
1388  if ($reshook < 0) {
1389  $error++;
1390  }
1391  } else {
1392  setEventMessages($srcobject->error, $srcobject->errors, 'errors');
1393  $error++;
1394  }
1395  } else {
1396  setEventMessages($object->error, $object->errors, 'errors');
1397  $error++;
1398  }
1399  } else {
1400  $id = $object->create($user);
1401  if ($id < 0) {
1402  $error++;
1403  setEventMessages($object->error, $object->errors, 'errors');
1404  }
1405  }
1406  }
1407 
1408  if ($error) {
1409  $langs->load("errors");
1410  $db->rollback();
1411  $action = 'create';
1412  $_GET['socid'] = $_POST['socid'];
1413  } else {
1414  $db->commit();
1415  header("Location: ".$_SERVER['PHP_SELF']."?id=".urlencode($id));
1416  exit;
1417  }
1418  }
1419  }
1420 
1421  if ($action == 'webservice' && GETPOST('mode', 'alpha') == "send" && !GETPOST('cancel', 'alpha')) {
1422  $ws_url = $object->thirdparty->webservices_url;
1423  $ws_key = $object->thirdparty->webservices_key;
1424  $ws_user = GETPOST('ws_user', 'alpha');
1425  $ws_password = GETPOST('ws_password', 'alpha');
1426  $ws_entity = GETPOST('ws_entity', 'int');
1427  $ws_thirdparty = GETPOST('ws_thirdparty', 'int');
1428 
1429  // NS and Authentication parameters
1430  $ws_ns = 'http://www.dolibarr.org/ns/';
1431  $ws_authentication = array(
1432  'dolibarrkey'=>$ws_key,
1433  'sourceapplication'=>'DolibarrWebServiceClient',
1434  'login'=>$ws_user,
1435  'password'=>$ws_password,
1436  'entity'=>$ws_entity
1437  );
1438 
1439  //Is sync supplier web services module activated? and everything filled?
1440  if (empty($conf->syncsupplierwebservices->enabled)) {
1441  setEventMessages($langs->trans("WarningModuleNotActive", $langs->transnoentities("Module2650Name")), null, 'mesgs');
1442  } elseif (empty($ws_url) || empty($ws_key)) {
1443  setEventMessages($langs->trans("ErrorWebServicesFieldsRequired"), null, 'errors');
1444  } elseif (empty($ws_user) || empty($ws_password) || empty($ws_thirdparty)) {
1445  setEventMessages($langs->trans("ErrorFieldsRequired"), null, 'errors');
1446  } else {
1447  //Create SOAP client and connect it to order
1448  $soapclient_order = new nusoap_client($ws_url."/webservices/server_order.php");
1449  $soapclient_order->soap_defencoding = 'UTF-8';
1450  $soapclient_order->decodeUTF8(false);
1451 
1452  //Create SOAP client and connect it to product/service
1453  $soapclient_product = new nusoap_client($ws_url."/webservices/server_productorservice.php");
1454  $soapclient_product->soap_defencoding = 'UTF-8';
1455  $soapclient_product->decodeUTF8(false);
1456 
1457  //Prepare the order lines from order
1458  $order_lines = array();
1459  foreach ($object->lines as $line) {
1460  $ws_parameters = array('authentication' => $ws_authentication, 'id' => '', 'ref' => $line->ref_supplier);
1461  $result_product = $soapclient_product->call("getProductOrService", $ws_parameters, $ws_ns, '');
1462 
1463  if ($result_product["result"]["result_code"] == "OK") {
1464  $order_lines[] = array(
1465  'desc' => $line->product_desc,
1466  'type' => $line->product_type,
1467  'product_id' => $result_product["product"]["id"],
1468  'vat_rate' => $line->tva_tx,
1469  'qty' => $line->qty,
1470  'price' => $line->price,
1471  'unitprice' => $line->subprice,
1472  'total_net' => $line->total_ht,
1473  'total_vat' => $line->total_tva,
1474  'total' => $line->total_ttc,
1475  'date_start' => $line->date_start,
1476  'date_end' => $line->date_end,
1477  );
1478  }
1479  }
1480 
1481  //Prepare the order header
1482  $order = array(
1483  'thirdparty_id' => $ws_thirdparty,
1484  'date' => dol_print_date(dol_now(), 'dayrfc'),
1485  'total_net' => $object->total_ht,
1486  'total_var' => $object->total_tva,
1487  'total' => $object->total_ttc,
1488  'lines' => $order_lines
1489  );
1490 
1491  $ws_parameters = array('authentication'=>$ws_authentication, 'order' => $order);
1492  $result_order = $soapclient_order->call("createOrder", $ws_parameters, $ws_ns, '');
1493 
1494  if (empty($result_order["result"]["result_code"])) { //No result, check error str
1495  setEventMessages($langs->trans("SOAPError")." '".$soapclient_order->error_str."'", null, 'errors');
1496  } elseif ($result_order["result"]["result_code"] != "OK") { //Something went wrong
1497  setEventMessages($langs->trans("SOAPError")." '".$result_order["result"]["result_code"]."' - '".$result_order["result"]["result_label"]."'", null, 'errors');
1498  } else {
1499  setEventMessages($langs->trans("RemoteOrderRef")." ".$result_order["ref"], null, 'mesgs');
1500  }
1501  }
1502  }
1503 
1504  if (!empty($conf->global->MAIN_DISABLE_CONTACTS_TAB) && $usercancreate) {
1505  if ($action == 'addcontact') {
1506  if ($object->id > 0) {
1507  $contactid = (GETPOST('userid') ? GETPOST('userid') : GETPOST('contactid'));
1508  $typeid = (GETPOST('typecontact') ? GETPOST('typecontact') : GETPOST('type'));
1509  $result = $object->add_contact($contactid, $typeid, GETPOST("source", 'aZ09'));
1510  }
1511 
1512  if ($result >= 0) {
1513  header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
1514  exit;
1515  } else {
1516  if ($object->error == 'DB_ERROR_RECORD_ALREADY_EXISTS') {
1517  $langs->load("errors");
1518  setEventMessages($langs->trans("ErrorThisContactIsAlreadyDefinedAsThisType"), null, 'errors');
1519  } else {
1520  setEventMessages($object->error, $object->errors, 'errors');
1521  }
1522  }
1523  } elseif ($action == 'swapstatut' && $object->id > 0) {
1524  // bascule du statut d'un contact
1525  $result = $object->swapContactStatus(GETPOST('ligne', 'int'));
1526  } elseif ($action == 'deletecontact' && $object->id > 0) {
1527  // Efface un contact
1528  $result = $object->delete_contact(GETPOST("lineid", 'int'));
1529 
1530  if ($result >= 0) {
1531  header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
1532  exit;
1533  } else {
1534  dol_print_error($db);
1535  }
1536  }
1537  }
1538 }
1539 
1540 
1541 /*
1542  * View
1543  */
1544 
1545 $form = new Form($db);
1546 $formfile = new FormFile($db);
1547 $formorder = new FormOrder($db);
1548 $productstatic = new Product($db);
1549 if (isModEnabled('project')) {
1550  $formproject = new FormProjets($db);
1551 }
1552 
1553 $title = $object->ref." - ".$langs->trans('Card');
1554 if ($action == 'create') {
1555  $title = $langs->trans("NewOrderSupplier");
1556 }
1557 $help_url = 'EN:Module_Suppliers_Orders|FR:CommandeFournisseur|ES:Módulo_Pedidos_a_proveedores';
1558 llxHeader('', $title, $help_url);
1559 
1560 $now = dol_now();
1561 
1562 if ($action == 'create') {
1563  print load_fiche_titre($langs->trans('NewOrderSupplier'), '', 'supplier_order');
1564 
1566 
1567  $currency_code = $conf->currency;
1568 
1569  $societe = '';
1570  if ($socid > 0) {
1571  $societe = new Societe($db);
1572  $societe->fetch($socid);
1573  }
1574 
1575  if (!empty($origin) && !empty($originid)) {
1576  // Parse element/subelement (ex: project_task)
1577  $element = $subelement = $origin;
1578  $classname = ucfirst($subelement);
1579  $regs = array();
1580  if (preg_match('/^([^_]+)_([^_]+)/i', $origin, $regs)) {
1581  $element = $regs[1];
1582  $subelement = $regs[2];
1583  }
1584 
1585  if ($origin == 'propal' || $origin == 'proposal') {
1586  $classname = 'Propal';
1587  $element = 'comm/propal'; $subelement = 'propal';
1588  }
1589  if ($origin == 'order' || $origin == 'commande') {
1590  $classname = 'Commande';
1591  $element = $subelement = 'commande';
1592  }
1593  if ($origin == 'supplier_proposal') {
1594  $classname = 'SupplierProposal';
1595  $element = 'supplier_proposal';
1596  $subelement = 'supplier_proposal';
1597  }
1598 
1599 
1600 
1601  dol_include_once('/'.$element.'/class/'.$subelement.'.class.php');
1602 
1603  $objectsrc = new $classname($db);
1604  $objectsrc->fetch($originid);
1605  if (empty($objectsrc->lines) && method_exists($objectsrc, 'fetch_lines')) {
1606  $objectsrc->fetch_lines();
1607  }
1608  $objectsrc->fetch_thirdparty();
1609 
1610  // Replicate extrafields
1611  $objectsrc->fetch_optionals();
1612  $object->array_options = $objectsrc->array_options;
1613 
1614  $projectid = (!empty($objectsrc->fk_project) ? $objectsrc->fk_project : '');
1615  $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client : '');
1616 
1617  $soc = $objectsrc->client;
1618  $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0));
1619  $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
1620  $fk_account = (!empty($objectsrc->fk_account) ? $objectsrc->fk_account : (!empty($soc->fk_account) ? $soc->fk_account : 0));
1621  $availability_id = (!empty($objectsrc->availability_id) ? $objectsrc->availability_id : (!empty($soc->availability_id) ? $soc->availability_id : 0));
1622  $shipping_method_id = (!empty($objectsrc->shipping_method_id) ? $objectsrc->shipping_method_id : (!empty($soc->shipping_method_id) ? $soc->shipping_method_id : 0));
1623  $demand_reason_id = (!empty($objectsrc->demand_reason_id) ? $objectsrc->demand_reason_id : (!empty($soc->demand_reason_id) ? $soc->demand_reason_id : 0));
1624  $remise_percent = (!empty($objectsrc->remise_percent) ? $objectsrc->remise_percent : (!empty($soc->remise_supplier_percent) ? $soc->remise_supplier_percent : 0));
1625  $remise_absolue = (!empty($objectsrc->remise_absolue) ? $objectsrc->remise_absolue : (!empty($soc->remise_absolue) ? $soc->remise_absolue : 0));
1626  $dateinvoice = empty($conf->global->MAIN_AUTOFILL_DATE) ?-1 : '';
1627 
1628  $datedelivery = (!empty($objectsrc->date_livraison) ? $objectsrc->date_livraison : (!empty($objectsrc->delivery_date) ? $objectsrc->delivery_date : ''));
1629 
1630  if (isModEnabled("multicurrency")) {
1631  if (!empty($objectsrc->multicurrency_code)) {
1632  $currency_code = $objectsrc->multicurrency_code;
1633  }
1634  if (!empty($conf->global->MULTICURRENCY_USE_ORIGIN_TX) && !empty($objectsrc->multicurrency_tx)) {
1635  $currency_tx = $objectsrc->multicurrency_tx;
1636  }
1637  }
1638 
1639  $note_private = $object->getDefaultCreateValueFor('note_private', (!empty($objectsrc->note_private) ? $objectsrc->note_private : null));
1640  $note_public = $object->getDefaultCreateValueFor('note_public', (!empty($objectsrc->note_public) ? $objectsrc->note_public : null));
1641 
1642  // Object source contacts list
1643  $srccontactslist = $objectsrc->liste_contact(-1, 'external', 1);
1644  } else {
1645  $cond_reglement_id = !empty($societe->cond_reglement_supplier_id) ? $societe->cond_reglement_supplier_id : 0;
1646  $mode_reglement_id = !empty($societe->mode_reglement_supplier_id) ? $societe->mode_reglement_supplier_id : 0;
1647 
1648  if (isModEnabled("multicurrency") && !empty($societe->multicurrency_code)) {
1649  $currency_code = $societe->multicurrency_code;
1650  }
1651 
1652  $note_private = $object->getDefaultCreateValueFor('note_private');
1653  $note_public = $object->getDefaultCreateValueFor('note_public');
1654  }
1655 
1656  // If not defined, set default value from constant
1657  if (empty($cond_reglement_id) && !empty($conf->global->SUPPLIER_ORDER_DEFAULT_PAYMENT_TERM_ID)) {
1658  $cond_reglement_id = $conf->global->SUPPLIER_ORDER_DEFAULT_PAYMENT_TERM_ID;
1659  }
1660  if (empty($mode_reglement_id) && !empty($conf->global->SUPPLIER_ORDER_DEFAULT_PAYMENT_MODE_ID)) {
1661  $mode_reglement_id = $conf->global->SUPPLIER_ORDER_DEFAULT_PAYMENT_MODE_ID;
1662  }
1663 
1664  print '<form name="add" action="'.$_SERVER["PHP_SELF"].'" method="post">';
1665  print '<input type="hidden" name="token" value="'.newToken().'">';
1666  print '<input type="hidden" name="action" value="add">';
1667  print '<input type="hidden" name="remise_percent" value="'.(empty($soc->remise_supplier_percent) ? '' : $soc->remise_supplier_percent).'">';
1668  print '<input type="hidden" name="origin" value="'.$origin.'">';
1669  print '<input type="hidden" name="originid" value="'.$originid.'">';
1670  if ($backtopage) {
1671  print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
1672  }
1673  if ($backtopageforcancel) {
1674  print '<input type="hidden" name="backtopageforcancel" value="'.$backtopageforcancel.'">';
1675  }
1676 
1677  if (!empty($currency_tx)) {
1678  print '<input type="hidden" name="originmulticurrency_tx" value="'.$currency_tx.'">';
1679  }
1680 
1681  print dol_get_fiche_head('');
1682 
1683  print '<table class="border centpercent">';
1684 
1685  // Ref
1686  print '<tr><td class="titlefieldcreate">'.$langs->trans('Ref').'</td><td>'.$langs->trans('Draft').'</td></tr>';
1687 
1688  // Third party
1689  print '<tr><td class="fieldrequired">'.$langs->trans('Supplier').'</td>';
1690  print '<td>';
1691 
1692  if (!empty($societe->id) && $societe->id > 0) {
1693  print $societe->getNomUrl(1, 'supplier');
1694  print '<input type="hidden" name="socid" value="'.$societe->id.'">';
1695  } else {
1696  print img_picto('', 'company').$form->select_company((empty($socid) ? '' : $socid), 'socid', '(s.fournisseur=1 AND s.status=1)', 'SelectThirdParty', 1, 0, null, 0, 'minwidth175 maxwidth500 widthcentpercentminusxx');
1697  // reload page to retrieve customer informations
1698  if (!empty($conf->global->RELOAD_PAGE_ON_SUPPLIER_CHANGE)) {
1699  print '<script>
1700  $(document).ready(function() {
1701  $("#socid").change(function() {
1702  var socid = $(this).val();
1703  var prjid = $("#projectid").val();
1704  // reload page
1705  window.location.href = "'.$_SERVER["PHP_SELF"].'?action=create&socid="+socid+"&projectid="+prjid
1706  });
1707  });
1708  </script>';
1709  }
1710  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>';
1711  }
1712  print '</td>';
1713 
1714  if (!empty($societe->id) && $societe->id > 0) {
1715  // Discounts for third party
1716  print '<tr><td>'.$langs->trans('Discounts').'</td><td>';
1717 
1718  $absolute_discount = $societe->getAvailableDiscounts('', '', 0, 1);
1719 
1720  $thirdparty = $societe;
1721  $discount_type = 1;
1722  $backtopage = urlencode($_SERVER["PHP_SELF"].'?socid='.$thirdparty->id.'&action='.$action.'&origin='.GETPOST('origin').'&originid='.GETPOST('originid'));
1723  include DOL_DOCUMENT_ROOT.'/core/tpl/object_discounts.tpl.php';
1724 
1725  print '</td></tr>';
1726  }
1727 
1728  // Ref supplier
1729  print '<tr><td>'.$langs->trans('RefSupplier').'</td><td><input name="refsupplier" type="text"></td>';
1730  print '</tr>';
1731 
1732  // Payment term
1733  print '<tr><td class="nowrap">'.$langs->trans('PaymentConditionsShort').'</td><td>';
1734  print $form->getSelectConditionsPaiements(GETPOSTISSET('cond_reglement_id') ? GETPOST('cond_reglement_id') : $cond_reglement_id, 'cond_reglement_id');
1735  print '</td></tr>';
1736 
1737  // Payment mode
1738  print '<tr><td>'.$langs->trans('PaymentMode').'</td><td>';
1739  $form->select_types_paiements(GETPOSTISSET('mode_reglement_id') ? GETPOST('mode_reglement_id') : $mode_reglement_id, 'mode_reglement_id');
1740  print '</td></tr>';
1741 
1742  // Planned delivery date
1743  print '<tr><td>';
1744  print $langs->trans('DateDeliveryPlanned');
1745  print '</td>';
1746  print '<td>';
1747  $usehourmin = 0;
1748  if (!empty($conf->global->SUPPLIER_ORDER_USE_HOUR_FOR_DELIVERY_DATE)) {
1749  $usehourmin = 1;
1750  }
1751  print $form->selectDate($datelivraison ? $datelivraison : -1, 'liv_', $usehourmin, $usehourmin, '', "set");
1752  print '</td></tr>';
1753 
1754  // Bank Account
1755  if (!empty($conf->global->BANK_ASK_PAYMENT_BANK_DURING_SUPPLIER_ORDER) && isModEnabled("banque")) {
1756  $langs->load("bank");
1757  print '<tr><td>'.$langs->trans('BankAccount').'</td><td>';
1758  print img_picto('', 'bank_account', 'class="paddingrightonly"');
1759  $form->select_comptes($fk_account, 'fk_account', 0, '', 1);
1760  print '</td></tr>';
1761  }
1762 
1763  // Project
1764  if (isModEnabled('project')) {
1765  $formproject = new FormProjets($db);
1766 
1767  $langs->load('projects');
1768  print '<tr><td>'.$langs->trans('Project').'</td><td>';
1769  print img_picto('', 'project').$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');
1770  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>';
1771  print '</td></tr>';
1772  }
1773 
1774  // Incoterms
1775  if (isModEnabled('incoterm')) {
1776  $fkincoterms = (!empty($object->fk_incoterms) ? $object->fk_incoterms : ($socid > 0 ? $societe->fk_incoterms : ''));
1777  $locincoterms = (!empty($object->location_incoterms) ? $object->location_incoterms : ($socid > 0 ? $societe->location_incoterms : ''));
1778  print '<tr>';
1779  print '<td><label for="incoterm_id">'.$form->textwithpicto($langs->trans("IncotermLabel"), $object->label_incoterms, 1).'</label></td>';
1780  print '<td class="maxwidthonsmartphone">';
1781  print $form->select_incoterms($fkincoterms, $locincoterms);
1782  print '</td></tr>';
1783  }
1784 
1785  // Multicurrency
1786  if (isModEnabled("multicurrency")) {
1787  print '<tr>';
1788  print '<td>'.$form->editfieldkey('Currency', 'multicurrency_code', '', $object, 0).'</td>';
1789  print '<td class="maxwidthonsmartphone">';
1790  print $form->selectMultiCurrency($currency_code, 'multicurrency_code');
1791  print '</td></tr>';
1792  }
1793 
1794  print '<tr><td>'.$langs->trans('NotePublic').'</td>';
1795  print '<td>';
1796  $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%');
1797  print $doleditor->Create(1);
1798  print '</td>';
1799  //print '<textarea name="note_public" wrap="soft" cols="60" rows="'.ROWS_5.'"></textarea>';
1800  print '</tr>';
1801 
1802  print '<tr><td>'.$langs->trans('NotePrivate').'</td>';
1803  print '<td>';
1804  $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%');
1805  print $doleditor->Create(1);
1806  print '</td>';
1807  //print '<td><textarea name="note_private" wrap="soft" cols="60" rows="'.ROWS_5.'"></textarea></td>';
1808  print '</tr>';
1809 
1810  if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
1811  print "\n<!-- ".$classname." info -->";
1812  print "\n";
1813  print '<input type="hidden" name="amount" value="'.$objectsrc->total_ht.'">'."\n";
1814  print '<input type="hidden" name="total" value="'.$objectsrc->total_ttc.'">'."\n";
1815  print '<input type="hidden" name="tva" value="'.$objectsrc->total_tva.'">'."\n";
1816  print '<input type="hidden" name="origin" value="'.$objectsrc->element.'">';
1817  print '<input type="hidden" name="originid" value="'.$objectsrc->id.'">';
1818 
1819  $newclassname = $classname;
1820  print '<tr><td>'.$langs->trans($newclassname).'</td><td>'.$objectsrc->getNomUrl(1, 'supplier').'</td></tr>';
1821  print '<tr><td>'.$langs->trans('AmountHT').'</td><td>'.price($objectsrc->total_ht).'</td></tr>';
1822  print '<tr><td>'.$langs->trans('AmountVAT').'</td><td>'.price($objectsrc->total_tva)."</td></tr>";
1823  if ($mysoc->localtax1_assuj == "1" || $objectsrc->total_localtax1 != 0) { // Localtax1 RE
1824  print '<tr><td>'.$langs->transcountry("AmountLT1", $mysoc->country_code).'</td><td>'.price($objectsrc->total_localtax1)."</td></tr>";
1825  }
1826 
1827  if ($mysoc->localtax2_assuj == "1" || $objectsrc->total_localtax2 != 0) { // Localtax2 IRPF
1828  print '<tr><td>'.$langs->transcountry("AmountLT2", $mysoc->country_code).'</td><td>'.price($objectsrc->total_localtax2)."</td></tr>";
1829  }
1830 
1831  print '<tr><td>'.$langs->trans('AmountTTC').'</td><td>'.price($objectsrc->total_ttc)."</td></tr>";
1832 
1833  if (isModEnabled("multicurrency")) {
1834  print '<tr><td>'.$langs->trans('MulticurrencyAmountHT').'</td><td>'.price($objectsrc->multicurrency_total_ht).'</td></tr>';
1835  print '<tr><td>'.$langs->trans('MulticurrencyAmountVAT').'</td><td>'.price($objectsrc->multicurrency_total_tva).'</td></tr>';
1836  print '<tr><td>'.$langs->trans('MulticurrencyAmountTTC').'</td><td>'.price($objectsrc->multicurrency_total_ttc).'</td></tr>';
1837  }
1838  }
1839 
1840  // Other options
1841  $parameters = array();
1842  $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1843  print $hookmanager->resPrint;
1844 
1845  if (empty($reshook)) {
1846  print $object->showOptionals($extrafields, 'create');
1847  }
1848 
1849  // Bouton "Create Draft"
1850  print "</table>\n";
1851 
1852  print dol_get_fiche_end();
1853 
1854  print $form->buttonsSaveCancel("CreateDraft");
1855 
1856  // Show origin lines
1857  if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
1858  $title = $langs->trans('ProductsAndServices');
1859  print load_fiche_titre($title);
1860 
1861  print '<div class="div-table-responsive-no-min">';
1862  print '<table class="noborder centpercent">';
1863 
1864  $objectsrc->printOriginLinesList('', $selectedLines);
1865 
1866  print '</table>';
1867  print '</div>';
1868  }
1869  print "</form>\n";
1870 } elseif (!empty($object->id)) {
1871  $result = $object->fetch($id, $ref);
1872  $object->fetch_thirdparty();
1873 
1874  $societe = $object->thirdparty;
1875 
1876  $author = new User($db);
1877  $author->fetch($object->user_author_id);
1878 
1879  $head = ordersupplier_prepare_head($object);
1880 
1881  $title = $langs->trans("SupplierOrder");
1882  print dol_get_fiche_head($head, 'card', $title, -1, 'order');
1883 
1884 
1885  $formconfirm = '';
1886 
1887  // Confirmation de la suppression de la commande
1888  if ($action == 'delete') {
1889  $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('DeleteOrder'), $langs->trans('ConfirmDeleteOrder'), 'confirm_delete', '', 0, 2);
1890  }
1891 
1892  // Clone confirmation
1893  if ($action == 'clone') {
1894  // Create an array for form
1895  $formquestion = array(
1896  array('type' => 'other', 'name' => 'socid', 'label' => $langs->trans("SelectThirdParty"), 'value' => $form->select_company(GETPOST('socid', 'int'), 'socid', '(s.fournisseur=1)'))
1897  );
1898  // Paiement incomplet. On demande si motif = escompte ou autre
1899  $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneOrder', $object->ref), 'confirm_clone', $formquestion, 'yes', 1);
1900  }
1901 
1902  // Confirmation de la validation
1903  if ($action == 'valid') {
1904  $object->date_commande = dol_now();
1905 
1906  // We check if number is temporary number
1907  if (preg_match('/^[\‍(]?PROV/i', $object->ref) || empty($object->ref)) { // empty should not happened, but when it occurs, the test save life
1908  $newref = $object->getNextNumRef($object->thirdparty);
1909  } else {
1910  $newref = $object->ref;
1911  }
1912 
1913  if ($newref < 0) {
1914  setEventMessages($object->error, $object->errors, 'errors');
1915  $action = '';
1916  } else {
1917  $text = $langs->trans('ConfirmValidateOrder', $newref);
1918  if (isModEnabled('notification')) {
1919  require_once DOL_DOCUMENT_ROOT.'/core/class/notify.class.php';
1920  $notify = new Notify($db);
1921  $text .= '<br>';
1922  $text .= $notify->confirmMessage('ORDER_SUPPLIER_VALIDATE', $object->socid, $object);
1923  }
1924 
1925  $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ValidateOrder'), $text, 'confirm_valid', '', 0, 1);
1926  }
1927  }
1928 
1929  // Confirm approval
1930  if ($action == 'approve' || $action == 'approve2') {
1931  $qualified_for_stock_change = 0;
1932  if (empty($conf->global->STOCK_SUPPORTS_SERVICES)) {
1933  $qualified_for_stock_change = $object->hasProductsOrServices(2);
1934  } else {
1935  $qualified_for_stock_change = $object->hasProductsOrServices(1);
1936  }
1937 
1938  $formquestion = array();
1939  if (isModEnabled('stock') && !empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER) && $qualified_for_stock_change) {
1940  $langs->load("stocks");
1941  require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php';
1942  $formproduct = new FormProduct($db);
1943  $forcecombo = 0;
1944  if ($conf->browser->name == 'ie') {
1945  $forcecombo = 1; // There is a bug in IE10 that make combo inside popup crazy
1946  }
1947  $formquestion = array(
1948  //'text' => $langs->trans("ConfirmClone"),
1949  //array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1),
1950  //array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1),
1951  array('type' => 'other', 'name' => 'idwarehouse', 'label' => $langs->trans("SelectWarehouseForStockIncrease"), 'value' => $formproduct->selectWarehouses(GETPOST('idwarehouse', 'int'), 'idwarehouse', '', 1, 0, 0, '', 0, $forcecombo))
1952  );
1953  }
1954  $text = $langs->trans("ConfirmApproveThisOrder", $object->ref);
1955  if (isModEnabled('notification')) {
1956  require_once DOL_DOCUMENT_ROOT.'/core/class/notify.class.php';
1957  $notify = new Notify($db);
1958  $text .= '<br>';
1959  $text .= $notify->confirmMessage('ORDER_SUPPLIER_APPROVE', $object->socid, $object);
1960  }
1961 
1962  $formconfirm = $form->formconfirm($_SERVER['PHP_SELF']."?id=".$object->id, $langs->trans("ApproveThisOrder"), $text, "confirm_".$action, $formquestion, 1, 1, 240);
1963  }
1964 
1965  // Confirmation of disapproval
1966  if ($action == 'refuse') {
1967  $formquestion = array(
1968  array(
1969  'type' => 'text',
1970  'name' => 'refuse_note',
1971  'label' => $langs->trans("Reason"),
1972  'value' => '',
1973  'morecss' => 'minwidth300'
1974  )
1975  );
1976  $formconfirm = $form->formconfirm($_SERVER['PHP_SELF']."?id=$object->id", $langs->trans("DenyingThisOrder"), $langs->trans("ConfirmDenyingThisOrder", $object->ref), "confirm_refuse", $formquestion, 0, 1);
1977  }
1978 
1979  // Confirmation of cancellation
1980  if ($action == 'cancel') {
1981  $formquestion = array(
1982  array(
1983  'type' => 'text',
1984  'name' => 'cancel_note',
1985  'label' => $langs->trans("Reason"),
1986  'value' => '',
1987  'morecss' => 'minwidth300'
1988  )
1989  );
1990  $formconfirm = $form->formconfirm($_SERVER['PHP_SELF']."?id=$object->id", $langs->trans("Cancel"), $langs->trans("ConfirmCancelThisOrder", $object->ref), "confirm_cancel", $formquestion, 0, 1);
1991  }
1992 
1993  // Confirmation de l'envoi de la commande
1994  if ($action == 'commande') {
1995  $date_com = dol_mktime(GETPOST('rehour'), GETPOST('remin'), GETPOST('resec'), GETPOST("remonth"), GETPOST("reday"), GETPOST("reyear"));
1996  $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);
1997  }
1998 
1999  // Confirmation to delete line
2000  if ($action == 'ask_deleteline') {
2001  $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$lineid, $langs->trans('DeleteProductLine'), $langs->trans('ConfirmDeleteProductLine'), 'confirm_deleteline', '', 0, 1);
2002  }
2003 
2004  $parameters = array('formConfirm' => $formconfirm, 'lineid'=>$lineid);
2005  $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
2006  if (empty($reshook)) {
2007  $formconfirm .= $hookmanager->resPrint;
2008  } elseif ($reshook > 0) {
2009  $formconfirm = $hookmanager->resPrint;
2010  }
2011 
2012  // Print form confirm
2013  print $formconfirm;
2014 
2015 
2016  // Supplier order card
2017 
2018  $linkback = '<a href="'.DOL_URL_ROOT.'/fourn/commande/list.php?restore_lastsearch_values=1'.(!empty($socid) ? '&socid='.$socid : '').'">'.$langs->trans("BackToList").'</a>';
2019 
2020  $morehtmlref = '<div class="refidno">';
2021  // Ref supplier
2022  $morehtmlref .= $form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $usercancreate, 'string', '', 0, 1);
2023  $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);
2024  // Thirdparty
2025  $morehtmlref .= '<br>';
2026  if (!empty($conf->global->MAIN_CAN_EDIT_SUPPLIER_ON_SUPPLIER_ORDER) && !empty($usercancreate) && $action == 'edit_thirdparty') {
2027  $morehtmlref .= '<form method="post" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
2028  $morehtmlref .= '<input type="hidden" name="action" value="set_thirdparty">';
2029  $morehtmlref .= '<input type="hidden" name="token" value="'.newToken().'">';
2030  $morehtmlref .= $form->select_company($object->thirdparty->id, 'new_socid', 's.fournisseur=1', '', 0, 0, array(), 0, 'minwidth300');
2031  $morehtmlref .= '<input type="submit" class="button valignmiddle" value="'.$langs->trans("Modify").'">';
2032  $morehtmlref .= '</form>';
2033  }
2034  if (empty($conf->global->MAIN_CAN_EDIT_SUPPLIER_ON_SUPPLIER_ORDER) || $action != 'edit_thirdparty') {
2035  if (!empty($conf->global->MAIN_CAN_EDIT_SUPPLIER_ON_SUPPLIER_ORDER) && $object->statut == CommandeFournisseur::STATUS_DRAFT) {
2036  $morehtmlref .= '<a class="editfielda" href="'.$_SERVER['PHP_SELF'].'?action=edit_thirdparty&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->transnoentitiesnoconv('SetThirdParty')).'</a>';
2037  }
2038  $morehtmlref .= $object->thirdparty->getNomUrl(1, 'supplier');
2039  if (empty($conf->global->MAIN_DISABLE_OTHER_LINK) && $object->thirdparty->id > 0) {
2040  $morehtmlref .= ' (<a href="'.DOL_URL_ROOT.'/fourn/commande/list.php?socid='.$object->thirdparty->id.'&search_company='.urlencode($object->thirdparty->name).'">'.$langs->trans("OtherOrders").'</a>)';
2041  }
2042  }
2043 
2044  // Project
2045  if (isModEnabled('project')) {
2046  $langs->load("projects");
2047  $morehtmlref .= '<br>';
2048  if ($permissiontoadd) {
2049  $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
2050  if ($action != 'classify' && $caneditproject) {
2051  $morehtmlref .= '<a class="editfielda" href="'.$_SERVER['PHP_SELF'].'?action=classify&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->transnoentitiesnoconv('SetProject')).'</a> ';
2052  }
2053  $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, ($action == 'classify' ? 1 : 0), 0, 1, '');
2054  } else {
2055  if (!empty($object->fk_project)) {
2056  $proj = new Project($db);
2057  $proj->fetch($object->fk_project);
2058  $morehtmlref .= $proj->getNomUrl(1);
2059  if ($proj->title) {
2060  $morehtmlref .= '<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).'</span>';
2061  }
2062  }
2063  }
2064  }
2065  $morehtmlref .= '</div>';
2066 
2067 
2068  dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
2069 
2070 
2071  print '<div class="fichecenter">';
2072  print '<div class="fichehalfleft">';
2073  print '<div class="underbanner clearboth"></div>';
2074 
2075  print '<table class="border tableforfield centpercent">';
2076 
2077  // Date
2078  if ($object->methode_commande_id > 0) {
2079  $usehourmin = 0;
2080  if (!empty($conf->global->SUPPLIER_ORDER_USE_HOUR_FOR_DELIVERY_DATE)) {
2081  $usehourmin = 1;
2082  }
2083  print '<tr><td class="titlefield">'.$langs->trans("Date").'</td><td>';
2084  print $object->date_commande ? dol_print_date($object->date_commande, $usehourmin ? 'dayhour' : 'day') : '';
2085  if ($object->hasDelay() && !empty($object->date_delivery) && !empty($object->date_commande)) {
2086  print ' '.img_picto($langs->trans("Late").' : '.$object->showDelay(), "warning");
2087  }
2088  print "</td></tr>";
2089 
2090  if ($object->methode_commande) {
2091  print '<tr><td>'.$langs->trans("Method").'</td><td>'.$object->getInputMethod().'</td></tr>';
2092  }
2093  }
2094 
2095  // Author
2096  print '<tr><td class="titlefield">'.$langs->trans("AuthorRequest").'</td>';
2097  print '<td>'.$author->getNomUrl(1, '', 0, 0, 0).'</td>';
2098  print '</tr>';
2099 
2100  // Relative and absolute discounts
2101  if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
2102  $filterabsolutediscount = "fk_invoice_supplier_source IS NULL"; // If we want deposit to be substracted to payments only and not to total of final invoice
2103  $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
2104  } else {
2105  $filterabsolutediscount = "fk_invoice_supplier_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS PAID)%')";
2106  $filtercreditnote = "fk_invoice_supplier_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS PAID)%')";
2107  }
2108 
2109  $absolute_discount = $societe->getAvailableDiscounts('', $filterabsolutediscount, 0, 1);
2110  $absolute_creditnote = $societe->getAvailableDiscounts('', $filtercreditnote, 0, 1);
2111  $absolute_discount = price2num($absolute_discount, 'MT');
2112  $absolute_creditnote = price2num($absolute_creditnote, 'MT');
2113 
2114  print '<tr><td class="titlefield">'.$langs->trans('Discounts').'</td><td>';
2115 
2116  $thirdparty = $societe;
2117  $discount_type = 1;
2118  $backtopage = urlencode($_SERVER["PHP_SELF"].'?id='.$object->id);
2119  include DOL_DOCUMENT_ROOT.'/core/tpl/object_discounts.tpl.php';
2120 
2121  print '</td></tr>';
2122 
2123  // Default terms of the settlement
2124  $langs->load('bills');
2125  print '<tr><td class="nowrap">';
2126  print '<table class="nobordernopadding centpercent"><tr><td class="nowrap">';
2127  print $langs->trans('PaymentConditions');
2128  print '<td>';
2129  if ($action != 'editconditions') {
2130  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>';
2131  }
2132  print '</tr></table>';
2133  print '</td><td>';
2134  if ($action == 'editconditions') {
2135  $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->cond_reglement_id, 'cond_reglement_id');
2136  } else {
2137  $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->cond_reglement_id, 'none');
2138  }
2139  print "</td>";
2140  print '</tr>';
2141 
2142  // Mode of payment
2143  $langs->load('bills');
2144  print '<tr><td class="nowrap">';
2145  print '<table class="nobordernopadding centpercent"><tr><td class="nowrap">';
2146  print $langs->trans('PaymentMode');
2147  print '</td>';
2148  if ($action != 'editmode') {
2149  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>';
2150  }
2151  print '</tr></table>';
2152  print '</td><td>';
2153  if ($action == 'editmode') {
2154  $form->form_modes_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->mode_reglement_id, 'mode_reglement_id', 'DBIT', 1, 1);
2155  } else {
2156  $form->form_modes_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->mode_reglement_id, 'none');
2157  }
2158  print '</td></tr>';
2159 
2160  // Multicurrency
2161  if (isModEnabled("multicurrency")) {
2162  // Multicurrency code
2163  print '<tr>';
2164  print '<td>';
2165  print '<table class="nobordernopadding centpercent"><tr><td>';
2166  print $form->editfieldkey('Currency', 'multicurrency_code', '', $object, 0);
2167  print '</td>';
2168  if ($action != 'editmulticurrencycode' && $object->statut == $object::STATUS_DRAFT) {
2169  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>';
2170  }
2171  print '</tr></table>';
2172  print '</td><td>';
2173  if ($action == 'editmulticurrencycode') {
2174  $form->form_multicurrency_code($_SERVER['PHP_SELF'].'?id='.$object->id, $object->multicurrency_code, 'multicurrency_code');
2175  } else {
2176  $form->form_multicurrency_code($_SERVER['PHP_SELF'].'?id='.$object->id, $object->multicurrency_code, 'none');
2177  }
2178  print '</td></tr>';
2179 
2180  // Multicurrency rate
2181  if ($object->multicurrency_code != $conf->currency || $object->multicurrency_tx != 1) {
2182  print '<tr>';
2183  print '<td>';
2184  print '<table class="nobordernopadding centpercent"><tr>';
2185  print '<td>';
2186  print $form->editfieldkey('CurrencyRate', 'multicurrency_tx', '', $object, 0);
2187  print '</td>';
2188  if ($action != 'editmulticurrencyrate' && $object->statut == $object::STATUS_DRAFT && $object->multicurrency_code && $object->multicurrency_code != $conf->currency) {
2189  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>';
2190  }
2191  print '</tr></table>';
2192  print '</td><td>';
2193  if ($action == 'editmulticurrencyrate' || $action == 'actualizemulticurrencyrate') {
2194  if ($action == 'actualizemulticurrencyrate') {
2195  list($object->fk_multicurrency, $object->multicurrency_tx) = MultiCurrency::getIdAndTxFromCode($object->db, $object->multicurrency_code);
2196  }
2197  $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$object->id, $object->multicurrency_tx, 'multicurrency_tx', $object->multicurrency_code);
2198  } else {
2199  $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$object->id, $object->multicurrency_tx, 'none', $object->multicurrency_code);
2200  if ($object->statut == $object::STATUS_DRAFT && $object->multicurrency_code && $object->multicurrency_code != $conf->currency) {
2201  print '<div class="inline-block"> &nbsp; &nbsp; &nbsp; &nbsp; ';
2202  print '<a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=actualizemulticurrencyrate">'.$langs->trans("ActualizeCurrency").'</a>';
2203  print '</div>';
2204  }
2205  }
2206  print '</td></tr>';
2207  }
2208  }
2209 
2210  // Bank Account
2211  if (!empty($conf->global->BANK_ASK_PAYMENT_BANK_DURING_SUPPLIER_ORDER) && isModEnabled("banque")) {
2212  print '<tr><td class="nowrap">';
2213  print '<table class="nobordernopadding centpercent"><tr><td class="nowrap">';
2214  print $langs->trans('BankAccount');
2215  print '<td>';
2216  if ($action != 'editbankaccount' && $usercancreate) {
2217  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>';
2218  }
2219  print '</tr></table>';
2220  print '</td><td>';
2221  if ($action == 'editbankaccount') {
2222  $form->formSelectAccount($_SERVER['PHP_SELF'].'?id='.$object->id, $object->fk_account, 'fk_account', 1);
2223  } else {
2224  $form->formSelectAccount($_SERVER['PHP_SELF'].'?id='.$object->id, $object->fk_account, 'none');
2225  }
2226  print '</td>';
2227  print '</tr>';
2228  }
2229 
2230  // Delivery delay (in days)
2231  print '<tr>';
2232  print '<td>'.$langs->trans('NbDaysToDelivery').'&nbsp;'.img_picto($langs->trans('DescNbDaysToDelivery'), 'info', 'style="cursor:help"').'</td>';
2233  print '<td>'.$object->getMaxDeliveryTimeDay($langs).'</td>';
2234  print '</tr>';
2235 
2236  // Delivery date planed
2237  print '<tr><td>';
2238  print '<table class="nobordernopadding centpercent"><tr><td>';
2239  print $langs->trans('DateDeliveryPlanned');
2240  print '</td>';
2241  if ($action != 'editdate_livraison') {
2242  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>';
2243  }
2244  print '</tr></table>';
2245  print '</td><td>';
2246  if ($action == 'editdate_livraison') {
2247  print '<form name="setdate_livraison" action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'" method="post">';
2248  print '<input type="hidden" name="token" value="'.newToken().'">';
2249  print '<input type="hidden" name="action" value="setdate_livraison">';
2250  $usehourmin = 0;
2251  if (!empty($conf->global->SUPPLIER_ORDER_USE_HOUR_FOR_DELIVERY_DATE)) {
2252  $usehourmin = 1;
2253  }
2254  print $form->selectDate($object->delivery_date ? $object->delivery_date : -1, 'liv_', $usehourmin, $usehourmin, '', "setdate_livraison");
2255  print '<input type="submit" class="button button-edit" value="'.$langs->trans('Modify').'">';
2256  print '</form>';
2257  } else {
2258  $usehourmin = 'day';
2259  if (!empty($conf->global->SUPPLIER_ORDER_USE_HOUR_FOR_DELIVERY_DATE)) {
2260  $usehourmin = 'dayhour';
2261  }
2262  print $object->delivery_date ? dol_print_date($object->delivery_date, $usehourmin) : '&nbsp;';
2263  if ($object->hasDelay() && !empty($object->delivery_date)) {
2264  print ' '.img_picto($langs->trans("Late").' : '.$object->showDelay(), "warning");
2265  }
2266  }
2267  print '</td></tr>';
2268 
2269  // Incoterms
2270  if (isModEnabled('incoterm')) {
2271  print '<tr><td>';
2272  print '<table class="nobordernopadding centpercent"><tr><td>';
2273  print $langs->trans('IncotermLabel');
2274  print '<td><td class="right">';
2275  if ($usercancreate) {
2276  print '<a class="editfielda" href="'.DOL_URL_ROOT.'/fourn/commande/card.php?id='.$object->id.'&action=editincoterm&token='.newToken().'">'.img_edit().'</a>';
2277  } else {
2278  print '&nbsp;';
2279  }
2280  print '</td></tr></table>';
2281  print '</td>';
2282  print '<td>';
2283  if ($action != 'editincoterm') {
2284  print $form->textwithpicto(dol_escape_htmltag($object->display_incoterms()), $object->label_incoterms, 1);
2285  } else {
2286  print $form->select_incoterms((!empty($object->fk_incoterms) ? $object->fk_incoterms : ''), (!empty($object->location_incoterms) ? $object->location_incoterms : ''), $_SERVER['PHP_SELF'].'?id='.$object->id);
2287  }
2288  print '</td></tr>';
2289  }
2290 
2291  // Other attributes
2292  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
2293 
2294  print '</table>';
2295 
2296  print '</div>';
2297  print '<div class="fichehalfright">';
2298  print '<div class="underbanner clearboth"></div>';
2299 
2300  print '<table class="border tableforfield centpercent">';
2301 
2302  if ($object->multicurrency_code != $conf->currency || $object->multicurrency_tx != 1) {
2303  // Multicurrency Amount HT
2304  print '<tr><td class="titlefieldmiddle">'.$form->editfieldkey('MulticurrencyAmountHT', 'multicurrency_total_ht', '', $object, 0).'</td>';
2305  print '<td class="nowrap right amountcard">'.price($object->multicurrency_total_ht, '', $langs, 0, - 1, - 1, (!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency)).'</td>';
2306  print '</tr>';
2307 
2308  // Multicurrency Amount VAT
2309  print '<tr><td>'.$form->editfieldkey('MulticurrencyAmountVAT', 'multicurrency_total_tva', '', $object, 0).'</td>';
2310  print '<td class="nowrap right amountcard">'.price($object->multicurrency_total_tva, '', $langs, 0, - 1, - 1, (!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency)).'</td>';
2311  print '</tr>';
2312 
2313  // Multicurrency Amount TTC
2314  print '<tr><td>'.$form->editfieldkey('MulticurrencyAmountTTC', 'multicurrency_total_ttc', '', $object, 0).'</td>';
2315  print '<td class="nowrap right amountcard">'.price($object->multicurrency_total_ttc, '', $langs, 0, - 1, - 1, (!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency)).'</td>';
2316  print '</tr>';
2317  }
2318 
2319  // Total
2320  $alert = '';
2321  if (!empty($conf->global->ORDER_MANAGE_MIN_AMOUNT) && $object->total_ht < $object->thirdparty->supplier_order_min_amount) {
2322  $alert = ' '.img_warning($langs->trans('OrderMinAmount').': '.price($object->thirdparty->supplier_order_min_amount));
2323  }
2324  print '<tr><td class="titlefieldmiddle">'.$langs->trans("AmountHT").'</td>';
2325  print '<td class="nowrap right amountcard">'.price($object->total_ht, '', $langs, 1, -1, -1, $conf->currency).$alert.'</td>';
2326  print '</tr>';
2327 
2328  // Total VAT
2329  print '<tr><td>'.$langs->trans("AmountVAT").'</td>';
2330  print '<td class="nowrap right amountcard">'.price($object->total_tva, '', $langs, 1, -1, -1, $conf->currency).'</td>';
2331  print '</tr>';
2332 
2333  // Amount Local Taxes
2334  if ($mysoc->localtax1_assuj == "1" || $object->total_localtax1 != 0) { //Localtax1
2335  print '<tr><td>'.$langs->transcountry("AmountLT1", $mysoc->country_code).'</td>';
2336  print '<td class="nowrap right amountcard">'.price($object->total_localtax1, '', $langs, 1, -1, -1, $conf->currency).'</td>';
2337  print '</tr>';
2338  }
2339  if ($mysoc->localtax2_assuj == "1" || $object->total_localtax2 != 0) { //Localtax2
2340  print '<tr><td>'.$langs->transcountry("AmountLT2", $mysoc->country_code).'</td>';
2341  print '<td class="nowrap right amountcard">'.price($object->total_localtax2, '', $langs, 1, -1, -1, $conf->currency).'</td>';
2342  print '</tr>';
2343  }
2344 
2345  // Total TTC
2346  print '<tr><td>'.$langs->trans("AmountTTC").'</td>';
2347  print '<td class="nowrap right amountcard">'.price($object->total_ttc, '', $langs, 1, -1, -1, $conf->currency).'</td>';
2348  print '</tr>';
2349 
2350  print '</table>';
2351 
2352  // Margin Infos
2353  /*if (isModEnabled('margin')) {
2354  $formmargin->displayMarginInfos($object);
2355  }*/
2356 
2357 
2358  print '</div>';
2359  print '</div>';
2360 
2361  print '<div class="clearboth"></div><br>';
2362 
2363  if (!empty($conf->global->MAIN_DISABLE_CONTACTS_TAB)) {
2364  $blocname = 'contacts';
2365  $title = $langs->trans('ContactsAddresses');
2366  include DOL_DOCUMENT_ROOT.'/core/tpl/bloc_showhide.tpl.php';
2367  }
2368 
2369  if (!empty($conf->global->MAIN_DISABLE_NOTES_TAB)) {
2370  $blocname = 'notes';
2371  $title = $langs->trans('Notes');
2372  include DOL_DOCUMENT_ROOT.'/core/tpl/bloc_showhide.tpl.php';
2373  }
2374 
2375  /*
2376  * Lines
2377  */
2378  //$result = $object->getLinesArray();
2379 
2380 
2381  print ' <form name="addproduct" id="addproduct" action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.(($action != 'editline') ? '' : '#line_'.GETPOST('lineid', 'int')).'" method="POST">
2382  <input type="hidden" name="token" value="'.newToken().'">
2383  <input type="hidden" name="action" value="' . (($action != 'editline') ? 'addline' : 'updateline').'">
2384  <input type="hidden" name="mode" value="">
2385  <input type="hidden" name="page_y" value="">
2386  <input type="hidden" name="id" value="'.$object->id.'">
2387  <input type="hidden" name="socid" value="'.$societe->id.'">
2388  ';
2389 
2390  if (!empty($conf->use_javascript_ajax) && $object->statut == 0) {
2391  include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php';
2392  }
2393 
2394  print '<div class="div-table-responsive-no-min">';
2395  print '<table id="tablelines" class="noborder noshadow centpercent">';
2396 
2397  // Add free products/services form
2398  global $forceall, $senderissupplier, $dateSelector, $inputalsopricewithtax;
2399  $forceall = 1; $dateSelector = 0; $inputalsopricewithtax = 1;
2400  $senderissupplier = 2; // $senderissupplier=2 is same than 1 but disable test on minimum qty and disable autofill qty with minimum.
2401  if (!empty($conf->global->SUPPLIER_ORDER_WITH_PREDEFINED_PRICES_ONLY)) {
2402  $senderissupplier = 1;
2403  }
2404 
2405  // Show object lines
2406  if (!empty($object->lines)) {
2407  $object->printObjectLines($action, $object->thirdparty, $mysoc, $lineid, 1);
2408  }
2409 
2410  $num = count($object->lines);
2411 
2412  // Form to add new line
2413  if ($object->statut == CommandeFournisseur::STATUS_DRAFT && $usercancreate) {
2414  if ($action != 'editline') {
2415  // Add free products/services
2416 
2417  $parameters = array();
2418  $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
2419  if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
2420  if (empty($reshook))
2421  $object->formAddObjectLine(1, $societe, $mysoc);
2422  }
2423  }
2424  print '</table>';
2425  print '</div>';
2426  print '</form>';
2427 
2428  print dol_get_fiche_end();
2429 
2434  if ($user->socid == 0 && $action != 'delete') {
2435  if ($action != 'makeorder' && $action != 'presend' && $action != 'editline') {
2436  print '<div class="tabsAction">';
2437 
2438  $parameters = array();
2439  $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been
2440  // modified by hook
2441  if (empty($reshook)) {
2442  $object->fetchObjectLinked(); // Links are used to show or not button, so we load them now.
2443 
2444  // Validate
2445  if ($object->statut == 0 && $num > 0) {
2446  if ($usercanvalidate) {
2447  $tmpbuttonlabel = $langs->trans('Validate');
2448  if ($usercanapprove && empty($conf->global->SUPPLIER_ORDER_NO_DIRECT_APPROVE)) {
2449  $tmpbuttonlabel = $langs->trans("ValidateAndApprove");
2450  }
2451 
2452  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&amp;action=valid">';
2453  print $tmpbuttonlabel;
2454  print '</a>';
2455  }
2456  }
2457  // Create event
2458  /*if ($conf->agenda->enabled && !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.
2459  {
2460  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>';
2461  }*/
2462 
2463  // Modify
2464  if ($object->statut == CommandeFournisseur::STATUS_VALIDATED) {
2465  if ($usercanorder) {
2466  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=reopen&token='.newToken().'">'.$langs->trans("Modify").'</a>';
2467  }
2468  }
2469 
2470  // Approve
2471  if ($object->statut == CommandeFournisseur::STATUS_VALIDATED) {
2472  if ($usercanapprove) {
2473  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)) {
2474  print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("FirstApprovalAlreadyDone")).'">'.$langs->trans("ApproveOrder").'</a>';
2475  } else {
2476  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&amp;action=approve">'.$langs->trans("ApproveOrder").'</a>';
2477  }
2478  } else {
2479  print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("NotAllowed")).'">'.$langs->trans("ApproveOrder").'</a>';
2480  }
2481  }
2482 
2483  // Second approval (if option SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED is set)
2484  if (!empty($conf->global->SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED) && $object->total_ht >= $conf->global->SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED) {
2485  if ($object->statut == CommandeFournisseur::STATUS_VALIDATED) {
2486  if ($usercanapprovesecond) {
2487  if (!empty($object->user_approve_id2)) {
2488  print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("SecondApprovalAlreadyDone")).'">'.$langs->trans("Approve2Order").'</a>';
2489  } else {
2490  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&amp;action=approve2">'.$langs->trans("Approve2Order").'</a>';
2491  }
2492  } else {
2493  print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("NotAllowed")).'">'.$langs->trans("Approve2Order").'</a>';
2494  }
2495  }
2496  }
2497 
2498  // Refuse
2499  if ($object->statut == CommandeFournisseur::STATUS_VALIDATED) {
2500  if ($usercanapprove || $usercanapprovesecond) {
2501  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&amp;action=refuse">'.$langs->trans("RefuseOrder").'</a>';
2502  } else {
2503  print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("NotAllowed")).'">'.$langs->trans("RefuseOrder").'</a>';
2504  }
2505  }
2506 
2507  // Send
2508  if (empty($user->socid)) {
2509  if (in_array($object->statut, array(CommandeFournisseur::STATUS_ACCEPTED, 3, 4, 5)) || !empty($conf->global->SUPPLIER_ORDER_SENDBYEMAIL_FOR_ALL_STATUS)) {
2510  if ($usercanorder) {
2511  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=presend&mode=init#formmailbeforetitle">'.$langs->trans('SendMail').'</a>';
2512  }
2513  }
2514  }
2515 
2516  // Reopen
2517  if (in_array($object->statut, array(CommandeFournisseur::STATUS_ACCEPTED))) {
2518  $buttonshown = 0;
2519  if (!$buttonshown && $usercanapprove) {
2520  if (empty($conf->global->SUPPLIER_ORDER_REOPEN_BY_APPROVER_ONLY)
2521  || (!empty($conf->global->SUPPLIER_ORDER_REOPEN_BY_APPROVER_ONLY) && $user->id == $object->user_approve_id)) {
2522  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=reopen&token='.newToken().'">'.$langs->trans("Disapprove").'</a>';
2523  $buttonshown++;
2524  }
2525  }
2526  if (!$buttonshown && $usercanapprovesecond && !empty($conf->global->SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED)) {
2527  if (empty($conf->global->SUPPLIER_ORDER_REOPEN_BY_APPROVER2_ONLY)
2528  || (!empty($conf->global->SUPPLIER_ORDER_REOPEN_BY_APPROVER2_ONLY) && $user->id == $object->user_approve_id2)) {
2529  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=reopen&token='.newToken().'">'.$langs->trans("Disapprove").'</a>';
2530  }
2531  }
2532  }
2533  if (in_array($object->statut, array(3, 4, 5, 6, 7, 9))) {
2534  if ($usercanorder) {
2535  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=reopen&token='.newToken().'">'.$langs->trans("ReOpen").'</a>';
2536  }
2537  }
2538 
2539  // Ship
2540  $hasreception = 0;
2541  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))) {
2542  $labelofbutton = $langs->trans('ReceiveProducts');
2543  if ($conf->reception->enabled) {
2544  $labelofbutton = $langs->trans("CreateReception");
2545  if (!empty($object->linkedObjects['reception'])) {
2546  foreach ($object->linkedObjects['reception'] as $element) {
2547  if ($element->statut >= 0) {
2548  $hasreception = 1;
2549  break;
2550  }
2551  }
2552  }
2553  }
2554 
2555  if (in_array($object->statut, array(3, 4, 5))) {
2556  if (((isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled("supplier_order")) && $usercanreceive) {
2557  print '<div class="inline-block divButAction"><a class="butAction" href="'.DOL_URL_ROOT.'/fourn/commande/dispatch.php?id='.$object->id.'">'.$labelofbutton.'</a></div>';
2558  } else {
2559  print '<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("NotAllowed")).'">'.$labelofbutton.'</a></div>';
2560  }
2561  }
2562  }
2563 
2564  if ($object->statut == CommandeFournisseur::STATUS_ACCEPTED) {
2565  if ($usercanorder) {
2566  print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&amp;action=makeorder#makeorder">'.$langs->trans("MakeOrder").'</a></div>';
2567  } else {
2568  print '<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#">'.$langs->trans("MakeOrder").'</a></div>';
2569  }
2570  }
2571 
2572  // Classify received (this does not record reception)
2573  if ($object->statut == CommandeFournisseur::STATUS_ORDERSENT || $object->statut == CommandeFournisseur::STATUS_RECEIVED_PARTIALLY) {
2574  if ($usercanreceive) {
2575  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>';
2576  }
2577  }
2578 
2579  // Create bill
2580  //if (isModEnabled('facture'))
2581  //{
2582  if (((isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled("supplier_invoice")) && ($object->statut >= 2 && $object->statut != 7 && $object->billed != 1)) { // statut 2 means approved, 7 means canceled
2583  if ($user->rights->fournisseur->facture->creer || $user->rights->supplier_invoice->creer) {
2584  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>';
2585  }
2586  }
2587  //}
2588 
2589  // Classify billed manually (need one invoice if module invoice is on, no condition on invoice if not)
2590  if ($usercancreate && $object->statut >= 2 && $object->statut != 7 && $object->billed != 1) { // statut 2 means approved
2591  if (!isModEnabled('facture')) {
2592  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=classifybilled&token='.newToken().'">'.$langs->trans("ClassifyBilled").'</a>';
2593  } else {
2594  if (!empty($object->linkedObjectsIds['invoice_supplier'])) {
2595  if ($user->rights->fournisseur->facture->creer || $user->rights->supplier_invoice->creer) {
2596  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=classifybilled&token='.newToken().'">'.$langs->trans("ClassifyBilled").'</a>';
2597  }
2598  } else {
2599  print '<a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->trans("NeedAtLeastOneInvoice")).'">'.$langs->trans("ClassifyBilled").'</a>';
2600  }
2601  }
2602  }
2603 
2604  // Create a remote order using WebService only if module is activated
2605  if (!empty($conf->syncsupplierwebservices->enabled) && $object->statut >= 2) { // 2 means accepted
2606  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=webservice&token='.newToken().'&mode=init">'.$langs->trans('CreateRemoteOrder').'</a>';
2607  }
2608 
2609  // Clone
2610  if ($usercancreate) {
2611  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>';
2612  }
2613 
2614  // Cancel
2615  if ($object->statut == CommandeFournisseur::STATUS_ACCEPTED) {
2616  if ($usercanorder) {
2617  print '<a class="butActionDelete" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&amp;action=cancel">'.$langs->trans("CancelOrder").'</a>';
2618  }
2619  }
2620 
2621  // Delete
2622  if (!empty($usercandelete)) {
2623  if ($hasreception) {
2624  print '<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans("ReceptionExist").'">'.$langs->trans("Delete").'</a>';
2625  } else {
2626  print '<a class="butActionDelete" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken().'">'.$langs->trans("Delete").'</a>';
2627  }
2628  }
2629  }
2630 
2631  print "</div>";
2632  }
2633 
2634  if ($usercanorder && $object->statut == CommandeFournisseur::STATUS_ACCEPTED && $action == 'makeorder') {
2635  // Set status to ordered (action=commande)
2636  print '<!-- form to record supplier order -->'."\n";
2637  print '<form name="commande" id="makeorder" action="card.php?id='.$object->id.'&amp;action=commande" method="POST">';
2638 
2639  print '<input type="hidden" name="token" value="'.newToken().'">';
2640  print '<input type="hidden" name="action" value="commande">';
2641  print load_fiche_titre($langs->trans("ToOrder"), '', '');
2642  print '<table class="noborder centpercent">';
2643  //print '<tr class="liste_titre"><td colspan="2">'.$langs->trans("ToOrder").'</td></tr>';
2644  print '<tr><td class="fieldrequired">'.$langs->trans("OrderDate").'</td><td>';
2645  $date_com = dol_mktime(GETPOST('rehour', 'int'), GETPOST('remin', 'int'), GETPOST('resec', 'int'), GETPOST('remonth', 'int'), GETPOST('reday', 'int'), GETPOST('reyear', 'int'));
2646  if (empty($date_com)) {
2647  $date_com = dol_now();
2648  }
2649  print $form->selectDate($date_com, '', 1, 1, '', "commande", 1, 1);
2650  print '</td></tr>';
2651 
2652  // Force mandatory order method
2653  print '<tr><td class="fieldrequired">'.$langs->trans("OrderMode").'</td><td>';
2654  $formorder->selectInputMethod(GETPOST('methodecommande'), "methodecommande", 1);
2655  print '</td></tr>';
2656 
2657  print '<tr><td>'.$langs->trans("Comment").'</td><td><input class="quatrevingtpercent" type="text" name="comment" value="'.GETPOST('comment').'"></td></tr>';
2658 
2659  print '<tr><td class="center" colspan="2">';
2660  print '<input type="submit" name="makeorder" class="button" value="'.$langs->trans("ToOrder").'">';
2661  print ' &nbsp; &nbsp; ';
2662  print '<input type="submit" name="cancel" class="button button-cancel" value="'.$langs->trans("Cancel").'">';
2663  print '</td></tr>';
2664  print '</table>';
2665 
2666  print '</form>';
2667  print "<br>";
2668  }
2669 
2670  // Select mail models is same action as presend
2671  if (GETPOST('modelselected')) {
2672  $action = 'presend';
2673  }
2674 
2675  if ($action != 'makeorder' && $action != 'presend' ) {
2676  print '<div class="fichecenter"><div class="fichehalfleft">';
2677 
2678  // Generated documents
2679  $objref = dol_sanitizeFileName($object->ref);
2680  $file = $conf->fournisseur->dir_output.'/commande/'.$objref.'/'.$objref.'.pdf';
2681  $relativepath = $objref.'/'.$objref.'.pdf';
2682  $filedir = $conf->fournisseur->dir_output.'/commande/'.$objref;
2683  $urlsource = $_SERVER["PHP_SELF"]."?id=".$object->id;
2684  $genallowed = $usercanread;
2685  $delallowed = $usercancreate;
2686  $modelpdf = (!empty($object->model_pdf) ? $object->model_pdf : (empty($conf->global->COMMANDE_SUPPLIER_ADDON_PDF) ? '' : $conf->global->COMMANDE_SUPPLIER_ADDON_PDF));
2687 
2688  print $formfile->showdocuments('commande_fournisseur', $objref, $filedir, $urlsource, $genallowed, $delallowed, $modelpdf, 1, 0, 0, 0, 0, '', '', '', $object->thirdparty->default_lang, '', $object);
2689  $somethingshown = $formfile->numoffiles;
2690 
2691  // Show links to link elements
2692  $linktoelem = $form->showLinkToObjectBlock($object, null, array('supplier_order', 'order_supplier'));
2693  $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
2694 
2695  print '</div><div class="fichehalfright">';
2696 
2697  if ($action == 'classifyreception') {
2698  if ($usercanreceive && ($object->statut == CommandeFournisseur::STATUS_ORDERSENT || $object->statut == CommandeFournisseur::STATUS_RECEIVED_PARTIALLY)) {
2699  // Set status to received (action=livraison)
2700  print '<!-- form to record purchase order received -->'."\n";
2701  print '<form id="classifyreception" action="card.php?id='.$object->id.'" method="post">';
2702  print '<input type="hidden" name="token" value="'.newToken().'">';
2703  print '<input type="hidden" name="action" value="livraison">';
2704  print load_fiche_titre($langs->trans("Receive"), '', '');
2705 
2706  print '<table class="noborder centpercent">';
2707  //print '<tr class="liste_titre"><td colspan="2">'.$langs->trans("Receive").'</td></tr>';
2708  print '<tr><td>'.$langs->trans("DeliveryDate").'</td><td>';
2709  $datepreselected = dol_now();
2710  print $form->selectDate($datepreselected, '', 1, 1, '', "commande", 1, 1);
2711  print "</td></tr>\n";
2712 
2713  print '<tr><td class="fieldrequired">'.$langs->trans("Delivery")."</td><td>\n";
2714  $liv = array();
2715  $liv[''] = '&nbsp;';
2716  $liv['tot'] = $langs->trans("CompleteOrNoMoreReceptionExpected");
2717  $liv['par'] = $langs->trans("PartialWoman");
2718  $liv['nev'] = $langs->trans("NeverReceived");
2719  $liv['can'] = $langs->trans("Canceled");
2720 
2721  print $form->selectarray("type", $liv);
2722 
2723  print '</td></tr>';
2724  print '<tr><td>'.$langs->trans("Comment").'</td><td><input class="quatrevingtpercent" type="text" name="comment"></td></tr>';
2725  print '<tr><td class="center" colspan="2">';
2726  print '<input type="submit" name="receive" class="button" value="'.$langs->trans("Receive").'">';
2727  print ' &nbsp; &nbsp; ';
2728  print '<input type="submit" name="cancel" class="button button-cancel" value="'.$langs->trans("Cancel").'">';
2729  print '</td></tr>';
2730  print "</table>\n";
2731  print "</form>\n";
2732  print "<br>";
2733  }
2734  }
2735 
2736  // List of actions on element
2737  include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
2738  $formactions = new FormActions($db);
2739  $somethingshown = $formactions->showactions($object, 'order_supplier', $socid, 1, 'listaction'.($genallowed ? 'largetitle' : ''));
2740 
2741  print '</div></div>';
2742  }
2743 
2744  /*
2745  * Action webservice
2746  */
2747  if ($action == 'webservice' && GETPOST('mode', 'alpha') != "send" && !GETPOST('cancel', 'alpha')) {
2748  $mode = GETPOST('mode', 'alpha');
2749  $ws_url = $object->thirdparty->webservices_url;
2750  $ws_key = $object->thirdparty->webservices_key;
2751  $ws_user = GETPOST('ws_user', 'alpha');
2752  $ws_password = GETPOST('ws_password', 'alpha');
2753 
2754  // NS and Authentication parameters
2755  $ws_ns = 'http://www.dolibarr.org/ns/';
2756  $ws_authentication = array(
2757  'dolibarrkey'=>$ws_key,
2758  'sourceapplication'=>'DolibarrWebServiceClient',
2759  'login'=>$ws_user,
2760  'password'=>$ws_password,
2761  'entity'=>''
2762  );
2763 
2764  print load_fiche_titre($langs->trans('CreateRemoteOrder'), '');
2765 
2766  //Is everything filled?
2767  if (empty($ws_url) || empty($ws_key)) {
2768  setEventMessages($langs->trans("ErrorWebServicesFieldsRequired"), null, 'errors');
2769  $mode = "init";
2770  $error_occurred = true; //Don't allow to set the user/pass if thirdparty fields are not filled
2771  } elseif ($mode != "init" && (empty($ws_user) || empty($ws_password))) {
2772  setEventMessages($langs->trans("ErrorFieldsRequired"), null, 'errors');
2773  $mode = "init";
2774  }
2775 
2776  if ($mode == "init") {
2777  //Table/form header
2778  print '<table class="border centpercent">';
2779  print '<form action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'" method="post">';
2780  print '<input type="hidden" name="token" value="'.newToken().'">';
2781  print '<input type="hidden" name="action" value="webservice">';
2782  print '<input type="hidden" name="mode" value="check">';
2783 
2784  if ($error_occurred) {
2785  print "<br>".$langs->trans("ErrorOccurredReviseAndRetry")."<br>";
2786  print '<input class="button button-cancel" type="submit" id="cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
2787  } else {
2788  // Webservice url
2789  print '<tr><td>'.$langs->trans("WebServiceURL").'</td><td colspan="3">'.dol_print_url($ws_url).'</td></tr>';
2790  //Remote User
2791  print '<tr><td>'.$langs->trans("User").'</td><td><input class="width100" type="text" name="ws_user"></td></tr>';
2792  //Remote Password
2793  print '<tr><td>'.$langs->trans("Password").'</td><td><input class="width100" type="text" name="ws_password"></td></tr>';
2794  //Submit button
2795  print '<tr><td class="center" colspan="2">';
2796  print '<input type="submit" class="button" id="ws_submit" name="ws_submit" value="'.$langs->trans("CreateRemoteOrder").'">';
2797  print ' &nbsp; &nbsp; ';
2798  //Cancel button
2799  print '<input class="button button-cancel" type="submit" id="cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
2800  print '</td></tr>';
2801  }
2802 
2803  //End table/form
2804  print '</form>';
2805  print '</table>';
2806  } elseif ($mode == "check") {
2807  $ws_entity = '';
2808  $ws_thirdparty = '';
2809  $error_occurred = false;
2810 
2811  //Create SOAP client and connect it to user
2812  $soapclient_user = new nusoap_client($ws_url."/webservices/server_user.php");
2813  $soapclient_user->soap_defencoding = 'UTF-8';
2814  $soapclient_user->decodeUTF8(false);
2815 
2816  //Get the thirdparty associated to user
2817  $ws_parameters = array('authentication'=>$ws_authentication, 'id' => '', 'ref'=>$ws_user);
2818  $result_user = $soapclient_user->call("getUser", $ws_parameters, $ws_ns, '');
2819  $user_status_code = $result_user["result"]["result_code"];
2820 
2821  if ($user_status_code == "OK") {
2822  //Fill the variables
2823  $ws_entity = $result_user["user"]["entity"];
2824  $ws_authentication['entity'] = $ws_entity;
2825  $ws_thirdparty = $result_user["user"]["fk_thirdparty"];
2826  if (empty($ws_thirdparty)) {
2827  setEventMessages($langs->trans("RemoteUserMissingAssociatedSoc"), null, 'errors');
2828  $error_occurred = true;
2829  } else {
2830  //Create SOAP client and connect it to product/service
2831  $soapclient_product = new nusoap_client($ws_url."/webservices/server_productorservice.php");
2832  $soapclient_product->soap_defencoding = 'UTF-8';
2833  $soapclient_product->decodeUTF8(false);
2834 
2835  // Iterate each line and get the reference that uses the supplier of that product/service
2836  $i = 0;
2837  foreach ($object->lines as $line) {
2838  $i = $i + 1;
2839  $ref_supplier = $line->ref_supplier;
2840  $line_id = $i."º) ".$line->product_ref.": ";
2841  if (empty($ref_supplier)) {
2842  continue;
2843  }
2844  $ws_parameters = array('authentication' => $ws_authentication, 'id' => '', 'ref' => $ref_supplier);
2845  $result_product = $soapclient_product->call("getProductOrService", $ws_parameters, $ws_ns, '');
2846  if (!$result_product) {
2847  setEventMessages($line_id.$langs->trans("SOAPError")." ".$soapclient_product->error_str." - ".$soapclient_product->response, null, 'errors');
2848  $error_occurred = true;
2849  break;
2850  }
2851 
2852  // Check the result code
2853  $status_code = $result_product["result"]["result_code"];
2854  if (empty($status_code)) { //No result, check error str
2855  setEventMessages($langs->trans("SOAPError")." '".$soapclient_order->error_str."'", null, 'errors');
2856  } elseif ($status_code != "OK") { //Something went wrong
2857  if ($status_code == "NOT_FOUND") {
2858  setEventMessages($line_id.$langs->trans("SupplierMissingRef")." '".$ref_supplier."'", null, 'warnings');
2859  } else {
2860  setEventMessages($line_id.$langs->trans("ResponseNonOK")." '".$status_code."' - '".$result_product["result"]["result_label"]."'", null, 'errors');
2861  $error_occurred = true;
2862  break;
2863  }
2864  }
2865 
2866 
2867  // Ensure that price is equal and warn user if it's not
2868  $supplier_price = price($result_product["product"]["price_net"]); //Price of client tab in supplier dolibarr
2869  $local_price = null; //Price of supplier as stated in product suppliers tab on this dolibarr, NULL if not found
2870 
2871  $product_fourn = new ProductFournisseur($db);
2872  $product_fourn_list = $product_fourn->list_product_fournisseur_price($line->fk_product);
2873  if (count($product_fourn_list) > 0) {
2874  foreach ($product_fourn_list as $product_fourn_line) {
2875  //Only accept the line where the supplier is the same at this order and has the same ref
2876  if ($product_fourn_line->fourn_id == $object->socid && $product_fourn_line->fourn_ref == $ref_supplier) {
2877  $local_price = price($product_fourn_line->fourn_price);
2878  }
2879  }
2880  }
2881 
2882  if ($local_price != null && $local_price != $supplier_price) {
2883  setEventMessages($line_id.$langs->trans("RemotePriceMismatch")." ".$supplier_price." - ".$local_price, null, 'warnings');
2884  }
2885 
2886  // Check if is in sale
2887  if (empty($result_product["product"]["status_tosell"])) {
2888  setEventMessages($line_id.$langs->trans("ProductStatusNotOnSellShort")." '".$ref_supplier."'", null, 'warnings');
2889  }
2890  }
2891  }
2892  } elseif ($user_status_code == "PERMISSION_DENIED") {
2893  setEventMessages($langs->trans("RemoteUserNotPermission"), null, 'errors');
2894  $error_occurred = true;
2895  } elseif ($user_status_code == "BAD_CREDENTIALS") {
2896  setEventMessages($langs->trans("RemoteUserBadCredentials"), null, 'errors');
2897  $error_occurred = true;
2898  } else {
2899  setEventMessages($langs->trans("ResponseNonOK")." '".$user_status_code."'", null, 'errors');
2900  $error_occurred = true;
2901  }
2902 
2903  //Form
2904  print '<form action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'" method="post">';
2905  print '<input type="hidden" name="token" value="'.newToken().'">';
2906  print '<input type="hidden" name="action" value="webservice">';
2907  print '<input type="hidden" name="mode" value="send">';
2908  print '<input type="hidden" name="ws_user" value="'.$ws_user.'">';
2909  print '<input type="hidden" name="ws_password" value="'.$ws_password.'">';
2910  print '<input type="hidden" name="ws_entity" value="'.$ws_entity.'">';
2911  print '<input type="hidden" name="ws_thirdparty" value="'.$ws_thirdparty.'">';
2912  if ($error_occurred) {
2913  print "<br>".$langs->trans("ErrorOccurredReviseAndRetry")."<br>";
2914  } else {
2915  print '<input type="submit" class="button" id="ws_submit" name="ws_submit" value="'.$langs->trans("Confirm").'">';
2916  print ' &nbsp; &nbsp; ';
2917  }
2918  print '<input class="button button-cancel" type="submit" id="cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
2919  print '</form>';
2920  }
2921  }
2922 
2923  // Presend form
2924  $modelmail = 'order_supplier_send';
2925  $defaulttopic = 'SendOrderRef';
2926  $diroutput = $conf->fournisseur->commande->dir_output;
2927  $autocopy = 'MAIN_MAIL_AUTOCOPY_SUPPLIER_ORDER_TO';
2928  $trackid = 'sord'.$object->id;
2929 
2930  include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php';
2931  }
2932 }
2933 
2934 // End of page
2935 llxFooter();
2936 $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_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:45
$parameters
Actions.
Definition: card.php:79
if(isModEnabled('facture') &&!empty($user->rights->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') &&!empty($user->rights->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)) $resql
Social contributions to pay.
Definition: index.php:745
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:138
dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='rowid', $fieldref='ref', $morehtmlref='', $moreparam='', $nodbprefix=0, $morehtmlleft='', $morehtmlstatus='', $onlybanner=0, $morehtmlright='')
Show tab footer of a card.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='')
Show tabs of a record.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0)
Returns text escaped for inclusion in HTML alt or title tags, or into values of HTML input fields.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_get_fiche_end($notab=0)
Return tab footer of a card.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='')
Set event messages in dol_events session object.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
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)
dol_print_url($url, $target='_blank', $max=32, $withpicto=0)
Show Url link.
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)
Fonction qui renvoie si tva doit etre tva percue recuperable.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
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.
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.
$formconfirm
if ($action == 'delbookkeepingyear') {
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.