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