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