dolibarr 23.0.3
stocktransfer_card.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2017 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
4 * Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
5 * Copyright (C) 2025 Pierre Ardoin <developpeur@lesmetiersdubatiment.fr>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
20
27// Load Dolibarr environment
28require '../../../main.inc.php';
29require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
30require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
31require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
32require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
33require_once DOL_DOCUMENT_ROOT.'/product/stock/class/productlot.class.php';
34require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php';
35require_once DOL_DOCUMENT_ROOT.'/product/stock/stocktransfer/class/stocktransfer.class.php';
36require_once DOL_DOCUMENT_ROOT.'/product/stock/stocktransfer/class/stocktransferline.class.php';
37require_once DOL_DOCUMENT_ROOT.'/product/stock/stocktransfer/lib/stocktransfer_stocktransfer.lib.php';
38require_once DOL_DOCUMENT_ROOT.'/core/modules/stocktransfer/modules_stocktransfer.php';
39
48// Load translation files required by the page
49$langs->loadLangs(array("stocks", "other", "productbatch", "companies"));
50if (isModEnabled('incoterm')) {
51 $langs->load('incoterm');
52}
53
54
55// Get parameters
56$id = GETPOSTINT('id');
57$ref = GETPOST('ref', 'alpha');
58
59$action = GETPOST('action', 'aZ09');
60$confirm = GETPOST('confirm', 'alpha');
61$cancel = GETPOST('cancel');
62$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : str_replace('_', '', basename(dirname(__FILE__)).basename(__FILE__, '.php')); // To manage different context of search
63$backtopage = GETPOST('backtopage', 'alpha'); // if not set, a default page will be used
64$backtopageforcancel = GETPOST('backtopageforcancel', 'alpha'); // if not set, $backtopage will be used
65$qty = GETPOSTINT('qty');
66$fk_product = GETPOSTINT('fk_product');
67$fk_warehouse_source = GETPOSTINT('fk_warehouse_source');
68$fk_warehouse_destination = GETPOSTINT('fk_warehouse_destination');
69$lineid = GETPOSTINT('lineid');
70$label = GETPOST('label', 'alpha');
71$batch = GETPOST('batch', 'alpha');
72$code_inv = GETPOST('inventorycode', 'alphanohtml');
73$sortfield = GETPOST('sortfield', 'aZ09comma');
74$sortorder = GETPOST('sortorder', 'aZ09comma');
75
76// Initialize a technical objects
77$object = new StockTransfer($db);
78$extrafields = new ExtraFields($db);
79$diroutputmassaction = $conf->stocktransfer->dir_output.'/temp/massgeneration/'.$user->id;
80$hookmanager->initHooks(array($object->element.'card', 'globalcard')); // Note that conf->hooks_modules contains array
81
82// Fetch optionals attributes and labels
83$extrafields->fetch_name_optionals_label($object->table_element);
84
85$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
86
87// Initialize array of search criteria
88$search_all = trim(GETPOST("search_all", 'alpha'));
89$search = array();
90foreach ($object->fields as $key => $val) {
91 if (GETPOST('search_'.$key, 'alpha')) {
92 $search[$key] = GETPOST('search_'.$key, 'alpha');
93 }
94}
95
96if (empty($action) && empty($id) && empty($ref)) {
97 $action = 'view';
98}
99
100// Load object
101include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be 'include', not 'include_once'.
102
103
104$permissiontoread = $user->hasRight('stocktransfer', 'stocktransfer', 'read');
105$permissiontoadd = $user->hasRight('stocktransfer', 'stocktransfer', 'write'); // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
106$permissionnote = $user->hasRight('stocktransfer', 'stocktransfer', 'write'); // Used by the include of actions_setnotes.inc.php
107$permissiontodelete = $user->rights->stocktransfer->stocktransfer->delete || ($permissiontoadd && isset($object->status) && $object->status < $object::STATUS_TRANSFERED);
108$permissiondellink = $user->hasRight('stocktransfer', 'stocktransfer', 'write'); // Used by the include of actions_dellink.inc.php
109$upload_dir = $conf->stocktransfer->multidir_output[isset($object->entity) ? $object->entity : 1];
110
111// Security check - Protection if external user
112//if ($user->socid > 0) accessforbidden();
113//if ($user->socid > 0) $socid = $user->socid;
114//$isdraft = (($object->statut == $object::STATUS_DRAFT) ? 1 : 0);
115//restrictedArea($user, 'stocktransfer', $object->id, '', '', 'fk_soc', 'rowid', $isdraft);
116
117if (!$permissiontoread || ($action === 'create' && !$permissiontoadd)) {
119}
120
121
122/*
123 * Actions
124 */
125
126$parameters = array();
127$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
128if ($reshook < 0) {
129 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
130}
131
132if (empty($reshook)) {
133 $error = 0;
134
135 $backurlforlist = dolBuildUrl(DOL_URL_ROOT.'/product/stock/stocktransfer/stocktransfer_list.php');
136
137 if (empty($backtopage) || ($cancel && empty($id))) {
138 if (empty($backtopage) || ($cancel && strpos($backtopage, '__ID__'))) {
139 if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) {
140 $backtopage = $backurlforlist;
141 } else {
142 $backtopage = dolBuildUrl(DOL_URL_ROOT.'/product/stock/stocktransfer/stocktransfer_card.php', ['id' => ($id > 0 ? $id : '__ID__')]);
143 }
144 }
145 }
146
147 $triggermodname = 'STOCKTRANSFER_MODIFY'; // Name of trigger action code to execute when we modify record
148
149 // Actions cancel, add, update, update_extras, confirm_validate, confirm_delete, confirm_deleteline, confirm_clone, confirm_close, confirm_setdraft, confirm_reopen
150 include DOL_DOCUMENT_ROOT.'/core/actions_addupdatedelete.inc.php';
151
152 // On remet cette lecture de permission ici car nécessaire d'avoir le nouveau statut de l'objet après toute action exécutée dessus (après incrémentation par example, le bouton supprimer doit disparaître)
153 $permissiontodelete = $user->rights->stocktransfer->stocktransfer->delete || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_DRAFT);
154
155 // Actions when linking object each other
156 include DOL_DOCUMENT_ROOT.'/core/actions_dellink.inc.php';
157
158 // Actions when printing a doc from card
159 include DOL_DOCUMENT_ROOT.'/core/actions_printing.inc.php';
160
161 // Action to move up and down lines of object
162 include DOL_DOCUMENT_ROOT.'/core/actions_lineupdown.inc.php';
163
164 // Action to build doc
165 include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
166
167 if ($action == 'set_thirdparty' && $permissiontoadd) {
168 $object->setValueFrom('fk_soc', GETPOSTINT('fk_soc'), '', null, 'date', '', $user, $triggermodname);
169 }
170 if ($action == 'classin' && $permissiontoadd) {
171 $object->setProject(GETPOSTINT('projectid'));
172 }
173
174 if ($action == 'addline' && $permissiontoadd) {
175 if ($qty <= 0) {
176 $error++;
177 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Qty")), null, 'errors');
178 $action = 'view';
179 }
180
181 if ($fk_warehouse_source <= 0) {
182 $error++;
183 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("WarehouseSource")), null, 'errors');
184 $action = 'view';
185 }
186
187 if ($fk_warehouse_destination <= 0) {
188 $error++;
189 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("WarehouseTarget")), null, 'errors');
190 $action = 'view';
191 }
192
193 $prod = new Product($db);
194 $prod->fetch($fk_product);
195 if ($prod->hasbatch()) {
196 if (empty($batch)) {
197 $error++;
198 $langs->load("errors");
199 setEventMessages($langs->transnoentities("ErrorTryToMakeMoveOnProductRequiringBatchData", $prod->ref), null, 'errors');
200 }
201 } else {
202 if (!empty($batch)) {
203 $error++;
204 setEventMessages($langs->transnoentities('StockTransferNoBatchForProduct', $prod->getNomUrl()), null, 'errors');
205 }
206 }
207
208 if ($prod->status_batch == 2 && abs($qty) > 1) {
209 $error++;
210 setEventMessages($langs->transnoentities('TooManyQtyForSerialNumber', $prod->ref), null, 'errors');
211 }
212
213 if (empty($error)) {
214 $line = new StockTransferLine($db);
215 $records = $line->fetchAll('', '', 0, 0, '(fk_stocktransfer:=:'.((int) $id).') AND (fk_product:=:'.((int) $fk_product).') AND (fk_warehouse_source:=:'.((int) $fk_warehouse_source).') AND (fk_warehouse_destination:=:'.((int) $fk_warehouse_destination).') AND ('.(empty($batch) ? "(batch:=:'') OR (batch:IS:NULL)" : "batch:=:'".$db->escape($batch)."'").')');
216 if (!empty($records[key($records)])) {
217 $line = $records[key($records)];
218 }
219 $line->fk_stocktransfer = $id;
220 $line->qty += $qty;
221 $line->fk_warehouse_source = $fk_warehouse_source;
222 $line->fk_warehouse_destination = $fk_warehouse_destination;
223 $line->fk_product = $fk_product;
224 $line->batch = $batch;
225
226 $line->pmp = $prod->pmp;
227 if ($line->id > 0) {
228 $line->update($user);
229 } else {
230 $line->rang = (is_array($object->lines) || $object->lines instanceof Countable) ? count($object->lines) + 1 : 1;
231 $line->create($user);
232 }
233 $object->fetchLines();
234 }
235 } elseif ($action === 'updateline' && $permissiontoadd) {
236 if ($qty <= 0) {
237 $error++;
238 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Qty")), null, 'errors');
239 $action = 'editline';
240 }
241
242 if ($fk_warehouse_source <= 0) {
243 $error++;
244 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("WarehouseSource")), null, 'errors');
245 $action = 'editline';
246 }
247
248 if ($fk_warehouse_destination <= 0) {
249 $error++;
250 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("WarehouseTarget")), null, 'errors');
251 $action = 'editline';
252 }
253
254 $prod = new Product($db);
255 $prod->fetch($fk_product);
256 if ($prod->hasbatch()) {
257 if (empty($batch)) {
258 $error++;
259 $langs->load("errors");
260 setEventMessages($langs->transnoentities("ErrorTryToMakeMoveOnProductRequiringBatchData", $prod->getNomUrl()), null, 'errors');
261 $action = 'editline';
262 }
263 } else {
264 if (!empty($batch)) {
265 $error++;
266 setEventMessages($langs->transnoentities('StockTransferNoBatchForProduct', $prod->getNomUrl()), null, 'errors');
267 $action = 'editline';
268 }
269 }
270
271 if ($prod->status_batch == 2 && abs($qty) > 1) {
272 $error++;
273 setEventMessages($langs->transnoentities('TooManyQtyForSerialNumber', $prod->ref), null, 'errors');
274 $action = 'editline';
275 }
276
277 if (empty($error)) {
278 $line = new StockTransferLine($db);
279 $line->fetch($lineid);
280 $line->qty = $qty;
281 $line->fk_warehouse_source = $fk_warehouse_source;
282 $line->fk_warehouse_destination = $fk_warehouse_destination;
283 $line->fk_product = $fk_product;
284 $line->batch = $batch;
285 $line->pmp = $prod->pmp;
286 $line->update($user);
287 }
288 }
289
290 // Decrease
291 if ($action == 'confirm_destock' && $confirm == 'yes' && $object->status == $object::STATUS_VALIDATED && $permissiontoadd) {
292 $lines = $object->getLinesArray();
293 if (!empty($lines)) {
294 $db->begin();
295 foreach ($lines as $line) {
296 $res = $line->doStockMovement($label, $code_inv, $line->fk_warehouse_source);
297 if ($res < 0) {
298 $error++;
299 setEventMessages($line->error, $line->errors, 'errors');
300 }
301 }
302 if (empty($error)) {
303 $db->commit();
304 } else {
305 $db->rollback();
306 }
307 }
308 if (empty($error)) {
309 $object->setStatut($object::STATUS_TRANSFERED, $id);
310 $object->status = $object::STATUS_TRANSFERED;
311 $object->date_reelle_depart = dol_now();
312 $object->update($user);
313 setEventMessage('StockStransferDecremented');
314 }
315 }
316
317 // Annulation décrémentation
318 if ($action == 'confirm_destockcancel' && $confirm == 'yes' && $object->status == $object::STATUS_TRANSFERED && $permissiontoadd) {
319 $lines = $object->getLinesArray();
320 if (!empty($lines)) {
321 $db->begin();
322 foreach ($lines as $line) {
323 $res = $line->doStockMovement($label, $code_inv, $line->fk_warehouse_source, 0);
324 if ($res <= 0) {
325 $error++;
326 setEventMessages($line->error, $line->errors, 'errors');
327 }
328 }
329 if (empty($error)) {
330 $db->commit();
331 } else {
332 $db->rollback();
333 }
334 }
335 if (empty($error)) {
336 $object->setStatut($object::STATUS_VALIDATED, $id);
337 $object->status = $object::STATUS_VALIDATED;
338 $object->date_reelle_depart = null;
339 $object->update($user);
340 setEventMessage('StockStransferDecrementedCancel', 'warnings');
341 }
342 }
343
344 // Incrémentation
345 if ($action == 'confirm_addstock' && $confirm == 'yes' && $object->status == $object::STATUS_TRANSFERED && $permissiontoadd) {
346 $lines = $object->getLinesArray();
347 if (!empty($lines)) {
348 $db->begin();
349 foreach ($lines as $line) {
350 $res = $line->doStockMovement($label, $code_inv, $line->fk_warehouse_destination, 0);
351 if ($res <= 0) {
352 $error++;
353 setEventMessages($line->error, $line->errors, 'errors');
354 }
355 }
356 if (empty($error)) {
357 $db->commit();
358 } else {
359 $db->rollback();
360 }
361 }
362 if (empty($error)) {
363 $object->setStatut($object::STATUS_CLOSED, $id);
364 $object->status = $object::STATUS_CLOSED;
365 $object->date_reelle_arrivee = dol_now();
366 $object->update($user);
367 setEventMessage('StockStransferIncrementedShort');
368 }
369 }
370
371 // Annulation incrémentation
372 if ($action == 'confirm_addstockcancel' && $confirm == 'yes' && $object->status == $object::STATUS_CLOSED && $permissiontoadd) {
373 $lines = $object->getLinesArray();
374 if (!empty($lines)) {
375 $db->begin();
376 foreach ($lines as $line) {
377 $res = $line->doStockMovement($label, $code_inv, $line->fk_warehouse_destination);
378 if ($res <= 0) {
379 $error++;
380 setEventMessages($line->error, $line->errors, 'errors');
381 }
382 }
383 if (empty($error)) {
384 $db->commit();
385 } else {
386 $db->rollback();
387 }
388 }
389 if (empty($error)) {
390 $object->setStatut($object::STATUS_TRANSFERED, $id);
391 $object->status = $object::STATUS_TRANSFERED;
392 $object->date_reelle_arrivee = null;
393 $object->update($user);
394 setEventMessage('StockStransferIncrementedShortCancel', 'warnings');
395 }
396 }
397
398 // Set incoterm
399 if ($action == 'set_incoterms' && isModEnabled('incoterm') && $permissiontoadd) {
400 $result = $object->setIncoterms(GETPOSTINT('incoterm_id'), GETPOST('location_incoterms'));
401 }
402 // Actions to send emails
403 $triggersendname = 'STOCKTRANSFER_SENTBYMAIL';
404 $autocopy = 'MAIN_MAIL_AUTOCOPY_STOCKTRANSFER_TO';
405 $trackid = 'stocktransfer'.$object->id;
406 include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
407}
408
409
410
411
412/*
413 * View
414 */
415
416$form = new Form($db);
417$formfile = new FormFile($db);
418$formproject = new FormProjets($db);
419
420$title = $langs->trans("StockTransfer");
421$help_url = '';
422
423llxHeader('', $title, $help_url, '', 0, 0, '', '', '', 'mod-product page-stock-stocktransfer_stocktransfer_card');
424
425
426
427// Example : Adding jquery code
428print '<script type="text/javascript" language="javascript">
429jQuery(document).ready(function() {';
430
431// Show alert for planned departure date if the transfer is related
432$date_prevue_depart = $object->date_prevue_depart;
433$date_prevue_depart_plus_delai = $date_prevue_depart;
434if ($object->lead_time_for_warning > 0) {
435 $date_prevue_depart_plus_delai = strtotime(date('Y-m-d', $date_prevue_depart) . ' + '.$object->lead_time_for_warning.' day');
436}
437if (!empty($date_prevue_depart) && $date_prevue_depart_plus_delai < strtotime(date('Y-m-d'))) {
438 print "$('.valuefield.fieldname_date_prevue_depart').append('";
439 print img_warning($langs->trans('Alert').' - '.$langs->trans('Late'));
440 print "');";
441}
442
443print '});
444</script>';
445
446
447// Part to create
448if ($action == 'create') {
449 if (empty($permissiontoadd)) {
450 accessforbidden('NotEnoughPermissions', 0, 1);
451 }
452
453 print load_fiche_titre($title, '', 'object_'.$object->picto);
454
455 print '<form method="POST" action="'.dolBuildUrl($_SERVER["PHP_SELF"]).'">';
456 print '<input type="hidden" name="token" value="'.newToken().'">';
457 print '<input type="hidden" name="action" value="add">';
458 if ($backtopage) {
459 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
460 }
461 if ($backtopageforcancel) {
462 print '<input type="hidden" name="backtopageforcancel" value="'.$backtopageforcancel.'">';
463 }
464
465 print dol_get_fiche_head(array(), '');
466
467
468 print '<table class="border centpercent tableforfieldcreate">'."\n";
469
470 // Common attributes
471 include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_add.tpl.php';
472
473 if (isModEnabled('incoterm')) {
474 $soc = new Societe($db);
475 if (!empty($object->fk_soc)) {
476 $soc->fetch($object->fk_soc);
477 }
478 print '<tr>';
479 print '<td><label for="incoterm_id">'.$form->textwithpicto($langs->trans("IncotermLabel"), $soc->label_incoterms, 1).'</label></td>';
480 print '<td class="maxwidthonsmartphone">';
481 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms : ''), (!empty($soc->location_incoterms) ? $soc->location_incoterms : ''), '', 'fk_incoterms');
482 print '</td></tr>';
483 }
484 // Template to use by default
485 print '<tr><td>'.$langs->trans('DefaultModel').'</td>';
486 print '<td>';
487 print img_picto('', 'pdf', 'class="pictofixedwidth"');
488 include_once DOL_DOCUMENT_ROOT.'/core/modules/commande/modules_commande.php';
490 $preselected = getDolGlobalString('STOCKTRANSFER_ADDON_PDF');
491 print $form->selectarray('model', $liste, $preselected, 0, 0, 0, '', 0, 0, 0, '', 'maxwidth200 widthcentpercentminusx', 1);
492 print "</td></tr>";
493
494 // Other attributes
495 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php';
496
497 print '</table>'."\n";
498
499 print dol_get_fiche_end();
500
501 print $form->buttonsSaveCancel("Create");
502
503 print '</form>';
504
505 //dol_set_focus('input[name="ref"]');
506}
507
508// Part to edit record
509if (($id || $ref) && $action == 'edit') {
510 print load_fiche_titre($langs->trans("StockTransfer"), '', 'object_' . $object->picto);
511
512 print '<form method="POST" action="' . $_SERVER["PHP_SELF"] . '">';
513 print '<input type="hidden" name="token" value="' . newToken() . '">';
514 print '<input type="hidden" name="action" value="update">';
515 print '<input type="hidden" name="id" value="' . $object->id . '">';
516 if ($backtopage) {
517 print '<input type="hidden" name="backtopage" value="' . $backtopage . '">';
518 }
519 if ($backtopageforcancel) {
520 print '<input type="hidden" name="backtopageforcancel" value="' . $backtopageforcancel . '">';
521 }
522
523 print dol_get_fiche_head();
524
525 print '<table class="border centpercent tableforfieldedit">' . "\n";
526
527 // Common attributes
528 include DOL_DOCUMENT_ROOT . '/core/tpl/commonfields_edit.tpl.php';
529
530 // Other attributes
531 include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_edit.tpl.php';
532
533 print '</table>';
534
535 print dol_get_fiche_end();
536
537 print $form->buttonsSaveCancel();
538
539 print '</form>';
540}
541
542// Part to show record
543if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'create'))) {
544 $res = $object->fetch_optionals();
545
546 $head = stocktransferPrepareHead($object);
547
548 print dol_get_fiche_head($head, 'card', $langs->trans("StockTransfer"), -1, $object->picto);
549
550 $formconfirm = '';
551
552 // Confirmation to delete (using preloaded confirm popup)
553 if ($action == 'delete' || ($conf->use_javascript_ajax && empty($conf->dol_use_jmobile))) {
554 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('DeleteMyObject'), $langs->trans('ConfirmDeleteObject'), 'confirm_delete', '', 0, 'action-delete');
555 }
556 // Confirmation to delete line
557 if ($action == 'deleteline') {
558 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$lineid, $langs->trans('DeleteLine'), $langs->trans('ConfirmDeleteLine'), 'confirm_deleteline', '', 0, 1);
559 }
560 $formquestion = array();
561 // Clone confirmation
562 if ($action == 'clone') {
563 // Create an array for form
564 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneAsk', $object->ref), 'confirm_clone', $formquestion, 'yes', 1);
565 } elseif ($action == 'destock') { // Destock confirmation
566 // Create an array for form
567 $formquestion = array( 'text' => '',
568 0 => array('type' => 'text', 'name' => 'label', 'label' => $langs->trans("Label"), 'value' => $langs->trans('ConfirmDestock', $object->ref), 'size' => 40),
569 1 => array('type' => 'text', 'name' => 'inventorycode', 'label' => $langs->trans("InventoryCode"), 'value' => dol_print_date(dol_now(), '%y%m%d%H%M%S'), 'size' => 25)
570 );
571 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('DestockAllProduct'), '', 'confirm_destock', $formquestion, 'yes', 1);
572 } elseif ($action == 'destockcancel') { // Destock confirmation cancel
573 // Create an array for form
574 $formquestion = array( 'text' => '',
575 0 => array('type' => 'text', 'name' => 'label', 'label' => $langs->trans("Label"), 'value' => $langs->trans('ConfirmDestockCancel', $object->ref), 'size' => 40),
576 1 => array('type' => 'text', 'name' => 'inventorycode', 'label' => $langs->trans("InventoryCode"), 'value' => dol_print_date(dol_now(), '%y%m%d%H%M%S'), 'size' => 25)
577 );
578 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('DestockAllProductCancel'), '', 'confirm_destockcancel', $formquestion, 'yes', 1);
579 } elseif ($action == 'addstock') { // Addstock confirmation
580 // Create an array for form
581 $formquestion = array( 'text' => '',
582 0 => array('type' => 'text', 'name' => 'label', 'label' => $langs->trans("Label").'&nbsp;:', 'value' => $langs->trans('ConfirmAddStock', $object->ref), 'size' => 40),
583 1 => array('type' => 'text', 'name' => 'inventorycode', 'label' => $langs->trans("InventoryCode"), 'value' => dol_print_date(dol_now(), '%y%m%d%H%M%S'), 'size' => 25)
584 );
585 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('AddStockAllProduct'), '', 'confirm_addstock', $formquestion, 'yes', 1);
586 } elseif ($action == 'addstockcancel') { // Addstock confirmation cancel
587 // Create an array for form
588 $formquestion = array( 'text' => '',
589 0 => array('type' => 'text', 'name' => 'label', 'label' => $langs->trans("Label").'&nbsp;:', 'value' => $langs->trans('ConfirmAddStockCancel', $object->ref), 'size' => 40),
590 1 => array('type' => 'text', 'name' => 'inventorycode', 'label' => $langs->trans("InventoryCode"), 'value' => dol_print_date(dol_now(), '%y%m%d%H%M%S'), 'size' => 25)
591 );
592 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('AddStockAllProductCancel'), '', 'confirm_addstockcancel', $formquestion, 'yes', 1);
593 }
594
595 if ($action == 'valid' && $permissiontoadd) {
596 $nextref = $object->getNextNumRef();
597 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('Validate'), $langs->transnoentities('ConfirmValidateStockTransfer', $nextref), 'confirm_validate', $formquestion, 0, 2);
598 }
599
600 // Call Hook formConfirm
601 $parameters = array('formConfirm' => $formconfirm, 'lineid' => $lineid);
602 $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
603 if (empty($reshook)) {
604 $formconfirm .= $hookmanager->resPrint;
605 } elseif ($reshook > 0) {
606 $formconfirm = $hookmanager->resPrint;
607 }
608
609 // Print form confirm
610 print $formconfirm;
611
612
613 // Object card
614 // ------------------------------------------------------------
615 $linkback = '<a href="'.dol_buildpath('/product/stock/stocktransfer/stocktransfer_list.php', 1).'?restore_lastsearch_values=1'.(!empty($socid) ? '&socid='.$socid : '').'">'.$langs->trans("BackToList").'</a>';
616
617 $morehtmlref = '<div class="refidno">';
618 // Thirdparty
619 $morehtmlref .= empty($object->thirdparty) ? '' : $object->thirdparty->getNomUrl(1, 'customer');
620 if (!getDolGlobalInt('MAIN_DISABLE_OTHER_LINK') && !empty($object->thirdparty) && $object->thirdparty->id > 0) {
621 $morehtmlref .= ' (<a href="'.DOL_URL_ROOT.'/commande/list.php?socid='.$object->thirdparty->id.'&search_societe='.urlencode($object->thirdparty->name).'">'.$langs->trans("OtherOrders").'</a>)';
622 }
623 // Project
624 if (isModEnabled('project')) {
625 $langs->load("projects");
626 $morehtmlref .= (empty($object->thirdparty) ? '' : '<br>');
627 if ($permissiontoadd) {
628 $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
629 if ($action != 'classify') {
630 $morehtmlref .= '<a class="editfielda" href="'.dolBuildUrl($_SERVER['PHP_SELF'], ['action' => 'classify', 'id' => $object->id], true).'">'.img_edit($langs->transnoentitiesnoconv('SetProject')).'</a> ';
631 }
632 $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');
633 } else {
634 if (!empty($object->fk_project)) {
635 $proj = new Project($db);
636 $proj->fetch($object->fk_project);
637 $morehtmlref .= $proj->getNomUrl(1);
638 if ($proj->title) {
639 $morehtmlref .= '<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).'</span>';
640 }
641 }
642 }
643 }
644 $morehtmlref .= '</div>';
645
646
647 dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
648
649
650 print '<div class="fichecenter">';
651 print '<div class="fichehalfleft">';
652 print '<div class="underbanner clearboth"></div>';
653 print '<table class="border centpercent tableforfield">'."\n";
654
655 // Common attributes
656 //$keyforbreak='fieldkeytoswitchonsecondcolumn'; // We change column just before this field
657 //unset($object->fields['fk_project']); // Hide field already shown in banner
658 //unset($object->fields['fk_soc']); // Hide field already shown in banner
659
660 $object->fields['fk_soc']['visible'] = 0; // Already available in banner
661 $object->fields['fk_project']['visible'] = 0; // Already available in banner
662 include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_view.tpl.php';
663
664 // Incoterms
665 if (isModEnabled('incoterm')) {
666 print '<tr><td>';
667 print '<table width="100%" class="nobordernopadding"><tr><td>';
668 print $langs->trans('IncotermLabel');
669 print '<td><td class="right">';
670 if ($permissiontoadd && $action != 'editincoterm') {
671 print '<a class="editfielda" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=editincoterm">'.img_edit().'</a>';
672 } else {
673 print '&nbsp;';
674 }
675 print '</td></tr></table>';
676 print '</td>';
677 print '<td>';
678 if ($action != 'editincoterm') {
679 print $form->textwithpicto($object->display_incoterms(), $object->label_incoterms, 1);
680 } else {
681 print $form->select_incoterms((!empty($object->fk_incoterms) ? $object->fk_incoterms : ''), (!empty($object->location_incoterms) ? $object->location_incoterms : ''), $_SERVER['PHP_SELF'].'?id='.$object->id);
682 }
683 print '</td></tr>';
684 }
685
686 echo '<tr>';
687 echo '<td>'.$langs->trans('EnhancedValue').'&nbsp;'.strtolower($langs->trans('TotalWoman'));
688 echo '<td>'.price($object->getValorisationTotale(), 0, '', 1, -1, -1, $conf->currency).'</td>';
689 echo '</tr>';
690
691 // Other attributes. Fields from hook formObjectOptions and Extrafields.
692 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
693
694 print '</table>';
695 print '</div>';
696 print '</div>';
697
698 print '<div class="clearboth"></div>';
699
700 print dol_get_fiche_end();
701
702
703 /*
704 * Lines
705 */
706
707 if (!empty($object->table_element_line)) {
708 // Show object lines
709 /*
710 $result = $object->getLinesArray();
711
712 print ' <form name="addproduct" id="addproduct" action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.(($action != 'editline') ? '' : '#line_'.GETPOST('lineid', 'int')).'" method="POST">
713 <input type="hidden" name="token" value="' . newToken().'">
714 <input type="hidden" name="action" value="' . (($action != 'editline') ? 'addline' : 'updateline').'">
715 <input type="hidden" name="mode" value="">
716 <input type="hidden" name="page_y" value="">
717 <input type="hidden" name="id" value="' . $object->id.'">
718 ';
719 */
720
721 if (!empty($conf->use_javascript_ajax) && $object->status == 0) {
722 $fk_element = $object->id;
723 include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php';
724 }
725
726 /*
727 print '<div class="div-table-responsive-no-min">';
728 if (!empty($object->lines) || ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action != 'selectlines' && $action != 'editline')) {
729 print '<table id="tablelines" class="noborder noshadow" width="100%">';
730 }
731
732 if (!empty($object->lines)) {
733 $object->printObjectLines($action, $mysoc, null, GETPOST('lineid', 'int'), 1);
734 }
735
736 // Form to add new line
737 if ($object->status == 0 && $permissiontoadd && $action != 'selectlines') {
738 if ($action != 'editline') {
739 // Add products/services form
740
741 $parameters = array();
742 $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
743 if ($reshook < 0) {
744 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
745 }
746 if (empty($reshook)) {
747 $object->formAddObjectLine(1, $mysoc, $soc);
748 }
749 }
750 }
751
752 if (!empty($object->lines) || ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action != 'selectlines' && $action != 'editline')) {
753 print '</table>';
754 }
755 print '</div>';
756
757 print "</form>\n";
758 */
759 }
760
761
762 $formproduct = new FormProduct($db);
763 print '<div class="div-table-responsive-no-min">';
764 print ' <form name="addproduct" id="addproduct" action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.(($action != 'editline') ? '#addline' : '#line_'.GETPOSTINT('lineid')).'" method="POST">
765 <input type="hidden" name="token" value="' . newToken().'">
766 <input type="hidden" name="action" value="' . (($action != 'editline') ? 'addline' : 'updateline').'">
767 <input type="hidden" name="mode" value="">
768 <input type="hidden" name="id" value="' . $object->id.'">
769 ';
770 if ($lineid > 0) {
771 print '<input type="hidden" name="lineid" value="'.$lineid.'" />';
772 }
773 print '<table id="tablelines" class="liste centpercent">';
774 //print '<div class="tagtable centpercent">';
775
776 $param = '';
777
778 print '<tr class="liste_titre">';
779 print getTitleFieldOfList($langs->trans('ProductRef'), 0, $_SERVER["PHP_SELF"], '', $param, '', '', $sortfield, $sortorder, 'tagtd maxwidthonsmartphone ');
780 if (isModEnabled('productbatch')) {
781 print getTitleFieldOfList($langs->trans('Batch'), 0, $_SERVER["PHP_SELF"], '', $param, '', '', $sortfield, $sortorder, 'tagtd maxwidthonsmartphone ');
782 }
783 print getTitleFieldOfList($langs->trans('WarehouseSource'), 0, $_SERVER["PHP_SELF"], '', $param, '', '', $sortfield, $sortorder, 'tagtd maxwidthonsmartphone ');
784 print getTitleFieldOfList($langs->trans('WarehouseTarget'), 0, $_SERVER["PHP_SELF"], '', $param, '', '', $sortfield, $sortorder, 'tagtd maxwidthonsmartphone ');
785 print getTitleFieldOfList($langs->trans('Qty'), 0, $_SERVER["PHP_SELF"], '', $param, '', '', $sortfield, $sortorder, 'center tagtd maxwidthonsmartphone ');
786 if (getDolGlobalInt('PRODUCT_USE_UNITS')) {
787 print getTitleFieldOfList($langs->trans('Unit'), 0, $_SERVER["PHP_SELF"], '', $param, '', '', $sortfield, $sortorder, 'tagtd maxwidthonsmartphone ');
788 }
789 print getTitleFieldOfList($langs->trans('AverageUnitPricePMPShort'), 0, $_SERVER["PHP_SELF"], '', $param, '', '', $sortfield, $sortorder, 'center tagtd maxwidthonsmartphone ');
790 print getTitleFieldOfList($langs->trans('EstimatedStockValueShort'), 0, $_SERVER["PHP_SELF"], '', $param, '', '', $sortfield, $sortorder, 'center tagtd maxwidthonsmartphone ');
791 if (empty($object->status) && $permissiontoadd) {
792 print getTitleFieldOfList('', 0);
793 print getTitleFieldOfList('', 0);
794 print getTitleFieldOfList('', 0);
795 }
796
797 print '</tr>';
798
799 $listofdata = $object->getLinesArray();
800 $productstatic = new Product($db);
801 $warehousestatics = new Entrepot($db);
802 $warehousestatict = new Entrepot($db);
803 $i = 0;
804
805 foreach ($listofdata as $key => $line) {
806 $productstatic->fetch($line->fk_product);
807 $warehousestatics->fetch($line->fk_warehouse_source);
808 $warehousestatict->fetch($line->fk_warehouse_destination);
809
810 // add html5 elements
811 $domData = ' data-element="'.$line->element.'"';
812 $domData .= ' data-id="'.$line->id.'"';
813 $domData .= ' data-qty="'.$line->qty.'"';
814 //$domData .= ' data-product_type="'.$line->product_type.'"';
815
816 print '<tr id="row-'.$line->id.'" class="drag drop oddeven" '.$domData.'>';
817 print '<td class="titlefield">';
818 if ($action === 'editline' && $line->id == $lineid) {
819 $form->select_produits($line->fk_product, 'fk_product', '', 0, 0, -1, 2, '', 0, array(), 0, 0, 0, 'minwidth200imp maxwidth300', 1);
820 } else {
821 print $productstatic->getNomUrl(1).' - '.$productstatic->label;
822 }
823 print '</td>';
824 if (isModEnabled('productbatch')) {
825 print '<td>';
826 if ($action === 'editline' && $line->id == $lineid) {
827 print '<input type="text" value="'.$line->batch.'" name="batch" class="flat maxwidth50"/>';
828 } else {
829 $productlot = new Productlot($db);
830 if ($productlot->fetch(0, $line->fk_product, $line->batch) > 0) {
831 print $productlot->getNomUrl(1);
832 } elseif (!empty($line->batch)) {
833 print $line->batch.'&nbsp;'.img_warning($langs->trans('BatchNotFound'));
834 }
835 }
836 print '</td>';
837 }
838
839 // Warehouse source
840 print '<td class="tdoverflowmax150">';
841 if ($action === 'editline' && $line->id == $lineid) {
842 print $formproduct->selectWarehouses($line->fk_warehouse_source, 'fk_warehouse_source', 'warehouseopen,warehouseinternal', 1, 0, 0, '', 0, 0, array(), 'minwidth200imp maxwidth200');
843 } else {
844 print $warehousestatics->getNomUrl(1);
845 }
846 print '</td>';
847
848 // Warehouse target
849 print '<td class="tdoverflowmax150">';
850 if ($action === 'editline' && $line->id == $lineid) {
851 print $formproduct->selectWarehouses($line->fk_warehouse_destination, 'fk_warehouse_destination', 'warehouseopen,warehouseinternal', 1, 0, 0, '', 0, 0, array(), 'minwidth200imp maxwidth200');
852 } else {
853 print $warehousestatict->getNomUrl(1);
854 }
855 print '</td>';
856
857 if ($action === 'editline' && $line->id == $lineid) {
858 print '<td class="center"><input type="text" class="flat maxwidth50" name="qty" value="'.$line->qty.'"></td>';
859 } else {
860 print '<td class="center">'.$line->qty.'</td>';
861 }
862
863 if (getDolGlobalInt('PRODUCT_USE_UNITS')) {
864 print '<td class="linecoluseunit nowrap left">';
865 $label = $productstatic->getLabelOfUnit('short');
866 print $label;
867 print '</td>';
868 }
869
870 print '<td class="center">';
871 print price($line->pmp, 0, '', 1, -1, -1, $conf->currency);
872 print '</td>';
873
874 print '<td class="center">';
875 print price($line->pmp * $line->qty, 0, '', 1, -1, -1, $conf->currency);
876 print '</td>';
877
878 if (empty($object->status) && $permissiontoadd) {
879 if ($action === 'editline' && $line->id == $lineid) {
880 //print '<td class="right" colspan="2"><input type="submit" class="button" name="addline" value="' . dol_escape_htmltag($langs->trans('Save')) . '"></td>';
881 print '<td class="center valignmiddle" colspan="2"><input type="submit" class="button buttongen marginbottomonly" id="savelinebutton marginbottomonly" name="save" value="'.$langs->trans("Save").'"><br>';
882 print '<input type="submit" class="button buttongen marginbottomonly" id="cancellinebutton" name="cancel" value="'.$langs->trans("Cancel").'"></td>';
883 } else {
884 print '<td class="right">';
885 print '<a class="editfielda reposition" href="' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '&amp;action=editline&amp;lineid=' . $line->id . '#line_' . $line->id . '">';
886 print img_edit() . '</a>';
887 print '</td>';
888 print '<td class="right">';
889 // Ensure the delete line link embeds a CSRF token.
890 $deleteLineUrl = $_SERVER["PHP_SELF"] . '?id=' . $id . '&action=deleteline&lineid=' . $line->id . '&token=' . newToken();
891 print '<a href="' . $deleteLineUrl . '">' . img_delete($langs->trans("Remove")) . '</a>';
892 print '</td>';
893 }
894
895 $num = count($object->lines);
896
897 if ($num > 1 && $conf->browser->layout != 'phone' && empty($disablemove)) {
898 print '<td class="linecolmove tdlineupdown center">';
899 if ($i > 0) { ?>
900 <a class="lineupdown" href="<?php print $_SERVER["PHP_SELF"].'?id='.$id.'&amp;action=up&amp;rowid='.$line->id; ?>">
901 <?php print img_up('default', 0, 'imgupforline'); ?>
902 </a>
903 <?php }
904 if ($i < $num - 1) { ?>
905 <a class="lineupdown" href="<?php print $_SERVER["PHP_SELF"].'?id='.$id.'&amp;action=down&amp;rowid='.$line->id; ?>">
906 <?php print img_down('default', 0, 'imgdownforline'); ?>
907 </a>
908 <?php }
909 print '</td>';
910 } else {
911 print '<td '.(($conf->browser->layout != 'phone' && empty($disablemove)) ? ' class="linecolmove tdlineupdown center"' : ' class="linecolmove center"').'></td>';
912 }
913 }
914
915 $i ++;
916 print '</tr>';
917 }
918
919 if (empty($object->status) && $action !== 'editline' && $permissiontoadd) {
920 print '<tr class="oddeven">';
921 // Product
922 print '<td class="titlefield">';
923 $filtertype = 0;
924 if (getDolGlobalString('STOCK_SUPPORTS_SERVICES')) {
925 $filtertype = '';
926 }
927 if (getDolGlobalInt('PRODUIT_LIMIT_SIZE') <= 0) {
928 $limit = 0;
929 } else {
930 $limit = getDolGlobalInt('PRODUIT_LIMIT_SIZE');
931 }
932
933 $form->select_produits($fk_product, 'fk_product', $filtertype, $limit, 0, -1, 2, '', 0, array(), 0, 0, 0, 'minwidth200imp maxwidth300', 1);
934 print '</td>';
935 // Batch number
936 if (isModEnabled('productbatch')) {
937 print '<td>';
938 print '<input type="text" name="batch" class="flat maxwidth50" '.(!empty($error) ? 'value="'.$batch.'"' : '').'>';
939 print '</td>';
940 }
941
942 $formproduct->loadWarehouses(); // Pour charger la totalité des entrepôts
943
944 // Define a list of warehouse to not show on the list
945 $TExcludedWarehouseSource = array();
946 if (!empty($object->fk_warehouse_source)) {
947 $source_ent = new Entrepot($db);
948 $source_ent->fetch($object->fk_warehouse_source);
949 foreach ($formproduct->cache_warehouses as $TDataCacheWarehouse) {
950 if (strpos($TDataCacheWarehouse['full_label'], $source_ent->label) === false) {
951 $TExcludedWarehouseSource[] = $TDataCacheWarehouse['id'];
952 }
953 }
954 }
955
956 // Define a list of warehouse to not show on the list
957 $TExcludedWarehouseDestination = array();
958 if (!empty($object->fk_warehouse_destination)) {
959 $dest_ent = new Entrepot($db);
960 $dest_ent->fetch($object->fk_warehouse_destination);
961 foreach ($formproduct->cache_warehouses as $TDataCacheWarehouse) {
962 if (strpos($TDataCacheWarehouse['full_label'], $dest_ent->label) === false) {
963 $TExcludedWarehouseDestination[] = $TDataCacheWarehouse['id'];
964 }
965 }
966 }
967
968 // We clean array. It is filled automatically when calling function select_warehouses
969 $formproduct->cache_warehouses = array();
970 // In warehouse
971 print '<td>';
972 print $formproduct->selectWarehouses(empty($fk_warehouse_source) ? $object->fk_warehouse_source : $fk_warehouse_source, 'fk_warehouse_source', 'warehouseopen,warehouseinternal', 1, 0, 0, '', 0, 0, array(), 'minwidth200imp maxwidth200', $TExcludedWarehouseSource);
973 print '</td>';
974
975 // We clean array. It is filled automatically when calling function select_warehouses
976 $formproduct->cache_warehouses = array();
977 // Out warehouse
978 print '<td>';
979 print $formproduct->selectWarehouses(empty($fk_warehouse_destination) ? $object->fk_warehouse_destination : $fk_warehouse_destination, 'fk_warehouse_destination', 'warehouseopen,warehouseinternal', 1, 0, 0, '', 0, 0, array(), 'minwidth200imp maxwidth200', $TExcludedWarehouseDestination);
980 print '</td>';
981
982 // Qty
983 print '<td class="center"><input type="text" class="flat maxwidth50" name="qty" '.(!empty($error) ? 'value="'.$qty.'"' : '').'></td>';
984
985 // PMP
986 print '<td></td>';
987 if (getDolGlobalInt('PRODUCT_USE_UNITS')) {
988 // Unité
989 print '<td></td>';
990 }
991
992 // PMP * Qty
993 print '<td></td>';
994
995 // Button to add line
996 print '<td class="right" colspan="2"><input type="submit" class="button" name="addline" value="' . dol_escape_htmltag($langs->trans('Add')) . '"></td>';
997
998 // Grad and drop lines
999 print '<td></td>';
1000
1001 print '</tr>';
1002 }
1003
1004 print '</table>';
1005 print '</form>';
1006 print '</div>';
1007
1008 // Buttons for actions
1009
1010 if ($action != 'presend' && $action != 'editline') {
1011 print '<div class="tabsAction">'."\n";
1012 $parameters = array();
1013 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1014 if ($reshook < 0) {
1015 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
1016 }
1017
1018 if (empty($reshook)) {
1019 // Send
1020 if (empty($user->socid)) {
1021 print dolGetButtonAction('', $langs->trans('SendMail'), 'email', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=presend&token='.newToken().'&mode=init#formmailbeforetitle');
1022 }
1023
1024 // Back to draft
1025 if ($object->status == $object::STATUS_VALIDATED) {
1026 print dolGetButtonAction('', $langs->trans('SetToDraft'), 'default', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=confirm_setdraft&confirm=yes&token='.newToken(), '', $permissiontoadd);
1027 }
1028
1029 // Modify
1030 print dolGetButtonAction('', $langs->trans('Modify'), 'default', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=edit&token='.newToken(), '', $permissiontoadd);
1031
1032 // Validate
1033 if ($object->status == $object::STATUS_DRAFT) {
1034 if (empty($object->table_element_line) || (is_array($object->lines) && count($object->lines) > 0)) {
1035 print dolGetButtonAction('', $langs->trans('Validate'), 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=confirm_validate&confirm=yes&token='.newToken(), '', $permissiontoadd);
1036 } else {
1037 $langs->load("errors");
1038 print dolGetButtonAction($langs->trans("ErrorAddAtLeastOneLineFirst"), $langs->trans("Validate"), 'default', '#', '', 0);
1039 }
1040 } elseif ($object->status == $object::STATUS_VALIDATED && $permissiontoadd) {
1041 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=destock&token='.newToken().'">'.$langs->trans("StockTransferDecrementation").'</a>';
1042 } elseif ($object->status == $object::STATUS_TRANSFERED && $permissiontoadd) {
1043 print '<a class="butActionDelete" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=destockcancel&token='.newToken().'">'.$langs->trans("StockTransferDecrementationCancel").'</a>';
1044 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=addstock&token='.newToken().'">'.$langs->trans("StockTransferIncrementation").'</a>';
1045 } elseif ($object->status == $object::STATUS_CLOSED && $permissiontoadd) {
1046 print '<a class="butActionDelete" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=addstockcancel&token='.newToken().'">'.$langs->trans("StockTransferIncrementationCancel").'</a>';
1047 }
1048
1049 // Clone
1050 if ($permissiontoadd) {
1051 print dolGetButtonAction('', $langs->trans('ToClone'), 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.(!empty($object->socid) ? '&socid='.$object->socid : '').'&action=clone&token='.newToken(), '', $permissiontoadd);
1052 }
1053
1054 /*
1055 if ($permissiontoadd) {
1056 if ($object->status == $object::STATUS_ENABLED) {
1057 print dolGetButtonAction('', $langs->trans('Disable'), 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=disable&token='.newToken(), '', $permissiontoadd);
1058 } else {
1059 print dolGetButtonAction('', $langs->trans('Enable'), 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=enable&token='.newToken(), '', $permissiontoadd);
1060 }
1061 }
1062 if ($permissiontoadd) {
1063 if ($object->status == $object::STATUS_VALIDATED) {
1064 print dolGetButtonAction('', $langs->trans('Cancel'), 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=close&token='.newToken(), '', $permissiontoadd);
1065 } else {
1066 print dolGetButtonAction('', $langs->trans('Re-Open'), 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=reopen&token='.newToken(), '', $permissiontoadd);
1067 }
1068 }
1069
1070 */
1071
1072 // Delete (with preloaded confirm popup)
1073 $deleteUrl = $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken();
1074 $buttonId = 'action-delete-no-ajax';
1075 if ($conf->use_javascript_ajax && empty($conf->dol_use_jmobile)) { // We can use preloaded confirm if not jmobile
1076 $deleteUrl = '';
1077 $buttonId = 'action-delete';
1078 }
1079 $params = array();
1080 print dolGetButtonAction('', $langs->trans("Delete"), 'delete', $deleteUrl, $buttonId, $permissiontodelete, $params);
1081 }
1082 print '</div>'."\n";
1083 }
1084
1085
1086 // Select mail models is same action as presend
1087 if (GETPOST('modelselected')) {
1088 $action = 'presend';
1089 }
1090
1091 if ($action != 'presend') {
1092 print '<div class="fichecenter"><div class="fichehalfleft">';
1093 print '<a name="builddoc"></a>'; // ancre
1094
1095 $includedocgeneration = 1;
1096
1097 // Documents
1098 if ($includedocgeneration) {
1099 $objref = dol_sanitizeFileName($object->ref);
1100 $relativepath = $objref . '/' . $objref . '.pdf';
1101 $filedir = $conf->stocktransfer->dir_output.'/'.$object->element.'/'.$objref;
1102 $urlsource = $_SERVER["PHP_SELF"] . "?id=" . $object->id;
1103 $genallowed = $permissiontoread; // If you can read, you can build the PDF to read content
1104 $delallowed = $permissiontoadd; // If you can create/edit, you can remove a file on card
1105 print $formfile->showdocuments('stocktransfer:StockTransfer', $object->element.'/'.$objref, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf, 1, 0, 0, 28, 0, '', '', '', $langs->defaultlang);
1106 }
1107
1108 // Show links to link elements
1109 $tmparray = $form->showLinkToObjectBlock($object, array(), array('stocktransfer'), 1);
1110 $linktoelem = $tmparray['linktoelem'];
1111 $htmltoenteralink = $tmparray['htmltoenteralink'];
1112 print $htmltoenteralink;
1113
1114 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
1115
1116
1117 print '</div><div class="fichehalfright">';
1118
1119 $MAXEVENT = 10;
1120
1121 $morehtmlcenter = dolGetButtonTitle($langs->trans('SeeAll'), '', 'fa fa-bars imgforviewmode', dol_buildpath('/mymodule/myobject_agenda.php', 1).'?id='.$object->id);
1122
1123 // List of actions on element
1124 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
1125 $formactions = new FormActions($db);
1126 $somethingshown = $formactions->showactions($object, 'stocktransfer', 0, 1, '', $MAXEVENT, '');
1127
1128 print '</div></div>';
1129 }
1130
1131 //Select mail models is same action as presend
1132 if (GETPOST('modelselected')) {
1133 $action = 'presend';
1134 }
1135
1136 // Presend form
1137 $modelmail = 'stocktransfer';
1138 $defaulttopic = 'InformationMessage';
1139 $diroutput = $conf->stocktransfer->dir_output;
1140 $trackid = 'stocktransfer'.$object->id;
1141
1142 include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php';
1143}
1144
1145// End of page
1146llxFooter();
1147$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 warehouses.
Class to manage standard extra fields.
Class to manage building of HTML components.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class 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 products or services.
Class with list of lots and properties.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class for StockTransfer.
Class for StockTransferLine.
dol_now($mode='gmt')
Return date for now.
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_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
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.
dolBuildUrl($url, $params=[], $addtoken=false)
Return path of url.
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.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
img_down($titlealt='default', $selected=0, $moreclass='')
Show down arrow logo.
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.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
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).
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
img_up($titlealt='default', $selected=0, $moreclass='')
Show top arrow logo.
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...
if(getDolGlobalString( 'TAKEPOS_SHOW_CUSTOMER')) print $langs trans('Date')." left Label right Qty right Price right TotalHT right TotalTTC right right right right right right right right right centpercent right TotalHT right n right VAT right n right TotalVAT right n No sujeto a RE IRPF right TotalLT1 right n right TotalLT2 right n right TotalTTC right n takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency right TotalTTC takeposcustomercurrency right takeposcustomercurrency n right PaymentTypeShortLIQ right SELECT p pos_change as p datep as date
Definition receipt.php:464
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.
stocktransferPrepareHead($object)
Prepare array of tabs for StockTransfer.