1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\CatalogInventory\Observer;
- use Magento\Framework\Event\ObserverInterface;
- use Magento\CatalogInventory\Api\StockManagementInterface;
- use Magento\Framework\Event\Observer as EventObserver;
- /**
- * Catalog inventory module observer
- */
- class SubtractQuoteInventoryObserver implements ObserverInterface
- {
- /**
- * @var StockManagementInterface
- */
- protected $stockManagement;
- /**
- * @var ProductQty
- */
- protected $productQty;
- /**
- * @var \Magento\CatalogInventory\Observer\ItemsForReindex
- */
- protected $itemsForReindex;
- /**
- * SubtractQuoteInventoryObserver constructor.
- * @param StockManagementInterface $stockManagement
- * @param ProductQty $productQty
- * @param ItemsForReindex $itemsForReindex
- */
- public function __construct(
- StockManagementInterface $stockManagement,
- ProductQty $productQty,
- ItemsForReindex $itemsForReindex
- ) {
- $this->stockManagement = $stockManagement;
- $this->productQty = $productQty;
- $this->itemsForReindex = $itemsForReindex;
- }
- /**
- * 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()
- );
- if (count($itemsForReindex)) {
- $this->itemsForReindex->setItems($itemsForReindex);
- }
- $quote->setInventoryProcessed(true);
- return $this;
- }
- }
|