Passed
Push — master ( 0e978b...2ba142 )
by Aimeos
05:41
created

OrderAddTestData   C

Complexity

Total Complexity 57

Size/Duplication

Total Lines 596
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 287
dl 0
loc 596
rs 5.04
c 0
b 0
f 0
wmc 57

13 Methods

Rating   Name   Duplication   Size   Complexity  
A getPreDependencies() 0 3 1
A addOrderBaseServiceData() 0 52 5
A addOrderBaseAddressData() 0 38 3
A addOrderBaseData() 0 33 2
A migrate() 0 43 4
B addOrderBaseCouponData() 0 62 8
A getCustomerIds() 0 17 3
A getProductItems() 0 21 4
B addOrderBaseProductData() 0 66 6
B addOrderBaseProductAttributeData() 0 41 8
A addOrderBaseServiceAttributeData() 0 24 4
A getServiceIds() 0 21 4
A addOrderData() 0 44 5

How to fix   Complexity   

Complex Class

Complex classes like OrderAddTestData often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use OrderAddTestData, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
/**
4
 * @license LGPLv3, https://opensource.org/licenses/LGPL-3.0
5
 * @copyright Metaways Infosystems GmbH, 2012
6
 * @copyright Aimeos (aimeos.org), 2015-2021
7
 */
8
9
10
namespace Aimeos\MW\Setup\Task;
11
12
13
/**
14
 * Adds order test data.
15
 */
16
class OrderAddTestData extends \Aimeos\MW\Setup\Task\Base
17
{
18
	/**
19
	 * Returns the list of task names which this task depends on.
20
	 *
21
	 * @return string[] List of task names
22
	 */
23
	public function getPreDependencies() : array
24
	{
25
		return ['CustomerAddTestData', 'ProductAddTestData', 'PluginAddTestData', 'ServiceAddTestData', 'StockAddTestData'];
26
	}
27
28
29
	/**
30
	 * Adds order test data.
31
	 */
32
	public function migrate()
33
	{
34
		\Aimeos\MW\Common\Base::checkClass( \Aimeos\MShop\Context\Item\Iface::class, $this->additional );
35
36
		$this->msg( 'Adding order test data', 0 );
37
		$this->additional->setEditor( 'core:lib/mshoplib' );
38
39
		$localeManager = \Aimeos\MShop\Locale\Manager\Factory::create( $this->additional, 'Standard' );
40
		$orderManager = \Aimeos\MShop\Order\Manager\Factory::create( $this->additional, 'Standard' );
41
		$orderBaseManager = $orderManager->getSubManager( 'base' );
42
43
		$search = $orderBaseManager->filter();
44
		$search->setConditions( $search->compare( '==', 'order.base.sitecode', array( 'unittest', 'unit' ) ) );
45
46
		foreach( $orderBaseManager->search( $search ) as $order ) {
47
			$orderBaseManager->delete( $order->getId() );
48
		}
49
50
51
		$ds = DIRECTORY_SEPARATOR;
52
		$path = __DIR__ . $ds . 'data' . $ds . 'order.php';
53
54
		if( ( $testdata = include( $path ) ) == false ) {
55
			throw new \Aimeos\MShop\Exception( sprintf( 'No file "%1$s" found for order domain', $path ) );
56
		}
57
58
		$this->additional->setLocale( $this->additional->getLocale()->setCurrencyId( 'EUR' ) );
59
60
		$bases = $this->addOrderBaseData( $localeManager, $orderBaseManager, $testdata );
61
		$bases['items'] = $this->addOrderBaseProductData( $orderBaseManager, $bases, $testdata );
62
		$bases['items'] = $this->addOrderBaseServiceData( $orderBaseManager, $bases, $testdata );
63
64
		//update order bases (getPrice)
65
		foreach( $bases['items'] as $baseItem ) {
66
			$orderBaseManager->save( $baseItem, false );
67
		}
68
69
		$this->additional->setLocale( $this->additional->getLocale()->setCurrencyId( null ) );
70
71
		$this->addOrderBaseCouponData( $testdata );
72
		$this->addOrderData( $orderManager, $bases['ids'], $testdata );
73
74
		$this->status( 'done' );
75
	}
76
77
78
	/**
79
	 * Adds the required order base data.
80
	 *
81
	 * @param \Aimeos\MShop\Common\Manager\Iface $localeManager Locale manager
82
	 * @param \Aimeos\MShop\Common\Manager\Iface $orderBaseManager Order base manager
83
	 * @param array $testdata Associative list of key/list pairs
84
	 * @throws \Aimeos\MW\Setup\Exception If no type ID is found
85
	 */
86
	protected function addOrderBaseData( \Aimeos\MShop\Common\Manager\Iface $localeManager,
87
		\Aimeos\MShop\Common\Manager\Iface $orderBaseManager, array $testdata )
88
	{
89
		$bases = [];
90
		$locale = $localeManager->create();
91
		$customerIds = $this->getCustomerIds( $testdata );
92
		$orderBaseAddressManager = $orderBaseManager->getSubManager( 'address', 'Standard' );
93
94
		$orderBaseManager->begin();
95
96
		foreach( $testdata['order/base'] as $key => $dataset )
97
		{
98
			$bases['items'][$key] = $orderBaseManager->create();
99
			$bases['items'][$key]->setId( null );
100
			$bases['items'][$key]->setComment( $dataset['comment'] );
101
			$bases['items'][$key]->setCustomerReference( $dataset['customerref'] );
102
			$bases['items'][$key]->setCustomerId( $customerIds[$dataset['customerid']] );
103
104
			$locale->setId( null );
105
			$locale->setSiteId( $this->additional->getLocale()->getSiteId() );
106
			$locale->setLanguageId( $dataset['langid'] );
107
			$locale->setCurrencyId( $dataset['currencyid'] );
108
			$bases['items'][$key]->setLocale( $locale );
109
110
			$orderBaseManager->save( $bases['items'][$key] );
111
			$bases['ids'][$key] = $bases['items'][$key]->getId();
112
		}
113
114
		$this->addOrderBaseAddressData( $orderBaseAddressManager, $bases, $testdata );
115
116
		$orderBaseManager->commit();
117
118
		return $bases;
119
	}
120
121
122
	/**
123
	 * Adds the order address data.
124
	 *
125
	 * @param \Aimeos\MShop\Common\Manager\Iface $manager
126
	 * @param array $testdata
127
	 */
128
	protected function addOrderBaseAddressData( \Aimeos\MShop\Common\Manager\Iface $manager,
129
		array $bases, array $testdata )
130
	{
131
		$orderAddr = $manager->create();
132
133
		foreach( $testdata['order/base/address'] as $dataset )
134
		{
135
			if( !isset( $bases['ids'][$dataset['baseid']] ) ) {
136
				throw new \Aimeos\MW\Setup\Exception( sprintf( 'No base ID found for "%1$s"', $dataset['baseid'] ) );
137
			}
138
139
			$orderAddr->setId( null );
140
			$orderAddr->setBaseId( $bases['ids'][$dataset['baseid']] );
141
			$orderAddr->setAddressId( ( $dataset['addrid'] ?? '' ) );
142
			$orderAddr->setType( $dataset['type'] );
143
			$orderAddr->setCompany( $dataset['company'] ?? '' );
144
			$orderAddr->setVatID( ( $dataset['vatid'] ?? '' ) );
145
			$orderAddr->setSalutation( $dataset['salutation'] );
146
			$orderAddr->setTitle( $dataset['title'] );
147
			$orderAddr->setFirstname( $dataset['firstname'] );
148
			$orderAddr->setLastname( $dataset['lastname'] );
149
			$orderAddr->setAddress1( $dataset['address1'] );
150
			$orderAddr->setAddress2( $dataset['address2'] );
151
			$orderAddr->setAddress3( $dataset['address3'] );
152
			$orderAddr->setPostal( $dataset['postal'] );
153
			$orderAddr->setCity( $dataset['city'] );
154
			$orderAddr->setState( $dataset['state'] );
155
			$orderAddr->setCountryId( $dataset['countryid'] );
156
			$orderAddr->setTelephone( $dataset['telephone'] );
157
			$orderAddr->setEmail( $dataset['email'] );
158
			$orderAddr->setTelefax( $dataset['telefax'] );
159
			$orderAddr->setWebsite( $dataset['website'] );
160
			$orderAddr->setLanguageId( $dataset['langid'] );
161
			$orderAddr->setLatitude( $dataset['latitude'] );
162
			$orderAddr->setLongitude( $dataset['longitude'] );
163
			$orderAddr->setBirthday( $dataset['birthday'] ?? null );
164
165
			$manager->save( $orderAddr, false );
166
		}
167
	}
168
169
170
	/**
171
	 * Adds the order coupon test data.
172
	 *
173
	 * @param array $testdata Associative list of key/list pairs
174
	 * @throws \Aimeos\MW\Setup\Exception If a required ID is not available
175
	 */
176
	private function addOrderBaseCouponData( array $testdata )
177
	{
178
		$order = \Aimeos\MShop\Order\Manager\Factory::create( $this->additional, 'Standard' );
179
		$orderBase = $order->getSubManager( 'base', 'Standard' );
180
		$orderBaseProd = $orderBase->getSubManager( 'product', 'Standard' );
181
		$orderBaseCoupon = $orderBase->getSubManager( 'coupon', 'Standard' );
182
183
		$orderBaseIds = [];
184
		$orderBasePrices = [];
185
		$ordProdIds = [];
186
		$prodcode = $quantity = $pos = [];
187
		foreach( $testdata['order/base/coupon'] as $key => $dataset ) {
188
			$exp = explode( '/', $dataset['ordprodid'] );
189
190
			if( count( $exp ) != 3 ) {
191
				throw new \Aimeos\MW\Setup\Exception( sprintf( 'Some keys for ordprod are set wrong "%1$s"', $dataset ) );
192
			}
193
194
			$prodcode[$exp[0]] = $exp[0];
195
			$quantity[$exp[1]] = $exp[1];
196
			$pos[$exp[2]] = $exp[2];
197
198
			$orderBasePrices[$dataset['baseid']] = $dataset['baseid'];
199
		}
200
201
		$search = $orderBase->filter();
202
		$search->setConditions( $search->compare( '==', 'order.base.price', $orderBasePrices ) );
203
204
		foreach( $orderBase->search( $search ) as $orderBaseItem ) {
205
			$orderBaseIds[$orderBaseItem->getPrice()->getValue()] = $orderBaseItem->getId();
206
		}
207
208
209
		$search = $orderBaseProd->filter();
210
		$expr = array(
211
			$search->compare( '==', 'order.base.product.prodcode', $prodcode ),
212
			$search->compare( '==', 'order.base.product.quantity', $quantity ),
213
			$search->compare( '==', 'order.base.product.position', $pos ),
214
		);
215
		$search->setConditions( $search->and( $expr ) );
216
217
		foreach( $orderBaseProd->search( $search ) as $ordProd ) {
218
			$ordProdIds[$ordProd->getProductCode() . '/' . $ordProd->getQuantity() . '/' . $ordProd->getPosition()] = $ordProd->getId();
219
		}
220
221
		$orderCoupon = $orderBaseCoupon->create();
222
		foreach( $testdata['order/base/coupon'] as $key => $dataset )
223
		{
224
			if( !isset( $orderBaseIds[$dataset['baseid']] ) ) {
225
				throw new \Aimeos\MW\Setup\Exception( sprintf( 'No oder base ID found for "%1$s"', $dataset['baseid'] ) );
226
			}
227
228
			if( !isset( $ordProdIds[$dataset['ordprodid']] ) ) {
229
				throw new \Aimeos\MW\Setup\Exception( sprintf( 'No order base product ID found for "%1$s"', $dataset['ordprodid'] ) );
230
			}
231
232
			$orderCoupon->setId( null );
233
			$orderCoupon->setBaseId( $orderBaseIds[$dataset['baseid']] );
234
			$orderCoupon->setProductId( $ordProdIds[$dataset['ordprodid']] );
235
			$orderCoupon->setCode( $dataset['code'] );
236
237
			$orderBaseCoupon->save( $orderCoupon, false );
238
		}
239
	}
240
241
242
	/**
243
	 * Adds the required order base service data.
244
	 *
245
	 * @param \Aimeos\MShop\Common\Manager\Iface $orderBaseManager Order base manager
246
	 * @param array $bases Associative list of key/list pairs
247
	 * @param array $testdata Associative list of key/list pairs
248
	 * @return array Associative list of enhanced order base items
249
	 * @throws \Aimeos\MW\Setup\Exception If no type ID is found
250
	 */
251
	protected function addOrderBaseServiceData( \Aimeos\MShop\Common\Manager\Iface $orderBaseManager,
252
		array $bases, array $testdata )
253
	{
254
		$ordServices = [];
255
		$servIds = $this->getServiceIds( $testdata );
256
		$orderBaseServiceManager = $orderBaseManager->getSubManager( 'service', 'Standard' );
257
		$orderBaseServiceAttrManager = $orderBaseServiceManager->getSubManager( 'attribute', 'Standard' );
258
		$priceManager = \Aimeos\MShop::create( $this->additional, 'price' );
259
		$ordServ = $orderBaseServiceManager->create();
260
261
		$orderBaseManager->begin();
262
263
		foreach( $testdata['order/base/service'] as $key => $dataset )
264
		{
265
			if( !isset( $bases['ids'][$dataset['baseid']] ) ) {
266
				throw new \Aimeos\MW\Setup\Exception( sprintf( 'No base ID found for "%1$s" in order base serive data', $dataset['baseid'] ) );
267
			}
268
269
			if( !isset( $bases['items'][$dataset['baseid']] ) ) {
270
				throw new \Aimeos\MW\Setup\Exception( sprintf( 'No base Item found for "%1$s" in order base service data', $dataset['baseid'] ) );
271
			}
272
273
			$ordServ->setId( null );
274
			$ordServ->setBaseId( $bases['ids'][$dataset['baseid']] );
275
			$ordServ->setType( $dataset['type'] );
276
			$ordServ->setCode( $dataset['code'] );
277
			$ordServ->setName( $dataset['name'] );
278
			$ordServ->setMediaUrl( $dataset['mediaurl'] );
279
280
			if( isset( $dataset['servid'] ) ) {
281
				$ordServ->setServiceId( $servIds[$dataset['servid']] );
282
			}
283
284
			$priceItem = $priceManager->create();
285
			$priceItem->setCurrencyId( $dataset['currencyid'] );
286
			$priceItem->setValue( $dataset['price'] );
287
			$priceItem->setCosts( $dataset['shipping'] );
288
			$priceItem->setRebate( $dataset['rebate'] );
289
			$priceItem->setTaxRates( $dataset['taxrates'] );
290
			$ordServ->setPrice( $priceItem );
291
292
			$orderBaseServiceManager->save( $ordServ );
293
294
			$ordServices[$key] = $ordServ->getId();
295
			$bases['items'][$dataset['baseid']]->addService( $ordServ, $dataset['type'] ); //adds Services to orderbase
296
		}
297
298
		$this->addOrderBaseServiceAttributeData( $orderBaseServiceAttrManager, $testdata, $ordServices );
299
300
		$orderBaseManager->commit();
301
302
		return $bases['items'];
303
	}
304
305
306
	/**
307
	 * Adds the required order base product data.
308
	 *
309
	 * @param \Aimeos\MShop\Common\Manager\Iface $orderBaseManager Order Base Manager
310
	 * @param array $bases Associative list of key/list pairs
311
	 * @param array $testdata Associative list of key/list pairs
312
	 * @return array Enhanced list of order base items
313
	 * @throws \Aimeos\MW\Setup\Exception If no type ID is found
314
	 */
315
	protected function addOrderBaseProductData( \Aimeos\MShop\Common\Manager\Iface $orderBaseManager,
316
		array $bases, array $testdata )
317
	{
318
		$ordProds = [];
319
		$products = $this->getProductItems( $testdata );
320
		$orderBaseProductManager = $orderBaseManager->getSubManager( 'product', 'Standard' );
321
		$orderBaseProductAttrManager = $orderBaseProductManager->getSubManager( 'attribute', 'Standard' );
322
		$priceManager = \Aimeos\MShop::create( $this->additional, 'price' );
323
324
		$orderBaseManager->begin();
325
326
		foreach( $testdata['order/base/product'] as $key => $dataset )
327
		{
328
			if( !isset( $bases['ids'][$dataset['baseid']] ) ) {
329
				throw new \Aimeos\MW\Setup\Exception( sprintf( 'No base ID found for "%1$s" in order base product data', $dataset['baseid'] ) );
330
			}
331
332
			if( !isset( $bases['items'][$dataset['baseid']] ) ) {
333
				throw new \Aimeos\MW\Setup\Exception( sprintf( 'No base Item found for "%1$s" in order base product data', $dataset['baseid'] ) );
334
			}
335
336
			$ordProdItem = $orderBaseProductManager->create();
337
338
			$ordProdItem->setId( null );
339
			$ordProdItem->setBaseId( $bases['ids'][$dataset['baseid']] );
340
			$ordProdItem->setType( $dataset['type'] );
341
			$ordProdItem->setSupplierId( $dataset['supplierid'] );
342
			$ordProdItem->setSupplierName( $dataset['suppliername'] );
343
			$ordProdItem->setProductCode( $dataset['prodcode'] );
344
			$ordProdItem->setName( $dataset['name'] );
345
			$ordProdItem->setMediaUrl( $dataset['mediaurl'] );
346
			$ordProdItem->setQuantity( $dataset['amount'] );
347
			$ordProdItem->setFlags( $dataset['flags'] );
348
			$ordProdItem->setStatus( $dataset['status'] );
349
			$ordProdItem->setPosition( $dataset['pos'] );
350
			$ordProdItem->setQuantityOpen( $dataset['qtyopen'] ?? 0 );
351
			$ordProdItem->setNotes( $dataset['notes'] ?? '' );
352
			$ordProdItem->setStockType( $dataset['stocktype'] ?? '' );
353
			$ordProdItem->setTimeFrame( $dataset['timeframe'] ?? '' );
354
355
			if( isset( $dataset['prodid'] ) ) {
356
				$ordProdItem->setProductId( $products[$dataset['prodid']]->getId() );
357
			}
358
359
			// product bundle related fields
360
			if( isset( $dataset['ordprodid'] ) ) {
361
				$ordProdItem->setOrderProductId( $ordProds[$dataset['ordprodid']] );
362
			}
363
364
			$priceItem = $priceManager->create();
365
			$priceItem->setCurrencyId( $dataset['currencyid'] );
366
			$priceItem->setValue( $dataset['price'] );
367
			$priceItem->setCosts( $dataset['shipping'] );
368
			$priceItem->setRebate( $dataset['rebate'] );
369
			$priceItem->setTaxRates( $dataset['taxrates'] );
370
			$ordProdItem->setPrice( $priceItem );
371
372
			$bases['items'][$dataset['baseid']]->addProduct( $ordProdItem, $dataset['pos'] ); //adds Products to orderbase
373
			$ordProds[$key] = $orderBaseProductManager->save( $ordProdItem )->getId();
374
		}
375
376
		$this->addOrderBaseProductAttributeData( $orderBaseProductAttrManager, $testdata, $ordProds, $products );
377
378
		$orderBaseManager->commit();
379
380
		return $bases['items'];
381
	}
382
383
384
	/**
385
	 * Adds the order product attribute test data.
386
	 *
387
	 * @param \Aimeos\MShop\Common\Manager\Iface $manager
388
	 * @param array $testdata
389
	 * @param array $ordProds
390
	 * @param \Aimeos\MShop\Product\Item\Iface[] $products
391
	 * @throws \Aimeos\MW\Setup\Exception
392
	 */
393
	protected function addOrderBaseProductAttributeData( \Aimeos\MShop\Common\Manager\Iface $manager,
394
		array $testdata, array $ordProds, array $products )
395
	{
396
		$attrCodes = [];
397
		$attributeManager = \Aimeos\MShop::create( $this->additional, 'attribute' );
398
		$attributes = $attributeManager->search( $attributeManager->filter() );
399
400
		foreach( $attributes as $attrItem ) {
401
			$attrCodes[$attrItem->getType()][] = $attrItem;
402
		}
403
404
		$ordProdAttr = $manager->create();
405
406
		foreach( $testdata['order/base/product/attr'] as $dataset )
407
		{
408
			if( !isset( $ordProds[$dataset['ordprodid']] ) ) {
409
				throw new \Aimeos\MW\Setup\Exception( sprintf( 'No order product ID found for "%1$s"', $dataset['ordprodid'] ) );
410
			}
411
412
			$ordProdAttr->setId( null );
413
			$ordProdAttr->setParentId( $ordProds[$dataset['ordprodid']] );
414
			$ordProdAttr->setCode( $dataset['code'] );
415
			$ordProdAttr->setValue( $dataset['value'] );
416
			$ordProdAttr->setName( $dataset['name'] );
417
			$ordProdAttr->setQuantity( $dataset['quantity'] );
418
419
			if( isset( $attrCodes[$dataset['code']] ) )
420
			{
421
				foreach( (array) $attrCodes[$dataset['code']] as $attrItem )
422
				{
423
					if( $attrItem->getCode() == $dataset['value'] ) {
424
						$ordProdAttr->setAttributeId( $attrItem->getId() );
425
					}
426
				}
427
			}
428
429
			if( isset( $dataset['type'] ) ) {
430
				$ordProdAttr->setType( $dataset['type'] );
431
			}
432
433
			$manager->save( $ordProdAttr, false );
434
		}
435
	}
436
437
438
	/**
439
	 * Adds the order service attributes.
440
	 *
441
	 * @param \Aimeos\MShop\Common\Manager\Iface $manager
442
	 * @param array $testdata
443
	 * @param array $ordServices
444
	 * @throws \Aimeos\MW\Setup\Exception
445
	 */
446
	protected function addOrderBaseServiceAttributeData( \Aimeos\MShop\Common\Manager\Iface $manager,
447
		array $testdata, array $ordServices )
448
	{
449
		$ordServAttr = $manager->create();
450
451
		foreach( $testdata['order/base/service/attr'] as $dataset )
452
		{
453
			if( !isset( $ordServices[$dataset['ordservid']] ) ) {
454
				throw new \Aimeos\MW\Setup\Exception( sprintf( 'No order service ID found for "%1$s"', $dataset['ordservid'] ) );
455
			}
456
457
			$ordServAttr->setId( null );
458
			$ordServAttr->setParentId( $ordServices[$dataset['ordservid']] );
459
			$ordServAttr->setCode( $dataset['code'] );
460
			$ordServAttr->setValue( $dataset['value'] );
461
			$ordServAttr->setName( $dataset['name'] );
462
			$ordServAttr->setType( $dataset['type'] );
463
			$ordServAttr->setQuantity( $dataset['quantity'] );
464
465
			if( isset( $dataset['attrid'] ) ) {
466
				$ordServAttr->setAttributeId( $dataset['attrid'] );
467
			}
468
469
			$manager->save( $ordServAttr, false );
470
		}
471
	}
472
473
474
	/**
475
	 * Adds the order test data.
476
	 *
477
	 * @param \Aimeos\MShop\Common\Manager\Iface $orderManager Order manager
478
	 * @param array $baseIds List of ids
479
	 * @param array $testdata Associative list of key/list pairs
480
	 * @throws \Aimeos\MW\Setup\Exception If no type ID is found
481
	 */
482
	protected function addOrderData( \Aimeos\MShop\Common\Manager\Iface $orderManager, array $baseIds, array $testdata )
483
	{
484
		$orderStatusManager = $orderManager->getSubManager( 'status', 'Standard' );
485
486
		$ords = [];
487
		$ordItem = $orderManager->create();
488
489
		$orderManager->begin();
490
491
		foreach( $testdata['order'] as $key => $dataset )
492
		{
493
			if( !isset( $baseIds[$dataset['baseid']] ) ) {
494
				throw new \Aimeos\MW\Setup\Exception( sprintf( 'No base ID found for "%1$s"', $dataset['baseid'] ) );
495
			}
496
497
			$ordItem->setId( null );
498
			$ordItem->setType( $dataset['type'] );
499
			$ordItem->setBaseId( $baseIds[$dataset['baseid']] );
500
			$ordItem->setDeliveryStatus( $dataset['statusdelivery'] );
501
			$ordItem->setPaymentStatus( $dataset['statuspayment'] );
502
			$ordItem->setDateDelivery( $dataset['datedelivery'] );
503
			$ordItem->setDatePayment( $dataset['datepayment'] );
504
			$ordItem->setRelatedId( $dataset['relatedid'] );
505
506
			$orderManager->save( $ordItem );
507
			$ords[$key] = $ordItem->getId();
508
		}
509
510
		$ordStat = $orderStatusManager->create();
511
		foreach( $testdata['order/status'] as $dataset )
512
		{
513
			if( !isset( $ords[$dataset['parentid']] ) ) {
514
				throw new \Aimeos\MW\Setup\Exception( sprintf( 'No order ID found for "%1$s"', $dataset['parentid'] ) );
515
			}
516
517
			$ordStat->setId( null );
518
			$ordStat->setParentId( $ords[$dataset['parentid']] );
519
			$ordStat->setType( $dataset['type'] );
520
			$ordStat->setValue( $dataset['value'] );
521
522
			$orderStatusManager->save( $ordStat, false );
523
		}
524
525
		$orderManager->commit();
526
	}
527
528
529
	/**
530
	 * Returns the customer IDs for the given test data.
531
	 *
532
	 * @param array $testdata Test data
533
	 * @return array Customer Ids
534
	 */
535
	protected function getCustomerIds( array $testdata )
536
	{
537
		$customercodes = $customerIds = [];
538
539
		foreach( $testdata['order/base'] as $key => $dataset ) {
540
			$customercodes[] = $dataset['customerid'];
541
		}
542
543
		$customerManager = \Aimeos\MShop::create( $this->additional, 'customer' );
544
		$search = $customerManager->filter();
545
		$search->setConditions( $search->compare( '==', 'customer.code', $customercodes ) );
546
547
		foreach( $customerManager->search( $search ) as $id => $customerItem ) {
548
			$customerIds[$customerItem->getCode()] = $id;
549
		}
550
551
		return $customerIds;
552
	}
553
554
555
	/**
556
	 * Returns the product items for the given test data.
557
	 *
558
	 * @param array $testdata Test data
559
	 * @return \Aimeos\MShop\Product\Item\Iface[] Product Items
560
	 */
561
	protected function getProductItems( array $testdata )
562
	{
563
		$codes = $items = [];
564
		$productManager = \Aimeos\MShop::create( $this->additional, 'product' );
565
566
		foreach( $testdata['order/base/product'] as $key => $dataset )
567
		{
568
			if( isset( $dataset['prodid'] ) ) {
569
				$codes[$key] = $dataset['prodid'];
570
			}
571
		}
572
573
		$search = $productManager->filter();
574
		$search->setConditions( $search->compare( '==', 'product.code', $codes ) );
575
		$result = $productManager->search( $search );
576
577
		foreach( $result as $item ) {
578
			$items[$item->getCode()] = $item;
579
		}
580
581
		return $items;
582
	}
583
584
585
	/**
586
	 * Returns the service item IDs for the given test data.
587
	 *
588
	 * @param array $testdata Test data
589
	 * @return array List of service IDs
590
	 */
591
	protected function getServiceIds( array $testdata )
592
	{
593
		$services = $servIds = [];
594
		$serviceManager = \Aimeos\MShop::create( $this->additional, 'service' );
595
596
		foreach( $testdata['order/base/service'] as $key => $dataset )
597
		{
598
			if( isset( $dataset['servid'] ) ) {
599
				$services[$key] = $dataset['servid'];
600
			}
601
		}
602
603
		$search = $serviceManager->filter();
604
		$search->setConditions( $search->compare( '==', 'service.code', $services ) );
605
		$servicesResult = $serviceManager->search( $search );
606
607
		foreach( $servicesResult as $id => $service ) {
608
			$servIds[$service->getCode()] = $id;
609
		}
610
611
		return $servIds;
612
	}
613
}
614