Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
OrderCustomerExtractor.php
Go to the documentation of this file.
1 <?php
6 declare(strict_types=1);
7 
9 
15 use Magento\Customer\Api\Data\AddressInterfaceFactory as AddressFactory;
16 use Magento\Customer\Api\Data\RegionInterfaceFactory as RegionFactory;
17 use Magento\Customer\Api\Data\CustomerInterfaceFactory as CustomerFactory;
18 use Magento\Quote\Api\Data\AddressInterfaceFactory as QuoteAddressFactory;
20 
25 {
29  private $orderRepository;
30 
34  private $customerRepository;
35 
39  private $objectCopyService;
40 
44  private $addressFactory;
45 
49  private $regionFactory;
50 
54  private $customerFactory;
55 
59  private $quoteAddressFactory;
60 
70  public function __construct(
71  OrderRepositoryInterface $orderRepository,
72  CustomerRepositoryInterface $customerRepository,
73  CopyService $objectCopyService,
74  AddressFactory $addressFactory,
75  RegionFactory $regionFactory,
76  CustomerFactory $customerFactory,
77  QuoteAddressFactory $quoteAddressFactory
78  ) {
79  $this->orderRepository = $orderRepository;
80  $this->customerRepository = $customerRepository;
81  $this->objectCopyService = $objectCopyService;
82  $this->addressFactory = $addressFactory;
83  $this->regionFactory = $regionFactory;
84  $this->customerFactory = $customerFactory;
85  $this->quoteAddressFactory = $quoteAddressFactory;
86  }
87 
94  public function extract(int $orderId): CustomerInterface
95  {
96  $order = $this->orderRepository->get($orderId);
97 
98  //Simply return customer from DB.
99  if ($order->getCustomerId()) {
100  return $this->customerRepository->getById($order->getCustomerId());
101  }
102 
103  //Prepare customer data from order data if customer doesn't exist yet.
104  $customerData = $this->objectCopyService->copyFieldsetToTarget(
105  'order_address',
106  'to_customer',
107  $order->getBillingAddress(),
108  []
109  );
110 
111  $processedAddressData = [];
112  $customerAddresses = [];
113  foreach ($order->getAddresses() as $orderAddress) {
114  $addressData = $this->objectCopyService
115  ->copyFieldsetToTarget('order_address', 'to_customer_address', $orderAddress, []);
116 
117  $index = array_search($addressData, $processedAddressData);
118  if ($index === false) {
119  // create new customer address only if it is unique
120  $customerAddress = $this->addressFactory->create(['data' => $addressData]);
121  $customerAddress->setIsDefaultBilling(false);
122  $customerAddress->setIsDefaultShipping(false);
123  if (is_string($orderAddress->getRegion())) {
125  $region = $this->regionFactory->create();
126  $region->setRegion($orderAddress->getRegion());
127  $region->setRegionCode($orderAddress->getRegionCode());
128  $region->setRegionId($orderAddress->getRegionId());
129  $customerAddress->setRegion($region);
130  }
131 
132  $processedAddressData[] = $addressData;
133  $customerAddresses[] = $customerAddress;
134  $index = count($processedAddressData) - 1;
135  }
136 
137  $customerAddress = $customerAddresses[$index];
138  // make sure that address type flags from equal addresses are stored in one resulted address
139  if ($orderAddress->getAddressType() == OrderAddress::TYPE_BILLING) {
140  $customerAddress->setIsDefaultBilling(true);
141  }
142  if ($orderAddress->getAddressType() == OrderAddress::TYPE_SHIPPING) {
143  $customerAddress->setIsDefaultShipping(true);
144  }
145  }
146 
147  $customerData['addresses'] = $customerAddresses;
148 
149  return $this->customerFactory->create(['data' => $customerData]);
150  }
151 }
$customerData
$orderRepository
Definition: order.php:69
$order
Definition: order.php:55
__construct(OrderRepositoryInterface $orderRepository, CustomerRepositoryInterface $customerRepository, CopyService $objectCopyService, AddressFactory $addressFactory, RegionFactory $regionFactory, CustomerFactory $customerFactory, QuoteAddressFactory $quoteAddressFactory)
$customerRepository
$addressData
Definition: order.php:19
$addressFactory
Definition: quote.php:20
$index
Definition: list.phtml:44
$customerAddress