31require
'../../main.inc.php';
39require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
40require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/entrepot.class.php';
41require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
42require_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
43require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.commande.class.php';
44require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
45require_once
'./lib/replenishment.lib.php';
48$langs->loadLangs(array(
'products',
'stocks',
'orders'));
51$hookmanager->initHooks(array(
'stockatdate'));
55$action =
GETPOST(
'action',
'aZ09');
57$mode =
GETPOST(
'mode',
'alpha');
59$ext = (GETPOSTISSET(
'output') && in_array(
GETPOST(
'output'), array(
'csv'))) ?
GETPOST(
'output') :
'';
63if (GETPOSTISSET(
'dateday') && GETPOSTISSET(
'datemonth') && GETPOSTISSET(
'dateyear')) {
68$search_ref =
GETPOST(
'search_ref',
'alphanohtml');
69$search_nom =
GETPOST(
'search_nom',
'alphanohtml');
75 $search_fk_warehouse =
GETPOST(
'search_fk_warehouse',
'array:int');
77 $search_fk_warehouse = array(
GETPOSTINT(
'search_fk_warehouse'));
81 $search_fk_warehouse = array(
GETPOSTINT(
'fk_warehouse'));
84foreach ($search_fk_warehouse as $key => $val) {
85 if ($val == -1 || empty($val)) {
86 unset($search_fk_warehouse[$key]);
90$sortfield =
GETPOST(
'sortfield',
'aZ09comma');
91$sortorder =
GETPOST(
'sortorder',
'aZ09comma');
93if (empty($page) || $page == -1) {
97$offset = $limit * $page;
109 $socid = $user->socid;
115$usercancreadsupplierprice =
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') ? $user->hasRight(
'product',
'product_advance',
'read_supplier_prices') : $user->hasRight(
'product',
'read');
118if ($mode ==
'future') {
119 if ($date && $date < $now) {
121 $dateIsValid =
false;
124 if ($date && $date > $now) {
125 setEventMessages($langs->trans(
"ErrorDateMustBeBeforeToday"),
null,
'errors');
126 $dateIsValid =
false;
135$parameters = array();
136$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
141if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
144 $search_fk_warehouse = array();
149$warehouseStatus = array();
157$stock_prod_warehouse = array();
158$stock_prod = array();
159if ($date && $dateIsValid) {
160 $sql =
"SELECT ps.fk_product, ps.fk_entrepot as fk_warehouse,";
161 $sql .=
" SUM(ps.reel) AS stock";
162 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product_stock as ps";
163 $sql .=
", ".MAIN_DB_PREFIX.
"entrepot as w";
164 $sql .=
", ".MAIN_DB_PREFIX.
"product as p";
165 $sql .=
" WHERE w.entity IN (".getEntity(
'stock').
")";
166 $sql .=
" AND w.rowid = ps.fk_entrepot AND p.rowid = ps.fk_product";
168 $sql .=
" AND w.statut IN (".$db->sanitize(implode(
',', $warehouseStatus)).
")";
170 if ($productid > 0) {
171 $sql .=
" AND ps.fk_product = ".((int) $productid);
173 if (! empty($search_fk_warehouse)) {
174 $sql .=
" AND ps.fk_entrepot IN (".$db->sanitize(implode(
",", $search_fk_warehouse)).
")";
182 $sql .=
" GROUP BY fk_product, fk_entrepot";
185 $resql =
$db->query($sql);
187 $num =
$db->num_rows($resql);
191 $obj =
$db->fetch_object($resql);
193 $tmp_fk_product = $obj->fk_product;
194 $tmp_fk_warehouse = $obj->fk_warehouse;
195 $stock = $obj->stock;
197 $stock_prod_warehouse[$tmp_fk_product][$tmp_fk_warehouse] = $stock;
198 $stock_prod[$tmp_fk_product] = (isset($stock_prod[$tmp_fk_product]) ? $stock_prod[$tmp_fk_product] : 0) + $stock;
208} elseif ($action ==
'filter') {
209 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
213$movements_prod_warehouse = array();
214$movements_prod = array();
215$movements_prod_warehouse_nb = array();
216$movements_prod_nb = array();
217if ($date && $dateIsValid) {
218 $sql =
"SELECT sm.fk_product, sm.fk_entrepot, SUM(sm.value) AS stock, COUNT(sm.rowid) AS nbofmovement";
219 $sql .=
" FROM ".MAIN_DB_PREFIX.
"stock_mouvement as sm";
220 $sql .=
", ".MAIN_DB_PREFIX.
"entrepot as w";
221 $sql .=
", ".MAIN_DB_PREFIX.
"product as p";
222 $sql .=
" WHERE w.entity IN (".getEntity(
'stock').
")";
223 $sql .=
" AND w.rowid = sm.fk_entrepot AND p.rowid = sm.fk_product ";
225 $sql .=
" AND w.statut IN (".$db->sanitize(implode(
',', $warehouseStatus)).
")";
227 if ($mode ==
'future') {
228 $sql .=
" AND sm.datem <= '".$db->idate($dateendofday).
"'";
230 $sql .=
" AND sm.datem >= '".$db->idate($dateendofday).
"'";
232 if ($productid > 0) {
233 $sql .=
" AND sm.fk_product = ".((int) $productid);
235 if (!empty($search_fk_warehouse)) {
236 $sql .=
" AND sm.fk_entrepot IN (".$db->sanitize(implode(
",", $search_fk_warehouse)).
")";
239 $sql .=
" AND p.ref LIKE '%".$db->escape($search_ref).
"%' ";
242 $sql .=
" AND p.label LIKE '%".$db->escape($search_nom).
"%' ";
244 $sql .=
" GROUP BY sm.fk_product, sm.fk_entrepot";
246 $resql =
$db->query($sql);
249 $num =
$db->num_rows($resql);
253 $obj =
$db->fetch_object($resql);
254 $fk_product = $obj->fk_product;
255 $fk_entrepot = $obj->fk_entrepot;
256 $stock = $obj->stock;
257 $nbofmovement = $obj->nbofmovement;
260 $movements_prod_warehouse[$fk_product][$fk_entrepot] = $stock;
261 $movements_prod_warehouse_nb[$fk_product][$fk_entrepot] = $nbofmovement;
264 $movements_prod[$fk_product] = $stock + (array_key_exists($fk_product, $movements_prod) ? $movements_prod[$fk_product] : 0);
265 $movements_prod_nb[$fk_product] = $nbofmovement + (array_key_exists($fk_product, $movements_prod_nb) ? $movements_prod_nb[$fk_product] : 0);
289$title = $langs->trans(
'StockAtDate');
291$sql =
'SELECT p.rowid, p.ref, p.label, p.description, p.price, p.pmp,';
292$sql .=
' p.price_ttc, p.price_base_type, p.fk_product_type, p.desiredstock, p.seuil_stock_alerte,';
293$sql .=
' p.tms as datem, p.duration, p.tobuy, p.stock, ';
294if (!empty($search_fk_warehouse)) {
295 $sql .=
" SUM(p.pmp * ps.reel) as currentvalue, SUM(p.price * ps.reel) as sellvalue";
296 $sql .=
', SUM(ps.reel) as stock_reel';
298 $sql .=
" SUM(p.pmp * p.stock) as currentvalue, SUM(p.price * p.stock) as sellvalue";
301$parameters = array();
302$reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters, $object, $action);
303$sql .= $hookmanager->resPrint;
307$sql .=
' FROM '.MAIN_DB_PREFIX.
'product as p';
308if (!empty($search_fk_warehouse)) {
309 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product_stock as ps ON p.rowid = ps.fk_product AND ps.fk_entrepot IN ('.
$db->sanitize(implode(
",", $search_fk_warehouse)).
")";
312$parameters = array();
313$reshook = $hookmanager->executeHooks(
'printFieldListJoin', $parameters, $object, $action);
314$sql .= $hookmanager->resPrint;
315$sql .=
' WHERE p.entity IN ('.getEntity(
'product').
')';
317 $sql .=
" AND p.rowid = ".((int) $productid);
320 $sql .=
" AND p.fk_product_type = 0";
329$sqlGroupBy =
' GROUP BY p.rowid, p.ref, p.label, p.description, p.price, p.pmp, p.price_ttc, p.price_base_type, p.fk_product_type, p.desiredstock, p.seuil_stock_alerte,';
330$sqlGroupBy .=
' p.tms, p.duration, p.tobuy, p.stock';
332$parameters = array(
'sqlGroupBy' => $sqlGroupBy);
333$reshook = $hookmanager->executeHooks(
'printFieldListGroupBy', $parameters, $object, $action);
337 $sql .= $hookmanager->resPrint;
339 if (!empty($hookmanager->resArray[
'sqlGroupBy'])) {
340 $sqlGroupBy = $hookmanager->resArray[
'sqlGroupBy'];
347$parameters = array();
348$reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters);
349$sql .= $hookmanager->resPrint;
351if ($sortfield ==
'stock_reel' && empty($search_fk_warehouse)) {
352 $sortfield =
'stock';
354if ($sortfield ==
'stock' && !empty($search_fk_warehouse)) {
355 $sortfield =
'stock_reel';
357$sql .=
$db->order($sortfield, $sortorder);
360$nbtotalofrecords =
'';
361if ($date && $dateIsValid) {
364 $sqlforcount = preg_replace(
'/^'.preg_quote($sqlfields,
'/').
'/',
'SELECT COUNT(*) as nbtotalofrecords', $sql);
365 $sqlforcount = preg_replace(
'/GROUP BY .*$/',
'', $sqlforcount);
367 $resql =
$db->query($sqlforcount);
369 $objforcount =
$db->fetch_object($resql);
370 $nbtotalofrecords = $objforcount->nbtotalofrecords;
375 if (($page * $limit) > (
int) $nbtotalofrecords || $ext ==
'csv') {
384 $sql .=
$db->plimit($limit + 1, $offset);
388 $resql =
$db->query($sql);
394 $num =
$db->num_rows($resql);
399$helpurl =
'EN:Module_Stocks_En|FR:Module_Stock|';
400$helpurl .=
'ES:Módulo_Stocks';
402$stocklabel = $langs->trans(
'StockAtDate');
403if ($mode ==
'future') {
404 $stocklabel = $langs->trans(
"VirtualStockAtDate");
411 header(
"Content-Disposition: attachment; filename=stock".($date ?
'-'.
date(
"Y-m-d", $date) :
'').
".csv");
414 print implode(
";", ($mode ==
'future') ?
415 array(
'"Product Reference"',
'"Label"',
'"Current Stock"',
'"'.$stocklabel.
'"',
'"Virtual Stock"') :
416 array(
'"Product Reference"',
'"Label"',
'"'.$stocklabel.
'"', ($usercancreadsupplierprice ?
'"Estimated Stock Value"' :
'""'),
'"Estimate Sell Value"',
'"Movements"',
'"Current Stock"')).
"\r\n";
418 llxHeader(
'', $title, $helpurl,
'', 0, 0,
'',
'',
'',
'mod-product page-stock_stockatdate');
422 $head[0][0] = DOL_URL_ROOT.
'/product/stock/stockatdate.php';
423 $head[0][1] = $langs->trans(
"StockAtDateInPast");
424 $head[0][2] =
'stockatdatepast';
426 $head[1][0] = DOL_URL_ROOT.
'/product/stock/stockatdate.php?mode=future';
427 $head[1][1] = $langs->trans(
"StockAtDateInFuture");
428 $head[1][2] =
'stockatdatefuture';
433 print
dol_get_fiche_head($head, ($mode ==
'future' ?
'stockatdatefuture' :
'stockatdatepast'),
'', -1,
'');
435 $desc = $langs->trans(
"StockAtDatePastDesc");
436 if ($mode ==
'future') {
437 $desc = $langs->trans(
"StockAtDateFutureDesc");
439 print
'<span class="opacitymedium">'.$desc.
'</span><br>'.
"\n";
442 print
'<form name="formFilterWarehouse" method="POST" action="'.dolBuildUrl($_SERVER[
"PHP_SELF"]).
'">';
443 print
'<input type="hidden" name="token" value="'.newToken().
'">';
444 print
'<input type="hidden" name="action" value="filter">';
445 print
'<input type="hidden" name="mode" value="'.$mode.
'">';
447 print
'<div class="inline-block valignmiddle" style="padding-right: 20px;">';
448 print
'<span class="fieldrequired">'.$langs->trans(
'Date').
'</span> '.$form->selectDate(($date ? $date : -1),
'date');
450 print
' <span class="clearbothonsmartphone marginleftonly paddingleftonly marginrightonly paddingrightonly"> </span> ';
451 print
img_picto(
'',
'product',
'class="pictofixedwidth"').
' ';
453 print $form->select_produits($productid,
'productid',
'', 0, 0, -1, 2,
'', 0, array(), 0, $langs->trans(
'Product'), 0,
'maxwidth300', 0,
'',
null, 1);
455 if ($mode !=
'future') {
457 print
' <span class="clearbothonsmartphone marginleftonly paddingleftonly marginrightonly paddingrightonly"> </span> ';
458 print
img_picto(
'',
'stock',
'class="pictofixedwidth"').$langs->trans(
"Warehouse").
' :';
460 $selected = ((GETPOSTISSET(
'search_fk_warehouse') || GETPOSTISSET(
'fk_warehouse')) ? $search_fk_warehouse :
'ifonenodefault');
461 print $formproduct->selectWarehouses($selected,
'search_fk_warehouse',
'', 1, 0, 0, $langs->trans(
'Warehouse'), 0, 0, array(),
'minwidth200', array(), 1,
false,
'e.ref', 1);
466 $parameters = array();
467 $reshook = $hookmanager->executeHooks(
'printFieldPreListTitle', $parameters);
468 if (empty($reshook)) {
469 print $hookmanager->resPrint;
472 print
'<div class="inline-block valignmiddle">';
473 print
'<input type="submit" class="button" name="valid" value="'.$langs->trans(
'Refresh').
'">';
479 if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
480 $param .=
'&contextpage='.urlencode($contextpage);
482 if ($limit > 0 && $limit !=
$conf->liste_limit) {
483 $param .=
'&limit='.((int) $limit);
485 $param .=
'&mode='.$mode;
486 $param_warehouse =
'';
487 if (!empty($search_fk_warehouse)) {
488 foreach ($search_fk_warehouse as $val) {
489 $param_warehouse .=
'&search_fk_warehouse[]='.$val;
491 $param .= $param_warehouse;
493 if ($productid > 0) {
494 $param .=
'&productid='.(int) $productid;
497 $param .=
'&dateday='.GETPOSTINT(
'dateday');
500 $param .=
'&datemonth='.GETPOSTINT(
'datemonth');
503 $param .=
'&dateyear='.GETPOSTINT(
'dateyear');
507 print_barre_liste(
'', $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder,
'', $num, $nbtotalofrecords,
'stock', 0,
'',
'', $limit, 0, 0, 1);
509 print
'<div class="div-table-responsive">';
512 print
'<a href="stockatdate.php?output=csv&sortfield='.urlencode($sortfield).
'&sortorder='.urlencode($sortorder).
'&type='.((int) $type).
'&mode='.urlencode($mode).
513 (($productid > 0) ?
"&productid=".((
int) $productid) :
'').
517 (GETPOSTISSET(
'dateday') ?
"&dateday=".
GETPOSTINT(
'dateday') :
'').
518 (GETPOSTISSET(
'datemonth') ?
"&datemonth=".
GETPOSTINT(
'datemonth') :
'').
519 (GETPOSTISSET(
'dateyear') ?
"&dateyear=".
GETPOSTINT(
'dateyear') :
'').
520 '" title="Download CSV" />';
521 print
img_picto(
'',
'download',
'class="pictofixedwidth"');
522 print
'Download CSV';
526 print
'<table class="liste centpercent">';
528 print
'<input type="hidden" name="token" value="'.newToken().
'">';
529 print
'<input type="hidden" name="sortfield" value="'.$sortfield.
'">';
530 print
'<input type="hidden" name="sortorder" value="'.$sortorder.
'">';
531 print
'<input type="hidden" name="type" value="'.$type.
'">';
532 print
'<input type="hidden" name="mode" value="'.$mode.
'">';
535 print
'<tr class="liste_titre_filter">';
536 if (
$conf->main_checkbox_left_column) {
537 print
'<td class="liste_titre center maxwidthsearch">';
538 $searchpicto = $form->showFilterButtons(
'left');
542 print
'<td class="liste_titre"><input class="flat" type="text" name="search_ref" size="8" value="'.dol_escape_htmltag($search_ref).
'"></td>';
543 print
'<td class="liste_titre"><input class="flat" type="text" name="search_nom" size="8" value="'.dol_escape_htmltag($search_nom).
'"></td>';
544 print
'<td class="liste_titre"></td>';
545 print
'<td class="liste_titre"></td>';
546 print
'<td class="liste_titre"></td>';
547 if ($mode ==
'future') {
548 print
'<td class="liste_titre"></td>';
550 print
'<td class="liste_titre"></td>';
551 print
'<td class="liste_titre"></td>';
554 $parameters = array(
'param' => $param,
'sortfield' => $sortfield,
'sortorder' => $sortorder);
555 $reshook = $hookmanager->executeHooks(
'printFieldListOption', $parameters);
556 print $hookmanager->resPrint;
559 if (!
$conf->main_checkbox_left_column) {
560 print
'<td class="liste_titre center maxwidthsearch">';
561 $searchpicto = $form->showFilterButtons();
567 $fieldtosortcurrentstock =
'stock';
568 if (!empty($search_fk_warehouse)) {
569 $fieldtosortcurrentstock =
'stock_reel';
573 print
'<tr class="liste_titre">';
575 if (
$conf->main_checkbox_left_column) {
581 if ($mode ==
'future') {
582 print_liste_field_titre(
'CurrentStock', $_SERVER[
"PHP_SELF"], $fieldtosortcurrentstock,
'', $param,
'', $sortfield, $sortorder,
'right ');
584 print_liste_field_titre($stocklabel, $_SERVER[
"PHP_SELF"],
'',
'', $param,
'', $sortfield, $sortorder,
'right ',
'VirtualStockAtDateDesc');
585 print_liste_field_titre(
'VirtualStock', $_SERVER[
"PHP_SELF"],
'',
'', $param,
'', $sortfield, $sortorder,
'right ',
'VirtualStockDesc');
587 print_liste_field_titre($stocklabel, $_SERVER[
"PHP_SELF"],
'',
'', $param,
'', $sortfield, $sortorder,
'right ');
588 $tooltiptext = $langs->trans(
"QtyAtDate").
' x '.$langs->trans(
"AverageUnitPricePMPShort").
' ('.$langs->trans(
"Currently").
')';
589 if ($usercancreadsupplierprice) {
590 print_liste_field_titre(
"EstimatedStockValue", $_SERVER[
"PHP_SELF"],
"currentvalue",
'', $param,
'', $sortfield, $sortorder,
'right ', $tooltiptext, 1);
592 $tooltiptext = $langs->trans(
"QtyAtDate").
' x '.$langs->trans(
"SellingPrice").
' ('.$langs->trans(
"Currently").
')';
593 print_liste_field_titre(
"EstimatedStockValueSell", $_SERVER[
"PHP_SELF"],
"",
'', $param,
'', $sortfield, $sortorder,
'right ', $tooltiptext, 1);
594 $tooltiptext = $langs->trans(
"MovementsSinceDate");
595 print_liste_field_titre(
'since', $_SERVER[
"PHP_SELF"],
'',
'', $param,
'',
'',
'',
'right ', $tooltiptext, 1);
596 print_liste_field_titre(
'CurrentStock', $_SERVER[
"PHP_SELF"], $fieldtosortcurrentstock,
'', $param,
'', $sortfield, $sortorder,
'right ');
600 $parameters = array(
'param' => $param,
'sortfield' => $sortfield,
'sortorder' => $sortorder);
601 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters);
602 print $hookmanager->resPrint;
605 if (!
$conf->main_checkbox_left_column) {
612$totalbuyingprice = 0;
613$totalsellingprice = 0;
614$totalcurrentstock = 0;
615$totalvirtualstock = 0;
618while ($i < ($limit ? min($num, $limit) : $num)) {
623 $objp =
$db->fetch_object($resql);
626 $prod->fetch($objp->rowid);
647 if (!empty($search_fk_warehouse)) {
649 foreach ($search_fk_warehouse as $val) {
650 if (!is_numeric($currentstock)) {
653 $currentstock += empty($stock_prod_warehouse[$objp->rowid][$val]) ? 0 : $stock_prod_warehouse[$objp->rowid][$val];
660 $currentstock = empty($stock_prod[$objp->rowid]) ? 0 : $stock_prod[$objp->rowid];
668 if ($mode ==
'future') {
669 $prod->load_stock(
'warehouseopen,warehouseinternal,nobatch', 0, $dateendofday);
670 $stock =
$prod->stock_theorique;
671 $prod->load_stock(
'warehouseopen,warehouseinternal,nobatch', 0);
672 $virtualstock =
$prod->stock_theorique;
674 $stock = $currentstock;
675 if (!empty($search_fk_warehouse)) {
676 foreach ($search_fk_warehouse as $val) {
677 $stock -= empty($movements_prod_warehouse[$objp->rowid][$val]) ? 0 : $movements_prod_warehouse[$objp->rowid][$val];
678 $nbofmovement += empty($movements_prod_warehouse_nb[$objp->rowid][$val]) ? 0 : $movements_prod_warehouse_nb[$objp->rowid][$val];
681 $stock -= empty($movements_prod[$objp->rowid]) ? 0 : $movements_prod[$objp->rowid];
682 $nbofmovement += empty($movements_prod_nb[$objp->rowid]) ? 0 : $movements_prod_nb[$objp->rowid];
688 if ($mode ==
'future') {
689 print implode(
";", array(
691 '"'.$objp->label.
'"',
692 '"'.price2num($currentstock,
'MS').
'"',
693 '"'.price2num($stock,
'MS').
'"',
694 '"'.price2num($virtualstock,
'MS').
'"')).
"\r\n";
695 $totalvirtualstock += $virtualstock;
697 print implode(
";", array(
699 '"'.$objp->label.
'"',
701 ($usercancreadsupplierprice ? (
price2num($stock * $objp->pmp,
'MT') ?
'"'.price2num($stock * $objp->pmp,
'MT').
'"' :
'') :
''),
704 '"'.
price2num($currentstock,
'MS').
'"')).
"\r\n";
705 if ($usercancreadsupplierprice) {
706 $totalbuyingprice += $stock * $objp->pmp;
708 $totalsellingprice += $stock * $objp->price;
710 $totalcurrentstock += $currentstock;
712 print
'<tr class="oddeven">';
715 if (
$conf->main_checkbox_left_column) {
716 print
'<td class="left"></td>';
720 print
'<td class="nowrap">'.$prod->getNomUrl(1,
'').
'</td>';
727 if ($mode ==
'future') {
729 print
'<td class="right">'.price(
price2num($currentstock,
'MS')).
'</td>';
732 print
'<td class="right"></td>';
735 print
'<td class="right">'.price(
price2num($stock,
'MS')).
'</td>';
738 print
'<td class="right">'.price(
price2num($virtualstock,
'MS')).
'</td>';
739 $totalvirtualstock += $virtualstock;
742 print
'<td class="right">'.($stock ?
price(
price2num($stock,
'MS')) : (
'<span class="opacitymedium">0</span>')).
'</td>';
745 $estimatedvalue = $stock * $objp->pmp;
746 if ($usercancreadsupplierprice) {
747 print
'<td class="right" title="'.dolPrintHTMLForAttribute($langs->trans(
"AverageUnitPricePMPShort").
' ('.$langs->trans(
"Currently").
'): '.
price(
price2num($objp->pmp,
'MU'), 1)).
'">';
749 print
'<span class="amount">'.price(
price2num($estimatedvalue,
'MT'), 1).
'</span>';
753 $totalbuyingprice += $estimatedvalue;
758 print
'<td class="right"';
760 print
' title="'.dolPrintHTMLForAttribute($langs->trans(
"SellingPrice").
' ('.$langs->trans(
"Currently").
'): '.
price(
price2num($objp->price,
'MU'), 1));
764 print
'<span class="amount">';
765 if ($stock || (
float) ($stock * $objp->price)) {
769 $totalsellingprice += $stock * $objp->price;
771 $htmltext = $langs->trans(
"OptionMULTIPRICESIsOn");
772 print $form->textwithtooltip(
'<span class="opacitymedium">'.$langs->trans(
"Variable").
'</span>', $htmltext);
777 print
'<td class="right">';
778 if ($nbofmovement > 0) {
779 $url = DOL_URL_ROOT.
'/product/stock/movement_list.php?idproduct='.$objp->rowid;
780 if (GETPOSTISSET(
'datemonth')) {
781 $url .=
'&search_date_startday='.GETPOSTINT(
'dateday');
782 $url .=
'&search_date_startmonth='.GETPOSTINT(
'datemonth');
783 $url .=
'&search_date_startyear='.GETPOSTINT(
'dateyear');
785 if (count($search_fk_warehouse) > 1) {
788 foreach ($search_fk_warehouse as $val) {
789 $url .= ($val > 0 ?
'&search_warehouse='.((int) $val) :
'');
793 print
'<a href="'.$url.
'">';
795 print $langs->trans(
"Movements");
796 print
'<span class="tabs paddingleft"><span class="badge">'.$nbofmovement.
'</span></span>';
804 print
'<td class="right">'.($currentstock ?
price(
price2num($currentstock,
'MS')) :
'<span class="opacitymedium">0</span>').
'</td>';
806 $totalcurrentstock += $currentstock;
809 $parameters = array(
'objp' => $objp);
810 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters);
811 print $hookmanager->resPrint;
814 if (!
$conf->main_checkbox_left_column) {
815 print
'<td class="right"></td>';
824$parameters = array(
'sql' => $sql);
825$reshook = $hookmanager->executeHooks(
'printFieldListFooter', $parameters);
827 print $hookmanager->resPrint;
831if ($mode ==
'future') {
838 ($mode ==
'future') ? array(
839 '"'.$langs->trans(
"Totalforthispage").
'"',
841 $productid > 0 ?
price2num($totalcurrentstock,
'MS') :
'',
845 '"'.$langs->trans(
"Totalforthispage").
'"',
848 '"'.($usercancreadsupplierprice ?
price2num($totalbuyingprice,
'MT') :
'').
'"',
851 $productid > 0 ?
price2num($totalcurrentstock,
'MS') :
'')
854 if (empty($date) || !$dateIsValid) {
855 print
'<tr><td colspan="'.$colspan.
'"><span class="opacitymedium">'.$langs->trans(
"EnterADateCriteria").
'</span></td></tr>';
857 print
'<tr class="liste_total">';
858 print
'<td>'.$langs->trans(
"Totalforthispage").
'</td>';
860 if ($mode ==
'future') {
861 print
'<td class="right">'.price(
price2num($totalcurrentstock,
'MS')).
'</td>';
864 print
'<td class="right">'.price(
price2num($totalvirtualstock,
'MS')).
'</td>';
867 if ($usercancreadsupplierprice) {
868 print
'<td class="right">'.price(
price2num($totalbuyingprice,
'MT')).
'</td>';
871 print
'<td class="right">'.price(
price2num($totalsellingprice,
'MT')).
'</td>';
876 print
'<td class="right">'.($productid > 0 ?
price(
price2num($totalcurrentstock,
'MS')) :
'').
'</td>';
if(! $sortfield) if(! $sortorder) $object
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.
const STATUS_OPEN_INTERNAL
Warehouse open and only operations for stock transfers/corrections allowed (not for customer shipping...
const STATUS_OPEN_ALL
Warehouse open and any operations are allowed (customer shipping, supplier dispatch,...
Class to manage products or services.
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.
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.
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.
GETPOSTISARRAY($paramname, $method=0)
Return true if the parameter $paramname is submit from a POST OR GET as an array.
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.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
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...
if(!defined( 'NOREQUIREMENU')) if(!empty(GETPOST('seteventmessages', 'alpha'))) if(!function_exists("llxHeader")) top_httphead($contenttype='text/html', $forcenocache=0)
Show HTTP header.
print $langs trans('Date')." left Ref Label right Qty right Price right TotalHT right TotalTTC right right right right right right right right right centpercent right TotalHT right n right VAT right n right TotalVAT right n No sujeto a RE IRPF right TotalLT1 right n right TotalLT2 right n right TotalTTC right n takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency right TotalTTC takeposcustomercurrency right takeposcustomercurrency n right Paid right PaymentTypeShortLIQ right SELECT p pos_change as p datep as date
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.