/** * Revert quote items inventory data (cover not success order place case) * * @param EventObserver $observer * @return void */ public function execute(EventObserver $observer) { $quote = $observer->getEvent()->getQuote(); $items = $this->productQty->getProductQty($quote->getAllItems()); $this->stockManagement->revertProductsSale($items, $quote->getStore()->getWebsiteId()); $productIds = array_keys($items); if (!empty($productIds)) { $this->stockIndexerProcessor->reindexList($productIds); $this->priceIndexer->reindexList($productIds); } // Clear flag, so if order placement retried again with success - it will be processed $quote->setInventoryProcessed(false); }
/** * 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; }