itemRequestFactory = $itemRequestFactory; $this->inventoryRequestFactory = $inventoryRequestFactory; $this->stockByWebsiteIdResolver = $stockByWebsiteIdResolver; $this->getSkuFromOrderItem = $getSkuFromOrderItem; } /** * @param OrderInterface $order * @return InventoryRequestInterface */ public function create(OrderInterface $order) : InventoryRequestInterface { $requestItems = []; $websiteId = $order->getStore()->getWebsiteId(); $stockId = (int)$this->stockByWebsiteIdResolver->execute((int)$websiteId)->getStockId(); /** @var OrderItemInterface|OrderItem $orderItem */ foreach ($order->getItems() as $orderItem) { $itemSku = $this->getSkuFromOrderItem->execute($orderItem); $qtyToDeliver = $orderItem->getQtyToShip(); //check if order item is not delivered yet if ($orderItem->isDeleted() || $orderItem->getParentItemId() || $this->isZero((float)$qtyToDeliver) || $orderItem->getIsVirtual() ) { continue; } $requestItems[] = $this->itemRequestFactory->create([ 'sku' => $itemSku, 'qty' => $qtyToDeliver ]); } return $this->inventoryRequestFactory->create([ 'stockId' => $stockId, 'items' => $requestItems ]); } /** * Compare float number with some epsilon * * @param float $floatNumber * * @return bool */ private function isZero(float $floatNumber): bool { return $floatNumber < 0.0000001; } }