27require
'../../../main.inc.php';
28require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formcompany.class.php';
29require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
30require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
31require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
32require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/productlot.class.php';
33require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
34require_once DOL_DOCUMENT_ROOT.
'/product/stock/stocktransfer/class/stocktransfer.class.php';
35require_once DOL_DOCUMENT_ROOT.
'/product/stock/stocktransfer/class/stocktransferline.class.php';
36require_once DOL_DOCUMENT_ROOT.
'/product/stock/stocktransfer/lib/stocktransfer_stocktransfer.lib.php';
37require_once DOL_DOCUMENT_ROOT.
'/core/modules/stocktransfer/modules_stocktransfer.php';
40$langs->loadLangs(array(
"stocks",
"other",
"productbatch",
"companies"));
41if (isModEnabled(
'incoterm')) {
42 $langs->load(
'incoterm');
50$action =
GETPOST(
'action',
'aZ09');
51$confirm =
GETPOST(
'confirm',
'alpha');
52$cancel =
GETPOST(
'cancel',
'aZ09');
53$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') : str_replace(
'_',
'', basename(dirname(__FILE__)).basename(__FILE__,
'.php'));
54$backtopage =
GETPOST(
'backtopage',
'alpha');
55$backtopageforcancel =
GETPOST(
'backtopageforcancel',
'alpha');
58$fk_warehouse_source =
GETPOSTINT(
'fk_warehouse_source');
59$fk_warehouse_destination =
GETPOSTINT(
'fk_warehouse_destination');
61$label =
GETPOST(
'label',
'alpha');
62$batch =
GETPOST(
'batch',
'alpha');
63$code_inv =
GETPOST(
'inventorycode',
'alphanohtml');
68$diroutputmassaction = $conf->stocktransfer->dir_output.
'/temp/massgeneration/'.$user->id;
69$hookmanager->initHooks(array(
$object->element.
'card',
'globalcard'));
72$extrafields->fetch_name_optionals_label(
$object->table_element);
74$search_array_options = $extrafields->getOptionalsFromPost(
$object->table_element,
'',
'search_');
77$search_all = trim(
GETPOST(
"search_all",
'alpha'));
79foreach (
$object->fields as $key => $val) {
80 if (
GETPOST(
'search_'.$key,
'alpha')) {
81 $search[$key] =
GETPOST(
'search_'.$key,
'alpha');
85if (empty($action) && empty($id) && empty($ref)) {
90include DOL_DOCUMENT_ROOT.
'/core/actions_fetchobject.inc.php';
93$permissiontoread = $user->hasRight(
'stocktransfer',
'stocktransfer',
'read');
94$permissiontoadd = $user->hasRight(
'stocktransfer',
'stocktransfer',
'write');
95$permissionnote = $user->hasRight(
'stocktransfer',
'stocktransfer',
'write');
96$permissiontodelete = $user->rights->stocktransfer->stocktransfer->delete || ($permissiontoadd && isset(
$object->status) &&
$object->status < $object::STATUS_TRANSFERED);
97$permissiondellink = $user->hasRight(
'stocktransfer',
'stocktransfer',
'write');
98$upload_dir = $conf->stocktransfer->multidir_output[isset(
$object->entity) ?
$object->entity : 1];
106if (!$permissiontoread || ($action ===
'create' && !$permissiontoadd)) {
115$parameters = array();
116$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
121if (empty($reshook)) {
124 $backurlforlist =
dol_buildpath(
'/product/stock/stocktransfer/stocktransfer_list.php', 1);
126 if (empty($backtopage) || ($cancel && empty($id))) {
127 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
128 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
129 $backtopage = $backurlforlist;
131 $backtopage =
dol_buildpath(
'/product/stock/stocktransfer/stocktransfer_card.php', 1).
'?id='.(
$id > 0 ?
$id :
'__ID__');
136 $triggermodname =
'STOCKTRANSFER_STOCKTRANSFER_MODIFY';
139 include DOL_DOCUMENT_ROOT.
'/core/actions_addupdatedelete.inc.php';
142 $permissiontodelete = $user->rights->stocktransfer->stocktransfer->delete || ($permissiontoadd && isset(
$object->status) &&
$object->status == $object::STATUS_DRAFT);
145 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
148 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
151 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
154 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
156 if ($action ==
'set_thirdparty' && $permissiontoadd) {
157 $object->setValueFrom(
'fk_soc',
GETPOSTINT(
'fk_soc'),
'',
null,
'date',
'', $user, $triggermodname);
159 if ($action ==
'classin' && $permissiontoadd) {
163 if ($action ==
'addline' && $permissiontoadd) {
166 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Qty")),
null,
'errors');
170 if ($fk_warehouse_source <= 0) {
172 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"WarehouseSource")),
null,
'errors');
176 if ($fk_warehouse_destination <= 0) {
178 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"WarehouseTarget")),
null,
'errors');
183 $prod->fetch($fk_product);
184 if ($prod->hasbatch()) {
187 $langs->load(
"errors");
188 setEventMessages($langs->transnoentities(
"ErrorTryToMakeMoveOnProductRequiringBatchData", $prod->ref),
null,
'errors');
191 if (!empty($batch)) {
193 setEventMessages($langs->transnoentities(
'StockTransferNoBatchForProduct', $prod->getNomUrl()),
null,
'errors');
197 if ($prod->status_batch == 2 && abs($qty) > 1) {
199 setEventMessages($langs->transnoentities(
'TooManyQtyForSerialNumber', $prod->ref),
null,
'errors');
204 $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).
"'").
')');
205 if (!empty($records[key($records)])) {
206 $line = $records[key($records)];
208 $line->fk_stocktransfer =
$id;
210 $line->fk_warehouse_source = $fk_warehouse_source;
211 $line->fk_warehouse_destination = $fk_warehouse_destination;
212 $line->fk_product = $fk_product;
213 $line->batch = $batch;
215 $line->pmp = $prod->pmp;
217 $line->update($user);
219 $line->rang = (is_array(
$object->lines) ||
$object->lines instanceof Countable) ? count(
$object->lines) + 1 : 1;
220 $line->create($user);
224 } elseif ($action ===
'updateline' && $permissiontoadd) {
227 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Qty")),
null,
'errors');
228 $action =
'editline';
231 if ($fk_warehouse_source <= 0) {
233 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"WarehouseSource")),
null,
'errors');
234 $action =
'editline';
237 if ($fk_warehouse_destination <= 0) {
239 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"WarehouseTarget")),
null,
'errors');
240 $action =
'editline';
244 $prod->fetch($fk_product);
245 if ($prod->hasbatch()) {
248 $langs->load(
"errors");
249 setEventMessages($langs->transnoentities(
"ErrorTryToMakeMoveOnProductRequiringBatchData", $prod->getNomUrl()),
null,
'errors');
250 $action =
'editline';
253 if (!empty($batch)) {
255 setEventMessages($langs->transnoentities(
'StockTransferNoBatchForProduct', $prod->getNomUrl()),
null,
'errors');
256 $action =
'editline';
260 if ($prod->status_batch == 2 && abs($qty) > 1) {
262 setEventMessages($langs->transnoentities(
'TooManyQtyForSerialNumber', $prod->ref),
null,
'errors');
263 $action =
'editline';
268 $line->fetch($lineid);
270 $line->fk_warehouse_source = $fk_warehouse_source;
271 $line->fk_warehouse_destination = $fk_warehouse_destination;
272 $line->fk_product = $fk_product;
273 $line->batch = $batch;
274 $line->pmp = $prod->pmp;
275 $line->update($user);
279 if ($permissiontoadd) {
281 if ($action ==
'confirm_destock' && $confirm ==
'yes' &&
$object->status == $object::STATUS_VALIDATED) {
282 $lines =
$object->getLinesArray();
283 if (!empty($lines)) {
285 foreach ($lines as $line) {
286 $res = $line->doStockMovement($label, $code_inv, $line->fk_warehouse_source);
299 $object->setStatut($object::STATUS_TRANSFERED, $id);
300 $object->status = $object::STATUS_TRANSFERED;
308 if ($action ==
'confirm_destockcancel' && $confirm ==
'yes' &&
$object->status == $object::STATUS_TRANSFERED) {
309 $lines =
$object->getLinesArray();
310 if (!empty($lines)) {
312 foreach ($lines as $line) {
313 $res = $line->doStockMovement($label, $code_inv, $line->fk_warehouse_source, 0);
326 $object->setStatut($object::STATUS_VALIDATED, $id);
327 $object->status = $object::STATUS_VALIDATED;
328 $object->date_reelle_depart =
null;
335 if ($action ==
'confirm_addstock' && $confirm ==
'yes' &&
$object->status == $object::STATUS_TRANSFERED) {
336 $lines =
$object->getLinesArray();
337 if (!empty($lines)) {
339 foreach ($lines as $line) {
340 $res = $line->doStockMovement($label, $code_inv, $line->fk_warehouse_destination, 0);
353 $object->setStatut($object::STATUS_CLOSED, $id);
354 $object->status = $object::STATUS_CLOSED;
362 if ($action ==
'confirm_addstockcancel' && $confirm ==
'yes' &&
$object->status == $object::STATUS_CLOSED) {
363 $lines =
$object->getLinesArray();
364 if (!empty($lines)) {
366 foreach ($lines as $line) {
367 $res = $line->doStockMovement($label, $code_inv, $line->fk_warehouse_destination);
380 $object->setStatut($object::STATUS_TRANSFERED, $id);
381 $object->status = $object::STATUS_TRANSFERED;
382 $object->date_reelle_arrivee =
null;
390 if ($action ==
'set_incoterms' && isModEnabled(
'incoterm') && $permissiontoadd) {
394 $triggersendname =
'STOCKTRANSFER_SENTBYMAIL';
395 $autocopy =
'MAIN_MAIL_AUTOCOPY_STOCKTRANSFER_TO';
396 $trackid =
'stocktransfer'.$object->id;
397 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
407$form =
new Form($db);
411$title = $langs->trans(
"StockTransfer");
414llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-product page-stock-stocktransfer_stocktransfer_card');
419print
'<script type="text/javascript" language="javascript">
420jQuery(document).ready(function() {';
423$date_prevue_depart =
$object->date_prevue_depart;
424$date_prevue_depart_plus_delai = $date_prevue_depart;
425if (
$object->lead_time_for_warning > 0) {
426 $date_prevue_depart_plus_delai = strtotime(date(
'Y-m-d', $date_prevue_depart) .
' + '.
$object->lead_time_for_warning.
' day');
428if (!empty($date_prevue_depart) && $date_prevue_depart_plus_delai < strtotime(date(
'Y-m-d'))) {
429 print
"$('.valuefield.fieldname_date_prevue_depart').append('";
430 print
img_warning($langs->trans(
'Alert').
' - '.$langs->trans(
'Late'));
439if ($action ==
'create') {
440 if (empty($permissiontoadd)) {
446 print
'<form method="POST" action="'.$_SERVER[
"PHP_SELF"].
'">';
447 print
'<input type="hidden" name="token" value="'.newToken().
'">';
448 print
'<input type="hidden" name="action" value="add">';
450 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
452 if ($backtopageforcancel) {
453 print
'<input type="hidden" name="backtopageforcancel" value="'.$backtopageforcancel.
'">';
459 print
'<table class="border centpercent tableforfieldcreate">'.
"\n";
462 include DOL_DOCUMENT_ROOT.
'/core/tpl/commonfields_add.tpl.php';
464 if (isModEnabled(
'incoterm')) {
470 print
'<td><label for="incoterm_id">'.$form->textwithpicto($langs->trans(
"IncotermLabel"), $soc->label_incoterms, 1).
'</label></td>';
471 print
'<td class="maxwidthonsmartphone">';
472 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms :
''), (!empty($soc->location_incoterms) ? $soc->location_incoterms :
''),
'',
'fk_incoterms');
476 print
'<tr><td>'.$langs->trans(
'DefaultModel').
'</td>';
478 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
479 include_once DOL_DOCUMENT_ROOT.
'/core/modules/commande/modules_commande.php';
482 print $form->selectarray(
'model', $liste, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
486 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
488 print
'</table>'.
"\n";
492 print $form->buttonsSaveCancel(
"Create");
500if (($id || $ref) && $action ==
'edit') {
503 print
'<form method="POST" action="' . $_SERVER[
"PHP_SELF"] .
'">';
504 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
505 print
'<input type="hidden" name="action" value="update">';
506 print
'<input type="hidden" name="id" value="' .
$object->id .
'">';
508 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
510 if ($backtopageforcancel) {
511 print
'<input type="hidden" name="backtopageforcancel" value="' . $backtopageforcancel .
'">';
516 print
'<table class="border centpercent tableforfieldedit">' .
"\n";
519 include DOL_DOCUMENT_ROOT .
'/core/tpl/commonfields_edit.tpl.php';
522 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_edit.tpl.php';
528 print $form->buttonsSaveCancel();
534if (
$object->id > 0 && (empty($action) || ($action !=
'edit' && $action !=
'create'))) {
535 $res =
$object->fetch_optionals();
544 if ($action ==
'delete' || ($conf->use_javascript_ajax && empty($conf->dol_use_jmobile))) {
545 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DeleteMyObject'), $langs->trans(
'ConfirmDeleteObject'),
'confirm_delete',
'', 0,
'action-delete');
548 if ($action ==
'deleteline') {
549 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteLine'), $langs->trans(
'ConfirmDeleteLine'),
'confirm_deleteline',
'', 0, 1);
551 $formquestion = array();
553 if ($action ==
'clone') {
555 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneAsk',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1);
556 } elseif ($action ==
'destock') {
558 $formquestion = array(
'text' =>
'',
559 0 => array(
'type' =>
'text',
'name' =>
'label',
'label' => $langs->trans(
"Label"),
'value' => $langs->trans(
'ConfirmDestock',
$object->ref),
'size' => 40),
560 1 => array(
'type' =>
'text',
'name' =>
'inventorycode',
'label' => $langs->trans(
"InventoryCode"),
'value' =>
dol_print_date(
dol_now(),
'%y%m%d%H%M%S'),
'size' => 25)
562 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DestockAllProduct'),
'',
'confirm_destock', $formquestion,
'yes', 1);
563 } elseif ($action ==
'destockcancel') {
565 $formquestion = array(
'text' =>
'',
566 0 => array(
'type' =>
'text',
'name' =>
'label',
'label' => $langs->trans(
"Label"),
'value' => $langs->trans(
'ConfirmDestockCancel',
$object->ref),
'size' => 40),
567 1 => array(
'type' =>
'text',
'name' =>
'inventorycode',
'label' => $langs->trans(
"InventoryCode"),
'value' =>
dol_print_date(
dol_now(),
'%y%m%d%H%M%S'),
'size' => 25)
569 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DestockAllProductCancel'),
'',
'confirm_destockcancel', $formquestion,
'yes', 1);
570 } elseif ($action ==
'addstock') {
572 $formquestion = array(
'text' =>
'',
573 0 => array(
'type' =>
'text',
'name' =>
'label',
'label' => $langs->trans(
"Label").
' :',
'value' => $langs->trans(
'ConfirmAddStock',
$object->ref),
'size' => 40),
574 1 => array(
'type' =>
'text',
'name' =>
'inventorycode',
'label' => $langs->trans(
"InventoryCode"),
'value' =>
dol_print_date(
dol_now(),
'%y%m%d%H%M%S'),
'size' => 25)
576 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'AddStockAllProduct'),
'',
'confirm_addstock', $formquestion,
'yes', 1);
577 } elseif ($action ==
'addstockcancel') {
579 $formquestion = array(
'text' =>
'',
580 0 => array(
'type' =>
'text',
'name' =>
'label',
'label' => $langs->trans(
"Label").
' :',
'value' => $langs->trans(
'ConfirmAddStockCancel',
$object->ref),
'size' => 40),
581 1 => array(
'type' =>
'text',
'name' =>
'inventorycode',
'label' => $langs->trans(
"InventoryCode"),
'value' =>
dol_print_date(
dol_now(),
'%y%m%d%H%M%S'),
'size' => 25)
583 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'AddStockAllProductCancel'),
'',
'confirm_addstockcancel', $formquestion,
'yes', 1);
587 if ($action ==
'xxx') {
588 $formquestion = array();
599 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'XXX'), $text,
'confirm_xxx', $formquestion, 0, 1, 220);
603 if ($action ==
'valid' && $permissiontoadd) {
604 $nextref =
$object->getNextNumRef();
605 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'Validate'), $langs->transnoentities(
'ConfirmValidateStockTransfer', $nextref),
'confirm_validate', $formquestion, 0, 2);
609 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
610 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
611 if (empty($reshook)) {
612 $formconfirm .= $hookmanager->resPrint;
613 } elseif ($reshook > 0) {
614 $formconfirm = $hookmanager->resPrint;
623 $linkback =
'<a href="'.dol_buildpath(
'/product/stock/stocktransfer/stocktransfer_list.php', 1).
'?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
625 $morehtmlref =
'<div class="refidno">';
627 $morehtmlref .= empty(
$object->thirdparty) ?
'' :
$object->thirdparty->getNomUrl(1,
'customer');
629 $morehtmlref .=
' (<a href="'.DOL_URL_ROOT.
'/commande/list.php?socid='.
$object->thirdparty->id.
'&search_societe='.urlencode(
$object->thirdparty->name).
'">'.$langs->trans(
"OtherOrders").
'</a>)';
632 if (isModEnabled(
'project')) {
633 $langs->load(
"projects");
634 $morehtmlref .= (empty(
$object->thirdparty) ?
'' :
'<br>');
635 if ($permissiontoadd) {
636 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
637 if ($action !=
'classify') {
638 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
640 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->socid,
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
642 if (!empty(
$object->fk_project)) {
644 $proj->fetch(
$object->fk_project);
645 $morehtmlref .= $proj->getNomUrl(1);
647 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
652 $morehtmlref .=
'</div>';
655 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
658 print
'<div class="fichecenter">';
659 print
'<div class="fichehalfleft">';
660 print
'<div class="underbanner clearboth"></div>';
661 print
'<table class="border centpercent tableforfield">'.
"\n";
668 $object->fields[
'fk_soc'][
'visible'] = 0;
669 $object->fields[
'fk_project'][
'visible'] = 0;
670 include DOL_DOCUMENT_ROOT.
'/core/tpl/commonfields_view.tpl.php';
673 if (isModEnabled(
'incoterm')) {
675 print
'<table width="100%" class="nobordernopadding"><tr><td>';
676 print $langs->trans(
'IncotermLabel');
677 print
'<td><td class="right">';
678 if ($permissiontoadd && $action !=
'editincoterm') {
679 print
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=editincoterm">'.
img_edit().
'</a>';
683 print
'</td></tr></table>';
686 if ($action !=
'editincoterm') {
687 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
689 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
695 echo
'<td>'.$langs->trans(
'EnhancedValue').
' '.strtolower($langs->trans(
'TotalWoman'));
696 echo
'<td>'.price(
$object->getValorisationTotale(), 0,
'', 1, -1, -1, $conf->currency).
'</td>';
700 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
706 print
'<div class="clearboth"></div>';
715 if (!empty(
$object->table_element_line)) {
729 if (!empty($conf->use_javascript_ajax) &&
$object->status == 0) {
731 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
771 print
'<div class="div-table-responsive-no-min">';
772 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.(($action !=
'editline') ?
'#addline' :
'#line_'.
GETPOSTINT(
'lineid')).
'" method="POST">
773 <input type="hidden" name="token" value="' .
newToken().
'">
774 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
775 <input type="hidden" name="mode" value="">
776 <input type="hidden" name="id" value="' .
$object->id.
'">
779 print
'<input type="hidden" name="lineid" value="'.$lineid.
'" />';
781 print
'<table id="tablelines" class="liste centpercent">';
786 print
'<tr class="liste_titre">';
787 print
getTitleFieldOfList($langs->trans(
'ProductRef'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'tagtd maxwidthonsmartphone ');
788 if (isModEnabled(
'productbatch')) {
789 print
getTitleFieldOfList($langs->trans(
'Batch'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'tagtd maxwidthonsmartphone ');
791 print
getTitleFieldOfList($langs->trans(
'WarehouseSource'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'tagtd maxwidthonsmartphone ');
792 print
getTitleFieldOfList($langs->trans(
'WarehouseTarget'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'tagtd maxwidthonsmartphone ');
793 print
getTitleFieldOfList($langs->trans(
'Qty'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'center tagtd maxwidthonsmartphone ');
795 print
getTitleFieldOfList($langs->trans(
'Unit'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'tagtd maxwidthonsmartphone ');
797 print
getTitleFieldOfList($langs->trans(
'AverageUnitPricePMPShort'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'center tagtd maxwidthonsmartphone ');
798 print
getTitleFieldOfList($langs->trans(
'EstimatedStockValueShort'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'center tagtd maxwidthonsmartphone ');
799 if (empty(
$object->status) && $permissiontoadd) {
807 $listofdata =
$object->getLinesArray();
808 $productstatic =
new Product($db);
809 $warehousestatics =
new Entrepot($db);
810 $warehousestatict =
new Entrepot($db);
812 foreach ($listofdata as $key => $line) {
813 $productstatic->fetch($line->fk_product);
814 $warehousestatics->fetch($line->fk_warehouse_source);
815 $warehousestatict->fetch($line->fk_warehouse_destination);
818 $domData =
' data-element="'.$line->element.
'"';
819 $domData .=
' data-id="'.$line->id.
'"';
820 $domData .=
' data-qty="'.$line->qty.
'"';
823 print
'<tr id="row-'.$line->id.
'" class="drag drop oddeven" '.$domData.
'>';
824 print
'<td class="titlefield">';
825 if ($action ===
'editline' && $line->id == $lineid) {
826 $form->select_produits($line->fk_product,
'fk_product',
'', 0, 0, -1, 2,
'', 0, array(), 0, 0, 0,
'minwidth200imp maxwidth300', 1);
828 print $productstatic->getNomUrl(1).
' - '.$productstatic->label;
831 if (isModEnabled(
'productbatch')) {
833 if ($action ===
'editline' && $line->id == $lineid) {
834 print
'<input type="text" value="'.$line->batch.
'" name="batch" class="flat maxwidth50"/>';
837 if ($productlot->fetch(0, $line->fk_product, $line->batch) > 0) {
838 print $productlot->getNomUrl(1);
839 } elseif (!empty($line->batch)) {
840 print $line->batch.
' '.
img_warning($langs->trans(
'BatchNotFound'));
847 print
'<td class="tdoverflowmax150">';
848 if ($action ===
'editline' && $line->id == $lineid) {
849 print $formproduct->selectWarehouses($line->fk_warehouse_source,
'fk_warehouse_source',
'warehouseopen,warehouseinternal', 1, 0, 0,
'', 0, 0, array(),
'minwidth200imp maxwidth200');
851 print $warehousestatics->getNomUrl(1);
856 print
'<td class="tdoverflowmax150">';
857 if ($action ===
'editline' && $line->id == $lineid) {
858 print $formproduct->selectWarehouses($line->fk_warehouse_destination,
'fk_warehouse_destination',
'warehouseopen,warehouseinternal', 1, 0, 0,
'', 0, 0, array(),
'minwidth200imp maxwidth200');
860 print $warehousestatict->getNomUrl(1);
864 if ($action ===
'editline' && $line->id == $lineid) {
865 print
'<td class="center"><input type="text" class="flat maxwidth50" name="qty" value="'.$line->qty.
'"></td>';
867 print
'<td class="center">'.$line->qty.
'</td>';
871 print
'<td class="linecoluseunit nowrap left">';
872 $label = $productstatic->getLabelOfUnit(
'short');
874 print $langs->trans($label);
879 print
'<td class="center">';
880 print
price($line->pmp, 0,
'', 1, -1, -1, $conf->currency);
883 print
'<td class="center">';
884 print
price($line->pmp * $line->qty, 0,
'', 1, -1, -1, $conf->currency);
887 if (empty(
$object->status) && $permissiontoadd) {
888 if ($action ===
'editline' && $line->id == $lineid) {
890 print
'<td class="center valignmiddle" colspan="2"><input type="submit" class="button buttongen marginbottomonly" id="savelinebutton marginbottomonly" name="save" value="'.$langs->trans(
"Save").
'"><br>';
891 print
'<input type="submit" class="button buttongen marginbottomonly" id="cancellinebutton" name="cancel" value="'.$langs->trans(
"Cancel").
'"></td>';
893 print
'<td class="right">';
894 print
'<a class="editfielda reposition" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=editline&lineid=' . $line->id .
'#line_' . $line->id .
'">';
897 print
'<td class="right">';
898 print
'<a href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$id .
'&action=deleteline&lineid=' . $line->id .
'">' .
img_delete($langs->trans(
"Remove")) .
'</a>';
904 if ($num > 1 && $conf->browser->layout !=
'phone' && empty($disablemove)) {
905 print
'<td class="linecolmove tdlineupdown center">';
907 <a
class=
"lineupdown" href=
"<?php print $_SERVER["PHP_SELF
"].'?id='.$id.'&action=up&rowid='.$line->id; ?>">
908 <?php print
img_up(
'default', 0,
'imgupforline'); ?>
911 if ($i < $num - 1) { ?>
912 <a
class=
"lineupdown" href=
"<?php print $_SERVER["PHP_SELF
"].'?id='.$id.'&action=down&rowid='.$line->id; ?>">
913 <?php print
img_down(
'default', 0,
'imgdownforline'); ?>
918 print
'<td '.(($conf->browser->layout !=
'phone' && empty($disablemove)) ?
' class="linecolmove tdlineupdown center"' :
' class="linecolmove center"').
'></td>';
925 if (empty(
$object->status) && $action !==
'editline' && $permissiontoadd) {
926 print
'<tr class="oddeven">';
928 print
'<td class="titlefield">';
939 $form->select_produits($fk_product,
'fk_product', $filtertype, $limit, 0, -1, 2,
'', 0, array(), 0, 0, 0,
'minwidth200imp maxwidth300', 1);
942 if (isModEnabled(
'productbatch')) {
944 print
'<input type="text" name="batch" class="flat maxwidth50" '.(!empty($error) ?
'value="'.$batch.
'"' :
'').
'>';
948 $formproduct->loadWarehouses();
951 $TExcludedWarehouseSource = array();
952 if (!empty(
$object->fk_warehouse_source)) {
954 $source_ent->fetch(
$object->fk_warehouse_source);
955 foreach ($formproduct->cache_warehouses as $TDataCacheWarehouse) {
956 if (strpos($TDataCacheWarehouse[
'full_label'], $source_ent->label) ===
false) {
957 $TExcludedWarehouseSource[] = $TDataCacheWarehouse[
'id'];
963 $TExcludedWarehouseDestination = array();
964 if (!empty(
$object->fk_warehouse_destination)) {
966 $dest_ent->fetch(
$object->fk_warehouse_destination);
967 foreach ($formproduct->cache_warehouses as $TDataCacheWarehouse) {
968 if (strpos($TDataCacheWarehouse[
'full_label'], $dest_ent->label) ===
false) {
969 $TExcludedWarehouseDestination[] = $TDataCacheWarehouse[
'id'];
975 $formproduct->cache_warehouses = array();
978 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);
982 $formproduct->cache_warehouses = array();
985 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);
989 print
'<td class="center"><input type="text" class="flat maxwidth50" name="qty" '.(!empty($error) ?
'value="'.$qty.
'"' :
'').
'></td>';
1002 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'),
'default', $_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'),
'default', $_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">';
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';
1144 $defaulttopic =
'InformationMessage';
1145 $diroutput = $conf->stocktransfer->dir_output;
1146 $trackid =
'stocktransfer'.$object->id;
1148 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
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.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
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)
Show tabs of a record.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
img_down($titlealt='default', $selected=0, $moreclass='')
Show down arrow logo.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
img_up($titlealt='default', $selected=0, $moreclass='')
Show top arrow logo.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
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.