From 10d148782a9d2a1b7a1af8b53b047aa4495de7e6 Mon Sep 17 00:00:00 2001 From: rGaillard Date: Mon, 16 Jul 2012 18:29:34 +0000 Subject: [PATCH] [-] BO: Fix some bugs on advanced stock management --- classes/controller/AdminController.php | 2 +- classes/stock/StockAvailable.php | 103 ++++++++++-------- classes/stock/StockManager.php | 2 + classes/stock/Warehouse.php | 28 ++--- classes/stock/WarehouseProductLocation.php | 5 + .../admin/AdminWarehousesController.php | 16 ++- 6 files changed, 81 insertions(+), 75 deletions(-) diff --git a/classes/controller/AdminController.php b/classes/controller/AdminController.php index 3d71fcb70..7150e0c60 100644 --- a/classes/controller/AdminController.php +++ b/classes/controller/AdminController.php @@ -2402,7 +2402,7 @@ class AdminControllerCore extends Controller $this->identifier => $id_object, 'id_shop' => (int)$id_shop, ); - Db::getInstance()->insert($this->table.'_shop', $insert, false, true, Db::INSERT_IGNORE); + return Db::getInstance()->insert($this->table.'_shop', $insert, false, true, Db::INSERT_IGNORE); } protected function validateField($value, $field) diff --git a/classes/stock/StockAvailable.php b/classes/stock/StockAvailable.php index 7ad91be3c..934719a4b 100644 --- a/classes/stock/StockAvailable.php +++ b/classes/stock/StockAvailable.php @@ -137,54 +137,69 @@ class StockAvailableCore extends ObjectModel // if it's a simple product if (empty($ids_product_attribute)) - $product_quantity = $manager->getProductRealQuantities($id_product, null, $warehouses, true); - - // else this product has attributes, hence loops on $ids_product_attribute - foreach ($ids_product_attribute as $id_product_attribute) { - $quantity = $manager->getProductRealQuantities($id_product, $id_product_attribute, $warehouses, true); - - $query = new DbQuery(); - $query->select('COUNT(*)'); - $query->from('stock_available'); - $query->where('id_product = '.(int)$id_product.' AND id_product_attribute = '.(int)$id_product_attribute. - StockAvailable::addSqlShopRestriction(null, $id_shop)); - - if ((int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query)) + $allowed_warehouse_for_product = WareHouse::getProductWarehouseList((int)$id_product, 0, (int)$id_shop); + $allowed_warehouse_for_product_clean = array(); + foreach ($allowed_warehouse_for_product as $warehouse) + $allowed_warehouse_for_product_clean[] = (int)$warehouse['id_warehouse']; + $allowed_warehouse_for_product_clean = array_intersect($allowed_warehouse_for_product_clean, $warehouses); + $product_quantity = $manager->getProductRealQuantities($id_product, null, $allowed_warehouse_for_product_clean, true); + } + // else this product has attributes, hence loops on $ids_product_attribute + else + { + foreach ($ids_product_attribute as $id_product_attribute) { - $query = array( - 'table' => 'stock_available', - 'data' => array('quantity' => $quantity), - 'where' => 'id_product = '.(int)$id_product.' AND id_product_attribute = '.(int)$id_product_attribute. - StockAvailable::addSqlShopRestriction(null, $id_shop) - ); - Db::getInstance()->update($query['table'], $query['data'], $query['where']); - } - else - { - $query = array( - 'table' => 'stock_available', - 'data' => array( - 'quantity' => $quantity, - 'depends_on_stock' => 1, - 'out_of_stock' => $out_of_stock, - 'id_product' => (int)$id_product, - 'id_product_attribute' => (int)$id_product_attribute, - ) - ); - StockAvailable::addSqlShopParams($query['data']); - Db::getInstance()->insert($query['table'], $query['data']); - } - $product_quantity += $quantity; - - Hook::exec('actionUpdateQuantity', - array( - 'id_product' => $id_product, - 'id_product_attribute' => $id_product_attribute, - 'quantity' => $quantity + $allowed_warehouse_for_combination = WareHouse::getProductWarehouseList((int)$id_product, (int)$id_product_attribute, (int)$id_shop); + $allowed_warehouse_for_combination_clean = array(); + foreach ($allowed_warehouse_for_combination as $warehouse) + $allowed_warehouse_for_combination_clean[] = (int)$warehouse['id_warehouse']; + $allowed_warehouse_for_combination_clean = array_intersect($allowed_warehouse_for_combination_clean, $warehouses); + $quantity = $manager->getProductRealQuantities($id_product, $id_product_attribute, $allowed_warehouse_for_combination_clean, true); + + $query = new DbQuery(); + $query->select('COUNT(*)'); + $query->from('stock_available'); + $query->where('id_product = '.(int)$id_product.' AND id_product_attribute = '.(int)$id_product_attribute. + StockAvailable::addSqlShopRestriction(null, $id_shop)); + + if ((int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query)) + { + $query = array( + 'table' => 'stock_available', + 'data' => array('quantity' => $quantity), + 'where' => 'id_product = '.(int)$id_product.' AND id_product_attribute = '.(int)$id_product_attribute. + StockAvailable::addSqlShopRestriction(null, $id_shop) + ); + Db::getInstance()->update($query['table'], $query['data'], $query['where']); + } + else + { + $query = array( + 'table' => 'stock_available', + 'data' => array( + 'quantity' => $quantity, + 'depends_on_stock' => 1, + 'out_of_stock' => $out_of_stock, + 'id_product' => (int)$id_product, + 'id_product_attribute' => (int)$id_product_attribute, ) - ); + ); + StockAvailable::addSqlShopParams($query['data']); + Db::getInstance()->insert($query['table'], $query['data']); + } + + $product_quantity += $quantity; + + Hook::exec('actionUpdateQuantity', + array( + 'id_product' => $id_product, + 'id_product_attribute' => $id_product_attribute, + 'quantity' => $quantity + ) + ); + } } // updates diff --git a/classes/stock/StockManager.php b/classes/stock/StockManager.php index 58f6efd6a..5a5f9f71c 100644 --- a/classes/stock/StockManager.php +++ b/classes/stock/StockManager.php @@ -432,6 +432,8 @@ class StockManagerCore implements StockManagerInterface // casts for security reason $ids_warehouse = array_map('intval', $ids_warehouse); + if (!count($ids_warehouse)) + return 0; } else $ids_warehouse = array(); diff --git a/classes/stock/Warehouse.php b/classes/stock/Warehouse.php index aa77ea9e0..e04f80a86 100644 --- a/classes/stock/Warehouse.php +++ b/classes/stock/Warehouse.php @@ -127,27 +127,6 @@ class WarehouseCore extends ObjectModel return $res; } - /** - * Sets the shops associated to the current warehouse - * - * @param array $ids_shop Ids to set - */ - public function setShops($ids_shop) - { - if (!is_array($ids_shop)) - $ids_shop = array(); - - $row_to_insert = array(); - foreach ($ids_shop as $id_shop) - $row_to_insert[] = array($this->def['primary'] => $this->id, 'id_shop' => (int)$id_shop); - - Db::getInstance()->execute(' - DELETE FROM '._DB_PREFIX_.'warehouse_shop - WHERE '.$this->def['primary'].' = '.(int)$this->id); - - Db::getInstance()->insert('warehouse_shop', $row_to_insert); - } - /** * Gets the carriers associated to the current warehouse * @@ -551,6 +530,13 @@ class WarehouseCore extends ObjectModel $res = call_user_func_array('array_intersect', $list); return $res; } + + public function resetStockAvailable() + { + $products = WarehouseProductLocation::getProducts((int)$this->id); + foreach ($products as $product) + StockAvailable::synchronize((int)$product['id_product']); + } /*********************************\ * diff --git a/classes/stock/WarehouseProductLocation.php b/classes/stock/WarehouseProductLocation.php index 039f721fa..54730565e 100644 --- a/classes/stock/WarehouseProductLocation.php +++ b/classes/stock/WarehouseProductLocation.php @@ -132,4 +132,9 @@ class WarehouseProductLocationCore extends ObjectModel $collection->where('id_product', '=', (int)$id_product); return $collection; } + + public static function getProducts($id_warehouse) + { + return Db::getInstance()->executeS('SELECT DISTINCT id_product FROM '._DB_PREFIX_.'warehouse_product_location WHERE id_warehouse='.(int)$id_warehouse); + } } \ No newline at end of file diff --git a/controllers/admin/AdminWarehousesController.php b/controllers/admin/AdminWarehousesController.php index 33af6d918..b05c8caf6 100644 --- a/controllers/admin/AdminWarehousesController.php +++ b/controllers/admin/AdminWarehousesController.php @@ -436,10 +436,6 @@ class AdminWarehousesControllerCore extends AdminController $address->save(); } - // handles shops associations - if (Tools::isSubmit('ids_shops')) - $object->setShops(Tools::getValue('ids_shops')); - // handles carriers associations if (Tools::isSubmit('ids_carriers')) $object->setCarriers(Tools::getValue('ids_carriers')); @@ -569,7 +565,6 @@ class AdminWarehousesControllerCore extends AdminController // removes associations with carriers/shops/products location $obj->setCarriers(array()); - $obj->setShops(array()); $obj->resetProductsLocations(); return parent::processDelete(); @@ -586,16 +581,19 @@ class AdminWarehousesControllerCore extends AdminController if (!($obj = $this->loadObject(true))) return; - // handles shops associations - if (Tools::isSubmit('ids_shops')) - $obj->setShops(Tools::getValue('ids_shops')); - // handles carriers associations $obj->setCarriers(Tools::getValue('ids_carriers'), array()); return parent::processUpdate(); } + protected function updateAssoShop($id_object) + { + parent::updateAssoShop($id_object); + if (!($obj = $this->loadObject(true))) + return; + $obj->resetStockAvailable(); + } /** * @see AdminController::initProcess() */