objectCopyService = $objectCopyService; $this->accountManagement = $accountManagement; $this->orderRepository = $orderRepository; $this->customerFactory = $customerFactory; $this->addressFactory = $addressFactory; $this->regionFactory = $regionFactory; $this->quoteAddressFactory = $quoteAddressFactory ?: ObjectManager::getInstance()->get(QuoteAddressFactory::class); $this->customerExtractor = $orderCustomerExtractor ?? ObjectManager::getInstance()->get(OrderCustomerExtractor::class); } /** * {@inheritdoc} */ public function create($orderId) { $order = $this->orderRepository->get($orderId); if ($order->getCustomerId()) { throw new AlreadyExistsException( __('This order already has associated customer account') ); } $customer = $this->customerExtractor->extract($orderId); /** @var AddressInterface[] $filteredAddresses */ $filteredAddresses = []; foreach ($customer->getAddresses() as $address) { if ($this->needToSaveAddress($order, $address)) { $filteredAddresses[] = $address; } } $customer->setAddresses($filteredAddresses); $account = $this->accountManagement->createAccount($customer); $order = $this->orderRepository->get($orderId); $order->setCustomerId($account->getId()); $order->setCustomerIsGuest(0); $this->orderRepository->save($order); return $account; } /** * @param OrderInterface $order * @param AddressInterface $address * * @return bool */ private function needToSaveAddress( OrderInterface $order, AddressInterface $address ): bool { /** @var OrderAddressInterface|null $orderAddress */ $orderAddress = null; if ($address->isDefaultBilling()) { $orderAddress = $order->getBillingAddress(); } elseif ($address->isDefaultShipping()) { $orderAddress = $order->getShippingAddress(); } if ($orderAddress) { $quoteAddressId = $orderAddress->getData('quote_address_id'); if ($quoteAddressId) { /** @var QuoteAddress $quote */ $quote = $this->quoteAddressFactory->create() ->load($quoteAddressId); if ($quote && $quote->getId()) { return (bool)(int)$quote->getData('save_in_address_book'); } } return true; } return false; } }