77
88namespace Magento \Quote \Model \QuoteRepository ;
99
10- use Magento \Quote \ Api \ Data \ CartInterface ;
10+ use Magento \Backend \ Model \ Session \ Quote as QuoteSession ;
1111use Magento \Customer \Api \AddressRepositoryInterface ;
1212use Magento \Framework \App \ObjectManager ;
13- use Magento \Framework \Exception \NoSuchEntityException ;
13+ use Magento \Framework \Exception \CouldNotSaveException ;
1414use Magento \Framework \Exception \InputException ;
15+ use Magento \Framework \Exception \LocalizedException ;
16+ use Magento \Framework \Exception \NoSuchEntityException ;
17+ use Magento \Quote \Api \Data \AddressInterface ;
1518use Magento \Quote \Api \Data \AddressInterfaceFactory ;
19+ use Magento \Quote \Api \Data \CartInterface ;
20+ use Magento \Quote \Model \Quote \Address \BillingAddressPersister ;
21+ use Magento \Quote \Model \Quote \Address \ShippingAddressPersister ;
22+ use Magento \Quote \Model \Quote \Item \CartItemPersister ;
23+ use Magento \Quote \Model \Quote \ShippingAssignment \ShippingAssignmentPersister ;
24+ use Magento \Quote \Model \ResourceModel \Quote ;
1625
1726/**
1827 * Handler for saving quote.
28+ *
29+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
30+ * @SuppressWarnings(PHPMD.CookieAndSessionMisuse)
1931 */
2032class SaveHandler
2133{
2234 /**
23- * @var \Magento\Quote\Model\Quote\Item\ CartItemPersister
35+ * @var CartItemPersister
2436 */
2537 private $ cartItemPersister ;
2638
2739 /**
28- * @var \Magento\Quote\Model\Quote\Address\ BillingAddressPersister
40+ * @var BillingAddressPersister
2941 */
3042 private $ billingAddressPersister ;
3143
3244 /**
33- * @var \Magento\Quote\Model\ResourceModel\ Quote
45+ * @var Quote
3446 */
3547 private $ quoteResourceModel ;
3648
3749 /**
38- * @var \Magento\Quote\Model\Quote\ShippingAssignment\ ShippingAssignmentPersister
50+ * @var ShippingAssignmentPersister
3951 */
4052 private $ shippingAssignmentPersister ;
4153
@@ -50,29 +62,46 @@ class SaveHandler
5062 private $ quoteAddressFactory ;
5163
5264 /**
53- * @param \Magento\Quote\Model\ResourceModel\Quote $quoteResource
54- * @param \Magento\Quote\Model\Quote\Item\CartItemPersister $cartItemPersister
55- * @param \Magento\Quote\Model\Quote\Address\BillingAddressPersister $billingAddressPersister
56- * @param \Magento\Quote\Model\Quote\ShippingAssignment\ShippingAssignmentPersister $shippingAssignmentPersister
57- * @param AddressRepositoryInterface $addressRepository
65+ * @var ShippingAddressPersister
66+ */
67+ private $ shippingAddressPersister ;
68+
69+ /**
70+ * @var QuoteSession
71+ */
72+ private $ quoteSession ;
73+
74+ /**
75+ * @param Quote $quoteResource
76+ * @param CartItemPersister $cartItemPersister
77+ * @param BillingAddressPersister $billingAddressPersister
78+ * @param ShippingAssignmentPersister $shippingAssignmentPersister
79+ * @param AddressRepositoryInterface|null $addressRepository
5880 * @param AddressInterfaceFactory|null $addressFactory
81+ * @param ShippingAddressPersister|null $shippingAddressPersister
82+ * @param QuoteSession|null $quoteSession
5983 */
6084 public function __construct (
61- \ Magento \ Quote \ Model \ ResourceModel \ Quote $ quoteResource ,
62- \ Magento \ Quote \ Model \ Quote \ Item \ CartItemPersister $ cartItemPersister ,
63- \ Magento \ Quote \ Model \ Quote \ Address \ BillingAddressPersister $ billingAddressPersister ,
64- \ Magento \ Quote \ Model \ Quote \ ShippingAssignment \ ShippingAssignmentPersister $ shippingAssignmentPersister ,
85+ Quote $ quoteResource ,
86+ CartItemPersister $ cartItemPersister ,
87+ BillingAddressPersister $ billingAddressPersister ,
88+ ShippingAssignmentPersister $ shippingAssignmentPersister ,
6589 AddressRepositoryInterface $ addressRepository = null ,
66- AddressInterfaceFactory $ addressFactory = null
90+ AddressInterfaceFactory $ addressFactory = null ,
91+ ShippingAddressPersister $ shippingAddressPersister = null ,
92+ QuoteSession $ quoteSession = null
6793 ) {
6894 $ this ->quoteResourceModel = $ quoteResource ;
6995 $ this ->cartItemPersister = $ cartItemPersister ;
7096 $ this ->billingAddressPersister = $ billingAddressPersister ;
7197 $ this ->shippingAssignmentPersister = $ shippingAssignmentPersister ;
7298 $ this ->addressRepository = $ addressRepository
7399 ?: ObjectManager::getInstance ()->get (AddressRepositoryInterface::class);
74- $ this ->quoteAddressFactory = $ addressFactory ?:ObjectManager::getInstance ()
100+ $ this ->quoteAddressFactory = $ addressFactory ?: ObjectManager::getInstance ()
75101 ->get (AddressInterfaceFactory::class);
102+ $ this ->shippingAddressPersister = $ shippingAddressPersister
103+ ?: ObjectManager::getInstance ()->get (ShippingAddressPersister::class);
104+ $ this ->quoteSession = $ quoteSession ?: ObjectManager::getInstance ()->get (QuoteSession::class);
76105 }
77106
78107 /**
@@ -81,18 +110,16 @@ public function __construct(
81110 * @param CartInterface $quote
82111 * @return CartInterface
83112 * @throws InputException
84- * @throws \Magento\Framework\Exception\ CouldNotSaveException
85- * @throws \Magento\Framework\Exception\ LocalizedException
113+ * @throws CouldNotSaveException
114+ * @throws LocalizedException
86115 */
87116 public function save (CartInterface $ quote )
88117 {
89- /** @var \Magento\Quote\Model\Quote $quote */
90118 // Quote Item processing
91119 $ items = $ quote ->getItems ();
92120
93121 if ($ items ) {
94122 foreach ($ items as $ item ) {
95- /** @var \Magento\Quote\Model\Quote\Item $item */
96123 if (!$ item ->isDeleted ()) {
97124 $ quote ->setLastAddedItem ($ this ->cartItemPersister ->save ($ quote , $ item ));
98125 } elseif (count ($ items ) === 1 ) {
@@ -104,33 +131,50 @@ public function save(CartInterface $quote)
104131
105132 // Billing Address processing
106133 $ billingAddress = $ quote ->getBillingAddress ();
107-
108134 if ($ billingAddress ) {
109- if ($ billingAddress ->getCustomerAddressId ()) {
110- try {
111- $ this ->addressRepository ->getById ($ billingAddress ->getCustomerAddressId ());
112- } catch (NoSuchEntityException $ e ) {
113- $ billingAddress ->setCustomerAddressId (null );
114- }
115- }
116-
135+ $ this ->processAddress ($ billingAddress );
117136 $ this ->billingAddressPersister ->save ($ quote , $ billingAddress );
118137 }
119138
139+ // Shipping Address processing
140+ if ($ this ->quoteSession ->getData (('reordered ' ))) {
141+ $ shippingAddress = $ this ->processAddress ($ quote ->getShippingAddress ());
142+ $ this ->shippingAddressPersister ->save ($ quote , $ shippingAddress );
143+ }
144+
120145 $ this ->processShippingAssignment ($ quote );
121146 $ this ->quoteResourceModel ->save ($ quote ->collectTotals ());
122147
123148 return $ quote ;
124149 }
125150
151+ /**
152+ * Process address for customer address Id
153+ *
154+ * @param AddressInterface $address
155+ * @return AddressInterface
156+ * @throws LocalizedException
157+ */
158+ private function processAddress (AddressInterface $ address ): AddressInterface
159+ {
160+ if ($ address ->getCustomerAddressId ()) {
161+ try {
162+ $ this ->addressRepository ->getById ($ address ->getCustomerAddressId ());
163+ } catch (NoSuchEntityException $ e ) {
164+ $ address ->setCustomerAddressId (null );
165+ }
166+ }
167+ return $ address ;
168+ }
169+
126170 /**
127171 * Process shipping assignment
128172 *
129- * @param \Magento\Quote\Model\Quote $quote
173+ * @param CartInterface $quote
130174 * @return void
131175 * @throws InputException
132176 */
133- private function processShippingAssignment ($ quote )
177+ private function processShippingAssignment (CartInterface $ quote )
134178 {
135179 // Shipping Assignments processing
136180 $ extensionAttributes = $ quote ->getExtensionAttributes ();
0 commit comments