/** * Subtract quote items qtys from stock items related with quote items products. * * Used before order placing to make order save/place transaction smaller * Also called after every successful order placement to ensure subtraction of inventory * * @param EventObserver $observer * @return $this */ public function execute(EventObserver $observer) { /** @var \Magento\Quote\Model\Quote $quote */ $quote = $observer->getEvent()->getQuote(); // Maybe we've already processed this quote in some event during order placement // e.g. call in event 'sales_model_service_quote_submit_before' and later in 'checkout_submit_all_after' if ($quote->getInventoryProcessed()) { return $this; } $items = $this->productQty->getProductQty($quote->getAllItems()); /** * Remember items */ $itemsForReindex = $this->stockManagement->registerProductsSale($items, $quote->getStore()->getWebsiteId()); $this->itemsForReindex->setItems($itemsForReindex); $quote->setInventoryProcessed(true); return $this; }
/** * Subtract items qtys from stock related with uncancel products. * * @param EventObserver $observer * @return $this */ public function execute(EventObserver $observer) { $order = $observer->getEvent()->getOrder(); $productQty = $observer->getEvent()->getProductQty(); if ($order->getInventoryProcessed()) { return $this; } /** * Reindex items */ $itemsForReindex = $this->stockManagement->registerProductsSale($productQty, $order->getStore()->getWebsiteId()); $productIds = []; foreach ($itemsForReindex as $item) { $item->save(); $productIds[] = $item->getProductId(); } if (!empty($productIds)) { $this->stockIndexerProcessor->reindexList($productIds); } $order->setInventoryProcessed(true); return $this; }