7
7
8
8
namespace Magento \Quote \Model \QuoteRepository ;
9
9
10
- use Magento \Quote \ Api \ Data \ CartInterface ;
10
+ use Magento \Backend \ Model \ Session \ Quote as QuoteSession ;
11
11
use Magento \Customer \Api \AddressRepositoryInterface ;
12
12
use Magento \Framework \App \ObjectManager ;
13
- use Magento \Framework \Exception \NoSuchEntityException ;
13
+ use Magento \Framework \Exception \CouldNotSaveException ;
14
14
use Magento \Framework \Exception \InputException ;
15
+ use Magento \Framework \Exception \LocalizedException ;
16
+ use Magento \Framework \Exception \NoSuchEntityException ;
17
+ use Magento \Quote \Api \Data \AddressInterface ;
15
18
use 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 ;
16
25
17
26
/**
18
27
* Handler for saving quote.
28
+ *
29
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
30
+ * @SuppressWarnings(PHPMD.CookieAndSessionMisuse)
19
31
*/
20
32
class SaveHandler
21
33
{
22
34
/**
23
- * @var \Magento\Quote\Model\Quote\Item\ CartItemPersister
35
+ * @var CartItemPersister
24
36
*/
25
37
private $ cartItemPersister ;
26
38
27
39
/**
28
- * @var \Magento\Quote\Model\Quote\Address\ BillingAddressPersister
40
+ * @var BillingAddressPersister
29
41
*/
30
42
private $ billingAddressPersister ;
31
43
32
44
/**
33
- * @var \Magento\Quote\Model\ResourceModel\ Quote
45
+ * @var Quote
34
46
*/
35
47
private $ quoteResourceModel ;
36
48
37
49
/**
38
- * @var \Magento\Quote\Model\Quote\ShippingAssignment\ ShippingAssignmentPersister
50
+ * @var ShippingAssignmentPersister
39
51
*/
40
52
private $ shippingAssignmentPersister ;
41
53
@@ -50,29 +62,46 @@ class SaveHandler
50
62
private $ quoteAddressFactory ;
51
63
52
64
/**
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
58
80
* @param AddressInterfaceFactory|null $addressFactory
81
+ * @param ShippingAddressPersister|null $shippingAddressPersister
82
+ * @param QuoteSession|null $quoteSession
59
83
*/
60
84
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 ,
65
89
AddressRepositoryInterface $ addressRepository = null ,
66
- AddressInterfaceFactory $ addressFactory = null
90
+ AddressInterfaceFactory $ addressFactory = null ,
91
+ ShippingAddressPersister $ shippingAddressPersister = null ,
92
+ QuoteSession $ quoteSession = null
67
93
) {
68
94
$ this ->quoteResourceModel = $ quoteResource ;
69
95
$ this ->cartItemPersister = $ cartItemPersister ;
70
96
$ this ->billingAddressPersister = $ billingAddressPersister ;
71
97
$ this ->shippingAssignmentPersister = $ shippingAssignmentPersister ;
72
98
$ this ->addressRepository = $ addressRepository
73
99
?: ObjectManager::getInstance ()->get (AddressRepositoryInterface::class);
74
- $ this ->quoteAddressFactory = $ addressFactory ?:ObjectManager::getInstance ()
100
+ $ this ->quoteAddressFactory = $ addressFactory ?: ObjectManager::getInstance ()
75
101
->get (AddressInterfaceFactory::class);
102
+ $ this ->shippingAddressPersister = $ shippingAddressPersister
103
+ ?: ObjectManager::getInstance ()->get (ShippingAddressPersister::class);
104
+ $ this ->quoteSession = $ quoteSession ?: ObjectManager::getInstance ()->get (QuoteSession::class);
76
105
}
77
106
78
107
/**
@@ -81,18 +110,16 @@ public function __construct(
81
110
* @param CartInterface $quote
82
111
* @return CartInterface
83
112
* @throws InputException
84
- * @throws \Magento\Framework\Exception\ CouldNotSaveException
85
- * @throws \Magento\Framework\Exception\ LocalizedException
113
+ * @throws CouldNotSaveException
114
+ * @throws LocalizedException
86
115
*/
87
116
public function save (CartInterface $ quote )
88
117
{
89
- /** @var \Magento\Quote\Model\Quote $quote */
90
118
// Quote Item processing
91
119
$ items = $ quote ->getItems ();
92
120
93
121
if ($ items ) {
94
122
foreach ($ items as $ item ) {
95
- /** @var \Magento\Quote\Model\Quote\Item $item */
96
123
if (!$ item ->isDeleted ()) {
97
124
$ quote ->setLastAddedItem ($ this ->cartItemPersister ->save ($ quote , $ item ));
98
125
} elseif (count ($ items ) === 1 ) {
@@ -104,33 +131,50 @@ public function save(CartInterface $quote)
104
131
105
132
// Billing Address processing
106
133
$ billingAddress = $ quote ->getBillingAddress ();
107
-
108
134
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 );
117
136
$ this ->billingAddressPersister ->save ($ quote , $ billingAddress );
118
137
}
119
138
139
+ // Shipping Address processing
140
+ if ($ this ->quoteSession ->getData (('reordered ' ))) {
141
+ $ shippingAddress = $ this ->processAddress ($ quote ->getShippingAddress ());
142
+ $ this ->shippingAddressPersister ->save ($ quote , $ shippingAddress );
143
+ }
144
+
120
145
$ this ->processShippingAssignment ($ quote );
121
146
$ this ->quoteResourceModel ->save ($ quote ->collectTotals ());
122
147
123
148
return $ quote ;
124
149
}
125
150
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
+
126
170
/**
127
171
* Process shipping assignment
128
172
*
129
- * @param \Magento\Quote\Model\Quote $quote
173
+ * @param CartInterface $quote
130
174
* @return void
131
175
* @throws InputException
132
176
*/
133
- private function processShippingAssignment ($ quote )
177
+ private function processShippingAssignment (CartInterface $ quote )
134
178
{
135
179
// Shipping Assignments processing
136
180
$ extensionAttributes = $ quote ->getExtensionAttributes ();
0 commit comments