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];
116if (!$permissiontoread || ($action ===
'create' && !$permissiontoadd)) {
125$parameters = array();
126$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
131if (empty($reshook)) {
134 $backurlforlist =
dolBuildUrl(DOL_URL_ROOT.
'/product/stock/stocktransfer/stocktransfer_list.php');
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;
141 $backtopage =
dolBuildUrl(DOL_URL_ROOT.
'/product/stock/stocktransfer/stocktransfer_card.php', [
'id' => ($id > 0 ? $id :
'__ID__')]);
146 $triggermodname =
'STOCKTRANSFER_MODIFY';
149 include DOL_DOCUMENT_ROOT.
'/core/actions_addupdatedelete.inc.php';
152 $permissiontodelete = $user->rights->stocktransfer->stocktransfer->delete || ($permissiontoadd && isset(
$object->status) &&
$object->status == $object::STATUS_DRAFT);
155 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
158 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
161 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
164 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
166 if ($action ==
'set_thirdparty' && $permissiontoadd) {
167 $object->setValueFrom(
'fk_soc',
GETPOSTINT(
'fk_soc'),
'',
null,
'date',
'', $user, $triggermodname);
169 if ($action ==
'classin' && $permissiontoadd) {
173 if ($action ==
'addline' && $permissiontoadd) {
176 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Qty")),
null,
'errors');
180 if ($fk_warehouse_source <= 0) {
182 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"WarehouseSource")),
null,
'errors');
186 if ($fk_warehouse_destination <= 0) {
188 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"WarehouseTarget")),
null,
'errors');
193 $prod->fetch($fk_product);
194 if (
$prod->hasbatch()) {
197 $langs->load(
"errors");
198 setEventMessages($langs->transnoentities(
"ErrorTryToMakeMoveOnProductRequiringBatchData",
$prod->ref),
null,
'errors');
201 if (!empty($batch)) {
203 setEventMessages($langs->transnoentities(
'StockTransferNoBatchForProduct',
$prod->getNomUrl()),
null,
'errors');
207 if (
$prod->status_batch == 2 && abs($qty) > 1) {
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)];
218 $line->fk_stocktransfer =
$id;
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;
225 $line->pmp =
$prod->pmp;
227 $line->update($user);
229 $line->rang = (is_array(
$object->lines) ||
$object->lines instanceof Countable) ? count(
$object->lines) + 1 : 1;
230 $line->create($user);
234 } elseif ($action ===
'updateline' && $permissiontoadd) {
237 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Qty")),
null,
'errors');
238 $action =
'editline';
241 if ($fk_warehouse_source <= 0) {
243 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"WarehouseSource")),
null,
'errors');
244 $action =
'editline';
247 if ($fk_warehouse_destination <= 0) {
249 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"WarehouseTarget")),
null,
'errors');
250 $action =
'editline';
254 $prod->fetch($fk_product);
255 if (
$prod->hasbatch()) {
258 $langs->load(
"errors");
259 setEventMessages($langs->transnoentities(
"ErrorTryToMakeMoveOnProductRequiringBatchData",
$prod->getNomUrl()),
null,
'errors');
260 $action =
'editline';
263 if (!empty($batch)) {
265 setEventMessages($langs->transnoentities(
'StockTransferNoBatchForProduct',
$prod->getNomUrl()),
null,
'errors');
266 $action =
'editline';
270 if (
$prod->status_batch == 2 && abs($qty) > 1) {
273 $action =
'editline';
278 $line->fetch($lineid);
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);
290 if ($action ==
'confirm_destock' && $confirm ==
'yes' &&
$object->status == $object::STATUS_VALIDATED && $permissiontoadd) {
291 $lines =
$object->getLinesArray();
292 if (!empty($lines)) {
294 foreach ($lines as $line) {
295 $res = $line->doStockMovement($label, $code_inv, $line->fk_warehouse_source);
308 $object->setStatut($object::STATUS_TRANSFERED, $id);
309 $object->status = $object::STATUS_TRANSFERED;
317 if ($action ==
'confirm_destockcancel' && $confirm ==
'yes' &&
$object->status == $object::STATUS_TRANSFERED && $permissiontoadd) {
318 $lines =
$object->getLinesArray();
319 if (!empty($lines)) {
321 foreach ($lines as $line) {
322 $res = $line->doStockMovement($label, $code_inv, $line->fk_warehouse_source, 0);
335 $object->setStatut($object::STATUS_VALIDATED, $id);
336 $object->status = $object::STATUS_VALIDATED;
337 $object->date_reelle_depart =
null;
344 if ($action ==
'confirm_addstock' && $confirm ==
'yes' &&
$object->status == $object::STATUS_TRANSFERED && $permissiontoadd) {
345 $lines =
$object->getLinesArray();
346 if (!empty($lines)) {
348 foreach ($lines as $line) {
349 $res = $line->doStockMovement($label, $code_inv, $line->fk_warehouse_destination, 0);
362 $object->setStatut($object::STATUS_CLOSED, $id);
363 $object->status = $object::STATUS_CLOSED;
366 $result =
$object->call_trigger(
'STOCKTRANSFER_CLOSE', $user);
376 if ($action ==
'confirm_addstockcancel' && $confirm ==
'yes' &&
$object->status == $object::STATUS_CLOSED && $permissiontoadd) {
377 $lines =
$object->getLinesArray();
378 if (!empty($lines)) {
380 foreach ($lines as $line) {
381 $res = $line->doStockMovement($label, $code_inv, $line->fk_warehouse_destination);
394 $object->setStatut($object::STATUS_TRANSFERED, $id);
395 $object->status = $object::STATUS_TRANSFERED;
396 $object->date_reelle_arrivee =
null;
403 if ($action ==
'set_incoterms' &&
isModEnabled(
'incoterm') && $permissiontoadd) {
407 $triggersendname =
'STOCKTRANSFER_SENTBYMAIL';
408 $autocopy =
'MAIN_MAIL_AUTOCOPY_STOCKTRANSFER_TO';
409 $trackid =
'stocktransfer'.$object->id;
410 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
424$title = $langs->trans(
"StockTransfer");
427llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-product page-stock-stocktransfer_stocktransfer_card');
431print
'<script type="text/javascript" language="javascript">
432jQuery(document).ready(function() {';
435$date_prevue_depart =
$object->date_prevue_depart;
436$date_prevue_depart_plus_delai = $date_prevue_depart;
437if (
$object->lead_time_for_warning > 0) {
438 $date_prevue_depart_plus_delai = strtotime(
date(
'Y-m-d', $date_prevue_depart) .
' + '.
$object->lead_time_for_warning.
' day');
440if (!empty($date_prevue_depart) && $date_prevue_depart_plus_delai < strtotime(
date(
'Y-m-d'))) {
441 print
"$('.valuefield.fieldname_date_prevue_depart').append('";
442 print
img_warning($langs->trans(
'Alert').
' - '.$langs->trans(
'Late'));
451if ($action ==
'create') {
452 if (empty($permissiontoadd)) {
458 print
'<form method="POST" action="'.dolBuildUrl($_SERVER[
"PHP_SELF"]).
'">';
459 print
'<input type="hidden" name="token" value="'.newToken().
'">';
460 print
'<input type="hidden" name="action" value="add">';
462 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
464 if ($backtopageforcancel) {
465 print
'<input type="hidden" name="backtopageforcancel" value="'.$backtopageforcancel.
'">';
471 print
'<table class="border centpercent tableforfieldcreate">'.
"\n";
474 include DOL_DOCUMENT_ROOT.
'/core/tpl/commonfields_add.tpl.php';
482 print
'<td><label for="incoterm_id">'.$form->textwithpicto($langs->trans(
"IncotermLabel"), $soc->label_incoterms, 1).
'</label></td>';
483 print
'<td class="maxwidthonsmartphone">';
484 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms :
''), (!empty($soc->location_incoterms) ? $soc->location_incoterms :
''),
'',
'fk_incoterms');
488 print
'<tr><td>'.$langs->trans(
'DefaultModel').
'</td>';
490 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
491 include_once DOL_DOCUMENT_ROOT.
'/core/modules/commande/modules_commande.php';
494 print $form->selectarray(
'model', $liste, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
498 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
500 print
'</table>'.
"\n";
504 print $form->buttonsSaveCancel(
"Create");
512if (($id || $ref) && $action ==
'edit') {
515 print
'<form method="POST" action="' . $_SERVER[
"PHP_SELF"] .
'">';
516 print
'<input type="hidden" name="token" value="' . newToken() .
'">';
517 print
'<input type="hidden" name="action" value="update">';
518 print
'<input type="hidden" name="id" value="' .
$object->id .
'">';
520 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
522 if ($backtopageforcancel) {
523 print
'<input type="hidden" name="backtopageforcancel" value="' . $backtopageforcancel .
'">';
528 print
'<table class="border centpercent tableforfieldedit">' .
"\n";
531 include DOL_DOCUMENT_ROOT .
'/core/tpl/commonfields_edit.tpl.php';
534 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_edit.tpl.php';
540 print $form->buttonsSaveCancel();
546if (
$object->id > 0 && (empty($action) || ($action !=
'edit' && $action !=
'create'))) {
547 $res =
$object->fetch_optionals();
556 if ($action ==
'delete' || (
$conf->use_javascript_ajax && empty(
$conf->dol_use_jmobile))) {
557 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DeleteMyObject'), $langs->trans(
'ConfirmDeleteObject'),
'confirm_delete',
'', 0,
'action-delete');
560 if ($action ==
'deleteline') {
561 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteLine'), $langs->trans(
'ConfirmDeleteLine'),
'confirm_deleteline',
'', 0, 1);
563 $formquestion = array();
565 if ($action ==
'clone') {
567 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneAsk',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1);
568 } elseif ($action ==
'destock') {
570 $formquestion = array(
'text' =>
'',
571 0 => array(
'type' =>
'text',
'name' =>
'label',
'label' => $langs->trans(
"Label"),
'value' => $langs->trans(
'ConfirmDestock',
$object->ref),
'morecss' =>
'minwidth300'),
572 1 => array(
'type' =>
'text',
'name' =>
'inventorycode',
'label' => $langs->trans(
"InventoryCode"),
'value' =>
dol_print_date(
dol_now(),
'%y%m%d%H%M%S'),
'morecss' =>
'minwidth200')
574 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DestockAllProduct'),
'',
'confirm_destock', $formquestion,
'yes', 1);
575 } elseif ($action ==
'destockcancel') {
577 $formquestion = array(
'text' =>
'',
578 0 => array(
'type' =>
'text',
'name' =>
'label',
'label' => $langs->trans(
"Label"),
'value' => $langs->trans(
'ConfirmDestockCancel',
$object->ref),
'morecss' =>
'minwidth300'),
579 1 => array(
'type' =>
'text',
'name' =>
'inventorycode',
'label' => $langs->trans(
"InventoryCode"),
'value' =>
dol_print_date(
dol_now(),
'%y%m%d%H%M%S'),
'morecss' =>
'minwidth200')
581 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DestockAllProductCancel'),
'',
'confirm_destockcancel', $formquestion,
'yes', 1);
582 } elseif ($action ==
'addstock') {
584 $formquestion = array(
'text' =>
'',
585 0 => array(
'type' =>
'text',
'name' =>
'label',
'label' => $langs->trans(
"Label").
' :',
'value' => $langs->trans(
'ConfirmAddStock',
$object->ref),
'morecss' =>
'minwidth300'),
586 1 => array(
'type' =>
'text',
'name' =>
'inventorycode',
'label' => $langs->trans(
"InventoryCode"),
'value' =>
dol_print_date(
dol_now(),
'%y%m%d%H%M%S'),
'morecss' =>
'minwidth200')
588 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'AddStockAllProduct'),
'',
'confirm_addstock', $formquestion,
'yes', 1);
589 } elseif ($action ==
'addstockcancel') {
591 $formquestion = array(
'text' =>
'',
592 0 => array(
'type' =>
'text',
'name' =>
'label',
'label' => $langs->trans(
"Label").
' :',
'value' => $langs->trans(
'ConfirmAddStockCancel',
$object->ref),
'morecss' =>
'minwidth300'),
593 1 => array(
'type' =>
'text',
'name' =>
'inventorycode',
'label' => $langs->trans(
"InventoryCode"),
'value' =>
dol_print_date(
dol_now(),
'%y%m%d%H%M%S'),
'morecss' =>
'minwidth200')
595 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'AddStockAllProductCancel'),
'',
'confirm_addstockcancel', $formquestion,
'yes', 1);
598 if ($action ==
'valid' && $permissiontoadd) {
599 $nextref =
$object->getNextNumRef();
600 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'Validate'), $langs->transnoentities(
'ConfirmValidateStockTransfer', $nextref),
'confirm_validate', $formquestion, 0, 2);
604 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
605 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
606 if (empty($reshook)) {
607 $formconfirm .= $hookmanager->resPrint;
608 } elseif ($reshook > 0) {
609 $formconfirm = $hookmanager->resPrint;
618 $linkback =
'<a href="'.dol_buildpath(
'/product/stock/stocktransfer/stocktransfer_list.php', 1).
'?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
620 $morehtmlref =
'<div class="refidno">';
622 $morehtmlref .= empty(
$object->thirdparty) ?
'' :
$object->thirdparty->getNomUrl(1,
'customer');
624 $morehtmlref .=
' (<a href="'.DOL_URL_ROOT.
'/commande/list.php?socid='.
$object->thirdparty->id.
'&search_societe='.urlencode(
$object->thirdparty->name).
'">'.$langs->trans(
"OtherOrders").
'</a>)';
628 $langs->load(
"projects");
629 $morehtmlref .= (empty(
$object->thirdparty) ?
'' :
'<br>');
630 if ($permissiontoadd) {
631 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
632 if ($action !=
'classify') {
633 $morehtmlref .=
'<a class="editfielda" href="'.dolBuildUrl($_SERVER[
'PHP_SELF'], [
'action' =>
'classify',
'id' =>
$object->id],
true).
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
635 $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');
637 if (!empty(
$object->fk_project)) {
639 $proj->fetch(
$object->fk_project);
640 $morehtmlref .= $proj->getNomUrl(1);
642 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
647 $morehtmlref .=
'</div>';
650 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
653 print
'<div class="fichecenter">';
654 print
'<div class="fichehalfleft">';
655 print
'<div class="underbanner clearboth"></div>';
656 print
'<table class="border centpercent tableforfield">'.
"\n";
663 $object->fields[
'fk_soc'][
'visible'] = 0;
664 $object->fields[
'fk_project'][
'visible'] = 0;
665 include DOL_DOCUMENT_ROOT.
'/core/tpl/commonfields_view.tpl.php';
670 print
'<table width="100%" class="nobordernopadding"><tr><td>';
671 print $langs->trans(
'IncotermLabel');
672 print
'<td><td class="right">';
673 if ($permissiontoadd && $action !=
'editincoterm') {
674 print
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=editincoterm">'.
img_edit().
'</a>';
678 print
'</td></tr></table>';
681 if ($action !=
'editincoterm') {
682 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
684 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
690 echo
'<td>'.$langs->trans(
'EnhancedValue').
' '.strtolower($langs->trans(
'TotalWoman'));
691 echo
'<td>'.price(
$object->getValorisationTotale(), 0,
'', 1, -1, -1,
$conf->currency).
'</td>';
695 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
701 print
'<div class="clearboth"></div>';
709 if (!empty(
$object->table_element_line)) {
723 if (!empty(
$conf->use_javascript_ajax) &&
$object->status == 0) {
725 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
765 print
'<div class="div-table-responsive-no-min">';
766 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.(($action !=
'editline') ?
'#addline' :
'#line_'.
GETPOSTINT(
'lineid')).
'" method="POST">
767 <input type="hidden" name="token" value="' . newToken().
'">
768 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
769 <input type="hidden" name="mode" value="">
770 <input type="hidden" name="id" value="' .
$object->id.
'">
773 print
'<input type="hidden" name="lineid" value="'.$lineid.
'" />';
775 print
'<table id="tablelines" class="noborder noshadow centpercent nomarginbottom">';
780 print
'<tr class="liste_titre">';
781 print
getTitleFieldOfList($langs->trans(
'ProductRef'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'tagtd maxwidthonsmartphone ');
783 print
getTitleFieldOfList($langs->trans(
'Batch'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'tagtd maxwidthonsmartphone ');
785 print
getTitleFieldOfList($langs->trans(
'WarehouseSource'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'tagtd maxwidthonsmartphone ');
786 print
getTitleFieldOfList($langs->trans(
'WarehouseTarget'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'tagtd maxwidthonsmartphone ');
787 print
getTitleFieldOfList($langs->trans(
'Qty'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'center tagtd maxwidthonsmartphone ');
789 print
getTitleFieldOfList($langs->trans(
'Unit'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'tagtd maxwidthonsmartphone ');
791 print
getTitleFieldOfList($langs->trans(
'AverageUnitPricePMPShort'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'center tagtd maxwidthonsmartphone ');
792 print
getTitleFieldOfList($langs->trans(
'EstimatedStockValueShort'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'center tagtd maxwidthonsmartphone ');
793 if (empty(
$object->status) && $permissiontoadd) {
801 $listofdata =
$object->getLinesArray();
807 foreach ($listofdata as $key => $line) {
808 $productstatic->fetch($line->fk_product);
809 $warehousestatics->fetch($line->fk_warehouse_source);
810 $warehousestatict->fetch($line->fk_warehouse_destination);
813 $domData =
' data-element="'.$line->element.
'"';
814 $domData .=
' data-id="'.$line->id.
'"';
815 $domData .=
' data-qty="'.$line->qty.
'"';
818 print
'<tr id="row-'.$line->id.
'" class="drag drop oddeven" '.$domData.
'>';
819 print
'<td class="titlefield">';
820 if ($action ===
'editline' && $line->id == $lineid) {
821 $form->select_produits($line->fk_product,
'fk_product',
'', 0, 0, -1, 2,
'', 0, array(), 0, 0, 0,
'minwidth200imp maxwidth300', 1);
823 print $productstatic->getNomUrl(1).
' - '.$productstatic->label;
828 if ($action ===
'editline' && $line->id == $lineid) {
829 print
'<input type="text" value="'.$line->batch.
'" name="batch" class="flat maxwidth50"/>';
832 if ($productlot->fetch(0, $line->fk_product, $line->batch) > 0) {
833 print $productlot->getNomUrl(1);
834 } elseif (!empty($line->batch)) {
835 print $line->batch.
' '.
img_warning($langs->trans(
'BatchNotFound'));
842 print
'<td class="tdoverflowmax150">';
843 if ($action ===
'editline' && $line->id == $lineid) {
844 print $formproduct->selectWarehouses($line->fk_warehouse_source,
'fk_warehouse_source',
'warehouseopen,warehouseinternal', 1, 0, 0,
'', 0, 0, array(),
'minwidth200imp maxwidth200');
846 print $warehousestatics->getNomUrl(1);
851 print
'<td class="tdoverflowmax150">';
852 if ($action ===
'editline' && $line->id == $lineid) {
853 print $formproduct->selectWarehouses($line->fk_warehouse_destination,
'fk_warehouse_destination',
'warehouseopen,warehouseinternal', 1, 0, 0,
'', 0, 0, array(),
'minwidth200imp maxwidth200');
855 print $warehousestatict->getNomUrl(1);
859 if ($action ===
'editline' && $line->id == $lineid) {
860 print
'<td class="center"><input type="text" class="flat maxwidth50" name="qty" value="'.$line->qty.
'"></td>';
862 print
'<td class="center">'.$line->qty.
'</td>';
866 print
'<td class="linecoluseunit nowrap left">';
867 $label = $productstatic->getLabelOfUnit(
'short');
872 print
'<td class="center">';
873 print
price($line->pmp, 0,
'', 1, -1, -1,
$conf->currency);
876 print
'<td class="center">';
877 print
price($line->pmp * $line->qty, 0,
'', 1, -1, -1,
$conf->currency);
880 if (empty(
$object->status) && $permissiontoadd) {
881 if ($action ===
'editline' && $line->id == $lineid) {
883 print
'<td class="center valignmiddle" colspan="2"><input type="submit" class="button buttongen marginbottomonly" id="savelinebutton marginbottomonly" name="save" value="'.$langs->trans(
"Save").
'"><br>';
884 print
'<input type="submit" class="button buttongen marginbottomonly" id="cancellinebutton" name="cancel" value="'.$langs->trans(
"Cancel").
'"></td>';
886 print
'<td class="right">';
887 print
'<a class="editfielda reposition" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=editline&lineid=' . $line->id .
'#line_' . $line->id .
'">';
890 print
'<td class="right">';
892 $deleteLineUrl = $_SERVER[
"PHP_SELF"] .
'?id=' .
$id .
'&action=deleteline&lineid=' . $line->id .
'&token=' . newToken();
893 print
'<a href="' . $deleteLineUrl .
'">' .
img_delete($langs->trans(
"Remove")) .
'</a>';
899 if ($num > 1 &&
$conf->browser->layout !=
'phone' && empty($disablemove)) {
900 print
'<td class="linecolmove tdlineupdown center">';
902 <a
class=
"lineupdown" href=
"<?php print $_SERVER["PHP_SELF
"].'?id='.$id.'&action=up&rowid='.$line->id; ?>">
903 <?php print
img_up(
'default', 0,
'imgupforline'); ?>
906 if ($i < $num - 1) { ?>
907 <a
class=
"lineupdown" href=
"<?php print $_SERVER["PHP_SELF
"].'?id='.$id.'&action=down&rowid='.$line->id; ?>">
908 <?php print
img_down(
'default', 0,
'imgdownforline'); ?>
913 print
'<td '.(($conf->browser->layout !=
'phone' && empty($disablemove)) ?
' class="linecolmove tdlineupdown center"' :
' class="linecolmove center"').
'></td>';
922 if (empty(
$object->status) && $action !==
'editline' && $permissiontoadd) {
923 print
'<tr class="oddeven">';
925 print
'<td class="titlefield">';
936 $form->select_produits($fk_product,
'fk_product', $filtertype, $limit, 0, -1, 2,
'', 0, array(), 0, 0, 0,
'minwidth200imp maxwidth300', 1);
941 print
'<input type="text" name="batch" class="flat maxwidth50" '.(!empty($error) ?
'value="'.$batch.
'"' :
'').
'>';
945 $formproduct->loadWarehouses();
948 $TExcludedWarehouseSource = array();
949 if (!empty(
$object->fk_warehouse_source)) {
951 $source_ent->fetch(
$object->fk_warehouse_source);
952 foreach ($formproduct->cache_warehouses as $TDataCacheWarehouse) {
953 if (strpos($TDataCacheWarehouse[
'full_label'], $source_ent->label) ===
false) {
954 $TExcludedWarehouseSource[] = $TDataCacheWarehouse[
'id'];
960 $TExcludedWarehouseDestination = array();
961 if (!empty(
$object->fk_warehouse_destination)) {
963 $dest_ent->fetch(
$object->fk_warehouse_destination);
964 foreach ($formproduct->cache_warehouses as $TDataCacheWarehouse) {
965 if (strpos($TDataCacheWarehouse[
'full_label'], $dest_ent->label) ===
false) {
966 $TExcludedWarehouseDestination[] = $TDataCacheWarehouse[
'id'];
972 $formproduct->cache_warehouses = array();
975 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);
979 $formproduct->cache_warehouses = array();
982 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);
986 print
'<td class="center"><input type="text" class="flat maxwidth50" name="qty" '.(!empty($error) ?
'value="'.(GETPOSTISSET(
'qty') ?
GETPOST(
'qty') : $qty).
'"' :
'').
'></td>';
999 print
'<td class="right" colspan="2"><input type="submit" class="button" name="addline" value="' .
dol_escape_htmltag($langs->trans(
'Add')) .
'"></td>';
1016 if ($action !=
'presend' && $action !=
'editline') {
1017 print
'<div class="tabsAction">'.
"\n";
1018 $parameters = array();
1019 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
1024 if (empty($reshook)) {
1026 if (empty($user->socid)) {
1027 print dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=presend&token='.newToken().
'&mode=init#formmailbeforetitle');
1031 if (
$object->status == $object::STATUS_VALIDATED) {
1032 print dolGetButtonAction(
'', $langs->trans(
'SetToDraft'),
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=confirm_setdraft&confirm=yes&token='.newToken(),
'', $permissiontoadd);
1036 print dolGetButtonAction(
'', $langs->trans(
'Modify'),
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=edit&token='.newToken(),
'', $permissiontoadd);
1039 if (
$object->status == $object::STATUS_DRAFT) {
1040 if (empty(
$object->table_element_line) || (is_array(
$object->lines) && count(
$object->lines) > 0)) {
1041 print dolGetButtonAction(
'', $langs->trans(
'Validate'),
'default', $_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=confirm_validate&confirm=yes&token='.newToken(),
'', $permissiontoadd);
1043 $langs->load(
"errors");
1044 print dolGetButtonAction($langs->trans(
"ErrorAddAtLeastOneLineFirst"), $langs->trans(
"Validate"),
'default',
'#',
'', 0);
1046 } elseif (
$object->status == $object::STATUS_VALIDATED && $permissiontoadd) {
1047 print
'<a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=destock&token='.newToken().
'">'.$langs->trans(
"StockTransferDecrementation").
'</a>';
1048 } elseif (
$object->status == $object::STATUS_TRANSFERED && $permissiontoadd) {
1049 print
'<a class="butActionDelete" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=destockcancel&token='.newToken().
'">'.$langs->trans(
"StockTransferDecrementationCancel").
'</a>';
1050 print
'<a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=addstock&token='.newToken().
'">'.$langs->trans(
"StockTransferIncrementation").
'</a>';
1051 } elseif (
$object->status == $object::STATUS_CLOSED && $permissiontoadd) {
1052 print
'<a class="butActionDelete" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=addstockcancel&token='.newToken().
'">'.$langs->trans(
"StockTransferIncrementationCancel").
'</a>';
1056 if ($permissiontoadd) {
1057 print dolGetButtonAction(
'', $langs->trans(
'ToClone'),
'clone', $_SERVER[
'PHP_SELF'].
'?id='.
$object->id.(!empty(
$object->socid) ?
'&socid='.$object->socid :
'').
'&action=clone&token='.newToken(),
'', $permissiontoadd);
1079 $deleteUrl = $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete&token='.newToken();
1080 $buttonId =
'action-delete-no-ajax';
1081 if (
$conf->use_javascript_ajax && empty(
$conf->dol_use_jmobile)) {
1083 $buttonId =
'action-delete';
1086 print dolGetButtonAction(
'', $langs->trans(
"Delete"),
'delete', $deleteUrl, $buttonId, $permissiontodelete, $params);
1088 print
'</div>'.
"\n";
1093 if (
GETPOST(
'modelselected')) {
1094 $action =
'presend';
1097 if ($action !=
'presend') {
1098 print
'<div class="fichecenter"><div class="fichehalfleft">';
1099 print
'<a name="builddoc"></a>';
1101 $includedocgeneration = 1;
1104 if ($includedocgeneration) {
1106 $relativepath = $objref .
'/' . $objref .
'.pdf';
1107 $filedir =
$conf->stocktransfer->dir_output.
'/'.
$object->element.
'/'.$objref;
1108 $urlsource = $_SERVER[
"PHP_SELF"] .
"?id=" .
$object->id;
1109 $genallowed = $permissiontoread;
1110 $delallowed = $permissiontoadd;
1111 print $formfile->showdocuments(
'stocktransfer:StockTransfer',
$object->element.
'/'.$objref, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'',
'',
'', $langs->defaultlang);
1115 $tmparray = $form->showLinkToObjectBlock($object, array(), array(
'stocktransfer'), 1);
1116 $linktoelem = $tmparray[
'linktoelem'];
1117 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
1118 print $htmltoenteralink;
1120 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
1123 print
'</div><div class="fichehalfright">';
1127 $morehtmlcenter = dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode',
dol_buildpath(
'/mymodule/myobject_agenda.php', 1).
'?id='.
$object->id);
1130 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
1132 $somethingshown = $formactions->showactions($object,
'stocktransfer', 0, 1,
'', $MAXEVENT,
'');
1134 print
'</div></div>';
1138 if (
GETPOST(
'modelselected')) {
1139 $action =
'presend';
1143 $modelmail =
'stocktransfer_send';
1144 $defaulttopic =
'InformationMessage';
1145 $diroutput =
$conf->stocktransfer->dir_output.
'/'.
$object->element;
1146 $trackid =
'stocktransfer'.$object->id;
1148 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.
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.
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.
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
img_up($titlealt='default', $selected=0, $moreclass='')
Show top arrow logo.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
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
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.