28require
'../../../main.inc.php';
29require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formcompany.class.php';
30require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
31require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
32require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
33require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/productlot.class.php';
34require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
35require_once DOL_DOCUMENT_ROOT.
'/product/stock/stocktransfer/class/stocktransfer.class.php';
36require_once DOL_DOCUMENT_ROOT.
'/product/stock/stocktransfer/class/stocktransferline.class.php';
37require_once DOL_DOCUMENT_ROOT.
'/product/stock/stocktransfer/lib/stocktransfer_stocktransfer.lib.php';
38require_once DOL_DOCUMENT_ROOT.
'/core/modules/stocktransfer/modules_stocktransfer.php';
49$langs->loadLangs(array(
"stocks",
"other",
"productbatch",
"companies"));
51 $langs->load(
'incoterm');
59$action =
GETPOST(
'action',
'aZ09');
60$confirm =
GETPOST(
'confirm',
'alpha');
62$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') : str_replace(
'_',
'', basename(dirname(__FILE__)).basename(__FILE__,
'.php'));
63$backtopage =
GETPOST(
'backtopage',
'alpha');
64$backtopageforcancel =
GETPOST(
'backtopageforcancel',
'alpha');
67$fk_warehouse_source =
GETPOSTINT(
'fk_warehouse_source');
68$fk_warehouse_destination =
GETPOSTINT(
'fk_warehouse_destination');
70$label =
GETPOST(
'label',
'alpha');
71$batch =
GETPOST(
'batch',
'alpha');
72$code_inv =
GETPOST(
'inventorycode',
'alphanohtml');
73$sortfield =
GETPOST(
'sortfield',
'aZ09comma');
74$sortorder =
GETPOST(
'sortorder',
'aZ09comma');
79$diroutputmassaction = $conf->stocktransfer->dir_output.
'/temp/massgeneration/'.$user->id;
80$hookmanager->initHooks(array(
$object->element.
'card',
'globalcard'));
83$extrafields->fetch_name_optionals_label(
$object->table_element);
85$search_array_options = $extrafields->getOptionalsFromPost(
$object->table_element,
'',
'search_');
88$search_all = trim(
GETPOST(
"search_all",
'alpha'));
90foreach (
$object->fields as $key => $val) {
91 if (
GETPOST(
'search_'.$key,
'alpha')) {
92 $search[$key] =
GETPOST(
'search_'.$key,
'alpha');
96if (empty($action) && empty($id) && empty($ref)) {
101include DOL_DOCUMENT_ROOT.
'/core/actions_fetchobject.inc.php';
104$permissiontoread = $user->hasRight(
'stocktransfer',
'stocktransfer',
'read');
105$permissiontoadd = $user->hasRight(
'stocktransfer',
'stocktransfer',
'write');
106$permissionnote = $user->hasRight(
'stocktransfer',
'stocktransfer',
'write');
107$permissiontodelete = $user->rights->stocktransfer->stocktransfer->delete || ($permissiontoadd && isset(
$object->status) &&
$object->status < $object::STATUS_TRANSFERED);
108$permissiondellink = $user->hasRight(
'stocktransfer',
'stocktransfer',
'write');
109$upload_dir = $conf->stocktransfer->multidir_output[isset(
$object->entity) ?
$object->entity : 1];
117if (!$permissiontoread || ($action ===
'create' && !$permissiontoadd)) {
126$parameters = array();
127$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
132if (empty($reshook)) {
135 $backurlforlist =
dolBuildUrl(DOL_URL_ROOT.
'/product/stock/stocktransfer/stocktransfer_list.php');
137 if (empty($backtopage) || ($cancel && empty($id))) {
138 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
139 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
140 $backtopage = $backurlforlist;
142 $backtopage =
dolBuildUrl(DOL_URL_ROOT.
'/product/stock/stocktransfer/stocktransfer_card.php', [
'id' => ($id > 0 ? $id :
'__ID__')]);
147 $triggermodname =
'STOCKTRANSFER_MODIFY';
150 include DOL_DOCUMENT_ROOT.
'/core/actions_addupdatedelete.inc.php';
153 $permissiontodelete = $user->rights->stocktransfer->stocktransfer->delete || ($permissiontoadd && isset(
$object->status) &&
$object->status == $object::STATUS_DRAFT);
156 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
159 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
162 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
165 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
167 if ($action ==
'set_thirdparty' && $permissiontoadd) {
168 $object->setValueFrom(
'fk_soc',
GETPOSTINT(
'fk_soc'),
'',
null,
'date',
'', $user, $triggermodname);
170 if ($action ==
'classin' && $permissiontoadd) {
174 if ($action ==
'addline' && $permissiontoadd) {
177 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Qty")),
null,
'errors');
181 if ($fk_warehouse_source <= 0) {
183 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"WarehouseSource")),
null,
'errors');
187 if ($fk_warehouse_destination <= 0) {
189 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"WarehouseTarget")),
null,
'errors');
194 $prod->fetch($fk_product);
195 if ($prod->hasbatch()) {
198 $langs->load(
"errors");
199 setEventMessages($langs->transnoentities(
"ErrorTryToMakeMoveOnProductRequiringBatchData", $prod->ref),
null,
'errors');
202 if (!empty($batch)) {
204 setEventMessages($langs->transnoentities(
'StockTransferNoBatchForProduct', $prod->getNomUrl()),
null,
'errors');
208 if ($prod->status_batch == 2 && abs($qty) > 1) {
210 setEventMessages($langs->transnoentities(
'TooManyQtyForSerialNumber', $prod->ref),
null,
'errors');
215 $records = $line->fetchAll(
'',
'', 0, 0,
'(fk_stocktransfer:=:'.((
int) $id).
') AND (fk_product:=:'.((
int) $fk_product).
') AND (fk_warehouse_source:=:'.((
int) $fk_warehouse_source).
') AND (fk_warehouse_destination:=:'.((
int) $fk_warehouse_destination).
') AND ('.(empty($batch) ?
"(batch:=:'') OR (batch:IS:NULL)" :
"batch:=:'".$db->escape($batch).
"'").
')');
216 if (!empty($records[key($records)])) {
217 $line = $records[key($records)];
219 $line->fk_stocktransfer =
$id;
221 $line->fk_warehouse_source = $fk_warehouse_source;
222 $line->fk_warehouse_destination = $fk_warehouse_destination;
223 $line->fk_product = $fk_product;
224 $line->batch = $batch;
226 $line->pmp = $prod->pmp;
228 $line->update($user);
230 $line->rang = (is_array(
$object->lines) ||
$object->lines instanceof Countable) ? count(
$object->lines) + 1 : 1;
231 $line->create($user);
235 } elseif ($action ===
'updateline' && $permissiontoadd) {
238 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Qty")),
null,
'errors');
239 $action =
'editline';
242 if ($fk_warehouse_source <= 0) {
244 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"WarehouseSource")),
null,
'errors');
245 $action =
'editline';
248 if ($fk_warehouse_destination <= 0) {
250 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"WarehouseTarget")),
null,
'errors');
251 $action =
'editline';
255 $prod->fetch($fk_product);
256 if ($prod->hasbatch()) {
259 $langs->load(
"errors");
260 setEventMessages($langs->transnoentities(
"ErrorTryToMakeMoveOnProductRequiringBatchData", $prod->getNomUrl()),
null,
'errors');
261 $action =
'editline';
264 if (!empty($batch)) {
266 setEventMessages($langs->transnoentities(
'StockTransferNoBatchForProduct', $prod->getNomUrl()),
null,
'errors');
267 $action =
'editline';
271 if ($prod->status_batch == 2 && abs($qty) > 1) {
273 setEventMessages($langs->transnoentities(
'TooManyQtyForSerialNumber', $prod->ref),
null,
'errors');
274 $action =
'editline';
279 $line->fetch($lineid);
281 $line->fk_warehouse_source = $fk_warehouse_source;
282 $line->fk_warehouse_destination = $fk_warehouse_destination;
283 $line->fk_product = $fk_product;
284 $line->batch = $batch;
285 $line->pmp = $prod->pmp;
286 $line->update($user);
291 if ($action ==
'confirm_destock' && $confirm ==
'yes' &&
$object->status == $object::STATUS_VALIDATED && $permissiontoadd) {
292 $lines =
$object->getLinesArray();
293 if (!empty($lines)) {
295 foreach ($lines as $line) {
296 $res = $line->doStockMovement($label, $code_inv, $line->fk_warehouse_source);
309 $object->setStatut($object::STATUS_TRANSFERED, $id);
310 $object->status = $object::STATUS_TRANSFERED;
318 if ($action ==
'confirm_destockcancel' && $confirm ==
'yes' &&
$object->status == $object::STATUS_TRANSFERED && $permissiontoadd) {
319 $lines =
$object->getLinesArray();
320 if (!empty($lines)) {
322 foreach ($lines as $line) {
323 $res = $line->doStockMovement($label, $code_inv, $line->fk_warehouse_source, 0);
336 $object->setStatut($object::STATUS_VALIDATED, $id);
337 $object->status = $object::STATUS_VALIDATED;
338 $object->date_reelle_depart =
null;
345 if ($action ==
'confirm_addstock' && $confirm ==
'yes' &&
$object->status == $object::STATUS_TRANSFERED && $permissiontoadd) {
346 $lines =
$object->getLinesArray();
347 if (!empty($lines)) {
349 foreach ($lines as $line) {
350 $res = $line->doStockMovement($label, $code_inv, $line->fk_warehouse_destination, 0);
363 $object->setStatut($object::STATUS_CLOSED, $id);
364 $object->status = $object::STATUS_CLOSED;
372 if ($action ==
'confirm_addstockcancel' && $confirm ==
'yes' &&
$object->status == $object::STATUS_CLOSED && $permissiontoadd) {
373 $lines =
$object->getLinesArray();
374 if (!empty($lines)) {
376 foreach ($lines as $line) {
377 $res = $line->doStockMovement($label, $code_inv, $line->fk_warehouse_destination);
390 $object->setStatut($object::STATUS_TRANSFERED, $id);
391 $object->status = $object::STATUS_TRANSFERED;
392 $object->date_reelle_arrivee =
null;
399 if ($action ==
'set_incoterms' &&
isModEnabled(
'incoterm') && $permissiontoadd) {
403 $triggersendname =
'STOCKTRANSFER_SENTBYMAIL';
404 $autocopy =
'MAIN_MAIL_AUTOCOPY_STOCKTRANSFER_TO';
405 $trackid =
'stocktransfer'.$object->id;
406 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
416$form =
new Form($db);
420$title = $langs->trans(
"StockTransfer");
423llxHeader(
'', $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),
'size' => 40),
569 1 => array(
'type' =>
'text',
'name' =>
'inventorycode',
'label' => $langs->trans(
"InventoryCode"),
'value' =>
dol_print_date(
dol_now(),
'%y%m%d%H%M%S'),
'size' => 25)
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),
'size' => 40),
576 1 => array(
'type' =>
'text',
'name' =>
'inventorycode',
'label' => $langs->trans(
"InventoryCode"),
'value' =>
dol_print_date(
dol_now(),
'%y%m%d%H%M%S'),
'size' => 25)
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),
'size' => 40),
583 1 => array(
'type' =>
'text',
'name' =>
'inventorycode',
'label' => $langs->trans(
"InventoryCode"),
'value' =>
dol_print_date(
dol_now(),
'%y%m%d%H%M%S'),
'size' => 25)
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),
'size' => 40),
590 1 => array(
'type' =>
'text',
'name' =>
'inventorycode',
'label' => $langs->trans(
"InventoryCode"),
'value' =>
dol_print_date(
dol_now(),
'%y%m%d%H%M%S'),
'size' => 25)
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.
'&search_societe='.urlencode(
$object->thirdparty->name).
'">'.$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">'.
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>';
707 if (!empty(
$object->table_element_line)) {
721 if (!empty($conf->use_javascript_ajax) &&
$object->status == 0) {
723 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
763 print
'<div class="div-table-responsive-no-min">';
764 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.(($action !=
'editline') ?
'#addline' :
'#line_'.
GETPOSTINT(
'lineid')).
'" method="POST">
765 <input type="hidden" name="token" value="' .
newToken().
'">
766 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
767 <input type="hidden" name="mode" value="">
768 <input type="hidden" name="id" value="' .
$object->id.
'">
771 print
'<input type="hidden" name="lineid" value="'.$lineid.
'" />';
773 print
'<table id="tablelines" class="liste centpercent">';
778 print
'<tr class="liste_titre">';
779 print
getTitleFieldOfList($langs->trans(
'ProductRef'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'tagtd maxwidthonsmartphone ');
781 print
getTitleFieldOfList($langs->trans(
'Batch'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'tagtd maxwidthonsmartphone ');
783 print
getTitleFieldOfList($langs->trans(
'WarehouseSource'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'tagtd maxwidthonsmartphone ');
784 print
getTitleFieldOfList($langs->trans(
'WarehouseTarget'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'tagtd maxwidthonsmartphone ');
785 print
getTitleFieldOfList($langs->trans(
'Qty'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'center tagtd maxwidthonsmartphone ');
787 print
getTitleFieldOfList($langs->trans(
'Unit'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'tagtd maxwidthonsmartphone ');
789 print
getTitleFieldOfList($langs->trans(
'AverageUnitPricePMPShort'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'center tagtd maxwidthonsmartphone ');
790 print
getTitleFieldOfList($langs->trans(
'EstimatedStockValueShort'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'center tagtd maxwidthonsmartphone ');
791 if (empty(
$object->status) && $permissiontoadd) {
799 $listofdata =
$object->getLinesArray();
800 $productstatic =
new Product($db);
801 $warehousestatics =
new Entrepot($db);
802 $warehousestatict =
new Entrepot($db);
805 foreach ($listofdata as $key => $line) {
806 $productstatic->fetch($line->fk_product);
807 $warehousestatics->fetch($line->fk_warehouse_source);
808 $warehousestatict->fetch($line->fk_warehouse_destination);
811 $domData =
' data-element="'.$line->element.
'"';
812 $domData .=
' data-id="'.$line->id.
'"';
813 $domData .=
' data-qty="'.$line->qty.
'"';
816 print
'<tr id="row-'.$line->id.
'" class="drag drop oddeven" '.$domData.
'>';
817 print
'<td class="titlefield">';
818 if ($action ===
'editline' && $line->id == $lineid) {
819 $form->select_produits($line->fk_product,
'fk_product',
'', 0, 0, -1, 2,
'', 0, array(), 0, 0, 0,
'minwidth200imp maxwidth300', 1);
821 print $productstatic->getNomUrl(1).
' - '.$productstatic->label;
826 if ($action ===
'editline' && $line->id == $lineid) {
827 print
'<input type="text" value="'.$line->batch.
'" name="batch" class="flat maxwidth50"/>';
830 if ($productlot->fetch(0, $line->fk_product, $line->batch) > 0) {
831 print $productlot->getNomUrl(1);
832 } elseif (!empty($line->batch)) {
833 print $line->batch.
' '.
img_warning($langs->trans(
'BatchNotFound'));
840 print
'<td class="tdoverflowmax150">';
841 if ($action ===
'editline' && $line->id == $lineid) {
842 print $formproduct->selectWarehouses($line->fk_warehouse_source,
'fk_warehouse_source',
'warehouseopen,warehouseinternal', 1, 0, 0,
'', 0, 0, array(),
'minwidth200imp maxwidth200');
844 print $warehousestatics->getNomUrl(1);
849 print
'<td class="tdoverflowmax150">';
850 if ($action ===
'editline' && $line->id == $lineid) {
851 print $formproduct->selectWarehouses($line->fk_warehouse_destination,
'fk_warehouse_destination',
'warehouseopen,warehouseinternal', 1, 0, 0,
'', 0, 0, array(),
'minwidth200imp maxwidth200');
853 print $warehousestatict->getNomUrl(1);
857 if ($action ===
'editline' && $line->id == $lineid) {
858 print
'<td class="center"><input type="text" class="flat maxwidth50" name="qty" value="'.$line->qty.
'"></td>';
860 print
'<td class="center">'.$line->qty.
'</td>';
864 print
'<td class="linecoluseunit nowrap left">';
865 $label = $productstatic->getLabelOfUnit(
'short');
870 print
'<td class="center">';
871 print
price($line->pmp, 0,
'', 1, -1, -1, $conf->currency);
874 print
'<td class="center">';
875 print
price($line->pmp * $line->qty, 0,
'', 1, -1, -1, $conf->currency);
878 if (empty(
$object->status) && $permissiontoadd) {
879 if ($action ===
'editline' && $line->id == $lineid) {
881 print
'<td class="center valignmiddle" colspan="2"><input type="submit" class="button buttongen marginbottomonly" id="savelinebutton marginbottomonly" name="save" value="'.$langs->trans(
"Save").
'"><br>';
882 print
'<input type="submit" class="button buttongen marginbottomonly" id="cancellinebutton" name="cancel" value="'.$langs->trans(
"Cancel").
'"></td>';
884 print
'<td class="right">';
885 print
'<a class="editfielda reposition" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=editline&lineid=' . $line->id .
'#line_' . $line->id .
'">';
888 print
'<td class="right">';
890 $deleteLineUrl = $_SERVER[
"PHP_SELF"] .
'?id=' .
$id .
'&action=deleteline&lineid=' . $line->id .
'&token=' .
newToken();
891 print
'<a href="' . $deleteLineUrl .
'">' .
img_delete($langs->trans(
"Remove")) .
'</a>';
897 if ($num > 1 && $conf->browser->layout !=
'phone' && empty($disablemove)) {
898 print
'<td class="linecolmove tdlineupdown center">';
900 <a
class=
"lineupdown" href=
"<?php print $_SERVER["PHP_SELF
"].'?id='.$id.'&action=up&rowid='.$line->id; ?>">
901 <?php print
img_up(
'default', 0,
'imgupforline'); ?>
904 if ($i < $num - 1) { ?>
905 <a
class=
"lineupdown" href=
"<?php print $_SERVER["PHP_SELF
"].'?id='.$id.'&action=down&rowid='.$line->id; ?>">
906 <?php print
img_down(
'default', 0,
'imgdownforline'); ?>
911 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="'.$qty.
'"' :
'').
'></td>';
996 print
'<td class="right" colspan="2"><input type="submit" class="button" name="addline" value="' .
dol_escape_htmltag($langs->trans(
'Add')) .
'"></td>';
1010 if ($action !=
'presend' && $action !=
'editline') {
1011 print
'<div class="tabsAction">'.
"\n";
1012 $parameters = array();
1013 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
1018 if (empty($reshook)) {
1020 if (empty($user->socid)) {
1021 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=presend&token='.
newToken().
'&mode=init#formmailbeforetitle');
1025 if (
$object->status == $object::STATUS_VALIDATED) {
1026 print
dolGetButtonAction(
'', $langs->trans(
'SetToDraft'),
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=confirm_setdraft&confirm=yes&token='.
newToken(),
'', $permissiontoadd);
1030 print
dolGetButtonAction(
'', $langs->trans(
'Modify'),
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=edit&token='.
newToken(),
'', $permissiontoadd);
1033 if (
$object->status == $object::STATUS_DRAFT) {
1034 if (empty(
$object->table_element_line) || (is_array(
$object->lines) && count(
$object->lines) > 0)) {
1035 print
dolGetButtonAction(
'', $langs->trans(
'Validate'),
'default', $_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=confirm_validate&confirm=yes&token='.
newToken(),
'', $permissiontoadd);
1037 $langs->load(
"errors");
1038 print
dolGetButtonAction($langs->trans(
"ErrorAddAtLeastOneLineFirst"), $langs->trans(
"Validate"),
'default',
'#',
'', 0);
1040 } elseif (
$object->status == $object::STATUS_VALIDATED && $permissiontoadd) {
1041 print
'<a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=destock&token='.
newToken().
'">'.$langs->trans(
"StockTransferDecrementation").
'</a>';
1042 } elseif (
$object->status == $object::STATUS_TRANSFERED && $permissiontoadd) {
1043 print
'<a class="butActionDelete" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=destockcancel&token='.
newToken().
'">'.$langs->trans(
"StockTransferDecrementationCancel").
'</a>';
1044 print
'<a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=addstock&token='.
newToken().
'">'.$langs->trans(
"StockTransferIncrementation").
'</a>';
1045 } elseif (
$object->status == $object::STATUS_CLOSED && $permissiontoadd) {
1046 print
'<a class="butActionDelete" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=addstockcancel&token='.
newToken().
'">'.$langs->trans(
"StockTransferIncrementationCancel").
'</a>';
1050 if ($permissiontoadd) {
1051 print
dolGetButtonAction(
'', $langs->trans(
'ToClone'),
'default', $_SERVER[
'PHP_SELF'].
'?id='.
$object->id.(!empty(
$object->socid) ?
'&socid='.$object->socid :
'').
'&action=clone&token='.
newToken(),
'', $permissiontoadd);
1073 $deleteUrl = $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete&token='.
newToken();
1074 $buttonId =
'action-delete-no-ajax';
1075 if ($conf->use_javascript_ajax && empty($conf->dol_use_jmobile)) {
1077 $buttonId =
'action-delete';
1080 print
dolGetButtonAction(
'', $langs->trans(
"Delete"),
'delete', $deleteUrl, $buttonId, $permissiontodelete, $params);
1082 print
'</div>'.
"\n";
1087 if (
GETPOST(
'modelselected')) {
1088 $action =
'presend';
1091 if ($action !=
'presend') {
1092 print
'<div class="fichecenter"><div class="fichehalfleft">';
1093 print
'<a name="builddoc"></a>';
1095 $includedocgeneration = 1;
1098 if ($includedocgeneration) {
1100 $relativepath = $objref .
'/' . $objref .
'.pdf';
1101 $filedir = $conf->stocktransfer->dir_output.
'/'.
$object->element.
'/'.$objref;
1102 $urlsource = $_SERVER[
"PHP_SELF"] .
"?id=" .
$object->id;
1103 $genallowed = $permissiontoread;
1104 $delallowed = $permissiontoadd;
1105 print $formfile->showdocuments(
'stocktransfer:StockTransfer',
$object->element.
'/'.$objref, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'',
'',
'', $langs->defaultlang);
1109 $tmparray = $form->showLinkToObjectBlock($object, array(), array(
'stocktransfer'), 1);
1110 $linktoelem = $tmparray[
'linktoelem'];
1111 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
1112 print $htmltoenteralink;
1114 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
1117 print
'</div><div class="fichehalfright">';
1124 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
1126 $somethingshown = $formactions->showactions($object,
'stocktransfer', 0, 1,
'', $MAXEVENT,
'');
1128 print
'</div></div>';
1132 if (
GETPOST(
'modelselected')) {
1133 $action =
'presend';
1137 $modelmail =
'stocktransfer';
1138 $defaulttopic =
'InformationMessage';
1139 $diroutput = $conf->stocktransfer->dir_output;
1140 $trackid =
'stocktransfer'.$object->id;
1142 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.
dolBuildUrl($url, $params=[], $addtoken=false)
Return path of url.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
img_down($titlealt='default', $selected=0, $moreclass='')
Show down arrow logo.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
img_up($titlealt='default', $selected=0, $moreclass='')
Show top arrow logo.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
if(getDolGlobalString( 'TAKEPOS_SHOW_CUSTOMER')) print $langs trans('Date')." left Label right Qty right Price right TotalHT right TotalTTC right right right right right right right right right centpercent right TotalHT right n right VAT right n right TotalVAT right n No sujeto a RE IRPF right TotalLT1 right n right TotalLT2 right n right TotalTTC right n takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency right TotalTTC takeposcustomercurrency right takeposcustomercurrency n right PaymentTypeShortLIQ right SELECT p pos_change as p datep as date
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.