/**
  * 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;
 }