123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Sales\Model\Order;
- use Magento\Customer\Api\Data\AddressInterface;
- use Magento\Framework\App\ObjectManager;
- use Magento\Framework\Exception\AlreadyExistsException;
- use Magento\Sales\Api\Data\OrderAddressInterface;
- use Magento\Quote\Model\Quote\Address as QuoteAddress;
- use Magento\Quote\Model\Quote\AddressFactory as QuoteAddressFactory;
- use Magento\Sales\Api\Data\OrderInterface;
- /**
- * Class CustomerManagement
- *
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
- class CustomerManagement implements \Magento\Sales\Api\OrderCustomerManagementInterface
- {
- /**
- * @var \Magento\Customer\Api\AccountManagementInterface
- */
- protected $accountManagement;
- /**
- * @deprecated 101.0.4
- */
- protected $customerFactory;
- /**
- * @deprecated 101.0.4
- */
- protected $addressFactory;
- /**
- * @deprecated 101.0.4
- */
- protected $regionFactory;
- /**
- * @var \Magento\Sales\Api\OrderRepositoryInterface
- */
- protected $orderRepository;
- /**
- * @deprecated 101.0.4
- */
- protected $objectCopyService;
- /**
- * @var QuoteAddressFactory
- */
- private $quoteAddressFactory;
- /**
- * @var OrderCustomerExtractor
- */
- private $customerExtractor;
- /**
- * @param \Magento\Framework\DataObject\Copy $objectCopyService
- * @param \Magento\Customer\Api\AccountManagementInterface $accountManagement
- * @param \Magento\Customer\Api\Data\CustomerInterfaceFactory $customerFactory
- * @param \Magento\Customer\Api\Data\AddressInterfaceFactory $addressFactory
- * @param \Magento\Customer\Api\Data\RegionInterfaceFactory $regionFactory
- * @param \Magento\Sales\Api\OrderRepositoryInterface $orderRepository
- * @param QuoteAddressFactory|null $quoteAddressFactory
- * @param OrderCustomerExtractor|null $orderCustomerExtractor
- */
- public function __construct(
- \Magento\Framework\DataObject\Copy $objectCopyService,
- \Magento\Customer\Api\AccountManagementInterface $accountManagement,
- \Magento\Customer\Api\Data\CustomerInterfaceFactory $customerFactory,
- \Magento\Customer\Api\Data\AddressInterfaceFactory $addressFactory,
- \Magento\Customer\Api\Data\RegionInterfaceFactory $regionFactory,
- \Magento\Sales\Api\OrderRepositoryInterface $orderRepository,
- QuoteAddressFactory $quoteAddressFactory = null,
- OrderCustomerExtractor $orderCustomerExtractor = null
- ) {
- $this->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;
- }
- }
|