From 74ef17ca79eadd46acdb6923a3cf97e43ceaae31 Mon Sep 17 00:00:00 2001 From: bMancone Date: Mon, 14 Nov 2011 13:36:33 +0000 Subject: [PATCH] // It is not possible to delete a product if there are currently physical stock/supply order(s) for this product, anymore --- classes/Product.php | 53 ++++++++++++------- classes/stock/StockManager.php | 8 ++- classes/stock/StockManagerInterface.php | 2 + .../admin/AdminStockManagementController.php | 2 + 4 files changed, 45 insertions(+), 20 deletions(-) diff --git a/classes/Product.php b/classes/Product.php index e976352c2..6289519d2 100644 --- a/classes/Product.php +++ b/classes/Product.php @@ -587,31 +587,48 @@ class ProductCore extends ObjectModel public function delete() { + /* + * @since 1.5.0 + * It is NOT possible to delete a product if there are currently: + * - physical stock for this product + * - supply order(s) for this product + */ + $stock_manager = StockManagerFactory::getManager(); + $physical_quantity = $stock_manager->getProductPhysicalQuantities($this->id, 0); + $real_quantity = $stock_manager->getProductRealQuantities($this->id, 0); + if ($physical_quantity > 0) + return false; + if ($real_quantity > $physical_quantity) + return false; + if (!GroupReduction::deleteProductReduction($this->id)) return false; Hook::exec('deleteProduct', array('product' => $this)); - if (!parent::delete() OR - !$this->deleteCategories(true) OR - !$this->deleteImages() OR - !$this->deleteProductAttributes() OR - !$this->deleteProductFeatures() OR - !$this->deleteTags() OR - !$this->deleteCartProducts() OR - !$this->deleteAttributesImpacts() OR - !$this->deleteAttachments() OR - !$this->deleteCustomization() OR - !SpecificPrice::deleteByProductId((int)$this->id) OR - !$this->deletePack() OR - !$this->deleteProductSale() OR - !$this->deleteSceneProducts() OR - !$this->deleteSearchIndexes() OR - !$this->deleteAccessories() OR + + if (!parent::delete() || + !$this->deleteCategories(true) || + !$this->deleteImages() || + !$this->deleteProductAttributes() || + !$this->deleteProductFeatures() || + !$this->deleteTags() || + !$this->deleteCartProducts() || + !$this->deleteAttributesImpacts() || + !$this->deleteAttachments() || + !$this->deleteCustomization() || + !SpecificPrice::deleteByProductId((int)$this->id) || + !$this->deletePack() || + !$this->deleteProductSale() || + !$this->deleteSceneProducts() || + !$this->deleteSearchIndexes() || + !$this->deleteAccessories() || !$this->deleteFromAccessories()) return false; + if ($id = ProductDownload::getIdFromIdProduct($this->id)) - if ($productDownload = new ProductDownload($id) AND !$productDownload->delete(true)) + if ($product_download = new ProductDownload($id) && !$product_download->delete(true)) return false; + return true; } @@ -3844,7 +3861,7 @@ class ProductCore extends ObjectModel /** * Get the combination url anchor of the product - * + * * @param integer $id_product_attribute * @return string */ diff --git a/classes/stock/StockManager.php b/classes/stock/StockManager.php index 887a2ec0b..508249149 100644 --- a/classes/stock/StockManager.php +++ b/classes/stock/StockManager.php @@ -421,7 +421,9 @@ class StockManagerCore implements StockManagerInterface $query = new DbQuery(); $query->select('SUM('.($usable ? 's.usable_quantity' : 's.physical_quantity').')'); $query->from('stock s'); - $query->where('s.id_product = '.(int)$id_product.' AND s.id_product_attribute = '.(int)$id_product_attribute); + $query->where('s.id_product = '.(int)$id_product); + if (0 != $id_product_attribute) + $query->where('s.id_product_attribute = '.(int)$id_product_attribute); if (count($ids_warehouse)) $query->where('s.id_warehouse IN('.implode(', ', $ids_warehouse).')'); @@ -439,7 +441,9 @@ class StockManagerCore implements StockManagerInterface $query->select('SUM(od.product_quantity)'); $query->from('order_detail od'); $query->leftjoin('orders o ON o.id_order = od.id_order'); - $query->where('od.product_id = '.(int)$id_product.' AND od.product_attribute_id = '.(int)$id_product_attribute); + $query->where('od.product_id = '.(int)$id_product); + if (0 != $id_product_attribute) + $query->where('od.product_attribute_id = '.(int)$id_product_attribute); $query->where('o.delivery_number = 0'); $query->where('o.valid = 1'); $client_orders_qty = (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query); diff --git a/classes/stock/StockManagerInterface.php b/classes/stock/StockManagerInterface.php index b4104faaa..9b473f3d0 100644 --- a/classes/stock/StockManagerInterface.php +++ b/classes/stock/StockManagerInterface.php @@ -70,6 +70,7 @@ interface StockManagerInterface /** * For a given product, returns its physical quantity + * If the given product has combinations and $id_product_attribute is null, returns the sum for all combinations * * @param int $id_product * @param int $id_product_attribute @@ -81,6 +82,7 @@ interface StockManagerInterface /** * For a given product, returns its real quantity + * If the given product has combinations and $id_product_attribute is null, returns the sum for all combinations * Real quantity : (physical_qty + supplier_orders_qty - client_orders_qty) * If $usable is defined, real quantity: usable_qty + supplier_orders_qty - client_orders_qty * diff --git a/controllers/admin/AdminStockManagementController.php b/controllers/admin/AdminStockManagementController.php index e28c21151..bde225439 100644 --- a/controllers/admin/AdminStockManagementController.php +++ b/controllers/admin/AdminStockManagementController.php @@ -899,6 +899,8 @@ class AdminStockManagementControllerCore extends AdminController $id_product_attribute = (int)Tools::getValue('id_product_attribute', 0); $product_is_valid = false; + $is_pack = false; + $is_virtual = false; $lang_id = $this->context->language->id; // try to load product attribute first