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';
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'));
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:int');
68$backtopage =
GETPOST(
"backtopage",
"alpha");
69$optioncss =
GETPOST(
'optioncss',
'aZ');
70$show_files =
GETPOST(
'show_files',
'aZ');
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' => (
string) (
int) (
isModEnabled(
'productbatch'))),
144 'pl.eatby' => array(
'label' =>
"EatByDate",
'checked' =>
'0',
'position' => 9,
'enabled' => (
string) (
int) (
isModEnabled(
'productbatch'))),
145 'pl.sellby' => array(
'label' =>
"SellByDate",
'checked' =>
'0',
'position' => 10,
'enabled' => (
string) (
int) (
isModEnabled(
'productbatch'))),
146 'e.ref' => array(
'label' =>
"Warehouse",
'checked' =>
'1',
'position' => 100,
'enabled' => (
string) (
int) (!($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' => (
string) (
int) (!
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']);
169 $usercanreadsupplierprice =
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') ? $user->hasRight(
'product',
'product_advance',
'read_supplier_prices') : $user->hasRight(
'product',
'lire');
171 $usercanreadsupplierprice = $user->hasRight(
'product',
'product_advance',
'read_supplier_prices') || $user->hasRight(
'product',
'service_advance',
'read_supplier_prices');
173 $usercanreadsupplierprice = $user->hasRight(
'product',
'lire') || $user->hasRight(
'service',
'lire');
176if (!$usercanreadsupplierprice) {
177 unset($arrayfields[
'm.price']);
181if ($id > 0 || !empty($ref)) {
182 $tmpwarehouse->fetch($id, $ref);
183 $id = $tmpwarehouse->id;
187if ($user->socid > 0) {
188 $socid = $user->socid;
196if (!$user->hasRight(
'stock',
'mouvement',
'lire')) {
200$uploaddir =
$conf->stock->dir_output.
'/movements';
202$permissiontoread = $user->hasRight(
'stock',
'mouvement',
'lire');
203$permissiontoadd = $user->hasRight(
'stock',
'mouvement',
'creer');
204$permissiontodelete = $user->hasRight(
'stock',
'mouvement',
'creer');
205$permissiontoeditextra = $permissiontoadd;
206if (
GETPOST(
'attribute',
'aZ09') && isset($extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')])) {
208 $permissiontoeditextra =
dol_eval((
string) $extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')]);
211$usercanread = $user->hasRight(
'stock',
'mouvement',
'lire');
212$usercancreate = $user->hasRight(
'stock',
'mouvement',
'creer');
213$usercandelete = $user->hasRight(
'stock',
'mouvement',
'creer');
222if (
GETPOST(
'cancel',
'alpha')) {
226if (!
GETPOST(
'confirmmassaction',
'alpha') && $massaction !=
'presend' && $massaction !=
'confirm_presend') {
230$parameters = array();
231$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
236if (empty($reshook)) {
238 include DOL_DOCUMENT_ROOT.
'/core/actions_changeselectedfields.inc.php';
241 if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
242 $search_date_startday =
'';
243 $search_date_startmonth =
'';
244 $search_date_startyear =
'';
245 $search_date_endday =
'';
246 $search_date_endmonth =
'';
247 $search_date_endyear =
'';
248 $search_date_start =
'';
249 $search_date_end =
'';
251 $search_movement =
"";
252 $search_type_mouvement =
"";
253 $search_inventorycode =
"";
254 $search_product_ref =
"";
255 $search_product =
"";
256 $search_warehouse =
"";
260 $search_fk_project =
"";
263 $search_array_options = array();
265 if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')
266 ||
GETPOST(
'button_search_x',
'alpha') ||
GETPOST(
'button_search.x',
'alpha') ||
GETPOST(
'button_search',
'alpha')) {
268 if ($action ==
'confirm_reverse') {
274 $objectclass =
'MouvementStock';
275 $objectlabel =
'MouvementStock';
277 if (!$error && $massaction ==
"builddoc" && $permissiontoread && !
GETPOST(
'button_search')) {
278 if (empty($diroutputmassaction)) {
279 dol_print_error(
null,
'include of actions_massactions.inc.php is done but var $diroutputmassaction was not defined');
283 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
284 require_once DOL_DOCUMENT_ROOT.
'/core/lib/pdf.lib.php';
285 require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
288 $listofobjectids = array();
289 foreach ($toselect as $toselectid) {
291 $result = $objecttmp->fetch($toselectid);
293 $listofobjectids[$toselectid] = $toselectid;
297 $arrayofinclusion = array();
298 foreach ($listofobjectids as $tmppdf) {
301 foreach ($listofobjectids as $tmppdf) {
302 $arrayofinclusion[] =
'^'.preg_quote(
dol_sanitizeFileName($tmppdf),
'/').
'_[a-zA-Z0-9-_]+\.pdf$';
304 $listoffiles =
dol_dir_list($uploaddir,
'all', 1, implode(
'|', $arrayofinclusion),
'\.meta$|\.png',
'date', SORT_DESC, 0, 1);
307 $outputlangs = $langs;
310 $newlang =
GETPOST(
'lang_id',
'aZ09');
315 if (!empty($newlang)) {
317 $outputlangs->setDefaultLang($newlang);
325 $filename = preg_replace(
'/\s/',
'_', $filename);
337 $file = $diroutputmassaction.
'/'.$filename.
'_'.
dol_print_date($now,
'dayhourlog').
'.pdf';
346 $langs->load(
"exports");
355 include DOL_DOCUMENT_ROOT.
'/core/actions_massactions.inc.php';
358if ($action ==
'update_extras' && $permissiontoeditextra) {
359 $tmpwarehouse->oldcopy =
dol_clone($tmpwarehouse, 2);
361 $attribute_name =
GETPOST(
'attribute',
'aZ09');
364 $ret = $extrafields->setOptionalsFromPost(
null, $tmpwarehouse, $attribute_name);
370 $result = $tmpwarehouse->updateExtraField($attribute_name,
'CONTRACT_MODIFY');
378 $action =
'edit_extras';
390if ($action ==
"correct_stock" && $permissiontoadd) {
392 if (!empty($product_id)) {
393 $result = $product->fetch($product_id);
398 if (empty($product_id)) {
400 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Product")),
null,
'errors');
401 $action =
'correction';
405 setEventMessages($langs->trans(
"ErrorFieldMustBeANumeric", $langs->transnoentitiesnoconv(
"NumberOfUnit")),
null,
'errors');
406 $action =
'correction';
410 $origin_element =
'';
414 $origin_element =
'project';
418 if ($product->hasbatch()) {
419 $batch =
GETPOST(
'batch_number',
'alphanohtml');
424 $result = $product->correct_stock_batch(
429 GETPOST(
"label",
'alphanohtml'),
434 GETPOST(
'inventorycode',
'alphanohtml'),
441 $result = $product->correct_stock(
446 GETPOST(
"label",
'alphanohtml'),
448 GETPOST(
'inventorycode',
'alphanohtml'),
457 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
462 $action =
'correction';
472if ($action ==
"transfert_stock" && $permissiontoadd && !$cancel) {
475 if (!empty($product_id)) {
476 $result = $product->fetch($product_id);
479 if (!(
GETPOSTINT(
"id_entrepot_destination") > 0)) {
480 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Warehouse")),
null,
'errors');
482 $action =
'transfer';
484 if (empty($product_id)) {
486 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Product")),
null,
'errors');
487 $action =
'transfer';
490 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"NumberOfUnit")),
null,
'errors');
492 $action =
'transfer';
494 if ($id ==
GETPOSTINT(
"id_entrepot_destination")) {
495 setEventMessages($langs->trans(
"ErrorSrcAndTargetWarehouseMustDiffers"),
null,
'errors');
497 $action =
'transfer';
502 $result = $product->fetch($product_id);
504 if ($product->hasbatch() && !
GETPOST(
"batch_number")) {
505 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"batch_number")),
null,
'errors');
507 $action =
'transfer';
514 $result = $warehouse->fetch($id);
518 $product->load_stock(
'novirtual');
522 if (isset($product->pmp)) {
523 $pricesrc = $product->pmp;
525 $pricedest = $pricesrc;
527 if ($product->hasbatch()) {
535 $result = $pdluo->fetch($pdluoid);
537 $srcwarehouseid = $pdluo->warehouseid;
538 $batch = $pdluo->batch;
544 $srcwarehouseid =
$id;
545 $batch =
GETPOST(
'batch_number',
'alphanohtml');
552 $result1 = $product->correct_stock_batch(
569 $result2 = $product->correct_stock_batch(
579 GETPOST(
'inventorycode',
'alphanohtml'),
588 $result1 = $product->correct_stock(
593 GETPOST(
"label",
'alphanohtml'),
595 GETPOST(
'inventorycode',
'alphanohtml'),
603 $result2 = $product->correct_stock(
608 GETPOST(
"label",
'alphanohtml'),
610 GETPOST(
'inventorycode',
'alphanohtml'),
617 if (!$error && $result1 >= 0 && $result2 >= 0) {
621 header(
"Location: ".$backtopage);
624 header(
"Location: movement_list.php?id=".$warehouse->id);
630 $action =
'transfer';
637if (!$error && $action ==
'confirm_reverse' && $confirm ==
"yes" && $permissiontoadd) {
638 $toselect = array_map(
'intval', $toselect);
643 $sql =
"SELECT rowid, label, inventorycode, datem";
644 $sql .=
" FROM ".MAIN_DB_PREFIX.
"stock_mouvement";
645 $sql .=
" WHERE rowid IN (".$db->sanitize(implode(
',', $toselect)).
")";
647 $resql =
$db->query($sql);
649 $num =
$db->num_rows($resql);
652 $obj =
$db->fetch_object($resql);
660 $reverse =
$object->reverseMovement();
680 header(
"Location: ".$_SERVER[
"PHP_SELF"]);
705$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,";
706$sql .=
" e.ref as warehouse_ref, e.rowid as entrepot_id, e.lieu, e.fk_parent, e.statut,";
707$sql .=
" m.rowid as mid, m.value as qty, m.datem, m.fk_user_author, m.label, m.inventorycode, m.fk_origin, m.origintype,";
708$sql .=
" m.batch, m.price,";
709$sql .=
" m.type_mouvement,";
710$sql .=
" m.fk_projet as fk_project,";
711$sql .=
" pl.rowid as lotid, pl.eatby, pl.sellby,";
712$sql .=
" u.login, u.photo, u.lastname, u.firstname, u.email as user_email, u.statut as user_status";
714if (!empty($extrafields->attributes[
$object->table_element][
'label'])) {
715 foreach ($extrafields->attributes[
$object->table_element][
'label'] as $key => $val) {
716 $sql .= ($extrafields->attributes[
$object->table_element][
'type'][$key] !=
'separate' ?
", ef.".$key.
" as options_".$key :
'');
720$parameters = array();
721$reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters, $object, $action);
722$sql .= $hookmanager->resPrint;
723$sql = preg_replace(
'/,\s*$/',
'', $sql);
727$sql .=
" FROM ".MAIN_DB_PREFIX.
"entrepot as e,";
728$sql .=
" ".MAIN_DB_PREFIX.
"product as p,";
729$sql .=
" ".MAIN_DB_PREFIX.
"stock_mouvement as m";
730if (!empty($extrafields->attributes[
$object->table_element][
'label']) && is_array($extrafields->attributes[
$object->table_element][
'label']) && count($extrafields->attributes[
$object->table_element][
'label'])) {
731 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element.
"_extrafields as ef on (m.rowid = ef.fk_object)";
733$sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"user as u ON m.fk_user_author = u.rowid";
734$sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product_lot as pl ON m.batch = pl.batch AND m.fk_product = pl.fk_product";
737$parameters = array();
738$reshook = $hookmanager->executeHooks(
'printFieldListFrom', $parameters, $object, $action);
739$sql .= $hookmanager->resPrint;
741$sql .=
" WHERE m.fk_product = p.rowid";
743 $sql .=
" AND m.rowid = ".((int) $msid);
745$sql .=
" AND m.fk_entrepot = e.rowid";
746$sql .=
" AND e.entity IN (".getEntity(
'stock').
")";
748 $sql .=
" AND p.fk_product_type = 0";
751 $sql .=
" AND e.rowid = ".((int) $id);
753if (!empty($search_date_start)) {
754 $sql .=
" AND m.datem >= '" .
$db->idate($search_date_start) .
"'";
756if (!empty($search_date_end)) {
757 $sql .=
" AND m.datem <= '" .
$db->idate($search_date_end) .
"'";
760 $sql .=
" AND p.rowid = ".((int) $idproduct);
762if (!empty($search_ref)) {
765if (!empty($search_movement)) {
768if (!empty($search_inventorycode)) {
771if (!empty($search_product_ref)) {
774if (!empty($search_product)) {
777if ($search_warehouse !=
'' && $search_warehouse !=
'-1') {
780if (!empty($search_user)) {
781 $sql .=
natural_search(array(
'u.lastname',
'u.firstname',
'u.login'), $search_user);
783if (!empty($search_batch)) {
786if (!empty($product_id) && $product_id !=
'-1') {
789if (!empty($search_fk_project) && $search_fk_project !=
'-1') {
792if ($search_qty !=
'') {
795if ($search_type_mouvement !=
'' && $search_type_mouvement !=
'-1') {
796 $sql .=
natural_search(
'm.type_mouvement', $search_type_mouvement, 2);
799include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_sql.tpl.php';
801$parameters = array();
802$reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters, $object, $action);
803$sql .= $hookmanager->resPrint;
806$nbtotalofrecords =
'';
809 $sqlforcount = preg_replace(
'/^'.preg_quote($sqlfields,
'/').
'/',
'SELECT COUNT(*) as nbtotalofrecords', $sql);
810 $sqlforcount = preg_replace(
'/GROUP BY .*$/',
'', $sqlforcount);
811 $resql =
$db->query($sqlforcount);
813 $objforcount =
$db->fetch_object($resql);
814 $nbtotalofrecords = $objforcount->nbtotalofrecords;
819 if (($page * $limit) > (
int) $nbtotalofrecords) {
827$sql .=
$db->order($sortfield, $sortorder);
829 $sql .=
$db->plimit($limit + 1, $offset);
832$resql =
$db->query($sql);
838$num =
$db->num_rows($resql);
845 $product->fetch($idproduct);
847if ($id > 0 || $ref) {
848 $result = $warehouse->fetch($id, $ref);
855$help_url =
'EN:Module_Stocks_En|FR:Module_Stock|ES:Módulo_Stocks';
857 $title = $langs->trans(
'StockMovementForId', $msid);
859 $title = $langs->trans(
"StockMovements");
861 if (!empty($warehouse->ref)) {
862 $title .=
' ('.$warehouse->ref.
')';
864 $title .=
' ('.$langs->trans(
"ForThisWarehouse").
')';
873llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'bodyforlist mod-product page-stock_movement_list');
878if ($warehouse->id > 0) {
881 print
dol_get_fiche_head($head,
'movements', $langs->trans(
"Warehouse"), -1,
'stock');
884 $linkback =
'<a href="'.DOL_URL_ROOT.
'/product/stock/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
886 $morehtmlref =
'<div class="refidno">';
887 $morehtmlref .= $langs->trans(
"LocationSummary").
' : '.$warehouse->lieu;
891 $langs->load(
"projects");
892 $morehtmlref .=
'<br>'.img_picto(
'',
'project',
'class="pictofixedwidth"').$langs->trans(
'Project').
' ';
893 if ($usercancreate && 1 == 2) {
894 if ($action !=
'classify') {
895 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.$warehouse->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> : ';
897 if ($action ==
'classify') {
898 $projectid = $warehouse->fk_project;
899 $morehtmlref .=
'<form method="post" action="'.$_SERVER[
'PHP_SELF'].
'?id='.$warehouse->id.
'">';
900 $morehtmlref .=
'<input type="hidden" name="action" value="classin">';
901 $morehtmlref .=
'<input type="hidden" name="token" value="'.newToken().
'">';
902 $morehtmlref .= $formproject->select_projects(($socid > 0 ? $socid : -1), (
string) $projectid,
'projectid', 0, 0, 1, 1, 0, 0, 0,
'', 1, 0,
'maxwidth500');
903 $morehtmlref .=
'<input type="submit" class="button valignmiddle" value="'.$langs->trans(
"Modify").
'">';
904 $morehtmlref .=
'</form>';
906 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.$warehouse->id, $warehouse->socid, (
string) $warehouse->fk_project,
'none', 0, 0, 0, 1,
'',
'maxwidth300');
909 if (!empty($warehouse->fk_project)) {
911 $proj->fetch($warehouse->fk_project);
912 $morehtmlref .=
' : '.$proj->getNomUrl(1);
914 $morehtmlref .=
' - '.$proj->title;
921 $morehtmlref .=
'</div>';
924 if ($user->socid && !in_array(
'stock', explode(
',',
getDolGlobalString(
'MAIN_MODULES_FOR_EXTERNAL')))) {
928 dol_banner_tab($warehouse,
'ref', $linkback, $shownav,
'ref',
'ref', $morehtmlref);
931 print
'<div class="fichecenter">';
932 print
'<div class="fichehalfleft">';
933 print
'<div class="underbanner clearboth"></div>';
935 print
'<table class="border centpercent tableforfield">';
940 print
'<td class="titlefield tdtop">'.$langs->trans(
"Description").
'</td><td>'.
dol_htmlentitiesbr($warehouse->description).
'</td></tr>';
942 $calcproductsunique = $warehouse->nb_different_products();
943 $calcproducts = $warehouse->nb_products();
946 print
'<tr><td>'.$langs->trans(
"NumberOfDifferentProducts").
'</td><td>';
947 print empty($calcproductsunique[
'nb']) ?
'0' : $calcproductsunique[
'nb'];
951 print
'<tr><td>'.$langs->trans(
"NumberOfProducts").
'</td><td>';
952 $valtoshow =
price2num($calcproducts[
'nb'],
'MS');
953 print empty($valtoshow) ?
'0' : $valtoshow;
959 print
'<div class="fichehalfright">';
960 print
'<div class="underbanner clearboth"></div>';
962 print
'<table class="border centpercent tableforfield">';
965 if ($usercanreadsupplierprice) {
966 print
'<tr><td class="titlefield">'.$langs->trans(
"EstimatedStockValueShort").
'</td><td>';
967 print
price((empty($calcproducts[
'value']) ?
'0' :
price2num($calcproducts[
'value'],
'MT')), 0, $langs, 0, -1, -1,
$conf->currency);
972 $sql =
"SELECT MAX(m.datem) as datem";
973 $sql .=
" FROM ".MAIN_DB_PREFIX.
"stock_mouvement as m";
974 $sql .=
" WHERE m.fk_entrepot = ".((int) $warehouse->id);
975 $resqlbis =
$db->query($sql);
977 $lastmovementdate = 0;
979 $objbis =
$db->fetch_object($resqlbis);
980 $lastmovementdate =
$db->jdate($objbis->datem);
985 print
'<tr><td>'.$langs->trans(
"LastMovement").
'</td><td>';
986 if ($lastmovementdate) {
989 print $langs->trans(
"None");
994 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
998 print
'<tr><td valign="middle">'.$langs->trans(
"Categories").
'</td><td colspan="3">';
999 print $form->showCategories($warehouse->id, Categorie::TYPE_WAREHOUSE, 1);
1008 print
'<div class="clearboth"></div>';
1015if ($action ==
"correction") {
1016 include DOL_DOCUMENT_ROOT.
'/product/stock/tpl/stockcorrection.tpl.php';
1021if ($action ==
"transfer") {
1024 include DOL_DOCUMENT_ROOT.
'/product/stock/tpl/stocktransfer.tpl.php';
1030if ((empty($action) || $action ==
'list') && $id > 0) {
1031 print
"<div class=\"tabsAction\">\n";
1033 $parameters = array();
1034 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $warehouse, $action);
1036 if (empty($reshook)) {
1037 if ($user->hasRight(
'stock',
'mouvement',
'creer')) {
1038 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$id.
'&action=transfer&token='.
newToken().
'">'.$langs->trans(
"TransferStock").
'</a>';
1041 if ($user->hasRight(
'stock',
'mouvement',
'creer')) {
1042 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$id.
'&action=correction&token='.
newToken().
'">'.$langs->trans(
"CorrectStock").
'</a>';
1049$arrayofselected = is_array($toselect) ? $toselect : array();
1053 $param .=
'&mode='.urlencode($mode);
1055if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
1056 $param .=
'&contextpage='.urlencode($contextpage);
1058if ($limit > 0 && $limit !=
$conf->liste_limit) {
1059 $param .=
'&limit='.((int) $limit);
1062 $param .=
'&id='.urlencode((
string) (
$id));
1065 $param .=
'&show_files='.urlencode((
string) ($show_files));
1067if ($search_date_startday) {
1068 $param .=
'&search_date_startday='.urlencode((
string) ($search_date_startday));
1070if ($search_date_startmonth) {
1071 $param .=
'&search_date_startmonth='.urlencode((
string) ($search_date_startmonth));
1073if ($search_date_startyear) {
1074 $param .=
'&search_date_startyear='.urlencode((
string) ($search_date_startyear));
1076if ($search_date_endday) {
1077 $param .=
'&search_date_endday='.urlencode((
string) ($search_date_endday));
1079if ($search_date_endmonth) {
1080 $param .=
'&search_date_endmonth='.urlencode((
string) ($search_date_endmonth));
1082if ($search_date_endyear) {
1083 $param .=
'&search_date_endyear='.urlencode((
string) ($search_date_endyear));
1085if ($search_movement) {
1086 $param .=
'&search_movement='.urlencode($search_movement);
1088if ($search_inventorycode) {
1089 $param .=
'&search_inventorycode='.urlencode($search_inventorycode);
1091if ($search_type_mouvement) {
1092 $param .=
'&search_type_mouvement='.urlencode($search_type_mouvement);
1094if ($search_product_ref) {
1095 $param .=
'&search_product_ref='.urlencode($search_product_ref);
1097if ($search_product) {
1098 $param .=
'&search_product='.urlencode($search_product);
1101 $param .=
'&search_batch='.urlencode($search_batch);
1103if ($search_warehouse > 0) {
1104 $param .=
'&search_warehouse='.urlencode($search_warehouse);
1107 $param .=
'&search_user='.urlencode($search_user);
1109if ($idproduct > 0) {
1110 $param .=
'&idproduct='.urlencode((
string) ($idproduct));
1112if ($search_fk_project !=
'' && $search_fk_project !=
'-1') {
1113 $param .=
'&search_fk_project='.urlencode((
string) ($search_fk_project));
1116include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_param.tpl.php';
1118$parameters = array(
'param' => &$param);
1119$reshook = $hookmanager->executeHooks(
'printFieldListSearchParam', $parameters, $warehouse, $action);
1120$param .= $hookmanager->resPrint;
1123$arrayofmassactions = array();
1125 $arrayofmassactions[
'builddoc'] =
img_picto(
'',
'pdf',
'class="pictofixedwidth"').$langs->trans(
"GeneratePDF");
1129 $arrayofmassactions[
'predelete'] =
img_picto(
'',
'delete',
'class="pictofixedwidth"').$langs->trans(
"Delete");
1131if (!empty($permissiontoadd)) {
1132 $arrayofmassactions[
'prereverse'] =
img_picto(
'',
'add',
'class="pictofixedwidth"').$langs->trans(
"Reverse");
1134if (
GETPOSTINT(
'nomassaction') || in_array($massaction, array(
'presend',
'predelete',
'prereverse'))) {
1135 $arrayofmassactions = array();
1138$massactionbutton = $form->selectMassAction(
'', $arrayofmassactions);
1140print
'<form method="POST" id="searchFormList" action="'.$_SERVER[
"PHP_SELF"].
'">'.
"\n";
1141if ($optioncss !=
'') {
1142 print
'<input type="hidden" name="optioncss" value="'.$optioncss.
'">';
1144print
'<input type="hidden" name="token" value="'.newToken().
'">';
1145print
'<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1146print
'<input type="hidden" name="action" value="list">';
1147print
'<input type="hidden" name="sortfield" value="'.$sortfield.
'">';
1148print
'<input type="hidden" name="sortorder" value="'.$sortorder.
'">';
1149print
'<input type="hidden" name="type" value="'.$type.
'">';
1150print
'<input type="hidden" name="page" value="'.$page.
'">';
1151print
'<input type="hidden" name="contextpage" value="'.$contextpage.
'">';
1152print
'<input type="hidden" name="page_y" value="">';
1153print
'<input type="hidden" name="mode" value="'.$mode.
'">';
1155 print
'<input type="hidden" name="id" value="'.$id.
'">';
1161print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'movement', 0,
'',
'', $limit, 0, 0, 1);
1164$topicmail =
"SendStockMovement";
1165$modelmail =
"movementstock";
1167$trackid =
'mov'.$warehouse->id;
1168include DOL_DOCUMENT_ROOT.
'/core/tpl/massactions_pre.tpl.php';
1169if ($massaction ==
'prereverse' && count($toselect) <=
getDolGlobalInt(
'MAIN_LIMIT_FOR_MASS_ACTIONS', 1000)) {
1170 print $form->formconfirm($_SERVER[
"PHP_SELF"], $langs->trans(
"ConfirmMassReverse"), $langs->trans(
"ConfirmMassReverseQuestion", count($toselect)),
"confirm_reverse",
null,
'', 0, 200, 500, 1,
'Yes');
1176 if (!isset($fieldstosearchall) || !is_array($fieldstosearchall)) {
1178 $fieldstosearchall = array();
1180 foreach ($fieldstosearchall as $key => $val) {
1181 $fieldstosearchall[$key] = $langs->trans($val);
1182 $setupstring .= $key.
"=".$val.
";";
1184 print
'<!-- Search done like if STOCK_QUICKSEARCH_ON_FIELDS = '.$setupstring.
' -->'.
"\n";
1185 print
'<div class="divsearchfieldfilter">'.$langs->trans(
"FilterOnInto", $search_all).implode(
', ', $fieldstosearchall).
'</div>'.
"\n";
1190$parameters = array(
'arrayfields' => &$arrayfields);
1191$reshook = $hookmanager->executeHooks(
'printFieldPreListTitle', $parameters, $warehouse, $action);
1192if (empty($reshook)) {
1193 $moreforfilter .= $hookmanager->resPrint;
1195 $moreforfilter = $hookmanager->resPrint;
1198if (!empty($moreforfilter)) {
1199 print
'<div class="liste_titre liste_titre_bydiv centpercent">';
1200 print $moreforfilter;
1204$varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1205$htmlofselectarray = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
$conf->main_checkbox_left_column);
1206$selectedfields = ($mode !=
'kanban' ? $htmlofselectarray :
'');
1207$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons(
'checkforselect', 1) :
'');
1209print
'<div class="div-table-responsive">';
1210print
'<table class="tagtable nobottomiftotal liste'.($moreforfilter ?
" listwithfilterbefore" :
"").
'">'.
"\n";
1214print
'<tr class="liste_titre_filter">';
1216if (
$conf->main_checkbox_left_column) {
1217 print
'<td class="liste_titre center maxwidthsearch">';
1218 $searchpicto = $form->showFilterButtons(
'left');
1222if (!empty($arrayfields[
'm.rowid'][
'checked'])) {
1224 print
'<td class="liste_titre left">';
1225 print
'<input class="flat maxwidth40" type="text" name="search_ref" value="'.dol_escape_htmltag($search_ref).
'">';
1228if (!empty($arrayfields[
'm.datem'][
'checked'])) {
1230 print
'<td class="liste_titre center">';
1231 print
'<div class="nowrapfordate">';
1232 print $form->selectDate($search_date_start ? $search_date_start : -1,
'search_date_start', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'From'),
'tzuserrel');
1234 print
'<div class="nowrapfordate">';
1235 print $form->selectDate($search_date_end ? $search_date_end : -1,
'search_date_end', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'to'),
'tzuserrel');
1239if (!empty($arrayfields[
'p.ref'][
'checked'])) {
1241 print
'<td class="liste_titre left">';
1242 print
'<input class="flat maxwidth75" type="text" name="search_product_ref" value="'.dol_escape_htmltag($idproduct ? $product->ref : $search_product_ref).
'">';
1245if (!empty($arrayfields[
'p.label'][
'checked'])) {
1247 print
'<td class="liste_titre left">';
1248 print
'<input class="flat maxwidth100" type="text" name="search_product" value="'.dol_escape_htmltag($idproduct ? $product->label : $search_product).
'">';
1252if (!empty($arrayfields[
'm.batch'][
'checked'])) {
1253 print
'<td class="liste_titre center"><input class="flat maxwidth75" type="text" name="search_batch" value="'.dol_escape_htmltag($search_batch).
'"></td>';
1255if (!empty($arrayfields[
'pl.eatby'][
'checked'])) {
1256 print
'<td class="liste_titre left">';
1259if (!empty($arrayfields[
'pl.sellby'][
'checked'])) {
1260 print
'<td class="liste_titre left">';
1264if (!empty($arrayfields[
'e.ref'][
'checked'])) {
1265 print
'<td class="liste_titre maxwidthonsmartphone left">';
1267 print $formproduct->selectWarehouses($search_warehouse,
'search_warehouse',
'warehouseopen,warehouseinternal', 1, 0, 0,
'', 0, 0, array(),
'maxwidth150');
1270if (!empty($arrayfields[
'm.fk_user_author'][
'checked'])) {
1272 print
'<td class="liste_titre left">';
1273 print
'<input class="flat" type="text" size="6" name="search_user" value="'.dol_escape_htmltag($search_user).
'">';
1276if (!empty($arrayfields[
'm.inventorycode'][
'checked'])) {
1278 print
'<td class="liste_titre left">';
1279 print
'<input class="flat" type="text" size="4" name="search_inventorycode" value="'.dol_escape_htmltag($search_inventorycode).
'">';
1282if (!empty($arrayfields[
'm.label'][
'checked'])) {
1284 print
'<td class="liste_titre left">';
1285 print
'<input class="flat" type="text" size="8" name="search_movement" value="'.dol_escape_htmltag($search_movement).
'">';
1288if (!empty($arrayfields[
'origin'][
'checked'])) {
1290 print
'<td class="liste_titre left">';
1294if (!empty($arrayfields[
'm.fk_projet'][
'checked'])) {
1296 print
'<td class="liste_titre" align="left">';
1297 print $warehouse->showInputField($warehouse->fields[
'fk_project'],
'fk_project', $search_fk_project,
'',
'',
'search_',
'maxwidth125', 1);
1300if (!empty($arrayfields[
'm.type_mouvement'][
'checked'])) {
1302 print
'<td class="liste_titre center">';
1304 print
'<select id="search_type_mouvement" name="search_type_mouvement" class="maxwidth150">';
1305 print
'<option value="" '.(($search_type_mouvement ==
"") ?
'selected="selected"' :
'').
'> </option>';
1306 print
'<option value="0" '.(($search_type_mouvement ==
"0") ?
'selected="selected"' :
'').
'>'.$langs->trans(
'StockIncreaseAfterCorrectTransfer').
'</option>';
1307 print
'<option value="1" '.(($search_type_mouvement ==
"1") ?
'selected="selected"' :
'').
'>'.$langs->trans(
'StockDecreaseAfterCorrectTransfer').
'</option>';
1308 print
'<option value="2" '.(($search_type_mouvement ==
"2") ?
'selected="selected"' :
'').
'>'.$langs->trans(
'StockDecrease').
'</option>';
1309 print
'<option value="3" '.(($search_type_mouvement ==
"3") ?
'selected="selected"' :
'').
'>'.$langs->trans(
'StockIncrease').
'</option>';
1316if (!empty($arrayfields[
'm.value'][
'checked'])) {
1318 print
'<td class="liste_titre right">';
1319 print
'<input class="flat width50 right" type="text" name="search_qty" value="'.dol_escape_htmltag($search_qty).
'">';
1322if (!empty($arrayfields[
'm.price'][
'checked'])) {
1324 print
'<td class="liste_titre" align="left">';
1330include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_input.tpl.php';
1333$parameters = array(
'arrayfields' => $arrayfields);
1334$reshook = $hookmanager->executeHooks(
'printFieldListOption', $parameters, $warehouse, $action);
1335print $hookmanager->resPrint;
1337if (!empty($arrayfields[
'm.datec'][
'checked'])) {
1338 print
'<td class="liste_titre">';
1342if (!empty($arrayfields[
'm.tms'][
'checked'])) {
1343 print
'<td class="liste_titre">';
1347if (!
$conf->main_checkbox_left_column) {
1348 print
'<td class="liste_titre center maxwidthsearch">';
1349 $searchpicto = $form->showFilterButtons();
1360print
'<tr class="liste_titre">';
1362if (
$conf->main_checkbox_left_column) {
1363 print
getTitleFieldOfList($selectedfields, 0, $_SERVER[
"PHP_SELF"],
'',
'',
'',
'', $sortfield, $sortorder,
'center maxwidthsearch ').
"\n";
1366if (!empty($arrayfields[
'm.rowid'][
'checked'])) {
1367 print_liste_field_titre($arrayfields[
'm.rowid'][
'label'], $_SERVER[
"PHP_SELF"],
'm.rowid',
'', $param,
'', $sortfield, $sortorder);
1369if (!empty($arrayfields[
'm.datem'][
'checked'])) {
1370 print_liste_field_titre($arrayfields[
'm.datem'][
'label'], $_SERVER[
"PHP_SELF"],
'm.datem',
'', $param,
'', $sortfield, $sortorder,
'center ');
1372if (!empty($arrayfields[
'p.ref'][
'checked'])) {
1373 print_liste_field_titre($arrayfields[
'p.ref'][
'label'], $_SERVER[
"PHP_SELF"],
'p.ref',
'', $param,
'', $sortfield, $sortorder);
1375if (!empty($arrayfields[
'p.label'][
'checked'])) {
1376 print_liste_field_titre($arrayfields[
'p.label'][
'label'], $_SERVER[
"PHP_SELF"],
'p.label',
'', $param,
'', $sortfield, $sortorder);
1378if (!empty($arrayfields[
'm.batch'][
'checked'])) {
1379 print_liste_field_titre($arrayfields[
'm.batch'][
'label'], $_SERVER[
"PHP_SELF"],
'm.batch',
'', $param,
'', $sortfield, $sortorder,
'center ');
1381if (!empty($arrayfields[
'pl.eatby'][
'checked'])) {
1382 print_liste_field_titre($arrayfields[
'pl.eatby'][
'label'], $_SERVER[
"PHP_SELF"],
'pl.eatby',
'', $param,
'', $sortfield, $sortorder,
'center ');
1384if (!empty($arrayfields[
'pl.sellby'][
'checked'])) {
1385 print_liste_field_titre($arrayfields[
'pl.sellby'][
'label'], $_SERVER[
"PHP_SELF"],
'pl.sellby',
'', $param,
'', $sortfield, $sortorder,
'center ');
1387if (!empty($arrayfields[
'e.ref'][
'checked'])) {
1389 print_liste_field_titre($arrayfields[
'e.ref'][
'label'], $_SERVER[
"PHP_SELF"],
"e.ref",
"", $param,
"", $sortfield, $sortorder);
1391if (!empty($arrayfields[
'm.fk_user_author'][
'checked'])) {
1392 print_liste_field_titre($arrayfields[
'm.fk_user_author'][
'label'], $_SERVER[
"PHP_SELF"],
"m.fk_user_author",
"", $param,
"", $sortfield, $sortorder);
1394if (!empty($arrayfields[
'm.inventorycode'][
'checked'])) {
1395 print_liste_field_titre($arrayfields[
'm.inventorycode'][
'label'], $_SERVER[
"PHP_SELF"],
"m.inventorycode",
"", $param,
"", $sortfield, $sortorder);
1397if (!empty($arrayfields[
'm.label'][
'checked'])) {
1398 print_liste_field_titre($arrayfields[
'm.label'][
'label'], $_SERVER[
"PHP_SELF"],
"m.label",
"", $param,
"", $sortfield, $sortorder);
1400if (!empty($arrayfields[
'origin'][
'checked'])) {
1401 print_liste_field_titre($arrayfields[
'origin'][
'label'], $_SERVER[
"PHP_SELF"],
"",
"", $param,
"", $sortfield, $sortorder);
1403if (!empty($arrayfields[
'm.fk_projet'][
'checked'])) {
1404 print_liste_field_titre($arrayfields[
'm.fk_projet'][
'label'], $_SERVER[
"PHP_SELF"],
"m.fk_projet",
"", $param,
'', $sortfield, $sortorder);
1406if (!empty($arrayfields[
'm.type_mouvement'][
'checked'])) {
1407 print_liste_field_titre($arrayfields[
'm.type_mouvement'][
'label'], $_SERVER[
"PHP_SELF"],
"m.type_mouvement",
"", $param,
'', $sortfield, $sortorder,
'center ');
1409if (!empty($arrayfields[
'm.value'][
'checked'])) {
1410 print_liste_field_titre($arrayfields[
'm.value'][
'label'], $_SERVER[
"PHP_SELF"],
"m.value",
"", $param,
'', $sortfield, $sortorder,
'right ');
1412if (!empty($arrayfields[
'm.price'][
'checked'])) {
1413 print_liste_field_titre($arrayfields[
'm.price'][
'label'], $_SERVER[
"PHP_SELF"],
"m.price",
"", $param,
'', $sortfield, $sortorder,
'right ');
1417include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_title.tpl.php';
1420$parameters = array(
'arrayfields' => $arrayfields,
'param' => $param,
'sortfield' => $sortfield,
'sortorder' => $sortorder,
'totalarray' => &$totalarray);
1421$reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $warehouse, $action);
1422print $hookmanager->resPrint;
1423if (!empty($arrayfields[
'm.datec'][
'checked'])) {
1424 print_liste_field_titre($arrayfields[
'm.datec'][
'label'], $_SERVER[
"PHP_SELF"],
"m.datec",
"", $param,
'', $sortfield, $sortorder,
'center nowrap ');
1426if (!empty($arrayfields[
'm.tms'][
'checked'])) {
1427 print_liste_field_titre($arrayfields[
'm.tms'][
'label'], $_SERVER[
"PHP_SELF"],
"m.tms",
"", $param,
'', $sortfield, $sortorder,
'center nowrap ');
1430if (!
$conf->main_checkbox_left_column) {
1431 print
getTitleFieldOfList($selectedfields, 0, $_SERVER[
"PHP_SELF"],
'',
'',
'',
'', $sortfield, $sortorder,
'center maxwidthsearch ').
"\n";
1437$arrayofuniqueproduct = array();
1446$imaxinloop = ($limit ? min($num, $limit) : $num);
1447while ($i < $imaxinloop) {
1448 $obj =
$db->fetch_object($resql);
1453 $userstatic->id = $obj->fk_user_author;
1454 $userstatic->login = $obj->login;
1455 $userstatic->lastname = $obj->lastname;
1456 $userstatic->firstname = $obj->firstname;
1457 $userstatic->photo = $obj->photo;
1458 $userstatic->email = $obj->user_email;
1459 $userstatic->status = $obj->user_status;
1464 $sql =
"SELECT label";
1465 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product_lang";
1466 $sql .=
" WHERE fk_product = ".((int) $obj->rowid);
1467 $sql .=
" AND lang = '".$db->escape($langs->getDefaultLang()).
"'";
1470 $result =
$db->query($sql);
1472 $objtp =
$db->fetch_object($result);
1473 if (!empty($objtp->label)) {
1474 $obj->produit = $objtp->label;
1479 $productstatic->id = $obj->rowid;
1480 $productstatic->ref = $obj->product_ref;
1481 $productstatic->label = $obj->produit;
1482 $productstatic->type = $obj->type;
1483 $productstatic->entity = $obj->entity;
1484 $productstatic->status = $obj->tosell;
1485 $productstatic->status_buy = $obj->tobuy;
1486 $productstatic->status_batch = $obj->tobatch;
1488 $productlot->id = $obj->lotid;
1489 $productlot->batch = $obj->batch;
1490 $productlot->eatby = $obj->eatby;
1491 $productlot->sellby = $obj->sellby;
1493 $warehousestatic->id = $obj->entrepot_id;
1494 $warehousestatic->ref = $obj->warehouse_ref;
1495 $warehousestatic->label = $obj->warehouse_ref;
1496 $warehousestatic->lieu = $obj->lieu;
1497 $warehousestatic->fk_parent = $obj->fk_parent;
1498 $warehousestatic->statut = $obj->statut;
1504 $object->warehouse_id = $obj->entrepot_id;
1505 $object->type = $obj->type_mouvement;
1507 $arrayofuniqueproduct[$obj->rowid] = $obj->produit;
1508 if (!empty($obj->fk_origin)) {
1509 $origin =
$object->get_origin($obj->fk_origin, $obj->origintype);
1514 if ($mode ==
'kanban') {
1516 print
'<tr class="trkanban"><td colspan="'.$savnbfield.
'">';
1517 print
'<div class="box-flex-container kanban">';
1521 if ($massactionbutton || $massaction) {
1523 if (in_array($warehouse->id, $arrayofselected)) {
1527 print $warehouse->getKanbanView(
'', array(
'selected' => $selected));
1528 if ($i == ($imaxinloop - 1)) {
1535 print
'<tr data-rowid="'.$warehouse->id.
'" class="oddeven">';
1537 if (
$conf->main_checkbox_left_column) {
1538 print
'<td class="nowrap center">';
1539 if ($massactionbutton || $massaction) {
1541 if (in_array($obj->mid, $arrayofselected)) {
1544 print
'<input id="cb'.$obj->mid.
'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->mid.
'"'.($selected ?
' checked="checked"' :
'').
'>';
1552 if (!empty($arrayfields[
'm.rowid'][
'checked'])) {
1553 print
'<td class="nowraponall">';
1558 if (!empty($arrayfields[
'm.datem'][
'checked'])) {
1559 print
'<td class="nowraponall center">'.dol_print_date(
$db->jdate($obj->datem),
'dayhour',
'tzuserrel').
'</td>';
1562 if (!empty($arrayfields[
'p.ref'][
'checked'])) {
1563 print
'<td class="nowraponall tdoverflowmax150 cell2linesheight">';
1564 print $productstatic->getNomUrl(1,
'stock', 16);
1565 print
'<br><span class="opacitymedium">'.$productstatic->label.
'</span>';
1569 if (!empty($arrayfields[
'p.label'][
'checked'])) {
1570 print
'<td class="tdoverflowmax150" title="'.dol_escape_htmltag($productstatic->label).
'">';
1571 print $productstatic->label;
1575 if (!empty($arrayfields[
'm.batch'][
'checked'])) {
1576 print
'<td class="center nowraponall">';
1577 if ($productlot->id > 0) {
1578 print $productlot->getNomUrl(1);
1580 print $productlot->batch;
1585 if (!empty($arrayfields[
'pl.eatby'][
'checked'])) {
1586 print
'<td class="center">'.dol_print_date($obj->eatby,
'day').
'</td>';
1589 if (!empty($arrayfields[
'pl.sellby'][
'checked'])) {
1590 print
'<td class="center">'.dol_print_date($obj->sellby,
'day').
'</td>';
1593 if (!empty($arrayfields[
'e.ref'][
'checked'])) {
1594 print
'<td class="tdoverflowmax150">';
1595 print $warehousestatic->getNomUrl(1);
1599 if (!empty($arrayfields[
'm.fk_user_author'][
'checked'])) {
1600 print
'<td class="tdoverflowmax100">';
1601 print $userstatic->getNomUrl(-1);
1605 if (!empty($arrayfields[
'm.inventorycode'][
'checked'])) {
1606 print
'<td class="tdoverflowmax150" title="'.dolPrintHTML($obj->inventorycode).
'">';
1607 if ($obj->inventorycode) {
1608 print
img_picto(
'',
'movement',
'class="pictofixedwidth"');
1609 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?search_inventorycode='.urlencode(
'^'.$obj->inventorycode.
'$').
'">'.
dol_escape_htmltag($obj->inventorycode).
'</a>';
1614 if (!empty($arrayfields[
'm.label'][
'checked'])) {
1615 print
'<td class="tdoverflowmax200" title="'.dol_escape_htmltag($obj->label).
'">'.
dol_escape_htmltag($obj->label).
'</td>';
1618 if (!empty($arrayfields[
'origin'][
'checked'])) {
1619 print
'<td class="nowraponall">'.$origin.
'</td>';
1622 if (!empty($arrayfields[
'm.fk_projet'][
'checked'])) {
1624 if ($obj->fk_project != 0) {
1625 print
$object->get_origin($obj->fk_project,
'project');
1630 if (!empty($arrayfields[
'm.type_mouvement'][
'checked'])) {
1631 print
'<td class="center">';
1632 print
$object->getTypeMovement();
1636 if (!empty($arrayfields[
'm.value'][
'checked'])) {
1637 print
'<td class="right">';
1638 if ($obj->qty > 0) {
1639 print
'<span class="stockmovemententry">';
1644 print
'<span class="stockmovementexit">';
1651 if (!empty($arrayfields[
'm.price'][
'checked'])) {
1653 $displayprice =
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') ? $user->hasRight(
'product',
'product_advance',
'read_supplier_prices') : $user->hasRight(
'product',
'lire');
1654 if ($productstatic->isService()) {
1655 $displayprice =
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') ? $user->hasRight(
'service',
'service_advance',
'read_supplier_prices') : $user->hasRight(
'service',
'lire');
1657 print
'<td class="right">';
1658 if ($obj->price != 0 && $displayprice) {
1659 print
price($obj->price);
1665 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_print_fields.tpl.php';
1667 $parameters = array(
'arrayfields' => $arrayfields,
'object' => $object,
'obj' => $obj,
'i' => $i,
'totalarray' => &$totalarray);
1668 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
1669 print $hookmanager->resPrint;
1672 if (!
$conf->main_checkbox_left_column) {
1673 print
'<td class="nowrap center">';
1674 if ($massactionbutton || $massaction) {
1676 if (in_array($obj->mid, $arrayofselected)) {
1679 print
'<input id="cb'.$obj->mid.
'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->mid.
'"'.($selected ?
' checked="checked"' :
'').
'>';
1696 foreach ($arrayfields as $key => $val) {
1697 if (!empty($val[
'checked'])) {
1701 print
'<tr><td colspan="'.$colspan.
'"><span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span></td></tr>';
1706$parameters = array(
'arrayfields' => $arrayfields,
'sql' => $sql);
1707$reshook = $hookmanager->executeHooks(
'printFieldListFooter', $parameters, $object, $action);
1708print $hookmanager->resPrint;
1710print
'</table>'.
"\n";
1713print
'</form>'.
"\n";
1716if (count($arrayofuniqueproduct) == 1 && !empty($search_date_startyear) && is_numeric($search_date_startyear)) {
1719 $productidselected = 0;
1720 foreach ($arrayofuniqueproduct as $key => $val) {
1721 $productidselected = $key;
1722 $productlabelselected = $val;
1724 $datebefore =
dol_get_first_day($search_date_startyear ? $search_date_startyear :
dol_print_date(time(),
"%Y"), $search_date_startmonth ? $search_date_startmonth : 1, true);
1725 $dateafter =
dol_get_last_day($search_date_endyear ? $search_date_endyear :
dol_print_date(time(),
"%Y"), $search_date_endmonth ? $search_date_endmonth : 12, true);
1726 $balancebefore =
$object->calculateBalanceForProductBefore($productidselected, $datebefore);
1727 $balanceafter =
$object->calculateBalanceForProductBefore($productidselected, $dateafter);
1730 print $langs->trans(
"NbOfProductBeforePeriod", $productlabelselected,
dol_print_date($datebefore,
'day',
'gmt'));
1733 print
': '.$balancebefore;
1737 print $langs->trans(
"NbOfProductAfterPeriod", $productlabelselected,
dol_print_date($dateafter,
'day',
'gmt'));
1740 print
': '.$balanceafter;
1745if (in_array(
'builddoc', array_keys($arrayofmassactions)) && ($nbtotalofrecords ===
'' || $nbtotalofrecords)) {
1746 $hidegeneratedfilelistifempty = 1;
1747 if ($massaction ==
'builddoc' || $action ==
'remove_file' || $show_files) {
1748 $hidegeneratedfilelistifempty = 0;
1751 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
1755 $urlsource = $_SERVER[
'PHP_SELF'].
'?sortfield='.$sortfield.
'&sortorder='.$sortorder;
1756 $urlsource .= str_replace(
'&',
'&', $param);
1758 $filedir = $diroutputmassaction;
1759 $genallowed = $permissiontoread;
1760 $delallowed = $permissiontoadd;
1762 print $formfile->showdocuments(
'massfilesarea_stock',
'', $filedir, $urlsource, 0, $delallowed,
'', 1, 1, 0, 48, 1, $param, $title,
'',
'',
'',
null, $hidegeneratedfilelistifempty);
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $object
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage warehouses.
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_now($mode='gmt')
Return date for now.
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.
GETPOSTDATE($prefix, $hourTime='', $gm='auto', $saverestore='')
Helper function that combines values of a dolibarr DatePicker (such as Form\selectDate) for year,...
print_liste_field_titre($name, $file="", $field="", $begin="", $param="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
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, $allowothertags=array())
Show picto whatever it's its name (generic function)
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
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.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
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.
natural_search($fields, $value, $mode=0, $nofirstand=0, $sqltoadd='')
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
GETPOSTFLOAT($paramname, $rounding='', $option=2)
Return the value of a $_GET or $_POST supervariable, converted into float.
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_clone($srcobject, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
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.
isModEnabled($module)
Is Dolibarr module enabled.
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...
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php
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.