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