dolibarr 20.0.0
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'), GETPOSTINT('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 $delivery_date = '';
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 $datedelivery = (!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 print $form->selectDate($datelivraison ? $datelivraison : -1, 'liv_', $usehourmin, $usehourmin, 0, "set");
1824 print '</td></tr>';
1825
1826 // Bank Account
1827 if (getDolGlobalString('BANK_ASK_PAYMENT_BANK_DURING_SUPPLIER_ORDER') && isModEnabled("bank")) {
1828 $langs->load("bank");
1829 print '<tr><td>'.$langs->trans('BankAccount').'</td><td>';
1830 print img_picto('', 'bank_account', 'class="pictofixedwidth"');
1831 $form->select_comptes($fk_account, 'fk_account', 0, '', 1);
1832 print '</td></tr>';
1833 }
1834
1835 // Project
1836 if (isModEnabled('project')) {
1837 $formproject = new FormProjets($db);
1838
1839 $langs->load('projects');
1840 print '<tr><td>'.$langs->trans('Project').'</td><td>';
1841 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');
1842 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>';
1843 print '</td></tr>';
1844 }
1845
1846 // Incoterms
1847 if (isModEnabled('incoterm')) {
1848 $fkincoterms = (!empty($object->fk_incoterms) ? $object->fk_incoterms : ($socid > 0 ? $societe->fk_incoterms : ''));
1849 $locincoterms = (!empty($object->location_incoterms) ? $object->location_incoterms : ($socid > 0 ? $societe->location_incoterms : ''));
1850 print '<tr>';
1851 print '<td><label for="incoterm_id">'.$form->textwithpicto($langs->trans("IncotermLabel"), $object->label_incoterms, 1).'</label></td>';
1852 print '<td class="maxwidthonsmartphone">';
1853 print img_picto('', 'incoterm', 'class="pictofixedwidth"');
1854 print $form->select_incoterms($fkincoterms, $locincoterms);
1855 print '</td></tr>';
1856 }
1857
1858 // Multicurrency
1859 if (isModEnabled("multicurrency")) {
1860 print '<tr>';
1861 print '<td>'.$form->editfieldkey('Currency', 'multicurrency_code', '', $object, 0).'</td>';
1862 print '<td class="maxwidthonsmartphone">';
1863 print img_picto('', 'currency', 'class="pictofixedwidth"');
1864 print $form->selectMultiCurrency($currency_code, 'multicurrency_code');
1865 print '</td></tr>';
1866 }
1867
1868 print '<tr><td>'.$langs->trans('NotePublic').'</td>';
1869 print '<td>';
1870 $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%');
1871 print $doleditor->Create(1);
1872 print '</td>';
1873 //print '<textarea name="note_public" wrap="soft" cols="60" rows="'.ROWS_5.'"></textarea>';
1874 print '</tr>';
1875
1876 print '<tr><td>'.$langs->trans('NotePrivate').'</td>';
1877 print '<td>';
1878 $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%');
1879 print $doleditor->Create(1);
1880 print '</td>';
1881 //print '<td><textarea name="note_private" wrap="soft" cols="60" rows="'.ROWS_5.'"></textarea></td>';
1882 print '</tr>';
1883
1884 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
1885 print "\n<!-- ".$classname." info -->";
1886 print "\n";
1887 print '<input type="hidden" name="amount" value="'.$objectsrc->total_ht.'">'."\n";
1888 print '<input type="hidden" name="total" value="'.$objectsrc->total_ttc.'">'."\n";
1889 print '<input type="hidden" name="tva" value="'.$objectsrc->total_tva.'">'."\n";
1890 print '<input type="hidden" name="origin" value="'.$objectsrc->element.'">';
1891 print '<input type="hidden" name="originid" value="'.$objectsrc->id.'">';
1892
1893 $newclassname = $classname;
1894 print '<tr><td>'.$langs->trans($newclassname).'</td><td>'.$objectsrc->getNomUrl(1, 'supplier').'</td></tr>';
1895 print '<tr><td>'.$langs->trans('AmountHT').'</td><td>'.price($objectsrc->total_ht).'</td></tr>';
1896 print '<tr><td>'.$langs->trans('AmountVAT').'</td><td>'.price($objectsrc->total_tva)."</td></tr>";
1897 if ($mysoc->localtax1_assuj == "1" || $objectsrc->total_localtax1 != 0) { // Localtax1 RE
1898 print '<tr><td>'.$langs->transcountry("AmountLT1", $mysoc->country_code).'</td><td>'.price($objectsrc->total_localtax1)."</td></tr>";
1899 }
1900
1901 if ($mysoc->localtax2_assuj == "1" || $objectsrc->total_localtax2 != 0) { // Localtax2 IRPF
1902 print '<tr><td>'.$langs->transcountry("AmountLT2", $mysoc->country_code).'</td><td>'.price($objectsrc->total_localtax2)."</td></tr>";
1903 }
1904
1905 print '<tr><td>'.$langs->trans('AmountTTC').'</td><td>'.price($objectsrc->total_ttc)."</td></tr>";
1906
1907 if (isModEnabled("multicurrency")) {
1908 print '<tr><td>'.$langs->trans('MulticurrencyAmountHT').'</td><td>'.price($objectsrc->multicurrency_total_ht).'</td></tr>';
1909 print '<tr><td>'.$langs->trans('MulticurrencyAmountVAT').'</td><td>'.price($objectsrc->multicurrency_total_tva).'</td></tr>';
1910 print '<tr><td>'.$langs->trans('MulticurrencyAmountTTC').'</td><td>'.price($objectsrc->multicurrency_total_ttc).'</td></tr>';
1911 }
1912 }
1913
1914 // Other options
1915 $parameters = array();
1916 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1917 print $hookmanager->resPrint;
1918
1919 if (empty($reshook)) {
1920 print $object->showOptionals($extrafields, 'create');
1921 }
1922
1923 // Bouton "Create Draft"
1924 print "</table>\n";
1925 }
1926 print dol_get_fiche_end();
1927
1928 print $form->buttonsSaveCancel("CreateDraft");
1929
1930 // Show origin lines
1931 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
1932 $title = $langs->trans('ProductsAndServices');
1933 print load_fiche_titre($title);
1934
1935 print '<div class="div-table-responsive-no-min">';
1936 print '<table class="noborder centpercent">';
1937
1938 $selectedLines = array();
1939
1940 $objectsrc->printOriginLinesList('', $selectedLines);
1941
1942 print '</table>';
1943 print '</div>';
1944 }
1945 print "</form>\n";
1946} elseif (!empty($object->id)) {
1947 // view
1948 $result = $object->fetch($id, $ref);
1949 $object->fetch_thirdparty();
1950
1951 $societe = $object->thirdparty;
1952
1953 $author = new User($db);
1954 $author->fetch($object->user_author_id);
1955
1957
1958 $title = $langs->trans("SupplierOrder");
1959 print dol_get_fiche_head($head, 'card', $title, -1, 'order');
1960
1961
1962 $formconfirm = '';
1963
1964 // Confirmation de la suppression de la commande
1965 if ($action == 'delete') {
1966 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('DeleteOrder'), $langs->trans('ConfirmDeleteOrder'), 'confirm_delete', '', 0, 2);
1967 }
1968
1969 // Clone confirmation
1970 if ($action == 'clone') {
1971 $filter = '(s.fournisseur:=:1)';
1972 // Create an array for form
1973 $formquestion = array(
1974 array('type' => 'other', 'name' => 'socid', 'label' => $langs->trans("SelectThirdParty"), 'value' => $form->select_company(GETPOSTINT('socid'), 'socid', $filter))
1975 );
1976 // Paiement incomplet. On demande si motif = escompte ou autre
1977 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneOrder', $object->ref), 'confirm_clone', $formquestion, 'yes', 1);
1978 }
1979
1980 // Confirmation de la validation
1981 if ($action == 'valid') {
1982 $object->date_commande = dol_now();
1983
1984 // We check if number is temporary number
1985 if (preg_match('/^[\‍(]?PROV/i', $object->ref) || empty($object->ref)) { // empty should not happened, but when it occurs, the test save life
1986 $newref = $object->getNextNumRef($object->thirdparty);
1987 } else {
1988 $newref = $object->ref;
1989 }
1990
1991 if ($newref < 0) {
1992 setEventMessages($object->error, $object->errors, 'errors');
1993 $action = '';
1994 } else {
1995 $text = $langs->trans('ConfirmValidateOrder', $newref);
1996 if (isModEnabled('notification')) {
1997 require_once DOL_DOCUMENT_ROOT.'/core/class/notify.class.php';
1998 $notify = new Notify($db);
1999 $text .= '<br>';
2000 $text .= $notify->confirmMessage('ORDER_SUPPLIER_VALIDATE', $object->socid, $object);
2001 }
2002
2003 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ValidateOrder'), $text, 'confirm_valid', '', 0, 1);
2004 }
2005 }
2006
2007 // Confirm approval
2008 if ($action == 'approve' || $action == 'approve2') {
2009 $qualified_for_stock_change = 0;
2010 if (!getDolGlobalString('STOCK_SUPPORTS_SERVICES')) {
2011 $qualified_for_stock_change = $object->hasProductsOrServices(2);
2012 } else {
2013 $qualified_for_stock_change = $object->hasProductsOrServices(1);
2014 }
2015
2016 $formquestion = array();
2017 if (isModEnabled('stock') && getDolGlobalString('STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER') && $qualified_for_stock_change) {
2018 $langs->load("stocks");
2019 require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php';
2020 $formproduct = new FormProduct($db);
2021 $forcecombo = 0;
2022 if ($conf->browser->name == 'ie') {
2023 $forcecombo = 1; // There is a bug in IE10 that make combo inside popup crazy
2024 }
2025 $formquestion = array(
2026 //'text' => $langs->trans("ConfirmClone"),
2027 //array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1),
2028 //array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1),
2029 array('type' => 'other', 'name' => 'idwarehouse', 'label' => $langs->trans("SelectWarehouseForStockIncrease"), 'value' => $formproduct->selectWarehouses(GETPOSTINT('idwarehouse'), 'idwarehouse', '', 1, 0, 0, '', 0, $forcecombo))
2030 );
2031 }
2032 $text = $langs->trans("ConfirmApproveThisOrder", $object->ref);
2033 if (isModEnabled('notification')) {
2034 require_once DOL_DOCUMENT_ROOT.'/core/class/notify.class.php';
2035 $notify = new Notify($db);
2036 $text .= '<br>';
2037 $text .= $notify->confirmMessage('ORDER_SUPPLIER_APPROVE', $object->socid, $object);
2038 }
2039
2040 $formconfirm = $form->formconfirm($_SERVER['PHP_SELF']."?id=".$object->id, $langs->trans("ApproveThisOrder"), $text, "confirm_".$action, $formquestion, 1, 1, 240);
2041 }
2042
2043 // Confirmation of disapproval
2044 if ($action == 'refuse') {
2045 $formquestion = array(
2046 array(
2047 'type' => 'text',
2048 'name' => 'refuse_note',
2049 'label' => $langs->trans("Reason"),
2050 'value' => '',
2051 'morecss' => 'minwidth300'
2052 )
2053 );
2054 $formconfirm = $form->formconfirm($_SERVER['PHP_SELF']."?id=$object->id", $langs->trans("DenyingThisOrder"), $langs->trans("ConfirmDenyingThisOrder", $object->ref), "confirm_refuse", $formquestion, 0, 1);
2055 }
2056
2057 // Confirmation of cancellation
2058 if ($action == 'cancel') {
2059 $formquestion = array(
2060 array(
2061 'type' => 'text',
2062 'name' => 'cancel_note',
2063 'label' => $langs->trans("Reason"),
2064 'value' => '',
2065 'morecss' => 'minwidth300'
2066 )
2067 );
2068 if (!empty($conf->notification->enabled)) {
2069 require_once DOL_DOCUMENT_ROOT.'/core/class/notify.class.php';
2070 $notify = new Notify($db);
2071 $text .= '<br>';
2072 $text .= $notify->confirmMessage('ORDER_SUPPLIER_CANCEL', $object->socid, $object);
2073 }
2074 $formconfirm = $form->formconfirm($_SERVER['PHP_SELF']."?id=$object->id", $langs->trans("Cancel"), $langs->trans("ConfirmCancelThisOrder", $object->ref), "confirm_cancel", $formquestion, 0, 1);
2075 }
2076
2077 // Confirmation de l'envoi de la commande
2078 if ($action == 'commande') {
2079 $date_com = dol_mktime(GETPOST('rehour'), GETPOST('remin'), GETPOST('resec'), GETPOST("remonth"), GETPOST("reday"), GETPOST("reyear"));
2080 if (!empty($conf->notification->enabled)) {
2081 require_once DOL_DOCUMENT_ROOT.'/core/class/notify.class.php';
2082 $notify = new Notify($db);
2083 $text .= '<br>';
2084 $text .= $notify->confirmMessage('ORDER_SUPPLIER_SUBMIT', $object->socid, $object);
2085 }
2086 $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);
2087 }
2088
2089 // Confirmation to delete line
2090 if ($action == 'ask_deleteline') {
2091 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$lineid, $langs->trans('DeleteProductLine'), $langs->trans('ConfirmDeleteProductLine'), 'confirm_deleteline', '', 0, 1);
2092 }
2093
2094 $parameters = array('formConfirm' => $formconfirm, 'lineid' => $lineid);
2095 $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
2096 if (empty($reshook)) {
2097 $formconfirm .= $hookmanager->resPrint;
2098 } elseif ($reshook > 0) {
2099 $formconfirm = $hookmanager->resPrint;
2100 }
2101
2102 // Print form confirm
2103 print $formconfirm;
2104
2105
2106 // Supplier order card
2107
2108 $linkback = '<a href="'.DOL_URL_ROOT.'/fourn/commande/list.php?restore_lastsearch_values=1'.(!empty($socid) ? '&socid='.$socid : '').'">'.$langs->trans("BackToList").'</a>';
2109
2110 $morehtmlref = '<div class="refidno">';
2111 // Ref supplier
2112 $morehtmlref .= $form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $usercancreate, 'string', '', 0, 1);
2113 $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);
2114 // Thirdparty
2115 $morehtmlref .= '<br>';
2116 if (getDolGlobalString('MAIN_CAN_EDIT_SUPPLIER_ON_SUPPLIER_ORDER') && !empty($usercancreate) && $action == 'edit_thirdparty') {
2117 $morehtmlref .= '<form method="post" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
2118 $morehtmlref .= '<input type="hidden" name="action" value="set_thirdparty">';
2119 $morehtmlref .= '<input type="hidden" name="token" value="'.newToken().'">';
2120 $filter = '(s.fournisseur:=:1)';
2121 $morehtmlref .= $form->select_company($object->thirdparty->id, 'new_socid', $filter, '', 0, 0, array(), 0, 'minwidth300');
2122 $morehtmlref .= '<input type="submit" class="button valignmiddle" value="'.$langs->trans("Modify").'">';
2123 $morehtmlref .= '</form>';
2124 }
2125 if (!getDolGlobalString('MAIN_CAN_EDIT_SUPPLIER_ON_SUPPLIER_ORDER') || $action != 'edit_thirdparty') {
2126 if (getDolGlobalString('MAIN_CAN_EDIT_SUPPLIER_ON_SUPPLIER_ORDER') && $object->statut == CommandeFournisseur::STATUS_DRAFT) {
2127 $morehtmlref .= '<a class="editfielda" href="'.$_SERVER['PHP_SELF'].'?action=edit_thirdparty&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->transnoentitiesnoconv('SetThirdParty')).'</a>';
2128 }
2129 $morehtmlref .= $object->thirdparty->getNomUrl(1, 'supplier');
2130 if (!getDolGlobalString('MAIN_DISABLE_OTHER_LINK') && $object->thirdparty->id > 0) {
2131 $morehtmlref .= ' (<a href="'.DOL_URL_ROOT.'/fourn/commande/list.php?socid='.$object->thirdparty->id.'&search_company='.urlencode($object->thirdparty->name).'">'.$langs->trans("OtherOrders").'</a>)';
2132 }
2133 }
2134
2135 // Project
2136 if (isModEnabled('project')) {
2137 $langs->load("projects");
2138 $morehtmlref .= '<br>';
2139 if ($permissiontoadd) {
2140 $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
2141 if ($action != 'classify' && $caneditproject) {
2142 $morehtmlref .= '<a class="editfielda" href="'.$_SERVER['PHP_SELF'].'?action=classify&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->transnoentitiesnoconv('SetProject')).'</a> ';
2143 }
2144 $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');
2145 } else {
2146 if (!empty($object->fk_project)) {
2147 $proj = new Project($db);
2148 $proj->fetch($object->fk_project);
2149 $morehtmlref .= $proj->getNomUrl(1);
2150 if ($proj->title) {
2151 $morehtmlref .= '<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).'</span>';
2152 }
2153 }
2154 }
2155 }
2156 $morehtmlref .= '</div>';
2157
2158
2159 dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
2160
2161 // Call Hook tabContentViewSupplierOrder
2162 $parameters = array();
2163 // Note that $action and $object may be modified by hook
2164 $reshook = $hookmanager->executeHooks('tabContentViewSupplierOrder', $parameters, $object, $action);
2165 if (empty($reshook)) {
2166 print '<div class="fichecenter">';
2167 print '<div class="fichehalfleft">';
2168 print '<div class="underbanner clearboth"></div>';
2169
2170 print '<table class="border tableforfield centpercent">';
2171
2172 // Date
2173 if ($object->methode_commande_id > 0) {
2174 $usehourmin = 0;
2175 if (getDolGlobalString('SUPPLIER_ORDER_USE_HOUR_FOR_DELIVERY_DATE')) {
2176 $usehourmin = 1;
2177 }
2178 print '<tr><td class="titlefield">'.$langs->trans("Date").'</td><td>';
2179 print $object->date_commande ? dol_print_date($object->date_commande, $usehourmin ? 'dayhour' : 'day') : '';
2180 if ($object->hasDelay() && !empty($object->delivery_date) && !empty($object->date_commande)) {
2181 print ' '.img_picto($langs->trans("Late").' : '.$object->showDelay(), "warning");
2182 }
2183 print "</td></tr>";
2184
2185 if ($object->methode_commande) {
2186 print '<tr><td>'.$langs->trans("Method").'</td><td>'.$object->getInputMethod().'</td></tr>';
2187 }
2188 }
2189
2190 // Author
2191 print '<tr><td class="titlefield">'.$langs->trans("AuthorRequest").'</td>';
2192 print '<td>'.$author->getNomUrl(-1, '', 0, 0, 0).'</td>';
2193 print '</tr>';
2194
2195 // Relative and absolute discounts
2196 if (getDolGlobalString('FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS')) {
2197 $filterabsolutediscount = "fk_invoice_supplier_source IS NULL"; // If we want deposit to be subtracted to payments only and not to total of final invoice
2198 $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
2199 } else {
2200 $filterabsolutediscount = "fk_invoice_supplier_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS PAID)%')";
2201 $filtercreditnote = "fk_invoice_supplier_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS PAID)%')";
2202 }
2203
2204 $absolute_discount = $societe->getAvailableDiscounts('', $filterabsolutediscount, 0, 1);
2205 $absolute_creditnote = $societe->getAvailableDiscounts('', $filtercreditnote, 0, 1);
2206 $absolute_discount = price2num($absolute_discount, 'MT');
2207 $absolute_creditnote = price2num($absolute_creditnote, 'MT');
2208
2209 print '<tr><td class="titlefield">'.$langs->trans('Discounts').'</td><td>';
2210
2211 $thirdparty = $societe;
2212 $discount_type = 1;
2213 $backtopage = urlencode($_SERVER["PHP_SELF"].'?id='.$object->id);
2214 include DOL_DOCUMENT_ROOT.'/core/tpl/object_discounts.tpl.php';
2215
2216 print '</td></tr>';
2217
2218 // Default terms of the settlement
2219 $langs->load('bills');
2220 print '<tr><td class="nowrap">';
2221 print '<table class="nobordernopadding centpercent"><tr><td class="nowrap">';
2222 print $langs->trans('PaymentConditions');
2223 print '<td>';
2224 if ($action != 'editconditions' && $permissiontoadd) {
2225 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>';
2226 }
2227 print '</tr></table>';
2228 print '</td><td>';
2229 if ($action == 'editconditions') {
2230 $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->cond_reglement_id, 'cond_reglement_id');
2231 } else {
2232 $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->cond_reglement_id, 'none');
2233 }
2234 print "</td>";
2235 print '</tr>';
2236
2237 // Mode of payment
2238 $langs->load('bills');
2239 print '<tr><td class="nowrap">';
2240 print '<table class="nobordernopadding centpercent"><tr><td class="nowrap">';
2241 print $langs->trans('PaymentMode');
2242 print '</td>';
2243 if ($action != 'editmode' && $permissiontoadd) {
2244 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>';
2245 }
2246 print '</tr></table>';
2247 print '</td><td>';
2248 if ($action == 'editmode') {
2249 $form->form_modes_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->mode_reglement_id, 'mode_reglement_id', 'DBIT', 1, 1);
2250 } else {
2251 $form->form_modes_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->mode_reglement_id, 'none');
2252 }
2253 print '</td></tr>';
2254
2255 // Multicurrency
2256 if (isModEnabled("multicurrency")) {
2257 // Multicurrency code
2258 print '<tr>';
2259 print '<td>';
2260 print '<table class="nobordernopadding centpercent"><tr><td>';
2261 print $form->editfieldkey('Currency', 'multicurrency_code', '', $object, 0);
2262 print '</td>';
2263 if ($action != 'editmulticurrencycode' && $object->statut == $object::STATUS_DRAFT && $permissiontoadd) {
2264 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>';
2265 }
2266 print '</tr></table>';
2267 print '</td><td>';
2268 if ($action == 'editmulticurrencycode') {
2269 $form->form_multicurrency_code($_SERVER['PHP_SELF'].'?id='.$object->id, $object->multicurrency_code, 'multicurrency_code');
2270 } else {
2271 $form->form_multicurrency_code($_SERVER['PHP_SELF'].'?id='.$object->id, $object->multicurrency_code, 'none');
2272 }
2273 print '</td></tr>';
2274
2275 // Multicurrency rate
2276 if ($object->multicurrency_code != $conf->currency || $object->multicurrency_tx != 1) {
2277 print '<tr>';
2278 print '<td>';
2279 print '<table class="nobordernopadding centpercent"><tr>';
2280 print '<td>';
2281 print $form->editfieldkey('CurrencyRate', 'multicurrency_tx', '', $object, 0);
2282 print '</td>';
2283 if ($action != 'editmulticurrencyrate' && $object->statut == $object::STATUS_DRAFT && $object->multicurrency_code && $object->multicurrency_code != $conf->currency) {
2284 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>';
2285 }
2286 print '</tr></table>';
2287 print '</td><td>';
2288 if ($action == 'editmulticurrencyrate' || $action == 'actualizemulticurrencyrate') {
2289 if ($action == 'actualizemulticurrencyrate') {
2290 list($object->fk_multicurrency, $object->multicurrency_tx) = MultiCurrency::getIdAndTxFromCode($object->db, $object->multicurrency_code);
2291 }
2292 $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$object->id, $object->multicurrency_tx, 'multicurrency_tx', $object->multicurrency_code);
2293 } else {
2294 $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$object->id, $object->multicurrency_tx, 'none', $object->multicurrency_code);
2295 if ($object->statut == $object::STATUS_DRAFT && $object->multicurrency_code && $object->multicurrency_code != $conf->currency) {
2296 print '<div class="inline-block"> &nbsp; &nbsp; &nbsp; &nbsp; ';
2297 print '<a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=actualizemulticurrencyrate">'.$langs->trans("ActualizeCurrency").'</a>';
2298 print '</div>';
2299 }
2300 }
2301 print '</td></tr>';
2302 }
2303 }
2304
2305 // Bank Account
2306 if (getDolGlobalString('BANK_ASK_PAYMENT_BANK_DURING_SUPPLIER_ORDER') && isModEnabled("bank")) {
2307 print '<tr><td class="nowrap">';
2308 print '<table class="nobordernopadding centpercent"><tr><td class="nowrap">';
2309 print $langs->trans('BankAccount');
2310 print '<td>';
2311 if ($action != 'editbankaccount' && $permissiontoadd) {
2312 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>';
2313 }
2314 print '</tr></table>';
2315 print '</td><td>';
2316 if ($action == 'editbankaccount') {
2317 $form->formSelectAccount($_SERVER['PHP_SELF'].'?id='.$object->id, $object->fk_account, 'fk_account', 1);
2318 } else {
2319 $form->formSelectAccount($_SERVER['PHP_SELF'].'?id='.$object->id, $object->fk_account, 'none');
2320 }
2321 print '</td>';
2322 print '</tr>';
2323 }
2324
2325 // Delivery delay (in days)
2326 print '<tr>';
2327 print '<td>'.$langs->trans('NbDaysToDelivery').'&nbsp;'.img_picto($langs->trans('DescNbDaysToDelivery'), 'info', 'style="cursor:help"').'</td>';
2328 print '<td>'.$object->getMaxDeliveryTimeDay($langs).'</td>';
2329 print '</tr>';
2330
2331 // Delivery date planned
2332 print '<tr><td>';
2333 print '<table class="nobordernopadding centpercent"><tr><td>';
2334 print $langs->trans('DateDeliveryPlanned');
2335 print '</td>';
2336 if ($action != 'editdate_livraison') {
2337 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>';
2338 }
2339 print '</tr></table>';
2340 print '</td><td>';
2341 if ($action == 'editdate_livraison') {
2342 print '<form name="setdate_livraison" action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'" method="post">';
2343 print '<input type="hidden" name="token" value="'.newToken().'">';
2344 print '<input type="hidden" name="action" value="setdate_livraison">';
2345 $usehourmin = 0;
2346 if (getDolGlobalString('SUPPLIER_ORDER_USE_HOUR_FOR_DELIVERY_DATE')) {
2347 $usehourmin = 1;
2348 }
2349 print $form->selectDate($object->delivery_date ? $object->delivery_date : -1, 'liv_', $usehourmin, $usehourmin, 0, "setdate_livraison");
2350 print '<input type="submit" class="button button-edit smallpaddingimp valign middle" value="'.$langs->trans('Modify').'">';
2351 print '</form>';
2352 } else {
2353 $usehourmin = 'day';
2354 if (getDolGlobalString('SUPPLIER_ORDER_USE_HOUR_FOR_DELIVERY_DATE')) {
2355 $usehourmin = 'dayhour';
2356 }
2357 print $object->delivery_date ? dol_print_date($object->delivery_date, $usehourmin) : '&nbsp;';
2358 if ($object->hasDelay() && !empty($object->delivery_date) && ($object->statut == $object::STATUS_ORDERSENT || $object->statut == $object::STATUS_RECEIVED_PARTIALLY)) {
2359 print ' '.img_picto($langs->trans("Late").' : '.$object->showDelay(), "warning");
2360 }
2361 }
2362 print '</td></tr>';
2363
2364 // Incoterms
2365 if (isModEnabled('incoterm')) {
2366 print '<tr><td>';
2367 print '<table class="nobordernopadding centpercent"><tr><td>';
2368 print $langs->trans('IncotermLabel');
2369 print '<td><td class="right">';
2370 if ($usercancreate) {
2371 print '<a class="editfielda" href="'.DOL_URL_ROOT.'/fourn/commande/card.php?id='.$object->id.'&action=editincoterm&token='.newToken().'">'.img_edit().'</a>';
2372 } else {
2373 print '&nbsp;';
2374 }
2375 print '</td></tr></table>';
2376 print '</td>';
2377 print '<td>';
2378 if ($action != 'editincoterm') {
2379 print $form->textwithpicto(dol_escape_htmltag($object->display_incoterms()), $object->label_incoterms, 1);
2380 } else {
2381 print $form->select_incoterms((!empty($object->fk_incoterms) ? $object->fk_incoterms : ''), (!empty($object->location_incoterms) ? $object->location_incoterms : ''), $_SERVER['PHP_SELF'].'?id='.$object->id);
2382 }
2383 print '</td></tr>';
2384 }
2385
2386 // Other attributes
2387 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
2388
2389 print '</table>';
2390
2391 print '</div>';
2392 print '<div class="fichehalfright">';
2393 print '<div class="underbanner clearboth"></div>';
2394
2395 print '<table class="border tableforfield centpercent">';
2396
2397 print '<tr>';
2398 // Amount HT
2399 print '<td class="titlefieldmiddle">' . $langs->trans('AmountHT') . '</td>';
2400 print '<td class="nowrap amountcard right">' . price($object->total_ht, 0, $langs, 0, -1, -1, $conf->currency) . '</td>';
2401 if (isModEnabled("multicurrency") && ($object->multicurrency_code && $object->multicurrency_code != $conf->currency)) {
2402 // Multicurrency Amount HT
2403 print '<td class="nowrap amountcard right">' . price($object->multicurrency_total_ht, 0, $langs, 0, -1, -1, $object->multicurrency_code) . '</td>';
2404 }
2405 print '</tr>';
2406
2407 print '<tr>';
2408 // Amount VAT
2409 print '<td class="titlefieldmiddle">' . $langs->trans('AmountVAT') . '</td>';
2410 print '<td class="nowrap amountcard right">' . price($object->total_tva, 0, $langs, 0, -1, -1, $conf->currency) . '</td>';
2411 if (isModEnabled("multicurrency") && ($object->multicurrency_code && $object->multicurrency_code != $conf->currency)) {
2412 // Multicurrency Amount VAT
2413 print '<td class="nowrap amountcard right">' . price($object->multicurrency_total_tva, 0, $langs, 0, -1, -1, $object->multicurrency_code) . '</td>';
2414 }
2415 print '</tr>';
2416
2417 // Amount Local Taxes
2418 if ($mysoc->localtax1_assuj == "1" || $object->total_localtax1 != 0) {
2419 print '<tr>';
2420 print '<td class="titlefieldmiddle">' . $langs->transcountry("AmountLT1", $mysoc->country_code) . '</td>';
2421 print '<td class="nowrap amountcard right">' . price($object->total_localtax1, 0, $langs, 0, -1, -1, $conf->currency) . '</td>';
2422 if (isModEnabled("multicurrency") && ($object->multicurrency_code && $object->multicurrency_code != $conf->currency)) {
2423 print '<td class="nowrap amountcard right">' . price($object->total_localtax1, 0, $langs, 0, -1, -1, $object->multicurrency_code) . '</td>';
2424 }
2425 print '</tr>';
2426
2427 if ($mysoc->localtax2_assuj == "1" || $object->total_localtax2 != 0) {
2428 print '<tr>';
2429 print '<td>' . $langs->transcountry("AmountLT2", $mysoc->country_code) . '</td>';
2430 print '<td class="nowrap amountcard right">' . price($object->total_localtax2, 0, $langs, 0, -1, -1, $conf->currency) . '</td>';
2431 if (isModEnabled("multicurrency") && ($object->multicurrency_code && $object->multicurrency_code != $conf->currency)) {
2432 print '<td class="nowrap amountcard right">' . price($object->total_localtax2, 0, $langs, 0, -1, -1, $object->multicurrency_code) . '</td>';
2433 }
2434 print '</tr>';
2435 }
2436 }
2437
2438 $alert = '';
2439 if (getDolGlobalString('ORDER_MANAGE_MIN_AMOUNT') && $object->total_ht < $object->thirdparty->supplier_order_min_amount) {
2440 $alert = ' ' . img_warning($langs->trans('OrderMinAmount') . ': ' . price($object->thirdparty->supplier_order_min_amount));
2441 }
2442
2443 print '<tr>';
2444 // Amount TTC
2445 print '<td>' . $langs->trans('AmountTTC') . '</td>';
2446 print '<td class="nowrap amountcard right">' . price($object->total_ttc, 0, $langs, 0, -1, -1, $conf->currency) . $alert . '</td>';
2447 if (isModEnabled("multicurrency") && ($object->multicurrency_code && $object->multicurrency_code != $conf->currency)) {
2448 // Multicurrency Amount TTC
2449 print '<td class="nowrap amountcard right">' . price($object->multicurrency_total_ttc, 0, $langs, 0, -1, -1, $object->multicurrency_code) . '</td>';
2450 }
2451 print '</tr>';
2452
2453 print '</table>';
2454
2455 // Margin Infos
2456 /*if (isModEnabled('margin')) {
2457 $formmargin->displayMarginInfos($object);
2458 }*/
2459
2460
2461 print '</div>';
2462 print '</div>';
2463
2464 print '<div class="clearboth"></div><br>';
2465
2466 if (getDolGlobalString('MAIN_DISABLE_CONTACTS_TAB')) {
2467 $blocname = 'contacts';
2468 $title = $langs->trans('ContactsAddresses');
2469 include DOL_DOCUMENT_ROOT.'/core/tpl/bloc_showhide.tpl.php';
2470 }
2471
2472 if (getDolGlobalString('MAIN_DISABLE_NOTES_TAB')) {
2473 $blocname = 'notes';
2474 $title = $langs->trans('Notes');
2475 include DOL_DOCUMENT_ROOT.'/core/tpl/bloc_showhide.tpl.php';
2476 }
2477
2478 /*
2479 * Lines
2480 */
2481 //$result = $object->getLinesArray();
2482
2483
2484 print ' <form name="addproduct" id="addproduct" action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.(($action != 'editline') ? '' : '#line_'.GETPOSTINT('lineid')).'" method="POST">
2485 <input type="hidden" name="token" value="'.newToken().'">
2486 <input type="hidden" name="action" value="' . (($action != 'editline') ? 'addline' : 'updateline').'">
2487 <input type="hidden" name="mode" value="">
2488 <input type="hidden" name="page_y" value="">
2489 <input type="hidden" name="id" value="'.$object->id.'">
2490 <input type="hidden" name="socid" value="'.$societe->id.'">
2491 ';
2492
2493 if (!empty($conf->use_javascript_ajax) && $object->statut == 0) {
2494 include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php';
2495 }
2496
2497 print '<div class="div-table-responsive-no-min">';
2498 print '<table id="tablelines" class="noborder noshadow centpercent">';
2499
2500 // Add free products/services form
2501 global $forceall, $senderissupplier, $dateSelector, $inputalsopricewithtax;
2502 $forceall = 1;
2503 $dateSelector = 0;
2504 $inputalsopricewithtax = 1;
2505 $senderissupplier = 2; // $senderissupplier=2 is same than 1 but disable test on minimum qty and disable autofill qty with minimum.
2506 if (getDolGlobalString('SUPPLIER_ORDER_WITH_PREDEFINED_PRICES_ONLY')) {
2507 $senderissupplier = 1;
2508 }
2509
2510 // Show object lines
2511 if (!empty($object->lines)) {
2512 $object->printObjectLines($action, $object->thirdparty, $mysoc, $lineid, 1);
2513 }
2514
2515 $num = count($object->lines);
2516
2517 // Form to add new line
2518 if ($object->statut == CommandeFournisseur::STATUS_DRAFT && $usercancreate) {
2519 if ($action != 'editline') {
2520 // Add free products/services
2521
2522 $parameters = array();
2523 $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
2524 if ($reshook < 0) {
2525 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
2526 }
2527 if (empty($reshook)) {
2528 $object->formAddObjectLine(1, $societe, $mysoc);
2529 }
2530 }
2531 }
2532 print '</table>';
2533 print '</div>';
2534 print '</form>';
2535 }
2536
2537 print dol_get_fiche_end();
2538
2543 if ($user->socid == 0 && $action != 'delete') {
2544 if ($action != 'createorder' && $action != 'presend' && $action != 'editline') {
2545 print '<div class="tabsAction">';
2546
2547 $parameters = array();
2548 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been
2549 // modified by hook
2550 if (empty($reshook)) {
2551 $object->fetchObjectLinked(); // Links are used to show or not button, so we load them now.
2552
2553 // Validate
2554 if ($object->statut == 0 && $num > 0) {
2555 if ($usercanvalidate) {
2556 $tmpbuttonlabel = $langs->trans('Validate');
2557 if ($usercanapprove && !getDolGlobalString('SUPPLIER_ORDER_NO_DIRECT_APPROVE')) {
2558 $tmpbuttonlabel = $langs->trans("ValidateAndApprove");
2559 }
2560
2561 print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&amp;action=valid&token='.newToken().'">';
2562 print $tmpbuttonlabel;
2563 print '</a>';
2564 }
2565 }
2566 // Create event
2567 /*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.
2568 {
2569 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>';
2570 }*/
2571
2572 // Modify
2574 if ($usercanorder) {
2575 print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=reopen&token='.newToken().'">'.$langs->trans("Modify").'</a>';
2576 }
2577 }
2578
2579 // Approve
2581 if ($usercanapprove) {
2582 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)) {
2583 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("FirstApprovalAlreadyDone")).'">'.$langs->trans("ApproveOrder").'</a>';
2584 } else {
2585 print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&amp;action=approve">'.$langs->trans("ApproveOrder").'</a>';
2586 }
2587 } else {
2588 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("NotAllowed")).'">'.$langs->trans("ApproveOrder").'</a>';
2589 }
2590 }
2591
2592 // Second approval (if option SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED is set)
2593 if (getDolGlobalString('SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED') && $object->total_ht >= $conf->global->SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED) {
2595 if ($usercanapprovesecond) {
2596 if (!empty($object->user_approve_id2)) {
2597 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("SecondApprovalAlreadyDone")).'">'.$langs->trans("Approve2Order").'</a>';
2598 } else {
2599 print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&amp;action=approve2">'.$langs->trans("Approve2Order").'</a>';
2600 }
2601 } else {
2602 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("NotAllowed")).'">'.$langs->trans("Approve2Order").'</a>';
2603 }
2604 }
2605 }
2606
2607 // Refuse
2609 if ($usercanapprove || $usercanapprovesecond) {
2610 print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&amp;action=refuse">'.$langs->trans("RefuseOrder").'</a>';
2611 } else {
2612 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("NotAllowed")).'">'.$langs->trans("RefuseOrder").'</a>';
2613 }
2614 }
2615
2616 // Send
2617 if (empty($user->socid)) {
2618 if (in_array($object->statut, array(CommandeFournisseur::STATUS_ACCEPTED, 3, 4, 5)) || getDolGlobalString('SUPPLIER_ORDER_SENDBYEMAIL_FOR_ALL_STATUS')) {
2619 if ($usercanorder) {
2620 print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=presend&mode=init#formmailbeforetitle">'.$langs->trans('SendMail').'</a>';
2621 }
2622 }
2623 }
2624
2625 // Reopen
2626 if (in_array($object->statut, array(CommandeFournisseur::STATUS_ACCEPTED))) {
2627 $buttonshown = 0;
2628 if (!$buttonshown && $usercanapprove) {
2629 if (!getDolGlobalString('SUPPLIER_ORDER_REOPEN_BY_APPROVER_ONLY')
2630 || (getDolGlobalString('SUPPLIER_ORDER_REOPEN_BY_APPROVER_ONLY') && $user->id == $object->user_approve_id)) {
2631 print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=reopen&token='.newToken().'">'.$langs->trans("Disapprove").'</a>';
2632 $buttonshown++;
2633 }
2634 }
2635 if (!$buttonshown && $usercanapprovesecond && getDolGlobalString('SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED')) {
2636 if (!getDolGlobalString('SUPPLIER_ORDER_REOPEN_BY_APPROVER2_ONLY')
2637 || (getDolGlobalString('SUPPLIER_ORDER_REOPEN_BY_APPROVER2_ONLY') && $user->id == $object->user_approve_id2)) {
2638 print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=reopen&token='.newToken().'">'.$langs->trans("Disapprove").'</a>';
2639 }
2640 }
2641 }
2642 if (in_array($object->statut, array(3, 4, 5, 6, 7, 9))) {
2643 if ($usercanorder) {
2644 print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=reopen&token='.newToken().'">'.$langs->trans("ReOpen").'</a>';
2645 }
2646 }
2647
2648 // Ship
2649 $hasreception = 0;
2650 if (isModEnabled('stock') && (getDolGlobalString('STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER') || getDolGlobalString('STOCK_CALCULATE_ON_RECEPTION') || getDolGlobalString('STOCK_CALCULATE_ON_RECEPTION_CLOSE'))) {
2651 $labelofbutton = $langs->trans('ReceiveProducts');
2652 if (isModEnabled('reception')) {
2653 $labelofbutton = $langs->trans("CreateReception");
2654 if (!empty($object->linkedObjects['reception'])) {
2655 foreach ($object->linkedObjects['reception'] as $element) {
2656 if ($element->statut >= 0) {
2657 $hasreception = 1;
2658 break;
2659 }
2660 }
2661 }
2662 }
2663
2664 if (in_array($object->statut, array(3, 4, 5))) {
2665 if (isModEnabled("supplier_order") && $usercanreceive) {
2666 print '<div class="inline-block divButAction"><a class="butAction" href="'.DOL_URL_ROOT.'/fourn/commande/dispatch.php?id='.$object->id.'">'.$labelofbutton.'</a></div>';
2667 } else {
2668 print '<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("NotAllowed")).'">'.$labelofbutton.'</a></div>';
2669 }
2670 }
2671 }
2672
2674 if ($usercanorder) {
2675 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>';
2676 } else {
2677 print '<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#">'.$langs->trans("MakeOrder").'</a></div>';
2678 }
2679 }
2680
2681 // Classify received (this does not record reception)
2683 if ($usercanreceive) {
2684 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>';
2685 }
2686 }
2687
2688 // Create bill
2689 //if (isModEnabled('facture'))
2690 //{
2691 if (isModEnabled("supplier_invoice") && ($object->statut >= 2 && $object->statut != 7 && $object->billed != 1)) { // statut 2 means approved, 7 means canceled
2692 if ($user->hasRight('fournisseur', 'facture', 'creer') || $user->hasRight("supplier_invoice", "creer")) {
2693 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>';
2694 }
2695 }
2696 //}
2697
2698 // Classify billed manually (need one invoice if module invoice is on, no condition on invoice if not)
2699 if ($usercancreate && $object->statut >= 2 && $object->statut != 7 && $object->billed != 1) { // statut 2 means approved
2700 if (!isModEnabled('invoice')) {
2701 print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=classifybilled&token='.newToken().'">'.$langs->trans("ClassifyBilled").'</a>';
2702 } else {
2703 if (!empty($object->linkedObjectsIds['invoice_supplier']) || (empty($object->linkedObjectsIds['invoice_supplier']) && !getDolGlobalInt('SUPPLIER_ORDER_DISABLE_CLASSIFY_BILLED_FROM_SUPPLIER_ORDER'))) {
2704 if ($user->hasRight('fournisseur', 'facture', 'creer') || $user->hasRight("supplier_invoice", "creer")) {
2705 print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=classifybilled&token='.newToken().'">'.$langs->trans("ClassifyBilled").'</a>';
2706 }
2707 } else {
2708 print '<a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->trans("NeedAtLeastOneInvoice")).'">'.$langs->trans("ClassifyBilled").'</a>';
2709 }
2710 }
2711 }
2712
2713 // Create a remote order using WebService only if module is activated
2714 if (isModEnabled('webservicesclient') && $object->statut >= 2) { // 2 means accepted
2715 print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=webservice&token='.newToken().'&mode=init">'.$langs->trans('CreateRemoteOrder').'</a>';
2716 }
2717
2718 // Clone
2719 if ($usercancreate) {
2720 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>';
2721 }
2722
2723 // Cancel
2725 if ($usercanorder) {
2726 print '<a class="butActionDelete" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&amp;action=cancel&amp;token='.newToken().'">'.$langs->trans("CancelOrder").'</a>';
2727 }
2728 }
2729
2730 // Delete
2731 if (!empty($usercandelete)) {
2732 if ($hasreception) {
2733 print '<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans("ReceptionExist").'">'.$langs->trans("Delete").'</a>';
2734 } else {
2735 print '<a class="butActionDelete" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken().'">'.$langs->trans("Delete").'</a>';
2736 }
2737 }
2738 }
2739
2740 print "</div>";
2741 }
2742
2743 if ($usercanorder && $object->statut == CommandeFournisseur::STATUS_ACCEPTED && $action == 'createorder') {
2744 // Set status to ordered (action=commande)
2745 print '<!-- form to record supplier order -->'."\n";
2746 print '<form name="commande" id="makeorder" action="card.php?id='.$object->id.'&amp;action=commande" method="POST">';
2747
2748 print '<input type="hidden" name="token" value="'.newToken().'">';
2749 print '<input type="hidden" name="action" value="commande">';
2750 print load_fiche_titre($langs->trans("ToOrder"), '', '');
2751 print '<table class="noborder centpercent">';
2752 //print '<tr class="liste_titre"><td colspan="2">'.$langs->trans("ToOrder").'</td></tr>';
2753 print '<tr><td class="fieldrequired">'.$langs->trans("OrderDate").'</td><td>';
2754 $date_com = dol_mktime(GETPOSTINT('rehour'), GETPOSTINT('remin'), GETPOSTINT('resec'), GETPOSTINT('remonth'), GETPOSTINT('reday'), GETPOSTINT('reyear'));
2755 print $form->selectDate($date_com ?: '', '', 0, 0, 0, "commande", 1, 1);
2756 print '</td></tr>';
2757
2758 // Force mandatory order method
2759 print '<tr><td class="fieldrequired">'.$langs->trans("OrderMode").'</td><td>';
2760 $formorder->selectInputMethod(GETPOST('methodecommande'), "methodecommande", 1);
2761 print '</td></tr>';
2762
2763 print '<tr><td>'.$langs->trans("Comment").'</td><td><input class="quatrevingtpercent" type="text" name="comment" value="'.GETPOST('comment').'"></td></tr>';
2764
2765 print '<tr><td class="center" colspan="2">';
2766 print '<input type="submit" name="makeorder" class="button" value="'.$langs->trans("ToOrder").'">';
2767 print ' &nbsp; &nbsp; ';
2768 print '<input type="submit" name="cancel" class="button button-cancel" value="'.$langs->trans("Cancel").'">';
2769 print '</td></tr>';
2770 print '</table>';
2771
2772 print '</form>';
2773 print "<br>";
2774 }
2775
2776 // Select mail models is same action as presend
2777 if (GETPOST('modelselected')) {
2778 $action = 'presend';
2779 }
2780
2781 if ($action != 'createorder' && $action != 'presend') {
2782 print '<div class="fichecenter"><div class="fichehalfleft">';
2783
2784 // Generated documents
2785 $objref = dol_sanitizeFileName($object->ref);
2786 $file = $conf->fournisseur->dir_output.'/commande/'.$objref.'/'.$objref.'.pdf';
2787 $relativepath = $objref.'/'.$objref.'.pdf';
2788 $filedir = $conf->fournisseur->dir_output.'/commande/'.$objref;
2789 $urlsource = $_SERVER["PHP_SELF"]."?id=".$object->id;
2790 $genallowed = $usercanread;
2791 $delallowed = $usercancreate;
2792 $modelpdf = (!empty($object->model_pdf) ? $object->model_pdf : (!getDolGlobalString('COMMANDE_SUPPLIER_ADDON_PDF') ? '' : $conf->global->COMMANDE_SUPPLIER_ADDON_PDF));
2793
2794 print $formfile->showdocuments('commande_fournisseur', $objref, $filedir, $urlsource, $genallowed, $delallowed, $modelpdf, 1, 0, 0, 0, 0, '', '', '', $object->thirdparty->default_lang, '', $object);
2795 $somethingshown = $formfile->numoffiles;
2796
2797 // Show links to link elements
2798 $linktoelem = $form->showLinkToObjectBlock($object, null, array('supplier_order', 'order_supplier'));
2799 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
2800
2801 print '</div><div class="fichehalfright">';
2802
2803 if ($action == 'classifyreception') {
2805 // Set status to received (action=livraison)
2806 print '<!-- form to record purchase order received -->'."\n";
2807 print '<form id="classifyreception" action="card.php?id='.$object->id.'" method="post">';
2808 print '<input type="hidden" name="token" value="'.newToken().'">';
2809 print '<input type="hidden" name="action" value="livraison">';
2810 print load_fiche_titre($langs->trans("Receive"), '', '');
2811
2812 print '<table class="noborder centpercent">';
2813 //print '<tr class="liste_titre"><td colspan="2">'.$langs->trans("Receive").'</td></tr>';
2814 print '<tr><td>'.$langs->trans("DeliveryDate").'</td><td>';
2815 $datepreselected = dol_now();
2816 print $form->selectDate($datepreselected, '', 1, 1, 0, "commande", 1, 1);
2817 print "</td></tr>\n";
2818
2819 print '<tr><td class="fieldrequired">'.$langs->trans("Delivery")."</td><td>\n";
2820 $liv = array();
2821 $liv[''] = '&nbsp;';
2822 $liv['tot'] = $langs->trans("CompleteOrNoMoreReceptionExpected");
2823 $liv['par'] = $langs->trans("PartialWoman");
2824 $liv['nev'] = $langs->trans("NeverReceived");
2825 $liv['can'] = $langs->trans("Canceled");
2826
2827 print $form->selectarray("type", $liv);
2828
2829 print '</td></tr>';
2830 print '<tr><td>'.$langs->trans("Comment").'</td><td><input class="quatrevingtpercent" type="text" name="comment"></td></tr>';
2831 print '<tr><td class="center" colspan="2">';
2832 print '<input type="submit" name="receive" class="button" value="'.$langs->trans("Receive").'">';
2833 print ' &nbsp; &nbsp; ';
2834 print '<input type="submit" name="cancel" class="button button-cancel" value="'.$langs->trans("Cancel").'">';
2835 print '</td></tr>';
2836 print "</table>\n";
2837 print "</form>\n";
2838 print "<br>";
2839 }
2840 }
2841
2842 // List of actions on element
2843 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
2844 $formactions = new FormActions($db);
2845 $somethingshown = $formactions->showactions($object, 'order_supplier', $socid, 1, 'listaction'.($genallowed ? 'largetitle' : ''));
2846
2847 print '</div></div>';
2848 }
2849
2850 /*
2851 * Action webservice
2852 */
2853 if ($action == 'webservice' && GETPOST('mode', 'alpha') != "send" && !GETPOST('cancel', 'alpha')) {
2854 $mode = GETPOST('mode', 'alpha');
2855 $ws_url = $object->thirdparty->webservices_url;
2856 $ws_key = $object->thirdparty->webservices_key;
2857 $ws_user = GETPOST('ws_user', 'alpha');
2858 $ws_password = GETPOST('ws_password', 'alpha');
2859
2860 // NS and Authentication parameters
2861 $ws_ns = 'http://www.dolibarr.org/ns/';
2862 $ws_authentication = array(
2863 'dolibarrkey' => $ws_key,
2864 'sourceapplication' => 'DolibarrWebServiceClient',
2865 'login' => $ws_user,
2866 'password' => $ws_password,
2867 'entity' => ''
2868 );
2869
2870 print load_fiche_titre($langs->trans('CreateRemoteOrder'), '');
2871
2872 //Is everything filled?
2873 if (empty($ws_url) || empty($ws_key)) {
2874 setEventMessages($langs->trans("ErrorWebServicesFieldsRequired"), null, 'errors');
2875 $mode = "init";
2876 $error_occurred = true; //Don't allow to set the user/pass if thirdparty fields are not filled
2877 } elseif ($mode != "init" && (empty($ws_user) || empty($ws_password))) {
2878 setEventMessages($langs->trans("ErrorFieldsRequired"), null, 'errors');
2879 $mode = "init";
2880 }
2881
2882 if ($mode == "init") {
2883 //Table/form header
2884 print '<table class="border centpercent">';
2885 print '<form action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'" method="post">';
2886 print '<input type="hidden" name="token" value="'.newToken().'">';
2887 print '<input type="hidden" name="action" value="webservice">';
2888 print '<input type="hidden" name="mode" value="check">';
2889
2890 if ($error_occurred) {
2891 print "<br>".$langs->trans("ErrorOccurredReviseAndRetry")."<br>";
2892 print '<input class="button button-cancel" type="submit" id="cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
2893 } else {
2894 // Webservice url
2895 print '<tr><td>'.$langs->trans("WebServiceURL").'</td><td colspan="3">'.dol_print_url($ws_url).'</td></tr>';
2896 //Remote User
2897 print '<tr><td>'.$langs->trans("User").'</td><td><input class="width100" type="text" name="ws_user"></td></tr>';
2898 //Remote Password
2899 print '<tr><td>'.$langs->trans("Password").'</td><td><input class="width100" type="text" name="ws_password"></td></tr>';
2900 //Submit button
2901 print '<tr><td class="center" colspan="2">';
2902 print '<input type="submit" class="button" id="ws_submit" name="ws_submit" value="'.$langs->trans("CreateRemoteOrder").'">';
2903 print ' &nbsp; &nbsp; ';
2904 //Cancel button
2905 print '<input class="button button-cancel" type="submit" id="cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
2906 print '</td></tr>';
2907 }
2908
2909 //End table/form
2910 print '</form>';
2911 print '</table>';
2912 } elseif ($mode == "check") {
2913 $ws_entity = '';
2914 $ws_thirdparty = '';
2915 $error_occurred = false;
2916
2917 //Create SOAP client and connect it to user
2918 $soapclient_user = new nusoap_client($ws_url."/webservices/server_user.php");
2919 $soapclient_user->soap_defencoding = 'UTF-8';
2920 $soapclient_user->decodeUTF8(false);
2921
2922 //Get the thirdparty associated to user
2923 $ws_parameters = array('authentication' => $ws_authentication, 'id' => '', 'ref' => $ws_user);
2924 $result_user = $soapclient_user->call("getUser", $ws_parameters, $ws_ns, '');
2925 $user_status_code = $result_user["result"]["result_code"];
2926
2927 if ($user_status_code == "OK") {
2928 //Fill the variables
2929 $ws_entity = $result_user["user"]["entity"];
2930 $ws_authentication['entity'] = $ws_entity;
2931 $ws_thirdparty = $result_user["user"]["fk_thirdparty"];
2932 if (empty($ws_thirdparty)) {
2933 setEventMessages($langs->trans("RemoteUserMissingAssociatedSoc"), null, 'errors');
2934 $error_occurred = true;
2935 } else {
2936 //Create SOAP client and connect it to product/service
2937 $soapclient_product = new nusoap_client($ws_url."/webservices/server_productorservice.php");
2938 $soapclient_product->soap_defencoding = 'UTF-8';
2939 $soapclient_product->decodeUTF8(false);
2940
2941 // Iterate each line and get the reference that uses the supplier of that product/service
2942 $i = 0;
2943 foreach ($object->lines as $line) {
2944 $i = $i + 1;
2945 $ref_supplier = $line->ref_supplier;
2946 $line_id = $i."º) ".$line->product_ref.": ";
2947 if (empty($ref_supplier)) {
2948 continue;
2949 }
2950 $ws_parameters = array('authentication' => $ws_authentication, 'id' => '', 'ref' => $ref_supplier);
2951 $result_product = $soapclient_product->call("getProductOrService", $ws_parameters, $ws_ns, '');
2952 if (!$result_product) {
2953 setEventMessages($line_id.$langs->trans("Error")." SOAP ".$soapclient_product->error_str." - ".$soapclient_product->response, null, 'errors');
2954 $error_occurred = true;
2955 break;
2956 }
2957
2958 // Check the result code
2959 $status_code = $result_product["result"]["result_code"];
2960 if (empty($status_code)) { //No result, check error str
2961 setEventMessages($langs->trans("Error")." SOAP '".$soapclient_order->error_str."'", null, 'errors');
2962 } elseif ($status_code != "OK") { //Something went wrong
2963 if ($status_code == "NOT_FOUND") {
2964 setEventMessages($line_id.$langs->trans("SupplierMissingRef")." '".$ref_supplier."'", null, 'warnings');
2965 } else {
2966 setEventMessages($line_id.$langs->trans("ResponseNonOK")." '".$status_code."' - '".$result_product["result"]["result_label"]."'", null, 'errors');
2967 $error_occurred = true;
2968 break;
2969 }
2970 }
2971
2972
2973 // Ensure that price is equal and warn user if it's not
2974 $supplier_price = price($result_product["product"]["price_net"]); //Price of client tab in supplier dolibarr
2975 $local_price = null; //Price of supplier as stated in product suppliers tab on this dolibarr, NULL if not found
2976
2977 $product_fourn = new ProductFournisseur($db);
2978 $product_fourn_list = $product_fourn->list_product_fournisseur_price($line->fk_product);
2979 if (count($product_fourn_list) > 0) {
2980 foreach ($product_fourn_list as $product_fourn_line) {
2981 //Only accept the line where the supplier is the same at this order and has the same ref
2982 if ($product_fourn_line->fourn_id == $object->socid && $product_fourn_line->fourn_ref == $ref_supplier) {
2983 $local_price = price($product_fourn_line->fourn_price);
2984 }
2985 }
2986 }
2987
2988 if ($local_price != null && $local_price != $supplier_price) {
2989 setEventMessages($line_id.$langs->trans("RemotePriceMismatch")." ".$supplier_price." - ".$local_price, null, 'warnings');
2990 }
2991
2992 // Check if is in sale
2993 if (empty($result_product["product"]["status_tosell"])) {
2994 setEventMessages($line_id.$langs->trans("ProductStatusNotOnSellShort")." '".$ref_supplier."'", null, 'warnings');
2995 }
2996 }
2997 }
2998 } elseif ($user_status_code == "PERMISSION_DENIED") {
2999 setEventMessages($langs->trans("RemoteUserNotPermission"), null, 'errors');
3000 $error_occurred = true;
3001 } elseif ($user_status_code == "BAD_CREDENTIALS") {
3002 setEventMessages($langs->trans("RemoteUserBadCredentials"), null, 'errors');
3003 $error_occurred = true;
3004 } else {
3005 setEventMessages($langs->trans("ResponseNonOK")." '".$user_status_code."'", null, 'errors');
3006 $error_occurred = true;
3007 }
3008
3009 //Form
3010 print '<form action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'" method="post">';
3011 print '<input type="hidden" name="token" value="'.newToken().'">';
3012 print '<input type="hidden" name="action" value="webservice">';
3013 print '<input type="hidden" name="mode" value="send">';
3014 print '<input type="hidden" name="ws_user" value="'.$ws_user.'">';
3015 print '<input type="hidden" name="ws_password" value="'.$ws_password.'">';
3016 print '<input type="hidden" name="ws_entity" value="'.$ws_entity.'">';
3017 print '<input type="hidden" name="ws_thirdparty" value="'.$ws_thirdparty.'">';
3018 if ($error_occurred) {
3019 print "<br>".$langs->trans("ErrorOccurredReviseAndRetry")."<br>";
3020 } else {
3021 print '<input type="submit" class="button" id="ws_submit" name="ws_submit" value="'.$langs->trans("Confirm").'">';
3022 print ' &nbsp; &nbsp; ';
3023 }
3024 print '<input class="button button-cancel" type="submit" id="cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
3025 print '</form>';
3026 }
3027 }
3028
3029 // Presend form
3030 $modelmail = 'order_supplier_send';
3031 $defaulttopic = 'SendOrderRef';
3032 $diroutput = $conf->fournisseur->commande->dir_output;
3033 $autocopy = 'MAIN_MAIL_AUTOCOPY_SUPPLIER_ORDER_TO';
3034 $trackid = 'sord'.$object->id;
3035
3036 include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php';
3037 }
3038}
3039
3040// End of page
3041llxFooter();
3042$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:1991