29 require
'../../main.inc.php';
30 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
31 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/entrepot.class.php';
32 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
33 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
34 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.commande.class.php';
35 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
36 require_once
'./lib/replenishment.lib.php';
39 $langs->loadLangs(array(
'products',
'stocks',
'orders'));
43 $socid = $user->socid;
48 $hookmanager->initHooks(array(
'stockreplenishlist'));
52 $action =
GETPOST(
'action',
'aZ09');
54 $mode =
GETPOST(
'mode',
'alpha');
63 $search_ref =
GETPOST(
'search_ref',
'alphanohtml');
64 $search_nom =
GETPOST(
'search_nom',
'alphanohtml');
68 $productid =
GETPOST(
'productid',
'int');
69 $fk_warehouse =
GETPOST(
'fk_warehouse',
'int');
71 $sortfield =
GETPOST(
'sortfield',
'aZ09comma');
72 $sortorder =
GETPOST(
'sortorder',
'aZ09comma');
74 if (empty($page) || $page == -1) { $page = 0; }
75 $limit =
GETPOST(
'limit',
'int') ?
GETPOST(
'limit',
'int') : $conf->liste_limit;
76 $offset = $limit * $page;
84 $parameters = array();
85 $reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
86 if ($reshook < 0)
setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
89 if ($mode ==
'future') {
90 if ($date && $date < $now) {
95 if ($date && $date > $now) {
96 setEventMessages($langs->trans(
"ErrorDateMustBeBeforeToday"), null,
'errors');
106 if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha'))
115 $warehouseStatus = array();
116 if ($conf->global->ENTREPOT_EXTRA_STATUS) {
123 $stock_prod_warehouse = array();
124 $stock_prod = array();
125 if ($date && $dateIsValid) {
126 $sql =
"SELECT ps.fk_product, ps.fk_entrepot as fk_warehouse,";
127 $sql .=
" SUM(ps.reel) AS stock";
128 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product_stock as ps";
129 $sql .=
", ".MAIN_DB_PREFIX.
"entrepot as w";
130 $sql .=
" WHERE w.entity IN (".getEntity(
'stock').
")";
131 $sql .=
" AND w.rowid = ps.fk_entrepot";
132 if (!empty($conf->global->ENTREPOT_EXTRA_STATUS) && count($warehouseStatus)) {
133 $sql .=
" AND w.statut IN (".$db->sanitize($db->escape(implode(
',', $warehouseStatus))).
")";
135 if ($productid > 0) {
136 $sql .=
" AND ps.fk_product = ".$productid;
138 if ($fk_warehouse > 0) {
139 $sql .=
" AND ps.fk_entrepot = ".$fk_warehouse;
141 $sql .=
" GROUP BY fk_product, fk_entrepot";
144 $resql = $db->query($sql);
147 $num = $db->num_rows(
$resql);
151 $obj = $db->fetch_object(
$resql);
153 $tmp_fk_product = $obj->fk_product;
154 $tmp_fk_warehouse = $obj->fk_warehouse;
155 $stock = $obj->stock;
157 $stock_prod_warehouse[$tmp_fk_product][$tmp_fk_warehouse] = $stock;
158 $stock_prod[$tmp_fk_product] = (isset($stock_prod[$tmp_fk_product]) ? $stock_prod[$tmp_fk_product] : 0) + $stock;
168 } elseif ($action ==
'filter') {
169 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")), null,
'errors');
173 $movements_prod_warehouse = array();
174 $movements_prod = array();
175 $movements_prod_warehouse_nb = array();
176 $movements_prod_nb = array();
177 if ($date && $dateIsValid) {
178 $sql =
"SELECT sm.fk_product, sm.fk_entrepot, SUM(sm.value) AS stock, COUNT(sm.rowid) AS nbofmovement";
179 $sql .=
" FROM ".MAIN_DB_PREFIX.
"stock_mouvement as sm";
180 $sql .=
", ".MAIN_DB_PREFIX.
"entrepot as w";
181 $sql .=
" WHERE w.entity IN (".getEntity(
'stock').
")";
182 $sql .=
" AND w.rowid = sm.fk_entrepot";
183 if (!empty($conf->global->ENTREPOT_EXTRA_STATUS) && count($warehouseStatus)) {
184 $sql .=
" AND w.statut IN (".$db->sanitize($db->escape(implode(
',', $warehouseStatus))).
")";
186 if ($mode ==
'future') {
187 $sql .=
" AND sm.datem <= '".$db->idate($dateendofday).
"'";
189 $sql .=
" AND sm.datem >= '".$db->idate($date).
"'";
191 if ($productid > 0) {
192 $sql .=
" AND sm.fk_product = ".$productid;
194 if ($fk_warehouse > 0) {
195 $sql .=
" AND sm.fk_entrepot = ".$fk_warehouse;
197 $sql .=
" GROUP BY sm.fk_product, sm.fk_entrepot";
198 $resql = $db->query($sql);
202 $num = $db->num_rows(
$resql);
206 $obj = $db->fetch_object(
$resql);
207 $fk_product = $obj->fk_product;
208 $fk_entrepot = $obj->fk_entrepot;
209 $stock = $obj->stock;
210 $nbofmovement = $obj->nbofmovement;
213 $movements_prod_warehouse[$fk_product][$fk_entrepot] = $stock;
214 $movements_prod_warehouse_nb[$fk_product][$fk_entrepot] = $nbofmovement;
217 $movements_prod[$fk_product] += $stock;
218 $movements_prod_nb[$fk_product] += $nbofmovement;
236 $form =
new Form($db);
242 $title = $langs->trans(
'StockAtDate');
244 $sql =
'SELECT p.rowid, p.ref, p.label, p.description, p.price,';
245 $sql .=
' p.price_ttc, p.price_base_type, p.fk_product_type, p.desiredstock, p.seuil_stock_alerte,';
246 $sql .=
' p.tms as datem, p.duration, p.tobuy, p.stock';
247 if ($fk_warehouse > 0) {
248 $sql .=
', SUM(ps.reel) as stock_reel';
251 $parameters = array();
252 $reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters);
253 $sql .= $hookmanager->resPrint;
255 $sql .=
' FROM '.MAIN_DB_PREFIX.
'product as p';
256 if ($fk_warehouse > 0) {
257 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product_stock as ps ON p.rowid = ps.fk_product AND ps.fk_entrepot = '.$fk_warehouse;
260 $parameters = array();
261 $reshook = $hookmanager->executeHooks(
'printFieldListJoin', $parameters);
262 $sql .= $hookmanager->resPrint;
263 $sql .=
' WHERE p.entity IN ('.getEntity(
'product').
')';
264 if ($productid > 0) {
265 $sql .=
" AND p.rowid = ".$productid;
267 if (empty($conf->global->STOCK_SUPPORTS_SERVICES)) {
268 $sql .=
" AND p.fk_product_type = 0";
270 if (!empty($canvas)) $sql .=
' AND p.canvas = "'.$db->escape($canvas).
'"';
271 if ($fk_warehouse > 0) {
272 $sql .=
' GROUP BY p.rowid, p.ref, p.label, p.description, p.price, p.price_ttc, p.price_base_type, p.fk_product_type, p.desiredstock, p.seuil_stock_alerte,';
273 $sql .=
' p.tms, p.duration, p.tobuy, p.stock';
276 $parameters = array();
277 $reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters);
278 $sql .= $hookmanager->resPrint;
280 if ($sortfield ==
'stock_reel' && $fk_warehouse <= 0) {
281 $sortfield =
'stock';
283 if ($sortfield ==
'stock' && $fk_warehouse > 0) {
284 $sortfield =
'stock_reel';
286 $sql .= $db->order($sortfield, $sortorder);
288 if ($date && $dateIsValid) {
289 $nbtotalofrecords =
'';
290 if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST))
292 $result = $db->query($sql);
293 $nbtotalofrecords = $db->num_rows($result);
294 if (($page * $limit) > $nbtotalofrecords)
301 $sql .= $db->plimit($limit + 1, $offset);
304 $resql = $db->query($sql);
311 $num = $db->num_rows(
$resql);
317 $helpurl =
'EN:Module_Stocks_En|FR:Module_Stock|';
318 $helpurl .=
'ES:Módulo_Stocks';
324 $head[0][0] = DOL_URL_ROOT.
'/product/stock/stockatdate.php';
325 $head[0][1] = $langs->trans(
"StockAtDateInPast");
326 $head[0][2] =
'stockatdatepast';
328 $head[1][0] = DOL_URL_ROOT.
'/product/stock/stockatdate.php?mode=future';
329 $head[1][1] = $langs->trans(
"StockAtDateInFuture");
330 $head[1][2] =
'stockatdatefuture';
337 $desc = $langs->trans(
"StockAtDatePastDesc");
338 if ($mode ==
'future') $desc = $langs->trans(
"StockAtDateFutureDesc");
339 print '<span class="opacitymedium">'.$desc.
'</span><br>'.
"\n";
342 print '<form name="formFilterWarehouse" method="POST" action="'.$_SERVER[
"PHP_SELF"].
'">';
343 print '<input type="hidden" name="token" value="'.newToken().
'">';
344 print '<input type="hidden" name="action" value="filter">';
345 print '<input type="hidden" name="mode" value="'.$mode.
'">';
347 print '<div class="inline-block valignmiddle" style="padding-right: 20px;">';
348 print '<span class="fieldrequired">'.$langs->trans(
'Date').
'</span> '.$form->selectDate(($date ? $date : -1),
'date');
350 print ' <span class="clearbothonsmartphone marginleftonly paddingleftonly marginrightonly paddinrightonly"> </span> ';
352 print $langs->trans(
'Product').
'</span> ';
353 $form->select_produits($productid,
'productid',
'', 0, 0, -1, 2,
'', 0, array(), 0,
'1', 0,
'maxwidth300');
355 print ' <span class="clearbothonsmartphone marginleftonly paddingleftonly marginrightonly paddinrightonly"> </span> ';
357 print $langs->trans(
'Warehouse').
'</span> ';
358 print $formproduct->selectWarehouses((
GETPOSTISSET(
'fk_warehouse') ? $fk_warehouse :
'ifone'),
'fk_warehouse',
'', 1);
361 $parameters = array();
362 $reshook = $hookmanager->executeHooks(
'printFieldPreListTitle', $parameters);
363 if (empty($reshook))
print $hookmanager->resPrint;
365 print '<div class="inline-block valignmiddle">';
366 print '<input class="button" type="submit" name="valid" value="'.$langs->trans(
'Refresh').
'">';
372 if (!empty($contextpage) && $contextpage !=
$_SERVER[
"PHP_SELF"]) $param .=
'&contextpage='.urlencode($contextpage);
373 if ($limit > 0 && $limit != $conf->liste_limit) $param .=
'&limit='.urlencode($limit);
374 $param .=
'&mode='.$mode;
375 if ($fk_warehouse > 0) $param .=
'&fk_warehouse='.$fk_warehouse;
376 if ($productid > 0) $param .=
'&productid='.$productid;
377 if (
GETPOST(
'dateday',
'int') > 0) $param .=
'&dateday='.GETPOST(
'dateday',
'int');
378 if (
GETPOST(
'datemonth',
'int') > 0) $param .=
'&datemonth='.GETPOST(
'datemonth',
'int');
379 if (
GETPOST(
'dateyear',
'int') > 0) $param .=
'&dateyear='.GETPOST(
'dateyear',
'int');
382 print_barre_liste(
'', $page,
$_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder,
'', $num, $nbtotalofrecords,
'stock', 0,
'',
'', $limit, 0, 0, 1);
384 print '<div class="div-table-responsive">';
385 print '<table class="liste centpercent">';
387 $stocklabel = $langs->trans(
'StockAtDate');
388 if ($mode ==
'future') $stocklabel = $langs->trans(
"VirtualStockAtDate");
391 print '<input type="hidden" name="token" value="'.newToken().
'">';
392 print '<input type="hidden" name="sortfield" value="'.$sortfield.
'">';
393 print '<input type="hidden" name="sortorder" value="'.$sortorder.
'">';
394 print '<input type="hidden" name="type" value="'.$type.
'">';
395 print '<input type="hidden" name="mode" value="'.$mode.
'">';
398 print '<tr class="liste_titre_filter">';
399 print '<td class="liste_titre"><input class="flat" type="text" name="search_ref" size="8" value="'.dol_escape_htmltag($search_ref).
'"></td>';
400 print '<td class="liste_titre"><input class="flat" type="text" name="search_nom" size="8" value="'.dol_escape_htmltag($search_nom).
'"></td>';
401 print '<td class="liste_titre"></td>';
402 print '<td class="liste_titre"></td>';
403 print '<td class="liste_titre"></td>';
404 if ($mode ==
'future') {
405 print '<td class="liste_titre"></td>';
408 $parameters = array(
'param'=>$param,
'sortfield'=>$sortfield,
'sortorder'=>$sortorder);
409 $reshook = $hookmanager->executeHooks(
'printFieldListOption', $parameters);
410 print $hookmanager->resPrint;
412 print '<td class="liste_titre maxwidthsearch">';
413 $searchpicto = $form->showFilterAndCheckAddButtons(0);
418 $fieldtosortcurrentstock =
'stock';
419 if ($fk_warehouse > 0) {
420 $fieldtosortcurrentstock =
'stock_reel';
424 print '<tr class="liste_titre">';
427 if ($mode ==
'future') {
440 $parameters = array(
'param'=>$param,
'sortfield'=>$sortfield,
'sortorder'=>$sortorder);
441 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters);
442 print $hookmanager->resPrint;
447 while ($i < ($limit ? min($num, $limit) : $num))
449 $objp = $db->fetch_object(
$resql);
451 if (!empty($conf->global->STOCK_SUPPORTS_SERVICES) || $objp->fk_product_type == 0)
453 $prod->fetch($objp->rowid);
474 if ($fk_warehouse > 0)
477 $currentstock = $stock_prod_warehouse[$objp->rowid][$fk_warehouse];
483 $currentstock = $stock_prod[$objp->rowid];
489 if ($mode ==
'future') {
490 $prod->load_stock(
'warehouseopen, warehouseinternal', 0);
496 $stock =
'<span class="opacitymedium">'.$langs->trans(
"FeatureNotYetAvailable").
'</span>';
497 $virtualstock = $prod->stock_theorique;
499 if ($fk_warehouse > 0) {
500 $stock = $currentstock - $movements_prod_warehouse[$objp->rowid][$fk_warehouse];
501 $nbofmovement = $movements_prod_warehouse_nb[$objp->rowid][$fk_warehouse];
503 $stock = $currentstock - $movements_prod[$objp->rowid];
504 $nbofmovement = $movements_prod_nb[$objp->rowid];
509 print '<tr class="oddeven">';
512 print '<td class="nowrap">'.$prod->getNomUrl(1,
'').
'</td>';
515 print '<td>'.$objp->label;
519 if ($mode ==
'future') {
521 print '<td class="right">'.$currentstock.
'</td>';
523 print '<td class="right"></td>';
526 print '<td class="right">'.$stock.
'</td>';
529 print '<td class="right">'.$virtualstock.
'</td>';
532 print '<td class="right">'.($stock ? $stock :
'<span class="opacitymedium">'.$stock.
'</span>').
'</td>';
534 print '<td class="right">';
535 if ($nbofmovement > 0) {
536 print '<a href="'.DOL_URL_ROOT.
'/product/stock/movement_list.php?idproduct='.$objp->rowid.($fk_warehouse > 0 ?
'&search_warehouse='.$fk_warehouse :
'').
'">'.$langs->trans(
"Movements").
'</a>';
537 print ' <span class="tabs"><span class="badge">'.$nbofmovement.
'</span></span>';
542 print '<td class="right">'.($currentstock ? $currentstock :
'<span class="opacitymedium">0</span>').
'</td>';
546 print '<td class="right"></td>';
549 $parameters = array(
'objp'=>$objp);
550 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters);
551 print $hookmanager->resPrint;
558 $parameters = array(
'sql'=>$sql);
559 $reshook = $hookmanager->executeHooks(
'printFieldListFooter', $parameters);
560 print $hookmanager->resPrint;
562 if (empty($date) || ! $dateIsValid) {
564 if ($mode ==
'future') $colspan++;
565 print '<tr><td colspan="'.$colspan.
'"><span class="opacitymedium">'.$langs->trans(
"EnterADateCriteria").
'</span></td></tr>';
GETPOST($paramname, $check= 'alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm= 'auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
const STATUS_OPEN_ALL
Warehouse open and operations for customer shipping, supplier dispatch, internal stock transfers/corr...
Class to manage products or services.
dol_now($mode= 'auto')
Return date for now.
setEventMessages($mesg, $mesgs, $style= 'mesgs', $messagekey= '')
Set event messages in dol_events session object.
print_barre_liste($titre, $page, $file, $options= '', $sortfield= '', $sortorder= '', $morehtmlcenter= '', $num=-1, $totalnboflines= '', $picto= 'generic', $pictoisfullpath=0, $morehtmlright= '', $morecss= '', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow= '')
Print a title with navigation controls for pagination.
const STATUS_OPEN_INTERNAL
Warehouse open and operations for stock transfers/corrections allowed (not for customer shipping and ...
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname.
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
load_fiche_titre($titre, $morehtmlright= '', $picto= 'generic', $pictoisfullpath=0, $id= '', $morecssontable= '', $morehtmlcenter= '')
Load a title with picto.
img_picto($titlealt, $picto, $moreatt= '', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt= '', $morecss= '', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
restrictedArea($user, $features, $objectid=0, $tableandshare= '', $feature2= '', $dbt_keyfield= 'fk_soc', $dbt_select= 'rowid', $isdraft=0)
Check permissions of a user to show a page and an object.
print $_SERVER["PHP_SELF"]
Edit parameters.
dol_get_fiche_head($links=array(), $active= '', $title= '', $notab=0, $picto= '', $pictoisfullpath=0, $morehtmlright= '', $morecss= '', $limittoshow=0, $moretabssuffix= '')
Show tabs of a record.
print
Draft customers invoices.
if(!empty($conf->facture->enabled)&&$user->rights->facture->lire) if((!empty($conf->fournisseur->enabled)&&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)||!empty($conf->supplier_invoice->enabled))&&$user->rights->fournisseur->facture->lire) if(!empty($conf->don->enabled)&&$user->rights->don->lire) if(!empty($conf->tax->enabled)&&$user->rights->tax->charges->lire) if(!empty($conf->facture->enabled)&&!empty($conf->commande->enabled)&&$user->rights->commande->lire &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) if(!empty($conf->facture->enabled)&&$user->rights->facture->lire) if((!empty($conf->fournisseur->enabled)&&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)||!empty($conf->supplier_invoice->enabled))&&$user->rights->fournisseur->facture->lire) $resql
Social contributions to pay.
dol_print_error($db= '', $error= '', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $keepmoretags= '', $escapeonlyhtmltags=0)
Returns text escaped for inclusion in HTML alt or title tags, or into values of HTML input fields...