28require
'../../../main.inc.php';
36require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formcompany.class.php';
37require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
38require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
39require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
40require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/productlot.class.php';
41require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
42require_once DOL_DOCUMENT_ROOT.
'/product/stock/stocktransfer/class/stocktransfer.class.php';
43require_once DOL_DOCUMENT_ROOT.
'/product/stock/stocktransfer/class/stocktransferline.class.php';
44require_once DOL_DOCUMENT_ROOT.
'/product/stock/stocktransfer/lib/stocktransfer_stocktransfer.lib.php';
45require_once DOL_DOCUMENT_ROOT.
'/core/modules/stocktransfer/modules_stocktransfer.php';
48$langs->loadLangs(array(
"stocks",
"other",
"productbatch",
"companies"));
50 $langs->load(
'incoterm');
58$action =
GETPOST(
'action',
'aZ09');
59$confirm =
GETPOST(
'confirm',
'alpha');
61$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') : str_replace(
'_',
'', basename(dirname(__FILE__)).basename(__FILE__,
'.php'));
62$backtopage =
GETPOST(
'backtopage',
'alpha');
63$backtopageforcancel =
GETPOST(
'backtopageforcancel',
'alpha');
66$fk_warehouse_source =
GETPOSTINT(
'fk_warehouse_source');
67$fk_warehouse_destination =
GETPOSTINT(
'fk_warehouse_destination');
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');
78$diroutputmassaction =
$conf->stocktransfer->dir_output.
'/temp/massgeneration/'.$user->id;
79$hookmanager->initHooks(array(
$object->element.
'card',
'globalcard'));
82$extrafields->fetch_name_optionals_label(
$object->table_element);
84$search_array_options = $extrafields->getOptionalsFromPost(
$object->table_element,
'',
'search_');
87$search_all = trim(
GETPOST(
"search_all",
'alpha'));
89foreach (
$object->fields as $key => $val) {
90 if (
GETPOST(
'search_'.$key,
'alpha')) {
91 $search[$key] =
GETPOST(
'search_'.$key,
'alpha');
95if (empty($action) && empty($id) && empty($ref)) {
100include DOL_DOCUMENT_ROOT.
'/core/actions_fetchobject.inc.php';
103$permissiontoread = $user->hasRight(
'stocktransfer',
'stocktransfer',
'read');
104$permissiontoadd = $user->hasRight(
'stocktransfer',
'stocktransfer',
'write');
105$permissionnote = $user->hasRight(
'stocktransfer',
'stocktransfer',
'write');
106$permissiontodelete = $user->rights->stocktransfer->stocktransfer->delete || ($permissiontoadd && isset(
$object->status) &&
$object->status < $object::STATUS_TRANSFERED);
107$permissiondellink = $user->hasRight(
'stocktransfer',
'stocktransfer',
'write');
108$upload_dir =
$conf->stocktransfer->multidir_output[isset(
$object->entity) ?
$object->entity : 1];
111restrictedArea($user,
'stocktransfer',
$object->id,
'stocktransfer_stocktransfer',
'stocktransfer',
'fk_soc',
'rowid');
113if (!$permissiontoread || ($action ===
'create' && !$permissiontoadd)) {
122$parameters = array();
123$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
128if (empty($reshook)) {
131 $backurlforlist =
dolBuildUrl(DOL_URL_ROOT.
'/product/stock/stocktransfer/stocktransfer_list.php');
133 if (empty($backtopage) || ($cancel && empty($id))) {
134 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
135 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
136 $backtopage = $backurlforlist;
138 $backtopage =
dolBuildUrl(DOL_URL_ROOT.
'/product/stock/stocktransfer/stocktransfer_card.php', [
'id' => ($id > 0 ? $id :
'__ID__')]);
143 $triggermodname =
'STOCKTRANSFER_MODIFY';
146 include DOL_DOCUMENT_ROOT.
'/core/actions_addupdatedelete.inc.php';
149 $permissiontodelete = $user->rights->stocktransfer->stocktransfer->delete || ($permissiontoadd && isset(
$object->status) &&
$object->status == $object::STATUS_DRAFT);
152 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
155 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
158 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
161 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
163 if ($action ==
'set_thirdparty' && $permissiontoadd) {
164 $object->setValueFrom(
'fk_soc',
GETPOSTINT(
'fk_soc'),
'',
null,
'date',
'', $user, $triggermodname);
166 if ($action ==
'classin' && $permissiontoadd) {
170 if ($action ==
'addline' && $permissiontoadd) {
173 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Qty")),
null,
'errors');
177 if ($fk_warehouse_source <= 0) {
179 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"WarehouseSource")),
null,
'errors');
183 if ($fk_warehouse_destination <= 0) {
185 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"WarehouseTarget")),
null,
'errors');
190 $prod->fetch($fk_product);
191 if (
$prod->hasbatch()) {
194 $langs->load(
"errors");
195 setEventMessages($langs->transnoentities(
"ErrorTryToMakeMoveOnProductRequiringBatchData",
$prod->ref),
null,
'errors');
198 if (!empty($batch)) {
200 setEventMessages($langs->transnoentities(
'StockTransferNoBatchForProduct',
$prod->getNomUrl()),
null,
'errors');
204 if (
$prod->status_batch == 2 && abs($qty) > 1) {
211 $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).
"'").
')');
212 if (!empty($records[key($records)])) {
213 $line = $records[key($records)];
215 $line->fk_stocktransfer =
$id;
217 $line->fk_warehouse_source = $fk_warehouse_source;
218 $line->fk_warehouse_destination = $fk_warehouse_destination;
219 $line->fk_product = $fk_product;
220 $line->batch = $batch;
222 $line->pmp =
$prod->pmp;
224 $line->update($user);
226 $line->rang = (is_array(
$object->lines) ||
$object->lines instanceof Countable) ? count(
$object->lines) + 1 : 1;
227 $line->create($user);
231 } elseif ($action ===
'updateline' && $permissiontoadd) {
234 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Qty")),
null,
'errors');
235 $action =
'editline';
238 if ($fk_warehouse_source <= 0) {
240 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"WarehouseSource")),
null,
'errors');
241 $action =
'editline';
244 if ($fk_warehouse_destination <= 0) {
246 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"WarehouseTarget")),
null,
'errors');
247 $action =
'editline';
251 $prod->fetch($fk_product);
252 if (
$prod->hasbatch()) {
255 $langs->load(
"errors");
256 setEventMessages($langs->transnoentities(
"ErrorTryToMakeMoveOnProductRequiringBatchData",
$prod->getNomUrl()),
null,
'errors');
257 $action =
'editline';
260 if (!empty($batch)) {
262 setEventMessages($langs->transnoentities(
'StockTransferNoBatchForProduct',
$prod->getNomUrl()),
null,
'errors');
263 $action =
'editline';
267 if (
$prod->status_batch == 2 && abs($qty) > 1) {
270 $action =
'editline';
275 $line->fetch($lineid);
277 $line->fk_warehouse_source = $fk_warehouse_source;
278 $line->fk_warehouse_destination = $fk_warehouse_destination;
279 $line->fk_product = $fk_product;
280 $line->batch = $batch;
281 $line->pmp =
$prod->pmp;
282 $line->update($user);
287 if ($action ==
'confirm_destock' && $confirm ==
'yes' &&
$object->status == $object::STATUS_VALIDATED && $permissiontoadd) {
288 $lines =
$object->getLinesArray();
289 if (!empty($lines)) {
291 foreach ($lines as $line) {
292 $res = $line->doStockMovement($label, $code_inv, $line->fk_warehouse_source);
305 $object->setStatut($object::STATUS_TRANSFERED, $id);
306 $object->status = $object::STATUS_TRANSFERED;
314 if ($action ==
'confirm_destockcancel' && $confirm ==
'yes' &&
$object->status == $object::STATUS_TRANSFERED && $permissiontoadd) {
315 $lines =
$object->getLinesArray();
316 if (!empty($lines)) {
318 foreach ($lines as $line) {
319 $res = $line->doStockMovement($label, $code_inv, $line->fk_warehouse_source, 0);
332 $object->setStatut($object::STATUS_VALIDATED, $id);
333 $object->status = $object::STATUS_VALIDATED;
334 $object->date_reelle_depart =
null;
341 if ($action ==
'confirm_addstock' && $confirm ==
'yes' &&
$object->status == $object::STATUS_TRANSFERED && $permissiontoadd) {
342 $lines =
$object->getLinesArray();
343 if (!empty($lines)) {
345 foreach ($lines as $line) {
346 $res = $line->doStockMovement($label, $code_inv, $line->fk_warehouse_destination, 0);
359 $object->setStatut($object::STATUS_CLOSED, $id);
360 $object->status = $object::STATUS_CLOSED;
363 $result =
$object->call_trigger(
'STOCKTRANSFER_CLOSE', $user);
373 if ($action ==
'confirm_addstockcancel' && $confirm ==
'yes' &&
$object->status == $object::STATUS_CLOSED && $permissiontoadd) {
374 $lines =
$object->getLinesArray();
375 if (!empty($lines)) {
377 foreach ($lines as $line) {
378 $res = $line->doStockMovement($label, $code_inv, $line->fk_warehouse_destination);
391 $object->setStatut($object::STATUS_TRANSFERED, $id);
392 $object->status = $object::STATUS_TRANSFERED;
393 $object->date_reelle_arrivee =
null;
400 if ($action ==
'set_incoterms' &&
isModEnabled(
'incoterm') && $permissiontoadd) {
404 $triggersendname =
'STOCKTRANSFER_SENTBYMAIL';
405 $autocopy =
'MAIN_MAIL_AUTOCOPY_STOCKTRANSFER_TO';
406 $trackid =
'stocktransfer'.$object->id;
407 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
421$title = $langs->trans(
"StockTransfer");
424llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-product page-stock-stocktransfer_stocktransfer_card');
428print
'<script type="text/javascript" language="javascript">
429jQuery(document).ready(function() {';
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');
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'));
448if ($action ==
'create') {
449 if (empty($permissiontoadd)) {
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">';
459 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
461 if ($backtopageforcancel) {
462 print
'<input type="hidden" name="backtopageforcancel" value="'.$backtopageforcancel.
'">';
468 print
'<table class="border centpercent tableforfieldcreate">'.
"\n";
471 include DOL_DOCUMENT_ROOT.
'/core/tpl/commonfields_add.tpl.php';
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');
485 print
'<tr><td>'.$langs->trans(
'DefaultModel').
'</td>';
487 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
488 include_once DOL_DOCUMENT_ROOT.
'/core/modules/commande/modules_commande.php';
491 print $form->selectarray(
'model', $liste, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
495 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
497 print
'</table>'.
"\n";
501 print $form->buttonsSaveCancel(
"Create");
509if (($id || $ref) && $action ==
'edit') {
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 .
'">';
517 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
519 if ($backtopageforcancel) {
520 print
'<input type="hidden" name="backtopageforcancel" value="' . $backtopageforcancel .
'">';
525 print
'<table class="border centpercent tableforfieldedit">' .
"\n";
528 include DOL_DOCUMENT_ROOT .
'/core/tpl/commonfields_edit.tpl.php';
531 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_edit.tpl.php';
537 print $form->buttonsSaveCancel();
543if (
$object->id > 0 && (empty($action) || ($action !=
'edit' && $action !=
'create'))) {
544 $res =
$object->fetch_optionals();
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');
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);
560 $formquestion = array();
562 if ($action ==
'clone') {
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') {
567 $formquestion = array(
'text' =>
'',
568 0 => array(
'type' =>
'text',
'name' =>
'label',
'label' => $langs->trans(
"Label"),
'value' => $langs->trans(
'ConfirmDestock',
$object->ref),
'morecss' =>
'minwidth300'),
569 1 => array(
'type' =>
'text',
'name' =>
'inventorycode',
'label' => $langs->trans(
"InventoryCode"),
'value' =>
dol_print_date(
dol_now(),
'%y%m%d%H%M%S'),
'morecss' =>
'minwidth200')
571 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DestockAllProduct'),
'',
'confirm_destock', $formquestion,
'yes', 1);
572 } elseif ($action ==
'destockcancel') {
574 $formquestion = array(
'text' =>
'',
575 0 => array(
'type' =>
'text',
'name' =>
'label',
'label' => $langs->trans(
"Label"),
'value' => $langs->trans(
'ConfirmDestockCancel',
$object->ref),
'morecss' =>
'minwidth300'),
576 1 => array(
'type' =>
'text',
'name' =>
'inventorycode',
'label' => $langs->trans(
"InventoryCode"),
'value' =>
dol_print_date(
dol_now(),
'%y%m%d%H%M%S'),
'morecss' =>
'minwidth200')
578 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DestockAllProductCancel'),
'',
'confirm_destockcancel', $formquestion,
'yes', 1);
579 } elseif ($action ==
'addstock') {
581 $formquestion = array(
'text' =>
'',
582 0 => array(
'type' =>
'text',
'name' =>
'label',
'label' => $langs->trans(
"Label").
' :',
'value' => $langs->trans(
'ConfirmAddStock',
$object->ref),
'morecss' =>
'minwidth300'),
583 1 => array(
'type' =>
'text',
'name' =>
'inventorycode',
'label' => $langs->trans(
"InventoryCode"),
'value' =>
dol_print_date(
dol_now(),
'%y%m%d%H%M%S'),
'morecss' =>
'minwidth200')
585 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'AddStockAllProduct'),
'',
'confirm_addstock', $formquestion,
'yes', 1);
586 } elseif ($action ==
'addstockcancel') {
588 $formquestion = array(
'text' =>
'',
589 0 => array(
'type' =>
'text',
'name' =>
'label',
'label' => $langs->trans(
"Label").
' :',
'value' => $langs->trans(
'ConfirmAddStockCancel',
$object->ref),
'morecss' =>
'minwidth300'),
590 1 => array(
'type' =>
'text',
'name' =>
'inventorycode',
'label' => $langs->trans(
"InventoryCode"),
'value' =>
dol_print_date(
dol_now(),
'%y%m%d%H%M%S'),
'morecss' =>
'minwidth200')
592 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'AddStockAllProductCancel'),
'',
'confirm_addstockcancel', $formquestion,
'yes', 1);
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);
601 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
602 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
603 if (empty($reshook)) {
604 $formconfirm .= $hookmanager->resPrint;
605 } elseif ($reshook > 0) {
606 $formconfirm = $hookmanager->resPrint;
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>';
617 $morehtmlref =
'<div class="refidno">';
619 $morehtmlref .= empty(
$object->thirdparty) ?
'' :
$object->thirdparty->getNomUrl(1,
'customer');
621 $morehtmlref .=
' (<a href="'.DOL_URL_ROOT.
'/commande/list.php?socid='.
$object->thirdparty->id.
'">'.$langs->trans(
"OtherOrders").
'</a>)';
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> ';
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');
634 if (!empty(
$object->fk_project)) {
636 $proj->fetch(
$object->fk_project);
637 $morehtmlref .= $proj->getNomUrl(1);
639 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
644 $morehtmlref .=
'</div>';
647 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
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";
660 $object->fields[
'fk_soc'][
'visible'] = 0;
661 $object->fields[
'fk_project'][
'visible'] = 0;
662 include DOL_DOCUMENT_ROOT.
'/core/tpl/commonfields_view.tpl.php';
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&token='.
newToken().
'">'.
img_edit().
'</a>';
675 print
'</td></tr></table>';
678 if ($action !=
'editincoterm') {
679 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
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);
687 echo
'<td>'.$langs->trans(
'EnhancedValue').
' '.strtolower($langs->trans(
'TotalWoman'));
688 echo
'<td>'.price(
$object->getValorisationTotale(), 0,
'', 1, -1, -1,
$conf->currency).
'</td>';
692 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
698 print
'<div class="clearboth"></div>';
706 if (!empty(
$object->table_element_line)) {
720 if (!empty(
$conf->use_javascript_ajax) &&
$object->status == 0) {
722 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
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.
'">
770 print
'<input type="hidden" name="lineid" value="'.$lineid.
'" />';
772 print
'<table id="tablelines" class="noborder noshadow centpercent nomarginbottom">';
777 print
'<tr class="liste_titre">';
778 print
getTitleFieldOfList($langs->trans(
'ProductRef'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'tagtd maxwidthonsmartphone ');
780 print
getTitleFieldOfList($langs->trans(
'Batch'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'tagtd maxwidthonsmartphone ');
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 ');
786 print
getTitleFieldOfList($langs->trans(
'Unit'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'tagtd maxwidthonsmartphone ');
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) {
798 $listofdata =
$object->getLinesArray();
804 foreach ($listofdata as $key => $line) {
805 $productstatic->fetch($line->fk_product);
806 $warehousestatics->fetch($line->fk_warehouse_source);
807 $warehousestatict->fetch($line->fk_warehouse_destination);
810 $domData =
' data-element="'.$line->element.
'"';
811 $domData .=
' data-id="'.$line->id.
'"';
812 $domData .=
' data-qty="'.$line->qty.
'"';
815 print
'<tr id="row-'.$line->id.
'" class="drag drop oddeven" '.$domData.
'>';
816 print
'<td class="titlefield">';
817 if ($action ===
'editline' && $line->id == $lineid) {
818 $form->select_produits($line->fk_product,
'fk_product',
'', 0, 0, -1, 2,
'', 0, array(), 0, 0, 0,
'minwidth200imp maxwidth300', 1);
820 print $productstatic->getNomUrl(1).
' - '.$productstatic->label;
825 if ($action ===
'editline' && $line->id == $lineid) {
826 print
'<input type="text" value="'.$line->batch.
'" name="batch" class="flat maxwidth50"/>';
829 if ($productlot->fetch(0, $line->fk_product, $line->batch) > 0) {
830 print $productlot->getNomUrl(1);
831 } elseif (!empty($line->batch)) {
832 print $line->batch.
' '.
img_warning($langs->trans(
'BatchNotFound'));
839 print
'<td class="tdoverflowmax150">';
840 if ($action ===
'editline' && $line->id == $lineid) {
841 print $formproduct->selectWarehouses($line->fk_warehouse_source,
'fk_warehouse_source',
'warehouseopen,warehouseinternal', 1, 0, 0,
'', 0, 0, array(),
'minwidth200imp maxwidth200');
843 print $warehousestatics->getNomUrl(1);
848 print
'<td class="tdoverflowmax150">';
849 if ($action ===
'editline' && $line->id == $lineid) {
850 print $formproduct->selectWarehouses($line->fk_warehouse_destination,
'fk_warehouse_destination',
'warehouseopen,warehouseinternal', 1, 0, 0,
'', 0, 0, array(),
'minwidth200imp maxwidth200');
852 print $warehousestatict->getNomUrl(1);
856 if ($action ===
'editline' && $line->id == $lineid) {
857 print
'<td class="center"><input type="text" class="flat maxwidth50" name="qty" value="'.$line->qty.
'"></td>';
859 print
'<td class="center">'.$line->qty.
'</td>';
863 print
'<td class="linecoluseunit nowrap left">';
864 $label = $productstatic->getLabelOfUnit(
'short');
869 print
'<td class="center">';
870 print
price($line->pmp, 0,
'', 1, -1, -1,
$conf->currency);
873 print
'<td class="center">';
874 print
price($line->pmp * $line->qty, 0,
'', 1, -1, -1,
$conf->currency);
877 if (empty(
$object->status) && $permissiontoadd) {
878 if ($action ===
'editline' && $line->id == $lineid) {
880 print
'<td class="center valignmiddle" colspan="2"><input type="submit" class="button buttongen marginbottomonly" id="savelinebutton marginbottomonly" name="save" value="'.$langs->trans(
"Save").
'"><br>';
881 print
'<input type="submit" class="button buttongen marginbottomonly" id="cancellinebutton" name="cancel" value="'.$langs->trans(
"Cancel").
'"></td>';
883 print
'<td class="right">';
884 print
'<a class="editfielda reposition" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=editline&token='.newToken().
'&lineid=' . $line->id .
'#line_' . $line->id .
'">';
887 print
'<td class="right">';
889 $deleteLineUrl = $_SERVER[
"PHP_SELF"] .
'?id=' .
$id .
'&action=deleteline&lineid=' . $line->id .
'&token=' .
newToken();
890 print
'<a href="' . $deleteLineUrl .
'">' .
img_delete($langs->trans(
"Remove")) .
'</a>';
896 if ($num > 1 &&
$conf->browser->layout !=
'phone' && empty($disablemove)) {
897 print
'<td class="linecolmove tdlineupdown center">';
899 <a
class=
"lineupdown" href=
"<?php print $_SERVER["PHP_SELF
"].'?id='.$id.'&action=up&token='.newToken().'&rowid='.$line->id; ?>">
900 <?php print
img_up(
'default', 0,
'imgupforline'); ?>
903 if ($i < $num - 1) { ?>
904 <a
class=
"lineupdown" href=
"<?php print $_SERVER["PHP_SELF
"].'?id='.$id.'&action=down&token='.newToken().'&rowid='.$line->id; ?>">
905 <?php print
img_down(
'default', 0,
'imgdownforline'); ?>
910 print
'<td '.(($conf->browser->layout !=
'phone' && empty($disablemove)) ?
' class="linecolmove tdlineupdown center"' :
' class="linecolmove center"').
'></td>';
919 if (empty(
$object->status) && $action !==
'editline' && $permissiontoadd) {
920 print
'<tr class="oddeven">';
922 print
'<td class="titlefield">';
933 $form->select_produits($fk_product,
'fk_product', $filtertype, $limit, 0, -1, 2,
'', 0, array(), 0, 0, 0,
'minwidth200imp maxwidth300', 1);
938 print
'<input type="text" name="batch" class="flat maxwidth50" '.(!empty($error) ?
'value="'.$batch.
'"' :
'').
'>';
942 $formproduct->loadWarehouses();
945 $TExcludedWarehouseSource = array();
946 if (!empty(
$object->fk_warehouse_source)) {
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'];
957 $TExcludedWarehouseDestination = array();
958 if (!empty(
$object->fk_warehouse_destination)) {
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'];
969 $formproduct->cache_warehouses = array();
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);
976 $formproduct->cache_warehouses = array();
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);
983 print
'<td class="center"><input type="text" class="flat maxwidth50" name="qty" '.(!empty($error) ?
'value="'.(GETPOSTISSET(
'qty') ?
GETPOST(
'qty') : $qty).
'"' :
'').
'></td>';
996 print
'<td class="right" colspan="2"><input type="submit" class="button" name="addline" value="' .
dol_escape_htmltag($langs->trans(
'Add')) .
'"></td>';
1013 if ($action !=
'presend' && $action !=
'editline') {
1014 print
'<div class="tabsAction">'.
"\n";
1015 $parameters = array();
1016 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
1021 if (empty($reshook)) {
1023 if (empty($user->socid)) {
1024 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=presend&token='.
newToken().
'&mode=init#formmailbeforetitle');
1028 if (
$object->status == $object::STATUS_VALIDATED) {
1029 print
dolGetButtonAction(
'', $langs->trans(
'SetToDraft'),
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=confirm_setdraft&confirm=yes&token='.
newToken(),
'', $permissiontoadd);
1033 print
dolGetButtonAction(
'', $langs->trans(
'Modify'),
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=edit&token='.
newToken(),
'', $permissiontoadd);
1036 if (
$object->status == $object::STATUS_DRAFT) {
1037 if (empty(
$object->table_element_line) || (is_array(
$object->lines) && count(
$object->lines) > 0)) {
1038 print
dolGetButtonAction(
'', $langs->trans(
'Validate'),
'default', $_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=confirm_validate&confirm=yes&token='.
newToken(),
'', $permissiontoadd);
1040 $langs->load(
"errors");
1041 print
dolGetButtonAction($langs->trans(
"ErrorAddAtLeastOneLineFirst"), $langs->trans(
"Validate"),
'default',
'#',
'', 0);
1043 } elseif (
$object->status == $object::STATUS_VALIDATED && $permissiontoadd) {
1044 print
'<a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=destock&token='.
newToken().
'">'.$langs->trans(
"StockTransferDecrementation").
'</a>';
1045 } elseif (
$object->status == $object::STATUS_TRANSFERED && $permissiontoadd) {
1046 print
'<a class="butActionDelete" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=destockcancel&token='.
newToken().
'">'.$langs->trans(
"StockTransferDecrementationCancel").
'</a>';
1047 print
'<a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=addstock&token='.
newToken().
'">'.$langs->trans(
"StockTransferIncrementation").
'</a>';
1048 } elseif (
$object->status == $object::STATUS_CLOSED && $permissiontoadd) {
1049 print
'<a class="butActionDelete" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=addstockcancel&token='.
newToken().
'">'.$langs->trans(
"StockTransferIncrementationCancel").
'</a>';
1053 if ($permissiontoadd) {
1054 print
dolGetButtonAction(
'', $langs->trans(
'ToClone'),
'clone', $_SERVER[
'PHP_SELF'].
'?id='.
$object->id.(!empty(
$object->socid) ?
'&socid='.$object->socid :
'').
'&action=clone&token='.
newToken(),
'', $permissiontoadd);
1076 $deleteUrl = $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete&token='.
newToken();
1077 $buttonId =
'action-delete-no-ajax';
1078 if (
$conf->use_javascript_ajax && empty(
$conf->dol_use_jmobile)) {
1080 $buttonId =
'action-delete';
1083 print
dolGetButtonAction(
'', $langs->trans(
"Delete"),
'delete', $deleteUrl, $buttonId, $permissiontodelete, $params);
1085 print
'</div>'.
"\n";
1090 if (
GETPOST(
'modelselected')) {
1091 $action =
'presend';
1094 if ($action !=
'presend') {
1095 print
'<div class="fichecenter"><div class="fichehalfleft">';
1096 print
'<a name="builddoc"></a>';
1098 $includedocgeneration = 1;
1101 if ($includedocgeneration) {
1103 $relativepath = $objref .
'/' . $objref .
'.pdf';
1104 $filedir =
$conf->stocktransfer->dir_output.
'/'.
$object->element.
'/'.$objref;
1105 $urlsource = $_SERVER[
"PHP_SELF"] .
"?id=" .
$object->id;
1106 $genallowed = $permissiontoread;
1107 $delallowed = $permissiontoadd;
1108 print $formfile->showdocuments(
'stocktransfer:StockTransfer',
$object->element.
'/'.$objref, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'',
'',
'', $langs->defaultlang);
1112 $tmparray = $form->showLinkToObjectBlock($object, array(), array(
'stocktransfer'), 1);
1113 $linktoelem = $tmparray[
'linktoelem'];
1114 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
1115 print $htmltoenteralink;
1117 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
1120 print
'</div><div class="fichehalfright">';
1127 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
1129 $somethingshown = $formactions->showactions($object,
'stocktransfer', 0, 1,
'', $MAXEVENT,
'');
1131 print
'</div></div>';
1135 if (
GETPOST(
'modelselected')) {
1136 $action =
'presend';
1140 $modelmail =
'stocktransfer_send';
1141 $defaulttopic =
'InformationMessage';
1142 $diroutput =
$conf->stocktransfer->dir_output.
'/'.
$object->element;
1143 $trackid =
'stocktransfer'.$object->id;
1145 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $object
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
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.
Class to manage warehouses.
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 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.
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.
dolBuildUrl($url, $params=[], $addtoken=false, $anchor='')
Return path of url.
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'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
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.
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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...
print $langs trans('Date')." left Ref 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 Paid right PaymentTypeShortLIQ right SELECT p pos_change as p datep as date
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $nodie=0, $mode='')
Check permissions of a user to show a page and an object.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.
stocktransferPrepareHead($object)
Prepare array of tabs for StockTransfer.