// Update and fix some bugs on front and admin itnerfaces relative to available quantities functionnality
This commit is contained in:
@@ -641,6 +641,7 @@ class CategoryCore extends ObjectModel
|
|||||||
.($active ? ' AND p.`active` = 1' : '')
|
.($active ? ' AND p.`active` = 1' : '')
|
||||||
.($id_supplier ? ' AND p.id_supplier = '.(int)$id_supplier : '').
|
.($id_supplier ? ' AND p.id_supplier = '.(int)$id_supplier : '').
|
||||||
' GROUP BY p.id_product';
|
' GROUP BY p.id_product';
|
||||||
|
|
||||||
if ($random === true)
|
if ($random === true)
|
||||||
{
|
{
|
||||||
$sql .= ' ORDER BY RAND()';
|
$sql .= ' ORDER BY RAND()';
|
||||||
|
|||||||
+59
-9
@@ -1633,18 +1633,35 @@ class ProductCore extends ObjectModel
|
|||||||
{
|
{
|
||||||
if (!Combination::isFeatureActive())
|
if (!Combination::isFeatureActive())
|
||||||
return array();
|
return array();
|
||||||
|
|
||||||
$sql = 'SELECT pa.*, GROUP_CONCAT(agl.`name`, \''.pSQL($attribute_value_separator).'\',
|
$sql = 'SELECT pa.*, GROUP_CONCAT(agl.`name`, \''.pSQL($attribute_value_separator).'\',
|
||||||
al.`name` SEPARATOR \''.pSQL($attribute_separator).'\') as attribute_designation, IFNULL(stock.quantity, 0)
|
al.`name` SEPARATOR \''.pSQL($attribute_separator).'\') as attribute_designation
|
||||||
FROM `'._DB_PREFIX_.'product_attribute` pa
|
FROM `'._DB_PREFIX_.'product_attribute` pa
|
||||||
LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON pac.`id_product_attribute` = pa.`id_product_attribute`
|
LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON pac.`id_product_attribute` = pa.`id_product_attribute`
|
||||||
LEFT JOIN `'._DB_PREFIX_.'attribute` a ON a.`id_attribute` = pac.`id_attribute`
|
LEFT JOIN `'._DB_PREFIX_.'attribute` a ON a.`id_attribute` = pac.`id_attribute`
|
||||||
LEFT JOIN `'._DB_PREFIX_.'attribute_group` ag ON ag.`id_attribute_group` = a.`id_attribute_group`
|
LEFT JOIN `'._DB_PREFIX_.'attribute_group` ag ON ag.`id_attribute_group` = a.`id_attribute_group`
|
||||||
LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = '.(int)$id_lang.')
|
LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = '.(int)$id_lang.')
|
||||||
LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl ON (ag.`id_attribute_group` = agl.`id_attribute_group` AND agl.`id_lang` = '.(int)$id_lang.')
|
LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl ON (ag.`id_attribute_group` = agl.`id_attribute_group` AND agl.`id_lang` = '.(int)$id_lang.')
|
||||||
'.Product::sqlStock('pa', 'pa').'
|
|
||||||
WHERE pa.`id_product` = '.(int)$this->id.'
|
WHERE pa.`id_product` = '.(int)$this->id.'
|
||||||
GROUP BY pa.`id_product_attribute`';
|
GROUP BY pa.`id_product_attribute`';
|
||||||
return Db::getInstance()->executeS($sql);
|
|
||||||
|
$res = Db::getInstance()->executeS($sql);
|
||||||
|
|
||||||
|
//Get quantity of each variations
|
||||||
|
foreach ($res as $key => $row)
|
||||||
|
{
|
||||||
|
$cache_key = $row['id_product'].'_'.$row['id_product_attribute'].'_quantity';
|
||||||
|
|
||||||
|
if (!Cache::isStored($cache_key))
|
||||||
|
Cache::store(
|
||||||
|
$cache_key,
|
||||||
|
StockAvailable::getQuantityAvailableByProduct($row['id_product'], $row['id_product_attribute'])
|
||||||
|
);
|
||||||
|
|
||||||
|
$res[$key]['quantity'] = Cache::retrieve($cache_key);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1657,18 +1674,35 @@ class ProductCore extends ObjectModel
|
|||||||
{
|
{
|
||||||
if (!Combination::isFeatureActive())
|
if (!Combination::isFeatureActive())
|
||||||
return array();
|
return array();
|
||||||
|
|
||||||
$sql = 'SELECT pa.*, ag.`id_attribute_group`, ag.`is_color_group`, agl.`name` AS group_name, al.`name` AS attribute_name,
|
$sql = 'SELECT pa.*, ag.`id_attribute_group`, ag.`is_color_group`, agl.`name` AS group_name, al.`name` AS attribute_name,
|
||||||
a.`id_attribute`, pa.`unit_price_impact`, IFNULL(stock.quantity, 0) as quantity
|
a.`id_attribute`, pa.`unit_price_impact`
|
||||||
FROM `'._DB_PREFIX_.'product_attribute` pa
|
FROM `'._DB_PREFIX_.'product_attribute` pa
|
||||||
LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON pac.`id_product_attribute` = pa.`id_product_attribute`
|
LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON pac.`id_product_attribute` = pa.`id_product_attribute`
|
||||||
LEFT JOIN `'._DB_PREFIX_.'attribute` a ON a.`id_attribute` = pac.`id_attribute`
|
LEFT JOIN `'._DB_PREFIX_.'attribute` a ON a.`id_attribute` = pac.`id_attribute`
|
||||||
LEFT JOIN `'._DB_PREFIX_.'attribute_group` ag ON ag.`id_attribute_group` = a.`id_attribute_group`
|
LEFT JOIN `'._DB_PREFIX_.'attribute_group` ag ON ag.`id_attribute_group` = a.`id_attribute_group`
|
||||||
LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = '.(int)$id_lang.')
|
LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = '.(int)$id_lang.')
|
||||||
LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl ON (ag.`id_attribute_group` = agl.`id_attribute_group` AND agl.`id_lang` = '.(int)$id_lang.')
|
LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl ON (ag.`id_attribute_group` = agl.`id_attribute_group` AND agl.`id_lang` = '.(int)$id_lang.')
|
||||||
'.Product::sqlStock('pa', 'pa').'
|
|
||||||
WHERE pa.`id_product` = '.(int)$this->id.'
|
WHERE pa.`id_product` = '.(int)$this->id.'
|
||||||
ORDER BY pa.`id_product_attribute`';
|
ORDER BY pa.`id_product_attribute`';
|
||||||
return Db::getInstance()->executeS($sql);
|
|
||||||
|
$res = Db::getInstance()->executeS($sql);
|
||||||
|
|
||||||
|
//Get quantity of each variations
|
||||||
|
foreach ($res as $key => $row)
|
||||||
|
{
|
||||||
|
$cache_key = $row['id_product'].'_'.$row['id_product_attribute'].'_quantity';
|
||||||
|
|
||||||
|
if (!Cache::isStored($cache_key))
|
||||||
|
Cache::store(
|
||||||
|
$cache_key,
|
||||||
|
StockAvailable::getQuantityAvailableByProduct($row['id_product'], $row['id_product_attribute'])
|
||||||
|
);
|
||||||
|
|
||||||
|
$res[$key]['quantity'] = Cache::retrieve($cache_key);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1683,18 +1717,34 @@ class ProductCore extends ObjectModel
|
|||||||
if (!Combination::isFeatureActive())
|
if (!Combination::isFeatureActive())
|
||||||
return array();
|
return array();
|
||||||
$sql = 'SELECT pa.*, ag.`id_attribute_group`, ag.`is_color_group`, agl.`name` AS group_name, al.`name` AS attribute_name,
|
$sql = 'SELECT pa.*, ag.`id_attribute_group`, ag.`is_color_group`, agl.`name` AS group_name, al.`name` AS attribute_name,
|
||||||
a.`id_attribute`, pa.`unit_price_impact`, IFNULL(stock.quantity, 0) as quantity
|
a.`id_attribute`, pa.`unit_price_impact`
|
||||||
FROM `'._DB_PREFIX_.'product_attribute` pa
|
FROM `'._DB_PREFIX_.'product_attribute` pa
|
||||||
LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON pac.`id_product_attribute` = pa.`id_product_attribute`
|
LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON pac.`id_product_attribute` = pa.`id_product_attribute`
|
||||||
LEFT JOIN `'._DB_PREFIX_.'attribute` a ON a.`id_attribute` = pac.`id_attribute`
|
LEFT JOIN `'._DB_PREFIX_.'attribute` a ON a.`id_attribute` = pac.`id_attribute`
|
||||||
LEFT JOIN `'._DB_PREFIX_.'attribute_group` ag ON ag.`id_attribute_group` = a.`id_attribute_group`
|
LEFT JOIN `'._DB_PREFIX_.'attribute_group` ag ON ag.`id_attribute_group` = a.`id_attribute_group`
|
||||||
LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = '.(int)$id_lang.')
|
LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = '.(int)$id_lang.')
|
||||||
LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl ON (ag.`id_attribute_group` = agl.`id_attribute_group` AND agl.`id_lang` = '.(int)$id_lang.')
|
LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl ON (ag.`id_attribute_group` = agl.`id_attribute_group` AND agl.`id_lang` = '.(int)$id_lang.')
|
||||||
'.Product::sqlStock('pa', 'pa').'
|
|
||||||
WHERE pa.`id_product` = '.(int)$this->id.'
|
WHERE pa.`id_product` = '.(int)$this->id.'
|
||||||
AND pa.`id_product_attribute` = '.(int)$id_product_attribute.'
|
AND pa.`id_product_attribute` = '.(int)$id_product_attribute.'
|
||||||
ORDER BY pa.`id_product_attribute`';
|
ORDER BY pa.`id_product_attribute`';
|
||||||
return Db::getInstance()->executeS($sql);
|
|
||||||
|
$res = Db::getInstance()->executeS($sql);
|
||||||
|
|
||||||
|
//Get quantity of each variations
|
||||||
|
foreach ($res as $key => $row)
|
||||||
|
{
|
||||||
|
$cache_key = $row['id_product'].'_'.$row['id_product_attribute'].'_quantity';
|
||||||
|
|
||||||
|
if (!Cache::isStored($cache_key))
|
||||||
|
Cache::store(
|
||||||
|
$cache_key,
|
||||||
|
StockAvailable::getQuantityAvailableByProduct($row['id_product'], $row['id_product_attribute'])
|
||||||
|
);
|
||||||
|
|
||||||
|
$res[$key]['quantity'] = Cache::retrieve($cache_key);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $res;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getCombinationImages($id_lang)
|
public function getCombinationImages($id_lang)
|
||||||
|
|||||||
+12
-4
@@ -294,12 +294,20 @@ class SupplierCore extends ObjectModel
|
|||||||
|
|
||||||
public function getProductsLite($id_lang)
|
public function getProductsLite($id_lang)
|
||||||
{
|
{
|
||||||
return Db::getInstance()->executeS('
|
$sql = '
|
||||||
SELECT p.`id_product`, pl.`name`
|
SELECT p.`id_product`, pl.`name`
|
||||||
FROM `'._DB_PREFIX_.'product` p
|
FROM `'._DB_PREFIX_.'product` p
|
||||||
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)$id_lang.')
|
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (
|
||||||
WHERE p.`id_supplier` = '.(int)$this->id
|
p.`id_product` = pl.`id_product`
|
||||||
);
|
AND pl.`id_lang` = '.(int)$id_lang.'
|
||||||
|
)
|
||||||
|
INNER JOIN `'._DB_PREFIX_.'product_supplier` ps ON (
|
||||||
|
ps.`id_product` = p.`id_product`
|
||||||
|
AND ps.`id_supplier` = '.(int)$this->id.'
|
||||||
|
)
|
||||||
|
GROUP BY p.`id_product`';
|
||||||
|
|
||||||
|
return Db::getInstance()->executeS($sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -826,13 +826,13 @@ class ShopCore extends ObjectModel
|
|||||||
if ($tables_import && !isset($tables_import[$table_name]))
|
if ($tables_import && !isset($tables_import[$table_name]))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Special case for stock if current shop is in a share stock group
|
// Special case for stock_available if current shop is in a share stock group
|
||||||
/*if ($table_name == 'stock')
|
if ($table_name == 'stock_available')
|
||||||
{
|
{
|
||||||
$group = new GroupShop($this->id_group_shop);
|
$group = new GroupShop($this->id_group_shop);
|
||||||
if ($group->share_stock && $group->haveShops())
|
if ($group->share_stock && $group->haveShops())
|
||||||
continue;
|
continue;
|
||||||
}*/
|
}
|
||||||
|
|
||||||
$id = 'id_'.$row['type'];
|
$id = 'id_'.$row['type'];
|
||||||
if ($row['type'] == 'fk_shop')
|
if ($row['type'] == 'fk_shop')
|
||||||
|
|||||||
@@ -282,7 +282,7 @@ class StockAvailableCore extends ObjectModel
|
|||||||
$id_product_attribute = 0;
|
$id_product_attribute = 0;
|
||||||
|
|
||||||
$query = new DbQuery();
|
$query = new DbQuery();
|
||||||
$query->select('quantity');
|
$query->select('SUM(quantity)');
|
||||||
$query->from('stock_available');
|
$query->from('stock_available');
|
||||||
|
|
||||||
// if null, it's a product without attributes
|
// if null, it's a product without attributes
|
||||||
@@ -468,12 +468,17 @@ class StockAvailableCore extends ObjectModel
|
|||||||
{
|
{
|
||||||
if ($group_shop->share_stock)
|
if ($group_shop->share_stock)
|
||||||
{
|
{
|
||||||
$id_shops_list = implode(', ', Shop::getIdShopsByIdGroupShop($group_shop->id));
|
$shop_list = Shop::getIdShopsByIdGroupShop($group_shop->id);
|
||||||
|
|
||||||
return Db::getInstance()->execute('
|
if (count($shop_list) > 0)
|
||||||
DELETE FROM '._DB_PREFIX_.'stock_available
|
{
|
||||||
WHERE id_shop IN ('.$id_shops_list.')'
|
$id_shops_list = implode(', ', $shop_list);
|
||||||
);
|
|
||||||
|
return Db::getInstance()->execute('
|
||||||
|
DELETE FROM '._DB_PREFIX_.'stock_available
|
||||||
|
WHERE id_shop IN ('.$id_shops_list.')'
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2125,6 +2125,7 @@ class AdminProductsControllerCore extends AdminController
|
|||||||
0
|
0
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
$price = Tools::ps_round($price, 6);
|
||||||
|
|
||||||
$id_currency = (int)Tools::getValue(
|
$id_currency = (int)Tools::getValue(
|
||||||
'product_price_currency_'.$product->id.'_'.$attribute['id_product_attribute'].'_'.$supplier->id_supplier,
|
'product_price_currency_'.$product->id.'_'.$attribute['id_product_attribute'].'_'.$supplier->id_supplier,
|
||||||
|
|||||||
@@ -284,7 +284,7 @@ class AdminShopControllerCore extends AdminController
|
|||||||
'product' => $this->l('Products'),
|
'product' => $this->l('Products'),
|
||||||
'product_lang' => $this->l('Products lang'),
|
'product_lang' => $this->l('Products lang'),
|
||||||
'scene' => $this->l('Scenes'),
|
'scene' => $this->l('Scenes'),
|
||||||
'stock_available' => $this->l('Stock'),
|
'stock_available' => $this->l('Available quantities for sale'),
|
||||||
'store' => $this->l('Stores'),
|
'store' => $this->l('Stores'),
|
||||||
'warehouse' => $this->l('Warehouse'),
|
'warehouse' => $this->l('Warehouse'),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -491,7 +491,7 @@ class MailAlerts extends Module
|
|||||||
)
|
)
|
||||||
die (Tools::displayError());
|
die (Tools::displayError());
|
||||||
|
|
||||||
$sql = 'SELECT ma.`id_product`, stock.quantity AS product_quantity, pl.`name`, ma.`id_product_attribute`
|
$sql = 'SELECT ma.`id_product`, IFNULL(stock.quantity, 0) as product_quantity, pl.`name`, ma.`id_product_attribute`
|
||||||
FROM `'._DB_PREFIX_.'mailalert_customer_oos` ma
|
FROM `'._DB_PREFIX_.'mailalert_customer_oos` ma
|
||||||
JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = ma.`id_product`
|
JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = ma.`id_product`
|
||||||
JOIN `'._DB_PREFIX_.'product_lang` pl ON pl.`id_product` = ma.`id_product` AND pl.`id_lang` = '.$id_lang.Context::getContext()->shop->addSqlRestrictionOnLang('pl').'
|
JOIN `'._DB_PREFIX_.'product_lang` pl ON pl.`id_product` = ma.`id_product` AND pl.`id_lang` = '.$id_lang.Context::getContext()->shop->addSqlRestrictionOnLang('pl').'
|
||||||
|
|||||||
Reference in New Issue
Block a user