diff --git a/htdocs/product/class/html.formproduct.class.php b/htdocs/product/class/html.formproduct.class.php index 96a7d35f62b..02c7bcddd0d 100644 --- a/htdocs/product/class/html.formproduct.class.php +++ b/htdocs/product/class/html.formproduct.class.php @@ -1,6 +1,6 @@ - * Copyright (C) 2016 Francis Appels + * Copyright (C) 2015-2017 Francis Appels * * 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 @@ -338,8 +338,9 @@ class FormProduct * @param string $filterstatus lot status filter, following comma separated filter options can be used * @param int $empty 1=Can be empty, 0 if not * @param int $disabled 1=Select is disabled - * @param int $fk_product show lot numbers of product with id fk_product. All if 0. - * @param int $fk_entrepot show lot numbers in warehouse with id fk_entrepot. All if 0. + * @param int $fk_product show lot numbers of product with id fk_product. All from objectLines if 0. + * @param int $fk_entrepot filter lot numbers for warehouse with id fk_entrepot. All if 0. + * @param array $objectLines Only cache lot numbers for products in lines of object. If no lines only for fk_product. If no fk_product, all. * @param string $empty_label Empty label if needed (only if $empty=1) * @param int $forcecombo 1=Force combo iso ajax select2 * @param array $events Events to add to select2 @@ -347,15 +348,26 @@ class FormProduct * * @return string HTML select */ - function selectLotStock($selected='',$htmlname='batch_id',$filterstatus='',$empty=0,$disabled=0,$fk_product=0,$fk_entrepot=0,$empty_label='', $forcecombo=0, $events=array(), $morecss='minwidth200') + function selectLotStock($selected='',$htmlname='batch_id',$filterstatus='',$empty=0,$disabled=0,$fk_product=0,$fk_entrepot=0,$objectLines = array(),$empty_label='', $forcecombo=0, $events=array(), $morecss='minwidth200') { global $langs; dol_syslog(get_class($this)."::selectLot $selected, $htmlname, $filterstatus, $empty, $disabled, $fk_product, $fk_entrepot, $empty_label, $showstock, $forcecombo, $morecss",LOG_DEBUG); $out=''; + $productIdArray = array(); + if (! is_array($objectLines) || ! count($objectLines)) + { + if (! empty($fk_product)) $productIdArray[] = $fk_product; + } + else + { + foreach ($objectLines as $line) { + if ($line->fk_product) $productIdArray[] = $line->fk_product; + } + } - $nboflot = $this->loadLotStock($fk_product, $fk_entrepot); + $nboflot = $this->loadLotStock($productIdArray); if ($conf->use_javascript_ajax && ! $forcecombo) { @@ -366,15 +378,33 @@ class FormProduct $out.=''; if ($disabled) $out.=''; @@ -386,70 +416,73 @@ class FormProduct * Load in cache array list of lot available in stock * If fk_product is not 0, we do not use cache * - * @param int $fk_product load lot of id fk_product, all if 0. + * @param array $productIdArray array of product id's from who to get lot numbers. A * @param string $fk_entrepot load lot in fk_entrepot all if 0. * - * @return int Nb of loaded lines, 0 if already loaded, <0 if KO + * @return int Nb of loaded lines, 0 if nothing loaded, <0 if KO */ - function loadLotStock($fk_product = 0, $fk_entrepot = 0) + private function loadLotStock($productIdArray = array()) { global $conf, $langs; - if (empty($fk_product) && empty($fk_product) && count($this->cache_lot)) + $cacheLoaded = false; + if (empty($productIdArray)) { - return count($this->cache_lot); // Cache already loaded and we do not want a list with information specific to a product or warehouse + // only Load lot stock for given products + $this->cache_lot = array(); + return 0; + } + if (count($productIdArray) && count($this->cache_lot)) + { + // check cache already loaded for product id's + foreach ($productIdArray as $productId) + { + $cacheLoaded = ! empty($this->cache_lot[$productId]) ? true : false; + } + } + if ($cacheLoaded) + { + return count($this->cache_lot); } else { - // clear cache; + // clear cache $this->cache_lot = array(); - } - - $sql = "SELECT pb.batch, pb.rowid, ps.fk_entrepot, pb.qty, e.label"; - $sql.= " FROM ".MAIN_DB_PREFIX."product_batch as pb"; - $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product_stock as ps on ps.rowid = pb.fk_product_stock"; - $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."entrepot as e on e.rowid = ps.fk_entrepot AND e.entity IN (".getEntity('stock').")"; - if (!empty($fk_product) || !empty($fk_entrepot)) - { - $sql.= " WHERE"; - if (!empty($fk_product)) + $productIdList = implode(',', $productIdArray); + $sql = "SELECT pb.batch, pb.rowid, ps.fk_entrepot, pb.qty, e.label, ps.fk_product"; + $sql.= " FROM ".MAIN_DB_PREFIX."product_batch as pb"; + $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product_stock as ps on ps.rowid = pb.fk_product_stock"; + $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."entrepot as e on e.rowid = ps.fk_entrepot AND e.entity IN (".getEntity('stock').")"; + if (!empty($productIdList)) { - $sql.= " ps.fk_product = '".$fk_product."'"; - if (!empty($fk_entrepot)) + $sql.= " WHERE ps.fk_product IN (".$productIdList.")"; + } + $sql.= " ORDER BY e.label, pb.batch"; + + dol_syslog(get_class($this).'::loadLotStock', LOG_DEBUG); + $resql = $this->db->query($sql); + if ($resql) + { + $num = $this->db->num_rows($resql); + $i = 0; + while ($i < $num) { - $sql.= " AND"; + $obj = $this->db->fetch_object($resql); + $this->cache_lot[$obj->fk_product][$obj->rowid]['id'] =$obj->rowid; + $this->cache_lot[$obj->fk_product][$obj->rowid]['batch']=$obj->batch; + $this->cache_lot[$obj->fk_product][$obj->rowid]['entrepot_id']=$obj->fk_entrepot; + $this->cache_lot[$obj->fk_product][$obj->rowid]['entrepot_label']=$obj->label; + $this->cache_lot[$obj->fk_product][$obj->rowid]['qty'] = $obj->qty; + $i++; } + + return $num; } - if (!empty($fk_entrepot)) + else { - $sql.= " ps.fk_entrepot = '".$fk_entrepot."'"; + dol_print_error($this->db); + return -1; } } - $sql.= " ORDER BY e.label, pb.batch"; - - dol_syslog(get_class($this).'::loadLotStock', LOG_DEBUG); - $resql = $this->db->query($sql); - if ($resql) - { - $num = $this->db->num_rows($resql); - $i = 0; - while ($i < $num) - { - $obj = $this->db->fetch_object($resql); - $this->cache_lot[$obj->rowid]['id'] =$obj->rowid; - $this->cache_lot[$obj->rowid]['batch']=$obj->batch; - $this->cache_lot[$obj->rowid]['entrepot_id']=$obj->fk_entrepot; - $this->cache_lot[$obj->rowid]['entrepot_label']=$obj->label; - $this->cache_lot[$obj->rowid]['qty'] = $obj->qty; - $i++; - } - - return $num; - } - else - { - dol_print_error($this->db); - return -1; - } } } \ No newline at end of file