31require
'../../main.inc.php';
32require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
33require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
34require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/entrepot.class.php';
35require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
36require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/productlot.class.php';
37require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
38require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
39require_once DOL_DOCUMENT_ROOT.
'/core/lib/stock.lib.php';
40require_once DOL_DOCUMENT_ROOT.
'/core/lib/product.lib.php';
41require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
42require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
43if (isModEnabled(
'project')) {
44 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
45 require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
57$langs->loadLangs(array(
'products',
'stocks',
'orders'));
58if (isModEnabled(
'productbatch')) {
59 $langs->load(
"productbatch");
62$action =
GETPOST(
'action',
'aZ09');
63$massaction =
GETPOST(
'massaction',
'alpha');
64$confirm =
GETPOST(
'confirm',
'alpha');
65$cancel =
GETPOST(
'cancel',
'alpha');
66$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') : str_replace(
'_',
'', basename(dirname(__FILE__)).basename(__FILE__,
'.php'));
67$toselect =
GETPOST(
'toselect',
'array');
68$backtopage =
GETPOST(
"backtopage",
"alpha");
69$optioncss =
GETPOST(
'optioncss',
'aZ');
70$show_files =
GETPOST(
'show_files',
'aZ');
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']);
170if ($id > 0 || !empty($ref)) {
171 $tmpwarehouse->fetch($id, $ref);
172 $id = $tmpwarehouse->id;
181if (!$user->hasRight(
'stock',
'mouvement',
'lire')) {
185$uploaddir =
$conf->stock->dir_output.
'/movements';
187$permissiontoread = $user->hasRight(
'stock',
'mouvement',
'lire');
188$permissiontoadd = $user->hasRight(
'stock',
'mouvement',
'creer');
189$permissiontodelete = $user->hasRight(
'stock',
'mouvement',
'creer');
190$permissiontoeditextra = $permissiontoadd;
191if (
GETPOST(
'attribute',
'aZ09') && isset($extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')])) {
193 $permissiontoeditextra =
dol_eval((
string) $extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')]);
196$usercanread = $user->hasRight(
'stock',
'mouvement',
'lire');
197$usercancreate = $user->hasRight(
'stock',
'mouvement',
'creer');
198$usercandelete = $user->hasRight(
'stock',
'mouvement',
'creer');
207if (
GETPOST(
'cancel',
'alpha')) {
211if (!
GETPOST(
'confirmmassaction',
'alpha') && $massaction !=
'presend' && $massaction !=
'confirm_presend') {
215$parameters = array();
216$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
221if (empty($reshook)) {
223 include DOL_DOCUMENT_ROOT.
'/core/actions_changeselectedfields.inc.php';
226 if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
227 $search_date_startday =
'';
228 $search_date_startmonth =
'';
229 $search_date_startyear =
'';
230 $search_date_endday =
'';
231 $search_date_endmonth =
'';
232 $search_date_endyear =
'';
233 $search_date_start =
'';
234 $search_date_end =
'';
236 $search_movement =
"";
237 $search_type_mouvement =
"";
238 $search_inventorycode =
"";
239 $search_product_ref =
"";
240 $search_product =
"";
241 $search_warehouse =
"";
245 $search_fk_project =
"";
248 $search_array_options = array();
250 if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')
251 ||
GETPOST(
'button_search_x',
'alpha') ||
GETPOST(
'button_search.x',
'alpha') ||
GETPOST(
'button_search',
'alpha')) {
256 $objectclass =
'MouvementStock';
257 $objectlabel =
'MouvementStock';
259 if (!$error && $massaction ==
"builddoc" && $permissiontoread && !
GETPOST(
'button_search')) {
260 if (empty($diroutputmassaction)) {
261 dol_print_error(
null,
'include of actions_massactions.inc.php is done but var $diroutputmassaction was not defined');
265 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
266 require_once DOL_DOCUMENT_ROOT.
'/core/lib/pdf.lib.php';
267 require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
270 $listofobjectid = array();
271 foreach ($toselect as $toselectid) {
273 $result = $objecttmp->fetch($toselectid);
275 $listofobjectid[$toselectid] = $toselectid;
279 $arrayofinclusion = array();
280 foreach ($listofobjectref as $tmppdf) {
283 foreach ($listofobjectref as $tmppdf) {
284 $arrayofinclusion[] =
'^'.preg_quote(
dol_sanitizeFileName($tmppdf),
'/').
'_[a-zA-Z0-9-_]+\.pdf$';
286 $listoffiles =
dol_dir_list($uploaddir,
'all', 1, implode(
'|', $arrayofinclusion),
'\.meta$|\.png',
'date', SORT_DESC, 0, 1);
289 $outputlangs = $langs;
292 $newlang =
GETPOST(
'lang_id',
'aZ09');
297 if (!empty($newlang)) {
299 $outputlangs->setDefaultLang($newlang);
307 $filename = preg_replace(
'/\s/',
'_', $filename);
319 $file = $diroutputmassaction.
'/'.$filename.
'_'.
dol_print_date($now,
'dayhourlog').
'.pdf';
328 $langs->load(
"exports");
337 include DOL_DOCUMENT_ROOT.
'/core/actions_massactions.inc.php';
340if ($action ==
'update_extras' && $permissiontoeditextra) {
341 $tmpwarehouse->oldcopy =
dol_clone($tmpwarehouse, 2);
343 $attribute_name =
GETPOST(
'attribute',
'aZ09');
346 $ret = $extrafields->setOptionalsFromPost(
null, $tmpwarehouse, $attribute_name);
352 $result = $tmpwarehouse->updateExtraField($attribute_name,
'CONTRACT_MODIFY');
360 $action =
'edit_extras';
372if ($action ==
"correct_stock" && $permissiontoadd) {
374 if (!empty($product_id)) {
375 $result = $product->fetch($product_id);
380 if (empty($product_id)) {
382 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Product")),
null,
'errors');
383 $action =
'correction';
387 setEventMessages($langs->trans(
"ErrorFieldMustBeANumeric", $langs->transnoentitiesnoconv(
"NumberOfUnit")),
null,
'errors');
388 $action =
'correction';
392 $origin_element =
'';
396 $origin_element =
'project';
400 if ($product->hasbatch()) {
401 $batch =
GETPOST(
'batch_number',
'alphanohtml');
406 $result = $product->correct_stock_batch(
411 GETPOST(
"label",
'alphanohtml'),
416 GETPOST(
'inventorycode',
'alphanohtml'),
423 $result = $product->correct_stock(
428 GETPOST(
"label",
'alphanohtml'),
430 GETPOST(
'inventorycode',
'alphanohtml'),
439 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
444 $action =
'correction';
454if ($action ==
"transfert_stock" && $permissiontoadd && !$cancel) {
457 if (!empty($product_id)) {
458 $result = $product->fetch($product_id);
461 if (!(
GETPOSTINT(
"id_entrepot_destination") > 0)) {
462 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Warehouse")),
null,
'errors');
464 $action =
'transfert';
466 if (empty($product_id)) {
468 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Product")),
null,
'errors');
469 $action =
'transfert';
472 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"NumberOfUnit")),
null,
'errors');
474 $action =
'transfert';
476 if ($id ==
GETPOSTINT(
"id_entrepot_destination")) {
477 setEventMessages($langs->trans(
"ErrorSrcAndTargetWarehouseMustDiffers"),
null,
'errors');
479 $action =
'transfert';
482 if (isModEnabled(
'productbatch')) {
484 $result = $product->fetch($product_id);
486 if ($product->hasbatch() && !
GETPOST(
"batch_number")) {
487 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"batch_number")),
null,
'errors');
489 $action =
'transfert';
496 $result = $warehouse->fetch($id);
500 $product->load_stock(
'novirtual');
504 if (isset($product->pmp)) {
505 $pricesrc = $product->pmp;
507 $pricedest = $pricesrc;
509 if ($product->hasbatch()) {
517 $result = $pdluo->fetch($pdluoid);
519 $srcwarehouseid = $pdluo->warehouseid;
520 $batch = $pdluo->batch;
526 $srcwarehouseid =
$id;
527 $batch =
GETPOST(
'batch_number',
'alphanohtml');
534 $result1 = $product->correct_stock_batch(
551 $result2 = $product->correct_stock_batch(
561 GETPOST(
'inventorycode',
'alphanohtml'),
570 $result1 = $product->correct_stock(
575 GETPOST(
"label",
'alphanohtml'),
577 GETPOST(
'inventorycode',
'alphanohtml'),
585 $result2 = $product->correct_stock(
590 GETPOST(
"label",
'alphanohtml'),
592 GETPOST(
'inventorycode',
'alphanohtml'),
599 if (!$error && $result1 >= 0 && $result2 >= 0) {
603 header(
"Location: ".$backtopage);
606 header(
"Location: movement_list.php?id=".$warehouse->id);
612 $action =
'transfert';
619if ($action ==
'confirm_reverse' && $confirm ==
"yes" && $permissiontoadd) {
620 $toselect = array_map(
'intval', $toselect);
624 $sql =
"SELECT rowid, label, inventorycode, datem";
625 $sql .=
" FROM ".MAIN_DB_PREFIX.
"stock_mouvement";
626 $sql .=
" WHERE rowid IN (".$db->sanitize(implode(
',', $toselect)).
")";
628 $resql = $db->query($sql);
630 $num = $db->num_rows($resql);
634 $obj = $db->fetch_object($resql);
642 $reverse =
$object->reverseMovement();
662 header(
"Location: ".$_SERVER[
"PHP_SELF"]);
670$form =
new Form($db);
672if (isModEnabled(
'project')) {
678$productstatic =
new Product($db);
679$warehousestatic =
new Entrepot($db);
681$userstatic =
new User($db);
687$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,";
688$sql .=
" e.ref as warehouse_ref, e.rowid as entrepot_id, e.lieu, e.fk_parent, e.statut,";
689$sql .=
" m.rowid as mid, m.value as qty, m.datem, m.fk_user_author, m.label, m.inventorycode, m.fk_origin, m.origintype,";
690$sql .=
" m.batch, m.price,";
691$sql .=
" m.type_mouvement,";
692$sql .=
" m.fk_projet as fk_project,";
693$sql .=
" pl.rowid as lotid, pl.eatby, pl.sellby,";
694$sql .=
" u.login, u.photo, u.lastname, u.firstname, u.email as user_email, u.statut as user_status";
696if (!empty($extrafields->attributes[
$object->table_element][
'label'])) {
697 foreach ($extrafields->attributes[
$object->table_element][
'label'] as $key => $val) {
698 $sql .= ($extrafields->attributes[
$object->table_element][
'type'][$key] !=
'separate' ?
", ef.".$key.
" as options_".$key :
'');
702$parameters = array();
703$reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters, $object, $action);
704$sql .= $hookmanager->resPrint;
705$sql = preg_replace(
'/,\s*$/',
'', $sql);
709$sql .=
" FROM ".MAIN_DB_PREFIX.
"entrepot as e,";
710$sql .=
" ".MAIN_DB_PREFIX.
"product as p,";
711$sql .=
" ".MAIN_DB_PREFIX.
"stock_mouvement as m";
712if (!empty($extrafields->attributes[
$object->table_element][
'label']) && is_array($extrafields->attributes[
$object->table_element][
'label']) && count($extrafields->attributes[
$object->table_element][
'label'])) {
713 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element.
"_extrafields as ef on (m.rowid = ef.fk_object)";
715$sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"user as u ON m.fk_user_author = u.rowid";
716$sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product_lot as pl ON m.batch = pl.batch AND m.fk_product = pl.fk_product";
719$parameters = array();
720$reshook = $hookmanager->executeHooks(
'printFieldListFrom', $parameters, $object, $action);
721$sql .= $hookmanager->resPrint;
723$sql .=
" WHERE m.fk_product = p.rowid";
725 $sql .=
" AND m.rowid = ".((int) $msid);
727$sql .=
" AND m.fk_entrepot = e.rowid";
728$sql .=
" AND e.entity IN (".getEntity(
'stock').
")";
730 $sql .=
" AND p.fk_product_type = 0";
733 $sql .=
" AND e.rowid = ".((int) $id);
735if (!empty($search_date_start)) {
736 $sql .=
" AND m.datem >= '" . $db->idate($search_date_start) .
"'";
738if (!empty($search_date_end)) {
739 $sql .=
" AND m.datem <= '" . $db->idate($search_date_end) .
"'";
742 $sql .=
" AND p.rowid = ".((int) $idproduct);
744if (!empty($search_ref)) {
747if (!empty($search_movement)) {
750if (!empty($search_inventorycode)) {
753if (!empty($search_product_ref)) {
756if (!empty($search_product)) {
759if ($search_warehouse !=
'' && $search_warehouse !=
'-1') {
762if (!empty($search_user)) {
763 $sql .=
natural_search(array(
'u.lastname',
'u.firstname',
'u.login'), $search_user);
765if (!empty($search_batch)) {
768if (!empty($product_id) && $product_id !=
'-1') {
771if (!empty($search_fk_project) && $search_fk_project !=
'-1') {
774if ($search_qty !=
'') {
777if ($search_type_mouvement !=
'' && $search_type_mouvement !=
'-1') {
778 $sql .=
natural_search(
'm.type_mouvement', $search_type_mouvement, 2);
781include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_sql.tpl.php';
783$parameters = array();
784$reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters, $object, $action);
785$sql .= $hookmanager->resPrint;
788$nbtotalofrecords =
'';
791 $sqlforcount = preg_replace(
'/^'.preg_quote($sqlfields,
'/').
'/',
'SELECT COUNT(*) as nbtotalofrecords', $sql);
792 $sqlforcount = preg_replace(
'/GROUP BY .*$/',
'', $sqlforcount);
793 $resql = $db->query($sqlforcount);
795 $objforcount = $db->fetch_object($resql);
796 $nbtotalofrecords = $objforcount->nbtotalofrecords;
801 if (($page * $limit) > $nbtotalofrecords) {
809$sql .= $db->order($sortfield, $sortorder);
811 $sql .= $db->plimit($limit + 1, $offset);
814$resql = $db->query($sql);
820$num = $db->num_rows($resql);
827 $product->fetch($idproduct);
829if ($id > 0 || $ref) {
830 $result = $warehouse->fetch($id, $ref);
837$help_url =
'EN:Module_Stocks_En|FR:Module_Stock|ES:Módulo_Stocks';
839 $title = $langs->trans(
'StockMovementForId', $msid);
841 $title = $langs->trans(
"StockMovements");
843 if (!empty($warehouse->ref)) {
844 $title .=
' ('.$warehouse->ref.
')';
846 $title .=
' ('.$langs->trans(
"ForThisWarehouse").
')';
855llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'bodyforlist mod-product page-stock_movement_list');
860if ($warehouse->id > 0) {
863 print
dol_get_fiche_head($head,
'movements', $langs->trans(
"Warehouse"), -1,
'stock');
866 $linkback =
'<a href="'.DOL_URL_ROOT.
'/product/stock/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
868 $morehtmlref =
'<div class="refidno">';
869 $morehtmlref .= $langs->trans(
"LocationSummary").
' : '.$warehouse->lieu;
872 if (isModEnabled(
'project') && $formproject !==
null) {
873 $langs->load(
"projects");
874 $morehtmlref .=
'<br>'.img_picto(
'',
'project').
' '.$langs->trans(
'Project').
' ';
875 if ($usercancreate && 1 == 2) {
876 if ($action !=
'classify') {
877 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.$warehouse->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> : ';
879 if ($action ==
'classify') {
880 $projectid = $warehouse->fk_project;
881 $morehtmlref .=
'<form method="post" action="'.$_SERVER[
'PHP_SELF'].
'?id='.$warehouse->id.
'">';
882 $morehtmlref .=
'<input type="hidden" name="action" value="classin">';
883 $morehtmlref .=
'<input type="hidden" name="token" value="'.newToken().
'">';
884 $morehtmlref .= $formproject->select_projects(($socid > 0 ? $socid : -1), (string) $projectid,
'projectid', 0, 0, 1, 1, 0, 0, 0,
'', 1, 0,
'maxwidth500');
885 $morehtmlref .=
'<input type="submit" class="button valignmiddle" value="'.$langs->trans(
"Modify").
'">';
886 $morehtmlref .=
'</form>';
888 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.$warehouse->id, $warehouse->socid, (
string) $warehouse->fk_project,
'none', 0, 0, 0, 1,
'',
'maxwidth300');
891 if (!empty($warehouse->fk_project)) {
893 $proj->fetch($warehouse->fk_project);
894 $morehtmlref .=
' : '.$proj->getNomUrl(1);
896 $morehtmlref .=
' - '.$proj->title;
903 $morehtmlref .=
'</div>';
906 if ($user->socid && !in_array(
'stock', explode(
',',
getDolGlobalString(
'MAIN_MODULES_FOR_EXTERNAL')))) {
910 dol_banner_tab($warehouse,
'ref', $linkback, $shownav,
'ref',
'ref', $morehtmlref);
913 print
'<div class="fichecenter">';
914 print
'<div class="fichehalfleft">';
915 print
'<div class="underbanner clearboth"></div>';
917 print
'<table class="border centpercent tableforfield">';
922 print
'<td class="titlefield tdtop">'.$langs->trans(
"Description").
'</td><td>'.
dol_htmlentitiesbr($warehouse->description).
'</td></tr>';
924 $calcproductsunique = $warehouse->nb_different_products();
925 $calcproducts = $warehouse->nb_products();
928 print
'<tr><td>'.$langs->trans(
"NumberOfDifferentProducts").
'</td><td>';
929 print empty($calcproductsunique[
'nb']) ?
'0' : $calcproductsunique[
'nb'];
933 print
'<tr><td>'.$langs->trans(
"NumberOfProducts").
'</td><td>';
934 $valtoshow =
price2num($calcproducts[
'nb'],
'MS');
935 print empty($valtoshow) ?
'0' : $valtoshow;
941 print
'<div class="fichehalfright">';
942 print
'<div class="underbanner clearboth"></div>';
944 print
'<table class="border centpercent tableforfield">';
947 print
'<tr><td class="titlefield">'.$langs->trans(
"EstimatedStockValueShort").
'</td><td>';
948 print
price((empty($calcproducts[
'value']) ?
'0' :
price2num($calcproducts[
'value'],
'MT')), 0, $langs, 0, -1, -1,
$conf->currency);
952 $sql =
"SELECT MAX(m.datem) as datem";
953 $sql .=
" FROM ".MAIN_DB_PREFIX.
"stock_mouvement as m";
954 $sql .=
" WHERE m.fk_entrepot = ".((int) $warehouse->id);
955 $resqlbis = $db->query($sql);
957 $lastmovementdate = 0;
959 $objbis = $db->fetch_object($resqlbis);
960 $lastmovementdate = $db->jdate($objbis->datem);
965 print
'<tr><td>'.$langs->trans(
"LastMovement").
'</td><td>';
966 if ($lastmovementdate) {
969 print $langs->trans(
"None");
974 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
977 if (isModEnabled(
'category')) {
978 print
'<tr><td valign="middle">'.$langs->trans(
"Categories").
'</td><td colspan="3">';
979 print $form->showCategories($warehouse->id, Categorie::TYPE_WAREHOUSE, 1);
988 print
'<div class="clearboth"></div>';
995if ($action ==
"correction") {
996 include DOL_DOCUMENT_ROOT.
'/product/stock/tpl/stockcorrection.tpl.php';
1001if ($action ==
"transfert") {
1004 include DOL_DOCUMENT_ROOT.
'/product/stock/tpl/stocktransfer.tpl.php';
1010if ((empty($action) || $action ==
'list') && $id > 0) {
1011 print
"<div class=\"tabsAction\">\n";
1013 $parameters = array();
1014 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $warehouse, $action);
1016 if (empty($reshook)) {
1017 if ($user->hasRight(
'stock',
'mouvement',
'creer')) {
1018 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$id.
'&action=transfert&token='.
newToken().
'">'.$langs->trans(
"TransferStock").
'</a>';
1021 if ($user->hasRight(
'stock',
'mouvement',
'creer')) {
1022 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$id.
'&action=correction&token='.
newToken().
'">'.$langs->trans(
"CorrectStock").
'</a>';
1029$arrayofselected = is_array($toselect) ? $toselect : array();
1033 $param .=
'&mode='.urlencode($mode);
1035if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
1036 $param .=
'&contextpage='.urlencode($contextpage);
1038if ($limit > 0 && $limit !=
$conf->liste_limit) {
1039 $param .=
'&limit='.((int) $limit);
1042 $param .=
'&id='.urlencode((
string) (
$id));
1045 $param .=
'&show_files='.urlencode((
string) ($show_files));
1047if ($search_date_startday) {
1048 $param .=
'&search_date_startday='.urlencode((
string) ($search_date_startday));
1050if ($search_date_startmonth) {
1051 $param .=
'&search_date_startmonth='.urlencode((
string) ($search_date_startmonth));
1053if ($search_date_startyear) {
1054 $param .=
'&search_date_startyear='.urlencode((
string) ($search_date_startyear));
1056if ($search_date_endday) {
1057 $param .=
'&search_date_endday='.urlencode((
string) ($search_date_endday));
1059if ($search_date_endmonth) {
1060 $param .=
'&search_date_endmonth='.urlencode((
string) ($search_date_endmonth));
1062if ($search_date_endyear) {
1063 $param .=
'&search_date_endyear='.urlencode((
string) ($search_date_endyear));
1065if ($search_movement) {
1066 $param .=
'&search_movement='.urlencode($search_movement);
1068if ($search_inventorycode) {
1069 $param .=
'&search_inventorycode='.urlencode($search_inventorycode);
1071if ($search_type_mouvement) {
1072 $param .=
'&search_type_mouvement='.urlencode($search_type_mouvement);
1074if ($search_product_ref) {
1075 $param .=
'&search_product_ref='.urlencode($search_product_ref);
1077if ($search_product) {
1078 $param .=
'&search_product='.urlencode($search_product);
1081 $param .=
'&search_batch='.urlencode($search_batch);
1083if ($search_warehouse > 0) {
1084 $param .=
'&search_warehouse='.urlencode($search_warehouse);
1087 $param .=
'&search_user='.urlencode($search_user);
1089if ($idproduct > 0) {
1090 $param .=
'&idproduct='.urlencode((
string) ($idproduct));
1092if ($search_fk_project !=
'' && $search_fk_project !=
'-1') {
1093 $param .=
'&search_fk_project='.urlencode((
string) ($search_fk_project));
1096include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_param.tpl.php';
1098$parameters = array(
'param' => &$param);
1099$reshook = $hookmanager->executeHooks(
'printFieldListSearchParam', $parameters, $warehouse, $action);
1100$param .= $hookmanager->resPrint;
1103$arrayofmassactions = array();
1105 $arrayofmassactions[
'builddoc'] =
img_picto(
'',
'pdf',
'class="pictofixedwidth"').$langs->trans(
"GeneratePDF");
1109 $arrayofmassactions[
'predelete'] =
img_picto(
'',
'delete',
'class="pictofixedwidth"').$langs->trans(
"Delete");
1111if (!empty($permissiontoadd)) {
1112 $arrayofmassactions[
'prereverse'] =
img_picto(
'',
'add',
'class="pictofixedwidth"').$langs->trans(
"Reverse");
1114if (
GETPOSTINT(
'nomassaction') || in_array($massaction, array(
'presend',
'predelete',
'prereverse'))) {
1115 $arrayofmassactions = array();
1118$massactionbutton = $form->selectMassAction(
'', $arrayofmassactions);
1120print
'<form method="POST" id="searchFormList" action="'.$_SERVER[
"PHP_SELF"].
'">'.
"\n";
1121if ($optioncss !=
'') {
1122 print
'<input type="hidden" name="optioncss" value="'.$optioncss.
'">';
1124print
'<input type="hidden" name="token" value="'.newToken().
'">';
1125print
'<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1126print
'<input type="hidden" name="action" value="list">';
1127print
'<input type="hidden" name="sortfield" value="'.$sortfield.
'">';
1128print
'<input type="hidden" name="sortorder" value="'.$sortorder.
'">';
1129print
'<input type="hidden" name="type" value="'.$type.
'">';
1130print
'<input type="hidden" name="page" value="'.$page.
'">';
1131print
'<input type="hidden" name="contextpage" value="'.$contextpage.
'">';
1132print
'<input type="hidden" name="page_y" value="">';
1133print
'<input type="hidden" name="mode" value="'.$mode.
'">';
1135 print
'<input type="hidden" name="id" value="'.$id.
'">';
1141print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'movement', 0,
'',
'', $limit, 0, 0, 1);
1144$topicmail =
"SendStockMovement";
1145$modelmail =
"movementstock";
1147$trackid =
'mov'.$warehouse->id;
1148include DOL_DOCUMENT_ROOT.
'/core/tpl/massactions_pre.tpl.php';
1149if ($massaction ==
'prereverse') {
1150 print $form->formconfirm($_SERVER[
"PHP_SELF"], $langs->trans(
"ConfirmMassReverse"), $langs->trans(
"ConfirmMassReverseQuestion", count($toselect)),
"confirm_reverse",
null,
'', 0, 200, 500, 1,
'Yes');
1156 if (!isset($fieldstosearchall) || !is_array($fieldstosearchall)) {
1158 $fieldstosearchall = array();
1160 foreach ($fieldstosearchall as $key => $val) {
1161 $fieldstosearchall[$key] = $langs->trans($val);
1162 $setupstring .= $key.
"=".$val.
";";
1164 print
'<!-- Search done like if STOCK_QUICKSEARCH_ON_FIELDS = '.$setupstring.
' -->'.
"\n";
1165 print
'<div class="divsearchfieldfilter">'.$langs->trans(
"FilterOnInto", $search_all).implode(
', ', $fieldstosearchall).
'</div>'.
"\n";
1170$parameters = array(
'arrayfields' => &$arrayfields);
1171$reshook = $hookmanager->executeHooks(
'printFieldPreListTitle', $parameters, $warehouse, $action);
1172if (empty($reshook)) {
1173 $moreforfilter .= $hookmanager->resPrint;
1175 $moreforfilter = $hookmanager->resPrint;
1178if (!empty($moreforfilter)) {
1179 print
'<div class="liste_titre liste_titre_bydiv centpercent">';
1180 print $moreforfilter;
1184$varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1185$htmlofselectarray = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
getDolGlobalString(
'MAIN_CHECKBOX_LEFT_COLUMN'));
1186$selectedfields = ($mode !=
'kanban' ? $htmlofselectarray :
'');
1187$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons(
'checkforselect', 1) :
'');
1189print
'<div class="div-table-responsive">';
1190print
'<table class="tagtable nobottomiftotal liste'.($moreforfilter ?
" listwithfilterbefore" :
"").
'">'.
"\n";
1194print
'<tr class="liste_titre_filter">';
1197 print
'<td class="liste_titre center maxwidthsearch">';
1198 $searchpicto = $form->showFilterButtons(
'left');
1202if (!empty($arrayfields[
'm.rowid'][
'checked'])) {
1204 print
'<td class="liste_titre left">';
1205 print
'<input class="flat maxwidth40" type="text" name="search_ref" value="'.dol_escape_htmltag($search_ref).
'">';
1208if (!empty($arrayfields[
'm.datem'][
'checked'])) {
1210 print
'<td class="liste_titre center">';
1211 print
'<div class="nowrapfordate">';
1212 print $form->selectDate($search_date_start ? $search_date_start : -1,
'search_date_start', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'From'),
'tzuserrel');
1214 print
'<div class="nowrapfordate">';
1215 print $form->selectDate($search_date_end ? $search_date_end : -1,
'search_date_end', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'to'),
'tzuserrel');
1219if (!empty($arrayfields[
'p.ref'][
'checked'])) {
1221 print
'<td class="liste_titre left">';
1222 print
'<input class="flat maxwidth75" type="text" name="search_product_ref" value="'.dol_escape_htmltag($idproduct ? $product->ref : $search_product_ref).
'">';
1225if (!empty($arrayfields[
'p.label'][
'checked'])) {
1227 print
'<td class="liste_titre left">';
1228 print
'<input class="flat maxwidth100" type="text" name="search_product" value="'.dol_escape_htmltag($idproduct ? $product->label : $search_product).
'">';
1232if (!empty($arrayfields[
'm.batch'][
'checked'])) {
1233 print
'<td class="liste_titre center"><input class="flat maxwidth75" type="text" name="search_batch" value="'.dol_escape_htmltag($search_batch).
'"></td>';
1235if (!empty($arrayfields[
'pl.eatby'][
'checked'])) {
1236 print
'<td class="liste_titre left">';
1239if (!empty($arrayfields[
'pl.sellby'][
'checked'])) {
1240 print
'<td class="liste_titre left">';
1244if (!empty($arrayfields[
'e.ref'][
'checked'])) {
1245 print
'<td class="liste_titre maxwidthonsmartphone left">';
1247 print $formproduct->selectWarehouses($search_warehouse,
'search_warehouse',
'warehouseopen,warehouseinternal', 1, 0, 0,
'', 0, 0, array(),
'maxwidth150');
1250if (!empty($arrayfields[
'm.fk_user_author'][
'checked'])) {
1252 print
'<td class="liste_titre left">';
1253 print
'<input class="flat" type="text" size="6" name="search_user" value="'.dol_escape_htmltag($search_user).
'">';
1256if (!empty($arrayfields[
'm.inventorycode'][
'checked'])) {
1258 print
'<td class="liste_titre left">';
1259 print
'<input class="flat" type="text" size="4" name="search_inventorycode" value="'.dol_escape_htmltag($search_inventorycode).
'">';
1262if (!empty($arrayfields[
'm.label'][
'checked'])) {
1264 print
'<td class="liste_titre left">';
1265 print
'<input class="flat" type="text" size="8" name="search_movement" value="'.dol_escape_htmltag($search_movement).
'">';
1268if (!empty($arrayfields[
'origin'][
'checked'])) {
1270 print
'<td class="liste_titre left">';
1274if (!empty($arrayfields[
'm.fk_projet'][
'checked'])) {
1276 print
'<td class="liste_titre" align="left">';
1277 print $warehouse->showInputField($warehouse->fields[
'fk_project'],
'fk_project', $search_fk_project,
'',
'',
'search_',
'maxwidth125', 1);
1280if (!empty($arrayfields[
'm.type_mouvement'][
'checked'])) {
1282 print
'<td class="liste_titre center">';
1284 print
'<select id="search_type_mouvement" name="search_type_mouvement" class="maxwidth150">';
1285 print
'<option value="" '.(($search_type_mouvement ==
"") ?
'selected="selected"' :
'').
'> </option>';
1286 print
'<option value="0" '.(($search_type_mouvement ==
"0") ?
'selected="selected"' :
'').
'>'.$langs->trans(
'StockIncreaseAfterCorrectTransfer').
'</option>';
1287 print
'<option value="1" '.(($search_type_mouvement ==
"1") ?
'selected="selected"' :
'').
'>'.$langs->trans(
'StockDecreaseAfterCorrectTransfer').
'</option>';
1288 print
'<option value="2" '.(($search_type_mouvement ==
"2") ?
'selected="selected"' :
'').
'>'.$langs->trans(
'StockDecrease').
'</option>';
1289 print
'<option value="3" '.(($search_type_mouvement ==
"3") ?
'selected="selected"' :
'').
'>'.$langs->trans(
'StockIncrease').
'</option>';
1296if (!empty($arrayfields[
'm.value'][
'checked'])) {
1298 print
'<td class="liste_titre right">';
1299 print
'<input class="flat width50 right" type="text" name="search_qty" value="'.dol_escape_htmltag($search_qty).
'">';
1302if (!empty($arrayfields[
'm.price'][
'checked'])) {
1304 print
'<td class="liste_titre" align="left">';
1310include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_input.tpl.php';
1313$parameters = array(
'arrayfields' => $arrayfields);
1314$reshook = $hookmanager->executeHooks(
'printFieldListOption', $parameters, $warehouse, $action);
1315print $hookmanager->resPrint;
1317if (!empty($arrayfields[
'm.datec'][
'checked'])) {
1318 print
'<td class="liste_titre">';
1322if (!empty($arrayfields[
'm.tms'][
'checked'])) {
1323 print
'<td class="liste_titre">';
1328 print
'<td class="liste_titre center maxwidthsearch">';
1329 $searchpicto = $form->showFilterButtons();
1340print
'<tr class="liste_titre">';
1343 print
getTitleFieldOfList($selectedfields, 0, $_SERVER[
"PHP_SELF"],
'',
'',
'',
'', $sortfield, $sortorder,
'center maxwidthsearch ').
"\n";
1346if (!empty($arrayfields[
'm.rowid'][
'checked'])) {
1347 print_liste_field_titre($arrayfields[
'm.rowid'][
'label'], $_SERVER[
"PHP_SELF"],
'm.rowid',
'', $param,
'', $sortfield, $sortorder);
1349if (!empty($arrayfields[
'm.datem'][
'checked'])) {
1350 print_liste_field_titre($arrayfields[
'm.datem'][
'label'], $_SERVER[
"PHP_SELF"],
'm.datem',
'', $param,
'', $sortfield, $sortorder,
'center ');
1352if (!empty($arrayfields[
'p.ref'][
'checked'])) {
1353 print_liste_field_titre($arrayfields[
'p.ref'][
'label'], $_SERVER[
"PHP_SELF"],
'p.ref',
'', $param,
'', $sortfield, $sortorder);
1355if (!empty($arrayfields[
'p.label'][
'checked'])) {
1356 print_liste_field_titre($arrayfields[
'p.label'][
'label'], $_SERVER[
"PHP_SELF"],
'p.label',
'', $param,
'', $sortfield, $sortorder);
1358if (!empty($arrayfields[
'm.batch'][
'checked'])) {
1359 print_liste_field_titre($arrayfields[
'm.batch'][
'label'], $_SERVER[
"PHP_SELF"],
'm.batch',
'', $param,
'', $sortfield, $sortorder,
'center ');
1361if (!empty($arrayfields[
'pl.eatby'][
'checked'])) {
1362 print_liste_field_titre($arrayfields[
'pl.eatby'][
'label'], $_SERVER[
"PHP_SELF"],
'pl.eatby',
'', $param,
'', $sortfield, $sortorder,
'center ');
1364if (!empty($arrayfields[
'pl.sellby'][
'checked'])) {
1365 print_liste_field_titre($arrayfields[
'pl.sellby'][
'label'], $_SERVER[
"PHP_SELF"],
'pl.sellby',
'', $param,
'', $sortfield, $sortorder,
'center ');
1367if (!empty($arrayfields[
'e.ref'][
'checked'])) {
1369 print_liste_field_titre($arrayfields[
'e.ref'][
'label'], $_SERVER[
"PHP_SELF"],
"e.ref",
"", $param,
"", $sortfield, $sortorder);
1371if (!empty($arrayfields[
'm.fk_user_author'][
'checked'])) {
1372 print_liste_field_titre($arrayfields[
'm.fk_user_author'][
'label'], $_SERVER[
"PHP_SELF"],
"m.fk_user_author",
"", $param,
"", $sortfield, $sortorder);
1374if (!empty($arrayfields[
'm.inventorycode'][
'checked'])) {
1375 print_liste_field_titre($arrayfields[
'm.inventorycode'][
'label'], $_SERVER[
"PHP_SELF"],
"m.inventorycode",
"", $param,
"", $sortfield, $sortorder);
1377if (!empty($arrayfields[
'm.label'][
'checked'])) {
1378 print_liste_field_titre($arrayfields[
'm.label'][
'label'], $_SERVER[
"PHP_SELF"],
"m.label",
"", $param,
"", $sortfield, $sortorder);
1380if (!empty($arrayfields[
'origin'][
'checked'])) {
1381 print_liste_field_titre($arrayfields[
'origin'][
'label'], $_SERVER[
"PHP_SELF"],
"",
"", $param,
"", $sortfield, $sortorder);
1383if (!empty($arrayfields[
'm.fk_projet'][
'checked'])) {
1384 print_liste_field_titre($arrayfields[
'm.fk_projet'][
'label'], $_SERVER[
"PHP_SELF"],
"m.fk_projet",
"", $param,
'', $sortfield, $sortorder);
1386if (!empty($arrayfields[
'm.type_mouvement'][
'checked'])) {
1387 print_liste_field_titre($arrayfields[
'm.type_mouvement'][
'label'], $_SERVER[
"PHP_SELF"],
"m.type_mouvement",
"", $param,
'', $sortfield, $sortorder,
'center ');
1389if (!empty($arrayfields[
'm.value'][
'checked'])) {
1390 print_liste_field_titre($arrayfields[
'm.value'][
'label'], $_SERVER[
"PHP_SELF"],
"m.value",
"", $param,
'', $sortfield, $sortorder,
'right ');
1392if (!empty($arrayfields[
'm.price'][
'checked'])) {
1393 print_liste_field_titre($arrayfields[
'm.price'][
'label'], $_SERVER[
"PHP_SELF"],
"m.price",
"", $param,
'', $sortfield, $sortorder,
'right ');
1397include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_title.tpl.php';
1400$parameters = array(
'arrayfields' => $arrayfields,
'param' => $param,
'sortfield' => $sortfield,
'sortorder' => $sortorder,
'totalarray' => &$totalarray);
1401$reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $warehouse, $action);
1402print $hookmanager->resPrint;
1403if (!empty($arrayfields[
'm.datec'][
'checked'])) {
1404 print_liste_field_titre($arrayfields[
'm.datec'][
'label'], $_SERVER[
"PHP_SELF"],
"m.datec",
"", $param,
'', $sortfield, $sortorder,
'center nowrap ');
1406if (!empty($arrayfields[
'm.tms'][
'checked'])) {
1407 print_liste_field_titre($arrayfields[
'm.tms'][
'label'], $_SERVER[
"PHP_SELF"],
"m.tms",
"", $param,
'', $sortfield, $sortorder,
'center nowrap ');
1411 print
getTitleFieldOfList($selectedfields, 0, $_SERVER[
"PHP_SELF"],
'',
'',
'',
'', $sortfield, $sortorder,
'center maxwidthsearch ').
"\n";
1417$arrayofuniqueproduct = array();
1426$imaxinloop = ($limit ? min($num, $limit) : $num);
1427while ($i < $imaxinloop) {
1428 $obj = $db->fetch_object($resql);
1433 $userstatic->id = $obj->fk_user_author;
1434 $userstatic->login = $obj->login;
1435 $userstatic->lastname = $obj->lastname;
1436 $userstatic->firstname = $obj->firstname;
1437 $userstatic->photo = $obj->photo;
1438 $userstatic->email = $obj->user_email;
1439 $userstatic->status = $obj->user_status;
1444 $sql =
"SELECT label";
1445 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product_lang";
1446 $sql .=
" WHERE fk_product = ".((int) $obj->rowid);
1447 $sql .=
" AND lang = '".$db->escape($langs->getDefaultLang()).
"'";
1450 $result = $db->query($sql);
1452 $objtp = $db->fetch_object($result);
1453 if (!empty($objtp->label)) {
1454 $obj->produit = $objtp->label;
1459 $productstatic->id = $obj->rowid;
1460 $productstatic->ref = $obj->product_ref;
1461 $productstatic->label = $obj->produit;
1462 $productstatic->type = $obj->type;
1463 $productstatic->entity = $obj->entity;
1464 $productstatic->status = $obj->tosell;
1465 $productstatic->status_buy = $obj->tobuy;
1466 $productstatic->status_batch = $obj->tobatch;
1468 $productlot->id = $obj->lotid;
1469 $productlot->batch = $obj->batch;
1470 $productlot->eatby = $obj->eatby;
1471 $productlot->sellby = $obj->sellby;
1473 $warehousestatic->id = $obj->entrepot_id;
1474 $warehousestatic->ref = $obj->warehouse_ref;
1475 $warehousestatic->label = $obj->warehouse_ref;
1476 $warehousestatic->lieu = $obj->lieu;
1477 $warehousestatic->fk_parent = $obj->fk_parent;
1478 $warehousestatic->statut = $obj->statut;
1484 $object->warehouse_id = $obj->entrepot_id;
1485 $object->type = $obj->type_mouvement;
1487 $arrayofuniqueproduct[$obj->rowid] = $obj->produit;
1488 if (!empty($obj->fk_origin)) {
1489 $origin =
$object->get_origin($obj->fk_origin, $obj->origintype);
1494 if ($mode ==
'kanban') {
1496 print
'<tr class="trkanban"><td colspan="'.$savnbfield.
'">';
1497 print
'<div class="box-flex-container kanban">';
1501 if ($massactionbutton || $massaction) {
1503 if (in_array($warehouse->id, $arrayofselected)) {
1507 print $warehouse->getKanbanView(
'', array(
'selected' => $selected));
1508 if ($i == ($imaxinloop - 1)) {
1515 print
'<tr data-rowid="'.$warehouse->id.
'" class="oddeven">';
1518 print
'<td class="nowrap center">';
1519 if ($massactionbutton || $massaction) {
1521 if (in_array($obj->mid, $arrayofselected)) {
1524 print
'<input id="cb'.$obj->mid.
'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->mid.
'"'.($selected ?
' checked="checked"' :
'').
'>';
1532 if (!empty($arrayfields[
'm.rowid'][
'checked'])) {
1533 print
'<td class="nowraponall">';
1540 if (!empty($arrayfields[
'm.datem'][
'checked'])) {
1541 print
'<td class="nowraponall center">'.dol_print_date($db->jdate($obj->datem),
'dayhour',
'tzuserrel').
'</td>';
1544 if (!empty($arrayfields[
'p.ref'][
'checked'])) {
1545 print
'<td class="nowraponall">';
1546 print $productstatic->getNomUrl(1,
'stock', 16);
1550 if (!empty($arrayfields[
'p.label'][
'checked'])) {
1551 print
'<td class="tdoverflowmax150" title="'.dol_escape_htmltag($productstatic->label).
'">';
1552 print $productstatic->label;
1556 if (!empty($arrayfields[
'm.batch'][
'checked'])) {
1557 print
'<td class="center nowraponall">';
1558 if ($productlot->id > 0) {
1559 print $productlot->getNomUrl(1);
1561 print $productlot->batch;
1566 if (!empty($arrayfields[
'pl.eatby'][
'checked'])) {
1567 print
'<td class="center">'.dol_print_date($obj->eatby,
'day').
'</td>';
1570 if (!empty($arrayfields[
'pl.sellby'][
'checked'])) {
1571 print
'<td class="center">'.dol_print_date($obj->sellby,
'day').
'</td>';
1574 if (!empty($arrayfields[
'e.ref'][
'checked'])) {
1575 print
'<td class="tdoverflowmax150">';
1576 print $warehousestatic->getNomUrl(1);
1580 if (!empty($arrayfields[
'm.fk_user_author'][
'checked'])) {
1581 print
'<td class="tdoverflowmax100">';
1582 print $userstatic->getNomUrl(-1);
1586 if (!empty($arrayfields[
'm.inventorycode'][
'checked'])) {
1587 print
'<td class="tdoverflowmax150" title="'.dolPrintHTML($obj->inventorycode).
'">';
1588 if ($obj->inventorycode) {
1589 print
img_picto(
'',
'movement',
'class="pictofixedwidth"');
1590 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?search_inventorycode='.urlencode(
'^'.$obj->inventorycode.
'$').
'">'.
dol_escape_htmltag($obj->inventorycode).
'</a>';
1595 if (!empty($arrayfields[
'm.label'][
'checked'])) {
1596 print
'<td class="tdoverflowmax200" title="'.dol_escape_htmltag($obj->label).
'">'.
dol_escape_htmltag($obj->label).
'</td>';
1599 if (!empty($arrayfields[
'origin'][
'checked'])) {
1600 print
'<td class="nowraponall">'.$origin.
'</td>';
1603 if (!empty($arrayfields[
'm.fk_projet'][
'checked'])) {
1605 if ($obj->fk_project != 0) {
1606 print
$object->get_origin($obj->fk_project,
'project');
1611 if (!empty($arrayfields[
'm.type_mouvement'][
'checked'])) {
1612 print
'<td class="center">';
1613 print
$object->getTypeMovement();
1617 if (!empty($arrayfields[
'm.value'][
'checked'])) {
1618 print
'<td class="right">';
1619 if ($obj->qty > 0) {
1620 print
'<span class="stockmovemententry">';
1625 print
'<span class="stockmovementexit">';
1632 if (!empty($arrayfields[
'm.price'][
'checked'])) {
1633 $usercancreadsupplierprice =
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') ? $user->hasRight(
'product',
'product_advance',
'read_supplier_prices') : $user->hasRight(
'product',
'lire');
1634 if ($productstatic->isService()) {
1635 $usercancreadsupplierprice =
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') ? $user->hasRight(
'service',
'service_advance',
'read_supplier_prices') : $user->hasRight(
'service',
'lire');
1637 print
'<td class="right">';
1638 if ($obj->price != 0 && $usercancreadsupplierprice) {
1639 print
price($obj->price);
1645 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_print_fields.tpl.php';
1647 $parameters = array(
'arrayfields' => $arrayfields,
'object' => $object,
'obj' => $obj,
'i' => $i,
'totalarray' => &$totalarray);
1648 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
1649 print $hookmanager->resPrint;
1653 print
'<td class="nowrap center">';
1654 if ($massactionbutton || $massaction) {
1656 if (in_array($obj->mid, $arrayofselected)) {
1659 print
'<input id="cb'.$obj->mid.
'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->mid.
'"'.($selected ?
' checked="checked"' :
'').
'>';
1676 foreach ($arrayfields as $key => $val) {
1677 if (!empty($val[
'checked'])) {
1681 print
'<tr><td colspan="'.$colspan.
'"><span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span></td></tr>';
1686$parameters = array(
'arrayfields' => $arrayfields,
'sql' => $sql);
1687$reshook = $hookmanager->executeHooks(
'printFieldListFooter', $parameters, $object, $action);
1688print $hookmanager->resPrint;
1690print
'</table>'.
"\n";
1693print
'</form>'.
"\n";
1696if (count($arrayofuniqueproduct) == 1 && !empty($year) && is_numeric($year)) {
1699 $productidselected = 0;
1700 foreach ($arrayofuniqueproduct as $key => $val) {
1701 $productidselected = $key;
1702 $productlabelselected = $val;
1706 $balancebefore =
$object->calculateBalanceForProductBefore($productidselected, $datebefore);
1707 $balanceafter =
$object->calculateBalanceForProductBefore($productidselected, $dateafter);
1710 print $langs->trans(
"NbOfProductBeforePeriod", $productlabelselected,
dol_print_date($datebefore,
'day',
'gmt'));
1713 print
': '.$balancebefore;
1717 print $langs->trans(
"NbOfProductAfterPeriod", $productlabelselected,
dol_print_date($dateafter,
'day',
'gmt'));
1720 print
': '.$balanceafter;
1725if (in_array(
'builddoc', array_keys($arrayofmassactions)) && ($nbtotalofrecords ===
'' || $nbtotalofrecords)) {
1726 $hidegeneratedfilelistifempty = 1;
1727 if ($massaction ==
'builddoc' || $action ==
'remove_file' || $show_files) {
1728 $hidegeneratedfilelistifempty = 0;
1731 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
1735 $urlsource = $_SERVER[
'PHP_SELF'].
'?sortfield='.$sortfield.
'&sortorder='.$sortorder;
1736 $urlsource .= str_replace(
'&',
'&', $param);
1738 $filedir = $diroutputmassaction;
1739 $genallowed = $permissiontoread;
1740 $delallowed = $permissiontoadd;
1742 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( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
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_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.
natural_search($fields, $value, $mode=0, $nofirstand=0)
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
newToken()
Return the value of token currently saved into session with name 'newtoken'.
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.
GETPOSTFLOAT($paramname, $rounding='')
Return the value of a $_GET or $_POST supervariable, converted into float.
dol_clone($object, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
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...
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0)
Clean a string to use it as a file name.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.
stock_prepare_head($object)
Prepare array with list of tabs.