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');
49$action =
GETPOST(
'action',
'aZ09');
50$confirm =
GETPOST(
'confirm',
'alpha');
51$cancel =
GETPOST(
'cancel',
'aZ09');
52$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') : str_replace(
'_',
'', basename(dirname(__FILE__)).basename(__FILE__,
'.php'));
53$backtopage =
GETPOST(
'backtopage',
'alpha');
54$backtopageforcancel =
GETPOST(
'backtopageforcancel',
'alpha');
57$fk_warehouse_source =
GETPOSTINT(
'fk_warehouse_source');
58$fk_warehouse_destination =
GETPOSTINT(
'fk_warehouse_destination');
60$label =
GETPOST(
'label',
'alpha');
61$batch =
GETPOST(
'batch',
'alpha');
62$code_inv =
GETPOST(
'inventorycode',
'alphanohtml');
67$diroutputmassaction = $conf->stocktransfer->dir_output.
'/temp/massgeneration/'.$user->id;
68$hookmanager->initHooks(array(
$object->element.
'card',
'globalcard'));
71$extrafields->fetch_name_optionals_label(
$object->table_element);
73$search_array_options = $extrafields->getOptionalsFromPost(
$object->table_element,
'',
'search_');
76$search_all = trim(
GETPOST(
"search_all",
'alpha'));
78foreach (
$object->fields as $key => $val) {
79 if (
GETPOST(
'search_'.$key,
'alpha')) {
80 $search[$key] =
GETPOST(
'search_'.$key,
'alpha');
84if (empty($action) && empty($id) && empty($ref)) {
89include DOL_DOCUMENT_ROOT.
'/core/actions_fetchobject.inc.php';
92$permissiontoread = $user->hasRight(
'stocktransfer',
'stocktransfer',
'read');
93$permissiontoadd = $user->hasRight(
'stocktransfer',
'stocktransfer',
'write');
94$permissionnote = $user->hasRight(
'stocktransfer',
'stocktransfer',
'write');
95$permissiontodelete = $user->rights->stocktransfer->stocktransfer->delete || ($permissiontoadd && isset(
$object->status) &&
$object->status < $object::STATUS_TRANSFERED);
96$permissiondellink = $user->hasRight(
'stocktransfer',
'stocktransfer',
'write');
97$upload_dir = $conf->stocktransfer->multidir_output[isset(
$object->entity) ?
$object->entity : 1];
105if (!$permissiontoread || ($action ===
'create' && !$permissiontoadd)) {
114$parameters = array();
115$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
120if (empty($reshook)) {
123 $backurlforlist =
dol_buildpath(
'/product/stock/stocktransfer/stocktransfer_list.php', 1);
125 if (empty($backtopage) || ($cancel && empty($id))) {
126 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
127 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
128 $backtopage = $backurlforlist;
130 $backtopage =
dol_buildpath(
'/product/stock/stocktransfer/stocktransfer_card.php', 1).
'?id='.($id > 0 ? $id :
'__ID__');
135 $triggermodname =
'STOCKTRANSFER_STOCKTRANSFER_MODIFY';
138 include DOL_DOCUMENT_ROOT.
'/core/actions_addupdatedelete.inc.php';
141 $permissiontodelete = $user->rights->stocktransfer->stocktransfer->delete || ($permissiontoadd && isset(
$object->status) &&
$object->status == $object::STATUS_DRAFT);
144 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
147 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
150 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
153 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
155 if ($action ==
'set_thirdparty' && $permissiontoadd) {
156 $object->setValueFrom(
'fk_soc',
GETPOSTINT(
'fk_soc'),
'',
'',
'date',
'', $user, $triggermodname);
158 if ($action ==
'classin' && $permissiontoadd) {
162 if ($action ==
'addline' && $permissiontoadd) {
165 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Qty")),
null,
'errors');
169 if ($fk_warehouse_source <= 0) {
171 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"WarehouseSource")),
null,
'errors');
175 if ($fk_warehouse_destination <= 0) {
177 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"WarehouseTarget")),
null,
'errors');
182 $prod->fetch($fk_product);
183 if ($prod->hasbatch()) {
186 $langs->load(
"errors");
187 setEventMessages($langs->transnoentities(
"ErrorTryToMakeMoveOnProductRequiringBatchData", $prod->ref),
null,
'errors');
190 if (!empty($batch)) {
192 setEventMessages($langs->transnoentities(
'StockTransferNoBatchForProduct', $prod->getNomUrl()),
null,
'errors');
196 if ($prod->status_batch==2 && abs($qty)>1) {
198 setEventMessages($langs->transnoentities(
'TooManyQtyForSerialNumber', $prod->ref),
null,
'errors');
203 $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).
"'").
')');
204 if (!empty($records[key($records)])) {
205 $line = $records[key($records)];
207 $line->fk_stocktransfer = $id;
209 $line->fk_warehouse_source = $fk_warehouse_source;
210 $line->fk_warehouse_destination = $fk_warehouse_destination;
211 $line->fk_product = $fk_product;
212 $line->batch = $batch;
214 $line->pmp = $prod->pmp;
216 $line->update($user);
218 $line->rang = (is_array(
$object->lines) ||
$object->lines instanceof Countable) ? count(
$object->lines) + 1 : 1;
219 $line->create($user);
223 } elseif ($action ===
'updateline' && $permissiontoadd) {
226 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Qty")),
null,
'errors');
227 $action =
'editline';
230 if ($fk_warehouse_source <= 0) {
232 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"WarehouseSource")),
null,
'errors');
233 $action =
'editline';
236 if ($fk_warehouse_destination <= 0) {
238 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"WarehouseTarget")),
null,
'errors');
239 $action =
'editline';
243 $prod->fetch($fk_product);
244 if ($prod->hasbatch()) {
247 $langs->load(
"errors");
248 setEventMessages($langs->transnoentities(
"ErrorTryToMakeMoveOnProductRequiringBatchData", $prod->getNomUrl()),
null,
'errors');
249 $action =
'editline';
252 if (!empty($batch)) {
254 setEventMessages($langs->transnoentities(
'StockTransferNoBatchForProduct', $prod->getNomUrl()),
'',
'errors');
255 $action =
'editline';
259 if ($prod->status_batch==2 && abs($qty)>1) {
261 setEventMessages($langs->transnoentities(
'TooManyQtyForSerialNumber', $prod->ref),
null,
'errors');
262 $action =
'editline';
267 $line->fetch($lineid);
269 $line->fk_warehouse_source = $fk_warehouse_source;
270 $line->fk_warehouse_destination = $fk_warehouse_destination;
271 $line->fk_product = $fk_product;
272 $line->batch = $batch;
273 $line->pmp = $prod->pmp;
274 $line->update($user);
278 if ($permissiontoadd) {
280 if ($action ==
'confirm_destock' && $confirm ==
'yes' &&
$object->status == $object::STATUS_VALIDATED) {
281 $lines =
$object->getLinesArray();
282 if (!empty($lines)) {
284 foreach ($lines as $line) {
285 $res = $line->doStockMovement($label, $code_inv, $line->fk_warehouse_source);
298 $object->setStatut($object::STATUS_TRANSFERED, $id);
299 $object->status = $object::STATUS_TRANSFERED;
300 $object->date_reelle_depart = date(
'Y-m-d');
307 if ($action ==
'confirm_destockcancel' && $confirm ==
'yes' &&
$object->status == $object::STATUS_TRANSFERED) {
308 $lines =
$object->getLinesArray();
309 if (!empty($lines)) {
311 foreach ($lines as $line) {
312 $res = $line->doStockMovement($label, $code_inv, $line->fk_warehouse_source, 0);
325 $object->setStatut($object::STATUS_VALIDATED, $id);
326 $object->status = $object::STATUS_VALIDATED;
327 $object->date_reelle_depart =
null;
334 if ($action ==
'confirm_addstock' && $confirm ==
'yes' &&
$object->status == $object::STATUS_TRANSFERED) {
335 $lines =
$object->getLinesArray();
336 if (!empty($lines)) {
338 foreach ($lines as $line) {
339 $res = $line->doStockMovement($label, $code_inv, $line->fk_warehouse_destination, 0);
352 $object->setStatut($object::STATUS_CLOSED, $id);
353 $object->status = $object::STATUS_CLOSED;
354 $object->date_reelle_arrivee = date(
'Y-m-d');
361 if ($action ==
'confirm_addstockcancel' && $confirm ==
'yes' &&
$object->status == $object::STATUS_CLOSED) {
362 $lines =
$object->getLinesArray();
363 if (!empty($lines)) {
365 foreach ($lines as $line) {
366 $res = $line->doStockMovement($label, $code_inv, $line->fk_warehouse_destination);
379 $object->setStatut($object::STATUS_TRANSFERED, $id);
380 $object->status = $object::STATUS_TRANSFERED;
381 $object->date_reelle_arrivee =
null;
389 if ($action ==
'set_incoterms' && isModEnabled(
'incoterm') && $permissiontoadd) {
393 $triggersendname =
'STOCKTRANSFER_SENTBYMAIL';
394 $autocopy =
'MAIN_MAIL_AUTOCOPY_STOCKTRANSFER_TO';
395 $trackid =
'stocktransfer'.$object->id;
396 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
406$form =
new Form($db);
410$title = $langs->trans(
"StockTransfer");
413llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-product page-stock-stocktransfer_stocktransfer_card');
418print
'<script type="text/javascript" language="javascript">
419jQuery(document).ready(function() {';
422$date_prevue_depart =
$object->date_prevue_depart;
423$date_prevue_depart_plus_delai = $date_prevue_depart;
424if (
$object->lead_time_for_warning > 0) {
425 $date_prevue_depart_plus_delai = strtotime(date(
'Y-m-d', $date_prevue_depart) .
' + '.
$object->lead_time_for_warning.
' day');
427if (!empty($date_prevue_depart) && $date_prevue_depart_plus_delai < strtotime(date(
'Y-m-d'))) {
428 print
"$('.valuefield.fieldname_date_prevue_depart').append('";
429 print
img_warning($langs->trans(
'Alert').
' - '.$langs->trans(
'Late'));
438if ($action ==
'create') {
439 if (empty($permissiontoadd)) {
445 print
'<form method="POST" action="'.$_SERVER[
"PHP_SELF"].
'">';
446 print
'<input type="hidden" name="token" value="'.newToken().
'">';
447 print
'<input type="hidden" name="action" value="add">';
449 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
451 if ($backtopageforcancel) {
452 print
'<input type="hidden" name="backtopageforcancel" value="'.$backtopageforcancel.
'">';
458 print
'<table class="border centpercent tableforfieldcreate">'.
"\n";
461 include DOL_DOCUMENT_ROOT.
'/core/tpl/commonfields_add.tpl.php';
463 if (isModEnabled(
'incoterm')) {
469 print
'<td><label for="incoterm_id">'.$form->textwithpicto($langs->trans(
"IncotermLabel"), $soc->label_incoterms, 1).
'</label></td>';
470 print
'<td class="maxwidthonsmartphone">';
471 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms :
''), (!empty($soc->location_incoterms) ? $soc->location_incoterms :
''),
'',
'fk_incoterms');
475 print
'<tr><td>'.$langs->trans(
'DefaultModel').
'</td>';
477 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
478 include_once DOL_DOCUMENT_ROOT.
'/core/modules/commande/modules_commande.php';
481 print $form->selectarray(
'model', $liste, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
485 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
487 print
'</table>'.
"\n";
491 print $form->buttonsSaveCancel(
"Create");
499if (($id || $ref) && $action ==
'edit') {
502 print
'<form method="POST" action="' . $_SERVER[
"PHP_SELF"] .
'">';
503 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
504 print
'<input type="hidden" name="action" value="update">';
505 print
'<input type="hidden" name="id" value="' .
$object->id .
'">';
507 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
509 if ($backtopageforcancel) {
510 print
'<input type="hidden" name="backtopageforcancel" value="' . $backtopageforcancel .
'">';
515 print
'<table class="border centpercent tableforfieldedit">' .
"\n";
518 include DOL_DOCUMENT_ROOT .
'/core/tpl/commonfields_edit.tpl.php';
521 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_edit.tpl.php';
527 print $form->buttonsSaveCancel();
533if (
$object->id > 0 && (empty($action) || ($action !=
'edit' && $action !=
'create'))) {
534 $res =
$object->fetch_optionals();
543 if ($action ==
'delete' || ($conf->use_javascript_ajax && empty($conf->dol_use_jmobile))) {
544 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DeleteMyObject'), $langs->trans(
'ConfirmDeleteObject'),
'confirm_delete',
'', 0,
'action-delete');
547 if ($action ==
'deleteline') {
548 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteLine'), $langs->trans(
'ConfirmDeleteLine'),
'confirm_deleteline',
'', 0, 1);
551 if ($action ==
'clone') {
553 $formquestion = array();
554 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneAsk',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1);
555 } elseif ($action ==
'destock') {
557 $formquestion = array(
'text' =>
'',
558 0 => array(
'type' =>
'text',
'name' =>
'label',
'label' => $langs->trans(
"Label"),
'value' => $langs->trans(
'ConfirmDestock',
$object->ref),
'size' => 40),
559 1 => array(
'type' =>
'text',
'name' =>
'inventorycode',
'label' => $langs->trans(
"InventoryCode"),
'value' =>
dol_print_date(
dol_now(),
'%y%m%d%H%M%S'),
'size' => 25)
561 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DestockAllProduct'),
'',
'confirm_destock', $formquestion,
'yes', 1);
562 } elseif ($action ==
'destockcancel') {
564 $formquestion = array(
'text' =>
'',
565 0 => array(
'type' =>
'text',
'name' =>
'label',
'label' => $langs->trans(
"Label"),
'value' => $langs->trans(
'ConfirmDestockCancel',
$object->ref),
'size' => 40),
566 1 => array(
'type' =>
'text',
'name' =>
'inventorycode',
'label' => $langs->trans(
"InventoryCode"),
'value' =>
dol_print_date(
dol_now(),
'%y%m%d%H%M%S'),
'size' => 25)
568 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DestockAllProductCancel'),
'',
'confirm_destockcancel', $formquestion,
'yes', 1);
569 } elseif ($action ==
'addstock') {
571 $formquestion = array(
'text' =>
'',
572 0 => array(
'type' =>
'text',
'name' =>
'label',
'label' => $langs->trans(
"Label").
' :',
'value' => $langs->trans(
'ConfirmAddStock',
$object->ref),
'size' => 40),
573 1 => array(
'type' =>
'text',
'name' =>
'inventorycode',
'label' => $langs->trans(
"InventoryCode"),
'value' =>
dol_print_date(
dol_now(),
'%y%m%d%H%M%S'),
'size' => 25)
575 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'AddStockAllProduct'),
'',
'confirm_addstock', $formquestion,
'yes', 1);
576 } elseif ($action ==
'addstockcancel') {
578 $formquestion = array(
'text' =>
'',
579 0 => array(
'type' =>
'text',
'name' =>
'label',
'label' => $langs->trans(
"Label").
' :',
'value' => $langs->trans(
'ConfirmAddStockCancel',
$object->ref),
'size' => 40),
580 1 => array(
'type' =>
'text',
'name' =>
'inventorycode',
'label' => $langs->trans(
"InventoryCode"),
'value' =>
dol_print_date(
dol_now(),
'%y%m%d%H%M%S'),
'size' => 25)
582 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'AddStockAllProductCancel'),
'',
'confirm_addstockcancel', $formquestion,
'yes', 1);
586 if ($action ==
'xxx') {
587 $formquestion = array();
598 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'XXX'), $text,
'confirm_xxx', $formquestion, 0, 1, 220);
602 if ($action ==
'valid' && $permissiontoadd) {
603 $nextref =
$object->getNextNumRef();
604 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'Validate'), $langs->transnoentities(
'ConfirmValidateStockTransfer', $nextref),
'confirm_validate', $formquestion, 0, 2);
608 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
609 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
610 if (empty($reshook)) {
611 $formconfirm .= $hookmanager->resPrint;
612 } elseif ($reshook > 0) {
613 $formconfirm = $hookmanager->resPrint;
622 $linkback =
'<a href="'.dol_buildpath(
'/product/stock/stocktransfer/stocktransfer_list.php', 1).
'?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
624 $morehtmlref =
'<div class="refidno">';
626 $morehtmlref .= empty(
$object->thirdparty) ?
'' :
$object->thirdparty->getNomUrl(1,
'customer');
628 $morehtmlref .=
' (<a href="'.DOL_URL_ROOT.
'/commande/list.php?socid='.
$object->thirdparty->id.
'&search_societe='.urlencode(
$object->thirdparty->name).
'">'.$langs->trans(
"OtherOrders").
'</a>)';
631 if (isModEnabled(
'project')) {
632 $langs->load(
"projects");
633 $morehtmlref .=
'<br>';
634 if ($permissiontoadd) {
635 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
636 if ($action !=
'classify') {
637 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
639 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->socid,
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
641 if (!empty(
$object->fk_project)) {
643 $proj->fetch(
$object->fk_project);
644 $morehtmlref .= $proj->getNomUrl(1);
646 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
651 $morehtmlref .=
'</div>';
654 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
657 print
'<div class="fichecenter">';
658 print
'<div class="fichehalfleft">';
659 print
'<div class="underbanner clearboth"></div>';
660 print
'<table class="border centpercent tableforfield">'.
"\n";
667 $object->fields[
'fk_soc'][
'visible'] = 0;
668 $object->fields[
'fk_project'][
'visible'] = 0;
669 include DOL_DOCUMENT_ROOT.
'/core/tpl/commonfields_view.tpl.php';
672 if (isModEnabled(
'incoterm')) {
674 print
'<table width="100%" class="nobordernopadding"><tr><td>';
675 print $langs->trans(
'IncotermLabel');
676 print
'<td><td class="right">';
677 if ($permissiontoadd && $action !=
'editincoterm') {
678 print
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=editincoterm">'.
img_edit().
'</a>';
682 print
'</td></tr></table>';
685 if ($action !=
'editincoterm') {
686 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
688 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
694 echo
'<td>'.$langs->trans(
'EnhancedValue').
' '.strtolower($langs->trans(
'TotalWoman'));
695 echo
'<td>'.price(
$object->getValorisationTotale(), 0,
'', 1, -1, -1, $conf->currency).
'</td>';
699 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
705 print
'<div class="clearboth"></div>';
714 if (!empty(
$object->table_element_line)) {
728 if (!empty($conf->use_javascript_ajax) &&
$object->status == 0) {
730 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
770 print
'<div class="div-table-responsive-no-min">';
771 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.(($action !=
'editline') ?
'#addline' :
'#line_'.
GETPOSTINT(
'lineid')).
'" method="POST">
772 <input type="hidden" name="token" value="' .
newToken().
'">
773 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
774 <input type="hidden" name="mode" value="">
775 <input type="hidden" name="id" value="' .
$object->id.
'">
778 print
'<input type="hidden" name="lineid" value="'.$lineid.
'" />';
780 print
'<table id="tablelines" class="liste centpercent">';
785 print
'<tr class="liste_titre">';
786 print
getTitleFieldOfList($langs->trans(
'ProductRef'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'tagtd maxwidthonsmartphone ');
787 if (isModEnabled(
'productbatch')) {
788 print
getTitleFieldOfList($langs->trans(
'Batch'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'tagtd maxwidthonsmartphone ');
790 print
getTitleFieldOfList($langs->trans(
'WarehouseSource'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'tagtd maxwidthonsmartphone ');
791 print
getTitleFieldOfList($langs->trans(
'WarehouseTarget'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'tagtd maxwidthonsmartphone ');
792 print
getTitleFieldOfList($langs->trans(
'Qty'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'center tagtd maxwidthonsmartphone ');
794 print
getTitleFieldOfList($langs->trans(
'Unit'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'tagtd maxwidthonsmartphone ');
796 print
getTitleFieldOfList($langs->trans(
'AverageUnitPricePMPShort'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'center tagtd maxwidthonsmartphone ');
797 print
getTitleFieldOfList($langs->trans(
'EstimatedStockValueShort'), 0, $_SERVER[
"PHP_SELF"],
'', $param,
'',
'', $sortfield, $sortorder,
'center tagtd maxwidthonsmartphone ');
798 if (empty(
$object->status) && $permissiontoadd) {
806 $listofdata =
$object->getLinesArray();
807 $productstatic =
new Product($db);
808 $warehousestatics =
new Entrepot($db);
809 $warehousestatict =
new Entrepot($db);
811 foreach ($listofdata as $key => $line) {
812 $productstatic->fetch($line->fk_product);
813 $warehousestatics->fetch($line->fk_warehouse_source);
814 $warehousestatict->fetch($line->fk_warehouse_destination);
817 $domData =
' data-element="'.$line->element.
'"';
818 $domData .=
' data-id="'.$line->id.
'"';
819 $domData .=
' data-qty="'.$line->qty.
'"';
822 print
'<tr id="row-'.$line->id.
'" class="drag drop oddeven" '.$domData.
'>';
823 print
'<td class="titlefield">';
824 if ($action ===
'editline' && $line->id == $lineid) {
825 $form->select_produits($line->fk_product,
'fk_product',
'', 0, 0, -1, 2,
'', 0, array(), 0, 0, 0,
'minwidth200imp maxwidth300', 1);
827 print $productstatic->getNomUrl(1).
' - '.$productstatic->label;
830 if (isModEnabled(
'productbatch')) {
832 if ($action ===
'editline' && $line->id == $lineid) {
833 print
'<input type="text" value="'.$line->batch.
'" name="batch" class="flat maxwidth50"/>';
836 if ($productlot->fetch(0, $line->fk_product, $line->batch) > 0) {
837 print $productlot->getNomUrl(1);
838 } elseif (!empty($line->batch)) {
839 print $line->batch.
' '.
img_warning($langs->trans(
'BatchNotFound'));
846 print
'<td class="tdoverflowmax150">';
847 if ($action ===
'editline' && $line->id == $lineid) {
848 print $formproduct->selectWarehouses($line->fk_warehouse_source,
'fk_warehouse_source',
'warehouseopen,warehouseinternal', 1, 0, 0,
'', 0, 0, array(),
'minwidth200imp maxwidth200');
850 print $warehousestatics->getNomUrl(1);
855 print
'<td class="tdoverflowmax150">';
856 if ($action ===
'editline' && $line->id == $lineid) {
857 print $formproduct->selectWarehouses($line->fk_warehouse_destination,
'fk_warehouse_destination',
'warehouseopen,warehouseinternal', 1, 0, 0,
'', 0, 0, array(),
'minwidth200imp maxwidth200');
859 print $warehousestatict->getNomUrl(1);
863 if ($action ===
'editline' && $line->id == $lineid) {
864 print
'<td class="center"><input type="text" class="flat maxwidth50" name="qty" value="'.$line->qty.
'"></td>';
866 print
'<td class="center">'.$line->qty.
'</td>';
870 print
'<td class="linecoluseunit nowrap left">';
871 $label = $productstatic->getLabelOfUnit(
'short');
873 print $langs->trans($label);
878 print
'<td class="center">';
879 print
price($line->pmp, 0,
'', 1, -1, -1, $conf->currency);
882 print
'<td class="center">';
883 print
price($line->pmp * $line->qty, 0,
'', 1, -1, -1, $conf->currency);
886 if (empty(
$object->status) && $permissiontoadd) {
887 if ($action ===
'editline' && $line->id == $lineid) {
889 print
'<td class="center valignmiddle" colspan="2"><input type="submit" class="button buttongen marginbottomonly" id="savelinebutton marginbottomonly" name="save" value="'.$langs->trans(
"Save").
'"><br>';
890 print
'<input type="submit" class="button buttongen marginbottomonly" id="cancellinebutton" name="cancel" value="'.$langs->trans(
"Cancel").
'"></td>';
892 print
'<td class="right">';
893 print
'<a class="editfielda reposition" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=editline&lineid=' . $line->id .
'#line_' . $line->id .
'">';
896 print
'<td class="right">';
897 print
'<a href="' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id .
'&action=deleteline&lineid=' . $line->id .
'">' .
img_delete($langs->trans(
"Remove")) .
'</a>';
903 if ($num > 1 && $conf->browser->layout !=
'phone' && empty($disablemove)) {
904 print
'<td class="linecolmove tdlineupdown center">';
906 <a
class=
"lineupdown" href=
"<?php print $_SERVER["PHP_SELF
"].'?id='.$id.'&action=up&rowid='.$line->id; ?>">
907 <?php print
img_up(
'default', 0,
'imgupforline'); ?>
910 if ($i < $num - 1) { ?>
911 <a
class=
"lineupdown" href=
"<?php print $_SERVER["PHP_SELF
"].'?id='.$id.'&action=down&rowid='.$line->id; ?>">
912 <?php print
img_down(
'default', 0,
'imgdownforline'); ?>
917 print
'<td '.(($conf->browser->layout !=
'phone' && empty($disablemove)) ?
' class="linecolmove tdlineupdown center"' :
' class="linecolmove center"').
'></td>';
924 if (empty(
$object->status) && $action !==
'editline' && $permissiontoadd) {
925 print
'<tr class="oddeven">';
927 print
'<td class="titlefield">';
938 $form->select_produits($fk_product,
'fk_product', $filtertype, $limit, 0, -1, 2,
'', 0, array(), 0, 0, 0,
'minwidth200imp maxwidth300', 1);
941 if (isModEnabled(
'productbatch')) {
943 print
'<input type="text" name="batch" class="flat maxwidth50" '.(!empty($error) ?
'value="'.$batch.
'"' :
'').
'>';
947 $formproduct->loadWarehouses();
950 $TExcludedWarehouseSource = array();
951 if (!empty(
$object->fk_warehouse_source)) {
953 $source_ent->fetch(
$object->fk_warehouse_source);
954 foreach ($formproduct->cache_warehouses as $TDataCacheWarehouse) {
955 if (strpos($TDataCacheWarehouse[
'full_label'], $source_ent->label) ===
false) {
956 $TExcludedWarehouseSource[] = $TDataCacheWarehouse[
'id'];
962 $TExcludedWarehouseDestination = array();
963 if (!empty(
$object->fk_warehouse_destination)) {
965 $dest_ent->fetch(
$object->fk_warehouse_destination);
966 foreach ($formproduct->cache_warehouses as $TDataCacheWarehouse) {
967 if (strpos($TDataCacheWarehouse[
'full_label'], $dest_ent->label) ===
false) {
968 $TExcludedWarehouseDestination[] = $TDataCacheWarehouse[
'id'];
974 $formproduct->cache_warehouses = array();
977 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);
981 $formproduct->cache_warehouses = array();
984 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);
988 print
'<td class="center"><input type="text" class="flat maxwidth50" name="qty" '.(!empty($error) ?
'value="'.$qty.
'"' :
'').
'></td>';
1001 print
'<td class="right" colspan="2"><input type="submit" class="button" name="addline" value="' .
dol_escape_htmltag($langs->trans(
'Add')) .
'"></td>';
1015 if ($action !=
'presend' && $action !=
'editline') {
1016 print
'<div class="tabsAction">'.
"\n";
1017 $parameters = array();
1018 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
1023 if (empty($reshook)) {
1025 if (empty($user->socid)) {
1026 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=presend&token='.
newToken().
'&mode=init#formmailbeforetitle');
1030 if (
$object->status == $object::STATUS_VALIDATED) {
1031 print
dolGetButtonAction(
'', $langs->trans(
'SetToDraft'),
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=confirm_setdraft&confirm=yes&token='.
newToken(),
'', $permissiontoadd);
1035 print
dolGetButtonAction(
'', $langs->trans(
'Modify'),
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=edit&token='.
newToken(),
'', $permissiontoadd);
1038 if (
$object->status == $object::STATUS_DRAFT) {
1039 if (empty(
$object->table_element_line) || (is_array(
$object->lines) && count(
$object->lines) > 0)) {
1040 print
dolGetButtonAction(
'', $langs->trans(
'Validate'),
'default', $_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=confirm_validate&confirm=yes&token='.
newToken(),
'', $permissiontoadd);
1042 $langs->load(
"errors");
1043 print
dolGetButtonAction($langs->trans(
"ErrorAddAtLeastOneLineFirst"), $langs->trans(
"Validate"),
'default',
'#',
'', 0);
1045 } elseif (
$object->status == $object::STATUS_VALIDATED && $permissiontoadd) {
1046 print
'<a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=destock&token='.
newToken().
'">'.$langs->trans(
"StockTransferDecrementation").
'</a>';
1047 } elseif (
$object->status == $object::STATUS_TRANSFERED && $permissiontoadd) {
1048 print
'<a class="butActionDelete" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=destockcancel&token='.
newToken().
'">'.$langs->trans(
"StockTransferDecrementationCancel").
'</a>';
1049 print
'<a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=addstock&token='.
newToken().
'">'.$langs->trans(
"StockTransferIncrementation").
'</a>';
1050 } elseif (
$object->status == $object::STATUS_CLOSED && $permissiontoadd) {
1051 print
'<a class="butActionDelete" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=addstockcancel&token='.
newToken().
'">'.$langs->trans(
"StockTransferIncrementationCancel").
'</a>';
1055 if ($permissiontoadd) {
1056 print
dolGetButtonAction(
'', $langs->trans(
'ToClone'),
'default', $_SERVER[
'PHP_SELF'].
'?id='.
$object->id.(!empty(
$object->socid) ?
'&socid='.$object->socid :
'').
'&action=clone&token='.
newToken(),
'', $permissiontoadd);
1078 $deleteUrl = $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete&token='.
newToken();
1079 $buttonId =
'action-delete-no-ajax';
1080 if ($conf->use_javascript_ajax && empty($conf->dol_use_jmobile)) {
1082 $buttonId =
'action-delete';
1085 print
dolGetButtonAction(
'', $langs->trans(
"Delete"),
'delete', $deleteUrl, $buttonId, $permissiontodelete, $params);
1087 print
'</div>'.
"\n";
1092 if (
GETPOST(
'modelselected')) {
1093 $action =
'presend';
1096 if ($action !=
'presend') {
1097 print
'<div class="fichecenter"><div class="fichehalfleft">';
1098 print
'<a name="builddoc"></a>';
1100 $includedocgeneration = 1;
1103 if ($includedocgeneration) {
1105 $relativepath = $objref .
'/' . $objref .
'.pdf';
1106 $filedir = $conf->stocktransfer->dir_output.
'/'.
$object->element.
'/'.$objref;
1107 $urlsource = $_SERVER[
"PHP_SELF"] .
"?id=" .
$object->id;
1108 $genallowed = $permissiontoread;
1109 $delallowed = $permissiontoadd;
1110 print $formfile->showdocuments(
'stocktransfer:StockTransfer',
$object->element.
'/'.$objref, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'',
'',
'', $langs->defaultlang);
1114 $linktoelem = $form->showLinkToObjectBlock($object,
null, array(
'stocktransfer'));
1115 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
1118 print
'</div><div class="fichehalfright">';
1125 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
1127 $somethingshown = $formactions->showactions($object,
'stocktransfer', 0, 1,
'', $MAXEVENT,
'');
1129 print
'</div></div>';
1133 if (
GETPOST(
'modelselected')) {
1134 $action =
'presend';
1138 $modelmail =
'stocktransfer';
1139 $defaulttopic =
'InformationMessage';
1140 $diroutput = $conf->stocktransfer->dir_output;
1141 $trackid =
'stocktransfer'.$object->id;
1143 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()
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.
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)
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.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
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 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.