/**
  * Refresh stock index for specific stock items after successful order placement
  *
  * @param EventObserver $observer
  * @return void
  */
 public function execute(EventObserver $observer)
 {
     // Reindex quote ids
     $quote = $observer->getEvent()->getQuote();
     $productIds = [];
     foreach ($quote->getAllItems() as $item) {
         $productIds[$item->getProductId()] = $item->getProductId();
         $children = $item->getChildrenItems();
         if ($children) {
             foreach ($children as $childItem) {
                 $productIds[$childItem->getProductId()] = $childItem->getProductId();
             }
         }
     }
     if ($productIds) {
         $this->stockIndexerProcessor->reindexList($productIds);
     }
     // Reindex previously remembered items
     $productIds = [];
     foreach ($this->itemsForReindex->getItems() as $item) {
         $item->save();
         $productIds[] = $item->getProductId();
     }
     if (!empty($productIds)) {
         $this->priceIndexer->reindexList($productIds);
     }
     $this->itemsForReindex->clear();
     // Clear list of remembered items - we don't need it anymore
 }
 /**
  * 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;
 }