QuickOrderController   F
last analyzed

Complexity

Total Complexity 62

Size/Duplication

Total Lines 645
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 62
eloc 282
c 0
b 0
f 0
dl 0
loc 645
rs 3.44

25 Methods

Rating   Name   Duplication   Size   Complexity  
A handleUploadOrderForm() 0 16 4
A executeQuickOrderFormSubmitAction() 0 20 4
A getProductPricesFromQuickOrderTransfer() 0 16 3
A executeCreateOrderAction() 0 17 3
A addMessageToQuickOrderItemTransfer() 0 6 1
A getQuickOrderTransfer() 0 19 1
A getProductByQuickOrderItem() 0 15 2
A productAdditionalDataAction() 0 48 3
A executeAddRowsAction() 0 31 1
A clearAllRowsAction() 0 5 1
A addRowsAction() 0 12 2
A handleTextOrderForm() 0 19 5
A downloadTemplateAction() 0 3 1
A executeAddToCartAction() 0 17 3
A transformProductsViewData() 0 5 1
A executeIndexAction() 0 50 3
A processQuickOrderForm() 0 17 3
A executeDownloadTemplateAction() 0 5 1
A indexAction() 0 14 2
A executeQuickOrderFormHandlerStrategyPlugin() 0 19 5
A deleteRowAction() 0 12 2
A filterQuickOrderItems() 0 12 4
A executeDeleteRowAction() 0 35 2
A getProductsFromQuickOrderItems() 0 10 3
A handleQuickOrderForm() 0 13 2

How to fix   Complexity   

Complex Class

Complex classes like QuickOrderController 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 QuickOrderController, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
/**
4
 * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
5
 * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
6
 */
7
8
namespace SprykerShop\Yves\QuickOrderPage\Controller;
9
10
use Generated\Shared\Transfer\MessageTransfer;
11
use Generated\Shared\Transfer\ProductConcreteTransfer;
12
use Generated\Shared\Transfer\QuickOrderItemTransfer;
13
use Generated\Shared\Transfer\QuickOrderTransfer;
14
use Spryker\Yves\Kernel\PermissionAwareTrait;
15
use SprykerShop\Yves\QuickOrderPage\Form\QuickOrderForm;
16
use SprykerShop\Yves\QuickOrderPage\Form\TextOrderForm;
17
use SprykerShop\Yves\QuickOrderPage\Form\UploadOrderForm;
18
use SprykerShop\Yves\QuickOrderPage\Plugin\Router\QuickOrderPageRouteProviderPlugin;
19
use SprykerShop\Yves\ShopApplication\Controller\AbstractController;
20
use Symfony\Component\Form\FormInterface;
21
use Symfony\Component\HttpFoundation\RedirectResponse;
22
use Symfony\Component\HttpFoundation\Request;
23
use Symfony\Component\HttpFoundation\Response;
24
use Symfony\Component\HttpKernel\Exception\HttpException;
25
26
/**
27
 * @method \SprykerShop\Yves\QuickOrderPage\QuickOrderPageFactory getFactory()
28
 */
29
class QuickOrderController extends AbstractController
30
{
31
    use PermissionAwareTrait;
32
33
    public const PARAM_ROW_INDEX = 'row-index';
34
    public const PARAM_QUICK_ORDER_FORM = 'quick_order_form';
35
    protected const PARAM_QUICK_ORDER_FILE_TYPE = 'file-type';
36
    protected const MESSAGE_CLEAR_ALL_ROWS_SUCCESS = 'quick-order.message.success.the-form-items-have-been-successfully-cleared';
37
    protected const ERROR_MESSAGE_QUANTITY_INVALID = 'quick-order.errors.quantity-invalid';
38
    protected const MESSAGE_TYPE_WARNING = 'warning';
39
    protected const MESSAGE_PERMISSION_FAILED = 'global.permission.failed';
40
41
    /**
42
     * @uses \SprykerShop\Yves\CartPage\Plugin\Router\CartPageRouteProviderPlugin::ROUTE_NAME_CART
43
     */
44
    protected const ROUTE_NAME_CART = 'cart';
45
46
    /**
47
     * @uses \SprykerShop\Yves\CheckoutPage\Plugin\Router\CheckoutPageRouteProviderPlugin::ROUTE_NAME_CHECKOUT_INDEX
48
     */
49
    protected const ROUTE_NAME_CHECKOUT_INDEX = 'checkout-index';
50
51
    /**
52
     * @param \Symfony\Component\HttpFoundation\Request $request
53
     *
54
     * @return mixed
55
     */
56
    public function indexAction(Request $request)
57
    {
58
        $response = $this->executeQuickOrderFormSubmitAction($request);
59
60
        if ($response) {
61
            return $response;
62
        }
63
64
        $response = $this->executeIndexAction($request);
65
66
        return $this->view(
67
            $response,
68
            $this->getFactory()->getQuickOrderPageWidgetPlugins(),
69
            '@QuickOrderPage/views/quick-order/quick-order.twig'
70
        );
71
    }
72
73
    /**
74
     * @param \Symfony\Component\HttpFoundation\Request $request
75
     *
76
     * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
77
     */
78
    protected function executeQuickOrderFormSubmitAction(Request $request)
79
    {
80
        $quickOrderTransfer = $this->getFactory()
81
            ->createQuickOrderFormDataProvider()
82
            ->getQuickOrderTransfer();
83
84
        $quickOrderForm = $this->getFactory()
85
            ->createQuickOrderFormFactory()
86
            ->getQuickOrderForm($quickOrderTransfer)
87
            ->handleRequest($request);
88
89
        if ($quickOrderForm->isSubmitted() && $quickOrderForm->isValid()) {
90
            $response = $this->processQuickOrderForm($quickOrderForm, $request);
91
92
            if ($response !== null) {
93
                return $response;
94
            }
95
        }
96
97
        return [];
98
    }
99
100
    /**
101
     * @param \Symfony\Component\HttpFoundation\Request $request
102
     *
103
     * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
104
     */
105
    protected function executeIndexAction(Request $request)
106
    {
107
        $textOrderForm = $this->getFactory()
108
            ->createQuickOrderFormFactory()
109
            ->getTextOrderForm();
110
111
        $uploadOrderForm = $this->getFactory()
112
            ->createQuickOrderFormFactory()
113
            ->getUploadOrderForm();
114
115
        $handledQuickOrderItems = $this->handleQuickOrderForm($request);
116
        $handledUploadOrderItems = $this->handleUploadOrderForm($request, $uploadOrderForm);
117
        $handledTextOrderItems = $this->handleTextOrderForm($request, $textOrderForm);
118
119
        $quickOrderItems = array_merge(
120
            $handledQuickOrderItems,
121
            $handledUploadOrderItems,
122
            $handledTextOrderItems
123
        );
124
125
        if (count($handledUploadOrderItems) || count($handledTextOrderItems)) {
126
            $quickOrderItems = $this->filterQuickOrderItems($quickOrderItems);
127
        }
128
129
        $quickOrderTransfer = $this->getQuickOrderTransfer($quickOrderItems);
130
131
        $quickOrderForm = $this->getFactory()
132
            ->createQuickOrderFormFactory()
133
            ->getQuickOrderForm($quickOrderTransfer);
134
135
        $prices = $this->getProductPricesFromQuickOrderTransfer($quickOrderTransfer);
136
137
        $products = $this->getProductsFromQuickOrderItems($quickOrderTransfer);
138
139
        $fileTemplateExtensions = $this->getFactory()
140
            ->createFileTemplateExtensionsReader()
141
            ->getFileTemplateExtensions();
142
143
        $additionalColumns = $this->getFactory()
144
            ->createAdditionalColumnsProvider()
145
            ->getAdditionalColumns();
146
147
        return [
148
            'quickOrderForm' => $quickOrderForm->createView(),
149
            'textOrderForm' => $textOrderForm->createView(),
150
            'uploadOrderForm' => $uploadOrderForm->createView(),
151
            'additionalColumns' => $additionalColumns,
152
            'products' => $this->transformProductsViewData($products),
153
            'fileTemplateExtensions' => $fileTemplateExtensions,
154
            'prices' => $prices, // @deprecated quickOrderForm already contains this data per row at sumPrice property.
155
        ];
156
    }
157
158
    /**
159
     * @param \Generated\Shared\Transfer\QuickOrderItemTransfer[] $quickOrderItems
160
     *
161
     * @return \Generated\Shared\Transfer\QuickOrderTransfer
162
     */
163
    protected function getQuickOrderTransfer(array $quickOrderItems): QuickOrderTransfer
164
    {
165
        $quickOrderTransfer = $this->getFactory()
166
            ->createQuickOrderFormDataProvider()
167
            ->getQuickOrderTransfer($quickOrderItems);
168
169
        $quickOrderTransfer = $this->getFactory()
170
            ->getQuickOrderClient()
171
            ->buildQuickOrderTransfer($quickOrderTransfer);
172
173
        $quickOrderTransfer = $this->getFactory()
174
            ->createQuickOrderItemPluginExecutor()
175
            ->applyQuickOrderItemFilterPluginsOnQuickOrder($quickOrderTransfer);
176
177
        $quickOrderTransfer = $this->getFactory()
178
            ->createPriceResolver()
179
            ->setSumPriceForQuickOrderTransfer($quickOrderTransfer);
180
181
        return $quickOrderTransfer;
182
    }
183
184
    /**
185
     * @param \Generated\Shared\Transfer\QuickOrderItemTransfer[] $quickOrderItems
186
     *
187
     * @return array
188
     */
189
    protected function filterQuickOrderItems(array $quickOrderItems): array
190
    {
191
        $filteredItems = [];
192
        foreach ($quickOrderItems as $quickOrderItem) {
193
            if (empty($quickOrderItem->getSku()) && empty($quickOrderItem->getQuantity())) {
194
                continue;
195
            }
196
197
            $filteredItems[] = $quickOrderItem;
198
        }
199
200
        return $filteredItems;
201
    }
202
203
    /**
204
     * @param \Symfony\Component\HttpFoundation\Request $request
205
     *
206
     * @return \Symfony\Component\HttpFoundation\Response
207
     */
208
    public function downloadTemplateAction(Request $request): Response
209
    {
210
        return $this->executeDownloadTemplateAction($request);
211
    }
212
213
    /**
214
     * @param \Symfony\Component\HttpFoundation\Request $request
215
     *
216
     * @return \Symfony\Component\HttpFoundation\Response
217
     */
218
    protected function executeDownloadTemplateAction(Request $request): Response
219
    {
220
        return $this->getFactory()
221
            ->createFileDownloadRenderer()
222
            ->render($request->get(static::PARAM_QUICK_ORDER_FILE_TYPE, ''));
223
    }
224
225
    /**
226
     * @param \Generated\Shared\Transfer\QuickOrderTransfer $quickOrderTransfer
227
     *
228
     * @return \Generated\Shared\Transfer\ProductConcreteTransfer[]
229
     */
230
    protected function getProductsFromQuickOrderItems(QuickOrderTransfer $quickOrderTransfer): array
231
    {
232
        $productConcreteTransfers = [];
233
        foreach ($quickOrderTransfer->getItems() as $orderItem) {
234
            if ($orderItem->getProductConcrete()) {
235
                $productConcreteTransfers[] = $orderItem->getProductConcrete();
236
            }
237
        }
238
239
        return $productConcreteTransfers;
240
    }
241
242
    /**
243
     * @param \Generated\Shared\Transfer\QuickOrderItemTransfer $quickOrderItemTransfer
244
     *
245
     * @return \Generated\Shared\Transfer\ProductConcreteTransfer|null
246
     */
247
    protected function getProductByQuickOrderItem(QuickOrderItemTransfer $quickOrderItemTransfer): ?ProductConcreteTransfer
248
    {
249
        if (!$quickOrderItemTransfer->getSku()) {
250
            return null;
251
        }
252
253
        $productConcreteTransfer = $this->getFactory()
254
            ->createProductResolver()
255
            ->getProductBySku($quickOrderItemTransfer->getSku());
256
257
        [$productConcreteTransfer] = $this->getFactory()
258
            ->getQuickOrderClient()
259
            ->expandProductConcreteTransfers([$productConcreteTransfer]);
260
261
        return $productConcreteTransfer;
262
    }
263
264
    /**
265
     * @param \Symfony\Component\HttpFoundation\Request $request
266
     *
267
     * @return \Spryker\Yves\Kernel\View\View|\Symfony\Component\HttpFoundation\JsonResponse
268
     */
269
    public function addRowsAction(Request $request)
270
    {
271
        if (!$request->isMethod('post')) {
272
            return $this->jsonResponse();
273
        }
274
275
        $viewData = $this->executeAddRowsAction($request);
276
277
        return $this->view(
278
            $viewData,
279
            $this->getFactory()->getQuickOrderPageWidgetPlugins(),
280
            '@QuickOrderPage/views/quick-order-rows-async/quick-order-rows-async.twig'
281
        );
282
    }
283
284
    /**
285
     * @param \Symfony\Component\HttpFoundation\Request $request
286
     *
287
     * @return array
288
     */
289
    protected function executeAddRowsAction(Request $request): array
290
    {
291
        $formData = $request->get(static::PARAM_QUICK_ORDER_FORM);
292
        $formDataItems = $formData['items'] ?? [];
293
294
        $quickOrderFormDataProvider = $this->getFactory()
295
            ->createQuickOrderFormDataProvider();
296
297
        $quickOrderTransfer = $quickOrderFormDataProvider->mapFormDataToQuickOrderItems($formDataItems);
298
        $quickOrderTransfer = $quickOrderFormDataProvider->appendEmptyQuickOrderItems($quickOrderTransfer);
299
300
        $quickOrderForm = $this->getFactory()
301
            ->createQuickOrderFormFactory()
302
            ->getQuickOrderForm($quickOrderTransfer);
303
304
        $quickOrderTransfer = $this->getFactory()
305
            ->getQuickOrderClient()
306
            ->buildQuickOrderTransfer($quickOrderTransfer);
307
308
        $products = $this->getProductsFromQuickOrderItems($quickOrderTransfer);
309
        $prices = $this->getProductPricesFromQuickOrderTransfer($quickOrderTransfer);
310
311
        $additionalColumns = $this->getFactory()
312
            ->createAdditionalColumnsProvider()
313
            ->getAdditionalColumns();
314
315
        return [
316
            'form' => $quickOrderForm->createView(),
317
            'additionalColumns' => $additionalColumns,
318
            'products' => $this->transformProductsViewData($products),
319
            'prices' => $prices, // @deprecated quickOrderForm already contains this data per row at sumPrice property.
320
        ];
321
    }
322
323
    /**
324
     * @param \Symfony\Component\HttpFoundation\Request $request
325
     *
326
     * @return \Spryker\Yves\Kernel\View\View|\Symfony\Component\HttpFoundation\JsonResponse
327
     */
328
    public function deleteRowAction(Request $request)
329
    {
330
        if (!$request->isMethod('post')) {
331
            return $this->jsonResponse();
332
        }
333
334
        $viewData = $this->executeDeleteRowAction($request);
335
336
        return $this->view(
337
            $viewData,
338
            $this->getFactory()->getQuickOrderPageWidgetPlugins(),
339
            '@QuickOrderPage/views/quick-order-rows-async/quick-order-rows-async.twig'
340
        );
341
    }
342
343
    /**
344
     * @param \Symfony\Component\HttpFoundation\Request $request
345
     *
346
     * @throws \Symfony\Component\HttpKernel\Exception\HttpException
347
     *
348
     * @return array
349
     */
350
    protected function executeDeleteRowAction(Request $request): array
351
    {
352
        $rowIndex = $request->get(static::PARAM_ROW_INDEX);
353
        $formData = $request->get(static::PARAM_QUICK_ORDER_FORM);
354
        $formDataItems = $formData['items'] ?? [];
355
356
        if (!isset($formDataItems[$rowIndex])) {
357
            throw new HttpException(Response::HTTP_BAD_REQUEST, '"row-index" is out of the bound.');
358
        }
359
        unset($formDataItems[$rowIndex]);
360
361
        $quickOrderTransfer = $this->getFactory()
362
            ->createQuickOrderFormDataProvider()
363
            ->mapFormDataToQuickOrderItems($formDataItems);
364
365
        $quickOrderForm = $this->getFactory()
366
            ->createQuickOrderFormFactory()
367
            ->getQuickOrderForm($quickOrderTransfer);
368
369
        $quickOrderTransfer = $this->getFactory()
370
            ->getQuickOrderClient()
371
            ->buildQuickOrderTransfer($quickOrderTransfer);
372
373
        $products = $this->getProductsFromQuickOrderItems($quickOrderTransfer);
374
        $prices = $this->getProductPricesFromQuickOrderTransfer($quickOrderTransfer);
375
376
        $additionalColumns = $this->getFactory()
377
            ->createAdditionalColumnsProvider()
378
            ->getAdditionalColumns();
379
380
        return [
381
            'form' => $quickOrderForm->createView(),
382
            'additionalColumns' => $additionalColumns,
383
            'products' => $this->transformProductsViewData($products),
384
            'prices' => $prices, // @deprecated quickOrderForm already contains this data per row at sumPrice property.
385
        ];
386
    }
387
388
    /**
389
     * @return \Spryker\Yves\Kernel\View\View|\Symfony\Component\HttpFoundation\RedirectResponse
390
     */
391
    public function clearAllRowsAction()
392
    {
393
        $this->addSuccessMessage(static::MESSAGE_CLEAR_ALL_ROWS_SUCCESS);
394
395
        return $this->redirectResponseInternal(QuickOrderPageRouteProviderPlugin::ROUTE_NAME_QUICK_ORDER);
396
    }
397
398
    /**
399
     * @param \Symfony\Component\HttpFoundation\Request $request
400
     *
401
     * @return \Spryker\Yves\Kernel\View\View|\Symfony\Component\HttpFoundation\JsonResponse
402
     */
403
    public function productAdditionalDataAction(Request $request)
404
    {
405
        $quantity = (int)$request->get('quantity', 1);
406
        $sku = $request->query->get('sku');
407
        $index = $request->query->get('index');
408
409
        $quickOrderItemTransfer = (new QuickOrderItemTransfer())->setSku($sku);
410
411
        if ($quantity < 1) {
412
            $quantity = 1;
413
            $this->addMessageToQuickOrderItemTransfer($quickOrderItemTransfer);
414
        }
415
416
        $maxAllowedQuantity = $this->getFactory()
417
            ->getModuleConfig()
418
            ->getMaxAllowedQuantity();
419
        if ($quantity > $maxAllowedQuantity) {
420
            $quantity = $maxAllowedQuantity;
421
            $this->addMessageToQuickOrderItemTransfer($quickOrderItemTransfer);
422
        }
423
424
        $quickOrderItemTransfer->setQuantity($quantity);
425
        $quickOrderTransfer = $this->getQuickOrderTransfer([$quickOrderItemTransfer]);
426
        $quickOrderItemTransfer = $quickOrderTransfer->getItems()->offsetGet(0);
427
        $form = $this->getFactory()
428
            ->createQuickOrderFormFactory()
429
            ->getQuickOrderItemEmbeddedForm($quickOrderItemTransfer);
430
431
        $products = $this->getProductsFromQuickOrderItems($quickOrderTransfer);
432
        $products = $this->transformProductsViewData($products);
433
434
        $additionalColumns = $this->getFactory()
435
            ->createAdditionalColumnsProvider()
436
            ->getAdditionalColumns();
437
438
        $viewData = [
439
            'price' => $quickOrderItemTransfer->getSumPrice(),
440
            'additionalColumns' => $additionalColumns,
441
            'product' => reset($products),
442
            'form' => $form->createView(),
443
            'messages' => $quickOrderItemTransfer->getMessages(),
444
            'index' => $index,
445
        ];
446
447
        return $this->view(
448
            $viewData,
449
            $this->getFactory()->getQuickOrderPageWidgetPlugins(),
450
            '@QuickOrderPage/views/quick-order-row-async/quick-order-row-async.twig'
451
        );
452
    }
453
454
    /**
455
     * @param \Generated\Shared\Transfer\QuickOrderItemTransfer $quickOrderItemTransfer
456
     *
457
     * @return \Generated\Shared\Transfer\QuickOrderItemTransfer
458
     */
459
    protected function addMessageToQuickOrderItemTransfer(QuickOrderItemTransfer $quickOrderItemTransfer): QuickOrderItemTransfer
460
    {
461
        return $quickOrderItemTransfer->addMessage(
462
            (new MessageTransfer())
463
                ->setType(static::MESSAGE_TYPE_WARNING)
464
                ->setValue(static::ERROR_MESSAGE_QUANTITY_INVALID)
465
        );
466
    }
467
468
    /**
469
     * @param \Symfony\Component\HttpFoundation\Request $request
470
     * @param \Symfony\Component\Form\FormInterface $textOrderForm
471
     *
472
     * @return \Generated\Shared\Transfer\QuickOrderItemTransfer[]
473
     */
474
    protected function handleTextOrderForm(Request $request, FormInterface $textOrderForm): array
475
    {
476
        $quickOrderItems = [];
477
478
        if ($request->get(TextOrderForm::SUBMIT_BUTTON_TEXT_ORDER) !== null) {
479
            $textOrderForm->handleRequest($request);
480
        }
481
482
        if ($textOrderForm->isSubmitted() && $textOrderForm->isValid()) {
483
            $data = $textOrderForm->getData();
484
485
            if (($data[TextOrderForm::FIELD_TEXT_ORDER] !== null)) {
486
                $quickOrderItems = $this->getFactory()
487
                    ->createTextOrderParser()
488
                    ->parse($data[TextOrderForm::FIELD_TEXT_ORDER]);
489
            }
490
        }
491
492
        return $quickOrderItems;
493
    }
494
495
    /**
496
     * @param \Symfony\Component\HttpFoundation\Request $request
497
     * @param \Symfony\Component\Form\FormInterface $uploadOrderForm
498
     *
499
     * @return \Generated\Shared\Transfer\QuickOrderItemTransfer[]
500
     */
501
    protected function handleUploadOrderForm(Request $request, FormInterface $uploadOrderForm): array
502
    {
503
        $quickOrderItems = [];
504
505
        if ($request->get(UploadOrderForm::SUBMIT_BUTTON_UPLOAD_ORDER) !== null) {
506
            $uploadOrderForm->handleRequest($request);
507
        }
508
509
        if ($uploadOrderForm->isSubmitted() && $uploadOrderForm->isValid()) {
510
            $data = $uploadOrderForm->getData();
511
            $quickOrderItems = $this->getFactory()
512
                ->createUploadedFileParser()
513
                ->parse($data[UploadOrderForm::FIELD_FILE_UPLOAD_ORDER]);
514
        }
515
516
        return $quickOrderItems;
517
    }
518
519
    /**
520
     * @param \Symfony\Component\HttpFoundation\Request $request
521
     *
522
     * @return \Generated\Shared\Transfer\QuickOrderItemTransfer[]
523
     */
524
    protected function handleQuickOrderForm($request): array
525
    {
526
        $quickOrderItems = [];
527
        $formData = $request->get(static::PARAM_QUICK_ORDER_FORM);
528
        $formDataItems = $formData['items'] ?? [];
529
        if ($formDataItems) {
530
            $quickOrderTransfer = $this->getFactory()
531
                ->createQuickOrderFormDataProvider()
532
                ->mapFormDataToQuickOrderItems($formDataItems);
533
            $quickOrderItems = (array)$quickOrderTransfer->getItems();
534
        }
535
536
        return $quickOrderItems;
537
    }
538
539
    /**
540
     * @param \Symfony\Component\Form\FormInterface $quickOrderForm
541
     * @param \Symfony\Component\HttpFoundation\Request $request
542
     *
543
     * @return \Symfony\Component\HttpFoundation\RedirectResponse|null
544
     */
545
    protected function processQuickOrderForm(FormInterface $quickOrderForm, Request $request): ?RedirectResponse
546
    {
547
        $quickOrderTransfer = $quickOrderForm->getData();
548
549
        $quickOrderTransfer = $this->getFactory()
550
            ->getQuickOrderClient()
551
            ->buildQuickOrderTransfer($quickOrderTransfer);
552
553
        if ($request->get(QuickOrderForm::SUBMIT_BUTTON_ADD_TO_CART) !== null) {
554
            return $this->executeAddToCartAction($quickOrderTransfer);
555
        }
556
557
        if ($request->get(QuickOrderForm::SUBMIT_BUTTON_CREATE_ORDER) !== null) {
558
            return $this->executeCreateOrderAction($quickOrderTransfer);
559
        }
560
561
        return $this->executeQuickOrderFormHandlerStrategyPlugin($quickOrderForm, $request);
562
    }
563
564
    /**
565
     * @param \Generated\Shared\Transfer\QuickOrderTransfer $quickOrderTransfer
566
     *
567
     * @return \Symfony\Component\HttpFoundation\RedirectResponse|null
568
     */
569
    protected function executeAddToCartAction(QuickOrderTransfer $quickOrderTransfer): ?RedirectResponse
570
    {
571
        if (!$this->can('AddCartItemPermissionPlugin')) {
572
            $this->addErrorMessage(static::MESSAGE_PERMISSION_FAILED);
573
574
            return null;
575
        }
576
577
        $result = $this->getFactory()
578
            ->createFormOperationHandler()
579
            ->addToCart($quickOrderTransfer);
580
581
        if (!$result) {
582
            return null;
583
        }
584
585
        return $this->redirectResponseInternal(static::ROUTE_NAME_CART);
586
    }
587
588
    /**
589
     * @param \Generated\Shared\Transfer\QuickOrderTransfer $quickOrderTransfer
590
     *
591
     * @return \Symfony\Component\HttpFoundation\RedirectResponse|null
592
     */
593
    protected function executeCreateOrderAction(QuickOrderTransfer $quickOrderTransfer): ?RedirectResponse
594
    {
595
        if (!$this->can('AddCartItemPermissionPlugin')) {
596
            $this->addErrorMessage(static::MESSAGE_PERMISSION_FAILED);
597
598
            return null;
599
        }
600
601
        $result = $this->getFactory()
602
            ->createFormOperationHandler()
603
            ->addToEmptyCart($quickOrderTransfer);
604
605
        if (!$result) {
606
            return null;
607
        }
608
609
        return $this->redirectResponseInternal(static::ROUTE_NAME_CHECKOUT_INDEX);
610
    }
611
612
    /**
613
     * @param \Symfony\Component\Form\FormInterface $quickOrderForm
614
     * @param \Symfony\Component\HttpFoundation\Request $request
615
     *
616
     * @return \Symfony\Component\HttpFoundation\RedirectResponse|null
617
     */
618
    protected function executeQuickOrderFormHandlerStrategyPlugin(FormInterface $quickOrderForm, Request $request): ?RedirectResponse
619
    {
620
        $response = null;
621
        foreach ($this->getFactory()->getQuickOrderFormHandlerStrategyPlugins() as $quickOrderFormHandlerStrategyPlugin) {
622
            if (!$quickOrderFormHandlerStrategyPlugin->isApplicable($quickOrderForm->getData(), $request->request->all())) {
623
                continue;
624
            }
625
            $response = $quickOrderFormHandlerStrategyPlugin->execute($quickOrderForm->getData(), $request->request->all());
626
627
            break;
628
        }
629
630
        if ($response === null || !$response->getRoute()) {
631
            return null;
632
        }
633
634
        $route = $response->getRoute();
635
636
        return new RedirectResponse($this->getRouter()->generate($route->getRoute(), $route->getParameters()));
637
    }
638
639
    /**
640
     * @deprecated Will be removed without replacement.
641
     *
642
     * @param \Generated\Shared\Transfer\QuickOrderTransfer $quickOrderTransfer
643
     *
644
     * @return int[]
645
     */
646
    protected function getProductPricesFromQuickOrderTransfer(QuickOrderTransfer $quickOrderTransfer): array
647
    {
648
        $prices = [];
649
        $quickOrderTransfer = $this->getFactory()
650
            ->createPriceResolver()
651
            ->setSumPriceForQuickOrderTransfer($quickOrderTransfer);
652
653
        foreach ($quickOrderTransfer->getItems() as $quickOrderItemTransfer) {
654
            $sku = $quickOrderItemTransfer->getSku();
655
656
            if ($sku !== null) {
657
                $prices[$sku] = $quickOrderItemTransfer->getSumPrice();
658
            }
659
        }
660
661
        return $prices;
662
    }
663
664
    /**
665
     * @param \Generated\Shared\Transfer\ProductConcreteTransfer[] $productConcreteTransfers
666
     *
667
     * @return array
668
     */
669
    protected function transformProductsViewData(array $productConcreteTransfers): array
670
    {
671
        return $this->getFactory()
672
            ->createViewDataTransformer()
673
            ->transformProductData($productConcreteTransfers, $this->getFactory()->getQuickOrderFormColumnPlugins());
674
    }
675
}
676