इन्वेंट्री परिवर्तन का पता लगाएं


18

जब भी किसी उत्पाद का इन्वेंट्री स्तर बदलता है तो मुझे उसका पता लगाने की आवश्यकता होती है। मुझे कुछ सफलता मिली हैcataloginventory_stock_item_save_after घटना जो जब बैकएंड में इन्वेंट्री में बदल जाती है, या जब फ्रंटेंड (पेपैल के माध्यम से) पर ऑर्डर रद्द हो जाता है, लेकिन जब उत्पाद को फ्रंटेंड से खरीदा जाता है, तो ट्रिगर नहीं होता है।

मैं cataloginventory_stock_item_save_afterइस तरह से इस घटना में शामिल हूँ :

<global>
    <events>
        <cataloginventory_stock_item_save_after>
            <observers>
                <cataloginventory_stock_item_save_after_handler>
                    <type>model</type>
                    <class>stockchange/observer</class>
                    <method>stockChange</method>
                </cataloginventory_stock_item_save_after_handler>
            </observers>
        </cataloginventory_stock_item_save_after>
    </events>

<?php
class FashionBunker_StockChange_Model_Observer {
    public function stockChange(Varien_Event_Observer $observer) {

क्या ग्राहक को कुछ खरीदते समय, इन्वेंट्री परिवर्तन को कैप्चर करने के लिए मुझे किसी अन्य ईवेंट का उपयोग करने की आवश्यकता है, या क्या मैंने इवेंट में जिस तरह से झुका है, उसमें कुछ गड़बड़ है?

जवाबों:


26

यह कुछ समय पहले हुआ है कि मैं इसके लिए कुछ का निर्माण करता हूं, मुझे कई पर्यवेक्षकों को सुनना पड़ा क्योंकि वे जहां कैटलिनवेंट्री के बचाने के लिए नहीं थे, मुझे निम्नलिखित कोड का पालन करना होगा:

    <events>
        <cataloginventory_stock_item_save_commit_after>
            <observers>
                <genmato_stockupdate>
                    <class>genmato_stockupdate/observer</class>
                    <method>catalogInventorySave</method>
                </genmato_stockupdate>
            </observers>
        </cataloginventory_stock_item_save_commit_after>
        <sales_model_service_quote_submit_before>
            <observers>
                <genmato_stockupdate>
                    <class>genmato_stockupdate/observer</class>
                    <method>subtractQuoteInventory</method>
                </genmato_stockupdate>
            </observers>
        </sales_model_service_quote_submit_before>
        <sales_model_service_quote_submit_failure>
            <observers>
                <genmato_stockupdate>
                    <class>genmato_stockupdate/observer</class>
                    <method>revertQuoteInventory</method>
                </genmato_stockupdate>
            </observers>
        </sales_model_service_quote_submit_failure>
        <sales_order_item_cancel>
            <observers>
                <genmato_stockupdate>
                    <class>genmato_stockupdate/observer</class>
                    <method>cancelOrderItem</method>
                </genmato_stockupdate>
            </observers>
        </sales_order_item_cancel>
        <sales_order_creditmemo_save_after>
            <observers>
                <genmato_stockupdate>
                    <class>genmato_stockupdate/observer</class>
                    <method>refundOrderInventory</method>
                </genmato_stockupdate>
            </observers>
        </sales_order_creditmemo_save_after>
    </events>

और प्रेक्षक में निम्नलिखित कोड है:

public function catalogInventorySave(Varien_Event_Observer $observer)
{
    if ($this->isEnabled()) {
        $event = $observer->getEvent();
        $_item = $event->getItem();

        if ((int)$_item->getData('qty') != (int)$_item->getOrigData('qty')) {
            $params = array();
            $params['product_id'] = $_item->getProductId();
            $params['qty'] = $_item->getQty();
            $params['qty_change'] = $_item->getQty() - $_item->getOrigData('qty');
        }
    }
}

public function subtractQuoteInventory(Varien_Event_Observer $observer)
{
    if ($this->isEnabled()) {
        $quote = $observer->getEvent()->getQuote();
        foreach ($quote->getAllItems() as $item) {
            $params = array();
            $params['product_id'] = $item->getProductId();
            $params['sku'] = $item->getSku();
            $params['qty'] = $item->getProduct()->getStockItem()->getQty();
            $params['qty_change'] = ($item->getTotalQty() * -1);
        }
    }
}

public function revertQuoteInventory(Varien_Event_Observer $observer)
{
    if ($this->isEnabled()) {
        $quote = $observer->getEvent()->getQuote();
        foreach ($quote->getAllItems() as $item) {
            $params = array();
            $params['product_id'] = $item->getProductId();
            $params['sku'] = $item->getSku();
            $params['qty'] = $item->getProduct()->getStockItem()->getQty();
            $params['qty_change'] = ($item->getTotalQty());
        }
    }
}

public function cancelOrderItem(Varien_Event_Observer $observer)
{
    if ($this->isEnabled()) {
        $item = $observer->getEvent()->getItem();
        $qty = $item->getQtyOrdered() - max($item->getQtyShipped(), $item->getQtyInvoiced()) - $item->getQtyCanceled();
        $params = array();
        $params['product_id'] = $item->getProductId();
        $params['sku'] = $item->getSku();
        $params['qty'] = $item->getProduct()->getStockItem()->getQty();
        $params['qty_change'] = $qty;
    }
}

public function refundOrderInventory(Varien_Event_Observer $observer)
{
    if ($this->isEnabled()) {
        $creditmemo = $observer->getEvent()->getCreditmemo();
        foreach ($creditmemo->getAllItems() as $item) {
            $params = array();
            $params['product_id'] = $item->getProductId();
            $params['sku'] = $item->getSku();
            $params['qty'] = $item->getProduct()->getStockItem()->getQty();
            $params['qty_change'] = ($item->getQty());
       }
    }
}

आशा है कि यह थोड़ा सा है जिसे आप ढूंढ रहे हैं।


जब मैंने इसका उपयोग किया है, तो ऑर्डर रद्द करने और ऑर्डर नहीं देने पर इसने 500 सर्वर त्रुटि उत्पन्न की। मुझे काम करने के लिए इस कार्य से if ($ यह-> isEnabled ()) स्थिति को हटाना पड़ा। किसी भी कारण से यह मामला है? क्या इसलिए कि मैं सिंगलटन प्रकार का उपयोग कर रहा हूं? धन्यवाद
Moustafa Elqabbany

5

आप स्टॉक आइटम मॉडल से संबंधित किसी भी ईवेंट का उपयोग नहीं कर सकते, क्योंकि मॉडल को दरकिनार करते हुए मैगेंटो सभी ऑर्डर किए गए आइटमों के लिए स्टॉक को कम करने के लिए एक अनुकूलित SQL क्वेरी का उपयोग करता है।

मैंने इसे फिर से लिखने के साथ हल किया Mage_CatalogInventory_Model_Stock जहाँ मैंने एक अतिरिक्त कार्यक्रम जोड़ा:

<?php
/**
 * Add events to observe stock qty change
 * 
 * @author Fabian Schmengler
 *
 */
class SGH_ShippingExpress_Model_CatalogInventory_Stock
    extends Mage_CatalogInventory_Model_Stock
{
    const EVENT_CORRECT_STOCK_ITEMS_QTY_BEFORE = 'cataloginventory_stock_item_correct_qty_before';
    const EVENT_CORRECT_STOCK_ITEMS_QTY_AFTER = 'cataloginventory_stock_item_correct_qty_after';

    /**
     * (non-PHPdoc)
     * @see Mage_CatalogInventory_Model_Stock::registerProductsSale()
     */
    public function registerProductsSale($items)
    {
        Mage::dispatchEvent(self::EVENT_CORRECT_STOCK_ITEMS_QTY_BEFORE, array(
            'stock'     => $this,
            'items_obj' => (object)array('items' => &$items),
            'operator'  => '-'
        ));
        $result = parent::registerProductsSale($items);
        Mage::dispatchEvent(self::EVENT_CORRECT_STOCK_ITEMS_QTY_AFTER, array(
            'stock'          => $this,
            'items'          => $items,
            'fullsave_items' => $result,
            'operator'       => '-'
        ));
        return $result;
    }
    /**
     * (non-PHPdoc)
     * @see Mage_CatalogInventory_Model_Stock::revertProductsSale()
     */
    public function revertProductsSale($items)
    {
        Mage::dispatchEvent(self::EVENT_CORRECT_STOCK_ITEMS_QTY_BEFORE, array(
            'stock'     => $this,
            'items_obj' => (object)array('items' => &$items),
            'operator'  => '+'
        ));
        $result = parent::revertProductsSale($items);
        Mage::dispatchEvent(self::EVENT_CORRECT_STOCK_ITEMS_QTY_AFTER, array(
            'stock'          => $this,
            'items'          => $items,
            'fullsave_items' => $result,
            'operator'       => '+'
        ));
        return $result;
    }
}

फिर प्रेक्षक के लिए cataloginventory_stock_item_correct_qty_after इस तरह दिख सकता है:

    /**
     * @var $items array array($productId => array('qty'=>$qty, 'item'=>$stockItem))
     */
    $items = $observer->getItems();
    foreach ($items as $productId => $item) {
        $stockItem = $item['item'];
        $product = $stockItem->getProduct();

        // Do anything you need with $stockItem and $product here

    }

मैं भारी प्रसंस्करण या अतिरिक्त डेटाबेस कॉल नहीं करने की सलाह देता हूं (जो यह पता लगाने के लिए आवश्यक है कि उत्पाद उदाहरण के लिए स्टॉक से बाहर है), लेकिन एक क्रोनजोब द्वारा संसाधित कतार में उत्पादों को जोड़ने के लिए, अतिरिक्त लोड समय को कम करने के लिए उपयोगकर्ता।


$stockItem->canSubtractQty()पर्यवेक्षक में काम नहीं कर रहा है और न ही $stockItem->getId().. कोई सुझाव? लगता है कि मैं तरीकों का उपयोग नहीं कर सकता
snh_nl

फैबियन, यहां कस्टम घटनाओं को जोड़ने का उद्देश्य क्या है क्योंकि आप स्वयं को ओवररेटेड फ़ंक्शन के साथ सुविधा जोड़ सकते हैं? क्या यह केवल अपघटित करना है? कृपया मार्गदर्शन करें।
मैगेंटो लर्नर

@MagentoLearner हाँ, यह मेरे लिए पुन: उपयोग और विभिन्न सुविधाओं को जोड़ने के लिए आसान बना दिया। तकनीकी रूप से आप इसके बजाय एक निजी विधि भी पेश कर सकते हैं
फाबियन शेंगलर

इसमें एक मुख्य वर्ग को फिर से लिखना शामिल हो सकता है, लेकिन यह अभी भी यहां सबसे पूर्ण समाधान है। कभी-कभी आपको सिर्फ M1: P
ब्रायन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.