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