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';
161$parameters = array(
'arrayfields' => &$arrayfields);
162$reshook = $hookmanager->executeHooks(
'completeArrayFields', $parameters, $object, $action);
165 unset($arrayfields[
'pl.sellby']);
168 unset($arrayfields[
'pl.eatby']);
172 $usercanreadsupplierprice =
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') ? $user->hasRight(
'product',
'product_advance',
'read_supplier_prices') : $user->hasRight(
'product',
'lire');
174 $usercanreadsupplierprice = $user->hasRight(
'product',
'product_advance',
'read_supplier_prices') || $user->hasRight(
'product',
'service_advance',
'read_supplier_prices');
176 $usercanreadsupplierprice = $user->hasRight(
'product',
'lire') || $user->hasRight(
'service',
'lire');
179if (!$usercanreadsupplierprice) {
180 unset($arrayfields[
'm.price']);
184if ($id > 0 || !empty($ref)) {
185 $tmpwarehouse->fetch($id, $ref);
186 $id = $tmpwarehouse->id;
190if ($user->socid > 0) {
191 $socid = $user->socid;
199if (!$user->hasRight(
'stock',
'mouvement',
'lire')) {
203$uploaddir =
$conf->stock->dir_output.
'/movements';
205$permissiontoread = $user->hasRight(
'stock',
'mouvement',
'lire');
206$permissiontoadd = $user->hasRight(
'stock',
'mouvement',
'creer');
207$permissiontodelete = $user->hasRight(
'stock',
'mouvement',
'creer');
208$permissiontoeditextra = $permissiontoadd;
209if (
GETPOST(
'attribute',
'aZ09') && isset($extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')])) {
211 $permissiontoeditextra =
dol_eval((
string) $extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')]);
214$usercanread = $user->hasRight(
'stock',
'mouvement',
'lire');
215$usercancreate = $user->hasRight(
'stock',
'mouvement',
'creer');
216$usercandelete = $user->hasRight(
'stock',
'mouvement',
'creer');
225if (
GETPOST(
'cancel',
'alpha')) {
229if (!
GETPOST(
'confirmmassaction',
'alpha') && $massaction !=
'presend' && $massaction !=
'confirm_presend') {
233$parameters = array();
234$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
239if (empty($reshook)) {
241 include DOL_DOCUMENT_ROOT.
'/core/actions_changeselectedfields.inc.php';
244 if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
245 $search_date_startday =
'';
246 $search_date_startmonth =
'';
247 $search_date_startyear =
'';
248 $search_date_endday =
'';
249 $search_date_endmonth =
'';
250 $search_date_endyear =
'';
251 $search_date_start =
'';
252 $search_date_end =
'';
254 $search_movement =
"";
255 $search_type_mouvement =
"";
256 $search_inventorycode =
"";
257 $search_product_ref =
"";
258 $search_product =
"";
259 $search_warehouse =
"";
263 $search_fk_project =
"";
266 $search_array_options = array();
268 if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')
269 ||
GETPOST(
'button_search_x',
'alpha') ||
GETPOST(
'button_search.x',
'alpha') ||
GETPOST(
'button_search',
'alpha')) {
271 if ($action ==
'confirm_reverse') {
277 $objectclass =
'MouvementStock';
278 $objectlabel =
'MouvementStock';
280 if (!$error && $massaction ==
"builddoc" && $permissiontoread && !
GETPOST(
'button_search')) {
281 if (empty($diroutputmassaction)) {
282 dol_print_error(
null,
'include of actions_massactions.inc.php is done but var $diroutputmassaction was not defined');
286 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
287 require_once DOL_DOCUMENT_ROOT.
'/core/lib/pdf.lib.php';
288 require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
291 $listofobjectids = array();
292 foreach ($toselect as $toselectid) {
294 $result = $objecttmp->fetch($toselectid);
296 $listofobjectids[$toselectid] = $toselectid;
300 $arrayofinclusion = array();
301 foreach ($listofobjectids as $tmppdf) {
304 foreach ($listofobjectids as $tmppdf) {
305 $arrayofinclusion[] =
'^'.preg_quote(
dol_sanitizeFileName($tmppdf),
'/').
'_[a-zA-Z0-9-_]+\.pdf$';
307 $listoffiles =
dol_dir_list($uploaddir,
'all', 1, implode(
'|', $arrayofinclusion),
'\.meta$|\.png',
'date', SORT_DESC, 0, 1);
310 $outputlangs = $langs;
313 $newlang =
GETPOST(
'lang_id',
'aZ09');
318 if (!empty($newlang)) {
320 $outputlangs->setDefaultLang($newlang);
328 $filename = preg_replace(
'/\s/',
'_', $filename);
340 $file = $diroutputmassaction.
'/'.$filename.
'_'.
dol_print_date($now,
'dayhourlog').
'.pdf';
349 $langs->load(
"exports");
358 include DOL_DOCUMENT_ROOT.
'/core/actions_massactions.inc.php';
361if ($action ==
'update_extras' && $permissiontoeditextra) {
362 $tmpwarehouse->oldcopy =
dol_clone($tmpwarehouse, 2);
364 $attribute_name =
GETPOST(
'attribute',
'aZ09');
367 $ret = $extrafields->setOptionalsFromPost(
null, $tmpwarehouse, $attribute_name);
373 $result = $tmpwarehouse->updateExtraField($attribute_name,
'CONTRACT_MODIFY');
381 $action =
'edit_extras';
393if ($action ==
"correct_stock" && $permissiontoadd) {
395 if (!empty($product_id)) {
396 $result = $product->fetch($product_id);
401 if (empty($product_id)) {
403 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Product")),
null,
'errors');
404 $action =
'correction';
408 setEventMessages($langs->trans(
"ErrorFieldMustBeANumeric", $langs->transnoentitiesnoconv(
"NumberOfUnit")),
null,
'errors');
409 $action =
'correction';
413 $origin_element =
'';
417 $origin_element =
'project';
421 if ($product->hasbatch()) {
422 $batch =
GETPOST(
'batch_number',
'alphanohtml');
427 $result = $product->correct_stock_batch(
432 GETPOST(
"label",
'alphanohtml'),
437 GETPOST(
'inventorycode',
'alphanohtml'),
444 $result = $product->correct_stock(
449 GETPOST(
"label",
'alphanohtml'),
451 GETPOST(
'inventorycode',
'alphanohtml'),
460 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
465 $action =
'correction';
475if ($action ==
"transfert_stock" && $permissiontoadd && !$cancel) {
478 if (!empty($product_id)) {
479 $result = $product->fetch($product_id);
482 if (!(
GETPOSTINT(
"id_entrepot_destination") > 0)) {
483 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Warehouse")),
null,
'errors');
485 $action =
'transfer';
487 if (empty($product_id)) {
489 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Product")),
null,
'errors');
490 $action =
'transfer';
493 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"NumberOfUnit")),
null,
'errors');
495 $action =
'transfer';
497 if ($id ==
GETPOSTINT(
"id_entrepot_destination")) {
498 setEventMessages($langs->trans(
"ErrorSrcAndTargetWarehouseMustDiffers"),
null,
'errors');
500 $action =
'transfer';
505 $result = $product->fetch($product_id);
507 if ($product->hasbatch() && !
GETPOST(
"batch_number")) {
508 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"batch_number")),
null,
'errors');
510 $action =
'transfer';
517 $result = $warehouse->fetch($id);
521 $product->load_stock(
'novirtual');
525 if (isset($product->pmp)) {
526 $pricesrc = $product->pmp;
528 $pricedest = $pricesrc;
530 if ($product->hasbatch()) {
538 $result = $pdluo->fetch($pdluoid);
540 $srcwarehouseid = $pdluo->warehouseid;
541 $batch = $pdluo->batch;
547 $srcwarehouseid =
$id;
548 $batch =
GETPOST(
'batch_number',
'alphanohtml');
555 $result1 = $product->correct_stock_batch(
572 $result2 = $product->correct_stock_batch(
582 GETPOST(
'inventorycode',
'alphanohtml'),
591 $result1 = $product->correct_stock(
596 GETPOST(
"label",
'alphanohtml'),
598 GETPOST(
'inventorycode',
'alphanohtml'),
606 $result2 = $product->correct_stock(
611 GETPOST(
"label",
'alphanohtml'),
613 GETPOST(
'inventorycode',
'alphanohtml'),
620 if (!$error && $result1 >= 0 && $result2 >= 0) {
624 header(
"Location: ".$backtopage);
627 header(
"Location: movement_list.php?id=".$warehouse->id);
633 $action =
'transfer';
640if (!$error && $action ==
'confirm_reverse' && $confirm ==
"yes" && $permissiontoadd) {
641 $toselect = array_map(
'intval', $toselect);
646 $sql =
"SELECT rowid, label, inventorycode, datem";
647 $sql .=
" FROM ".MAIN_DB_PREFIX.
"stock_mouvement";
648 $sql .=
" WHERE rowid IN (".$db->sanitize(implode(
',', $toselect)).
")";
650 $resql =
$db->query($sql);
652 $num =
$db->num_rows($resql);
655 $obj =
$db->fetch_object($resql);
663 $reverse =
$object->reverseMovement();
683 header(
"Location: ".$_SERVER[
"PHP_SELF"]);
708$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,";
709$sql .=
" e.ref as warehouse_ref, e.rowid as entrepot_id, e.lieu, e.fk_parent, e.statut,";
710$sql .=
" m.rowid as mid, m.value as qty, m.datem, m.fk_user_author, m.label, m.inventorycode, m.fk_origin, m.origintype,";
711$sql .=
" m.batch, m.price,";
712$sql .=
" m.type_mouvement,";
713$sql .=
" m.fk_projet as fk_project,";
714$sql .=
" pl.rowid as lotid, pl.eatby, pl.sellby,";
715$sql .=
" u.login, u.photo, u.lastname, u.firstname, u.email as user_email, u.statut as user_status";
717if (!empty($extrafields->attributes[
$object->table_element][
'label'])) {
718 foreach ($extrafields->attributes[
$object->table_element][
'label'] as $key => $val) {
719 $sql .= ($extrafields->attributes[
$object->table_element][
'type'][$key] !=
'separate' ?
", ef.".$key.
" as options_".$key :
'');
723$parameters = array();
724$reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters, $object, $action);
725$sql .= $hookmanager->resPrint;
726$sql = preg_replace(
'/,\s*$/',
'', $sql);
730$sql .=
" FROM ".MAIN_DB_PREFIX.
"entrepot as e,";
731$sql .=
" ".MAIN_DB_PREFIX.
"product as p,";
732$sql .=
" ".MAIN_DB_PREFIX.
"stock_mouvement as m";
733if (!empty($extrafields->attributes[
$object->table_element][
'label']) && is_array($extrafields->attributes[
$object->table_element][
'label']) && count($extrafields->attributes[
$object->table_element][
'label'])) {
734 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element.
"_extrafields as ef on (m.rowid = ef.fk_object)";
736$sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"user as u ON m.fk_user_author = u.rowid";
737$sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product_lot as pl ON m.batch = pl.batch AND m.fk_product = pl.fk_product";
740$parameters = array();
741$reshook = $hookmanager->executeHooks(
'printFieldListFrom', $parameters, $object, $action);
742$sql .= $hookmanager->resPrint;
744$sql .=
" WHERE m.fk_product = p.rowid";
746 $sql .=
" AND m.rowid = ".((int) $msid);
748$sql .=
" AND m.fk_entrepot = e.rowid";
749$sql .=
" AND e.entity IN (".getEntity(
'stock').
")";
751 $sql .=
" AND p.fk_product_type = 0";
754 $sql .=
" AND e.rowid = ".((int) $id);
756if (!empty($search_date_start)) {
757 $sql .=
" AND m.datem >= '" .
$db->idate($search_date_start) .
"'";
759if (!empty($search_date_end)) {
760 $sql .=
" AND m.datem <= '" .
$db->idate($search_date_end) .
"'";
763 $sql .=
" AND p.rowid = ".((int) $idproduct);
765if (!empty($search_ref)) {
768if (!empty($search_movement)) {
771if (!empty($search_inventorycode)) {
774if (!empty($search_product_ref)) {
777if (!empty($search_product)) {
780if ($search_warehouse !=
'' && $search_warehouse !=
'-1') {
783if (!empty($search_user)) {
784 $sql .=
natural_search(array(
'u.lastname',
'u.firstname',
'u.login'), $search_user);
786if (!empty($search_batch)) {
789if (!empty($product_id) && $product_id !=
'-1') {
792if (!empty($search_fk_project) && $search_fk_project !=
'-1') {
795if ($search_qty !=
'') {
798if ($search_type_mouvement !=
'' && $search_type_mouvement !=
'-1') {
799 $sql .=
natural_search(
'm.type_mouvement', $search_type_mouvement, 2);
802include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_sql.tpl.php';
804$parameters = array();
805$reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters, $object, $action);
806$sql .= $hookmanager->resPrint;
809$nbtotalofrecords =
'';
812 $sqlforcount = preg_replace(
'/^'.preg_quote($sqlfields,
'/').
'/',
'SELECT COUNT(*) as nbtotalofrecords', $sql);
813 $sqlforcount = preg_replace(
'/GROUP BY .*$/',
'', $sqlforcount);
814 $resql =
$db->query($sqlforcount);
816 $objforcount =
$db->fetch_object($resql);
817 $nbtotalofrecords = $objforcount->nbtotalofrecords;
822 if (($page * $limit) > (
int) $nbtotalofrecords) {
830$sql .=
$db->order($sortfield, $sortorder);
832 $sql .=
$db->plimit($limit + 1, $offset);
835$resql =
$db->query($sql);
841$num =
$db->num_rows($resql);
848 $product->fetch($idproduct);
850if ($id > 0 || $ref) {
851 $result = $warehouse->fetch($id, $ref);
858$help_url =
'EN:Module_Stocks_En|FR:Module_Stock|ES:Módulo_Stocks';
860 $title = $langs->trans(
'StockMovementForId', $msid);
862 $title = $langs->trans(
"StockMovements");
864 if (!empty($warehouse->ref)) {
865 $title .=
' ('.$warehouse->ref.
')';
867 $title .=
' ('.$langs->trans(
"ForThisWarehouse").
')';
876llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'bodyforlist mod-product page-stock_movement_list');
881if ($warehouse->id > 0) {
884 print
dol_get_fiche_head($head,
'movements', $langs->trans(
"Warehouse"), -1,
'stock');
887 $linkback =
'<a href="'.DOL_URL_ROOT.
'/product/stock/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
889 $morehtmlref =
'<div class="refidno">';
890 $morehtmlref .= $langs->trans(
"LocationSummary").
' : '.$warehouse->lieu;
894 $langs->load(
"projects");
895 $morehtmlref .=
'<br>'.img_picto(
'',
'project',
'class="pictofixedwidth"').$langs->trans(
'Project').
' ';
896 if ($usercancreate && 1 == 2) {
897 if ($action !=
'classify') {
898 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.$warehouse->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> : ';
900 if ($action ==
'classify') {
901 $projectid = $warehouse->fk_project;
902 $morehtmlref .=
'<form method="post" action="'.$_SERVER[
'PHP_SELF'].
'?id='.$warehouse->id.
'">';
903 $morehtmlref .=
'<input type="hidden" name="action" value="classin">';
904 $morehtmlref .=
'<input type="hidden" name="token" value="'.newToken().
'">';
905 $morehtmlref .= $formproject->select_projects(($socid > 0 ? $socid : -1), (
string) $projectid,
'projectid', 0, 0, 1, 1, 0, 0, 0,
'', 1, 0,
'maxwidth500');
906 $morehtmlref .=
'<input type="submit" class="button valignmiddle" value="'.$langs->trans(
"Modify").
'">';
907 $morehtmlref .=
'</form>';
909 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.$warehouse->id, $warehouse->socid, (
string) $warehouse->fk_project,
'none', 0, 0, 0, 1,
'',
'maxwidth300');
912 if (!empty($warehouse->fk_project)) {
914 $proj->fetch($warehouse->fk_project);
915 $morehtmlref .=
' : '.$proj->getNomUrl(1);
917 $morehtmlref .=
' - '.$proj->title;
924 $morehtmlref .=
'</div>';
927 if ($user->socid && !in_array(
'stock', explode(
',',
getDolGlobalString(
'MAIN_MODULES_FOR_EXTERNAL')))) {
931 dol_banner_tab($warehouse,
'ref', $linkback, $shownav,
'ref',
'ref', $morehtmlref);
934 print
'<div class="fichecenter">';
935 print
'<div class="fichehalfleft">';
936 print
'<div class="underbanner clearboth"></div>';
938 print
'<table class="border centpercent tableforfield">';
943 print
'<td class="titlefield tdtop">'.$langs->trans(
"Description").
'</td><td>'.
dol_htmlentitiesbr($warehouse->description).
'</td></tr>';
945 $calcproductsunique = $warehouse->nb_different_products();
946 $calcproducts = $warehouse->nb_products();
949 print
'<tr><td>'.$langs->trans(
"NumberOfDifferentProducts").
'</td><td>';
950 print empty($calcproductsunique[
'nb']) ?
'0' : $calcproductsunique[
'nb'];
954 print
'<tr><td>'.$langs->trans(
"NumberOfProducts").
'</td><td>';
955 $valtoshow =
price2num($calcproducts[
'nb'],
'MS');
956 print empty($valtoshow) ?
'0' : $valtoshow;
962 print
'<div class="fichehalfright">';
963 print
'<div class="underbanner clearboth"></div>';
965 print
'<table class="border centpercent tableforfield">';
968 if ($usercanreadsupplierprice) {
969 print
'<tr><td class="titlefield">'.$langs->trans(
"EstimatedStockValueShort").
'</td><td>';
970 print
price((empty($calcproducts[
'value']) ?
'0' :
price2num($calcproducts[
'value'],
'MT')), 0, $langs, 0, -1, -1,
$conf->currency);
975 $sql =
"SELECT MAX(m.datem) as datem";
976 $sql .=
" FROM ".MAIN_DB_PREFIX.
"stock_mouvement as m";
977 $sql .=
" WHERE m.fk_entrepot = ".((int) $warehouse->id);
978 $resqlbis =
$db->query($sql);
980 $lastmovementdate = 0;
982 $objbis =
$db->fetch_object($resqlbis);
983 $lastmovementdate =
$db->jdate($objbis->datem);
988 print
'<tr><td>'.$langs->trans(
"LastMovement").
'</td><td>';
989 if ($lastmovementdate) {
992 print $langs->trans(
"None");
997 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1001 print
'<tr><td valign="middle">'.$langs->trans(
"Categories").
'</td><td colspan="3">';
1002 print $form->showCategories($warehouse->id, Categorie::TYPE_WAREHOUSE, 1);
1011 print
'<div class="clearboth"></div>';
1018if ($action ==
"correction") {
1019 include DOL_DOCUMENT_ROOT.
'/product/stock/tpl/stockcorrection.tpl.php';
1024if ($action ==
"transfer") {
1027 include DOL_DOCUMENT_ROOT.
'/product/stock/tpl/stocktransfer.tpl.php';
1033if ((empty($action) || $action ==
'list') && $id > 0) {
1034 print
"<div class=\"tabsAction\">\n";
1036 $parameters = array();
1037 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $warehouse, $action);
1039 if (empty($reshook)) {
1040 if ($user->hasRight(
'stock',
'mouvement',
'creer')) {
1041 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$id.
'&action=transfer&token='.
newToken().
'">'.$langs->trans(
"TransferStock").
'</a>';
1044 if ($user->hasRight(
'stock',
'mouvement',
'creer')) {
1045 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$id.
'&action=correction&token='.
newToken().
'">'.$langs->trans(
"CorrectStock").
'</a>';
1052$arrayofselected = is_array($toselect) ? $toselect : array();
1056 $param .=
'&mode='.urlencode($mode);
1058if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
1059 $param .=
'&contextpage='.urlencode($contextpage);
1061if ($limit > 0 && $limit !=
$conf->liste_limit) {
1062 $param .=
'&limit='.((int) $limit);
1065 $param .=
'&id='.urlencode((
string) (
$id));
1068 $param .=
'&show_files='.urlencode((
string) ($show_files));
1070if ($search_date_startday) {
1071 $param .=
'&search_date_startday='.urlencode((
string) ($search_date_startday));
1073if ($search_date_startmonth) {
1074 $param .=
'&search_date_startmonth='.urlencode((
string) ($search_date_startmonth));
1076if ($search_date_startyear) {
1077 $param .=
'&search_date_startyear='.urlencode((
string) ($search_date_startyear));
1079if ($search_date_endday) {
1080 $param .=
'&search_date_endday='.urlencode((
string) ($search_date_endday));
1082if ($search_date_endmonth) {
1083 $param .=
'&search_date_endmonth='.urlencode((
string) ($search_date_endmonth));
1085if ($search_date_endyear) {
1086 $param .=
'&search_date_endyear='.urlencode((
string) ($search_date_endyear));
1088if ($search_movement) {
1089 $param .=
'&search_movement='.urlencode($search_movement);
1091if ($search_inventorycode) {
1092 $param .=
'&search_inventorycode='.urlencode($search_inventorycode);
1094if ($search_type_mouvement) {
1095 $param .=
'&search_type_mouvement='.urlencode($search_type_mouvement);
1097if ($search_product_ref) {
1098 $param .=
'&search_product_ref='.urlencode($search_product_ref);
1100if ($search_product) {
1101 $param .=
'&search_product='.urlencode($search_product);
1104 $param .=
'&search_batch='.urlencode($search_batch);
1106if ($search_warehouse > 0) {
1107 $param .=
'&search_warehouse='.urlencode($search_warehouse);
1110 $param .=
'&search_user='.urlencode($search_user);
1112if ($idproduct > 0) {
1113 $param .=
'&idproduct='.urlencode((
string) ($idproduct));
1115if ($search_fk_project !=
'' && $search_fk_project !=
'-1') {
1116 $param .=
'&search_fk_project='.urlencode((
string) ($search_fk_project));
1119include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_param.tpl.php';
1121$parameters = array(
'param' => &$param);
1122$reshook = $hookmanager->executeHooks(
'printFieldListSearchParam', $parameters, $warehouse, $action);
1123$param .= $hookmanager->resPrint;
1126$arrayofmassactions = array();
1128 $arrayofmassactions[
'builddoc'] =
img_picto(
'',
'pdf',
'class="pictofixedwidth"').$langs->trans(
"GeneratePDF");
1132 $arrayofmassactions[
'predelete'] =
img_picto(
'',
'delete',
'class="pictofixedwidth"').$langs->trans(
"Delete");
1134if (!empty($permissiontoadd)) {
1135 $arrayofmassactions[
'prereverse'] =
img_picto(
'',
'add',
'class="pictofixedwidth"').$langs->trans(
"Reverse");
1137if (
GETPOSTINT(
'nomassaction') || in_array($massaction, array(
'presend',
'predelete',
'prereverse'))) {
1138 $arrayofmassactions = array();
1141$massactionbutton = $form->selectMassAction(
'', $arrayofmassactions);
1143print
'<form method="POST" id="searchFormList" action="'.$_SERVER[
"PHP_SELF"].
'">'.
"\n";
1144if ($optioncss !=
'') {
1145 print
'<input type="hidden" name="optioncss" value="'.$optioncss.
'">';
1147print
'<input type="hidden" name="token" value="'.newToken().
'">';
1148print
'<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1149print
'<input type="hidden" name="action" value="list">';
1150print
'<input type="hidden" name="sortfield" value="'.$sortfield.
'">';
1151print
'<input type="hidden" name="sortorder" value="'.$sortorder.
'">';
1152print
'<input type="hidden" name="type" value="'.$type.
'">';
1153print
'<input type="hidden" name="page" value="'.$page.
'">';
1154print
'<input type="hidden" name="contextpage" value="'.$contextpage.
'">';
1155print
'<input type="hidden" name="page_y" value="">';
1156print
'<input type="hidden" name="mode" value="'.$mode.
'">';
1158 print
'<input type="hidden" name="id" value="'.$id.
'">';
1164print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'movement', 0,
'',
'', $limit, 0, 0, 1);
1167$topicmail =
"SendStockMovement";
1168$modelmail =
"movementstock";
1170$trackid =
'mov'.$warehouse->id;
1171include DOL_DOCUMENT_ROOT.
'/core/tpl/massactions_pre.tpl.php';
1172if ($massaction ==
'prereverse' && count($toselect) <=
getDolGlobalInt(
'MAIN_LIMIT_FOR_MASS_ACTIONS', 1000)) {
1173 print $form->formconfirm($_SERVER[
"PHP_SELF"], $langs->trans(
"ConfirmMassReverse"), $langs->trans(
"ConfirmMassReverseQuestion", count($toselect)),
"confirm_reverse",
null,
'', 0, 200, 500, 1,
'Yes');
1179 if (!isset($fieldstosearchall) || !is_array($fieldstosearchall)) {
1181 $fieldstosearchall = array();
1183 foreach ($fieldstosearchall as $key => $val) {
1184 $fieldstosearchall[$key] = $langs->trans($val);
1185 $setupstring .= $key.
"=".$val.
";";
1187 print
'<!-- Search done like if STOCK_QUICKSEARCH_ON_FIELDS = '.$setupstring.
' -->'.
"\n";
1188 print
'<div class="divsearchfieldfilter">'.$langs->trans(
"FilterOnInto", $search_all).implode(
', ', $fieldstosearchall).
'</div>'.
"\n";
1193$parameters = array(
'arrayfields' => &$arrayfields);
1194$reshook = $hookmanager->executeHooks(
'printFieldPreListTitle', $parameters, $warehouse, $action);
1195if (empty($reshook)) {
1196 $moreforfilter .= $hookmanager->resPrint;
1198 $moreforfilter = $hookmanager->resPrint;
1201if (!empty($moreforfilter)) {
1202 print
'<div class="liste_titre liste_titre_bydiv centpercent">';
1203 print $moreforfilter;
1207$varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1208$htmlofselectarray = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
$conf->main_checkbox_left_column);
1209$selectedfields = ($mode !=
'kanban' ? $htmlofselectarray :
'');
1210$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons(
'checkforselect', 1) :
'');
1212print
'<div class="div-table-responsive">';
1213print
'<table class="tagtable nobottomiftotal liste'.($moreforfilter ?
" listwithfilterbefore" :
"").
'">'.
"\n";
1217print
'<tr class="liste_titre_filter">';
1219if (
$conf->main_checkbox_left_column) {
1220 print
'<td class="liste_titre center maxwidthsearch">';
1221 $searchpicto = $form->showFilterButtons(
'left');
1225if (!empty($arrayfields[
'm.rowid'][
'checked'])) {
1227 print
'<td class="liste_titre left">';
1228 print
'<input class="flat maxwidth40" type="text" name="search_ref" value="'.dol_escape_htmltag($search_ref).
'">';
1231if (!empty($arrayfields[
'm.datem'][
'checked'])) {
1233 print
'<td class="liste_titre center">';
1234 print
'<div class="nowrapfordate">';
1235 print $form->selectDate($search_date_start ? $search_date_start : -1,
'search_date_start', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'From'),
'tzuserrel');
1237 print
'<div class="nowrapfordate">';
1238 print $form->selectDate($search_date_end ? $search_date_end : -1,
'search_date_end', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'to'),
'tzuserrel');
1242if (!empty($arrayfields[
'p.ref'][
'checked'])) {
1244 print
'<td class="liste_titre left">';
1245 print
'<input class="flat maxwidth75" type="text" name="search_product_ref" value="'.dol_escape_htmltag($idproduct ? $product->ref : $search_product_ref).
'">';
1248if (!empty($arrayfields[
'p.label'][
'checked'])) {
1250 print
'<td class="liste_titre left">';
1251 print
'<input class="flat maxwidth100" type="text" name="search_product" value="'.dol_escape_htmltag($idproduct ? $product->label : $search_product).
'">';
1255if (!empty($arrayfields[
'm.batch'][
'checked'])) {
1256 print
'<td class="liste_titre center"><input class="flat maxwidth75" type="text" name="search_batch" value="'.dol_escape_htmltag($search_batch).
'"></td>';
1258if (!empty($arrayfields[
'pl.eatby'][
'checked'])) {
1259 print
'<td class="liste_titre left">';
1262if (!empty($arrayfields[
'pl.sellby'][
'checked'])) {
1263 print
'<td class="liste_titre left">';
1267if (!empty($arrayfields[
'e.ref'][
'checked'])) {
1268 print
'<td class="liste_titre maxwidthonsmartphone left">';
1270 print $formproduct->selectWarehouses($search_warehouse,
'search_warehouse',
'warehouseopen,warehouseinternal', 1, 0, 0,
'', 0, 0, array(),
'maxwidth150');
1273if (!empty($arrayfields[
'm.fk_user_author'][
'checked'])) {
1275 print
'<td class="liste_titre left">';
1276 print
'<input class="flat" type="text" size="6" name="search_user" value="'.dol_escape_htmltag($search_user).
'">';
1279if (!empty($arrayfields[
'm.inventorycode'][
'checked'])) {
1281 print
'<td class="liste_titre left">';
1282 print
'<input class="flat" type="text" size="4" name="search_inventorycode" value="'.dol_escape_htmltag($search_inventorycode).
'">';
1285if (!empty($arrayfields[
'm.label'][
'checked'])) {
1287 print
'<td class="liste_titre left">';
1288 print
'<input class="flat" type="text" size="8" name="search_movement" value="'.dol_escape_htmltag($search_movement).
'">';
1291if (!empty($arrayfields[
'origin'][
'checked'])) {
1293 print
'<td class="liste_titre left">';
1297if (!empty($arrayfields[
'm.fk_projet'][
'checked'])) {
1299 print
'<td class="liste_titre" align="left">';
1300 print $warehouse->showInputField($warehouse->fields[
'fk_project'],
'fk_project', $search_fk_project,
'',
'',
'search_',
'maxwidth125', 1);
1303if (!empty($arrayfields[
'm.type_mouvement'][
'checked'])) {
1305 print
'<td class="liste_titre center">';
1307 print
'<select id="search_type_mouvement" name="search_type_mouvement" class="maxwidth150">';
1308 print
'<option value="" '.(($search_type_mouvement ==
"") ?
'selected="selected"' :
'').
'> </option>';
1309 print
'<option value="0" '.(($search_type_mouvement ==
"0") ?
'selected="selected"' :
'').
'>'.$langs->trans(
'StockIncreaseAfterCorrectTransfer').
'</option>';
1310 print
'<option value="1" '.(($search_type_mouvement ==
"1") ?
'selected="selected"' :
'').
'>'.$langs->trans(
'StockDecreaseAfterCorrectTransfer').
'</option>';
1311 print
'<option value="2" '.(($search_type_mouvement ==
"2") ?
'selected="selected"' :
'').
'>'.$langs->trans(
'StockDecrease').
'</option>';
1312 print
'<option value="3" '.(($search_type_mouvement ==
"3") ?
'selected="selected"' :
'').
'>'.$langs->trans(
'StockIncrease').
'</option>';
1319if (!empty($arrayfields[
'm.value'][
'checked'])) {
1321 print
'<td class="liste_titre right">';
1322 print
'<input class="flat width50 right" type="text" name="search_qty" value="'.dol_escape_htmltag($search_qty).
'">';
1325if (!empty($arrayfields[
'm.price'][
'checked'])) {
1327 print
'<td class="liste_titre" align="left">';
1333include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_input.tpl.php';
1336$parameters = array(
'arrayfields' => $arrayfields);
1337$reshook = $hookmanager->executeHooks(
'printFieldListOption', $parameters, $warehouse, $action);
1338print $hookmanager->resPrint;
1340if (!empty($arrayfields[
'm.datec'][
'checked'])) {
1341 print
'<td class="liste_titre">';
1345if (!empty($arrayfields[
'm.tms'][
'checked'])) {
1346 print
'<td class="liste_titre">';
1350if (!
$conf->main_checkbox_left_column) {
1351 print
'<td class="liste_titre center maxwidthsearch">';
1352 $searchpicto = $form->showFilterButtons();
1363print
'<tr class="liste_titre">';
1365if (
$conf->main_checkbox_left_column) {
1366 print
getTitleFieldOfList($selectedfields, 0, $_SERVER[
"PHP_SELF"],
'',
'',
'',
'', $sortfield, $sortorder,
'center maxwidthsearch ').
"\n";
1369if (!empty($arrayfields[
'm.rowid'][
'checked'])) {
1370 print_liste_field_titre($arrayfields[
'm.rowid'][
'label'], $_SERVER[
"PHP_SELF"],
'm.rowid',
'', $param,
'', $sortfield, $sortorder);
1372if (!empty($arrayfields[
'm.datem'][
'checked'])) {
1373 print_liste_field_titre($arrayfields[
'm.datem'][
'label'], $_SERVER[
"PHP_SELF"],
'm.datem',
'', $param,
'', $sortfield, $sortorder,
'center ');
1375if (!empty($arrayfields[
'p.ref'][
'checked'])) {
1376 print_liste_field_titre($arrayfields[
'p.ref'][
'label'], $_SERVER[
"PHP_SELF"],
'p.ref',
'', $param,
'', $sortfield, $sortorder);
1378if (!empty($arrayfields[
'p.label'][
'checked'])) {
1379 print_liste_field_titre($arrayfields[
'p.label'][
'label'], $_SERVER[
"PHP_SELF"],
'p.label',
'', $param,
'', $sortfield, $sortorder);
1381if (!empty($arrayfields[
'm.batch'][
'checked'])) {
1382 print_liste_field_titre($arrayfields[
'm.batch'][
'label'], $_SERVER[
"PHP_SELF"],
'm.batch',
'', $param,
'', $sortfield, $sortorder,
'center ');
1384if (!empty($arrayfields[
'pl.eatby'][
'checked'])) {
1385 print_liste_field_titre($arrayfields[
'pl.eatby'][
'label'], $_SERVER[
"PHP_SELF"],
'pl.eatby',
'', $param,
'', $sortfield, $sortorder,
'center ');
1387if (!empty($arrayfields[
'pl.sellby'][
'checked'])) {
1388 print_liste_field_titre($arrayfields[
'pl.sellby'][
'label'], $_SERVER[
"PHP_SELF"],
'pl.sellby',
'', $param,
'', $sortfield, $sortorder,
'center ');
1390if (!empty($arrayfields[
'e.ref'][
'checked'])) {
1392 print_liste_field_titre($arrayfields[
'e.ref'][
'label'], $_SERVER[
"PHP_SELF"],
"e.ref",
"", $param,
"", $sortfield, $sortorder);
1394if (!empty($arrayfields[
'm.fk_user_author'][
'checked'])) {
1395 print_liste_field_titre($arrayfields[
'm.fk_user_author'][
'label'], $_SERVER[
"PHP_SELF"],
"m.fk_user_author",
"", $param,
"", $sortfield, $sortorder);
1397if (!empty($arrayfields[
'm.inventorycode'][
'checked'])) {
1398 print_liste_field_titre($arrayfields[
'm.inventorycode'][
'label'], $_SERVER[
"PHP_SELF"],
"m.inventorycode",
"", $param,
"", $sortfield, $sortorder);
1400if (!empty($arrayfields[
'm.label'][
'checked'])) {
1401 print_liste_field_titre($arrayfields[
'm.label'][
'label'], $_SERVER[
"PHP_SELF"],
"m.label",
"", $param,
"", $sortfield, $sortorder);
1403if (!empty($arrayfields[
'origin'][
'checked'])) {
1404 print_liste_field_titre($arrayfields[
'origin'][
'label'], $_SERVER[
"PHP_SELF"],
"",
"", $param,
"", $sortfield, $sortorder);
1406if (!empty($arrayfields[
'm.fk_projet'][
'checked'])) {
1407 print_liste_field_titre($arrayfields[
'm.fk_projet'][
'label'], $_SERVER[
"PHP_SELF"],
"m.fk_projet",
"", $param,
'', $sortfield, $sortorder);
1409if (!empty($arrayfields[
'm.type_mouvement'][
'checked'])) {
1410 print_liste_field_titre($arrayfields[
'm.type_mouvement'][
'label'], $_SERVER[
"PHP_SELF"],
"m.type_mouvement",
"", $param,
'', $sortfield, $sortorder,
'center ');
1412if (!empty($arrayfields[
'm.value'][
'checked'])) {
1413 print_liste_field_titre($arrayfields[
'm.value'][
'label'], $_SERVER[
"PHP_SELF"],
"m.value",
"", $param,
'', $sortfield, $sortorder,
'right ');
1415if (!empty($arrayfields[
'm.price'][
'checked'])) {
1416 print_liste_field_titre($arrayfields[
'm.price'][
'label'], $_SERVER[
"PHP_SELF"],
"m.price",
"", $param,
'', $sortfield, $sortorder,
'right ');
1420include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_title.tpl.php';
1423$parameters = array(
'arrayfields' => $arrayfields,
'param' => $param,
'sortfield' => $sortfield,
'sortorder' => $sortorder,
'totalarray' => &$totalarray);
1424$reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $warehouse, $action);
1425print $hookmanager->resPrint;
1426if (!empty($arrayfields[
'm.datec'][
'checked'])) {
1427 print_liste_field_titre($arrayfields[
'm.datec'][
'label'], $_SERVER[
"PHP_SELF"],
"m.datec",
"", $param,
'', $sortfield, $sortorder,
'center nowrap ');
1429if (!empty($arrayfields[
'm.tms'][
'checked'])) {
1430 print_liste_field_titre($arrayfields[
'm.tms'][
'label'], $_SERVER[
"PHP_SELF"],
"m.tms",
"", $param,
'', $sortfield, $sortorder,
'center nowrap ');
1433if (!
$conf->main_checkbox_left_column) {
1434 print
getTitleFieldOfList($selectedfields, 0, $_SERVER[
"PHP_SELF"],
'',
'',
'',
'', $sortfield, $sortorder,
'center maxwidthsearch ').
"\n";
1440$arrayofuniqueproduct = array();
1449$imaxinloop = ($limit ? min($num, $limit) : $num);
1450while ($i < $imaxinloop) {
1451 $obj =
$db->fetch_object($resql);
1456 $userstatic->id = $obj->fk_user_author;
1457 $userstatic->login = $obj->login;
1458 $userstatic->lastname = $obj->lastname;
1459 $userstatic->firstname = $obj->firstname;
1460 $userstatic->photo = $obj->photo;
1461 $userstatic->email = $obj->user_email;
1462 $userstatic->status = $obj->user_status;
1467 $sql =
"SELECT label";
1468 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product_lang";
1469 $sql .=
" WHERE fk_product = ".((int) $obj->rowid);
1470 $sql .=
" AND lang = '".$db->escape($langs->getDefaultLang()).
"'";
1473 $result =
$db->query($sql);
1475 $objtp =
$db->fetch_object($result);
1476 if (!empty($objtp->label)) {
1477 $obj->produit = $objtp->label;
1482 $productstatic->id = $obj->rowid;
1483 $productstatic->ref = $obj->product_ref;
1484 $productstatic->label = $obj->produit;
1485 $productstatic->type = $obj->type;
1486 $productstatic->entity = $obj->entity;
1487 $productstatic->status = $obj->tosell;
1488 $productstatic->status_buy = $obj->tobuy;
1489 $productstatic->status_batch = $obj->tobatch;
1491 $productlot->id = $obj->lotid;
1492 $productlot->batch = $obj->batch;
1493 $productlot->eatby = $obj->eatby;
1494 $productlot->sellby = $obj->sellby;
1496 $warehousestatic->id = $obj->entrepot_id;
1497 $warehousestatic->ref = $obj->warehouse_ref;
1498 $warehousestatic->label = $obj->warehouse_ref;
1499 $warehousestatic->lieu = $obj->lieu;
1500 $warehousestatic->fk_parent = $obj->fk_parent;
1501 $warehousestatic->statut = $obj->statut;
1507 $object->warehouse_id = $obj->entrepot_id;
1508 $object->type = $obj->type_mouvement;
1510 $arrayofuniqueproduct[$obj->rowid] = $obj->produit;
1511 if (!empty($obj->fk_origin)) {
1512 $origin =
$object->get_origin($obj->fk_origin, $obj->origintype);
1517 if ($mode ==
'kanban') {
1519 print
'<tr class="trkanban"><td colspan="'.$savnbfield.
'">';
1520 print
'<div class="box-flex-container kanban">';
1524 if ($massactionbutton || $massaction) {
1526 if (in_array($warehouse->id, $arrayofselected)) {
1530 print $warehouse->getKanbanView(
'', array(
'selected' => $selected));
1531 if ($i == ($imaxinloop - 1)) {
1538 print
'<tr data-rowid="'.$warehouse->id.
'" class="oddeven">';
1540 if (
$conf->main_checkbox_left_column) {
1541 print
'<td class="nowrap center">';
1542 if ($massactionbutton || $massaction) {
1544 if (in_array($obj->mid, $arrayofselected)) {
1547 print
'<input id="cb'.$obj->mid.
'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->mid.
'"'.($selected ?
' checked="checked"' :
'').
'>';
1555 if (!empty($arrayfields[
'm.rowid'][
'checked'])) {
1556 print
'<td class="nowraponall">';
1561 if (!empty($arrayfields[
'm.datem'][
'checked'])) {
1562 print
'<td class="nowraponall center">'.dol_print_date(
$db->jdate($obj->datem),
'dayhour',
'tzuserrel').
'</td>';
1565 if (!empty($arrayfields[
'p.ref'][
'checked'])) {
1566 print
'<td class="nowraponall tdoverflowmax150 cell2linesheight">';
1567 print $productstatic->getNomUrl(1,
'stock', 16);
1568 print
'<br><span class="opacitymedium">'.$productstatic->label.
'</span>';
1572 if (!empty($arrayfields[
'p.label'][
'checked'])) {
1573 print
'<td class="tdoverflowmax150" title="'.dol_escape_htmltag($productstatic->label).
'">';
1574 print $productstatic->label;
1578 if (!empty($arrayfields[
'm.batch'][
'checked'])) {
1579 print
'<td class="center nowraponall">';
1580 if ($productlot->id > 0) {
1581 print $productlot->getNomUrl(1);
1583 print $productlot->batch;
1588 if (!empty($arrayfields[
'pl.eatby'][
'checked'])) {
1589 print
'<td class="center">'.dol_print_date($obj->eatby,
'day').
'</td>';
1592 if (!empty($arrayfields[
'pl.sellby'][
'checked'])) {
1593 print
'<td class="center">'.dol_print_date($obj->sellby,
'day').
'</td>';
1596 if (!empty($arrayfields[
'e.ref'][
'checked'])) {
1597 print
'<td class="tdoverflowmax150">';
1598 print $warehousestatic->getNomUrl(1);
1602 if (!empty($arrayfields[
'm.fk_user_author'][
'checked'])) {
1603 print
'<td class="tdoverflowmax100">';
1604 print $userstatic->getNomUrl(-1);
1608 if (!empty($arrayfields[
'm.inventorycode'][
'checked'])) {
1609 print
'<td class="tdoverflowmax150" title="'.dolPrintHTML($obj->inventorycode).
'">';
1610 if ($obj->inventorycode) {
1611 print
img_picto(
'',
'movement',
'class="pictofixedwidth"');
1612 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?search_inventorycode='.urlencode(
'^'.$obj->inventorycode.
'$').
'">'.
dol_escape_htmltag($obj->inventorycode).
'</a>';
1617 if (!empty($arrayfields[
'm.label'][
'checked'])) {
1618 print
'<td class="tdoverflowmax200" title="'.dol_escape_htmltag($obj->label).
'">'.
dol_escape_htmltag($obj->label).
'</td>';
1621 if (!empty($arrayfields[
'origin'][
'checked'])) {
1622 print
'<td class="nowraponall">'.$origin.
'</td>';
1625 if (!empty($arrayfields[
'm.fk_projet'][
'checked'])) {
1627 if ($obj->fk_project != 0) {
1628 print
$object->get_origin($obj->fk_project,
'project');
1633 if (!empty($arrayfields[
'm.type_mouvement'][
'checked'])) {
1634 print
'<td class="center">';
1635 print
$object->getTypeMovement();
1639 if (!empty($arrayfields[
'm.value'][
'checked'])) {
1640 print
'<td class="right">';
1641 if ($obj->qty > 0) {
1642 print
'<span class="stockmovemententry">';
1647 print
'<span class="stockmovementexit">';
1654 if (!empty($arrayfields[
'm.price'][
'checked'])) {
1656 $displayprice =
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') ? $user->hasRight(
'product',
'product_advance',
'read_supplier_prices') : $user->hasRight(
'product',
'lire');
1657 if ($productstatic->isService()) {
1658 $displayprice =
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') ? $user->hasRight(
'service',
'service_advance',
'read_supplier_prices') : $user->hasRight(
'service',
'lire');
1660 print
'<td class="right">';
1661 if ($obj->price != 0 && $displayprice) {
1662 print
price($obj->price);
1668 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_print_fields.tpl.php';
1670 $parameters = array(
'arrayfields' => $arrayfields,
'object' => $object,
'obj' => $obj,
'i' => $i,
'totalarray' => &$totalarray);
1671 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
1672 print $hookmanager->resPrint;
1675 if (!
$conf->main_checkbox_left_column) {
1676 print
'<td class="nowrap center">';
1677 if ($massactionbutton || $massaction) {
1679 if (in_array($obj->mid, $arrayofselected)) {
1682 print
'<input id="cb'.$obj->mid.
'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->mid.
'"'.($selected ?
' checked="checked"' :
'').
'>';
1699 foreach ($arrayfields as $key => $val) {
1700 if (!empty($val[
'checked'])) {
1704 print
'<tr><td colspan="'.$colspan.
'"><span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span></td></tr>';
1709$parameters = array(
'arrayfields' => $arrayfields,
'sql' => $sql);
1710$reshook = $hookmanager->executeHooks(
'printFieldListFooter', $parameters, $object, $action);
1711print $hookmanager->resPrint;
1713print
'</table>'.
"\n";
1716print
'</form>'.
"\n";
1719if (count($arrayofuniqueproduct) == 1 && !empty($search_date_startyear) && is_numeric($search_date_startyear)) {
1722 $productidselected = 0;
1723 foreach ($arrayofuniqueproduct as $key => $val) {
1724 $productidselected = $key;
1725 $productlabelselected = $val;
1727 $datebefore =
dol_get_first_day($search_date_startyear ? $search_date_startyear :
dol_print_date(time(),
"%Y"), $search_date_startmonth ? $search_date_startmonth : 1, true);
1728 $dateafter =
dol_get_last_day($search_date_endyear ? $search_date_endyear :
dol_print_date(time(),
"%Y"), $search_date_endmonth ? $search_date_endmonth : 12, true);
1729 $balancebefore =
$object->calculateBalanceForProductBefore($productidselected, $datebefore);
1730 $balanceafter =
$object->calculateBalanceForProductBefore($productidselected, $dateafter);
1733 print $langs->trans(
"NbOfProductBeforePeriod", $productlabelselected,
dol_print_date($datebefore,
'day',
'gmt'));
1736 print
': '.$balancebefore;
1740 print $langs->trans(
"NbOfProductAfterPeriod", $productlabelselected,
dol_print_date($dateafter,
'day',
'gmt'));
1743 print
': '.$balanceafter;
1748if (in_array(
'builddoc', array_keys($arrayofmassactions)) && ($nbtotalofrecords ===
'' || $nbtotalofrecords)) {
1749 $hidegeneratedfilelistifempty = 1;
1750 if ($massaction ==
'builddoc' || $action ==
'remove_file' || $show_files) {
1751 $hidegeneratedfilelistifempty = 0;
1754 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
1758 $urlsource = $_SERVER[
'PHP_SELF'].
'?sortfield='.$sortfield.
'&sortorder='.$sortorder;
1759 $urlsource .= str_replace(
'&',
'&', $param);
1761 $filedir = $diroutputmassaction;
1762 $genallowed = $permissiontoread;
1763 $delallowed = $permissiontoadd;
1765 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.