Passed
Pull Request — master (#29)
by Oleksandr
08:15
created

PaymentController::successAction()   B

Complexity

Conditions 10
Paths 8

Size

Total Lines 49
Code Lines 28

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 10
eloc 28
c 2
b 0
f 0
nc 8
nop 1
dl 0
loc 49
rs 7.6666

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/**
4
 * Apache OSL-2
5
 * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
6
 */
7
8
namespace SprykerEco\Yves\AmazonPay\Controller;
9
10
use Generated\Shared\Transfer\AmazonpayPaymentTransfer;
1 ignored issue
show
Bug introduced by
The type Generated\Shared\Transfer\AmazonpayPaymentTransfer was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
11
use Generated\Shared\Transfer\CheckoutErrorTransfer;
1 ignored issue
show
Bug introduced by
The type Generated\Shared\Transfer\CheckoutErrorTransfer was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
12
use Generated\Shared\Transfer\CheckoutResponseTransfer;
1 ignored issue
show
Bug introduced by
The type Generated\Shared\Transfer\CheckoutResponseTransfer was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
13
use Generated\Shared\Transfer\QuoteTransfer;
1 ignored issue
show
Bug introduced by
The type Generated\Shared\Transfer\QuoteTransfer was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
14
use Spryker\Shared\Config\Config;
15
use Spryker\Yves\Kernel\Controller\AbstractController;
16
use SprykerEco\Shared\AmazonPay\AmazonPayConfig;
17
use SprykerEco\Shared\AmazonPay\AmazonPayConstants;
18
use SprykerEco\Yves\AmazonPay\Plugin\Provider\AmazonPayControllerProvider;
19
use Symfony\Component\HttpFoundation\JsonResponse;
20
use Symfony\Component\HttpFoundation\Request;
21
use Symfony\Component\HttpFoundation\Response;
22
23
/**
24
 * @method \SprykerEco\Client\AmazonPay\AmazonPayClientInterface getClient()
25
 * @method \SprykerEco\Yves\AmazonPay\AmazonPayFactory getFactory()
26
 */
27
class PaymentController extends AbstractController
28
{
29
    public const URL_PARAM_REFERENCE_ID = 'reference_id';
30
    public const URL_PARAM_SELLER_ID = 'seller_id';
31
    public const URL_PARAM_ACCESS_TOKEN = 'access_token';
32
    public const URL_PARAM_SHIPMENT_METHOD_ID = 'shipment_method_id';
33
    public const QUOTE_TRANSFER = 'quoteTransfer';
34
    public const SHIPMENT_METHODS = 'shipmentMethods';
35
    public const SELECTED_SHIPMENT_METHOD_ID = 'selectedShipmentMethodId';
36
    public const AMAZONPAY_CONFIG = 'amazonpayConfig';
37
    public const IS_ASYNCHRONOUS = 'isAsynchronous';
38
    public const CART_ITEMS = 'cartItems';
39
    public const SUCCESS = 'success';
40
    public const ERROR_AMAZONPAY_PAYMENT_FAILED = 'amazonpay.payment.failed';
41
    public const IS_AMAZON_PAYMENT_INVALID = 'isAmazonPaymentInvalid';
42
    public const ADDRESS_BOOK_MODE = 'addressBookMode';
43
    public const ORDER_REFERENCE = 'orderReferenceId';
44
45
    public const PSD2_DATA = 'psd2Data';
46
    public const PSD2_DATA_KEY_AJAX_ENDPOINT = 'psd2AjaxEndpoint';
47
    public const PSD2_DATA_KEY_SELLER_ID = 'amazonSellerId';
48
    public const PSD2_DATA_KEY_AMAZON_ORDER_REFERENCE_ID = 'amazonOrderReferenceId';
49
    public const PSD2_DATA_KEY_AMAZON_FAILURE_URL = 'amazonFailureUrl';
50
51
    /**
52
     * @param \Symfony\Component\HttpFoundation\Request $request
53
     *
54
     * @return \Spryker\Yves\Kernel\View\View|\Symfony\Component\HttpFoundation\RedirectResponse
55
     */
56
    public function checkoutAction(Request $request)
57
    {
58
        $response = $this->executeCheckoutAction($request);
59
60
        if (!is_array($response)) {
0 ignored issues
show
introduced by
The condition is_array($response) is always false.
Loading history...
61
            return $response;
62
        }
63
64
        return $this->view($response, [], '@AmazonPay/views/checkout/checkout.twig');
65
    }
66
67
    /**
68
     * @param \Symfony\Component\HttpFoundation\Request $request
69
     *
70
     * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
71
     */
72
    protected function executeCheckoutAction(Request $request)
73
    {
74
        $quoteTransfer = $this->getFactory()
75
            ->getQuoteClient()
76
            ->getQuote();
77
78
        if (!$this->isAllowedCheckout($quoteTransfer) || !$this->isRequestComplete($request)) {
79
            $this->addAmazonPayErrorFromQuote($quoteTransfer);
80
81
            return $this->buildRedirectInternalResponse();
82
        }
83
84
        $this->storeAmazonPaymentIntoQuote($request, $quoteTransfer);
85
86
        $data = [
87
            static::QUOTE_TRANSFER => $quoteTransfer,
88
            static::CART_ITEMS => $this->getCartItems($quoteTransfer),
89
            static::AMAZONPAY_CONFIG => $this->getAmazonPayConfig(),
90
            static::PSD2_DATA => $this->preparePSD2Data($quoteTransfer),
91
        ];
92
93
        if ($this->isAmazonPaymentInvalid($quoteTransfer)) {
94
            $data[static::ORDER_REFERENCE] = $this->getAmazonPaymentOrderReferenceId($quoteTransfer);
95
            $data[static::ADDRESS_BOOK_MODE] = AmazonPayConfig::DISPLAY_MODE_READONLY;
96
        }
97
98
        if ($quoteTransfer->getAmazonpayPayment()->getOrderReferenceStatus()) {
99
            $data[static::ADDRESS_BOOK_MODE] = AmazonPayConfig::DISPLAY_MODE_READONLY;
100
        }
101
102
        return $data;
103
    }
104
105
    /**
106
     * @param \Symfony\Component\HttpFoundation\Request $request
107
     *
108
     * @return \Symfony\Component\HttpFoundation\Response
109
     */
110
    public function setOrderReferenceAction(Request $request)
111
    {
112
        $quoteTransfer = $this->getFactory()
113
            ->getQuoteClient()
114
            ->getQuote();
115
116
        if (!$this->isAmazonPayment($quoteTransfer)) {
117
            return $this->buildRedirectInternalResponse();
118
        }
119
120
        $quoteTransfer->getAmazonpayPayment()
121
            ->setOrderReferenceId(
122
                $request->request->get(static::URL_PARAM_REFERENCE_ID)
123
            );
124
125
        $this->getFactory()->getQuoteClient()->setQuote($quoteTransfer);
126
127
        return new JsonResponse([static::SUCCESS => true]);
128
    }
129
130
    /**
131
     * @param \Symfony\Component\HttpFoundation\Request $request
132
     *
133
     * @return \Spryker\Yves\Kernel\View\View|\Symfony\Component\HttpFoundation\RedirectResponse
134
     */
135
    public function getShipmentMethodsAction(Request $request)
136
    {
137
        $response = $this->executeShipmentMethodsAction($request);
138
139
        if (!is_array($response)) {
0 ignored issues
show
introduced by
The condition is_array($response) is always false.
Loading history...
140
            return $response;
141
        }
142
143
        return $this->view($response, [], '@AmazonPay/views/get-shipment-methods/get-shipment-methods.twig');
144
    }
145
146
    /**
147
     * @param \Symfony\Component\HttpFoundation\Request $request
148
     *
149
     * @return \Symfony\Component\HttpFoundation\Response
150
     */
151
    public function confirmPurchaseAction(Request $request): Response
1 ignored issue
show
Unused Code introduced by
The parameter $request is not used and could be removed. ( Ignorable by Annotation )

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

151
    public function confirmPurchaseAction(/** @scrutinizer ignore-unused */ Request $request): Response

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
152
    {
153
        $quoteTransfer = $this->getFactory()->getQuoteClient()->getQuote();
154
        $quoteTransfer = $this->getClient()->confirmPurchase($quoteTransfer);
155
156
        $amazonpayPaymentTransfer = $quoteTransfer->getAmazonpayPayment();
157
158
        if (!$amazonpayPaymentTransfer->getResponseHeader()->getIsSuccess() &&
159
            $amazonpayPaymentTransfer->getResponseHeader()->getConstraints()->count()) {
160
            $this->addErrorMessage($amazonpayPaymentTransfer->getResponseHeader()->getErrorMessage());
161
162
            return new JsonResponse([
163
                'success' => false,
164
                'url' => $this->getApplication()->url(AmazonPayControllerProvider::CHECKOUT, [
165
                    static::URL_PARAM_REFERENCE_ID => $quoteTransfer->getAmazonpayPayment()->getOrderReferenceId(),
166
                    static::URL_PARAM_ACCESS_TOKEN => $quoteTransfer->getAmazonpayPayment()->getAddressConsentToken(),
167
                ]),
168
            ], 302);
169
        }
170
171
        $this->saveQuoteIntoSession($quoteTransfer);
172
173
        if (!$quoteTransfer->getAmazonpayPayment()->getOrderReferenceStatus()->getState() === AmazonPayConfig::STATUS_OPEN) {
0 ignored issues
show
introduced by
The condition ! $quoteTransfer->getAma...nPayConfig::STATUS_OPEN is always false.
Loading history...
174
            return new JsonResponse([
175
                'success' => false,
176
            ], 400);
177
        }
178
179
        return new JsonResponse([
180
            'success' => true,
181
        ]);
182
    }
183
184
    /**
185
     * @param \Symfony\Component\HttpFoundation\Request $request
186
     *
187
     * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
188
     */
189
    protected function executeShipmentMethodsAction(Request $request)
1 ignored issue
show
Unused Code introduced by
The parameter $request is not used and could be removed. ( Ignorable by Annotation )

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

189
    protected function executeShipmentMethodsAction(/** @scrutinizer ignore-unused */ Request $request)

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
190
    {
191
        $quoteTransfer = $this->getFactory()
192
            ->getQuoteClient()
193
            ->getQuote();
194
195
        if (!$this->isAmazonPayment($quoteTransfer)) {
196
            $this->addAmazonPayErrorFromQuote($quoteTransfer);
197
198
            return $this->buildRedirectInternalResponse();
199
        }
200
201
        $quoteTransfer = $this->getClient()
202
            ->addSelectedAddressToQuote($quoteTransfer);
203
        $this->saveQuoteIntoSession($quoteTransfer);
204
        $shipmentMethods = $this->getFactory()
205
            ->getShipmentClient()
206
            ->getAvailableMethods($quoteTransfer);
207
208
        return [
209
            static::SELECTED_SHIPMENT_METHOD_ID => $this->getCurrentShipmentMethodId($quoteTransfer),
210
            static::SHIPMENT_METHODS => $shipmentMethods->getMethods(),
211
            static::IS_AMAZON_PAYMENT_INVALID => $this->isAmazonPaymentInvalid($quoteTransfer),
212
        ];
213
    }
214
215
    /**
216
     * @param \Symfony\Component\HttpFoundation\Request $request
217
     *
218
     * @return \Spryker\Yves\Kernel\View\View|\Symfony\Component\HttpFoundation\RedirectResponse
219
     */
220
    public function updateShipmentMethodAction(Request $request)
221
    {
222
        $response = $this->executeShipmentMethodAction($request);
223
224
        if (!is_array($response)) {
0 ignored issues
show
introduced by
The condition is_array($response) is always false.
Loading history...
225
            return $response;
226
        }
227
228
        return $this->view($response, [], '@AmazonPay/views/shipment-method/shipment-method.twig');
229
    }
230
231
    /**
232
     * @param \Symfony\Component\HttpFoundation\Request $request
233
     *
234
     * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
235
     */
236
    protected function executeShipmentMethodAction(Request $request)
237
    {
238
        $quoteTransfer = $this->getFactory()->getQuoteClient()->getQuote();
239
240
        if (!$this->isAmazonPayment($quoteTransfer)) {
241
            $this->addAmazonPayErrorFromQuote($quoteTransfer);
242
243
            return $this->buildRedirectInternalResponse();
244
        }
245
246
        $quoteTransfer->getShipment()->setShipmentSelection(
247
            $request->request->get(static::URL_PARAM_SHIPMENT_METHOD_ID)
248
        );
249
        $quoteTransfer = $this->getClient()
250
            ->addSelectedShipmentMethodToQuote($quoteTransfer);
251
        $quoteTransfer = $this->getFactory()
252
            ->getCalculationClient()->recalculate($quoteTransfer);
253
        $this->saveQuoteIntoSession($quoteTransfer);
254
255
        return [
256
            static::QUOTE_TRANSFER => $quoteTransfer,
257
        ];
258
    }
259
260
    /**
261
     * @param \Symfony\Component\HttpFoundation\Request $request
262
     *
263
     * @return \Spryker\Yves\Kernel\View\View|\Symfony\Component\HttpFoundation\RedirectResponse
264
     */
265
    public function successAction(Request $request)
266
    {
267
        $response = $this->executeSuccessAction($request);
268
269
        $quoteTransfer = $this->getFactory()->getQuoteClient()->getQuote();
270
271
        if ($quoteTransfer->getTotals() === null) {
272
            return $this->view($response, [], '@AmazonPay/views/success/success.twig');
273
        }
274
275
        $checkoutResponseTransfer = $this->getFactory()->getCheckoutClient()->placeOrder($quoteTransfer);
276
277
        if (!$checkoutResponseTransfer->getIsSuccess()) {
278
            return $this->redirectResponseInternal(AmazonPayControllerProvider::CHECKOUT, [
279
                static::URL_PARAM_REFERENCE_ID => $quoteTransfer->getAmazonpayPayment()->getOrderReferenceId(),
280
                static::URL_PARAM_ACCESS_TOKEN => $quoteTransfer->getAmazonpayPayment()->getAddressConsentToken(),
281
            ]);
282
        }
283
284
        $quoteTransfer = $this->getClient()->authorizeOrder($quoteTransfer);
285
286
        $this->saveQuoteIntoSession($quoteTransfer);
287
288
        $state = $quoteTransfer->getAmazonpayPayment()->getAuthorizationDetails()->getAuthorizationStatus()->getState();
289
        $reasonCode = $quoteTransfer->getAmazonpayPayment()->getAuthorizationDetails()->getAuthorizationStatus()->getReasonCode();
290
291
        if ($state === AmazonPayConfig::STATUS_TRANSACTION_TIMED_OUT
292
            && $reasonCode === AmazonPayConfig::REASON_CODE_TRANSACTION_TIMED_OUT
293
            && !$this->getAmazonPayConfig()->getCaptureNow()) {
294
            $quoteTransfer->getAmazonpayPayment()->setReauthorizingAsync(true);
295
            $quoteTransfer = $this->getClient()->authorizeOrder($quoteTransfer);
296
            $state = $quoteTransfer->getAmazonpayPayment()->getAuthorizationDetails()->getAuthorizationStatus()->getState();
297
        }
298
299
        if ($state === AmazonPayConfig::STATUS_TRANSACTION_TIMED_OUT || $state === AmazonPayConfig::STATUS_DECLINED) {
300
            return $this->redirectResponseInternal(AmazonPayControllerProvider::PAYMENT_FAILED);
301
        }
302
303
        if (!$this->isAuthSucceeded($state) || $checkoutResponseTransfer->getIsSuccess() === false) {
304
            return $this->redirectResponseInternal(AmazonPayControllerProvider::CHECKOUT, [
305
                static::URL_PARAM_REFERENCE_ID => $quoteTransfer->getAmazonpayPayment()->getOrderReferenceId(),
306
                static::URL_PARAM_ACCESS_TOKEN => $quoteTransfer->getAmazonpayPayment()->getAddressConsentToken(),
307
            ]);
308
        }
309
310
        $this->getFactory()->getCustomerClient()->markCustomerAsDirty();
311
        $this->getFactory()->getCartClient()->clearQuote();
312
313
        return $this->view($response, [], '@AmazonPay/views/success/success.twig');
314
    }
315
316
    /**
317
     * @param \Symfony\Component\HttpFoundation\Request $request
318
     *
319
     * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
320
     */
321
    protected function executeSuccessAction(Request $request)
1 ignored issue
show
Unused Code introduced by
The parameter $request is not used and could be removed. ( Ignorable by Annotation )

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

321
    protected function executeSuccessAction(/** @scrutinizer ignore-unused */ Request $request)

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
322
    {
323
        return [
324
            static::IS_ASYNCHRONOUS => $this->isAsynchronous(),
325
            static::AMAZONPAY_CONFIG => $this->getAmazonPayConfig(),
326
        ];
327
    }
328
329
    /**
330
     * @param \Symfony\Component\HttpFoundation\Request $request
331
     *
332
     * @return \Symfony\Component\HttpFoundation\Response
333
     */
334
    public function paymentFailedAction(Request $request): Response
1 ignored issue
show
Unused Code introduced by
The parameter $request is not used and could be removed. ( Ignorable by Annotation )

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

334
    public function paymentFailedAction(/** @scrutinizer ignore-unused */ Request $request): Response

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
335
    {
336
        $this->getFactory()->getMessengerClient()->addErrorMessage(static::ERROR_AMAZONPAY_PAYMENT_FAILED);
337
338
        $this->clearAmazonpayQuoteData();
339
340
        return $this->buildRedirectInternalResponse();
341
    }
342
343
    /**
344
     * @param \Symfony\Component\HttpFoundation\Request $request
345
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
346
     *
347
     * @return void
348
     */
349
    protected function storeAmazonPaymentIntoQuote(Request $request, QuoteTransfer $quoteTransfer)
350
    {
351
        $amazonPaymentTransfer = $this->buildAmazonPaymentTransfer($request, $quoteTransfer);
352
353
        $quoteTransfer->setAmazonpayPayment($amazonPaymentTransfer);
354
        $quoteTransfer = $this->getClient()
355
            ->handleCartWithAmazonPay($quoteTransfer);
356
        $this->saveQuoteIntoSession($quoteTransfer);
357
    }
358
359
    /**
360
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
361
     *
362
     * @return void
363
     */
364
    protected function saveQuoteIntoSession(QuoteTransfer $quoteTransfer)
365
    {
366
        $this->getFactory()
367
            ->getQuoteClient()
368
            ->setQuote($quoteTransfer);
369
    }
370
371
    /**
372
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
373
     *
374
     * @return int|null
375
     */
376
    protected function getCurrentShipmentMethodId(QuoteTransfer $quoteTransfer)
377
    {
378
        if ($quoteTransfer->getShipment() === null || $quoteTransfer->getShipment()->getMethod() === null) {
379
            return null;
380
        }
381
382
        return $quoteTransfer->getShipment()->getMethod()->getIdShipmentMethod();
383
    }
384
385
    /**
386
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
387
     *
388
     * @return \ArrayObject|\Generated\Shared\Transfer\ItemTransfer[]
389
     */
390
    protected function getCartItems(QuoteTransfer $quoteTransfer)
391
    {
392
        return $quoteTransfer->getItems();
393
    }
394
395
    /**
396
     * @param \Symfony\Component\HttpFoundation\Request $request
397
     *
398
     * @return bool
399
     */
400
    protected function isRequestComplete(Request $request)
401
    {
402
        return (
403
            $request->query->get(static::URL_PARAM_REFERENCE_ID) !== null &&
404
            $request->query->get(static::URL_PARAM_ACCESS_TOKEN) !== null
405
        );
406
    }
407
408
    /**
409
     * @param \Symfony\Component\HttpFoundation\Request $request
410
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
411
     *
412
     * @return \Generated\Shared\Transfer\AmazonpayPaymentTransfer
413
     */
414
    protected function buildAmazonPaymentTransfer(Request $request, QuoteTransfer $quoteTransfer)
415
    {
416
        $amazonPaymentTransfer = $quoteTransfer->getAmazonpayPayment() ?: new AmazonpayPaymentTransfer();
417
418
        $amazonPaymentTransfer->setOrderReferenceId($request->query->get(static::URL_PARAM_REFERENCE_ID));
419
        $amazonPaymentTransfer->setAddressConsentToken($request->query->get(static::URL_PARAM_ACCESS_TOKEN));
420
        $amazonPaymentTransfer->setFailureMFARedirectUrl($this->getApplication()->url(AmazonPayControllerProvider::CHECKOUT, [
421
            static::URL_PARAM_REFERENCE_ID => $request->query->get(static::URL_PARAM_REFERENCE_ID),
422
            static::URL_PARAM_ACCESS_TOKEN => $request->query->get(static::URL_PARAM_ACCESS_TOKEN),
423
        ]));
424
        $amazonPaymentTransfer->setSuccessMFARedirectUrl($this->getApplication()->url(AmazonPayControllerProvider::SUCCESS));
425
426
        return $amazonPaymentTransfer;
427
    }
428
429
    /**
430
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
431
     *
432
     * @return bool
433
     */
434
    protected function isAllowedCheckout(QuoteTransfer $quoteTransfer)
435
    {
436
        return $quoteTransfer->getTotals() !== null;
437
    }
438
439
    /**
440
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
441
     *
442
     * @return bool
443
     */
444
    protected function isLogoutRedirect(QuoteTransfer $quoteTransfer)
445
    {
446
        if ($this->isAmazonPaymentInvalid($quoteTransfer)) {
447
            return false;
448
        }
449
450
        if ($this->getAmazonPayConfig()->getCaptureNow() &&
451
            $quoteTransfer->getAmazonpayPayment() !== null
452
            && $quoteTransfer->getAmazonpayPayment()->getResponseHeader() !== null
453
            && !$quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getIsSuccess()
454
        ) {
455
            return true;
456
        }
457
458
        return false;
459
    }
460
461
    /**
462
     * @param \Symfony\Component\HttpFoundation\Request $request
463
     *
464
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
465
     */
466
    protected function buildRedirectExternalResponse(Request $request)
467
    {
468
        if ($request->headers->get('Referer') === null) {
0 ignored issues
show
introduced by
The condition $request->headers->get('Referer') === null is always false.
Loading history...
469
            return $this->buildRedirectInternalResponse();
470
        }
471
472
        return $this->redirectResponseExternal($request->headers->get('Referer'));
473
    }
474
475
    /**
476
     * @param \Generated\Shared\Transfer\CheckoutResponseTransfer $checkoutResponseTransfer
477
     *
478
     * @return void
479
     */
480
    protected function setCheckoutErrorMessages(CheckoutResponseTransfer $checkoutResponseTransfer)
481
    {
482
        foreach ($checkoutResponseTransfer->getErrors() as $checkoutErrorTransfer) {
483
            $this->addErrorMessage(
484
                $this->translateCheckoutErrorMessage($checkoutErrorTransfer)
485
            );
486
        }
487
    }
488
489
    /**
490
     * @param \Generated\Shared\Transfer\CheckoutErrorTransfer $checkoutErrorTransfer
491
     *
492
     * @return string
493
     */
494
    protected function translateCheckoutErrorMessage(CheckoutErrorTransfer $checkoutErrorTransfer): string
495
    {
496
        $checkoutErrorMessage = $checkoutErrorTransfer->getMessage();
497
498
        return $this->getFactory()->getGlossaryStorageClient()->translate(
499
            $checkoutErrorMessage,
500
            $this->getLocale(),
501
            $checkoutErrorTransfer->getParameters()
502
        ) ?: $checkoutErrorMessage;
503
    }
504
505
    /**
506
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
507
     *
508
     * @return void
509
     */
510
    protected function addAmazonPayErrorFromQuote(QuoteTransfer $quoteTransfer)
511
    {
512
        if ($quoteTransfer->getAmazonpayPayment() === null
513
            || $quoteTransfer->getAmazonpayPayment()->getResponseHeader() === null
514
            || $quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getErrorMessage() === null) {
515
            return;
516
        }
517
518
        $this->addErrorMessage(
519
            $quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getErrorMessage()
520
        );
521
    }
522
523
    /**
524
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
525
     *
526
     * @return bool
527
     */
528
    protected function isAmazonPayment(QuoteTransfer $quoteTransfer)
529
    {
530
        return $quoteTransfer->getAmazonpayPayment() !== null;
531
    }
532
533
    /**
534
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
535
     */
536
    protected function buildRedirectInternalResponse()
537
    {
538
        return $this->redirectResponseInternal($this->getPaymentRejectRoute());
539
    }
540
541
    /**
542
     * @return string
543
     */
544
    protected function getPaymentRejectRoute()
545
    {
546
        return Config::get(AmazonPayConstants::PAYMENT_REJECT_ROUTE);
547
    }
548
549
    /**
550
     * @return bool
551
     */
552
    protected function isAsynchronous()
553
    {
554
        return $this->getAmazonPayConfig()->getAuthTransactionTimeout() > 0
555
            && !$this->getAmazonPayConfig()->getCaptureNow();
556
    }
557
558
    /**
559
     * @return \SprykerEco\Shared\AmazonPay\AmazonPayConfigInterface
560
     */
561
    protected function getAmazonPayConfig()
562
    {
563
        return $this->getFactory()->createAmazonPayConfig();
564
    }
565
566
    /**
567
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
568
     *
569
     * @return bool
570
     */
571
    protected function isAmazonPaymentInvalid(QuoteTransfer $quoteTransfer)
572
    {
573
        if ($quoteTransfer->getAmazonpayPayment()->getResponseHeader() !== null
574
            && $quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getIsInvalidPaymentMethod()) {
575
            return true;
576
        }
577
578
        return false;
579
    }
580
581
    /**
582
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
583
     *
584
     * @return string|null
585
     */
586
    protected function getAmazonPaymentOrderReferenceId(QuoteTransfer $quoteTransfer)
587
    {
588
        if ($quoteTransfer->getAmazonpayPayment() !== null && $quoteTransfer->getAmazonpayPayment()->getOrderReferenceId() !== null) {
589
            return $quoteTransfer->getAmazonpayPayment()->getOrderReferenceId();
590
        }
591
592
        return null;
593
    }
594
595
    /**
596
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
597
     *
598
     * @return array
599
     */
600
    protected function preparePSD2Data(QuoteTransfer $quoteTransfer): array
601
    {
602
        return [
603
            static::PSD2_DATA_KEY_AJAX_ENDPOINT => $this->getApplication()->path(AmazonPayControllerProvider::CONFIRM_PURCHASE),
604
            static::PSD2_DATA_KEY_SELLER_ID => $this->getAmazonPayConfig()->getSellerId(),
605
            static::PSD2_DATA_KEY_AMAZON_ORDER_REFERENCE_ID => $quoteTransfer->getAmazonpayPayment()->getOrderReferenceId(),
606
            static::PSD2_DATA_KEY_AMAZON_FAILURE_URL => $this->getApplication()->path(AmazonPayControllerProvider::PAYMENT_FAILED),
607
        ];
608
    }
609
610
    /**
611
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
612
     *
613
     * @return void
614
     */
615
    protected function clearAmazonpayQuoteData(): void
616
    {
617
        $quoteTransfer = $this->getFactory()->getQuoteClient()->getQuote();
618
619
        $amazonpayPaymentTransfer = new AmazonpayPaymentTransfer();
620
621
        $quoteTransfer->setAmazonpayPayment($amazonpayPaymentTransfer);
622
623
        $this->getFactory()->getQuoteClient()->setQuote($quoteTransfer);
624
    }
625
626
    /**
627
     * @param string $state
628
     *
629
     * @return bool
630
     */
631
    protected function isAuthSucceeded(string $state): bool
632
    {
633
        return in_array($state, [
634
            AmazonPayConfig::STATUS_OPEN,
635
            AmazonPayConfig::STATUS_PENDING,
636
            AmazonPayConfig::STATUS_CLOSED,
637
        ]);
638
    }
639
}
640