searchCriteriaBuilder->addFilter( $this->filterBuilder->setField('product_id')->setValue($orderItem->getProductId())->create() ) ->create(); try { $result = $this->subItemRepository->getList($criteria); foreach ($result->getItems() as $subItem) { if(isset($items[$subItem->getSubProductId()])) { $items[$subItem->getSubProductId()] += $orderItem->getRowTotal() * $subItem->getQuality(); } else { $items[$subItem->getSubProductId()] = $orderItem->getRowTotal() * $subItem->getQuality(); } $this->subProductsParent[$subItem->getSubProductId()] = $orderItem->getSku(); } } catch (LocalizedException $e) { } } /** * @param Order $order * @param array $items * @return void * @throws NoSuchEntityException * @throws \Magento\Framework\Exception\CouldNotSaveException * @throws \Magento\Framework\Exception\InputException * @throws \Magento\Framework\Validation\ValidationException */ protected function appendReservations(Order $order, array $items) { $stockId = $this->getAssignedStockIdForWebsite->execute($order->getStore()->getWebsite()->getCode()); $reservations = []; foreach ($items as $subProductId => $quantity) { $product = $this->productRepository->getById($subProductId); $reservations[] = $this->reservationBuilder->setSku($product->getSku()) ->setQuantity(-$quantity) ->setStockId($stockId) ->setMetadata( json_encode([ 'event_type'=>SalesEventInterface::EVENT_ORDER_PLACED, 'object_type'=>SalesEventInterface::OBJECT_TYPE_ORDER, 'object_id'=>$order->getId(), 'object_increment_id' => $order->getIncrementId(), 'comment' => 'sub product of '.$this->subProductsParent[$subProductId], ]) ) ->build(); } $this->appendReservations->execute($reservations); } public function execute(Observer $observer) { /* @var $order Order */ $order = $observer->getData('order'); $items = []; foreach ($order->getItems() as $item) { $this->getSubItemQtyOrdered($item, $items); } $this->logger->debug('subtract sub item inventory, items:', $items); try { $itemsForReindex = $this->registerProductSale->registerProductsSale($items, $order->getStore()->getWebsiteId()); if (count($itemsForReindex)) { $this->itemsForReindex->setItems($itemsForReindex); } $this->appendReservations($order, $items); } catch (\Exception $e) { $this->logger->critical('subtract sub item inventory error, ', $e->getTrace()); } } }