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')) {
271 $objectclass =
'MouvementStock';
272 $objectlabel =
'MouvementStock';
274 if (!$error && $massaction ==
"builddoc" && $permissiontoread && !
GETPOST(
'button_search')) {
275 if (empty($diroutputmassaction)) {
276 dol_print_error(
null,
'include of actions_massactions.inc.php is done but var $diroutputmassaction was not defined');
280 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
281 require_once DOL_DOCUMENT_ROOT.
'/core/lib/pdf.lib.php';
282 require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
285 $listofobjectids = array();
286 foreach ($toselect as $toselectid) {
288 $result = $objecttmp->fetch($toselectid);
290 $listofobjectids[$toselectid] = $toselectid;
294 $arrayofinclusion = array();
295 foreach ($listofobjectids as $tmppdf) {
298 foreach ($listofobjectids as $tmppdf) {
299 $arrayofinclusion[] =
'^'.preg_quote(
dol_sanitizeFileName($tmppdf),
'/').
'_[a-zA-Z0-9-_]+\.pdf$';
301 $listoffiles =
dol_dir_list($uploaddir,
'all', 1, implode(
'|', $arrayofinclusion),
'\.meta$|\.png',
'date', SORT_DESC, 0, 1);
304 $outputlangs = $langs;
307 $newlang =
GETPOST(
'lang_id',
'aZ09');
312 if (!empty($newlang)) {
314 $outputlangs->setDefaultLang($newlang);
322 $filename = preg_replace(
'/\s/',
'_', $filename);
334 $file = $diroutputmassaction.
'/'.$filename.
'_'.
dol_print_date($now,
'dayhourlog').
'.pdf';
343 $langs->load(
"exports");
352 include DOL_DOCUMENT_ROOT.
'/core/actions_massactions.inc.php';
355if ($action ==
'update_extras' && $permissiontoeditextra) {
356 $tmpwarehouse->oldcopy =
dol_clone($tmpwarehouse, 2);
358 $attribute_name =
GETPOST(
'attribute',
'aZ09');
361 $ret = $extrafields->setOptionalsFromPost(
null, $tmpwarehouse, $attribute_name);
367 $result = $tmpwarehouse->updateExtraField($attribute_name,
'CONTRACT_MODIFY');
375 $action =
'edit_extras';
387if ($action ==
"correct_stock" && $permissiontoadd) {
389 if (!empty($product_id)) {
390 $result = $product->fetch($product_id);
395 if (empty($product_id)) {
397 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Product")),
null,
'errors');
398 $action =
'correction';
402 setEventMessages($langs->trans(
"ErrorFieldMustBeANumeric", $langs->transnoentitiesnoconv(
"NumberOfUnit")),
null,
'errors');
403 $action =
'correction';
407 $origin_element =
'';
411 $origin_element =
'project';
415 if ($product->hasbatch()) {
416 $batch =
GETPOST(
'batch_number',
'alphanohtml');
421 $result = $product->correct_stock_batch(
426 GETPOST(
"label",
'alphanohtml'),
431 GETPOST(
'inventorycode',
'alphanohtml'),
438 $result = $product->correct_stock(
443 GETPOST(
"label",
'alphanohtml'),
445 GETPOST(
'inventorycode',
'alphanohtml'),
454 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
459 $action =
'correction';
469if ($action ==
"transfert_stock" && $permissiontoadd && !$cancel) {
472 if (!empty($product_id)) {
473 $result = $product->fetch($product_id);
476 if (!(
GETPOSTINT(
"id_entrepot_destination") > 0)) {
477 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Warehouse")),
null,
'errors');
479 $action =
'transfer';
481 if (empty($product_id)) {
483 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Product")),
null,
'errors');
484 $action =
'transfer';
487 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"NumberOfUnit")),
null,
'errors');
489 $action =
'transfer';
491 if ($id ==
GETPOSTINT(
"id_entrepot_destination")) {
492 setEventMessages($langs->trans(
"ErrorSrcAndTargetWarehouseMustDiffers"),
null,
'errors');
494 $action =
'transfer';
499 $result = $product->fetch($product_id);
501 if ($product->hasbatch() && !
GETPOST(
"batch_number")) {
502 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"batch_number")),
null,
'errors');
504 $action =
'transfer';
511 $result = $warehouse->fetch($id);
515 $product->load_stock(
'novirtual');
519 if (isset($product->pmp)) {
520 $pricesrc = $product->pmp;
522 $pricedest = $pricesrc;
524 if ($product->hasbatch()) {
532 $result = $pdluo->fetch($pdluoid);
534 $srcwarehouseid = $pdluo->warehouseid;
535 $batch = $pdluo->batch;
541 $srcwarehouseid =
$id;
542 $batch =
GETPOST(
'batch_number',
'alphanohtml');
549 $result1 = $product->correct_stock_batch(
566 $result2 = $product->correct_stock_batch(
576 GETPOST(
'inventorycode',
'alphanohtml'),
585 $result1 = $product->correct_stock(
590 GETPOST(
"label",
'alphanohtml'),
592 GETPOST(
'inventorycode',
'alphanohtml'),
600 $result2 = $product->correct_stock(
605 GETPOST(
"label",
'alphanohtml'),
607 GETPOST(
'inventorycode',
'alphanohtml'),
614 if (!$error && $result1 >= 0 && $result2 >= 0) {
618 header(
"Location: ".$backtopage);
621 header(
"Location: movement_list.php?id=".$warehouse->id);
627 $action =
'transfer';
634if ($action ==
'confirm_reverse' && $confirm ==
"yes" && $permissiontoadd) {
635 $toselect = array_map(
'intval', $toselect);
639 $sql =
"SELECT rowid, label, inventorycode, datem";
640 $sql .=
" FROM ".MAIN_DB_PREFIX.
"stock_mouvement";
641 $sql .=
" WHERE rowid IN (".$db->sanitize(implode(
',', $toselect)).
")";
643 $resql = $db->query($sql);
645 $num = $db->num_rows($resql);
649 $obj = $db->fetch_object($resql);
657 $reverse =
$object->reverseMovement();
677 header(
"Location: ".$_SERVER[
"PHP_SELF"]);
685$form =
new Form($db);
693$productstatic =
new Product($db);
694$warehousestatic =
new Entrepot($db);
696$userstatic =
new User($db);
702$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,";
703$sql .=
" e.ref as warehouse_ref, e.rowid as entrepot_id, e.lieu, e.fk_parent, e.statut,";
704$sql .=
" m.rowid as mid, m.value as qty, m.datem, m.fk_user_author, m.label, m.inventorycode, m.fk_origin, m.origintype,";
705$sql .=
" m.batch, m.price,";
706$sql .=
" m.type_mouvement,";
707$sql .=
" m.fk_projet as fk_project,";
708$sql .=
" pl.rowid as lotid, pl.eatby, pl.sellby,";
709$sql .=
" u.login, u.photo, u.lastname, u.firstname, u.email as user_email, u.statut as user_status";
711if (!empty($extrafields->attributes[
$object->table_element][
'label'])) {
712 foreach ($extrafields->attributes[
$object->table_element][
'label'] as $key => $val) {
713 $sql .= ($extrafields->attributes[
$object->table_element][
'type'][$key] !=
'separate' ?
", ef.".$key.
" as options_".$key :
'');
717$parameters = array();
718$reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters, $object, $action);
719$sql .= $hookmanager->resPrint;
720$sql = preg_replace(
'/,\s*$/',
'', $sql);
724$sql .=
" FROM ".MAIN_DB_PREFIX.
"entrepot as e,";
725$sql .=
" ".MAIN_DB_PREFIX.
"product as p,";
726$sql .=
" ".MAIN_DB_PREFIX.
"stock_mouvement as m";
727if (!empty($extrafields->attributes[
$object->table_element][
'label']) && is_array($extrafields->attributes[
$object->table_element][
'label']) && count($extrafields->attributes[
$object->table_element][
'label'])) {
728 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element.
"_extrafields as ef on (m.rowid = ef.fk_object)";
730$sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"user as u ON m.fk_user_author = u.rowid";
731$sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product_lot as pl ON m.batch = pl.batch AND m.fk_product = pl.fk_product";
734$parameters = array();
735$reshook = $hookmanager->executeHooks(
'printFieldListFrom', $parameters, $object, $action);
736$sql .= $hookmanager->resPrint;
738$sql .=
" WHERE m.fk_product = p.rowid";
740 $sql .=
" AND m.rowid = ".((int) $msid);
742$sql .=
" AND m.fk_entrepot = e.rowid";
743$sql .=
" AND e.entity IN (".getEntity(
'stock').
")";
745 $sql .=
" AND p.fk_product_type = 0";
748 $sql .=
" AND e.rowid = ".((int) $id);
750if (!empty($search_date_start)) {
751 $sql .=
" AND m.datem >= '" . $db->idate($search_date_start) .
"'";
753if (!empty($search_date_end)) {
754 $sql .=
" AND m.datem <= '" . $db->idate($search_date_end) .
"'";
757 $sql .=
" AND p.rowid = ".((int) $idproduct);
759if (!empty($search_ref)) {
762if (!empty($search_movement)) {
765if (!empty($search_inventorycode)) {
768if (!empty($search_product_ref)) {
771if (!empty($search_product)) {
774if ($search_warehouse !=
'' && $search_warehouse !=
'-1') {
777if (!empty($search_user)) {
778 $sql .=
natural_search(array(
'u.lastname',
'u.firstname',
'u.login'), $search_user);
780if (!empty($search_batch)) {
783if (!empty($product_id) && $product_id !=
'-1') {
786if (!empty($search_fk_project) && $search_fk_project !=
'-1') {
789if ($search_qty !=
'') {
792if ($search_type_mouvement !=
'' && $search_type_mouvement !=
'-1') {
793 $sql .=
natural_search(
'm.type_mouvement', $search_type_mouvement, 2);
796include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_sql.tpl.php';
798$parameters = array();
799$reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters, $object, $action);
800$sql .= $hookmanager->resPrint;
803$nbtotalofrecords =
'';
806 $sqlforcount = preg_replace(
'/^'.preg_quote($sqlfields,
'/').
'/',
'SELECT COUNT(*) as nbtotalofrecords', $sql);
807 $sqlforcount = preg_replace(
'/GROUP BY .*$/',
'', $sqlforcount);
808 $resql = $db->query($sqlforcount);
810 $objforcount = $db->fetch_object($resql);
811 $nbtotalofrecords = $objforcount->nbtotalofrecords;
816 if (($page * $limit) > (
int) $nbtotalofrecords) {
824$sql .= $db->order($sortfield, $sortorder);
826 $sql .= $db->plimit($limit + 1, $offset);
829$resql = $db->query($sql);
835$num = $db->num_rows($resql);
842 $product->fetch($idproduct);
844if ($id > 0 || $ref) {
845 $result = $warehouse->fetch($id, $ref);
852$help_url =
'EN:Module_Stocks_En|FR:Module_Stock|ES:Módulo_Stocks';
854 $title = $langs->trans(
'StockMovementForId', $msid);
856 $title = $langs->trans(
"StockMovements");
858 if (!empty($warehouse->ref)) {
859 $title .=
' ('.$warehouse->ref.
')';
861 $title .=
' ('.$langs->trans(
"ForThisWarehouse").
')';
870llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'bodyforlist mod-product page-stock_movement_list');
875if ($warehouse->id > 0) {
878 print
dol_get_fiche_head($head,
'movements', $langs->trans(
"Warehouse"), -1,
'stock');
881 $linkback =
'<a href="'.DOL_URL_ROOT.
'/product/stock/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
883 $morehtmlref =
'<div class="refidno">';
884 $morehtmlref .= $langs->trans(
"LocationSummary").
' : '.$warehouse->lieu;
888 $langs->load(
"projects");
889 $morehtmlref .=
'<br>'.img_picto(
'',
'project',
'class="pictofixedwidth"').$langs->trans(
'Project').
' ';
890 if ($usercancreate && 1 == 2) {
891 if ($action !=
'classify') {
892 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.$warehouse->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> : ';
894 if ($action ==
'classify') {
895 $projectid = $warehouse->fk_project;
896 $morehtmlref .=
'<form method="post" action="'.$_SERVER[
'PHP_SELF'].
'?id='.$warehouse->id.
'">';
897 $morehtmlref .=
'<input type="hidden" name="action" value="classin">';
898 $morehtmlref .=
'<input type="hidden" name="token" value="'.newToken().
'">';
899 $morehtmlref .= $formproject->select_projects(($socid > 0 ? $socid : -1), (string) $projectid,
'projectid', 0, 0, 1, 1, 0, 0, 0,
'', 1, 0,
'maxwidth500');
900 $morehtmlref .=
'<input type="submit" class="button valignmiddle" value="'.$langs->trans(
"Modify").
'">';
901 $morehtmlref .=
'</form>';
903 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.$warehouse->id, $warehouse->socid, (
string) $warehouse->fk_project,
'none', 0, 0, 0, 1,
'',
'maxwidth300');
906 if (!empty($warehouse->fk_project)) {
908 $proj->fetch($warehouse->fk_project);
909 $morehtmlref .=
' : '.$proj->getNomUrl(1);
911 $morehtmlref .=
' - '.$proj->title;
918 $morehtmlref .=
'</div>';
921 if ($user->socid && !in_array(
'stock', explode(
',',
getDolGlobalString(
'MAIN_MODULES_FOR_EXTERNAL')))) {
925 dol_banner_tab($warehouse,
'ref', $linkback, $shownav,
'ref',
'ref', $morehtmlref);
928 print
'<div class="fichecenter">';
929 print
'<div class="fichehalfleft">';
930 print
'<div class="underbanner clearboth"></div>';
932 print
'<table class="border centpercent tableforfield">';
937 print
'<td class="titlefield tdtop">'.$langs->trans(
"Description").
'</td><td>'.
dol_htmlentitiesbr($warehouse->description).
'</td></tr>';
939 $calcproductsunique = $warehouse->nb_different_products();
940 $calcproducts = $warehouse->nb_products();
943 print
'<tr><td>'.$langs->trans(
"NumberOfDifferentProducts").
'</td><td>';
944 print empty($calcproductsunique[
'nb']) ?
'0' : $calcproductsunique[
'nb'];
948 print
'<tr><td>'.$langs->trans(
"NumberOfProducts").
'</td><td>';
949 $valtoshow =
price2num($calcproducts[
'nb'],
'MS');
950 print empty($valtoshow) ?
'0' : $valtoshow;
956 print
'<div class="fichehalfright">';
957 print
'<div class="underbanner clearboth"></div>';
959 print
'<table class="border centpercent tableforfield">';
962 if ($usercanreadsupplierprice) {
963 print
'<tr><td class="titlefield">'.$langs->trans(
"EstimatedStockValueShort").
'</td><td>';
964 print
price((empty($calcproducts[
'value']) ?
'0' :
price2num($calcproducts[
'value'],
'MT')), 0, $langs, 0, -1, -1, $conf->currency);
969 $sql =
"SELECT MAX(m.datem) as datem";
970 $sql .=
" FROM ".MAIN_DB_PREFIX.
"stock_mouvement as m";
971 $sql .=
" WHERE m.fk_entrepot = ".((int) $warehouse->id);
972 $resqlbis = $db->query($sql);
974 $lastmovementdate = 0;
976 $objbis = $db->fetch_object($resqlbis);
977 $lastmovementdate = $db->jdate($objbis->datem);
982 print
'<tr><td>'.$langs->trans(
"LastMovement").
'</td><td>';
983 if ($lastmovementdate) {
986 print $langs->trans(
"None");
991 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
995 print
'<tr><td valign="middle">'.$langs->trans(
"Categories").
'</td><td colspan="3">';
996 print $form->showCategories($warehouse->id, Categorie::TYPE_WAREHOUSE, 1);
1005 print
'<div class="clearboth"></div>';
1012if ($action ==
"correction") {
1013 include DOL_DOCUMENT_ROOT.
'/product/stock/tpl/stockcorrection.tpl.php';
1018if ($action ==
"transfer") {
1021 include DOL_DOCUMENT_ROOT.
'/product/stock/tpl/stocktransfer.tpl.php';
1027if ((empty($action) || $action ==
'list') && $id > 0) {
1028 print
"<div class=\"tabsAction\">\n";
1030 $parameters = array();
1031 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $warehouse, $action);
1033 if (empty($reshook)) {
1034 if ($user->hasRight(
'stock',
'mouvement',
'creer')) {
1035 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$id.
'&action=transfer&token='.
newToken().
'">'.$langs->trans(
"TransferStock").
'</a>';
1038 if ($user->hasRight(
'stock',
'mouvement',
'creer')) {
1039 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$id.
'&action=correction&token='.
newToken().
'">'.$langs->trans(
"CorrectStock").
'</a>';
1046$arrayofselected = is_array($toselect) ? $toselect : array();
1050 $param .=
'&mode='.urlencode($mode);
1052if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
1053 $param .=
'&contextpage='.urlencode($contextpage);
1055if ($limit > 0 && $limit != $conf->liste_limit) {
1056 $param .=
'&limit='.((int) $limit);
1059 $param .=
'&id='.urlencode((
string) (
$id));
1062 $param .=
'&show_files='.urlencode((
string) ($show_files));
1064if ($search_date_startday) {
1065 $param .=
'&search_date_startday='.urlencode((
string) ($search_date_startday));
1067if ($search_date_startmonth) {
1068 $param .=
'&search_date_startmonth='.urlencode((
string) ($search_date_startmonth));
1070if ($search_date_startyear) {
1071 $param .=
'&search_date_startyear='.urlencode((
string) ($search_date_startyear));
1073if ($search_date_endday) {
1074 $param .=
'&search_date_endday='.urlencode((
string) ($search_date_endday));
1076if ($search_date_endmonth) {
1077 $param .=
'&search_date_endmonth='.urlencode((
string) ($search_date_endmonth));
1079if ($search_date_endyear) {
1080 $param .=
'&search_date_endyear='.urlencode((
string) ($search_date_endyear));
1082if ($search_movement) {
1083 $param .=
'&search_movement='.urlencode($search_movement);
1085if ($search_inventorycode) {
1086 $param .=
'&search_inventorycode='.urlencode($search_inventorycode);
1088if ($search_type_mouvement) {
1089 $param .=
'&search_type_mouvement='.urlencode($search_type_mouvement);
1091if ($search_product_ref) {
1092 $param .=
'&search_product_ref='.urlencode($search_product_ref);
1094if ($search_product) {
1095 $param .=
'&search_product='.urlencode($search_product);
1098 $param .=
'&search_batch='.urlencode($search_batch);
1100if ($search_warehouse > 0) {
1101 $param .=
'&search_warehouse='.urlencode($search_warehouse);
1104 $param .=
'&search_user='.urlencode($search_user);
1106if ($idproduct > 0) {
1107 $param .=
'&idproduct='.urlencode((
string) ($idproduct));
1109if ($search_fk_project !=
'' && $search_fk_project !=
'-1') {
1110 $param .=
'&search_fk_project='.urlencode((
string) ($search_fk_project));
1113include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_param.tpl.php';
1115$parameters = array(
'param' => &$param);
1116$reshook = $hookmanager->executeHooks(
'printFieldListSearchParam', $parameters, $warehouse, $action);
1117$param .= $hookmanager->resPrint;
1120$arrayofmassactions = array();
1122 $arrayofmassactions[
'builddoc'] =
img_picto(
'',
'pdf',
'class="pictofixedwidth"').$langs->trans(
"GeneratePDF");
1126 $arrayofmassactions[
'predelete'] =
img_picto(
'',
'delete',
'class="pictofixedwidth"').$langs->trans(
"Delete");
1128if (!empty($permissiontoadd)) {
1129 $arrayofmassactions[
'prereverse'] =
img_picto(
'',
'add',
'class="pictofixedwidth"').$langs->trans(
"Reverse");
1131if (
GETPOSTINT(
'nomassaction') || in_array($massaction, array(
'presend',
'predelete',
'prereverse'))) {
1132 $arrayofmassactions = array();
1135$massactionbutton = $form->selectMassAction(
'', $arrayofmassactions);
1137print
'<form method="POST" id="searchFormList" action="'.$_SERVER[
"PHP_SELF"].
'">'.
"\n";
1138if ($optioncss !=
'') {
1139 print
'<input type="hidden" name="optioncss" value="'.$optioncss.
'">';
1141print
'<input type="hidden" name="token" value="'.newToken().
'">';
1142print
'<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1143print
'<input type="hidden" name="action" value="list">';
1144print
'<input type="hidden" name="sortfield" value="'.$sortfield.
'">';
1145print
'<input type="hidden" name="sortorder" value="'.$sortorder.
'">';
1146print
'<input type="hidden" name="type" value="'.$type.
'">';
1147print
'<input type="hidden" name="page" value="'.$page.
'">';
1148print
'<input type="hidden" name="contextpage" value="'.$contextpage.
'">';
1149print
'<input type="hidden" name="page_y" value="">';
1150print
'<input type="hidden" name="mode" value="'.$mode.
'">';
1152 print
'<input type="hidden" name="id" value="'.$id.
'">';
1158print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'movement', 0,
'',
'', $limit, 0, 0, 1);
1161$topicmail =
"SendStockMovement";
1162$modelmail =
"movementstock";
1164$trackid =
'mov'.$warehouse->id;
1165include DOL_DOCUMENT_ROOT.
'/core/tpl/massactions_pre.tpl.php';
1166if ($massaction ==
'prereverse') {
1167 print $form->formconfirm($_SERVER[
"PHP_SELF"], $langs->trans(
"ConfirmMassReverse"), $langs->trans(
"ConfirmMassReverseQuestion", count($toselect)),
"confirm_reverse",
null,
'', 0, 200, 500, 1,
'Yes');
1173 if (!isset($fieldstosearchall) || !is_array($fieldstosearchall)) {
1175 $fieldstosearchall = array();
1177 foreach ($fieldstosearchall as $key => $val) {
1178 $fieldstosearchall[$key] = $langs->trans($val);
1179 $setupstring .= $key.
"=".$val.
";";
1181 print
'<!-- Search done like if STOCK_QUICKSEARCH_ON_FIELDS = '.$setupstring.
' -->'.
"\n";
1182 print
'<div class="divsearchfieldfilter">'.$langs->trans(
"FilterOnInto", $search_all).implode(
', ', $fieldstosearchall).
'</div>'.
"\n";
1187$parameters = array(
'arrayfields' => &$arrayfields);
1188$reshook = $hookmanager->executeHooks(
'printFieldPreListTitle', $parameters, $warehouse, $action);
1189if (empty($reshook)) {
1190 $moreforfilter .= $hookmanager->resPrint;
1192 $moreforfilter = $hookmanager->resPrint;
1195if (!empty($moreforfilter)) {
1196 print
'<div class="liste_titre liste_titre_bydiv centpercent">';
1197 print $moreforfilter;
1201$varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1202$htmlofselectarray = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
getDolGlobalString(
'MAIN_CHECKBOX_LEFT_COLUMN'));
1203$selectedfields = ($mode !=
'kanban' ? $htmlofselectarray :
'');
1204$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons(
'checkforselect', 1) :
'');
1206print
'<div class="div-table-responsive">';
1207print
'<table class="tagtable nobottomiftotal liste'.($moreforfilter ?
" listwithfilterbefore" :
"").
'">'.
"\n";
1211print
'<tr class="liste_titre_filter">';
1214 print
'<td class="liste_titre center maxwidthsearch">';
1215 $searchpicto = $form->showFilterButtons(
'left');
1219if (!empty($arrayfields[
'm.rowid'][
'checked'])) {
1221 print
'<td class="liste_titre left">';
1222 print
'<input class="flat maxwidth40" type="text" name="search_ref" value="'.dol_escape_htmltag($search_ref).
'">';
1225if (!empty($arrayfields[
'm.datem'][
'checked'])) {
1227 print
'<td class="liste_titre center">';
1228 print
'<div class="nowrapfordate">';
1229 print $form->selectDate($search_date_start ? $search_date_start : -1,
'search_date_start', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'From'),
'tzuserrel');
1231 print
'<div class="nowrapfordate">';
1232 print $form->selectDate($search_date_end ? $search_date_end : -1,
'search_date_end', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'to'),
'tzuserrel');
1236if (!empty($arrayfields[
'p.ref'][
'checked'])) {
1238 print
'<td class="liste_titre left">';
1239 print
'<input class="flat maxwidth75" type="text" name="search_product_ref" value="'.dol_escape_htmltag($idproduct ? $product->ref : $search_product_ref).
'">';
1242if (!empty($arrayfields[
'p.label'][
'checked'])) {
1244 print
'<td class="liste_titre left">';
1245 print
'<input class="flat maxwidth100" type="text" name="search_product" value="'.dol_escape_htmltag($idproduct ? $product->label : $search_product).
'">';
1249if (!empty($arrayfields[
'm.batch'][
'checked'])) {
1250 print
'<td class="liste_titre center"><input class="flat maxwidth75" type="text" name="search_batch" value="'.dol_escape_htmltag($search_batch).
'"></td>';
1252if (!empty($arrayfields[
'pl.eatby'][
'checked'])) {
1253 print
'<td class="liste_titre left">';
1256if (!empty($arrayfields[
'pl.sellby'][
'checked'])) {
1257 print
'<td class="liste_titre left">';
1261if (!empty($arrayfields[
'e.ref'][
'checked'])) {
1262 print
'<td class="liste_titre maxwidthonsmartphone left">';
1264 print $formproduct->selectWarehouses($search_warehouse,
'search_warehouse',
'warehouseopen,warehouseinternal', 1, 0, 0,
'', 0, 0, array(),
'maxwidth150');
1267if (!empty($arrayfields[
'm.fk_user_author'][
'checked'])) {
1269 print
'<td class="liste_titre left">';
1270 print
'<input class="flat" type="text" size="6" name="search_user" value="'.dol_escape_htmltag($search_user).
'">';
1273if (!empty($arrayfields[
'm.inventorycode'][
'checked'])) {
1275 print
'<td class="liste_titre left">';
1276 print
'<input class="flat" type="text" size="4" name="search_inventorycode" value="'.dol_escape_htmltag($search_inventorycode).
'">';
1279if (!empty($arrayfields[
'm.label'][
'checked'])) {
1281 print
'<td class="liste_titre left">';
1282 print
'<input class="flat" type="text" size="8" name="search_movement" value="'.dol_escape_htmltag($search_movement).
'">';
1285if (!empty($arrayfields[
'origin'][
'checked'])) {
1287 print
'<td class="liste_titre left">';
1291if (!empty($arrayfields[
'm.fk_projet'][
'checked'])) {
1293 print
'<td class="liste_titre" align="left">';
1294 print $warehouse->showInputField($warehouse->fields[
'fk_project'],
'fk_project', $search_fk_project,
'',
'',
'search_',
'maxwidth125', 1);
1297if (!empty($arrayfields[
'm.type_mouvement'][
'checked'])) {
1299 print
'<td class="liste_titre center">';
1301 print
'<select id="search_type_mouvement" name="search_type_mouvement" class="maxwidth150">';
1302 print
'<option value="" '.(($search_type_mouvement ==
"") ?
'selected="selected"' :
'').
'> </option>';
1303 print
'<option value="0" '.(($search_type_mouvement ==
"0") ?
'selected="selected"' :
'').
'>'.$langs->trans(
'StockIncreaseAfterCorrectTransfer').
'</option>';
1304 print
'<option value="1" '.(($search_type_mouvement ==
"1") ?
'selected="selected"' :
'').
'>'.$langs->trans(
'StockDecreaseAfterCorrectTransfer').
'</option>';
1305 print
'<option value="2" '.(($search_type_mouvement ==
"2") ?
'selected="selected"' :
'').
'>'.$langs->trans(
'StockDecrease').
'</option>';
1306 print
'<option value="3" '.(($search_type_mouvement ==
"3") ?
'selected="selected"' :
'').
'>'.$langs->trans(
'StockIncrease').
'</option>';
1313if (!empty($arrayfields[
'm.value'][
'checked'])) {
1315 print
'<td class="liste_titre right">';
1316 print
'<input class="flat width50 right" type="text" name="search_qty" value="'.dol_escape_htmltag($search_qty).
'">';
1319if (!empty($arrayfields[
'm.price'][
'checked'])) {
1321 print
'<td class="liste_titre" align="left">';
1327include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_input.tpl.php';
1330$parameters = array(
'arrayfields' => $arrayfields);
1331$reshook = $hookmanager->executeHooks(
'printFieldListOption', $parameters, $warehouse, $action);
1332print $hookmanager->resPrint;
1334if (!empty($arrayfields[
'm.datec'][
'checked'])) {
1335 print
'<td class="liste_titre">';
1339if (!empty($arrayfields[
'm.tms'][
'checked'])) {
1340 print
'<td class="liste_titre">';
1345 print
'<td class="liste_titre center maxwidthsearch">';
1346 $searchpicto = $form->showFilterButtons();
1357print
'<tr class="liste_titre">';
1360 print
getTitleFieldOfList($selectedfields, 0, $_SERVER[
"PHP_SELF"],
'',
'',
'',
'', $sortfield, $sortorder,
'center maxwidthsearch ').
"\n";
1363if (!empty($arrayfields[
'm.rowid'][
'checked'])) {
1364 print_liste_field_titre($arrayfields[
'm.rowid'][
'label'], $_SERVER[
"PHP_SELF"],
'm.rowid',
'', $param,
'', $sortfield, $sortorder);
1366if (!empty($arrayfields[
'm.datem'][
'checked'])) {
1367 print_liste_field_titre($arrayfields[
'm.datem'][
'label'], $_SERVER[
"PHP_SELF"],
'm.datem',
'', $param,
'', $sortfield, $sortorder,
'center ');
1369if (!empty($arrayfields[
'p.ref'][
'checked'])) {
1370 print_liste_field_titre($arrayfields[
'p.ref'][
'label'], $_SERVER[
"PHP_SELF"],
'p.ref',
'', $param,
'', $sortfield, $sortorder);
1372if (!empty($arrayfields[
'p.label'][
'checked'])) {
1373 print_liste_field_titre($arrayfields[
'p.label'][
'label'], $_SERVER[
"PHP_SELF"],
'p.label',
'', $param,
'', $sortfield, $sortorder);
1375if (!empty($arrayfields[
'm.batch'][
'checked'])) {
1376 print_liste_field_titre($arrayfields[
'm.batch'][
'label'], $_SERVER[
"PHP_SELF"],
'm.batch',
'', $param,
'', $sortfield, $sortorder,
'center ');
1378if (!empty($arrayfields[
'pl.eatby'][
'checked'])) {
1379 print_liste_field_titre($arrayfields[
'pl.eatby'][
'label'], $_SERVER[
"PHP_SELF"],
'pl.eatby',
'', $param,
'', $sortfield, $sortorder,
'center ');
1381if (!empty($arrayfields[
'pl.sellby'][
'checked'])) {
1382 print_liste_field_titre($arrayfields[
'pl.sellby'][
'label'], $_SERVER[
"PHP_SELF"],
'pl.sellby',
'', $param,
'', $sortfield, $sortorder,
'center ');
1384if (!empty($arrayfields[
'e.ref'][
'checked'])) {
1386 print_liste_field_titre($arrayfields[
'e.ref'][
'label'], $_SERVER[
"PHP_SELF"],
"e.ref",
"", $param,
"", $sortfield, $sortorder);
1388if (!empty($arrayfields[
'm.fk_user_author'][
'checked'])) {
1389 print_liste_field_titre($arrayfields[
'm.fk_user_author'][
'label'], $_SERVER[
"PHP_SELF"],
"m.fk_user_author",
"", $param,
"", $sortfield, $sortorder);
1391if (!empty($arrayfields[
'm.inventorycode'][
'checked'])) {
1392 print_liste_field_titre($arrayfields[
'm.inventorycode'][
'label'], $_SERVER[
"PHP_SELF"],
"m.inventorycode",
"", $param,
"", $sortfield, $sortorder);
1394if (!empty($arrayfields[
'm.label'][
'checked'])) {
1395 print_liste_field_titre($arrayfields[
'm.label'][
'label'], $_SERVER[
"PHP_SELF"],
"m.label",
"", $param,
"", $sortfield, $sortorder);
1397if (!empty($arrayfields[
'origin'][
'checked'])) {
1398 print_liste_field_titre($arrayfields[
'origin'][
'label'], $_SERVER[
"PHP_SELF"],
"",
"", $param,
"", $sortfield, $sortorder);
1400if (!empty($arrayfields[
'm.fk_projet'][
'checked'])) {
1401 print_liste_field_titre($arrayfields[
'm.fk_projet'][
'label'], $_SERVER[
"PHP_SELF"],
"m.fk_projet",
"", $param,
'', $sortfield, $sortorder);
1403if (!empty($arrayfields[
'm.type_mouvement'][
'checked'])) {
1404 print_liste_field_titre($arrayfields[
'm.type_mouvement'][
'label'], $_SERVER[
"PHP_SELF"],
"m.type_mouvement",
"", $param,
'', $sortfield, $sortorder,
'center ');
1406if (!empty($arrayfields[
'm.value'][
'checked'])) {
1407 print_liste_field_titre($arrayfields[
'm.value'][
'label'], $_SERVER[
"PHP_SELF"],
"m.value",
"", $param,
'', $sortfield, $sortorder,
'right ');
1409if (!empty($arrayfields[
'm.price'][
'checked'])) {
1410 print_liste_field_titre($arrayfields[
'm.price'][
'label'], $_SERVER[
"PHP_SELF"],
"m.price",
"", $param,
'', $sortfield, $sortorder,
'right ');
1414include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_title.tpl.php';
1417$parameters = array(
'arrayfields' => $arrayfields,
'param' => $param,
'sortfield' => $sortfield,
'sortorder' => $sortorder,
'totalarray' => &$totalarray);
1418$reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $warehouse, $action);
1419print $hookmanager->resPrint;
1420if (!empty($arrayfields[
'm.datec'][
'checked'])) {
1421 print_liste_field_titre($arrayfields[
'm.datec'][
'label'], $_SERVER[
"PHP_SELF"],
"m.datec",
"", $param,
'', $sortfield, $sortorder,
'center nowrap ');
1423if (!empty($arrayfields[
'm.tms'][
'checked'])) {
1424 print_liste_field_titre($arrayfields[
'm.tms'][
'label'], $_SERVER[
"PHP_SELF"],
"m.tms",
"", $param,
'', $sortfield, $sortorder,
'center nowrap ');
1428 print
getTitleFieldOfList($selectedfields, 0, $_SERVER[
"PHP_SELF"],
'',
'',
'',
'', $sortfield, $sortorder,
'center maxwidthsearch ').
"\n";
1434$arrayofuniqueproduct = array();
1443$imaxinloop = ($limit ? min($num, $limit) : $num);
1444while ($i < $imaxinloop) {
1445 $obj = $db->fetch_object($resql);
1450 $userstatic->id = $obj->fk_user_author;
1451 $userstatic->login = $obj->login;
1452 $userstatic->lastname = $obj->lastname;
1453 $userstatic->firstname = $obj->firstname;
1454 $userstatic->photo = $obj->photo;
1455 $userstatic->email = $obj->user_email;
1456 $userstatic->status = $obj->user_status;
1461 $sql =
"SELECT label";
1462 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product_lang";
1463 $sql .=
" WHERE fk_product = ".((int) $obj->rowid);
1464 $sql .=
" AND lang = '".$db->escape($langs->getDefaultLang()).
"'";
1467 $result = $db->query($sql);
1469 $objtp = $db->fetch_object($result);
1470 if (!empty($objtp->label)) {
1471 $obj->produit = $objtp->label;
1476 $productstatic->id = $obj->rowid;
1477 $productstatic->ref = $obj->product_ref;
1478 $productstatic->label = $obj->produit;
1479 $productstatic->type = $obj->type;
1480 $productstatic->entity = $obj->entity;
1481 $productstatic->status = $obj->tosell;
1482 $productstatic->status_buy = $obj->tobuy;
1483 $productstatic->status_batch = $obj->tobatch;
1485 $productlot->id = $obj->lotid;
1486 $productlot->batch = $obj->batch;
1487 $productlot->eatby = $obj->eatby;
1488 $productlot->sellby = $obj->sellby;
1490 $warehousestatic->id = $obj->entrepot_id;
1491 $warehousestatic->ref = $obj->warehouse_ref;
1492 $warehousestatic->label = $obj->warehouse_ref;
1493 $warehousestatic->lieu = $obj->lieu;
1494 $warehousestatic->fk_parent = $obj->fk_parent;
1495 $warehousestatic->statut = $obj->statut;
1501 $object->warehouse_id = $obj->entrepot_id;
1502 $object->type = $obj->type_mouvement;
1504 $arrayofuniqueproduct[$obj->rowid] = $obj->produit;
1505 if (!empty($obj->fk_origin)) {
1506 $origin =
$object->get_origin($obj->fk_origin, $obj->origintype);
1511 if ($mode ==
'kanban') {
1513 print
'<tr class="trkanban"><td colspan="'.$savnbfield.
'">';
1514 print
'<div class="box-flex-container kanban">';
1518 if ($massactionbutton || $massaction) {
1520 if (in_array($warehouse->id, $arrayofselected)) {
1524 print $warehouse->getKanbanView(
'', array(
'selected' => $selected));
1525 if ($i == ($imaxinloop - 1)) {
1532 print
'<tr data-rowid="'.$warehouse->id.
'" class="oddeven">';
1535 print
'<td class="nowrap center">';
1536 if ($massactionbutton || $massaction) {
1538 if (in_array($obj->mid, $arrayofselected)) {
1541 print
'<input id="cb'.$obj->mid.
'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->mid.
'"'.($selected ?
' checked="checked"' :
'').
'>';
1549 if (!empty($arrayfields[
'm.rowid'][
'checked'])) {
1550 print
'<td class="nowraponall">';
1555 if (!empty($arrayfields[
'm.datem'][
'checked'])) {
1556 print
'<td class="nowraponall center">'.dol_print_date($db->jdate($obj->datem),
'dayhour',
'tzuserrel').
'</td>';
1559 if (!empty($arrayfields[
'p.ref'][
'checked'])) {
1560 print
'<td class="nowraponall">';
1561 print $productstatic->getNomUrl(1,
'stock', 16);
1565 if (!empty($arrayfields[
'p.label'][
'checked'])) {
1566 print
'<td class="tdoverflowmax150" title="'.dol_escape_htmltag($productstatic->label).
'">';
1567 print $productstatic->label;
1571 if (!empty($arrayfields[
'm.batch'][
'checked'])) {
1572 print
'<td class="center nowraponall">';
1573 if ($productlot->id > 0) {
1574 print $productlot->getNomUrl(1);
1576 print $productlot->batch;
1581 if (!empty($arrayfields[
'pl.eatby'][
'checked'])) {
1582 print
'<td class="center">'.dol_print_date($obj->eatby,
'day').
'</td>';
1585 if (!empty($arrayfields[
'pl.sellby'][
'checked'])) {
1586 print
'<td class="center">'.dol_print_date($obj->sellby,
'day').
'</td>';
1589 if (!empty($arrayfields[
'e.ref'][
'checked'])) {
1590 print
'<td class="tdoverflowmax150">';
1591 print $warehousestatic->getNomUrl(1);
1595 if (!empty($arrayfields[
'm.fk_user_author'][
'checked'])) {
1596 print
'<td class="tdoverflowmax100">';
1597 print $userstatic->getNomUrl(-1);
1601 if (!empty($arrayfields[
'm.inventorycode'][
'checked'])) {
1602 print
'<td class="tdoverflowmax150" title="'.dolPrintHTML($obj->inventorycode).
'">';
1603 if ($obj->inventorycode) {
1604 print
img_picto(
'',
'movement',
'class="pictofixedwidth"');
1605 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?search_inventorycode='.urlencode(
'^'.$obj->inventorycode.
'$').
'">'.
dol_escape_htmltag($obj->inventorycode).
'</a>';
1610 if (!empty($arrayfields[
'm.label'][
'checked'])) {
1611 print
'<td class="tdoverflowmax200" title="'.dol_escape_htmltag($obj->label).
'">'.
dol_escape_htmltag($obj->label).
'</td>';
1614 if (!empty($arrayfields[
'origin'][
'checked'])) {
1615 print
'<td class="nowraponall">'.$origin.
'</td>';
1618 if (!empty($arrayfields[
'm.fk_projet'][
'checked'])) {
1620 if ($obj->fk_project != 0) {
1621 print
$object->get_origin($obj->fk_project,
'project');
1626 if (!empty($arrayfields[
'm.type_mouvement'][
'checked'])) {
1627 print
'<td class="center">';
1628 print
$object->getTypeMovement();
1632 if (!empty($arrayfields[
'm.value'][
'checked'])) {
1633 print
'<td class="right">';
1634 if ($obj->qty > 0) {
1635 print
'<span class="stockmovemententry">';
1640 print
'<span class="stockmovementexit">';
1647 if (!empty($arrayfields[
'm.price'][
'checked'])) {
1649 $displayprice =
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') ? $user->hasRight(
'product',
'product_advance',
'read_supplier_prices') : $user->hasRight(
'product',
'lire');
1650 if ($productstatic->isService()) {
1651 $displayprice =
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') ? $user->hasRight(
'service',
'service_advance',
'read_supplier_prices') : $user->hasRight(
'service',
'lire');
1653 print
'<td class="right">';
1654 if ($obj->price != 0 && $displayprice) {
1655 print
price($obj->price);
1661 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_print_fields.tpl.php';
1663 $parameters = array(
'arrayfields' => $arrayfields,
'object' => $object,
'obj' => $obj,
'i' => $i,
'totalarray' => &$totalarray);
1664 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
1665 print $hookmanager->resPrint;
1669 print
'<td class="nowrap center">';
1670 if ($massactionbutton || $massaction) {
1672 if (in_array($obj->mid, $arrayofselected)) {
1675 print
'<input id="cb'.$obj->mid.
'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->mid.
'"'.($selected ?
' checked="checked"' :
'').
'>';
1692 foreach ($arrayfields as $key => $val) {
1693 if (!empty($val[
'checked'])) {
1697 print
'<tr><td colspan="'.$colspan.
'"><span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span></td></tr>';
1702$parameters = array(
'arrayfields' => $arrayfields,
'sql' => $sql);
1703$reshook = $hookmanager->executeHooks(
'printFieldListFooter', $parameters, $object, $action);
1704print $hookmanager->resPrint;
1706print
'</table>'.
"\n";
1709print
'</form>'.
"\n";
1712if (count($arrayofuniqueproduct) == 1 && !empty($search_date_startyear) && is_numeric($search_date_startyear)) {
1715 $productidselected = 0;
1716 foreach ($arrayofuniqueproduct as $key => $val) {
1717 $productidselected = $key;
1718 $productlabelselected = $val;
1720 $datebefore =
dol_get_first_day($search_date_startyear ? $search_date_startyear :
dol_print_date(time(),
"%Y"), $search_date_startmonth ? $search_date_startmonth : 1, true);
1721 $dateafter =
dol_get_last_day($search_date_endyear ? $search_date_endyear :
dol_print_date(time(),
"%Y"), $search_date_endmonth ? $search_date_endmonth : 12, true);
1722 $balancebefore =
$object->calculateBalanceForProductBefore($productidselected, $datebefore);
1723 $balanceafter =
$object->calculateBalanceForProductBefore($productidselected, $dateafter);
1726 print $langs->trans(
"NbOfProductBeforePeriod", $productlabelselected,
dol_print_date($datebefore,
'day',
'gmt'));
1729 print
': '.$balancebefore;
1733 print $langs->trans(
"NbOfProductAfterPeriod", $productlabelselected,
dol_print_date($dateafter,
'day',
'gmt'));
1736 print
': '.$balanceafter;
1741if (in_array(
'builddoc', array_keys($arrayofmassactions)) && ($nbtotalofrecords ===
'' || $nbtotalofrecords)) {
1742 $hidegeneratedfilelistifempty = 1;
1743 if ($massaction ==
'builddoc' || $action ==
'remove_file' || $show_files) {
1744 $hidegeneratedfilelistifempty = 0;
1747 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
1751 $urlsource = $_SERVER[
'PHP_SELF'].
'?sortfield='.$sortfield.
'&sortorder='.$sortorder;
1752 $urlsource .= str_replace(
'&',
'&', $param);
1754 $filedir = $diroutputmassaction;
1755 $genallowed = $permissiontoread;
1756 $delallowed = $permissiontoadd;
1758 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)
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, $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'.
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.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
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...
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...
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.