31require
'../../main.inc.php';
32require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
33require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
34require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/entrepot.class.php';
35require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
36require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/productlot.class.php';
37require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
38require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
39require_once DOL_DOCUMENT_ROOT.
'/core/lib/stock.lib.php';
40require_once DOL_DOCUMENT_ROOT.
'/core/lib/product.lib.php';
41require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
42require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
43if (isModEnabled(
'project')) {
44 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
45 require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
57$langs->loadLangs(array(
'products',
'stocks',
'orders'));
58if (isModEnabled(
'productbatch')) {
59 $langs->load(
"productbatch");
62$action =
GETPOST(
'action',
'aZ09');
63$massaction =
GETPOST(
'massaction',
'alpha');
64$confirm =
GETPOST(
'confirm',
'alpha');
65$cancel =
GETPOST(
'cancel',
'alpha');
66$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') : str_replace(
'_',
'', basename(dirname(__FILE__)).basename(__FILE__,
'.php'));
67$toselect =
GETPOST(
'toselect',
'array');
68$backtopage =
GETPOST(
"backtopage",
"alpha");
69$optioncss =
GETPOST(
'optioncss',
'aZ');
70$show_files =
GETPOST(
'show_files',
'aZ');
76$idproduct =
GETPOST(
'idproduct',
'intcomma');
77$product_id =
GETPOST(
"product_id",
'intcomma');
80$search_all = trim(
GETPOST(
'search_all',
'alphanohtml'));
81$search_date_startday =
GETPOSTINT(
'search_date_startday');
82$search_date_startmonth =
GETPOSTINT(
'search_date_startmonth');
83$search_date_startyear =
GETPOSTINT(
'search_date_startyear');
84$search_date_endday =
GETPOSTINT(
'search_date_endday');
85$search_date_endmonth =
GETPOSTINT(
'search_date_endmonth');
86$search_date_endyear =
GETPOSTINT(
'search_date_endyear');
89$search_ref =
GETPOST(
'search_ref',
'alpha');
90$search_movement =
GETPOST(
"search_movement");
91$search_product_ref = trim(
GETPOST(
"search_product_ref"));
92$search_product = trim(
GETPOST(
"search_product"));
93$search_warehouse = trim(
GETPOST(
"search_warehouse"));
94$search_inventorycode = trim(
GETPOST(
"search_inventorycode"));
95$search_user = trim(
GETPOST(
"search_user"));
96$search_batch = trim(
GETPOST(
"search_batch"));
97$search_qty = trim(
GETPOST(
"search_qty"));
98$search_type_mouvement =
GETPOST(
'search_type_mouvement');
99$search_fk_project =
GETPOST(
"search_fk_project");
105$sortfield =
GETPOST(
'sortfield',
'aZ09comma');
106$sortorder =
GETPOST(
'sortorder',
'aZ09comma');
108if (empty($page) || $page < 0 ||
GETPOST(
'button_search',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
112$offset = $limit * $page;
113$pageprev = $page - 1;
114$pagenext = $page + 1;
117 $sortfield =
"m.datem";
128$diroutputmassaction =
$conf->stock->dir_output.
'/temp/massgeneration/'.$user->id;
129$hookmanager->initHooks(array($contextpage));
134$extrafields->fetch_name_optionals_label(
$object->table_element);
136$search_array_options = $extrafields->getOptionalsFromPost(
$object->table_element,
'',
'search_');
139 'm.rowid' => array(
'label' =>
"Ref",
'checked' => 1,
'position' => 1),
140 'm.datem' => array(
'label' =>
"Date",
'checked' => 1,
'position' => 2),
141 'p.ref' => array(
'label' =>
"ProductRef",
'checked' => 1,
'css' =>
'maxwidth100',
'position' => 3),
142 'p.label' => array(
'label' =>
"ProductLabel",
'checked' => 0,
'position' => 5),
143 'm.batch' => array(
'label' =>
"BatchNumberShort",
'checked' => 1,
'position' => 8,
'enabled' => (isModEnabled(
'productbatch'))),
144 'pl.eatby' => array(
'label' =>
"EatByDate",
'checked' => 0,
'position' => 9,
'enabled' => (isModEnabled(
'productbatch'))),
145 'pl.sellby' => array(
'label' =>
"SellByDate",
'checked' => 0,
'position' => 10,
'enabled' => (isModEnabled(
'productbatch'))),
146 'e.ref' => array(
'label' =>
"Warehouse",
'checked' => 1,
'position' => 100,
'enabled' => (!($id > 0))),
147 'm.fk_user_author' => array(
'label' =>
"Author",
'checked' => 0,
'position' => 120),
148 'm.inventorycode' => array(
'label' =>
"InventoryCodeShort",
'checked' => 1,
'position' => 130),
149 'm.label' => array(
'label' =>
"MovementLabel",
'checked' => 1,
'position' => 140),
150 'm.type_mouvement' => array(
'label' =>
"TypeMovement",
'checked' => 0,
'position' => 150),
151 'origin' => array(
'label' =>
"Origin",
'checked' => 1,
'position' => 155),
152 'm.fk_projet' => array(
'label' =>
'Project',
'checked' => 0,
'position' => 180),
153 'm.value' => array(
'label' =>
"Qty",
'checked' => 1,
'position' => 200),
154 'm.price' => array(
'label' =>
"UnitPurchaseValue",
'checked' => 0,
'position' => 210,
'enabled' => (!
getDolGlobalInt(
'STOCK_MOVEMENT_LIST_HIDE_UNIT_PRICE')))
159include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_array_fields.tpl.php';
162 unset($arrayfields[
'pl.sellby']);
165 unset($arrayfields[
'pl.eatby']);
170if ($id > 0 || !empty($ref)) {
171 $tmpwarehouse->fetch($id, $ref);
172 $id = $tmpwarehouse->id;
181if (!$user->hasRight(
'stock',
'mouvement',
'lire')) {
185$uploaddir =
$conf->stock->dir_output.
'/movements';
187$permissiontoread = $user->hasRight(
'stock',
'mouvement',
'lire');
188$permissiontoadd = $user->hasRight(
'stock',
'mouvement',
'creer');
189$permissiontodelete = $user->hasRight(
'stock',
'mouvement',
'creer');
191$usercanread = $user->hasRight(
'stock',
'mouvement',
'lire');
192$usercancreate = $user->hasRight(
'stock',
'mouvement',
'creer');
193$usercandelete = $user->hasRight(
'stock',
'mouvement',
'creer');
202if (
GETPOST(
'cancel',
'alpha')) {
206if (!
GETPOST(
'confirmmassaction',
'alpha') && $massaction !=
'presend' && $massaction !=
'confirm_presend') {
210$parameters = array();
211$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
216if (empty($reshook)) {
218 include DOL_DOCUMENT_ROOT.
'/core/actions_changeselectedfields.inc.php';
221 if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
222 $search_date_startday =
'';
223 $search_date_startmonth =
'';
224 $search_date_startyear =
'';
225 $search_date_endday =
'';
226 $search_date_endmonth =
'';
227 $search_date_endyear =
'';
228 $search_date_start =
'';
229 $search_date_end =
'';
231 $search_movement =
"";
232 $search_type_mouvement =
"";
233 $search_inventorycode =
"";
234 $search_product_ref =
"";
235 $search_product =
"";
236 $search_warehouse =
"";
240 $search_fk_project =
"";
243 $search_array_options = array();
245 if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')
246 ||
GETPOST(
'button_search_x',
'alpha') ||
GETPOST(
'button_search.x',
'alpha') ||
GETPOST(
'button_search',
'alpha')) {
251 $objectclass =
'MouvementStock';
252 $objectlabel =
'MouvementStock';
254 if (!$error && $massaction ==
"builddoc" && $permissiontoread && !
GETPOST(
'button_search')) {
255 if (empty($diroutputmassaction)) {
256 dol_print_error(
null,
'include of actions_massactions.inc.php is done but var $diroutputmassaction was not defined');
260 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
261 require_once DOL_DOCUMENT_ROOT.
'/core/lib/pdf.lib.php';
262 require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
265 $listofobjectid = array();
266 foreach ($toselect as $toselectid) {
268 $result = $objecttmp->fetch($toselectid);
270 $listofobjectid[$toselectid] = $toselectid;
274 $arrayofinclusion = array();
275 foreach ($listofobjectref as $tmppdf) {
278 foreach ($listofobjectref as $tmppdf) {
279 $arrayofinclusion[] =
'^'.preg_quote(
dol_sanitizeFileName($tmppdf),
'/').
'_[a-zA-Z0-9-_]+\.pdf$';
281 $listoffiles =
dol_dir_list($uploaddir,
'all', 1, implode(
'|', $arrayofinclusion),
'\.meta$|\.png',
'date', SORT_DESC, 0, 1);
284 $outputlangs = $langs;
287 $newlang =
GETPOST(
'lang_id',
'aZ09');
292 if (!empty($newlang)) {
294 $outputlangs->setDefaultLang($newlang);
302 $filename = preg_replace(
'/\s/',
'_', $filename);
314 $file = $diroutputmassaction.
'/'.$filename.
'_'.
dol_print_date($now,
'dayhourlog').
'.pdf';
323 $langs->load(
"exports");
332 include DOL_DOCUMENT_ROOT.
'/core/actions_massactions.inc.php';
335if ($action ==
'update_extras' && $permissiontoadd) {
336 $tmpwarehouse->oldcopy =
dol_clone($tmpwarehouse, 2);
339 $ret = $extrafields->setOptionalsFromPost(
null, $tmpwarehouse,
GETPOST(
'attribute',
'restricthtml'));
344 $result = $tmpwarehouse->insertExtraFields();
351 $action =
'edit_extras';
363if ($action ==
"correct_stock" && $permissiontoadd) {
365 if (!empty($product_id)) {
366 $result = $product->fetch($product_id);
371 if (empty($product_id)) {
373 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Product")),
null,
'errors');
374 $action =
'correction';
376 if (!is_numeric(
GETPOST(
"nbpiece"))) {
378 setEventMessages($langs->trans(
"ErrorFieldMustBeANumeric", $langs->transnoentitiesnoconv(
"NumberOfUnit")),
null,
'errors');
379 $action =
'correction';
383 $origin_element =
'';
387 $origin_element =
'project';
391 if ($product->hasbatch()) {
392 $batch =
GETPOST(
'batch_number',
'alphanohtml');
399 $result = $product->correct_stock_batch(
404 GETPOST(
"label",
'alphanohtml'),
409 GETPOST(
'inventorycode',
'alphanohtml'),
416 $result = $product->correct_stock(
421 GETPOST(
"label",
'alphanohtml'),
423 GETPOST(
'inventorycode',
'alphanohtml'),
432 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
437 $action =
'correction';
447if ($action ==
"transfert_stock" && $permissiontoadd && !$cancel) {
450 if (!empty($product_id)) {
451 $result = $product->fetch($product_id);
454 if (!(
GETPOSTINT(
"id_entrepot_destination") > 0)) {
455 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Warehouse")),
null,
'errors');
457 $action =
'transfert';
459 if (empty($product_id)) {
461 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Product")),
null,
'errors');
462 $action =
'transfert';
465 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"NumberOfUnit")),
null,
'errors');
467 $action =
'transfert';
469 if ($id ==
GETPOSTINT(
"id_entrepot_destination")) {
470 setEventMessages($langs->trans(
"ErrorSrcAndTargetWarehouseMustDiffers"),
null,
'errors');
472 $action =
'transfert';
475 if (isModEnabled(
'productbatch')) {
477 $result = $product->fetch($product_id);
479 if ($product->hasbatch() && !
GETPOST(
"batch_number")) {
480 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"batch_number")),
null,
'errors');
482 $action =
'transfert';
489 $result = $warehouse->fetch($id);
493 $product->load_stock(
'novirtual');
497 if (isset($product->pmp)) {
498 $pricesrc = $product->pmp;
500 $pricedest = $pricesrc;
502 if ($product->hasbatch()) {
509 $result = $pdluo->fetch($pdluoid);
511 $srcwarehouseid = $pdluo->warehouseid;
512 $batch = $pdluo->batch;
513 $eatby = $pdluo->eatby;
514 $sellby = $pdluo->sellby;
520 $srcwarehouseid =
$id;
521 $batch =
GETPOST(
'batch_number',
'alphanohtml');
530 $result1 = $product->correct_stock_batch(
547 $result2 = $product->correct_stock_batch(
557 GETPOST(
'inventorycode',
'alphanohtml'),
566 $result1 = $product->correct_stock(
573 GETPOST(
'inventorycode',
'alphanohtml'),
581 $result2 = $product->correct_stock(
583 GETPOST(
"id_entrepot_destination"),
588 GETPOST(
'inventorycode',
'alphanohtml'),
595 if (!$error && $result1 >= 0 && $result2 >= 0) {
599 header(
"Location: ".$backtopage);
602 header(
"Location: movement_list.php?id=".$warehouse->id);
608 $action =
'transfert';
615if ($action ==
'confirm_reverse' && $confirm ==
"yes" && $permissiontoadd) {
616 $toselect = array_map(
'intval', $toselect);
618 $sql =
"SELECT rowid, label, inventorycode, datem";
619 $sql .=
" FROM ".MAIN_DB_PREFIX.
"stock_mouvement";
620 $sql .=
" WHERE rowid IN (";
621 foreach ($toselect as $id) {
622 $sql .= ((int) $id).
",";
624 $sql = rtrim($sql,
',');
627 $resql = $db->query($sql);
629 $num = $db->num_rows($resql);
634 $obj = $db->fetch_object($resql);
636 $reverse =
$object->reverseMouvement();
645 setEventMessages($langs->trans(
"WarningAlreadyReverse", $langs->transnoentities($idAlreadyReverse)),
null,
'warnings');
650 header(
"Location: ".$_SERVER[
"PHP_SELF"]);
659$form =
new Form($db);
661if (isModEnabled(
'project')) {
667$productstatic =
new Product($db);
668$warehousestatic =
new Entrepot($db);
670$userstatic =
new User($db);
676$sql =
"SELECT p.rowid, p.ref as product_ref, p.label as produit, p.tosell, p.tobuy, p.tobatch, p.fk_product_type as type, p.entity,";
677$sql .=
" e.ref as warehouse_ref, e.rowid as entrepot_id, e.lieu, e.fk_parent, e.statut,";
678$sql .=
" m.rowid as mid, m.value as qty, m.datem, m.fk_user_author, m.label, m.inventorycode, m.fk_origin, m.origintype,";
679$sql .=
" m.batch, m.price,";
680$sql .=
" m.type_mouvement,";
681$sql .=
" m.fk_projet as fk_project,";
682$sql .=
" pl.rowid as lotid, pl.eatby, pl.sellby,";
683$sql .=
" u.login, u.photo, u.lastname, u.firstname, u.email as user_email, u.statut as user_status";
685if (!empty($extrafields->attributes[
$object->table_element][
'label'])) {
686 foreach ($extrafields->attributes[
$object->table_element][
'label'] as $key => $val) {
687 $sql .= ($extrafields->attributes[
$object->table_element][
'type'][$key] !=
'separate' ?
", ef.".$key.
" as options_".$key :
'');
691$parameters = array();
692$reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters, $object, $action);
693$sql .= $hookmanager->resPrint;
694$sql = preg_replace(
'/,\s*$/',
'', $sql);
698$sql .=
" FROM ".MAIN_DB_PREFIX.
"entrepot as e,";
699$sql .=
" ".MAIN_DB_PREFIX.
"product as p,";
700$sql .=
" ".MAIN_DB_PREFIX.
"stock_mouvement as m";
701if (!empty($extrafields->attributes[
$object->table_element][
'label']) && is_array($extrafields->attributes[
$object->table_element][
'label']) && count($extrafields->attributes[
$object->table_element][
'label'])) {
702 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element.
"_extrafields as ef on (m.rowid = ef.fk_object)";
704$sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"user as u ON m.fk_user_author = u.rowid";
705$sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product_lot as pl ON m.batch = pl.batch AND m.fk_product = pl.fk_product";
708$parameters = array();
709$reshook = $hookmanager->executeHooks(
'printFieldListFrom', $parameters, $object, $action);
710$sql .= $hookmanager->resPrint;
712$sql .=
" WHERE m.fk_product = p.rowid";
714 $sql .=
" AND m.rowid = ".((int) $msid);
716$sql .=
" AND m.fk_entrepot = e.rowid";
717$sql .=
" AND e.entity IN (".getEntity(
'stock').
")";
719 $sql .=
" AND p.fk_product_type = 0";
722 $sql .=
" AND e.rowid = ".((int) $id);
724if (!empty($search_date_start)) {
725 $sql .=
" AND m.datem >= '" . $db->idate($search_date_start) .
"'";
727if (!empty($search_date_end)) {
728 $sql .=
" AND m.datem <= '" . $db->idate($search_date_end) .
"'";
731 $sql .=
" AND p.rowid = ".((int) $idproduct);
733if (!empty($search_ref)) {
736if (!empty($search_movement)) {
739if (!empty($search_inventorycode)) {
742if (!empty($search_product_ref)) {
745if (!empty($search_product)) {
748if ($search_warehouse !=
'' && $search_warehouse !=
'-1') {
751if (!empty($search_user)) {
752 $sql .=
natural_search(array(
'u.lastname',
'u.firstname',
'u.login'), $search_user);
754if (!empty($search_batch)) {
757if (!empty($product_id) && $product_id !=
'-1') {
760if (!empty($search_fk_project) && $search_fk_project !=
'-1') {
763if ($search_qty !=
'') {
766if ($search_type_mouvement !=
'' && $search_type_mouvement !=
'-1') {
767 $sql .=
natural_search(
'm.type_mouvement', $search_type_mouvement, 2);
770include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_sql.tpl.php';
772$parameters = array();
773$reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters, $object, $action);
774$sql .= $hookmanager->resPrint;
777$nbtotalofrecords =
'';
780 $sqlforcount = preg_replace(
'/^'.preg_quote($sqlfields,
'/').
'/',
'SELECT COUNT(*) as nbtotalofrecords', $sql);
781 $sqlforcount = preg_replace(
'/GROUP BY .*$/',
'', $sqlforcount);
782 $resql = $db->query($sqlforcount);
784 $objforcount = $db->fetch_object($resql);
785 $nbtotalofrecords = $objforcount->nbtotalofrecords;
790 if (($page * $limit) > $nbtotalofrecords) {
798$sql .= $db->order($sortfield, $sortorder);
800 $sql .= $db->plimit($limit + 1, $offset);
803$resql = $db->query($sql);
809$num = $db->num_rows($resql);
816 $product->fetch($idproduct);
818if ($id > 0 || $ref) {
819 $result = $warehouse->fetch($id, $ref);
830$help_url =
'EN:Module_Stocks_En|FR:Module_Stock|ES:Módulo_Stocks';
832 $title = $langs->trans(
'StockMovementForId', $msid);
834 $title = $langs->trans(
"StockMovements");
836 if (!empty($warehouse->ref)) {
837 $title .=
' ('.$warehouse->ref.
')';
839 $title .=
' ('.$langs->trans(
"ForThisWarehouse").
')';
848llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'bodyforlist mod-product page-stock_movement_list');
853if ($warehouse->id > 0) {
856 print
dol_get_fiche_head($head,
'movements', $langs->trans(
"Warehouse"), -1,
'stock');
859 $linkback =
'<a href="'.DOL_URL_ROOT.
'/product/stock/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
861 $morehtmlref =
'<div class="refidno">';
862 $morehtmlref .= $langs->trans(
"LocationSummary").
' : '.$warehouse->lieu;
865 if (isModEnabled(
'project') && $formproject !==
null) {
866 $langs->load(
"projects");
867 $morehtmlref .=
'<br>'.img_picto(
'',
'project').
' '.$langs->trans(
'Project').
' ';
868 if ($usercancreate && 1 == 2) {
869 if ($action !=
'classify') {
870 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.$warehouse->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> : ';
872 if ($action ==
'classify') {
873 $projectid = $warehouse->fk_project;
874 $morehtmlref .=
'<form method="post" action="'.$_SERVER[
'PHP_SELF'].
'?id='.$warehouse->id.
'">';
875 $morehtmlref .=
'<input type="hidden" name="action" value="classin">';
876 $morehtmlref .=
'<input type="hidden" name="token" value="'.newToken().
'">';
877 $morehtmlref .= $formproject->select_projects(($socid > 0 ? $socid : -1), $projectid,
'projectid', 0, 0, 1, 1, 0, 0, 0,
'', 1, 0,
'maxwidth500');
878 $morehtmlref .=
'<input type="submit" class="button valignmiddle" value="'.$langs->trans(
"Modify").
'">';
879 $morehtmlref .=
'</form>';
881 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.$warehouse->id, $warehouse->socid, $warehouse->fk_project,
'none', 0, 0, 0, 1,
'',
'maxwidth300');
884 if (!empty($warehouse->fk_project)) {
886 $proj->fetch($warehouse->fk_project);
887 $morehtmlref .=
' : '.$proj->getNomUrl(1);
889 $morehtmlref .=
' - '.$proj->title;
896 $morehtmlref .=
'</div>';
899 if ($user->socid && !in_array(
'stock', explode(
',',
getDolGlobalString(
'MAIN_MODULES_FOR_EXTERNAL')))) {
903 dol_banner_tab($warehouse,
'ref', $linkback, $shownav,
'ref',
'ref', $morehtmlref);
906 print
'<div class="fichecenter">';
907 print
'<div class="fichehalfleft">';
908 print
'<div class="underbanner clearboth"></div>';
910 print
'<table class="border centpercent tableforfield">';
915 print
'<td class="titlefield tdtop">'.$langs->trans(
"Description").
'</td><td>'.
dol_htmlentitiesbr($warehouse->description).
'</td></tr>';
917 $calcproductsunique = $warehouse->nb_different_products();
918 $calcproducts = $warehouse->nb_products();
921 print
'<tr><td>'.$langs->trans(
"NumberOfDifferentProducts").
'</td><td>';
922 print empty($calcproductsunique[
'nb']) ?
'0' : $calcproductsunique[
'nb'];
926 print
'<tr><td>'.$langs->trans(
"NumberOfProducts").
'</td><td>';
927 $valtoshow =
price2num($calcproducts[
'nb'],
'MS');
928 print empty($valtoshow) ?
'0' : $valtoshow;
934 print
'<div class="fichehalfright">';
935 print
'<div class="underbanner clearboth"></div>';
937 print
'<table class="border centpercent tableforfield">';
940 print
'<tr><td class="titlefield">'.$langs->trans(
"EstimatedStockValueShort").
'</td><td>';
941 print
price((empty($calcproducts[
'value']) ?
'0' :
price2num($calcproducts[
'value'],
'MT')), 0, $langs, 0, -1, -1,
$conf->currency);
945 $sql =
"SELECT MAX(m.datem) as datem";
946 $sql .=
" FROM ".MAIN_DB_PREFIX.
"stock_mouvement as m";
947 $sql .=
" WHERE m.fk_entrepot = ".((int) $warehouse->id);
948 $resqlbis = $db->query($sql);
950 $lastmovementdate = 0;
952 $objbis = $db->fetch_object($resqlbis);
953 $lastmovementdate = $db->jdate($objbis->datem);
958 print
'<tr><td>'.$langs->trans(
"LastMovement").
'</td><td>';
959 if ($lastmovementdate) {
962 print $langs->trans(
"None");
967 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
970 if (isModEnabled(
'category')) {
971 print
'<tr><td valign="middle">'.$langs->trans(
"Categories").
'</td><td colspan="3">';
972 print $form->showCategories($warehouse->id, Categorie::TYPE_WAREHOUSE, 1);
981 print
'<div class="clearboth"></div>';
988if ($action ==
"correction") {
989 include DOL_DOCUMENT_ROOT.
'/product/stock/tpl/stockcorrection.tpl.php';
994if ($action ==
"transfert") {
995 include DOL_DOCUMENT_ROOT.
'/product/stock/tpl/stocktransfer.tpl.php';
1001if ((empty($action) || $action ==
'list') && $id > 0) {
1002 print
"<div class=\"tabsAction\">\n";
1004 $parameters = array();
1005 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $warehouse, $action);
1007 if (empty($reshook)) {
1008 if ($user->hasRight(
'stock',
'mouvement',
'creer')) {
1009 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$id.
'&action=transfert&token='.
newToken().
'">'.$langs->trans(
"TransferStock").
'</a>';
1012 if ($user->hasRight(
'stock',
'mouvement',
'creer')) {
1013 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$id.
'&action=correction&token='.
newToken().
'">'.$langs->trans(
"CorrectStock").
'</a>';
1020$arrayofselected = is_array($toselect) ? $toselect : array();
1024 $param .=
'&mode='.urlencode($mode);
1026if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
1027 $param .=
'&contextpage='.urlencode($contextpage);
1029if ($limit > 0 && $limit !=
$conf->liste_limit) {
1030 $param .=
'&limit='.((int) $limit);
1033 $param .=
'&id='.urlencode((
string) (
$id));
1036 $param .=
'&show_files='.urlencode((
string) ($show_files));
1038if ($search_date_startday) {
1039 $param .=
'&search_date_startday='.urlencode((
string) ($search_date_startday));
1041if ($search_date_startmonth) {
1042 $param .=
'&search_date_startmonth='.urlencode((
string) ($search_date_startmonth));
1044if ($search_date_startyear) {
1045 $param .=
'&search_date_startyear='.urlencode((
string) ($search_date_startyear));
1047if ($search_date_endday) {
1048 $param .=
'&search_date_endday='.urlencode((
string) ($search_date_endday));
1050if ($search_date_endmonth) {
1051 $param .=
'&search_date_endmonth='.urlencode((
string) ($search_date_endmonth));
1053if ($search_date_endyear) {
1054 $param .=
'&search_date_endyear='.urlencode((
string) ($search_date_endyear));
1056if ($search_movement) {
1057 $param .=
'&search_movement='.urlencode($search_movement);
1059if ($search_inventorycode) {
1060 $param .=
'&search_inventorycode='.urlencode($search_inventorycode);
1062if ($search_type_mouvement) {
1063 $param .=
'&search_type_mouvement='.urlencode($search_type_mouvement);
1065if ($search_product_ref) {
1066 $param .=
'&search_product_ref='.urlencode($search_product_ref);
1068if ($search_product) {
1069 $param .=
'&search_product='.urlencode($search_product);
1072 $param .=
'&search_batch='.urlencode($search_batch);
1074if ($search_warehouse > 0) {
1075 $param .=
'&search_warehouse='.urlencode($search_warehouse);
1078 $param .=
'&search_user='.urlencode($search_user);
1080if ($idproduct > 0) {
1081 $param .=
'&idproduct='.urlencode((
string) ($idproduct));
1083if ($search_fk_project !=
'' && $search_fk_project !=
'-1') {
1084 $param .=
'&search_fk_project='.urlencode((
string) ($search_fk_project));
1087include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_param.tpl.php';
1089$parameters = array(
'param' => &$param);
1090$reshook = $hookmanager->executeHooks(
'printFieldListSearchParam', $parameters, $warehouse, $action);
1091$param .= $hookmanager->resPrint;
1094$arrayofmassactions = array();
1096 $arrayofmassactions[
'builddoc'] =
img_picto(
'',
'pdf',
'class="pictofixedwidth"').$langs->trans(
"GeneratePDF");
1100 $arrayofmassactions[
'predelete'] =
img_picto(
'',
'delete',
'class="pictofixedwidth"').$langs->trans(
"Delete");
1102if (!empty($permissiontoadd)) {
1103 $arrayofmassactions[
'prereverse'] =
img_picto(
'',
'add',
'class="pictofixedwidth"').$langs->trans(
"Reverse");
1105if (
GETPOSTINT(
'nomassaction') || in_array($massaction, array(
'presend',
'predelete',
'prereverse'))) {
1106 $arrayofmassactions = array();
1109$massactionbutton = $form->selectMassAction(
'', $arrayofmassactions);
1111print
'<form method="POST" id="searchFormList" action="'.$_SERVER[
"PHP_SELF"].
'">'.
"\n";
1112if ($optioncss !=
'') {
1113 print
'<input type="hidden" name="optioncss" value="'.$optioncss.
'">';
1115print
'<input type="hidden" name="token" value="'.newToken().
'">';
1116print
'<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1117print
'<input type="hidden" name="action" value="list">';
1118print
'<input type="hidden" name="sortfield" value="'.$sortfield.
'">';
1119print
'<input type="hidden" name="sortorder" value="'.$sortorder.
'">';
1120print
'<input type="hidden" name="type" value="'.$type.
'">';
1121print
'<input type="hidden" name="page" value="'.$page.
'">';
1122print
'<input type="hidden" name="contextpage" value="'.$contextpage.
'">';
1123print
'<input type="hidden" name="page_y" value="">';
1124print
'<input type="hidden" name="mode" value="'.$mode.
'">';
1126 print
'<input type="hidden" name="id" value="'.$id.
'">';
1132print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'movement', 0,
'',
'', $limit, 0, 0, 1);
1135$topicmail =
"SendStockMovement";
1136$modelmail =
"movementstock";
1138$trackid =
'mov'.$warehouse->id;
1139include DOL_DOCUMENT_ROOT.
'/core/tpl/massactions_pre.tpl.php';
1140if ($massaction ==
'prereverse') {
1141 print $form->formconfirm($_SERVER[
"PHP_SELF"], $langs->trans(
"ConfirmMassReverse"), $langs->trans(
"ConfirmMassReverseQuestion", count($toselect)),
"confirm_reverse",
null,
'', 0, 200, 500, 1,
'Yes');
1147 if (!isset($fieldstosearchall) || !is_array($fieldstosearchall)) {
1149 $fieldstosearchall = array();
1151 foreach ($fieldstosearchall as $key => $val) {
1152 $fieldstosearchall[$key] = $langs->trans($val);
1153 $setupstring .= $key.
"=".$val.
";";
1155 print
'<!-- Search done like if STOCK_QUICKSEARCH_ON_FIELDS = '.$setupstring.
' -->'.
"\n";
1156 print
'<div class="divsearchfieldfilter">'.$langs->trans(
"FilterOnInto", $search_all).implode(
', ', $fieldstosearchall).
'</div>'.
"\n";
1161$parameters = array(
'arrayfields' => &$arrayfields);
1162$reshook = $hookmanager->executeHooks(
'printFieldPreListTitle', $parameters, $warehouse, $action);
1163if (empty($reshook)) {
1164 $moreforfilter .= $hookmanager->resPrint;
1166 $moreforfilter = $hookmanager->resPrint;
1169if (!empty($moreforfilter)) {
1170 print
'<div class="liste_titre liste_titre_bydiv centpercent">';
1171 print $moreforfilter;
1175$varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1176$htmlofselectarray = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
getDolGlobalString(
'MAIN_CHECKBOX_LEFT_COLUMN'));
1177$selectedfields = ($mode !=
'kanban' ? $htmlofselectarray :
'');
1178$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons(
'checkforselect', 1) :
'');
1180print
'<div class="div-table-responsive">';
1181print
'<table class="tagtable nobottomiftotal liste'.($moreforfilter ?
" listwithfilterbefore" :
"").
'">'.
"\n";
1185print
'<tr class="liste_titre_filter">';
1188 print
'<td class="liste_titre center maxwidthsearch">';
1189 $searchpicto = $form->showFilterButtons(
'left');
1193if (!empty($arrayfields[
'm.rowid'][
'checked'])) {
1195 print
'<td class="liste_titre left">';
1196 print
'<input class="flat maxwidth40" type="text" name="search_ref" value="'.dol_escape_htmltag($search_ref).
'">';
1199if (!empty($arrayfields[
'm.datem'][
'checked'])) {
1201 print
'<td class="liste_titre center">';
1202 print
'<div class="nowrapfordate">';
1203 print $form->selectDate($search_date_start ? $search_date_start : -1,
'search_date_start', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'From'),
'tzuserrel');
1205 print
'<div class="nowrapfordate">';
1206 print $form->selectDate($search_date_end ? $search_date_end : -1,
'search_date_end', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'to'),
'tzuserrel');
1210if (!empty($arrayfields[
'p.ref'][
'checked'])) {
1212 print
'<td class="liste_titre left">';
1213 print
'<input class="flat maxwidth75" type="text" name="search_product_ref" value="'.dol_escape_htmltag($idproduct ? $product->ref : $search_product_ref).
'">';
1216if (!empty($arrayfields[
'p.label'][
'checked'])) {
1218 print
'<td class="liste_titre left">';
1219 print
'<input class="flat maxwidth100" type="text" name="search_product" value="'.dol_escape_htmltag($idproduct ? $product->label : $search_product).
'">';
1223if (!empty($arrayfields[
'm.batch'][
'checked'])) {
1224 print
'<td class="liste_titre center"><input class="flat maxwidth75" type="text" name="search_batch" value="'.dol_escape_htmltag($search_batch).
'"></td>';
1226if (!empty($arrayfields[
'pl.eatby'][
'checked'])) {
1227 print
'<td class="liste_titre left">';
1230if (!empty($arrayfields[
'pl.sellby'][
'checked'])) {
1231 print
'<td class="liste_titre left">';
1235if (!empty($arrayfields[
'e.ref'][
'checked'])) {
1236 print
'<td class="liste_titre maxwidthonsmartphone left">';
1238 print $formproduct->selectWarehouses($search_warehouse,
'search_warehouse',
'warehouseopen,warehouseinternal', 1, 0, 0,
'', 0, 0, array(),
'maxwidth150');
1241if (!empty($arrayfields[
'm.fk_user_author'][
'checked'])) {
1243 print
'<td class="liste_titre left">';
1244 print
'<input class="flat" type="text" size="6" name="search_user" value="'.dol_escape_htmltag($search_user).
'">';
1247if (!empty($arrayfields[
'm.inventorycode'][
'checked'])) {
1249 print
'<td class="liste_titre left">';
1250 print
'<input class="flat" type="text" size="4" name="search_inventorycode" value="'.dol_escape_htmltag($search_inventorycode).
'">';
1253if (!empty($arrayfields[
'm.label'][
'checked'])) {
1255 print
'<td class="liste_titre left">';
1256 print
'<input class="flat" type="text" size="8" name="search_movement" value="'.dol_escape_htmltag($search_movement).
'">';
1259if (!empty($arrayfields[
'origin'][
'checked'])) {
1261 print
'<td class="liste_titre left">';
1265if (!empty($arrayfields[
'm.fk_projet'][
'checked'])) {
1267 print
'<td class="liste_titre" align="left">';
1268 print $warehouse->showInputField($warehouse->fields[
'fk_project'],
'fk_project', $search_fk_project,
'',
'',
'search_',
'maxwidth125', 1);
1271if (!empty($arrayfields[
'm.type_mouvement'][
'checked'])) {
1273 print
'<td class="liste_titre center">';
1275 print
'<select id="search_type_mouvement" name="search_type_mouvement" class="maxwidth150">';
1276 print
'<option value="" '.(($search_type_mouvement ==
"") ?
'selected="selected"' :
'').
'> </option>';
1277 print
'<option value="0" '.(($search_type_mouvement ==
"0") ?
'selected="selected"' :
'').
'>'.$langs->trans(
'StockIncreaseAfterCorrectTransfer').
'</option>';
1278 print
'<option value="1" '.(($search_type_mouvement ==
"1") ?
'selected="selected"' :
'').
'>'.$langs->trans(
'StockDecreaseAfterCorrectTransfer').
'</option>';
1279 print
'<option value="2" '.(($search_type_mouvement ==
"2") ?
'selected="selected"' :
'').
'>'.$langs->trans(
'StockDecrease').
'</option>';
1280 print
'<option value="3" '.(($search_type_mouvement ==
"3") ?
'selected="selected"' :
'').
'>'.$langs->trans(
'StockIncrease').
'</option>';
1287if (!empty($arrayfields[
'm.value'][
'checked'])) {
1289 print
'<td class="liste_titre right">';
1290 print
'<input class="flat width50 right" type="text" name="search_qty" value="'.dol_escape_htmltag($search_qty).
'">';
1293if (!empty($arrayfields[
'm.price'][
'checked'])) {
1295 print
'<td class="liste_titre" align="left">';
1301include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_input.tpl.php';
1304$parameters = array(
'arrayfields' => $arrayfields);
1305$reshook = $hookmanager->executeHooks(
'printFieldListOption', $parameters, $warehouse, $action);
1306print $hookmanager->resPrint;
1308if (!empty($arrayfields[
'm.datec'][
'checked'])) {
1309 print
'<td class="liste_titre">';
1313if (!empty($arrayfields[
'm.tms'][
'checked'])) {
1314 print
'<td class="liste_titre">';
1319 print
'<td class="liste_titre center maxwidthsearch">';
1320 $searchpicto = $form->showFilterButtons();
1326$totalarray = array();
1327$totalarray[
'nbfield'] = 0;
1331print
'<tr class="liste_titre">';
1334 print
getTitleFieldOfList($selectedfields, 0, $_SERVER[
"PHP_SELF"],
'',
'',
'',
'', $sortfield, $sortorder,
'center maxwidthsearch ').
"\n";
1335 $totalarray[
'nbfield']++;
1337if (!empty($arrayfields[
'm.rowid'][
'checked'])) {
1338 print_liste_field_titre($arrayfields[
'm.rowid'][
'label'], $_SERVER[
"PHP_SELF"],
'm.rowid',
'', $param,
'', $sortfield, $sortorder);
1340if (!empty($arrayfields[
'm.datem'][
'checked'])) {
1341 print_liste_field_titre($arrayfields[
'm.datem'][
'label'], $_SERVER[
"PHP_SELF"],
'm.datem',
'', $param,
'', $sortfield, $sortorder,
'center ');
1343if (!empty($arrayfields[
'p.ref'][
'checked'])) {
1344 print_liste_field_titre($arrayfields[
'p.ref'][
'label'], $_SERVER[
"PHP_SELF"],
'p.ref',
'', $param,
'', $sortfield, $sortorder);
1346if (!empty($arrayfields[
'p.label'][
'checked'])) {
1347 print_liste_field_titre($arrayfields[
'p.label'][
'label'], $_SERVER[
"PHP_SELF"],
'p.label',
'', $param,
'', $sortfield, $sortorder);
1349if (!empty($arrayfields[
'm.batch'][
'checked'])) {
1350 print_liste_field_titre($arrayfields[
'm.batch'][
'label'], $_SERVER[
"PHP_SELF"],
'm.batch',
'', $param,
'', $sortfield, $sortorder,
'center ');
1352if (!empty($arrayfields[
'pl.eatby'][
'checked'])) {
1353 print_liste_field_titre($arrayfields[
'pl.eatby'][
'label'], $_SERVER[
"PHP_SELF"],
'pl.eatby',
'', $param,
'', $sortfield, $sortorder,
'center ');
1355if (!empty($arrayfields[
'pl.sellby'][
'checked'])) {
1356 print_liste_field_titre($arrayfields[
'pl.sellby'][
'label'], $_SERVER[
"PHP_SELF"],
'pl.sellby',
'', $param,
'', $sortfield, $sortorder,
'center ');
1358if (!empty($arrayfields[
'e.ref'][
'checked'])) {
1360 print_liste_field_titre($arrayfields[
'e.ref'][
'label'], $_SERVER[
"PHP_SELF"],
"e.ref",
"", $param,
"", $sortfield, $sortorder);
1362if (!empty($arrayfields[
'm.fk_user_author'][
'checked'])) {
1363 print_liste_field_titre($arrayfields[
'm.fk_user_author'][
'label'], $_SERVER[
"PHP_SELF"],
"m.fk_user_author",
"", $param,
"", $sortfield, $sortorder);
1365if (!empty($arrayfields[
'm.inventorycode'][
'checked'])) {
1366 print_liste_field_titre($arrayfields[
'm.inventorycode'][
'label'], $_SERVER[
"PHP_SELF"],
"m.inventorycode",
"", $param,
"", $sortfield, $sortorder);
1368if (!empty($arrayfields[
'm.label'][
'checked'])) {
1369 print_liste_field_titre($arrayfields[
'm.label'][
'label'], $_SERVER[
"PHP_SELF"],
"m.label",
"", $param,
"", $sortfield, $sortorder);
1371if (!empty($arrayfields[
'origin'][
'checked'])) {
1372 print_liste_field_titre($arrayfields[
'origin'][
'label'], $_SERVER[
"PHP_SELF"],
"",
"", $param,
"", $sortfield, $sortorder);
1374if (!empty($arrayfields[
'm.fk_projet'][
'checked'])) {
1375 print_liste_field_titre($arrayfields[
'm.fk_projet'][
'label'], $_SERVER[
"PHP_SELF"],
"m.fk_projet",
"", $param,
'', $sortfield, $sortorder);
1377if (!empty($arrayfields[
'm.type_mouvement'][
'checked'])) {
1378 print_liste_field_titre($arrayfields[
'm.type_mouvement'][
'label'], $_SERVER[
"PHP_SELF"],
"m.type_mouvement",
"", $param,
'', $sortfield, $sortorder,
'center ');
1380if (!empty($arrayfields[
'm.value'][
'checked'])) {
1381 print_liste_field_titre($arrayfields[
'm.value'][
'label'], $_SERVER[
"PHP_SELF"],
"m.value",
"", $param,
'', $sortfield, $sortorder,
'right ');
1383if (!empty($arrayfields[
'm.price'][
'checked'])) {
1384 print_liste_field_titre($arrayfields[
'm.price'][
'label'], $_SERVER[
"PHP_SELF"],
"m.price",
"", $param,
'', $sortfield, $sortorder,
'right ');
1388include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_title.tpl.php';
1391$parameters = array(
'arrayfields' => $arrayfields,
'param' => $param,
'sortfield' => $sortfield,
'sortorder' => $sortorder,
'totalarray' => &$totalarray);
1392$reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $warehouse, $action);
1393print $hookmanager->resPrint;
1394if (!empty($arrayfields[
'm.datec'][
'checked'])) {
1395 print_liste_field_titre($arrayfields[
'm.datec'][
'label'], $_SERVER[
"PHP_SELF"],
"m.datec",
"", $param,
'', $sortfield, $sortorder,
'center nowrap ');
1397if (!empty($arrayfields[
'm.tms'][
'checked'])) {
1398 print_liste_field_titre($arrayfields[
'm.tms'][
'label'], $_SERVER[
"PHP_SELF"],
"m.tms",
"", $param,
'', $sortfield, $sortorder,
'center nowrap ');
1402 print
getTitleFieldOfList($selectedfields, 0, $_SERVER[
"PHP_SELF"],
'',
'',
'',
'', $sortfield, $sortorder,
'center maxwidthsearch ').
"\n";
1403 $totalarray[
'nbfield']++;
1408$arrayofuniqueproduct = array();
1414$savnbfield = $totalarray[
'nbfield'];
1415$totalarray = array();
1416$totalarray[
'nbfield'] = 0;
1417$imaxinloop = ($limit ? min($num, $limit) : $num);
1418while ($i < $imaxinloop) {
1419 $obj = $db->fetch_object($resql);
1424 $userstatic->id = $obj->fk_user_author;
1425 $userstatic->login = $obj->login;
1426 $userstatic->lastname = $obj->lastname;
1427 $userstatic->firstname = $obj->firstname;
1428 $userstatic->photo = $obj->photo;
1429 $userstatic->email = $obj->user_email;
1430 $userstatic->status = $obj->user_status;
1435 $sql =
"SELECT label";
1436 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product_lang";
1437 $sql .=
" WHERE fk_product = ".((int) $obj->rowid);
1438 $sql .=
" AND lang = '".$db->escape($langs->getDefaultLang()).
"'";
1441 $result = $db->query($sql);
1443 $objtp = $db->fetch_object($result);
1444 if (!empty($objtp->label)) {
1445 $obj->produit = $objtp->label;
1450 $productstatic->id = $obj->rowid;
1451 $productstatic->ref = $obj->product_ref;
1452 $productstatic->label = $obj->produit;
1453 $productstatic->type = $obj->type;
1454 $productstatic->entity = $obj->entity;
1455 $productstatic->status = $obj->tosell;
1456 $productstatic->status_buy = $obj->tobuy;
1457 $productstatic->status_batch = $obj->tobatch;
1459 $productlot->id = $obj->lotid;
1460 $productlot->batch = $obj->batch;
1461 $productlot->eatby = $obj->eatby;
1462 $productlot->sellby = $obj->sellby;
1464 $warehousestatic->id = $obj->entrepot_id;
1465 $warehousestatic->ref = $obj->warehouse_ref;
1466 $warehousestatic->label = $obj->warehouse_ref;
1467 $warehousestatic->lieu = $obj->lieu;
1468 $warehousestatic->fk_parent = $obj->fk_parent;
1469 $warehousestatic->statut = $obj->statut;
1475 $object->warehouse_id = $obj->entrepot_id;
1476 $object->type = $obj->type_mouvement;
1478 $arrayofuniqueproduct[$obj->rowid] = $obj->produit;
1479 if (!empty($obj->fk_origin)) {
1480 $origin =
$object->get_origin($obj->fk_origin, $obj->origintype);
1485 if ($mode ==
'kanban') {
1487 print
'<tr class="trkanban"><td colspan="'.$savnbfield.
'">';
1488 print
'<div class="box-flex-container kanban">';
1492 if ($massactionbutton || $massaction) {
1494 if (in_array($warehouse->id, $arrayofselected)) {
1498 print $warehouse->getKanbanView(
'', array(
'selected' => $selected));
1499 if ($i == ($imaxinloop - 1)) {
1506 print
'<tr data-rowid="'.$warehouse->id.
'" class="oddeven">';
1509 print
'<td class="nowrap center">';
1510 if ($massactionbutton || $massaction) {
1512 if (in_array($obj->mid, $arrayofselected)) {
1515 print
'<input id="cb'.$obj->mid.
'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->mid.
'"'.($selected ?
' checked="checked"' :
'').
'>';
1519 $totalarray[
'nbfield']++;
1523 if (!empty($arrayfields[
'm.rowid'][
'checked'])) {
1524 print
'<td class="nowraponall">';
1531 if (!empty($arrayfields[
'm.datem'][
'checked'])) {
1532 print
'<td class="nowraponall center">'.dol_print_date($db->jdate($obj->datem),
'dayhour',
'tzuserrel').
'</td>';
1535 if (!empty($arrayfields[
'p.ref'][
'checked'])) {
1536 print
'<td class="nowraponall">';
1537 print $productstatic->getNomUrl(1,
'stock', 16);
1541 if (!empty($arrayfields[
'p.label'][
'checked'])) {
1542 print
'<td class="tdoverflowmax150" title="'.dol_escape_htmltag($productstatic->label).
'">';
1543 print $productstatic->label;
1547 if (!empty($arrayfields[
'm.batch'][
'checked'])) {
1548 print
'<td class="center nowraponall">';
1549 if ($productlot->id > 0) {
1550 print $productlot->getNomUrl(1);
1552 print $productlot->batch;
1557 if (!empty($arrayfields[
'pl.eatby'][
'checked'])) {
1558 print
'<td class="center">'.dol_print_date($obj->eatby,
'day').
'</td>';
1561 if (!empty($arrayfields[
'pl.sellby'][
'checked'])) {
1562 print
'<td class="center">'.dol_print_date($obj->sellby,
'day').
'</td>';
1565 if (!empty($arrayfields[
'e.ref'][
'checked'])) {
1566 print
'<td class="tdoverflowmax150">';
1567 print $warehousestatic->getNomUrl(1);
1571 if (!empty($arrayfields[
'm.fk_user_author'][
'checked'])) {
1572 print
'<td class="tdoverflowmax100">';
1573 print $userstatic->getNomUrl(-1);
1577 if (!empty($arrayfields[
'm.inventorycode'][
'checked'])) {
1578 print
'<td class="tdoverflowmax150" title="'.dolPrintHTML($obj->inventorycode).
'">';
1579 if ($obj->inventorycode) {
1580 print
img_picto(
'',
'movement',
'class="pictofixedwidth"');
1581 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?search_inventorycode='.urlencode(
'^'.$obj->inventorycode.
'$').
'">'.
dol_escape_htmltag($obj->inventorycode).
'</a>';
1586 if (!empty($arrayfields[
'm.label'][
'checked'])) {
1587 print
'<td class="tdoverflowmax200" title="'.dol_escape_htmltag($obj->label).
'">'.
dol_escape_htmltag($obj->label).
'</td>';
1590 if (!empty($arrayfields[
'origin'][
'checked'])) {
1591 print
'<td class="nowraponall">'.$origin.
'</td>';
1594 if (!empty($arrayfields[
'm.fk_projet'][
'checked'])) {
1596 if ($obj->fk_project != 0) {
1597 print
$object->get_origin($obj->fk_project,
'project');
1602 if (!empty($arrayfields[
'm.type_mouvement'][
'checked'])) {
1603 print
'<td class="center">';
1604 print
$object->getTypeMovement();
1608 if (!empty($arrayfields[
'm.value'][
'checked'])) {
1609 print
'<td class="right">';
1610 if ($obj->qty > 0) {
1611 print
'<span class="stockmovemententry">';
1616 print
'<span class="stockmovementexit">';
1623 if (!empty($arrayfields[
'm.price'][
'checked'])) {
1624 print
'<td class="right">';
1625 if ($obj->price != 0) {
1626 print
price($obj->price);
1632 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_print_fields.tpl.php';
1634 $parameters = array(
'arrayfields' => $arrayfields,
'object' => $object,
'obj' => $obj,
'i' => $i,
'totalarray' => &$totalarray);
1635 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
1636 print $hookmanager->resPrint;
1640 print
'<td class="nowrap center">';
1641 if ($massactionbutton || $massaction) {
1643 if (in_array($obj->mid, $arrayofselected)) {
1646 print
'<input id="cb'.$obj->mid.
'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->mid.
'"'.($selected ?
' checked="checked"' :
'').
'>';
1650 $totalarray[
'nbfield']++;
1663 foreach ($arrayfields as $key => $val) {
1664 if (!empty($val[
'checked'])) {
1668 print
'<tr><td colspan="'.$colspan.
'"><span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span></td></tr>';
1673$parameters = array(
'arrayfields' => $arrayfields,
'sql' => $sql);
1674$reshook = $hookmanager->executeHooks(
'printFieldListFooter', $parameters, $object, $action);
1675print $hookmanager->resPrint;
1677print
'</table>'.
"\n";
1680print
'</form>'.
"\n";
1683if (count($arrayofuniqueproduct) == 1 && !empty($year) && is_numeric($year)) {
1686 $productidselected = 0;
1687 foreach ($arrayofuniqueproduct as $key => $val) {
1688 $productidselected = $key;
1689 $productlabelselected = $val;
1693 $balancebefore =
$object->calculateBalanceForProductBefore($productidselected, $datebefore);
1694 $balanceafter =
$object->calculateBalanceForProductBefore($productidselected, $dateafter);
1697 print $langs->trans(
"NbOfProductBeforePeriod", $productlabelselected,
dol_print_date($datebefore,
'day',
'gmt'));
1700 print
': '.$balancebefore;
1704 print $langs->trans(
"NbOfProductAfterPeriod", $productlabelselected,
dol_print_date($dateafter,
'day',
'gmt'));
1707 print
': '.$balanceafter;
1712if (in_array(
'builddoc', array_keys($arrayofmassactions)) && ($nbtotalofrecords ===
'' || $nbtotalofrecords)) {
1713 $hidegeneratedfilelistifempty = 1;
1714 if ($massaction ==
'builddoc' || $action ==
'remove_file' || $show_files) {
1715 $hidegeneratedfilelistifempty = 0;
1718 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
1722 $urlsource = $_SERVER[
'PHP_SELF'].
'?sortfield='.$sortfield.
'&sortorder='.$sortorder;
1723 $urlsource .= str_replace(
'&',
'&', $param);
1725 $filedir = $diroutputmassaction;
1726 $genallowed = $permissiontoread;
1727 $delallowed = $permissiontoadd;
1729 print $formfile->showdocuments(
'massfilesarea_stock',
'', $filedir, $urlsource, 0, $delallowed,
'', 1, 1, 0, 48, 1, $param, $title,
'',
'',
'',
null, $hidegeneratedfilelistifempty);
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
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.
Class to manage stock movements.
Class to manage products or services.
Manage record for batch number management.
Class with list of lots and properties.
Class to manage projects.
Class to manage translations.
Class to manage Dolibarr users.
dol_get_first_day($year, $month=1, $gm=false)
Return GMT time for first day of a month or year.
dol_get_last_day($year, $month=12, $gm=false)
Return GMT time for last day of a month or year.
dol_dir_list($utf8_path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
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.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
natural_search($fields, $value, $mode=0, $nofirstand=0)
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
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'.
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
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_clone($object, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
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...
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.
stock_prepare_head($object)
Prepare array with list of tabs.