orderRepository = $orderRepository; $this->customerRepository = $customerRepository; $this->objectCopyService = $objectCopyService; $this->addressFactory = $addressFactory; $this->regionFactory = $regionFactory; $this->customerFactory = $customerFactory; $this->quoteAddressFactory = $quoteAddressFactory; } /** * Extract customer data from order. * * @param int $orderId * @return CustomerInterface */ public function extract(int $orderId): CustomerInterface { $order = $this->orderRepository->get($orderId); //Simply return customer from DB. if ($order->getCustomerId()) { return $this->customerRepository->getById($order->getCustomerId()); } //Prepare customer data from order data if customer doesn't exist yet. $customerData = $this->objectCopyService->copyFieldsetToTarget( 'order_address', 'to_customer', $order->getBillingAddress(), [] ); $processedAddressData = []; $customerAddresses = []; foreach ($order->getAddresses() as $orderAddress) { $addressData = $this->objectCopyService ->copyFieldsetToTarget('order_address', 'to_customer_address', $orderAddress, []); $index = array_search($addressData, $processedAddressData); if ($index === false) { // create new customer address only if it is unique $customerAddress = $this->addressFactory->create(['data' => $addressData]); $customerAddress->setIsDefaultBilling(false); $customerAddress->setIsDefaultShipping(false); if (is_string($orderAddress->getRegion())) { /** @var RegionInterface $region */ $region = $this->regionFactory->create(); $region->setRegion($orderAddress->getRegion()); $region->setRegionCode($orderAddress->getRegionCode()); $region->setRegionId($orderAddress->getRegionId()); $customerAddress->setRegion($region); } $processedAddressData[] = $addressData; $customerAddresses[] = $customerAddress; $index = count($processedAddressData) - 1; } $customerAddress = $customerAddresses[$index]; // make sure that address type flags from equal addresses are stored in one resulted address if ($orderAddress->getAddressType() == OrderAddress::TYPE_BILLING) { $customerAddress->setIsDefaultBilling(true); } if ($orderAddress->getAddressType() == OrderAddress::TYPE_SHIPPING) { $customerAddress->setIsDefaultShipping(true); } } $customerData['addresses'] = $customerAddresses; return $this->customerFactory->create(['data' => $customerData]); } }