inventoryRequestFactory = $inventoryRequestFactory; $this->inventoryRequestExtensionFactory = $inventoryRequestExtensionFactory; $this->orderRepository = $orderRepository; $this->addressInterfaceFactory = $addressInterfaceFactory; $this->storeManager = $storeManager; $this->stockByWebsiteIdResolver = $stockByWebsiteIdResolver; } /** * Build inventory request based on Order Id and provided request items * * @param int $orderId * @param array $requestItems */ public function execute(int $orderId, array $requestItems): InventoryRequestInterface { /** @var OrderInterface $order */ $order = $this->orderRepository->get($orderId); $store = $this->storeManager->getStore($order->getStoreId()); $stock = $this->stockByWebsiteIdResolver->execute((int)$store->getWebsiteId()); $inventoryRequest = $this->inventoryRequestFactory->create([ 'stockId' => $stock->getStockId(), 'items' => $requestItems ]); $address = $this->getAddressFromOrder($order); if ($address !== null) { $extensionAttributes = $this->inventoryRequestExtensionFactory->create(); $extensionAttributes->setDestinationAddress($address); $inventoryRequest->setExtensionAttributes($extensionAttributes); } return $inventoryRequest; } /** * Create an address from an order * * @param OrderInterface $order * @return null|AddressInterface */ private function getAddressFromOrder(OrderInterface $order): ?AddressInterface { /** @var Address $shippingAddress */ $shippingAddress = $order->getShippingAddress(); if ($shippingAddress === null) { return null; } return $this->addressInterfaceFactory->create([ 'country' => $shippingAddress->getCountryId(), 'postcode' => $shippingAddress->getPostcode(), 'street' => implode("\n", $shippingAddress->getStreet()), 'region' => $shippingAddress->getRegion() ?? $shippingAddress->getRegionCode() ?? '', 'city' => $shippingAddress->getCity() ]); } }