QuoteUpdater.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Braintree\Model\Paypal\Helper;
  7. use Magento\Quote\Model\Quote;
  8. use Magento\Quote\Model\Quote\Address;
  9. use Magento\Quote\Model\Quote\Payment;
  10. use Magento\Quote\Api\CartRepositoryInterface;
  11. use Magento\Braintree\Model\Ui\PayPal\ConfigProvider;
  12. use Magento\Framework\Exception\LocalizedException;
  13. use Magento\Braintree\Observer\DataAssignObserver;
  14. use Magento\Braintree\Gateway\Config\PayPal\Config;
  15. /**
  16. * Class QuoteUpdater
  17. */
  18. class QuoteUpdater extends AbstractHelper
  19. {
  20. /**
  21. * @var Config
  22. */
  23. private $config;
  24. /**
  25. * @var CartRepositoryInterface
  26. */
  27. private $quoteRepository;
  28. /**
  29. * Constructor
  30. *
  31. * @param Config $config
  32. * @param CartRepositoryInterface $quoteRepository
  33. */
  34. public function __construct(
  35. Config $config,
  36. CartRepositoryInterface $quoteRepository
  37. ) {
  38. $this->config = $config;
  39. $this->quoteRepository = $quoteRepository;
  40. }
  41. /**
  42. * Execute operation
  43. *
  44. * @param string $nonce
  45. * @param array $details
  46. * @param Quote $quote
  47. * @return void
  48. * @throws \InvalidArgumentException
  49. * @throws LocalizedException
  50. */
  51. public function execute($nonce, array $details, Quote $quote)
  52. {
  53. if (empty($nonce) || empty($details)) {
  54. throw new \InvalidArgumentException('The "nonce" and "details" fields does not exists');
  55. }
  56. $payment = $quote->getPayment();
  57. $payment->setMethod(ConfigProvider::PAYPAL_CODE);
  58. $payment->setAdditionalInformation(DataAssignObserver::PAYMENT_METHOD_NONCE, $nonce);
  59. $this->updateQuote($quote, $details);
  60. }
  61. /**
  62. * Update quote data
  63. *
  64. * @param Quote $quote
  65. * @param array $details
  66. * @return void
  67. */
  68. private function updateQuote(Quote $quote, array $details)
  69. {
  70. $quote->setMayEditShippingAddress(false);
  71. $quote->setMayEditShippingMethod(true);
  72. $this->updateQuoteAddress($quote, $details);
  73. $this->disabledQuoteAddressValidation($quote);
  74. $quote->collectTotals();
  75. /**
  76. * Unset shipping assignment to prevent from saving / applying outdated data
  77. * @see \Magento\Quote\Model\QuoteRepository\SaveHandler::processShippingAssignment
  78. */
  79. if ($quote->getExtensionAttributes()) {
  80. $quote->getExtensionAttributes()->setShippingAssignments(null);
  81. }
  82. $this->quoteRepository->save($quote);
  83. }
  84. /**
  85. * Update quote address
  86. *
  87. * @param Quote $quote
  88. * @param array $details
  89. * @return void
  90. */
  91. private function updateQuoteAddress(Quote $quote, array $details)
  92. {
  93. if (!$quote->getIsVirtual()) {
  94. $this->updateShippingAddress($quote, $details);
  95. }
  96. $this->updateBillingAddress($quote, $details);
  97. }
  98. /**
  99. * Update shipping address
  100. * (PayPal doesn't provide detailed shipping info: prefix, suffix)
  101. *
  102. * @param Quote $quote
  103. * @param array $details
  104. * @return void
  105. */
  106. private function updateShippingAddress(Quote $quote, array $details)
  107. {
  108. $shippingAddress = $quote->getShippingAddress();
  109. $shippingAddress->setLastname($details['lastName']);
  110. $shippingAddress->setFirstname($details['firstName']);
  111. $shippingAddress->setEmail($details['email']);
  112. $shippingAddress->setCollectShippingRates(true);
  113. $this->updateAddressData($shippingAddress, $details['shippingAddress']);
  114. // PayPal's address supposes not saving against customer account
  115. $shippingAddress->setSaveInAddressBook(false);
  116. $shippingAddress->setSameAsBilling(false);
  117. $shippingAddress->unsCustomerAddressId();
  118. }
  119. /**
  120. * Update billing address
  121. *
  122. * @param Quote $quote
  123. * @param array $details
  124. * @return void
  125. */
  126. private function updateBillingAddress(Quote $quote, array $details)
  127. {
  128. $billingAddress = $quote->getBillingAddress();
  129. if ($this->config->isRequiredBillingAddress() && !empty($details['billingAddress'])) {
  130. $this->updateAddressData($billingAddress, $details['billingAddress']);
  131. } else {
  132. $this->updateAddressData($billingAddress, $details['shippingAddress']);
  133. }
  134. $billingAddress->setFirstname($details['firstName']);
  135. $billingAddress->setLastname($details['lastName']);
  136. $billingAddress->setEmail($details['email']);
  137. // PayPal's address supposes not saving against customer account
  138. $billingAddress->setSaveInAddressBook(false);
  139. $billingAddress->setSameAsBilling(false);
  140. $billingAddress->unsCustomerAddressId();
  141. }
  142. /**
  143. * Sets address data from exported address
  144. *
  145. * @param Address $address
  146. * @param array $addressData
  147. * @return void
  148. */
  149. private function updateAddressData(Address $address, array $addressData)
  150. {
  151. $extendedAddress = isset($addressData['extendedAddress'])
  152. ? $addressData['extendedAddress']
  153. : null;
  154. $address->setStreet([$addressData['streetAddress'], $extendedAddress]);
  155. $address->setCity($addressData['locality']);
  156. $address->setRegionCode($addressData['region']);
  157. $address->setCountryId($addressData['countryCodeAlpha2']);
  158. $address->setPostcode($addressData['postalCode']);
  159. // PayPal's address supposes not saving against customer account
  160. $address->setSaveInAddressBook(false);
  161. $address->setSameAsBilling(false);
  162. $address->setCustomerAddressId(null);
  163. }
  164. }