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