Mage_CatalogInventory_Model_Observer Class Reference

List of all members.

Public Member Functions

 addInventoryData ($observer)
 addStockStatusToCollection ($observer)
 addInventoryDataToCollection ($observer)
 saveInventoryData ($observer)
 copyInventoryData ($observer)
 checkQuoteItemQty ($observer)
 lockOrderInventoryData ($observer)
 createOrderItem ($observer)
 cancelOrderItem ($observer)
 refundOrderItem ($observer)
 updateItemsStockUponConfigChange ($observer)
 productStatusUpdate (Varien_Event_Observer $observer)
 catalogProductWebsiteUpdate (Varien_Event_Observer $observer)
 addStockStatusToPrepareIndexSelect (Varien_Event_Observer $observer)

Protected Member Functions

 _prepareItemForSave ($item, $product)
 _getProductQtyForCheck ($productId, $itemQty)

Protected Attributes

 $_checkedProductsQty = array()


Detailed Description

Definition at line 34 of file Observer.php.


Member Function Documentation

_getProductQtyForCheck ( productId,
itemQty 
) [protected]

Get product qty includes information from all quote items Need be used only in sungleton mode

Parameters:
int $productId
float $itemQty

Definition at line 321 of file Observer.php.

00322     {
00323         $qty = $itemQty;
00324         if (isset($this->_checkedProductsQty[$productId])) {
00325             $qty += $this->_checkedProductsQty[$productId];
00326         }
00327         $this->_checkedProductsQty[$productId] = $qty;
00328         return $qty;
00329     }

_prepareItemForSave ( item,
product 
) [protected]

Prepare stock item data for save

Parameters:
Mage_CatalogInventory_Model_Stock_Item $item
Mage_Catalog_Model_Product $product
Returns:
Mage_CatalogInventory_Model_Observer

Definition at line 146 of file Observer.php.

00147     {
00148         $item->addData($product->getStockData())
00149             ->setProduct($product)
00150             ->setProductId($product->getId())
00151             ->setStockId($item->getStockId());
00152         if (!is_null($product->getData('stock_data/min_qty'))
00153             && is_null($product->getData('stock_data/use_config_min_qty'))) {
00154             $item->setData('use_config_min_qty', false);
00155         }
00156         if (!is_null($product->getData('stock_data/min_sale_qty'))
00157             && is_null($product->getData('stock_data/use_config_min_sale_qty'))) {
00158             $item->setData('use_config_min_sale_qty', false);
00159         }
00160         if (!is_null($product->getData('stock_data/max_sale_qty'))
00161             && is_null($product->getData('stock_data/use_config_max_sale_qty'))) {
00162             $item->setData('use_config_max_sale_qty', false);
00163         }
00164         if (!is_null($product->getData('stock_data/backorders'))
00165             && is_null($product->getData('stock_data/use_config_backorders'))) {
00166             $item->setData('use_config_backorders', false);
00167         }
00168         if (!is_null($product->getData('stock_data/notify_stock_qty'))
00169             && is_null($product->getData('stock_data/use_config_notify_stock_qty'))) {
00170             $item->setData('use_config_notify_stock_qty', false);
00171         }
00172         return $this;
00173 
00174     }

addInventoryData ( observer  ) 

Add stock information to product

Parameters:
Varien_Event_Observer $observer
Returns:
Mage_CatalogInventory_Model_Observer

Definition at line 50 of file Observer.php.

00051     {
00052         $product = $observer->getEvent()->getProduct();
00053         if ($product instanceof Mage_Catalog_Model_Product) {
00054             Mage::getModel('cataloginventory/stock_item')->assignProduct($product);
00055         }
00056         return $this;
00057     }

addInventoryDataToCollection ( observer  ) 

Add Stock items to product collection

Parameters:
Varien_Event_Observer $observer
Returns:
Mage_CatalogInventory_Model_Observer

Definition at line 83 of file Observer.php.

00084     {
00085         $productCollection = $observer->getEvent()->getProductCollection();
00086         Mage::getModel('cataloginventory/stock')->addItemsToProducts($productCollection);
00087         return $this;
00088     }

addStockStatusToCollection ( observer  ) 

Add information about producs stock status to collection Used in for product collection after load

Parameters:
Varien_Event_Observer $observer
Returns:
Mage_CatalogInventory_Model_Observer

Definition at line 66 of file Observer.php.

00067     {
00068         $productCollection = $observer->getEvent()->getCollection();
00069         if ($productCollection->hasFlag('require_stock_items')) {
00070             Mage::getModel('cataloginventory/stock')->addItemsToProducts($productCollection);
00071         } else {
00072             Mage::getModel('cataloginventory/stock_status')->addStockStatusToProducts($productCollection);
00073         }
00074         return $this;
00075     }

addStockStatusToPrepareIndexSelect ( Varien_Event_Observer observer  ) 

Add stock status to prepare index select

Parameters:
Varien_Event_Observer $observer
Returns:
Mage_CatalogInventory_Model_Observer

Definition at line 477 of file Observer.php.

00478     {
00479         $website    = $observer->getEvent()->getWebsite();
00480         $select     = $observer->getEvent()->getSelect();
00481 
00482         Mage::getSingleton('cataloginventory/stock_status')
00483             ->addStockStatusToSelect($select, $website);
00484 
00485         return $this;
00486     }

cancelOrderItem ( observer  ) 

Cancel order item

Parameters:
Varien_Event_Observer $observer
Returns:
Mage_CatalogInventory_Model_Observer

Definition at line 393 of file Observer.php.

00394     {
00395         $item = $observer->getEvent()->getItem();
00396 
00397         $children = $item->getChildrenItems();
00398         $qty = $item->getQtyOrdered() - max($item->getQtyShipped(), $item->getQtyInvoiced()) - $item->getQtyCanceled();
00399 
00400         if ($item->getId() && ($productId = $item->getProductId()) && empty($children) && $qty) {
00401             Mage::getSingleton('cataloginventory/stock')->backItemQty($productId, $qty);
00402         }
00403 
00404         return $this;
00405     }

catalogProductWebsiteUpdate ( Varien_Event_Observer observer  ) 

Catalog Product website update

Parameters:
Varien_Event_Observer $observer
Returns:
Mage_CatalogInventory_Model_Observer

Definition at line 456 of file Observer.php.

00457     {
00458         $websiteIds = $observer->getEvent()->getWebsiteIds();
00459         $productIds = $observer->getEvent()->getProductIds();
00460 
00461         foreach ($websiteIds as $websiteId) {
00462             foreach ($productIds as $productId) {
00463                 Mage::getSingleton('cataloginventory/stock_status')
00464                     ->updateStatus($productId, null, $websiteId);
00465             }
00466         }
00467 
00468         return $this;
00469     }

checkQuoteItemQty ( observer  ) 

Check product inventory data when quote item quantity declaring

Parameters:
Varien_Event_Observer $observer
Returns:
Mage_CatalogInventory_Model_Observer

Get Qty

Check item for options

if option's qty was updates we also need to update quote item qty

When we work with subitem (as subproduct of bundle or configurable product)

we are using 0 because original qty was processed

Just base (parent) item qty can be changed qty of child products are declared just during add process exception for updating also managed by product type

Definition at line 182 of file Observer.php.

00183     {
00184         $quoteItem = $observer->getEvent()->getItem();
00185         /* @var $quoteItem Mage_Sales_Model_Quote_Item */
00186         if (!$quoteItem || !$quoteItem->getProductId() || $quoteItem->getQuote()->getIsSuperMode()) {
00187             return $this;
00188         }
00189 
00190         /**
00191          * Get Qty
00192          */
00193         $qty = $quoteItem->getQty();
00194 
00195         /**
00196          * Check item for options
00197          */
00198         if (($options = $quoteItem->getQtyOptions()) && $qty > 0) {
00199             $qty = $quoteItem->getProduct()->getTypeInstance(true)->prepareQuoteItemQty($qty, $quoteItem->getProduct());
00200             $quoteItem->setData('qty', $qty);
00201 
00202             foreach ($options as $option) {
00203                 /* @var $option Mage_Sales_Model_Quote_Item_Option */
00204                 $optionQty = $qty * $option->getValue();
00205                 $increaseOptionQty = ($quoteItem->getQtyToAdd() ? $quoteItem->getQtyToAdd() : $qty) * $option->getValue();
00206 
00207                 $stockItem = $option->getProduct()->getStockItem();
00208                 /* @var $stockItem Mage_CatalogInventory_Model_Stock_Item */
00209                 if (!$stockItem instanceof Mage_CatalogInventory_Model_Stock_Item) {
00210                     Mage::throwException(Mage::helper('cataloginventory')->__('Stock item for Product in option is not valid'));
00211                 }
00212 
00213                 $qtyForCheck = $this->_getProductQtyForCheck($option->getProduct()->getId(), $increaseOptionQty);
00214 
00215                 $result = $stockItem->checkQuoteItemQty($optionQty, $qtyForCheck, $option->getValue());
00216 
00217                 if (!is_null($result->getItemIsQtyDecimal())) {
00218                     $option->setIsQtyDecimal($result->getItemIsQtyDecimal());
00219                 }
00220 
00221                 if ($result->getHasQtyOptionUpdate()) {
00222                     $option->setHasQtyOptionUpdate(true);
00223                     $quoteItem->updateQtyOption($option, $result->getOrigQty());
00224                     $option->setValue($result->getOrigQty());
00225                     /**
00226                      * if option's qty was updates we also need to update quote item qty
00227                      */
00228                     $quoteItem->setData('qty', intval($qty));
00229                 }
00230                 if (!is_null($result->getMessage())) {
00231                     $option->setMessage($result->getMessage());
00232                 }
00233                 if (!is_null($result->getItemBackorders())) {
00234                     $option->setBackorders($result->getItemBackorders());
00235                 }
00236 
00237                 if ($result->getHasError()) {
00238                     $option->setHasError(true);
00239                     $quoteItem->setHasError(true)
00240                         ->setMessage($result->getQuoteMessage());
00241                     $quoteItem->getQuote()->setHasError(true)
00242                         ->addMessage($result->getQuoteMessage(), $result->getQuoteMessageIndex());
00243                 }
00244             }
00245         }
00246         else {
00247             $stockItem = $quoteItem->getProduct()->getStockItem();
00248             /* @var $stockItem Mage_CatalogInventory_Model_Stock_Item */
00249             if (!$stockItem instanceof Mage_CatalogInventory_Model_Stock_Item) {
00250                 Mage::throwException(Mage::helper('cataloginventory')->__('Stock item for Product is not valid'));
00251             }
00252 
00253 
00254             /**
00255              * When we work with subitem (as subproduct of bundle or configurable product)
00256              */
00257             if ($quoteItem->getParentItem()) {
00258                 $rowQty = $quoteItem->getParentItem()->getQty()*$qty;
00259                 /**
00260                  * we are using 0 because original qty was processed
00261                  */
00262                 $qtyForCheck = $this->_getProductQtyForCheck($quoteItem->getProduct()->getId(), 0);
00263             }
00264             else {
00265                 $increaseQty = $quoteItem->getQtyToAdd() ? $quoteItem->getQtyToAdd() : $qty;
00266                 $rowQty = $qty;
00267                 $qtyForCheck = $this->_getProductQtyForCheck($quoteItem->getProduct()->getId(), $increaseQty);
00268             }
00269 
00270             $result = $stockItem->checkQuoteItemQty($rowQty, $qtyForCheck, $qty);
00271 
00272             if (!is_null($result->getItemIsQtyDecimal())) {
00273                 $quoteItem->setIsQtyDecimal($result->getItemIsQtyDecimal());
00274                 if ($quoteItem->getParentItem()) {
00275                     $quoteItem->getParentItem()->setIsQtyDecimal($result->getItemIsQtyDecimal());
00276                 }
00277             }
00278 
00279             /**
00280              * Just base (parent) item qty can be changed
00281              * qty of child products are declared just during add process
00282              * exception for updating also managed by product type
00283              */
00284             if ($result->getHasQtyOptionUpdate()
00285                 && (!$quoteItem->getParentItem()
00286                     || $quoteItem->getParentItem()->getProduct()->getTypeInstance(true)
00287                         ->getForceChildItemQtyChanges($quoteItem->getParentItem()->getProduct()))) {
00288                 $quoteItem->setData('qty', $result->getOrigQty());
00289             }
00290 
00291             if (!is_null($result->getItemUseOldQty())) {
00292                 $quoteItem->setUseOldQty($result->getItemUseOldQty());
00293             }
00294             if (!is_null($result->getMessage())) {
00295                 $quoteItem->setMessage($result->getMessage());
00296                 if ($quoteItem->getParentItem()) {
00297                     $quoteItem->getParentItem()->setMessage($result->getMessage());
00298                 }
00299             }
00300             if (!is_null($result->getItemBackorders())) {
00301                 $quoteItem->setBackorders($result->getItemBackorders());
00302             }
00303 
00304             if ($result->getHasError()) {
00305                 $quoteItem->setHasError(true);
00306                 $quoteItem->getQuote()->setHasError(true)
00307                     ->addMessage($result->getQuoteMessage(), $result->getQuoteMessageIndex());
00308             }
00309         }
00310 
00311         return $this;
00312     }

copyInventoryData ( observer  ) 

Copy product inventory data

Parameters:
Varien_Event_Observer $observer
Returns:
Mage_CatalogInventory_Model_Observer

Definition at line 123 of file Observer.php.

00124     {
00125         $newProduct = $observer->getEvent()->getNewProduct();
00126 
00127         $newProduct->unsStockItem();
00128         $newProduct->setStockData(array(
00129             'use_config_min_qty'        => 1,
00130             'use_config_min_sale_qty'   => 1,
00131             'use_config_max_sale_qty'   => 1,
00132             'use_config_backorders'     => 1,
00133             'use_config_notify_stock_qty'=> 1
00134         ));
00135 
00136         return $this;
00137     }

createOrderItem ( observer  ) 

Register saving order item

Parameters:
Varien_Event_Observer $observer
Returns:
Mage_CatalogInventory_Model_Observer

Before creating order item need subtract ordered qty from product stock

Definition at line 371 of file Observer.php.

00372     {
00373         $item = $observer->getEvent()->getItem();
00374         /**
00375          * Before creating order item need subtract ordered qty from product stock
00376          */
00377 
00378         $children = $item->getChildrenItems();
00379 
00380         if (!$item->getId() && empty($children)) {
00381             Mage::getSingleton('cataloginventory/stock')->registerItemSale($item);
00382         }
00383 
00384         return $this;
00385     }

lockOrderInventoryData ( observer  ) 

Lock DB rows for order products

We need do it for resolving problems with inventory on placing some orders in one time

Parameters:
Varien_Event_Observer $observer
Returns:
Mage_CatalogInventory_Model_Observer

Do lock only for new order

Definition at line 340 of file Observer.php.

00341     {
00342         $order = $observer->getEvent()->getOrder();
00343         $productIds = array();
00344 
00345         /**
00346          * Do lock only for new order
00347          */
00348         if ($order->getId()) {
00349             return $this;
00350         }
00351 
00352         if ($order) {
00353             foreach ($order->getAllItems() as $item) {
00354                 $productIds[] = $item->getProductId();
00355             }
00356         }
00357 
00358         if (!empty($productIds)) {
00359             Mage::getSingleton('cataloginventory/stock')->lockProductItems($productIds);
00360         }
00361 
00362         return $this;
00363     }

productStatusUpdate ( Varien_Event_Observer observer  ) 

Update Only product status observer

Parameters:
Varien_Event_Observer $observer
Returns:
Mage_CatalogInventory_Model_Observer

Definition at line 442 of file Observer.php.

00443     {
00444         $productId = $observer->getEvent()->getProductId();
00445         Mage::getSingleton('cataloginventory/stock_status')
00446             ->updateStatus($productId);
00447         return $this;
00448     }

refundOrderItem ( observer  ) 

Back refunded item qty to stock

Parameters:
Varien_Event_Observer $observer
Returns:
Mage_CatalogInventory_Model_Observer

Definition at line 413 of file Observer.php.

00414     {
00415         $item = $observer->getEvent()->getCreditmemoItem();
00416         if ($item->getId() && $item->getBackToStock() && ($productId = $item->getProductId()) && ($qty = $item->getQty())) {
00417             Mage::getSingleton('cataloginventory/stock')->backItemQty($productId, $qty);
00418         }
00419         return $this;
00420     }

saveInventoryData ( observer  ) 

Saving product inventory data

Parameters:
Varien_Event_Observer $observer
Returns:
Mage_CatalogInventory_Model_Observer

Definition at line 96 of file Observer.php.

00097     {
00098         $product = $observer->getEvent()->getProduct();
00099 
00100         if (is_null($product->getStockData())) {
00101             if ($product->getIsChangedWebsites() || $product->dataHasChangedFor('status')) {
00102                 Mage::getSingleton('cataloginventory/stock_status')
00103                     ->updateStatus($product->getId());
00104             }
00105             return $this;
00106         }
00107 
00108         $item = $product->getStockItem();
00109         if (!$item) {
00110             $item = Mage::getModel('cataloginventory/stock_item');
00111         }
00112         $this->_prepareItemForSave($item, $product);
00113         $item->save();
00114         return $this;
00115     }

updateItemsStockUponConfigChange ( observer  ) 

Update items stock status and low stock date.

Parameters:
Varien_Event_Observer $observer
Returns:
Mage_CatalogInventory_Model_Observer

Definition at line 428 of file Observer.php.

00429     {
00430         Mage::getResourceSingleton('cataloginventory/stock')->updateSetOutOfStock();
00431         Mage::getResourceSingleton('cataloginventory/stock')->updateSetInStock();
00432         Mage::getResourceSingleton('cataloginventory/stock')->updateLowStockDate();
00433         return $this;
00434     }


Member Data Documentation

$_checkedProductsQty = array() [protected]

Definition at line 42 of file Observer.php.


The documentation for this class was generated from the following file:

Generated on Sat Jul 4 17:23:48 2009 for Magento by  doxygen 1.5.8