dolibarr 23.0.3
card.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2003-2008 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2005-2016 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005 Simon TOSSER <simon@kornog-computing.com>
5 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@capnetworks.com>
6 * Copyright (C) 2011-2017 Juanjo Menent <jmenent@2byte.es>
7 * Copyright (C) 2013 Florian Henry <florian.henry@open-concept.pro>
8 * Copyright (C) 2013 Marcos García <marcosgdf@gmail.com>
9 * Copyright (C) 2014 Cedric GROSS <c.gross@kreiz-it.fr>
10 * Copyright (C) 2014-2017 Francis Appels <francis.appels@yahoo.com>
11 * Copyright (C) 2015 Claudio Aschieri <c.aschieri@19.coop>
12 * Copyright (C) 2016 Ferran Marcet <fmarcet@2byte.es>
13 * Copyright (C) 2016 Yasser Carreón <yacasia@gmail.com>
14 * Copyright (C) 2018 Quentin Vial-Gouteyron <quentin.vial-gouteyron@atm-consulting.fr>
15 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
16 * Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
17 * Copyright (C) 2025 Nick Fragoulis
18 *
19 * This program is free software; you can redistribute it and/or modify
20 * it under the terms of the GNU General Public License as published by
21 * the Free Software Foundation; either version 3 of the License, or
22 * (at your option) any later version.
23 *
24 * This program is distributed in the hope that it will be useful,
25 * but WITHOUT ANY WARRANTY; without even the implied warranty of
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27 * GNU General Public License for more details.
28 *
29 * You should have received a copy of the GNU General Public License
30 * along with this program. If not, see <https://www.gnu.org/licenses/>.
31 */
32
39// Load Dolibarr environment
40require '../main.inc.php';
41require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
42require_once DOL_DOCUMENT_ROOT.'/reception/class/reception.class.php';
43require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
44require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php';
45require_once DOL_DOCUMENT_ROOT.'/core/lib/product.lib.php';
46require_once DOL_DOCUMENT_ROOT.'/core/lib/reception.lib.php';
47require_once DOL_DOCUMENT_ROOT.'/core/modules/reception/modules_reception.php';
48require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
49require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
50require_once DOL_DOCUMENT_ROOT.'/product/stock/class/entrepot.class.php';
51require_once DOL_DOCUMENT_ROOT.'/product/stock/class/productlot.class.php';
52if (isModEnabled("product") || isModEnabled("service")) {
53 require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
54}
55if (isModEnabled("propal")) {
56 require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php';
57}
58require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
59require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.orderline.class.php';
60require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.dispatch.class.php';
61if (isModEnabled('productbatch')) {
62 require_once DOL_DOCUMENT_ROOT.'/product/class/productbatch.class.php';
63}
64if (isModEnabled('project')) {
65 require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
66 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
67}
77$langs->loadLangs(array("receptions", "companies", "bills", 'orders', 'stocks', 'other', 'propal', 'sendings'));
78
79if (isModEnabled('incoterm')) {
80 $langs->load('incoterm');
81}
82if (isModEnabled('productbatch')) {
83 $langs->load('productbatch');
84}
85
86$origin = GETPOST('origin', 'alpha'); // Example: commande, propal
87$origin_id = GETPOSTINT('origin_id') ? GETPOSTINT('id') : '';
88$id = GETPOSTINT('id');
89if (empty($origin_id) && !empty($origin)) {
90 $origin_id = GETPOSTINT('origin_id'); // Id of order or propal
91}
92if (empty($origin_id) && !empty($origin)) {
93 $origin_id = GETPOSTINT('object_id'); // Id of order or propal
94}
95if (empty($origin_id) && !empty($origin)) {
96 $origin_id = GETPOSTINT('originid'); // Id of order or propal
97}
98$ref = GETPOST('ref', 'alpha');
99$line_id = GETPOSTINT('lineid') ? GETPOSTINT('lineid') : 0;
100$facid = GETPOSTINT('facid');
101$socid = GETPOSTINT('socid');
102$action = GETPOST('action', 'alpha');
103//Select mail models is same action as presend
104if (GETPOST('modelselected')) {
105 $action = 'presend';
106}
107$confirm = GETPOST('confirm', 'alpha');
108$cancel = GETPOST('cancel', 'alpha');
109$backtopage = GETPOST('backtopage', 'alpha');
110$backtopageforcancel = GETPOST('backtopageforcancel', 'alpha');
111
112$contactid = GETPOSTINT('contactid');
113$projectid = GETPOSTINT('projectid');
114
115
116$cancel = GETPOST('cancel', 'alpha');
117$rank = (GETPOSTINT('rank') > 0) ? GETPOSTINT('rank') : -1;
118$lineid = GETPOSTINT('lineid');
119$backtopage = GETPOST('backtopage', 'alpha');
120//PDF
121$hidedetails = (GETPOSTINT('hidedetails') ? GETPOSTINT('hidedetails') : (getDolGlobalString('MAIN_GENERATE_DOCUMENTS_HIDE_DETAILS') ? 1 : 0));
122$hidedesc = (GETPOSTINT('hidedesc') ? GETPOSTINT('hidedesc') : (getDolGlobalString('MAIN_GENERATE_DOCUMENTS_HIDE_DESC') ? 1 : 0));
123$hideref = (GETPOSTINT('hideref') ? GETPOSTINT('hideref') : (getDolGlobalString('MAIN_GENERATE_DOCUMENTS_HIDE_REF') ? 1 : 0));
124
125$object = new Reception($db);
126$objectorder = new CommandeFournisseur($db);
127$extrafields = new ExtraFields($db);
128
129// fetch optionals attributes and labels
130$extrafields->fetch_name_optionals_label($object->table_element);
131$extrafields->fetch_name_optionals_label($object->table_element_line);
132$extrafields->fetch_name_optionals_label($objectorder->table_element_line);
133
134// Load object. Make an object->fetch
135include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be 'include', not 'include_once'
136
137// Restore $origin and $origin_id from the loaded object when the request only carried the
138// reception id (e.g. the line edit form on an existing reception posts action=updateline
139// and id=N but no origin field). Without this, the action handler below sees $origin
140// empty and silently skips both its standalone and its origin branches, so updates to
141// quantity, comment, batch and extrafields on an existing line are not persisted
142// (see issue #38386, regression from PR #36134).
143// The restore is gated on $object->origin_id > 0 so standalone receptions, which have
144// no upstream origin, are not affected: $origin stays empty and the standalone branch
145// of the updateline handler is still selected.
146if ($object->origin_id > 0) {
147 if (empty($origin)) {
148 if (!empty($object->origin_type)) {
149 $origin = $object->origin_type;
150 } elseif (is_string($object->origin) && $object->origin !== '') {
151 $origin = $object->origin;
152 }
153 }
154 if (empty($origin_id)) {
155 $origin_id = $object->origin_id;
156 }
157}
158
159// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
160$hookmanager->initHooks(array('receptioncard', 'globalcard'));
161
162$date_delivery = dol_mktime(GETPOSTINT('date_deliveryhour'), GETPOSTINT('date_deliverymin'), 0, GETPOSTINT('date_deliverymonth'), GETPOSTINT('date_deliveryday'), GETPOSTINT('date_deliveryyear'));
163$date_reception = dol_mktime(GETPOSTINT('date_receptionhour'), GETPOSTINT('date_receptionmin'), 0, GETPOSTINT('date_receptionmonth'), GETPOSTINT('date_receptionday'), GETPOSTINT('date_receptionyear'));
164
165// Security check
166if ($user->socid) {
167 $socid = $user->socid;
168}
169$result = restrictedArea($user, 'reception', $object->id, '');
170// TODO Test on reception module on only
171if (isModEnabled("reception") || $origin == 'reception' || empty($origin)) {
172 $result = restrictedArea($user, 'reception', $object->id);
173} else {
174 // We do not use the reception module, so we test permission on the supplier orders
175 if ($origin == 'supplierorder' || $origin == 'order_supplier') {
176 $result = restrictedArea($user, 'fournisseur', $origin_id, 'commande_fournisseur', 'commande');
177 } elseif (!$user->hasRight($origin, 'lire') && !$user->hasRight($origin, 'read')) {
179 }
180}
181
182if (isModEnabled("reception")) {
183 $permissiontoread = $user->hasRight('reception', 'lire');
184 $permissiontoadd = $user->hasRight('reception', 'creer');
185 $permissiontoedit = $user->hasRight('reception', 'creer'); // Used by the include of actions_lineupdown.inc.php
186 $permissiondellink = $user->hasRight('reception', 'creer'); // Used by the include of actions_dellink.inc.php
187 $permissiontovalidate = ((!getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && $user->hasRight('reception', 'creer')) || (getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && $user->hasRight('reception', 'reception_advance', 'validate')));
188 $permissiontodelete = $user->hasRight('reception', 'supprimer');
189} else {
190 $permissiontoread = $user->hasRight('fournisseur', 'commande', 'receptionner');
191 $permissiontoadd = $user->hasRight('fournisseur', 'commande', 'receptionner');
192 $permissiondellink = $user->hasRight('fournisseur', 'commande', 'receptionner'); // Used by the include of actions_dellink.inc.php
193 $permissiontovalidate = ((!getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && $user->hasRight('fournisseur', 'commande', 'receptionner')) || (getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && $user->hasRight('fournisseur', 'commande_advance', 'check')));
194 $permissiontodelete = $user->hasRight('fournisseur', 'commande', 'receptionner');
195}
196$permissiontoeditextra = $permissiontoadd;
197if (GETPOST('attribute', 'aZ09') && isset($extrafields->attributes[$object->table_element]['perms'][GETPOST('attribute', 'aZ09')])) {
198 // For action 'update_extras' there is a specific permission set for the attribute to update
199 $permissiontoeditextra = dol_eval((string) $extrafields->attributes[$object->table_element]['perms'][GETPOST('attribute', 'aZ09')]);
200}
201
202$editColspan = 0;
203$objectsrc = null;
204$typeobject = null;
205$ref_customer = null;
206$shipping_method_id = null;
207$warehouse_id = null;
208$note_public = null;
209$note_private = null;
210
211
212/*
213 * Actions
214 */
215
216$error = 0;
217$parameters = array();
218$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
219if ($reshook < 0) {
220 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
221}
222
223if (empty($reshook)) {
224 $backurlforlist = DOL_URL_ROOT.'/reception/list.php';
225
226 if (empty($backtopage) || ($cancel && empty($id))) {
227 if (empty($backtopage) || ($cancel && strpos($backtopage, '__ID__'))) {
228 if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) {
229 $backtopage = $backurlforlist;
230 } else {
231 $backtopage = DOL_URL_ROOT.'/reception/card.php?id='.((!empty($id) && $id > 0) ? $id : '__ID__');
232 }
233 }
234 }
235
236 if ($cancel) {
237 if (!empty($backtopageforcancel)) {
238 header("Location: ".$backtopageforcancel);
239 exit;
240 } elseif (!empty($backtopage)) {
241 header("Location: ".$backtopage);
242 exit;
243 }
244
245 $action = '';
246 }
247
248 if ($cancel) {
249 if (!$origin) {
250 $action = '';
251 $object->fetch($object->id); // show reception also after canceling modification
252 }
253 }
254
255 include DOL_DOCUMENT_ROOT.'/core/actions_dellink.inc.php'; // Must be 'include', not 'include_once'
256
257 // Reopen
258 if ($action == 'reopen' && $permissiontoadd) { // Test on permissions not required here
259 $result = $object->reOpen();
260 if ($result < 0) {
261 setEventMessages($object->error, $object->errors, 'errors');
262 }
263 }
264
265 // Confirm back to draft status
266 if ($action == 'modif' && $permissiontoadd) {
267 $result = $object->setDraft($user);
268 if ($result >= 0) {
269 // Define output language
270 if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) {
271 $outputlangs = $langs;
272 $newlang = '';
273 if (getDolGlobalInt('MAIN_MULTILANGS') /* && empty($newlang) */ && GETPOST('lang_id', 'aZ09')) {
274 $newlang = GETPOST('lang_id', 'aZ09');
275 }
276 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
277 $newlang = $object->thirdparty->default_lang;
278 }
279 if (!empty($newlang)) {
280 $outputlangs = new Translate("", $conf);
281 $outputlangs->setDefaultLang($newlang);
282 }
283 $model = $object->model_pdf;
284 $ret = $object->fetch($id); // Reload to get new records
285 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
286 }
287 } else {
288 setEventMessages($object->error, $object->errors, 'errors');
289 }
290 }
291
292 // Set incoterm
293 if ($action == 'set_incoterms' && isModEnabled('incoterm') && $permissiontoadd) {
294 $result = $object->setIncoterms(GETPOSTINT('incoterm_id'), GETPOST('location_incoterms'));
295 }
296
297 if ($action == 'setref_supplier' && $permissiontoadd) {
298 if ($result < 0) {
299 setEventMessages($object->error, $object->errors, 'errors');
300 }
301
302 $result = $object->setValueFrom('ref_supplier', GETPOST('ref_supplier', 'alpha'), '', null, 'text', '', $user, 'RECEPTION_MODIFY');
303 if ($result < 0) {
304 setEventMessages($object->error, $object->errors, 'errors');
305 $action = 'editref_supplier';
306 } else {
307 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
308 exit;
309 }
310 }
311
312 if ($action == 'update_extras' && $permissiontoeditextra) {
313 $object->oldcopy = dol_clone($object, 2); // @phan-suppress-current-line PhanTypeMismatchProperty
314
315 $attribute_name = GETPOST('attribute', 'aZ09');
316
317 // Fill array 'array_options' with data from update form
318 $ret = $extrafields->setOptionalsFromPost(null, $object, $attribute_name);
319 if ($ret < 0) {
320 $error++;
321 }
322
323 if (!$error) {
324 $result = $object->updateExtraField($attribute_name, 'RECEPTION_MODIFY');
325 if ($result < 0) {
326 setEventMessages($object->error, $object->errors, 'errors');
327 $error++;
328 }
329 }
330
331 if ($error) {
332 $action = 'edit_extras';
333 }
334 }
335
336 // Create reception
337 if ($action == 'add' && $permissiontoadd) {
338 $db->begin();
339
340 if (!$error && !$origin && getDolGlobalString('RECEPTION_STANDALONE')) {
341 if (GETPOSTINT('socid') < 1) {
342 $error++;
343 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ThirdParty")), null, 'errors');
344 $action = 'create';
345 }
346
347 $object->socid = GETPOSTINT('socid');
348 $object->fetch_thirdparty();
349 $object->note = GETPOST('note', 'alpha');
350 $object->note_private = GETPOST('note', 'alpha');
351 $object->origin = $origin; // deprecated
352 $object->origin_type = $origin;
353 $object->origin_id = $origin_id;
354 $object->fk_project = GETPOSTINT('projectid');
355 $object->weight = GETPOSTINT('weight') == '' ? null : GETPOSTINT('weight');
356 $object->trueHeight = GETPOSTINT('trueHeight') == '' ? null : GETPOSTINT('trueHeight');
357 $object->trueWidth = GETPOSTINT('trueWidth') == '' ? null : GETPOSTINT('trueWidth');
358 $object->trueDepth = GETPOSTINT('trueDepth') == '' ? null : GETPOSTINT('trueDepth');
359 $object->size_units = GETPOSTINT('size_units');
360 $object->weight_units = GETPOSTINT('weight_units');
361 $object->ref_supplier = GETPOST('ref_supplier', 'alpha');
362 $object->model_pdf = GETPOST('model');
363 $object->date_delivery = $date_delivery; // Date delivery planned
364 $object->date_reception = $date_reception;
365 $object->shipping_method_id = GETPOSTINT('shipping_method_id');
366 $object->tracking_number = GETPOST('tracking_number', 'alpha');
367 $object->note_private = GETPOST('note_private', 'restricthtml');
368 $object->note_public = GETPOST('note_public', 'restricthtml');
369 $object->fk_incoterms = GETPOSTINT('incoterm_id');
370 $object->location_incoterms = GETPOST('location_incoterms', 'alpha');
371
372 $product = new Product($db);
373
374 // Fill array 'array_options' with data from add form
375 $ret = $extrafields->setOptionalsFromPost(null, $object);
376 if ($ret < 0) {
377 $error++;
378 }
379
380 if (!$error) {
381 $ret = $object->create($user);
382 if ($ret <= 0) {
383 setEventMessages($object->error, $object->errors, 'errors');
384 $error++;
385 }
386 }
387 }
388 if ($origin && $origin_id > 0) {
389 $object->note = GETPOST('note', 'alpha');
390 $object->note_private = GETPOST('note', 'alpha');
391 $object->origin = $origin;
392 $object->origin_type = $origin;
393 $object->origin_id = $origin_id;
394 $object->fk_project = GETPOSTINT('projectid');
395 $object->weight = GETPOST('weight') == '' ? null : GETPOSTINT('weight');
396 $object->trueHeight = GETPOST('trueHeight') == '' ? null : GETPOSTINT('trueHeight');
397 $object->trueWidth = GETPOST('trueWidth') == '' ? null : GETPOSTINT('trueWidth');
398 $object->trueDepth = GETPOST('trueDepth') == '' ? null : GETPOSTINT('trueDepth');
399 $object->size_units = GETPOSTINT('size_units');
400 $object->weight_units = GETPOSTINT('weight_units');
401
402 $object->ref_supplier = GETPOST('ref_supplier', 'alpha');
403 $object->model_pdf = GETPOST('model');
404 $object->date_delivery = $date_delivery; // Date delivery planned
405 $object->date_reception = $date_reception;
406 $object->shipping_method_id = GETPOSTINT('shipping_method_id');
407 $object->tracking_number = GETPOST('tracking_number', 'alpha');
408 $object->note_private = GETPOST('note_private', 'restricthtml');
409 $object->note_public = GETPOST('note_public', 'restricthtml');
410 $object->fk_incoterms = GETPOSTINT('incoterm_id');
411 $object->location_incoterms = GETPOST('location_incoterms', 'alpha');
412
413 if ($object->origin == "supplierorder") {
414 $object->origin = 'order_supplier';
415 $object->origin_type = 'order_supplier';
416 $classname = 'CommandeFournisseur';
417 } else {
418 $classname = ucfirst($object->origin);
419 }
420 $objectsrc = new $classname($db);
421 $objectsrc->fetch($object->origin_id);
422
423 $object->socid = $objectsrc->socid;
424 $object->fk_delivery_address = $objectsrc->fk_delivery_address;
425
426 $product = new Product($db);
427 $batch_line = array();
428 $stockLine = array();
429 $array_options = array();
430
431 $totalqty = 0;
432
433 $num = 0;
434 foreach ($_POST as $key => $value) {
435 // without batch module enabled
436
437 if (strpos($key, 'qtyasked') !== false) {
438 $num++;
439 }
440 }
441
442 // Loop lines to calculate $totalqty
443 for ($i = 1; $i <= $num; $i++) {
444 $idl = "idl".$i; // id line source
445
446 //$sub_qty = array();
447 //$subtotalqty = 0;
448
449 //$j = 0;
450 //$batch = "batchl".$i."_0";
451 //$stockLocation = "ent1".$i."_0";
452 $qty = "qtyl".$i; // qty
453
454 //reception line for product with no batch management and no multiple stock location
455 if (GETPOST($qty, 'alpha') > 0) {
456 $totalqty += price2num(GETPOST($qty, 'alpha'), 'MS');
457 }
458
459 // Extrafields
460 $array_options[$i] = $extrafields->getOptionalsFromPost($object->table_element_line, (string) $i);
461 }
462
463
464 if ($totalqty > 0) { // There is at least one thing to ship
465 for ($i = 1; $i <= $num; $i++) {
466 $idl = "idl".$i; // id line source
467 $lineToTest = '';
468 $lineId = GETPOSTINT($idl);
469 foreach ($objectsrc->lines as $linesrc) {
470 if ($linesrc->id == $lineId) {
471 $lineToTest = $linesrc;
472 break;
473 }
474 }
475 if (empty($lineToTest)) {
476 continue;
477 }
478 $qty = "qtyl".$i;
479 $comment = "comment".$i;
480 // EATBY <-> DLUO and SELLBY <-> DLC, see productbatch.class.php
481 $eatby = "dluo".$i;
482 $sellby = "dlc".$i;
483 $batch = "batch".$i;
484 $cost_price = "cost_price".$i;
485
486 //var_dump(GETPOST("productl".$i, 'int').' '.GETPOST('entl'.$i, 'int').' '.GETPOST($idl, 'int').' '.GETPOST($qty, 'int').' '.GETPOST($batch, 'alpha'));
487
488 //if (GETPOST($qty, 'int') > 0 || (GETPOST($qty, 'int') == 0 && getDolGlobalString('RECEPTION_GETS_ALL_ORDER_PRODUCTS')) || (GETPOST($qty, 'int') < 0 && getDolGlobalString('RECEPTION_ALLOW_NEGATIVE_QTY'))) {
489 if (GETPOSTFLOAT($qty) > 0 || (GETPOSTFLOAT($qty) == 0 && getDolGlobalString('RECEPTION_GETS_ALL_ORDER_PRODUCTS'))) {
490 $ent = "entl".$i;
491 $idl = "idl".$i;
492
493 $entrepot_id = is_numeric(GETPOST($ent)) ? GETPOSTINT($ent) : GETPOSTINT('entrepot_id');
494
495 /*
496 if (!empty($lineToTest)) {
497 $fk_product = $lineToTest->fk_product;
498 } else {
499 $fk_product = $linesrc->fk_product;
500 }*/
501 $fk_product = GETPOSTINT("productl".$i);
502
503 if ($entrepot_id < 0) {
504 $entrepot_id = '';
505 }
506 if (!($fk_product > 0) && !getDolGlobalString('STOCK_SUPPORTS_SERVICES')) {
507 $entrepot_id = 0;
508 }
509
510 $eatby = GETPOST($eatby, 'alpha');
511 $sellby = GETPOST($sellby, 'alpha');
512 $eatbydate = str_replace('/', '-', $eatby);
513 $sellbydate = str_replace('/', '-', $sellby);
514
515 if (getDolGlobalString('STOCK_CALCULATE_ON_RECEPTION') || getDolGlobalString('STOCK_CALCULATE_ON_RECEPTION_CLOSE')) {
516 $ret = $object->addline($entrepot_id, GETPOSTINT($idl), (float) price2num(GETPOST($qty), 'MS'), $array_options[$i], GETPOST($comment), strtotime($eatbydate), strtotime($sellbydate), GETPOST($batch), GETPOSTFLOAT($cost_price, 'MU'));
517 } else {
518 $ret = $object->addline($entrepot_id, GETPOSTINT($idl), (float) price2num(GETPOST($qty), 'MS'), $array_options[$i], GETPOST($comment), strtotime($eatbydate), strtotime($sellbydate), GETPOST($batch));
519 }
520 if ($ret < 0) {
521 setEventMessages($object->error, $object->errors, 'errors');
522 $error++;
523 }
524 }
525 }
526
527 // Fill array 'array_options' with data from add form
528 $ret = $extrafields->setOptionalsFromPost(null, $object);
529 if ($ret < 0) {
530 $error++;
531 }
532 if (!$error) {
533 $ret = $object->create($user); // This create reception (like Odoo picking) and line of receptions. Stock movement will when validating reception.
534
535 if ($ret <= 0) {
536 setEventMessages($object->error, $object->errors, 'errors');
537 $error++;
538 } else {
539 // Define output language
540 if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) {
541 $object->fetch_thirdparty();
542 $outputlangs = $langs;
543 $newlang = '';
544 if (getDolGlobalInt('MAIN_MULTILANGS') /* && empty($newlang) */ && GETPOST('lang_id', 'aZ09')) {
545 $newlang = GETPOST('lang_id', 'aZ09');
546 }
547 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
548 $newlang = $object->thirdparty->default_lang;
549 }
550 if (!empty($newlang)) {
551 $outputlangs = new Translate("", $conf);
552 $outputlangs->setDefaultLang($newlang);
553 }
554 $model = $object->model_pdf;
555 $ret = $object->fetch($object->id); // Reload to get new records
556
557 $result = $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
558 if ($result < 0) {
559 dol_print_error($db, $object->error, $object->errors);
560 }
561 }
562 }
563 }
564 } else {
565 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("QtyToReceive").'/'.$langs->transnoentitiesnoconv("Warehouse")), null, 'errors');
566 $error++;
567 }
568 }
569 if (!$error) {
570 $db->commit();
571 header("Location: card.php?id=" . $object->id);
572 exit;
573 } else {
574 $db->rollback();
575 //$_GET["commande_id"] = GETPOSTINT('commande_id');
576 $action = 'create';
577 }
578 } elseif ($action == 'confirm_valid' && $confirm == 'yes' && $permissiontovalidate) {
579 $object->fetch_thirdparty();
580
581 $result = $object->valid($user);
582
583 if ($result < 0) {
584 $langs->load("errors");
585 setEventMessages($langs->trans($object->error), null, 'errors');
586 } else {
587 // Define output language
588 if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) {
589 $outputlangs = $langs;
590 $newlang = '';
591 if (getDolGlobalInt('MAIN_MULTILANGS') /* && empty($newlang) */ && GETPOST('lang_id', 'aZ09')) {
592 $newlang = GETPOST('lang_id', 'aZ09');
593 }
594 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
595 $newlang = $object->thirdparty->default_lang;
596 }
597 if (!empty($newlang)) {
598 $outputlangs = new Translate("", $conf);
599 $outputlangs->setDefaultLang($newlang);
600 }
601 $model = $object->model_pdf;
602 $ret = $object->fetch($id); // Reload to get new records
603
604 $result = $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
605 if ($result < 0) {
606 dol_print_error($db, $object->error, $object->errors);
607 }
608 }
609 }
610 } elseif ($action == 'confirm_delete' && $confirm == 'yes' && $permissiontodelete) {
611 $result = $object->delete($user);
612 if ($result > 0) {
613 header("Location: ".DOL_URL_ROOT.'/reception/index.php');
614 exit;
615 } else {
616 setEventMessages($object->error, $object->errors, 'errors');
617 }
618
619 // TODO add alternative status
620 /*} elseif ($action == 'reopen' && ($user->hasRights('reception', 'creer') || $user->hasRights('reception', 'reception_advance', 'validate'))) {
621 $result = $object->setStatut(0);
622 if ($result < 0) {
623 setEventMessages($object->error, $object->errors, 'errors');
624 }*/
625 } elseif ($action == 'setdate_livraison' && $permissiontoadd) {
626 $datedelivery = dol_mktime(GETPOSTINT('liv_hour'), GETPOSTINT('liv_min'), 0, GETPOSTINT('liv_month'), GETPOSTINT('liv_day'), GETPOSTINT('liv_year'));
627
628 $object->fetch($id);
629 $result = $object->setDeliveryDate($user, $datedelivery);
630 if ($result < 0) {
631 setEventMessages($object->error, $object->errors, 'errors');
632 }
633 } elseif ($action == 'setdate_reception' && $user->hasRight('reception', 'creer')) {
634 $datereception = dol_mktime(GETPOSTINT('recep_hour'), GETPOSTINT('recep_min'), 0, GETPOSTINT('recep_month'), GETPOSTINT('recep_day'), GETPOSTINT('recep_year'));
635
636 $object->fetch($id);
637 $result = $object->setReceptionDate($user, $datereception);
638 if ($result < 0) {
639 setEventMessages($object->error, $object->errors, 'errors');
640 }
641 } elseif ($action == 'confirm_deleteline' && $confirm == 'yes' && $permissiontoadd) {
642 // Remove a product line
643 $result = $object->deleteLine($user, $lineid);
644 if ($result > 0) {
645 // reorder lines
646 $object->line_order(true);
647 // Define output language
648 $outputlangs = $langs;
649 $newlang = '';
650 if (getDolGlobalInt('MAIN_MULTILANGS') /* && empty($newlang) */ && GETPOST('lang_id', 'aZ09')) {
651 $newlang = GETPOST('lang_id', 'aZ09');
652 }
653 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
654 $newlang = $object->thirdparty->default_lang;
655 }
656 if (!empty($newlang)) {
657 $outputlangs = new Translate("", $conf);
658 $outputlangs->setDefaultLang($newlang);
659 }
660 if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) {
661 $ret = $object->fetch($object->id); // Reload to get new records
662 $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
663 }
664
665 header('Location: ' . $_SERVER["PHP_SELF"] . '?id=' . $object->id);
666 exit;
667 } else {
668 setEventMessages($object->error, $object->errors, 'errors');
669 }
670 } elseif (in_array($action, array('settracking_number', 'settracking_url', 'settrueWeight', 'settrueWidth', 'settrueHeight', 'settrueDepth', 'setshipping_method_id')) && $permissiontoadd) {
671 // Action update
672 $error = 0;
673
674 if ($action == 'settracking_number') { // Test on permission already done
675 $object->tracking_number = trim(GETPOST('tracking_number', 'alpha'));
676 }
677 if ($action == 'settracking_url') { // Test on permission already done
678 $object->tracking_url = trim(GETPOST('tracking_url', 'restricthtml'));
679 }
680 if ($action == 'settrueWeight') { // Test on permission already done
681 $object->trueWeight = GETPOST('trueWeight');
682 $object->weight_units = GETPOSTINT('weight_units');
683 }
684 if ($action == 'settrueWidth') { // Test on permission already done
685 $object->trueWidth = GETPOST('trueWidth');
686 }
687 if ($action == 'settrueHeight') { // Test on permission already done
688 $object->trueHeight = GETPOST('trueHeight');
689 $object->size_units = GETPOSTINT('size_units');
690 }
691 if ($action == 'settrueDepth') { // Test on permission already done
692 $object->trueDepth = GETPOST('trueDepth');
693 }
694 if ($action == 'setshipping_method_id') { // Test on permission already done
695 $object->shipping_method_id = GETPOSTINT('shipping_method_id');
696 }
697
698 if ($object->update($user) >= 0) {
699 header("Location: card.php?id=" . $object->id);
700 exit;
701 }
702 setEventMessages($object->error, $object->errors, 'errors');
703
704 $action = "";
705 } elseif ($action == 'builddoc' && $permissiontoread) {
706 // Build document
707 // En get ou en post
708 // Save last template used to generate document
709 if (GETPOST('model')) {
710 $object->setDocModel($user, GETPOST('model', 'alpha'));
711 }
712
713 // Define output language
714 $outputlangs = $langs;
715 $newlang = '';
716 if (getDolGlobalInt('MAIN_MULTILANGS') /* && empty($newlang) */ && GETPOST('lang_id', 'aZ09')) {
717 $newlang = GETPOST('lang_id', 'aZ09');
718 }
719 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
720 $newlang = $reception->thirdparty->default_lang;
721 }
722 if (!empty($newlang)) {
723 $outputlangs = new Translate("", $conf);
724 $outputlangs->setDefaultLang($newlang);
725 }
726 $result = $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
727 if ($result <= 0) {
728 setEventMessages($object->error, $object->errors, 'errors');
729 $action = '';
730 }
731 } elseif ($action == 'remove_file' && $permissiontoadd) {
732 // Delete file in doc form
733 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
734
735 $upload_dir = $conf->reception->dir_output;
736 $file = $upload_dir.'/'.GETPOST('file');
737 $ret = dol_delete_file($file, 0, 0, 0, $object);
738 if ($ret) {
739 setEventMessages($langs->trans("FileWasRemoved", GETPOST('urlfile')), null, 'mesgs');
740 } else {
741 setEventMessages($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), null, 'errors');
742 }
743 } elseif ($action == 'classifybilled' && $permissiontoadd) {
744 $result = $object->setBilled();
745 if ($result >= 0) {
746 header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id);
747 exit();
748 } else {
749 setEventMessages($object->error, $object->errors, 'errors');
750 $action = '';
751 }
752 } elseif ($action == 'classifyclosed' && $permissiontoread) {
753 $result = $object->setClosed();
754 if ($result >= 0) {
755 header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id);
756 exit();
757 } else {
758 setEventMessages($object->error, $object->errors, 'errors');
759 $action = '';
760 }
761 } elseif ($action == 'deleteline' && !empty($line_id) && $permissiontoread) {
762 // delete a line
763 $lines = $object->lines;
764 $line = new CommandeFournisseurDispatch($db);
765
766 $num_prod = count($lines);
767 for ($i = 0; $i < $num_prod; $i++) {
768 if ($lines[$i]->id == $line_id) {
769 // delete single warehouse line
770 $line->id = $line_id;
771 if (!$error && $line->delete($user) < 0) {
772 $error++;
773 }
774 }
775 unset($_POST["lineid"]);
776 }
777
778 if (!$error) {
779 header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id);
780 exit();
781 } else {
782 setEventMessages($line->error, $line->errors, 'errors');
783 }
784 } elseif ($action == 'updateline' && GETPOST('save') && $permissiontoadd) {
785 if (!$origin && getDolGlobalString('RECEPTION_STANDALONE')) {
786 // Update a line
787 // Clean parameters
788
789 if (!$object->fetch($id) > 0) {
790 dol_print_error($db);
791 }
792 $object->fetch_thirdparty();
793
794 $qty = GETPOST('qty', 'alpha');
795 $description = '';
796 $element_type = 'reception';
797 $fk_unit = '';
798 $fk_product = 0;
799 $rang = 0;
800
801 // Extrafields
802 $extralabelsline = $extrafields->fetch_name_optionals_label($object->table_element_line);
803 $array_options = $extrafields->getOptionalsFromPost($object->table_element_line);
804 // Unset extrafield
805 if (is_array($extralabelsline)) {
806 // Get extra fields
807 foreach ($extralabelsline as $key => $value) {
808 unset($_POST["options_" . $key]);
809 }
810 }
811
812 $receptionline = new ReceptionLineBatch($db);
813 $receptionline->fetch(GETPOSTINT('lineid'));
814
815
816 if (!$error) {
817 $result = $object->updatelinefree(GETPOSTINT('lineid'), (float) $qty, $element_type, $fk_product, GETPOSTINT('units'), $rang, $description, 0, $array_options);
818
819 if ($result >= 0) {
820 if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) {
821 // Define output language
822 $outputlangs = $langs;
823 $newlang = '';
824 if (getDolGlobalInt('MAIN_MULTILANGS') /* && empty($newlang) */ && GETPOST('lang_id', 'aZ09')) {
825 $newlang = GETPOST('lang_id', 'aZ09');
826 }
827 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
828 $newlang = $object->thirdparty->default_lang;
829 }
830 if (!empty($newlang)) {
831 $outputlangs = new Translate("", $conf);
832 $outputlangs->setDefaultLang($newlang);
833 $outputlangs->load('products');
834 }
835
836 $ret = $object->fetch($object->id); // Reload to get new records
837 $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
838 }
839 unset($_POST['qty']);
840 unset($_POST['units']);
841 } else {
842 setEventMessages($object->error, $object->errors, 'errors');
843 }
844 }
845 } elseif ($origin && $origin_id > 0) {
846 // Update a line
847 // Clean parameters
848 $qty = 0;
849 $entrepot_id = 0;
850 $batch_id = 0;
851
852 $lines = $object->lines;
853 $num_prod = count($lines);
854 for ($i = 0; $i < $num_prod; $i++) {
855 if ($lines[$i]->id == $line_id) { // we have found line to update
856 $line = new CommandeFournisseurDispatch($db);
857 $line->fetch($line_id);
858 // Extrafields Lines
859 $extrafields->fetch_name_optionals_label($object->table_element_line);
860 $line->array_options = $extrafields->getOptionalsFromPost($object->table_element_line);
861
862 $line->fk_product = $lines[$i]->fk_product;
863
864 if ($lines[$i]->fk_product > 0) {
865 // single warehouse reception line
866 $stockLocation = "entl".$line_id;
867 $qty = "qtyl".$line_id;
868 $comment = "comment".$line_id;
869
870 $line->id = $line_id;
871 $line->fk_entrepot = GETPOSTINT($stockLocation);
872 $line->qty = GETPOSTFLOAT($qty, 'MS');
873 $line->comment = GETPOST($comment, 'alpha');
874
875 if (isModEnabled('productbatch')) {
876 $batch = "batch".$line_id;
877 $dlc = "dlc".$line_id;
878 $dluo = "dluo".$line_id;
879 // EATBY <-> DLUO
880 $eatby = GETPOST($dluo, 'alpha');
881 $eatbydate = str_replace('/', '-', $eatby);
882 // SELLBY <-> DLC
883 $sellby = GETPOST($dlc, 'alpha');
884 $sellbydate = str_replace('/', '-', $sellby);
885 $line->batch = GETPOST($batch, 'alpha');
886 $line->eatby = strtotime($eatbydate);
887 $line->sellby = strtotime($sellbydate);
888 }
889
890 if ($line->update($user) < 0) {
891 setEventMessages($line->error, $line->errors, 'errors');
892 $error++;
893 }
894 } else { // Product no predefined
895 $qty = "qtyl".$line_id;
896 $line->id = $line_id;
897 $line->qty = GETPOSTFLOAT($qty, 'MS');
898 $line->fk_entrepot = 0;
899 if ($line->update($user) < 0) {
900 setEventMessages($line->error, $line->errors, 'errors');
901 $error++;
902 }
903 unset($_POST[$qty]);
904 }
905 }
906 }
907
908 unset($_POST["lineid"]);
909
910 if (!$error) {
911 if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) {
912 // Define output language
913 $outputlangs = $langs;
914 $newlang = '';
915 if (getDolGlobalInt('MAIN_MULTILANGS') /* && empty($newlang) */ && GETPOST('lang_id', 'aZ09')) {
916 $newlang = GETPOST('lang_id', 'aZ09');
917 }
918 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
919 $newlang = $object->thirdparty->default_lang;
920 }
921 if (!empty($newlang)) {
922 $outputlangs = new Translate("", $conf);
923 $outputlangs->setDefaultLang($newlang);
924 }
925
926 $ret = $object->fetch($object->id); // Reload to get new records
927 $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
928 }
929
930 // Redirect after the successful save so the page leaves edit mode and the
931 // updated values are read back from DB, matching the cancel path below
932 // and the header-data save handlers (see issue #38386).
933 header('Location: '.$_SERVER['PHP_SELF'].'?id='.$object->id);
934 exit();
935 } else {
936 header('Location: '.$_SERVER['PHP_SELF'].'?id='.$object->id); // To reshow the record we edit
937 exit();
938 }
939 }
940 } elseif ($action == 'updateline' && $permissiontoadd && GETPOST('cancel', 'alpha') == $langs->trans("Cancel")) {
941 header('Location: '.$_SERVER['PHP_SELF'].'?id='.$object->id); // To reshow the record we edit
942 exit();
943 } elseif ($action == 'addline' && !$origin && getDolGlobalString('RECEPTION_STANDALONE') && $permissiontoadd) { // Add a new line
944 $langs->load('errors');
945 $error = 0;
946 $line_desc = (GETPOSTISSET('dp_desc') ? GETPOST('dp_desc', 'restricthtml') : '');
947 $predef = '';
948 $description = '';
949 $fk_elementdet = '';
950 $element_type = 'reception';
951 $fk_unit = '';
952 $idprod = 0;
953 $fk_product = 0;
954 $fk_entrepot = '';
955 $rang = '';
956 $prod_entry_mode = GETPOST('prod_entry_mode', 'aZ09');
957 if ($prod_entry_mode == 'free') {
958 $idprod = 0;
959 } else {
960 $idprod = GETPOSTINT('idprod');
961 if (getDolGlobalString('MAIN_DISABLE_FREE_LINES') && $idprod <= 0) {
962 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ProductOrService")), null, 'errors');
963 $error++;
964 }
965 }
966
967 $qty = price2num(GETPOST('qty'.$predef, 'alpha'), 'MS', 2);
968
969 // Extrafields
970 $extralabelsline = $extrafields->fetch_name_optionals_label($object->table_element_line);
971 $array_options = $extrafields->getOptionalsFromPost($object->table_element_line, $predef);
972 // Unset extrafield
973 if (is_array($extralabelsline)) {
974 // Get extra fields
975 foreach ($extralabelsline as $key => $value) {
976 unset($_POST["options_".$key]);
977 }
978 }
979
980 if ($prod_entry_mode == 'free' && (empty($idprod) || $idprod < 0) && GETPOST('type') < 0) {
981 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Type')), null, 'errors');
982 $error++;
983 }
984
985 if ($qty == '') {
986 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Qty')), null, 'errors');
987 $error++;
988 }
989 if ($qty < 0) {
990 setEventMessages($langs->trans('FieldCannotBeNegative', $langs->transnoentitiesnoconv('Qty')), null, 'errors');
991 $error++;
992 }
993 if ($prod_entry_mode == 'free' && (empty($idprod) || $idprod < 0) && empty($line_desc)) {
994 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Description')), null, 'errors');
995 $error++;
996 }
997
998 if (!$error && isModEnabled('variants') && $prod_entry_mode != 'free') {
999 if ($combinations = GETPOST('combinations', 'array')) {
1000 // Check if there is a product with the given combination
1001 $prodcomb = new ProductCombination($db);
1002
1003 if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
1004 $idprod = $res->fk_product_child;
1005 $fk_product = $idprod; // Update $fk_product with the fetched child product
1006 } else {
1007 setEventMessages($langs->trans('ErrorProductCombinationNotFound'), null, 'errors');
1008 $error++;
1009 }
1010 }
1011 }
1012
1013 if (!$error && ($qty >= 0) && (!empty($line_desc) || (!empty($idprod) && $idprod > 0))) {
1014 // Clean parameters
1015 if (!empty($idprod) && $idprod > 0) {
1016 $prod = new Product($db);
1017 $prod->fetch($idprod);
1018 $desc = $prod->label;
1019 $description = $desc;
1020 // Define output language
1021 if (getDolGlobalInt('MAIN_MULTILANGS') && getDolGlobalString('PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE')) {
1022 $outputlangs = $langs;
1023 $newlang = '';
1024 if (GETPOST('lang_id', 'aZ09')) {
1025 $newlang = GETPOST('lang_id', 'aZ09');
1026 }
1027 if (empty($newlang)) {
1028 $newlang = $object->thirdparty->default_lang;
1029 }
1030 if (!empty($newlang)) {
1031 $outputlangs = new Translate("", $conf);
1032 $outputlangs->setDefaultLang($newlang);
1033 }
1034
1035 $description = (!empty($prod->multilangs[$outputlangs->defaultlang]["description"])) ? $prod->multilangs[$outputlangs->defaultlang]["description"] : $prod->description;
1036 } else {
1037 $description = $prod->description;
1038 }
1039 if (getDolGlobalInt('PRODUIT_AUTOFILL_DESC') == 0) {
1040 $description = dol_concatdesc($desc, $line_desc, false, getDolGlobalString('MAIN_CHANGE_ORDER_CONCAT_DESCRIPTION') ? true : false);
1041 } else {
1042 $description = $line_desc;
1043 }
1044
1045 // Add custom code and origin country into description
1046 if (!getDolGlobalString('MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE') && (!empty($prod->customcode) || !empty($prod->country_code))) {
1047 $tmptxt = '(';
1048 if (getDolGlobalInt('MAIN_MULTILANGS') && getDolGlobalString('PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE')) {
1049 $outputlangs = $langs;
1050 $newlang = '';
1051 if (GETPOST('lang_id', 'alpha')) {
1052 $newlang = GETPOST('lang_id', 'alpha');
1053 }
1054 if (empty($newlang)) {
1055 $newlang = $object->thirdparty->default_lang;
1056 }
1057 if (!empty($newlang)) {
1058 $outputlangs = new Translate("", $conf);
1059 $outputlangs->setDefaultLang($newlang);
1060 $outputlangs->load('products');
1061 }
1062 if (!empty($prod->customcode)) {
1063 $tmptxt .= $outputlangs->transnoentitiesnoconv("CustomsCode").': '.$prod->customcode;
1064 }
1065 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1066 $tmptxt .= ' - ';
1067 }
1068 if (!empty($prod->country_code)) {
1069 $tmptxt .= $outputlangs->transnoentitiesnoconv("CountryOrigin").': '.getCountry($prod->country_code, '', $db, $outputlangs, 0);
1070 }
1071 } else {
1072 if (!empty($prod->customcode)) {
1073 $tmptxt .= $langs->transnoentitiesnoconv("CustomsCode").': '.$prod->customcode;
1074 }
1075 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1076 $tmptxt .= ' - ';
1077 }
1078 if (!empty($prod->country_code)) {
1079 $tmptxt .= $langs->transnoentitiesnoconv("CountryOrigin").': '.getCountry($prod->country_code, '', $db, $langs, 0);
1080 }
1081 }
1082 $tmptxt .= ')';
1083 $description = dol_concatdesc($desc, $tmptxt);
1084 }
1085 $type = $prod->type;
1086 $fk_unit = $prod->fk_unit;
1087 } else {
1088 $label = (GETPOST('product_label') ? GETPOST('product_label') : '');
1089 $desc = $line_desc;
1090 $type = GETPOST('type');
1091 $fk_unit = GETPOST('units', 'alpha');
1092 $description = $desc;
1093 $fk_elementdet = '';
1094 }
1095 $desc = dol_htmlcleanlastbr($desc);
1096
1097 if (!$error) {
1098 // Insert line
1099 $result = $object->addlinefree((float) $qty, $element_type, $idprod, $fk_unit, min($rank, count($object->lines) + 1), $description, $array_options);
1100
1101 if ($result > 0) {
1102 $ret = $object->fetch($object->id); // Reload to get new records
1103 $object->fetch_thirdparty();
1104 if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) {
1105 // Define output language
1106 $outputlangs = $langs;
1107 $newlang = GETPOST('lang_id', 'alpha');
1108 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
1109 $newlang = $object->thirdparty->default_lang;
1110 }
1111 if (!empty($newlang)) {
1112 $outputlangs = new Translate("", $conf);
1113 $outputlangs->setDefaultLang($newlang);
1114 }
1115 $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1116 }
1117 } else {
1118 header('Location: '.$_SERVER['PHP_SELF'].'?id='.$object->id); // To redisplay the form being edited
1119 exit();
1120 }
1121 }
1122 }
1123 }
1124
1125 include DOL_DOCUMENT_ROOT.'/core/actions_printing.inc.php';
1126
1127 // Actions to send emails
1128 if (empty($id)) {
1129 $id = $facid;
1130 }
1131 $triggersendname = 'RECEPTION_SENTBYMAIL';
1132 $paramname = 'id';
1133 $mode = 'emailfromreception';
1134 $autocopy = 'MAIN_MAIL_AUTOCOPY_RECEPTION_TO';
1135 $trackid = 'rec'.$object->id;
1136 include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
1137}
1138
1139
1140/*
1141 * View
1142 */
1143
1144$title = $object->ref.' - '.$langs->trans('Reception');
1145if ($action == 'create') {
1146 $title = $langs->trans("NewReception");
1147}
1148llxHeader('', $title, 'Reception', '', 0, 0, '', '', '', 'mod-reception page-card');
1149
1150$form = new Form($db);
1151$formfile = new FormFile($db);
1152$formproduct = new FormProduct($db);
1153$formproject = null;
1154if (isModEnabled('project')) {
1155 $formproject = new FormProjets($db);
1156} else {
1157 $formproject = null;
1158}
1159
1160$product_static = new Product($db);
1161$reception_static = new Reception($db);
1162$warehousestatic = new Entrepot($db);
1163
1164if ($action == 'create' && $origin != 'supplierorder' && !getDolGlobalString('RECEPTION_STANDALONE')) {
1165 print load_fiche_titre($langs->trans("CreateReception"), '', 'dollyrevert');
1166
1167 print '<br>'.$langs->trans("ReceptionCreationIsDoneFromOrder");
1168 $action = '';
1169 $id = '';
1170 $ref = '';
1171}
1172
1173// Mode creation.
1174if ($action == 'create' && $permissiontoadd) {
1175 $recept = new Reception($db);
1176
1177 print load_fiche_titre($langs->trans("NewReception"), '', 'dollyrevert');
1178 if (empty($origin) && getDolGlobalString('RECEPTION_STANDALONE')) {
1179 $soc = new Societe($db);
1180 if ($socid > 0) {
1181 $res = $soc->fetch($socid);
1182 }
1183
1184 $note_private = $object->getDefaultCreateValueFor('note_private');
1185 $note_public = $object->getDefaultCreateValueFor('note_public');
1186
1187 print '<form name="crea_reception" action="' . $_SERVER["PHP_SELF"] . '" method="POST">';
1188 print '<input type="hidden" name="token" value="' . newToken() . '">';
1189 print '<input type="hidden" name="action" value="add">';
1190 print '<input type="hidden" name="changecompany" value="0">'; // will be set to 1 by javascript so we know post is done after a company change
1191 print '<input type="hidden" name="originid" value="' . $id . '">';
1192 print '<input type="hidden" name="backtopage" value="' . $backtopage . '">';
1193
1194 print dol_get_fiche_head([]);
1195
1196 print '<table class="border centpercent">';
1197
1198
1199 // Thirdparty
1200 print '<tr>';
1201 print '<td class="fieldrequired">' . $langs->trans('ThirdParty') . '</td>';
1202 if ($socid > 0) {
1203 print '<td>';
1204 print $soc->getNomUrl(1);
1205 print '<input type="hidden" name="socid" value="' . $soc->id . '">';
1206 print '</td>';
1207 } else {
1208 print '<td class="valuefieldcreate">';
1209 print img_picto('', 'company', 'class="pictofixedwidth"').$form->select_company('', 'socid', '', 'SelectThirdParty', 1, 0, array(), 0, 'minwidth175 maxwidth500 widthcentpercentminusxx');
1210 // reload page to retrieve customer information
1211 if (!getDolGlobalString('RELOAD_PAGE_ON_CUSTOMER_CHANGE_DISABLED')) {
1212 print '<script>
1213 $(document).ready(function() {
1214 $("#socid").change(function() {
1215 console.log("We have changed the company - Reload page");
1216 var socid = $(this).val();
1217 // reload page
1218 $("input[name=action]").val("create");
1219 $("input[name=changecompany]").val("1");
1220 $("form[name=crea_reception]").submit();
1221 });
1222 });
1223 </script>';
1224 }
1225 print ' <a href="'.DOL_URL_ROOT.'/societe/card.php?action=create&client=3&fournisseur=0&backtopage='.urlencode($_SERVER["PHP_SELF"].'?action=create').'"><span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans("AddThirdParty").'"></span></a>';
1226 print '</td>';
1227 }
1228 print '</tr>'."\n";
1229
1230 // Project
1231 if (isModEnabled('project') && is_object($formproject)) {
1232 $projectid = GETPOSTINT('projectid');
1233 if (empty($projectid) && !empty($object->fk_project)) {
1234 $projectid = (int) $object->fk_project;
1235 }
1236 $langs->load("projects");
1237 print '<tr>';
1238 print '<td>' . $langs->trans("Project") . '</td><td colspan="2">';
1239 print img_picto('', 'project', 'class="pictofixedwidth"');
1240 print $formproject->select_projects($soc->id, $projectid, 'projectid', 0, 0, 1, 0, 0, 0, 0, '', 1, 0, 'widthcentpercentminusxx');
1241 print ' <a class="paddingleft" href="' . DOL_URL_ROOT . '/projet/card.php?socid=' . $soc->id . '&action=create&status=1&backtopage=' . urlencode($_SERVER["PHP_SELF"] . '?action=create&socid=' . $soc->id) . '"><span class="fa fa-plus-circle valignmiddle"></span></a>';
1242 print '</td>';
1243 print '</tr>';
1244 }
1245
1246 // Reception Date
1247 print '<tr><td>'.$langs->trans("DateReception").'</td>';
1248 print '<td colspan="3">';
1249 print img_picto('', 'action', 'class="pictofixedwidth"');
1250 $date_reception = ($date_reception ? $date_reception : $object->date_reception); // $date_reception comes from GETPOST
1251 print $form->selectDate($date_reception ? $date_reception : -1, 'date_reception', 1, 1, 1);
1252 print "</td>\n";
1253 print '</tr>';
1254
1255 // Date delivery planned
1256 print '<tr><td>'.$langs->trans("DateDeliveryPlanned").'</td>';
1257 print '<td colspan="3">';
1258 print img_picto('', 'action', 'class="pictofixedwidth"');
1259 $date_delivery = ($date_delivery ? $date_delivery : $object->delivery_date); // $date_delivery comes from GETPOST
1260 print $form->selectDate($date_delivery ? $date_delivery : -1, 'date_delivery', 1, 1, 1);
1261 print "</td>\n";
1262 print '</tr>';
1263
1264 // Weight
1265 print '<tr><td>';
1266 print $langs->trans("Weight");
1267 print '</td><td colspan="3">';
1268 print img_picto('', 'fa-balance-scale', 'class="pictofixedwidth"');
1269 print '<input name="weight" size="4" value="'.GETPOST('weight').'"> ';
1270 $text = $formproduct->selectMeasuringUnits("weight_units", "weight", (string) GETPOSTINT('weight_units'), 0, 2);
1271 $htmltext = $langs->trans("KeepEmptyForAutoCalculation");
1272 print $form->textwithpicto($text, $htmltext);
1273 print '</td></tr>';
1274
1275 // Dim
1276 print '<tr><td>';
1277 print $langs->trans("Width").' x '.$langs->trans("Height").' x '.$langs->trans("Depth");
1278 print ' </td><td colspan="3">';
1279 print img_picto('', 'fa-ruler', 'class="pictofixedwidth"');
1280 print '<input name="sizeW" size="4" value="'.GETPOST('sizeW').'">';
1281 print ' x <input name="sizeH" size="4" value="'.GETPOST('sizeH').'">';
1282 print ' x <input name="sizeS" size="4" value="'.GETPOST('sizeS').'">';
1283 print ' ';
1284 $text = $formproduct->selectMeasuringUnits("size_units", "size", (string) GETPOSTINT('size_units'), 0, 2);
1285 $htmltext = $langs->trans("KeepEmptyForAutoCalculation");
1286 print $form->textwithpicto($text, $htmltext);
1287 print '</td></tr>';
1288
1289 // Delivery method
1290 print "<tr><td>".$langs->trans("ReceptionMethod")."</td>";
1291 print '<td colspan="3">';
1292 $recept->fetch_delivery_methods();
1293 print $form->selectarray("shipping_method_id", $recept->meths, GETPOSTINT('shipping_method_id'), 1, 0, 0, "", 1);
1294 if ($user->admin) {
1295 print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1);
1296 }
1297 print "</td></tr>\n";
1298
1299 // Tracking number
1300 print "<tr><td>".$langs->trans("TrackingNumber")."</td>";
1301 print '<td colspan="3">';
1302 print img_picto('', 'barcode', 'class="pictofixedwidth"');
1303 print '<input name="tracking_number" size="20" value="'.GETPOST('tracking_number', 'alpha').'">';
1304 print "</td></tr>\n";
1305
1306 // Here $object can be of an object Reception
1307 $extrafields->fetch_name_optionals_label($object->table_element);
1308 if (empty($reshook) && !empty($extrafields->attributes[$object->table_element]['label'])) {
1309 // copy from order
1310 if ($objectsrc->fetch_optionals() > 0) {
1311 $recept->array_options = array_merge($recept->array_options, $objectsrc->array_options);
1312 }
1313 print $recept->showOptionals($extrafields, 'create', $parameters);
1314 }
1315
1316 // Incoterms
1317 if (isModEnabled('incoterm')) {
1318 print '<tr>';
1319 print '<td><label for="incoterm_id">'.$form->textwithpicto($langs->trans("IncotermLabel"), $object->label_incoterms, 1).'</label></td>';
1320 print '<td colspan="3" class="maxwidthonsmartphone">';
1321 print img_picto('', 'incoterm', 'class="pictofixedwidth"');
1322 print $form->select_incoterms((!empty($object->fk_incoterms) ? $object->fk_incoterms : ''), (!empty($object->location_incoterms) ? $object->location_incoterms : ''));
1323 print '</td></tr>';
1324 }
1325
1326 // Template to use by default
1327 print '<tr><td>'.$langs->trans('Model').'</td>';
1328 print '<td colspan="2">';
1329 print img_picto('', 'pdf', 'class="pictofixedwidth"');
1330 include_once DOL_DOCUMENT_ROOT.'/core/modules/reception/modules_reception.php';
1332 print $form->selectarray('model', $list, getDolGlobalString('RECEPTION_ADDON_PDF'), 0, 0, 0, '', 0, 0, 0, '', 'maxwidth200 widthcentpercentminusx', 1);
1333 print "</td></tr>";
1334
1335 // Note Public
1336 $htmltext ='';
1337 print '<tr>';
1338 print '<td class="tdtop">';
1339 print $form->textwithpicto($langs->trans('NotePublic'), $htmltext);
1340 print '</td>';
1341 print '<td valign="top" colspan="2">';
1342 $doleditor = new DolEditor('note_public', (string) $note_public, '', 80, 'dolibarr_notes', 'In', false, false, !getDolGlobalString('FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3, '90%');
1343 print $doleditor->Create(1);
1344
1345 // Note Private
1346 if (!$user->socid) {
1347 print '<tr>';
1348 print '<td class="tdtop">';
1349 print $form->textwithpicto($langs->trans('NotePrivate'), $htmltext);
1350 print '</td>';
1351 print '<td valign="top" colspan="2">';
1352 $doleditor = new DolEditor('note_private', (string) $note_private, '', 80, 'dolibarr_notes', 'In', false, false, !getDolGlobalString('FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3, '90%');
1353 print $doleditor->Create(1);
1354 print "</td></tr>";
1355 }
1356
1357 print "</table>\n";
1358
1359 print dol_get_fiche_end();
1360
1361 print $form->buttonsSaveCancel("CreateDraft");
1362
1363 print "</form>\n";
1364 } elseif ($origin) {
1365 if ($origin == 'supplierorder') {
1366 $classname = 'CommandeFournisseur';
1367 } else {
1368 $classname = ucfirst($origin);
1369 }
1370
1371 $objectsrc = new $classname($db);
1372 if ($objectsrc->fetch($origin_id)) { // This include the fetch_lines
1373 $soc = new Societe($db);
1374 $soc->fetch($objectsrc->socid);
1375
1376 $author = new User($db);
1377 $author->fetch($objectsrc->user_author_id);
1378
1379 if (isModEnabled('stock')) {
1380 $entrepot = new Entrepot($db);
1381 }
1382
1383 print '<form action="'.$_SERVER["PHP_SELF"].'" method="post">';
1384 print '<input type="hidden" name="token" value="'.newToken().'">';
1385 print '<input type="hidden" name="action" value="add">';
1386 print '<input type="hidden" name="origin" value="'.$origin.'">';
1387 print '<input type="hidden" name="origin_id" value="'.$objectsrc->id.'">';
1388 print '<input type="hidden" name="backtopageforcancel" value="'.$backtopageforcancel.'">';
1389 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
1390 if (GETPOSTINT('entrepot_id')) {
1391 print '<input type="hidden" name="entrepot_id" value="'.GETPOSTINT('entrepot_id').'">';
1392 }
1393
1394 print dol_get_fiche_head();
1395
1396 print '<table class="border centpercent">';
1397
1398 // Ref
1399 print '<tr><td class="titlefieldcreate fieldrequired">';
1400 if ($origin == 'supplierorder' && isModEnabled("supplier_order")) {
1401 print $langs->trans("RefOrder").'</td><td colspan="3"><a href="'.DOL_URL_ROOT.'/fourn/commande/card.php?id='.$objectsrc->id.'">'.img_object($langs->trans("ShowOrder"), 'order').' '.$objectsrc->ref;
1402 }
1403 if ($origin == 'propal' && isModEnabled("propal")) {
1404 print $langs->trans("RefProposal").'</td><td colspan="3"><a href="'.DOL_URL_ROOT.'/comm/card.php?id='.$objectsrc->id.'">'.img_object($langs->trans("ShowProposal"), 'propal').' '.$objectsrc->ref;
1405 }
1406 print '</a></td>';
1407 print "</tr>\n";
1408
1409 // Ref client
1410 print '<tr><td>';
1411 if ($origin == 'supplier_order') {
1412 print $langs->trans('SupplierOrder');
1413 } else {
1414 print $langs->trans('RefSupplier');
1415 }
1416 print '</td><td colspan="3">';
1417 print '<input type="text" name="ref_supplier" value="'.$objectsrc->ref_supplier.'" />';
1418 print '</td>';
1419 print '</tr>';
1420
1421 // Thirdparty provider
1422 print '<tr><td class="titlefieldcreate fieldrequired">'.$langs->trans('Company').'</td>';
1423 print '<td colspan="3">'.$soc->getNomUrl(1).'</td>';
1424 print '</tr>';
1425
1426 // Project
1427 if (isModEnabled('project') && $formproject !== null) {
1428 $projectid = GETPOSTINT('projectid') ? GETPOSTINT('projectid') : 0;
1429 if (empty($projectid) && !empty($objectsrc->fk_project)) {
1430 $projectid = $objectsrc->fk_project;
1431 }
1432 if ($origin == 'project') {
1433 $projectid = ($origin_id ? $origin_id : 0);
1434 }
1435
1436 $langs->load("projects");
1437 print '<tr>';
1438 print '<td>'.$langs->trans("Project").'</td><td colspan="2">';
1439 print img_picto('', 'project', 'class="paddingright"');
1440 print $formproject->select_projects((!getDolGlobalString('PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS') ? $soc->id : -1), (string) $projectid, 'projectid', 0, 0, 1, 0, 1, 0, 0, '', 1, 0, 'maxwidth500');
1441 print ' &nbsp; <a href="'.DOL_URL_ROOT.'/projet/card.php?socid='.$soc->id.'&action=create&status=1&backtopage='.urlencode($_SERVER["PHP_SELF"].'?action=create&socid='.$soc->id).'"><span class="fa fa-plus-circle valignmiddle" title="'.$langs->trans("AddProject").'"></span></a>';
1442 print '</td>';
1443 print '</tr>';
1444 }
1445
1446 // Reception Date
1447 print '<tr><td>'.$langs->trans("DateReception").'</td>';
1448 print '<td colspan="3">';
1449 print img_picto('', 'action', 'class="pictofixedwidth"');
1450 $date_reception = ($date_reception ? $date_reception : $object->date_reception); // $date_reception comes from GETPOST
1451 print $form->selectDate($date_reception ? $date_reception : -1, 'date_reception', 1, 1, 1);
1452 print "</td>\n";
1453 print '</tr>';
1454
1455 // Date delivery planned
1456 print '<tr><td>'.$langs->trans("DateDeliveryPlanned").'</td>';
1457 print '<td colspan="3">';
1458 print img_picto('', 'action', 'class="pictofixedwidth"');
1459 $date_delivery = ($date_delivery ? $date_delivery : $objectsrc->delivery_date); // $date_delivery comes from GETPOST
1460 print $form->selectDate($date_delivery ? $date_delivery : -1, 'date_delivery', 1, 1, 1);
1461 print "</td>\n";
1462 print '</tr>';
1463
1464 // Note Public
1465 print '<tr><td>'.$langs->trans("NotePublic").'</td>';
1466 print '<td colspan="3">';
1467 $doleditor = new DolEditor('note_public', $objectsrc->note_public, '', 60, 'dolibarr_notes', 'In', false, false, !getDolGlobalString('FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3, '90%');
1468 print $doleditor->Create(1);
1469 print "</td></tr>";
1470
1471 // Note Private
1472 if ($objectsrc->note_private && !$user->socid) {
1473 print '<tr><td>'.$langs->trans("NotePrivate").'</td>';
1474 print '<td colspan="3">';
1475 $doleditor = new DolEditor('note_private', $objectsrc->note_private, '', 60, 'dolibarr_notes', 'In', false, false, !getDolGlobalString('FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3, '90%');
1476 print $doleditor->Create(1);
1477 print "</td></tr>";
1478 }
1479
1480 // Weight
1481 print '<tr><td>';
1482 print $langs->trans("Weight");
1483 print '</td><td colspan="3"><input name="weight" size="4" value="'.GETPOST('weight').'"> ';
1484 $text = $formproduct->selectMeasuringUnits("weight_units", "weight", (string) GETPOSTINT('weight_units'), 0, 2);
1485 $htmltext = $langs->trans("KeepEmptyForAutoCalculation");
1486 print $form->textwithpicto($text, $htmltext);
1487 print '</td></tr>';
1488 // Dim
1489 print '<tr><td>';
1490 print $langs->trans("Width").' x '.$langs->trans("Height").' x '.$langs->trans("Depth");
1491 print ' </td><td colspan="3"><input name="trueWidth" size="4" value="'.GETPOST('trueWidth').'">';
1492 print ' x <input name="trueHeight" size="4" value="'.GETPOST('trueHeight').'">';
1493 print ' x <input name="trueDepth" size="4" value="'.GETPOST('trueDepth').'">';
1494 print ' ';
1495 $text = $formproduct->selectMeasuringUnits("size_units", "size", (string) GETPOSTINT('size_units'), 0, 2);
1496 $htmltext = $langs->trans("KeepEmptyForAutoCalculation");
1497 print $form->textwithpicto($text, $htmltext);
1498 print '</td></tr>';
1499
1500 // Delivery method
1501 print "<tr><td>".$langs->trans("ReceptionMethod")."</td>";
1502 print '<td colspan="3">';
1503 $recept->fetch_delivery_methods();
1504 print $form->selectarray("shipping_method_id", $recept->meths, GETPOSTINT('shipping_method_id'), 1, 0, 0, "", 1);
1505 if ($user->admin) {
1506 print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1);
1507 }
1508 print "</td></tr>\n";
1509
1510 // Tracking number
1511 print "<tr><td>".$langs->trans("TrackingNumber")."</td>";
1512 print '<td colspan="3">';
1513 print '<input name="tracking_number" size="20" value="'.GETPOST('tracking_number', 'alpha').'">';
1514 print "</td></tr>\n";
1515
1516 // Other attributes
1517 $parameters = array('objectsrc' => $objectsrc, 'colspan' => ' colspan="3"', 'cols' => '3', 'socid' => $socid);
1518 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $recept, $action); // Note that $action and $objectsrc may have been modified by hook
1519 print $hookmanager->resPrint;
1520
1521 // Here $object can be of an object Reception
1522 $extrafields->fetch_name_optionals_label($object->table_element);
1523 if (empty($reshook) && !empty($extrafields->attributes[$object->table_element]['label'])) {
1524 // copy from order
1525 if ($objectsrc->fetch_optionals() > 0) {
1526 $recept->array_options = array_merge($recept->array_options, $objectsrc->array_options);
1527 }
1528 print $recept->showOptionals($extrafields, 'create', $parameters);
1529 }
1530
1531 // Incoterms
1532 if (isModEnabled('incoterm')) {
1533 print '<tr>';
1534 print '<td><label for="incoterm_id">'.$form->textwithpicto($langs->trans("IncotermLabel"), $objectsrc->label_incoterms, 1).'</label></td>';
1535 print '<td colspan="3" class="maxwidthonsmartphone">';
1536 print $form->select_incoterms((!empty($objectsrc->fk_incoterms) ? $objectsrc->fk_incoterms : ''), (!empty($objectsrc->location_incoterms) ? $objectsrc->location_incoterms : ''));
1537 print '</td></tr>';
1538 }
1539
1540 // Document model
1541 include_once DOL_DOCUMENT_ROOT.'/core/modules/reception/modules_reception.php';
1543
1544 if (is_array($list) && count($list) > 1) {
1545 print "<tr><td>".$langs->trans("DefaultModel")."</td>";
1546 print '<td colspan="3">';
1547 print $form->selectarray('model', $list, getDolGlobalString('RECEPTION_ADDON_PDF'));
1548 print "</td></tr>\n";
1549 }
1550
1551 print "</table>";
1552
1553 print dol_get_fiche_end();
1554
1555 // Number of lines show on the reception card
1556 $numAsked = 0;
1557
1562 $suffix2numAsked = array();
1563 $dispatchLines = array();
1564
1565 foreach ($_POST as $key => $value) {
1566 // If create form is coming from the button "Create Reception" of previous page
1567
1568 // without batch module enabled or product with no lot/serial
1569 $reg = array();
1570 if (preg_match('/^product_([0-9]+)_([0-9]+)$/i', $key, $reg)) {
1571 $numAsked++;
1572 $paramSuffix = $reg[1] . '_' . $reg[2];
1573 $suffix2numAsked[$paramSuffix] = $numAsked;
1574
1575 // $numline=$reg[2] + 1; // line of product
1576 $numline = $numAsked;
1577
1578 $prod = "product_" . $paramSuffix;
1579 $qty = "qty_" . $paramSuffix;
1580 $ent = "entrepot_" . $paramSuffix;
1581 $pu = "pu_" . $paramSuffix; // This is unit price including discount
1582 $fk_commandefourndet = "fk_commandefourndet_" . $paramSuffix;
1583 $dispatchLines[$numAsked] = array('paramSuffix' => $paramSuffix, 'prod' => GETPOSTINT($prod), 'qty' => price2num(GETPOST($qty), 'MS'), 'ent' => GETPOSTINT($ent), 'pu' => price2num(GETPOST($pu), 'MU'), 'comment' => GETPOST('comment'), 'fk_commandefourndet' => GETPOSTINT($fk_commandefourndet));
1584 }
1585
1586 // with batch module enabled and product with lot/serial
1587 if (preg_match('/^product_batch_([0-9]+)_([0-9]+)$/i', $key, $reg)) {
1588 $numAsked++;
1589 $paramSuffix = $reg[1] . '_' . $reg[2];
1590 $suffix2numAsked[$paramSuffix] = $numAsked;
1591
1592 // eat-by date dispatch
1593 // $numline=$reg[2] + 1; // line of product
1594 $numline = $numAsked;
1595
1596 $prod = 'product_batch_' . $paramSuffix;
1597 $qty = 'qty_' . $paramSuffix;
1598 $ent = 'entrepot_' . $paramSuffix;
1599 $pu = 'pu_' . $paramSuffix;
1600 $lot = 'lot_number_' . $paramSuffix;
1601 $dDLUO = dol_mktime(12, 0, 0, GETPOSTINT('dluo_'.$paramSuffix.'month'), GETPOSTINT('dluo_'.$paramSuffix.'day'), GETPOSTINT('dluo_'.$paramSuffix.'year'));
1602 $dDLC = dol_mktime(12, 0, 0, GETPOSTINT('dlc_'.$paramSuffix.'month'), GETPOSTINT('dlc_'.$paramSuffix.'day'), GETPOSTINT('dlc_'.$paramSuffix.'year'));
1603 $fk_commandefourndet = 'fk_commandefourndet_'.$paramSuffix;
1604 $dispatchLines[$numAsked] = array('paramSuffix' => $paramSuffix, 'prod' => GETPOSTINT($prod), 'qty' => price2num(GETPOST($qty), 'MS'), 'ent' => GETPOSTINT($ent), 'pu' => price2num(GETPOST($pu), 'MU'), 'comment' => GETPOST('comment'), 'fk_commandefourndet' => GETPOSTINT($fk_commandefourndet), 'DLC' => $dDLC, 'DLUO' => $dDLUO, 'lot' => GETPOST($lot));
1605 }
1606
1607 // If create form is coming from same page, it means that post was sent but an error occurred
1608 if (preg_match('/^productl([0-9]+)$/i', $key, $reg)) {
1609 $numAsked++;
1610 $paramSuffix = $reg[1];
1611 $suffix2numAsked[$paramSuffix] = $numAsked;
1612
1613 // eat-by date dispatch
1614 // $numline=$reg[2] + 1; // line of product
1615 $numline = $numAsked;
1616
1617 $prod = 'productid'.$paramSuffix;
1618 $comment = 'comment'.$paramSuffix;
1619 $qty = 'qtyl'.$paramSuffix;
1620 $ent = 'entl'.$paramSuffix;
1621 $pu = 'pul'.$paramSuffix;
1622 $lot = 'batch'.$paramSuffix;
1623 $dDLUO = dol_mktime(12, 0, 0, GETPOSTINT('dluo'.$paramSuffix.'month'), GETPOSTINT('dluo'.$paramSuffix.'day'), GETPOSTINT('dluo'.$paramSuffix.'year'));
1624 $dDLC = dol_mktime(12, 0, 0, GETPOSTINT('dlc'.$paramSuffix.'month'), GETPOSTINT('dlc'.$paramSuffix.'day'), GETPOSTINT('dlc'.$paramSuffix.'year'));
1625 $fk_commandefourndet = 'fk_commandefournisseurdet'.$paramSuffix;
1626 $dispatchLines[$numAsked] = array('prod' => GETPOSTINT($prod), 'qty' => price2num(GETPOST($qty), 'MS'), 'ent' => GETPOSTINT($ent), 'pu' => price2num(GETPOST($pu), 'MU'), 'comment' => GETPOST($comment), 'fk_commandefourndet' => GETPOSTINT($fk_commandefourndet), 'DLC' => $dDLC, 'DLUO' => $dDLUO, 'lot' => GETPOSTINT($lot));
1627 }
1628 }
1629
1630 // If extrafield values are passed in the HTTP query, assign them to the correct dispatch line
1631 // Note that if an extrafield with the same name exists in the origin supplier order line, the value
1632 // from the HTTP query will be ignored
1633 foreach ($suffix2numAsked as $suffix => $n) {
1634 $dispatchLines[$n]['array_options'] = $extrafields->getOptionalsFromPost('receptiondet_batch', '_' . $suffix, '');
1635 }
1636
1637 print '<script type="text/javascript">
1638 jQuery(document).ready(function() {
1639 jQuery("#autofill").click(function(event) {
1640 event.preventDefault();';
1641 $i = 1;
1642 while ($i <= $numAsked) {
1643 print 'jQuery("#qtyl'.$i.'").val(jQuery("#qtyasked'.$i.'").val() - jQuery("#qtydelivered'.$i.'").val());'."\n";
1644 $i++;
1645 }
1646 print '});
1647 jQuery("#autoreset").click(function(event) {
1648 event.preventDefault();';
1649 $i = 1;
1650 while ($i <= $numAsked) {
1651 print 'jQuery("#qtyl'.$i.'").val(0);'."\n";
1652 $i++;
1653 }
1654 print '});
1655 });
1656 </script>';
1657
1658 print '<br>';
1659
1660 print '<table class="noborder centpercent">';
1661
1662 // Load receptions already done for same order
1663 $objectsrc->loadReceptions();
1664
1665 if ($numAsked) {
1666 print '<tr class="liste_titre">';
1667 print '<td>'.$langs->trans("Description").'</td>';
1668 print '<td>'.$langs->trans("Comment").'</td>';
1669 print '<td class="center">'.$langs->trans("QtyOrdered").'</td>';
1670 print '<td class="center">'.$langs->trans("QtyReceived").'</td>';
1671 print '<td class="center">'.$langs->trans("QtyToReceive");
1672 if (getDolGlobalInt('STOCK_CALCULATE_ON_RECEPTION') || getDolGlobalInt('STOCK_CALCULATE_ON_RECEPTION_CLOSE')) {
1673 print '<td>'.$langs->trans("BuyingPrice").'</td>';
1674 }
1675 if (!isModEnabled('productbatch')) {
1676 print ' <br><center><a href="#" id="autofill"><span class="fas fa-fill pictofixedwidth" style=""></span> '.$langs->trans("Fill").'</a>';
1677 print ' &nbsp; &nbsp; <a href="#" id="autoreset"><span class="fas fa-eraser pictofixedwidth" style=""></span>'.$langs->trans("Reset").'</a></center><br>';
1678 }
1679 print '</td>';
1680 if (isModEnabled('stock')) {
1681 print '<td class="left">'.$langs->trans("Warehouse").' ('.$langs->trans("Stock").')</td>';
1682 }
1683 if (isModEnabled('productbatch')) {
1684 print '<td class="left">'.$langs->trans("batch_number").'</td>';
1685 if (!getDolGlobalInt('PRODUCT_DISABLE_SELLBY')) {
1686 print '<td class="left">'.$langs->trans("SellByDate").'</td>';
1687 }
1688 if (!getDolGlobalInt('PRODUCT_DISABLE_EATBY')) {
1689 print '<td class="left">'.$langs->trans("EatByDate").'</td>';
1690 }
1691 }
1692 print "</tr>\n";
1693 }
1694
1695 // $objectsrc->lines contains the line of the purchase order
1696 // $dispatchLines is an array with dispatching detail (with product, qty, warehouse and fk_commandefourndet). One purchase order line may have n of this dispatch lines.
1697
1698 $arrayofpurchaselinealreadyoutput = array();
1699
1700 // $_POST contains fk_commandefourndet_X_Y where Y is num of product line and X is number of split lines
1701 $indiceAsked = 1;
1702 while ($indiceAsked <= $numAsked) { // Loop on $dispatchLines. Warning: $dispatchLines must be sorted by fk_commandefourndet (it is a regroupment key on output)
1703 $product = new Product($db);
1704 $line = new CommandeFournisseurLigne($db); // By default
1705
1706 // We search the purchase order line that is linked to the dispatchLines
1707 foreach ($objectsrc->lines as $supplierLine) {
1708 if ($dispatchLines[$indiceAsked]['fk_commandefourndet'] == $supplierLine->id) {
1709 $line = $supplierLine;
1710 break;
1711 }
1712 }
1713
1714 // Now $line can be CommandeFournisseurLigne but could be other type of line.
1715
1716 // Show product and description
1717 $type = $line->product_type ? $line->product_type : $line->fk_product_type;
1718 // Try to enhance type detection using date_start and date_end for free lines where type was not saved.
1719 if (!empty($line->date_start)) {
1720 $type = 1;
1721 }
1722 if (!empty($line->date_end)) {
1723 $type = 1;
1724 }
1725
1726 print '<!-- line fk_commandefourndet='.$line->id.' for product='.$line->fk_product.' -->'."\n";
1727 print '<tr class="oddeven">'."\n";
1728
1729 // Product label
1730 if ($line->fk_product > 0) { // If predefined product
1731 $product->fetch($line->fk_product);
1732 $product->load_stock('warehouseopen'); // Load all $product->stock_warehouse[idwarehouse]->detail_batch
1733 //var_dump($product->stock_warehouse[1]);
1734 //var_dump($dispatchLines[$indiceAsked]);
1735
1736 print '<td>';
1737 print '<a name="'.$line->id.'"></a>'; // ancre pour retourner sur la ligne
1738
1739 print '<input type="hidden" name="productl'.$indiceAsked.'" value="'.$line->fk_product.'">';
1740
1741 if (! array_key_exists($line->id, $arrayofpurchaselinealreadyoutput)) { // Add test to avoid to show qty twice
1742 print '<input type="hidden" name="productid'.$indiceAsked.'" value="'.$line->fk_product.'">';
1743
1744 // Show product and description
1745 $product_static = $product;
1746
1747 $text = $product_static->getNomUrl(1);
1748 $text .= ' - '.(!empty($line->label) ? $line->label : $line->product_label);
1749 $description = (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE') ? '' : dol_htmlentitiesbr($line->desc));
1750 print $form->textwithtooltip($text, $description, 3, 0, '', (string) $i);
1751
1752 // Show range
1753 print_date_range($db->jdate($line->date_start), $db->jdate($line->date_end));
1754
1755 // Add description in form
1756 if (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE')) {
1757 print ($line->desc && $line->desc != $line->product_label) ? '<br>'.dol_htmlentitiesbr($line->desc) : '';
1758 }
1759 }
1760 print '</td>';
1761 } else {
1762 print "<td>";
1763 if (! array_key_exists($line->id, $arrayofpurchaselinealreadyoutput)) { // Add test to avoid to show qty twice
1764 if ($type == 1) {
1765 $text = img_object($langs->trans('Service'), 'service');
1766 } else {
1767 $text = img_object($langs->trans('Product'), 'product');
1768 }
1769
1770 if (!empty($line->label)) {
1771 $text .= ' <strong>'.$line->label.'</strong>';
1772 print $form->textwithtooltip($text, $line->desc, 3, 0, '', (string) $i);
1773 } else {
1774 print $text.' '.nl2br($line->desc);
1775 }
1776
1777 // Show range
1778 print_date_range($db->jdate($line->date_start), $db->jdate($line->date_end));
1779 }
1780 print "</td>\n";
1781 }
1782
1783 // Comment
1784 //$defaultcomment = 'Line create from order line id '.$line->id;
1785 $defaultcomment = $dispatchLines[$indiceAsked]['comment'];
1786 print '<td>';
1787 print '<input type="text" class="maxwidth100" name="comment'.$indiceAsked.'" value="'.$defaultcomment.'">';
1788 print '</td>';
1789
1790 // Qty in source purchase order line
1791 print '<td class="center">';
1792 if (! array_key_exists($line->id, $arrayofpurchaselinealreadyoutput)) { // Add test to avoid to show qty twice
1793 print $line->qty;
1794 }
1795 print '<input type="hidden" name="fk_commandefournisseurdet'.$indiceAsked.'" value="'.$line->id.'">';
1796 print '<input type="hidden" name="pul'.$indiceAsked.'" value="'.$line->subprice.'">';
1797 print '<input name="qtyasked'.$indiceAsked.'" id="qtyasked'.$indiceAsked.'" type="hidden" value="'.$line->qty.'">';
1798 print '</td>';
1799 $qtyProdCom = $line->qty;
1800
1801 // Qty already received
1802 print '<td class="center">';
1803 $quantityDelivered = isset($objectsrc->receptions[$line->id]) ? $objectsrc->receptions[$line->id] : 0;
1804 if (! array_key_exists($line->id, $arrayofpurchaselinealreadyoutput)) { // Add test to avoid to show qty twice
1805 print $quantityDelivered;
1806 }
1807 print '<input name="qtydelivered'.$indiceAsked.'" id="qtydelivered'.$indiceAsked.'" type="hidden" value="'.$quantityDelivered.'">';
1808 print '</td>';
1809
1810
1811 if ($line->product_type == 1 && !getDolGlobalString('STOCK_SUPPORTS_SERVICES')) {
1812 $quantityToBeDelivered = 0;
1813 } else {
1814 $quantityToBeDelivered = $dispatchLines[$indiceAsked]['qty'];
1815 }
1816 $warehouse_id = $dispatchLines[$indiceAsked]['ent'];
1817
1818
1819 $warehouseObject = null;
1820 if (isModEnabled('stock')) {
1821 // If warehouse was already selected or if product is not a predefined, we go into this part with no multiwarehouse selection
1822 print '<!-- Case warehouse already known or product not a predefined product -->';
1823 if (array_key_exists($dispatchLines[$indiceAsked]['ent'], $product->stock_warehouse)) {
1824 $stock = +$product->stock_warehouse[$dispatchLines[$indiceAsked]['ent']]->real; // Convert to number
1825 }
1826 $deliverableQty = $dispatchLines[$indiceAsked]['qty'];
1827 $cost_price = $dispatchLines[$indiceAsked]['pu'];
1828
1829 // Quantity to send
1830 print '<td class="center">';
1831 if ($line->product_type == Product::TYPE_PRODUCT || getDolGlobalString('STOCK_SUPPORTS_SERVICES')) {
1832 if (GETPOSTINT('qtyl'.$indiceAsked)) {
1833 $defaultqty = GETPOSTINT('qtyl'.$indiceAsked);
1834 }
1835 print '<input name="idl'.$indiceAsked.'" type="hidden" value="'.$line->id.'">';
1836 print '<input class="right" name="qtyl'.$indiceAsked.'" id="qtyl'.$indiceAsked.'" type="text" size="4" value="'.$deliverableQty.'">';
1837 } else {
1838 print $langs->trans("NA");
1839 }
1840 print '</td>';
1841
1842 if (getDolGlobalString('STOCK_CALCULATE_ON_RECEPTION') || getDolGlobalString('STOCK_CALCULATE_ON_RECEPTION_CLOSE')) {
1843 print '<td>';
1844 print '<input class="width75 right" name="cost_price'.$indiceAsked.'" id="cost_price'.$indiceAsked.'" value="'.price($cost_price).'">';
1845 print '</td>';
1846 }
1847
1848 // Stock
1849 if (isModEnabled('stock')) {
1850 print '<td class="left">';
1851 if ($line->product_type == Product::TYPE_PRODUCT || getDolGlobalString('STOCK_SUPPORTS_SERVICES')) { // Type of product need stock change ?
1852 // Show warehouse combo list
1853 $ent = "entl".$indiceAsked;
1854 $idl = "idl".$indiceAsked;
1855 $tmpentrepot_id = is_numeric(GETPOST($ent)) ? GETPOSTINT($ent) : $warehouse_id;
1856 if ($line->fk_product > 0) {
1857 print '<!-- Show warehouse selection -->';
1858 print $formproduct->selectWarehouses($tmpentrepot_id, 'entl'.$indiceAsked, '', 0, 0, $line->fk_product, '', 1);
1859 }
1860 } else {
1861 print $langs->trans("Service");
1862 }
1863 print '</td>';
1864 }
1865
1866 if (isModEnabled('productbatch')) {
1867 if (!empty($product->status_batch)) {
1868 print '<td><input name="batch'.$indiceAsked.'" value="'.$dispatchLines[$indiceAsked]['lot'].'"></td>';
1869 if (!getDolGlobalString('PRODUCT_DISABLE_SELLBY')) {
1870 print '<td class="nowraponall">';
1871 print $form->selectDate($dispatchLines[$indiceAsked]['DLC'], 'dlc'.$indiceAsked, 0, 0, 1, "");
1872 print '</td>';
1873 }
1874 if (!getDolGlobalString('PRODUCT_DISABLE_EATBY')) {
1875 print '<td class="nowraponall">';
1876 print $form->selectDate($dispatchLines[$indiceAsked]['DLUO'], 'dluo'.$indiceAsked, 0, 0, 1, "");
1877 print '</td>';
1878 }
1879 } else {
1880 print '<td colspan="3"></td>';
1881 }
1882 }
1883 }
1884
1885 $arrayofpurchaselinealreadyoutput[$line->id] = $line->id;
1886
1887 print "</tr>\n";
1888
1889 // Display lines for extrafields of the Reception line
1890 // $line is a 'CommandeFournisseurLigne', $dispatchLines contains values of Reception lines so properties of CommandeFournisseurDispatch
1891 if (!empty($extrafields)) {
1892 $colspan = 5;
1893 if (isModEnabled('productbatch')) {
1894 $colspan += 2;
1895 if (!getDolGlobalString('PRODUCT_DISABLE_SELLBY')) {
1896 $colspan += 1;
1897 }
1898 if (!getDolGlobalString('PRODUCT_DISABLE_EATBY')) {
1899 $colspan += 1;
1900 }
1901 }
1902 $recLine = new CommandeFournisseurDispatch($db);
1903
1904 $srcLine = new CommandeFournisseurLigne($db);
1905 $srcLine->id = $line->id;
1906 $srcLine->fetch_optionals(); // fetch extrafields also available in orderline
1907
1908 if (empty($recLine->array_options) && !empty($dispatchLines[$indiceAsked]['array_options'])) {
1909 $recLine->array_options = $dispatchLines[$indiceAsked]['array_options'];
1910 }
1911 $recLine->array_options = array_merge($recLine->array_options, $srcLine->array_options);
1912
1913 print $recLine->showOptionals($extrafields, 'edit', array('style' => 'class="oddeven"', 'colspan' => $colspan), (string) $indiceAsked, '', '1');
1914 }
1915
1916 $indiceAsked++;
1917 }
1918
1919 print "</table>";
1920
1921 print '<br>';
1922
1923 print $form->buttonsSaveCancel("Create");
1924
1925 print '</form>';
1926
1927 print '<br>';
1928 } else {
1929 dol_print_error($db);
1930 }
1931 }
1932} elseif ($object->id > 0) {
1933 /* *************************************************************************** */
1934 /* */
1935 /* Edit and view mode */
1936 /* */
1937 /* *************************************************************************** */
1938 $lines = $object->lines;
1939
1940 $num_prod = count($lines);
1941 $indiceAsked = 0;
1942
1943 if ($object->id <= 0) {
1944 print $langs->trans("NoRecordFound");
1945 llxFooter();
1946 exit;
1947 }
1948
1949 $typeobject = '';
1950 if (!empty($object->origin) && $object->origin_id > 0) {
1951 $typeobject = $object->origin;
1952 $origin = $object->origin;
1953 $origin_id = $object->origin_id;
1954 $object->fetch_origin(); // Load property $object->origin_object, $object->commande, $object->propal, ...
1955 }
1956
1957 $soc = new Societe($db);
1958 $soc->fetch($object->socid);
1959
1960 $res = $object->fetch_optionals();
1961
1962 $head = reception_prepare_head($object);
1963 print dol_get_fiche_head($head, 'reception', $langs->trans("Reception"), -1, 'dollyrevert');
1964
1965 $formconfirm = '';
1966
1967 // Confirm deletion
1968 if ($action == 'delete') {
1969 $formconfirm = $form->formconfirm($_SERVER['PHP_SELF'].'?id='.$object->id, $langs->trans('DeleteReception'), $langs->trans("ConfirmDeleteReception", $object->ref), 'confirm_delete', '', 0, 1);
1970 }
1971
1972 // Confirmation validation
1973 if ($action == 'valid') {
1974 $objectref = substr($object->ref, 1, 4);
1975 if ($objectref == 'PROV') {
1976 $numref = $object->getNextNumRef($soc);
1977 } else {
1978 $numref = (string) $object->ref;
1979 }
1980
1981 $text = $langs->trans("ConfirmValidateReception", $numref);
1982 if (getDolGlobalString('STOCK_CALCULATE_ON_RECEPTION')) {
1983 $text .= '<br>'.img_picto('', 'movement', 'class="pictofixedwidth"').$langs->trans("StockMovementWillBeRecorded").'.';
1984 } elseif (getDolGlobalString('STOCK_CALCULATE_ON_RECEPTION_CLOSE')) {
1985 $text .= '<br>'.img_picto('', 'movement', 'class="pictofixedwidth"').$langs->trans("StockMovementNotYetRecorded").'.';
1986 }
1987
1988 if (isModEnabled('notification')) {
1989 require_once DOL_DOCUMENT_ROOT.'/core/class/notify.class.php';
1990 $notify = new Notify($db);
1991 $text .= '<br>';
1992 $text .= $notify->confirmMessage('RECEPTION_VALIDATE', $object->socid, $object);
1993 }
1994
1995 $formconfirm = $form->formconfirm($_SERVER['PHP_SELF'].'?id='.$object->id, $langs->trans('ValidateReception'), $text, 'confirm_valid', '', 0, 1, 250);
1996 }
1997
1998 // Confirm cancellation
1999 if ($action == 'annuler') {
2000 $formconfirm = $form->formconfirm($_SERVER['PHP_SELF'].'?id='.$object->id, $langs->trans('CancelReception'), $langs->trans("ConfirmCancelReception", $object->ref), 'confirm_cancel', '', 0, 1);
2001 }
2002
2003 if (!$formconfirm) {
2004 $parameters = array('formConfirm' => $formconfirm);
2005 $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
2006 if (empty($reshook)) {
2007 $formconfirm .= $hookmanager->resPrint;
2008 } elseif ($reshook > 0) {
2009 $formconfirm = $hookmanager->resPrint;
2010 }
2011 }
2012
2013 // Print form confirm
2014 print $formconfirm;
2015
2016
2017 // Calculate totalWeight and totalVolume for all products
2018 // by adding weight and volume of each product line.
2019 $tmparray = $object->getTotalWeightVolume();
2020 $totalWeight = $tmparray['weight'];
2021 $totalVolume = $tmparray['volume'];
2022
2023
2024 if ($typeobject == 'commande' && $object->origin_object->id && isModEnabled('order')) {
2025 $objectsrc = new Commande($db);
2026 $objectsrc->fetch($object->origin_object->id);
2027 }
2028 if ($typeobject == 'propal' && $object->origin_object->id && isModEnabled("propal")) {
2029 $objectsrc = new Propal($db);
2030 $objectsrc->fetch($object->origin_object->id);
2031 }
2032 if (($typeobject == 'supplier_order' || $typeobject == 'CommandeFournisseur') && $object->origin_object->id && isModEnabled("supplier_order")) {
2033 $objectsrc = new CommandeFournisseur($db);
2034 $objectsrc->fetch($object->origin_object->id);
2035 }
2036 // Reception card
2037 $linkback = '<a href="'.DOL_URL_ROOT.'/reception/list.php?restore_lastsearch_values=1'.(!empty($socid) ? '&socid='.$socid : '').'">'.$langs->trans("BackToList").'</a>';
2038 $morehtmlref = '<div class="refidno">';
2039 // Ref customer reception
2040
2041 $morehtmlref .= $form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $user->hasRight('reception', 'creer'), 'string', '', 0, 1);
2042 $morehtmlref .= $form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $user->hasRight('reception', 'creer'), 'string', '', null, null, '', 1);
2043
2044 // Thirdparty
2045 $morehtmlref .= '<br>'.$object->thirdparty->getNomUrl(1);
2046 // Project
2047 if ($origin && $origin_id > 0) {
2048 if (isModEnabled('project')) {
2049 $langs->load("projects");
2050 $morehtmlref .= '<br>';
2051 if (0) { // @phpstan-ignore-line Do not change on shipment
2052 $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
2053 if ($action != 'classify') {
2054 $morehtmlref .= '<a class="editfielda" href="'.$_SERVER['PHP_SELF'].'?action=classify&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->transnoentitiesnoconv('SetProject')).'</a> ';
2055 }
2056 $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $objectsrc->socid, (string) $objectsrc->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, 0, 0, 1, '', 'maxwidth300');
2057 } else {
2058 if (!empty($objectsrc) && !empty($objectsrc->fk_project)) {
2059 $proj = new Project($db);
2060 $proj->fetch($objectsrc->fk_project);
2061 $morehtmlref .= $proj->getNomUrl(1);
2062 if ($proj->title) {
2063 $morehtmlref .= '<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).'</span>';
2064 }
2065 }
2066 }
2067 }
2068 } elseif (!$origin && getDolGlobalString('RECEPTION_STANDALONE')) {
2069 // Project
2070 if (isModEnabled('project')) {
2071 $langs->load("projects");
2072 $morehtmlref .= '<br>';
2073 if ($permissiontoadd) {
2074 $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
2075 if ($action != 'classify') {
2076 $morehtmlref .= '<a class="editfielda" href="' . $_SERVER['PHP_SELF'] . '?action=classify&token=' . newToken() . '&id=' . $object->id . '">' . img_edit($langs->transnoentitiesnoconv('SetProject')) . '</a> ';
2077 }
2078 $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, (string) $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, 0, 0, 1, '', 'maxwidth300');
2079 } else {
2080 if (!empty($object->fk_project)) {
2081 $proj = new Project($db);
2082 $proj->fetch($object->fk_project);
2083 $morehtmlref .= $proj->getNomUrl(1);
2084 if ($proj->title) {
2085 $morehtmlref .= '<span class="opacitymedium"> - ' . dol_escape_htmltag($proj->title) . '</span>';
2086 }
2087 }
2088 }
2089 }
2090 }
2091 $morehtmlref .= '</div>';
2092
2093 dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
2094
2095
2096 print '<div class="fichecenter">';
2097 print '<div class="fichehalfleft">';
2098 print '<div class="underbanner clearboth"></div>';
2099
2100 print '<table class="border centpercent tableforfield">';
2101
2102 // Linked documents
2103 if ($typeobject == 'commande' && $object->origin_object->id && isModEnabled('order')) {
2104 print '<tr><td>';
2105 print $langs->trans("RefOrder").'</td>';
2106 print '<td colspan="3">';
2107 print $objectsrc->getNomUrl(1, 'commande');
2108 print "</td>\n";
2109 print '</tr>';
2110 }
2111 if ($typeobject == 'propal' && $object->origin_object->id && isModEnabled("propal")) {
2112 print '<tr><td>';
2113 print $langs->trans("RefProposal").'</td>';
2114 print '<td colspan="3">';
2115 print $objectsrc->getNomUrl(1, 'reception');
2116 print "</td>\n";
2117 print '</tr>';
2118 }
2119 if (($typeobject == 'supplier_order' || $typeobject == 'CommandeFournisseur') && $object->origin_object->id && isModEnabled("propal")) {
2120 print '<tr><td>';
2121 print $langs->trans("SupplierOrder").'</td>';
2122 print '<td colspan="3">';
2123 print $objectsrc->getNomUrl(1, 'reception');
2124 print "</td>\n";
2125 print '</tr>';
2126 }
2127
2128 // Date creation
2129 print '<tr><td class="titlefield">'.$langs->trans("DateCreation").'</td>';
2130 print '<td colspan="3">'.dol_print_date($object->date_creation, "dayhour", "tzuserrel")."</td>\n";
2131 print '</tr>';
2132
2133 // Reception Date
2134 print '<tr><td height="10">';
2135 print '<table class="nobordernopadding centpercent"><tr><td>';
2136 print $langs->trans('DateReception');
2137 print '</td>';
2138 if ($action != 'editdate_reception') {
2139 print '<td class="right"><a class="editfielda" href="' . $_SERVER["PHP_SELF"] . '?action=editdate_reception&token=' . newToken() . '&id=' . $object->id . '">' . img_edit($langs->trans('SetReceptionDate'), 1) . '</a></td>';
2140 }
2141 print '</tr></table>';
2142 print '</td><td>';
2143 if ($action == 'editdate_reception') {
2144 print '<form name="setdate_reception" action="' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '" method="post">';
2145 print '<input type="hidden" name="token" value="' . newToken() . '">';
2146 print '<input type="hidden" name="action" value="setdate_reception">';
2147 print $form->selectDate($object->date_reception ? $object->date_reception : -1, 'recep_', 1, 1, 0, "setdate_reception", 1, 0);
2148 print '<input type="submit" class="button button-edit smallpaddingimp" value="' . $langs->trans('Modify') . '">';
2149 print '</form>';
2150 } else {
2151 print $object->date_reception ? dol_print_date($object->date_reception, 'dayhour') : '&nbsp;';
2152 }
2153 print '</td>';
2154 print '</tr>';
2155
2156 // Delivery date planned
2157 print '<tr><td height="10">';
2158 print '<table class="nobordernopadding" width="100%"><tr><td>';
2159 print $langs->trans('DateDeliveryPlanned');
2160 print '</td>';
2161
2162 if ($action != 'editdate_livraison' && $permissiontoadd) {
2163 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>';
2164 }
2165 print '</tr></table>';
2166 print '</td><td colspan="2">';
2167 if ($action == 'editdate_livraison') {
2168 print '<form name="setdate_livraison" action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'" method="post">';
2169 print '<input type="hidden" name="token" value="'.newToken().'">';
2170 print '<input type="hidden" name="action" value="setdate_livraison">';
2171 print $form->selectDate($object->date_delivery ? $object->date_delivery : -1, 'liv_', 1, 1, 0, "setdate_livraison", 1, 0);
2172 print '<input type="submit" class="button button-edit" value="'.$langs->trans('Modify').'">';
2173 print '</form>';
2174 } else {
2175 print $object->date_delivery ? dol_print_date($object->date_delivery, 'dayhour') : '&nbsp;';
2176 }
2177 print '</td>';
2178 print '</tr>';
2179
2180 // Weight
2181 print '<tr><td>';
2182 print $form->editfieldkey("Weight", 'trueWeight', (string) $object->trueWeight, $object, $user->hasRight('reception', 'creer'));
2183 print '</td><td colspan="3">';
2184
2185 if ($action == 'edittrueWeight') {
2186 print '<form name="settrueweight" action="'.$_SERVER["PHP_SELF"].'" method="post">';
2187 print '<input name="action" value="settrueWeight" type="hidden">';
2188 print '<input name="id" value="'.$object->id.'" type="hidden">';
2189 print '<input type="hidden" name="token" value="'.newToken().'">';
2190 print '<input id="trueWeight" name="trueWeight" value="'.$object->trueWeight.'" type="text">';
2191 print $formproduct->selectMeasuringUnits("weight_units", "weight", (string) $object->weight_units, 0, 2);
2192 print ' <input class="button" name="modify" value="'.$langs->trans("Modify").'" type="submit">';
2193 print ' <input class="button button-cancel" name="cancel" value="'.$langs->trans("Cancel").'" type="submit">';
2194 print '</form>';
2195 } else {
2196 print $object->trueWeight;
2197 print ($object->trueWeight && $object->weight_units != '') ? ' '.measuringUnitString(0, "weight", $object->weight_units) : '';
2198 }
2199
2200 // Calculated
2201 if ($totalWeight > 0) {
2202 if (!empty($object->trueWeight)) {
2203 print ' ('.$langs->trans("SumOfProductWeights").': ';
2204 }
2205 print showDimensionInBestUnit($totalWeight, 0, "weight", $langs, getDolGlobalInt('MAIN_WEIGHT_DEFAULT_ROUND', -1), getDolGlobalString('MAIN_WEIGHT_DEFAULT_UNIT', 'no'));
2206 if (!empty($object->trueWeight)) {
2207 print ')';
2208 }
2209 }
2210 print '</td></tr>';
2211
2212 // Width
2213 print '<tr><td>'.$form->editfieldkey("Width", 'trueWidth', (string) $object->trueWidth, $object, $user->hasRight('reception', 'creer')).'</td><td colspan="3">';
2214 print $form->editfieldval("Width", 'trueWidth', $object->trueWidth, $object, $user->hasRight('reception', 'creer'));
2215 print ($object->trueWidth && $object->width_units != '') ? ' '.measuringUnitString(0, "size", $object->width_units) : '';
2216 print '</td></tr>';
2217
2218 // Height
2219 print '<tr><td>'.$form->editfieldkey("Height", 'trueHeight', (string) $object->trueHeight, $object, $user->hasRight('reception', 'creer')).'</td><td colspan="3">';
2220 if ($action == 'edittrueHeight') {
2221 print '<form name="settrueHeight" action="'.$_SERVER["PHP_SELF"].'" method="post">';
2222 print '<input name="action" value="settrueHeight" type="hidden">';
2223 print '<input name="id" value="'.$object->id.'" type="hidden">';
2224 print '<input type="hidden" name="token" value="'.newToken().'">';
2225 print '<input id="trueHeight" name="trueHeight" value="'.$object->trueHeight.'" type="text">';
2226 print $formproduct->selectMeasuringUnits("size_units", "size", $object->size_units, 0, 2);
2227 print ' <input class="button" name="modify" value="'.$langs->trans("Modify").'" type="submit">';
2228 print ' <input class="button button-cancel" name="cancel" value="'.$langs->trans("Cancel").'" type="submit">';
2229 print '</form>';
2230 } else {
2231 print $object->trueHeight;
2232 print ($object->trueHeight && $object->height_units != '') ? ' '.measuringUnitString(0, "size", $object->height_units) : '';
2233 }
2234
2235 print '</td></tr>';
2236
2237 // Depth
2238 print '<tr><td>'.$form->editfieldkey("Depth", 'trueDepth', (string) $object->trueDepth, $object, $user->hasRight('reception', 'creer')).'</td><td colspan="3">';
2239 print $form->editfieldval("Depth", 'trueDepth', $object->trueDepth, $object, $user->hasRight('reception', 'creer'));
2240 print ($object->trueDepth && $object->depth_units != '') ? ' '.measuringUnitString(0, "size", $object->depth_units) : '';
2241 print '</td></tr>';
2242
2243 // Volume
2244 print '<tr><td>';
2245 print $langs->trans("Volume");
2246 print '</td>';
2247 print '<td colspan="3">';
2248 $calculatedVolume = 0;
2249 $volumeUnit = 0;
2250 if ($object->trueWidth && $object->trueHeight && $object->trueDepth) {
2251 $calculatedVolume = ($object->trueWidth * $object->trueHeight * $object->trueDepth);
2252 $volumeUnit = $object->size_units * 3;
2253 }
2254 // If reception volume not defined we use sum of products
2255 if ($calculatedVolume > 0) {
2256 if ($volumeUnit < 50) {
2257 print showDimensionInBestUnit($calculatedVolume, $volumeUnit, "volume", $langs, getDolGlobalInt('MAIN_VOLUME_DEFAULT_ROUND', -1), getDolGlobalString("MAIN_VOLUME_DEFAULT_UNIT", 'no'));
2258 } else {
2259 print $calculatedVolume.' '.measuringUnitString(0, "volume", $volumeUnit);
2260 }
2261 }
2262 if ($totalVolume > 0) {
2263 if ($calculatedVolume) {
2264 print ' ('.$langs->trans("SumOfProductVolumes").': ';
2265 }
2266 print showDimensionInBestUnit($totalVolume, 0, "volume", $langs, getDolGlobalInt('MAIN_VOLUME_DEFAULT_ROUND', -1), getDolGlobalString('MAIN_VOLUME_DEFAULT_UNIT', 'no'));
2267 //if (empty($calculatedVolume)) print ' ('.$langs->trans("Calculated").')';
2268 if ($calculatedVolume) {
2269 print ')';
2270 }
2271 }
2272 print "</td>\n";
2273 print '</tr>';
2274
2275 // Other attributes
2276 $cols = 2;
2277
2278 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
2279
2280 print '</table>';
2281
2282 print '</div>';
2283 print '<div class="fichehalfright">';
2284 print '<div class="underbanner clearboth"></div>';
2285
2286 print '<table class="border centpercent tableforfield">';
2287
2288 // Reception method
2289 print '<tr><td height="10">';
2290 print '<table class="nobordernopadding centpercent"><tr><td>';
2291 print $langs->trans('ReceptionMethod');
2292 print '</td>';
2293
2294 if ($action != 'editshipping_method_id' && $permissiontoadd) {
2295 print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editshipping_method_id&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->trans('SetReceptionMethod'), 1).'</a></td>';
2296 }
2297 print '</tr></table>';
2298 print '</td><td colspan="2">';
2299 if ($action == 'editshipping_method_id') {
2300 print '<form name="setshipping_method_id" action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'" method="post">';
2301 print '<input type="hidden" name="token" value="'.newToken().'">';
2302 print '<input type="hidden" name="action" value="setshipping_method_id">';
2303 $object->fetch_delivery_methods();
2304 print $form->selectarray("shipping_method_id", $object->meths, $object->shipping_method_id, 1, 0, 0, "", 1);
2305 if ($user->admin) {
2306 print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1);
2307 }
2308 print '<input type="submit" class="button button-edit" value="'.$langs->trans('Modify').'">';
2309 print '</form>';
2310 } else {
2311 if ($object->shipping_method_id > 0) {
2312 // Get code using getLabelFromKey
2313 $code = $langs->getLabelFromKey($db, (string) $object->shipping_method_id, 'c_shipment_mode', 'rowid', 'code');
2314 print $langs->trans("SendingMethod".strtoupper($code));
2315 }
2316 }
2317 print '</td>';
2318 print '</tr>';
2319
2320 // Tracking Number
2321 print '<tr><td class="titlefield">'.$form->editfieldkey("TrackingNumber", 'tracking_number', $object->tracking_number, $object, $user->hasRight('reception', 'creer')).'</td><td colspan="3">';
2322 print $form->editfieldval("TrackingNumber", 'tracking_number', $object->tracking_url, $object, $user->hasRight('reception', 'creer'), 'safehtmlstring', $object->tracking_number);
2323 print '</td></tr>';
2324
2325 // Incoterms
2326 if (isModEnabled('incoterm')) {
2327 print '<tr><td>';
2328 print '<table width="100%" class="nobordernopadding"><tr><td>';
2329 print $langs->trans('IncotermLabel');
2330 print '<td><td class="right">';
2331 if ($user->hasRight('reception', 'creer')) {
2332 print '<a class="editfielda" href="'.DOL_URL_ROOT.'/reception/card.php?id='.$object->id.'&action=editincoterm&token='.newToken().'">'.img_edit().'</a>';
2333 } else {
2334 print '&nbsp;';
2335 }
2336 print '</td></tr></table>';
2337 print '</td>';
2338 print '<td colspan="3">';
2339 if ($action != 'editincoterm') {
2340 print $form->textwithpicto($object->display_incoterms(), $object->label_incoterms, 1);
2341 } else {
2342 print $form->select_incoterms((!empty($object->fk_incoterms) ? $object->fk_incoterms : ''), (!empty($object->location_incoterms) ? $object->location_incoterms : ''), $_SERVER['PHP_SELF'].'?id='.$object->id);
2343 }
2344 print '</td></tr>';
2345 }
2346
2347 print "</table>";
2348
2349 print '</div>';
2350 print '</div>';
2351
2352 print '<div class="clearboth"></div>';
2353
2354 /*
2355 * Lines of simple reception
2356 */
2357 if (!$origin_id && getDolGlobalString('RECEPTION_STANDALONE')) {
2358 if (!empty($object->table_element_line)) {
2359 // Show object lines
2360 $result = $object->getLinesArray();
2361
2362 print ' <form name="addproduct" id="addproduct" action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.(($action != 'editline') ? '' : '#line_'.GETPOSTINT('lineid')).'" method="POST">
2363 <input type="hidden" name="token" value="' . newToken().'">
2364 <input type="hidden" name="action" value="' . (($action != 'editline') ? 'addline' : 'updateline').'">
2365 <input type="hidden" name="mode" value="">
2366 <input type="hidden" name="page_y" value="">
2367 <input type="hidden" name="id" value="' . $object->id.'">
2368 ';
2369
2370 if (!empty($conf->use_javascript_ajax) && $object->status == $object::STATUS_DRAFT) {
2371 include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php';
2372 }
2373
2374 print '<div class="div-table-responsive-no-min">';
2375 if (!empty($object->lines) || ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action != 'selectlines' && $action != 'editline')) {
2376 print '<table id="tablelines" class="noborder noshadow" width="100%">';
2377 }
2378
2379 if (!empty($object->lines)) {
2380 $object->printObjectLines($action, $mysoc, null, GETPOSTINT('lineid'), 0, '/reception/tpl');
2381 }
2382
2383 // Form to add new line
2384 if ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action != 'selectlines') {
2385 if ($action != 'editline') {
2386 // Add products/services form
2387
2388 $parameters = array();
2389 $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
2390 if ($reshook < 0) {
2391 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
2392 }
2393 if (empty($reshook)) {
2394 $object->formAddObjectLine(0, $mysoc, $soc);
2395 }
2396 }
2397 }
2398
2399 if (!empty($object->lines) || ($object->status == Reception::STATUS_DRAFT && $permissiontoadd && $action != 'selectlines' && $action != 'editline')) {
2400 print '</table>';
2401 }
2402 print '</div>';
2403
2404 print "</form>\n";
2405 }
2406 } elseif (!empty($object->origin) && $object->origin_id > 0) {
2407 // Lines of products of origin
2408 if ($action == 'editline') {
2409 print '<form name="updateline" id="updateline" action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&amp;lineid='.$line_id.'" method="POST">
2410 <input type="hidden" name="token" value="' . newToken().'">
2411 <input type="hidden" name="action" value="updateline">
2412 <input type="hidden" name="mode" value="">
2413 <input type="hidden" name="id" value="' . $object->id.'">';
2414 }
2415 print '<br><br>';
2416
2417 print '<div class="div-table-responsive-no-min">';
2418 print '<table id="tablelines" class="noborder centpercent">';
2419 print '<thead>';
2420 print '<tr class="liste_titre">';
2421 // #
2422 if (getDolGlobalString('MAIN_VIEW_LINE_NUMBER')) {
2423 print '<td width="5" class="center">&nbsp;</td>';
2424 }
2425 // Product/Service
2426 print '<td>'.$langs->trans("Products").'</td>';
2427 // Comment
2428 print '<td>'.$langs->trans("Comment").'</td>';
2429 // Qty
2430 print '<td class="center">'.$langs->trans("QtyOrdered").'</td>';
2431 if ($origin && $origin_id > 0) {
2432 print '<td class="center">'.$langs->trans("QtyInOtherReceptions").'</td>';
2433 }
2434
2435 $editColspan = 3;
2436 if ($action == 'editline') {
2437 if (!isModEnabled('stock')) {
2438 $editColspan--;
2439 }
2440 if (empty($conf->productbatch->enabled)) {
2441 $editColspan--;
2442 }
2443 print '<td class="center" colspan="'.$editColspan.'">';
2444 if ($object->statut <= 1) {
2445 print $langs->trans("QtyToReceive").' - ';
2446 } else {
2447 print $langs->trans("QtyReceived").' - ';
2448 }
2449 if (isModEnabled('stock')) {
2450 print $langs->trans("WarehouseTarget").' - ';
2451 }
2452 if (isModEnabled('productbatch')) {
2453 print $langs->trans("Batch");
2454 }
2455 print '</td>';
2456 } else {
2457 $statusreceived = $object::STATUS_CLOSED;
2458 if (getDolGlobalInt("STOCK_CALCULATE_ON_RECEPTION")) {
2459 $statusreceived = $object::STATUS_VALIDATED;
2460 }
2461 if (getDolGlobalInt("STOCK_CALCULATE_ON_RECEPTION_CLOSE")) {
2462 $statusreceived = $object::STATUS_CLOSED;
2463 }
2464 if ($object->statut < $statusreceived) {
2465 print '<td class="center">'.$langs->trans("QtyToReceive").'</td>';
2466 } else {
2467 print '<td class="center">'.$langs->trans("QtyReceived").'</td>';
2468 }
2469 if (isModEnabled('stock')) {
2470 print '<td class="left">'.$langs->trans("WarehouseTarget").'</td>';
2471 }
2472
2473 if (isModEnabled('productbatch')) {
2474 print '<td class="left">'.$langs->trans("Batch").'</td>';
2475 }
2476 }
2477 print '<td class="center">'.$langs->trans("CalculatedWeight").'</td>';
2478 print '<td class="center">'.$langs->trans("CalculatedVolume").'</td>';
2479 //print '<td class="center">'.$langs->trans("Size").'</td>';
2480 if ($object->statut == 0) {
2481 print '<td class="linecoledit"></td>';
2482 print '<td class="linecoldelete" width="10"></td>';
2483 }
2484 print "</tr>\n";
2485 print '</thead>';
2486
2487 $var = false;
2488
2489 $outputlangs = $langs;
2490 if (getDolGlobalInt('MAIN_MULTILANGS') && getDolGlobalString('PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE')) {
2491 $object->fetch_thirdparty();
2492 $newlang = '';
2493 if (/* empty($newlang) && */ GETPOST('lang_id', 'aZ09')) {
2494 $newlang = GETPOST('lang_id', 'aZ09');
2495 }
2496 if (empty($newlang)) {
2497 $newlang = $object->thirdparty->default_lang;
2498 }
2499 if (!empty($newlang)) {
2500 $outputlangs = new Translate("", $conf);
2501 $outputlangs->setDefaultLang($newlang);
2502 }
2503 }
2504
2505 // Get list of products already sent for same source object into $alreadysent
2506 $alreadysent = array();
2507
2508 if (empty($origin)) {
2509 $origin = 'supplier_order';
2510 }
2511
2512 if ($origin_id > 0) {
2513 $sql = "SELECT obj.rowid, obj.fk_product, obj.label, obj.description, obj.product_type as fk_product_type, obj.qty as qty_asked, obj.date_start, obj.date_end";
2514 $sql .= ", ed.rowid as receptionline_id, ed.qty, ed.fk_reception as reception_id, ed.fk_entrepot";
2515 $sql .= ", e.rowid as reception_id, e.ref as reception_ref, e.date_creation, e.date_valid, e.date_delivery, e.date_reception";
2516 $sql .= ', p.label as product_label, p.ref, p.fk_product_type, p.rowid as prodid, p.tobatch as product_tobatch';
2517 $sql .= ', p.description as product_desc';
2518 $sql .= " FROM ".MAIN_DB_PREFIX."receptiondet_batch as ed";
2519 $sql .= ", ".MAIN_DB_PREFIX."reception as e";
2520 $sql .= ", ".MAIN_DB_PREFIX.(($origin == 'supplier_order') ? 'commande_fournisseur' : $origin)."det as obj";
2521 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON obj.fk_product = p.rowid";
2522 $sql .= " WHERE e.entity IN (".getEntity('reception').")";
2523 $sql .= " AND obj.fk_commande = ".((int) $origin_id);
2524 $sql .= " AND obj.rowid = ed.fk_elementdet";
2525 $sql .= " AND ed.fk_reception = e.rowid";
2526 $sql .= " AND ed.fk_reception !=".((int) $object->id);
2527 $sql .= " ORDER BY obj.fk_product";
2528
2529 dol_syslog("get list of reception lines", LOG_DEBUG);
2530 $resql = $db->query($sql);
2531 if ($resql) {
2532 $num = $db->num_rows($resql);
2533 $i = 0;
2534
2535 while ($i < $num) {
2536 $obj = $db->fetch_object($resql);
2537 if ($obj) {
2538 // $obj->rowid is rowid in $origin."det" table
2539 $alreadysent[$obj->rowid][$obj->receptionline_id] = array('reception_ref' => $obj->reception_ref, 'reception_id' => $obj->reception_id, 'warehouse' => $obj->fk_entrepot, 'qty' => $obj->qty, 'date_valid' => $obj->date_valid, 'date_delivery' => $obj->date_delivery);
2540 }
2541 $i++;
2542 }
2543 }
2544 //var_dump($alreadysent);
2545 }
2546
2547 $arrayofpurchaselinealreadyoutput = array();
2548
2549 // Loop on each product to send/sent. Warning: $lines must be sorted by ->fk_commandefourndet (it is a regroupment key on output)
2550 print '<tbody>';
2551 for ($i = 0; $i < $num_prod; $i++) {
2552 print '<!-- origin line id = '.(!empty($lines[$i]->origin_line_id) ? $lines[$i]->origin_line_id : 0).' -->'; // id of order line
2553 print '<tr class="oddeven" id="row-'.$lines[$i]->id.'" data-id="'.$lines[$i]->id.'" data-element="'.$lines[$i]->element.'">';
2554
2555 // #
2556 if (getDolGlobalString('MAIN_VIEW_LINE_NUMBER')) {
2557 print '<td class="center">'.($i + 1).'</td>';
2558 }
2559
2560 // Predefined product or service
2561 if ($lines[$i]->fk_product > 0) {
2562 // Define output language
2563 if (getDolGlobalInt('MAIN_MULTILANGS') && getDolGlobalString('PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE')) {
2564 $prod = new Product($db);
2565 $prod->fetch($lines[$i]->fk_product);
2566 $label = (!empty($prod->multilangs[$outputlangs->defaultlang]["label"])) ? $prod->multilangs[$outputlangs->defaultlang]["label"] : $lines[$i]->product->label;
2567 } else {
2568 $label = (!empty($lines[$i]->product->label) ? $lines[$i]->product->label : $lines[$i]->product->product_label);
2569 }
2570
2571 print '<td class="linecoldescription">';
2572 if (!array_key_exists($lines[$i]->fk_commandefourndet, $arrayofpurchaselinealreadyoutput)) {
2573 $text = $lines[$i]->product->getNomUrl(1);
2574 $text .= ' - '.$label;
2575 $description = (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE') ? '' : dol_htmlentitiesbr($lines[$i]->description));
2576 print $form->textwithtooltip($text, $description, 3, 0, '', (string) $i);
2577 print_date_range(!empty($lines[$i]->date_start) ? $lines[$i]->date_start : 0, !empty($lines[$i]->date_end) ? $lines[$i]->date_end : 0);
2578 if (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE')) {
2579 print (!empty($lines[$i]->description) && $lines[$i]->description != $label) ? '<br>'.dol_htmlentitiesbr($lines[$i]->description) : '';
2580 }
2581 }
2582 print "</td>\n";
2583 } else {
2584 print '<td class="linecoldescription">';
2585 if (!array_key_exists($lines[$i]->fk_commandefourndet, $arrayofpurchaselinealreadyoutput)) {
2586 if ($lines[$i]->product_type == Product::TYPE_SERVICE) {
2587 $text = img_object($langs->trans('Service'), 'service');
2588 } else {
2589 $text = img_object($langs->trans('Product'), 'product');
2590 }
2591
2592 if (!empty($lines[$i]->label)) {
2593 $text .= ' <strong>'.$lines[$i]->label.'</strong>';
2594 print $form->textwithtooltip($text, $lines[$i]->description, 3, 0, '', (string) $i);
2595 } else {
2596 print $text.' '.nl2br($lines[$i]->description);
2597 }
2598
2599 print_date_range($lines[$i]->date_start, $lines[$i]->date_end);
2600 }
2601 print "</td>\n";
2602 }
2603
2604 if ($action == 'editline' && $lines[$i]->id == $line_id) {
2605 print '<td><input name="comment'.$line_id.'" id="comment'.$line_id.'" value="'.dol_escape_htmltag($lines[$i]->comment).'"></td>';
2606 } else {
2607 print '<td style="white-space: pre-wrap; max-width: 200px;">'.dol_escape_htmltag($lines[$i]->comment).'</td>';
2608 }
2609
2610
2611 // Qty ordered
2612 print '<td class="center linecolqty">';
2613 if (!array_key_exists($lines[$i]->fk_commandefourndet, $arrayofpurchaselinealreadyoutput)) {
2614 print $lines[$i]->qty_asked;
2615 }
2616 print '</td>';
2617
2618 // Qty in other receptions (with reception and warehouse used)
2619 if ($origin && $origin_id > 0) {
2620 print '<td class="center nowrap linecolqtyinotherreceptions">';
2621 $htmltooltip = '';
2622 $qtyalreadyreceived = 0;
2623 if (!array_key_exists($lines[$i]->fk_commandefourndet, $arrayofpurchaselinealreadyoutput)) {
2624 foreach ($alreadysent as $key => $val) {
2625 if ($lines[$i]->fk_commandefourndet == $key) {
2626 $j = 0;
2627 foreach ($val as $receptionline_id => $receptionline_var) {
2628 if ($receptionline_var['reception_id'] == $lines[$i]->fk_reception) {
2629 continue; // We want to show only "other receptions"
2630 }
2631
2632 $j++;
2633 if ($j > 1) {
2634 $htmltooltip .= '<br>';
2635 }
2636 $reception_static->fetch($receptionline_var['reception_id']);
2637 $htmltooltip .= $reception_static->getNomUrl(1, 'nolink', 0, 0, 1);
2638 $htmltooltip .= ' - '.$receptionline_var['qty'];
2639
2640 $htmltext = $langs->trans("DateValidation").' : '.(empty($receptionline_var['date_valid']) ? $langs->trans("Draft") : dol_print_date($receptionline_var['date_valid'], 'dayhour'));
2641 if (isModEnabled('stock') && $receptionline_var['warehouse'] > 0) {
2642 $warehousestatic->fetch($receptionline_var['warehouse']);
2643 $htmltext .= '<br>'.$langs->trans("From").' : '.$warehousestatic->getNomUrl(1, '', 0, 1);
2644 }
2645 $htmltooltip .= ' '.$form->textwithpicto('', $htmltext, 1);
2646
2647 $qtyalreadyreceived += $receptionline_var['qty'];
2648 }
2649 if ($j) {
2650 $htmltooltip = $langs->trans("QtyInOtherReceptions").'...<br><br>'.$htmltooltip.'<br><input type="submit" name="dummyhiddenbuttontogetfocus" style="display:none" autofocus>';
2651 }
2652 }
2653 }
2654 }
2655 print $form->textwithpicto((string) $qtyalreadyreceived, $htmltooltip, 1, 'info', '', 0, 3, 'tooltip'.$lines[$i]->id);
2656 print '</td>';
2657 }
2658
2659 if ($action == 'editline' && $lines[$i]->id == $line_id) {
2660 // edit mode
2661 print '<td colspan="'.$editColspan.'" class="center"><table class="nobordernopadding">';
2662 if (isModEnabled('stock')) {
2663 if ($lines[$i]->fk_product > 0) {
2664 print '<!-- case edit 1 -->';
2665 print '<tr>';
2666 // Qty to receive or received
2667 print '<td><input name="qtyl'.$line_id.'" id="qtyl'.$line_id.'" type="text" size="4" value="'.$lines[$i]->qty.'"></td>';
2668 // Warehouse source
2669 print '<td>'.$formproduct->selectWarehouses($lines[$i]->fk_entrepot, 'entl'.$line_id, '', 1, 0, $lines[$i]->fk_product, '', 1).'</td>';
2670 // Batch number management
2671 if ($conf->productbatch->enabled && !empty($lines[$i]->product->status_batch)) {
2672 print '<td class="nowraponall left"><input name="batch'.$line_id.'" id="batch'.$line_id.'" type="text" value="'.$lines[$i]->batch.'"><br>';
2673 if (!getDolGlobalString('PRODUCT_DISABLE_SELLBY')) {
2674 print $langs->trans('SellByDate').' : ';
2675 print $form->selectDate($lines[$i]->sellby, 'dlc'.$line_id, 0, 0, 1, "").'</br>';
2676 }
2677 if (!getDolGlobalString('PRODUCT_DISABLE_EATBY')) {
2678 print $langs->trans('EatByDate').' : ';
2679 print $form->selectDate($lines[$i]->eatby, 'dluo'.$line_id, 0, 0, 1, "");
2680 }
2681 print '</td>';
2682 }
2683 print '</tr>';
2684 } else {
2685 print '<!-- case edit 2 -->';
2686 print '<tr>';
2687 // Qty to receive or received
2688 print '<td><input name="qtyl'.$line_id.'" id="qtyl'.$line_id.'" type="text" size="4" value="'.$lines[$i]->qty.'"></td>';
2689 // Warehouse source
2690 print '<td></td>';
2691 // Batch number management
2692 print '<td></td>';
2693 print '</tr>';
2694 }
2695 }
2696 print '</table></td>';
2697 } else {
2698 // Qty to receive or received
2699 print '<td class="center linecolqtytoreceive">'.$lines[$i]->qty.'</td>';
2700
2701 // Warehouse source
2702 if (isModEnabled('stock')) {
2703 if ($lines[$i]->fk_entrepot > 0) {
2704 $entrepot = new Entrepot($db);
2705 $entrepot->fetch($lines[$i]->fk_entrepot);
2706
2707 print '<td class="left tdoverflowmax150" title="'.dol_escape_htmltag($entrepot->label).'">';
2708 print $entrepot->getNomUrl(1);
2709 print '</td>';
2710 } else {
2711 print '<td></td>';
2712 }
2713 }
2714
2715 // Batch number management
2716 if (isModEnabled('productbatch')) {
2717 if (isset($lines[$i]->batch)) {
2718 print '<!-- Detail of lot -->';
2719 print '<td class="linecolbatch nowrap">';
2720 $detail = $langs->trans("NA");
2721 if ($lines[$i]->product->status_batch > 0 && $lines[$i]->fk_product > 0) {
2722 require_once DOL_DOCUMENT_ROOT.'/product/stock/class/productlot.class.php';
2723 $productlot = new Productlot($db);
2724 $reslot = $productlot->fetch(0, $lines[$i]->fk_product, $lines[$i]->batch);
2725 if ($reslot > 0) {
2726 $detail = $productlot->getNomUrl(1);
2727 } else {
2728 // lot is not created and info is only in reception lines
2729 $batchinfo = $langs->trans("Batch").': '.$lines[$i]->batch;
2730 if (!getDolGlobalString('PRODUCT_DISABLE_SELLBY')) {
2731 $batchinfo .= ' - '.$langs->trans("SellByDate").': '.dol_print_date($lines[$i]->sellby, "day");
2732 }
2733 if (!getDolGlobalString('PRODUCT_DISABLE_EATBY')) {
2734 $batchinfo .= ' - '.$langs->trans("EatByDate").': '.dol_print_date($lines[$i]->eatby, "day");
2735 }
2736 $detail = $form->textwithtooltip(img_picto('', 'object_barcode').' '.$langs->trans("DetailBatchNumber"), $batchinfo);
2737 }
2738 }
2739 print $detail . '</td>';
2740 } else {
2741 print '<td></td>';
2742 }
2743 }
2744 }
2745
2746 // Weight
2747 print '<td class="center linecolweight">';
2748 if (!empty($lines[$i]->fk_product_type) && $lines[$i]->fk_product_type == Product::TYPE_PRODUCT) {
2749 print $lines[$i]->product->weight * $lines[$i]->qty.' '.measuringUnitString(0, "weight", $lines[$i]->product->weight_units);
2750 } else {
2751 print '&nbsp;';
2752 }
2753 print '</td>';
2754
2755 // Volume
2756 print '<td class="center linecolvolume">';
2757 if (!empty($lines[$i]->fk_product_type) && $lines[$i]->fk_product_type == Product::TYPE_PRODUCT) {
2758 print $lines[$i]->product->volume * $lines[$i]->qty.' '.measuringUnitString(0, "volume", $lines[$i]->product->volume_units);
2759 } else {
2760 print '&nbsp;';
2761 }
2762 print '</td>';
2763
2764
2765 if ($action == 'editline' && $lines[$i]->id == $line_id) {
2766 print '<td class="center valignmiddle" colspan="2">';
2767 print '<input type="submit" class="button small button-save" id="savelinebutton marginbottomonly" name="save" value="'.$langs->trans("Save").'"><br>';
2768 print '<input type="submit" class="button small button-cancel" id="cancellinebutton" name="cancel" value="'.$langs->trans("Cancel").'"><br>';
2769 print '</td>';
2770 } elseif ($object->statut == Reception::STATUS_DRAFT) {
2771 // edit-delete buttons
2772 print '<td class="linecoledit center">';
2773 print '<a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=editline&token='.newToken().'&lineid='.$lines[$i]->id.'">'.img_edit().'</a>';
2774 print '</td>';
2775 print '<td class="linecoldelete" width="10">';
2776 print '<a class="reposition" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=deleteline&token='.newToken().'&lineid='.$lines[$i]->id.'">'.img_delete().'</a>';
2777 print '</td>';
2778
2779 // Display lines extrafields
2780 if (isset($rowExtrafieldsStart, $rowExtrafieldsView, $rowEnd)) { // @phan-suppress-current-line PhanPluginUndeclaredVariableIsset
2781 print $rowExtrafieldsStart;
2782 print $rowExtrafieldsView;
2783 print $rowEnd;
2784 }
2785 }
2786 print "</tr>";
2787
2788 $arrayofpurchaselinealreadyoutput[$lines[$i]->fk_commandefourndet] = $lines[$i]->fk_commandefourndet;
2789
2790 // Display lines extrafields
2791 $extralabelslines = $extrafields->attributes[$lines[$i]->table_element];
2792 if (!empty($extralabelslines) && is_array($extralabelslines) && count($extralabelslines) > 0) {
2793 $colspan = 8;
2794 if (isModEnabled('stock')) {
2795 $colspan++;
2796 }
2797 if (isModEnabled('productbatch')) {
2798 $colspan++;
2799 }
2800
2801 $line = new CommandeFournisseurDispatch($db);
2802 $line->id = $lines[$i]->id;
2803 $line->fetch_optionals();
2804
2805 if ($action == 'editline' && $lines[$i]->id == $line_id) {
2806 print $line->showOptionals($extrafields, 'edit', array('colspan' => $colspan), '');
2807 } else {
2808 print $line->showOptionals($extrafields, 'view', array('colspan' => $colspan), '');
2809 }
2810 }
2811 }
2812 print '</tbody>';
2813
2814 // TODO Show also lines ordered but not delivered
2815
2816 print "</table>\n";
2817 print '</div>';
2818
2819
2820 print dol_get_fiche_end();
2821
2822
2823 $object->fetchObjectLinked($object->id, $object->element);
2824 }
2825
2826 /*
2827 * Button actions
2828 */
2829
2830 if (($user->socid == 0) && ($action != 'presend')) {
2831 print '<div class="tabsAction">';
2832
2833 $parameters = array();
2834 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
2835 if (empty($reshook)) {
2836 if ($object->statut == Reception::STATUS_DRAFT && $num_prod > 0) {
2837 if ((!getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && $user->hasRight('reception', 'creer'))
2838 || (getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && $user->hasRight('reception', 'reception_advance', 'validate'))) {
2839 print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=valid&token='.newToken().'">'.$langs->trans("Validate").'</a>';
2840 } else {
2841 print '<a class="butActionRefused" href="#" title="'.$langs->trans("NotAllowed").'">'.$langs->trans("Validate").'</a>';
2842 }
2843 }
2844 // Back to draft
2845 if ($object->statut == Reception::STATUS_VALIDATED && $user->hasRight('reception', 'creer')) {
2846 print '<div class="inline-block divButAction"><a class="butAction" href="card.php?id='.$object->id.'&action=modif&token='.newToken().'">'.$langs->trans('SetToDraft').'</a></div>';
2847 }
2848
2849 // TODO add alternative status
2850 // 0=draft, 1=validated, 2=billed, we miss a status "delivered" (only available on order)
2851 if ($object->statut == Reception::STATUS_CLOSED && $user->hasRight('reception', 'creer')) {
2852 print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=reopen&token='.newToken().'">'.$langs->trans("ReOpen").'</a>';
2853 }
2854
2855 // Send mail
2856 if (empty($user->socid)) {
2857 if ($object->statut > 0) {
2858 if (!getDolGlobalString('MAIN_USE_ADVANCED_PERMS') || $user->hasRight('reception', 'reception_advance', 'send')) {
2859 print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=presend&mode=init#formmailbeforetitle">'.$langs->trans('SendByMail').'</a>';
2860 } else {
2861 print '<a class="butActionRefused" href="#">'.$langs->trans('SendByMail').'</a>';
2862 }
2863 }
2864 }
2865
2866 // Create bill
2867 if (isModEnabled("supplier_invoice") && ($object->statut == Reception::STATUS_VALIDATED || $object->statut == Reception::STATUS_CLOSED) && !getDolGlobalString('RECEPTION_STANDALONE')) {
2868 if ($user->hasRight('fournisseur', 'facture', 'creer') || $user->hasRight('supplier_invoice', 'creer')) {
2869 if (getDolGlobalString('WORKFLOW_BILL_ON_RECEPTION') !== '0') {
2870 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("CreateBill").'</a>';
2871 }
2872 }
2873 }
2874
2875
2876 // Set Billed and Closed
2877 if ($object->statut == Reception::STATUS_VALIDATED) {
2878 if ($user->hasRight('reception', 'creer') && $object->statut > 0) {
2879 if (!$object->billed && getDolGlobalString('WORKFLOW_BILL_ON_RECEPTION') !== '0') {
2880 print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=classifybilled&token='.newToken().'">'.$langs->trans('ClassifyBilled').'</a>';
2881 }
2882 print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=classifyclosed&token='.newToken().'">'.$langs->trans("Close").'</a>';
2883 }
2884 }
2885
2886 if ($user->hasRight('reception', 'supprimer')) {
2887 print '<a class="butActionDelete" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken().'">'.$langs->trans("Delete").'</a>';
2888 }
2889 }
2890
2891 print '</div>';
2892 }
2893
2894
2895 /*
2896 * Documents generated
2897 */
2898
2899 if ($action != 'presend' && $action != 'editline') {
2900 print '<div class="fichecenter"><div class="fichehalfleft">';
2901
2902 $objectref = dol_sanitizeFileName($object->ref);
2903 $filedir = $conf->reception->dir_output."/".$objectref;
2904
2905 $urlsource = $_SERVER["PHP_SELF"]."?id=".$object->id;
2906
2907 $genallowed = $user->hasRight('reception', 'lire');
2908 $delallowed = $user->hasRight('reception', 'creer');
2909
2910 print $formfile->showdocuments('reception', $objectref, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf, 1, 0, 0, 28, 0, '', '', '', $soc->default_lang);
2911
2912 // Show links to link elements
2913 //$tmparray = $form->showLinkToObjectBlock($object, null, array('order'), 1);
2914 $somethingshown = $form->showLinkedObjectBlock($object, '');
2915
2916 print '</div><div class="fichehalfright">';
2917
2918 print '</div></div>';
2919 }
2920
2921 // Presend form
2922 $modelmail = 'reception_send';
2923 $defaulttopic = 'SendReceptionRef';
2924 $diroutput = $conf->reception->dir_output;
2925 $trackid = 'rec'.$object->id;
2926
2927 include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php';
2928}
2929
2930
2931llxFooter();
2932
2933$db->close();
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:47
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:91
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:73
Class to manage table ReceptionLineBatch.
Class to manage predefined suppliers products.
Class to manage line orders.
Class to manage customers orders.
Class to manage a WYSIWYG editor.
Class to manage warehouses.
Class to manage standard extra fields.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class with static methods for building HTML components related to products Only components common to ...
Class to manage building of HTML components.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
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 products or services.
const TYPE_PRODUCT
Regular product.
const TYPE_SERVICE
Service.
Class with list of lots and properties.
Class to manage projects.
Class to manage proposals.
Class to manage receptions.
Class to manage table commandefournisseurdispatch.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
Class to manage Dolibarr users.
getCountry($searchkey, $withcode='', $dbtouse=null, $outputlangs=null, $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
global $mysoc
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.
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
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...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
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, $morecssdiv='')
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_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
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.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round=-1, $forceunitoutput='no', $use_short_label=0)
Output a dimension with best unit.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOSTFLOAT($paramname, $rounding='', $option=2)
Return the value of a $_GET or $_POST supervariable, converted into float.
dol_htmlcleanlastbr($stringtodecode)
This function remove all ending and br at end.
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...
print_date_range($date_start, $date_end, $format='', $outputlangs=null)
Format output for start and end date.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_clone($srcobject, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
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...
measuringUnitString($unitid, $measuring_style='', $unitscale=null, $use_short_label=0, $outputlangs=null)
Return translation label of a unit key.
reception_prepare_head(Reception $object)
Prepare array with list of tabs.
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.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.