diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php index 05b27663b4b..7e759917604 100644 --- a/htdocs/comm/propal/list.php +++ b/htdocs/comm/propal/list.php @@ -161,6 +161,8 @@ if (is_array($extrafields->attribute_label) && count($extrafields->attribute_lab } } +$object = new Propal($db); // To be passed as parameter of executeHooks that need + /* * Actions diff --git a/htdocs/product/stock/mouvement.php b/htdocs/product/stock/mouvement.php index 2e7c470639c..56763f9872b 100644 --- a/htdocs/product/stock/mouvement.php +++ b/htdocs/product/stock/mouvement.php @@ -25,9 +25,10 @@ */ require '../../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; require_once DOL_DOCUMENT_ROOT.'/product/stock/class/entrepot.class.php'; require_once DOL_DOCUMENT_ROOT.'/product/stock/class/mouvementstock.class.php'; -require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; +require_once DOL_DOCUMENT_ROOT.'/product/stock/class/productlot.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/stock.lib.php'; @@ -36,6 +37,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; $langs->load("products"); $langs->load("stocks"); +if (! empty($conf->productbatch->enabled)) $langs->load("productbatch"); // Security check $result=restrictedArea($user,'stock'); @@ -47,6 +49,7 @@ $cancel=GETPOST('cancel'); $idproduct = GETPOST('idproduct','int'); $year = GETPOST("year"); $month = GETPOST("month"); +$search_ref = GETPOST('search_ref', 'alpha'); $search_movement = GETPOST("search_movement"); $search_product_ref = trim(GETPOST("search_product_ref")); $search_product = trim(GETPOST("search_product")); @@ -54,6 +57,7 @@ $search_warehouse = trim(GETPOST("search_warehouse")); $search_inventorycode = trim(GETPOST("search_inventorycode")); $search_user = trim(GETPOST("search_user")); $search_batch = trim(GETPOST("search_batch")); +$search_qty = trim(GETPOST("search_qty")); $limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit; $page = GETPOST("page",'int'); @@ -77,13 +81,37 @@ $extrafields = new ExtraFields($db); $extralabels = $extrafields->fetch_name_optionals_label('movement'); $search_array_options=$extrafields->getOptionalsFromPost($extralabels,'','search_'); +$arrayfields=array( + 'm.rowid'=>array('label'=>$langs->trans("Ref"), 'checked'=>1), + 'm.datem'=>array('label'=>$langs->trans("Date"), 'checked'=>1), + 'p.ref'=>array('label'=>$langs->trans("ProductRef"), 'checked'=>1), + 'p.label'=>array('label'=>$langs->trans("ProductLabel"), 'checked'=>1), + 'm.batch'=>array('label'=>$langs->trans("BatchNumberShort"), 'checked'=>1, 'enabled'=>(! empty($conf->productbatch->enabled))), + 'pl.eatby'=>array('label'=>$langs->trans("EatByDate"), 'checked'=>0, 'enabled'=>(! empty($conf->productbatch->enabled))), + 'pl.sellby'=>array('label'=>$langs->trans("SellByDate"), 'checked'=>0, 'position'=>10, 'enabled'=>(! empty($conf->productbatch->enabled))), + 'm.warehouse'=>array('label'=>$langs->trans("Warehouse"), 'checked'=>1, 'enabled'=>(! $id > 0)), // If we are on specific warehouse, we hide it + 'm.fk_user_author'=>array('label'=>$langs->trans("Author"), 'checked'=>0), + 'm.inventorycode'=>array('label'=>$langs->trans("CodeMovement"), 'checked'=>1), + 'm.label'=>array('label'=>$langs->trans("LabelMovement"), 'checked'=>1), + 'origin'=>array('label'=>$langs->trans("Origin"), 'checked'=>1), + 'm.value'=>array('label'=>$langs->trans("Qty"), 'checked'=>1), + //'m.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500), + //'m.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500) +); + +$object = new MouvementStock($db); // To be passed as parameter of executeHooks that need /* * Actions */ -if ($cancel) $action=''; // Protection to avoid action for all cancel buttons +if (GETPOST('cancel')) { $action='list'; $massaction=''; } +if (! GETPOST('confirmmassaction') && $massaction != 'presend' && $massaction != 'confirm_presend') { $massaction=''; } + +$parameters=array(); +$reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks +if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php'; @@ -92,13 +120,16 @@ if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETP { $year=''; $month=''; + $search_ref=''; $search_movement=""; $search_product_ref=""; $search_product=""; $search_warehouse=""; $search_user=""; $search_batch=""; + $search_qty=''; $sall=""; + $toselect=''; $search_array_options=array(); } @@ -337,12 +368,23 @@ if ($action == "transfert_stock" && ! $cancel) } } +if (empty($reshook)) +{ + $objectclass='MouvementStock'; + $objectlabel='Movements'; + $permtoread = $user->rights->stock->lire; + $permtodelete = $user->rights->stock->supprimer; + $uploaddir = $conf->stock->dir_output; + include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php'; +} + /* * View */ +$productlot=new ProductLot($db); $productstatic=new Product($db); $warehousestatic=new Entrepot($db); $movement=new MouvementStock($db); @@ -353,13 +395,22 @@ $formproduct=new FormProduct($db); $sql = "SELECT p.rowid, p.ref as product_ref, p.label as produit, p.fk_product_type as type, p.entity,"; $sql.= " e.label as stock, e.rowid as entrepot_id, e.lieu,"; -$sql.= " m.rowid as mid, m.value, m.datem, m.fk_user_author, m.label, m.inventorycode, m.fk_origin, m.origintype,"; -$sql.= " m.batch,m.eatby,m.sellby,"; +$sql.= " m.rowid as mid, m.value as qty, m.datem, m.fk_user_author, m.label, m.inventorycode, m.fk_origin, m.origintype,"; +$sql.= " m.batch,"; +$sql.= " pl.rowid as lotid, pl.eatby, pl.sellby,"; $sql.= " u.login"; -$sql.= " FROM (".MAIN_DB_PREFIX."entrepot as e,"; +// Add fields from extrafields +foreach ($extrafields->attribute_label as $key => $val) $sql.=($extrafields->attribute_type[$key] != 'separate' ? ",ef.".$key.' as options_'.$key : ''); +// Add fields from hooks +$parameters=array(); +$reshook=$hookmanager->executeHooks('printFieldListSelect',$parameters); // Note that $action and $object may have been modified by hook +$sql.=$hookmanager->resPrint; +$sql.= " FROM ".MAIN_DB_PREFIX."entrepot as e,"; $sql.= " ".MAIN_DB_PREFIX."product as p,"; -$sql.= " ".MAIN_DB_PREFIX."stock_mouvement as m)"; +$sql.= " ".MAIN_DB_PREFIX."stock_mouvement as m"; +if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."movement_extrafields as ef on (m.rowid = ef.fk_object)"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."user as u ON m.fk_user_author = u.rowid"; +$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product_lot as pl ON m.batch = pl.batch AND m.fk_product = pl.fk_product"; $sql.= " WHERE m.fk_product = p.rowid"; $sql.= " AND m.fk_entrepot = e.rowid"; $sql.= " AND e.entity IN (".getEntity('stock', 1).")"; @@ -377,6 +428,7 @@ else if ($year > 0) $sql.= " AND m.datem BETWEEN '".$db->idate(dol_get_first_day($year,1,false))."' AND '".$db->idate(dol_get_last_day($year,12,false))."'"; } if ($idproduct > 0) $sql.= " AND p.rowid = '".$idproduct."'"; +if (! empty($search_ref)) $sql.= natural_search('m.rowid', $search_ref, 1); if (! empty($search_movement)) $sql.= natural_search('m.label', $search_movement); if (! empty($search_inventorycode)) $sql.= natural_search('m.inventorycode', $search_inventorycode); if (! empty($search_product_ref)) $sql.= natural_search('p.ref', $search_product_ref); @@ -384,6 +436,25 @@ if (! empty($search_product)) $sql.= natural_search('p.label', $search_pro if ($search_warehouse > 0) $sql.= " AND e.rowid = '".$db->escape($search_warehouse)."'"; if (! empty($search_user)) $sql.= natural_search('u.login', $search_user); if (! empty($search_batch)) $sql.= natural_search('m.batch', $search_batch); +if ($search_qty != '') $sql.= natural_search('m.value', $search_qty, 1); +// Add where from extra fields +foreach ($search_array_options as $key => $val) +{ + $crit=$val; + $tmpkey=preg_replace('/search_options_/','',$key); + $typ=$extrafields->attribute_type[$tmpkey]; + $mode=0; + if (in_array($typ, array('int','double'))) $mode=1; // Search on a numeric + if ($val && ( ($crit != '' && ! in_array($typ, array('select'))) || ! empty($crit))) + { + $sql .= natural_search('ef.'.$tmpkey, $crit, $mode); + } +} +// Add where from hooks +$parameters=array(); +$reshook=$hookmanager->executeHooks('printFieldListWhere',$parameters); // Note that $action and $object may have been modified by hook +$sql.=$hookmanager->resPrint; +$sql.= $db->order($sortfield,$sortorder); $nbtotalofrecords = 0; if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) @@ -392,22 +463,18 @@ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) $nbtotalofrecords = $db->num_rows($result); } -$sql.= $db->order($sortfield,$sortorder); -$sql.= $db->plimit($conf->liste_limit+1, $offset); +$sql.= $db->plimit($limit+1, $offset); //print $sql; $resql = $db->query($sql); if ($resql) { - $num = $db->num_rows($resql); - - if ($idproduct) + if ($idproduct > 0) { $product = new Product($db); $product->fetch($idproduct); } - if ($id > 0) { $object = new Entrepot($db); @@ -418,8 +485,12 @@ if ($resql) } } - $i = 0; + $num = $db->num_rows($resql); + $arrayofselected=is_array($toselect)?$toselect:array(); + + + $i = 0; $help_url='EN:Module_Stocks_En|FR:Module_Stock|ES:Módulo_Stocks'; $texte = $langs->trans("ListOfStockMovements"); if ($id) $texte.=' ('.$langs->trans("ForThisWarehouse").')'; @@ -477,7 +548,7 @@ if ($resql) // Value print '