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