Passed
Pull Request — master (#809)
by Stanislav
06:02
created

SalesDataHelper::haveFullOrder()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 22
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 12
dl 0
loc 22
rs 9.8666
c 1
b 0
f 0
cc 2
nc 2
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\Shared\SelfServicePortal\Helper;
11
12
use DateTime;
13
use Generated\Shared\Transfer\SaveOrderTransfer;
14
use Orm\Zed\CompanyUser\Persistence\SpyCompanyUserQuery;
15
use Orm\Zed\Payment\Persistence\SpyPaymentMethodQuery;
16
use Orm\Zed\Payment\Persistence\SpySalesPayment;
17
use Orm\Zed\Payment\Persistence\SpySalesPaymentMethodTypeQuery;
18
use Orm\Zed\Sales\Persistence\SpySalesExpense;
19
use Orm\Zed\Sales\Persistence\SpySalesExpenseQuery;
20
use Orm\Zed\Sales\Persistence\SpySalesOrderItem;
21
use Orm\Zed\Sales\Persistence\SpySalesOrderItemMetadata;
22
use Orm\Zed\Sales\Persistence\SpySalesOrderItemMetadataQuery;
23
use Orm\Zed\Sales\Persistence\SpySalesOrderItemQuery;
24
use Orm\Zed\Sales\Persistence\SpySalesOrderQuery;
25
use Orm\Zed\Sales\Persistence\SpySalesShipmentQuery;
26
use Orm\Zed\SelfServicePortal\Persistence\SpySalesOrderItemProductClass;
27
use Orm\Zed\SelfServicePortal\Persistence\SpySalesProductClassQuery;
28
use Spryker\Zed\Sales\SalesConfig;
29
use Spryker\Zed\Shipment\Communication\Plugin\Checkout\SalesOrderShipmentSavePlugin;
30
use SprykerTest\Shared\Sales\Helper\SalesDataHelper as SprykerSalesDataHelper;
31
32
class SalesDataHelper extends SprykerSalesDataHelper
33
{
34
    /**
35
     * @var string
36
     */
37
    protected const SHIPMENT_EXPENSE_TYPE = 'SHIPMENT_EXPENSE_TYPE';
38
39
    /**
40
     * @var string
41
     */
42
    protected const DEFAULT_EXPENSE_NAME = 'test';
43
44
    /**
45
     * @var int
46
     */
47
    protected const DEFAULT_EXPENSE_AMOUNT = 100;
48
49
    /**
50
     * @var string
51
     */
52
    protected const DEFAULT_SUPER_ATTRIBUTES = '{"color":"Black"}';
53
54
    /**
55
     * @var string
56
     */
57
    protected const OVERRIDE_KEY_ITEM = 'item';
58
59
    /**
60
     * @var string
61
     */
62
    protected const OVERRIDE_KEY_SKU = 'sku';
63
64
    /**
65
     * @var string
66
     */
67
    protected const OVERRIDE_KEY_PRODUCT_CLASSES = 'productClasses';
68
69
    /**
70
     * @var string
71
     */
72
    protected const OVERRIDE_KEY_SCHEDULED_AT = 'scheduledAt';
73
74
    /**
75
     * @var string
76
     */
77
    protected const OVERRIDE_KEY_CUSTOMER_REFERENCE = 'customerReference';
78
79
    /**
80
     * @param list<mixed> $override
81
     * @param string|null $stateMachineProcessName
82
     *
83
     * @return \Generated\Shared\Transfer\SaveOrderTransfer
84
     */
85
    public function haveFullOrder(
86
        array $override = [],
87
        ?string $stateMachineProcessName = null,
88
    ): SaveOrderTransfer {
89
        $saveOrderTransfer = $this->haveOrder(
90
            $override,
91
            $stateMachineProcessName,
92
            [new SalesOrderShipmentSavePlugin()],
93
        );
94
95
        $this->updateOrderItems($saveOrderTransfer);
96
        $this->saveSalesExpense($saveOrderTransfer->getIdSalesOrder());
97
98
        if (isset($override[static::OVERRIDE_KEY_ITEM][static::OVERRIDE_KEY_SKU])) {
99
            $this->handleOrderItemProductClasses($override);
100
            $this->handleOrderItemScheduling($override);
101
        }
102
103
        $this->handleCompanyAssignment($saveOrderTransfer, $override);
104
        $this->handlePaymentMethodAssignment($saveOrderTransfer, $stateMachineProcessName);
105
106
        return $saveOrderTransfer;
107
    }
108
109
    /**
110
     * @param list<mixed> $override
111
     *
112
     * @return void
113
     */
114
    protected function handleOrderItemProductClasses(array $override): void
115
    {
116
        if (
117
            !isset($override[static::OVERRIDE_KEY_ITEM][static::OVERRIDE_KEY_PRODUCT_CLASSES]) ||
118
            !is_array($override[static::OVERRIDE_KEY_ITEM][static::OVERRIDE_KEY_PRODUCT_CLASSES])
119
        ) {
120
            return;
121
        }
122
123
        $salesOrderItemEntity = $this->getSalesOrderItemQuery()->findOneBySku($override[static::OVERRIDE_KEY_ITEM][static::OVERRIDE_KEY_SKU]);
124
        if (!$salesOrderItemEntity) {
125
            return;
126
        }
127
128
        foreach ($override[static::OVERRIDE_KEY_ITEM][static::OVERRIDE_KEY_PRODUCT_CLASSES] as $productClassName) {
129
            $this->createOrderItemProductClassRelation($salesOrderItemEntity, $productClassName);
130
        }
131
    }
132
133
    protected function createOrderItemProductClassRelation(SpySalesOrderItem $salesOrderItemEntity, string $productClassName): void
134
    {
135
        $productClassEntity = $this->getSalesProductClassQuery()
136
            ->filterByName($productClassName)
137
            ->findOneOrCreate();
138
139
        if ($productClassEntity->isNew()) {
140
            $productClassEntity->save();
141
        }
142
143
        if (!$productClassEntity) {
144
            return;
145
        }
146
147
        (new SpySalesOrderItemProductClass())
148
            ->setFkSalesOrderItem($salesOrderItemEntity->getIdSalesOrderItem())
149
            ->setFkSalesProductClass($productClassEntity->getIdSalesProductClass())
150
            ->save();
151
    }
152
153
    /**
154
     * @param list<mixed> $override
155
     *
156
     * @return void
157
     */
158
    protected function handleOrderItemScheduling(array $override): void
159
    {
160
        if (!isset($override[static::OVERRIDE_KEY_ITEM][static::OVERRIDE_KEY_SCHEDULED_AT])) {
161
            return;
162
        }
163
164
        $salesOrderItemEntity = $this->getSalesOrderItemQuery()->findOneBySku($override[static::OVERRIDE_KEY_ITEM][static::OVERRIDE_KEY_SKU]);
165
        if (!$salesOrderItemEntity) {
166
            return;
167
        }
168
169
        $salesOrderItemMetadataEntity = $this->getSalesOrderItemMetadataQuery()
170
            ->findOneByFkSalesOrderItem($salesOrderItemEntity->getIdSalesOrderItem());
171
172
        if (!$salesOrderItemMetadataEntity) {
173
            return;
174
        }
175
176
        $scheduledDateTime = new DateTime($override[static::OVERRIDE_KEY_ITEM][static::OVERRIDE_KEY_SCHEDULED_AT]);
177
        $salesOrderItemMetadataEntity->setScheduledAt($scheduledDateTime)->save();
178
    }
179
180
    /**
181
     * @param \Generated\Shared\Transfer\SaveOrderTransfer $saveOrderTransfer
182
     * @param list<mixed> $override
183
     *
184
     * @return void
185
     */
186
    protected function handleCompanyAssignment(SaveOrderTransfer $saveOrderTransfer, array $override): void
187
    {
188
        if (!isset($override[static::OVERRIDE_KEY_CUSTOMER_REFERENCE])) {
189
            return;
190
        }
191
192
        $companyUserEntity = $this->getCompanyUserQuery()
193
            ->useCustomerQuery()
194
            ->filterByCustomerReference($override[static::OVERRIDE_KEY_CUSTOMER_REFERENCE])
195
            ->endUse()
196
            ->findOne();
197
198
        if (!$companyUserEntity) {
199
            return;
200
        }
201
202
        $this->getSalesOrderQuery()
203
            ->findOneByIdSalesOrder($saveOrderTransfer->getIdSalesOrder())
204
            ->setCompanyUuid($companyUserEntity->getCompany()->getUuid())
205
            ->setCompanyBusinessUnitUuid($companyUserEntity->getCompanyBusinessUnit()->getUuid())
206
            ->save();
207
    }
208
209
    protected function handlePaymentMethodAssignment(SaveOrderTransfer $saveOrderTransfer, ?string $stateMachineProcessName): void
210
    {
211
        if (!$stateMachineProcessName) {
212
            return;
213
        }
214
215
        $paymentMethodStatemachineMapping = (new SalesConfig())->getPaymentMethodStatemachineMapping();
216
        $paymentMethod = array_flip($paymentMethodStatemachineMapping)[$stateMachineProcessName] ?? null;
217
218
        if (!$paymentMethod) {
219
            return;
220
        }
221
222
        $this->saveSalesPayment($saveOrderTransfer->getIdSalesOrder(), $paymentMethod);
223
    }
224
225
    protected function updateOrderItems(SaveOrderTransfer $saveOrderTransfer): void
226
    {
227
        foreach ($saveOrderTransfer->getOrderItems() as $orderItemTransfer) {
228
            $salesOrderItemEntity = $this->getSalesOrderItemQuery()
229
                ->findOneByIdSalesOrderItem($orderItemTransfer->getIdSalesOrderItem());
230
231
            if (!$salesOrderItemEntity) {
232
                continue;
233
            }
234
235
            $salesOrderItemEntity
236
                ->setFkSalesShipment($orderItemTransfer->getShipment()->getIdSalesShipment())
237
                ->save();
238
239
            $this->saveOrderItemMetadata($orderItemTransfer->getIdSalesOrderItem());
240
        }
241
    }
242
243
    protected function saveOrderItemMetadata(int $idSalesOrderItem): void
244
    {
245
        $salesOrderItemMetadataEntity = $this->getSalesOrderItemMetadataQuery()
246
            ->findOneByFkSalesOrderItem($idSalesOrderItem);
247
248
        if ($salesOrderItemMetadataEntity) {
249
            return;
250
        }
251
252
        (new SpySalesOrderItemMetadata())
253
            ->setFkSalesOrderItem($idSalesOrderItem)
254
            ->setSuperAttributes(static::DEFAULT_SUPER_ATTRIBUTES)
255
            ->save();
256
    }
257
258
    protected function saveSalesExpense(int $idSalesOrder): void
259
    {
260
        $salesExpenseEntity = $this->getSalesExpenseQuery()->findOneByFkSalesOrder($idSalesOrder);
261
        if ($salesExpenseEntity) {
262
            return;
263
        }
264
265
        $salesExpenseEntity = (new SpySalesExpense())
266
            ->setFkSalesOrder($idSalesOrder)
267
            ->setName(static::DEFAULT_EXPENSE_NAME)
268
            ->setType(static::SHIPMENT_EXPENSE_TYPE)
269
            ->setGrossPrice(static::DEFAULT_EXPENSE_AMOUNT);
270
271
        $salesExpenseEntity->save();
272
273
        $this->getSalesShipmentQuery()
274
            ->findOneByFkSalesOrder($idSalesOrder)
275
            ->setFkSalesExpense($salesExpenseEntity->getIdSalesExpense())
276
            ->save();
277
    }
278
279
    protected function saveSalesPayment(int $idSalesOrder, string $paymentMethod): void
280
    {
281
        $paymentMethodEntity = $this->getPaymentMethodQuery()->findOneByPaymentMethodKey($paymentMethod);
282
        if (!$paymentMethodEntity) {
283
            return;
284
        }
285
286
        $paymentProviderEntity = $paymentMethodEntity->getSpyPaymentProvider();
287
        $salesPaymentMethodTypeEntity = $this->getSalesPaymentMethodTypeQuery()
288
            ->filterByPaymentProvider($paymentProviderEntity->getPaymentProviderKey())
289
            ->filterByPaymentMethod($paymentMethodEntity->getPaymentMethodKey())
290
            ->findOneOrCreate();
291
292
        if ($salesPaymentMethodTypeEntity->isNew()) {
293
            $salesPaymentMethodTypeEntity->save();
294
        }
295
296
        (new SpySalesPayment())
297
            ->setFkSalesOrder($idSalesOrder)
298
            ->setFkSalesPaymentMethodType($salesPaymentMethodTypeEntity->getIdSalesPaymentMethodType())
299
            ->setAmount(static::DEFAULT_EXPENSE_AMOUNT)
300
            ->save();
301
    }
302
303
    protected function getSalesOrderItemQuery(): SpySalesOrderItemQuery
304
    {
305
        return SpySalesOrderItemQuery::create();
306
    }
307
308
    protected function getSalesProductClassQuery(): SpySalesProductClassQuery
309
    {
310
        return SpySalesProductClassQuery::create();
311
    }
312
313
    protected function getCompanyUserQuery(): SpyCompanyUserQuery
314
    {
315
        return SpyCompanyUserQuery::create();
316
    }
317
318
    protected function getSalesOrderQuery(): SpySalesOrderQuery
319
    {
320
        return SpySalesOrderQuery::create();
321
    }
322
323
    protected function getSalesOrderItemMetadataQuery(): SpySalesOrderItemMetadataQuery
324
    {
325
        return SpySalesOrderItemMetadataQuery::create();
326
    }
327
328
    protected function getSalesExpenseQuery(): SpySalesExpenseQuery
329
    {
330
        return SpySalesExpenseQuery::create();
331
    }
332
333
    protected function getSalesShipmentQuery(): SpySalesShipmentQuery
334
    {
335
        return SpySalesShipmentQuery::create();
336
    }
337
338
    protected function getPaymentMethodQuery(): SpyPaymentMethodQuery
339
    {
340
        return SpyPaymentMethodQuery::create();
341
    }
342
343
    protected function getSalesPaymentMethodTypeQuery(): SpySalesPaymentMethodTypeQuery
344
    {
345
        return SpySalesPaymentMethodTypeQuery::create();
346
    }
347
}
348