reservationBuilder = $reservationBuilder; $this->appendReservations = $appendReservations; $this->getStockBySalesChannel = $getStockBySalesChannel; $this->getProductTypesBySkus = $getProductTypesBySkus; $this->isSourceItemManagementAllowedForProductType = $isSourceItemManagementAllowedForProductType; $this->serializer = $serializer; $this->salesEventToArrayConverter = $salesEventToArrayConverter; } /** * @inheritdoc */ public function execute(array $items, SalesChannelInterface $salesChannel, SalesEventInterface $salesEvent): void { if (empty($items)) { return; } $stockId = $this->getStockBySalesChannel->execute($salesChannel)->getStockId(); $skus = []; /** @var ItemToSellInterface $item */ foreach ($items as $item) { $skus[] = $item->getSku(); } $productTypes = $this->getProductTypesBySkus->execute($skus); $reservations = []; /** @var ItemToSellInterface $item */ foreach ($items as $item) { $currentSku = $item->getSku(); $skuNotExistInCatalog = !isset($productTypes[$currentSku]); if ($skuNotExistInCatalog || $this->isSourceItemManagementAllowedForProductType->execute($productTypes[$currentSku])) { $reservations[] = $this->reservationBuilder ->setSku($item->getSku()) ->setQuantity((float)$item->getQuantity()) ->setStockId($stockId) ->setMetadata($this->serializer->serialize($this->salesEventToArrayConverter->execute($salesEvent))) ->build(); } } $this->appendReservations->execute($reservations); } }