* Copyright (C) 2004-2016 Laurent Destailleur * Copyright (C) 2005-2009 Regis Houssin * Copyright (C) 2019 Nicolas ZABOURI * Copyright (C) 2020 Tobias Sekan * Copyright (C) 2024 MDW * Copyright (C) 2024 Frédéric France * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /** * \file htdocs/product/stock/index.php * \ingroup stock * \brief Home page of stock area */ // Load Dolibarr environment require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/product/stock/class/entrepot.class.php'; require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; require_once DOL_DOCUMENT_ROOT.'/product/stock/class/productlot.class.php'; /** * @var Conf $conf * @var DoliDB $db * @var HookManager $hookmanager * @var Translate $langs * @var User $user */ // Load translation files required by the page $langs->loadLangs(array('stocks', 'productbatch')); // Initialize a technical object to manage hooks. Note that conf->hooks_modules contains array $hookmanager->initHooks(array('stockindex')); // Security check $result = restrictedArea($user, 'stock'); /* * View */ $producttmp = new Product($db); $warehouse = new Entrepot($db); $help_url = 'EN:Module_Stocks_En|FR:Module_Stock|ES:Módulo_Stocks'; llxHeader("", $langs->trans("Stocks"), $help_url, '', 0, 0, '', '', '', 'mod-product page-stock'); print load_fiche_titre($langs->trans("StocksArea"), '', 'stock'); //print ''; //print '
'; print '
'; if (getDolGlobalString('MAIN_SEARCH_FORM_ON_HOME_AREAS')) { // This may be useless due to the global search combo print '
'; print ''; print '
'; print ''; print ""; print ''; print ''; print "
'.$langs->trans("Search").'
'; print $langs->trans("Warehouse").':

"; } $max = 15; $sql = "SELECT e.rowid, e.ref as label, e.lieu, e.statut as status"; $sql .= " FROM ".MAIN_DB_PREFIX."entrepot as e"; $sql .= " WHERE e.statut in (".Entrepot::STATUS_CLOSED.",".Entrepot::STATUS_OPEN_ALL.")"; $sql .= " AND e.entity IN (".getEntity('stock').")"; $sql .= $db->order('e.statut', 'DESC'); $sql .= $db->plimit($max + 1, 0); $result = $db->query($sql); if ($result) { $num = $db->num_rows($result); print '
'; print ''; print ''; print ''; print ''; $i = 0; if ($num) { while ($i < min($max, $num)) { $objp = $db->fetch_object($result); $warehouse->id = $objp->rowid; $warehouse->statut = $objp->status; $warehouse->label = $objp->label; $warehouse->lieu = $objp->lieu; print ''; print ''."\n"; print ''; print "\n"; $i++; } $db->free($result); } else { print ''; } if ($num > $max) { print ''; } print "
'; print $langs->trans("Warehouses").' '; print ''; // TODO: "search_status" on "/product/stock/list.php" currently only accept a single integer value //print ''; print ''.$num.''; print ''; print '
'; print $warehouse->getNomUrl(1); print ''; print $warehouse->getLibStatut(5); print '
'.$langs->trans("None").'
'.$langs->trans("More").'...
"; print '
'; } else { dol_print_error($db); } print '
'; // Latest movements $max = 10; $sql = "SELECT p.rowid, p.label as produit, p.tobatch, p.tosell, p.tobuy,"; $sql .= " e.ref as warehouse_ref, e.rowid as warehouse_id, e.ref as warehouse_label, e.lieu, e.statut as warehouse_status,"; $sql .= " m.rowid as mid, m.value as qty, m.datem, m.batch, m.eatby, m.sellby"; $sql .= " FROM ".MAIN_DB_PREFIX."entrepot as e"; $sql .= ", ".MAIN_DB_PREFIX."stock_mouvement as m"; $sql .= ", ".MAIN_DB_PREFIX."product as p"; $sql .= " WHERE m.fk_product = p.rowid"; $sql .= " AND m.fk_entrepot = e.rowid"; $sql .= " AND e.entity IN (".getEntity('stock').")"; if (!getDolGlobalString('STOCK_SUPPORTS_SERVICES')) { $sql .= " AND p.fk_product_type = ".Product::TYPE_PRODUCT; } $sql .= $db->order("datem", "DESC"); $sql .= $db->plimit($max, 0); dol_syslog("Index:list stock movements", LOG_DEBUG); $resql = $db->query($sql); if ($resql) { $num = $db->num_rows($resql); print '
'; print ''; print ''; print ''; print ''; if (isModEnabled('productbatch')) { print ''; /*if (empty($conf->global->PRODUCT_DISABLE_SELLBY)) { print ''; } if (empty($conf->global->PRODUCT_DISABLE_EATBY)) { print ''; }*/ } print ''; print ''; print "\n"; $tmplotstatic = new Productlot($db); $i = 0; while ($i < min($num, $max)) { $objp = $db->fetch_object($resql); $producttmp->id = $objp->rowid; $producttmp->ref = $objp->produit; $producttmp->status_batch = $objp->tobatch; $producttmp->status_sell = $objp->tosell; $producttmp->status_buy = $objp->tobuy; $warehouse->id = $objp->warehouse_id; $warehouse->ref = $objp->warehouse_ref; $warehouse->statut = $objp->warehouse_status; $warehouse->label = $objp->warehouse_label; $warehouse->lieu = $objp->lieu; $tmplotstatic->batch = $objp->batch; $tmplotstatic->sellby = $objp->sellby; $tmplotstatic->eatby = $objp->eatby; print ''; print ''; print '\n"; if (isModEnabled('productbatch')) { print ''; /*if (empty($conf->global->PRODUCT_DISABLE_SELLBY)) { print ''; } if (empty($conf->global->PRODUCT_DISABLE_EATBY)) { print ''; }*/ } print '\n"; print ''; print "\n"; $i++; } $db->free($resql); print "
'.$langs->trans("LastMovements", min($num, $max)).''.$langs->trans("Product").''.$langs->trans("Batch").''.$langs->trans("SellByDate").''.$langs->trans("EatByDate").''.$langs->trans("Warehouse").''.$langs->trans("FullList").'
'.img_picto($langs->trans("Ref").' '.$objp->mid, 'movement', 'class="pictofixedwidth"').dol_print_date($db->jdate($objp->datem), 'dayhour').''; print $producttmp->getNomUrl(1); print "'; print $tmplotstatic->getNomUrl(0, 'nolink'); print ''.dol_print_date($db->jdate($objp->sellby), 'day').''.dol_print_date($db->jdate($objp->eatby), 'day').''; print $warehouse->getNomUrl(1); print "'; if ($objp->qty > 0) { print '+'; } print $objp->qty.'
"; print '
'; } else { dol_print_error($db); } print '
'; $parameters = array('user' => $user); $reshook = $hookmanager->executeHooks('dashboardWarehouse', $parameters, $object); // Note that $action and $object may have been modified by hook // End of page llxFooter(); $db->close();