CheckoutApiTester::havePaymentMethodWithStore()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 21
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 9
dl 0
loc 21
rs 9.9666
c 0
b 0
f 0
cc 1
nc 1
nop 2
1
<?php
2
3
/**
4
 * This file is part of the Spryker Commerce OS.
5
 * For full license information, please view the LICENSE file that was distributed with this source code.
6
 */
7
8
declare(strict_types = 1);
9
10
namespace PyzTest\Glue\Checkout;
11
12
use ArrayObject;
13
use DateTime;
14
use Generated\Shared\DataBuilder\AddressBuilder;
15
use Generated\Shared\DataBuilder\CustomerBuilder;
16
use Generated\Shared\DataBuilder\ItemBuilder;
17
use Generated\Shared\DataBuilder\ShipmentBuilder;
18
use Generated\Shared\DataBuilder\StoreRelationBuilder;
19
use Generated\Shared\Transfer\AddressTransfer;
20
use Generated\Shared\Transfer\CompanyUnitAddressTransfer;
21
use Generated\Shared\Transfer\CustomerTransfer;
22
use Generated\Shared\Transfer\ItemTransfer;
23
use Generated\Shared\Transfer\MerchantTransfer;
24
use Generated\Shared\Transfer\MoneyValueTransfer;
25
use Generated\Shared\Transfer\PaymentMethodTransfer;
26
use Generated\Shared\Transfer\PriceProductOfferTransfer;
27
use Generated\Shared\Transfer\PriceProductTransfer;
28
use Generated\Shared\Transfer\ProductConcreteTransfer;
29
use Generated\Shared\Transfer\ProductOfferStockTransfer;
30
use Generated\Shared\Transfer\ProductOfferTransfer;
31
use Generated\Shared\Transfer\QuoteTransfer;
32
use Generated\Shared\Transfer\RestAddressTransfer;
33
use Generated\Shared\Transfer\RestCheckoutDataTransfer;
34
use Generated\Shared\Transfer\RestCheckoutResponseTransfer;
35
use Generated\Shared\Transfer\RestCustomerTransfer;
36
use Generated\Shared\Transfer\RestOrderDetailsAttributesTransfer;
37
use Generated\Shared\Transfer\RestPaymentTransfer;
38
use Generated\Shared\Transfer\RestShipmentsTransfer;
39
use Generated\Shared\Transfer\RestShipmentTransfer;
40
use Generated\Shared\Transfer\ShipmentMethodTransfer;
41
use Generated\Shared\Transfer\ShipmentTransfer;
42
use Generated\Shared\Transfer\StockProductTransfer;
43
use Generated\Shared\Transfer\StockTransfer;
44
use Generated\Shared\Transfer\StoreRelationTransfer;
45
use Generated\Shared\Transfer\StoreTransfer;
46
use Generated\Shared\Transfer\TotalsTransfer;
47
use Spryker\Glue\CheckoutRestApi\CheckoutRestApiConfig;
48
use Spryker\Glue\GlueApplication\Rest\RequestConstantsInterface;
49
use Spryker\Glue\OrdersRestApi\OrdersRestApiConfig;
50
use Spryker\Shared\Price\PriceConfig;
51
use Spryker\Shared\Shipment\ShipmentConfig;
52
use Spryker\Zed\Cart\Business\CartFacadeInterface;
53
use Spryker\Zed\Customer\Business\CustomerFacadeInterface;
54
use Spryker\Zed\Store\Business\StoreFacadeInterface;
55
use SprykerTest\Glue\Testify\Tester\ApiEndToEndTester;
56
57
/**
58
 * Inherited Methods
59
 *
60
 * @method void wantToTest($text)
61
 * @method void wantTo($text)
62
 * @method void execute($callable)
63
 * @method void expectTo($prediction)
64
 * @method void expect($prediction)
65
 * @method void amGoingTo($argumentation)
66
 * @method void am($role)
67
 * @method void lookForwardTo($achieveValue)
68
 * @method void comment($description)
69
 * @method \Codeception\Lib\Friend haveFriend($name, $actorClass = null)
70
 *
71
 * @SuppressWarnings(\PyzTest\Glue\Checkout\PHPMD)
72
 */
73
class CheckoutApiTester extends ApiEndToEndTester
74
{
75
    use _generated\CheckoutApiTesterActions;
76
77
    /**
78
     * @var string
79
     */
80
    protected const REQUEST_PARAM_PAYMENT_METHOD_NAME_INVOICE = 'Invoice';
81
82
    /**
83
     * @var string
84
     */
85
    protected const REQUEST_PARAM_PAYMENT_PROVIDER_NAME_DUMMY_PAYMENT = 'DummyMarketplacePayment';
86
87
    /**
88
     * @var string
89
     */
90
    protected const QUOTE_ITEM_OVERRIDE_DATA_PRODUCT = 'product';
91
92
    /**
93
     * @var string
94
     */
95
    protected const QUOTE_ITEM_OVERRIDE_DATA_SHIPMENT = 'shipment';
96
97
    /**
98
     * @var string
99
     */
100
    protected const QUOTE_ITEM_OVERRIDE_DATA_QUANTITY = 'quantity';
101
102
    /**
103
     * @var int
104
     */
105
    protected const DEFAULT_QUOTE_ITEM_QUANTITY = 10;
106
107
    /**
108
     * @return void
109
     */
110
    public function assertCheckoutResponseResourceHasCorrectData(): void
111
    {
112
        $this->amSure('The returned resource id should be null')
113
            ->whenI()
114
            ->seeSingleResourceIdEqualTo('');
0 ignored issues
show
Bug introduced by
It seems like seeSingleResourceIdEqualTo() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

114
            ->/** @scrutinizer ignore-call */ seeSingleResourceIdEqualTo('');
Loading history...
115
116
        $attributes = $this->getDataFromResponseByJsonPath('$.data.attributes');
117
118
        $this->assertNotEmpty(
119
            $attributes[RestCheckoutResponseTransfer::ORDER_REFERENCE],
120
            'The returned resource attributes order reference should not be empty',
121
        );
122
        $this->assertArrayHasKey(
123
            RestCheckoutResponseTransfer::IS_EXTERNAL_REDIRECT,
124
            $attributes,
125
            'The returned resource attributes should have an external redirect key',
126
        );
127
        $this->assertArrayHasKey(
128
            RestCheckoutResponseTransfer::REDIRECT_URL,
129
            $attributes,
130
            'The returned resource attributes should have a redirect URL key',
131
        );
132
    }
133
134
    /**
135
     * @return void
136
     */
137
    public function assertCheckoutDataResponseResourceHasCorrectData(): void
138
    {
139
        $this->amSure('The returned resource id should be null')
140
            ->whenI()
141
            ->seeSingleResourceIdEqualTo('');
142
143
        $attributes = $this->getDataFromResponseByJsonPath('$.data.attributes');
144
145
        $this->assertEmpty(
146
            $attributes[RestCheckoutDataTransfer::ADDRESSES],
147
            'The returned resource attributes addresses should be an empty array',
148
        );
149
    }
150
151
    /**
152
     * @param int $price
153
     *
154
     * @return void
155
     */
156
    public function assertShipmentExpensesHaveCorrectPrice(int $price): void
157
    {
158
        $this->amSure('The returned resource should have included orders resource')
159
            ->whenI()
160
            ->seeIncludesContainResourceOfType(OrdersRestApiConfig::RESOURCE_ORDERS);
0 ignored issues
show
Bug introduced by
It seems like seeIncludesContainResourceOfType() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

160
            ->/** @scrutinizer ignore-call */ seeIncludesContainResourceOfType(OrdersRestApiConfig::RESOURCE_ORDERS);
Loading history...
161
162
        $ordersAttributes = $this->getDataFromResponseByJsonPath(
163
            sprintf('$.included[?(@.type == %1$s)].attributes', json_encode(OrdersRestApiConfig::RESOURCE_ORDERS)),
164
        );
165
166
        $this->assertNotNull($ordersAttributes);
167
        $this->assertCount(1, $ordersAttributes);
168
        $restOrdersDetailsAttributesTransfer = (new RestOrderDetailsAttributesTransfer())->fromArray($ordersAttributes[0], true);
169
        $this->assertCount(1, $restOrdersDetailsAttributesTransfer->getExpenses());
170
171
        /** @var \Generated\Shared\Transfer\RestOrderExpensesAttributesTransfer $restOrderExpensesAttributesTransfer */
172
        $restOrderExpensesAttributesTransfer = $restOrdersDetailsAttributesTransfer->getExpenses()->getIterator()->current();
173
        $this->assertSame(ShipmentConfig::SHIPMENT_EXPENSE_TYPE, $restOrderExpensesAttributesTransfer->getType());
174
        $this->assertSame($price, $restOrderExpensesAttributesTransfer->getSumPrice());
175
    }
176
177
    /**
178
     * @param array<string> $includes
179
     *
180
     * @return string
181
     */
182
    public function buildCheckoutUrl(array $includes = []): string
183
    {
184
        return $this->formatFullUrl(
185
            '{resourceCheckout}' . $this->formatQueryInclude($includes),
186
            [
187
                'resourceCheckout' => CheckoutRestApiConfig::RESOURCE_CHECKOUT,
188
            ],
189
        );
190
    }
191
192
    /**
193
     * @param array<string> $includes
194
     *
195
     * @return string
196
     */
197
    public function buildCheckoutDataUrl(array $includes = []): string
198
    {
199
        return $this->formatFullUrl(
200
            '{resourceCheckoutData}' . $this->formatQueryInclude($includes),
201
            [
202
                'resourceCheckoutData' => CheckoutRestApiConfig::RESOURCE_CHECKOUT_DATA,
203
            ],
204
        );
205
    }
206
207
    /**
208
     * @return \Spryker\Zed\Store\Business\StoreFacadeInterface
209
     */
210
    public function getStoreFacade(): StoreFacadeInterface
211
    {
212
        return $this->getLocator()
213
            ->store()
214
            ->facade();
215
    }
216
217
    /**
218
     * @return \Spryker\Zed\Customer\Business\CustomerFacadeInterface
219
     */
220
    public function getCustomerFacade(): CustomerFacadeInterface
221
    {
222
        return $this->getLocator()
223
            ->customer()
224
            ->facade();
225
    }
226
227
    /**
228
     * @return \Spryker\Zed\Cart\Business\CartFacadeInterface
229
     */
230
    public function getCartFacade(): CartFacadeInterface
231
    {
232
        return $this->getLocator()->cart()->facade();
233
    }
234
235
    /**
236
     * @param \Generated\Shared\Transfer\AddressTransfer $addressTransfer
237
     *
238
     * @return array
239
     */
240
    public function getAddressRequestPayload(AddressTransfer $addressTransfer): array
241
    {
242
        return [
243
            RestAddressTransfer::SALUTATION => $addressTransfer->getSalutation(),
244
            RestAddressTransfer::FIRST_NAME => $addressTransfer->getFirstName(),
245
            RestAddressTransfer::LAST_NAME => $addressTransfer->getLastName(),
246
            RestAddressTransfer::ADDRESS1 => $addressTransfer->getAddress1(),
247
            RestAddressTransfer::ADDRESS2 => $addressTransfer->getAddress2(),
248
            RestAddressTransfer::ADDRESS3 => $addressTransfer->getAddress3(),
249
            RestAddressTransfer::ZIP_CODE => $addressTransfer->getZipCode(),
250
            RestAddressTransfer::CITY => $addressTransfer->getCity(),
251
            RestAddressTransfer::ISO2_CODE => $addressTransfer->getIso2Code(),
252
            RestAddressTransfer::PHONE => $addressTransfer->getPhone(),
253
            RestCustomerTransfer::EMAIL => $addressTransfer->getEmail(),
254
            RestAddressTransfer::IS_DEFAULT_BILLING => $addressTransfer->getIsDefaultBilling(),
255
            RestAddressTransfer::IS_DEFAULT_SHIPPING => $addressTransfer->getIsDefaultShipping(),
256
        ];
257
    }
258
259
    /**
260
     * @param \Generated\Shared\Transfer\CustomerTransfer $customerTransfer
261
     *
262
     * @return array
263
     */
264
    public function getCustomerRequestPayload(CustomerTransfer $customerTransfer): array
265
    {
266
        return [
267
            RestCustomerTransfer::SALUTATION => $customerTransfer->getSalutation(),
268
            RestCustomerTransfer::FIRST_NAME => $customerTransfer->getFirstName(),
269
            RestCustomerTransfer::LAST_NAME => $customerTransfer->getLastName(),
270
            RestCustomerTransfer::EMAIL => $customerTransfer->getEmail(),
271
        ];
272
    }
273
274
    /**
275
     * @param string $paymentMethodName
276
     * @param string $paymentProviderName
277
     *
278
     * @return array
279
     */
280
    public function getPaymentRequestPayload(
281
        string $paymentMethodName = self::REQUEST_PARAM_PAYMENT_METHOD_NAME_INVOICE,
282
        string $paymentProviderName = self::REQUEST_PARAM_PAYMENT_PROVIDER_NAME_DUMMY_PAYMENT,
283
    ): array {
284
        return [
285
            [
286
                RestPaymentTransfer::PAYMENT_METHOD_NAME => $paymentMethodName,
287
                RestPaymentTransfer::PAYMENT_PROVIDER_NAME => $paymentProviderName,
288
            ],
289
        ];
290
    }
291
292
    /**
293
     * @param int $idShipmentMethod
294
     *
295
     * @return array
296
     */
297
    public function getShipmentRequestPayload(int $idShipmentMethod): array
298
    {
299
        return [
300
            RestShipmentTransfer::ID_SHIPMENT_METHOD => $idShipmentMethod,
301
        ];
302
    }
303
304
    /**
305
     * @param \Generated\Shared\Transfer\ItemTransfer $itemTransfer
306
     * @param \Generated\Shared\Transfer\AddressTransfer|null $addressTransfer
307
     *
308
     * @return array<string, mixed>
309
     */
310
    public function getSplitShipmentRequestPayload(ItemTransfer $itemTransfer, ?AddressTransfer $addressTransfer = null): array
311
    {
312
        $shippingAddressPayload = $addressTransfer
313
            ? [RestAddressTransfer::ID => $addressTransfer->getUuidOrFail()]
314
            : $this->getAddressRequestPayload($itemTransfer->getShipmentOrFail()->getShippingAddressOrFail());
315
316
        return [
317
            RestShipmentsTransfer::ID_SHIPMENT_METHOD => $itemTransfer->getShipmentOrFail()->getMethodOrFail()->getIdShipmentMethodOrFail(),
318
            RestShipmentsTransfer::ITEMS => [$itemTransfer->getGroupKeyOrFail()],
319
            RestShipmentsTransfer::SHIPPING_ADDRESS => $shippingAddressPayload,
320
            RestShipmentsTransfer::REQUESTED_DELIVERY_DATE => (new DateTime('tomorrow'))->format('Y-m-d'),
321
        ];
322
    }
323
324
    /**
325
     * @param \Generated\Shared\Transfer\ProductConcreteTransfer $productConcreteTransfer
326
     * @param \Generated\Shared\Transfer\ShipmentMethodTransfer $shipmentMethodTransfer
327
     * @param int $quantity
328
     *
329
     * @return array
330
     */
331
    public function getQuoteItemOverrideData(
332
        ProductConcreteTransfer $productConcreteTransfer,
333
        ShipmentMethodTransfer $shipmentMethodTransfer,
334
        int $quantity = self::DEFAULT_QUOTE_ITEM_QUANTITY,
335
    ): array {
336
        return [
337
            static::QUOTE_ITEM_OVERRIDE_DATA_PRODUCT => $productConcreteTransfer,
338
            static::QUOTE_ITEM_OVERRIDE_DATA_SHIPMENT => [
339
                ShipmentTransfer::METHOD => $shipmentMethodTransfer,
340
            ],
341
            static::QUOTE_ITEM_OVERRIDE_DATA_QUANTITY => $quantity,
342
        ];
343
    }
344
345
    /**
346
     * @param \Generated\Shared\Transfer\CustomerTransfer $customerTransfer
347
     *
348
     * @return void
349
     */
350
    public function authorizeCustomerToGlue(CustomerTransfer $customerTransfer): void
351
    {
352
        $oauthResponseTransfer = $this->haveAuthorizationToGlue($customerTransfer);
353
        $this->amBearerAuthenticated($oauthResponseTransfer->getAccessToken());
354
    }
355
356
    /**
357
     * @param \Generated\Shared\Transfer\CustomerTransfer $customerTransfer
358
     * @param array $overrideItems
359
     * @param string $priceMode
360
     *
361
     * @return \Generated\Shared\Transfer\QuoteTransfer
362
     */
363
    public function havePersistentQuoteWithItemsAndItemLevelShipment(
364
        CustomerTransfer $customerTransfer,
365
        array $overrideItems = [],
366
        string $priceMode = PriceConfig::PRICE_MODE_GROSS,
367
    ): QuoteTransfer {
368
        return $this->havePersistentQuote([
369
            QuoteTransfer::CUSTOMER => $customerTransfer,
370
            QuoteTransfer::TOTALS => (new TotalsTransfer())
371
                ->setSubtotal(random_int(1000, 10000))
372
                ->setPriceToPay(random_int(1000, 10000)),
373
            QuoteTransfer::ITEMS => $this->mapProductConcreteTransfersToQuoteTransferItemsWithItemLevelShipment($overrideItems),
374
            QuoteTransfer::STORE => [StoreTransfer::NAME => 'DE'],
375
            QuoteTransfer::PRICE_MODE => $priceMode,
376
            QuoteTransfer::BILLING_ADDRESS => (new AddressBuilder())->build(),
377
        ]);
378
    }
379
380
    /**
381
     * @param array $overrideCustomer
382
     *
383
     * @return \Generated\Shared\Transfer\QuoteTransfer
384
     */
385
    public function haveEmptyPersistentQuote(array $overrideCustomer = []): QuoteTransfer
386
    {
387
        return $this->havePersistentQuote([
388
            QuoteTransfer::CUSTOMER => (new CustomerBuilder($overrideCustomer))->build(),
389
            QuoteTransfer::BILLING_ADDRESS => (new AddressBuilder())->build(),
390
        ]);
391
    }
392
393
    /**
394
     * @return \Generated\Shared\Transfer\ProductConcreteTransfer
395
     */
396
    public function haveProductWithStock(): ProductConcreteTransfer
397
    {
398
        $productConcreteTransfer = $this->haveFullProduct();
399
400
        $this->haveProductInStockForStore($this->getStoreFacade()->getCurrentStore(), [
401
            StockProductTransfer::SKU => $productConcreteTransfer->getSku(),
402
            StockProductTransfer::IS_NEVER_OUT_OF_STOCK => 1,
403
        ]);
404
405
        $priceProductOverride = [
406
            PriceProductTransfer::SKU_PRODUCT_ABSTRACT => $productConcreteTransfer->getAbstractSku(),
407
            PriceProductTransfer::SKU_PRODUCT => $productConcreteTransfer->getSku(),
408
            PriceProductTransfer::ID_PRODUCT => $productConcreteTransfer->getIdProductConcrete(),
409
            PriceProductTransfer::PRICE_TYPE_NAME => 'DEFAULT',
410
            PriceProductTransfer::MONEY_VALUE => [
411
                MoneyValueTransfer::NET_AMOUNT => 770,
412
                MoneyValueTransfer::GROSS_AMOUNT => 880,
413
            ],
414
        ];
415
        $this->havePriceProduct($priceProductOverride);
416
417
        return $productConcreteTransfer;
418
    }
419
420
    /**
421
     * @param array $override
422
     *
423
     * @return \Generated\Shared\Transfer\CustomerTransfer
424
     */
425
    public function createCustomerTransfer(array $override = []): CustomerTransfer
426
    {
427
        return (new CustomerBuilder($override))->build();
428
    }
429
430
    /**
431
     * @param array $override
432
     *
433
     * @return \Generated\Shared\Transfer\CustomerTransfer
434
     */
435
    public function haveCustomerWithPersistentAddress(array $override = []): CustomerTransfer
436
    {
437
        $customerTransfer = $this->haveCustomer($override);
438
439
        return $this->haveAddressForCustomer($customerTransfer);
440
    }
441
442
    /**
443
     * @param array $paymentMethodOverrideData
444
     * @param array $storeOverrideData
445
     *
446
     * @return \Generated\Shared\Transfer\PaymentMethodTransfer
447
     */
448
    public function havePaymentMethodWithStore(
449
        array $paymentMethodOverrideData = [],
450
        array $storeOverrideData = [
451
            StoreTransfer::NAME => 'DE',
452
            StoreTransfer::DEFAULT_CURRENCY_ISO_CODE => 'EUR',
453
            StoreTransfer::AVAILABLE_CURRENCY_ISO_CODES => ['EUR'],
454
        ],
455
    ): PaymentMethodTransfer {
456
        $storeTransfer = $this->haveStore($storeOverrideData);
457
        $storeRelationTransfer = (new StoreRelationBuilder())->seed([
458
            StoreRelationTransfer::ID_STORES => [
459
                $storeTransfer->getIdStore(),
460
            ],
461
            StoreRelationTransfer::STORES => [
462
                $storeTransfer,
463
            ],
464
        ])->build();
465
466
        $paymentMethodOverrideData = array_merge($paymentMethodOverrideData, [PaymentMethodTransfer::STORE_RELATION => $storeRelationTransfer]);
467
468
        return $this->havePaymentMethod($paymentMethodOverrideData);
469
    }
470
471
    /**
472
     * @param \Generated\Shared\Transfer\MerchantTransfer $merchantTransfer
473
     * @param \Generated\Shared\Transfer\ProductConcreteTransfer $productConcreteTransfer
474
     *
475
     * @return \Generated\Shared\Transfer\ProductOfferTransfer
476
     */
477
    public function createProductOfferWithStock(
478
        MerchantTransfer $merchantTransfer,
479
        ProductConcreteTransfer $productConcreteTransfer,
480
    ): ProductOfferTransfer {
481
        $storeTransfer = $this->getStoreFacade()->getCurrentStore();
482
483
        $productOfferTransfer = $this->haveProductOffer([
484
            ProductOfferTransfer::CONCRETE_SKU => $productConcreteTransfer->getSkuOrFail(),
485
            ProductOfferTransfer::ID_PRODUCT_CONCRETE => $productConcreteTransfer->getIdProductConcreteOrFail(),
486
            ProductOfferTransfer::STORES => new ArrayObject([$storeTransfer]),
487
            ProductOfferTransfer::MERCHANT_REFERENCE => $merchantTransfer->getMerchantReferenceOrFail(),
488
        ]);
489
490
        $productOfferStockTransfer = $this->haveProductOfferStock([
491
            ProductOfferStockTransfer::ID_PRODUCT_OFFER => $productOfferTransfer->getIdProductOfferOrFail(),
492
            ProductOfferStockTransfer::QUANTITY => 1,
493
            ProductOfferStockTransfer::IS_NEVER_OUT_OF_STOCK => 1,
494
            ProductOfferStockTransfer::STOCK => [
495
                StockTransfer::STORE_RELATION => [
496
                    StoreRelationTransfer::ID_STORES => [$storeTransfer->getIdStore()],
497
                ],
498
            ],
499
        ]);
500
501
        $this->updateStock($productOfferStockTransfer->getStock()->setIsActive(true));
502
503
        $this->havePriceProductOffer([
504
            PriceProductOfferTransfer::FK_PRODUCT_OFFER => $productOfferTransfer->getIdProductOfferOrFail(),
505
            PriceProductTransfer::SKU_PRODUCT => $productConcreteTransfer->getSkuOrFail(),
506
            PriceProductTransfer::SKU_PRODUCT_ABSTRACT => $productConcreteTransfer->getAbstractSkuOrFail(),
507
            PriceProductTransfer::PRICE_TYPE_NAME => 'DEFAULT',
508
            PriceProductTransfer::MONEY_VALUE => [
509
                MoneyValueTransfer::NET_AMOUNT => 770,
510
                MoneyValueTransfer::GROSS_AMOUNT => 880,
511
            ],
512
        ]);
513
514
        return $productOfferTransfer;
515
    }
516
517
    /**
518
     * @param \Generated\Shared\Transfer\ItemTransfer $itemTransfer
519
     * @param \Generated\Shared\Transfer\CompanyUnitAddressTransfer $companyUnitAddressTransfer
520
     *
521
     * @return array<string, mixed>
522
     */
523
    public function getSplitShipmentRequestPayloadWithCompanyBusinessUnitAddress(
524
        ItemTransfer $itemTransfer,
525
        CompanyUnitAddressTransfer $companyUnitAddressTransfer,
526
    ): array {
527
        return [
528
            RestShipmentsTransfer::ID_SHIPMENT_METHOD => $itemTransfer->getShipmentOrFail()->getMethodOrFail()->getIdShipmentMethodOrFail(),
529
            RestShipmentsTransfer::ITEMS => [$itemTransfer->getGroupKeyOrFail()],
530
            RestShipmentsTransfer::SHIPPING_ADDRESS => [
531
                RestAddressTransfer::ID_COMPANY_BUSINESS_UNIT_ADDRESS => $companyUnitAddressTransfer->getUuidOrFail(),
532
            ],
533
            RestShipmentsTransfer::REQUESTED_DELIVERY_DATE => (new DateTime('tomorrow'))->format('Y-m-d'),
534
        ];
535
    }
536
537
    /**
538
     * @param \Generated\Shared\Transfer\AddressTransfer $addressTransfer
539
     *
540
     * @return void
541
     */
542
    public function assertCustomerBillingAddressInOrders(AddressTransfer $addressTransfer): void
543
    {
544
        $jsonPath = sprintf('$..included[?(@.type == \'%s\')]', 'orders');
545
        $billingAddress = $this->getDataFromResponseByJsonPath($jsonPath)[0]['attributes']['billingAddress'];
546
547
        $this->assertSame($addressTransfer->getAddress1(), $billingAddress['address1']);
548
        $this->assertSame($addressTransfer->getAddress2(), $billingAddress['address2']);
549
        $this->assertSame($addressTransfer->getAddress3(), $billingAddress['address3']);
550
        $this->assertSame($addressTransfer->getCompany(), $billingAddress['company']);
551
        $this->assertSame($addressTransfer->getCity(), $billingAddress['city']);
552
        $this->assertSame($addressTransfer->getZipCode(), $billingAddress['zipCode']);
553
        $this->assertSame($addressTransfer->getIso2Code(), $billingAddress['iso2Code']);
554
    }
555
556
    /**
557
     * @param \Generated\Shared\Transfer\AddressTransfer $addressTransfer
558
     *
559
     * @return void
560
     */
561
    public function assertCustomerShippingAddressInOrderShipments(
562
        AddressTransfer $addressTransfer,
563
    ): void {
564
        $jsonPath = sprintf('$..included[?(@.type == \'%s\')]', 'order-shipments');
565
        $shippingAddress = $this->getDataFromResponseByJsonPath($jsonPath)[0]['attributes']['shippingAddress'];
566
567
        $this->assertSame($addressTransfer->getAddress1(), $shippingAddress['address1']);
568
        $this->assertSame($addressTransfer->getAddress2(), $shippingAddress['address2']);
569
        $this->assertSame($addressTransfer->getAddress3(), $shippingAddress['address3']);
570
        $this->assertSame($addressTransfer->getCompany(), $shippingAddress['company']);
571
        $this->assertSame($addressTransfer->getCity(), $shippingAddress['city']);
572
        $this->assertSame($addressTransfer->getZipCode(), $shippingAddress['zipCode']);
573
        $this->assertSame($addressTransfer->getIso2Code(), $shippingAddress['iso2Code']);
574
    }
575
576
    /**
577
     * @param \Generated\Shared\Transfer\CompanyUnitAddressTransfer $companyUnitAddressTransfer
578
     *
579
     * @return void
580
     */
581
    public function assertCompanyBusinessUnitBillingAddressInOrders(
582
        CompanyUnitAddressTransfer $companyUnitAddressTransfer,
583
    ): void {
584
        $jsonPath = sprintf('$..included[?(@.type == \'%s\')]', 'orders');
585
        $billingAddress = $this->getDataFromResponseByJsonPath($jsonPath)[0]['attributes']['billingAddress'];
586
587
        $this->assertSame($companyUnitAddressTransfer->getAddress1(), $billingAddress['address1']);
588
        $this->assertSame($companyUnitAddressTransfer->getAddress2(), $billingAddress['address2']);
589
        $this->assertSame($companyUnitAddressTransfer->getAddress3(), $billingAddress['address3']);
590
        $this->assertSame($companyUnitAddressTransfer->getCompany()->getName(), $billingAddress['company']);
591
        $this->assertSame($companyUnitAddressTransfer->getCity(), $billingAddress['city']);
592
        $this->assertSame($companyUnitAddressTransfer->getZipCode(), $billingAddress['zipCode']);
593
        $this->assertSame($companyUnitAddressTransfer->getIso2Code(), $billingAddress['iso2Code']);
594
    }
595
596
    /**
597
     * @param \Generated\Shared\Transfer\CompanyUnitAddressTransfer $companyUnitAddressTransfer
598
     *
599
     * @return void
600
     */
601
    public function assertCompanyBusinessUnitShippingAddressInOrderShipments(
602
        CompanyUnitAddressTransfer $companyUnitAddressTransfer,
603
    ): void {
604
        $jsonPath = sprintf('$..included[?(@.type == \'%s\')]', 'order-shipments');
605
        $shippingAddress = $this->getDataFromResponseByJsonPath($jsonPath)[0]['attributes']['shippingAddress'];
606
607
        $this->assertSame($companyUnitAddressTransfer->getAddress1(), $shippingAddress['address1']);
608
        $this->assertSame($companyUnitAddressTransfer->getAddress2(), $shippingAddress['address2']);
609
        $this->assertSame($companyUnitAddressTransfer->getAddress3(), $shippingAddress['address3']);
610
        $this->assertSame($companyUnitAddressTransfer->getCompany()->getName(), $shippingAddress['company']);
611
        $this->assertSame($companyUnitAddressTransfer->getCity(), $shippingAddress['city']);
612
        $this->assertSame($companyUnitAddressTransfer->getZipCode(), $shippingAddress['zipCode']);
613
        $this->assertSame($companyUnitAddressTransfer->getIso2Code(), $shippingAddress['iso2Code']);
614
    }
615
616
    /**
617
     * @param \Generated\Shared\Transfer\CustomerTransfer $customerTransfer
618
     *
619
     * @return \Generated\Shared\Transfer\CustomerTransfer
620
     */
621
    protected function haveAddressForCustomer(CustomerTransfer $customerTransfer): CustomerTransfer
622
    {
623
        $addressTransfer = (new AddressBuilder([
624
            AddressTransfer::EMAIL => $customerTransfer->getEmail(),
625
            AddressTransfer::FK_CUSTOMER => $customerTransfer->getIdCustomer(),
626
            AddressTransfer::FIRST_NAME => $customerTransfer->getFirstName(),
627
            AddressTransfer::LAST_NAME => $customerTransfer->getLastName(),
628
        ]))->build();
629
        $customerFacade = $this->getCustomerFacade();
630
        $customerFacade->createAddress($addressTransfer);
631
632
        return $customerFacade->getCustomer($customerTransfer);
633
    }
634
635
    /**
636
     * @param array $overrideItems
637
     *
638
     * @return array
639
     */
640
    protected function mapProductConcreteTransfersToQuoteTransferItemsWithItemLevelShipment(array $overrideItems = []): array
641
    {
642
        $quoteTransferItems = [];
643
644
        foreach ($overrideItems as $overrideItem) {
645
            $productConcreteTransfer = $this->getProductConcreteTransferFromOverrideItemData($overrideItem);
646
            $overrideShipment = $this->getOverrideShipmentDataFromOverrideItemData($overrideItem);
647
            /** @var \Generated\Shared\Transfer\ProductOfferTransfer|null $productOfferTransfer */
648
            $productOfferTransfer = $productConcreteTransfer->getOffers()->getIterator()->current();
649
650
            $quoteTransferItems[] = (new ItemBuilder([
651
                ItemTransfer::SKU => $productConcreteTransfer->getSku(),
652
                ItemTransfer::GROUP_KEY => $productConcreteTransfer->getSku(),
653
                ItemTransfer::ABSTRACT_SKU => $productConcreteTransfer->getAbstractSku(),
654
                ItemTransfer::ID_PRODUCT_ABSTRACT => $productConcreteTransfer->getFkProductAbstract(),
655
                ItemTransfer::QUANTITY => $this->getQuoteItemQuantityFromOverrideItemData($overrideItem),
656
                ItemTransfer::PRODUCT_OFFER_REFERENCE => $productOfferTransfer?->getProductOfferReference(),
657
                ItemTransfer::MERCHANT_REFERENCE => $productOfferTransfer?->getMerchantReference(),
658
            ]))->withShipment((new ShipmentBuilder($overrideShipment))
659
                ->withMethod()
660
                ->withShippingAddress())
661
                ->build()
662
                ->modifiedToArray();
663
        }
664
665
        return $quoteTransferItems;
666
    }
667
668
    /**
669
     * @param array $overrideItem
670
     *
671
     * @return \Generated\Shared\Transfer\ProductConcreteTransfer
672
     */
673
    protected function getProductConcreteTransferFromOverrideItemData(array $overrideItem): ProductConcreteTransfer
674
    {
675
        return $overrideItem[static::QUOTE_ITEM_OVERRIDE_DATA_PRODUCT];
676
    }
677
678
    /**
679
     * @param array $overrideItem
680
     *
681
     * @return array
682
     */
683
    protected function getOverrideShipmentDataFromOverrideItemData(array $overrideItem): array
684
    {
685
        return $overrideItem[static::QUOTE_ITEM_OVERRIDE_DATA_SHIPMENT];
686
    }
687
688
    /**
689
     * @param array $overrideItem
690
     *
691
     * @return int
692
     */
693
    protected function getQuoteItemQuantityFromOverrideItemData(array $overrideItem): int
694
    {
695
        return $overrideItem[static::QUOTE_ITEM_OVERRIDE_DATA_QUANTITY] ?? static::DEFAULT_QUOTE_ITEM_QUANTITY;
696
    }
697
698
    /**
699
     * @param array<string> $includes
700
     *
701
     * @return string
702
     */
703
    protected function formatQueryInclude(array $includes = []): string
704
    {
705
        if (!$includes) {
706
            return '';
707
        }
708
709
        return sprintf('?%s=%s', RequestConstantsInterface::QUERY_INCLUDE, implode(',', $includes));
710
    }
711
}
712