15
15
use Magento \Framework \Setup \ModuleDataSetupInterface ;
16
16
use Magento \Framework \Setup \UpgradeDataInterface ;
17
17
use Magento \Quote \Model \QuoteFactory ;
18
+ use Magento \Sales \Model \Order \Address ;
18
19
use Magento \Sales \Model \OrderFactory ;
19
20
use Magento \Sales \Model \ResourceModel \Order \Address \CollectionFactory as AddressCollectionFactory ;
20
21
@@ -42,27 +43,14 @@ class UpgradeData implements UpgradeDataInterface
42
43
*/
43
44
private $ aggregatedFieldConverter ;
44
45
45
- /**
46
- * @var AddressCollectionFactory
47
- */
48
- private $ addressCollectionFactory ;
49
-
50
- /**
51
- * @var OrderFactory
52
- */
53
- private $ orderFactory ;
54
-
55
- /**
56
- * @var QuoteFactory
57
- */
58
- private $ quoteFactory ;
59
-
60
46
/**
61
47
* @var State
62
48
*/
63
49
private $ state ;
64
50
65
51
/**
52
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
53
+ *
66
54
* @param SalesSetupFactory $salesSetupFactory
67
55
* @param Config $eavConfig
68
56
* @param AggregatedFieldDataConverter $aggregatedFieldConverter
@@ -83,9 +71,6 @@ public function __construct(
83
71
$ this ->salesSetupFactory = $ salesSetupFactory ;
84
72
$ this ->eavConfig = $ eavConfig ;
85
73
$ this ->aggregatedFieldConverter = $ aggregatedFieldConverter ;
86
- $ this ->addressCollectionFactory = $ addressCollFactory ;
87
- $ this ->orderFactory = $ orderFactory ;
88
- $ this ->quoteFactory = $ quoteFactory ;
89
74
$ this ->state = $ state ;
90
75
}
91
76
@@ -125,6 +110,7 @@ public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface
125
110
* @param string $setupVersion
126
111
* @param SalesSetup $salesSetup
127
112
* @return void
113
+ * @throws \Magento\Framework\DB\FieldDataConversionException
128
114
*/
129
115
private function convertSerializedDataToJson ($ setupVersion , SalesSetup $ salesSetup )
130
116
{
@@ -173,32 +159,95 @@ private function convertSerializedDataToJson($setupVersion, SalesSetup $salesSet
173
159
174
160
/**
175
161
* Fill quote_address_id in table sales_order_address if it is empty.
176
- *
177
162
* @param ModuleDataSetupInterface $setup
178
163
*/
179
164
public function fillQuoteAddressIdInSalesOrderAddress (ModuleDataSetupInterface $ setup )
180
165
{
181
- $ addressTable = $ setup ->getTable ('sales_order_address ' );
182
- $ updateOrderAddress = $ setup ->getConnection ()
166
+ $ this ->fillQuoteAddressIdInSalesOrderAddressByType ($ setup , Address::TYPE_SHIPPING );
167
+ $ this ->fillQuoteAddressIdInSalesOrderAddressByType ($ setup , Address::TYPE_BILLING );
168
+ }
169
+
170
+ /**
171
+ * @param ModuleDataSetupInterface $setup
172
+ * @param string $addressType
173
+ */
174
+ private function fillQuoteAddressIdInSalesOrderAddressByType (ModuleDataSetupInterface $ setup , $ addressType )
175
+ {
176
+ $ salesConnection = $ setup ->getConnection ('sales ' );
177
+
178
+ $ orderTable = $ setup ->getTable ('sales_order ' , 'sales ' );
179
+ $ orderAddressTable = $ setup ->getTable ('sales_order_address ' , 'sales ' );
180
+
181
+ $ query = $ salesConnection
183
182
->select ()
183
+ ->from (
184
+ ['sales_order_address ' => $ orderAddressTable ],
185
+ ['entity_id ' , 'address_type ' ]
186
+ )
184
187
->joinInner (
185
- ['sales_order ' => $ setup ->getTable ('sales_order ' )],
186
- $ addressTable . '.parent_id = sales_order.entity_id ' ,
187
- ['quote_address_id ' => 'quote_address.address_id ' ]
188
+ ['sales_order ' => $ orderTable ],
189
+ 'sales_order_address.parent_id = sales_order.entity_id ' ,
190
+ ['quote_id ' => 'sales_order.quote_id ' ]
191
+ )
192
+ ->where ('sales_order_address.quote_address_id IS NULL ' )
193
+ ->where ('sales_order_address.address_type = ? ' , $ addressType )
194
+ ->order ('sales_order_address.entity_id ' );
195
+
196
+ $ batchSize = 5000 ;
197
+ $ result = $ salesConnection ->query ($ query );
198
+ $ count = $ result ->rowCount ();
199
+ $ batches = ceil ($ count / $ batchSize );
200
+
201
+ for ($ batch = $ batches ; $ batch > 0 ; $ batch --) {
202
+ $ query ->limitPage ($ batch , $ batchSize );
203
+ $ result = $ salesConnection ->fetchAssoc ($ query );
204
+
205
+ $ this ->fillQuoteAddressIdInSalesOrderAddressProcessBatch ($ setup , $ result , $ addressType );
206
+ }
207
+ }
208
+
209
+ /**
210
+ * @param ModuleDataSetupInterface $setup
211
+ * @param array $orderAddresses
212
+ * @param string $addressType
213
+ */
214
+ private function fillQuoteAddressIdInSalesOrderAddressProcessBatch (
215
+ ModuleDataSetupInterface $ setup ,
216
+ array $ orderAddresses ,
217
+ $ addressType
218
+ ) {
219
+ $ salesConnection = $ setup ->getConnection ('sales ' );
220
+ $ quoteConnection = $ setup ->getConnection ('checkout ' );
221
+
222
+ $ quoteAddressTable = $ setup ->getTable ('quote_address ' , 'checkout ' );
223
+ $ quoteTable = $ setup ->getTable ('quote ' , 'checkout ' );
224
+ $ salesOrderAddressTable = $ setup ->getTable ('sales_order_address ' , 'sales ' );
225
+
226
+ $ query = $ quoteConnection
227
+ ->select ()
228
+ ->from (
229
+ ['quote_address ' => $ quoteAddressTable ],
230
+ ['quote_id ' , 'address_id ' ]
188
231
)
189
232
->joinInner (
190
- ['quote_address ' => $ setup ->getTable ('quote_address ' )],
191
- 'sales_order.quote_id = quote_address.quote_id
192
- AND ' . $ addressTable . '.address_type = quote_address.address_type ' ,
233
+ ['quote ' => $ quoteTable ],
234
+ 'quote_address.quote_id = quote.entity_id ' ,
193
235
[]
194
236
)
195
- ->where (
196
- $ addressTable . '.quote_address_id IS NULL '
197
- );
198
- $ updateOrderAddress = $ setup ->getConnection ()->updateFromSelect (
199
- $ updateOrderAddress ,
200
- $ addressTable
201
- );
202
- $ setup ->getConnection ()->query ($ updateOrderAddress );
237
+ ->where ('quote.entity_id in (?) ' , array_column ($ orderAddresses , 'quote_id ' ))
238
+ ->where ('address_type = ? ' , $ addressType );
239
+
240
+ $ quoteAddresses = $ quoteConnection ->fetchAssoc ($ query );
241
+
242
+ foreach ($ orderAddresses as $ orderAddress ) {
243
+ $ bind = [
244
+ 'quote_address_id ' => $ quoteAddresses [$ orderAddress ['quote_id ' ]]['address_id ' ] ?? null ,
245
+ ];
246
+ $ where = [
247
+ 'entity_id = ? ' => $ orderAddress ['entity_id ' ]
248
+ ];
249
+
250
+ $ salesConnection ->update ($ salesOrderAddressTable , $ bind , $ where );
251
+ }
203
252
}
204
253
}
0 commit comments