Passed
Push — feature/eco-2635-amazon-psd2-a... ( 8790e7...3a42c7 )
by Volodymyr
04:06
created

PaymentController::clearAmazonpayQuoteData()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 4
nc 1
nop 0
dl 0
loc 9
rs 10
c 0
b 0
f 0
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
        return $data;
99
    }
100
101
    /**
102
     * @param \Symfony\Component\HttpFoundation\Request $request
103
     *
104
     * @return \Symfony\Component\HttpFoundation\Response
105
     */
106
    public function setOrderReferenceAction(Request $request)
107
    {
108
        $quoteTransfer = $this->getFactory()
109
            ->getQuoteClient()
110
            ->getQuote();
111
112
        if (!$this->isAmazonPayment($quoteTransfer)) {
113
            return $this->buildRedirectInternalResponse();
114
        }
115
116
        $quoteTransfer->getAmazonpayPayment()
117
            ->setOrderReferenceId(
118
                $request->request->get(static::URL_PARAM_REFERENCE_ID)
119
            );
120
121
        $this->getFactory()->getQuoteClient()->setQuote($quoteTransfer);
122
123
        return new JsonResponse([static::SUCCESS => true]);
124
    }
125
126
    /**
127
     * @param \Symfony\Component\HttpFoundation\Request $request
128
     *
129
     * @return \Spryker\Yves\Kernel\View\View|\Symfony\Component\HttpFoundation\RedirectResponse
130
     */
131
    public function getShipmentMethodsAction(Request $request)
132
    {
133
        $response = $this->executeShipmentMethodsAction($request);
134
135
        if (!is_array($response)) {
0 ignored issues
show
introduced by
The condition is_array($response) is always false.
Loading history...
136
            return $response;
137
        }
138
139
        return $this->view($response, [], '@AmazonPay/views/get-shipment-methods/get-shipment-methods.twig');
140
    }
141
142
    /**
143
     * @param \Symfony\Component\HttpFoundation\Request $request
144
     *
145
     * @return \Symfony\Component\HttpFoundation\Response
146
     */
147
    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

147
    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...
148
    {
149
        $quoteTransfer = $this->getFactory()->getQuoteClient()->getQuote();
150
151
        $quoteTransfer = $this->getClient()->confirmPurchase($quoteTransfer);
152
153
        $this->saveQuoteIntoSession($quoteTransfer);
154
155
        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...
156
            return new JsonResponse([
157
                'success' => false,
158
            ], 400);
159
        }
160
161
        return new JsonResponse([
162
            'success' => true,
163
        ]);
164
    }
165
166
    /**
167
     * @param \Symfony\Component\HttpFoundation\Request $request
168
     *
169
     * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
170
     */
171
    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

171
    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...
172
    {
173
        $quoteTransfer = $this->getFactory()
174
            ->getQuoteClient()
175
            ->getQuote();
176
177
        if (!$this->isAmazonPayment($quoteTransfer)) {
178
            $this->addAmazonPayErrorFromQuote($quoteTransfer);
179
180
            return $this->buildRedirectInternalResponse();
181
        }
182
183
        $quoteTransfer = $this->getClient()
184
            ->addSelectedAddressToQuote($quoteTransfer);
185
        $this->saveQuoteIntoSession($quoteTransfer);
186
        $shipmentMethods = $this->getFactory()
187
            ->getShipmentClient()
188
            ->getAvailableMethods($quoteTransfer);
189
190
        return [
191
            static::SELECTED_SHIPMENT_METHOD_ID => $this->getCurrentShipmentMethodId($quoteTransfer),
192
            static::SHIPMENT_METHODS => $shipmentMethods->getMethods(),
193
            static::IS_AMAZON_PAYMENT_INVALID => $this->isAmazonPaymentInvalid($quoteTransfer),
194
        ];
195
    }
196
197
    /**
198
     * @param \Symfony\Component\HttpFoundation\Request $request
199
     *
200
     * @return \Spryker\Yves\Kernel\View\View|\Symfony\Component\HttpFoundation\RedirectResponse
201
     */
202
    public function updateShipmentMethodAction(Request $request)
203
    {
204
        $response = $this->executeShipmentMethodAction($request);
205
206
        if (!is_array($response)) {
0 ignored issues
show
introduced by
The condition is_array($response) is always false.
Loading history...
207
            return $response;
208
        }
209
210
        return $this->view($response, [], '@AmazonPay/views/shipment-method/shipment-method.twig');
211
    }
212
213
    /**
214
     * @param \Symfony\Component\HttpFoundation\Request $request
215
     *
216
     * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
217
     */
218
    protected function executeShipmentMethodAction(Request $request)
219
    {
220
        $quoteTransfer = $this->getFactory()->getQuoteClient()->getQuote();
221
222
        if (!$this->isAmazonPayment($quoteTransfer)) {
223
            $this->addAmazonPayErrorFromQuote($quoteTransfer);
224
225
            return $this->buildRedirectInternalResponse();
226
        }
227
228
        $quoteTransfer->getShipment()->setShipmentSelection(
229
            $request->request->get(static::URL_PARAM_SHIPMENT_METHOD_ID)
230
        );
231
        $quoteTransfer = $this->getClient()
232
            ->addSelectedShipmentMethodToQuote($quoteTransfer);
233
        $quoteTransfer = $this->getFactory()
234
            ->getCalculationClient()->recalculate($quoteTransfer);
235
        $this->saveQuoteIntoSession($quoteTransfer);
236
237
        return [
238
            static::QUOTE_TRANSFER => $quoteTransfer,
239
        ];
240
    }
241
242
    /**
243
     * @param \Symfony\Component\HttpFoundation\Request $request
244
     *
245
     * @return \Spryker\Yves\Kernel\View\View|\Symfony\Component\HttpFoundation\RedirectResponse
246
     */
247
    public function successAction(Request $request)
248
    {
249
        $response = $this->executeSuccessAction($request);
250
251
        $quoteTransfer = $this->getFactory()->getQuoteClient()->getQuote();
252
253
        $checkoutResponseTransfer = $this->getFactory()->getCheckoutClient()->placeOrder($quoteTransfer);
254
255
        $quoteTransfer = $this->getClient()->authorizeOrder($quoteTransfer);
256
257
        $this->saveQuoteIntoSession($quoteTransfer);
258
259
        if ($quoteTransfer->getAmazonpayPayment()->getAuthorizationDetails()->getAuthorizationStatus()->getState()
260
            !== AmazonPayConfig::STATUS_CLOSED || $checkoutResponseTransfer->getIsSuccess() === false) {
261
            return $this->redirectResponseInternal(AmazonPayControllerProvider::CHECKOUT, [
262
                static::URL_PARAM_REFERENCE_ID => $quoteTransfer->getAmazonpayPayment()->getOrderReferenceId(),
263
                static::URL_PARAM_ACCESS_TOKEN => $quoteTransfer->getAmazonpayPayment()->getAddressConsentToken(),
264
            ]);
265
        }
266
267
        $this->getFactory()->getCustomerClient()->markCustomerAsDirty();
268
        $this->getFactory()->getCartClient()->clearQuote();
269
270
        return $this->view($response, [], '@AmazonPay/views/success/success.twig');
271
    }
272
273
    /**
274
     * @param \Symfony\Component\HttpFoundation\Request $request
275
     *
276
     * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
277
     */
278
    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

278
    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...
279
    {
280
        return [
281
            static::IS_ASYNCHRONOUS => $this->isAsynchronous(),
282
            static::AMAZONPAY_CONFIG => $this->getAmazonPayConfig(),
283
        ];
284
    }
285
286
    /**
287
     * @param \Symfony\Component\HttpFoundation\Request $request
288
     *
289
     * @return \Symfony\Component\HttpFoundation\Response
290
     */
291
    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

291
    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...
292
    {
293
        $this->getFactory()->getMessengerClient()->addErrorMessage(static::ERROR_AMAZONPAY_PAYMENT_FAILED);
294
295
        $this->clearAmazonpayQuoteData();
296
297
        return $this->buildRedirectInternalResponse();
298
    }
299
300
    /**
301
     * @param \Symfony\Component\HttpFoundation\Request $request
302
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
303
     *
304
     * @return void
305
     */
306
    protected function storeAmazonPaymentIntoQuote(Request $request, QuoteTransfer $quoteTransfer)
307
    {
308
        $amazonPaymentTransfer = $this->buildAmazonPaymentTransfer($request, $quoteTransfer);
309
310
        $quoteTransfer->setAmazonpayPayment($amazonPaymentTransfer);
311
        $quoteTransfer = $this->getClient()
312
            ->handleCartWithAmazonPay($quoteTransfer);
313
        $this->saveQuoteIntoSession($quoteTransfer);
314
    }
315
316
    /**
317
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
318
     *
319
     * @return void
320
     */
321
    protected function saveQuoteIntoSession(QuoteTransfer $quoteTransfer)
322
    {
323
        $this->getFactory()
324
            ->getQuoteClient()
325
            ->setQuote($quoteTransfer);
326
    }
327
328
    /**
329
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
330
     *
331
     * @return int|null
332
     */
333
    protected function getCurrentShipmentMethodId(QuoteTransfer $quoteTransfer)
334
    {
335
        if ($quoteTransfer->getShipment() === null || $quoteTransfer->getShipment()->getMethod() === null) {
336
            return null;
337
        }
338
339
        return $quoteTransfer->getShipment()->getMethod()->getIdShipmentMethod();
340
    }
341
342
    /**
343
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
344
     *
345
     * @return \ArrayObject|\Generated\Shared\Transfer\ItemTransfer[]
346
     */
347
    protected function getCartItems(QuoteTransfer $quoteTransfer)
348
    {
349
        return $quoteTransfer->getItems();
350
    }
351
352
    /**
353
     * @param \Symfony\Component\HttpFoundation\Request $request
354
     *
355
     * @return bool
356
     */
357
    protected function isRequestComplete(Request $request)
358
    {
359
        return (
360
            $request->query->get(static::URL_PARAM_REFERENCE_ID) !== null &&
361
            $request->query->get(static::URL_PARAM_ACCESS_TOKEN) !== null
362
        );
363
    }
364
365
    /**
366
     * @param \Symfony\Component\HttpFoundation\Request $request
367
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
368
     *
369
     * @return \Generated\Shared\Transfer\AmazonpayPaymentTransfer
370
     */
371
    protected function buildAmazonPaymentTransfer(Request $request, QuoteTransfer $quoteTransfer)
372
    {
373
        $amazonPaymentTransfer = $quoteTransfer->getAmazonpayPayment() ?: new AmazonpayPaymentTransfer();
374
375
        $amazonPaymentTransfer->setOrderReferenceId($request->query->get(static::URL_PARAM_REFERENCE_ID));
376
        $amazonPaymentTransfer->setAddressConsentToken($request->query->get(static::URL_PARAM_ACCESS_TOKEN));
377
378
        return $amazonPaymentTransfer;
379
    }
380
381
    /**
382
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
383
     *
384
     * @return bool
385
     */
386
    protected function isAllowedCheckout(QuoteTransfer $quoteTransfer)
387
    {
388
        return $quoteTransfer->getTotals() !== null;
389
    }
390
391
    /**
392
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
393
     *
394
     * @return bool
395
     */
396
    protected function isLogoutRedirect(QuoteTransfer $quoteTransfer)
397
    {
398
        if ($this->isAmazonPaymentInvalid($quoteTransfer)) {
399
            return false;
400
        }
401
402
        if ($this->getAmazonPayConfig()->getCaptureNow() &&
403
            $quoteTransfer->getAmazonpayPayment() !== null
404
            && $quoteTransfer->getAmazonpayPayment()->getResponseHeader() !== null
405
            && !$quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getIsSuccess()
406
        ) {
407
            return true;
408
        }
409
410
        return false;
411
    }
412
413
    /**
414
     * @param \Symfony\Component\HttpFoundation\Request $request
415
     *
416
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
417
     */
418
    protected function buildRedirectExternalResponse(Request $request)
419
    {
420
        if ($request->headers->get('Referer') === null) {
0 ignored issues
show
introduced by
The condition $request->headers->get('Referer') === null is always false.
Loading history...
421
            return $this->buildRedirectInternalResponse();
422
        }
423
424
        return $this->redirectResponseExternal($request->headers->get('Referer'));
425
    }
426
427
    /**
428
     * @param \Generated\Shared\Transfer\CheckoutResponseTransfer $checkoutResponseTransfer
429
     *
430
     * @return void
431
     */
432
    protected function setCheckoutErrorMessages(CheckoutResponseTransfer $checkoutResponseTransfer)
433
    {
434
        foreach ($checkoutResponseTransfer->getErrors() as $checkoutErrorTransfer) {
435
            $this->addErrorMessage(
436
                $this->translateCheckoutErrorMessage($checkoutErrorTransfer)
437
            );
438
        }
439
    }
440
441
    /**
442
     * @param \Generated\Shared\Transfer\CheckoutErrorTransfer $checkoutErrorTransfer
443
     *
444
     * @return string
445
     */
446
    protected function translateCheckoutErrorMessage(CheckoutErrorTransfer $checkoutErrorTransfer): string
447
    {
448
        $checkoutErrorMessage = $checkoutErrorTransfer->getMessage();
449
450
        return $this->getFactory()->getGlossaryStorageClient()->translate(
451
            $checkoutErrorMessage,
452
            $this->getLocale(),
453
            $checkoutErrorTransfer->getParameters()
454
        ) ?: $checkoutErrorMessage;
455
    }
456
457
    /**
458
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
459
     *
460
     * @return void
461
     */
462
    protected function addAmazonPayErrorFromQuote(QuoteTransfer $quoteTransfer)
463
    {
464
        if ($quoteTransfer->getAmazonpayPayment() === null
465
            || $quoteTransfer->getAmazonpayPayment()->getResponseHeader() === null
466
            || $quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getErrorMessage() === null) {
467
            return;
468
        }
469
470
        $this->addErrorMessage(
471
            $quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getErrorMessage()
472
        );
473
    }
474
475
    /**
476
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
477
     *
478
     * @return bool
479
     */
480
    protected function isAmazonPayment(QuoteTransfer $quoteTransfer)
481
    {
482
        return $quoteTransfer->getAmazonpayPayment() !== null;
483
    }
484
485
    /**
486
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
487
     */
488
    protected function buildRedirectInternalResponse()
489
    {
490
        return $this->redirectResponseInternal($this->getPaymentRejectRoute());
491
    }
492
493
    /**
494
     * @return string
495
     */
496
    protected function getPaymentRejectRoute()
497
    {
498
        return Config::get(AmazonPayConstants::PAYMENT_REJECT_ROUTE);
499
    }
500
501
    /**
502
     * @return bool
503
     */
504
    protected function isAsynchronous()
505
    {
506
        return $this->getAmazonPayConfig()->getAuthTransactionTimeout() > 0
507
            && !$this->getAmazonPayConfig()->getCaptureNow();
508
    }
509
510
    /**
511
     * @return \SprykerEco\Shared\AmazonPay\AmazonPayConfigInterface
512
     */
513
    protected function getAmazonPayConfig()
514
    {
515
        return $this->getFactory()->createAmazonPayConfig();
516
    }
517
518
    /**
519
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
520
     *
521
     * @return bool
522
     */
523
    protected function isAmazonPaymentInvalid(QuoteTransfer $quoteTransfer)
524
    {
525
        if ($quoteTransfer->getAmazonpayPayment()->getResponseHeader() !== null
526
            && $quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getIsInvalidPaymentMethod()) {
527
            return true;
528
        }
529
530
        return false;
531
    }
532
533
    /**
534
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
535
     *
536
     * @return string|null
537
     */
538
    protected function getAmazonPaymentOrderReferenceId(QuoteTransfer $quoteTransfer)
539
    {
540
        if ($quoteTransfer->getAmazonpayPayment() !== null && $quoteTransfer->getAmazonpayPayment()->getOrderReferenceId() !== null) {
541
            return $quoteTransfer->getAmazonpayPayment()->getOrderReferenceId();
542
        }
543
544
        return null;
545
    }
546
547
    /**
548
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
549
     *
550
     * @return array
551
     */
552
    protected function preparePSD2Data(QuoteTransfer $quoteTransfer): array
553
    {
554
        return [
555
            static::PSD2_DATA_KEY_AJAX_ENDPOINT => $this->getApplication()->path(AmazonPayControllerProvider::CONFIRM_PURCHASE),
556
            static::PSD2_DATA_KEY_SELLER_ID => $this->getAmazonPayConfig()->getSellerId(),
557
            static::PSD2_DATA_KEY_AMAZON_ORDER_REFERENCE_ID => $quoteTransfer->getAmazonpayPayment()->getOrderReferenceId(),
558
            static::PSD2_DATA_KEY_AMAZON_FAILURE_URL => $this->getApplication()->path(AmazonPayControllerProvider::PAYMENT_FAILED),
559
        ];
560
    }
561
562
    /**
563
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
564
     *
565
     * @return void
566
     */
567
    protected function clearAmazonpayQuoteData(): void
568
    {
569
        $quoteTransfer = $this->getFactory()->getQuoteClient()->getQuote();
570
571
        $amazonpayPaymentTransfer = new AmazonpayPaymentTransfer();
572
573
        $quoteTransfer->setAmazonpayPayment($amazonpayPaymentTransfer);
574
575
        $this->getFactory()->getQuoteClient()->setQuote($quoteTransfer);
576
    }
577
}
578